@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
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `pragma doctor` — the
|
|
2
|
+
* `pragma doctor` — the environment checks plus the scoped target rows.
|
|
3
3
|
*
|
|
4
4
|
* Runs against isolated HOME/cwd/XDG so the harness/config/completion checks are
|
|
5
5
|
* deterministic (no harnesses, no config, no rc files). Covers the shape, a
|
|
6
|
-
* representative pass/fail/skip spread, the store check (down via an
|
|
7
|
-
* throwing store; up via the canonical fixture), exit 0 despite
|
|
8
|
-
* the MCP read-only envelope.
|
|
6
|
+
* representative pass/fail/available/skip spread, the store check (down via an
|
|
7
|
+
* injected throwing store; up via the canonical fixture), exit 0 despite
|
|
8
|
+
* failures, and the MCP read-only envelope.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
chmodSync,
|
|
13
|
+
mkdirSync,
|
|
14
|
+
mkdtempSync,
|
|
15
|
+
rmSync,
|
|
16
|
+
writeFileSync,
|
|
17
|
+
} from "node:fs";
|
|
12
18
|
import { tmpdir } from "node:os";
|
|
13
19
|
import { join } from "node:path";
|
|
14
20
|
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
@@ -28,7 +34,7 @@ import {
|
|
|
28
34
|
} from "../../testing/fixtures/graph/canonical.js";
|
|
29
35
|
import { bootFixtureRuntime } from "../../testing/helpers/fixtureGraph.js";
|
|
30
36
|
import { projectMcp } from "../../testing/helpers/projectMcp.js";
|
|
31
|
-
import {
|
|
37
|
+
import { scopedChecks } from "./checks/targetHealth.js";
|
|
32
38
|
import { doctorModule } from "./index.js";
|
|
33
39
|
import { runChecks } from "./runChecks.js";
|
|
34
40
|
import type { DoctorData } from "./types.js";
|
|
@@ -112,12 +118,15 @@ const byName = (data: DoctorData, name: string) =>
|
|
|
112
118
|
data.checks.find((c) => c.name === name);
|
|
113
119
|
|
|
114
120
|
describe("doctor — shape & spread", () => {
|
|
115
|
-
it("returns
|
|
121
|
+
it("returns the environment checks plus one row per scoped target", async () => {
|
|
116
122
|
const data = await runChecks(bootRuntime(FLAGS, tmp("pragma-proj-")));
|
|
117
|
-
|
|
118
|
-
|
|
123
|
+
// Four unscoped environment checks, then the target table in both scopes
|
|
124
|
+
// (all five targets are global, mcp and skills are also project) = 11,
|
|
125
|
+
// plus the two `harnesses` inventory rows, one per scope = 13.
|
|
126
|
+
expect(data.checks).toHaveLength(13);
|
|
127
|
+
expect(data.passed + data.failed + data.available + data.skipped).toBe(13);
|
|
119
128
|
for (const check of data.checks) {
|
|
120
|
-
expect(["pass", "fail", "skip"]).toContain(check.status);
|
|
129
|
+
expect(["pass", "fail", "available", "skip"]).toContain(check.status);
|
|
121
130
|
}
|
|
122
131
|
// Deterministic under the isolated env.
|
|
123
132
|
expect(byName(data, "Node version")?.status).toBe("pass");
|
|
@@ -125,14 +134,60 @@ describe("doctor — shape & spread", () => {
|
|
|
125
134
|
// snapshot answers reads and the check passes, naming what it is reading.
|
|
126
135
|
const pkgRefs = byName(data, "pack refs");
|
|
127
136
|
expect(pkgRefs?.status).toBe("pass");
|
|
128
|
-
expect(pkgRefs?.detail).toContain("
|
|
137
|
+
expect(pkgRefs?.detail).toContain("shipped with the CLI");
|
|
129
138
|
expect(pkgRefs?.remedy).toBeUndefined();
|
|
130
|
-
//
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
expect(
|
|
139
|
+
// Provenance is one ITEM PER PACK, not a comma-joined string in the
|
|
140
|
+
// headline: four packs and two forty-character SHAs on one line was
|
|
141
|
+
// unreadable, and every other multi-part check here already uses items.
|
|
142
|
+
// The headline counts them; the items say which revision each one is.
|
|
143
|
+
expect(pkgRefs?.detail).toContain("packs");
|
|
144
|
+
expect((pkgRefs?.items?.length ?? 0) > 1).toBe(true);
|
|
145
|
+
for (const item of pkgRefs?.items ?? []) {
|
|
146
|
+
expect(item.label).not.toContain(",");
|
|
147
|
+
// A git hash is cut to seven — the length every other tool in this
|
|
148
|
+
// workflow prints, and short enough that four rows stay scannable.
|
|
149
|
+
expect(item.detail ?? "").not.toMatch(/[0-9a-f]{40}/);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// The scoped rows carry the TARGET IDS verbatim — `mcp`, not "MCP
|
|
153
|
+
// configured" — because the row name IS the fix command's argument. The
|
|
154
|
+
// environment checks stay unscoped. `harnesses` is the ONE scoped row that
|
|
155
|
+
// is not a target: an inventory of the machine, not something to set up, so
|
|
156
|
+
// it sits last in each scope and derives no `fix:`.
|
|
157
|
+
const scoped = data.checks.filter((c) => c.scope !== undefined);
|
|
158
|
+
expect(scoped.map((c) => `${c.scope}:${c.name}`)).toEqual([
|
|
159
|
+
"global:config",
|
|
160
|
+
"global:completions",
|
|
161
|
+
"global:lsp",
|
|
162
|
+
"global:mcp",
|
|
163
|
+
"global:skills",
|
|
164
|
+
"project:mcp",
|
|
165
|
+
"project:skills",
|
|
166
|
+
"global:harnesses",
|
|
167
|
+
"project:harnesses",
|
|
168
|
+
]);
|
|
169
|
+
// Every row that wants action names the exact command that repairs it,
|
|
170
|
+
// scope included — the bijection, derived rather than authored.
|
|
171
|
+
for (const check of scoped) {
|
|
172
|
+
if (check.status === "fail" || check.status === "available") {
|
|
173
|
+
expect(check.remedy).toBeDefined();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// The inventory never inflates the failure or the action count: it is only
|
|
177
|
+
// ever `pass` (this scope holds harnesses) or `skip` (it holds none), and it
|
|
178
|
+
// proposes nothing — the `mcp`/`skills` rows own every harness action.
|
|
179
|
+
for (const check of scoped.filter((c) => c.name === "harnesses")) {
|
|
180
|
+
expect(["pass", "skip"]).toContain(check.status);
|
|
181
|
+
expect(check.remedy).toBeUndefined();
|
|
182
|
+
}
|
|
183
|
+
// No harnesses in an empty HOME/cwd, so both mcp rows skip; the project
|
|
184
|
+
// scope is opt-in, so its absence is never a fault.
|
|
185
|
+
expect(
|
|
186
|
+
scoped.find((c) => c.scope === "project" && c.name === "mcp")?.status,
|
|
187
|
+
).toBe("skip");
|
|
188
|
+
// No global config in the isolated XDG — an opt-in that is not set up yet.
|
|
189
|
+
expect(byName(data, "config")?.status).toBe("available");
|
|
190
|
+
expect(byName(data, "config")?.remedy).toBe("pragma setup config");
|
|
136
191
|
});
|
|
137
192
|
});
|
|
138
193
|
|
|
@@ -159,8 +214,12 @@ describe("doctor — the pack-refs check", () => {
|
|
|
159
214
|
const data = await runChecks(fixture.runtime);
|
|
160
215
|
const pkgRefs = byName(data, "pack refs");
|
|
161
216
|
expect(pkgRefs?.status).toBe("pass");
|
|
162
|
-
// The fixture pack's own provenance label, not the embedded snapshot's
|
|
163
|
-
|
|
217
|
+
// The fixture pack's own provenance label, not the embedded snapshot's —
|
|
218
|
+
// now carried as an item rather than inline, and passed through WHOLE
|
|
219
|
+
// because it parses as no scheme. An unreadable provenance is still
|
|
220
|
+
// provenance; dropping it would be the one failure this check exists to
|
|
221
|
+
// prevent.
|
|
222
|
+
expect(pkgRefs?.items?.map((item) => item.label)).toContain("fixture");
|
|
164
223
|
expect(pkgRefs?.detail).not.toContain("embedded snapshot");
|
|
165
224
|
await fixture.dispose();
|
|
166
225
|
});
|
|
@@ -169,10 +228,10 @@ describe("doctor — the pack-refs check", () => {
|
|
|
169
228
|
describe("doctor — the store check", () => {
|
|
170
229
|
it("a store that fails to boot is an attributable fail, not a crash", async () => {
|
|
171
230
|
const data = await runChecks(throwingStoreRuntime(tmp("pragma-proj-")));
|
|
172
|
-
expect(data.checks).toHaveLength(
|
|
173
|
-
const
|
|
174
|
-
expect(
|
|
175
|
-
expect(
|
|
231
|
+
expect(data.checks).toHaveLength(13);
|
|
232
|
+
const store = byName(data, "store");
|
|
233
|
+
expect(store?.status).toBe("fail");
|
|
234
|
+
expect(store?.remedy).toBeTruthy();
|
|
176
235
|
});
|
|
177
236
|
|
|
178
237
|
it("a booted store passes with an entity total", async () => {
|
|
@@ -181,9 +240,9 @@ describe("doctor — the store check", () => {
|
|
|
181
240
|
config: ALL_VISIBLE_CONFIG,
|
|
182
241
|
});
|
|
183
242
|
const data = await runChecks(fixture.runtime);
|
|
184
|
-
const
|
|
185
|
-
expect(
|
|
186
|
-
expect(
|
|
243
|
+
const store = byName(data, "store");
|
|
244
|
+
expect(store?.status).toBe("pass");
|
|
245
|
+
expect(store?.detail).toMatch(/entities/);
|
|
187
246
|
await fixture.dispose();
|
|
188
247
|
});
|
|
189
248
|
});
|
|
@@ -211,28 +270,270 @@ describe("doctor — dispatch & MCP", () => {
|
|
|
211
270
|
const envelope = await mcp.callTool("doctor");
|
|
212
271
|
await mcp.cleanup();
|
|
213
272
|
expect(envelope.ok).toBe(true);
|
|
214
|
-
expect((envelope.data as DoctorData).checks).toHaveLength(
|
|
273
|
+
expect((envelope.data as DoctorData).checks).toHaveLength(13);
|
|
215
274
|
});
|
|
216
275
|
});
|
|
217
276
|
|
|
218
|
-
describe("doctor —
|
|
219
|
-
it("
|
|
220
|
-
//
|
|
221
|
-
//
|
|
222
|
-
//
|
|
277
|
+
describe("doctor — the scoped rows can see the GLOBAL scope", () => {
|
|
278
|
+
it("reports a configured global-scope entry as configured, not missing", async () => {
|
|
279
|
+
// The regression this closes: detection recorded only each harness's
|
|
280
|
+
// DEFAULT scope, so a server registered by `setup mcp --global` was invisible
|
|
281
|
+
// and doctor reported it not-configured forever. The rows now come from the
|
|
282
|
+
// same target table `setup` writes through, enumerated in BOTH scopes, so the
|
|
283
|
+
// two surfaces cannot disagree about what they looked at.
|
|
223
284
|
const cwd = tmp("pragma-doctor-proj-");
|
|
224
285
|
mkdirSync(join(cwd, ".windsurf"), { recursive: true }); // ⇒ Windsurf detected
|
|
225
286
|
const home = process.env.HOME ?? "";
|
|
226
287
|
const wsDir = join(home, ".codeium", "windsurf");
|
|
227
288
|
mkdirSync(wsDir, { recursive: true });
|
|
289
|
+
// Exactly what a global-scope `setup mcp` writes: no `cwd`, so the entry is
|
|
290
|
+
// not pinned to whatever directory the registration ran from.
|
|
228
291
|
writeFileSync(
|
|
229
292
|
join(wsDir, "mcp_config.json"),
|
|
230
|
-
JSON.stringify({
|
|
293
|
+
JSON.stringify({
|
|
294
|
+
mcpServers: { pragma: { command: "pragma", args: ["mcp", "serve"] } },
|
|
295
|
+
}),
|
|
296
|
+
);
|
|
297
|
+
// The row also verifies the command BOOTS, so put a `pragma` on the
|
|
298
|
+
// isolated PATH — otherwise the row correctly fails for a second reason.
|
|
299
|
+
const binDir = process.env.PATH as string;
|
|
300
|
+
writeFileSync(join(binDir, "pragma"), "#!/bin/sh\nexit 0\n");
|
|
301
|
+
chmodSync(join(binDir, "pragma"), 0o755);
|
|
302
|
+
|
|
303
|
+
const rows = await scopedChecks(bootRuntime(FLAGS, cwd), "pragma");
|
|
304
|
+
const global = rows.find((r) => r.name === "mcp" && r.scope === "global");
|
|
305
|
+
expect(global?.status).toBe("pass");
|
|
306
|
+
expect(
|
|
307
|
+
global?.items?.some((i) => i.label.includes("mcp_config.json")),
|
|
308
|
+
).toBe(true);
|
|
309
|
+
// ...and the project scope stays an opt-in skip, never a fault.
|
|
310
|
+
const project = rows.find((r) => r.name === "mcp" && r.scope === "project");
|
|
311
|
+
expect(project?.status).toBe("skip");
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
describe("doctor — the harness inventory", () => {
|
|
316
|
+
const VERBOSE: GlobalFlags = { ...FLAGS, verbose: true };
|
|
317
|
+
const inventory = (rows: Awaited<ReturnType<typeof scopedChecks>>) => ({
|
|
318
|
+
global: rows.find((r) => r.name === "harnesses" && r.scope === "global"),
|
|
319
|
+
project: rows.find((r) => r.name === "harnesses" && r.scope === "project"),
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
it("lists ONLY detected harnesses by default, by name and with their location", async () => {
|
|
323
|
+
const cwd = tmp("pragma-doctor-proj-");
|
|
324
|
+
mkdirSync(join(cwd, ".vscode"), { recursive: true }); // ⇒ VS Code detected
|
|
325
|
+
|
|
326
|
+
const rows = await scopedChecks(bootRuntime(FLAGS, cwd), "pragma");
|
|
327
|
+
const { global, project } = inventory(rows);
|
|
328
|
+
|
|
329
|
+
// The project scope holds the hit — by NAME, with the file it resolves to.
|
|
330
|
+
expect(project?.status).toBe("pass");
|
|
331
|
+
expect(project?.detail).toBe("1 detected · 0 registered");
|
|
332
|
+
expect(project?.items?.map((i) => i.label)).toEqual(["VS Code"]);
|
|
333
|
+
expect(project?.items?.[0]?.status).toBe("available");
|
|
334
|
+
expect(project?.items?.[0]?.detail).toContain("detected, not registered");
|
|
335
|
+
expect(project?.items?.[0]?.detail).toContain(".vscode/mcp.json");
|
|
336
|
+
|
|
337
|
+
// Nothing detected in the global scope, and that is a skip — not a fault.
|
|
338
|
+
expect(global?.status).toBe("skip");
|
|
339
|
+
expect(global?.detail).toBe("no harnesses detected");
|
|
340
|
+
expect(global?.items).toBeUndefined();
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
it("--verbose lists every registry harness, undetected ones as a NON-failing skip", async () => {
|
|
344
|
+
const cwd = tmp("pragma-doctor-proj-");
|
|
345
|
+
mkdirSync(join(cwd, ".vscode"), { recursive: true });
|
|
346
|
+
|
|
347
|
+
const rows = await scopedChecks(bootRuntime(VERBOSE, cwd), "pragma");
|
|
348
|
+
const { global, project } = inventory(rows);
|
|
349
|
+
|
|
350
|
+
// Every harness the registry knows, in both scopes.
|
|
351
|
+
expect(project?.items).toHaveLength(13);
|
|
352
|
+
expect(global?.items).toHaveLength(13);
|
|
353
|
+
expect(project?.detail).toBe("1 detected · 0 registered · 13 known");
|
|
354
|
+
|
|
355
|
+
// `types.ts` forbids inflating the failure count: a machine that simply
|
|
356
|
+
// does not have Cursor is not a broken machine.
|
|
357
|
+
for (const check of [global, project]) {
|
|
358
|
+
expect(["pass", "skip"]).toContain(check?.status);
|
|
359
|
+
for (const item of check?.items ?? []) {
|
|
360
|
+
expect(item.status).not.toBe("fail");
|
|
361
|
+
expect(["pass", "available", "skip"]).toContain(item.status);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
const cursor = project?.items?.find((i) => i.label === "Cursor");
|
|
366
|
+
expect(cursor?.status).toBe("skip");
|
|
367
|
+
expect(cursor?.detail).toBe("not detected");
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
it("says where a harness DOES keep its config, rather than omitting it", async () => {
|
|
371
|
+
// `vscode` is `scope: "project"`, so it can NEVER carry a global entry. A
|
|
372
|
+
// verbose global listing that silently dropped it would read as a bug in
|
|
373
|
+
// the listing; the row says why instead. The mirror case is Windsurf, which
|
|
374
|
+
// is `scope: "global"` and keeps nothing per project.
|
|
375
|
+
//
|
|
376
|
+
// The sentence states the FACT, not the partition: `no Global band` named
|
|
377
|
+
// an internal word for the answer instead of giving it.
|
|
378
|
+
const rows = await scopedChecks(
|
|
379
|
+
bootRuntime(VERBOSE, tmp("pragma-doctor-proj-")),
|
|
380
|
+
"pragma",
|
|
381
|
+
);
|
|
382
|
+
const { global, project } = inventory(rows);
|
|
383
|
+
|
|
384
|
+
const vscodeGlobal = global?.items?.find((i) => i.label === "VS Code");
|
|
385
|
+
expect(vscodeGlobal?.detail).toBe(
|
|
386
|
+
"keeps no global config — it is per-project only",
|
|
387
|
+
);
|
|
388
|
+
expect(vscodeGlobal?.status).toBe("skip");
|
|
389
|
+
|
|
390
|
+
const windsurfProject = project?.items?.find((i) => i.label === "Windsurf");
|
|
391
|
+
expect(windsurfProject?.detail).toBe(
|
|
392
|
+
"keeps no per-project config — it is global only",
|
|
393
|
+
);
|
|
394
|
+
expect(windsurfProject?.status).toBe("skip");
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
it("reports a harness whose pragma entry is current as registered", async () => {
|
|
398
|
+
const cwd = tmp("pragma-doctor-proj-");
|
|
399
|
+
mkdirSync(join(cwd, ".vscode"), { recursive: true });
|
|
400
|
+
// Byte-for-byte what a project-scope `setup mcp` writes for VS Code: its
|
|
401
|
+
// `servers` key, and the `cwd` a project registration pins.
|
|
402
|
+
writeFileSync(
|
|
403
|
+
join(cwd, ".vscode", "mcp.json"),
|
|
404
|
+
JSON.stringify({
|
|
405
|
+
servers: { pragma: { command: "pragma", args: ["mcp", "serve"], cwd } },
|
|
406
|
+
}),
|
|
407
|
+
);
|
|
408
|
+
|
|
409
|
+
const rows = await scopedChecks(bootRuntime(FLAGS, cwd), "pragma");
|
|
410
|
+
const { project } = inventory(rows);
|
|
411
|
+
expect(project?.detail).toBe("1 detected · 1 registered");
|
|
412
|
+
const vscode = project?.items?.find((i) => i.label === "VS Code");
|
|
413
|
+
expect(vscode?.status).toBe("pass");
|
|
414
|
+
expect(vscode?.detail).toContain("registered");
|
|
415
|
+
expect(vscode?.detail).not.toContain("not registered");
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
it("reports two harnesses sharing ONE file by their own keys, not by the file", async () => {
|
|
419
|
+
// The co-detection case. `.vscode/mcp.json` is written under TWO keys —
|
|
420
|
+
// VS Code's `servers` and Cline's `mcpServers` — and registering pragma
|
|
421
|
+
// for VS Code alone leaves the FILE half-configured, which `detectMcp`
|
|
422
|
+
// aggregates to `drifted` (correctly: a write is still owed). That
|
|
423
|
+
// aggregate is not either harness's standing, and reporting it per harness
|
|
424
|
+
// said both had a stale entry when one was current and the other had none.
|
|
425
|
+
const cwd = tmp("pragma-doctor-proj-");
|
|
426
|
+
mkdirSync(join(cwd, ".vscode"), { recursive: true });
|
|
427
|
+
// Cline is detected ONLY by its installed extension, in the same directory
|
|
428
|
+
// that also proves VS Code is installed — so the two co-detect.
|
|
429
|
+
mkdirSync(
|
|
430
|
+
join(
|
|
431
|
+
process.env.HOME as string,
|
|
432
|
+
".vscode",
|
|
433
|
+
"extensions",
|
|
434
|
+
"saoudrizwan.claude-dev-3.20.0",
|
|
435
|
+
),
|
|
436
|
+
{ recursive: true },
|
|
437
|
+
);
|
|
438
|
+
writeFileSync(
|
|
439
|
+
join(
|
|
440
|
+
process.env.HOME as string,
|
|
441
|
+
".vscode",
|
|
442
|
+
"extensions",
|
|
443
|
+
"saoudrizwan.claude-dev-3.20.0",
|
|
444
|
+
"package.json",
|
|
445
|
+
),
|
|
446
|
+
"{}",
|
|
447
|
+
);
|
|
448
|
+
// Only VS Code's key is registered; Cline's `mcpServers` is absent.
|
|
449
|
+
writeFileSync(
|
|
450
|
+
join(cwd, ".vscode", "mcp.json"),
|
|
451
|
+
JSON.stringify({
|
|
452
|
+
servers: { pragma: { command: "pragma", args: ["mcp", "serve"], cwd } },
|
|
453
|
+
}),
|
|
231
454
|
);
|
|
232
455
|
|
|
233
|
-
const
|
|
234
|
-
|
|
235
|
-
expect(
|
|
236
|
-
|
|
456
|
+
const rows = await scopedChecks(bootRuntime(FLAGS, cwd), "pragma");
|
|
457
|
+
const { project } = inventory(rows);
|
|
458
|
+
expect(project?.detail).toBe("2 detected · 1 registered");
|
|
459
|
+
|
|
460
|
+
const vscode = project?.items?.find((i) => i.label === "VS Code");
|
|
461
|
+
expect(vscode?.status).toBe("pass");
|
|
462
|
+
expect(vscode?.detail).toContain("registered — ");
|
|
463
|
+
expect(vscode?.detail).not.toContain("differs");
|
|
464
|
+
|
|
465
|
+
const cline = project?.items?.find((i) => i.label === "Cline");
|
|
466
|
+
expect(cline?.status).toBe("available");
|
|
467
|
+
expect(cline?.detail).toContain("detected, not registered");
|
|
468
|
+
expect(cline?.detail).not.toContain("differs");
|
|
469
|
+
});
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
describe("doctor — a blocked skill link path is never reported as current", () => {
|
|
473
|
+
it("distinguishes a hand-placed real directory from a link that is correct", async () => {
|
|
474
|
+
// Detection marks both `skipped` — there is nothing to do to either — so
|
|
475
|
+
// the row counted the blocked path as healthy and said "links current"
|
|
476
|
+
// where no link exists at all.
|
|
477
|
+
const cwd = tmp("pragma-doctor-proj-");
|
|
478
|
+
const skillDir = join(cwd, ".pragma", "skills", "my-skill");
|
|
479
|
+
mkdirSync(skillDir, { recursive: true });
|
|
480
|
+
writeFileSync(
|
|
481
|
+
join(skillDir, "SKILL.md"),
|
|
482
|
+
"---\nname: my-skill\ndescription: A test skill.\n---\n",
|
|
483
|
+
);
|
|
484
|
+
// A hand-placed directory sitting exactly where the link would go.
|
|
485
|
+
mkdirSync(join(cwd, ".agents", "skills", "my-skill"), { recursive: true });
|
|
486
|
+
|
|
487
|
+
const rows = await scopedChecks(bootRuntime(FLAGS, cwd), "pragma");
|
|
488
|
+
const row = rows.find((r) => r.name === "skills" && r.scope === "project");
|
|
489
|
+
expect(row?.status).not.toBe("pass");
|
|
490
|
+
expect(row?.detail).toContain("real directory");
|
|
491
|
+
// And the remedy is the one that settles it — rerunning setup skips it.
|
|
492
|
+
expect(row?.remedy).toMatch(/Move or delete/);
|
|
493
|
+
});
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
describe("doctor — an EMPTY skills root is not diagnosed as an ABSENT one", () => {
|
|
497
|
+
it("reports an existing but empty project skills root as holding none", async () => {
|
|
498
|
+
// doctor publishes a DIAGNOSIS, so a wrong one is worse than a vague one:
|
|
499
|
+
// the shared skip line told the user `.pragma/skills` "is absent" while
|
|
500
|
+
// they were looking at the directory. Both surfaces read the same
|
|
501
|
+
// `rootExists` the detection already carries.
|
|
502
|
+
const cwd = tmp("pragma-doctor-proj-");
|
|
503
|
+
mkdirSync(join(cwd, ".pragma", "skills"), { recursive: true });
|
|
504
|
+
|
|
505
|
+
const rows = await scopedChecks(bootRuntime(FLAGS, cwd), "pragma");
|
|
506
|
+
const row = rows.find((r) => r.name === "skills" && r.scope === "project");
|
|
507
|
+
expect(row?.status).toBe("skip"); // still nothing to reconcile...
|
|
508
|
+
expect(row?.detail).toContain("is empty"); // ...for the true reason
|
|
509
|
+
expect(row?.detail).not.toContain("does not exist");
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
it("still reports a missing project skills root as absent", async () => {
|
|
513
|
+
const rows = await scopedChecks(
|
|
514
|
+
bootRuntime(FLAGS, tmp("pragma-doctor-proj-")),
|
|
515
|
+
"pragma",
|
|
516
|
+
);
|
|
517
|
+
const row = rows.find((r) => r.name === "skills" && r.scope === "project");
|
|
518
|
+
expect(row?.status).toBe("skip");
|
|
519
|
+
expect(row?.detail).toContain("does not exist");
|
|
520
|
+
});
|
|
521
|
+
});
|
|
522
|
+
|
|
523
|
+
describe("doctor — an unconfigured opt-in integration is available, not a fault", () => {
|
|
524
|
+
it("a detected harness with no MCP entry reports available with the setup command", async () => {
|
|
525
|
+
// Windsurf is detected (project signal) but nothing is configured. A fresh
|
|
526
|
+
// install lands exactly here, and a fresh install is healthy — so this is
|
|
527
|
+
// the `available` tier, keeping its actionable setup command, and it must
|
|
528
|
+
// never inflate the failure count.
|
|
529
|
+
const cwd = tmp("pragma-doctor-proj-");
|
|
530
|
+
mkdirSync(join(cwd, ".windsurf"), { recursive: true }); // ⇒ Windsurf detected
|
|
531
|
+
|
|
532
|
+
const rows = await scopedChecks(bootRuntime(FLAGS, cwd), "pragma");
|
|
533
|
+
const check = rows.find((r) => r.name === "mcp" && r.scope === "global");
|
|
534
|
+
expect(check?.status).toBe("available");
|
|
535
|
+
expect(check?.detail).toContain("not registered");
|
|
536
|
+
// The fix is the target's own invocation, derived from the row's id + scope.
|
|
537
|
+
expect(check?.remedy).toBe("pragma setup mcp");
|
|
237
538
|
});
|
|
238
539
|
});
|
|
@@ -14,14 +14,19 @@
|
|
|
14
14
|
|
|
15
15
|
import { BIN_NAME } from "../../constants.js";
|
|
16
16
|
import { asVerb } from "../../kernel/spec/asVerb.js";
|
|
17
|
-
import type { CapabilityModule, VerbSpec } from "../../kernel/spec/
|
|
17
|
+
import type { CapabilityModule, VerbSpec } from "../../kernel/spec/index.js";
|
|
18
18
|
import { doctorFormatters } from "./doctor.render.js";
|
|
19
19
|
import type { DoctorData } from "./types.js";
|
|
20
20
|
|
|
21
21
|
const doctorVerb: VerbSpec<Record<string, unknown>, DoctorData> = {
|
|
22
22
|
path: ["doctor"],
|
|
23
|
-
summary:
|
|
24
|
-
|
|
23
|
+
summary:
|
|
24
|
+
"Check your environment and every setup target, globally and in this project.",
|
|
25
|
+
// Two house rules constrain this string and both are PROTECTED: it may not
|
|
26
|
+
// name the distribution (`identity.test.ts`) and it may not spell a CLI flag
|
|
27
|
+
// (`toolDescriptions.test.ts`), so the inventory's widening is described as
|
|
28
|
+
// "the verbose global flag" rather than by its spelling.
|
|
29
|
+
doc: "Reports the environment checks first, then one row per setup target — once for your home directory, once for this project. Each row is pass, fail, available (an optional integration you have not set up yet), or skip (nothing to do here, and the row says why), with the next step printed inline. Every row is named after the setup target that repairs it, except `harnesses`: a listing, per scope, of the AI harnesses found on this machine and whether this CLI's MCP server is registered in each — the ones actually found, or every harness it knows about under the verbose global flag. Needs no store; the store check boots lazily and never fails the run.",
|
|
25
30
|
params: [],
|
|
26
31
|
output: { formatters: doctorFormatters },
|
|
27
32
|
examples: [
|
|
@@ -1,100 +1,102 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The `doctor` run body:
|
|
2
|
+
* The `doctor` run body: the unscoped environment checks plus the scoped rows
|
|
3
|
+
* the setup target table derives.
|
|
4
|
+
*
|
|
5
|
+
* Two kinds of finding live in one report and they are not the same kind. The
|
|
6
|
+
* ENVIRONMENT checks — the Node version, this CLI's own version, pack refs, the
|
|
7
|
+
* store — diagnose things `setup` cannot install; they carry no scope and stay
|
|
8
|
+
* their own section. The SCOPED rows are the setup targets, in both scopes,
|
|
9
|
+
* named with the target ids verbatim and repaired by the target's own command
|
|
10
|
+
* — plus, per scope, the `harnesses` inventory row: a listing of what this
|
|
11
|
+
* machine holds and where pragma stands in it, which is the thing the targets
|
|
12
|
+
* are measured against rather than a target itself. Adding a target adds its
|
|
13
|
+
* rows here for free.
|
|
3
14
|
*
|
|
4
15
|
* Checks are started eagerly (they run concurrently) and collected in
|
|
5
16
|
* declaration order for a deterministic report. Each is guarded so a thrown
|
|
6
|
-
* check becomes an attributable `fail` rather than aborting the whole run
|
|
7
|
-
*
|
|
8
|
-
*
|
|
17
|
+
* check becomes an attributable `fail` rather than aborting the whole run.
|
|
18
|
+
* Lazily imported by `doctor.verb.ts`, so neither the checks nor
|
|
19
|
+
* `@canonical/harnesses` land on the fast path.
|
|
9
20
|
*/
|
|
10
21
|
|
|
11
22
|
import { BIN_NAME } from "../../constants.js";
|
|
12
|
-
import type { PragmaRuntime } from "../../kernel/runtime/
|
|
13
|
-
import { checkConfigFile } from "./checks/checkConfigFile.js";
|
|
23
|
+
import type { PragmaRuntime } from "../../kernel/runtime/index.js";
|
|
14
24
|
import { checkKeStore } from "./checks/checkKeStore.js";
|
|
15
|
-
import { checkMcpCommands } from "./checks/checkMcpCommands.js";
|
|
16
|
-
import { checkMcpConfigured } from "./checks/checkMcpConfigured.js";
|
|
17
25
|
import { checkNodeVersion } from "./checks/checkNodeVersion.js";
|
|
18
26
|
import { checkPackageRefs } from "./checks/checkPackageRefs.js";
|
|
19
27
|
import { checkPragmaVersion } from "./checks/checkPragmaVersion.js";
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import type { CheckResult, DoctorData, ScopeBand } from "./types.js";
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* The band a check statically concerns, by name — for checks whose band is
|
|
26
|
-
* fixed by construction: skills always symlink into the per-repo project dir
|
|
27
|
-
* (`skillsPath` is project-rooted), and completions install into the user/home
|
|
28
|
-
* shell dir. The MCP checks are NOT here: they detect harnesses across BOTH
|
|
29
|
-
* bands, so each derives its own band from what it found (see `deriveBand`) and
|
|
30
|
-
* sets it on its own result — {@link attachBand} preserves that.
|
|
31
|
-
*/
|
|
32
|
-
const CHECK_BANDS: Record<string, ScopeBand> = {
|
|
33
|
-
"Skills symlinked": "project",
|
|
34
|
-
"Shell completions": "global",
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Attach a band tag to a check result. A check that already set its own band
|
|
39
|
-
* (the harness-derived MCP checks) keeps it; otherwise the static
|
|
40
|
-
* {@link CHECK_BANDS} map fills one in by name, if defined.
|
|
41
|
-
*/
|
|
42
|
-
function attachBand(result: CheckResult): CheckResult {
|
|
43
|
-
if (result.band !== undefined) return result;
|
|
44
|
-
const band = CHECK_BANDS[result.name];
|
|
45
|
-
return band ? { ...result, band } : result;
|
|
46
|
-
}
|
|
28
|
+
import { scopedChecks } from "./checks/targetHealth.js";
|
|
29
|
+
import type { CheckResult, DoctorData } from "./types.js";
|
|
47
30
|
|
|
48
31
|
/**
|
|
49
|
-
*
|
|
50
|
-
* matches the `name` each check returns on success,
|
|
51
|
-
* the same label and stays correlatable.
|
|
52
|
-
* order.
|
|
32
|
+
* The unscoped environment checks, each paired with the display name used if it
|
|
33
|
+
* rejects. The fallback name matches the `name` each check returns on success,
|
|
34
|
+
* so a thrown check reports the same label and stays correlatable.
|
|
53
35
|
*/
|
|
54
|
-
function
|
|
36
|
+
function buildEnvironmentChecks(
|
|
55
37
|
rt: PragmaRuntime,
|
|
56
38
|
): readonly [string, Promise<CheckResult>][] {
|
|
57
39
|
return [
|
|
58
40
|
["Node version", checkNodeVersion()],
|
|
59
41
|
[`${BIN_NAME} version`, checkPragmaVersion(rt)],
|
|
60
|
-
[`${BIN_NAME} config`, checkConfigFile(rt)],
|
|
61
42
|
["pack refs", checkPackageRefs(rt)],
|
|
62
|
-
["
|
|
63
|
-
["Shell completions", checkShellCompletions(rt.cwd)],
|
|
64
|
-
["MCP configured", checkMcpConfigured(rt.cwd)],
|
|
65
|
-
["MCP commands", checkMcpCommands(rt.cwd)],
|
|
66
|
-
["Skills symlinked", checkSkillsSymlinked(rt.cwd)],
|
|
43
|
+
["store", checkKeStore(rt)],
|
|
67
44
|
];
|
|
68
45
|
}
|
|
69
46
|
|
|
47
|
+
/** Turn a rejected check into an attributable failure rather than a crash. */
|
|
48
|
+
async function guarded(
|
|
49
|
+
name: string,
|
|
50
|
+
promise: Promise<CheckResult>,
|
|
51
|
+
): Promise<CheckResult> {
|
|
52
|
+
try {
|
|
53
|
+
return await promise;
|
|
54
|
+
} catch (error) {
|
|
55
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
56
|
+
return {
|
|
57
|
+
name,
|
|
58
|
+
status: "fail",
|
|
59
|
+
detail: `Check threw an unexpected error: ${reason}`,
|
|
60
|
+
remedy: `Re-run \`${BIN_NAME} doctor\`; if it persists, report this as a bug.`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
70
65
|
/**
|
|
71
|
-
* Run every
|
|
66
|
+
* Run every health check and aggregate the results.
|
|
72
67
|
*
|
|
73
68
|
* @param rt - The per-invocation runtime.
|
|
74
|
-
* @returns The `{ checks, passed, failed, skipped }` summary.
|
|
69
|
+
* @returns The `{ checks, passed, failed, available, skipped }` summary.
|
|
75
70
|
* @note Impure — the checks read the fs, boot the store, and detect harnesses.
|
|
76
71
|
*/
|
|
77
72
|
export async function runChecks(rt: PragmaRuntime): Promise<DoctorData> {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
73
|
+
// The scoped rows come back as a batch (one detection pass over the table),
|
|
74
|
+
// so they are guarded as a batch: a detection that throws becomes one
|
|
75
|
+
// attributable failure instead of taking the environment section with it.
|
|
76
|
+
const [environmentResults, scopedResults] = await Promise.all([
|
|
77
|
+
Promise.all(
|
|
78
|
+
buildEnvironmentChecks(rt).map(([name, promise]) =>
|
|
79
|
+
guarded(name, promise),
|
|
80
|
+
),
|
|
81
|
+
),
|
|
82
|
+
scopedChecks(rt, BIN_NAME).catch((error: unknown): CheckResult[] => [
|
|
83
|
+
{
|
|
84
|
+
name: "setup targets",
|
|
85
|
+
status: "fail",
|
|
86
|
+
detail: `Detection threw an unexpected error: ${
|
|
87
|
+
error instanceof Error ? error.message : String(error)
|
|
88
|
+
}`,
|
|
89
|
+
remedy: `Re-run \`${BIN_NAME} doctor\`; if it persists, report this as a bug.`,
|
|
90
|
+
},
|
|
91
|
+
]),
|
|
92
|
+
]);
|
|
93
93
|
|
|
94
|
+
const checks: CheckResult[] = [...environmentResults, ...scopedResults];
|
|
94
95
|
return {
|
|
95
96
|
checks,
|
|
96
97
|
passed: checks.filter((c) => c.status === "pass").length,
|
|
97
98
|
failed: checks.filter((c) => c.status === "fail").length,
|
|
99
|
+
available: checks.filter((c) => c.status === "available").length,
|
|
98
100
|
skipped: checks.filter((c) => c.status === "skip").length,
|
|
99
101
|
};
|
|
100
102
|
}
|