@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,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `config get <key>` and `config unset <key>` — the single-value reader and
|
|
3
|
+
* the field clearer (COVENANT).
|
|
4
|
+
*
|
|
5
|
+
* The pair closes the config family: `show` dumps everything, `get` answers
|
|
6
|
+
* one question, `set` writes one field, `unset` removes one. These tests pin
|
|
7
|
+
* the emitted covenant slices, the shell contract `get`'s plain form exists
|
|
8
|
+
* for (the BARE value on stdout, nothing at all when the field is unset), the
|
|
9
|
+
* layering `get` reports through `source`, and `unset`'s round trip with
|
|
10
|
+
* `set` — including that it is a mutation over MCP, plan-first like every
|
|
11
|
+
* other write.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
|
|
15
|
+
import { tmpdir } from "node:os";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
18
|
+
import { globalConfigPath } from "../../kernel/config/paths.js";
|
|
19
|
+
import { PragmaError } from "../../kernel/error/PragmaError.js";
|
|
20
|
+
import {
|
|
21
|
+
executeVerb,
|
|
22
|
+
extractParams,
|
|
23
|
+
} from "../../kernel/project/cli/dispatch.js";
|
|
24
|
+
import { bootRuntime } from "../../kernel/runtime/boot.js";
|
|
25
|
+
import type { GlobalFlags } from "../../kernel/runtime/types.js";
|
|
26
|
+
import { emitVerb } from "../../kernel/spec/emitSurface.js";
|
|
27
|
+
import type { VerbSpec } from "../../kernel/spec/types.js";
|
|
28
|
+
import { projectMcp } from "../../testing/helpers/projectMcp.js";
|
|
29
|
+
import { configModule } from "./index.js";
|
|
30
|
+
|
|
31
|
+
const FLAGS: GlobalFlags = {
|
|
32
|
+
llm: false,
|
|
33
|
+
autoLlm: false,
|
|
34
|
+
format: "plain",
|
|
35
|
+
verbose: false,
|
|
36
|
+
};
|
|
37
|
+
const JSON_FLAGS: GlobalFlags = { ...FLAGS, format: "json" };
|
|
38
|
+
const REAL = { dryRun: false, undo: false, yes: false };
|
|
39
|
+
|
|
40
|
+
const verb = (name: string): VerbSpec =>
|
|
41
|
+
configModule.verbs.find((v) => v.path[1] === name) as VerbSpec;
|
|
42
|
+
const getVerb = verb("get");
|
|
43
|
+
const setVerb = verb("set");
|
|
44
|
+
const unsetVerb = verb("unset");
|
|
45
|
+
|
|
46
|
+
let prevXdg: string | undefined;
|
|
47
|
+
const roots: string[] = [];
|
|
48
|
+
const tmp = (prefix: string): string => {
|
|
49
|
+
const dir = mkdtempSync(join(tmpdir(), prefix));
|
|
50
|
+
roots.push(dir);
|
|
51
|
+
return dir;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
prevXdg = process.env.XDG_CONFIG_HOME;
|
|
56
|
+
process.env.XDG_CONFIG_HOME = tmp("pragma-cfgget-xdg-");
|
|
57
|
+
});
|
|
58
|
+
afterEach(() => {
|
|
59
|
+
process.env.XDG_CONFIG_HOME = prevXdg;
|
|
60
|
+
for (const dir of roots) rmSync(dir, { recursive: true, force: true });
|
|
61
|
+
roots.length = 0;
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
function readGlobal(): Record<string, unknown> {
|
|
65
|
+
return JSON.parse(readFileSync(globalConfigPath(), "utf-8"));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
describe("config get/unset — covenant-exact emission (PROTECTED)", () => {
|
|
69
|
+
it("emits the one-positional read and the mutating clearer", () => {
|
|
70
|
+
expect(emitVerb(getVerb)).toEqual({
|
|
71
|
+
v: "get",
|
|
72
|
+
args: ["<key>"],
|
|
73
|
+
mcp: "config_get",
|
|
74
|
+
});
|
|
75
|
+
expect(emitVerb(unsetVerb)).toEqual({
|
|
76
|
+
v: "unset",
|
|
77
|
+
args: ["<key>"],
|
|
78
|
+
mutates: true,
|
|
79
|
+
mcp: "config_unset",
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("both take the field enum, so an unknown key never reaches disk", () => {
|
|
84
|
+
for (const spec of [getVerb, unsetVerb]) {
|
|
85
|
+
let caught: unknown;
|
|
86
|
+
try {
|
|
87
|
+
extractParams(spec.params, ["bogus"], {});
|
|
88
|
+
} catch (error) {
|
|
89
|
+
caught = error;
|
|
90
|
+
}
|
|
91
|
+
expect(caught).toBeInstanceOf(PragmaError);
|
|
92
|
+
expect((caught as PragmaError).validOptions).toEqual([
|
|
93
|
+
"tier",
|
|
94
|
+
"channel",
|
|
95
|
+
"detail",
|
|
96
|
+
]);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
describe("config get — one value, scriptably", () => {
|
|
102
|
+
it("prints the BARE value on stdout so shell substitution works", async () => {
|
|
103
|
+
const cwd = tmp("pragma-proj-");
|
|
104
|
+
await executeVerb(
|
|
105
|
+
setVerb,
|
|
106
|
+
{ key: "tier", value: "apps/lxd" },
|
|
107
|
+
REAL,
|
|
108
|
+
bootRuntime(FLAGS, cwd),
|
|
109
|
+
);
|
|
110
|
+
const outcome = await executeVerb(
|
|
111
|
+
getVerb,
|
|
112
|
+
{ key: "tier" },
|
|
113
|
+
REAL,
|
|
114
|
+
bootRuntime(FLAGS, cwd),
|
|
115
|
+
);
|
|
116
|
+
// The whole stdout is the value and a newline — no label, no table.
|
|
117
|
+
expect(outcome.stdout).toBe("apps/lxd\n");
|
|
118
|
+
expect(outcome.exitCode).toBe(0);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("prints the same bare value down a PIPE, where llm is auto-selected", async () => {
|
|
122
|
+
// The command exists to fill a shell variable, and command substitution
|
|
123
|
+
// pipes stdout — so the auto-llm form has to be the value too, or
|
|
124
|
+
// `TIER=$(… config get tier)` captures a decorated sentence.
|
|
125
|
+
const cwd = tmp("pragma-proj-");
|
|
126
|
+
await executeVerb(
|
|
127
|
+
setVerb,
|
|
128
|
+
{ key: "tier", value: "apps/lxd" },
|
|
129
|
+
REAL,
|
|
130
|
+
bootRuntime(FLAGS, cwd),
|
|
131
|
+
);
|
|
132
|
+
const piped = await executeVerb(
|
|
133
|
+
getVerb,
|
|
134
|
+
{ key: "tier" },
|
|
135
|
+
REAL,
|
|
136
|
+
bootRuntime({ ...FLAGS, llm: true, autoLlm: true, format: "llm" }, cwd),
|
|
137
|
+
);
|
|
138
|
+
expect(piped.stdout).toBe("apps/lxd\n");
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it("prints NOTHING for an unset field, and still exits 0", async () => {
|
|
142
|
+
const outcome = await executeVerb(
|
|
143
|
+
getVerb,
|
|
144
|
+
{ key: "tier" },
|
|
145
|
+
REAL,
|
|
146
|
+
bootRuntime(FLAGS, tmp("pragma-proj-")),
|
|
147
|
+
);
|
|
148
|
+
expect(outcome.stdout).toBe("");
|
|
149
|
+
expect(outcome.exitCode).toBe(0);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it("reports the layer that supplied the value", async () => {
|
|
153
|
+
const cwd = tmp("pragma-proj-");
|
|
154
|
+
// A field nobody wrote resolves from the built-in defaults.
|
|
155
|
+
const fromDefault = await executeVerb(
|
|
156
|
+
getVerb,
|
|
157
|
+
{ key: "channel" },
|
|
158
|
+
REAL,
|
|
159
|
+
bootRuntime(JSON_FLAGS, cwd),
|
|
160
|
+
);
|
|
161
|
+
expect(JSON.parse(fromDefault.stdout ?? "").data).toMatchObject({
|
|
162
|
+
field: "channel",
|
|
163
|
+
value: "normal",
|
|
164
|
+
source: "default",
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
await executeVerb(
|
|
168
|
+
setVerb,
|
|
169
|
+
{ key: "channel", value: "experimental" },
|
|
170
|
+
REAL,
|
|
171
|
+
bootRuntime(FLAGS, cwd),
|
|
172
|
+
);
|
|
173
|
+
const fromGlobal = await executeVerb(
|
|
174
|
+
getVerb,
|
|
175
|
+
{ key: "channel" },
|
|
176
|
+
REAL,
|
|
177
|
+
bootRuntime(JSON_FLAGS, cwd),
|
|
178
|
+
);
|
|
179
|
+
expect(JSON.parse(fromGlobal.stdout ?? "").data).toMatchObject({
|
|
180
|
+
field: "channel",
|
|
181
|
+
value: "experimental",
|
|
182
|
+
source: "global",
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it("never boots the store — reading config is a storeless act", async () => {
|
|
187
|
+
const rt = bootRuntime(FLAGS, tmp("pragma-proj-"));
|
|
188
|
+
await executeVerb(getVerb, { key: "tier" }, REAL, rt);
|
|
189
|
+
expect(rt.store.booted).toBe(false);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
describe("config unset — the counterpart of set", () => {
|
|
194
|
+
it("removes the field so the default applies again", async () => {
|
|
195
|
+
const cwd = tmp("pragma-proj-");
|
|
196
|
+
await executeVerb(
|
|
197
|
+
setVerb,
|
|
198
|
+
{ key: "tier", value: "apps/lxd" },
|
|
199
|
+
REAL,
|
|
200
|
+
bootRuntime(FLAGS, cwd),
|
|
201
|
+
);
|
|
202
|
+
expect(readGlobal().tier).toBe("apps/lxd");
|
|
203
|
+
|
|
204
|
+
const outcome = await executeVerb(
|
|
205
|
+
unsetVerb,
|
|
206
|
+
{ key: "tier" },
|
|
207
|
+
REAL,
|
|
208
|
+
bootRuntime(FLAGS, cwd),
|
|
209
|
+
);
|
|
210
|
+
expect(outcome.exitCode).toBe(0);
|
|
211
|
+
expect(outcome.stdout).toContain("Reset tier");
|
|
212
|
+
expect("tier" in readGlobal()).toBe(false);
|
|
213
|
+
|
|
214
|
+
// And the read agrees: the field is gone, so `get` prints nothing.
|
|
215
|
+
const after = await executeVerb(
|
|
216
|
+
getVerb,
|
|
217
|
+
{ key: "tier" },
|
|
218
|
+
REAL,
|
|
219
|
+
bootRuntime(FLAGS, cwd),
|
|
220
|
+
);
|
|
221
|
+
expect(after.stdout).toBe("");
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
it("clearing a field that was never set is not an error", async () => {
|
|
225
|
+
const outcome = await executeVerb(
|
|
226
|
+
unsetVerb,
|
|
227
|
+
{ key: "tier" },
|
|
228
|
+
REAL,
|
|
229
|
+
bootRuntime(FLAGS, tmp("pragma-proj-")),
|
|
230
|
+
);
|
|
231
|
+
expect(outcome.exitCode).toBe(0);
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
describe("config get/unset — MCP parity", () => {
|
|
236
|
+
it("config_get reads without confirm; config_unset plans first, then writes", async () => {
|
|
237
|
+
const cwd = tmp("pragma-proj-");
|
|
238
|
+
const mcp = await projectMcp([configModule], cwd);
|
|
239
|
+
await mcp.callTool("config_set", {
|
|
240
|
+
key: "tier",
|
|
241
|
+
value: "apps/lxd",
|
|
242
|
+
confirm: true,
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
const read = await mcp.callTool("config_get", { key: "tier" });
|
|
246
|
+
expect(read.ok).toBe(true);
|
|
247
|
+
expect(read.data).toMatchObject({ field: "tier", value: "apps/lxd" });
|
|
248
|
+
|
|
249
|
+
const plan = await mcp.callTool("config_unset", { key: "tier" });
|
|
250
|
+
expect(plan.meta).toMatchObject({ planOnly: true, confirmRequired: true });
|
|
251
|
+
expect(readGlobal().tier).toBe("apps/lxd");
|
|
252
|
+
|
|
253
|
+
const done = await mcp.callTool("config_unset", {
|
|
254
|
+
key: "tier",
|
|
255
|
+
confirm: true,
|
|
256
|
+
});
|
|
257
|
+
await mcp.cleanup();
|
|
258
|
+
|
|
259
|
+
expect(done.ok).toBe(true);
|
|
260
|
+
expect(done.data).toMatchObject({ field: "tier", reset: true });
|
|
261
|
+
expect(existsSync(globalConfigPath())).toBe(true);
|
|
262
|
+
expect("tier" in readGlobal()).toBe(false);
|
|
263
|
+
});
|
|
264
|
+
});
|
|
@@ -1,28 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
2
|
+
* The config write bodies (lazily imported, off the fast path).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* kernel `writeConfigField` (global-layer only)
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
4
|
+
* {@link runField} resolves the single positional and composes the write as a
|
|
5
|
+
* Task over the kernel `writeConfigField` (global-layer only). An enum field
|
|
6
|
+
* re-validates its value as a belt-and-braces backstop — the CLI `coerceParam`
|
|
7
|
+
* and the MCP zod schema already reject a non-member before `run`, but a
|
|
8
|
+
* direct call (a test, a future caller) must not slip an invalid value to
|
|
9
|
+
* disk. Clearing a field is its own verb ({@link runUnset}); the values that
|
|
10
|
+
* used to double as clear-markers are refused with the verb named.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { map, type Task } from "@canonical/task";
|
|
14
|
-
import { writeConfigField } from "../../kernel/config/
|
|
15
|
-
import { PragmaError } from "../../kernel/error/
|
|
16
|
-
import type
|
|
14
|
+
import { writeConfigField } from "../../kernel/config/index.js";
|
|
15
|
+
import { cliRecovery, PragmaError } from "../../kernel/error/index.js";
|
|
16
|
+
import { type ConfigFieldSpec, RESERVED_CLEAR_VALUES } from "./fields.js";
|
|
17
17
|
import type { ConfigFieldResult } from "./types.js";
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
|
-
* Build the Task that writes
|
|
20
|
+
* Build the Task that writes one config field.
|
|
21
21
|
*
|
|
22
22
|
* @param spec - The field-table row for the target field.
|
|
23
23
|
* @param params - The coerced param bag (carries the single positional).
|
|
24
24
|
* @returns A Task yielding the write outcome.
|
|
25
|
-
* @throws PragmaError INVALID_INPUT for an out-of-set enum value (backstop)
|
|
25
|
+
* @throws PragmaError INVALID_INPUT for an out-of-set enum value (backstop),
|
|
26
|
+
* or for a reserved clear-marker on a free-string field — clearing is
|
|
27
|
+
* `config unset <key>`'s job, and the error names it.
|
|
26
28
|
*/
|
|
27
29
|
export function runField(
|
|
28
30
|
spec: ConfigFieldSpec,
|
|
@@ -30,15 +32,13 @@ export function runField(
|
|
|
30
32
|
): Task<ConfigFieldResult> {
|
|
31
33
|
const value = String(params[spec.positional] ?? "");
|
|
32
34
|
|
|
33
|
-
if (spec.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
field
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}),
|
|
41
|
-
);
|
|
35
|
+
if (spec.kind === "string" && RESERVED_CLEAR_VALUES.includes(value)) {
|
|
36
|
+
throw PragmaError.invalidInput(spec.field, value, {
|
|
37
|
+
recovery: cliRecovery(
|
|
38
|
+
`config unset ${spec.field}`,
|
|
39
|
+
"Clear the field with the unset command.",
|
|
40
|
+
),
|
|
41
|
+
});
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
if (spec.kind === "enum" && !(spec.values ?? []).includes(value)) {
|
|
@@ -57,3 +57,21 @@ export function runField(
|
|
|
57
57
|
}),
|
|
58
58
|
);
|
|
59
59
|
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Build the Task that clears one config field — removes it from the global
|
|
63
|
+
* layer so the built-in default (or a project config) applies again.
|
|
64
|
+
*
|
|
65
|
+
* @param spec - The field-table row for the target field.
|
|
66
|
+
* @returns A Task yielding the reset outcome.
|
|
67
|
+
*/
|
|
68
|
+
export function runUnset(spec: ConfigFieldSpec): Task<ConfigFieldResult> {
|
|
69
|
+
return map(
|
|
70
|
+
writeConfigField(spec.field, undefined),
|
|
71
|
+
(result): ConfigFieldResult => ({
|
|
72
|
+
field: result.field,
|
|
73
|
+
path: result.path,
|
|
74
|
+
reset: true,
|
|
75
|
+
}),
|
|
76
|
+
);
|
|
77
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `config get <key>` read body (lazily imported, off the fast path).
|
|
3
|
+
*
|
|
4
|
+
* Reads the layered config and projects the one requested field with the
|
|
5
|
+
* layer that supplied it — the same resolution `config show` reports, scoped
|
|
6
|
+
* to a single value.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { readConfig } from "../../kernel/config/index.js";
|
|
10
|
+
import type { PragmaRuntime } from "../../kernel/runtime/index.js";
|
|
11
|
+
import { resolveFieldSpec } from "./runSet.js";
|
|
12
|
+
import type { ConfigGetData } from "./types.js";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Resolve one config field's effective value and provenance.
|
|
16
|
+
*
|
|
17
|
+
* @param params - The coerced param bag carrying `key`.
|
|
18
|
+
* @param runtime - The per-invocation runtime (its cwd anchors the layering).
|
|
19
|
+
* @returns The field, its resolved value (absent when unset), and its source.
|
|
20
|
+
* @note Impure — reads the config layers from disk.
|
|
21
|
+
*/
|
|
22
|
+
export async function runGet(
|
|
23
|
+
params: Record<string, unknown>,
|
|
24
|
+
runtime: PragmaRuntime,
|
|
25
|
+
): Promise<ConfigGetData> {
|
|
26
|
+
const spec = resolveFieldSpec(params);
|
|
27
|
+
const layers = await readConfig(runtime.cwd);
|
|
28
|
+
const value = layers.config[spec.field];
|
|
29
|
+
return {
|
|
30
|
+
field: spec.field,
|
|
31
|
+
...(value === undefined ? {} : { value }),
|
|
32
|
+
source: layers.origins[spec.field],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -10,21 +10,22 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import type { Task } from "@canonical/task";
|
|
13
|
-
import { PragmaError } from "../../kernel/error/
|
|
14
|
-
import { CONFIG_FIELDS } from "./fields.js";
|
|
15
|
-
import { runField } from "./runField.js";
|
|
13
|
+
import { PragmaError } from "../../kernel/error/index.js";
|
|
14
|
+
import { CONFIG_FIELDS, type ConfigFieldSpec } from "./fields.js";
|
|
15
|
+
import { runField, runUnset as runFieldUnset } from "./runField.js";
|
|
16
16
|
import type { ConfigFieldResult } from "./types.js";
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
19
|
+
* Resolve `<key>` to its field-table row.
|
|
20
20
|
*
|
|
21
|
-
* @param params - The coerced param bag
|
|
22
|
-
* @returns
|
|
23
|
-
* @throws PragmaError INVALID_INPUT for an unknown key (backstop
|
|
21
|
+
* @param params - The coerced param bag carrying `key`.
|
|
22
|
+
* @returns The matching {@link ConfigFieldSpec}.
|
|
23
|
+
* @throws PragmaError INVALID_INPUT for an unknown key (backstop — the CLI
|
|
24
|
+
* enum coerce and the MCP schema already reject a non-member first).
|
|
24
25
|
*/
|
|
25
|
-
export function
|
|
26
|
+
export function resolveFieldSpec(
|
|
26
27
|
params: Record<string, unknown>,
|
|
27
|
-
):
|
|
28
|
+
): ConfigFieldSpec {
|
|
28
29
|
const key = String(params.key ?? "");
|
|
29
30
|
const spec = CONFIG_FIELDS.find((field) => field.field === key);
|
|
30
31
|
if (!spec) {
|
|
@@ -32,7 +33,32 @@ export function runSet(
|
|
|
32
33
|
validOptions: CONFIG_FIELDS.map((field) => field.field),
|
|
33
34
|
});
|
|
34
35
|
}
|
|
36
|
+
return spec;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Build the Task that writes the config field named by `<key>`.
|
|
41
|
+
*
|
|
42
|
+
* @param params - The coerced param bag: `key` (field name) and `value`.
|
|
43
|
+
* @returns A Task yielding the write outcome.
|
|
44
|
+
*/
|
|
45
|
+
export function runSet(
|
|
46
|
+
params: Record<string, unknown>,
|
|
47
|
+
): Task<ConfigFieldResult> {
|
|
48
|
+
const spec = resolveFieldSpec(params);
|
|
35
49
|
// Re-key the value under the field's own positional (`path`/`name`/`level`) so
|
|
36
50
|
// runField reads it exactly as the per-field verb would.
|
|
37
51
|
return runField(spec, { [spec.positional]: String(params.value ?? "") });
|
|
38
52
|
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Build the Task that clears the config field named by `<key>`.
|
|
56
|
+
*
|
|
57
|
+
* @param params - The coerced param bag carrying `key`.
|
|
58
|
+
* @returns A Task yielding the reset outcome.
|
|
59
|
+
*/
|
|
60
|
+
export function runUnset(
|
|
61
|
+
params: Record<string, unknown>,
|
|
62
|
+
): Task<ConfigFieldResult> {
|
|
63
|
+
return runFieldUnset(resolveFieldSpec(params));
|
|
64
|
+
}
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Pins the emitted covenant slice (`{ v:"set", args:["<key>","<value>"],
|
|
5
5
|
* mutates:true, mcp:"config_set" }`), proves it drives the shared per-field
|
|
6
|
-
* write path (
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* write path (write / enum-backstop), rejects an unknown key and an out-of-set
|
|
7
|
+
* enum value with INVALID_INPUT, and holds MCP plan-first/confirm parity.
|
|
8
|
+
* Since AV-228 B3 retired `config tier/channel/detail`, `config set` is the
|
|
9
|
+
* sole config setter. It only ever SETS: the three strings that once doubled
|
|
10
|
+
* as clear-markers are refused here, and the error names `config unset`.
|
|
10
11
|
*/
|
|
11
12
|
|
|
12
13
|
import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
|
|
@@ -72,7 +73,7 @@ describe("config set — covenant-exact emission (PROTECTED)", () => {
|
|
|
72
73
|
});
|
|
73
74
|
});
|
|
74
75
|
|
|
75
|
-
describe("config set —
|
|
76
|
+
describe("config set — writes through the shared per-field path", () => {
|
|
76
77
|
it("set tier writes the field to the GLOBAL config, never booting the store", async () => {
|
|
77
78
|
const rt: PragmaRuntime = bootRuntime(FLAGS, tmp("pragma-proj-"));
|
|
78
79
|
const outcome = await executeVerb(
|
|
@@ -101,8 +102,17 @@ describe("config set — write & reset (shares the per-field path)", () => {
|
|
|
101
102
|
expect(written.channel).toBe("experimental");
|
|
102
103
|
expect(written.detail).toBe("detailed");
|
|
103
104
|
});
|
|
105
|
+
});
|
|
104
106
|
|
|
105
|
-
|
|
107
|
+
describe("config set — the reserved clear-markers are refused, naming unset", () => {
|
|
108
|
+
// Clearing a field is a command, so no value may quietly mean "remove me":
|
|
109
|
+
// the three strings that used to are rejected, and the rejection names the
|
|
110
|
+
// command that owns the job. `tier` keeps whatever it held.
|
|
111
|
+
it.each([
|
|
112
|
+
"none",
|
|
113
|
+
"default",
|
|
114
|
+
"-",
|
|
115
|
+
])("set tier %s is INVALID_INPUT that recovers with config unset tier", async (reserved) => {
|
|
106
116
|
const cwd = tmp("pragma-proj-");
|
|
107
117
|
await executeVerb(
|
|
108
118
|
setVerb,
|
|
@@ -110,14 +120,31 @@ describe("config set — write & reset (shares the per-field path)", () => {
|
|
|
110
120
|
REAL,
|
|
111
121
|
bootRuntime(FLAGS, cwd),
|
|
112
122
|
);
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
123
|
+
let caught: unknown;
|
|
124
|
+
try {
|
|
125
|
+
await executeVerb(
|
|
126
|
+
setVerb,
|
|
127
|
+
{ key: "tier", value: reserved },
|
|
128
|
+
REAL,
|
|
129
|
+
bootRuntime(FLAGS, cwd),
|
|
130
|
+
);
|
|
131
|
+
} catch (error) {
|
|
132
|
+
caught = error;
|
|
133
|
+
}
|
|
134
|
+
expect(caught).toBeInstanceOf(PragmaError);
|
|
135
|
+
expect((caught as PragmaError).code).toBe("INVALID_INPUT");
|
|
136
|
+
expect(JSON.stringify((caught as PragmaError).recovery)).toContain(
|
|
137
|
+
"config unset tier",
|
|
138
|
+
);
|
|
139
|
+
expect(readGlobal().tier).toBe("apps/lxd");
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it("a reserved marker is only reserved for a free-string field", () => {
|
|
143
|
+
// `channel`/`detail` are closed enums: their rejection is the enum
|
|
144
|
+
// backstop naming the members, not the clear-marker rule.
|
|
145
|
+
expect(() => runSet({ key: "channel", value: "none" })).toThrow(
|
|
146
|
+
/Invalid channel/,
|
|
118
147
|
);
|
|
119
|
-
expect(outcome.stdout).toContain("Reset tier");
|
|
120
|
-
expect("tier" in readGlobal()).toBe(false);
|
|
121
148
|
});
|
|
122
149
|
});
|
|
123
150
|
|
|
@@ -190,7 +217,14 @@ describe("config set — MCP plan-first / confirm parity", () => {
|
|
|
190
217
|
expect(plan.ok).toBe(true);
|
|
191
218
|
expect(plan.meta).toMatchObject({ planOnly: true, confirmRequired: true });
|
|
192
219
|
const planLines = (plan.data as { plan: string[] }).plan;
|
|
193
|
-
|
|
220
|
+
// The MCP payload passes the SHARED visibility filter but keeps the
|
|
221
|
+
// described spelling, so it reads exactly as the CLI dry-run above does:
|
|
222
|
+
// one plan, named the same way on both structured surfaces. The claim is
|
|
223
|
+
// unchanged — the plan names the write it would perform, and performs none.
|
|
224
|
+
expect(planLines.some((line) => line.startsWith("Write file: "))).toBe(
|
|
225
|
+
true,
|
|
226
|
+
);
|
|
227
|
+
expect(planLines.at(-1)).toContain("config.json");
|
|
194
228
|
expect(existsSync(globalConfigPath())).toBe(false);
|
|
195
229
|
|
|
196
230
|
const done = await mcp.callTool("config_set", {
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* The single form for writing config: `pragma config set tier apps/lxd`. Since
|
|
5
5
|
* AV-228 B3 retired the per-field `config tier`/`channel`/`detail` verbs, this
|
|
6
|
-
* is now the ONLY config setter. It drives the shared write path (`runField`
|
|
7
|
-
* `runSet`), so it inherits
|
|
8
|
-
*
|
|
6
|
+
* is now the ONLY config setter. It drives the shared write path (`runField`
|
|
7
|
+
* via `runSet`), so it inherits enum re-validation and the global-layer-only
|
|
8
|
+
* write from the {@link CONFIG_FIELDS} table; clearing a field is `config
|
|
9
|
+
* unset <key>`'s job.
|
|
9
10
|
*
|
|
10
11
|
* Covenant shape: `<key>` is an ENUM over the field names (better completion +
|
|
11
12
|
* validation; the token still emits as `<key>`), `<value>` a free string, so
|
|
@@ -16,7 +17,7 @@
|
|
|
16
17
|
import type { Task } from "@canonical/task";
|
|
17
18
|
import { BIN_NAME } from "../../constants.js";
|
|
18
19
|
import { asVerb } from "../../kernel/spec/asVerb.js";
|
|
19
|
-
import type { VerbSpec } from "../../kernel/spec/
|
|
20
|
+
import type { VerbSpec } from "../../kernel/spec/index.js";
|
|
20
21
|
import { configFieldFormatters } from "./field.render.js";
|
|
21
22
|
import { CONFIG_FIELDS } from "./fields.js";
|
|
22
23
|
import type { ConfigFieldResult } from "./types.js";
|
|
@@ -27,7 +28,7 @@ const CONFIG_KEYS = CONFIG_FIELDS.map((field) => field.field);
|
|
|
27
28
|
const setVerb: VerbSpec<Record<string, unknown>, ConfigFieldResult> = {
|
|
28
29
|
path: ["config", "set"],
|
|
29
30
|
summary: "Set a config field by name.",
|
|
30
|
-
doc: "Write a global config field by name
|
|
31
|
+
doc: "Write a global config field by name. `key` is one of `tier`, `channel`, or `detail`; clearing a field is `config unset <key>`'s job, and the values that used to double as clear-markers are refused. Written to the global layer only — project configs are authored by hand.",
|
|
31
32
|
params: [
|
|
32
33
|
{
|
|
33
34
|
kind: "enum",
|
|
@@ -40,7 +41,7 @@ const setVerb: VerbSpec<Record<string, unknown>, ConfigFieldResult> = {
|
|
|
40
41
|
{
|
|
41
42
|
kind: "string",
|
|
42
43
|
name: "value",
|
|
43
|
-
doc: "The value to write
|
|
44
|
+
doc: "The value to write.",
|
|
44
45
|
required: true,
|
|
45
46
|
positional: true,
|
|
46
47
|
},
|
|
@@ -52,7 +53,7 @@ const setVerb: VerbSpec<Record<string, unknown>, ConfigFieldResult> = {
|
|
|
52
53
|
note: "scope reads to a tier",
|
|
53
54
|
},
|
|
54
55
|
{ cmd: `${BIN_NAME} config set channel experimental` },
|
|
55
|
-
{ cmd: `${BIN_NAME} config
|
|
56
|
+
{ cmd: `${BIN_NAME} config unset tier`, note: "clear the tier" },
|
|
56
57
|
],
|
|
57
58
|
capability: {
|
|
58
59
|
needsStore: false,
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
import type { ConfigOrigin } from "../../kernel/config/types.js";
|
|
10
10
|
import { defaultStyle, type RenderStyle } from "../../kernel/render/style.js";
|
|
11
|
-
import type { Formatters } from "../../kernel/spec/
|
|
11
|
+
import type { Formatters } from "../../kernel/spec/index.js";
|
|
12
12
|
import type { ConfigShowData } from "./types.js";
|
|
13
13
|
|
|
14
14
|
/** A `[layer]` marker for values a config file supplied (blank for defaults). */
|
|
@@ -7,10 +7,12 @@
|
|
|
7
7
|
|
|
8
8
|
import { BIN_NAME, PROJECT_CONFIG_FILENAME } from "../../constants.js";
|
|
9
9
|
import { asVerb } from "../../kernel/spec/asVerb.js";
|
|
10
|
-
import type { CapabilityModule, VerbSpec } from "../../kernel/spec/
|
|
10
|
+
import type { CapabilityModule, VerbSpec } from "../../kernel/spec/index.js";
|
|
11
|
+
import { configGetVerb } from "./get.verb.js";
|
|
11
12
|
import { configSetVerb } from "./set.verb.js";
|
|
12
13
|
import { configShowFormatters } from "./show.render.js";
|
|
13
14
|
import type { ConfigShowData } from "./types.js";
|
|
15
|
+
import { configUnsetVerb } from "./unset.verb.js";
|
|
14
16
|
|
|
15
17
|
const showVerb: VerbSpec<Record<string, unknown>, ConfigShowData> = {
|
|
16
18
|
path: ["config", "show"],
|
|
@@ -35,12 +37,13 @@ const showVerb: VerbSpec<Record<string, unknown>, ConfigShowData> = {
|
|
|
35
37
|
};
|
|
36
38
|
|
|
37
39
|
/**
|
|
38
|
-
* The `config` capability module: the `show`
|
|
39
|
-
* `
|
|
40
|
-
*
|
|
41
|
-
* (AV-228 B3)
|
|
40
|
+
* The `config` capability module, emitted in covenant order: the `show`
|
|
41
|
+
* reader, the `get <key>` single-value reader, the `set <key> <value>`
|
|
42
|
+
* writer, and the `unset <key>` clearer. The per-field `tier`/`channel`/
|
|
43
|
+
* `detail` verbs were retired in favour of `config set` (AV-228 B3);
|
|
44
|
+
* clearing moved from a magic `set` value to its own verb.
|
|
42
45
|
*/
|
|
43
46
|
export const configModule: CapabilityModule = {
|
|
44
47
|
name: "config",
|
|
45
|
-
verbs: [asVerb(showVerb), configSetVerb],
|
|
48
|
+
verbs: [asVerb(showVerb), configGetVerb, configSetVerb, configUnsetVerb],
|
|
46
49
|
};
|