@canonical/pragma-cli 0.34.0 → 0.36.0
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/README.md +153 -30
- package/bundled-skills/add-standard/SKILL.md +338 -0
- package/bundled-skills/adoption-a1-styles/SKILL.md +269 -0
- package/bundled-skills/adoption-a2-components/SKILL.md +291 -0
- package/bundled-skills/adoption-a3-forms/SKILL.md +260 -0
- package/bundled-skills/anatomy-author/ANATOMY_DSL_SPEC.md +406 -0
- package/bundled-skills/anatomy-author/SKILL.md +1226 -0
- package/bundled-skills/design-auditor/SKILL.md +455 -0
- package/bundled-skills/implement-component/SKILL.md +333 -0
- package/bundled-skills/specify-component/SKILL.md +331 -0
- package/bundled-skills/specify-pattern/SKILL.md +292 -0
- package/dist/.build-ok +0 -0
- package/dist/package.json +84 -0
- package/dist/pragma.conf.js +1016 -0
- package/dist/pragma.conf.js.map +1 -0
- package/dist/src/bin.js +356 -0
- package/dist/src/bin.js.map +1 -0
- package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
- package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
- package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
- package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
- package/dist/src/capabilities/capabilities/catalog.js +130 -0
- package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
- package/dist/src/capabilities/capabilities/hints.js +195 -0
- package/dist/src/capabilities/capabilities/hints.js.map +1 -0
- package/dist/src/capabilities/capabilities/index.js +11 -0
- package/dist/src/capabilities/capabilities/index.js.map +1 -0
- package/dist/src/capabilities/capabilities/types.js +11 -0
- package/dist/src/capabilities/capabilities/types.js.map +1 -0
- package/dist/src/capabilities/colophon/collectColophon.js +83 -0
- package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
- package/dist/src/capabilities/colophon/colophon.render.js +59 -0
- package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
- package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
- package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
- package/dist/src/capabilities/colophon/index.js +5 -0
- package/dist/src/capabilities/colophon/index.js.map +1 -0
- package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
- package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
- package/dist/src/capabilities/colophon/types.js +10 -0
- package/dist/src/capabilities/colophon/types.js.map +1 -0
- package/dist/src/capabilities/config/collectConfigShow.js +59 -0
- package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
- package/dist/src/capabilities/config/field.render.js +22 -0
- package/dist/src/capabilities/config/field.render.js.map +1 -0
- package/dist/src/capabilities/config/fields.js +46 -0
- package/dist/src/capabilities/config/fields.js.map +1 -0
- package/dist/src/capabilities/config/get.verb.js +61 -0
- package/dist/src/capabilities/config/get.verb.js.map +1 -0
- package/dist/src/capabilities/config/index.js +5 -0
- package/dist/src/capabilities/config/index.js.map +1 -0
- package/dist/src/capabilities/config/runField.js +59 -0
- package/dist/src/capabilities/config/runField.js.map +1 -0
- package/dist/src/capabilities/config/runGet.js +28 -0
- package/dist/src/capabilities/config/runGet.js.map +1 -0
- package/dist/src/capabilities/config/runSet.js +53 -0
- package/dist/src/capabilities/config/runSet.js.map +1 -0
- package/dist/src/capabilities/config/set.verb.js +66 -0
- package/dist/src/capabilities/config/set.verb.js.map +1 -0
- package/dist/src/capabilities/config/show.render.js +84 -0
- package/dist/src/capabilities/config/show.render.js.map +1 -0
- package/dist/src/capabilities/config/show.verb.js +44 -0
- package/dist/src/capabilities/config/show.verb.js.map +1 -0
- package/dist/src/capabilities/config/types.js +5 -0
- package/dist/src/capabilities/config/types.js.map +1 -0
- package/dist/src/capabilities/config/unset.verb.js +49 -0
- package/dist/src/capabilities/config/unset.verb.js.map +1 -0
- package/dist/src/capabilities/create/cliProjection.js +195 -0
- package/dist/src/capabilities/create/cliProjection.js.map +1 -0
- package/dist/src/capabilities/create/constants.js +47 -0
- package/dist/src/capabilities/create/constants.js.map +1 -0
- package/dist/src/capabilities/create/create.render.js +100 -0
- package/dist/src/capabilities/create/create.render.js.map +1 -0
- package/dist/src/capabilities/create/create.verb.js +438 -0
- package/dist/src/capabilities/create/create.verb.js.map +1 -0
- package/dist/src/capabilities/create/createHelp.js +47 -0
- package/dist/src/capabilities/create/createHelp.js.map +1 -0
- package/dist/src/capabilities/create/createSurface.generated.js +394 -0
- package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
- package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
- package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
- package/dist/src/capabilities/create/index.js +18 -0
- package/dist/src/capabilities/create/index.js.map +1 -0
- package/dist/src/capabilities/create/messages.js +16 -0
- package/dist/src/capabilities/create/messages.js.map +1 -0
- package/dist/src/capabilities/create/mount.js +294 -0
- package/dist/src/capabilities/create/mount.js.map +1 -0
- package/dist/src/capabilities/create/pathJail.js +65 -0
- package/dist/src/capabilities/create/pathJail.js.map +1 -0
- package/dist/src/capabilities/create/pickGenerator.js +53 -0
- package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
- package/dist/src/capabilities/create/types.js +2 -0
- package/dist/src/capabilities/create/types.js.map +1 -0
- package/dist/src/capabilities/distribution.js +40 -0
- package/dist/src/capabilities/distribution.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
- package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
- package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +148 -0
- package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
- package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
- package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/harnessInventory.js +195 -0
- package/dist/src/capabilities/doctor/checks/harnessInventory.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/index.js +27 -0
- package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
- package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/targetHealth.js +349 -0
- package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.render.js +164 -0
- package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.verb.js +49 -0
- package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
- package/dist/src/capabilities/doctor/index.js +5 -0
- package/dist/src/capabilities/doctor/index.js.map +1 -0
- package/dist/src/capabilities/doctor/runChecks.js +86 -0
- package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
- package/dist/src/capabilities/doctor/types.js +5 -0
- package/dist/src/capabilities/doctor/types.js.map +1 -0
- package/dist/src/capabilities/graph/index.js +19 -0
- package/dist/src/capabilities/graph/index.js.map +1 -0
- package/dist/src/capabilities/graph/inspect.render.js +76 -0
- package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
- package/dist/src/capabilities/graph/inspect.verb.js +53 -0
- package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
- package/dist/src/capabilities/graph/query.render.js +73 -0
- package/dist/src/capabilities/graph/query.render.js.map +1 -0
- package/dist/src/capabilities/graph/query.verb.js +49 -0
- package/dist/src/capabilities/graph/query.verb.js.map +1 -0
- package/dist/src/capabilities/graph/runQuery.js +41 -0
- package/dist/src/capabilities/graph/runQuery.js.map +1 -0
- package/dist/src/capabilities/index.js +56 -0
- package/dist/src/capabilities/index.js.map +1 -0
- package/dist/src/capabilities/info/collectInfo.js +72 -0
- package/dist/src/capabilities/info/collectInfo.js.map +1 -0
- package/dist/src/capabilities/info/index.js +5 -0
- package/dist/src/capabilities/info/index.js.map +1 -0
- package/dist/src/capabilities/info/info.render.js +57 -0
- package/dist/src/capabilities/info/info.render.js.map +1 -0
- package/dist/src/capabilities/info/info.verb.js +42 -0
- package/dist/src/capabilities/info/info.verb.js.map +1 -0
- package/dist/src/capabilities/info/types.js +5 -0
- package/dist/src/capabilities/info/types.js.map +1 -0
- package/dist/src/capabilities/meta/complete.verb.js +43 -0
- package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
- package/dist/src/capabilities/meta/index.js +13 -0
- package/dist/src/capabilities/meta/index.js.map +1 -0
- package/dist/src/capabilities/meta/mcp.verb.js +34 -0
- package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
- package/dist/src/capabilities/ontology/index.js +21 -0
- package/dist/src/capabilities/ontology/index.js.map +1 -0
- package/dist/src/capabilities/ontology/queries.js +123 -0
- package/dist/src/capabilities/ontology/queries.js.map +1 -0
- package/dist/src/capabilities/ontology/render.js +66 -0
- package/dist/src/capabilities/ontology/render.js.map +1 -0
- package/dist/src/capabilities/ontology/verbs.js +181 -0
- package/dist/src/capabilities/ontology/verbs.js.map +1 -0
- package/dist/src/capabilities/prompt/index.js +16 -0
- package/dist/src/capabilities/prompt/index.js.map +1 -0
- package/dist/src/capabilities/prompt/prompt.render.js +78 -0
- package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
- package/dist/src/capabilities/prompt/types.js +10 -0
- package/dist/src/capabilities/prompt/types.js.map +1 -0
- package/dist/src/capabilities/prompt/verbs.js +93 -0
- package/dist/src/capabilities/prompt/verbs.js.map +1 -0
- package/dist/src/capabilities/resources/index.js +10 -0
- package/dist/src/capabilities/resources/index.js.map +1 -0
- package/dist/src/capabilities/resources/provider.js +423 -0
- package/dist/src/capabilities/resources/provider.js.map +1 -0
- package/dist/src/capabilities/setup/buildPlan.js +172 -0
- package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
- package/dist/src/capabilities/setup/index.js +5 -0
- package/dist/src/capabilities/setup/index.js.map +1 -0
- package/dist/src/capabilities/setup/mode.js +53 -0
- package/dist/src/capabilities/setup/mode.js.map +1 -0
- package/dist/src/capabilities/setup/operations/index.js +39 -0
- package/dist/src/capabilities/setup/operations/index.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
- package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
- package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupGenerator.js +390 -0
- package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js +329 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js +253 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupSkills.js +594 -0
- package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
- package/dist/src/capabilities/setup/plan.js +128 -0
- package/dist/src/capabilities/setup/plan.js.map +1 -0
- package/dist/src/capabilities/setup/plan.render.js +271 -0
- package/dist/src/capabilities/setup/plan.render.js.map +1 -0
- package/dist/src/capabilities/setup/setup.render.js +54 -0
- package/dist/src/capabilities/setup/setup.render.js.map +1 -0
- package/dist/src/capabilities/setup/setup.verb.js +387 -0
- package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
- package/dist/src/capabilities/setup/shell.js +196 -0
- package/dist/src/capabilities/setup/shell.js.map +1 -0
- package/dist/src/capabilities/setup/targets.js +328 -0
- package/dist/src/capabilities/setup/targets.js.map +1 -0
- package/dist/src/capabilities/setup/types.js +5 -0
- package/dist/src/capabilities/setup/types.js.map +1 -0
- package/dist/src/capabilities/shared/assertExecOk.js +137 -0
- package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
- package/dist/src/capabilities/shared/index.js +27 -0
- package/dist/src/capabilities/shared/index.js.map +1 -0
- package/dist/src/capabilities/shared/packageManager.js +349 -0
- package/dist/src/capabilities/shared/packageManager.js.map +1 -0
- package/dist/src/capabilities/shared/registry.js +55 -0
- package/dist/src/capabilities/shared/registry.js.map +1 -0
- package/dist/src/capabilities/skill/discover.js +281 -0
- package/dist/src/capabilities/skill/discover.js.map +1 -0
- package/dist/src/capabilities/skill/index.js +10 -0
- package/dist/src/capabilities/skill/index.js.map +1 -0
- package/dist/src/capabilities/skill/render.js +49 -0
- package/dist/src/capabilities/skill/render.js.map +1 -0
- package/dist/src/capabilities/skill/verbs.js +83 -0
- package/dist/src/capabilities/skill/verbs.js.map +1 -0
- package/dist/src/capabilities/sources/collectStatus.js +103 -0
- package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
- package/dist/src/capabilities/sources/index.js +13 -0
- package/dist/src/capabilities/sources/index.js.map +1 -0
- package/dist/src/capabilities/sources/installSkills.js +309 -0
- package/dist/src/capabilities/sources/installSkills.js.map +1 -0
- package/dist/src/capabilities/sources/runUpdate.js +460 -0
- package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
- package/dist/src/capabilities/sources/status.render.js +64 -0
- package/dist/src/capabilities/sources/status.render.js.map +1 -0
- package/dist/src/capabilities/sources/status.verb.js +40 -0
- package/dist/src/capabilities/sources/status.verb.js.map +1 -0
- package/dist/src/capabilities/sources/types.js +6 -0
- package/dist/src/capabilities/sources/types.js.map +1 -0
- package/dist/src/capabilities/sources/update.render.js +34 -0
- package/dist/src/capabilities/sources/update.render.js.map +1 -0
- package/dist/src/capabilities/sources/update.verb.js +55 -0
- package/dist/src/capabilities/sources/update.verb.js.map +1 -0
- package/dist/src/capabilities/upgrade/index.js +5 -0
- package/dist/src/capabilities/upgrade/index.js.map +1 -0
- package/dist/src/capabilities/upgrade/runUpgrade.js +135 -0
- package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
- package/dist/src/capabilities/upgrade/types.js +5 -0
- package/dist/src/capabilities/upgrade/types.js.map +1 -0
- package/dist/src/capabilities/upgrade/upgrade.render.js +52 -0
- package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
- package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
- package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
- package/dist/src/capabilities/version/index.js +10 -0
- package/dist/src/capabilities/version/index.js.map +1 -0
- package/dist/src/capabilities/version/version.verb.js +36 -0
- package/dist/src/capabilities/version/version.verb.js.map +1 -0
- package/dist/src/constants.js +87 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/index.js +12 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/kernel/completion/complete.js +66 -0
- package/dist/src/kernel/completion/complete.js.map +1 -0
- package/dist/src/kernel/completion/emitScripts.js +92 -0
- package/dist/src/kernel/completion/emitScripts.js.map +1 -0
- package/dist/src/kernel/completion/entitySource.js +285 -0
- package/dist/src/kernel/completion/entitySource.js.map +1 -0
- package/dist/src/kernel/completion/index.js +14 -0
- package/dist/src/kernel/completion/index.js.map +1 -0
- package/dist/src/kernel/completion/model.js +301 -0
- package/dist/src/kernel/completion/model.js.map +1 -0
- package/dist/src/kernel/completion/parse.js +253 -0
- package/dist/src/kernel/completion/parse.js.map +1 -0
- package/dist/src/kernel/completion/rank.js +101 -0
- package/dist/src/kernel/completion/rank.js.map +1 -0
- package/dist/src/kernel/completion/resolve.js +100 -0
- package/dist/src/kernel/completion/resolve.js.map +1 -0
- package/dist/src/kernel/completion/templates/bash.js +209 -0
- package/dist/src/kernel/completion/templates/bash.js.map +1 -0
- package/dist/src/kernel/completion/templates/fish.js +214 -0
- package/dist/src/kernel/completion/templates/fish.js.map +1 -0
- package/dist/src/kernel/completion/templates/index.js +23 -0
- package/dist/src/kernel/completion/templates/index.js.map +1 -0
- package/dist/src/kernel/completion/templates/shared.js +98 -0
- package/dist/src/kernel/completion/templates/shared.js.map +1 -0
- package/dist/src/kernel/completion/templates/zsh.js +201 -0
- package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
- package/dist/src/kernel/completion/types.js +13 -0
- package/dist/src/kernel/completion/types.js.map +1 -0
- package/dist/src/kernel/config/defaults.js +17 -0
- package/dist/src/kernel/config/defaults.js.map +1 -0
- package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
- package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
- package/dist/src/kernel/config/findProjectConfig.js +43 -0
- package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
- package/dist/src/kernel/config/firstRun.js +34 -0
- package/dist/src/kernel/config/firstRun.js.map +1 -0
- package/dist/src/kernel/config/globalConfig.js +79 -0
- package/dist/src/kernel/config/globalConfig.js.map +1 -0
- package/dist/src/kernel/config/index.js +16 -0
- package/dist/src/kernel/config/index.js.map +1 -0
- package/dist/src/kernel/config/paths.js +35 -0
- package/dist/src/kernel/config/paths.js.map +1 -0
- package/dist/src/kernel/config/readConfig.js +78 -0
- package/dist/src/kernel/config/readConfig.js.map +1 -0
- package/dist/src/kernel/config/schema.js +130 -0
- package/dist/src/kernel/config/schema.js.map +1 -0
- package/dist/src/kernel/config/types.js +19 -0
- package/dist/src/kernel/config/types.js.map +1 -0
- package/dist/src/kernel/config/writeConfigField.js +59 -0
- package/dist/src/kernel/config/writeConfigField.js.map +1 -0
- package/dist/src/kernel/copy.js +43 -0
- package/dist/src/kernel/copy.js.map +1 -0
- package/dist/src/kernel/error/PragmaError.js +149 -0
- package/dist/src/kernel/error/PragmaError.js.map +1 -0
- package/dist/src/kernel/error/constants.js +40 -0
- package/dist/src/kernel/error/constants.js.map +1 -0
- package/dist/src/kernel/error/fromTaskError.js +96 -0
- package/dist/src/kernel/error/fromTaskError.js.map +1 -0
- package/dist/src/kernel/error/index.js +13 -0
- package/dist/src/kernel/error/index.js.map +1 -0
- package/dist/src/kernel/error/recovery.js +52 -0
- package/dist/src/kernel/error/recovery.js.map +1 -0
- package/dist/src/kernel/error/renderError.js +115 -0
- package/dist/src/kernel/error/renderError.js.map +1 -0
- package/dist/src/kernel/error/serialize.js +25 -0
- package/dist/src/kernel/error/serialize.js.map +1 -0
- package/dist/src/kernel/error/types.js +9 -0
- package/dist/src/kernel/error/types.js.map +1 -0
- package/dist/src/kernel/index.js +34 -0
- package/dist/src/kernel/index.js.map +1 -0
- package/dist/src/kernel/interactivity.js +68 -0
- package/dist/src/kernel/interactivity.js.map +1 -0
- package/dist/src/kernel/packs/collect.js +187 -0
- package/dist/src/kernel/packs/collect.js.map +1 -0
- package/dist/src/kernel/packs/compile.js +304 -0
- package/dist/src/kernel/packs/compile.js.map +1 -0
- package/dist/src/kernel/packs/disclosure.js +76 -0
- package/dist/src/kernel/packs/disclosure.js.map +1 -0
- package/dist/src/kernel/packs/glob.js +38 -0
- package/dist/src/kernel/packs/glob.js.map +1 -0
- package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
- package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
- package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
- package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
- package/dist/src/kernel/packs/graphql/index.js +20 -0
- package/dist/src/kernel/packs/graphql/index.js.map +1 -0
- package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
- package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
- package/dist/src/kernel/packs/index.js +34 -0
- package/dist/src/kernel/packs/index.js.map +1 -0
- package/dist/src/kernel/packs/iri.js +110 -0
- package/dist/src/kernel/packs/iri.js.map +1 -0
- package/dist/src/kernel/packs/renderPack.js +129 -0
- package/dist/src/kernel/packs/renderPack.js.map +1 -0
- package/dist/src/kernel/packs/resolveEntity.js +274 -0
- package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
- package/dist/src/kernel/packs/runBodies.js +140 -0
- package/dist/src/kernel/packs/runBodies.js.map +1 -0
- package/dist/src/kernel/packs/sample.js +56 -0
- package/dist/src/kernel/packs/sample.js.map +1 -0
- package/dist/src/kernel/packs/schema.js +421 -0
- package/dist/src/kernel/packs/schema.js.map +1 -0
- package/dist/src/kernel/packs/sparql/applyFilters.js +167 -0
- package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
- package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
- package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
- package/dist/src/kernel/packs/sparql/buildLookupQuery.js +480 -0
- package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
- package/dist/src/kernel/packs/sparql/escape.js +21 -0
- package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
- package/dist/src/kernel/packs/sparql/index.js +31 -0
- package/dist/src/kernel/packs/sparql/index.js.map +1 -0
- package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
- package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
- package/dist/src/kernel/packs/types.js +30 -0
- package/dist/src/kernel/packs/types.js.map +1 -0
- package/dist/src/kernel/packs/uniqueness.js +30 -0
- package/dist/src/kernel/packs/uniqueness.js.map +1 -0
- package/dist/src/kernel/project/cli/buildProgram.js +263 -0
- package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
- package/dist/src/kernel/project/cli/constants.js +27 -0
- package/dist/src/kernel/project/cli/constants.js.map +1 -0
- package/dist/src/kernel/project/cli/dispatch.js +420 -0
- package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
- package/dist/src/kernel/project/cli/exitCodes.js +66 -0
- package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
- package/dist/src/kernel/project/cli/globalFlags.js +219 -0
- package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
- package/dist/src/kernel/project/cli/helpFormat.js +58 -0
- package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
- package/dist/src/kernel/project/cli/index.js +14 -0
- package/dist/src/kernel/project/cli/index.js.map +1 -0
- package/dist/src/kernel/project/cli/rootHelp.js +227 -0
- package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
- package/dist/src/kernel/project/cli/suggest.js +75 -0
- package/dist/src/kernel/project/cli/suggest.js.map +1 -0
- package/dist/src/kernel/project/cli/suggestNames.js +96 -0
- package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
- package/dist/src/kernel/project/cli/verbHelp.js +131 -0
- package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
- package/dist/src/kernel/project/mcp/buildServer.js +67 -0
- package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
- package/dist/src/kernel/project/mcp/envelope.js +37 -0
- package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
- package/dist/src/kernel/project/mcp/index.js +8 -0
- package/dist/src/kernel/project/mcp/index.js.map +1 -0
- package/dist/src/kernel/project/mcp/instructions.js +44 -0
- package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
- package/dist/src/kernel/project/mcp/mcpError.js +42 -0
- package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
- package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
- package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
- package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
- package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
- package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
- package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
- package/dist/src/kernel/project/mcp/registerVerb.js +315 -0
- package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
- package/dist/src/kernel/project/mcp/serve.js +35 -0
- package/dist/src/kernel/project/mcp/serve.js.map +1 -0
- package/dist/src/kernel/render/compactUri.js +24 -0
- package/dist/src/kernel/render/compactUri.js.map +1 -0
- package/dist/src/kernel/render/contracts.js +10 -0
- package/dist/src/kernel/render/contracts.js.map +1 -0
- package/dist/src/kernel/render/disclosure.js +34 -0
- package/dist/src/kernel/render/disclosure.js.map +1 -0
- package/dist/src/kernel/render/envelope.js +30 -0
- package/dist/src/kernel/render/envelope.js.map +1 -0
- package/dist/src/kernel/render/formatters.js +27 -0
- package/dist/src/kernel/render/formatters.js.map +1 -0
- package/dist/src/kernel/render/index.js +15 -0
- package/dist/src/kernel/render/index.js.map +1 -0
- package/dist/src/kernel/render/prefixes.js +46 -0
- package/dist/src/kernel/render/prefixes.js.map +1 -0
- package/dist/src/kernel/render/renderers.js +468 -0
- package/dist/src/kernel/render/renderers.js.map +1 -0
- package/dist/src/kernel/render/style.js +105 -0
- package/dist/src/kernel/render/style.js.map +1 -0
- package/dist/src/kernel/render/turtle.js +194 -0
- package/dist/src/kernel/render/turtle.js.map +1 -0
- package/dist/src/kernel/render/vocabulary.js +174 -0
- package/dist/src/kernel/render/vocabulary.js.map +1 -0
- package/dist/src/kernel/render/writeStdout.js +43 -0
- package/dist/src/kernel/render/writeStdout.js.map +1 -0
- package/dist/src/kernel/runtime/boot.js +49 -0
- package/dist/src/kernel/runtime/boot.js.map +1 -0
- package/dist/src/kernel/runtime/facade.js +39 -0
- package/dist/src/kernel/runtime/facade.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/build.js +122 -0
- package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
- package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
- package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
- package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/index.js +11 -0
- package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
- package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/read.js +92 -0
- package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
- package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
- package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/types.js +55 -0
- package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
- package/dist/src/kernel/runtime/index.js +8 -0
- package/dist/src/kernel/runtime/index.js.map +1 -0
- package/dist/src/kernel/runtime/loadSession.js +34 -0
- package/dist/src/kernel/runtime/loadSession.js.map +1 -0
- package/dist/src/kernel/runtime/paths.js +78 -0
- package/dist/src/kernel/runtime/paths.js.map +1 -0
- package/dist/src/kernel/runtime/probe.js +37 -0
- package/dist/src/kernel/runtime/probe.js.map +1 -0
- package/dist/src/kernel/runtime/readEntity.js +363 -0
- package/dist/src/kernel/runtime/readEntity.js.map +1 -0
- package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
- package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
- package/dist/src/kernel/runtime/refs/index.js +29 -0
- package/dist/src/kernel/runtime/refs/index.js.map +1 -0
- package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
- package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
- package/dist/src/kernel/runtime/refs/resolve.js +332 -0
- package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
- package/dist/src/kernel/runtime/resolveSources.js +62 -0
- package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
- package/dist/src/kernel/runtime/store.js +75 -0
- package/dist/src/kernel/runtime/store.js.map +1 -0
- package/dist/src/kernel/runtime/storeReadiness.js +51 -0
- package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
- package/dist/src/kernel/runtime/types.js +11 -0
- package/dist/src/kernel/runtime/types.js.map +1 -0
- package/dist/src/kernel/spec/asVerb.js +21 -0
- package/dist/src/kernel/spec/asVerb.js.map +1 -0
- package/dist/src/kernel/spec/emitReference.js +578 -0
- package/dist/src/kernel/spec/emitReference.js.map +1 -0
- package/dist/src/kernel/spec/emitSurface.js +202 -0
- package/dist/src/kernel/spec/emitSurface.js.map +1 -0
- package/dist/src/kernel/spec/index.js +11 -0
- package/dist/src/kernel/spec/index.js.map +1 -0
- package/dist/src/kernel/spec/surfaceConformance.js +103 -0
- package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
- package/dist/src/kernel/spec/types.js +14 -0
- package/dist/src/kernel/spec/types.js.map +1 -0
- package/dist/src/kernel/spec/validate.js +110 -0
- package/dist/src/kernel/spec/validate.js.map +1 -0
- package/dist/src/kernel/vocabulary.js +97 -0
- package/dist/src/kernel/vocabulary.js.map +1 -0
- package/dist/src/types.js +11 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +22 -23
- package/pragma.conf.ts +486 -90
- package/src/bin.ts +274 -82
- package/src/capabilities/block.parity.test.ts +29 -12
- package/src/capabilities/block.shipped.exec.test.ts +282 -0
- package/src/capabilities/block.tierRank.exec.test.ts +300 -0
- package/src/capabilities/capabilities/capabilities.render.ts +1 -1
- package/src/capabilities/capabilities/capabilities.verb.ts +1 -1
- package/src/capabilities/capabilities/catalog.ts +3 -3
- package/src/capabilities/capabilities/hints.ts +32 -7
- package/src/capabilities/capabilities/index.ts +1 -1
- package/src/capabilities/colophon/collectColophon.ts +35 -24
- package/src/capabilities/colophon/colophon.render.ts +24 -1
- package/src/capabilities/colophon/colophon.test.ts +42 -21
- package/src/capabilities/colophon/colophon.verb.ts +4 -4
- package/src/capabilities/config/collectConfigShow.test.ts +1 -0
- package/src/capabilities/config/collectConfigShow.ts +3 -3
- package/src/capabilities/config/field.render.ts +4 -5
- package/src/capabilities/config/fields.ts +17 -10
- package/src/capabilities/config/get.verb.ts +70 -0
- package/src/capabilities/config/getUnset.test.ts +264 -0
- package/src/capabilities/config/index.ts +5 -1
- package/src/capabilities/config/runField.ts +40 -22
- package/src/capabilities/config/runGet.ts +34 -0
- package/src/capabilities/config/runSet.ts +35 -9
- package/src/capabilities/config/set.test.ts +48 -14
- package/src/capabilities/config/set.verb.ts +8 -7
- package/src/capabilities/config/show.render.ts +1 -1
- package/src/capabilities/config/show.verb.ts +9 -6
- package/src/capabilities/config/types.ts +18 -4
- package/src/capabilities/config/unset.verb.ts +58 -0
- package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
- package/src/capabilities/create/byteEquality.test.ts +25 -11
- package/src/capabilities/create/cliProjection.ts +227 -0
- package/src/capabilities/create/constants.ts +36 -61
- package/src/capabilities/create/create.mcp.test.ts +89 -5
- package/src/capabilities/create/create.render.ts +71 -7
- package/src/capabilities/create/create.test.ts +433 -219
- package/src/capabilities/create/create.verb.ts +297 -328
- package/src/capabilities/create/createGrammar.test.ts +865 -0
- package/src/capabilities/create/createHelp.ts +71 -0
- package/src/capabilities/create/createSurface.generated.ts +400 -0
- package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
- package/src/capabilities/create/cwdJail.test.ts +24 -5
- package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
- package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
- package/src/capabilities/create/index.ts +7 -4
- package/src/capabilities/create/messages.ts +18 -0
- package/src/capabilities/create/mount.ts +391 -0
- package/src/capabilities/create/pathJail.test.ts +90 -0
- package/src/capabilities/create/pathJail.ts +8 -5
- package/src/capabilities/create/pickGenerator.ts +23 -35
- package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
- package/src/capabilities/create/types.ts +20 -0
- package/src/capabilities/distribution.parity.test.ts +4 -0
- package/src/capabilities/distribution.test.ts +3 -1
- package/src/capabilities/distribution.ts +10 -15
- package/src/capabilities/doctor/checks/checkKeStore.ts +7 -5
- package/src/capabilities/doctor/checks/checkPackageRefs.ts +75 -8
- package/src/capabilities/doctor/checks/checkPragmaVersion.ts +2 -2
- package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +76 -29
- package/src/capabilities/doctor/checks/checkShellCompletions.ts +63 -17
- package/src/capabilities/doctor/checks/harnessInventory.test.ts +219 -0
- package/src/capabilities/doctor/checks/harnessInventory.ts +298 -0
- package/src/capabilities/doctor/checks/index.ts +27 -0
- package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
- package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
- package/src/capabilities/doctor/checks/targetHealth.ts +444 -0
- package/src/capabilities/doctor/doctor.render.test.ts +125 -38
- package/src/capabilities/doctor/doctor.render.ts +74 -74
- package/src/capabilities/doctor/doctor.test.ts +338 -37
- package/src/capabilities/doctor/doctor.verb.ts +8 -3
- package/src/capabilities/doctor/runChecks.ts +65 -63
- package/src/capabilities/doctor/types.ts +22 -15
- package/src/capabilities/emptyRecovery.test.ts +21 -8
- package/src/capabilities/graph/examples.exec.test.ts +107 -0
- package/src/capabilities/graph/index.ts +1 -1
- package/src/capabilities/graph/inspect.render.ts +70 -22
- package/src/capabilities/graph/inspect.test.ts +260 -5
- package/src/capabilities/graph/inspect.verb.ts +18 -6
- package/src/capabilities/graph/query.render.ts +15 -3
- package/src/capabilities/graph/query.verb.ts +3 -3
- package/src/capabilities/graph/runQuery.ts +2 -3
- package/src/capabilities/index.ts +3 -1
- package/src/capabilities/info/collectInfo.ts +13 -5
- package/src/capabilities/info/info.render.ts +7 -3
- package/src/capabilities/info/info.test.ts +37 -1
- package/src/capabilities/info/info.verb.ts +1 -1
- package/src/capabilities/info/types.ts +10 -2
- package/src/capabilities/lazy.test.ts +32 -0
- package/src/capabilities/meta/complete.verb.ts +1 -1
- package/src/capabilities/meta/index.ts +1 -1
- package/src/capabilities/meta/mcp.verb.ts +10 -8
- package/src/capabilities/ontology/index.ts +15 -11
- package/src/capabilities/ontology/ontology.test.ts +6 -55
- package/src/capabilities/ontology/queries.ts +2 -2
- package/src/capabilities/ontology/render.ts +3 -4
- package/src/capabilities/ontology/verbs.ts +27 -68
- package/src/capabilities/prompt/index.ts +2 -2
- package/src/capabilities/prompt/prompt.render.ts +6 -2
- package/src/capabilities/prompt/types.ts +1 -1
- package/src/capabilities/prompt/verbs.ts +4 -5
- package/src/capabilities/reference.test.ts +63 -0
- package/src/capabilities/renderVocabularySync.test.ts +82 -0
- package/src/capabilities/resources/provider.ts +342 -85
- package/src/capabilities/resources/resources.test.ts +355 -59
- package/src/capabilities/scopeTypeSync.test.ts +29 -15
- package/src/capabilities/setup/buildPlan.ts +240 -0
- package/src/capabilities/setup/index.ts +7 -7
- package/src/capabilities/setup/mode.ts +74 -0
- package/src/capabilities/setup/operations/index.ts +79 -0
- package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
- package/src/capabilities/setup/operations/setupConfig.ts +124 -0
- package/src/capabilities/setup/operations/setupGenerator.ts +478 -334
- package/src/capabilities/setup/operations/setupLsp.ts +420 -67
- package/src/capabilities/setup/operations/setupMcp.ts +238 -127
- package/src/capabilities/setup/operations/setupSkills.ts +667 -105
- package/src/capabilities/setup/plan.render.ts +336 -0
- package/src/capabilities/setup/plan.ts +241 -0
- package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
- package/src/capabilities/setup/setup.render.test.ts +297 -75
- package/src/capabilities/setup/setup.render.ts +45 -77
- package/src/capabilities/setup/setup.test.ts +1819 -225
- package/src/capabilities/setup/setup.verb.ts +288 -78
- package/src/capabilities/setup/shell.test.ts +86 -0
- package/src/capabilities/setup/shell.ts +137 -11
- package/src/capabilities/setup/targets.ts +435 -0
- package/src/capabilities/setup/types.ts +23 -70
- package/src/capabilities/shared/assertExecOk.ts +68 -10
- package/src/capabilities/shared/index.ts +43 -0
- package/src/capabilities/shared/packageManager.test.ts +470 -0
- package/src/capabilities/shared/packageManager.ts +425 -34
- package/src/capabilities/skill/bundledSkills.test.ts +347 -0
- package/src/capabilities/skill/discover.ts +131 -10
- package/src/capabilities/skill/index.ts +1 -1
- package/src/capabilities/skill/render.ts +10 -9
- package/src/capabilities/skill/skill.test.ts +22 -7
- package/src/capabilities/skill/verbs.ts +3 -4
- package/src/capabilities/sources/collectStatus.ts +7 -2
- package/src/capabilities/sources/index.ts +1 -1
- package/src/capabilities/sources/installSkills.ts +265 -10
- package/src/capabilities/sources/runUpdate.ts +131 -23
- package/src/capabilities/sources/sources.test.ts +382 -2
- package/src/capabilities/sources/status.render.ts +1 -1
- package/src/capabilities/sources/status.verb.ts +1 -1
- package/src/capabilities/sources/update.render.ts +1 -1
- package/src/capabilities/sources/update.verb.ts +4 -4
- package/src/capabilities/surface.test.ts +136 -19
- package/src/capabilities/upgrade/runUpgrade.ts +53 -14
- package/src/capabilities/upgrade/types.ts +10 -2
- package/src/capabilities/upgrade/upgrade.render.ts +13 -7
- package/src/capabilities/upgrade/upgrade.test.ts +75 -3
- package/src/capabilities/upgrade/upgrade.verb.ts +1 -1
- package/src/capabilities/version/index.ts +12 -0
- package/src/capabilities/version/version.test.ts +66 -0
- package/src/capabilities/version/version.verb.ts +39 -0
- package/src/constants.ts +36 -1
- package/src/identity.test.ts +57 -29
- package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +15 -13
- package/src/kernel/completion/complete.test.ts +12 -2
- package/src/kernel/completion/complete.ts +1 -1
- package/src/kernel/completion/emitScripts.ts +1 -1
- package/src/kernel/completion/entitySource.test.ts +16 -3
- package/src/kernel/completion/entitySource.ts +21 -8
- package/src/kernel/completion/model.test.ts +164 -12
- package/src/kernel/completion/model.ts +94 -14
- package/src/kernel/completion/parse.test.ts +4 -7
- package/src/kernel/completion/parse.ts +15 -0
- package/src/kernel/completion/resolve.test.ts +0 -1
- package/src/kernel/completion/safety.test.ts +50 -35
- package/src/kernel/completion/shellDrive.test.ts +28 -9
- package/src/kernel/completion/templates/bash.ts +7 -2
- package/src/kernel/completion/templates/index.ts +23 -0
- package/src/kernel/completion/types.ts +7 -0
- package/src/kernel/config/defaults.test.ts +27 -3
- package/src/kernel/config/defaults.ts +4 -3
- package/src/kernel/config/evaluateProjectConfig.ts +31 -8
- package/src/kernel/config/firstRun.test.ts +44 -38
- package/src/kernel/config/firstRun.ts +24 -88
- package/src/kernel/config/index.ts +1 -1
- package/src/kernel/config/readConfig.test.ts +6 -3
- package/src/kernel/config/readConfig.ts +1 -1
- package/src/kernel/config/schema.ts +3 -1
- package/src/kernel/config/types.ts +3 -1
- package/src/kernel/copy.test.ts +34 -4
- package/src/kernel/copy.ts +54 -0
- package/src/kernel/error/PragmaError.test.ts +5 -2
- package/src/kernel/error/PragmaError.ts +4 -2
- package/src/kernel/error/constants.ts +7 -5
- package/src/kernel/error/fromTaskError.ts +28 -6
- package/src/kernel/error/recovery.ts +14 -0
- package/src/kernel/error/renderError.ts +42 -1
- package/src/kernel/error/types.ts +21 -1
- package/src/kernel/index.ts +35 -0
- package/src/kernel/interactivity.test.ts +76 -0
- package/src/kernel/interactivity.ts +69 -0
- package/src/kernel/packs/collect.ts +12 -16
- package/src/kernel/packs/compile.test.ts +222 -1
- package/src/kernel/packs/compile.ts +93 -3
- package/src/kernel/packs/disclosure.ts +2 -2
- package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
- package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +3 -4
- package/src/kernel/packs/graphql/index.ts +20 -0
- package/src/kernel/packs/index.ts +40 -0
- package/src/kernel/packs/iri.test.ts +73 -0
- package/src/kernel/packs/iri.ts +66 -14
- package/src/kernel/packs/renderPack.ts +25 -6
- package/src/kernel/packs/resolveEntity.test.ts +274 -0
- package/src/kernel/packs/resolveEntity.ts +200 -42
- package/src/kernel/packs/runBodies.ts +86 -22
- package/src/kernel/packs/sample.ts +1 -1
- package/src/kernel/packs/schema.ts +78 -5
- package/src/kernel/packs/sparql/applyFilters.ts +136 -16
- package/src/kernel/packs/sparql/buildLookupQuery.test.ts +290 -0
- package/src/kernel/packs/sparql/buildLookupQuery.ts +367 -17
- package/src/kernel/packs/sparql/index.ts +37 -0
- package/src/kernel/packs/sparql/runSelect.test.ts +1 -1
- package/src/kernel/packs/sparql/runSelect.ts +3 -4
- package/src/kernel/packs/toolDescription.test.ts +77 -4
- package/src/kernel/packs/types.ts +136 -0
- package/src/kernel/packs/uniqueness.ts +1 -1
- package/src/kernel/project/cli/buildProgram.test.ts +218 -12
- package/src/kernel/project/cli/buildProgram.ts +84 -18
- package/src/kernel/project/cli/constants.ts +34 -0
- package/src/kernel/project/cli/dispatch.test.ts +160 -2
- package/src/kernel/project/cli/dispatch.ts +226 -45
- package/src/kernel/project/cli/exitCodes.ts +1 -1
- package/src/kernel/project/cli/globalFlags.test.ts +117 -1
- package/src/kernel/project/cli/globalFlags.ts +134 -31
- package/src/kernel/project/cli/helpFormat.ts +14 -2
- package/src/kernel/project/cli/rootHelp.ts +74 -12
- package/src/kernel/project/cli/suggest.test.ts +33 -1
- package/src/kernel/project/cli/suggest.ts +25 -1
- package/src/kernel/project/cli/verbHelp.test.ts +30 -0
- package/src/kernel/project/cli/verbHelp.ts +23 -7
- package/src/kernel/project/mcp/buildServer.ts +7 -4
- package/src/kernel/project/mcp/envelope.ts +2 -2
- package/src/kernel/project/mcp/instructions.ts +2 -2
- package/src/kernel/project/mcp/mcpError.ts +1 -1
- package/src/kernel/project/mcp/parity.test.ts +5 -2
- package/src/kernel/project/mcp/prompts/index.ts +37 -0
- package/src/kernel/project/mcp/prompts/source.ts +2 -2
- package/src/kernel/project/mcp/registerVerb.ts +55 -10
- package/src/kernel/project/mcp/serve.ts +2 -2
- package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
- package/src/kernel/render/contracts.ts +21 -0
- package/src/kernel/render/envelope.ts +2 -3
- package/src/kernel/render/formatters.ts +1 -1
- package/src/kernel/render/renderers.test.ts +243 -6
- package/src/kernel/render/renderers.ts +222 -20
- package/src/kernel/render/style.test.ts +75 -24
- package/src/kernel/render/style.ts +59 -6
- package/src/kernel/render/turtle.ts +222 -0
- package/src/kernel/render/vocabulary.ts +276 -0
- package/src/kernel/runtime/graphpack/buildIndex.ts +1 -1
- package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +3 -3
- package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +1 -1
- package/src/kernel/runtime/graphpack/embedded.ts +3 -3
- package/src/kernel/runtime/graphpack/manifest.ts +1 -1
- package/src/kernel/runtime/graphpack/read.ts +1 -2
- package/src/kernel/runtime/loadSession.ts +1 -1
- package/src/kernel/runtime/probe.ts +6 -6
- package/src/kernel/runtime/readEntity.ts +472 -28
- package/src/kernel/runtime/refs/index.ts +39 -0
- package/src/kernel/runtime/refs/parseRef.ts +2 -2
- package/src/kernel/runtime/refs/resolve.ts +4 -4
- package/src/kernel/runtime/storeReadiness.ts +1 -2
- package/src/kernel/runtime/types.ts +15 -1
- package/src/kernel/runtime/wasmEmbed.test.ts +37 -39
- package/src/kernel/spec/emitReference.ts +105 -30
- package/src/kernel/spec/emitSurface.ts +48 -6
- package/src/kernel/spec/surfaceConformance.test.ts +4 -2
- package/src/kernel/spec/types.ts +277 -4
- package/src/testing/PARITY_GAPS.ts +9 -3
- package/src/testing/behavioral/docExamples.test.ts +16 -0
- package/src/testing/behavioral/errorMatrix.mcp.test.ts +112 -9
- package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
- package/src/testing/behavioral/journeys.cli.test.ts +1 -1
- package/src/testing/behavioral/journeys.defaultPack.test.ts +7 -7
- package/src/testing/behavioral/journeys.firstInstall.test.ts +7 -2
- package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
- package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
- package/src/testing/behavioral/journeys.packageStories.test.ts +10 -7
- package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
- package/src/testing/behavioral/mcpSurface.test.ts +1 -1
- package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
- package/src/testing/eval/__snapshots__/eval.test.ts.snap +26 -1
- package/src/testing/eval/cases/effectful.ts +3 -2
- package/src/testing/eval/cases/readNouns.ts +245 -9
- package/src/testing/fixtures/blockGraph.ts +104 -10
- package/src/testing/fixtures/graph/canonical.ts +182 -13
- package/src/testing/fixtures/graph/defaultPack.ts +1 -1
- package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
- package/src/testing/helpers/projectMcp.ts +32 -6
- package/src/testing/helpers/runCli.ts +35 -18
- package/src/testing/perf/budgets.test.ts +20 -9
- package/src/testing/perf/budgets.ts +58 -9
- package/src/testing/perf/codegen.test.ts +126 -0
- package/src/testing/perf/globalSetup.test.ts +286 -0
- package/src/testing/perf/globalSetup.ts +505 -23
- package/src/testing/perf/measure.test.ts +38 -0
- package/src/testing/perf/measure.ts +23 -4
- package/src/testing/setupXdgIsolation.ts +81 -21
- package/src/testing/tempRoot.globalSetup.ts +122 -0
- package/dist/pragma +0 -0
- package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -189
- package/src/capabilities/create/templates.embedded.generated.ts +0 -28
- package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -42
- package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
- package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -68
- package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -61
- package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
- package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
- package/src/capabilities/shared/bands.ts +0 -16
- package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
runComplete,
|
|
9
9
|
} from "../../../kernel/completion/index.js";
|
|
10
10
|
import { capabilities } from "../../index.js";
|
|
11
|
-
import {
|
|
11
|
+
import type { CompletionsDetection } from "../../setup/operations/index.js";
|
|
12
12
|
import { activationHint, type ShellId } from "../../setup/shell.js";
|
|
13
13
|
import type { CheckResult } from "../types.js";
|
|
14
14
|
|
|
@@ -97,14 +97,26 @@ async function completeProbe(cwd: string): Promise<number> {
|
|
|
97
97
|
* 3. For zsh, `~/.zfunc` is on `$fpath` — the activation step setup can only
|
|
98
98
|
* hint. Installed-but-unwired reports a distinct remedy.
|
|
99
99
|
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
100
|
+
* Fault tiers: a broken resolver, a stale installed script, or an unwired zsh
|
|
101
|
+
* install are `fail` — something that exists does not work. A script that was
|
|
102
|
+
* never installed is `available`: completions are opt-in and a fresh install
|
|
103
|
+
* is healthy without them.
|
|
104
|
+
*
|
|
105
|
+
* The detection is passed IN rather than re-read: the `completions` target
|
|
106
|
+
* detects once per invocation and both the setup plan and this row read that
|
|
107
|
+
* one answer, so the two surfaces cannot describe different files.
|
|
108
|
+
*
|
|
109
|
+
* @param cwd - The project directory (the resolver's entity seam).
|
|
110
|
+
* @param d - The `completions` target's detection for this invocation.
|
|
111
|
+
* @returns A CheckResult: pass (up to date + wired + answering), available
|
|
112
|
+
* (never installed, with the setup remedy), fail (with the attributable
|
|
113
|
+
* remedy), or skip (shell undetected).
|
|
114
|
+
* @note Impure — reads the install path, `.zshrc`, and drives the resolver.
|
|
106
115
|
*/
|
|
107
|
-
export async function checkShellCompletions(
|
|
116
|
+
export async function checkShellCompletions(
|
|
117
|
+
cwd: string,
|
|
118
|
+
d: CompletionsDetection,
|
|
119
|
+
): Promise<CheckResult> {
|
|
108
120
|
// 1. Effect test: the resolver the scripts delegate to must actually answer.
|
|
109
121
|
let candidates: number;
|
|
110
122
|
try {
|
|
@@ -114,7 +126,7 @@ export async function checkShellCompletions(cwd: string): Promise<CheckResult> {
|
|
|
114
126
|
return {
|
|
115
127
|
name: NAME,
|
|
116
128
|
status: "fail",
|
|
117
|
-
detail:
|
|
129
|
+
detail: `${BIN_NAME} cannot answer \`<TAB>\`: ${reason}`,
|
|
118
130
|
remedy: `Report this as a bug — \`${BIN_NAME} __complete\` should never throw.`,
|
|
119
131
|
};
|
|
120
132
|
}
|
|
@@ -122,25 +134,59 @@ export async function checkShellCompletions(cwd: string): Promise<CheckResult> {
|
|
|
122
134
|
return {
|
|
123
135
|
name: NAME,
|
|
124
136
|
status: "fail",
|
|
125
|
-
detail:
|
|
137
|
+
detail: `${BIN_NAME} answered \`<TAB>\` with nothing to complete`,
|
|
126
138
|
remedy: "Report this as a bug — the noun context is always non-empty.",
|
|
127
139
|
};
|
|
128
140
|
}
|
|
129
141
|
|
|
130
|
-
// 2. The
|
|
131
|
-
|
|
142
|
+
// 2. The check is about the shell the user is IN. Reporting on the login
|
|
143
|
+
// shell instead is what let this row print a green check for a shell the
|
|
144
|
+
// user never opens while the one they live in had nothing installed.
|
|
145
|
+
const { shell, path, state } = d;
|
|
146
|
+
if (d.detection.kind === "ambiguous") {
|
|
147
|
+
return {
|
|
148
|
+
name: NAME,
|
|
149
|
+
status: "skip",
|
|
150
|
+
detail: `${BIN_NAME} answers \`<TAB>\`, but the running shell cannot be identified — SHELL names ${d.detection.login}, which is your login shell`,
|
|
151
|
+
remedy: `Run \`${INSTALL_REMEDY}\` from the shell you want completions in.`,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
132
154
|
if (shell === null || path === null) {
|
|
133
155
|
return {
|
|
134
156
|
name: NAME,
|
|
135
157
|
status: "skip",
|
|
136
|
-
detail:
|
|
158
|
+
detail: `${BIN_NAME} answers \`<TAB>\`, but no bash, zsh, or fish was found in this process tree`,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
// The installed script delegates every name context to the binary. A script
|
|
162
|
+
// that cannot reach it is inert, and reporting it as current is the same
|
|
163
|
+
// false green this row already told once.
|
|
164
|
+
//
|
|
165
|
+
// This gate runs BEFORE the install probe, so it says only what it has
|
|
166
|
+
// verified: that the binary does not resolve. Claiming "script installed" here
|
|
167
|
+
// told a user running this CLI by absolute path that a script they had never
|
|
168
|
+
// installed was broken — an invented file, in the row whose whole job is to
|
|
169
|
+
// report the real one. Nothing installed is still the opt-in `available` tier.
|
|
170
|
+
if (!d.binOnPath) {
|
|
171
|
+
const installed = state !== "absent";
|
|
172
|
+
return {
|
|
173
|
+
name: NAME,
|
|
174
|
+
status: installed ? "fail" : "available",
|
|
175
|
+
detail: installed
|
|
176
|
+
? `${shell} script installed, but \`${BIN_NAME}\` is not on PATH — the script cannot run it`
|
|
177
|
+
: `${BIN_NAME} answers \`<TAB>\`, but is not on PATH — an installed script cannot run it`,
|
|
178
|
+
remedy: `Put \`${BIN_NAME}\` on your PATH.`,
|
|
137
179
|
};
|
|
138
180
|
}
|
|
139
181
|
if (state === "absent") {
|
|
182
|
+
// Never installed is `available`, not a fault: completions are opt-in and
|
|
183
|
+
// a fresh install is healthy without them. An INSTALLED script that is
|
|
184
|
+
// out of date or unwired (below) is the real failure — something the user
|
|
185
|
+
// set up no longer works.
|
|
140
186
|
return {
|
|
141
187
|
name: NAME,
|
|
142
|
-
status: "
|
|
143
|
-
detail:
|
|
188
|
+
status: "available",
|
|
189
|
+
detail: `${BIN_NAME} answers \`<TAB>\`; the ${shell} script is not installed`,
|
|
144
190
|
remedy: INSTALL_REMEDY,
|
|
145
191
|
};
|
|
146
192
|
}
|
|
@@ -148,7 +194,7 @@ export async function checkShellCompletions(cwd: string): Promise<CheckResult> {
|
|
|
148
194
|
return {
|
|
149
195
|
name: NAME,
|
|
150
196
|
status: "fail",
|
|
151
|
-
detail:
|
|
197
|
+
detail: `${BIN_NAME} answers \`<TAB>\`; the ${shell} script at ${path} is out of date`,
|
|
152
198
|
remedy: INSTALL_REMEDY,
|
|
153
199
|
};
|
|
154
200
|
}
|
|
@@ -166,6 +212,6 @@ export async function checkShellCompletions(cwd: string): Promise<CheckResult> {
|
|
|
166
212
|
return {
|
|
167
213
|
name: NAME,
|
|
168
214
|
status: "pass",
|
|
169
|
-
detail: `${shell} up to date and
|
|
215
|
+
detail: `${shell} (the shell you are in) — installed, up to date, and completing ${candidates} commands`,
|
|
170
216
|
};
|
|
171
217
|
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The harness inventory roll-up — the pure half, driven by fixtures.
|
|
3
|
+
*
|
|
4
|
+
* `doctor.test.ts` covers the wiring (both scopes, `--verbose`, the real
|
|
5
|
+
* registry). What is unit-tested here is the classification itself: the
|
|
6
|
+
* registry supplies the universe so the NEGATIVE is representable, the groups
|
|
7
|
+
* supply the state, and no combination of the two may ever produce a `fail`.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { describe, expect, it } from "vitest";
|
|
11
|
+
import {
|
|
12
|
+
harnessInventory,
|
|
13
|
+
type InventoryGroup,
|
|
14
|
+
type InventoryHarness,
|
|
15
|
+
type InventoryMember,
|
|
16
|
+
type InventoryRow,
|
|
17
|
+
inventoryHealth,
|
|
18
|
+
inventoryItems,
|
|
19
|
+
isDetectedState,
|
|
20
|
+
type WriteState,
|
|
21
|
+
} from "./harnessInventory.js";
|
|
22
|
+
|
|
23
|
+
const REGISTRY: InventoryHarness[] = [
|
|
24
|
+
{ id: "claude-code", name: "Claude Code", inScope: true },
|
|
25
|
+
{ id: "cursor", name: "Cursor", inScope: true },
|
|
26
|
+
{ id: "vscode", name: "VS Code", inScope: false },
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
/** One harness's share of a file — its OWN write's state, never the file's. */
|
|
30
|
+
const named = (name: string, state: WriteState): InventoryMember => ({
|
|
31
|
+
name,
|
|
32
|
+
state,
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const roll = (groups: InventoryGroup[]): InventoryRow[] =>
|
|
36
|
+
harnessInventory(REGISTRY, groups, "global");
|
|
37
|
+
|
|
38
|
+
describe("harnessInventory — the roll-up", () => {
|
|
39
|
+
it("classifies each registry harness against the scope's groups", () => {
|
|
40
|
+
const rows = roll([
|
|
41
|
+
{
|
|
42
|
+
path: "~/.claude.json",
|
|
43
|
+
harnesses: [named("Claude Code", "registered")],
|
|
44
|
+
},
|
|
45
|
+
{ path: "~/.cursor/mcp.json", harnesses: [named("Cursor", "absent")] },
|
|
46
|
+
]);
|
|
47
|
+
|
|
48
|
+
expect(rows.map((r) => `${r.harnessId}:${r.state}`)).toEqual([
|
|
49
|
+
"claude-code:registered",
|
|
50
|
+
"cursor:detected",
|
|
51
|
+
// Not detected AND has no location in this scope at all — the two are
|
|
52
|
+
// different facts and the row says which one applies.
|
|
53
|
+
"vscode:unscoped",
|
|
54
|
+
]);
|
|
55
|
+
expect(rows[0]?.locations).toEqual(["~/.claude.json"]);
|
|
56
|
+
expect(rows[2]?.locations).toEqual([]);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("keeps 'undetected' and 'unscoped' apart", () => {
|
|
60
|
+
// Same absence, two different reasons: Cursor could be here and is not,
|
|
61
|
+
// VS Code could never be here at all.
|
|
62
|
+
const rows = roll([]);
|
|
63
|
+
expect(rows.find((r) => r.harnessId === "cursor")?.state).toBe(
|
|
64
|
+
"undetected",
|
|
65
|
+
);
|
|
66
|
+
expect(rows.find((r) => r.harnessId === "vscode")?.state).toBe("unscoped");
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("reports a drifted group as drifted, not as registered", () => {
|
|
70
|
+
const rows = roll([
|
|
71
|
+
{ path: "~/.claude.json", harnesses: [named("Claude Code", "drifted")] },
|
|
72
|
+
]);
|
|
73
|
+
expect(rows[0]?.state).toBe("drifted");
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("a harness sharing two files is registered only when BOTH carry the entry", () => {
|
|
77
|
+
const both = harnessInventory(
|
|
78
|
+
REGISTRY,
|
|
79
|
+
[
|
|
80
|
+
{ path: "a.json", harnesses: [named("Cursor", "registered")] },
|
|
81
|
+
{ path: "b.json", harnesses: [named("Cursor", "registered")] },
|
|
82
|
+
],
|
|
83
|
+
"global",
|
|
84
|
+
);
|
|
85
|
+
expect(both[1]?.state).toBe("registered");
|
|
86
|
+
expect(both[1]?.locations).toEqual(["a.json", "b.json"]);
|
|
87
|
+
|
|
88
|
+
const mixed = harnessInventory(
|
|
89
|
+
REGISTRY,
|
|
90
|
+
[
|
|
91
|
+
{ path: "a.json", harnesses: [named("Cursor", "registered")] },
|
|
92
|
+
{ path: "b.json", harnesses: [named("Cursor", "absent")] },
|
|
93
|
+
],
|
|
94
|
+
"global",
|
|
95
|
+
);
|
|
96
|
+
expect(mixed[1]?.state).toBe("drifted");
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("gives each harness sharing ONE file its own state, not the file's", () => {
|
|
100
|
+
// The co-detection case, and the reason a group carries per-harness state:
|
|
101
|
+
// `.vscode/mcp.json` holds VS Code's `servers` and Cline's `mcpServers` as
|
|
102
|
+
// two independent entries. Register pragma for VS Code alone and the FILE
|
|
103
|
+
// classifies as drifted — one key current, one absent — but neither
|
|
104
|
+
// harness is drifted: VS Code is registered and Cline is merely detected.
|
|
105
|
+
// A fixture with one harness per file cannot see this.
|
|
106
|
+
const shared: InventoryHarness[] = [
|
|
107
|
+
{ id: "cline", name: "Cline", inScope: true },
|
|
108
|
+
{ id: "vscode", name: "VS Code", inScope: true },
|
|
109
|
+
];
|
|
110
|
+
const rows = harnessInventory(
|
|
111
|
+
shared,
|
|
112
|
+
[
|
|
113
|
+
{
|
|
114
|
+
path: ".vscode/mcp.json",
|
|
115
|
+
harnesses: [named("Cline", "absent"), named("VS Code", "registered")],
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
"project",
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
expect(rows.map((r) => `${r.harnessId}:${r.state}`)).toEqual([
|
|
122
|
+
"cline:detected",
|
|
123
|
+
"vscode:registered",
|
|
124
|
+
]);
|
|
125
|
+
// Both are located in the same file — the sharing itself is unchanged.
|
|
126
|
+
for (const row of rows) expect(row.locations).toEqual([".vscode/mcp.json"]);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it("ignores a group naming a harness the registry does not know", () => {
|
|
130
|
+
// The inventory reports on the REGISTRY; a group is evidence, not a source
|
|
131
|
+
// of rows, so an unknown name adds nothing rather than inventing an entry.
|
|
132
|
+
const rows = roll([
|
|
133
|
+
{ path: "x.json", harnesses: [named("Ghost Editor", "registered")] },
|
|
134
|
+
]);
|
|
135
|
+
expect(rows).toHaveLength(REGISTRY.length);
|
|
136
|
+
expect(rows.map((r) => r.harnessName)).not.toContain("Ghost Editor");
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it("names every row with the scope it was rolled up for", () => {
|
|
140
|
+
const rows = harnessInventory(REGISTRY, [], "project");
|
|
141
|
+
expect(rows.every((r) => r.scope === "project")).toBe(true);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
describe("harnessInventory — the listing", () => {
|
|
146
|
+
const rows = roll([
|
|
147
|
+
{ path: "~/.claude.json", harnesses: [named("Claude Code", "registered")] },
|
|
148
|
+
]);
|
|
149
|
+
|
|
150
|
+
it("shows detected harnesses only by default", () => {
|
|
151
|
+
const items = inventoryItems(rows, false);
|
|
152
|
+
expect(items.map((i) => i.label)).toEqual(["Claude Code"]);
|
|
153
|
+
expect(items[0]?.detail).toBe("registered — ~/.claude.json");
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it("--verbose widens the same rows to the whole registry", () => {
|
|
157
|
+
const items = inventoryItems(rows, true);
|
|
158
|
+
expect(items.map((i) => i.label)).toEqual([
|
|
159
|
+
"Claude Code",
|
|
160
|
+
"Cursor",
|
|
161
|
+
"VS Code",
|
|
162
|
+
]);
|
|
163
|
+
expect(items[1]?.detail).toBe("not detected");
|
|
164
|
+
// Scope-aware, and it states the FACT rather than naming a partition:
|
|
165
|
+
// VS Code keeps its MCP config per project, so there is no global file for
|
|
166
|
+
// pragma to be in. `no Global band` named an internal word for that.
|
|
167
|
+
expect(items[2]?.detail).toBe(
|
|
168
|
+
"keeps no global config — it is per-project only",
|
|
169
|
+
);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it("never renders any state as a failure", () => {
|
|
173
|
+
for (const item of inventoryItems(rows, true)) {
|
|
174
|
+
expect(item.status).not.toBe("fail");
|
|
175
|
+
}
|
|
176
|
+
const every = harnessInventory(REGISTRY, [], "project");
|
|
177
|
+
for (const item of inventoryItems(every, true)) {
|
|
178
|
+
expect(item.status).not.toBe("fail");
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it("is a listing, not a verdict: pass when the scope holds harnesses, skip when it does not", () => {
|
|
183
|
+
expect(inventoryHealth(rows, false).status).toBe("pass");
|
|
184
|
+
expect(inventoryHealth(rows, false).detail).toBe(
|
|
185
|
+
"1 detected · 1 registered",
|
|
186
|
+
);
|
|
187
|
+
expect(inventoryHealth(rows, true).detail).toBe(
|
|
188
|
+
"1 detected · 1 registered · 3 known",
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
const empty = roll([]);
|
|
192
|
+
expect(inventoryHealth(empty, false).status).toBe("skip");
|
|
193
|
+
expect(inventoryHealth(empty, false).detail).toBe("no harnesses detected");
|
|
194
|
+
expect(inventoryHealth(empty, false).items).toEqual([]);
|
|
195
|
+
expect(inventoryHealth(empty, true).detail).toBe(
|
|
196
|
+
"none of 3 known harnesses detected",
|
|
197
|
+
);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it("counts a drifted harness as detected but not as registered", () => {
|
|
201
|
+
const drifted = roll([
|
|
202
|
+
{ path: "~/.claude.json", harnesses: [named("Claude Code", "drifted")] },
|
|
203
|
+
]);
|
|
204
|
+
expect(inventoryHealth(drifted, false).detail).toBe(
|
|
205
|
+
"1 detected · 0 registered",
|
|
206
|
+
);
|
|
207
|
+
expect(inventoryItems(drifted, false)[0]?.status).toBe("available");
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
describe("isDetectedState", () => {
|
|
212
|
+
it("counts every state that means the harness is on the machine", () => {
|
|
213
|
+
expect(isDetectedState("registered")).toBe(true);
|
|
214
|
+
expect(isDetectedState("drifted")).toBe(true);
|
|
215
|
+
expect(isDetectedState("detected")).toBe(true);
|
|
216
|
+
expect(isDetectedState("undetected")).toBe(false);
|
|
217
|
+
expect(isDetectedState("unscoped")).toBe(false);
|
|
218
|
+
});
|
|
219
|
+
});
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The harness inventory: one row per harness per scope, saying what was detected
|
|
3
|
+
* and whether pragma is registered in it.
|
|
4
|
+
*
|
|
5
|
+
* Every fact this needs was ALREADY COMPUTED and thrown away.
|
|
6
|
+
* `TargetGroup.harnessNames` carries every harness sharing a config file and
|
|
7
|
+
* both consumers reduced it to `shortenPath(group.path)`; `McpDetection`
|
|
8
|
+
* carries the `absent`/`registered`/`drifted` classification of every WRITE in
|
|
9
|
+
* that file. The only thing detection could NOT answer is the negative —
|
|
10
|
+
* `detectHarnesses` filters to hits, so a harness the machine does not have was
|
|
11
|
+
* unrepresentable — which is why the roll-up takes the REGISTRY alongside the
|
|
12
|
+
* groups: the registry supplies the universe, the groups supply the state.
|
|
13
|
+
*
|
|
14
|
+
* The state arrives PER HARNESS, never per file. A shared `.vscode/mcp.json`
|
|
15
|
+
* holds VS Code's `servers` and Cline's `mcpServers` as two independent
|
|
16
|
+
* entries, so the file's aggregate — `drifted`, when one key is current and the
|
|
17
|
+
* other absent — is the standing of NEITHER harness. Pairing each name with
|
|
18
|
+
* the write it owns is the caller's job (it holds the registry's `mcpKey`s and
|
|
19
|
+
* the group's writes); by the time a group reaches this module the association
|
|
20
|
+
* is resolved and every name carries its own state.
|
|
21
|
+
*
|
|
22
|
+
* Three deliberate constraints:
|
|
23
|
+
*
|
|
24
|
+
* 1. **No `@canonical/harnesses` import, of any kind.** `capabilities/lazy.test`
|
|
25
|
+
* forbids one from any file statically reachable from `capabilities/index`,
|
|
26
|
+
* and its regex has no `import type` exemption. This module is reached only
|
|
27
|
+
* through `runChecks`'s dynamic import today, but it is written so that
|
|
28
|
+
* staying legal never depends on that: the inputs are declared here as
|
|
29
|
+
* narrow structural records.
|
|
30
|
+
*
|
|
31
|
+
* 2. **Narrowed to DATA, so `mutates: false` is enforced rather than asserted.**
|
|
32
|
+
* `McpDetection` is write-capable — it carries `writeMcpConfigTargets` and
|
|
33
|
+
* `removeMcpConfigFrom` as live function references. Projecting it down to
|
|
34
|
+
* {@link InventoryGroup} before it reaches this file means a read-only
|
|
35
|
+
* report literally cannot reach a writer.
|
|
36
|
+
*
|
|
37
|
+
* 3. **It never invents a failure.** The states an inventory can report map onto
|
|
38
|
+
* `pass`/`available`/`skip` and NEVER `fail` (see `../types.ts`): a machine
|
|
39
|
+
* that simply does not have Windsurf is not a broken machine, and the `mcp`
|
|
40
|
+
* row already owns the actionable finding for the harnesses it does have.
|
|
41
|
+
* Reporting it twice is how a failure count becomes noise.
|
|
42
|
+
*
|
|
43
|
+
* Placement: this is a doctor helper because doctor is its only consumer today,
|
|
44
|
+
* and `shared/` is explicitly not a utility drawer (see `shared/index.ts`). It
|
|
45
|
+
* is written to MOVE there unchanged — pure, no capability imports beyond the
|
|
46
|
+
* scope type — the moment `setup`'s detection summary becomes the second caller.
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
import type { CheckItem, CheckStatus, Scope } from "../types.js";
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* What the inventory says about one harness in one scope.
|
|
53
|
+
*
|
|
54
|
+
* The vocabulary is deliberately NOT "installed". Two different claims used
|
|
55
|
+
* to share that word — `DetectedHarness.configExists` ("the harness's own
|
|
56
|
+
* config file exists", a harnesses-package field this module never surfaces)
|
|
57
|
+
* and the pragma-entry state (`McpTargetState`, which now says `registered`
|
|
58
|
+
* for exactly this reason). Every state here names the PRAGMA-ENTRY meaning.
|
|
59
|
+
* One name per claim, held across the reports: "installed" is reserved for
|
|
60
|
+
* artifacts the CLI itself places (the completion script, the LSP extension),
|
|
61
|
+
* "registered" for pragma's entry in someone else's config, "linked" for
|
|
62
|
+
* skill symlinks.
|
|
63
|
+
*
|
|
64
|
+
* - `registered` — detected, and pragma's MCP entry in this scope is current.
|
|
65
|
+
* - `drifted` — detected, and a pragma entry exists but differs from what a
|
|
66
|
+
* write would emit. Actionable, but the `mcp` row is where it is actionED;
|
|
67
|
+
* here it is reported without inflating the failure count.
|
|
68
|
+
* - `detected` — the harness is on this machine; pragma is not registered.
|
|
69
|
+
* - `undetected` — in the registry, has a location in this scope, not found.
|
|
70
|
+
* - `unscoped` — in the registry, but has NO config location in this scope at
|
|
71
|
+
* all (VS Code is `scope: "project"`, so it can never hold a global entry).
|
|
72
|
+
* Stated rather than omitted: a verbose listing that silently dropped a row
|
|
73
|
+
* reads as a bug in the listing.
|
|
74
|
+
*/
|
|
75
|
+
export type InventoryState =
|
|
76
|
+
| "registered"
|
|
77
|
+
| "drifted"
|
|
78
|
+
| "detected"
|
|
79
|
+
| "undetected"
|
|
80
|
+
| "unscoped";
|
|
81
|
+
|
|
82
|
+
/** One harness's standing in one scope. */
|
|
83
|
+
export interface InventoryRow {
|
|
84
|
+
readonly harnessId: string;
|
|
85
|
+
readonly harnessName: string;
|
|
86
|
+
readonly scope: Scope;
|
|
87
|
+
readonly state: InventoryState;
|
|
88
|
+
/** The config paths in this scope that carry (or would carry) the entry. */
|
|
89
|
+
readonly locations: readonly string[];
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** A registry entry, narrowed to what the roll-up reads. */
|
|
93
|
+
export interface InventoryHarness {
|
|
94
|
+
readonly id: string;
|
|
95
|
+
readonly name: string;
|
|
96
|
+
/** Whether this harness has a config location in the scope being rolled up. */
|
|
97
|
+
readonly inScope: boolean;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** The prior state of one harness's own write, as detection classified it. */
|
|
101
|
+
export type WriteState = "absent" | "registered" | "drifted";
|
|
102
|
+
|
|
103
|
+
/** One harness's share of a config file: the state of the write IT owns. */
|
|
104
|
+
export interface InventoryMember {
|
|
105
|
+
readonly name: string;
|
|
106
|
+
readonly state: WriteState;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* One detected config file, narrowed off {@link McpDetection}: the group's
|
|
111
|
+
* already-shortened path, and every harness sharing it WITH ITS OWN state.
|
|
112
|
+
*
|
|
113
|
+
* Per harness, not per file — see the module docblock. A file-level state here
|
|
114
|
+
* would report both harnesses sharing `.vscode/mcp.json` as drifted the moment
|
|
115
|
+
* either one of them is registered alone.
|
|
116
|
+
*/
|
|
117
|
+
export interface InventoryGroup {
|
|
118
|
+
readonly path: string;
|
|
119
|
+
readonly harnesses: readonly InventoryMember[];
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Whether a state means "this harness is on the machine". */
|
|
123
|
+
export const isDetectedState = (state: InventoryState): boolean =>
|
|
124
|
+
state === "registered" || state === "drifted" || state === "detected";
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Roll one scope's detected config groups up against the registry into one row
|
|
128
|
+
* per harness.
|
|
129
|
+
*
|
|
130
|
+
* Groups are keyed by harness NAME because that is the only identity
|
|
131
|
+
* `TargetGroup` records; the registry is the map back to an id, which is why it
|
|
132
|
+
* is a parameter rather than a lookup. A harness naming no registry row is
|
|
133
|
+
* ignored rather than invented — the inventory reports on the registry, not on
|
|
134
|
+
* whatever a group happened to say.
|
|
135
|
+
*
|
|
136
|
+
* @param registry - Every known harness, each flagged for scope membership.
|
|
137
|
+
* @param groups - This scope's detected config files (narrowed, path-shortened),
|
|
138
|
+
* each naming the harnesses that share it with their own per-write state.
|
|
139
|
+
* @param scope - The scope being rolled up.
|
|
140
|
+
* @returns One row per registry harness, in registry order.
|
|
141
|
+
* @note Pure — it reads no filesystem and holds no live effect.
|
|
142
|
+
*/
|
|
143
|
+
export function harnessInventory(
|
|
144
|
+
registry: readonly InventoryHarness[],
|
|
145
|
+
groups: readonly InventoryGroup[],
|
|
146
|
+
scope: Scope,
|
|
147
|
+
): InventoryRow[] {
|
|
148
|
+
const states = new Map<string, WriteState>();
|
|
149
|
+
const locations = new Map<string, string[]>();
|
|
150
|
+
for (const group of groups) {
|
|
151
|
+
for (const member of group.harnesses) {
|
|
152
|
+
const paths = locations.get(member.name) ?? [];
|
|
153
|
+
paths.push(group.path);
|
|
154
|
+
locations.set(member.name, paths);
|
|
155
|
+
// A harness sharing two files is registered only where EVERY one of them
|
|
156
|
+
// carries the current entry — the same "all or nothing" rule
|
|
157
|
+
// `aggregateMcpStates` applies across the writes within a single file.
|
|
158
|
+
const prior = states.get(member.name);
|
|
159
|
+
states.set(
|
|
160
|
+
member.name,
|
|
161
|
+
prior === undefined || prior === member.state
|
|
162
|
+
? member.state
|
|
163
|
+
: "drifted",
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return registry.map((harness): InventoryRow => {
|
|
169
|
+
const detected = states.get(harness.name);
|
|
170
|
+
const paths = locations.get(harness.name) ?? [];
|
|
171
|
+
const state: InventoryState =
|
|
172
|
+
detected === undefined
|
|
173
|
+
? harness.inScope
|
|
174
|
+
? "undetected"
|
|
175
|
+
: "unscoped"
|
|
176
|
+
: detected === "registered"
|
|
177
|
+
? "registered"
|
|
178
|
+
: detected === "drifted"
|
|
179
|
+
? "drifted"
|
|
180
|
+
: "detected";
|
|
181
|
+
return {
|
|
182
|
+
harnessId: harness.id,
|
|
183
|
+
harnessName: harness.name,
|
|
184
|
+
scope,
|
|
185
|
+
state,
|
|
186
|
+
locations: paths,
|
|
187
|
+
};
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** The per-item status each state renders as. Never `fail` — see the docblock. */
|
|
192
|
+
const STATE_STATUS: Record<InventoryState, CheckStatus> = {
|
|
193
|
+
registered: "pass",
|
|
194
|
+
drifted: "available",
|
|
195
|
+
detected: "available",
|
|
196
|
+
undetected: "skip",
|
|
197
|
+
unscoped: "skip",
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* The phrase each state reads as, scope-aware for the unscoped case.
|
|
202
|
+
*
|
|
203
|
+
* The unscoped line says WHERE the harness keeps its config rather than naming
|
|
204
|
+
* an internal partition. `no Global band` told the reader nothing: "band" was
|
|
205
|
+
* this repository's word, and the fact underneath it — VS Code stores its MCP
|
|
206
|
+
* config per project, so there is no global file for pragma to be in — is the
|
|
207
|
+
* thing that explains the row.
|
|
208
|
+
*/
|
|
209
|
+
const stateDetail = (row: InventoryRow): string => {
|
|
210
|
+
switch (row.state) {
|
|
211
|
+
case "registered":
|
|
212
|
+
return "registered";
|
|
213
|
+
case "drifted":
|
|
214
|
+
return "registered, entry differs from current";
|
|
215
|
+
case "detected":
|
|
216
|
+
return "detected, not registered";
|
|
217
|
+
case "undetected":
|
|
218
|
+
return "not detected";
|
|
219
|
+
case "unscoped":
|
|
220
|
+
return row.scope === "global"
|
|
221
|
+
? "keeps no global config — it is per-project only"
|
|
222
|
+
: "keeps no per-project config — it is global only";
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Project inventory rows into doctor sub-items.
|
|
228
|
+
*
|
|
229
|
+
* The default listing is DETECTED HARNESSES ONLY — a report that names every
|
|
230
|
+
* tool the user does not have buries the ones they do. `--verbose` widens it to
|
|
231
|
+
* the whole registry, which is the only view in which `undetected`/`unscoped`
|
|
232
|
+
* rows appear at all.
|
|
233
|
+
*
|
|
234
|
+
* @param rows - This scope's inventory rows.
|
|
235
|
+
* @param verbose - Whether to list the whole registry rather than the hits.
|
|
236
|
+
* @returns The sub-items, harness name in the left column.
|
|
237
|
+
*/
|
|
238
|
+
export function inventoryItems(
|
|
239
|
+
rows: readonly InventoryRow[],
|
|
240
|
+
verbose: boolean,
|
|
241
|
+
): CheckItem[] {
|
|
242
|
+
const shown = verbose
|
|
243
|
+
? rows
|
|
244
|
+
: rows.filter((row) => isDetectedState(row.state));
|
|
245
|
+
return shown.map((row): CheckItem => {
|
|
246
|
+
const where = row.locations.join(", ");
|
|
247
|
+
return {
|
|
248
|
+
label: row.harnessName,
|
|
249
|
+
status: STATE_STATUS[row.state],
|
|
250
|
+
detail: where ? `${stateDetail(row)} — ${where}` : stateDetail(row),
|
|
251
|
+
};
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/** The inventory check's headline, and whether it has anything to show. */
|
|
256
|
+
export interface InventoryHealth {
|
|
257
|
+
readonly status: CheckStatus;
|
|
258
|
+
readonly detail: string;
|
|
259
|
+
readonly items: readonly CheckItem[];
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* The whole inventory row for one scope: a listing, not a verdict.
|
|
264
|
+
*
|
|
265
|
+
* Its status is only ever `pass` (this scope has harnesses) or `skip` (it has
|
|
266
|
+
* none). It is the one scoped row that is not a setup target, so it derives no
|
|
267
|
+
* `fix:` line — the `mcp` and `skills` rows beside it own every action a
|
|
268
|
+
* harness can need, and a second row proposing the same command would be the
|
|
269
|
+
* "same finding seen twice" the report is built to avoid.
|
|
270
|
+
*
|
|
271
|
+
* @param rows - This scope's inventory rows.
|
|
272
|
+
* @param verbose - Whether the listing widens to the whole registry.
|
|
273
|
+
* @returns The status, headline and sub-items for the scope's inventory check.
|
|
274
|
+
*/
|
|
275
|
+
export function inventoryHealth(
|
|
276
|
+
rows: readonly InventoryRow[],
|
|
277
|
+
verbose: boolean,
|
|
278
|
+
): InventoryHealth {
|
|
279
|
+
const detected = rows.filter((row) => isDetectedState(row.state));
|
|
280
|
+
const registered = rows.filter((row) => row.state === "registered");
|
|
281
|
+
const items = inventoryItems(rows, verbose);
|
|
282
|
+
if (detected.length === 0) {
|
|
283
|
+
return {
|
|
284
|
+
status: "skip",
|
|
285
|
+
detail: verbose
|
|
286
|
+
? `none of ${rows.length} known harnesses detected`
|
|
287
|
+
: "no harnesses detected",
|
|
288
|
+
items,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
return {
|
|
292
|
+
status: "pass",
|
|
293
|
+
detail: `${detected.length} detected · ${registered.length} registered${
|
|
294
|
+
verbose ? ` · ${rows.length} known` : ""
|
|
295
|
+
}`,
|
|
296
|
+
items,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The doctor check catalogue — the diagnoses `doctor` composes into a report.
|
|
3
|
+
*
|
|
4
|
+
* A check is the whole shape of this domain: it inspects ONE thing, decides
|
|
5
|
+
* pass or fail, and hands back a `CheckResult` carrying the remedy. Keeping
|
|
6
|
+
* them apart from the report body is what lets `runChecks` stay a composition
|
|
7
|
+
* — it orders and awaits, and knows nothing about what any check looks at.
|
|
8
|
+
*
|
|
9
|
+
* Two kinds live here, and the barrel exposes them differently. The UNSCOPED
|
|
10
|
+
* checks diagnose what `setup` cannot install — the Node floor, the CLI's own
|
|
11
|
+
* version and install source, the pack answering this project's reads, and the
|
|
12
|
+
* store — so each is its own named entry point. The SCOPED rows are derived
|
|
13
|
+
* per target, per scope, from the setup target table rather than authored here,
|
|
14
|
+
* so they surface as the one generator that derives them, never as a list of
|
|
15
|
+
* row names this file would then have to keep in step with `setup`.
|
|
16
|
+
*
|
|
17
|
+
* The per-target probes (the completions script check, the MCP command
|
|
18
|
+
* resolution helpers) stay internal on purpose: `scopedChecks` is the only way
|
|
19
|
+
* they are meant to be reached, and a row reachable past its scope is a row
|
|
20
|
+
* `doctor` can report and `setup` cannot fix.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export { checkKeStore } from "./checkKeStore.js";
|
|
24
|
+
export { checkNodeVersion } from "./checkNodeVersion.js";
|
|
25
|
+
export { checkPackageRefs } from "./checkPackageRefs.js";
|
|
26
|
+
export { checkPragmaVersion } from "./checkPragmaVersion.js";
|
|
27
|
+
export { scopedChecks } from "./targetHealth.js";
|