@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,5 +1,6 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
2
|
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { buildOptionInfo } from "@canonical/summon-core/projection";
|
|
3
4
|
import { describe, expect, it } from "vitest";
|
|
4
5
|
import { MCP_SERVER_NAME, VERSION } from "../constants.js";
|
|
5
6
|
import { emitSurface } from "../kernel/spec/emitSurface.js";
|
|
@@ -8,6 +9,7 @@ import {
|
|
|
8
9
|
type Covenant,
|
|
9
10
|
} from "../kernel/spec/surfaceConformance.js";
|
|
10
11
|
import { projectMcp } from "../testing/helpers/projectMcp.js";
|
|
12
|
+
import { CREATE_SURFACE } from "./create/createSurface.generated.js";
|
|
11
13
|
import { capabilities } from "./index.js";
|
|
12
14
|
|
|
13
15
|
/** The committed covenant, read from disk exactly as a consumer would. */
|
|
@@ -25,22 +27,40 @@ describe("surface conformance — capabilities ⊆ covenant (PROTECTED)", () =>
|
|
|
25
27
|
expect(() => assertConforms(emitted, golden)).not.toThrow();
|
|
26
28
|
});
|
|
27
29
|
|
|
28
|
-
it("emits config
|
|
30
|
+
it("emits the four config verbs — show, get, set, unset — in covenant order", () => {
|
|
29
31
|
// AV-228 B3 retired the per-field `tier`/`channel`/`detail` setters; the
|
|
30
|
-
// config noun is
|
|
32
|
+
// config noun is the `show` dump, the `get <key>` single read, the
|
|
33
|
+
// `set <key> <value>` writer, and the `unset <key>` clearer. Reading one
|
|
34
|
+
// value and clearing one field are commands of their own — neither hides
|
|
35
|
+
// inside `show --format json` nor inside a reserved `set` value.
|
|
31
36
|
expect(emitted.nouns.config?.verbs).toEqual([
|
|
32
37
|
{ v: "show", mcp: "config_show" },
|
|
38
|
+
{ v: "get", args: ["<key>"], mcp: "config_get" },
|
|
33
39
|
{
|
|
34
40
|
v: "set",
|
|
35
41
|
args: ["<key>", "<value>"],
|
|
36
42
|
mutates: true,
|
|
37
43
|
mcp: "config_set",
|
|
38
44
|
},
|
|
45
|
+
{
|
|
46
|
+
v: "unset",
|
|
47
|
+
args: ["<key>"],
|
|
48
|
+
mutates: true,
|
|
49
|
+
mcp: "config_unset",
|
|
50
|
+
},
|
|
39
51
|
]);
|
|
40
52
|
// info stays a data-only enrichment — its emitted verb is unchanged.
|
|
41
53
|
expect(emitted.nouns.info?.verbs).toEqual([{ v: "info", mcp: "info" }]);
|
|
42
|
-
//
|
|
43
|
-
|
|
54
|
+
// `version` is the command form of `--version`: one value, two spellings
|
|
55
|
+
// of the same read, and no tool — the version already rides `info`.
|
|
56
|
+
expect(emitted.nouns.version?.verbs).toEqual([
|
|
57
|
+
{ v: "version", mcp: false },
|
|
58
|
+
]);
|
|
59
|
+
// The server entry is a real noun/verb pair, emitted like any other and
|
|
60
|
+
// carrying no tool — it serves a protocol, it is not an agent tool.
|
|
61
|
+
expect(emitted.nouns.mcp?.verbs).toEqual([{ v: "serve", mcp: false }]);
|
|
62
|
+
// The completion resolver stays hidden — it is a protocol between the
|
|
63
|
+
// shell script and the bin, not a command anyone types.
|
|
44
64
|
expect(emitted.nouns.__complete).toBeUndefined();
|
|
45
65
|
});
|
|
46
66
|
|
|
@@ -105,15 +125,8 @@ describe("surface conformance — capabilities ⊆ covenant (PROTECTED)", () =>
|
|
|
105
125
|
needsStore: true,
|
|
106
126
|
mcp: "ontology_lookup",
|
|
107
127
|
},
|
|
108
|
-
//
|
|
109
|
-
//
|
|
110
|
-
{
|
|
111
|
-
v: "show",
|
|
112
|
-
args: ["<prefix>"],
|
|
113
|
-
flags: ["--properties", "--full-uris", "--class"],
|
|
114
|
-
needsStore: true,
|
|
115
|
-
mcp: "ontology_show",
|
|
116
|
-
},
|
|
128
|
+
// One job, one spelling: `lookup` is the by-name read, and nothing
|
|
129
|
+
// else answers to it.
|
|
117
130
|
]);
|
|
118
131
|
// skill discovery is storeless (filesystem) — no needsStore.
|
|
119
132
|
expect(emitted.nouns.skill?.verbs).toEqual([
|
|
@@ -137,6 +150,92 @@ describe("surface conformance — capabilities ⊆ covenant (PROTECTED)", () =>
|
|
|
137
150
|
]);
|
|
138
151
|
});
|
|
139
152
|
|
|
153
|
+
it("emits the L-CIS create noun — projected grammar, deep-equal to the covenant", () => {
|
|
154
|
+
// The create surface DERIVES from the generators' prompts (L-CIS): the
|
|
155
|
+
// framework tree segment is a required positional enum, component's flags
|
|
156
|
+
// are the framework union (incl. the svelte-only --use-ts-stories), and
|
|
157
|
+
// every flag AND positional token is the REGISTERED spelling (L-CIS-2) —
|
|
158
|
+
// a default-true confirm registers ONLY its `--no-<kebab>` form, and the
|
|
159
|
+
// args carry the kebab positional the usage line prints, so the covenant
|
|
160
|
+
// names `--no-with-styles` and `[component-path]`, never a
|
|
161
|
+
// `--with-styles` the CLI rejects or a `[componentPath]` its help never
|
|
162
|
+
// prints. Pin the three entries verbatim so a prompt edit that moves the
|
|
163
|
+
// covenant is SEEN.
|
|
164
|
+
expect(emitted.nouns.create?.verbs).toEqual([
|
|
165
|
+
{
|
|
166
|
+
v: "component",
|
|
167
|
+
args: ["<framework>", "[component-path]"],
|
|
168
|
+
flags: [
|
|
169
|
+
"--no-with-styles",
|
|
170
|
+
"--no-with-stories",
|
|
171
|
+
"--no-with-ssr-tests",
|
|
172
|
+
"--use-ts-stories",
|
|
173
|
+
],
|
|
174
|
+
mutates: true,
|
|
175
|
+
mcp: "create_component",
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
v: "package",
|
|
179
|
+
flags: [
|
|
180
|
+
"--name",
|
|
181
|
+
"--type",
|
|
182
|
+
"--description",
|
|
183
|
+
"--with-react",
|
|
184
|
+
"--with-storybook",
|
|
185
|
+
"--with-cli",
|
|
186
|
+
"--with-pr-template",
|
|
187
|
+
"--no-run-install",
|
|
188
|
+
],
|
|
189
|
+
mutates: true,
|
|
190
|
+
mcp: "create_package",
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
v: "application",
|
|
194
|
+
args: ["[app-path]"],
|
|
195
|
+
// ssr/router are GONE: always-on facts, not prompts — the pair had no
|
|
196
|
+
// reachable explicit form (only `--no-` spellings the generator's own
|
|
197
|
+
// guard rejected), so the projection no longer carries them.
|
|
198
|
+
flags: ["--no-forms", "--intl", "--relay", "--no-run-install"],
|
|
199
|
+
mutates: true,
|
|
200
|
+
mcp: "create_application",
|
|
201
|
+
},
|
|
202
|
+
]);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it("every create covenant flag token is buildOptionInfo's primary registered long form (L-CIS-2)", () => {
|
|
206
|
+
// The derivation tie: the covenant's create tokens must be EXACTLY the
|
|
207
|
+
// long forms the single flag-shape authority yields for the projected
|
|
208
|
+
// prompts — the same expression both binaries register from — so the
|
|
209
|
+
// covenant can never again teach a spelling the CLI rejects (the
|
|
210
|
+
// round-15 F2 defect: kebab-cased param names blessed `--with-styles`
|
|
211
|
+
// and rejected the real `--no-with-styles`).
|
|
212
|
+
const registered = new Map<string, string>();
|
|
213
|
+
for (const surface of Object.values(CREATE_SURFACE)) {
|
|
214
|
+
for (const prompt of surface.prompts) {
|
|
215
|
+
if (prompt.positional === true) continue;
|
|
216
|
+
registered.set(
|
|
217
|
+
prompt.name,
|
|
218
|
+
buildOptionInfo(prompt).flags.split(" ")[0] as string,
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
for (const verb of emitted.nouns.create?.verbs ?? []) {
|
|
223
|
+
expect(verb.flags?.length ?? 0).toBeGreaterThan(0);
|
|
224
|
+
for (const token of verb.flags ?? []) {
|
|
225
|
+
expect([...registered.values()]).toContain(token);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// …and every non-positional projected prompt is named by some entry.
|
|
229
|
+
const covenantTokens = new Set(
|
|
230
|
+
(emitted.nouns.create?.verbs ?? []).flatMap((verb) => verb.flags ?? []),
|
|
231
|
+
);
|
|
232
|
+
for (const [name, token] of registered) {
|
|
233
|
+
expect(covenantTokens.has(token), `${name} → ${token} missing`).toBe(
|
|
234
|
+
true,
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
|
|
140
239
|
it("emits the PR6 effect/diagnostic self-verbs (doctor, upgrade)", () => {
|
|
141
240
|
// doctor is a storeless read self-verb — no args, no flags, no needsStore.
|
|
142
241
|
expect(emitted.nouns.doctor?.verbs).toEqual([
|
|
@@ -158,8 +257,8 @@ describe("surface conformance — capabilities ⊆ covenant (PROTECTED)", () =>
|
|
|
158
257
|
it("emits setup as a mixed self+sub noun (self is a tool, sub-verbs are mcp:false)", () => {
|
|
159
258
|
// The one covenant noun both directly runnable AND with sub-verbs. The self
|
|
160
259
|
// verb is the `setup` tool; the four installers are CLI-only (mcp:false).
|
|
161
|
-
// The
|
|
162
|
-
// flags; completions/lsp are single-
|
|
260
|
+
// The scope-aware verbs (setup/mcp/skills) carry the --scope/--global/--local
|
|
261
|
+
// flags; completions/lsp are single-scope installers with no scope.
|
|
163
262
|
expect(emitted.nouns.setup?.verbs).toEqual([
|
|
164
263
|
{
|
|
165
264
|
v: "setup",
|
|
@@ -167,20 +266,36 @@ describe("surface conformance — capabilities ⊆ covenant (PROTECTED)", () =>
|
|
|
167
266
|
mutates: true,
|
|
168
267
|
mcp: "setup",
|
|
169
268
|
},
|
|
269
|
+
{
|
|
270
|
+
v: "config",
|
|
271
|
+
flags: ["--scope", "--global", "--local"],
|
|
272
|
+
mutates: true,
|
|
273
|
+
mcp: false,
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
v: "completions",
|
|
277
|
+
flags: ["--scope", "--global", "--local"],
|
|
278
|
+
mutates: true,
|
|
279
|
+
mcp: false,
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
v: "lsp",
|
|
283
|
+
flags: ["--scope", "--global", "--local"],
|
|
284
|
+
mutates: true,
|
|
285
|
+
mcp: false,
|
|
286
|
+
},
|
|
170
287
|
{
|
|
171
288
|
v: "mcp",
|
|
172
289
|
flags: ["--scope", "--global", "--local"],
|
|
173
290
|
mutates: true,
|
|
174
291
|
mcp: false,
|
|
175
292
|
},
|
|
176
|
-
{ v: "completions", mutates: true, mcp: false },
|
|
177
293
|
{
|
|
178
294
|
v: "skills",
|
|
179
295
|
flags: ["--scope", "--global", "--local"],
|
|
180
296
|
mutates: true,
|
|
181
297
|
mcp: false,
|
|
182
298
|
},
|
|
183
|
-
{ v: "lsp", mutates: true, mcp: false },
|
|
184
299
|
]);
|
|
185
300
|
});
|
|
186
301
|
|
|
@@ -200,6 +315,8 @@ describe("surface conformance — capabilities ⊆ covenant (PROTECTED)", () =>
|
|
|
200
315
|
"standard_sample",
|
|
201
316
|
"tier_list",
|
|
202
317
|
"config_show",
|
|
318
|
+
"config_get",
|
|
319
|
+
"config_unset",
|
|
203
320
|
"colophon",
|
|
204
321
|
]) {
|
|
205
322
|
expect(tools).toContain(tool);
|
|
@@ -213,14 +330,14 @@ describe("surface COMPLETE — emitted == covenant (PROTECTED)", () => {
|
|
|
213
330
|
// The CLOSING direction: assertConforms already proves emitted ⊆ covenant;
|
|
214
331
|
// this proves covenant ⊆ emitted, so together the tool sets are EQUAL — the
|
|
215
332
|
// surface-complete milestone. After PR7, every covenant tool is realized.
|
|
216
|
-
it("emits every covenant tool (all
|
|
333
|
+
it("emits every covenant tool (all 42) — set equality with the covenant", () => {
|
|
217
334
|
const emittedTools = new Set(emitted.mcpSurface.tools);
|
|
218
335
|
const missing = golden.mcpSurface.tools.filter((t) => !emittedTools.has(t));
|
|
219
336
|
expect(missing).toEqual([]);
|
|
220
337
|
expect([...emitted.mcpSurface.tools].sort()).toEqual(
|
|
221
338
|
[...golden.mcpSurface.tools].sort(),
|
|
222
339
|
);
|
|
223
|
-
expect(emitted.mcpSurface.tools).toHaveLength(
|
|
340
|
+
expect(emitted.mcpSurface.tools).toHaveLength(42);
|
|
224
341
|
});
|
|
225
342
|
|
|
226
343
|
// The covenant edit: the non-tool MCP surface is frozen too.
|
|
@@ -13,6 +13,11 @@
|
|
|
13
13
|
* by `assertExecOk` as an actionable UNSUPPORTED (exit 1) — the interpreter
|
|
14
14
|
* RESOLVES on a nonzero exit, so the check is the consumer's job.
|
|
15
15
|
* - offline / already-latest carry NO exec — a real run just returns the status.
|
|
16
|
+
* - a non-global install (linked / ephemeral / workspace / unknown) also
|
|
17
|
+
* carries NO exec even when an update exists: there is no command pragma may
|
|
18
|
+
* run for it, so the task reports the delta plus the state's guidance and
|
|
19
|
+
* mutates nothing. `pmUpdateCommand` only accepts the global arm, so this is
|
|
20
|
+
* enforced by the types, not by convention.
|
|
16
21
|
*
|
|
17
22
|
* The whole registry read is preview-safe, so no `mutation.preview` gating is
|
|
18
23
|
* needed here (unlike `sources update`, whose heavy resolve must be gated).
|
|
@@ -21,13 +26,16 @@
|
|
|
21
26
|
*/
|
|
22
27
|
|
|
23
28
|
import { $, exec, gen, info, type Task, warn } from "@canonical/task";
|
|
24
|
-
import type { PragmaRuntime } from "../../kernel/runtime/
|
|
25
|
-
import { assertExecOk, guardMissingBinary } from "../shared/assertExecOk.js";
|
|
29
|
+
import type { PragmaRuntime } from "../../kernel/runtime/index.js";
|
|
26
30
|
import {
|
|
31
|
+
assertExecOk,
|
|
32
|
+
checkRegistryVersion,
|
|
27
33
|
detectInstallSource,
|
|
34
|
+
guardMissingBinary,
|
|
35
|
+
PRAGMA_PACKAGE,
|
|
28
36
|
pmUpdateCommand,
|
|
29
|
-
|
|
30
|
-
|
|
37
|
+
updateGuidance,
|
|
38
|
+
} from "../shared/index.js";
|
|
31
39
|
import type { UpgradeData } from "./types.js";
|
|
32
40
|
|
|
33
41
|
/**
|
|
@@ -44,8 +52,15 @@ export async function runUpgrade(
|
|
|
44
52
|
): Promise<Task<UpgradeData>> {
|
|
45
53
|
const { channel } = (await rt.loadConfig()).config;
|
|
46
54
|
const install = detectInstallSource();
|
|
47
|
-
|
|
55
|
+
// Only a GLOBAL install has a sanctioned update command — the type of
|
|
56
|
+
// `pmUpdateCommand` enforces the narrowing. A linked checkout in particular
|
|
57
|
+
// must never be handed `npm i -g`: it would overwrite the development link.
|
|
58
|
+
const command =
|
|
59
|
+
install.kind === "global"
|
|
60
|
+
? pmUpdateCommand(install, PRAGMA_PACKAGE)
|
|
61
|
+
: undefined;
|
|
48
62
|
const pm = install.label;
|
|
63
|
+
const kind = install.kind;
|
|
49
64
|
const current = rt.version;
|
|
50
65
|
|
|
51
66
|
const registry = await checkRegistryVersion(PRAGMA_PACKAGE, channel);
|
|
@@ -53,17 +68,16 @@ export async function runUpgrade(
|
|
|
53
68
|
if (registry === undefined) {
|
|
54
69
|
const data: UpgradeData = {
|
|
55
70
|
pm,
|
|
71
|
+
kind,
|
|
56
72
|
current,
|
|
57
73
|
latest: undefined,
|
|
58
|
-
command,
|
|
74
|
+
...(command !== undefined ? { command } : {}),
|
|
59
75
|
offline: true,
|
|
60
76
|
alreadyLatest: false,
|
|
61
77
|
executed: false,
|
|
62
78
|
};
|
|
63
79
|
return gen(function* () {
|
|
64
|
-
yield* $(
|
|
65
|
-
warn("Could not reach the registry — skipped the update check."),
|
|
66
|
-
);
|
|
80
|
+
yield* $(warn("Cannot reach the registry — skipped the update check."));
|
|
67
81
|
return data;
|
|
68
82
|
});
|
|
69
83
|
}
|
|
@@ -71,9 +85,10 @@ export async function runUpgrade(
|
|
|
71
85
|
if (registry.latest === current) {
|
|
72
86
|
const data: UpgradeData = {
|
|
73
87
|
pm,
|
|
88
|
+
kind,
|
|
74
89
|
current,
|
|
75
90
|
latest: registry.latest,
|
|
76
|
-
command,
|
|
91
|
+
...(command !== undefined ? { command } : {}),
|
|
77
92
|
offline: false,
|
|
78
93
|
alreadyLatest: true,
|
|
79
94
|
executed: false,
|
|
@@ -84,20 +99,44 @@ export async function runUpgrade(
|
|
|
84
99
|
});
|
|
85
100
|
}
|
|
86
101
|
|
|
102
|
+
if (install.kind !== "global") {
|
|
103
|
+
// An update exists, but this install has no command pragma may run for
|
|
104
|
+
// it — say so honestly and run NOTHING. (The discriminant narrowing is
|
|
105
|
+
// what lets `updateGuidance` accept `install` here.)
|
|
106
|
+
const guidance = updateGuidance(install);
|
|
107
|
+
const data: UpgradeData = {
|
|
108
|
+
pm,
|
|
109
|
+
kind,
|
|
110
|
+
current,
|
|
111
|
+
latest: registry.latest,
|
|
112
|
+
guidance,
|
|
113
|
+
offline: false,
|
|
114
|
+
alreadyLatest: false,
|
|
115
|
+
executed: false,
|
|
116
|
+
};
|
|
117
|
+
return gen(function* () {
|
|
118
|
+
yield* $(info(`${current} → ${registry.latest}`));
|
|
119
|
+
yield* $(warn(`No automatic upgrade for this install: ${guidance}`));
|
|
120
|
+
return data;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const updateCommand = pmUpdateCommand(install, PRAGMA_PACKAGE);
|
|
87
125
|
const data: UpgradeData = {
|
|
88
126
|
pm,
|
|
127
|
+
kind,
|
|
89
128
|
current,
|
|
90
129
|
latest: registry.latest,
|
|
91
|
-
command,
|
|
130
|
+
command: updateCommand,
|
|
92
131
|
offline: false,
|
|
93
132
|
alreadyLatest: false,
|
|
94
133
|
executed: true,
|
|
95
134
|
};
|
|
96
|
-
const parts =
|
|
135
|
+
const parts = updateCommand.split(" ");
|
|
97
136
|
const bin = parts[0] ?? "npm";
|
|
98
137
|
const args = parts.slice(1);
|
|
99
138
|
// Guard the spawn: an absent package manager (`bin` not on PATH) REJECTS the
|
|
100
|
-
// exec with ENOENT, which would collapse to INTERNAL_ERROR ("
|
|
139
|
+
// exec with ENOENT, which would collapse to INTERNAL_ERROR ("report
|
|
101
140
|
// this issue"). Surface it as a named "`<pm>` not found on PATH" instead.
|
|
102
141
|
return guardMissingBinary(
|
|
103
142
|
bin,
|
|
@@ -112,7 +151,7 @@ export async function runUpgrade(
|
|
|
112
151
|
// so inspect the result: a failed install (e.g. EACCES on a global
|
|
113
152
|
// `npm i -g`) must fail loudly, not report a silent success.
|
|
114
153
|
const result = yield* $(exec(bin, args, rt.cwd));
|
|
115
|
-
assertExecOk(
|
|
154
|
+
assertExecOk(updateCommand, result);
|
|
116
155
|
return data;
|
|
117
156
|
}),
|
|
118
157
|
);
|
|
@@ -2,16 +2,24 @@
|
|
|
2
2
|
* Data shape for `pragma upgrade`.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
+
import type { InstallKind } from "../../kernel/render/vocabulary.js";
|
|
6
|
+
|
|
5
7
|
/** The outcome of an upgrade run (or its plan). */
|
|
6
8
|
export interface UpgradeData {
|
|
7
9
|
/** The install-source label (e.g. `bun (global)`). */
|
|
8
10
|
readonly pm: string;
|
|
11
|
+
/** The install-source state behind the label. */
|
|
12
|
+
readonly kind: InstallKind;
|
|
9
13
|
/** The currently-installed version. */
|
|
10
14
|
readonly current: string;
|
|
11
15
|
/** The latest published version, or `undefined` when offline. */
|
|
12
16
|
readonly latest: string | undefined;
|
|
13
|
-
/** The package-manager command that applies the update
|
|
14
|
-
|
|
17
|
+
/** The package-manager command that applies the update — only for a GLOBAL
|
|
18
|
+
* install; every other state carries {@link guidance} instead. */
|
|
19
|
+
readonly command?: string;
|
|
20
|
+
/** The honest sentence for an install with no sanctioned update command
|
|
21
|
+
* (linked / ephemeral / workspace / unknown). */
|
|
22
|
+
readonly guidance?: string;
|
|
15
23
|
/** True when the registry could not be reached. */
|
|
16
24
|
readonly offline: boolean;
|
|
17
25
|
/** True when the installed version is already the latest. */
|
|
@@ -7,15 +7,15 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import chalk from "chalk";
|
|
10
|
-
import type { Formatters } from "../../kernel/spec/
|
|
11
|
-
import { PRAGMA_PACKAGE } from "../shared/
|
|
10
|
+
import type { Formatters } from "../../kernel/spec/index.js";
|
|
11
|
+
import { PRAGMA_PACKAGE } from "../shared/index.js";
|
|
12
12
|
import type { UpgradeData } from "./types.js";
|
|
13
13
|
|
|
14
14
|
export const upgradeFormatters: Formatters<UpgradeData> = {
|
|
15
15
|
plain(data) {
|
|
16
16
|
const lines = [`Installed via: ${data.pm}`];
|
|
17
17
|
if (data.offline) {
|
|
18
|
-
lines.push("
|
|
18
|
+
lines.push("Cannot reach the registry — try again later.");
|
|
19
19
|
return lines.join("\n");
|
|
20
20
|
}
|
|
21
21
|
if (data.alreadyLatest) {
|
|
@@ -33,20 +33,26 @@ export const upgradeFormatters: Formatters<UpgradeData> = {
|
|
|
33
33
|
"",
|
|
34
34
|
`Updated to ${data.latest}.`,
|
|
35
35
|
);
|
|
36
|
-
} else {
|
|
36
|
+
} else if (data.command) {
|
|
37
37
|
lines.push(`Run: ${chalk.cyan(data.command)}`);
|
|
38
|
+
} else {
|
|
39
|
+
// No sanctioned command for this install (linked / ephemeral /
|
|
40
|
+
// workspace / unknown) — the guidance sentence is the whole story.
|
|
41
|
+
lines.push(`No automatic upgrade for this install: ${data.guidance}`);
|
|
38
42
|
}
|
|
39
43
|
return lines.join("\n");
|
|
40
44
|
},
|
|
41
45
|
|
|
42
46
|
llm(data) {
|
|
43
|
-
if (data.offline)
|
|
44
|
-
return "Upgrade check failed: could not reach the registry.";
|
|
47
|
+
if (data.offline) return "Upgrade check failed: cannot reach the registry.";
|
|
45
48
|
if (data.alreadyLatest) {
|
|
46
49
|
return `Already at the latest version (${data.current}).`;
|
|
47
50
|
}
|
|
48
51
|
if (data.executed) return `Upgraded: ${data.current} → ${data.latest}`;
|
|
49
|
-
|
|
52
|
+
if (data.command) {
|
|
53
|
+
return `Update available: ${data.current} → ${data.latest} (\`${data.command}\`)`;
|
|
54
|
+
}
|
|
55
|
+
return `Update available: ${data.current} → ${data.latest} — ${data.guidance}`;
|
|
50
56
|
},
|
|
51
57
|
|
|
52
58
|
json(data) {
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
guardMissingBinary,
|
|
29
29
|
isMissingBinaryError,
|
|
30
30
|
} from "../shared/assertExecOk.js";
|
|
31
|
+
import type { InstallSource } from "../shared/index.js";
|
|
31
32
|
import {
|
|
32
33
|
checkRegistryVersion,
|
|
33
34
|
REGISTRY_TIMEOUT_MS,
|
|
@@ -36,6 +37,22 @@ import { runUpgrade } from "./runUpgrade.js";
|
|
|
36
37
|
import type { UpgradeData } from "./types.js";
|
|
37
38
|
import { upgradeModule } from "./upgrade.verb.js";
|
|
38
39
|
|
|
40
|
+
// Pin the install-source detection: the real detector reads THIS process
|
|
41
|
+
// (whose entry is a source checkout — an honest `unknown` with no command,
|
|
42
|
+
// which would starve every update-needed case of its exec). Detection itself
|
|
43
|
+
// is covered by `shared/packageManager.test.ts`; here it is a fixture.
|
|
44
|
+
const detection = vi.hoisted(() => ({ install: undefined as unknown }));
|
|
45
|
+
vi.mock("../shared/index.js", async (importOriginal) => ({
|
|
46
|
+
...(await importOriginal<object>()),
|
|
47
|
+
detectInstallSource: () => detection.install,
|
|
48
|
+
}));
|
|
49
|
+
|
|
50
|
+
const GLOBAL_NPM: InstallSource = {
|
|
51
|
+
kind: "global",
|
|
52
|
+
pm: "npm",
|
|
53
|
+
label: "npm (global)",
|
|
54
|
+
};
|
|
55
|
+
|
|
39
56
|
const upgradeVerb = upgradeModule.verbs[0] as VerbSpec;
|
|
40
57
|
const FLAGS_JSON: GlobalFlags = {
|
|
41
58
|
llm: false,
|
|
@@ -71,6 +88,7 @@ let prevXdg: string | undefined;
|
|
|
71
88
|
beforeEach(() => {
|
|
72
89
|
prevXdg = process.env.XDG_CONFIG_HOME;
|
|
73
90
|
process.env.XDG_CONFIG_HOME = tmpCwd();
|
|
91
|
+
detection.install = GLOBAL_NPM;
|
|
74
92
|
});
|
|
75
93
|
afterEach(() => {
|
|
76
94
|
process.env.XDG_CONFIG_HOME = prevXdg;
|
|
@@ -181,6 +199,60 @@ describe("upgrade — update needed", () => {
|
|
|
181
199
|
});
|
|
182
200
|
});
|
|
183
201
|
|
|
202
|
+
describe("upgrade — a non-global install NEVER gets an exec (the headline)", () => {
|
|
203
|
+
const LINKED: InstallSource = {
|
|
204
|
+
kind: "linked",
|
|
205
|
+
pm: "npm",
|
|
206
|
+
target: "/home/u/code/pragma/packages/cli/pragma",
|
|
207
|
+
label: "npm link (development checkout)",
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
it("linked + update available: no command, no exec — guidance instead", async () => {
|
|
211
|
+
// The case that must never regress: `npm i -g` against an npm-linked
|
|
212
|
+
// install would OVERWRITE the symlink to the development worktree.
|
|
213
|
+
detection.install = LINKED;
|
|
214
|
+
stubRegistry("99.0.0");
|
|
215
|
+
const task = await runUpgrade(bootRuntime(FLAGS_JSON, tmpCwd()));
|
|
216
|
+
const { value, effects } = dryRun(task);
|
|
217
|
+
expect(value.executed).toBe(false);
|
|
218
|
+
expect(value.command).toBeUndefined();
|
|
219
|
+
expect(value.kind).toBe("linked");
|
|
220
|
+
expect(value.guidance).toMatch(/development checkout/i);
|
|
221
|
+
expect(effects.some((e) => e._tag === "Exec")).toBe(false);
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
it("--dry-run through dispatch plans NO Execute line for a linked install", async () => {
|
|
225
|
+
detection.install = LINKED;
|
|
226
|
+
stubRegistry("99.0.0");
|
|
227
|
+
const outcome = await executeVerb(
|
|
228
|
+
upgradeVerb,
|
|
229
|
+
{},
|
|
230
|
+
DRY,
|
|
231
|
+
bootRuntime(FLAGS_JSON, tmpCwd()),
|
|
232
|
+
);
|
|
233
|
+
const plan = JSON.parse(outcome.stdout as string).data.plan as string[];
|
|
234
|
+
expect(plan.some((line) => line.startsWith("Execute:"))).toBe(false);
|
|
235
|
+
expect(plan.some((line) => line.includes("No automatic upgrade"))).toBe(
|
|
236
|
+
true,
|
|
237
|
+
);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it("an ephemeral run reports its state with no command either", async () => {
|
|
241
|
+
detection.install = {
|
|
242
|
+
kind: "ephemeral",
|
|
243
|
+
runner: "npx",
|
|
244
|
+
label: "npx (ephemeral)",
|
|
245
|
+
} satisfies InstallSource;
|
|
246
|
+
stubRegistry("99.0.0");
|
|
247
|
+
const { value, effects } = dryRun(
|
|
248
|
+
await runUpgrade(bootRuntime(FLAGS_JSON, tmpCwd())),
|
|
249
|
+
);
|
|
250
|
+
expect(value.executed).toBe(false);
|
|
251
|
+
expect(value.command).toBeUndefined();
|
|
252
|
+
expect(effects.some((e) => e._tag === "Exec")).toBe(false);
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
|
|
184
256
|
describe("assertExecOk — the exec-exitCode guard", () => {
|
|
185
257
|
it("returns on a zero exit and throws an actionable UNSUPPORTED (with stderr) on nonzero", () => {
|
|
186
258
|
expect(() =>
|
|
@@ -199,10 +271,10 @@ describe("assertExecOk — the exec-exitCode guard", () => {
|
|
|
199
271
|
}
|
|
200
272
|
const err = asPragmaError(thrown);
|
|
201
273
|
// A denied `npm i -g` is user-fixable, NOT a bug — so it must not tell the
|
|
202
|
-
// user to "
|
|
274
|
+
// user to "report this issue" (that is INTERNAL_ERROR's recovery).
|
|
203
275
|
expect(err.code).toBe("UNSUPPORTED");
|
|
204
276
|
expect(err.recovery?.message).not.toContain("report this issue");
|
|
205
|
-
expect(err.recovery?.message).toMatch(/
|
|
277
|
+
expect(err.recovery?.message).toMatch(/elevated privileges/i);
|
|
206
278
|
// Surfaces the command + exit code + the captured stderr (trimmed).
|
|
207
279
|
expect(err.message).toContain("npm i -g @canonical/pragma-cli");
|
|
208
280
|
expect(err.message).toContain("code 13");
|
|
@@ -276,7 +348,7 @@ describe("upgrade — a failed exec maps to an actionable runtime error (exit 1)
|
|
|
276
348
|
|
|
277
349
|
it("a missing-binary spawn (ENOENT) at a guarded site is a named UNSUPPORTED, not INTERNAL_ERROR", async () => {
|
|
278
350
|
// The same wrapper `runUpgrade`/`setupLsp` apply: a spawn ENOENT REJECTS the
|
|
279
|
-
// exec, which used to collapse to INTERNAL_ERROR ("
|
|
351
|
+
// exec, which used to collapse to INTERNAL_ERROR ("report this issue").
|
|
280
352
|
// `guardMissingBinary` names it instead.
|
|
281
353
|
const thrown = await runToError(
|
|
282
354
|
failVerbWith((_p, rt) =>
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
import type { Task } from "@canonical/task";
|
|
17
17
|
import { BIN_NAME } from "../../constants.js";
|
|
18
18
|
import { asVerb } from "../../kernel/spec/asVerb.js";
|
|
19
|
-
import type { CapabilityModule, VerbSpec } from "../../kernel/spec/
|
|
19
|
+
import type { CapabilityModule, VerbSpec } from "../../kernel/spec/index.js";
|
|
20
20
|
import type { UpgradeData } from "./types.js";
|
|
21
21
|
import { upgradeFormatters } from "./upgrade.render.js";
|
|
22
22
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `version` capability barrel — the command form of `--version`.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { CapabilityModule } from "../../kernel/spec/index.js";
|
|
6
|
+
import { versionVerbSpec } from "./version.verb.js";
|
|
7
|
+
|
|
8
|
+
/** The `version` capability module. */
|
|
9
|
+
export const versionModule: CapabilityModule = {
|
|
10
|
+
name: "version",
|
|
11
|
+
verbs: [versionVerbSpec],
|
|
12
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `pragma version` — the command form of `--version`.
|
|
3
|
+
*
|
|
4
|
+
* The verb exists because users type it; the ONLY thing worth pinning is that
|
|
5
|
+
* it is not a second answer to the same question. The process-boundary cell
|
|
6
|
+
* compares the two spellings byte for byte through the shipped entry, so a
|
|
7
|
+
* change to either one that does not change the other reddens here. The rest
|
|
8
|
+
* pins the covenant slice and the storeless, tool-free shape.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { describe, expect, it } from "vitest";
|
|
12
|
+
import { VERSION } from "../../constants.js";
|
|
13
|
+
import { executeVerb } from "../../kernel/project/cli/dispatch.js";
|
|
14
|
+
import { bootRuntime } from "../../kernel/runtime/boot.js";
|
|
15
|
+
import type { GlobalFlags } from "../../kernel/runtime/types.js";
|
|
16
|
+
import { emitVerb } from "../../kernel/spec/emitSurface.js";
|
|
17
|
+
import { runCli } from "../../testing/helpers/runCli.js";
|
|
18
|
+
import { versionModule } from "./index.js";
|
|
19
|
+
|
|
20
|
+
const FLAGS: GlobalFlags = {
|
|
21
|
+
llm: false,
|
|
22
|
+
autoLlm: false,
|
|
23
|
+
format: "plain",
|
|
24
|
+
verbose: false,
|
|
25
|
+
};
|
|
26
|
+
const REAL = { dryRun: false, undo: false, yes: false };
|
|
27
|
+
const versionVerb = versionModule.verbs[0];
|
|
28
|
+
|
|
29
|
+
describe("version — covenant-exact emission (PROTECTED)", () => {
|
|
30
|
+
it("emits a no-argument self-verb with NO tool", () => {
|
|
31
|
+
// The version already rides `info` and the MCP handshake's serverInfo, so
|
|
32
|
+
// a tool here would be a third way to ask one question.
|
|
33
|
+
expect(emitVerb(versionVerb)).toEqual({ v: "version", mcp: false });
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
describe("version — one value, two spellings of the same read", () => {
|
|
38
|
+
it("prints the version and never boots the store", async () => {
|
|
39
|
+
const rt = bootRuntime(FLAGS, process.cwd());
|
|
40
|
+
const outcome = await executeVerb(versionVerb, {}, REAL, rt);
|
|
41
|
+
expect(outcome.stdout).toBe(`${VERSION}\n`);
|
|
42
|
+
expect(outcome.exitCode).toBe(0);
|
|
43
|
+
expect(rt.store.booted).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("json carries the value under a named field, not a bare scalar", async () => {
|
|
47
|
+
const outcome = await executeVerb(
|
|
48
|
+
versionVerb,
|
|
49
|
+
{},
|
|
50
|
+
REAL,
|
|
51
|
+
bootRuntime({ ...FLAGS, format: "json" }, process.cwd()),
|
|
52
|
+
);
|
|
53
|
+
expect(JSON.parse(outcome.stdout ?? "").data).toEqual({
|
|
54
|
+
version: VERSION,
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("the verb and the flag print the SAME bytes through the shipped entry", () => {
|
|
59
|
+
const fromVerb = runCli(["version"]);
|
|
60
|
+
const fromFlag = runCli(["--version"]);
|
|
61
|
+
expect(fromVerb.exitCode).toBe(0);
|
|
62
|
+
expect(fromFlag.exitCode).toBe(0);
|
|
63
|
+
expect(fromVerb.stdout).toBe(fromFlag.stdout);
|
|
64
|
+
expect(fromVerb.stdout).toBe(`${VERSION}\n`);
|
|
65
|
+
});
|
|
66
|
+
});
|