@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
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shell detection + completion-script install paths
|
|
3
|
-
* shell's `setup/helpers/detectShell` + `completionScripts` path helpers).
|
|
2
|
+
* Shell detection + completion-script install paths.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Shell selection is detection-only, and detection means the shell the user is
|
|
5
|
+
* RUNNING — read from the process tree — not the login shell `$SHELL` records.
|
|
6
|
+
* The two differ constantly and the difference is invisible until TAB fails.
|
|
7
7
|
* `$HOME` is read at call time so tests can isolate it.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
+
import { execFileSync } from "node:child_process";
|
|
11
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
10
12
|
import { homedir } from "node:os";
|
|
11
13
|
import { join } from "node:path";
|
|
12
14
|
import { BIN_NAME } from "../../constants.js";
|
|
@@ -21,15 +23,139 @@ const SHELL_MAP: Record<string, ShellId> = {
|
|
|
21
23
|
};
|
|
22
24
|
|
|
23
25
|
/**
|
|
24
|
-
*
|
|
26
|
+
* What detection concluded about the shell the user is actually in.
|
|
25
27
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
+
* `ambiguous` is a first-class answer, not a failure to try harder. Installing
|
|
29
|
+
* for the wrong shell is INVISIBLE: the file is written, `doctor` goes green,
|
|
30
|
+
* and the user finds out when they press TAB months later and nothing happens.
|
|
31
|
+
* A named skip that says what was seen is worth more than a confident guess.
|
|
28
32
|
*/
|
|
29
|
-
export
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
export type ShellDetection =
|
|
34
|
+
| { readonly kind: "detected"; readonly shell: ShellId }
|
|
35
|
+
| {
|
|
36
|
+
readonly kind: "ambiguous";
|
|
37
|
+
/** What `$SHELL` claims, when it names a shell we support. */
|
|
38
|
+
readonly login: ShellId;
|
|
39
|
+
}
|
|
40
|
+
| { readonly kind: "unknown" };
|
|
41
|
+
|
|
42
|
+
/** One process in the ancestry: what it is called, and who started it. */
|
|
43
|
+
export interface ProcessEntry {
|
|
44
|
+
readonly name: string;
|
|
45
|
+
readonly ppid: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Look up one process. Injected in tests so the tree is deterministic. */
|
|
49
|
+
export type ProcessReader = (pid: number) => ProcessEntry | undefined;
|
|
50
|
+
|
|
51
|
+
/** How far up the process tree to look before giving up. */
|
|
52
|
+
const MAX_ANCESTRY = 8;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The command name and parent of a pid, read from `/proc` (Linux).
|
|
56
|
+
*
|
|
57
|
+
* `/proc/<pid>/stat` is `pid (comm) state ppid …`, and `comm` may itself
|
|
58
|
+
* contain spaces and parentheses — so the fields are taken after the LAST
|
|
59
|
+
* `)`, never by splitting the whole line.
|
|
60
|
+
*
|
|
61
|
+
* @param pid - The process to inspect.
|
|
62
|
+
* @returns Its command name and parent pid, or undefined when unreadable.
|
|
63
|
+
* @note Impure — reads /proc.
|
|
64
|
+
*/
|
|
65
|
+
function procEntry(pid: number): { name: string; ppid: number } | undefined {
|
|
66
|
+
try {
|
|
67
|
+
const stat = readFileSync(`/proc/${pid}/stat`, "utf8");
|
|
68
|
+
const close = stat.lastIndexOf(")");
|
|
69
|
+
const open = stat.indexOf("(");
|
|
70
|
+
if (close < 0 || open < 0) return undefined;
|
|
71
|
+
const name = stat.slice(open + 1, close);
|
|
72
|
+
const rest = stat.slice(close + 2).split(" ");
|
|
73
|
+
const ppid = Number.parseInt(rest[1] ?? "", 10);
|
|
74
|
+
return Number.isFinite(ppid) ? { name, ppid } : undefined;
|
|
75
|
+
} catch {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* The same lookup for platforms without `/proc`, via one `ps` call.
|
|
82
|
+
*
|
|
83
|
+
* @param pid - The process to inspect.
|
|
84
|
+
* @returns Its command name and parent pid, or undefined.
|
|
85
|
+
* @note Impure — spawns `ps`.
|
|
86
|
+
*/
|
|
87
|
+
function psEntry(pid: number): { name: string; ppid: number } | undefined {
|
|
88
|
+
try {
|
|
89
|
+
const out = execFileSync("ps", ["-o", "ppid=,comm=", "-p", String(pid)], {
|
|
90
|
+
encoding: "utf8",
|
|
91
|
+
timeout: 2000,
|
|
92
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
93
|
+
}).trim();
|
|
94
|
+
const match = /^(\d+)\s+(.*)$/.exec(out);
|
|
95
|
+
if (match === null) return undefined;
|
|
96
|
+
return { name: match[2] ?? "", ppid: Number.parseInt(match[1] ?? "", 10) };
|
|
97
|
+
} catch {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Normalize a process name to a shell id: `-zsh`, `/bin/bash`, `zsh` all map. */
|
|
103
|
+
function asShell(name: string): ShellId | undefined {
|
|
104
|
+
const base = (name.split("/").pop() ?? "").replace(/^-/, "");
|
|
105
|
+
return SHELL_MAP[base];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Walk the process ancestry looking for the shell this invocation is running
|
|
110
|
+
* inside.
|
|
111
|
+
*
|
|
112
|
+
* The walk matters: a CLI reached through `npm run`, `bunx`, or a wrapper
|
|
113
|
+
* script has `node` or `sh` as its immediate parent, and the user's actual
|
|
114
|
+
* shell is a level or two further up.
|
|
115
|
+
*
|
|
116
|
+
* @returns The shell found, or undefined.
|
|
117
|
+
* @note Impure — reads the process table.
|
|
118
|
+
*/
|
|
119
|
+
function runningShell(read?: ProcessReader): ShellId | undefined {
|
|
120
|
+
const entryOf = read ?? (existsSync("/proc") ? procEntry : psEntry);
|
|
121
|
+
let pid = process.ppid;
|
|
122
|
+
for (let step = 0; step < MAX_ANCESTRY && pid > 1; step += 1) {
|
|
123
|
+
const entry = entryOf(pid);
|
|
124
|
+
if (entry === undefined) return undefined;
|
|
125
|
+
const shell = asShell(entry.name);
|
|
126
|
+
if (shell !== undefined) return shell;
|
|
127
|
+
pid = entry.ppid;
|
|
128
|
+
}
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Detect the shell the user is actually running in.
|
|
134
|
+
*
|
|
135
|
+
* This reads the PROCESS TREE, not `$SHELL`. `$SHELL` is the login shell
|
|
136
|
+
* recorded in `/etc/passwd`; it is not changed by starting a different shell,
|
|
137
|
+
* so a user whose account says `bash` but who lives in `zsh` was silently
|
|
138
|
+
* given a bash script — and `doctor` then reported `✓ Shell completions: bash
|
|
139
|
+
* up to date and resolving`, a green check for a shell they never open, while
|
|
140
|
+
* the shell they do use had nothing.
|
|
141
|
+
*
|
|
142
|
+
* `$SHELL` survives only as a CONTRADICTION detector. When the process tree
|
|
143
|
+
* gives no answer (a CI runner, an editor task, a daemon), a `$SHELL` value is
|
|
144
|
+
* a guess about a session that may not exist, so the answer is `ambiguous` and
|
|
145
|
+
* the caller is expected to say so rather than pick.
|
|
146
|
+
*
|
|
147
|
+
* @param read - Injected process-table reader; defaults to the real one.
|
|
148
|
+
* @returns What could be established about the running shell.
|
|
149
|
+
* @note Impure — reads the process table and `$SHELL`.
|
|
150
|
+
*/
|
|
151
|
+
export function detectShell(read?: ProcessReader): ShellDetection {
|
|
152
|
+
const running = runningShell(read);
|
|
153
|
+
if (running !== undefined) return { kind: "detected", shell: running };
|
|
154
|
+
|
|
155
|
+
const login = SHELL_MAP[(process.env.SHELL ?? "").split("/").pop() ?? ""];
|
|
156
|
+
return login === undefined
|
|
157
|
+
? { kind: "unknown" }
|
|
158
|
+
: { kind: "ambiguous", login };
|
|
33
159
|
}
|
|
34
160
|
|
|
35
161
|
/**
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE target table — the one list `setup` and `doctor` both read.
|
|
3
|
+
*
|
|
4
|
+
* Five rows, each with a band column. This table drives the `setup <target>`
|
|
5
|
+
* sub-verbs, the wizard's choices, the `--dry-run` plan, the progress lines, the
|
|
6
|
+
* recap, the doctor rows, and each doctor row's `fix:` line. Adding a sixth
|
|
7
|
+
* target is one row here — not a new sub-verb, a new check, a new recap branch
|
|
8
|
+
* and a new fix string that four separate files have to agree about.
|
|
9
|
+
*
|
|
10
|
+
* A row owns: its identity (`id` is BOTH the sub-verb argument and the doctor
|
|
11
|
+
* row name, so `mcp` and `setup mcp` visibly share a token), which bands it can
|
|
12
|
+
* be installed into, how to DETECT its current state, how to PLAN a run from
|
|
13
|
+
* that detection, and how to COMPOSE the forward and removal effects. Detection
|
|
14
|
+
* runs once per invocation and feeds every reader, so setup and doctor cannot
|
|
15
|
+
* disagree about what they looked at.
|
|
16
|
+
*
|
|
17
|
+
* What a row does NOT own is diagnosis. `doctor/runChecks.ts` maps a row's
|
|
18
|
+
* detection onto a check result itself: the completions check needs helpers that
|
|
19
|
+
* live under `doctor/`, and importing them here would make the two directories
|
|
20
|
+
* import each other. The bijection is unaffected — doctor enumerates THIS table
|
|
21
|
+
* and derives every row name and `fix:` line from it.
|
|
22
|
+
*
|
|
23
|
+
* This module is reached only through the verb's lazy dynamic import (and
|
|
24
|
+
* doctor's), so nothing here lands on the `--help`/`__complete` fast path.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import type { Task } from "@canonical/task";
|
|
28
|
+
import { BIN_NAME } from "../../constants.js";
|
|
29
|
+
import type { PragmaRuntime } from "../../kernel/runtime/index.js";
|
|
30
|
+
import {
|
|
31
|
+
type CompletionsDetection,
|
|
32
|
+
composeCompletions,
|
|
33
|
+
composeCompletionsRemoval,
|
|
34
|
+
detectCompletions,
|
|
35
|
+
} from "./operations/setupCompletions.js";
|
|
36
|
+
import {
|
|
37
|
+
type ConfigDetection,
|
|
38
|
+
composeConfigFile,
|
|
39
|
+
composeConfigRemoval,
|
|
40
|
+
detectConfigFile,
|
|
41
|
+
} from "./operations/setupConfig.js";
|
|
42
|
+
import {
|
|
43
|
+
composeLsp,
|
|
44
|
+
composeLspRemoval,
|
|
45
|
+
detectLsp,
|
|
46
|
+
LSP_SKIP_REMEDY,
|
|
47
|
+
type LspDetection,
|
|
48
|
+
lspEditorNames,
|
|
49
|
+
lspSkipReason,
|
|
50
|
+
lspUninstallRemedy,
|
|
51
|
+
} from "./operations/setupLsp.js";
|
|
52
|
+
import {
|
|
53
|
+
composeMcp,
|
|
54
|
+
composeMcpRemoval,
|
|
55
|
+
detectMcp,
|
|
56
|
+
type McpDetection,
|
|
57
|
+
mcpGroupState,
|
|
58
|
+
ownedMcpGroups,
|
|
59
|
+
selectedGroups,
|
|
60
|
+
} from "./operations/setupMcp.js";
|
|
61
|
+
import {
|
|
62
|
+
composeSkills,
|
|
63
|
+
composeSkillsRemoval,
|
|
64
|
+
detectSkills,
|
|
65
|
+
ownedSkillLinks,
|
|
66
|
+
type SkillsDetection,
|
|
67
|
+
skillsSkipReason,
|
|
68
|
+
} from "./operations/setupSkills.js";
|
|
69
|
+
import {
|
|
70
|
+
type PlanAction,
|
|
71
|
+
type PlanChildRow,
|
|
72
|
+
type SetupPlan,
|
|
73
|
+
shortenPath,
|
|
74
|
+
type TargetId,
|
|
75
|
+
} from "./plan.js";
|
|
76
|
+
import type { ScopeBand } from "./types.js";
|
|
77
|
+
|
|
78
|
+
/** What a target contributes to one plan row, before selection is applied. */
|
|
79
|
+
export interface TargetDraft {
|
|
80
|
+
readonly action: PlanAction;
|
|
81
|
+
readonly detail: string;
|
|
82
|
+
/** REQUIRED when the action is `skip`. */
|
|
83
|
+
readonly reason?: string;
|
|
84
|
+
readonly children?: readonly PlanChildRow[];
|
|
85
|
+
/** An action that works on THIS machine NOW, or absent. */
|
|
86
|
+
readonly remedy?: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** The context a draft is rendered against — the plan's two named roots. */
|
|
90
|
+
export type Roots = SetupPlan["roots"];
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* One row of the table, generic over its own detection type. Every consumer
|
|
94
|
+
* treats the detection as opaque and hands it straight back to the same row,
|
|
95
|
+
* which is what lets five unrelated detections share one loop.
|
|
96
|
+
*/
|
|
97
|
+
export interface TargetDefinition<D> {
|
|
98
|
+
readonly id: TargetId;
|
|
99
|
+
/** Human title, used where a sentence needs one; the id is the row name. */
|
|
100
|
+
readonly title: string;
|
|
101
|
+
readonly bands: readonly ScopeBand[];
|
|
102
|
+
/** Real reads, up front, once per (target, band) per invocation. */
|
|
103
|
+
detect(rt: PragmaRuntime, band: ScopeBand): Promise<D>;
|
|
104
|
+
/** What a forward run would do. */
|
|
105
|
+
plan(detection: D, band: ScopeBand, roots: Roots): TargetDraft;
|
|
106
|
+
/** What a removal would do — composed from what detection says we own. */
|
|
107
|
+
removalPlan(detection: D, band: ScopeBand, roots: Roots): TargetDraft;
|
|
108
|
+
/**
|
|
109
|
+
* The forward effects. `chosen` is the row's per-child selection (MCP file
|
|
110
|
+
* paths); a row without children ignores it.
|
|
111
|
+
*/
|
|
112
|
+
compose(detection: D, chosen?: readonly string[]): Task<void>;
|
|
113
|
+
/** The removal effects: forward re-assertion carrying the reversal as `undo`. */
|
|
114
|
+
composeRemoval(detection: D): Task<void>;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** A table row with its detection type erased — how every consumer holds one. */
|
|
118
|
+
export type AnyTarget = TargetDefinition<never>;
|
|
119
|
+
|
|
120
|
+
/** Erase a row's detection type so the five rows can share one array. */
|
|
121
|
+
const defineTarget = <D>(target: TargetDefinition<D>): AnyTarget =>
|
|
122
|
+
target as unknown as AnyTarget;
|
|
123
|
+
|
|
124
|
+
// =============================================================================
|
|
125
|
+
// The rows
|
|
126
|
+
// =============================================================================
|
|
127
|
+
|
|
128
|
+
const configTarget = defineTarget<ConfigDetection>({
|
|
129
|
+
id: "config",
|
|
130
|
+
title: "Global configuration",
|
|
131
|
+
bands: ["global"],
|
|
132
|
+
detect: () => detectConfigFile(),
|
|
133
|
+
plan: (d, _band, roots) => {
|
|
134
|
+
const path = shortenPath(d.path, roots);
|
|
135
|
+
if (!d.exists) return { action: "install", detail: path };
|
|
136
|
+
return { action: "none", detail: `${path} — present` };
|
|
137
|
+
},
|
|
138
|
+
removalPlan: (d, _band, roots) => {
|
|
139
|
+
const path = shortenPath(d.path, roots);
|
|
140
|
+
if (!d.exists) return { action: "none", detail: `${path} — absent` };
|
|
141
|
+
if (!d.isSeed) {
|
|
142
|
+
return {
|
|
143
|
+
action: "skip",
|
|
144
|
+
detail: path,
|
|
145
|
+
reason: "kept — it holds your settings",
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return { action: "remove", detail: path };
|
|
149
|
+
},
|
|
150
|
+
compose: (d) => composeConfigFile(d),
|
|
151
|
+
composeRemoval: (d) => composeConfigRemoval(d),
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const completionsTarget = defineTarget<CompletionsDetection>({
|
|
155
|
+
id: "completions",
|
|
156
|
+
title: "Shell completions",
|
|
157
|
+
bands: ["global"],
|
|
158
|
+
detect: (rt) => detectCompletions(rt.cwd),
|
|
159
|
+
plan: (d, _band, roots) => {
|
|
160
|
+
// Never guess a shell. Installing for the wrong one is invisible until the
|
|
161
|
+
// user presses TAB and nothing happens, so an unresolved shell is a named
|
|
162
|
+
// skip whose remedy is the one action that DOES settle it.
|
|
163
|
+
if (d.detection.kind === "ambiguous") {
|
|
164
|
+
return {
|
|
165
|
+
action: "skip",
|
|
166
|
+
detail: "the running shell cannot be identified",
|
|
167
|
+
reason: `the running shell cannot be identified — SHELL names ${d.detection.login}, which is the login shell, not necessarily the one in use`,
|
|
168
|
+
remedy: `run \`${BIN_NAME} setup completions\` from the shell you want completions in`,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
if (d.detection.kind === "unknown" || d.shell === null || d.path === null) {
|
|
172
|
+
return {
|
|
173
|
+
action: "skip",
|
|
174
|
+
detail: "no supported shell detected",
|
|
175
|
+
reason: "no bash, zsh, or fish was found in this process tree",
|
|
176
|
+
remedy: `run \`${BIN_NAME} setup completions\` from bash, zsh, or fish`,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// The script spawns the binary for every name context. Installing one that
|
|
180
|
+
// cannot reach it writes a file that silently does nothing.
|
|
181
|
+
if (!d.binOnPath) {
|
|
182
|
+
return {
|
|
183
|
+
action: "skip",
|
|
184
|
+
detail: `${BIN_NAME} is not on PATH`,
|
|
185
|
+
reason: `the completion script runs \`${BIN_NAME}\`, which this shell cannot find on PATH`,
|
|
186
|
+
remedy: `put \`${BIN_NAME}\` on your PATH, then run this again`,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
const where = `${d.shell} → ${shortenPath(d.path, roots)}`;
|
|
190
|
+
if (d.state === "installed") return { action: "none", detail: where };
|
|
191
|
+
return {
|
|
192
|
+
action: d.state === "stale" ? "update" : "install",
|
|
193
|
+
detail: where,
|
|
194
|
+
};
|
|
195
|
+
},
|
|
196
|
+
removalPlan: (d, _band, roots) => {
|
|
197
|
+
if (d.path === null || d.state === "absent") {
|
|
198
|
+
return { action: "none", detail: "no script installed" };
|
|
199
|
+
}
|
|
200
|
+
return { action: "remove", detail: shortenPath(d.path, roots) };
|
|
201
|
+
},
|
|
202
|
+
compose: (d) => composeCompletions(d),
|
|
203
|
+
composeRemoval: (d) => composeCompletionsRemoval(d),
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
const lspTarget = defineTarget<LspDetection>({
|
|
207
|
+
id: "lsp",
|
|
208
|
+
title: "Terrazzo LSP extension",
|
|
209
|
+
bands: ["global"],
|
|
210
|
+
detect: (rt) => detectLsp(rt.cwd),
|
|
211
|
+
plan: (d) => {
|
|
212
|
+
if (d.state === "unknown") {
|
|
213
|
+
return {
|
|
214
|
+
action: "skip",
|
|
215
|
+
detail: lspSkipReason(d),
|
|
216
|
+
reason: lspSkipReason(d),
|
|
217
|
+
remedy: LSP_SKIP_REMEDY,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
// One child per detected editor, exactly like the mcp row's files: a
|
|
221
|
+
// machine with several VS Code forks on PATH should not have the extension
|
|
222
|
+
// pushed into all of them because they happen to be installed.
|
|
223
|
+
const children: PlanChildRow[] = d.editors.map((e) => ({
|
|
224
|
+
key: e.editor.cli,
|
|
225
|
+
label: `${e.editor.cli} — ${e.editor.name}`,
|
|
226
|
+
action: e.installed ? ("unchanged" as const) : ("add" as const),
|
|
227
|
+
}));
|
|
228
|
+
if (d.state === "installed") {
|
|
229
|
+
return {
|
|
230
|
+
action: "none",
|
|
231
|
+
detail: `installed (${lspEditorNames(d).join(", ")})`,
|
|
232
|
+
children,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
const pending = d.editors.filter((e) => !e.installed);
|
|
236
|
+
return {
|
|
237
|
+
action: "install",
|
|
238
|
+
detail: `${pending.length} ${pending.length === 1 ? "editor" : "editors"}`,
|
|
239
|
+
children,
|
|
240
|
+
};
|
|
241
|
+
},
|
|
242
|
+
removalPlan: (d) => ({
|
|
243
|
+
action: "skip",
|
|
244
|
+
detail: "not removed",
|
|
245
|
+
reason: "an extension install cannot be reversed from here",
|
|
246
|
+
remedy:
|
|
247
|
+
lspUninstallRemedy(d) ??
|
|
248
|
+
"no editor CLI is on PATH — uninstall it from your editor",
|
|
249
|
+
}),
|
|
250
|
+
compose: (d, chosen) => composeLsp(d, chosen),
|
|
251
|
+
composeRemoval: (d) => composeLspRemoval(d),
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
/** One MCP file as a plan child: its path, the harnesses sharing it, its state. */
|
|
255
|
+
const mcpChild = (
|
|
256
|
+
d: McpDetection,
|
|
257
|
+
group: McpDetection["groups"][number],
|
|
258
|
+
roots: Roots,
|
|
259
|
+
): PlanChildRow => {
|
|
260
|
+
const state = mcpGroupState(d, group.path);
|
|
261
|
+
return {
|
|
262
|
+
key: group.path,
|
|
263
|
+
label: shortenPath(group.path, roots),
|
|
264
|
+
action:
|
|
265
|
+
state === "configured"
|
|
266
|
+
? "unchanged"
|
|
267
|
+
: state === "drifted"
|
|
268
|
+
? "update"
|
|
269
|
+
: "add",
|
|
270
|
+
};
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
const mcpTarget = defineTarget<McpDetection>({
|
|
274
|
+
id: "mcp",
|
|
275
|
+
title: "MCP server registration",
|
|
276
|
+
bands: ["global", "project"],
|
|
277
|
+
detect: (rt, band) => detectMcp(rt, band),
|
|
278
|
+
plan: (d, band, roots) => {
|
|
279
|
+
if (d.groups.length === 0) {
|
|
280
|
+
return {
|
|
281
|
+
action: "skip",
|
|
282
|
+
detail: "no harness config location in this band",
|
|
283
|
+
reason:
|
|
284
|
+
band === "project"
|
|
285
|
+
? "no AI harness in this project writes a per-repository config"
|
|
286
|
+
: "no detected AI harness declares a user-level config location",
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
const children = d.groups.map((group) => mcpChild(d, group, roots));
|
|
290
|
+
const pending = children.filter((c) => c.action !== "unchanged");
|
|
291
|
+
return {
|
|
292
|
+
action: pending.length === 0 ? "none" : "update",
|
|
293
|
+
detail: `${d.groups.length} ${d.groups.length === 1 ? "file" : "files"}`,
|
|
294
|
+
children,
|
|
295
|
+
};
|
|
296
|
+
},
|
|
297
|
+
removalPlan: (d, _band, roots) => {
|
|
298
|
+
const owned = ownedMcpGroups(d);
|
|
299
|
+
if (owned.length === 0) {
|
|
300
|
+
return { action: "none", detail: "no entry to remove" };
|
|
301
|
+
}
|
|
302
|
+
return {
|
|
303
|
+
action: "remove",
|
|
304
|
+
detail: `${owned.length} ${owned.length === 1 ? "file" : "files"}`,
|
|
305
|
+
children: owned.map((group) => ({
|
|
306
|
+
key: group.path,
|
|
307
|
+
label: shortenPath(group.path, roots),
|
|
308
|
+
action: "update" as const,
|
|
309
|
+
})),
|
|
310
|
+
};
|
|
311
|
+
},
|
|
312
|
+
compose: (d, chosen) =>
|
|
313
|
+
composeMcp(d, chosen ? selectedGroups(d, chosen) : d.groups),
|
|
314
|
+
composeRemoval: (d) => composeMcpRemoval(d),
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
const skillsTarget = defineTarget<SkillsDetection>({
|
|
318
|
+
id: "skills",
|
|
319
|
+
title: "Skill symlinks",
|
|
320
|
+
bands: ["global", "project"],
|
|
321
|
+
detect: (rt, band) => detectSkills(rt, band),
|
|
322
|
+
plan: (d, band, roots) => {
|
|
323
|
+
if (!d.available) {
|
|
324
|
+
const reason = skillsSkipReason(shortenPath(d.sourceRoot, roots), band);
|
|
325
|
+
return { action: "skip", detail: reason, reason };
|
|
326
|
+
}
|
|
327
|
+
const dirs = d.targets.map((t) => shortenPath(t.dir, roots)).join(", ");
|
|
328
|
+
const where = `${d.skillCount} ${d.skillCount === 1 ? "skill" : "skills"} → ${d.targets.length} ${d.targets.length === 1 ? "dir" : "dirs"} (${dirs})`;
|
|
329
|
+
const pending = d.actions.filter((a) => a.action !== "skipped");
|
|
330
|
+
return { action: pending.length === 0 ? "none" : "link", detail: where };
|
|
331
|
+
},
|
|
332
|
+
removalPlan: (d, _band, roots) => {
|
|
333
|
+
const owned = ownedSkillLinks(d);
|
|
334
|
+
if (owned.length === 0) {
|
|
335
|
+
return { action: "none", detail: "no link to remove" };
|
|
336
|
+
}
|
|
337
|
+
const dirs = [...new Set(owned.map((a) => shortenPath(a.linkPath, roots)))];
|
|
338
|
+
return {
|
|
339
|
+
action: "remove",
|
|
340
|
+
detail: `${owned.length} ${owned.length === 1 ? "link" : "links"}`,
|
|
341
|
+
children: dirs.map((dir) => ({
|
|
342
|
+
key: dir,
|
|
343
|
+
label: dir,
|
|
344
|
+
action: "update" as const,
|
|
345
|
+
})),
|
|
346
|
+
};
|
|
347
|
+
},
|
|
348
|
+
compose: (d) => composeSkills(d),
|
|
349
|
+
composeRemoval: (d) => composeSkillsRemoval(d),
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
/** THE table, in display order. */
|
|
353
|
+
export const TARGETS: readonly AnyTarget[] = [
|
|
354
|
+
configTarget,
|
|
355
|
+
completionsTarget,
|
|
356
|
+
lspTarget,
|
|
357
|
+
mcpTarget,
|
|
358
|
+
skillsTarget,
|
|
359
|
+
];
|
|
360
|
+
|
|
361
|
+
/** Look a row up by id. */
|
|
362
|
+
export const findTarget = (id: string): AnyTarget | undefined =>
|
|
363
|
+
TARGETS.find((target) => target.id === id);
|
|
364
|
+
|
|
365
|
+
/** Whether a target can be installed into a band. */
|
|
366
|
+
export const supportsBand = (target: AnyTarget, band: ScopeBand): boolean =>
|
|
367
|
+
target.bands.includes(band);
|
|
@@ -2,14 +2,18 @@
|
|
|
2
2
|
* Data shapes for `pragma setup` and its sub-verbs.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import type { ShellId } from "./shell.js";
|
|
6
|
-
|
|
7
5
|
/**
|
|
8
6
|
* Which setup entry point is running: the run-all self-verb or one sub-verb.
|
|
9
7
|
* Lives here (a leaf type module) so `setup.verb.ts` can name it WITHOUT a
|
|
10
8
|
* static import of the generator ops — keeping them dynamic-only (lazy-React).
|
|
11
9
|
*/
|
|
12
|
-
export type SetupMode =
|
|
10
|
+
export type SetupMode =
|
|
11
|
+
| "all"
|
|
12
|
+
| "config"
|
|
13
|
+
| "completions"
|
|
14
|
+
| "lsp"
|
|
15
|
+
| "mcp"
|
|
16
|
+
| "skills";
|
|
13
17
|
|
|
14
18
|
/**
|
|
15
19
|
* One of the two config bands: the per-user/home `global` band or the per-repo
|
|
@@ -20,9 +24,11 @@ export type SetupMode = "all" | "completions" | "lsp" | "mcp" | "skills";
|
|
|
20
24
|
export type ScopeBand = "project" | "global";
|
|
21
25
|
|
|
22
26
|
/**
|
|
23
|
-
* The resolved `--scope` selection: which config band(s) a run touches.
|
|
24
|
-
*
|
|
25
|
-
*
|
|
27
|
+
* The resolved `--scope` selection: which config band(s) a run touches.
|
|
28
|
+
* `global` is the DEFAULT — the user/home band a machine-level installer
|
|
29
|
+
* configures; `project` is the opt-in per-repository band; `both` is the
|
|
30
|
+
* explicit "run each band in one invocation". Structurally mirrors the
|
|
31
|
+
* harnesses `ScopeSelection`.
|
|
26
32
|
*/
|
|
27
33
|
export type ScopeSelection = "project" | "global" | "both";
|
|
28
34
|
|
|
@@ -35,18 +41,6 @@ export type ScopeSelection = "project" | "global" | "both";
|
|
|
35
41
|
*/
|
|
36
42
|
export type McpTargetState = "absent" | "configured" | "drifted";
|
|
37
43
|
|
|
38
|
-
/**
|
|
39
|
-
* One configured MCP target in a result: the file that was written, which band
|
|
40
|
-
* it belongs to, the harness name(s) that share it, and its prior
|
|
41
|
-
* {@link McpTargetState} (so the recap can report new vs updated vs unchanged).
|
|
42
|
-
*/
|
|
43
|
-
export interface ConfiguredTarget {
|
|
44
|
-
readonly name: string;
|
|
45
|
-
readonly band: ScopeBand;
|
|
46
|
-
readonly path: string;
|
|
47
|
-
readonly state: McpTargetState;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
44
|
/**
|
|
51
45
|
* The prior on-disk state of the shell-completion script, read up front by
|
|
52
46
|
* `detectCompletions`: `absent` (no script), `installed` (a byte-identical
|
|
@@ -56,44 +50,11 @@ export interface ConfiguredTarget {
|
|
|
56
50
|
export type CompletionsState = "absent" | "installed" | "stale";
|
|
57
51
|
|
|
58
52
|
/**
|
|
59
|
-
* The detected state of the Terrazzo LSP
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
53
|
+
* The detected state of the Terrazzo LSP extension across the VS Code-family
|
|
54
|
+
* editors on this machine, probed up front by `detectLsp`: `installed` (every
|
|
55
|
+
* editor whose CLI is on PATH already has it — a re-run skips), `absent` (at
|
|
56
|
+
* least one detected editor is missing it, so the sideload runs for those), or
|
|
57
|
+
* `unknown` (NO editor CLI was found on PATH — the step is a named skip, since
|
|
58
|
+
* there is nothing to install into).
|
|
63
59
|
*/
|
|
64
60
|
export type LspState = "installed" | "absent" | "unknown";
|
|
65
|
-
|
|
66
|
-
/** One symlink create/skip/replace action performed during skill setup. */
|
|
67
|
-
export interface SymlinkAction {
|
|
68
|
-
readonly skillName: string;
|
|
69
|
-
readonly target: string;
|
|
70
|
-
readonly linkPath: string;
|
|
71
|
-
readonly action: "created" | "skipped" | "replaced";
|
|
72
|
-
readonly harnessName: string;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/** Aggregate result of `pragma setup skills`. */
|
|
76
|
-
export interface SetupSkillsResult {
|
|
77
|
-
readonly actions: readonly SymlinkAction[];
|
|
78
|
-
readonly harnessCount: number;
|
|
79
|
-
readonly skillCount: number;
|
|
80
|
-
readonly warnings: readonly string[];
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/** The result of one setup verb, tagged by which verb produced it. */
|
|
84
|
-
export type SetupResult =
|
|
85
|
-
| {
|
|
86
|
-
readonly kind: "completions";
|
|
87
|
-
readonly shell: ShellId | null;
|
|
88
|
-
readonly path: string | null;
|
|
89
|
-
readonly installed: boolean;
|
|
90
|
-
readonly state: CompletionsState;
|
|
91
|
-
}
|
|
92
|
-
| { readonly kind: "lsp"; readonly state: LspState }
|
|
93
|
-
| {
|
|
94
|
-
readonly kind: "mcp";
|
|
95
|
-
readonly configured: readonly string[];
|
|
96
|
-
readonly targets: readonly ConfiguredTarget[];
|
|
97
|
-
}
|
|
98
|
-
| { readonly kind: "skills"; readonly result: SetupSkillsResult }
|
|
99
|
-
| { readonly kind: "all"; readonly steps: readonly string[] };
|