@canonical/pragma-cli 0.34.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 +20 -22
- package/pragma.conf.ts +249 -60
- package/src/bin.ts +267 -82
- package/src/capabilities/block.parity.test.ts +6 -3
- 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 +25 -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.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 +6 -4
- package/src/capabilities/doctor/checks/checkPragmaVersion.ts +2 -2
- package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +72 -27
- package/src/capabilities/doctor/checks/checkShellCompletions.ts +59 -13
- 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 +18 -7
- package/src/capabilities/doctor/doctor.render.ts +43 -19
- package/src/capabilities/doctor/doctor.test.ts +123 -34
- package/src/capabilities/doctor/doctor.verb.ts +3 -3
- package/src/capabilities/doctor/runChecks.ts +62 -63
- package/src/capabilities/doctor/types.ts +20 -4
- package/src/capabilities/emptyRecovery.test.ts +13 -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 +5 -4
- package/src/capabilities/info/info.render.ts +1 -1
- package/src/capabilities/info/info.verb.ts +1 -1
- 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/resources/provider.ts +342 -85
- package/src/capabilities/resources/resources.test.ts +355 -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 +396 -326
- 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 +223 -71
- package/src/capabilities/setup/shell.test.ts +86 -0
- package/src/capabilities/setup/shell.ts +137 -11
- 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 +37 -5
- package/src/capabilities/skill/index.ts +1 -1
- package/src/capabilities/skill/render.ts +10 -9
- package/src/capabilities/skill/skill.test.ts +7 -5
- 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 +84 -7
- package/src/capabilities/sources/runUpdate.ts +53 -21
- package/src/capabilities/sources/sources.test.ts +154 -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 +1 -1
- package/src/capabilities/surface.test.ts +134 -17
- 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 +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 +31 -1
- package/src/identity.test.ts +40 -25
- 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 +1 -1
- 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 +34 -26
- 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 +25 -2
- 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 +26 -0
- package/src/kernel/packs/collect.ts +12 -16
- package/src/kernel/packs/compile.test.ts +130 -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 +24 -5
- package/src/kernel/packs/resolveEntity.test.ts +213 -0
- package/src/kernel/packs/resolveEntity.ts +112 -18
- package/src/kernel/packs/runBodies.ts +2 -3
- package/src/kernel/packs/sample.ts +1 -1
- package/src/kernel/packs/schema.ts +18 -1
- 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 +1 -1
- package/src/kernel/packs/sparql/runSelect.ts +3 -4
- package/src/kernel/packs/toolDescription.test.ts +42 -3
- package/src/kernel/packs/types.ts +13 -0
- package/src/kernel/packs/uniqueness.ts +1 -1
- package/src/kernel/project/cli/buildProgram.test.ts +147 -12
- 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 +160 -3
- package/src/kernel/project/cli/dispatch.ts +222 -42
- 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 +13 -0
- package/src/kernel/project/cli/rootHelp.ts +41 -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 +35 -9
- 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 +31 -1
- package/src/kernel/render/turtle.ts +222 -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 +248 -4
- package/src/testing/behavioral/docExamples.test.ts +14 -0
- package/src/testing/behavioral/errorMatrix.mcp.test.ts +2 -2
- 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.implementation.test.ts +206 -0
- package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
- package/src/testing/behavioral/journeys.packageStories.test.ts +4 -4
- 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/cases/effectful.ts +3 -2
- package/src/testing/fixtures/blockGraph.ts +79 -0
- package/src/testing/fixtures/graph/canonical.ts +88 -2
- 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/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `create` CLI mount: the summon generator TREE, mounted under the
|
|
3
|
+
* `create` noun through the SAME registration path the summon bin uses
|
|
4
|
+
* (`registerGeneratorCommands` from
|
|
5
|
+
* `@canonical/summon-core/projection/commander`), fed
|
|
6
|
+
* by the build-time projection (`createSurface.generated.ts`) — so `pragma
|
|
7
|
+
* create component react [component-path]` and `summon component react
|
|
8
|
+
* [component-path]` are one grammar, derived once.
|
|
9
|
+
*
|
|
10
|
+
* The mount owns everything beneath the noun: tree segments as subcommands,
|
|
11
|
+
* prompt-derived flags (a default-true confirm registers only its `--no-`
|
|
12
|
+
* form), grouped help, the excess-positional guard, and the leaf action —
|
|
13
|
+
* which extracts the EXPLICIT answers, makes the ONE interaction decision
|
|
14
|
+
* (refusing before the create runtime ever loads), and hands the kernel's
|
|
15
|
+
* `dispatchPrepared` a synthesized per-leaf VerbSpec so dry-run/undo/real-run
|
|
16
|
+
* rendering, exit codes, SIGINT and the SEC-2 jail reuse the existing
|
|
17
|
+
* machinery byte-for-byte.
|
|
18
|
+
*
|
|
19
|
+
* This is the HEAVY half of the create projection, reached ONLY through the
|
|
20
|
+
* dynamic import in `cliProjection.ts` — the light half the capabilities
|
|
21
|
+
* barrel carries. The split exists for the fast paths: `--help` and
|
|
22
|
+
* `__complete` import the barrel on every spawn and register nothing, so the
|
|
23
|
+
* registration machinery this module needs (summon-core's projection helpers
|
|
24
|
+
* and Commander adapter, Commander itself, the kernel dispatcher) must load
|
|
25
|
+
* only when an invocation actually enters the `create` subtree. The
|
|
26
|
+
* lazy-graph guard in `lazy.test.ts` pins that boundary.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import type { GeneratorResult } from "@canonical/summon-core";
|
|
30
|
+
import {
|
|
31
|
+
type CommandEntry,
|
|
32
|
+
decideInteraction,
|
|
33
|
+
explicitAnswersComplete,
|
|
34
|
+
extractAnswers,
|
|
35
|
+
type HostFlags,
|
|
36
|
+
type InteractionMode,
|
|
37
|
+
missingExplicitFlags,
|
|
38
|
+
type ProjectedPrompt,
|
|
39
|
+
refusalMessage,
|
|
40
|
+
} from "@canonical/summon-core/projection";
|
|
41
|
+
import {
|
|
42
|
+
type CommanderHost,
|
|
43
|
+
emitToProcess,
|
|
44
|
+
registerGeneratorCommands,
|
|
45
|
+
} from "@canonical/summon-core/projection/commander";
|
|
46
|
+
import type { Task } from "@canonical/task";
|
|
47
|
+
import { type Command, CommanderError } from "commander";
|
|
48
|
+
import { PragmaError } from "../../kernel/error/index.js";
|
|
49
|
+
import { renderErrorForFormat } from "../../kernel/error/renderError.js";
|
|
50
|
+
import { MUTATION_FLAG_DOCS } from "../../kernel/project/cli/constants.js";
|
|
51
|
+
import {
|
|
52
|
+
cliIsTTY,
|
|
53
|
+
dispatchPrepared,
|
|
54
|
+
type MutationFlags,
|
|
55
|
+
} from "../../kernel/project/cli/dispatch.js";
|
|
56
|
+
import {
|
|
57
|
+
helpColumns,
|
|
58
|
+
helpDim,
|
|
59
|
+
helpHeading,
|
|
60
|
+
helpUsage,
|
|
61
|
+
} from "../../kernel/project/cli/helpFormat.js";
|
|
62
|
+
import type { CliMountHost, VerbSpec } from "../../kernel/spec/types.js";
|
|
63
|
+
import { CREATE_GENERATORS } from "./constants.js";
|
|
64
|
+
import { CREATE_CAPABILITY, CREATE_OUTPUT, runCreate } from "./create.verb.js";
|
|
65
|
+
import { renderCreateHelp } from "./createHelp.js";
|
|
66
|
+
import { CREATE_SURFACE } from "./createSurface.generated.js";
|
|
67
|
+
import type { CreateKind } from "./types.js";
|
|
68
|
+
|
|
69
|
+
/** A projected runnable entry: the surface data plus its command path. */
|
|
70
|
+
interface SurfaceEntry {
|
|
71
|
+
readonly commandPath: string;
|
|
72
|
+
readonly meta: { readonly description: string };
|
|
73
|
+
readonly prompts: readonly ProjectedPrompt[];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** The mount's standard-flag rows for the grouped-help Global Options block. */
|
|
77
|
+
const MOUNT_FLAG_HELP: HostFlags = [
|
|
78
|
+
// The kernel's own mutation-flag rows (one authoring point with
|
|
79
|
+
// registration and verb help), then its `--help` row (rootHelp.ts), not
|
|
80
|
+
// Commander's phrasing — one voice across every help page, and `--help`
|
|
81
|
+
// is the only spelling (the subtree inherits the root's long-only help
|
|
82
|
+
// option).
|
|
83
|
+
...MUTATION_FLAG_DOCS.map(({ flag, doc }) => ({
|
|
84
|
+
flags: flag,
|
|
85
|
+
description: doc,
|
|
86
|
+
})),
|
|
87
|
+
{ flags: "--help", description: "Show help (works on any command)" },
|
|
88
|
+
];
|
|
89
|
+
|
|
90
|
+
/** The declared tree, flattened to registration entries (parents first). */
|
|
91
|
+
function surfaceBarrel(): CommandEntry<SurfaceEntry>[] {
|
|
92
|
+
const entries: CommandEntry<SurfaceEntry>[] = [];
|
|
93
|
+
const namespaces = new Set<string>();
|
|
94
|
+
for (const binding of Object.values(CREATE_GENERATORS)) {
|
|
95
|
+
for (const commandPath of binding.paths) {
|
|
96
|
+
const segments = commandPath.split("/");
|
|
97
|
+
if (segments.length > 1) namespaces.add(segments[0] as string);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
for (const namespace of namespaces) {
|
|
101
|
+
entries.push({ path: [namespace], description: `${namespace} generators` });
|
|
102
|
+
}
|
|
103
|
+
for (const binding of Object.values(CREATE_GENERATORS)) {
|
|
104
|
+
for (const commandPath of binding.paths) {
|
|
105
|
+
const surface = CREATE_SURFACE[commandPath];
|
|
106
|
+
if (!surface) {
|
|
107
|
+
throw new Error(
|
|
108
|
+
`createSurface.generated.ts carries no entry for "${commandPath}" — rerun the build`,
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
entries.push({
|
|
112
|
+
path: commandPath.split("/"),
|
|
113
|
+
generator: {
|
|
114
|
+
commandPath,
|
|
115
|
+
meta: { description: surface.description },
|
|
116
|
+
prompts: surface.prompts,
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return entries.sort((a, b) => a.path.length - b.path.length);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** The create noun that declares a command path. */
|
|
125
|
+
function kindOf(commandPath: string): CreateKind {
|
|
126
|
+
for (const [kind, binding] of Object.entries(CREATE_GENERATORS)) {
|
|
127
|
+
if ((binding.paths as readonly string[]).includes(commandPath)) {
|
|
128
|
+
return kind as CreateKind;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
throw new Error(`undeclared command path ${commandPath}`);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Synthesize the per-leaf VerbSpec `dispatchPrepared` runs: params are EMPTY
|
|
136
|
+
* (the mount already extracted the explicit answers — leaf commands carry no
|
|
137
|
+
* Commander defaults, so explicit stays distinguishable from default), and
|
|
138
|
+
* `run` is `runCreate` over the full command path.
|
|
139
|
+
*
|
|
140
|
+
* The output spec is the SHARED `CREATE_OUTPUT`, not a local rebuild: this is
|
|
141
|
+
* the spec a real `create component react …` runs against, so a dry-run
|
|
142
|
+
* renderer declared only on the binding-level verbs would be a renderer the
|
|
143
|
+
* CLI never reached.
|
|
144
|
+
*/
|
|
145
|
+
export function leafVerb(commandPath: string): VerbSpec {
|
|
146
|
+
const surface = CREATE_SURFACE[commandPath];
|
|
147
|
+
return {
|
|
148
|
+
path: ["create", kindOf(commandPath)],
|
|
149
|
+
summary: surface?.description ?? commandPath,
|
|
150
|
+
params: [],
|
|
151
|
+
output: CREATE_OUTPUT,
|
|
152
|
+
capability: CREATE_CAPABILITY,
|
|
153
|
+
run: (params, rt) =>
|
|
154
|
+
runCreate(commandPath, params, rt) as unknown as Task<GeneratorResult>,
|
|
155
|
+
} as VerbSpec;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* The explicit answers of one leaf invocation: flag-extracted (explicit-only,
|
|
160
|
+
* confirm equality-vs-default) plus the positional when given. Exported for
|
|
161
|
+
* the grammar tests — this is the exact bag the wizard is seeded with.
|
|
162
|
+
*/
|
|
163
|
+
export function explicitLeafAnswers(
|
|
164
|
+
prompts: readonly ProjectedPrompt[],
|
|
165
|
+
positionalValue: string | undefined,
|
|
166
|
+
options: Record<string, unknown>,
|
|
167
|
+
): Record<string, unknown> {
|
|
168
|
+
const explicit = extractAnswers(options, prompts);
|
|
169
|
+
const positionalPrompt = prompts.find((prompt) => prompt.positional);
|
|
170
|
+
if (positionalPrompt && positionalValue !== undefined) {
|
|
171
|
+
explicit[positionalPrompt.name] = positionalValue;
|
|
172
|
+
}
|
|
173
|
+
return explicit;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* The mount's mode resolution — `decideInteraction` over the leaf's five
|
|
178
|
+
* inputs, with the TTY fact INJECTED so the resolution is testable with
|
|
179
|
+
* `tty: true` (no suite can drive a real TTY through a subprocess). The
|
|
180
|
+
* action calls it with {@link cliIsTTY} — the same exported H3 gate the
|
|
181
|
+
* kernel's interaction context reads — so the mount and `runCreate` can
|
|
182
|
+
* never disagree about interactivity.
|
|
183
|
+
*/
|
|
184
|
+
export function resolveCreateMode(
|
|
185
|
+
prompts: readonly ProjectedPrompt[],
|
|
186
|
+
explicit: Record<string, unknown>,
|
|
187
|
+
mutation: MutationFlags,
|
|
188
|
+
tty: boolean,
|
|
189
|
+
): InteractionMode {
|
|
190
|
+
return decideInteraction({
|
|
191
|
+
dryRun: mutation.dryRun,
|
|
192
|
+
undo: mutation.undo,
|
|
193
|
+
yes: mutation.yes,
|
|
194
|
+
isTTY: tty,
|
|
195
|
+
explicitComplete: explicitAnswersComplete(prompts, explicit),
|
|
196
|
+
}).mode;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Write the refusal and set exit 2. The refusal is the cross-CLI parity
|
|
201
|
+
* surface (contract §3): its default bytes are the shared message verbatim,
|
|
202
|
+
* no envelope prefix — the summon bin's full stderr, byte for byte — and
|
|
203
|
+
* ONLY an explicitly requested machine format reframes it, through the
|
|
204
|
+
* kernel's ONE gate+renderer decision (`renderErrorForFormat`): `--format
|
|
205
|
+
* json` emits the D3 `{ ok:false, error }` envelope, `--format llm` the
|
|
206
|
+
* condensed Markdown error form, both as `INVALID_INPUT` through the same
|
|
207
|
+
* renderers every other pragma error uses. Implicit auto-LLM detection (a
|
|
208
|
+
* piped run without `--format`) is excluded by the helper's construction —
|
|
209
|
+
* an inferred output mode must never break refusal byte-parity with summon.
|
|
210
|
+
*/
|
|
211
|
+
function writeRefusal(
|
|
212
|
+
message: string,
|
|
213
|
+
flags: import("../../kernel/runtime/types.js").GlobalFlags,
|
|
214
|
+
): void {
|
|
215
|
+
const rendered = renderErrorForFormat(
|
|
216
|
+
new PragmaError({ code: "INVALID_INPUT", message }),
|
|
217
|
+
flags.format,
|
|
218
|
+
);
|
|
219
|
+
process.stderr.write(`${rendered ?? message}\n`);
|
|
220
|
+
process.exitCode = 2;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Mount the generator tree onto the `create` parent command.
|
|
225
|
+
*
|
|
226
|
+
* The registration entry `cliProjection.ts` dynamically imports — see this
|
|
227
|
+
* module's header for why it must not be reached statically.
|
|
228
|
+
*/
|
|
229
|
+
export function mountCreateTree(parent: Command, host: CliMountHost): void {
|
|
230
|
+
// The parent's own face: the topic tree (paths + descriptions), on bare
|
|
231
|
+
// `create` AND on `create --help` alike, exit 0.
|
|
232
|
+
parent.configureHelp({ formatHelp: () => "" });
|
|
233
|
+
parent.addHelpText("beforeAll", (ctx) =>
|
|
234
|
+
ctx.command === parent ? `${topicTree(host.programName)}\n` : "",
|
|
235
|
+
);
|
|
236
|
+
parent.allowExcessArguments(true);
|
|
237
|
+
parent.action(async () => {
|
|
238
|
+
const stray = parent.args[0];
|
|
239
|
+
if (stray !== undefined) {
|
|
240
|
+
// An unrecognized topic keeps the bin's "Did you mean?" flow (the bin
|
|
241
|
+
// re-derives the token from argv; this message is cosmetic).
|
|
242
|
+
throw new CommanderError(
|
|
243
|
+
2,
|
|
244
|
+
"commander.unknownCommand",
|
|
245
|
+
`error: unknown command '${stray}'`,
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
process.stdout.write(`${topicTree(host.programName)}\n`);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
const cliHost: CommanderHost<SurfaceEntry> = {
|
|
252
|
+
registerFlags: (cmd) => {
|
|
253
|
+
// Reset the designed-help suppression a Commander child inherits from
|
|
254
|
+
// the root program; grouped help re-configures the leaves right after.
|
|
255
|
+
cmd.configureHelp({});
|
|
256
|
+
for (const { flag, doc } of MUTATION_FLAG_DOCS) {
|
|
257
|
+
cmd.option(flag, doc);
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
helpFlags: MOUNT_FLAG_HELP,
|
|
261
|
+
// The seam's presentation half: the projection's structure, pragma's
|
|
262
|
+
// house style (see createHelp.ts).
|
|
263
|
+
renderHelp: renderCreateHelp,
|
|
264
|
+
action: async (entry, positionalValue, options) => {
|
|
265
|
+
const generator = entry.generator as SurfaceEntry;
|
|
266
|
+
const explicit = explicitLeafAnswers(
|
|
267
|
+
generator.prompts,
|
|
268
|
+
positionalValue,
|
|
269
|
+
options,
|
|
270
|
+
);
|
|
271
|
+
const mutation = {
|
|
272
|
+
dryRun: options.dryRun === true,
|
|
273
|
+
undo: options.undo === true,
|
|
274
|
+
yes: options.yes === true,
|
|
275
|
+
};
|
|
276
|
+
// The ONE interaction decision — made BEFORE the create runtime loads,
|
|
277
|
+
// so a refusal never touches summon-core. (`runCreate` re-derives the
|
|
278
|
+
// same mode from the same inputs to pick its prompt strategy.)
|
|
279
|
+
const mode = resolveCreateMode(
|
|
280
|
+
generator.prompts,
|
|
281
|
+
explicit,
|
|
282
|
+
mutation,
|
|
283
|
+
cliIsTTY(),
|
|
284
|
+
);
|
|
285
|
+
if (mode === "refuse") {
|
|
286
|
+
writeRefusal(
|
|
287
|
+
refusalMessage(missingExplicitFlags(generator.prompts, explicit)),
|
|
288
|
+
host.globalFlags,
|
|
289
|
+
);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
await dispatchPrepared(
|
|
293
|
+
leafVerb(generator.commandPath),
|
|
294
|
+
explicit,
|
|
295
|
+
mutation,
|
|
296
|
+
host.globalFlags,
|
|
297
|
+
);
|
|
298
|
+
},
|
|
299
|
+
onNamespace: (cmd) => {
|
|
300
|
+
// Reset the designed-help suppression a Commander child inherits from
|
|
301
|
+
// the root program. The namespace BEHAVIOR (the shared did-you-mean on
|
|
302
|
+
// a stray segment, help-on-stderr exit 1 when bare) is the
|
|
303
|
+
// projection's, not the mount's — both hosts emit the same lines.
|
|
304
|
+
cmd.configureHelp({});
|
|
305
|
+
},
|
|
306
|
+
// The projection's usage errors reframe ONLY under an explicitly
|
|
307
|
+
// requested machine format — the kernel's ONE gate+renderer decision
|
|
308
|
+
// (`renderErrorForFormat`, shared with `writeRefusal` and bin.ts's
|
|
309
|
+
// usage-error sites), autoLlm excluded by its construction, so the
|
|
310
|
+
// default piped bytes stay the cross-CLI parity surface. Codes mirror
|
|
311
|
+
// bin.ts's classification: unknown command → UNKNOWN_VERB, every other
|
|
312
|
+
// usage error → INVALID_INPUT. The match is serialized PER KIND: an
|
|
313
|
+
// unknown SEGMENT is a fuzzy match, so its bare candidate rides in
|
|
314
|
+
// `suggestions` (substitutable for the token the headline names); an
|
|
315
|
+
// excess positional's match is NOT substitutable — it may BE the stray
|
|
316
|
+
// — so that kind instead carries the correction in the covenant's
|
|
317
|
+
// `recovery.cli` (`[...chain, suggestion].join(" ")`), and ONLY when
|
|
318
|
+
// that command is a DECLARED RUNNABLE LEAF: `chain` is `[<bin>,
|
|
319
|
+
// "create", ...segments]`, so everything past the mount point joined
|
|
320
|
+
// with the suggestion is the CREATE_SURFACE key, and a namespace match
|
|
321
|
+
// (exit-1 help page, can never scaffold) ships NO recovery.
|
|
322
|
+
emit: (outcome) => {
|
|
323
|
+
if (outcome.kind === "namespace-help") return emitToProcess(outcome);
|
|
324
|
+
const { error } = outcome;
|
|
325
|
+
const rendered = renderErrorForFormat(
|
|
326
|
+
new PragmaError({
|
|
327
|
+
code:
|
|
328
|
+
error.kind === "unknown-segment" ? "UNKNOWN_VERB" : "INVALID_INPUT",
|
|
329
|
+
message: error.headline,
|
|
330
|
+
...(error.kind === "unknown-segment" && error.suggestion !== undefined
|
|
331
|
+
? { suggestions: [error.suggestion] }
|
|
332
|
+
: {}),
|
|
333
|
+
...(error.kind === "excess-positional" &&
|
|
334
|
+
error.suggestion !== undefined &&
|
|
335
|
+
CREATE_SURFACE[
|
|
336
|
+
[...error.chain.slice(2), error.suggestion].join("/")
|
|
337
|
+
] !== undefined
|
|
338
|
+
? {
|
|
339
|
+
recovery: {
|
|
340
|
+
message: "Run the corrected invocation.",
|
|
341
|
+
cli: [...error.chain, error.suggestion].join(" "),
|
|
342
|
+
},
|
|
343
|
+
}
|
|
344
|
+
: {}),
|
|
345
|
+
}),
|
|
346
|
+
host.globalFlags.format,
|
|
347
|
+
);
|
|
348
|
+
// No machine format requested: the default piped bytes are the parity
|
|
349
|
+
// surface.
|
|
350
|
+
if (rendered === undefined) return emitToProcess(outcome);
|
|
351
|
+
process.stderr.write(`${rendered}\n`);
|
|
352
|
+
process.exitCode = outcome.exitCode;
|
|
353
|
+
},
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
registerGeneratorCommands(parent, surfaceBarrel(), cliHost);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* The pragma-styled topic tree (paths + descriptions from the manifest):
|
|
361
|
+
* one row per INVOCABLE command path (`component react`, `package`, …), so
|
|
362
|
+
* every row is copy-pasteable after `pragma create ` — the same kernel
|
|
363
|
+
* primitives, and the same shape, as every other noun's verb listing
|
|
364
|
+
* (`formatNounHelp`).
|
|
365
|
+
*/
|
|
366
|
+
export function topicTree(programName: string): string {
|
|
367
|
+
const rows = Object.values(CREATE_GENERATORS).flatMap((binding) =>
|
|
368
|
+
binding.paths.map(
|
|
369
|
+
(commandPath) =>
|
|
370
|
+
[
|
|
371
|
+
commandPath.split("/").join(" "),
|
|
372
|
+
CREATE_SURFACE[commandPath]?.description ?? "",
|
|
373
|
+
] as const,
|
|
374
|
+
),
|
|
375
|
+
);
|
|
376
|
+
return [
|
|
377
|
+
helpUsage(`${programName} create <path...> [options]`),
|
|
378
|
+
"",
|
|
379
|
+
"Scaffold from the summon generator tree.",
|
|
380
|
+
"",
|
|
381
|
+
helpHeading("Generators"),
|
|
382
|
+
...helpColumns(rows),
|
|
383
|
+
"",
|
|
384
|
+
helpDim(
|
|
385
|
+
`Run \`${programName} create <path...> --help\` for a generator's flags.`,
|
|
386
|
+
),
|
|
387
|
+
helpDim(
|
|
388
|
+
`The tree mirrors the summon CLI: \`${programName} create <path...>\` ≡ \`summon <path...>\`.`,
|
|
389
|
+
),
|
|
390
|
+
].join("\n");
|
|
391
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SEC-2 jail unit pins — `assertInsideWorkspace` driven DIRECTLY.
|
|
3
|
+
*
|
|
4
|
+
* Since the round-9 reorder the shared prompt validators consume the
|
|
5
|
+
* absolute and `..` classes upstream on every production path, so the
|
|
6
|
+
* integration suites can no longer reach those jail branches. These cells
|
|
7
|
+
* pin the jail's own three refusals (absolute, `..` escape, symlink
|
|
8
|
+
* resolution) and its cwd-identity property — the root it measures against
|
|
9
|
+
* is exactly the `cwd` it is HANDED, never the ambient process directory —
|
|
10
|
+
* independently of which layer refuses first in production.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { mkdtempSync, symlinkSync } from "node:fs";
|
|
14
|
+
import { tmpdir } from "node:os";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { describe, expect, it } from "vitest";
|
|
17
|
+
import { PragmaError } from "../../kernel/error/PragmaError.js";
|
|
18
|
+
import { assertInsideWorkspace } from "./pathJail.js";
|
|
19
|
+
|
|
20
|
+
const freshDir = (): string => mkdtempSync(join(tmpdir(), "pragma-pathjail-"));
|
|
21
|
+
|
|
22
|
+
/** The error a call throws (fails the cell when it does not throw). */
|
|
23
|
+
function thrown(fn: () => void): unknown {
|
|
24
|
+
try {
|
|
25
|
+
fn();
|
|
26
|
+
} catch (error) {
|
|
27
|
+
return error;
|
|
28
|
+
}
|
|
29
|
+
return expect.fail("assertInsideWorkspace did not throw");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
describe("assertInsideWorkspace — the jail's own branches (PROTECTED)", () => {
|
|
33
|
+
it("rejects an absolute path", () => {
|
|
34
|
+
const error = thrown(() =>
|
|
35
|
+
assertInsideWorkspace("componentPath", "/evil/Widget", freshDir()),
|
|
36
|
+
);
|
|
37
|
+
expect(error).toBeInstanceOf(PragmaError);
|
|
38
|
+
expect(error).toMatchObject({
|
|
39
|
+
code: "INVALID_INPUT",
|
|
40
|
+
message: 'Invalid componentPath "/evil/Widget".',
|
|
41
|
+
recovery: { message: "Use a path relative to the current directory." },
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("rejects a `..` escape", () => {
|
|
46
|
+
const error = thrown(() =>
|
|
47
|
+
assertInsideWorkspace("componentPath", "../evil/Widget", freshDir()),
|
|
48
|
+
);
|
|
49
|
+
expect(error).toBeInstanceOf(PragmaError);
|
|
50
|
+
expect(error).toMatchObject({
|
|
51
|
+
code: "INVALID_INPUT",
|
|
52
|
+
message: 'Invalid componentPath "../evil/Widget".',
|
|
53
|
+
recovery: { message: "The path must stay inside the workspace." },
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("rejects a symlink resolving outside the workspace", () => {
|
|
58
|
+
const root = freshDir();
|
|
59
|
+
const outside = freshDir();
|
|
60
|
+
symlinkSync(outside, join(root, "link"));
|
|
61
|
+
const error = thrown(() =>
|
|
62
|
+
assertInsideWorkspace("appPath", "link/app", root),
|
|
63
|
+
);
|
|
64
|
+
expect(error).toBeInstanceOf(PragmaError);
|
|
65
|
+
expect(error).toMatchObject({
|
|
66
|
+
code: "INVALID_INPUT",
|
|
67
|
+
message: 'Invalid appPath "link/app".',
|
|
68
|
+
recovery: { message: "The path resolves outside the workspace." },
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("jails against the GIVEN cwd, not the ambient one: same value, two cwds", () => {
|
|
73
|
+
// `link/Widget` resolves through a symlink OUT of `jailed` but is an
|
|
74
|
+
// ordinary nested path under `plain` — so the verdict flips with the
|
|
75
|
+
// handed cwd alone, while process.cwd() (neither dir) never moves.
|
|
76
|
+
const jailed = freshDir();
|
|
77
|
+
const plain = freshDir();
|
|
78
|
+
const outside = freshDir();
|
|
79
|
+
symlinkSync(outside, join(jailed, "link"));
|
|
80
|
+
expect(process.cwd()).not.toBe(jailed);
|
|
81
|
+
expect(process.cwd()).not.toBe(plain);
|
|
82
|
+
|
|
83
|
+
expect(() =>
|
|
84
|
+
assertInsideWorkspace("componentPath", "link/Widget", jailed),
|
|
85
|
+
).toThrow('Invalid componentPath "link/Widget".');
|
|
86
|
+
expect(() =>
|
|
87
|
+
assertInsideWorkspace("componentPath", "link/Widget", plain),
|
|
88
|
+
).not.toThrow();
|
|
89
|
+
});
|
|
90
|
+
});
|
|
@@ -2,15 +2,18 @@
|
|
|
2
2
|
* SEC-2 path jail: an independent guard that a `create` output path stays inside
|
|
3
3
|
* the workspace, run BEFORE any effect. It rejects an absolute path, a `..`
|
|
4
4
|
* escape, and — via `realpath` on the nearest existing ancestor — a symlink that
|
|
5
|
-
* points out of the tree. This is defence in depth: the generators' own
|
|
6
|
-
* `validateComponentPath`
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* points out of the tree. This is defence in depth: the generators' own prompt
|
|
6
|
+
* validators (`validateComponentPath`, `validateAppPath`) reject absolute/`..`
|
|
7
|
+
* uniformly across the declared path prompts — in BOTH hosts, upstream of this
|
|
8
|
+
* jail — so the jail is pragma's host-level backstop, and its symlink check is
|
|
9
|
+
* the one tier the shared validators do not have (summon relies on the
|
|
10
|
+
* validator tier; hoisting the realpath check into the shared layer is a named
|
|
11
|
+
* follow-up).
|
|
9
12
|
*/
|
|
10
13
|
|
|
11
14
|
import { existsSync, realpathSync } from "node:fs";
|
|
12
15
|
import * as path from "node:path";
|
|
13
|
-
import { PragmaError } from "../../kernel/error/
|
|
16
|
+
import { PragmaError } from "../../kernel/error/index.js";
|
|
14
17
|
|
|
15
18
|
/** Walk up from `p` to the nearest ancestor that exists on disk. */
|
|
16
19
|
function nearestExisting(p: string): string {
|
|
@@ -2,7 +2,7 @@ import { generators as applicationGenerators } from "@canonical/summon-applicati
|
|
|
2
2
|
import { generators as componentGenerators } from "@canonical/summon-component";
|
|
3
3
|
import type { GeneratorDefinition } from "@canonical/summon-core";
|
|
4
4
|
import { generators as packageGenerators } from "@canonical/summon-package";
|
|
5
|
-
import { PragmaError } from "../../kernel/error/
|
|
5
|
+
import { PragmaError } from "../../kernel/error/index.js";
|
|
6
6
|
import { CREATE_GENERATORS } from "./constants.js";
|
|
7
7
|
import type { CreateKind } from "./types.js";
|
|
8
8
|
|
|
@@ -10,11 +10,11 @@ type GeneratorMap = Record<string, GeneratorDefinition | undefined>;
|
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* The declared packages' generator maps, bound by noun. The STATIC imports above
|
|
13
|
-
* are load-bearing:
|
|
14
|
-
*
|
|
15
|
-
* generators out of the
|
|
16
|
-
* '@canonical/summon-component'
|
|
17
|
-
* WHICH generator runs; it cannot decide which module is
|
|
13
|
+
* are load-bearing: a computed `import(CREATE_GENERATORS[kind].name)` is opaque
|
|
14
|
+
* to every bundler and analyser, and the historical cost was measured — under
|
|
15
|
+
* `bun build --compile` it left the generators out of the artifact entirely
|
|
16
|
+
* (`Cannot find module '@canonical/summon-component'`). The declaration decides
|
|
17
|
+
* WHICH generator runs; it cannot decide which module is reachable.
|
|
18
18
|
*
|
|
19
19
|
* The maps' `generate` is invariant in its (specific) answer type, so they are
|
|
20
20
|
* erased to the base definition via `unknown` — runtime-safe because `execute`
|
|
@@ -28,42 +28,30 @@ const GENERATOR_MAPS: Record<CreateKind, GeneratorMap> = {
|
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
|
-
* Pick the generator for
|
|
31
|
+
* Pick the generator for one FULL COMMAND PATH (`component/react`,
|
|
32
|
+
* `package`, `application/react`) — a straight lookup over the declared
|
|
33
|
+
* bindings, no framework axis: the path IS the identity, exactly as summon's
|
|
34
|
+
* tree keys it. Callers with a kind+framework surface (MCP) map to a path
|
|
35
|
+
* first.
|
|
32
36
|
*
|
|
33
37
|
* The module this lives in statically imports the summon generator packages'
|
|
34
38
|
* `generators` maps — and importing them pulls summon-core. So it MUST stay
|
|
35
39
|
* behind `create`'s lazy `import()` (R9): the fast paths (`buildProgram` /
|
|
36
|
-
* `__complete` / `--help` / reads) never load it, and `create --yes` never
|
|
37
|
-
* React either (summon-core's Ink UI is dynamic-only).
|
|
40
|
+
* `__complete` / `--help` / reads) never load it, and `create --yes` never
|
|
41
|
+
* loads React either (summon-core's Ink UI is dynamic-only).
|
|
38
42
|
*
|
|
39
|
-
*
|
|
40
|
-
* axis (which is why the verb synthesises a `--framework` enum), and narrowing
|
|
41
|
-
* on `kind` here lets `CREATE_GENERATORS[kind].key` type-check over the
|
|
42
|
-
* remaining nouns without `in`-narrowing gymnastics.
|
|
43
|
-
*
|
|
44
|
-
* @param kind - The create noun.
|
|
45
|
-
* @param params - The coerced params (used for `--framework` on `component`).
|
|
43
|
+
* @param commandPath - The declared command path to run.
|
|
46
44
|
* @returns The selected generator definition.
|
|
47
|
-
* @throws PragmaError
|
|
45
|
+
* @throws PragmaError INTERNAL for an undeclared path (callers validate
|
|
46
|
+
* user-facing inputs before mapping to a path).
|
|
48
47
|
*/
|
|
49
|
-
export function pickGenerator(
|
|
50
|
-
kind
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const framework = String(params.framework ?? frameworks[0]);
|
|
56
|
-
const generator = GENERATOR_MAPS.component[`component/${framework}`];
|
|
57
|
-
if (!generator) {
|
|
58
|
-
throw PragmaError.invalidInput("framework", framework, {
|
|
59
|
-
validOptions: [...frameworks],
|
|
60
|
-
});
|
|
48
|
+
export function pickGenerator(commandPath: string): GeneratorDefinition {
|
|
49
|
+
for (const [kind, binding] of Object.entries(CREATE_GENERATORS)) {
|
|
50
|
+
if ((binding.paths as readonly string[]).includes(commandPath)) {
|
|
51
|
+
const generator = GENERATOR_MAPS[kind as CreateKind][commandPath];
|
|
52
|
+
if (generator) return generator;
|
|
53
|
+
break;
|
|
61
54
|
}
|
|
62
|
-
return generator;
|
|
63
|
-
}
|
|
64
|
-
const generator = GENERATOR_MAPS[kind][CREATE_GENERATORS[kind].key];
|
|
65
|
-
if (!generator) {
|
|
66
|
-
throw PragmaError.internalError(`missing ${kind} generator`);
|
|
67
55
|
}
|
|
68
|
-
|
|
56
|
+
throw PragmaError.internalError(`missing generator for ${commandPath}`);
|
|
69
57
|
}
|