@canonical/pragma-cli 0.33.0 → 0.35.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/dist/.build-ok +0 -0
- package/dist/package.json +83 -0
- package/dist/pragma.conf.js +814 -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 +293 -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 +92 -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/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 +205 -0
- package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.render.js +185 -0
- package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.verb.js +45 -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 +83 -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 +66 -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 +53 -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 +168 -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 +343 -0
- package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js +277 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js +207 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupSkills.js +316 -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 +193 -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 +334 -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 +263 -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/bands.js +16 -0
- package/dist/src/capabilities/shared/bands.js.map +1 -0
- package/dist/src/capabilities/shared/index.js +26 -0
- package/dist/src/capabilities/shared/index.js.map +1 -0
- package/dist/src/capabilities/shared/packageManager.js +103 -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 +195 -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 +167 -0
- package/dist/src/capabilities/sources/installSkills.js.map +1 -0
- package/dist/src/capabilities/sources/runUpdate.js +394 -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 +99 -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 +44 -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 +82 -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 +25 -0
- package/dist/src/kernel/index.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 +223 -0
- package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
- package/dist/src/kernel/packs/runBodies.js +87 -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 +369 -0
- package/dist/src/kernel/packs/schema.js.map +1 -0
- package/dist/src/kernel/packs/sparql/applyFilters.js +68 -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 +217 -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 +216 -0
- package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
- package/dist/src/kernel/project/cli/helpFormat.js +59 -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 +197 -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 +300 -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 +85 -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/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 +25 -24
- package/pragma.conf.ts +853 -0
- package/src/bin.ts +276 -82
- package/src/capabilities/block.parity.test.ts +253 -0
- package/src/capabilities/capabilities/capabilities.render.ts +4 -3
- package/src/capabilities/capabilities/capabilities.verb.ts +32 -14
- package/src/capabilities/capabilities/catalog.ts +20 -12
- package/src/capabilities/capabilities/hints.ts +43 -24
- package/src/capabilities/capabilities/index.ts +1 -1
- package/src/capabilities/colophon/collectColophon.ts +50 -24
- package/src/capabilities/colophon/colophon.render.ts +25 -1
- package/src/capabilities/colophon/colophon.test.ts +42 -21
- package/src/capabilities/colophon/colophon.verb.ts +9 -5
- package/src/capabilities/colophon/types.ts +16 -7
- package/src/capabilities/config/collectConfigShow.test.ts +58 -0
- package/src/capabilities/config/collectConfigShow.ts +43 -6
- package/src/capabilities/config/field.render.ts +4 -5
- package/src/capabilities/config/fields.ts +17 -37
- 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 +14 -9
- package/src/capabilities/config/show.render.test.ts +77 -5
- package/src/capabilities/config/show.render.ts +8 -13
- package/src/capabilities/config/show.verb.ts +13 -9
- package/src/capabilities/config/types.ts +26 -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 +95 -103
- package/src/capabilities/create/cliProjection.ts +227 -0
- package/src/capabilities/create/constants.ts +50 -0
- package/src/capabilities/create/create.mcp.test.ts +91 -7
- package/src/capabilities/create/create.render.ts +71 -7
- package/src/capabilities/create/create.test.ts +523 -162
- package/src/capabilities/create/create.verb.ts +361 -321
- 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 +9 -14
- 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 +40 -46
- package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
- package/src/capabilities/create/types.ts +29 -5
- package/src/capabilities/{standard/parity.test.ts → distribution.parity.test.ts} +24 -14
- package/src/capabilities/distribution.test.ts +122 -0
- package/src/capabilities/distribution.ts +54 -0
- package/src/capabilities/doctor/checks/checkKeStore.ts +9 -7
- package/src/capabilities/doctor/checks/checkPackageRefs.ts +82 -46
- package/src/capabilities/doctor/checks/checkPragmaVersion.ts +5 -4
- package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +125 -30
- package/src/capabilities/doctor/checks/checkShellCompletions.ts +113 -27
- 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 +274 -0
- package/src/capabilities/doctor/doctor.render.test.ts +24 -13
- package/src/capabilities/doctor/doctor.render.ts +45 -20
- package/src/capabilities/doctor/doctor.test.ts +158 -40
- package/src/capabilities/doctor/doctor.verb.ts +9 -5
- package/src/capabilities/doctor/runChecks.ts +65 -66
- package/src/capabilities/doctor/types.ts +21 -5
- package/src/capabilities/emptyRecovery.test.ts +44 -22
- 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 -5
- package/src/capabilities/graph/query.render.ts +15 -3
- package/src/capabilities/graph/query.verb.ts +5 -4
- package/src/capabilities/graph/runQuery.ts +9 -7
- package/src/capabilities/index.ts +25 -19
- package/src/capabilities/info/collectInfo.ts +15 -10
- package/src/capabilities/info/info.render.ts +4 -3
- package/src/capabilities/info/info.verb.ts +4 -3
- package/src/capabilities/lazy.test.ts +125 -2
- 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 +42 -83
- package/src/capabilities/prompt/index.ts +2 -2
- package/src/capabilities/prompt/prompt.render.ts +6 -2
- package/src/capabilities/prompt/prompt.test.ts +12 -6
- package/src/capabilities/prompt/types.ts +1 -1
- package/src/capabilities/prompt/verbs.ts +26 -14
- package/src/capabilities/reference.test.ts +63 -0
- package/src/capabilities/resources/provider.ts +367 -91
- package/src/capabilities/resources/resources.test.ts +411 -59
- package/src/capabilities/setup/buildPlan.ts +236 -0
- package/src/capabilities/setup/index.ts +7 -7
- package/src/capabilities/setup/mode.ts +74 -0
- package/src/capabilities/setup/operations/index.ts +74 -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 +397 -320
- package/src/capabilities/setup/operations/setupLsp.ts +329 -68
- package/src/capabilities/setup/operations/setupMcp.ts +137 -97
- package/src/capabilities/setup/operations/setupSkills.ts +336 -108
- package/src/capabilities/setup/plan.render.ts +241 -0
- package/src/capabilities/setup/plan.ts +236 -0
- package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
- package/src/capabilities/setup/setup.render.test.ts +281 -73
- package/src/capabilities/setup/setup.render.ts +45 -77
- package/src/capabilities/setup/setup.test.ts +972 -209
- package/src/capabilities/setup/setup.verb.ts +233 -74
- package/src/capabilities/setup/shell.test.ts +86 -0
- package/src/capabilities/setup/shell.ts +166 -14
- package/src/capabilities/setup/targets.ts +367 -0
- package/src/capabilities/setup/types.ts +18 -57
- package/src/capabilities/shared/assertExecOk.ts +68 -10
- package/src/capabilities/shared/index.ts +32 -0
- package/src/capabilities/shared/packageManager.test.ts +55 -0
- package/src/capabilities/shared/packageManager.ts +62 -6
- package/src/capabilities/skill/discover.ts +47 -9
- package/src/capabilities/skill/index.ts +1 -1
- package/src/capabilities/skill/render.ts +14 -14
- package/src/capabilities/skill/skill.test.ts +7 -5
- package/src/capabilities/skill/verbs.ts +9 -10
- package/src/capabilities/sources/collectStatus.ts +61 -51
- package/src/capabilities/sources/index.ts +2 -2
- package/src/capabilities/sources/installSkills.ts +86 -9
- package/src/capabilities/sources/runUpdate.ts +164 -141
- package/src/capabilities/sources/sources.test.ts +265 -119
- package/src/capabilities/sources/status.render.test.ts +53 -24
- package/src/capabilities/sources/status.render.ts +25 -30
- package/src/capabilities/sources/status.verb.ts +16 -9
- package/src/capabilities/sources/types.ts +18 -25
- package/src/capabilities/sources/update.render.ts +10 -3
- package/src/capabilities/sources/update.verb.ts +13 -24
- package/src/capabilities/surface.test.ts +165 -25
- package/src/capabilities/tier.parity.test.ts +144 -0
- package/src/capabilities/upgrade/runUpgrade.ts +8 -8
- package/src/capabilities/upgrade/upgrade.render.ts +4 -5
- package/src/capabilities/upgrade/upgrade.test.ts +3 -3
- package/src/capabilities/upgrade/upgrade.verb.ts +8 -4
- 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.test.ts +8 -6
- package/src/constants.ts +78 -22
- package/src/identity.test.ts +348 -0
- package/src/index.ts +2 -2
- package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +20 -15
- package/src/kernel/completion/complete.test.ts +12 -2
- package/src/kernel/completion/complete.ts +1 -1
- package/src/kernel/completion/emitScripts.test.ts +1 -1
- package/src/kernel/completion/emitScripts.ts +5 -3
- package/src/kernel/completion/entitySource.test.ts +185 -41
- package/src/kernel/completion/entitySource.ts +133 -110
- package/src/kernel/completion/model.test.ts +165 -13
- package/src/kernel/completion/model.ts +105 -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 +104 -50
- package/src/kernel/completion/shellDrive.test.ts +611 -0
- package/src/kernel/completion/templates/bash.ts +7 -2
- package/src/kernel/completion/templates/fish.ts +28 -6
- package/src/kernel/completion/templates/index.ts +23 -0
- package/src/kernel/completion/types.ts +10 -3
- package/src/kernel/config/defaults.test.ts +108 -0
- package/src/kernel/config/defaults.ts +13 -23
- package/src/kernel/config/evaluateProjectConfig.ts +33 -11
- package/src/kernel/config/findProjectConfig.ts +4 -3
- package/src/kernel/config/firstRun.test.ts +44 -38
- package/src/kernel/config/firstRun.ts +24 -81
- package/src/kernel/config/globalConfig.ts +2 -2
- package/src/kernel/config/index.ts +5 -6
- package/src/kernel/config/paths.ts +17 -17
- package/src/kernel/config/readConfig.test.ts +246 -7
- package/src/kernel/config/readConfig.ts +8 -8
- package/src/kernel/config/schema.test.ts +50 -0
- package/src/kernel/config/schema.ts +100 -11
- package/src/kernel/config/types.ts +75 -19
- package/src/kernel/copy.test.ts +483 -0
- package/src/kernel/copy.ts +54 -0
- package/src/kernel/error/PragmaError.test.ts +6 -3
- package/src/kernel/error/PragmaError.ts +4 -2
- package/src/kernel/error/constants.ts +7 -4
- package/src/kernel/error/fromTaskError.ts +28 -6
- package/src/kernel/error/index.ts +1 -1
- package/src/kernel/error/recovery.test.ts +22 -45
- package/src/kernel/error/recovery.ts +36 -27
- package/src/kernel/error/renderError.ts +42 -1
- package/src/kernel/error/types.ts +25 -4
- package/src/kernel/index.ts +26 -0
- package/src/kernel/packs/collect.test.ts +195 -11
- package/src/kernel/packs/collect.ts +212 -61
- package/src/kernel/packs/compile.test.ts +293 -8
- package/src/kernel/packs/compile.ts +108 -15
- package/src/kernel/packs/disclosure.test.ts +5 -2
- package/src/kernel/packs/disclosure.ts +2 -2
- package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
- package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +13 -13
- package/src/kernel/packs/graphql/index.ts +20 -0
- package/src/kernel/packs/graphqlSource.test.ts +6 -3
- package/src/kernel/packs/index.ts +40 -0
- package/src/kernel/packs/iri.test.ts +73 -0
- package/src/kernel/packs/iri.ts +70 -20
- package/src/kernel/packs/renderPack.ts +28 -7
- package/src/kernel/packs/resolveEntity.test.ts +213 -0
- package/src/kernel/packs/resolveEntity.ts +132 -34
- package/src/kernel/packs/runBodies.ts +16 -16
- package/src/kernel/packs/sample.ts +1 -1
- package/src/kernel/packs/schema.ts +114 -11
- package/src/kernel/packs/sparql/applyFilters.ts +16 -17
- package/src/kernel/packs/sparql/buildLookupQuery.ts +75 -3
- package/src/kernel/packs/sparql/index.ts +37 -0
- package/src/kernel/packs/sparql/runSelect.test.ts +104 -10
- package/src/kernel/packs/sparql/runSelect.ts +75 -37
- package/src/kernel/packs/toolDescription.test.ts +52 -5
- package/src/kernel/packs/types.ts +52 -4
- package/src/kernel/packs/uniqueness.ts +5 -5
- package/src/kernel/project/cli/buildProgram.test.ts +157 -17
- package/src/kernel/project/cli/buildProgram.ts +77 -18
- package/src/kernel/project/cli/constants.ts +34 -0
- package/src/kernel/project/cli/dispatch.test.ts +227 -3
- package/src/kernel/project/cli/dispatch.ts +250 -48
- 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 +130 -30
- package/src/kernel/project/cli/helpFormat.ts +14 -1
- package/src/kernel/project/cli/rootHelp.ts +140 -111
- 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 +18 -10
- package/src/kernel/project/mcp/envelope.ts +2 -2
- package/src/kernel/project/mcp/instructions.ts +12 -7
- package/src/kernel/project/mcp/mcpError.ts +1 -1
- package/src/kernel/project/mcp/parity.test.ts +42 -1
- package/src/kernel/project/mcp/prompts/index.ts +37 -0
- package/src/kernel/project/mcp/prompts/prompts.test.ts +120 -5
- package/src/kernel/project/mcp/prompts/provider.ts +22 -8
- package/src/kernel/project/mcp/prompts/source.ts +69 -68
- package/src/kernel/project/mcp/registerVerb.ts +56 -11
- package/src/kernel/project/mcp/serve.ts +13 -5
- package/src/kernel/project/mcp/toolDescriptions.test.ts +6 -2
- package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
- package/src/kernel/render/contracts.ts +21 -0
- package/src/kernel/render/disclosure.ts +4 -2
- package/src/kernel/render/envelope.ts +2 -3
- package/src/kernel/render/formatters.ts +1 -1
- package/src/kernel/render/prefixes.test.ts +36 -0
- package/src/kernel/render/prefixes.ts +40 -13
- package/src/kernel/render/renderers.test.ts +244 -7
- package/src/kernel/render/renderers.ts +222 -20
- package/src/kernel/render/style.test.ts +75 -24
- package/src/kernel/render/style.ts +31 -1
- package/src/kernel/render/turtle.ts +222 -0
- package/src/kernel/runtime/graphpack/build.ts +29 -3
- package/src/kernel/runtime/graphpack/buildIndex.test.ts +46 -0
- package/src/kernel/runtime/graphpack/buildIndex.ts +53 -18
- package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +5 -5
- package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +3 -3
- package/src/kernel/runtime/graphpack/embedded/pack.stories.generated.ts +3 -0
- package/src/kernel/runtime/graphpack/embedded.ts +39 -13
- package/src/kernel/runtime/graphpack/graphpack.test.ts +205 -5
- package/src/kernel/runtime/graphpack/hash.ts +3 -2
- package/src/kernel/runtime/graphpack/index.ts +1 -1
- package/src/kernel/runtime/graphpack/manifest.ts +114 -12
- package/src/kernel/runtime/graphpack/read.ts +5 -11
- package/src/kernel/runtime/graphpack/schemas.ts +74 -0
- package/src/kernel/runtime/graphpack/stories.ts +84 -0
- package/src/kernel/runtime/graphpack/types.ts +61 -48
- package/src/kernel/runtime/loadSession.ts +1 -1
- package/src/kernel/runtime/paths.ts +64 -15
- package/src/kernel/runtime/probe.test.ts +8 -4
- package/src/kernel/runtime/probe.ts +6 -6
- package/src/kernel/runtime/readEntity.ts +477 -32
- package/src/kernel/runtime/refs/gitOps.ts +1 -19
- package/src/kernel/runtime/refs/index.ts +39 -0
- package/src/kernel/runtime/refs/parseRef.ts +8 -8
- package/src/kernel/runtime/refs/resolve.ts +82 -66
- package/src/kernel/runtime/resolveSources.test.ts +63 -24
- package/src/kernel/runtime/resolveSources.ts +36 -25
- package/src/kernel/runtime/storeReadiness.ts +10 -10
- package/src/kernel/runtime/storeless.test.ts +1 -1
- package/src/kernel/runtime/types.ts +15 -1
- package/src/kernel/runtime/wasmEmbed.test.ts +56 -55
- package/src/kernel/spec/emitReference.test.ts +3 -3
- package/src/kernel/spec/emitReference.ts +242 -34
- package/src/kernel/spec/emitSurface.ts +57 -11
- package/src/kernel/spec/surfaceConformance.test.ts +4 -2
- package/src/kernel/spec/surfaceConformance.ts +8 -0
- package/src/kernel/spec/types.ts +277 -13
- package/src/kernel/spec/validate.ts +2 -1
- package/src/kernel/vocabulary.test.ts +164 -0
- package/src/kernel/vocabulary.ts +146 -0
- package/src/testing/PARITY_GAPS.ts +8 -2
- package/src/testing/behavioral/README.md +3 -3
- package/src/testing/behavioral/completion.test.ts +19 -6
- package/src/testing/behavioral/docExamples.test.ts +14 -0
- package/src/testing/behavioral/errorMatrix.mcp.test.ts +6 -5
- package/src/testing/behavioral/errorMatrix.storeless.test.ts +1 -1
- package/src/testing/behavioral/exitCodes.e2e.test.ts +6 -5
- package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
- package/src/testing/behavioral/harness.foundation.test.ts +14 -5
- package/src/testing/behavioral/journeys.cli.test.ts +117 -76
- package/src/testing/behavioral/journeys.defaultPack.test.ts +88 -182
- package/src/testing/behavioral/journeys.firstInstall.test.ts +167 -0
- 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.mcpLifecycle.mcp.test.ts +9 -6
- package/src/testing/behavioral/journeys.packageStories.test.ts +188 -0
- package/src/testing/behavioral/liveReadSurface.ts +4 -3
- package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
- package/src/testing/behavioral/mcpSurface.test.ts +10 -5
- package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
- package/src/testing/behavioral/staleCommands.test.ts +10 -0
- package/src/testing/eval/__snapshots__/eval.test.ts.snap +7 -7
- package/src/testing/eval/cases/assembly.ts +13 -6
- package/src/testing/eval/cases/effectful.ts +28 -15
- package/src/testing/eval/cases/readNouns.ts +22 -20
- package/src/testing/eval/cases/stable.ts +5 -1
- package/src/testing/eval/eval.test.ts +7 -1
- package/src/testing/fixtures/blockGraph.ts +79 -0
- package/src/testing/fixtures/fixtureCapability.ts +45 -1
- package/src/testing/fixtures/graph/canonical.ts +94 -5
- package/src/testing/fixtures/graph/defaultPack.ts +7 -6
- package/src/testing/fixtures/graph/owlExport.ts +7 -5
- package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
- package/src/testing/helpers/fixtureGraph.ts +33 -16
- package/src/testing/helpers/packRuntime.ts +2 -3
- package/src/testing/helpers/projectCli.ts +2 -1
- package/src/testing/helpers/projectMcp.ts +38 -6
- package/src/testing/helpers/runCli.ts +35 -18
- package/src/testing/perf/budgets.test.ts +24 -9
- package/src/testing/perf/budgets.ts +76 -12
- package/src/testing/perf/codegen.test.ts +126 -0
- package/src/testing/perf/globalSetup.test.ts +286 -0
- package/src/testing/perf/globalSetup.ts +611 -14
- 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/src/types.ts +2 -2
- package/dist/pragma +0 -0
- package/src/capabilities/block/blockList.test.ts +0 -79
- package/src/capabilities/block/blockList.verb.ts +0 -163
- package/src/capabilities/block/index.ts +0 -25
- package/src/capabilities/block/pack.ts +0 -166
- package/src/capabilities/block/parity.test.ts +0 -187
- package/src/capabilities/block/tierChain.ts +0 -78
- package/src/capabilities/colophon/pragmaColophon.ts +0 -66
- package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -152
- package/src/capabilities/create/templates.embedded.generated.ts +0 -53
- package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -41
- package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
- package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -67
- package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -60
- package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
- package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
- package/src/capabilities/modifier/index.ts +0 -15
- package/src/capabilities/modifier/pack.ts +0 -64
- package/src/capabilities/standard/index.ts +0 -18
- package/src/capabilities/standard/pack.ts +0 -128
- package/src/capabilities/tier/index.ts +0 -19
- package/src/capabilities/tier/lookup.render.test.ts +0 -72
- package/src/capabilities/tier/lookup.render.ts +0 -59
- package/src/capabilities/tier/lookup.test.ts +0 -83
- package/src/capabilities/tier/lookup.verb.ts +0 -44
- package/src/capabilities/tier/pack.ts +0 -28
- package/src/capabilities/tier/runLookup.ts +0 -87
- package/src/capabilities/token/addConfig.render.ts +0 -27
- package/src/capabilities/token/addConfig.test.ts +0 -62
- package/src/capabilities/token/addConfig.verb.ts +0 -40
- package/src/capabilities/token/index.ts +0 -19
- package/src/capabilities/token/pack.ts +0 -58
- package/src/capabilities/token/runAddConfig.ts +0 -95
- package/src/kernel/completion/bashDrive.test.ts +0 -73
- package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
- package/src/kernel/runtime/graphpack/embedded/sample.ttl +0 -39
- package/src/kernel/runtime/lock.ts +0 -90
|
@@ -105,6 +105,121 @@ describe("buildProgram — default-true boolean negation (B9)", () => {
|
|
|
105
105
|
});
|
|
106
106
|
});
|
|
107
107
|
|
|
108
|
+
describe("buildProgram — one spelling per flag", () => {
|
|
109
|
+
it("registers no short option anywhere in the tree", () => {
|
|
110
|
+
const program = projectCli([fixtureModule]);
|
|
111
|
+
const walk = (cmd: import("commander").Command): void => {
|
|
112
|
+
expect(cmd.options.some((o) => o.short !== undefined)).toBe(false);
|
|
113
|
+
for (const child of cmd.commands) walk(child);
|
|
114
|
+
};
|
|
115
|
+
walk(program);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it("still answers --help while -v/-h reject as unknown options", async () => {
|
|
119
|
+
const spyErr = vi
|
|
120
|
+
.spyOn(process.stderr, "write")
|
|
121
|
+
.mockImplementation(() => true);
|
|
122
|
+
const spyOut = vi
|
|
123
|
+
.spyOn(process.stdout, "write")
|
|
124
|
+
.mockImplementation(() => true);
|
|
125
|
+
await expect(
|
|
126
|
+
projectCli([fixtureModule]).parseAsync(["widget", "--help"], {
|
|
127
|
+
from: "user",
|
|
128
|
+
}),
|
|
129
|
+
).rejects.toMatchObject({ code: "commander.helpDisplayed" });
|
|
130
|
+
await expect(
|
|
131
|
+
projectCli([fixtureModule]).parseAsync(["widget", "list", "-h"], {
|
|
132
|
+
from: "user",
|
|
133
|
+
}),
|
|
134
|
+
).rejects.toMatchObject({ code: "commander.unknownOption" });
|
|
135
|
+
await expect(
|
|
136
|
+
projectCli([fixtureModule]).parseAsync(["widget", "list", "-v"], {
|
|
137
|
+
from: "user",
|
|
138
|
+
}),
|
|
139
|
+
).rejects.toMatchObject({ code: "commander.unknownOption" });
|
|
140
|
+
spyErr.mockRestore();
|
|
141
|
+
spyOut.mockRestore();
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
describe("buildProgram — repeatable filter flags", () => {
|
|
146
|
+
/** A verb with a repeatable enum filter and a repeatable string filter. */
|
|
147
|
+
const filterVerb: VerbSpec = {
|
|
148
|
+
path: ["thing", "list"],
|
|
149
|
+
summary: "thing list summary",
|
|
150
|
+
params: [
|
|
151
|
+
{
|
|
152
|
+
kind: "enum",
|
|
153
|
+
name: "category",
|
|
154
|
+
doc: "Filter by category.",
|
|
155
|
+
values: ["css", "git"],
|
|
156
|
+
repeatable: true,
|
|
157
|
+
},
|
|
158
|
+
{ kind: "string", name: "tag", doc: "Filter by tag.", repeatable: true },
|
|
159
|
+
],
|
|
160
|
+
output: {
|
|
161
|
+
formatters: {
|
|
162
|
+
plain: (d) => JSON.stringify(d),
|
|
163
|
+
llm: (d) => JSON.stringify(d),
|
|
164
|
+
json: (d) => JSON.stringify(d),
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
capability: { needsStore: false, mutates: false, mcp: { expose: true } },
|
|
168
|
+
run: async (params) => params,
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/** Parse argv and capture the option bag the action receives. */
|
|
172
|
+
async function optsFor(argv: string[]): Promise<Record<string, unknown>> {
|
|
173
|
+
let seen: Record<string, unknown> = {};
|
|
174
|
+
const program = projectCli([
|
|
175
|
+
{
|
|
176
|
+
name: "thing",
|
|
177
|
+
verbs: [
|
|
178
|
+
{
|
|
179
|
+
...filterVerb,
|
|
180
|
+
run: async (params) => {
|
|
181
|
+
seen = params;
|
|
182
|
+
return null;
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
],
|
|
186
|
+
},
|
|
187
|
+
]);
|
|
188
|
+
await program.parseAsync(["thing", "list", ...argv], { from: "user" });
|
|
189
|
+
return seen;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
it("accumulates a repeated filter into the union, never last-wins", async () => {
|
|
193
|
+
const params = await optsFor([
|
|
194
|
+
"--category",
|
|
195
|
+
"css",
|
|
196
|
+
"--category",
|
|
197
|
+
"git",
|
|
198
|
+
"--tag",
|
|
199
|
+
"a",
|
|
200
|
+
"--tag",
|
|
201
|
+
"b",
|
|
202
|
+
]);
|
|
203
|
+
expect(params.category).toEqual(["css", "git"]);
|
|
204
|
+
expect(params.tag).toEqual(["a", "b"]);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it("keeps a single occurrence a one-element array and validates enum values", async () => {
|
|
208
|
+
const params = await optsFor(["--category", "css"]);
|
|
209
|
+
expect(params.category).toEqual(["css"]);
|
|
210
|
+
const program = projectCli([{ name: "thing", verbs: [filterVerb] }]);
|
|
211
|
+
const spy = vi
|
|
212
|
+
.spyOn(process.stderr, "write")
|
|
213
|
+
.mockImplementation(() => true);
|
|
214
|
+
await expect(
|
|
215
|
+
program.parseAsync(["thing", "list", "--category", "bogus"], {
|
|
216
|
+
from: "user",
|
|
217
|
+
}),
|
|
218
|
+
).rejects.toMatchObject({ code: "commander.invalidArgument" });
|
|
219
|
+
spy.mockRestore();
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
|
|
108
223
|
describe("buildProgram — early exits", () => {
|
|
109
224
|
it("throws commander.version for --version, writing the version", async () => {
|
|
110
225
|
const program = projectCli([fixtureModule]);
|
|
@@ -372,22 +487,36 @@ describe("buildProgram — sub-verb-only noun invoked bare (U2)", () => {
|
|
|
372
487
|
});
|
|
373
488
|
|
|
374
489
|
describe("formatRootHelp — grouping", () => {
|
|
375
|
-
const help = formatRootHelp(
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
490
|
+
const help = formatRootHelp(
|
|
491
|
+
"pragma",
|
|
492
|
+
"pragma test",
|
|
493
|
+
[
|
|
494
|
+
makeVerb(["info"]),
|
|
495
|
+
makeVerb(["config", "show"]),
|
|
496
|
+
makeVerb(["block", "list"]),
|
|
497
|
+
],
|
|
498
|
+
"1.2.3",
|
|
499
|
+
"https://example.test/issues",
|
|
500
|
+
);
|
|
501
|
+
|
|
502
|
+
it("leads with the uncurated nouns, untitled, under the usage line", () => {
|
|
503
|
+
// `block` is not in the kernel's curated table, so it leads the page with
|
|
504
|
+
// no heading of its own — the header already carries the blurb, and the
|
|
505
|
+
// kernel has no name for the domain. The kernel's own nouns keep their
|
|
506
|
+
// task-oriented sections.
|
|
507
|
+
expect(help).toMatch(/^Usage: pragma .*\n\n {2}block\b/m);
|
|
383
508
|
expect(help).toContain("Set up & maintain");
|
|
509
|
+
// The blurb appears exactly once: in the header.
|
|
510
|
+
expect(help.match(/pragma test/g)).toHaveLength(1);
|
|
384
511
|
});
|
|
385
512
|
|
|
386
|
-
it("lists the live nouns and
|
|
513
|
+
it("lists the live nouns, and only those", () => {
|
|
387
514
|
expect(help).toContain("block");
|
|
388
515
|
expect(help).toContain("config");
|
|
389
516
|
expect(help).toContain("info");
|
|
390
|
-
|
|
517
|
+
// `mcp` is curated for PLACEMENT, not conjured into existence: a registry
|
|
518
|
+
// without an mcp verb has no mcp row.
|
|
519
|
+
expect(help).not.toContain("mcp");
|
|
391
520
|
});
|
|
392
521
|
|
|
393
522
|
it("drops nouns that are not present", () => {
|
|
@@ -404,24 +533,35 @@ describe("formatRootHelp — grouping", () => {
|
|
|
404
533
|
|
|
405
534
|
it("renders the unified root page (restyle golden)", () => {
|
|
406
535
|
expect(help).toMatchInlineSnapshot(`
|
|
407
|
-
"
|
|
536
|
+
" _
|
|
537
|
+
/' \`\\
|
|
538
|
+
/' )
|
|
539
|
+
/' (___,/'____ ____ ____ ,__________ ____
|
|
540
|
+
/' )' )--/' ) /' ) /' ) ) /' )
|
|
541
|
+
/' /' /' /' /' /' /' /' /' /' /'
|
|
542
|
+
(,/' /' (___,/(__(___,/(__/' /' /(__(___,/(__
|
|
543
|
+
/'
|
|
544
|
+
/ /'
|
|
545
|
+
(___,/'
|
|
546
|
+
|
|
547
|
+
pragma v1.2.3 — pragma test
|
|
548
|
+
|
|
549
|
+
This is a preview version. Issues and suggestions: https://example.test/issues
|
|
408
550
|
|
|
409
551
|
Usage: pragma <command> [subcommand] [flags]
|
|
410
552
|
|
|
411
|
-
|
|
412
|
-
block Inspect components & patterns and their anatomy
|
|
553
|
+
block block list summary
|
|
413
554
|
|
|
414
555
|
Set up & maintain
|
|
415
556
|
config Read and write pragma configuration
|
|
416
557
|
info Show version, config, and update status
|
|
417
558
|
|
|
418
|
-
For AI agents
|
|
419
|
-
mcp Start the MCP server over stdio
|
|
420
|
-
|
|
421
559
|
Global flags
|
|
422
560
|
--format <plain|llm|json> Select output format (llm = condensed Markdown for agents)
|
|
423
561
|
--detail <level> Progressive-disclosure level (summary, standard, detailed)
|
|
424
|
-
--
|
|
562
|
+
--no-headers Hide the table header row in plain output
|
|
563
|
+
--quiet Suppress success and progress output (errors still print)
|
|
564
|
+
--verbose Diagnostic output on stderr (sources update)
|
|
425
565
|
--help Show help (works on any command)
|
|
426
566
|
--version Show the CLI version
|
|
427
567
|
|
|
@@ -11,11 +11,17 @@
|
|
|
11
11
|
* the v1 cli-core `registerAll`, retargeted at the grammar.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import { Command, Option } from "commander";
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
import { Command, InvalidArgumentError, Option } from "commander";
|
|
15
|
+
import {
|
|
16
|
+
BIN_NAME,
|
|
17
|
+
ISSUES_URL,
|
|
18
|
+
PROGRAM_DESCRIPTION,
|
|
19
|
+
VERSION,
|
|
20
|
+
} from "../../../constants.js";
|
|
21
|
+
import type { GlobalFlags } from "../../runtime/index.js";
|
|
22
|
+
import { kebabCase } from "../../spec/index.js";
|
|
23
|
+
import type { CliProjection, ParamSpec, VerbSpec } from "../../spec/types.js";
|
|
24
|
+
import { MUTATION_FLAG_DOCS, negationFlagDoc } from "./constants.js";
|
|
19
25
|
import { dispatch } from "./dispatch.js";
|
|
20
26
|
import { formatRootHelp } from "./rootHelp.js";
|
|
21
27
|
import { formatNounHelp, formatVerbHelp } from "./verbHelp.js";
|
|
@@ -30,6 +36,15 @@ export interface BuildProgramOptions {
|
|
|
30
36
|
readonly description?: string;
|
|
31
37
|
/** Version string for `--version`. */
|
|
32
38
|
readonly version?: string;
|
|
39
|
+
/** Where root help's preview notice sends feedback. */
|
|
40
|
+
readonly issuesUrl?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Module-owned noun mounts (see `CapabilityModule.cliProjection`), keyed by
|
|
43
|
+
* noun. A mounted noun's parent command is created here exactly once and
|
|
44
|
+
* handed to the module's `mount` — the module owns everything beneath it;
|
|
45
|
+
* its verbs stay the binding-level grammar for help/surface/completion.
|
|
46
|
+
*/
|
|
47
|
+
readonly mounts?: ReadonlyMap<string, CliProjection>;
|
|
33
48
|
}
|
|
34
49
|
|
|
35
50
|
/** The positional usage token for a param (`<name>` / `[name]`, variadic `...`). */
|
|
@@ -61,7 +76,30 @@ function registerParams(command: Command, verb: VerbSpec): void {
|
|
|
61
76
|
for (const param of verb.params) {
|
|
62
77
|
if (param.positional) continue;
|
|
63
78
|
const spec = flagSpec(param);
|
|
64
|
-
if (
|
|
79
|
+
if (
|
|
80
|
+
(param.kind === "enum" || param.kind === "string") &&
|
|
81
|
+
param.repeatable === true
|
|
82
|
+
) {
|
|
83
|
+
// A repeatable flag ACCUMULATES — Commander's default keeps only the
|
|
84
|
+
// last occurrence, which silently drops data. The collector validates
|
|
85
|
+
// an enum's values itself, since a custom parser replaces the parser
|
|
86
|
+
// `.choices()` would install.
|
|
87
|
+
command.addOption(
|
|
88
|
+
new Option(spec, param.doc).argParser(
|
|
89
|
+
(value: string, previous: string[] | undefined) => {
|
|
90
|
+
if (
|
|
91
|
+
param.kind === "enum" &&
|
|
92
|
+
!(param.values as readonly string[]).includes(value)
|
|
93
|
+
) {
|
|
94
|
+
throw new InvalidArgumentError(
|
|
95
|
+
`Allowed choices are ${param.values.join(", ")}.`,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
return [...(previous ?? []), value];
|
|
99
|
+
},
|
|
100
|
+
),
|
|
101
|
+
);
|
|
102
|
+
} else if (param.kind === "enum") {
|
|
65
103
|
const option = new Option(spec, param.doc).choices([...param.values]);
|
|
66
104
|
if (param.default !== undefined) option.default(param.default);
|
|
67
105
|
command.addOption(option);
|
|
@@ -70,23 +108,28 @@ function registerParams(command: Command, verb: VerbSpec): void {
|
|
|
70
108
|
} else {
|
|
71
109
|
command.option(spec, param.doc);
|
|
72
110
|
}
|
|
73
|
-
// B9: a default-`true` boolean is otherwise undisableable — the grammar
|
|
74
|
-
// no negation form, so
|
|
75
|
-
//
|
|
111
|
+
// B9: a default-`true` boolean is otherwise undisableable — the grammar
|
|
112
|
+
// has no negation form, so a kernel-registered default-true boolean could
|
|
113
|
+
// never be turned off. Register a paired `--no-<flag>` so it can:
|
|
76
114
|
// Commander keeps the `true` default and lets `--no-<flag>` set it false
|
|
77
|
-
// (verified: an unset default-false boolean is left alone).
|
|
78
|
-
// PARSE convenience, never a ParamSpec —
|
|
79
|
-
//
|
|
115
|
+
// (verified: an unset default-false boolean is left alone). For verbs
|
|
116
|
+
// registered HERE this is a CLI PARSE convenience, never a ParamSpec —
|
|
117
|
+
// `emitSurface`/MCP/the covenant keep the positive kebab token and
|
|
118
|
+
// negation stays additive. A MOUNTED noun (`create`) never reaches this
|
|
119
|
+
// loop: its leaves register through the projection's `buildOptionInfo`,
|
|
120
|
+
// where a default-true confirm registers ONLY the `--no-` form — so its
|
|
121
|
+
// covenant/reference tokens come from the module's registered-syntax
|
|
122
|
+
// seam, not this convention (L-CIS-2).
|
|
80
123
|
if (param.kind === "boolean" && param.default === true) {
|
|
81
124
|
const flag = kebabCase(param.name);
|
|
82
|
-
command.option(`--no-${flag}`,
|
|
125
|
+
command.option(`--no-${flag}`, negationFlagDoc(flag));
|
|
83
126
|
}
|
|
84
127
|
}
|
|
85
128
|
|
|
86
129
|
if (verb.capability.mutates) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
130
|
+
for (const { flag, doc } of MUTATION_FLAG_DOCS) {
|
|
131
|
+
command.option(flag, doc);
|
|
132
|
+
}
|
|
90
133
|
}
|
|
91
134
|
}
|
|
92
135
|
|
|
@@ -241,15 +284,21 @@ export function buildProgram(
|
|
|
241
284
|
const programName = options.programName ?? BIN_NAME;
|
|
242
285
|
const description = options.description ?? PROGRAM_DESCRIPTION;
|
|
243
286
|
const version = options.version ?? VERSION;
|
|
287
|
+
const issuesUrl = options.issuesUrl ?? ISSUES_URL;
|
|
244
288
|
const live = verbs.filter((verb) => !verb.hidden);
|
|
245
289
|
|
|
246
290
|
const program = new Command();
|
|
247
291
|
program.name(programName).description(description);
|
|
248
|
-
|
|
292
|
+
// One spelling per flag: no shorts. `--version` drops `-v` (which reads as
|
|
293
|
+
// *verbose* everywhere else), and the help option is `--help` alone —
|
|
294
|
+
// subcommands created from here on inherit it (Commander copies the help
|
|
295
|
+
// option into children at creation), including a mounted subtree's.
|
|
296
|
+
program.version(version, "--version");
|
|
297
|
+
program.helpOption("--help", "Show help (works on any command)");
|
|
249
298
|
program.enablePositionalOptions();
|
|
250
299
|
program.exitOverride();
|
|
251
300
|
useDesignedHelp(program, () =>
|
|
252
|
-
formatRootHelp(programName, description, live),
|
|
301
|
+
formatRootHelp(programName, description, live, version, issuesUrl),
|
|
253
302
|
);
|
|
254
303
|
|
|
255
304
|
const groups = new Map<string, VerbSpec[]>();
|
|
@@ -264,6 +313,16 @@ export function buildProgram(
|
|
|
264
313
|
const selfVerbs = bucket.filter((v) => v.path.length === 1);
|
|
265
314
|
const subVerbs = bucket.filter((v) => v.path.length > 1);
|
|
266
315
|
|
|
316
|
+
// A module-owned mount replaces the generic per-verb attachment for its
|
|
317
|
+
// noun: create the parent once, hand it over, move on.
|
|
318
|
+
const mounted = options.mounts?.get(noun);
|
|
319
|
+
if (mounted) {
|
|
320
|
+
const parent = program.command(noun);
|
|
321
|
+
parent.enablePositionalOptions();
|
|
322
|
+
mounted.mount(parent, { globalFlags: options.globalFlags, programName });
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
|
|
267
326
|
// Pure self-verb noun(s) — attach each leaf directly to the root, as before.
|
|
268
327
|
if (subVerbs.length === 0) {
|
|
269
328
|
for (const verb of selfVerbs) {
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI projector constants — the flag/doc pairs that must read identically
|
|
3
|
+
* wherever they surface.
|
|
4
|
+
*
|
|
5
|
+
* The mutation flags are auto-injected onto every mutating verb by
|
|
6
|
+
* `registerParams` (and by the mounted create subtree's own registration),
|
|
7
|
+
* and `formatVerbHelp` renders them in the Flags block; a default-true
|
|
8
|
+
* boolean's `--no-` negation is likewise both registered and rendered. Help
|
|
9
|
+
* and registration deriving from the SAME rows here is what keeps a page
|
|
10
|
+
* from denying a flag that parses — the defect this file exists to prevent.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** One auto-injected flag: the token and the doc both surfaces print. */
|
|
14
|
+
export interface FlagDoc {
|
|
15
|
+
readonly flag: string;
|
|
16
|
+
readonly doc: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** The three mutation flags every mutating verb accepts, in display order. */
|
|
20
|
+
export const MUTATION_FLAG_DOCS: readonly FlagDoc[] = [
|
|
21
|
+
{ flag: "--dry-run", doc: "Preview effects without applying them" },
|
|
22
|
+
{ flag: "--undo", doc: "Reverse a previous run of this command" },
|
|
23
|
+
{ flag: "--yes", doc: "Apply without an interactive confirmation" },
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The doc for the `--no-<flag>` negation a default-true boolean registers.
|
|
28
|
+
*
|
|
29
|
+
* @param kebab - The positive flag's kebab token (no dashes).
|
|
30
|
+
* @returns The doc string registration and help share.
|
|
31
|
+
*/
|
|
32
|
+
export function negationFlagDoc(kebab: string): string {
|
|
33
|
+
return `Disable --${kebab} (on by default).`;
|
|
34
|
+
}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { existsSync, mkdtempSync, readdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { $, fail, gen, log, mkdir, succeed, writeFile } from "@canonical/task";
|
|
2
5
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { fixturePreviewModule } from "../../../testing/fixtures/fixtureCapability.js";
|
|
3
7
|
import { PragmaError } from "../../error/PragmaError.js";
|
|
4
8
|
import { bootRuntime } from "../../runtime/boot.js";
|
|
5
9
|
import type { GlobalFlags } from "../../runtime/types.js";
|
|
6
10
|
import type { ParamSpec, VerbSpec } from "../../spec/types.js";
|
|
7
|
-
import { dispatch, executeVerb, extractParams } from "./dispatch.js";
|
|
11
|
+
import { cliIsTTY, dispatch, executeVerb, extractParams } from "./dispatch.js";
|
|
12
|
+
|
|
13
|
+
/** The read-then-write mutation the honest-preview guards drive. */
|
|
14
|
+
const graft = fixturePreviewModule.verbs[0] as VerbSpec;
|
|
8
15
|
|
|
9
16
|
const PLAIN: GlobalFlags = {
|
|
10
17
|
llm: false,
|
|
@@ -143,6 +150,46 @@ describe("executeVerb — mutations", () => {
|
|
|
143
150
|
expect(outcome.stdout).toContain("Dry run");
|
|
144
151
|
});
|
|
145
152
|
|
|
153
|
+
it("a verb with NO formatPlan renders the effect dump, byte for byte", async () => {
|
|
154
|
+
// The `formatPlan` seam is opt-in, and opting out is the majority case.
|
|
155
|
+
// These are the exact bytes the kernel produced before any verb had a
|
|
156
|
+
// renderer of its own — the whole literal, not a substring — so a verb
|
|
157
|
+
// that declares nothing can never be re-rendered by accident.
|
|
158
|
+
const dumped: VerbSpec = {
|
|
159
|
+
...make,
|
|
160
|
+
run: () =>
|
|
161
|
+
gen(function* () {
|
|
162
|
+
yield* $(log("info", "starting"));
|
|
163
|
+
yield* $(mkdir("out"));
|
|
164
|
+
yield* $(writeFile("out/thing.txt", "hello"));
|
|
165
|
+
return { dumped: true };
|
|
166
|
+
}),
|
|
167
|
+
};
|
|
168
|
+
const outcome = await executeVerb(
|
|
169
|
+
dumped,
|
|
170
|
+
{},
|
|
171
|
+
{ dryRun: true, undo: false, yes: false },
|
|
172
|
+
bootRuntime(PLAIN, mkdtempSync(join(tmpdir(), "pragma-dump-"))),
|
|
173
|
+
);
|
|
174
|
+
expect(outcome.stdout).toBe(
|
|
175
|
+
"Dry run — planned effects:\n" +
|
|
176
|
+
" - Log [info]: starting\n" +
|
|
177
|
+
" - Created out/\n" +
|
|
178
|
+
" - Write file: out/thing.txt (5 bytes)\n",
|
|
179
|
+
);
|
|
180
|
+
expect(outcome.exitCode).toBe(0);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it("an empty plan renders the no-effects line, byte for byte", async () => {
|
|
184
|
+
const outcome = await executeVerb(
|
|
185
|
+
make,
|
|
186
|
+
{},
|
|
187
|
+
{ dryRun: true, undo: false, yes: false },
|
|
188
|
+
bootRuntime(PLAIN),
|
|
189
|
+
);
|
|
190
|
+
expect(outcome.stdout).toBe("Dry run — no effects.\n");
|
|
191
|
+
});
|
|
192
|
+
|
|
146
193
|
it("reports undo count under --undo", async () => {
|
|
147
194
|
const outcome = await executeVerb(
|
|
148
195
|
make,
|
|
@@ -154,6 +201,104 @@ describe("executeVerb — mutations", () => {
|
|
|
154
201
|
});
|
|
155
202
|
});
|
|
156
203
|
|
|
204
|
+
describe("--quiet — success is silent, failure is not", () => {
|
|
205
|
+
// The rule the flag has to keep: everything muted is success-path narration
|
|
206
|
+
// (the calm zero-record notice, a mutation's stage lines). Error rendering
|
|
207
|
+
// does not route through either seam, so no failure can hide behind it.
|
|
208
|
+
const QUIET: GlobalFlags = { ...PLAIN, quiet: true };
|
|
209
|
+
const savedExit = process.exitCode;
|
|
210
|
+
afterEach(() => {
|
|
211
|
+
process.exitCode = savedExit;
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
const emptyList: VerbSpec = {
|
|
215
|
+
...echo,
|
|
216
|
+
params: [],
|
|
217
|
+
output: {
|
|
218
|
+
formatters: {
|
|
219
|
+
...passthroughFormatters,
|
|
220
|
+
plain: () => "",
|
|
221
|
+
emptyNotice: () => "No results.",
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
run: async () => [],
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
it("mutes the empty-state notice but keeps stdout and the exit code", async () => {
|
|
228
|
+
const loud = await executeVerb(
|
|
229
|
+
emptyList,
|
|
230
|
+
{},
|
|
231
|
+
{ dryRun: false, undo: false, yes: false },
|
|
232
|
+
bootRuntime(PLAIN),
|
|
233
|
+
);
|
|
234
|
+
expect(loud.stderr).toBe("No results.\n");
|
|
235
|
+
|
|
236
|
+
const quiet = await executeVerb(
|
|
237
|
+
emptyList,
|
|
238
|
+
{},
|
|
239
|
+
{ dryRun: false, undo: false, yes: false },
|
|
240
|
+
bootRuntime(QUIET),
|
|
241
|
+
);
|
|
242
|
+
expect(quiet.stderr).toBeUndefined();
|
|
243
|
+
expect(quiet.stdout).toBe(loud.stdout);
|
|
244
|
+
expect(quiet.exitCode).toBe(0);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
it("mutes a mutation's progress lines", async () => {
|
|
248
|
+
const reporting: VerbSpec = {
|
|
249
|
+
...make,
|
|
250
|
+
run: (_params, runtime) => {
|
|
251
|
+
runtime.report?.("Resolving the pack…");
|
|
252
|
+
return succeed({ made: true });
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
const errs: string[] = [];
|
|
256
|
+
const spy = vi
|
|
257
|
+
.spyOn(process.stderr, "write")
|
|
258
|
+
.mockImplementation((chunk: string | Uint8Array) => {
|
|
259
|
+
errs.push(String(chunk));
|
|
260
|
+
return true;
|
|
261
|
+
});
|
|
262
|
+
await executeVerb(
|
|
263
|
+
reporting,
|
|
264
|
+
{},
|
|
265
|
+
{ dryRun: false, undo: false, yes: true },
|
|
266
|
+
bootRuntime(PLAIN),
|
|
267
|
+
);
|
|
268
|
+
const loud = errs.join("");
|
|
269
|
+
errs.length = 0;
|
|
270
|
+
await executeVerb(
|
|
271
|
+
reporting,
|
|
272
|
+
{},
|
|
273
|
+
{ dryRun: false, undo: false, yes: true },
|
|
274
|
+
bootRuntime(QUIET),
|
|
275
|
+
);
|
|
276
|
+
spy.mockRestore();
|
|
277
|
+
expect(loud).toContain("Resolving the pack…");
|
|
278
|
+
expect(errs.join("")).toBe("");
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
it("still renders the error, with its exit code", async () => {
|
|
282
|
+
const failing: VerbSpec = {
|
|
283
|
+
...echo,
|
|
284
|
+
run: async () => {
|
|
285
|
+
throw PragmaError.notFound("thing", "Nope");
|
|
286
|
+
},
|
|
287
|
+
};
|
|
288
|
+
const errs: string[] = [];
|
|
289
|
+
const spy = vi
|
|
290
|
+
.spyOn(process.stderr, "write")
|
|
291
|
+
.mockImplementation((chunk: string | Uint8Array) => {
|
|
292
|
+
errs.push(String(chunk));
|
|
293
|
+
return true;
|
|
294
|
+
});
|
|
295
|
+
await dispatch(failing, ["x"], {}, QUIET);
|
|
296
|
+
spy.mockRestore();
|
|
297
|
+
expect(errs.join("")).toContain('thing "Nope" not found.');
|
|
298
|
+
expect(process.exitCode).toBe(1);
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
|
|
157
302
|
describe("dispatch — errors", () => {
|
|
158
303
|
const savedExit = process.exitCode;
|
|
159
304
|
afterEach(() => {
|
|
@@ -183,7 +328,7 @@ describe("dispatch — errors", () => {
|
|
|
183
328
|
it("renders a declined confirm gate as a clean cancellation, not a bug report", async () => {
|
|
184
329
|
// A TTY user declining execute()'s "Proceed?" gate fails the task with
|
|
185
330
|
// GENERATOR_CANCELLED; the boundary must treat it as a clean cancel, never
|
|
186
|
-
// the scary INTERNAL_ERROR "
|
|
331
|
+
// the scary INTERNAL_ERROR "report this issue" / exit 1.
|
|
187
332
|
const cancelling: VerbSpec = {
|
|
188
333
|
...make,
|
|
189
334
|
run: () => fail({ code: "GENERATOR_CANCELLED", message: "Cancelled." }),
|
|
@@ -233,6 +378,66 @@ describe("dispatch — errors", () => {
|
|
|
233
378
|
});
|
|
234
379
|
});
|
|
235
380
|
|
|
381
|
+
describe("--dry-run is honest (PRA-104)", () => {
|
|
382
|
+
const savedExit = process.exitCode;
|
|
383
|
+
afterEach(() => {
|
|
384
|
+
process.exitCode = savedExit;
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
/** Capture stderr for one dispatch. */
|
|
388
|
+
const dispatchCapturing = async (
|
|
389
|
+
positionals: readonly string[],
|
|
390
|
+
opts: Record<string, unknown>,
|
|
391
|
+
): Promise<string> => {
|
|
392
|
+
const errs: string[] = [];
|
|
393
|
+
const spy = vi
|
|
394
|
+
.spyOn(process.stderr, "write")
|
|
395
|
+
.mockImplementation((chunk: string | Uint8Array) => {
|
|
396
|
+
errs.push(String(chunk));
|
|
397
|
+
return true;
|
|
398
|
+
});
|
|
399
|
+
process.exitCode = 0;
|
|
400
|
+
try {
|
|
401
|
+
await dispatch(graft, positionals, opts, PLAIN);
|
|
402
|
+
} finally {
|
|
403
|
+
spy.mockRestore();
|
|
404
|
+
}
|
|
405
|
+
return errs.join("");
|
|
406
|
+
};
|
|
407
|
+
|
|
408
|
+
it("exits NONZERO when the mutation's first read would fail for real", async () => {
|
|
409
|
+
// The structural false positive: this same call used to print a full plan
|
|
410
|
+
// and exit 0, while the run without --dry-run died on the missing file.
|
|
411
|
+
const missing = join(mkdtempSync(join(tmpdir(), "pragma-graft-")), "gone");
|
|
412
|
+
const out = await dispatchCapturing([missing], { dryRun: true });
|
|
413
|
+
expect(process.exitCode).toBe(1);
|
|
414
|
+
expect(out).toContain(missing);
|
|
415
|
+
expect(existsSync(`${missing}.grafted`)).toBe(false);
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
it("still plans, exits 0, and writes nothing when the read would succeed", async () => {
|
|
419
|
+
const dir = mkdtempSync(join(tmpdir(), "pragma-graft-"));
|
|
420
|
+
const source = join(dir, "present.txt");
|
|
421
|
+
writeFileSync(source, "content\n");
|
|
422
|
+
const outs: string[] = [];
|
|
423
|
+
const spy = vi
|
|
424
|
+
.spyOn(process.stdout, "write")
|
|
425
|
+
.mockImplementation((chunk: string | Uint8Array) => {
|
|
426
|
+
outs.push(String(chunk));
|
|
427
|
+
return true;
|
|
428
|
+
});
|
|
429
|
+
process.exitCode = 0;
|
|
430
|
+
try {
|
|
431
|
+
await dispatch(graft, [source], { dryRun: true }, PLAIN);
|
|
432
|
+
} finally {
|
|
433
|
+
spy.mockRestore();
|
|
434
|
+
}
|
|
435
|
+
expect(process.exitCode).toBe(0);
|
|
436
|
+
expect(outs.join("")).toContain(`Write file: ${source}.grafted`);
|
|
437
|
+
expect(readdirSync(dir)).toEqual(["present.txt"]);
|
|
438
|
+
});
|
|
439
|
+
});
|
|
440
|
+
|
|
236
441
|
describe("executeVerb — interactivity gate (H3)", () => {
|
|
237
442
|
const setTTY = (
|
|
238
443
|
stream: NodeJS.ReadStream | NodeJS.WriteStream,
|
|
@@ -285,4 +490,23 @@ describe("executeVerb — interactivity gate (H3)", () => {
|
|
|
285
490
|
);
|
|
286
491
|
expect(sink.isTTY).toBe(true);
|
|
287
492
|
});
|
|
493
|
+
|
|
494
|
+
it("cliIsTTY IS the stdin+stderr conjunction — the one gate both callers read", () => {
|
|
495
|
+
// The mount's create decision reads the same exported function this
|
|
496
|
+
// describe drives through executeVerb, so pinning the truth table here
|
|
497
|
+
// pins BOTH callers (nothing is left to keep two copies in step).
|
|
498
|
+
const cases: Array<[boolean, boolean, boolean, boolean]> = [
|
|
499
|
+
[true, true, false, true], // stdout is irrelevant…
|
|
500
|
+
[true, true, true, true],
|
|
501
|
+
[false, true, true, false], // …stdin is required…
|
|
502
|
+
[true, false, true, false], // …and so is stderr.
|
|
503
|
+
[false, false, false, false],
|
|
504
|
+
];
|
|
505
|
+
for (const [stdin, stderr, stdout, expected] of cases) {
|
|
506
|
+
setTTY(process.stdin, stdin);
|
|
507
|
+
setTTY(process.stderr, stderr);
|
|
508
|
+
setTTY(process.stdout, stdout);
|
|
509
|
+
expect(cliIsTTY(), `stdin=${stdin} stderr=${stderr}`).toBe(expected);
|
|
510
|
+
}
|
|
511
|
+
});
|
|
288
512
|
});
|