@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
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `commandOf` reads BOTH registered entry shapes.
|
|
3
|
+
*
|
|
4
|
+
* A harness whose schema requires `command` to be an argv array (OpenCode)
|
|
5
|
+
* carries the executable in the first element; a string-valued `command` IS the
|
|
6
|
+
* executable. Reading only the string form made doctor skip an entry `setup`
|
|
7
|
+
* had just written correctly — and report no command-based servers on a fully
|
|
8
|
+
* configured machine. The two shapes must resolve to the same executable, which
|
|
9
|
+
* is what these cases pin.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
13
|
+
import { tmpdir } from "node:os";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import type { PlatformEnv } from "@canonical/harnesses";
|
|
16
|
+
import { afterAll, describe, expect, it } from "vitest";
|
|
17
|
+
import { commandOf, commandResolves } from "./mcpCommand.js";
|
|
18
|
+
|
|
19
|
+
describe("commandOf — one executable, either entry shape", () => {
|
|
20
|
+
it("reads a string command", () => {
|
|
21
|
+
expect(commandOf({ command: "pragma", args: ["mcp", "serve"] })).toBe(
|
|
22
|
+
"pragma",
|
|
23
|
+
);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("reads the executable out of an argv array", () => {
|
|
27
|
+
expect(commandOf({ command: ["pragma", "mcp", "serve"] })).toBe("pragma");
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("skips the leading empty element rather than returning it", () => {
|
|
31
|
+
expect(commandOf({ command: ["", "pragma"] })).toBe("pragma");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("has no command for an HTTP entry", () => {
|
|
35
|
+
expect(commandOf({ type: "http", url: "https://example.test" })).toBe(
|
|
36
|
+
undefined,
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("has no command for an empty string, an empty array, or a non-entry", () => {
|
|
41
|
+
expect(commandOf({ command: "" })).toBe(undefined);
|
|
42
|
+
expect(commandOf({ command: [] })).toBe(undefined);
|
|
43
|
+
expect(commandOf(null)).toBe(undefined);
|
|
44
|
+
expect(commandOf("pragma")).toBe(undefined);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe("commandResolves — the host's own resolution rules", () => {
|
|
49
|
+
const dirs: string[] = [];
|
|
50
|
+
const tmp = (): string => {
|
|
51
|
+
const dir = mkdtempSync(join(tmpdir(), "pragma-mcp-path-"));
|
|
52
|
+
dirs.push(dir);
|
|
53
|
+
return dir;
|
|
54
|
+
};
|
|
55
|
+
afterAll(() => {
|
|
56
|
+
for (const dir of dirs) rmSync(dir, { recursive: true, force: true });
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const hostOf = (
|
|
60
|
+
platform: PlatformEnv["platform"],
|
|
61
|
+
dir: string,
|
|
62
|
+
): PlatformEnv => ({
|
|
63
|
+
platform,
|
|
64
|
+
env: { PATH: dir },
|
|
65
|
+
home: dir,
|
|
66
|
+
isWsl: false,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("resolves a Windows shim, which a bare-name PATH join cannot see", async () => {
|
|
70
|
+
// npm installs the CLI as `pragma.cmd` on Windows. Joining the bare name
|
|
71
|
+
// onto each PATH directory found nothing, so a registration `setup` had
|
|
72
|
+
// just written correctly was reported as a dead command. (The file is
|
|
73
|
+
// spelled to match a default `PATHEXT` entry exactly, because this test
|
|
74
|
+
// runs on a case-sensitive filesystem.)
|
|
75
|
+
const dir = tmp();
|
|
76
|
+
writeFileSync(join(dir, "pragma.CMD"), "");
|
|
77
|
+
expect(await commandResolves("pragma", dir, hostOf("win32", dir))).toBe(
|
|
78
|
+
true,
|
|
79
|
+
);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("resolves a bare name off PATH elsewhere, and says no when it is absent", async () => {
|
|
83
|
+
const dir = tmp();
|
|
84
|
+
writeFileSync(join(dir, "pragma"), "");
|
|
85
|
+
expect(await commandResolves("pragma", dir, hostOf("linux", dir))).toBe(
|
|
86
|
+
true,
|
|
87
|
+
);
|
|
88
|
+
expect(await commandResolves("absent", dir, hostOf("linux", dir))).toBe(
|
|
89
|
+
false,
|
|
90
|
+
);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("checks a path-bearing command as a file, relative to the project root", async () => {
|
|
94
|
+
const dir = tmp();
|
|
95
|
+
writeFileSync(join(dir, "local-bin"), "");
|
|
96
|
+
expect(
|
|
97
|
+
await commandResolves("./local-bin", dir, hostOf("linux", dir)),
|
|
98
|
+
).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command resolution for MCP server entries.
|
|
3
|
+
*
|
|
4
|
+
* A dead `command` makes every agent session try and fail to boot the server,
|
|
5
|
+
* so the `mcp` doctor row reports whether the entry it owns resolves. The row
|
|
6
|
+
* judges ONLY the entry this CLI writes: an aggregate check over every server
|
|
7
|
+
* in the file failed the row whenever some FOREIGN server had a dead command,
|
|
8
|
+
* which is a fact about someone else's tool reported as this one's fault.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { existsSync } from "node:fs";
|
|
12
|
+
import { isAbsolute, join } from "node:path";
|
|
13
|
+
import type { PlatformEnv } from "@canonical/harnesses";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Extract the stdio command from an MCP server config entry, if any. HTTP/SSE
|
|
17
|
+
* entries (`{ type: "http", url }`) have no command and are not checked.
|
|
18
|
+
*
|
|
19
|
+
* Both entry shapes resolve to the same executable. A harness whose schema
|
|
20
|
+
* requires `command` to be an argv array (OpenCode) carries the executable in
|
|
21
|
+
* its first element; a string-valued `command` IS the executable. Reading only
|
|
22
|
+
* the string form made this check skip an entry `setup` had just written
|
|
23
|
+
* correctly, and report no command-based servers on a configured machine.
|
|
24
|
+
*/
|
|
25
|
+
export function commandOf(entry: unknown): string | undefined {
|
|
26
|
+
if (typeof entry !== "object" || entry === null) return undefined;
|
|
27
|
+
const command = (entry as { command?: unknown }).command;
|
|
28
|
+
if (typeof command === "string") {
|
|
29
|
+
return command.length > 0 ? command : undefined;
|
|
30
|
+
}
|
|
31
|
+
if (Array.isArray(command)) {
|
|
32
|
+
return command.find(
|
|
33
|
+
(part): part is string => typeof part === "string" && part.length > 0,
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Resolve a command the way the host would: a path-bearing entry is checked as
|
|
41
|
+
* a file (relative to the project root), a bare name is searched across `PATH`
|
|
42
|
+
* through `@canonical/harnesses`' `executableCandidates`, which owns the PATH
|
|
43
|
+
* split and the win32 `PATHEXT` rules in one place.
|
|
44
|
+
*
|
|
45
|
+
* The bare-name arm used to join the name onto each PATH directory, which
|
|
46
|
+
* cannot see the `.cmd` shim npm installs on Windows: a registration this CLI
|
|
47
|
+
* had just written correctly was reported as a dead command.
|
|
48
|
+
*
|
|
49
|
+
* @param command - The executable the entry names.
|
|
50
|
+
* @param cwd - The project root a relative command is resolved against.
|
|
51
|
+
* @param platform - The captured host to use instead of this one (tests).
|
|
52
|
+
* @returns Whether the command resolves on this machine.
|
|
53
|
+
* @note Impure — tests candidate paths on the filesystem.
|
|
54
|
+
*/
|
|
55
|
+
export async function commandResolves(
|
|
56
|
+
command: string,
|
|
57
|
+
cwd: string,
|
|
58
|
+
platform?: PlatformEnv,
|
|
59
|
+
): Promise<boolean> {
|
|
60
|
+
if (command.includes("/") || command.includes("\\")) {
|
|
61
|
+
return existsSync(isAbsolute(command) ? command : join(cwd, command));
|
|
62
|
+
}
|
|
63
|
+
const { executableCandidates, readPlatformEnv } = await import(
|
|
64
|
+
"@canonical/harnesses"
|
|
65
|
+
);
|
|
66
|
+
return executableCandidates(command, platform ?? readPlatformEnv()).some(
|
|
67
|
+
(candidate) => existsSync(candidate),
|
|
68
|
+
);
|
|
69
|
+
}
|
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The scoped doctor rows, derived from the setup target table.
|
|
3
|
+
*
|
|
4
|
+
* `doctor` and `setup` are the SAME LIST. Every scoped row here carries a
|
|
5
|
+
* target id verbatim — `completions`, not "Shell completions"; `mcp`, not "MCP
|
|
6
|
+
* configured" — because the row name IS the fix command's argument, and a user
|
|
7
|
+
* who reads `✗ mcp` beside `fix: pragma setup mcp` can see that they are the
|
|
8
|
+
* same thing. Two checks reporting on one target under two different names, one
|
|
9
|
+
* of which no command accepts, is how a report ends up describing a machine
|
|
10
|
+
* nobody can repair.
|
|
11
|
+
*
|
|
12
|
+
* Every row's detection comes from the target table's own `detect`, so the two
|
|
13
|
+
* surfaces cannot disagree about what they looked at, and every `fix:` is
|
|
14
|
+
* derived from the row's id and scope rather than authored per check.
|
|
15
|
+
*
|
|
16
|
+
* Doctor's UNSCOPED environment checks (Node version, the CLI's own version,
|
|
17
|
+
* pack refs, the store) diagnose things setup cannot install and stay outside
|
|
18
|
+
* this list.
|
|
19
|
+
*
|
|
20
|
+
* ONE scoped row is not a target: `harnesses`, the per-scope inventory. It is an
|
|
21
|
+
* inventory of the machine the targets are measured against, not a target that
|
|
22
|
+
* can be set up, so it deliberately carries no `fix:` and can never be `fail`
|
|
23
|
+
* or `available` — see {@link inventoryChecks}. The bijection between the other
|
|
24
|
+
* rows and the setup table is untouched: `harnesses` is not a `TargetId`, and
|
|
25
|
+
* nothing derives a command from it.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { MCP_SERVER_NAME } from "../../../constants.js";
|
|
29
|
+
import type { PragmaRuntime } from "../../../kernel/runtime/index.js";
|
|
30
|
+
import {
|
|
31
|
+
type DetectedRow,
|
|
32
|
+
detectionFailure,
|
|
33
|
+
detectTargets,
|
|
34
|
+
resolveRoots,
|
|
35
|
+
} from "../../setup/buildPlan.js";
|
|
36
|
+
import type {
|
|
37
|
+
CompletionsDetection,
|
|
38
|
+
ConfigDetection,
|
|
39
|
+
} from "../../setup/operations/index.js";
|
|
40
|
+
import {
|
|
41
|
+
type LspDetection,
|
|
42
|
+
lspEditorNames,
|
|
43
|
+
lspSkipReason,
|
|
44
|
+
type McpDetection,
|
|
45
|
+
mcpGroupState,
|
|
46
|
+
mcpWriteState,
|
|
47
|
+
type SkillsDetection,
|
|
48
|
+
skillsSkipReason,
|
|
49
|
+
skillsSkipRemedy,
|
|
50
|
+
} from "../../setup/operations/index.js";
|
|
51
|
+
import { shortenPath, TARGET_IDS } from "../../setup/plan.js";
|
|
52
|
+
import { MCP_NO_LOCATION } from "../../setup/targets.js";
|
|
53
|
+
import type { CheckItem, CheckResult, Scope } from "../types.js";
|
|
54
|
+
import { checkShellCompletions } from "./checkShellCompletions.js";
|
|
55
|
+
import {
|
|
56
|
+
harnessInventory,
|
|
57
|
+
type InventoryGroup,
|
|
58
|
+
type InventoryHarness,
|
|
59
|
+
inventoryHealth,
|
|
60
|
+
} from "./harnessInventory.js";
|
|
61
|
+
import { commandResolves } from "./mcpCommand.js";
|
|
62
|
+
|
|
63
|
+
/** What a row reports before its name, scope and `fix:` line are attached. */
|
|
64
|
+
interface Health {
|
|
65
|
+
readonly status: CheckResult["status"];
|
|
66
|
+
readonly detail: string;
|
|
67
|
+
readonly items?: readonly CheckItem[];
|
|
68
|
+
/**
|
|
69
|
+
* A remedy that is NOT the derived setup command — the zsh activation line,
|
|
70
|
+
* for instance, which setup cannot perform for the user. Absent means "the
|
|
71
|
+
* fix is to run the target's own setup command", which is the default and the
|
|
72
|
+
* reason the bijection holds without anyone authoring it.
|
|
73
|
+
*/
|
|
74
|
+
readonly remedy?: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** The `config` row: the global config file exists and parses. */
|
|
78
|
+
const configHealth = (
|
|
79
|
+
d: ConfigDetection,
|
|
80
|
+
roots: { global: string; project: string },
|
|
81
|
+
): Health => {
|
|
82
|
+
const path = shortenPath(d.path, roots);
|
|
83
|
+
if (!d.exists)
|
|
84
|
+
return { status: "available", detail: `${path} does not exist yet` };
|
|
85
|
+
if (!d.parses) {
|
|
86
|
+
return { status: "fail", detail: `${path} cannot be parsed as JSON` };
|
|
87
|
+
}
|
|
88
|
+
return { status: "pass", detail: `${path} — valid` };
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/** The `lsp` row — the first this report has ever had. */
|
|
92
|
+
const lspHealth = (d: LspDetection): Health => {
|
|
93
|
+
if (d.state === "unknown") {
|
|
94
|
+
return { status: "skip", detail: lspSkipReason(d) };
|
|
95
|
+
}
|
|
96
|
+
const editors = lspEditorNames(d).join(", ");
|
|
97
|
+
return d.state === "installed"
|
|
98
|
+
? { status: "pass", detail: `installed in ${editors}` }
|
|
99
|
+
: { status: "available", detail: `not installed in ${editors}` };
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* The `mcp` row: one sub-item per file, each saying whether the entry is
|
|
104
|
+
* present, current, and bootable. Two separate checks used to report this —
|
|
105
|
+
* one for presence, one for command resolution — and the second judged every
|
|
106
|
+
* server in the file, so a foreign server's dead command failed this CLI's row.
|
|
107
|
+
*/
|
|
108
|
+
async function mcpHealth(
|
|
109
|
+
d: McpDetection,
|
|
110
|
+
scope: Scope,
|
|
111
|
+
cwd: string,
|
|
112
|
+
roots: { global: string; project: string },
|
|
113
|
+
): Promise<Health> {
|
|
114
|
+
if (d.groups.length === 0) {
|
|
115
|
+
return { status: "skip", detail: MCP_NO_LOCATION[scope] };
|
|
116
|
+
}
|
|
117
|
+
const resolves = await commandResolves(MCP_SERVER_NAME, cwd);
|
|
118
|
+
const items: CheckItem[] = d.groups.map((group) => {
|
|
119
|
+
const state = mcpGroupState(d, group.path);
|
|
120
|
+
const label = shortenPath(group.path, roots);
|
|
121
|
+
if (state === "absent") {
|
|
122
|
+
return { label, status: "available", detail: "not registered" };
|
|
123
|
+
}
|
|
124
|
+
if (state === "drifted") {
|
|
125
|
+
return { label, status: "fail", detail: "entry differs from current" };
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
label,
|
|
129
|
+
status: resolves ? "pass" : "fail",
|
|
130
|
+
detail: resolves
|
|
131
|
+
? `registered, and \`${MCP_SERVER_NAME}\` is on PATH`
|
|
132
|
+
: `registered, but \`${MCP_SERVER_NAME}\` is not on PATH`,
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
const configured = items.filter((item) => item.status === "pass").length;
|
|
136
|
+
const failing = items.filter((item) => item.status === "fail").length;
|
|
137
|
+
if (failing > 0) {
|
|
138
|
+
return {
|
|
139
|
+
status: "fail",
|
|
140
|
+
detail: `${failing} of ${items.length} config files need attention`,
|
|
141
|
+
items,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
if (configured === 0) {
|
|
145
|
+
// Absence in the LOCAL PROJECT is not a failure: registering there is
|
|
146
|
+
// opt-in, so a repository with no checked-in MCP config is healthy. The
|
|
147
|
+
// line says so rather than leaving "(opt-in)" to be decoded.
|
|
148
|
+
return scope === "project"
|
|
149
|
+
? {
|
|
150
|
+
status: "skip",
|
|
151
|
+
detail:
|
|
152
|
+
"not registered for this project — per-project registration is opt-in",
|
|
153
|
+
}
|
|
154
|
+
: {
|
|
155
|
+
status: "available",
|
|
156
|
+
detail: `not registered in any of ${items.length} config files`,
|
|
157
|
+
items,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
status: configured === items.length ? "pass" : "available",
|
|
162
|
+
detail: `registered in ${configured} of ${items.length} config files`,
|
|
163
|
+
items,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** The `skills` row: every expected link present, lstat-verified, none stale. */
|
|
168
|
+
function skillsHealth(
|
|
169
|
+
d: SkillsDetection,
|
|
170
|
+
scope: Scope,
|
|
171
|
+
roots: { global: string; project: string },
|
|
172
|
+
): Health {
|
|
173
|
+
const short = shortenPath(d.sourceRoot, roots);
|
|
174
|
+
// Stale links this scope owns are work even when the root holds no skill, so
|
|
175
|
+
// the row is only a skip once there is nothing left to reconcile either.
|
|
176
|
+
const orphans = d.rootExists ? d.orphans.length : 0;
|
|
177
|
+
if (!d.available && orphans === 0) {
|
|
178
|
+
// The skip carries a remedy — `setup`'s row and this row are the same
|
|
179
|
+
// finding, and the dead-end version of it ("no skills installed", no next
|
|
180
|
+
// step) was reported identically by both surfaces.
|
|
181
|
+
return {
|
|
182
|
+
status: "skip",
|
|
183
|
+
detail: skillsSkipReason(short, scope, d.rootExists),
|
|
184
|
+
remedy: skillsSkipRemedy(short, scope),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
if (orphans > 0) {
|
|
188
|
+
return {
|
|
189
|
+
status: "available",
|
|
190
|
+
detail: `${orphans} link${orphans === 1 ? "" : "s"} point at a skill that is gone`,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
const stale = d.actions.filter((a) => a.action === "replaced").length;
|
|
194
|
+
const missing = d.actions.filter((a) => a.action === "created").length;
|
|
195
|
+
if (stale > 0) {
|
|
196
|
+
return {
|
|
197
|
+
status: "fail",
|
|
198
|
+
detail: `${stale} of ${d.actions.length} links point elsewhere`,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
// A hand-placed real directory is `skipped` like an already-correct link is,
|
|
202
|
+
// and reporting the two the same way made this row say "links current" where
|
|
203
|
+
// no link exists at all. Setup will never clear such a path — it is not this
|
|
204
|
+
// command's to delete — so the row carries the only remedy that settles it.
|
|
205
|
+
// A symlink pointing outside every root pragma owns is `skipped` so setup
|
|
206
|
+
// will never delete it — which would make this row claim "links current" over
|
|
207
|
+
// a path where the user's own link shadows a shipped skill. `skipped` also
|
|
208
|
+
// covers an already-correct link (owned) and a real directory (blocked), so
|
|
209
|
+
// the foreign case is what is left.
|
|
210
|
+
const foreign = d.actions.filter(
|
|
211
|
+
(a) => a.action === "skipped" && !a.owned && !a.blocked,
|
|
212
|
+
).length;
|
|
213
|
+
if (foreign > 0) {
|
|
214
|
+
return {
|
|
215
|
+
status: "available",
|
|
216
|
+
detail: `${foreign} of ${d.actions.length} link paths hold a symlink pragma does not own`,
|
|
217
|
+
remedy:
|
|
218
|
+
"Move or delete the symlink at that path, then link the skills again.",
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
const blocked = d.actions.filter((a) => a.blocked).length;
|
|
222
|
+
if (blocked > 0) {
|
|
223
|
+
return {
|
|
224
|
+
status: "available",
|
|
225
|
+
detail: `${blocked} of ${d.actions.length} link paths hold a real directory`,
|
|
226
|
+
remedy:
|
|
227
|
+
"Move or delete the directory at that path, then link the skills again.",
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
if (missing > 0) {
|
|
231
|
+
return {
|
|
232
|
+
status: "available",
|
|
233
|
+
detail: `${missing} of ${d.actions.length} links not created`,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
return { status: "pass", detail: `${d.actions.length} links current` };
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Map one detected row onto its health. The `completions` row delegates to the
|
|
241
|
+
* check that owns the three gates the script depends on — the resolver answers,
|
|
242
|
+
* the installed bytes are current, and zsh has the directory on its `fpath`.
|
|
243
|
+
*/
|
|
244
|
+
async function healthOf(
|
|
245
|
+
row: DetectedRow,
|
|
246
|
+
rt: PragmaRuntime,
|
|
247
|
+
roots: { global: string; project: string },
|
|
248
|
+
): Promise<Health> {
|
|
249
|
+
// A detection that threw is reported as ITS OWN failing row. Letting the
|
|
250
|
+
// rejection escape took the whole scoped section of the report with it, so a
|
|
251
|
+
// single unreadable config file left the user with no rows at all — the one
|
|
252
|
+
// moment the report is most worth having.
|
|
253
|
+
const failure = detectionFailure(row);
|
|
254
|
+
if (failure !== undefined) return { status: "fail", detail: failure };
|
|
255
|
+
switch (row.target.id) {
|
|
256
|
+
case "config":
|
|
257
|
+
return configHealth(row.detection as ConfigDetection, roots);
|
|
258
|
+
case "completions": {
|
|
259
|
+
const result = await checkShellCompletions(
|
|
260
|
+
rt.cwd,
|
|
261
|
+
row.detection as CompletionsDetection,
|
|
262
|
+
);
|
|
263
|
+
return {
|
|
264
|
+
status: result.status,
|
|
265
|
+
detail: result.detail,
|
|
266
|
+
...(result.remedy === undefined ? {} : { remedy: result.remedy }),
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
case "lsp":
|
|
270
|
+
return lspHealth(row.detection as LspDetection);
|
|
271
|
+
case "mcp":
|
|
272
|
+
return mcpHealth(row.detection as McpDetection, row.scope, rt.cwd, roots);
|
|
273
|
+
default:
|
|
274
|
+
return skillsHealth(row.detection as SkillsDetection, row.scope, roots);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/** The scoped inventory row's name — a LISTING, not a setup target id. */
|
|
279
|
+
export const INVENTORY_CHECK = "harnesses";
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* The `harnesses` row for one scope: what this machine has, and where pragma
|
|
283
|
+
* stands in each.
|
|
284
|
+
*
|
|
285
|
+
* It is the one scoped row that is NOT a target, and it earns that by never
|
|
286
|
+
* competing with the ones that are. Its status is only `pass` or `skip`, so it
|
|
287
|
+
* adds no failure and no `available` to the tally, and it derives no `fix:` —
|
|
288
|
+
* the `mcp` and `skills` rows beside it already name every command a harness
|
|
289
|
+
* needs, and repeating them here would be the same finding seen twice.
|
|
290
|
+
*
|
|
291
|
+
* The registry is the only thing detection could not supply: `detectHarnesses`
|
|
292
|
+
* filters to hits, so "Windsurf is not on this machine" was unrepresentable
|
|
293
|
+
* until the universe came from somewhere. Everything else — which harnesses
|
|
294
|
+
* share which file, and whether each one's own entry in it is current — is read
|
|
295
|
+
* straight off the `mcp` detection this report already ran. The projection to
|
|
296
|
+
* {@link InventoryGroup} is deliberate: `McpDetection` holds
|
|
297
|
+
* `writeMcpConfigTargets`/`removeMcpConfigFrom` as live functions, and a
|
|
298
|
+
* `mutates: false` command should be unable to reach a writer, not merely
|
|
299
|
+
* trusted not to.
|
|
300
|
+
*
|
|
301
|
+
* This is also where the harness↔`mcpKey` association is REJOINED, because it
|
|
302
|
+
* is the one place that holds both halves: `TargetGroup` records the names
|
|
303
|
+
* sharing a file and, separately, one write per distinct `mcpKey`, and the
|
|
304
|
+
* registry is what says which key a given harness writes. Without that join the
|
|
305
|
+
* only state available per harness is the file's aggregate — and a
|
|
306
|
+
* `.vscode/mcp.json` where VS Code's `servers` entry is current while Cline's
|
|
307
|
+
* `mcpServers` is absent aggregates to `drifted`, which would report BOTH
|
|
308
|
+
* harnesses as drifted when neither one is.
|
|
309
|
+
*
|
|
310
|
+
* @param rt - The per-invocation runtime (read for `--verbose`).
|
|
311
|
+
* @param rows - Every detected row, both scopes, as `scopedChecks` has them.
|
|
312
|
+
* @param roots - The roots every path renders relative to.
|
|
313
|
+
* @returns One inventory {@link CheckResult} per scope, global then project.
|
|
314
|
+
* @note Impure — dynamically imports the harness registry.
|
|
315
|
+
*/
|
|
316
|
+
async function inventoryChecks(
|
|
317
|
+
rt: PragmaRuntime,
|
|
318
|
+
rows: readonly DetectedRow[],
|
|
319
|
+
roots: { global: string; project: string },
|
|
320
|
+
): Promise<CheckResult[]> {
|
|
321
|
+
const { harnesses, isHarnessInBand } = await import("@canonical/harnesses");
|
|
322
|
+
const verbose = rt.globalFlags.verbose;
|
|
323
|
+
const scopes: readonly Scope[] = ["global", "project"];
|
|
324
|
+
// The key each harness NAME writes under — the half of the association
|
|
325
|
+
// `groupConfigTargets` consumed and did not record. Names are the only
|
|
326
|
+
// identity a group carries, and the registry's are unique.
|
|
327
|
+
const keyByName = new Map(harnesses.map((h) => [h.name, h.mcpKey]));
|
|
328
|
+
|
|
329
|
+
return scopes.map((scope): CheckResult => {
|
|
330
|
+
// `isHarnessInBand(harness.scope, scope, scope)` — the scope asked for as
|
|
331
|
+
// its OWN selection ("band" is the harnesses package's name for it) — is
|
|
332
|
+
// exactly "does this harness have a config location here", which is the
|
|
333
|
+
// question `detectMcp` already answers for that scope. Asking it under the
|
|
334
|
+
// `both` selection would instead answer "who writes here when both scopes
|
|
335
|
+
// run", and report every dual-scope harness as having no global location.
|
|
336
|
+
const registry: InventoryHarness[] = harnesses.map((harness) => ({
|
|
337
|
+
id: harness.id,
|
|
338
|
+
name: harness.name,
|
|
339
|
+
inScope: isHarnessInBand(harness.scope, scope, scope),
|
|
340
|
+
}));
|
|
341
|
+
|
|
342
|
+
const mcpRow = rows.find(
|
|
343
|
+
(row) => row.target.id === "mcp" && row.scope === scope,
|
|
344
|
+
);
|
|
345
|
+
if (mcpRow === undefined || detectionFailure(mcpRow) !== undefined) {
|
|
346
|
+
return {
|
|
347
|
+
name: INVENTORY_CHECK,
|
|
348
|
+
status: "skip",
|
|
349
|
+
detail: "harness detection did not settle — see the `mcp` row",
|
|
350
|
+
scope,
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
const detection = mcpRow.detection as McpDetection;
|
|
355
|
+
const groups: InventoryGroup[] = detection.groups.map((group) => ({
|
|
356
|
+
path: shortenPath(group.path, roots),
|
|
357
|
+
harnesses: group.harnessNames.map((name) => {
|
|
358
|
+
// The harness's OWN write in this file. A name the registry does not
|
|
359
|
+
// know (or a key no write carries — impossible while the group was
|
|
360
|
+
// built from the same registry) falls back to the file's aggregate:
|
|
361
|
+
// strictly no worse than the state before this join existed.
|
|
362
|
+
const write = group.writes.find(
|
|
363
|
+
(w) => w.mcpKey === keyByName.get(name),
|
|
364
|
+
);
|
|
365
|
+
return {
|
|
366
|
+
name,
|
|
367
|
+
state:
|
|
368
|
+
write === undefined
|
|
369
|
+
? mcpGroupState(detection, group.path)
|
|
370
|
+
: mcpWriteState(detection, write),
|
|
371
|
+
};
|
|
372
|
+
}),
|
|
373
|
+
}));
|
|
374
|
+
|
|
375
|
+
const health = inventoryHealth(
|
|
376
|
+
harnessInventory(registry, groups, scope),
|
|
377
|
+
verbose,
|
|
378
|
+
);
|
|
379
|
+
return {
|
|
380
|
+
name: INVENTORY_CHECK,
|
|
381
|
+
status: health.status,
|
|
382
|
+
detail: health.detail,
|
|
383
|
+
scope,
|
|
384
|
+
...(health.items.length === 0 ? {} : { items: health.items }),
|
|
385
|
+
};
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* The command that repairs a row — derived from its id and scope, never
|
|
391
|
+
* authored. This is the bijection made mechanical: a row exists because a
|
|
392
|
+
* target exists, and its fix is that target's own invocation.
|
|
393
|
+
*/
|
|
394
|
+
export const fixCommandFor = (id: string, scope: Scope, bin: string): string =>
|
|
395
|
+
`${bin} setup ${id}${scope === "project" ? " --local" : ""}`;
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Run every scoped check: the target table, both scopes, in table order, then
|
|
399
|
+
* each scope's harness inventory.
|
|
400
|
+
*
|
|
401
|
+
* The inventory rows come LAST within the array, and the renderer partitions by
|
|
402
|
+
* scope while preserving order, so each scope's section ends with the listing of
|
|
403
|
+
* what that scope actually holds — the targets first, then the machine they were
|
|
404
|
+
* measured against. They ride on the SAME detection pass: no target is probed a
|
|
405
|
+
* second time to produce them.
|
|
406
|
+
*
|
|
407
|
+
* @param rt - The per-invocation runtime.
|
|
408
|
+
* @param bin - The binary name the `fix:` lines are derived from.
|
|
409
|
+
* @returns One {@link CheckResult} per (target, scope), plus one per scope.
|
|
410
|
+
* @note Impure — every target's detection reads the real filesystem.
|
|
411
|
+
*/
|
|
412
|
+
export async function scopedChecks(
|
|
413
|
+
rt: PragmaRuntime,
|
|
414
|
+
bin: string,
|
|
415
|
+
): Promise<CheckResult[]> {
|
|
416
|
+
const roots = await resolveRoots(rt);
|
|
417
|
+
const detected = await detectTargets(rt, [...TARGET_IDS], "both");
|
|
418
|
+
const [targetRows, inventoryRows] = await Promise.all([
|
|
419
|
+
Promise.all(
|
|
420
|
+
detected.map(async (row): Promise<CheckResult> => {
|
|
421
|
+
const health = await healthOf(row, rt, roots);
|
|
422
|
+
const needsFix =
|
|
423
|
+
health.status === "fail" || health.status === "available";
|
|
424
|
+
// A `skip` gets no DERIVED fix — re-running the target's own setup command
|
|
425
|
+
// would reproduce the skip. But a skip that AUTHORED a remedy has found a
|
|
426
|
+
// real next step on this machine (fill the scope's skill root, say), and
|
|
427
|
+
// dropping it is what made the skip a dead end on both surfaces.
|
|
428
|
+
const remedy = needsFix
|
|
429
|
+
? (health.remedy ?? fixCommandFor(row.target.id, row.scope, bin))
|
|
430
|
+
: health.remedy;
|
|
431
|
+
return {
|
|
432
|
+
name: row.target.id,
|
|
433
|
+
status: health.status,
|
|
434
|
+
detail: health.detail,
|
|
435
|
+
scope: row.scope,
|
|
436
|
+
...(health.items === undefined ? {} : { items: health.items }),
|
|
437
|
+
...(remedy === undefined ? {} : { remedy }),
|
|
438
|
+
};
|
|
439
|
+
}),
|
|
440
|
+
),
|
|
441
|
+
inventoryChecks(rt, detected, roots),
|
|
442
|
+
]);
|
|
443
|
+
return [...targetRows, ...inventoryRows];
|
|
444
|
+
}
|