{"_id":"@bernierllc/package-analyzer","_rev":"8-929ae714d809456d2d9e7aae5fd02b8c","name":"@bernierllc/package-analyzer","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.0":{"name":"@bernierllc/package-analyzer","version":"0.1.0","keywords":["package","analyzer","monorepo","utilities"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/package-analyzer@0.1.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"263da298df506c67360b21c88c6890214ff90c23","tarball":"https://registry.npmjs.org/@bernierllc/package-analyzer/-/package-analyzer-0.1.0.tgz","fileCount":19,"integrity":"sha512-ZJxHpURLK8+hJYVwWhDcQLJ4R8wbd0RirEN9gIGMj1+hrkJbXD3g+rgGwUNvXnDGGpwjnpKUaC1dy53DfsuGQg==","signatures":[{"sig":"MEQCIEeIB53fbvefvyGfv6Ukb1W9LZPYOfrOi5DiY763eWl5AiA9C1SSSZZziI1worpezL5FxbshnZn6jTb5AO968jjrow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43424},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"cb3cbd06f8678e99e7bec2f8ad19b6abdf2fe639","private":false,"scripts":{"lint":"eslint src/**/*.ts","build":"tsc","clean":"rm -rf dist","type-check":"tsc --noEmit","test-disabled":"jest"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/package-analyzer"},"_npmVersion":"11.4.2","description":"Pure package analysis utilities for monorepo management","directories":{},"_nodeVersion":"24.4.1","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/package-analyzer_0.1.0_1755551532393_0.7318742791300095","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bernierllc/package-analyzer","version":"0.3.0","keywords":["package","analyzer","monorepo","utilities"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/package-analyzer@0.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"3268d730ffee9f73292b45a5a706cbc6ecc7960a","tarball":"https://registry.npmjs.org/@bernierllc/package-analyzer/-/package-analyzer-0.3.0.tgz","fileCount":19,"integrity":"sha512-X7Q08gdogiZhwH9PxFmhaEJ1JefLfs+62Qc7FCcUX0clfs8mwehRLMeLtPSQz+tKIqZJK7qRdn0obecPklY2ng==","signatures":[{"sig":"MEUCIHOofnBwilZcZ2mOIOPEJd+XazMdVc8oTLhQBo8xnovaAiEA8rKLdHWz3SGWlhdHW9/eWbCiPSWK1BRGKZaaM93V56Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43569},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","private":false,"scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:900a8354-f62c-4ca4-b50b-69cb9e2097b0"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/package-analyzer"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Pure package analysis utilities for monorepo management","directories":{},"_nodeVersion":"20.19.6","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/package-analyzer_0.3.0_1767642316949_0.8560118025569272","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@bernierllc/package-analyzer","version":"0.3.1","keywords":["package","analyzer","monorepo","utilities"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/package-analyzer@0.3.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"0412a484cdc117741c18117f7d903f0a28923c01","tarball":"https://registry.npmjs.org/@bernierllc/package-analyzer/-/package-analyzer-0.3.1.tgz","fileCount":19,"integrity":"sha512-7M3ehyXCZITb8UBVa49MnN8GI/1dzS5/FYaWbV/12OBFKHG20khbMZIwZUnibfXOOy2ss64I35f5qn7+c84Pdg==","signatures":[{"sig":"MEUCIEAhpef5CsHXVEcin8TXWJyMmu4Q7UfuOL+Puf8Ht0E8AiEArD5fpLqVjTI3jkgqMyi2jREv9MsJ/atYU5Mvu1bTN24=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43511},"main":"dist/index.js","_from":"file:bernierllc-package-analyzer-0.3.1.tgz","types":"dist/index.d.ts","private":false,"scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:900a8354-f62c-4ca4-b50b-69cb9e2097b0"}},"_resolved":"/tmp/845b6ec7dffccb60312703928b499f10/bernierllc-package-analyzer-0.3.1.tgz","_integrity":"sha512-7M3ehyXCZITb8UBVa49MnN8GI/1dzS5/FYaWbV/12OBFKHG20khbMZIwZUnibfXOOy2ss64I35f5qn7+c84Pdg==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/package-analyzer"},"_npmVersion":"11.11.0","description":"Pure package analysis utilities for monorepo management","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/package-analyzer_0.3.1_1773078035464_0.014839028220797745","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@bernierllc/package-analyzer","version":"0.3.2","keywords":["package","analyzer","monorepo","utilities"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/package-analyzer@0.3.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"0d6ce82b7e496ce7cd1d9de0a8db20f8aae23ff6","tarball":"https://registry.npmjs.org/@bernierllc/package-analyzer/-/package-analyzer-0.3.2.tgz","fileCount":19,"integrity":"sha512-3FjtVAo/lXgukWgqO6WBUdMGtJpz7eTBR5Nam2yVryjCAkR6RtlUWdAL0+JVbPkg2mTvWh/6iZNxksqdVrJyAg==","signatures":[{"sig":"MEUCIEVR2M3bfYDL+xUSFzaGi+U5kCq1kl5K/4dqzMSPNiztAiEA+h450wWZfUsfGit3WQU01r82CVewLz/V2wg06TR19w8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43511},"main":"dist/index.js","_from":"file:bernierllc-package-analyzer-0.3.2.tgz","types":"dist/index.d.ts","private":false,"scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:900a8354-f62c-4ca4-b50b-69cb9e2097b0"}},"_resolved":"/tmp/3d06a072983fd6247225c8da4ddc104c/bernierllc-package-analyzer-0.3.2.tgz","_integrity":"sha512-3FjtVAo/lXgukWgqO6WBUdMGtJpz7eTBR5Nam2yVryjCAkR6RtlUWdAL0+JVbPkg2mTvWh/6iZNxksqdVrJyAg==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/package-analyzer"},"_npmVersion":"11.11.0","description":"Pure package analysis utilities for monorepo management","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/package-analyzer_0.3.2_1773081218173_0.4433445314263593","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@bernierllc/package-analyzer","version":"0.4.0","keywords":["package","analyzer","monorepo","utilities"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/package-analyzer@0.4.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"fd620f979bdd5ce59f1e0ea4a8897072c9511d4d","tarball":"https://registry.npmjs.org/@bernierllc/package-analyzer/-/package-analyzer-0.4.0.tgz","fileCount":19,"integrity":"sha512-9y9vg3zqaeadSl9OslsjmfDZIUGH5O2dFzlX55bafwtRF4dKKG/67w4g+HR5C/xzaRmJqMd/87zg0zK4wB0SGA==","signatures":[{"sig":"MEQCIBcrgikvBk9Ep9wmlN9Bvi+IyCZa/cPYp3hJPffCXwWVAiBdxWzTYtW3kqffzhQPz2OC4B4IiQ+/0SftLEP5UgWnIw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43511},"main":"dist/index.js","_from":"file:bernierllc-package-analyzer-0.4.0.tgz","types":"dist/index.d.ts","private":false,"scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:900a8354-f62c-4ca4-b50b-69cb9e2097b0"}},"_resolved":"/home/runner/work/tools/tools/packages/core/package-analyzer/bernierllc-package-analyzer-0.4.0.tgz","_integrity":"sha512-9y9vg3zqaeadSl9OslsjmfDZIUGH5O2dFzlX55bafwtRF4dKKG/67w4g+HR5C/xzaRmJqMd/87zg0zK4wB0SGA==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/package-analyzer"},"_npmVersion":"11.14.1","description":"Pure package analysis utilities for monorepo management","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/package-analyzer_0.4.0_1779241311700_0.14669562713109308","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@bernierllc/package-analyzer","version":"0.5.0","keywords":["package","analyzer","monorepo","utilities"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/package-analyzer@0.5.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"3f480527eafdc5d254b2accb617eb9928890e6bd","tarball":"https://registry.npmjs.org/@bernierllc/package-analyzer/-/package-analyzer-0.5.0.tgz","fileCount":23,"integrity":"sha512-LFMUR3pkSrvThYv9CrQgPZWXc6j/KqsIOqNr8p6nR6pIOq9Z5rQ8QddRKPdHiIzENxRXhMWI/9PBWyjhyinwqg==","signatures":[{"sig":"MEUCIAOVfAvTE7VG9cUTj1u9SsKUgFxh0fUz5eS9rkTXLm00AiEAn/lzpUMqa/L3E5PLfspU6AlN9W2uirS7ynZSFJtYaOI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46563},"main":"dist/index.js","_from":"file:bernierllc-package-analyzer-0.5.0.tgz","types":"dist/index.d.ts","private":false,"scripts":{"lint":"eslint src/**/*.ts","test":"jest","build":"tsc","clean":"rm -rf dist","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:900a8354-f62c-4ca4-b50b-69cb9e2097b0"}},"_resolved":"/home/runner/work/tools/tools/packages/core/package-analyzer/bernierllc-package-analyzer-0.5.0.tgz","_integrity":"sha512-LFMUR3pkSrvThYv9CrQgPZWXc6j/KqsIOqNr8p6nR6pIOq9Z5rQ8QddRKPdHiIzENxRXhMWI/9PBWyjhyinwqg==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/package-analyzer"},"_npmVersion":"11.14.1","description":"Pure package analysis utilities for monorepo management","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/package-analyzer_0.5.0_1779243266816_0.7292819975674869","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@bernierllc/package-analyzer","version":"0.6.0","private":false,"description":"Pure package analysis utilities for monorepo management","main":"dist/index.js","types":"dist/index.d.ts","keywords":["package","analyzer","monorepo","utilities"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","repository":{"type":"git","url":"git+https://github.com/bernierllc/tools.git","directory":"packages/core/package-analyzer"},"devDependencies":{"@types/jest":"^29.5.0","@types/node":"^20.0.0","jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build":"tsc","test":"jest","lint":"eslint src/**/*.ts","type-check":"tsc --noEmit","clean":"rm -rf dist"},"_id":"@bernierllc/package-analyzer@0.6.0","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"homepage":"https://github.com/bernierllc/tools#readme","_integrity":"sha512-krzlY0EqCK3bWLXACjOkY3LQAZlUXLty9Pl7S51WfVhMWKU6OaK7S7xqEAMROOhPCgqmWAX/8KUM/KnNZ+ZVFw==","_resolved":"/home/runner/work/tools/tools/packages/core/package-analyzer/bernierllc-package-analyzer-0.6.0.tgz","_from":"file:bernierllc-package-analyzer-0.6.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-krzlY0EqCK3bWLXACjOkY3LQAZlUXLty9Pl7S51WfVhMWKU6OaK7S7xqEAMROOhPCgqmWAX/8KUM/KnNZ+ZVFw==","shasum":"f350aec7a6dbaaff92fb6a780d55e17616d0d3d0","tarball":"https://registry.npmjs.org/@bernierllc/package-analyzer/-/package-analyzer-0.6.0.tgz","fileCount":23,"unpackedSize":46563,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBnoWGJUwBl9Tzm75Me3BcqTPQn54iNOiwBwiX8/eDPTAiEAqOILYq79rD4KNmTKMic/C2X0/7CRuavkegWeETa2R6Q="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:900a8354-f62c-4ca4-b50b-69cb9e2097b0"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/package-analyzer_0.6.0_1779250061656_0.7683332010176733"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-18T21:12:11.945Z","modified":"2026-05-20T04:07:41.939Z","0.1.0":"2025-08-18T21:12:12.564Z","0.3.0":"2026-01-05T19:45:17.088Z","0.3.1":"2026-03-09T17:40:35.608Z","0.3.2":"2026-03-09T18:33:38.325Z","0.4.0":"2026-05-20T01:41:51.904Z","0.5.0":"2026-05-20T02:14:26.958Z","0.6.0":"2026-05-20T04:07:41.828Z"},"bugs":{"url":"https://github.com/bernierllc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"Bernier LLC","homepage":"https://github.com/bernierllc/tools#readme","keywords":["package","analyzer","monorepo","utilities"],"repository":{"type":"git","url":"git+https://github.com/bernierllc/tools.git","directory":"packages/core/package-analyzer"},"description":"Pure package analysis utilities for monorepo management","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/package-analyzer\n\nPure package analysis utilities for monorepo management.\n\n## Features\n\n- **Package Discovery**: Find all packages in a monorepo (supports nested subdirectories)\n- **Git Integration**: Analyze recent changes, modifications, and publish needs\n- **Status Analysis**: Get detailed package status including version comparison\n- **Smart Suggestions**: Intelligent package prioritization for publishing\n- **Pure Functions**: Stateless, testable, and composable utilities\n\n## Installation\n\n```bash\nnpm install @bernierllc/package-analyzer\n```\n\n## Quick Start\n\n```typescript\nimport { analyzePackages, getAllPackages, getPackageJson } from '@bernierllc/package-analyzer';\n\n// Get all packages in the monorepo\nconst packages = getAllPackages();\nconsole.log(packages); // ['core/package1', 'service/package2', ...]\n\n// Get complete analysis\nconst analysis = await analyzePackages();\nconsole.log(analysis);\n// {\n//   allPackages: ['core/package1', 'service/package2'],\n//   recentPackages: ['core/package1'],\n//   modifiedPackages: ['service/package2'],\n//   packagesNeedingPublish: [],\n//   smartSuggestion: 'core/package1'\n// }\n\n// Get package.json for a specific package\nconst pkgJson = getPackageJson('core/package1');\nconsole.log(pkgJson.name); // '@bernierllc/package1'\n```\n\n## API Reference\n\n### Core Functions\n\n#### `getAllPackages(config?)`\nGet all packages in the monorepo.\n\n```typescript\nconst packages = getAllPackages();\n// Returns: ['core/package1', 'service/package2', ...]\n```\n\n#### `getPackageJson(packageName, config?)`\nGet package.json for a specific package.\n\n```typescript\nconst pkgJson = getPackageJson('core/package1');\n// Returns: { name: '@bernierllc/package1', version: '1.0.0', ... }\n```\n\n#### `analyzePackageStatus(packageName, config?)`\nGet detailed status of a package including publish state.\n\n```typescript\nconst status = await analyzePackageStatus('core/package1');\n// Returns: {\n//   packageName: 'core/package1',\n//   fullPackageName: '@bernierllc/package1',\n//   isPublished: true,\n//   publishedVersion: '0.9.0',\n//   localVersion: '1.0.0',\n//   isPrivate: true,\n//   needsPublishing: true,\n//   isFirstTimePublish: false\n// }\n```\n\n### Git Analysis Functions\n\n#### `getRecentPackages(config?)`\nGet packages modified in the last N days.\n\n```typescript\nconst recent = await getRecentPackages();\n// Returns: ['core/package1', 'service/package2']\n```\n\n#### `getModifiedPackages(config?)`\nGet packages with uncommitted changes.\n\n```typescript\nconst modified = await getModifiedPackages();\n// Returns: ['core/package1', 'service/package2']\n```\n\n#### `getPackagesNeedingPublish(config?)`\nGet packages that need publishing (have commits but not published).\n\n```typescript\nconst needsPublish = await getPackagesNeedingPublish();\n// Returns: ['core/package1', 'service/package2']\n```\n\n### Utility Functions\n\n#### `sortPackagesByPriority(packages, recentPackages, modifiedPackages, packagesNeedingPublish)`\nSort packages by priority: needs publish > recent > modified > alphabetical.\n\n```typescript\nconst sorted = sortPackagesByPriority(\n  ['core/package1', 'service/package2'],\n  ['service/package2'],\n  ['core/package1'],\n  []\n);\n// Returns: ['core/package1', 'service/package2']\n```\n\n#### `getSmartSuggestion(packagesNeedingPublish, recentPackages, modifiedPackages)`\nGet the best package suggestion for publishing.\n\n```typescript\nconst suggestion = getSmartSuggestion(\n  ['core/package1'],\n  ['service/package2'],\n  ['util/package3']\n);\n// Returns: 'core/package1'\n```\n\n#### `analyzePackages(config?)`\nComplete package analysis.\n\n```typescript\nconst analysis = await analyzePackages();\n// Returns: AnalyzerResult with all package information\n```\n\n### Configuration\n\nAll functions accept an optional configuration object:\n\n```typescript\ninterface AnalyzerConfig {\n  packagesDir: string;        // Default: 'packages'\n  recentDays: number;         // Default: 7\n  timeoutMs: number;          // Default: 30000\n  maxRecentPackages: number;  // Default: 20\n}\n```\n\nExample:\n```typescript\nconst config = {\n  packagesDir: '/custom/packages',\n  recentDays: 14,\n  timeoutMs: 60000\n};\n\nconst packages = getAllPackages(config);\n```\n\n### Utility Functions\n\n#### `isValidPackageName(packageName)`\nValidate package name format (category/package-name).\n\n```typescript\nisValidPackageName('core/package1'); // true\nisValidPackageName('package1');      // false\n```\n\n#### `getPackageCategory(packageName)`\nExtract category from package name.\n\n```typescript\ngetPackageCategory('core/package1'); // 'core'\n```\n\n#### `getPackageNameOnly(packageName)`\nExtract package name without category.\n\n```typescript\ngetPackageNameOnly('core/package1'); // 'package1'\n```\n\n## Directory Structure Support\n\nThis package supports both flat and nested package structures:\n\n```\npackages/\n├── core/\n│   ├── package1/\n│   └── package2/\n├── service/\n│   ├── package3/\n│   └── package4/\n└── util/\n    └── package5/\n```\n\nPackage names are returned in the format `category/package-name`.\n\n## Error Handling\n\nAll functions handle errors gracefully:\n\n- **File System Errors**: Return empty arrays or throw descriptive errors\n- **Git Command Errors**: Return empty arrays with console warnings\n- **NPM Command Errors**: Return appropriate defaults for unpublished packages\n\n## Testing\n\n```bash\nnpm test\n```\n\nThe package includes comprehensive tests with mocked file system and git operations.\n\n## Performance\n\n- **Pure Functions**: No side effects, easily cacheable\n- **Lazy Evaluation**: Git commands only run when needed\n- **Configurable Timeouts**: Prevent hanging on slow operations\n- **Efficient Filtering**: Early returns for empty results\n\n## Use Cases\n\n### Publishing Workflow\n```typescript\nconst analysis = await analyzePackages();\nif (analysis.packagesNeedingPublish.length > 0) {\n  const nextPackage = analysis.smartSuggestion;\n  console.log(`Next package to publish: ${nextPackage}`);\n}\n```\n\n### Development Checks\n```typescript\nconst modified = await getModifiedPackages();\nif (modified.length > 0) {\n  console.log('Packages with uncommitted changes:', modified);\n}\n```\n\n### Package Discovery\n```typescript\nconst allPackages = getAllPackages();\nconst corePackages = allPackages.filter(pkg => pkg.startsWith('core/'));\nconsole.log('Core packages:', corePackages);\n```\n\n## Contributing\n\nThis package follows the BernierLLC development standards:\n\n- **TypeScript**: Strict type checking enabled\n- **Tests**: Comprehensive test coverage\n- **Documentation**: JSDoc comments on all public functions\n- **Error Handling**: Graceful error handling with descriptive messages\n\n## License\n\nUNLICENSED - Bernier LLC internal use only. ","readmeFilename":"README.md"}