@ankhorage/doctor 0.14.5 → 0.14.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +1 -1
- package/dist/analysis.d.ts.map +1 -1
- package/dist/analysis.js +12 -24
- package/dist/analysis.js.map +1 -1
- package/dist/capabilities/index.js.map +1 -1
- package/dist/capabilityCatalog.d.ts +1 -1
- package/dist/capabilityCatalog.d.ts.map +1 -1
- package/dist/capabilityCatalog.js +4 -16
- package/dist/capabilityCatalog.js.map +1 -1
- package/dist/commands.d.ts +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js.map +1 -1
- package/package.json +4 -3
- package/src/analysis.ts +24 -30
- package/src/capabilities/index.ts +1 -1
- package/src/capabilityCatalog.ts +5 -20
- package/src/commands.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.14.7
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 9a03149: Consume the standalone capability toolkit for descriptor and catalog validation.
|
|
8
|
+
|
|
9
|
+
## 0.14.6
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- a5f4c83: Allow non-provider package metadata without capabilities when no public capability catalog exists.
|
|
14
|
+
|
|
3
15
|
## 0.14.5
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
# @ankhorage/doctor
|
|
5
5
|
|
|
6
|
-
         
|
|
7
7
|
|
|
8
8
|
Executable Ankh provider and standalone CLI for lightweight repo and package compliance diagnostics.
|
|
9
9
|
|
package/dist/analysis.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../src/analysis.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../src/analysis.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAChE,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;AACvE,MAAM,MAAM,uBAAuB,GACjC,kBAAkB,GAAG,aAAa,GAAG,aAAa,GAAG,aAAa,CAAC;AAErE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACjD,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACrD,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AA+BD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA+I/B"}
|
package/dist/analysis.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { promises as fs } from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { pathToFileURL } from 'node:url';
|
|
4
|
-
import {
|
|
4
|
+
import { areCapabilityCatalogsEqual, isCapability, isCapabilityCatalog, normalizeCapability, } from '@ankhorage/capability';
|
|
5
5
|
import { REPOSITORY_RULE_METADATA } from '@ankhorage/rules-repository';
|
|
6
6
|
import { uniqueSortedStrings } from '@ankhorage/utility/array';
|
|
7
7
|
import { readCapabilityCatalogAsync } from './capabilityCatalog.js';
|
|
@@ -402,7 +402,7 @@ async function validateAnkhMetadataAndProvider(request) {
|
|
|
402
402
|
}
|
|
403
403
|
return diagnostics;
|
|
404
404
|
}
|
|
405
|
-
const metadataValidation = validateAnkhMetadataShape(metadata, providerPackage);
|
|
405
|
+
const metadataValidation = validateAnkhMetadataShape(metadata, providerPackage, catalog.path !== null);
|
|
406
406
|
if (metadataValidation !== null) {
|
|
407
407
|
diagnostics.push(createDiagnostic({
|
|
408
408
|
code: 'invalid-ankh-metadata',
|
|
@@ -418,7 +418,7 @@ async function validateAnkhMetadataAndProvider(request) {
|
|
|
418
418
|
return diagnostics;
|
|
419
419
|
}
|
|
420
420
|
const metadataCapabilities = readCapabilities(metadata.capabilities);
|
|
421
|
-
const metadataIdsAreUnique =
|
|
421
|
+
const metadataIdsAreUnique = isCapabilityCatalog(metadataCapabilities);
|
|
422
422
|
if (!metadataIdsAreUnique) {
|
|
423
423
|
diagnostics.push(createDiagnostic({
|
|
424
424
|
code: 'field-invalid',
|
|
@@ -441,7 +441,7 @@ async function validateAnkhMetadataAndProvider(request) {
|
|
|
441
441
|
}
|
|
442
442
|
else if (catalog.capabilities !== null &&
|
|
443
443
|
metadataIdsAreUnique &&
|
|
444
|
-
!
|
|
444
|
+
!areCapabilityCatalogsEqual(metadataCapabilities, catalog.capabilities)) {
|
|
445
445
|
diagnostics.push(createDiagnostic({
|
|
446
446
|
code: 'field-invalid',
|
|
447
447
|
message: 'package.json.ankh capabilities must match the canonical public CAPABILITIES catalog exactly.',
|
|
@@ -479,7 +479,7 @@ async function validateAnkhMetadataAndProvider(request) {
|
|
|
479
479
|
}
|
|
480
480
|
const providerCapabilities = inspection.result.capabilities;
|
|
481
481
|
const commandCapabilities = uniqueSortedStrings(inspection.result.commandCapabilities);
|
|
482
|
-
if (!
|
|
482
|
+
if (!areCapabilityCatalogsEqual(metadataCapabilities, providerCapabilities)) {
|
|
483
483
|
diagnostics.push(createDiagnostic({
|
|
484
484
|
code: 'field-invalid',
|
|
485
485
|
message: 'package.json.ankh capabilities must match the implemented provider capability descriptors exactly.',
|
|
@@ -766,7 +766,7 @@ function expectsDevtools(packageJson) {
|
|
|
766
766
|
function hasDependency(dependencyMap, dependencyName) {
|
|
767
767
|
return dependencyMap !== null && isNonEmptyString(dependencyMap[dependencyName]);
|
|
768
768
|
}
|
|
769
|
-
function validateAnkhMetadataShape(value, providerPackage) {
|
|
769
|
+
function validateAnkhMetadataShape(value, providerPackage, hasPublicCapabilityCatalog) {
|
|
770
770
|
if (!isRecord(value)) {
|
|
771
771
|
return 'package.json "ankh" metadata must be an object when present.';
|
|
772
772
|
}
|
|
@@ -782,8 +782,12 @@ function validateAnkhMetadataShape(value, providerPackage) {
|
|
|
782
782
|
!(value.provider === null || isPackageRelativeProviderPath(value.provider))) {
|
|
783
783
|
return 'Non-provider package metadata, when present, must use null or a package-relative "./..." provider value.';
|
|
784
784
|
}
|
|
785
|
-
if (!Array.isArray(value.capabilities)
|
|
786
|
-
|
|
785
|
+
if ((providerPackage || hasPublicCapabilityCatalog) && !Array.isArray(value.capabilities)) {
|
|
786
|
+
return 'package.json "ankh.capabilities" must be an array of canonical Capability descriptors.';
|
|
787
|
+
}
|
|
788
|
+
if (value.capabilities !== undefined &&
|
|
789
|
+
(!Array.isArray(value.capabilities) ||
|
|
790
|
+
value.capabilities.some((capability) => !isCapability(capability)))) {
|
|
787
791
|
return 'package.json "ankh.capabilities" must be an array of canonical Capability descriptors.';
|
|
788
792
|
}
|
|
789
793
|
return null;
|
|
@@ -857,22 +861,6 @@ function readStringArray(value) {
|
|
|
857
861
|
function readCapabilities(value) {
|
|
858
862
|
return Array.isArray(value) ? value.filter(isCapability).map(normalizeCapability) : [];
|
|
859
863
|
}
|
|
860
|
-
/*** Compare capability collections by canonical id and descriptor semantics. */
|
|
861
|
-
function sameCapabilitySet(left, right) {
|
|
862
|
-
const leftById = new Map(left.map((capability) => [capability.id, capability]));
|
|
863
|
-
const rightById = new Map(right.map((capability) => [capability.id, capability]));
|
|
864
|
-
return (leftById.size === left.length &&
|
|
865
|
-
rightById.size === right.length &&
|
|
866
|
-
leftById.size === rightById.size &&
|
|
867
|
-
[...leftById].every(([id, capability]) => {
|
|
868
|
-
const other = rightById.get(id);
|
|
869
|
-
return other !== undefined && areCapabilitiesEqual(capability, other);
|
|
870
|
-
}));
|
|
871
|
-
}
|
|
872
|
-
/*** Determine whether every normalized catalog descriptor has a distinct stable identifier. */
|
|
873
|
-
function hasUniqueCapabilityIds(capabilities) {
|
|
874
|
-
return new Set(capabilities.map((capability) => capability.id)).size === capabilities.length;
|
|
875
|
-
}
|
|
876
864
|
function sameStringSet(left, right) {
|
|
877
865
|
const leftSet = uniqueSortedStrings(left);
|
|
878
866
|
const rightSet = uniqueSortedStrings(right);
|
package/dist/analysis.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../src/analysis.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport {\n areCapabilitiesEqual,\n type Capability,\n isCapability,\n normalizeCapability,\n} from '@ankhorage/contracts/capabilities';\nimport { REPOSITORY_RULE_METADATA } from '@ankhorage/rules-repository';\nimport { uniqueSortedStrings } from '@ankhorage/utility/array';\n\nimport { readCapabilityCatalogAsync } from './capabilityCatalog.js';\nimport type { DoctorDiagnostic, DoctorPolicyProfile, DoctorRuleId } from './diagnostics.js';\nimport type { DoctorReadiness } from './readiness.js';\nimport { getRepositoryRule } from './utils/getRepositoryRule.js';\n\nexport type DoctorTargetCheck = 'manifest' | 'package' | 'repo';\nexport type DoctorTargetMode = 'fix' | 'package' | 'repo' | 'validate';\nexport type DoctorPlannedChangeKind =\n 'create-directory' | 'create-file' | 'update-json' | 'update-text';\n\nexport interface DoctorAnalysisRequest {\n readonly cwd: string;\n readonly inputPath?: string;\n readonly mode: DoctorTargetMode;\n}\n\nexport interface DoctorPlannedChange {\n readonly description: string;\n readonly filePath: string;\n readonly kind: DoctorPlannedChangeKind;\n readonly ruleId: DoctorRuleId;\n readonly safe: boolean;\n}\n\nexport interface DoctorFixPlan {\n readonly changes: readonly DoctorPlannedChange[];\n readonly diagnostics: readonly DoctorDiagnostic[];\n readonly profile: DoctorPolicyProfile;\n readonly targetPath: string;\n}\n\nexport interface DoctorAnalysisResult {\n readonly appliedChecks: readonly DoctorTargetCheck[];\n readonly diagnostics: readonly DoctorDiagnostic[];\n readonly fixPlan: DoctorFixPlan | null;\n readonly hasPackageJson: boolean;\n readonly plannedChanges: readonly DoctorPlannedChange[];\n readonly profile: DoctorPolicyProfile;\n readonly readiness?: readonly DoctorReadiness[];\n readonly repoMarkers: readonly string[];\n readonly targetPath: string;\n}\n\ninterface ProviderInspectionResult {\n readonly capabilities: readonly Capability[];\n readonly commandCapabilities: readonly string[];\n readonly commandPaths: readonly string[];\n readonly handlerPaths: readonly string[];\n readonly sourcePath: string;\n}\n\nconst REPO_MARKERS = [\n { label: '.git', relativePath: '.git' },\n { label: '.github/workflows', relativePath: path.join('.github', 'workflows') },\n { label: '.changeset', relativePath: '.changeset' },\n { label: 'package.json', relativePath: 'package.json' },\n { label: 'pnpm-workspace.yaml', relativePath: 'pnpm-workspace.yaml' },\n { label: 'bun.lock', relativePath: 'bun.lock' },\n { label: 'bun.lockb', relativePath: 'bun.lockb' },\n { label: 'package-lock.json', relativePath: 'package-lock.json' },\n { label: 'yarn.lock', relativePath: 'yarn.lock' },\n] as const;\n\nconst PUBLIC_PACKAGE_POLICY = REPOSITORY_RULE_METADATA.publicPackage;\n\nconst PROVIDER_SOURCE_CANDIDATES = [\n path.join('src', 'ankh.provider.ts'),\n path.join('src', 'ankh.provider.tsx'),\n path.join('src', 'ankh.provider.js'),\n path.join('src', 'ankh.provider.mjs'),\n] as const;\n\nexport async function analyzeDoctorTarget(\n request: DoctorAnalysisRequest,\n): Promise<DoctorAnalysisResult> {\n const targetPath = path.resolve(request.cwd, request.inputPath ?? '.');\n const stats = await statOrNull(targetPath);\n\n if (stats === null) {\n return createEarlyResult(\n targetPath,\n createDiagnostic({\n code: 'target-not-found',\n message: `Target path does not exist: ${targetPath}`,\n path: targetPath,\n profile: 'unknown',\n ruleId: 'target.path.exists',\n severity: 'error',\n }),\n );\n }\n\n if (!stats.isDirectory()) {\n return createEarlyResult(\n targetPath,\n createDiagnostic({\n code: 'target-not-directory',\n message: `Target path must be a directory: ${targetPath}`,\n path: targetPath,\n profile: 'unknown',\n ruleId: 'target.path.directory',\n severity: 'error',\n }),\n );\n }\n\n const repoMarkers = await findRepoMarkers(targetPath);\n const packageJsonPath = path.join(targetPath, 'package.json');\n const hasPackageJson = repoMarkers.includes('package.json');\n const appliedChecks: DoctorTargetCheck[] = [];\n const diagnostics: DoctorDiagnostic[] = [];\n const plannedChanges: DoctorPlannedChange[] = [];\n\n const packageJson = hasPackageJson ? await readPackageJson(packageJsonPath) : null;\n if (packageJson !== null && packageJson.diagnostic !== null) {\n diagnostics.push(packageJson.diagnostic);\n }\n\n const profile = detectProfile(repoMarkers, packageJson?.parsed ?? null);\n\n const shouldRunRepoChecks =\n request.mode === 'repo' ||\n ((request.mode === 'validate' || request.mode === 'fix') && repoMarkers.length > 0);\n const shouldRunPackageChecks =\n request.mode === 'package' ||\n ((request.mode === 'validate' || request.mode === 'fix') && hasPackageJson);\n\n if (request.mode === 'repo' && repoMarkers.length === 0) {\n diagnostics.push(\n createDiagnostic({\n code: 'unsupported-target',\n message:\n 'Target is not a repo/workspace-root candidate because no repo markers were found.',\n path: targetPath,\n profile,\n ruleId: 'target.repo-markers.required',\n severity: 'error',\n }),\n );\n }\n\n if (request.mode === 'package' && !hasPackageJson) {\n diagnostics.push(\n createDiagnostic({\n code: 'unsupported-target',\n message: 'Target does not contain a readable package.json file.',\n path: packageJsonPath,\n profile,\n ruleId: 'target.package-json.required',\n severity: 'error',\n }),\n );\n }\n\n if (\n (request.mode === 'validate' || request.mode === 'fix') &&\n repoMarkers.length === 0 &&\n !hasPackageJson\n ) {\n diagnostics.push(\n createDiagnostic({\n code: 'unsupported-target',\n message: 'Target is neither a repo/workspace-root candidate nor a package root.',\n path: targetPath,\n profile,\n ruleId: 'target.profile.supported',\n severity: 'error',\n }),\n );\n }\n\n if (shouldRunRepoChecks && repoMarkers.length > 0) {\n appliedChecks.push('repo');\n diagnostics.push(\n ...(await analyzeRepoPolicy({\n packageJson: packageJson?.parsed ?? null,\n plannedChanges,\n profile,\n repoMarkers,\n targetPath,\n })),\n );\n }\n\n if (shouldRunPackageChecks && hasPackageJson) {\n appliedChecks.push('package');\n diagnostics.push(\n ...(await analyzePackagePolicy({\n packageJson: packageJson?.parsed ?? null,\n packageJsonPath,\n plannedChanges,\n profile,\n targetPath,\n })),\n );\n }\n\n const fixPlan =\n request.mode === 'fix'\n ? {\n changes: plannedChanges,\n diagnostics,\n profile,\n targetPath,\n }\n : null;\n\n return {\n appliedChecks,\n diagnostics,\n fixPlan,\n hasPackageJson,\n plannedChanges,\n profile,\n repoMarkers,\n targetPath,\n };\n}\n\nasync function analyzeRepoPolicy(request: {\n readonly packageJson: Record<string, unknown> | null;\n readonly plannedChanges: DoctorPlannedChange[];\n readonly profile: DoctorPolicyProfile;\n readonly repoMarkers: readonly string[];\n readonly targetPath: string;\n}): Promise<DoctorDiagnostic[]> {\n const diagnostics: DoctorDiagnostic[] = [];\n\n if (request.profile === 'public-package') {\n for (const artifact of PUBLIC_PACKAGE_POLICY.requiredRepoPaths) {\n await maybeRequirePath(\n diagnostics,\n request.plannedChanges,\n request.targetPath,\n artifact.path,\n artifact.ruleId,\n artifact.kind === 'file' ? 'create-file' : 'create-directory',\n );\n }\n }\n\n if (request.profile === 'integration-monorepo') {\n if (!request.repoMarkers.includes('package.json')) {\n diagnostics.push(\n createDiagnostic({\n code: 'missing-path',\n message: 'The integration monorepo root must include a package.json file.',\n path: path.join(request.targetPath, 'package.json'),\n profile: request.profile,\n ruleId: 'target.package-json.required',\n severity: 'error',\n }),\n );\n }\n\n if (request.packageJson !== null) {\n if (request.packageJson.ankh !== undefined) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message:\n 'The integration monorepo root must not publish top-level package.json.ankh metadata.',\n path: path.join(request.targetPath, 'package.json'),\n profile: request.profile,\n ruleId: 'integration.package.ankh.disallowed',\n severity: 'error',\n }),\n );\n }\n\n if (request.packageJson.private !== true) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: 'The integration monorepo root must remain private.',\n path: path.join(request.targetPath, 'package.json'),\n profile: request.profile,\n ruleId: 'integration.package.private.required',\n severity: 'error',\n }),\n );\n }\n\n if (!Array.isArray(request.packageJson.workspaces)) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-missing',\n message: 'The integration monorepo root must declare workspaces.',\n path: path.join(request.targetPath, 'package.json'),\n profile: request.profile,\n ruleId: 'integration.package.workspaces.required',\n severity: 'error',\n }),\n );\n }\n }\n }\n\n return diagnostics;\n}\n\nasync function analyzePackagePolicy(request: {\n readonly packageJson: Record<string, unknown> | null;\n readonly packageJsonPath: string;\n readonly plannedChanges: DoctorPlannedChange[];\n readonly profile: DoctorPolicyProfile;\n readonly targetPath: string;\n}): Promise<DoctorDiagnostic[]> {\n if (request.packageJson === null) {\n return [];\n }\n\n const diagnostics: DoctorDiagnostic[] = [];\n const { packageJson } = request;\n\n if (request.profile === 'public-package') {\n requirePublicPackageFields({\n diagnostics,\n packageJson,\n packageJsonPath: request.packageJsonPath,\n profile: request.profile,\n });\n }\n\n if (request.profile !== 'public-package') {\n return diagnostics.concat(\n await validateAnkhMetadataAndProvider({\n diagnostics,\n packageJson,\n packageJsonPath: request.packageJsonPath,\n plannedChanges: request.plannedChanges,\n profile: request.profile,\n targetPath: request.targetPath,\n }),\n );\n }\n\n if (packageJson.private === true) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: 'Public package profiles must not set private: true.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.privateDisallowedRuleId),\n }),\n );\n }\n\n if (\n packageJson.type !== undefined &&\n packageJson.type !== PUBLIC_PACKAGE_POLICY.packageType.value\n ) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: `package.json \"type\" must be \"${PUBLIC_PACKAGE_POLICY.packageType.value}\".`,\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.packageType.ruleId),\n }),\n );\n }\n\n const { publishConfig } = packageJson;\n if (\n isRecord(publishConfig) &&\n publishConfig.access !== PUBLIC_PACKAGE_POLICY.publishAccess.value\n ) {\n diagnostics.push(\n createDiagnostic({\n code: isNonEmptyString(publishConfig.access) ? 'field-invalid' : 'field-missing',\n message: `package.json publishConfig.access must exist and equal \"${PUBLIC_PACKAGE_POLICY.publishAccess.value}\".`,\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.publishAccess.ruleId),\n }),\n );\n }\n\n if (!isNonEmptyString(packageJson.packageManager)) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-missing',\n message: 'package.json must define a Bun-aligned packageManager field.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.packageManager.requiredRuleId),\n }),\n );\n request.plannedChanges.push(\n createPlannedChange({\n description: `Add packageManager: \"bun@${Bun.version}\" to package.json.`,\n filePath: request.packageJsonPath,\n kind: 'update-json',\n ruleId: PUBLIC_PACKAGE_POLICY.packageManager.requiredRuleId,\n }),\n );\n } else if (!packageJson.packageManager.startsWith('bun@')) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: 'package.json packageManager must be Bun-aligned, for example \"bun@1.x\".',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.packageManager.bunRuleId),\n }),\n );\n }\n\n const scripts = isRecord(packageJson.scripts) ? packageJson.scripts : null;\n for (const requirement of PUBLIC_PACKAGE_POLICY.requiredScripts) {\n if (scripts === null || !isNonEmptyString(scripts[requirement.name])) {\n diagnostics.push(\n createDiagnostic({\n code: 'missing-script',\n message: `Missing required package script: ${requirement.name}`,\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(requirement.ruleId),\n }),\n );\n }\n }\n\n const devDependencies = isRecord(packageJson.devDependencies)\n ? packageJson.devDependencies\n : null;\n const dependencies = isRecord(packageJson.dependencies) ? packageJson.dependencies : null;\n if (!hasDependency(dependencies, 'typescript') && !hasDependency(devDependencies, 'typescript')) {\n diagnostics.push(\n createDiagnostic({\n code: 'missing-dependency',\n message: 'Public package repos must declare TypeScript in dependencies or devDependencies.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.dependencyRules.typescript),\n }),\n );\n }\n\n const changesetsDependencyDiagnostic = createChangesetsDependencyDiagnostic({\n dependencies,\n devDependencies,\n packageJson,\n packageJsonPath: request.packageJsonPath,\n profile: request.profile,\n });\n if (changesetsDependencyDiagnostic !== null) {\n diagnostics.push(changesetsDependencyDiagnostic);\n }\n\n if (!hasDependency(devDependencies, '@types/bun')) {\n diagnostics.push(\n createDiagnostic({\n code: 'missing-dependency',\n message: 'Public package repos must declare @types/bun in devDependencies.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.dependencyRules.bunTypes),\n }),\n );\n }\n\n if (!hasDependency(devDependencies, '@types/node')) {\n diagnostics.push(\n createDiagnostic({\n code: 'missing-dependency',\n message: 'Public package repos must declare @types/node in devDependencies.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.dependencyRules.nodeTypes),\n }),\n );\n }\n\n if (expectsDevtools(packageJson) && !hasDependency(devDependencies, '@ankhorage/devtools')) {\n diagnostics.push(\n createDiagnostic({\n code: 'missing-dependency',\n message:\n 'This package consumes shared Ankhorage lint/format/knip tooling and must declare @ankhorage/devtools.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.dependencyRules.devtools),\n }),\n );\n }\n\n if (\n packageJson.name !== '@ankhorage/paradox' &&\n (await expectsParadox(request.targetPath, packageJson)) &&\n !hasDependency(devDependencies, '@ankhorage/paradox')\n ) {\n diagnostics.push(\n createDiagnostic({\n code: 'missing-dependency',\n message: 'This package owns Paradox docs generation and must declare @ankhorage/paradox.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.dependencyRules.paradox),\n }),\n );\n }\n\n return diagnostics.concat(\n await validateAnkhMetadataAndProvider({\n diagnostics,\n packageJson,\n packageJsonPath: request.packageJsonPath,\n plannedChanges: request.plannedChanges,\n profile: request.profile,\n targetPath: request.targetPath,\n }),\n );\n}\n\nfunction createChangesetsDependencyDiagnostic(request: {\n readonly dependencies: Record<string, unknown> | null;\n readonly devDependencies: Record<string, unknown> | null;\n readonly packageJson: Record<string, unknown>;\n readonly packageJsonPath: string;\n readonly profile: DoctorPolicyProfile;\n}): DoctorDiagnostic | null {\n const dependencyDeclared = hasDependency(request.dependencies, '@changesets/cli');\n const devDependencyDeclared = hasDependency(request.devDependencies, '@changesets/cli');\n const isDevtoolsOwner = request.packageJson.name === '@ankhorage/devtools';\n const placementIsCurrent = isDevtoolsOwner\n ? dependencyDeclared && !devDependencyDeclared\n : !dependencyDeclared && !devDependencyDeclared;\n\n if (placementIsCurrent) {\n return null;\n }\n\n return createDiagnostic({\n code: isDevtoolsOwner ? 'missing-dependency' : 'field-invalid',\n message: isDevtoolsOwner\n ? '@ankhorage/devtools must publish @changesets/cli in dependencies, not devDependencies.'\n : 'Public package repos must not declare @changesets/cli directly; @ankhorage/devtools owns Changesets execution.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.dependencyRules.changesets),\n });\n}\n\nasync function validateAnkhMetadataAndProvider(request: {\n readonly diagnostics: readonly DoctorDiagnostic[];\n readonly packageJson: Record<string, unknown>;\n readonly packageJsonPath: string;\n readonly plannedChanges: DoctorPlannedChange[];\n readonly profile: DoctorPolicyProfile;\n readonly targetPath: string;\n}): Promise<DoctorDiagnostic[]> {\n const diagnostics: DoctorDiagnostic[] = [];\n const metadata = request.packageJson.ankh;\n const catalog = await readCapabilityCatalogAsync(request.targetPath, request.packageJson.exports);\n const providerPackage =\n (isRecord(metadata) && isNonEmptyString(metadata.provider)) ||\n (await isProviderPackage(request.targetPath));\n\n if (providerPackage && metadata === undefined) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-missing',\n message: 'Provider packages must define package.json.ankh metadata.',\n path: request.packageJsonPath,\n profile: request.profile,\n ruleId: 'package.ankh.required-for-provider',\n severity: 'error',\n }),\n );\n request.plannedChanges.push(\n createPlannedChange({\n description:\n 'Add a package.json.ankh block describing the implemented provider category, provider path, and capabilities.',\n filePath: request.packageJsonPath,\n kind: 'update-json',\n ruleId: 'package.ankh.required-for-provider',\n }),\n );\n return diagnostics;\n }\n\n if (metadata === undefined) {\n if (catalog.path !== null) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-missing',\n message: 'A public capability catalog requires package.json.ankh discovery metadata.',\n path: request.packageJsonPath,\n profile: request.profile,\n ruleId: 'package.ankh.required-for-capability-catalog',\n severity: 'error',\n }),\n );\n }\n return diagnostics;\n }\n\n const metadataValidation = validateAnkhMetadataShape(metadata, providerPackage);\n if (metadataValidation !== null) {\n diagnostics.push(\n createDiagnostic({\n code: 'invalid-ankh-metadata',\n message: metadataValidation,\n path: request.packageJsonPath,\n profile: request.profile,\n ruleId: 'package.ankh.present.valid-shape',\n severity: 'error',\n }),\n );\n return diagnostics;\n }\n\n if (!isRecord(metadata)) {\n return diagnostics;\n }\n\n const metadataCapabilities = readCapabilities(metadata.capabilities);\n const metadataIdsAreUnique = hasUniqueCapabilityIds(metadataCapabilities);\n if (!metadataIdsAreUnique) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: 'package.json.ankh capabilities must not contain duplicate capability ids.',\n path: request.packageJsonPath,\n profile: request.profile,\n ruleId: 'package.ankh.capabilities.unique',\n severity: 'error',\n }),\n );\n }\n\n if (catalog.path !== null && catalog.capabilities === null) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: `The public capability catalog is invalid: ${catalog.reason}`,\n path: catalog.path,\n profile: request.profile,\n ruleId: 'package.ankh.capabilities.catalog.valid',\n severity: 'error',\n }),\n );\n } else if (\n catalog.capabilities !== null &&\n metadataIdsAreUnique &&\n !sameCapabilitySet(metadataCapabilities, catalog.capabilities)\n ) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message:\n 'package.json.ankh capabilities must match the canonical public CAPABILITIES catalog exactly.',\n path: request.packageJsonPath,\n profile: request.profile,\n ruleId: 'package.ankh.capabilities.match-catalog',\n severity: 'error',\n }),\n );\n }\n\n if (!providerPackage) {\n return diagnostics;\n }\n\n if (!isRecord(metadata) || !isNonEmptyString(metadata.provider)) {\n diagnostics.push(\n createDiagnostic({\n code: 'invalid-ankh-metadata',\n message: 'Provider package metadata must define a package-relative provider path.',\n path: request.packageJsonPath,\n profile: request.profile,\n ruleId: 'package.ankh.provider-path.required',\n severity: 'error',\n }),\n );\n return diagnostics;\n }\n\n const inspection = await inspectProviderSource({\n metadataProviderPath: metadata.provider,\n packageRoot: request.targetPath,\n profile: request.profile,\n });\n\n if (inspection.diagnostic !== null) {\n diagnostics.push(inspection.diagnostic);\n return diagnostics;\n }\n\n if (inspection.result === null) {\n return diagnostics;\n }\n\n const providerCapabilities = inspection.result.capabilities;\n const commandCapabilities = uniqueSortedStrings(inspection.result.commandCapabilities);\n\n if (!sameCapabilitySet(metadataCapabilities, providerCapabilities)) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message:\n 'package.json.ankh capabilities must match the implemented provider capability descriptors exactly.',\n path: request.packageJsonPath,\n profile: request.profile,\n ruleId: 'package.ankh.capabilities.match-provider',\n severity: 'error',\n }),\n );\n }\n\n if (\n !commandCapabilities.every((commandCapability) =>\n providerCapabilities.some((capability) => capability.id === commandCapability),\n )\n ) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: 'Every provider command must reference a capability published by the provider.',\n path: inspection.result.sourcePath,\n profile: request.profile,\n ruleId: 'provider.commands.match-capabilities',\n severity: 'error',\n }),\n );\n }\n\n if (!sameStringSet(inspection.result.commandPaths, inspection.result.handlerPaths)) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: 'Every provider command descriptor must have a matching handler path.',\n path: inspection.result.sourcePath,\n profile: request.profile,\n ruleId: 'provider.commands.match-handlers',\n severity: 'error',\n }),\n );\n }\n\n return diagnostics;\n}\n\nasync function inspectProviderSource(request: {\n readonly metadataProviderPath: string;\n readonly packageRoot: string;\n readonly profile: DoctorPolicyProfile;\n}): Promise<{\n readonly diagnostic: DoctorDiagnostic | null;\n readonly result: ProviderInspectionResult | null;\n}> {\n const sourcePath = await resolveProviderSourcePath(\n request.packageRoot,\n request.metadataProviderPath,\n );\n if (sourcePath === null) {\n return {\n diagnostic: createDiagnostic({\n code: 'provider-source-missing',\n message:\n 'Provider package metadata is present, but no provider source file could be resolved for inspection.',\n path: request.packageRoot,\n profile: request.profile,\n ruleId: 'provider.source.required',\n severity: 'error',\n }),\n result: null,\n };\n }\n\n try {\n const importedModule: unknown = await import(pathToFileURL(sourcePath).href);\n const provider = isRecord(importedModule) ? importedModule.default : undefined;\n if (!isRecord(provider)) {\n return {\n diagnostic: createDiagnostic({\n code: 'provider-source-import-failed',\n message: 'Provider source default export must be an object.',\n path: sourcePath,\n profile: request.profile,\n ruleId: 'provider.source.importable',\n severity: 'error',\n }),\n result: null,\n };\n }\n\n const capabilities = readCapabilities(provider.capabilities);\n const commands = Array.isArray(provider.commands) ? provider.commands : [];\n const handlers = Array.isArray(provider.handlers) ? provider.handlers : [];\n\n const commandCapabilities = commands.flatMap((command) =>\n isRecord(command) && isNonEmptyString(command.capability) ? [command.capability] : [],\n );\n const commandPaths = commands.flatMap((command) => {\n const pathValue = isRecord(command) ? command.path : undefined;\n return isStringTuple(pathValue) ? [pathValue.join(' ')] : [];\n });\n const handlerPaths = handlers.flatMap((handler) => {\n const pathValue = isRecord(handler) ? handler.path : undefined;\n const handlerFunction = isRecord(handler) ? handler.handler : undefined;\n return isStringTuple(pathValue) && typeof handlerFunction === 'function'\n ? [pathValue.join(' ')]\n : [];\n });\n\n return {\n diagnostic: null,\n result: {\n capabilities,\n commandCapabilities,\n commandPaths,\n handlerPaths,\n sourcePath,\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n diagnostic: createDiagnostic({\n code: 'provider-source-import-failed',\n message: `Failed to import provider source: ${message}`,\n path: sourcePath,\n profile: request.profile,\n ruleId: 'provider.source.importable',\n severity: 'error',\n }),\n result: null,\n };\n }\n}\n\nasync function resolveProviderSourcePath(\n packageRoot: string,\n metadataProviderPath: string,\n): Promise<string | null> {\n const candidates = new Set<string>();\n candidates.add(path.resolve(packageRoot, metadataProviderPath));\n\n if (metadataProviderPath.startsWith('./dist/') && metadataProviderPath.endsWith('.js')) {\n const relativeStem = metadataProviderPath.slice('./dist/'.length, -'.js'.length);\n candidates.add(path.resolve(packageRoot, 'src', `${relativeStem}.ts`));\n candidates.add(path.resolve(packageRoot, 'src', `${relativeStem}.tsx`));\n candidates.add(path.resolve(packageRoot, 'src', `${relativeStem}.js`));\n candidates.add(path.resolve(packageRoot, 'src', `${relativeStem}.mjs`));\n }\n\n for (const providerSourceCandidate of PROVIDER_SOURCE_CANDIDATES) {\n candidates.add(path.resolve(packageRoot, providerSourceCandidate));\n }\n\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nasync function findRepoMarkers(targetPath: string): Promise<readonly string[]> {\n return (\n await Promise.all(\n REPO_MARKERS.map(async (marker) =>\n (await pathExists(path.join(targetPath, marker.relativePath))) ? marker.label : null,\n ),\n )\n ).filter((marker): marker is (typeof REPO_MARKERS)[number]['label'] => marker !== null);\n}\n\nasync function readPackageJson(packageJsonPath: string): Promise<{\n readonly diagnostic: DoctorDiagnostic | null;\n readonly parsed: Record<string, unknown> | null;\n}> {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(await fs.readFile(packageJsonPath, 'utf8')) as unknown;\n } catch (error) {\n return {\n diagnostic: createDiagnostic({\n code: 'invalid-package-json',\n message: createInvalidPackageJsonMessage(error),\n path: packageJsonPath,\n profile: 'unknown',\n ruleId: 'target.package-json.required',\n severity: 'error',\n }),\n parsed: null,\n };\n }\n\n if (!isRecord(parsed)) {\n return {\n diagnostic: createDiagnostic({\n code: 'invalid-package-json',\n message: 'package.json must contain a JSON object.',\n path: packageJsonPath,\n profile: 'unknown',\n ruleId: 'target.package-json.required',\n severity: 'error',\n }),\n parsed: null,\n };\n }\n\n return {\n diagnostic: null,\n parsed,\n };\n}\n\nfunction detectProfile(\n repoMarkers: readonly string[],\n packageJson: Record<string, unknown> | null,\n): DoctorPolicyProfile {\n if (packageJson !== null) {\n if (packageJson.name === 'ankhorage4') {\n return 'integration-monorepo';\n }\n\n if (isNonEmptyString(packageJson.name) && packageJson.name.startsWith('@ankhorage/')) {\n return packageJson.private === true ? 'unknown' : 'public-package';\n }\n }\n\n if (repoMarkers.length > 0) {\n return 'unknown';\n }\n\n return 'unknown';\n}\n\nasync function isProviderPackage(targetPath: string): Promise<boolean> {\n for (const candidate of PROVIDER_SOURCE_CANDIDATES) {\n if (await pathExists(path.join(targetPath, candidate))) {\n return true;\n }\n }\n\n return false;\n}\n\n/*** Validate every generic public-package metadata field from canonical Policy. */\nfunction requirePublicPackageFields(request: {\n readonly diagnostics: DoctorDiagnostic[];\n readonly packageJson: Record<string, unknown>;\n readonly packageJsonPath: string;\n readonly profile: DoctorPolicyProfile;\n}): void {\n for (const requirement of PUBLIC_PACKAGE_POLICY.requiredFields) {\n const input = {\n diagnostics: request.diagnostics,\n fieldName: requirement.name,\n packageJson: request.packageJson,\n packageJsonPath: request.packageJsonPath,\n profile: request.profile,\n ruleId: requirement.ruleId,\n };\n\n switch (requirement.kind) {\n case 'non-empty-string':\n requireNonEmptyStringField(input);\n break;\n case 'record':\n requireRecordField(input);\n break;\n case 'string-array':\n requireStringArrayField(input);\n break;\n }\n }\n}\n\nasync function maybeRequirePath(\n diagnostics: DoctorDiagnostic[],\n plannedChanges: DoctorPlannedChange[],\n rootPath: string,\n relativePath: string,\n ruleId:\n | 'repo.changelog.required'\n | 'repo.changeset.required'\n | 'repo.license.required'\n | 'repo.readme.required'\n | 'repo.workflows.required',\n kind: DoctorPlannedChangeKind,\n): Promise<void> {\n const absolutePath = path.join(rootPath, relativePath);\n if (await pathExists(absolutePath)) {\n return;\n }\n\n diagnostics.push(\n createDiagnostic({\n code: 'missing-path',\n message: `Missing expected repo artifact: ${relativePath}`,\n path: absolutePath,\n profile: 'public-package',\n ...repositoryRuleFields(ruleId),\n }),\n );\n plannedChanges.push(\n createPlannedChange({\n description: `Create missing ${relativePath}.`,\n filePath: absolutePath,\n kind,\n ruleId,\n }),\n );\n}\n\nfunction requireNonEmptyStringField(request: {\n readonly diagnostics: DoctorDiagnostic[];\n readonly fieldName: string;\n readonly packageJson: Record<string, unknown>;\n readonly packageJsonPath: string;\n readonly profile: DoctorPolicyProfile;\n readonly ruleId: DoctorRuleId;\n}): void {\n if (isNonEmptyString(request.packageJson[request.fieldName])) {\n return;\n }\n\n request.diagnostics.push(\n createDiagnostic({\n code: 'field-missing',\n message: `package.json must define a non-empty \"${request.fieldName}\" field.`,\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(request.ruleId),\n }),\n );\n}\n\nfunction requireRecordField(request: {\n readonly diagnostics: DoctorDiagnostic[];\n readonly fieldName: string;\n readonly packageJson: Record<string, unknown>;\n readonly packageJsonPath: string;\n readonly profile: DoctorPolicyProfile;\n readonly ruleId: DoctorRuleId;\n}): void {\n if (isRecord(request.packageJson[request.fieldName])) {\n return;\n }\n\n request.diagnostics.push(\n createDiagnostic({\n code: 'field-missing',\n message: `package.json must define an object \"${request.fieldName}\" field.`,\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(request.ruleId),\n }),\n );\n}\n\nfunction requireStringArrayField(request: {\n readonly diagnostics: DoctorDiagnostic[];\n readonly fieldName: string;\n readonly packageJson: Record<string, unknown>;\n readonly packageJsonPath: string;\n readonly profile: DoctorPolicyProfile;\n readonly ruleId: DoctorRuleId;\n}): void {\n if (readStringArray(request.packageJson[request.fieldName]).length > 0) {\n return;\n }\n\n request.diagnostics.push(\n createDiagnostic({\n code: 'field-missing',\n message: `package.json must define a non-empty string array \"${request.fieldName}\" field.`,\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(request.ruleId),\n }),\n );\n}\n\nasync function expectsParadox(\n targetPath: string,\n packageJson: Record<string, unknown>,\n): Promise<boolean> {\n const scripts = isRecord(packageJson.scripts) ? packageJson.scripts : null;\n const docsScript = scripts?.docs;\n if (\n isNonEmptyString(docsScript) &&\n (docsScript.includes('paradox') || docsScript.includes('@ankhorage/paradox'))\n ) {\n return true;\n }\n\n return (\n (await pathExists(path.join(targetPath, 'paradox.config.ts'))) ||\n (await pathExists(path.join(targetPath, 'src', 'readme-usage.ts')))\n );\n}\n\nfunction expectsDevtools(packageJson: Record<string, unknown>): boolean {\n const scripts = isRecord(packageJson.scripts) ? packageJson.scripts : null;\n if (scripts === null) {\n return false;\n }\n\n return Object.values(scripts).some(\n (scriptValue) =>\n isNonEmptyString(scriptValue) &&\n (scriptValue.includes('ankhorage-eslint') ||\n scriptValue.includes('ankhorage-prettier') ||\n scriptValue.includes('ankhorage-knip')),\n );\n}\n\nfunction hasDependency(\n dependencyMap: Record<string, unknown> | null,\n dependencyName: string,\n): boolean {\n return dependencyMap !== null && isNonEmptyString(dependencyMap[dependencyName]);\n}\n\nfunction validateAnkhMetadataShape(value: unknown, providerPackage: boolean): string | null {\n if (!isRecord(value)) {\n return 'package.json \"ankh\" metadata must be an object when present.';\n }\n\n if (!isNonEmptyString(value.category)) {\n return 'package.json \"ankh.category\" must be a non-empty string.';\n }\n\n if (\n providerPackage &&\n !(isNonEmptyString(value.provider) && isPackageRelativeProviderPath(value.provider))\n ) {\n return 'Provider package metadata must define a package-relative \"./...\" provider path.';\n }\n\n if (\n !providerPackage &&\n value.provider !== undefined &&\n !(value.provider === null || isPackageRelativeProviderPath(value.provider))\n ) {\n return 'Non-provider package metadata, when present, must use null or a package-relative \"./...\" provider value.';\n }\n\n if (\n !Array.isArray(value.capabilities) ||\n value.capabilities.some((capability) => !isCapability(capability))\n ) {\n return 'package.json \"ankh.capabilities\" must be an array of canonical Capability descriptors.';\n }\n\n return null;\n}\n\nfunction createEarlyResult(targetPath: string, diagnostic: DoctorDiagnostic): DoctorAnalysisResult {\n return {\n appliedChecks: [],\n diagnostics: [diagnostic],\n fixPlan: null,\n hasPackageJson: false,\n plannedChanges: [],\n profile: 'unknown',\n repoMarkers: [],\n targetPath,\n };\n}\n\n/*** Return canonical rule id and severity from the repository Rules provider. */\nfunction repositoryRuleFields(ruleId: DoctorRuleId): Pick<DoctorDiagnostic, 'ruleId' | 'severity'> {\n const rule = getRepositoryRule(ruleId);\n return { ruleId: rule.id, severity: rule.severity };\n}\n\nfunction createDiagnostic(diagnostic: DoctorDiagnostic): DoctorDiagnostic {\n return diagnostic;\n}\n\nfunction createPlannedChange(change: Omit<DoctorPlannedChange, 'safe'>): DoctorPlannedChange {\n return {\n ...change,\n safe: true,\n };\n}\n\nfunction createInvalidPackageJsonMessage(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n return `package.json contains invalid JSON: ${message}`;\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n return (await statOrNull(targetPath)) !== null;\n}\n\nasync function statOrNull(targetPath: string) {\n try {\n return await fs.stat(targetPath);\n } catch (error) {\n if (isMissingPathError(error)) {\n return null;\n }\n\n throw error;\n }\n}\n\nfunction isMissingPathError(error: unknown): error is NodeJS.ErrnoException {\n return (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n error.code === 'ENOENT'\n );\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim() !== '';\n}\n\nfunction isPackageRelativeProviderPath(value: unknown): value is string {\n return isNonEmptyString(value) && value.startsWith('./');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isStringTuple(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.length > 0 && value.every(isNonEmptyString);\n}\n\nfunction readStringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.filter(isNonEmptyString) : [];\n}\n\n/*** Read and normalize canonical Capability descriptors from untrusted metadata. */\nfunction readCapabilities(value: unknown): Capability[] {\n return Array.isArray(value) ? value.filter(isCapability).map(normalizeCapability) : [];\n}\n\n/*** Compare capability collections by canonical id and descriptor semantics. */\nfunction sameCapabilitySet(left: readonly Capability[], right: readonly Capability[]): boolean {\n const leftById = new Map(left.map((capability) => [capability.id, capability]));\n const rightById = new Map(right.map((capability) => [capability.id, capability]));\n return (\n leftById.size === left.length &&\n rightById.size === right.length &&\n leftById.size === rightById.size &&\n [...leftById].every(([id, capability]) => {\n const other = rightById.get(id);\n return other !== undefined && areCapabilitiesEqual(capability, other);\n })\n );\n}\n\n/*** Determine whether every normalized catalog descriptor has a distinct stable identifier. */\nfunction hasUniqueCapabilityIds(capabilities: readonly Capability[]): boolean {\n return new Set(capabilities.map((capability) => capability.id)).size === capabilities.length;\n}\n\nfunction sameStringSet(left: readonly string[], right: readonly string[]): boolean {\n const leftSet = uniqueSortedStrings(left);\n const rightSet = uniqueSortedStrings(right);\n return (\n leftSet.length === rightSet.length && leftSet.every((value, index) => value === rightSet[index])\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../src/analysis.ts"],"names":[],"mappings":"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","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport {\n areCapabilityCatalogsEqual,\n isCapability,\n isCapabilityCatalog,\n normalizeCapability,\n} from '@ankhorage/capability';\nimport type { Capability } from '@ankhorage/contracts/capability';\nimport { REPOSITORY_RULE_METADATA } from '@ankhorage/rules-repository';\nimport { uniqueSortedStrings } from '@ankhorage/utility/array';\n\nimport { readCapabilityCatalogAsync } from './capabilityCatalog.js';\nimport type { DoctorDiagnostic, DoctorPolicyProfile, DoctorRuleId } from './diagnostics.js';\nimport type { DoctorReadiness } from './readiness.js';\nimport { getRepositoryRule } from './utils/getRepositoryRule.js';\n\nexport type DoctorTargetCheck = 'manifest' | 'package' | 'repo';\nexport type DoctorTargetMode = 'fix' | 'package' | 'repo' | 'validate';\nexport type DoctorPlannedChangeKind =\n 'create-directory' | 'create-file' | 'update-json' | 'update-text';\n\nexport interface DoctorAnalysisRequest {\n readonly cwd: string;\n readonly inputPath?: string;\n readonly mode: DoctorTargetMode;\n}\n\nexport interface DoctorPlannedChange {\n readonly description: string;\n readonly filePath: string;\n readonly kind: DoctorPlannedChangeKind;\n readonly ruleId: DoctorRuleId;\n readonly safe: boolean;\n}\n\nexport interface DoctorFixPlan {\n readonly changes: readonly DoctorPlannedChange[];\n readonly diagnostics: readonly DoctorDiagnostic[];\n readonly profile: DoctorPolicyProfile;\n readonly targetPath: string;\n}\n\nexport interface DoctorAnalysisResult {\n readonly appliedChecks: readonly DoctorTargetCheck[];\n readonly diagnostics: readonly DoctorDiagnostic[];\n readonly fixPlan: DoctorFixPlan | null;\n readonly hasPackageJson: boolean;\n readonly plannedChanges: readonly DoctorPlannedChange[];\n readonly profile: DoctorPolicyProfile;\n readonly readiness?: readonly DoctorReadiness[];\n readonly repoMarkers: readonly string[];\n readonly targetPath: string;\n}\n\ninterface ProviderInspectionResult {\n readonly capabilities: readonly Capability[];\n readonly commandCapabilities: readonly string[];\n readonly commandPaths: readonly string[];\n readonly handlerPaths: readonly string[];\n readonly sourcePath: string;\n}\n\nconst REPO_MARKERS = [\n { label: '.git', relativePath: '.git' },\n { label: '.github/workflows', relativePath: path.join('.github', 'workflows') },\n { label: '.changeset', relativePath: '.changeset' },\n { label: 'package.json', relativePath: 'package.json' },\n { label: 'pnpm-workspace.yaml', relativePath: 'pnpm-workspace.yaml' },\n { label: 'bun.lock', relativePath: 'bun.lock' },\n { label: 'bun.lockb', relativePath: 'bun.lockb' },\n { label: 'package-lock.json', relativePath: 'package-lock.json' },\n { label: 'yarn.lock', relativePath: 'yarn.lock' },\n] as const;\n\nconst PUBLIC_PACKAGE_POLICY = REPOSITORY_RULE_METADATA.publicPackage;\n\nconst PROVIDER_SOURCE_CANDIDATES = [\n path.join('src', 'ankh.provider.ts'),\n path.join('src', 'ankh.provider.tsx'),\n path.join('src', 'ankh.provider.js'),\n path.join('src', 'ankh.provider.mjs'),\n] as const;\n\nexport async function analyzeDoctorTarget(\n request: DoctorAnalysisRequest,\n): Promise<DoctorAnalysisResult> {\n const targetPath = path.resolve(request.cwd, request.inputPath ?? '.');\n const stats = await statOrNull(targetPath);\n\n if (stats === null) {\n return createEarlyResult(\n targetPath,\n createDiagnostic({\n code: 'target-not-found',\n message: `Target path does not exist: ${targetPath}`,\n path: targetPath,\n profile: 'unknown',\n ruleId: 'target.path.exists',\n severity: 'error',\n }),\n );\n }\n\n if (!stats.isDirectory()) {\n return createEarlyResult(\n targetPath,\n createDiagnostic({\n code: 'target-not-directory',\n message: `Target path must be a directory: ${targetPath}`,\n path: targetPath,\n profile: 'unknown',\n ruleId: 'target.path.directory',\n severity: 'error',\n }),\n );\n }\n\n const repoMarkers = await findRepoMarkers(targetPath);\n const packageJsonPath = path.join(targetPath, 'package.json');\n const hasPackageJson = repoMarkers.includes('package.json');\n const appliedChecks: DoctorTargetCheck[] = [];\n const diagnostics: DoctorDiagnostic[] = [];\n const plannedChanges: DoctorPlannedChange[] = [];\n\n const packageJson = hasPackageJson ? await readPackageJson(packageJsonPath) : null;\n if (packageJson !== null && packageJson.diagnostic !== null) {\n diagnostics.push(packageJson.diagnostic);\n }\n\n const profile = detectProfile(repoMarkers, packageJson?.parsed ?? null);\n\n const shouldRunRepoChecks =\n request.mode === 'repo' ||\n ((request.mode === 'validate' || request.mode === 'fix') && repoMarkers.length > 0);\n const shouldRunPackageChecks =\n request.mode === 'package' ||\n ((request.mode === 'validate' || request.mode === 'fix') && hasPackageJson);\n\n if (request.mode === 'repo' && repoMarkers.length === 0) {\n diagnostics.push(\n createDiagnostic({\n code: 'unsupported-target',\n message:\n 'Target is not a repo/workspace-root candidate because no repo markers were found.',\n path: targetPath,\n profile,\n ruleId: 'target.repo-markers.required',\n severity: 'error',\n }),\n );\n }\n\n if (request.mode === 'package' && !hasPackageJson) {\n diagnostics.push(\n createDiagnostic({\n code: 'unsupported-target',\n message: 'Target does not contain a readable package.json file.',\n path: packageJsonPath,\n profile,\n ruleId: 'target.package-json.required',\n severity: 'error',\n }),\n );\n }\n\n if (\n (request.mode === 'validate' || request.mode === 'fix') &&\n repoMarkers.length === 0 &&\n !hasPackageJson\n ) {\n diagnostics.push(\n createDiagnostic({\n code: 'unsupported-target',\n message: 'Target is neither a repo/workspace-root candidate nor a package root.',\n path: targetPath,\n profile,\n ruleId: 'target.profile.supported',\n severity: 'error',\n }),\n );\n }\n\n if (shouldRunRepoChecks && repoMarkers.length > 0) {\n appliedChecks.push('repo');\n diagnostics.push(\n ...(await analyzeRepoPolicy({\n packageJson: packageJson?.parsed ?? null,\n plannedChanges,\n profile,\n repoMarkers,\n targetPath,\n })),\n );\n }\n\n if (shouldRunPackageChecks && hasPackageJson) {\n appliedChecks.push('package');\n diagnostics.push(\n ...(await analyzePackagePolicy({\n packageJson: packageJson?.parsed ?? null,\n packageJsonPath,\n plannedChanges,\n profile,\n targetPath,\n })),\n );\n }\n\n const fixPlan =\n request.mode === 'fix'\n ? {\n changes: plannedChanges,\n diagnostics,\n profile,\n targetPath,\n }\n : null;\n\n return {\n appliedChecks,\n diagnostics,\n fixPlan,\n hasPackageJson,\n plannedChanges,\n profile,\n repoMarkers,\n targetPath,\n };\n}\n\nasync function analyzeRepoPolicy(request: {\n readonly packageJson: Record<string, unknown> | null;\n readonly plannedChanges: DoctorPlannedChange[];\n readonly profile: DoctorPolicyProfile;\n readonly repoMarkers: readonly string[];\n readonly targetPath: string;\n}): Promise<DoctorDiagnostic[]> {\n const diagnostics: DoctorDiagnostic[] = [];\n\n if (request.profile === 'public-package') {\n for (const artifact of PUBLIC_PACKAGE_POLICY.requiredRepoPaths) {\n await maybeRequirePath(\n diagnostics,\n request.plannedChanges,\n request.targetPath,\n artifact.path,\n artifact.ruleId,\n artifact.kind === 'file' ? 'create-file' : 'create-directory',\n );\n }\n }\n\n if (request.profile === 'integration-monorepo') {\n if (!request.repoMarkers.includes('package.json')) {\n diagnostics.push(\n createDiagnostic({\n code: 'missing-path',\n message: 'The integration monorepo root must include a package.json file.',\n path: path.join(request.targetPath, 'package.json'),\n profile: request.profile,\n ruleId: 'target.package-json.required',\n severity: 'error',\n }),\n );\n }\n\n if (request.packageJson !== null) {\n if (request.packageJson.ankh !== undefined) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message:\n 'The integration monorepo root must not publish top-level package.json.ankh metadata.',\n path: path.join(request.targetPath, 'package.json'),\n profile: request.profile,\n ruleId: 'integration.package.ankh.disallowed',\n severity: 'error',\n }),\n );\n }\n\n if (request.packageJson.private !== true) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: 'The integration monorepo root must remain private.',\n path: path.join(request.targetPath, 'package.json'),\n profile: request.profile,\n ruleId: 'integration.package.private.required',\n severity: 'error',\n }),\n );\n }\n\n if (!Array.isArray(request.packageJson.workspaces)) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-missing',\n message: 'The integration monorepo root must declare workspaces.',\n path: path.join(request.targetPath, 'package.json'),\n profile: request.profile,\n ruleId: 'integration.package.workspaces.required',\n severity: 'error',\n }),\n );\n }\n }\n }\n\n return diagnostics;\n}\n\nasync function analyzePackagePolicy(request: {\n readonly packageJson: Record<string, unknown> | null;\n readonly packageJsonPath: string;\n readonly plannedChanges: DoctorPlannedChange[];\n readonly profile: DoctorPolicyProfile;\n readonly targetPath: string;\n}): Promise<DoctorDiagnostic[]> {\n if (request.packageJson === null) {\n return [];\n }\n\n const diagnostics: DoctorDiagnostic[] = [];\n const { packageJson } = request;\n\n if (request.profile === 'public-package') {\n requirePublicPackageFields({\n diagnostics,\n packageJson,\n packageJsonPath: request.packageJsonPath,\n profile: request.profile,\n });\n }\n\n if (request.profile !== 'public-package') {\n return diagnostics.concat(\n await validateAnkhMetadataAndProvider({\n diagnostics,\n packageJson,\n packageJsonPath: request.packageJsonPath,\n plannedChanges: request.plannedChanges,\n profile: request.profile,\n targetPath: request.targetPath,\n }),\n );\n }\n\n if (packageJson.private === true) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: 'Public package profiles must not set private: true.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.privateDisallowedRuleId),\n }),\n );\n }\n\n if (\n packageJson.type !== undefined &&\n packageJson.type !== PUBLIC_PACKAGE_POLICY.packageType.value\n ) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: `package.json \"type\" must be \"${PUBLIC_PACKAGE_POLICY.packageType.value}\".`,\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.packageType.ruleId),\n }),\n );\n }\n\n const { publishConfig } = packageJson;\n if (\n isRecord(publishConfig) &&\n publishConfig.access !== PUBLIC_PACKAGE_POLICY.publishAccess.value\n ) {\n diagnostics.push(\n createDiagnostic({\n code: isNonEmptyString(publishConfig.access) ? 'field-invalid' : 'field-missing',\n message: `package.json publishConfig.access must exist and equal \"${PUBLIC_PACKAGE_POLICY.publishAccess.value}\".`,\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.publishAccess.ruleId),\n }),\n );\n }\n\n if (!isNonEmptyString(packageJson.packageManager)) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-missing',\n message: 'package.json must define a Bun-aligned packageManager field.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.packageManager.requiredRuleId),\n }),\n );\n request.plannedChanges.push(\n createPlannedChange({\n description: `Add packageManager: \"bun@${Bun.version}\" to package.json.`,\n filePath: request.packageJsonPath,\n kind: 'update-json',\n ruleId: PUBLIC_PACKAGE_POLICY.packageManager.requiredRuleId,\n }),\n );\n } else if (!packageJson.packageManager.startsWith('bun@')) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: 'package.json packageManager must be Bun-aligned, for example \"bun@1.x\".',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.packageManager.bunRuleId),\n }),\n );\n }\n\n const scripts = isRecord(packageJson.scripts) ? packageJson.scripts : null;\n for (const requirement of PUBLIC_PACKAGE_POLICY.requiredScripts) {\n if (scripts === null || !isNonEmptyString(scripts[requirement.name])) {\n diagnostics.push(\n createDiagnostic({\n code: 'missing-script',\n message: `Missing required package script: ${requirement.name}`,\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(requirement.ruleId),\n }),\n );\n }\n }\n\n const devDependencies = isRecord(packageJson.devDependencies)\n ? packageJson.devDependencies\n : null;\n const dependencies = isRecord(packageJson.dependencies) ? packageJson.dependencies : null;\n if (!hasDependency(dependencies, 'typescript') && !hasDependency(devDependencies, 'typescript')) {\n diagnostics.push(\n createDiagnostic({\n code: 'missing-dependency',\n message: 'Public package repos must declare TypeScript in dependencies or devDependencies.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.dependencyRules.typescript),\n }),\n );\n }\n\n const changesetsDependencyDiagnostic = createChangesetsDependencyDiagnostic({\n dependencies,\n devDependencies,\n packageJson,\n packageJsonPath: request.packageJsonPath,\n profile: request.profile,\n });\n if (changesetsDependencyDiagnostic !== null) {\n diagnostics.push(changesetsDependencyDiagnostic);\n }\n\n if (!hasDependency(devDependencies, '@types/bun')) {\n diagnostics.push(\n createDiagnostic({\n code: 'missing-dependency',\n message: 'Public package repos must declare @types/bun in devDependencies.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.dependencyRules.bunTypes),\n }),\n );\n }\n\n if (!hasDependency(devDependencies, '@types/node')) {\n diagnostics.push(\n createDiagnostic({\n code: 'missing-dependency',\n message: 'Public package repos must declare @types/node in devDependencies.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.dependencyRules.nodeTypes),\n }),\n );\n }\n\n if (expectsDevtools(packageJson) && !hasDependency(devDependencies, '@ankhorage/devtools')) {\n diagnostics.push(\n createDiagnostic({\n code: 'missing-dependency',\n message:\n 'This package consumes shared Ankhorage lint/format/knip tooling and must declare @ankhorage/devtools.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.dependencyRules.devtools),\n }),\n );\n }\n\n if (\n packageJson.name !== '@ankhorage/paradox' &&\n (await expectsParadox(request.targetPath, packageJson)) &&\n !hasDependency(devDependencies, '@ankhorage/paradox')\n ) {\n diagnostics.push(\n createDiagnostic({\n code: 'missing-dependency',\n message: 'This package owns Paradox docs generation and must declare @ankhorage/paradox.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.dependencyRules.paradox),\n }),\n );\n }\n\n return diagnostics.concat(\n await validateAnkhMetadataAndProvider({\n diagnostics,\n packageJson,\n packageJsonPath: request.packageJsonPath,\n plannedChanges: request.plannedChanges,\n profile: request.profile,\n targetPath: request.targetPath,\n }),\n );\n}\n\nfunction createChangesetsDependencyDiagnostic(request: {\n readonly dependencies: Record<string, unknown> | null;\n readonly devDependencies: Record<string, unknown> | null;\n readonly packageJson: Record<string, unknown>;\n readonly packageJsonPath: string;\n readonly profile: DoctorPolicyProfile;\n}): DoctorDiagnostic | null {\n const dependencyDeclared = hasDependency(request.dependencies, '@changesets/cli');\n const devDependencyDeclared = hasDependency(request.devDependencies, '@changesets/cli');\n const isDevtoolsOwner = request.packageJson.name === '@ankhorage/devtools';\n const placementIsCurrent = isDevtoolsOwner\n ? dependencyDeclared && !devDependencyDeclared\n : !dependencyDeclared && !devDependencyDeclared;\n\n if (placementIsCurrent) {\n return null;\n }\n\n return createDiagnostic({\n code: isDevtoolsOwner ? 'missing-dependency' : 'field-invalid',\n message: isDevtoolsOwner\n ? '@ankhorage/devtools must publish @changesets/cli in dependencies, not devDependencies.'\n : 'Public package repos must not declare @changesets/cli directly; @ankhorage/devtools owns Changesets execution.',\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(PUBLIC_PACKAGE_POLICY.dependencyRules.changesets),\n });\n}\n\nasync function validateAnkhMetadataAndProvider(request: {\n readonly diagnostics: readonly DoctorDiagnostic[];\n readonly packageJson: Record<string, unknown>;\n readonly packageJsonPath: string;\n readonly plannedChanges: DoctorPlannedChange[];\n readonly profile: DoctorPolicyProfile;\n readonly targetPath: string;\n}): Promise<DoctorDiagnostic[]> {\n const diagnostics: DoctorDiagnostic[] = [];\n const metadata = request.packageJson.ankh;\n const catalog = await readCapabilityCatalogAsync(request.targetPath, request.packageJson.exports);\n const providerPackage =\n (isRecord(metadata) && isNonEmptyString(metadata.provider)) ||\n (await isProviderPackage(request.targetPath));\n\n if (providerPackage && metadata === undefined) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-missing',\n message: 'Provider packages must define package.json.ankh metadata.',\n path: request.packageJsonPath,\n profile: request.profile,\n ruleId: 'package.ankh.required-for-provider',\n severity: 'error',\n }),\n );\n request.plannedChanges.push(\n createPlannedChange({\n description:\n 'Add a package.json.ankh block describing the implemented provider category, provider path, and capabilities.',\n filePath: request.packageJsonPath,\n kind: 'update-json',\n ruleId: 'package.ankh.required-for-provider',\n }),\n );\n return diagnostics;\n }\n\n if (metadata === undefined) {\n if (catalog.path !== null) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-missing',\n message: 'A public capability catalog requires package.json.ankh discovery metadata.',\n path: request.packageJsonPath,\n profile: request.profile,\n ruleId: 'package.ankh.required-for-capability-catalog',\n severity: 'error',\n }),\n );\n }\n return diagnostics;\n }\n\n const metadataValidation = validateAnkhMetadataShape(\n metadata,\n providerPackage,\n catalog.path !== null,\n );\n if (metadataValidation !== null) {\n diagnostics.push(\n createDiagnostic({\n code: 'invalid-ankh-metadata',\n message: metadataValidation,\n path: request.packageJsonPath,\n profile: request.profile,\n ruleId: 'package.ankh.present.valid-shape',\n severity: 'error',\n }),\n );\n return diagnostics;\n }\n\n if (!isRecord(metadata)) {\n return diagnostics;\n }\n\n const metadataCapabilities = readCapabilities(metadata.capabilities);\n const metadataIdsAreUnique = isCapabilityCatalog(metadataCapabilities);\n if (!metadataIdsAreUnique) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: 'package.json.ankh capabilities must not contain duplicate capability ids.',\n path: request.packageJsonPath,\n profile: request.profile,\n ruleId: 'package.ankh.capabilities.unique',\n severity: 'error',\n }),\n );\n }\n\n if (catalog.path !== null && catalog.capabilities === null) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: `The public capability catalog is invalid: ${catalog.reason}`,\n path: catalog.path,\n profile: request.profile,\n ruleId: 'package.ankh.capabilities.catalog.valid',\n severity: 'error',\n }),\n );\n } else if (\n catalog.capabilities !== null &&\n metadataIdsAreUnique &&\n !areCapabilityCatalogsEqual(metadataCapabilities, catalog.capabilities)\n ) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message:\n 'package.json.ankh capabilities must match the canonical public CAPABILITIES catalog exactly.',\n path: request.packageJsonPath,\n profile: request.profile,\n ruleId: 'package.ankh.capabilities.match-catalog',\n severity: 'error',\n }),\n );\n }\n\n if (!providerPackage) {\n return diagnostics;\n }\n\n if (!isRecord(metadata) || !isNonEmptyString(metadata.provider)) {\n diagnostics.push(\n createDiagnostic({\n code: 'invalid-ankh-metadata',\n message: 'Provider package metadata must define a package-relative provider path.',\n path: request.packageJsonPath,\n profile: request.profile,\n ruleId: 'package.ankh.provider-path.required',\n severity: 'error',\n }),\n );\n return diagnostics;\n }\n\n const inspection = await inspectProviderSource({\n metadataProviderPath: metadata.provider,\n packageRoot: request.targetPath,\n profile: request.profile,\n });\n\n if (inspection.diagnostic !== null) {\n diagnostics.push(inspection.diagnostic);\n return diagnostics;\n }\n\n if (inspection.result === null) {\n return diagnostics;\n }\n\n const providerCapabilities = inspection.result.capabilities;\n const commandCapabilities = uniqueSortedStrings(inspection.result.commandCapabilities);\n\n if (!areCapabilityCatalogsEqual(metadataCapabilities, providerCapabilities)) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message:\n 'package.json.ankh capabilities must match the implemented provider capability descriptors exactly.',\n path: request.packageJsonPath,\n profile: request.profile,\n ruleId: 'package.ankh.capabilities.match-provider',\n severity: 'error',\n }),\n );\n }\n\n if (\n !commandCapabilities.every((commandCapability) =>\n providerCapabilities.some((capability) => capability.id === commandCapability),\n )\n ) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: 'Every provider command must reference a capability published by the provider.',\n path: inspection.result.sourcePath,\n profile: request.profile,\n ruleId: 'provider.commands.match-capabilities',\n severity: 'error',\n }),\n );\n }\n\n if (!sameStringSet(inspection.result.commandPaths, inspection.result.handlerPaths)) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: 'Every provider command descriptor must have a matching handler path.',\n path: inspection.result.sourcePath,\n profile: request.profile,\n ruleId: 'provider.commands.match-handlers',\n severity: 'error',\n }),\n );\n }\n\n return diagnostics;\n}\n\nasync function inspectProviderSource(request: {\n readonly metadataProviderPath: string;\n readonly packageRoot: string;\n readonly profile: DoctorPolicyProfile;\n}): Promise<{\n readonly diagnostic: DoctorDiagnostic | null;\n readonly result: ProviderInspectionResult | null;\n}> {\n const sourcePath = await resolveProviderSourcePath(\n request.packageRoot,\n request.metadataProviderPath,\n );\n if (sourcePath === null) {\n return {\n diagnostic: createDiagnostic({\n code: 'provider-source-missing',\n message:\n 'Provider package metadata is present, but no provider source file could be resolved for inspection.',\n path: request.packageRoot,\n profile: request.profile,\n ruleId: 'provider.source.required',\n severity: 'error',\n }),\n result: null,\n };\n }\n\n try {\n const importedModule: unknown = await import(pathToFileURL(sourcePath).href);\n const provider = isRecord(importedModule) ? importedModule.default : undefined;\n if (!isRecord(provider)) {\n return {\n diagnostic: createDiagnostic({\n code: 'provider-source-import-failed',\n message: 'Provider source default export must be an object.',\n path: sourcePath,\n profile: request.profile,\n ruleId: 'provider.source.importable',\n severity: 'error',\n }),\n result: null,\n };\n }\n\n const capabilities = readCapabilities(provider.capabilities);\n const commands = Array.isArray(provider.commands) ? provider.commands : [];\n const handlers = Array.isArray(provider.handlers) ? provider.handlers : [];\n\n const commandCapabilities = commands.flatMap((command) =>\n isRecord(command) && isNonEmptyString(command.capability) ? [command.capability] : [],\n );\n const commandPaths = commands.flatMap((command) => {\n const pathValue = isRecord(command) ? command.path : undefined;\n return isStringTuple(pathValue) ? [pathValue.join(' ')] : [];\n });\n const handlerPaths = handlers.flatMap((handler) => {\n const pathValue = isRecord(handler) ? handler.path : undefined;\n const handlerFunction = isRecord(handler) ? handler.handler : undefined;\n return isStringTuple(pathValue) && typeof handlerFunction === 'function'\n ? [pathValue.join(' ')]\n : [];\n });\n\n return {\n diagnostic: null,\n result: {\n capabilities,\n commandCapabilities,\n commandPaths,\n handlerPaths,\n sourcePath,\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n diagnostic: createDiagnostic({\n code: 'provider-source-import-failed',\n message: `Failed to import provider source: ${message}`,\n path: sourcePath,\n profile: request.profile,\n ruleId: 'provider.source.importable',\n severity: 'error',\n }),\n result: null,\n };\n }\n}\n\nasync function resolveProviderSourcePath(\n packageRoot: string,\n metadataProviderPath: string,\n): Promise<string | null> {\n const candidates = new Set<string>();\n candidates.add(path.resolve(packageRoot, metadataProviderPath));\n\n if (metadataProviderPath.startsWith('./dist/') && metadataProviderPath.endsWith('.js')) {\n const relativeStem = metadataProviderPath.slice('./dist/'.length, -'.js'.length);\n candidates.add(path.resolve(packageRoot, 'src', `${relativeStem}.ts`));\n candidates.add(path.resolve(packageRoot, 'src', `${relativeStem}.tsx`));\n candidates.add(path.resolve(packageRoot, 'src', `${relativeStem}.js`));\n candidates.add(path.resolve(packageRoot, 'src', `${relativeStem}.mjs`));\n }\n\n for (const providerSourceCandidate of PROVIDER_SOURCE_CANDIDATES) {\n candidates.add(path.resolve(packageRoot, providerSourceCandidate));\n }\n\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nasync function findRepoMarkers(targetPath: string): Promise<readonly string[]> {\n return (\n await Promise.all(\n REPO_MARKERS.map(async (marker) =>\n (await pathExists(path.join(targetPath, marker.relativePath))) ? marker.label : null,\n ),\n )\n ).filter((marker): marker is (typeof REPO_MARKERS)[number]['label'] => marker !== null);\n}\n\nasync function readPackageJson(packageJsonPath: string): Promise<{\n readonly diagnostic: DoctorDiagnostic | null;\n readonly parsed: Record<string, unknown> | null;\n}> {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(await fs.readFile(packageJsonPath, 'utf8')) as unknown;\n } catch (error) {\n return {\n diagnostic: createDiagnostic({\n code: 'invalid-package-json',\n message: createInvalidPackageJsonMessage(error),\n path: packageJsonPath,\n profile: 'unknown',\n ruleId: 'target.package-json.required',\n severity: 'error',\n }),\n parsed: null,\n };\n }\n\n if (!isRecord(parsed)) {\n return {\n diagnostic: createDiagnostic({\n code: 'invalid-package-json',\n message: 'package.json must contain a JSON object.',\n path: packageJsonPath,\n profile: 'unknown',\n ruleId: 'target.package-json.required',\n severity: 'error',\n }),\n parsed: null,\n };\n }\n\n return {\n diagnostic: null,\n parsed,\n };\n}\n\nfunction detectProfile(\n repoMarkers: readonly string[],\n packageJson: Record<string, unknown> | null,\n): DoctorPolicyProfile {\n if (packageJson !== null) {\n if (packageJson.name === 'ankhorage4') {\n return 'integration-monorepo';\n }\n\n if (isNonEmptyString(packageJson.name) && packageJson.name.startsWith('@ankhorage/')) {\n return packageJson.private === true ? 'unknown' : 'public-package';\n }\n }\n\n if (repoMarkers.length > 0) {\n return 'unknown';\n }\n\n return 'unknown';\n}\n\nasync function isProviderPackage(targetPath: string): Promise<boolean> {\n for (const candidate of PROVIDER_SOURCE_CANDIDATES) {\n if (await pathExists(path.join(targetPath, candidate))) {\n return true;\n }\n }\n\n return false;\n}\n\n/*** Validate every generic public-package metadata field from canonical Policy. */\nfunction requirePublicPackageFields(request: {\n readonly diagnostics: DoctorDiagnostic[];\n readonly packageJson: Record<string, unknown>;\n readonly packageJsonPath: string;\n readonly profile: DoctorPolicyProfile;\n}): void {\n for (const requirement of PUBLIC_PACKAGE_POLICY.requiredFields) {\n const input = {\n diagnostics: request.diagnostics,\n fieldName: requirement.name,\n packageJson: request.packageJson,\n packageJsonPath: request.packageJsonPath,\n profile: request.profile,\n ruleId: requirement.ruleId,\n };\n\n switch (requirement.kind) {\n case 'non-empty-string':\n requireNonEmptyStringField(input);\n break;\n case 'record':\n requireRecordField(input);\n break;\n case 'string-array':\n requireStringArrayField(input);\n break;\n }\n }\n}\n\nasync function maybeRequirePath(\n diagnostics: DoctorDiagnostic[],\n plannedChanges: DoctorPlannedChange[],\n rootPath: string,\n relativePath: string,\n ruleId:\n | 'repo.changelog.required'\n | 'repo.changeset.required'\n | 'repo.license.required'\n | 'repo.readme.required'\n | 'repo.workflows.required',\n kind: DoctorPlannedChangeKind,\n): Promise<void> {\n const absolutePath = path.join(rootPath, relativePath);\n if (await pathExists(absolutePath)) {\n return;\n }\n\n diagnostics.push(\n createDiagnostic({\n code: 'missing-path',\n message: `Missing expected repo artifact: ${relativePath}`,\n path: absolutePath,\n profile: 'public-package',\n ...repositoryRuleFields(ruleId),\n }),\n );\n plannedChanges.push(\n createPlannedChange({\n description: `Create missing ${relativePath}.`,\n filePath: absolutePath,\n kind,\n ruleId,\n }),\n );\n}\n\nfunction requireNonEmptyStringField(request: {\n readonly diagnostics: DoctorDiagnostic[];\n readonly fieldName: string;\n readonly packageJson: Record<string, unknown>;\n readonly packageJsonPath: string;\n readonly profile: DoctorPolicyProfile;\n readonly ruleId: DoctorRuleId;\n}): void {\n if (isNonEmptyString(request.packageJson[request.fieldName])) {\n return;\n }\n\n request.diagnostics.push(\n createDiagnostic({\n code: 'field-missing',\n message: `package.json must define a non-empty \"${request.fieldName}\" field.`,\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(request.ruleId),\n }),\n );\n}\n\nfunction requireRecordField(request: {\n readonly diagnostics: DoctorDiagnostic[];\n readonly fieldName: string;\n readonly packageJson: Record<string, unknown>;\n readonly packageJsonPath: string;\n readonly profile: DoctorPolicyProfile;\n readonly ruleId: DoctorRuleId;\n}): void {\n if (isRecord(request.packageJson[request.fieldName])) {\n return;\n }\n\n request.diagnostics.push(\n createDiagnostic({\n code: 'field-missing',\n message: `package.json must define an object \"${request.fieldName}\" field.`,\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(request.ruleId),\n }),\n );\n}\n\nfunction requireStringArrayField(request: {\n readonly diagnostics: DoctorDiagnostic[];\n readonly fieldName: string;\n readonly packageJson: Record<string, unknown>;\n readonly packageJsonPath: string;\n readonly profile: DoctorPolicyProfile;\n readonly ruleId: DoctorRuleId;\n}): void {\n if (readStringArray(request.packageJson[request.fieldName]).length > 0) {\n return;\n }\n\n request.diagnostics.push(\n createDiagnostic({\n code: 'field-missing',\n message: `package.json must define a non-empty string array \"${request.fieldName}\" field.`,\n path: request.packageJsonPath,\n profile: request.profile,\n ...repositoryRuleFields(request.ruleId),\n }),\n );\n}\n\nasync function expectsParadox(\n targetPath: string,\n packageJson: Record<string, unknown>,\n): Promise<boolean> {\n const scripts = isRecord(packageJson.scripts) ? packageJson.scripts : null;\n const docsScript = scripts?.docs;\n if (\n isNonEmptyString(docsScript) &&\n (docsScript.includes('paradox') || docsScript.includes('@ankhorage/paradox'))\n ) {\n return true;\n }\n\n return (\n (await pathExists(path.join(targetPath, 'paradox.config.ts'))) ||\n (await pathExists(path.join(targetPath, 'src', 'readme-usage.ts')))\n );\n}\n\nfunction expectsDevtools(packageJson: Record<string, unknown>): boolean {\n const scripts = isRecord(packageJson.scripts) ? packageJson.scripts : null;\n if (scripts === null) {\n return false;\n }\n\n return Object.values(scripts).some(\n (scriptValue) =>\n isNonEmptyString(scriptValue) &&\n (scriptValue.includes('ankhorage-eslint') ||\n scriptValue.includes('ankhorage-prettier') ||\n scriptValue.includes('ankhorage-knip')),\n );\n}\n\nfunction hasDependency(\n dependencyMap: Record<string, unknown> | null,\n dependencyName: string,\n): boolean {\n return dependencyMap !== null && isNonEmptyString(dependencyMap[dependencyName]);\n}\n\nfunction validateAnkhMetadataShape(\n value: unknown,\n providerPackage: boolean,\n hasPublicCapabilityCatalog: boolean,\n): string | null {\n if (!isRecord(value)) {\n return 'package.json \"ankh\" metadata must be an object when present.';\n }\n\n if (!isNonEmptyString(value.category)) {\n return 'package.json \"ankh.category\" must be a non-empty string.';\n }\n\n if (\n providerPackage &&\n !(isNonEmptyString(value.provider) && isPackageRelativeProviderPath(value.provider))\n ) {\n return 'Provider package metadata must define a package-relative \"./...\" provider path.';\n }\n\n if (\n !providerPackage &&\n value.provider !== undefined &&\n !(value.provider === null || isPackageRelativeProviderPath(value.provider))\n ) {\n return 'Non-provider package metadata, when present, must use null or a package-relative \"./...\" provider value.';\n }\n\n if ((providerPackage || hasPublicCapabilityCatalog) && !Array.isArray(value.capabilities)) {\n return 'package.json \"ankh.capabilities\" must be an array of canonical Capability descriptors.';\n }\n\n if (\n value.capabilities !== undefined &&\n (!Array.isArray(value.capabilities) ||\n value.capabilities.some((capability) => !isCapability(capability)))\n ) {\n return 'package.json \"ankh.capabilities\" must be an array of canonical Capability descriptors.';\n }\n\n return null;\n}\n\nfunction createEarlyResult(targetPath: string, diagnostic: DoctorDiagnostic): DoctorAnalysisResult {\n return {\n appliedChecks: [],\n diagnostics: [diagnostic],\n fixPlan: null,\n hasPackageJson: false,\n plannedChanges: [],\n profile: 'unknown',\n repoMarkers: [],\n targetPath,\n };\n}\n\n/*** Return canonical rule id and severity from the repository Rules provider. */\nfunction repositoryRuleFields(ruleId: DoctorRuleId): Pick<DoctorDiagnostic, 'ruleId' | 'severity'> {\n const rule = getRepositoryRule(ruleId);\n return { ruleId: rule.id, severity: rule.severity };\n}\n\nfunction createDiagnostic(diagnostic: DoctorDiagnostic): DoctorDiagnostic {\n return diagnostic;\n}\n\nfunction createPlannedChange(change: Omit<DoctorPlannedChange, 'safe'>): DoctorPlannedChange {\n return {\n ...change,\n safe: true,\n };\n}\n\nfunction createInvalidPackageJsonMessage(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n return `package.json contains invalid JSON: ${message}`;\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n return (await statOrNull(targetPath)) !== null;\n}\n\nasync function statOrNull(targetPath: string) {\n try {\n return await fs.stat(targetPath);\n } catch (error) {\n if (isMissingPathError(error)) {\n return null;\n }\n\n throw error;\n }\n}\n\nfunction isMissingPathError(error: unknown): error is NodeJS.ErrnoException {\n return (\n error instanceof Error &&\n 'code' in error &&\n typeof error.code === 'string' &&\n error.code === 'ENOENT'\n );\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim() !== '';\n}\n\nfunction isPackageRelativeProviderPath(value: unknown): value is string {\n return isNonEmptyString(value) && value.startsWith('./');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isStringTuple(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.length > 0 && value.every(isNonEmptyString);\n}\n\nfunction readStringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.filter(isNonEmptyString) : [];\n}\n\n/*** Read and normalize canonical Capability descriptors from untrusted metadata. */\nfunction readCapabilities(value: unknown): Capability[] {\n return Array.isArray(value) ? value.filter(isCapability).map(normalizeCapability) : [];\n}\n\nfunction sameStringSet(left: readonly string[], right: readonly string[]): boolean {\n const leftSet = uniqueSortedStrings(left);\n const rightSet = uniqueSortedStrings(right);\n return (\n leftSet.length === rightSet.length && leftSet.every((value, index) => value === rightSet[index])\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B;QACE,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,CAAC,QAAQ,CAAC;QAClB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE;KACpD;IACD;QACE,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,CAAC,QAAQ,CAAC;QAClB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE;KACpD;IACD;QACE,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,CAAC,QAAQ,CAAC;QAClB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE;KACpD;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,CAAC,QAAQ,CAAC;QAClB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE;KACpD;CACuC,CAAC","sourcesContent":["import type { Capability } from '@ankhorage/contracts/
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B;QACE,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,CAAC,QAAQ,CAAC;QAClB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE;KACpD;IACD;QACE,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,CAAC,QAAQ,CAAC;QAClB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE;KACpD;IACD;QACE,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,CAAC,QAAQ,CAAC;QAClB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE;KACpD;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,CAAC,QAAQ,CAAC;QAClB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE;KACpD;CACuC,CAAC","sourcesContent":["import type { Capability } from '@ankhorage/contracts/capability';\n\nexport const CAPABILITIES = [\n {\n id: 'doctor.validate',\n owner: '@ankhorage/doctor',\n access: ['invoke'],\n binding: { kind: 'action', bindableAs: ['target'] },\n },\n {\n id: 'doctor.fix',\n owner: '@ankhorage/doctor',\n access: ['invoke'],\n binding: { kind: 'action', bindableAs: ['target'] },\n },\n {\n id: 'doctor.repo',\n owner: '@ankhorage/doctor',\n access: ['invoke'],\n binding: { kind: 'action', bindableAs: ['target'] },\n },\n {\n id: 'doctor.package',\n owner: '@ankhorage/doctor',\n access: ['invoke'],\n binding: { kind: 'action', bindableAs: ['target'] },\n },\n] as const satisfies readonly Capability[];\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilityCatalog.d.ts","sourceRoot":"","sources":["../src/capabilityCatalog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"capabilityCatalog.d.ts","sourceRoot":"","sources":["../src/capabilityCatalog.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAOlE,KAAK,iBAAiB,GAClB;IAAE,QAAQ,CAAC,YAAY,EAAE,SAAS,UAAU,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAA;CAAE,GAC9F;IAAE,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC/E;IAAE,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAA;CAAE,CAAC;AAEhF,+EAA+E;AAC/E,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,OAAO,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAmB5B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { promises as fs } from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import {
|
|
3
|
+
import { parseCapabilityCatalog } from '@ankhorage/capability';
|
|
4
4
|
import { capabilityCatalogAstAsync } from './capabilityCatalogAst.js';
|
|
5
5
|
import { capabilityCatalogExports } from './capabilityCatalogExports.js';
|
|
6
6
|
const CAPABILITIES_SOURCE_PATH = 'src/capabilities/index.ts';
|
|
@@ -14,12 +14,9 @@ export async function readCapabilityCatalogAsync(packageRoot, packageExports) {
|
|
|
14
14
|
const values = await capabilityCatalogAstAsync(packageRoot, catalogPath, 'CAPABILITIES');
|
|
15
15
|
if (!Array.isArray(values))
|
|
16
16
|
throw new Error(`${CAPABILITIES_SOURCE_PATH} must export CAPABILITIES as an array.`);
|
|
17
|
-
const capabilities = values
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return normalizeCapability(value);
|
|
21
|
-
});
|
|
22
|
-
assertUniqueCapabilityIds(capabilities);
|
|
17
|
+
const capabilities = parseCapabilityCatalog(values);
|
|
18
|
+
if (capabilities === null)
|
|
19
|
+
throw new Error('CAPABILITIES must contain valid descriptors with unique capability ids.');
|
|
23
20
|
return { capabilities, path: catalogPath, reason: null };
|
|
24
21
|
}
|
|
25
22
|
catch (error) {
|
|
@@ -39,13 +36,4 @@ async function isFileAsync(candidate) {
|
|
|
39
36
|
return false;
|
|
40
37
|
}
|
|
41
38
|
}
|
|
42
|
-
/*** Reject duplicate identifiers in one canonical catalog. */
|
|
43
|
-
function assertUniqueCapabilityIds(capabilities) {
|
|
44
|
-
const ids = new Set();
|
|
45
|
-
for (const capability of capabilities) {
|
|
46
|
-
if (ids.has(capability.id))
|
|
47
|
-
throw new Error(`Duplicate capability id "${capability.id}".`);
|
|
48
|
-
ids.add(capability.id);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
39
|
//# sourceMappingURL=capabilityCatalog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilityCatalog.js","sourceRoot":"","sources":["../src/capabilityCatalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,
|
|
1
|
+
{"version":3,"file":"capabilityCatalog.js","sourceRoot":"","sources":["../src/capabilityCatalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAG/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,MAAM,wBAAwB,GAAG,2BAA2B,CAAC;AAO7D,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,WAAmB,EACnB,cAAuB;IAEvB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;IACxE,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;QAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC/F,IAAI,CAAC;QACH,wBAAwB,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,WAAW,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;QACzF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,GAAG,wBAAwB,wCAAwC,CAAC,CAAC;QACvF,MAAM,YAAY,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,YAAY,KAAK,IAAI;YACvB,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;QAC7F,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC/D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,sDAAsD;AACtD,KAAK,UAAU,WAAW,CAAC,SAAiB;IAC1C,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC","sourcesContent":["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nimport { parseCapabilityCatalog } from '@ankhorage/capability';\nimport type { Capability } from '@ankhorage/contracts/capability';\n\nimport { capabilityCatalogAstAsync } from './capabilityCatalogAst.js';\nimport { capabilityCatalogExports } from './capabilityCatalogExports.js';\n\nconst CAPABILITIES_SOURCE_PATH = 'src/capabilities/index.ts';\n\ntype CatalogResolution =\n | { readonly capabilities: readonly Capability[]; readonly path: string; readonly reason: null }\n | { readonly capabilities: null; readonly path: string; readonly reason: string }\n | { readonly capabilities: null; readonly path: null; readonly reason: null };\n\n/*** Read an opted-in package catalog without executing target package code. */\nexport async function readCapabilityCatalogAsync(\n packageRoot: string,\n packageExports: unknown,\n): Promise<CatalogResolution> {\n const catalogPath = path.resolve(packageRoot, CAPABILITIES_SOURCE_PATH);\n if (!(await isFileAsync(catalogPath))) return { capabilities: null, path: null, reason: null };\n try {\n capabilityCatalogExports(packageRoot, packageExports, catalogPath);\n const values = await capabilityCatalogAstAsync(packageRoot, catalogPath, 'CAPABILITIES');\n if (!Array.isArray(values))\n throw new Error(`${CAPABILITIES_SOURCE_PATH} must export CAPABILITIES as an array.`);\n const capabilities = parseCapabilityCatalog(values);\n if (capabilities === null)\n throw new Error('CAPABILITIES must contain valid descriptors with unique capability ids.');\n return { capabilities, path: catalogPath, reason: null };\n } catch (error) {\n return {\n capabilities: null,\n path: catalogPath,\n reason: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/*** Check whether one candidate is a regular file. */\nasync function isFileAsync(candidate: string): Promise<boolean> {\n try {\n return (await fs.stat(candidate)).isFile();\n } catch {\n return false;\n }\n}\n"]}
|
package/dist/commands.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Capability } from '@ankhorage/contracts/
|
|
1
|
+
import type { Capability } from '@ankhorage/contracts/capability';
|
|
2
2
|
import type { AnkhCommandDescriptor } from '@ankhorage/contracts/cli';
|
|
3
3
|
import type { DoctorTargetMode } from './analysis.js';
|
|
4
4
|
import { analyzeDoctorTargetWithCliLayout } from './cliLayoutAnalysis.js';
|
package/dist/commands.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Capability } from '@ankhorage/contracts/capabilities';\nimport type { AnkhCommandDescriptor } from '@ankhorage/contracts/cli';\n\nimport type { DoctorAnalysisResult, DoctorPlannedChange, DoctorTargetMode } from './analysis.js';\nimport { CAPABILITIES } from './capabilities/index.js';\nimport { analyzeDoctorTargetWithCliLayout } from './cliLayoutAnalysis.js';\nimport type { DoctorCommandContext, DoctorCommandRunResult } from './commandContext.js';\nimport {\n countErrorDiagnostics,\n countWarningDiagnostics,\n type DoctorDiagnostic,\n} from './diagnostics.js';\nimport { DOCTOR_COMMAND_CATEGORY } from './packageMetadata.js';\nimport type { DoctorReadiness } from './readiness.js';\n\ntype DoctorCommandName = 'fix' | 'package' | 'repo' | 'validate';\n\ninterface DoctorCommandRunRequest {\n readonly context: DoctorCommandContext;\n readonly inputPath?: string;\n}\n\ntype DoctorCommandImplementation = (\n request: DoctorCommandRunRequest,\n services: DoctorCommandServices,\n) => Promise<DoctorCommandRunResult>;\n\nexport interface DoctorCommandDefinition {\n readonly capability: Capability['id'];\n readonly mode: DoctorTargetMode;\n readonly path: readonly [DoctorCommandName];\n readonly standaloneName: DoctorCommandName;\n readonly summary: string;\n readonly run: DoctorCommandImplementation;\n}\n\nexport interface DoctorCommandInvocation {\n readonly argv: readonly string[];\n readonly command: DoctorCommandDefinition;\n readonly context: DoctorCommandContext;\n}\n\nexport interface DoctorCommandServices {\n readonly analyzeTarget: typeof analyzeDoctorTargetWithCliLayout;\n}\n\nexport interface RunDoctorCommandOptions {\n readonly runCommandImpl?: RunDoctorCommandImpl;\n readonly services?: Partial<DoctorCommandServices>;\n}\n\nexport type RunDoctorCommandImpl = (\n request: DoctorCommandInvocation,\n options?: RunDoctorCommandOptions,\n) => Promise<DoctorCommandRunResult>;\n\nconst COMMAND_CAPABILITIES = {\n validate: CAPABILITIES[0].id,\n fix: CAPABILITIES[1].id,\n repo: CAPABILITIES[2].id,\n package: CAPABILITIES[3].id,\n} as const satisfies Record<DoctorCommandName, Capability['id']>;\n\nexport const DOCTOR_COMMANDS = [\n {\n standaloneName: 'validate',\n path: ['validate'],\n capability: COMMAND_CAPABILITIES.validate,\n mode: 'validate',\n summary:\n 'Validate a repo, package, or app-manifest JSON path with the applicable Doctor profile.',\n run: runValidateCommand,\n },\n {\n standaloneName: 'fix',\n path: ['fix'],\n capability: COMMAND_CAPABILITIES.fix,\n mode: 'fix',\n summary: 'Build a non-mutating fix plan for deterministic doctor policy violations.',\n run: runFixCommand,\n },\n {\n standaloneName: 'repo',\n path: ['repo'],\n capability: COMMAND_CAPABILITIES.repo,\n mode: 'repo',\n summary: 'Force repo-light diagnostics for a repo/workspace-root candidate path.',\n run: runRepoCommand,\n },\n {\n standaloneName: 'package',\n path: ['package'],\n capability: COMMAND_CAPABILITIES.package,\n mode: 'package',\n summary: 'Force package-light diagnostics for a directory containing package.json.',\n run: runPackageCommand,\n },\n] as const satisfies readonly DoctorCommandDefinition[];\n\nexport async function runDoctorCommand(\n request: DoctorCommandInvocation,\n options: RunDoctorCommandOptions = {},\n): Promise<DoctorCommandRunResult> {\n const services = createDoctorCommandServices(options.services);\n\n try {\n const parsedArgs = parseCommandArguments(request.command, request.argv);\n if (parsedArgs.kind === 'help') {\n request.context.writeStdout(renderCommandHelp(request.command));\n return { exitCode: 0 };\n }\n\n return await request.command.run(\n {\n context: request.context,\n inputPath: parsedArgs.inputPath,\n },\n services,\n );\n } catch (error) {\n request.context.writeStderr(renderCommandFailure(request.command.standaloneName, error));\n return { exitCode: 1 };\n }\n}\n\nexport function createProviderCommandDescriptors(): readonly AnkhCommandDescriptor[] {\n return DOCTOR_COMMANDS.map((command) => ({\n capability: command.capability,\n path: command.path,\n summary: command.summary,\n }));\n}\n\nexport function findDoctorCommandByStandaloneName(value: string): DoctorCommandDefinition | null {\n return DOCTOR_COMMANDS.find((command) => command.standaloneName === value) ?? null;\n}\n\nexport function renderRootHelp(version: string): string {\n const commandLines = DOCTOR_COMMANDS.map(\n (command) => ` ${command.standaloneName.padEnd(8, ' ')} ${command.summary}`,\n ).join('\\n');\n\n return [\n `@ankhorage/doctor v${version}`,\n '',\n 'Usage:',\n ' ankhorage-doctor <command> [path]',\n ` ankh ${DOCTOR_COMMAND_CATEGORY} <command> [path]`,\n '',\n 'Commands:',\n commandLines,\n '',\n 'Path resolution:',\n ' Pass a repo/package directory or app-manifest JSON file, or omit [path] to inspect the current directory.',\n '',\n ].join('\\n');\n}\n\nexport function renderUnknownCommand(value: string): string {\n return [`Unknown doctor command: ${value}`, '', 'Run ankhorage-doctor --help', ''].join('\\n');\n}\n\nfunction renderCommandHelp(command: DoctorCommandDefinition): string {\n return [\n command.summary,\n '',\n 'Usage:',\n ` ankhorage-doctor ${command.standaloneName} [path]`,\n ` ankh ${DOCTOR_COMMAND_CATEGORY} ${command.path.join(' ')} [path]`,\n '',\n 'Path resolution:',\n ' Pass a repo/package directory or app-manifest JSON file, or omit [path] to inspect the current directory.',\n '',\n ].join('\\n');\n}\n\nfunction createDoctorCommandServices(\n overrides: Partial<DoctorCommandServices> = {},\n): DoctorCommandServices {\n return {\n analyzeTarget: overrides.analyzeTarget ?? analyzeDoctorTargetWithCliLayout,\n };\n}\n\nfunction parseCommandArguments(\n command: DoctorCommandDefinition,\n argv: readonly string[],\n): { readonly kind: 'help' } | { readonly kind: 'run'; readonly inputPath?: string } {\n const [firstArg] = argv;\n\n if (argv.length === 1 && firstArg !== undefined && isHelpToken(firstArg)) {\n return { kind: 'help' };\n }\n\n if (argv.length > 1) {\n throw new Error(`Doctor ${command.standaloneName} accepts at most one path argument.`);\n }\n\n return {\n kind: 'run',\n inputPath: firstArg,\n };\n}\n\nasync function runValidateCommand(\n request: DoctorCommandRunRequest,\n services: DoctorCommandServices,\n): Promise<DoctorCommandRunResult> {\n const result = await services.analyzeTarget({\n cwd: request.context.cwd,\n inputPath: request.inputPath,\n mode: 'validate',\n });\n\n request.context.writeStdout(renderAnalysisReport('validate', result));\n\n return {\n exitCode: countErrorDiagnostics(result.diagnostics) > 0 ? 1 : 0,\n };\n}\n\nasync function runFixCommand(\n request: DoctorCommandRunRequest,\n services: DoctorCommandServices,\n): Promise<DoctorCommandRunResult> {\n const result = await services.analyzeTarget({\n cwd: request.context.cwd,\n inputPath: request.inputPath,\n mode: 'fix',\n });\n\n request.context.writeStdout(renderAnalysisReport('fix', result));\n\n return {\n exitCode: countErrorDiagnostics(result.diagnostics) > 0 ? 1 : 0,\n };\n}\n\nasync function runRepoCommand(\n request: DoctorCommandRunRequest,\n services: DoctorCommandServices,\n): Promise<DoctorCommandRunResult> {\n const result = await services.analyzeTarget({\n cwd: request.context.cwd,\n inputPath: request.inputPath,\n mode: 'repo',\n });\n\n request.context.writeStdout(renderAnalysisReport('repo', result));\n\n return {\n exitCode: countErrorDiagnostics(result.diagnostics) > 0 ? 1 : 0,\n };\n}\n\nasync function runPackageCommand(\n request: DoctorCommandRunRequest,\n services: DoctorCommandServices,\n): Promise<DoctorCommandRunResult> {\n const result = await services.analyzeTarget({\n cwd: request.context.cwd,\n inputPath: request.inputPath,\n mode: 'package',\n });\n\n request.context.writeStdout(renderAnalysisReport('package', result));\n\n return {\n exitCode: countErrorDiagnostics(result.diagnostics) > 0 ? 1 : 0,\n };\n}\n\nfunction renderAnalysisReport(\n commandName: DoctorCommandName,\n result: DoctorAnalysisResult,\n): string {\n const lines = [\n `doctor ${commandName}`,\n `target: ${result.targetPath}`,\n `profile: ${result.profile}`,\n `checks: ${result.appliedChecks.length > 0 ? result.appliedChecks.join(', ') : 'none'}`,\n `repoMarkers: ${result.repoMarkers.length > 0 ? result.repoMarkers.join(', ') : 'none'}`,\n '',\n 'Diagnostics:',\n ];\n\n if (result.diagnostics.length === 0) {\n lines.push(' none');\n } else {\n for (const diagnostic of result.diagnostics) {\n lines.push(renderDiagnosticLine(diagnostic));\n }\n }\n\n const readiness = result.readiness ?? [];\n lines.push('');\n lines.push('Readiness:');\n if (readiness.length === 0) {\n lines.push(' none');\n } else {\n for (const item of readiness) {\n lines.push(renderReadinessLine(item));\n }\n }\n\n if (commandName === 'fix') {\n lines.push('');\n lines.push('Planned changes:');\n\n if (result.plannedChanges.length === 0) {\n lines.push(' none');\n } else {\n for (const change of result.plannedChanges) {\n lines.push(renderPlannedChangeLine(change));\n }\n }\n }\n\n const errorCount = countErrorDiagnostics(result.diagnostics);\n const warningCount = countWarningDiagnostics(result.diagnostics);\n\n lines.push('');\n lines.push(`Summary: ${errorCount} error(s), ${warningCount} warning(s)`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction renderDiagnosticLine(diagnostic: DoctorDiagnostic): string {\n return ` - ${diagnostic.severity.toUpperCase()} ${diagnostic.ruleId} (${diagnostic.code}): ${diagnostic.message}`;\n}\n\nfunction renderReadinessLine(item: DoctorReadiness): string {\n return ` - ${item.target} ${item.environment} ${item.provider} ${item.transport}: ${item.status} — ${item.message}`;\n}\n\nfunction renderPlannedChangeLine(change: DoctorPlannedChange): string {\n return ` - ${change.ruleId} [${change.kind}]: ${change.description}`;\n}\n\nfunction renderCommandFailure(commandName: DoctorCommandName, error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n return [`Failed to run doctor ${commandName}: ${message}`, ''].join('\\n');\n}\n\nfunction isHelpToken(value: string): boolean {\n return value === '--help' || value === '-h' || value === 'help';\n}\n"]}
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Capability } from '@ankhorage/contracts/capability';\nimport type { AnkhCommandDescriptor } from '@ankhorage/contracts/cli';\n\nimport type { DoctorAnalysisResult, DoctorPlannedChange, DoctorTargetMode } from './analysis.js';\nimport { CAPABILITIES } from './capabilities/index.js';\nimport { analyzeDoctorTargetWithCliLayout } from './cliLayoutAnalysis.js';\nimport type { DoctorCommandContext, DoctorCommandRunResult } from './commandContext.js';\nimport {\n countErrorDiagnostics,\n countWarningDiagnostics,\n type DoctorDiagnostic,\n} from './diagnostics.js';\nimport { DOCTOR_COMMAND_CATEGORY } from './packageMetadata.js';\nimport type { DoctorReadiness } from './readiness.js';\n\ntype DoctorCommandName = 'fix' | 'package' | 'repo' | 'validate';\n\ninterface DoctorCommandRunRequest {\n readonly context: DoctorCommandContext;\n readonly inputPath?: string;\n}\n\ntype DoctorCommandImplementation = (\n request: DoctorCommandRunRequest,\n services: DoctorCommandServices,\n) => Promise<DoctorCommandRunResult>;\n\nexport interface DoctorCommandDefinition {\n readonly capability: Capability['id'];\n readonly mode: DoctorTargetMode;\n readonly path: readonly [DoctorCommandName];\n readonly standaloneName: DoctorCommandName;\n readonly summary: string;\n readonly run: DoctorCommandImplementation;\n}\n\nexport interface DoctorCommandInvocation {\n readonly argv: readonly string[];\n readonly command: DoctorCommandDefinition;\n readonly context: DoctorCommandContext;\n}\n\nexport interface DoctorCommandServices {\n readonly analyzeTarget: typeof analyzeDoctorTargetWithCliLayout;\n}\n\nexport interface RunDoctorCommandOptions {\n readonly runCommandImpl?: RunDoctorCommandImpl;\n readonly services?: Partial<DoctorCommandServices>;\n}\n\nexport type RunDoctorCommandImpl = (\n request: DoctorCommandInvocation,\n options?: RunDoctorCommandOptions,\n) => Promise<DoctorCommandRunResult>;\n\nconst COMMAND_CAPABILITIES = {\n validate: CAPABILITIES[0].id,\n fix: CAPABILITIES[1].id,\n repo: CAPABILITIES[2].id,\n package: CAPABILITIES[3].id,\n} as const satisfies Record<DoctorCommandName, Capability['id']>;\n\nexport const DOCTOR_COMMANDS = [\n {\n standaloneName: 'validate',\n path: ['validate'],\n capability: COMMAND_CAPABILITIES.validate,\n mode: 'validate',\n summary:\n 'Validate a repo, package, or app-manifest JSON path with the applicable Doctor profile.',\n run: runValidateCommand,\n },\n {\n standaloneName: 'fix',\n path: ['fix'],\n capability: COMMAND_CAPABILITIES.fix,\n mode: 'fix',\n summary: 'Build a non-mutating fix plan for deterministic doctor policy violations.',\n run: runFixCommand,\n },\n {\n standaloneName: 'repo',\n path: ['repo'],\n capability: COMMAND_CAPABILITIES.repo,\n mode: 'repo',\n summary: 'Force repo-light diagnostics for a repo/workspace-root candidate path.',\n run: runRepoCommand,\n },\n {\n standaloneName: 'package',\n path: ['package'],\n capability: COMMAND_CAPABILITIES.package,\n mode: 'package',\n summary: 'Force package-light diagnostics for a directory containing package.json.',\n run: runPackageCommand,\n },\n] as const satisfies readonly DoctorCommandDefinition[];\n\nexport async function runDoctorCommand(\n request: DoctorCommandInvocation,\n options: RunDoctorCommandOptions = {},\n): Promise<DoctorCommandRunResult> {\n const services = createDoctorCommandServices(options.services);\n\n try {\n const parsedArgs = parseCommandArguments(request.command, request.argv);\n if (parsedArgs.kind === 'help') {\n request.context.writeStdout(renderCommandHelp(request.command));\n return { exitCode: 0 };\n }\n\n return await request.command.run(\n {\n context: request.context,\n inputPath: parsedArgs.inputPath,\n },\n services,\n );\n } catch (error) {\n request.context.writeStderr(renderCommandFailure(request.command.standaloneName, error));\n return { exitCode: 1 };\n }\n}\n\nexport function createProviderCommandDescriptors(): readonly AnkhCommandDescriptor[] {\n return DOCTOR_COMMANDS.map((command) => ({\n capability: command.capability,\n path: command.path,\n summary: command.summary,\n }));\n}\n\nexport function findDoctorCommandByStandaloneName(value: string): DoctorCommandDefinition | null {\n return DOCTOR_COMMANDS.find((command) => command.standaloneName === value) ?? null;\n}\n\nexport function renderRootHelp(version: string): string {\n const commandLines = DOCTOR_COMMANDS.map(\n (command) => ` ${command.standaloneName.padEnd(8, ' ')} ${command.summary}`,\n ).join('\\n');\n\n return [\n `@ankhorage/doctor v${version}`,\n '',\n 'Usage:',\n ' ankhorage-doctor <command> [path]',\n ` ankh ${DOCTOR_COMMAND_CATEGORY} <command> [path]`,\n '',\n 'Commands:',\n commandLines,\n '',\n 'Path resolution:',\n ' Pass a repo/package directory or app-manifest JSON file, or omit [path] to inspect the current directory.',\n '',\n ].join('\\n');\n}\n\nexport function renderUnknownCommand(value: string): string {\n return [`Unknown doctor command: ${value}`, '', 'Run ankhorage-doctor --help', ''].join('\\n');\n}\n\nfunction renderCommandHelp(command: DoctorCommandDefinition): string {\n return [\n command.summary,\n '',\n 'Usage:',\n ` ankhorage-doctor ${command.standaloneName} [path]`,\n ` ankh ${DOCTOR_COMMAND_CATEGORY} ${command.path.join(' ')} [path]`,\n '',\n 'Path resolution:',\n ' Pass a repo/package directory or app-manifest JSON file, or omit [path] to inspect the current directory.',\n '',\n ].join('\\n');\n}\n\nfunction createDoctorCommandServices(\n overrides: Partial<DoctorCommandServices> = {},\n): DoctorCommandServices {\n return {\n analyzeTarget: overrides.analyzeTarget ?? analyzeDoctorTargetWithCliLayout,\n };\n}\n\nfunction parseCommandArguments(\n command: DoctorCommandDefinition,\n argv: readonly string[],\n): { readonly kind: 'help' } | { readonly kind: 'run'; readonly inputPath?: string } {\n const [firstArg] = argv;\n\n if (argv.length === 1 && firstArg !== undefined && isHelpToken(firstArg)) {\n return { kind: 'help' };\n }\n\n if (argv.length > 1) {\n throw new Error(`Doctor ${command.standaloneName} accepts at most one path argument.`);\n }\n\n return {\n kind: 'run',\n inputPath: firstArg,\n };\n}\n\nasync function runValidateCommand(\n request: DoctorCommandRunRequest,\n services: DoctorCommandServices,\n): Promise<DoctorCommandRunResult> {\n const result = await services.analyzeTarget({\n cwd: request.context.cwd,\n inputPath: request.inputPath,\n mode: 'validate',\n });\n\n request.context.writeStdout(renderAnalysisReport('validate', result));\n\n return {\n exitCode: countErrorDiagnostics(result.diagnostics) > 0 ? 1 : 0,\n };\n}\n\nasync function runFixCommand(\n request: DoctorCommandRunRequest,\n services: DoctorCommandServices,\n): Promise<DoctorCommandRunResult> {\n const result = await services.analyzeTarget({\n cwd: request.context.cwd,\n inputPath: request.inputPath,\n mode: 'fix',\n });\n\n request.context.writeStdout(renderAnalysisReport('fix', result));\n\n return {\n exitCode: countErrorDiagnostics(result.diagnostics) > 0 ? 1 : 0,\n };\n}\n\nasync function runRepoCommand(\n request: DoctorCommandRunRequest,\n services: DoctorCommandServices,\n): Promise<DoctorCommandRunResult> {\n const result = await services.analyzeTarget({\n cwd: request.context.cwd,\n inputPath: request.inputPath,\n mode: 'repo',\n });\n\n request.context.writeStdout(renderAnalysisReport('repo', result));\n\n return {\n exitCode: countErrorDiagnostics(result.diagnostics) > 0 ? 1 : 0,\n };\n}\n\nasync function runPackageCommand(\n request: DoctorCommandRunRequest,\n services: DoctorCommandServices,\n): Promise<DoctorCommandRunResult> {\n const result = await services.analyzeTarget({\n cwd: request.context.cwd,\n inputPath: request.inputPath,\n mode: 'package',\n });\n\n request.context.writeStdout(renderAnalysisReport('package', result));\n\n return {\n exitCode: countErrorDiagnostics(result.diagnostics) > 0 ? 1 : 0,\n };\n}\n\nfunction renderAnalysisReport(\n commandName: DoctorCommandName,\n result: DoctorAnalysisResult,\n): string {\n const lines = [\n `doctor ${commandName}`,\n `target: ${result.targetPath}`,\n `profile: ${result.profile}`,\n `checks: ${result.appliedChecks.length > 0 ? result.appliedChecks.join(', ') : 'none'}`,\n `repoMarkers: ${result.repoMarkers.length > 0 ? result.repoMarkers.join(', ') : 'none'}`,\n '',\n 'Diagnostics:',\n ];\n\n if (result.diagnostics.length === 0) {\n lines.push(' none');\n } else {\n for (const diagnostic of result.diagnostics) {\n lines.push(renderDiagnosticLine(diagnostic));\n }\n }\n\n const readiness = result.readiness ?? [];\n lines.push('');\n lines.push('Readiness:');\n if (readiness.length === 0) {\n lines.push(' none');\n } else {\n for (const item of readiness) {\n lines.push(renderReadinessLine(item));\n }\n }\n\n if (commandName === 'fix') {\n lines.push('');\n lines.push('Planned changes:');\n\n if (result.plannedChanges.length === 0) {\n lines.push(' none');\n } else {\n for (const change of result.plannedChanges) {\n lines.push(renderPlannedChangeLine(change));\n }\n }\n }\n\n const errorCount = countErrorDiagnostics(result.diagnostics);\n const warningCount = countWarningDiagnostics(result.diagnostics);\n\n lines.push('');\n lines.push(`Summary: ${errorCount} error(s), ${warningCount} warning(s)`);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction renderDiagnosticLine(diagnostic: DoctorDiagnostic): string {\n return ` - ${diagnostic.severity.toUpperCase()} ${diagnostic.ruleId} (${diagnostic.code}): ${diagnostic.message}`;\n}\n\nfunction renderReadinessLine(item: DoctorReadiness): string {\n return ` - ${item.target} ${item.environment} ${item.provider} ${item.transport}: ${item.status} — ${item.message}`;\n}\n\nfunction renderPlannedChangeLine(change: DoctorPlannedChange): string {\n return ` - ${change.ruleId} [${change.kind}]: ${change.description}`;\n}\n\nfunction renderCommandFailure(commandName: DoctorCommandName, error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n return [`Failed to run doctor ${commandName}: ${message}`, ''].join('\\n');\n}\n\nfunction isHelpToken(value: string): boolean {\n return value === '--help' || value === '-h' || value === 'help';\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ankhorage/doctor",
|
|
3
|
-
"version": "0.14.
|
|
3
|
+
"version": "0.14.7",
|
|
4
4
|
"description": "Executable Ankh provider and standalone CLI for lightweight repo and package compliance diagnostics.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -131,7 +131,8 @@
|
|
|
131
131
|
"test:standalone": "bun test tests/standaloneContract.test.ts"
|
|
132
132
|
},
|
|
133
133
|
"dependencies": {
|
|
134
|
-
"@ankhorage/
|
|
134
|
+
"@ankhorage/capability": "^0.2.1",
|
|
135
|
+
"@ankhorage/contracts": "^25.0.0",
|
|
135
136
|
"@ankhorage/dependency-graph": "^1.3.0",
|
|
136
137
|
"@ankhorage/rules-architecture": "^0.6.0",
|
|
137
138
|
"@ankhorage/rules-repository": "^0.2.0",
|
|
@@ -140,7 +141,7 @@
|
|
|
140
141
|
},
|
|
141
142
|
"devDependencies": {
|
|
142
143
|
"@ankhorage/ankh": "^0.12.2",
|
|
143
|
-
"@ankhorage/devtools": "^2.3.
|
|
144
|
+
"@ankhorage/devtools": "^2.3.9",
|
|
144
145
|
"@ankhorage/paradox": "^0.3.1",
|
|
145
146
|
"@types/bun": "^1.4.2",
|
|
146
147
|
"@types/node": "^26.6.4",
|
package/src/analysis.ts
CHANGED
|
@@ -3,11 +3,12 @@ import path from 'node:path';
|
|
|
3
3
|
import { pathToFileURL } from 'node:url';
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
|
-
|
|
7
|
-
type Capability,
|
|
6
|
+
areCapabilityCatalogsEqual,
|
|
8
7
|
isCapability,
|
|
8
|
+
isCapabilityCatalog,
|
|
9
9
|
normalizeCapability,
|
|
10
|
-
} from '@ankhorage/
|
|
10
|
+
} from '@ankhorage/capability';
|
|
11
|
+
import type { Capability } from '@ankhorage/contracts/capability';
|
|
11
12
|
import { REPOSITORY_RULE_METADATA } from '@ankhorage/rules-repository';
|
|
12
13
|
import { uniqueSortedStrings } from '@ankhorage/utility/array';
|
|
13
14
|
|
|
@@ -611,7 +612,11 @@ async function validateAnkhMetadataAndProvider(request: {
|
|
|
611
612
|
return diagnostics;
|
|
612
613
|
}
|
|
613
614
|
|
|
614
|
-
const metadataValidation = validateAnkhMetadataShape(
|
|
615
|
+
const metadataValidation = validateAnkhMetadataShape(
|
|
616
|
+
metadata,
|
|
617
|
+
providerPackage,
|
|
618
|
+
catalog.path !== null,
|
|
619
|
+
);
|
|
615
620
|
if (metadataValidation !== null) {
|
|
616
621
|
diagnostics.push(
|
|
617
622
|
createDiagnostic({
|
|
@@ -631,7 +636,7 @@ async function validateAnkhMetadataAndProvider(request: {
|
|
|
631
636
|
}
|
|
632
637
|
|
|
633
638
|
const metadataCapabilities = readCapabilities(metadata.capabilities);
|
|
634
|
-
const metadataIdsAreUnique =
|
|
639
|
+
const metadataIdsAreUnique = isCapabilityCatalog(metadataCapabilities);
|
|
635
640
|
if (!metadataIdsAreUnique) {
|
|
636
641
|
diagnostics.push(
|
|
637
642
|
createDiagnostic({
|
|
@@ -659,7 +664,7 @@ async function validateAnkhMetadataAndProvider(request: {
|
|
|
659
664
|
} else if (
|
|
660
665
|
catalog.capabilities !== null &&
|
|
661
666
|
metadataIdsAreUnique &&
|
|
662
|
-
!
|
|
667
|
+
!areCapabilityCatalogsEqual(metadataCapabilities, catalog.capabilities)
|
|
663
668
|
) {
|
|
664
669
|
diagnostics.push(
|
|
665
670
|
createDiagnostic({
|
|
@@ -710,7 +715,7 @@ async function validateAnkhMetadataAndProvider(request: {
|
|
|
710
715
|
const providerCapabilities = inspection.result.capabilities;
|
|
711
716
|
const commandCapabilities = uniqueSortedStrings(inspection.result.commandCapabilities);
|
|
712
717
|
|
|
713
|
-
if (!
|
|
718
|
+
if (!areCapabilityCatalogsEqual(metadataCapabilities, providerCapabilities)) {
|
|
714
719
|
diagnostics.push(
|
|
715
720
|
createDiagnostic({
|
|
716
721
|
code: 'field-invalid',
|
|
@@ -1135,7 +1140,11 @@ function hasDependency(
|
|
|
1135
1140
|
return dependencyMap !== null && isNonEmptyString(dependencyMap[dependencyName]);
|
|
1136
1141
|
}
|
|
1137
1142
|
|
|
1138
|
-
function validateAnkhMetadataShape(
|
|
1143
|
+
function validateAnkhMetadataShape(
|
|
1144
|
+
value: unknown,
|
|
1145
|
+
providerPackage: boolean,
|
|
1146
|
+
hasPublicCapabilityCatalog: boolean,
|
|
1147
|
+
): string | null {
|
|
1139
1148
|
if (!isRecord(value)) {
|
|
1140
1149
|
return 'package.json "ankh" metadata must be an object when present.';
|
|
1141
1150
|
}
|
|
@@ -1159,9 +1168,14 @@ function validateAnkhMetadataShape(value: unknown, providerPackage: boolean): st
|
|
|
1159
1168
|
return 'Non-provider package metadata, when present, must use null or a package-relative "./..." provider value.';
|
|
1160
1169
|
}
|
|
1161
1170
|
|
|
1171
|
+
if ((providerPackage || hasPublicCapabilityCatalog) && !Array.isArray(value.capabilities)) {
|
|
1172
|
+
return 'package.json "ankh.capabilities" must be an array of canonical Capability descriptors.';
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1162
1175
|
if (
|
|
1163
|
-
|
|
1164
|
-
value.capabilities
|
|
1176
|
+
value.capabilities !== undefined &&
|
|
1177
|
+
(!Array.isArray(value.capabilities) ||
|
|
1178
|
+
value.capabilities.some((capability) => !isCapability(capability)))
|
|
1165
1179
|
) {
|
|
1166
1180
|
return 'package.json "ankh.capabilities" must be an array of canonical Capability descriptors.';
|
|
1167
1181
|
}
|
|
@@ -1254,26 +1268,6 @@ function readCapabilities(value: unknown): Capability[] {
|
|
|
1254
1268
|
return Array.isArray(value) ? value.filter(isCapability).map(normalizeCapability) : [];
|
|
1255
1269
|
}
|
|
1256
1270
|
|
|
1257
|
-
/*** Compare capability collections by canonical id and descriptor semantics. */
|
|
1258
|
-
function sameCapabilitySet(left: readonly Capability[], right: readonly Capability[]): boolean {
|
|
1259
|
-
const leftById = new Map(left.map((capability) => [capability.id, capability]));
|
|
1260
|
-
const rightById = new Map(right.map((capability) => [capability.id, capability]));
|
|
1261
|
-
return (
|
|
1262
|
-
leftById.size === left.length &&
|
|
1263
|
-
rightById.size === right.length &&
|
|
1264
|
-
leftById.size === rightById.size &&
|
|
1265
|
-
[...leftById].every(([id, capability]) => {
|
|
1266
|
-
const other = rightById.get(id);
|
|
1267
|
-
return other !== undefined && areCapabilitiesEqual(capability, other);
|
|
1268
|
-
})
|
|
1269
|
-
);
|
|
1270
|
-
}
|
|
1271
|
-
|
|
1272
|
-
/*** Determine whether every normalized catalog descriptor has a distinct stable identifier. */
|
|
1273
|
-
function hasUniqueCapabilityIds(capabilities: readonly Capability[]): boolean {
|
|
1274
|
-
return new Set(capabilities.map((capability) => capability.id)).size === capabilities.length;
|
|
1275
|
-
}
|
|
1276
|
-
|
|
1277
1271
|
function sameStringSet(left: readonly string[], right: readonly string[]): boolean {
|
|
1278
1272
|
const leftSet = uniqueSortedStrings(left);
|
|
1279
1273
|
const rightSet = uniqueSortedStrings(right);
|
package/src/capabilityCatalog.ts
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { promises as fs } from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
isCapability,
|
|
7
|
-
normalizeCapability,
|
|
8
|
-
} from '@ankhorage/contracts/capabilities';
|
|
4
|
+
import { parseCapabilityCatalog } from '@ankhorage/capability';
|
|
5
|
+
import type { Capability } from '@ankhorage/contracts/capability';
|
|
9
6
|
|
|
10
7
|
import { capabilityCatalogAstAsync } from './capabilityCatalogAst.js';
|
|
11
8
|
import { capabilityCatalogExports } from './capabilityCatalogExports.js';
|
|
@@ -29,12 +26,9 @@ export async function readCapabilityCatalogAsync(
|
|
|
29
26
|
const values = await capabilityCatalogAstAsync(packageRoot, catalogPath, 'CAPABILITIES');
|
|
30
27
|
if (!Array.isArray(values))
|
|
31
28
|
throw new Error(`${CAPABILITIES_SOURCE_PATH} must export CAPABILITIES as an array.`);
|
|
32
|
-
const capabilities = values
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return normalizeCapability(value);
|
|
36
|
-
});
|
|
37
|
-
assertUniqueCapabilityIds(capabilities);
|
|
29
|
+
const capabilities = parseCapabilityCatalog(values);
|
|
30
|
+
if (capabilities === null)
|
|
31
|
+
throw new Error('CAPABILITIES must contain valid descriptors with unique capability ids.');
|
|
38
32
|
return { capabilities, path: catalogPath, reason: null };
|
|
39
33
|
} catch (error) {
|
|
40
34
|
return {
|
|
@@ -53,12 +47,3 @@ async function isFileAsync(candidate: string): Promise<boolean> {
|
|
|
53
47
|
return false;
|
|
54
48
|
}
|
|
55
49
|
}
|
|
56
|
-
|
|
57
|
-
/*** Reject duplicate identifiers in one canonical catalog. */
|
|
58
|
-
function assertUniqueCapabilityIds(capabilities: readonly Capability[]): void {
|
|
59
|
-
const ids = new Set<string>();
|
|
60
|
-
for (const capability of capabilities) {
|
|
61
|
-
if (ids.has(capability.id)) throw new Error(`Duplicate capability id "${capability.id}".`);
|
|
62
|
-
ids.add(capability.id);
|
|
63
|
-
}
|
|
64
|
-
}
|
package/src/commands.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Capability } from '@ankhorage/contracts/
|
|
1
|
+
import type { Capability } from '@ankhorage/contracts/capability';
|
|
2
2
|
import type { AnkhCommandDescriptor } from '@ankhorage/contracts/cli';
|
|
3
3
|
|
|
4
4
|
import type { DoctorAnalysisResult, DoctorPlannedChange, DoctorTargetMode } from './analysis.js';
|