{"_id":"env-vars-doctor","_rev":"4-f36e15280a081f7bcf4a6a4c2d22f22a","name":"env-vars-doctor","dist-tags":{"latest":"1.4.1"},"versions":{"0.1.0":{"name":"env-vars-doctor","version":"0.1.0","keywords":["env","environment","dotenv","monorepo","workspace","cli","validation"],"author":{"name":"Israel Roldan"},"license":"MIT","_id":"env-vars-doctor@0.1.0","maintainers":[{"name":"israelroldan","email":"npm@isro.me"}],"homepage":"https://github.com/israelroldan/env-vars-doctor#readme","bugs":{"url":"https://github.com/israelroldan/env-vars-doctor/issues"},"bin":{"env-vars-doctor":"bin/env-vars-doctor.js"},"dist":{"shasum":"07cb1cb515f46fce50deab42ba29d257bbe646ac","tarball":"https://registry.npmjs.org/env-vars-doctor/-/env-vars-doctor-0.1.0.tgz","fileCount":24,"integrity":"sha512-PTttVcOisOK0GBTs6McLpFDDLnRlanL3EPHSMiH3nxG1LO3YfizVQF3E7Y44CvDHwjz6N2SfeQnsHbDcY7l/+w==","signatures":[{"sig":"MEYCIQDVvJYECQgFXdOlE/MdrD8ItxYEKOs202tTuUnHVOWoTwIhAOV4uN8ISrH8cHeo8SrWb8QkkA1RHI1izQiCS7YVoNMr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1162649},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./plugins":{"types":"./dist/plugins/types.d.ts","import":"./dist/plugins/types.js","require":"./dist/plugins/types.cjs"}},"gitHead":"30e5576b8d992ac45ca29693376af5c4fadf9a87","scripts":{"dev":"tsup --watch","lint":"eslint src/","build":"tsup","type-check":"tsc --noEmit","prepublishOnly":"pnpm run build"},"_npmUser":{"name":"israelroldan","email":"npm@isro.me"},"repository":{"url":"git+https://github.com/israelroldan/env-vars-doctor.git","type":"git"},"_npmVersion":"11.6.2","description":"Environment variable management for monorepos - sync, validate, and diagnose .env files across workspaces","directories":{},"_nodeVersion":"25.0.0","dependencies":{"glob":"^11.0.0","cosmiconfig":"^9.0.0","cosmiconfig-typescript-loader":"^6.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/env-vars-doctor_0.1.0_1767265897260_0.2937421047834545","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"env-vars-doctor","version":"1.3.0","keywords":["env","environment","dotenv","monorepo","workspace","cli","validation"],"author":{"name":"Israel Roldan"},"license":"MIT","_id":"env-vars-doctor@1.3.0","maintainers":[{"name":"israelroldan","email":"npm@isro.me"}],"homepage":"https://github.com/israelroldan/env-vars-doctor#readme","bugs":{"url":"https://github.com/israelroldan/env-vars-doctor/issues"},"bin":{"env-vars-doctor":"bin/env-vars-doctor.js"},"dist":{"shasum":"5f9b539d5b43820323e80c6ce83713951387ffde","tarball":"https://registry.npmjs.org/env-vars-doctor/-/env-vars-doctor-1.3.0.tgz","fileCount":24,"integrity":"sha512-68B1vT8NnSZiCa4QSddu1Lj+XZN8X6JRwpqiaj/Yik6FT0lqUgZ+Vs409d5a+vbpXUb7T52m0QBudN4NziLLUQ==","signatures":[{"sig":"MEUCIQCUKhtkkqzxbaaud/KbW9PjbZcAdUWSleamZQ9UySYGzgIgZ7+SAO1dDzWIUObeQ8aeEtWkRWkitIUVXfj72KRUSs8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/env-vars-doctor@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1163812},"main":"./dist/index.cjs","type":"module","_from":"file:env-vars-doctor-1.3.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./plugins":{"types":"./dist/plugins/types.d.ts","import":"./dist/plugins/types.js","require":"./dist/plugins/types.cjs"}},"scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0a42c5f7-33c1-487d-aa66-b8cdb90c9613"}},"_resolved":"/tmp/6eb34f713138dd1e4fe4cee02965d9ba/env-vars-doctor-1.3.0.tgz","_integrity":"sha512-68B1vT8NnSZiCa4QSddu1Lj+XZN8X6JRwpqiaj/Yik6FT0lqUgZ+Vs409d5a+vbpXUb7T52m0QBudN4NziLLUQ==","repository":{"url":"git+https://github.com/israelroldan/env-vars-doctor.git","type":"git"},"_npmVersion":"11.6.2","description":"Environment variable management for monorepos - sync, validate, and diagnose .env files across workspaces","directories":{},"lint-staged":{"src/**/*.ts":"eslint --fix"},"_nodeVersion":"24.12.0","dependencies":{"glob":"^11.0.0","cosmiconfig":"^9.0.0","cosmiconfig-typescript-loader":"^6.1.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","husky":"^9.1.7","eslint":"^9.39.2","vitest":"^4.0.16","@eslint/js":"^9.39.2","typescript":"^5","@types/node":"^20","lint-staged":"^16.2.7","typescript-eslint":"^8.51.0","@vitest/coverage-v8":"^4.0.16"},"_npmOperationalInternal":{"tmp":"tmp/env-vars-doctor_1.3.0_1767465720688_0.6551401252012319","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"env-vars-doctor","version":"1.4.0","keywords":["env","environment","dotenv","monorepo","workspace","cli","validation"],"author":{"name":"Israel Roldan"},"license":"MIT","_id":"env-vars-doctor@1.4.0","maintainers":[{"name":"israelroldan","email":"npm@isro.me"}],"homepage":"https://github.com/israelroldan/env-vars-doctor#readme","bugs":{"url":"https://github.com/israelroldan/env-vars-doctor/issues"},"bin":{"env-vars-doctor":"bin/env-vars-doctor.js"},"dist":{"shasum":"570c007b1ddfc972775c32f71ec07a272a7c3c8b","tarball":"https://registry.npmjs.org/env-vars-doctor/-/env-vars-doctor-1.4.0.tgz","fileCount":24,"integrity":"sha512-eImxhe+jRFgCz7a7geJseAU8Z/F94jxZczKlsld4rCy7hgjmcW/w2sCtMaR0N7xG93PwPJS8PJDPDr2BG1lYGA==","signatures":[{"sig":"MEUCIQDuOi/Hu8/8EwtIEk+s3rt4QVtWJ2sdDEIWrFhy5b4L+QIgEUjBgDbnp8mqcYjtekUEfTYm7QJg2X/WGrwJpDNr4vg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/env-vars-doctor@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1184041},"main":"./dist/index.cjs","type":"module","_from":"file:env-vars-doctor-1.4.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./plugins":{"types":"./dist/plugins/types.d.ts","import":"./dist/plugins/types.js","require":"./dist/plugins/types.cjs"}},"scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","build":"tsup","test:watch":"vitest","type-check":"tsc --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0a42c5f7-33c1-487d-aa66-b8cdb90c9613"}},"_resolved":"/tmp/10b6b49c38192fc84ba9d74ae5ce1629/env-vars-doctor-1.4.0.tgz","_integrity":"sha512-eImxhe+jRFgCz7a7geJseAU8Z/F94jxZczKlsld4rCy7hgjmcW/w2sCtMaR0N7xG93PwPJS8PJDPDr2BG1lYGA==","repository":{"url":"git+https://github.com/israelroldan/env-vars-doctor.git","type":"git"},"_npmVersion":"11.6.2","description":"Environment variable management for monorepos - sync, validate, and diagnose .env files across workspaces","directories":{},"lint-staged":{"src/**/*.ts":"eslint --fix"},"_nodeVersion":"24.12.0","dependencies":{"glob":"^11.0.0","cosmiconfig":"^9.0.0","cosmiconfig-typescript-loader":"^6.1.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","husky":"^9.1.7","eslint":"^9.39.2","vitest":"^4.0.16","@eslint/js":"^9.39.2","typescript":"^5","@types/node":"^20","lint-staged":"^16.2.7","typescript-eslint":"^8.51.0","@vitest/coverage-v8":"^4.0.16"},"_npmOperationalInternal":{"tmp":"tmp/env-vars-doctor_1.4.0_1767868314073_0.8365730963495608","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"env-vars-doctor","version":"1.4.1","type":"module","description":"Environment variable management for monorepos - sync, validate, and diagnose .env files across workspaces","keywords":["env","environment","dotenv","monorepo","workspace","cli","validation"],"author":{"name":"Israel Roldan"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/israelroldan/env-vars-doctor.git"},"homepage":"https://github.com/israelroldan/env-vars-doctor#readme","bugs":{"url":"https://github.com/israelroldan/env-vars-doctor/issues"},"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","bin":{"env-vars-doctor":"bin/env-vars-doctor.js"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./plugins":{"types":"./dist/plugins/types.d.ts","import":"./dist/plugins/types.js","require":"./dist/plugins/types.cjs"}},"dependencies":{"cosmiconfig":"^9.0.0","cosmiconfig-typescript-loader":"^6.1.0","glob":"^11.0.0"},"devDependencies":{"@eslint/js":"^9.39.2","@types/node":"^20","@vitest/coverage-v8":"^4.0.16","eslint":"^9.39.2","husky":"^9.1.7","lint-staged":"^16.2.7","tsup":"^8.0.0","typescript":"^5","typescript-eslint":"^8.51.0","vitest":"^4.0.16"},"engines":{"node":">=24"},"publishConfig":{"access":"public","provenance":true},"lint-staged":{"src/**/*.ts":"eslint --fix"},"scripts":{"build":"tsup","dev":"tsup --watch","lint":"eslint src/","type-check":"tsc --noEmit","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_id":"env-vars-doctor@1.4.1","_integrity":"sha512-aodCSlWXmzm7zph7uftWGmBffvfyY1Py0kCoONmq/IFolHe3LhFfEsOqxtc1RiTbInJONoSUfXcQ4GC57VIbqg==","_resolved":"/tmp/761d4c7bd7f50ee8967ff01ae1510cf6/env-vars-doctor-1.4.1.tgz","_from":"file:env-vars-doctor-1.4.1.tgz","_nodeVersion":"24.13.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-aodCSlWXmzm7zph7uftWGmBffvfyY1Py0kCoONmq/IFolHe3LhFfEsOqxtc1RiTbInJONoSUfXcQ4GC57VIbqg==","shasum":"bd8e760a09f913bbeb45bc843c504093c46dd10b","tarball":"https://registry.npmjs.org/env-vars-doctor/-/env-vars-doctor-1.4.1.tgz","fileCount":24,"unpackedSize":1182193,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/env-vars-doctor@1.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAeA4MoOV9qFQvU4ZGLass1cHnXGBuHvv1bEOhSjvjZHAiAsoQ2qekohpwO4/pOsXgUFxmpMBentECX7qe5rpSeDSg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0a42c5f7-33c1-487d-aa66-b8cdb90c9613"}},"directories":{},"maintainers":[{"name":"israelroldan","email":"npm@isro.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/env-vars-doctor_1.4.1_1769345243896_0.6066243438726309"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-01T11:11:37.259Z","modified":"2026-01-25T12:47:24.371Z","0.1.0":"2026-01-01T11:11:37.484Z","1.3.0":"2026-01-03T18:42:00.873Z","1.4.0":"2026-01-08T10:31:54.273Z","1.4.1":"2026-01-25T12:47:24.094Z"},"bugs":{"url":"https://github.com/israelroldan/env-vars-doctor/issues"},"author":{"name":"Israel Roldan"},"license":"MIT","homepage":"https://github.com/israelroldan/env-vars-doctor#readme","keywords":["env","environment","dotenv","monorepo","workspace","cli","validation"],"repository":{"type":"git","url":"git+https://github.com/israelroldan/env-vars-doctor.git"},"description":"Environment variable management for monorepos - sync, validate, and diagnose .env files across workspaces","maintainers":[{"name":"israelroldan","email":"npm@isro.me"}],"readme":"# env-vars-doctor\n\nEnvironment variable management for projects and monorepos - sync, validate, and diagnose `.env` files.\n\n## Features\n\n- **Schema-based validation** - Define environment variables with directives in `.env.local.example` files\n- **Works everywhere** - Supports both single projects and monorepos with multiple workspaces\n- **Interactive prompts** - Guided setup for missing values\n- **Source code scanning** - Detect undocumented `process.env` usage\n- **CI integration** - Validate environment completeness in pipelines\n- **Plugin architecture** - Extend with custom value sources and integrations\n\n## Installation\n\n```bash\nnpm install env-vars-doctor\n# or\npnpm add env-vars-doctor\n# or\nyarn add env-vars-doctor\n```\n\n## Quick Start\n\n1. Create a `.env.local.example` file with your schema:\n\n```bash\n# [required] [prompt] Database connection string\nDATABASE_URL=\n\n# [optional] [default:3000] Server port\nPORT=3000\n\n# [required] [boolean] Enable debug mode\nDEBUG=false\n```\n\n2. Run sync to create your `.env.local`:\n\n```bash\nnpx env-vars-doctor sync\n```\n\n3. Check status anytime:\n\n```bash\nnpx env-vars-doctor status\n```\n\n## Schema Directives\n\nAdd directives in comments above variables:\n\n| Directive | Description |\n|-----------|-------------|\n| `[required]` | Variable must have a value |\n| `[optional]` | Variable can be empty |\n| `[prompt]` | Interactively prompt for value |\n| `[default:value]` | Use default if not set |\n| `[boolean]` | Yes/no prompt (true/false) |\n| `[boolean:yes/no]` | Boolean with custom values |\n| `[copy:VAR]` | Copy value from another variable |\n| `[computed:type]` | Generate value (e.g., `computed:port`) |\n| `[local-only]` | Skip in CI/deployment contexts |\n\n### Example Schema\n\n```bash\n# =============================================================================\n# Database Configuration\n# =============================================================================\n\n# [required] [prompt] PostgreSQL connection URL\nDATABASE_URL=\n\n# [optional] [default:5432] Database port\nDB_PORT=5432\n\n# =============================================================================\n# Authentication\n# =============================================================================\n\n# [required] [prompt] Auth provider API key\nAUTH_API_KEY=\n\n# [required] [copy:AUTH_API_KEY] Duplicate for legacy support\nLEGACY_AUTH_KEY=\n\n# =============================================================================\n# Development\n# =============================================================================\n\n# [optional] [boolean] Enable verbose logging\nVERBOSE=false\n\n# [local-only] [default:true] Hot reload in development\nHOT_RELOAD=true\n```\n\n## Commands\n\n### `sync`\n\nCreate or update `.env.local` files from schema:\n\n```bash\nenv-vars-doctor sync              # Sync current app\nenv-vars-doctor sync --all        # Sync all workspaces\nenv-vars-doctor sync --force      # Overwrite existing values\n```\n\n### `status`\n\nShow environment variable status:\n\n```bash\nenv-vars-doctor status            # Current app status\nenv-vars-doctor status --all      # All workspaces\n```\n\n### `check`\n\nValidate environment without prompts:\n\n```bash\nenv-vars-doctor check             # Exit 1 if issues found\nenv-vars-doctor check --ci        # CI-optimized output\n```\n\n### `diagnose`\n\nScan source code for environment issues:\n\n```bash\nenv-vars-doctor diagnose          # Find undocumented env vars\nenv-vars-doctor diagnose --fix    # Add missing to schema\n```\n\n### `clean`\n\nRemove generated `.env.local` files:\n\n```bash\nenv-vars-doctor clean             # Current app\nenv-vars-doctor clean --all       # All workspaces\n```\n\n### `export`\n\nExport variables for deployment:\n\n```bash\nenv-vars-doctor export --format=vercel   # Vercel format\nenv-vars-doctor export --format=shell    # Shell export format\nenv-vars-doctor export --format=json     # JSON format\n```\n\n## Configuration\n\nCreate `env-vars-doctor.config.ts` (or `.js`, `.json`, `.env-vars-doctorrc`):\n\n```typescript\nimport { defineConfig } from 'env-vars-doctor'\n\nexport default defineConfig({\n  project: {\n    rootEnvExample: '.env.local.example',\n    rootEnvLocal: '.env.local',\n    workspaces: {\n      detection: 'pnpm',  // 'auto' | 'pnpm' | 'npm' | 'yarn' | 'manual'\n      patterns: ['apps/*', 'packages/*'],\n      portDetection: {\n        method: 'static',\n        staticPorts: {\n          'web': 3000,\n          'api': 3001,\n          'admin': 3002,\n        },\n      },\n    },\n  },\n  scanning: {\n    extensions: ['.ts', '.tsx', '.js', '.jsx'],\n    skipDirs: ['node_modules', 'dist', '.next'],\n    ignoreMissing: ['NODE_ENV', 'CI', 'VERCEL'],\n    ignoreUnused: ['LEGACY_VAR'],\n  },\n  ci: {\n    skipEnvVar: 'SKIP_ENV_DOCTOR',\n    skipDirectives: ['local-only', 'prompt'],\n  },\n})\n```\n\n## Plugins\n\n### Built-in Plugins\n\n#### Supabase Plugin\n\nAuto-fetch keys from local Supabase:\n\n```typescript\nimport { defineConfig } from 'env-vars-doctor'\n\nexport default defineConfig({\n  plugins: {\n    supabase: {\n      enabled: true,\n      databaseDir: 'packages/database',\n      variableMapping: {\n        'NEXT_PUBLIC_SUPABASE_ANON_KEY': 'anon_key',\n        'SUPABASE_SERVICE_ROLE_KEY': 'service_role_key',\n      },\n    },\n  },\n})\n```\n\nThen use in schema:\n\n```bash\n# [required] [supabase] Supabase anon key\nNEXT_PUBLIC_SUPABASE_ANON_KEY=\n```\n\n#### Vercel Plugin\n\nDeploy environment variables to Vercel:\n\n```typescript\nimport { defineConfig } from 'env-vars-doctor'\n\nexport default defineConfig({\n  plugins: {\n    vercel: {\n      enabled: true,\n      projectMapping: {\n        'web': 'my-web-project',\n        'api': 'my-api-project',\n      },\n    },\n  },\n})\n```\n\n```bash\nenv-vars-doctor deploy --target=production\n```\n\n### Custom Plugins\n\nCreate custom value sources:\n\n```typescript\nimport type { EnvDoctorPlugin, ValueSourceProvider } from 'env-vars-doctor/plugins'\n\nconst myPlugin: EnvDoctorPlugin = {\n  meta: {\n    name: 'my-plugin',\n    version: '1.0.0',\n  },\n  sources: [\n    {\n      directiveType: 'vault',\n      pattern: /\\[vault(?::([^\\]]+))?\\]/i,\n      resolve: async (definition, context) => {\n        const secret = await fetchFromVault(definition.key)\n        return { value: secret, source: 'vault' }\n      },\n      isAvailable: () => !!process.env.VAULT_TOKEN,\n      unavailableMessage: 'Vault token not configured',\n    },\n  ],\n}\n\nexport default myPlugin\n```\n\n## Programmatic API\n\n```typescript\nimport { EnvDoctor, loadConfig } from 'env-vars-doctor'\n\nconst config = await loadConfig()\nconst doctor = new EnvDoctor(config)\n\n// Parse schema\nconst schema = await doctor.parseSchema('.env.local.example')\n\n// Scan workspaces\nconst apps = await doctor.scanWorkspaces()\n\n// Reconcile differences\nconst diff = await doctor.reconcile(schema, currentEnv)\n\n// Generate report\nconst report = doctor.report(diff)\n```\n\n## CI Integration\n\n### GitHub Actions\n\n```yaml\n- name: Validate environment\n  run: npx env-vars-doctor check --ci\n  env:\n    CI: true\n```\n\n### Skip in CI\n\nSet `SKIP_ENV_DOCTOR=1` to skip validation:\n\n```yaml\nenv:\n  SKIP_ENV_DOCTOR: 1\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}