@ankhorage/doctor 0.13.1 → 0.13.2
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 +6 -0
- package/README.md +1 -1
- package/dist/analysis.js +2 -2
- package/dist/analysis.js.map +1 -1
- package/package.json +3 -3
- package/src/analysis.ts +3 -4
package/CHANGELOG.md
CHANGED
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.js
CHANGED
|
@@ -441,10 +441,10 @@ async function validateAnkhMetadataAndProvider(request) {
|
|
|
441
441
|
severity: 'error',
|
|
442
442
|
}));
|
|
443
443
|
}
|
|
444
|
-
if (!
|
|
444
|
+
if (!commandCapabilities.every((commandCapability) => providerCapabilities.some((capability) => capability.id === commandCapability))) {
|
|
445
445
|
diagnostics.push(createDiagnostic({
|
|
446
446
|
code: 'field-invalid',
|
|
447
|
-
message: '
|
|
447
|
+
message: 'Every provider command must reference a capability published by the provider.',
|
|
448
448
|
path: inspection.result.sourcePath,
|
|
449
449
|
profile: request.profile,
|
|
450
450
|
ruleId: 'provider.commands.match-capabilities',
|
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 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 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 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 (!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 metadataCapabilities = readCapabilities(metadata.capabilities);\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 !sameStringSet(\n providerCapabilities.map((capability) => capability.id),\n commandCapabilities,\n )\n ) {\n diagnostics.push(\n createDiagnostic({\n code: 'field-invalid',\n message: 'Provider export capabilities must match the provider command capability surface.',\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\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 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 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 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 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 (!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 metadataCapabilities = readCapabilities(metadata.capabilities);\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\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ankhorage/doctor",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.2",
|
|
4
4
|
"description": "Executable Ankh provider and standalone CLI for lightweight repo and package compliance diagnostics.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -140,8 +140,8 @@
|
|
|
140
140
|
},
|
|
141
141
|
"devDependencies": {
|
|
142
142
|
"@ankhorage/ankh": "^0.12.0",
|
|
143
|
-
"@ankhorage/devtools": "^2.
|
|
144
|
-
"@ankhorage/paradox": "^0.
|
|
143
|
+
"@ankhorage/devtools": "^2.2.2",
|
|
144
|
+
"@ankhorage/paradox": "^0.3.1",
|
|
145
145
|
"@types/bun": "^1.4.2",
|
|
146
146
|
"@types/node": "^26.6.4",
|
|
147
147
|
"typescript": "^6.0.3"
|
package/src/analysis.ts
CHANGED
|
@@ -664,15 +664,14 @@ async function validateAnkhMetadataAndProvider(request: {
|
|
|
664
664
|
}
|
|
665
665
|
|
|
666
666
|
if (
|
|
667
|
-
!
|
|
668
|
-
providerCapabilities.
|
|
669
|
-
commandCapabilities,
|
|
667
|
+
!commandCapabilities.every((commandCapability) =>
|
|
668
|
+
providerCapabilities.some((capability) => capability.id === commandCapability),
|
|
670
669
|
)
|
|
671
670
|
) {
|
|
672
671
|
diagnostics.push(
|
|
673
672
|
createDiagnostic({
|
|
674
673
|
code: 'field-invalid',
|
|
675
|
-
message: '
|
|
674
|
+
message: 'Every provider command must reference a capability published by the provider.',
|
|
676
675
|
path: inspection.result.sourcePath,
|
|
677
676
|
profile: request.profile,
|
|
678
677
|
ruleId: 'provider.commands.match-capabilities',
|