@canonical/pragma-cli 0.33.0 → 0.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +153 -30
- package/dist/.build-ok +0 -0
- package/dist/package.json +83 -0
- package/dist/pragma.conf.js +814 -0
- package/dist/pragma.conf.js.map +1 -0
- package/dist/src/bin.js +356 -0
- package/dist/src/bin.js.map +1 -0
- package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
- package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
- package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
- package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
- package/dist/src/capabilities/capabilities/catalog.js +130 -0
- package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
- package/dist/src/capabilities/capabilities/hints.js +195 -0
- package/dist/src/capabilities/capabilities/hints.js.map +1 -0
- package/dist/src/capabilities/capabilities/index.js +11 -0
- package/dist/src/capabilities/capabilities/index.js.map +1 -0
- package/dist/src/capabilities/capabilities/types.js +11 -0
- package/dist/src/capabilities/capabilities/types.js.map +1 -0
- package/dist/src/capabilities/colophon/collectColophon.js +83 -0
- package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
- package/dist/src/capabilities/colophon/colophon.render.js +59 -0
- package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
- package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
- package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
- package/dist/src/capabilities/colophon/index.js +5 -0
- package/dist/src/capabilities/colophon/index.js.map +1 -0
- package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
- package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
- package/dist/src/capabilities/colophon/types.js +10 -0
- package/dist/src/capabilities/colophon/types.js.map +1 -0
- package/dist/src/capabilities/config/collectConfigShow.js +59 -0
- package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
- package/dist/src/capabilities/config/field.render.js +22 -0
- package/dist/src/capabilities/config/field.render.js.map +1 -0
- package/dist/src/capabilities/config/fields.js +46 -0
- package/dist/src/capabilities/config/fields.js.map +1 -0
- package/dist/src/capabilities/config/get.verb.js +61 -0
- package/dist/src/capabilities/config/get.verb.js.map +1 -0
- package/dist/src/capabilities/config/index.js +5 -0
- package/dist/src/capabilities/config/index.js.map +1 -0
- package/dist/src/capabilities/config/runField.js +59 -0
- package/dist/src/capabilities/config/runField.js.map +1 -0
- package/dist/src/capabilities/config/runGet.js +28 -0
- package/dist/src/capabilities/config/runGet.js.map +1 -0
- package/dist/src/capabilities/config/runSet.js +53 -0
- package/dist/src/capabilities/config/runSet.js.map +1 -0
- package/dist/src/capabilities/config/set.verb.js +66 -0
- package/dist/src/capabilities/config/set.verb.js.map +1 -0
- package/dist/src/capabilities/config/show.render.js +84 -0
- package/dist/src/capabilities/config/show.render.js.map +1 -0
- package/dist/src/capabilities/config/show.verb.js +44 -0
- package/dist/src/capabilities/config/show.verb.js.map +1 -0
- package/dist/src/capabilities/config/types.js +5 -0
- package/dist/src/capabilities/config/types.js.map +1 -0
- package/dist/src/capabilities/config/unset.verb.js +49 -0
- package/dist/src/capabilities/config/unset.verb.js.map +1 -0
- package/dist/src/capabilities/create/cliProjection.js +195 -0
- package/dist/src/capabilities/create/cliProjection.js.map +1 -0
- package/dist/src/capabilities/create/constants.js +47 -0
- package/dist/src/capabilities/create/constants.js.map +1 -0
- package/dist/src/capabilities/create/create.render.js +100 -0
- package/dist/src/capabilities/create/create.render.js.map +1 -0
- package/dist/src/capabilities/create/create.verb.js +438 -0
- package/dist/src/capabilities/create/create.verb.js.map +1 -0
- package/dist/src/capabilities/create/createHelp.js +47 -0
- package/dist/src/capabilities/create/createHelp.js.map +1 -0
- package/dist/src/capabilities/create/createSurface.generated.js +394 -0
- package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
- package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
- package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
- package/dist/src/capabilities/create/index.js +18 -0
- package/dist/src/capabilities/create/index.js.map +1 -0
- package/dist/src/capabilities/create/messages.js +16 -0
- package/dist/src/capabilities/create/messages.js.map +1 -0
- package/dist/src/capabilities/create/mount.js +293 -0
- package/dist/src/capabilities/create/mount.js.map +1 -0
- package/dist/src/capabilities/create/pathJail.js +65 -0
- package/dist/src/capabilities/create/pathJail.js.map +1 -0
- package/dist/src/capabilities/create/pickGenerator.js +53 -0
- package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
- package/dist/src/capabilities/create/types.js +2 -0
- package/dist/src/capabilities/create/types.js.map +1 -0
- package/dist/src/capabilities/distribution.js +40 -0
- package/dist/src/capabilities/distribution.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
- package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
- package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +92 -0
- package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
- package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
- package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/index.js +27 -0
- package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
- package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/targetHealth.js +205 -0
- package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.render.js +185 -0
- package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.verb.js +45 -0
- package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
- package/dist/src/capabilities/doctor/index.js +5 -0
- package/dist/src/capabilities/doctor/index.js.map +1 -0
- package/dist/src/capabilities/doctor/runChecks.js +83 -0
- package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
- package/dist/src/capabilities/doctor/types.js +5 -0
- package/dist/src/capabilities/doctor/types.js.map +1 -0
- package/dist/src/capabilities/graph/index.js +19 -0
- package/dist/src/capabilities/graph/index.js.map +1 -0
- package/dist/src/capabilities/graph/inspect.render.js +76 -0
- package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
- package/dist/src/capabilities/graph/inspect.verb.js +53 -0
- package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
- package/dist/src/capabilities/graph/query.render.js +73 -0
- package/dist/src/capabilities/graph/query.render.js.map +1 -0
- package/dist/src/capabilities/graph/query.verb.js +49 -0
- package/dist/src/capabilities/graph/query.verb.js.map +1 -0
- package/dist/src/capabilities/graph/runQuery.js +41 -0
- package/dist/src/capabilities/graph/runQuery.js.map +1 -0
- package/dist/src/capabilities/index.js +56 -0
- package/dist/src/capabilities/index.js.map +1 -0
- package/dist/src/capabilities/info/collectInfo.js +66 -0
- package/dist/src/capabilities/info/collectInfo.js.map +1 -0
- package/dist/src/capabilities/info/index.js +5 -0
- package/dist/src/capabilities/info/index.js.map +1 -0
- package/dist/src/capabilities/info/info.render.js +53 -0
- package/dist/src/capabilities/info/info.render.js.map +1 -0
- package/dist/src/capabilities/info/info.verb.js +42 -0
- package/dist/src/capabilities/info/info.verb.js.map +1 -0
- package/dist/src/capabilities/info/types.js +5 -0
- package/dist/src/capabilities/info/types.js.map +1 -0
- package/dist/src/capabilities/meta/complete.verb.js +43 -0
- package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
- package/dist/src/capabilities/meta/index.js +13 -0
- package/dist/src/capabilities/meta/index.js.map +1 -0
- package/dist/src/capabilities/meta/mcp.verb.js +34 -0
- package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
- package/dist/src/capabilities/ontology/index.js +21 -0
- package/dist/src/capabilities/ontology/index.js.map +1 -0
- package/dist/src/capabilities/ontology/queries.js +123 -0
- package/dist/src/capabilities/ontology/queries.js.map +1 -0
- package/dist/src/capabilities/ontology/render.js +66 -0
- package/dist/src/capabilities/ontology/render.js.map +1 -0
- package/dist/src/capabilities/ontology/verbs.js +181 -0
- package/dist/src/capabilities/ontology/verbs.js.map +1 -0
- package/dist/src/capabilities/prompt/index.js +16 -0
- package/dist/src/capabilities/prompt/index.js.map +1 -0
- package/dist/src/capabilities/prompt/prompt.render.js +78 -0
- package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
- package/dist/src/capabilities/prompt/types.js +10 -0
- package/dist/src/capabilities/prompt/types.js.map +1 -0
- package/dist/src/capabilities/prompt/verbs.js +93 -0
- package/dist/src/capabilities/prompt/verbs.js.map +1 -0
- package/dist/src/capabilities/resources/index.js +10 -0
- package/dist/src/capabilities/resources/index.js.map +1 -0
- package/dist/src/capabilities/resources/provider.js +423 -0
- package/dist/src/capabilities/resources/provider.js.map +1 -0
- package/dist/src/capabilities/setup/buildPlan.js +168 -0
- package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
- package/dist/src/capabilities/setup/index.js +5 -0
- package/dist/src/capabilities/setup/index.js.map +1 -0
- package/dist/src/capabilities/setup/mode.js +53 -0
- package/dist/src/capabilities/setup/mode.js.map +1 -0
- package/dist/src/capabilities/setup/operations/index.js +39 -0
- package/dist/src/capabilities/setup/operations/index.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
- package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
- package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupGenerator.js +343 -0
- package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js +277 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js +207 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupSkills.js +316 -0
- package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
- package/dist/src/capabilities/setup/plan.js +128 -0
- package/dist/src/capabilities/setup/plan.js.map +1 -0
- package/dist/src/capabilities/setup/plan.render.js +193 -0
- package/dist/src/capabilities/setup/plan.render.js.map +1 -0
- package/dist/src/capabilities/setup/setup.render.js +54 -0
- package/dist/src/capabilities/setup/setup.render.js.map +1 -0
- package/dist/src/capabilities/setup/setup.verb.js +334 -0
- package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
- package/dist/src/capabilities/setup/shell.js +196 -0
- package/dist/src/capabilities/setup/shell.js.map +1 -0
- package/dist/src/capabilities/setup/targets.js +263 -0
- package/dist/src/capabilities/setup/targets.js.map +1 -0
- package/dist/src/capabilities/setup/types.js +5 -0
- package/dist/src/capabilities/setup/types.js.map +1 -0
- package/dist/src/capabilities/shared/assertExecOk.js +137 -0
- package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
- package/dist/src/capabilities/shared/bands.js +16 -0
- package/dist/src/capabilities/shared/bands.js.map +1 -0
- package/dist/src/capabilities/shared/index.js +26 -0
- package/dist/src/capabilities/shared/index.js.map +1 -0
- package/dist/src/capabilities/shared/packageManager.js +103 -0
- package/dist/src/capabilities/shared/packageManager.js.map +1 -0
- package/dist/src/capabilities/shared/registry.js +55 -0
- package/dist/src/capabilities/shared/registry.js.map +1 -0
- package/dist/src/capabilities/skill/discover.js +195 -0
- package/dist/src/capabilities/skill/discover.js.map +1 -0
- package/dist/src/capabilities/skill/index.js +10 -0
- package/dist/src/capabilities/skill/index.js.map +1 -0
- package/dist/src/capabilities/skill/render.js +49 -0
- package/dist/src/capabilities/skill/render.js.map +1 -0
- package/dist/src/capabilities/skill/verbs.js +83 -0
- package/dist/src/capabilities/skill/verbs.js.map +1 -0
- package/dist/src/capabilities/sources/collectStatus.js +103 -0
- package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
- package/dist/src/capabilities/sources/index.js +13 -0
- package/dist/src/capabilities/sources/index.js.map +1 -0
- package/dist/src/capabilities/sources/installSkills.js +167 -0
- package/dist/src/capabilities/sources/installSkills.js.map +1 -0
- package/dist/src/capabilities/sources/runUpdate.js +394 -0
- package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
- package/dist/src/capabilities/sources/status.render.js +64 -0
- package/dist/src/capabilities/sources/status.render.js.map +1 -0
- package/dist/src/capabilities/sources/status.verb.js +40 -0
- package/dist/src/capabilities/sources/status.verb.js.map +1 -0
- package/dist/src/capabilities/sources/types.js +6 -0
- package/dist/src/capabilities/sources/types.js.map +1 -0
- package/dist/src/capabilities/sources/update.render.js +34 -0
- package/dist/src/capabilities/sources/update.render.js.map +1 -0
- package/dist/src/capabilities/sources/update.verb.js +55 -0
- package/dist/src/capabilities/sources/update.verb.js.map +1 -0
- package/dist/src/capabilities/upgrade/index.js +5 -0
- package/dist/src/capabilities/upgrade/index.js.map +1 -0
- package/dist/src/capabilities/upgrade/runUpgrade.js +99 -0
- package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
- package/dist/src/capabilities/upgrade/types.js +5 -0
- package/dist/src/capabilities/upgrade/types.js.map +1 -0
- package/dist/src/capabilities/upgrade/upgrade.render.js +44 -0
- package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
- package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
- package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
- package/dist/src/capabilities/version/index.js +10 -0
- package/dist/src/capabilities/version/index.js.map +1 -0
- package/dist/src/capabilities/version/version.verb.js +36 -0
- package/dist/src/capabilities/version/version.verb.js.map +1 -0
- package/dist/src/constants.js +82 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/index.js +12 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/kernel/completion/complete.js +66 -0
- package/dist/src/kernel/completion/complete.js.map +1 -0
- package/dist/src/kernel/completion/emitScripts.js +92 -0
- package/dist/src/kernel/completion/emitScripts.js.map +1 -0
- package/dist/src/kernel/completion/entitySource.js +285 -0
- package/dist/src/kernel/completion/entitySource.js.map +1 -0
- package/dist/src/kernel/completion/index.js +14 -0
- package/dist/src/kernel/completion/index.js.map +1 -0
- package/dist/src/kernel/completion/model.js +301 -0
- package/dist/src/kernel/completion/model.js.map +1 -0
- package/dist/src/kernel/completion/parse.js +253 -0
- package/dist/src/kernel/completion/parse.js.map +1 -0
- package/dist/src/kernel/completion/rank.js +101 -0
- package/dist/src/kernel/completion/rank.js.map +1 -0
- package/dist/src/kernel/completion/resolve.js +100 -0
- package/dist/src/kernel/completion/resolve.js.map +1 -0
- package/dist/src/kernel/completion/templates/bash.js +209 -0
- package/dist/src/kernel/completion/templates/bash.js.map +1 -0
- package/dist/src/kernel/completion/templates/fish.js +214 -0
- package/dist/src/kernel/completion/templates/fish.js.map +1 -0
- package/dist/src/kernel/completion/templates/index.js +23 -0
- package/dist/src/kernel/completion/templates/index.js.map +1 -0
- package/dist/src/kernel/completion/templates/shared.js +98 -0
- package/dist/src/kernel/completion/templates/shared.js.map +1 -0
- package/dist/src/kernel/completion/templates/zsh.js +201 -0
- package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
- package/dist/src/kernel/completion/types.js +13 -0
- package/dist/src/kernel/completion/types.js.map +1 -0
- package/dist/src/kernel/config/defaults.js +17 -0
- package/dist/src/kernel/config/defaults.js.map +1 -0
- package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
- package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
- package/dist/src/kernel/config/findProjectConfig.js +43 -0
- package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
- package/dist/src/kernel/config/firstRun.js +34 -0
- package/dist/src/kernel/config/firstRun.js.map +1 -0
- package/dist/src/kernel/config/globalConfig.js +79 -0
- package/dist/src/kernel/config/globalConfig.js.map +1 -0
- package/dist/src/kernel/config/index.js +16 -0
- package/dist/src/kernel/config/index.js.map +1 -0
- package/dist/src/kernel/config/paths.js +35 -0
- package/dist/src/kernel/config/paths.js.map +1 -0
- package/dist/src/kernel/config/readConfig.js +78 -0
- package/dist/src/kernel/config/readConfig.js.map +1 -0
- package/dist/src/kernel/config/schema.js +130 -0
- package/dist/src/kernel/config/schema.js.map +1 -0
- package/dist/src/kernel/config/types.js +19 -0
- package/dist/src/kernel/config/types.js.map +1 -0
- package/dist/src/kernel/config/writeConfigField.js +59 -0
- package/dist/src/kernel/config/writeConfigField.js.map +1 -0
- package/dist/src/kernel/copy.js +43 -0
- package/dist/src/kernel/copy.js.map +1 -0
- package/dist/src/kernel/error/PragmaError.js +149 -0
- package/dist/src/kernel/error/PragmaError.js.map +1 -0
- package/dist/src/kernel/error/constants.js +40 -0
- package/dist/src/kernel/error/constants.js.map +1 -0
- package/dist/src/kernel/error/fromTaskError.js +96 -0
- package/dist/src/kernel/error/fromTaskError.js.map +1 -0
- package/dist/src/kernel/error/index.js +13 -0
- package/dist/src/kernel/error/index.js.map +1 -0
- package/dist/src/kernel/error/recovery.js +52 -0
- package/dist/src/kernel/error/recovery.js.map +1 -0
- package/dist/src/kernel/error/renderError.js +115 -0
- package/dist/src/kernel/error/renderError.js.map +1 -0
- package/dist/src/kernel/error/serialize.js +25 -0
- package/dist/src/kernel/error/serialize.js.map +1 -0
- package/dist/src/kernel/error/types.js +9 -0
- package/dist/src/kernel/error/types.js.map +1 -0
- package/dist/src/kernel/index.js +25 -0
- package/dist/src/kernel/index.js.map +1 -0
- package/dist/src/kernel/packs/collect.js +187 -0
- package/dist/src/kernel/packs/collect.js.map +1 -0
- package/dist/src/kernel/packs/compile.js +304 -0
- package/dist/src/kernel/packs/compile.js.map +1 -0
- package/dist/src/kernel/packs/disclosure.js +76 -0
- package/dist/src/kernel/packs/disclosure.js.map +1 -0
- package/dist/src/kernel/packs/glob.js +38 -0
- package/dist/src/kernel/packs/glob.js.map +1 -0
- package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
- package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
- package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
- package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
- package/dist/src/kernel/packs/graphql/index.js +20 -0
- package/dist/src/kernel/packs/graphql/index.js.map +1 -0
- package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
- package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
- package/dist/src/kernel/packs/index.js +34 -0
- package/dist/src/kernel/packs/index.js.map +1 -0
- package/dist/src/kernel/packs/iri.js +110 -0
- package/dist/src/kernel/packs/iri.js.map +1 -0
- package/dist/src/kernel/packs/renderPack.js +129 -0
- package/dist/src/kernel/packs/renderPack.js.map +1 -0
- package/dist/src/kernel/packs/resolveEntity.js +223 -0
- package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
- package/dist/src/kernel/packs/runBodies.js +87 -0
- package/dist/src/kernel/packs/runBodies.js.map +1 -0
- package/dist/src/kernel/packs/sample.js +56 -0
- package/dist/src/kernel/packs/sample.js.map +1 -0
- package/dist/src/kernel/packs/schema.js +369 -0
- package/dist/src/kernel/packs/schema.js.map +1 -0
- package/dist/src/kernel/packs/sparql/applyFilters.js +68 -0
- package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
- package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
- package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
- package/dist/src/kernel/packs/sparql/buildLookupQuery.js +217 -0
- package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
- package/dist/src/kernel/packs/sparql/escape.js +21 -0
- package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
- package/dist/src/kernel/packs/sparql/index.js +31 -0
- package/dist/src/kernel/packs/sparql/index.js.map +1 -0
- package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
- package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
- package/dist/src/kernel/packs/types.js +30 -0
- package/dist/src/kernel/packs/types.js.map +1 -0
- package/dist/src/kernel/packs/uniqueness.js +30 -0
- package/dist/src/kernel/packs/uniqueness.js.map +1 -0
- package/dist/src/kernel/project/cli/buildProgram.js +263 -0
- package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
- package/dist/src/kernel/project/cli/constants.js +27 -0
- package/dist/src/kernel/project/cli/constants.js.map +1 -0
- package/dist/src/kernel/project/cli/dispatch.js +420 -0
- package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
- package/dist/src/kernel/project/cli/exitCodes.js +66 -0
- package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
- package/dist/src/kernel/project/cli/globalFlags.js +216 -0
- package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
- package/dist/src/kernel/project/cli/helpFormat.js +59 -0
- package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
- package/dist/src/kernel/project/cli/index.js +14 -0
- package/dist/src/kernel/project/cli/index.js.map +1 -0
- package/dist/src/kernel/project/cli/rootHelp.js +197 -0
- package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
- package/dist/src/kernel/project/cli/suggest.js +75 -0
- package/dist/src/kernel/project/cli/suggest.js.map +1 -0
- package/dist/src/kernel/project/cli/suggestNames.js +96 -0
- package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
- package/dist/src/kernel/project/cli/verbHelp.js +131 -0
- package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
- package/dist/src/kernel/project/mcp/buildServer.js +67 -0
- package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
- package/dist/src/kernel/project/mcp/envelope.js +37 -0
- package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
- package/dist/src/kernel/project/mcp/index.js +8 -0
- package/dist/src/kernel/project/mcp/index.js.map +1 -0
- package/dist/src/kernel/project/mcp/instructions.js +44 -0
- package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
- package/dist/src/kernel/project/mcp/mcpError.js +42 -0
- package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
- package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
- package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
- package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
- package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
- package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
- package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
- package/dist/src/kernel/project/mcp/registerVerb.js +300 -0
- package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
- package/dist/src/kernel/project/mcp/serve.js +35 -0
- package/dist/src/kernel/project/mcp/serve.js.map +1 -0
- package/dist/src/kernel/render/compactUri.js +24 -0
- package/dist/src/kernel/render/compactUri.js.map +1 -0
- package/dist/src/kernel/render/contracts.js +10 -0
- package/dist/src/kernel/render/contracts.js.map +1 -0
- package/dist/src/kernel/render/disclosure.js +34 -0
- package/dist/src/kernel/render/disclosure.js.map +1 -0
- package/dist/src/kernel/render/envelope.js +30 -0
- package/dist/src/kernel/render/envelope.js.map +1 -0
- package/dist/src/kernel/render/formatters.js +27 -0
- package/dist/src/kernel/render/formatters.js.map +1 -0
- package/dist/src/kernel/render/index.js +15 -0
- package/dist/src/kernel/render/index.js.map +1 -0
- package/dist/src/kernel/render/prefixes.js +46 -0
- package/dist/src/kernel/render/prefixes.js.map +1 -0
- package/dist/src/kernel/render/renderers.js +468 -0
- package/dist/src/kernel/render/renderers.js.map +1 -0
- package/dist/src/kernel/render/style.js +85 -0
- package/dist/src/kernel/render/style.js.map +1 -0
- package/dist/src/kernel/render/turtle.js +194 -0
- package/dist/src/kernel/render/turtle.js.map +1 -0
- package/dist/src/kernel/render/writeStdout.js +43 -0
- package/dist/src/kernel/render/writeStdout.js.map +1 -0
- package/dist/src/kernel/runtime/boot.js +49 -0
- package/dist/src/kernel/runtime/boot.js.map +1 -0
- package/dist/src/kernel/runtime/facade.js +39 -0
- package/dist/src/kernel/runtime/facade.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/build.js +122 -0
- package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
- package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
- package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
- package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/index.js +11 -0
- package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
- package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/read.js +92 -0
- package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
- package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
- package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/types.js +55 -0
- package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
- package/dist/src/kernel/runtime/index.js +8 -0
- package/dist/src/kernel/runtime/index.js.map +1 -0
- package/dist/src/kernel/runtime/loadSession.js +34 -0
- package/dist/src/kernel/runtime/loadSession.js.map +1 -0
- package/dist/src/kernel/runtime/paths.js +78 -0
- package/dist/src/kernel/runtime/paths.js.map +1 -0
- package/dist/src/kernel/runtime/probe.js +37 -0
- package/dist/src/kernel/runtime/probe.js.map +1 -0
- package/dist/src/kernel/runtime/readEntity.js +363 -0
- package/dist/src/kernel/runtime/readEntity.js.map +1 -0
- package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
- package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
- package/dist/src/kernel/runtime/refs/index.js +29 -0
- package/dist/src/kernel/runtime/refs/index.js.map +1 -0
- package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
- package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
- package/dist/src/kernel/runtime/refs/resolve.js +332 -0
- package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
- package/dist/src/kernel/runtime/resolveSources.js +62 -0
- package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
- package/dist/src/kernel/runtime/store.js +75 -0
- package/dist/src/kernel/runtime/store.js.map +1 -0
- package/dist/src/kernel/runtime/storeReadiness.js +51 -0
- package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
- package/dist/src/kernel/runtime/types.js +11 -0
- package/dist/src/kernel/runtime/types.js.map +1 -0
- package/dist/src/kernel/spec/asVerb.js +21 -0
- package/dist/src/kernel/spec/asVerb.js.map +1 -0
- package/dist/src/kernel/spec/emitReference.js +578 -0
- package/dist/src/kernel/spec/emitReference.js.map +1 -0
- package/dist/src/kernel/spec/emitSurface.js +202 -0
- package/dist/src/kernel/spec/emitSurface.js.map +1 -0
- package/dist/src/kernel/spec/index.js +11 -0
- package/dist/src/kernel/spec/index.js.map +1 -0
- package/dist/src/kernel/spec/surfaceConformance.js +103 -0
- package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
- package/dist/src/kernel/spec/types.js +14 -0
- package/dist/src/kernel/spec/types.js.map +1 -0
- package/dist/src/kernel/spec/validate.js +110 -0
- package/dist/src/kernel/spec/validate.js.map +1 -0
- package/dist/src/kernel/vocabulary.js +97 -0
- package/dist/src/kernel/vocabulary.js.map +1 -0
- package/dist/src/types.js +11 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +25 -24
- package/pragma.conf.ts +853 -0
- package/src/bin.ts +276 -82
- package/src/capabilities/block.parity.test.ts +253 -0
- package/src/capabilities/capabilities/capabilities.render.ts +4 -3
- package/src/capabilities/capabilities/capabilities.verb.ts +32 -14
- package/src/capabilities/capabilities/catalog.ts +20 -12
- package/src/capabilities/capabilities/hints.ts +43 -24
- package/src/capabilities/capabilities/index.ts +1 -1
- package/src/capabilities/colophon/collectColophon.ts +50 -24
- package/src/capabilities/colophon/colophon.render.ts +25 -1
- package/src/capabilities/colophon/colophon.test.ts +42 -21
- package/src/capabilities/colophon/colophon.verb.ts +9 -5
- package/src/capabilities/colophon/types.ts +16 -7
- package/src/capabilities/config/collectConfigShow.test.ts +58 -0
- package/src/capabilities/config/collectConfigShow.ts +43 -6
- package/src/capabilities/config/field.render.ts +4 -5
- package/src/capabilities/config/fields.ts +17 -37
- package/src/capabilities/config/get.verb.ts +70 -0
- package/src/capabilities/config/getUnset.test.ts +264 -0
- package/src/capabilities/config/index.ts +5 -1
- package/src/capabilities/config/runField.ts +40 -22
- package/src/capabilities/config/runGet.ts +34 -0
- package/src/capabilities/config/runSet.ts +35 -9
- package/src/capabilities/config/set.test.ts +48 -14
- package/src/capabilities/config/set.verb.ts +14 -9
- package/src/capabilities/config/show.render.test.ts +77 -5
- package/src/capabilities/config/show.render.ts +8 -13
- package/src/capabilities/config/show.verb.ts +13 -9
- package/src/capabilities/config/types.ts +26 -4
- package/src/capabilities/config/unset.verb.ts +58 -0
- package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
- package/src/capabilities/create/byteEquality.test.ts +95 -103
- package/src/capabilities/create/cliProjection.ts +227 -0
- package/src/capabilities/create/constants.ts +50 -0
- package/src/capabilities/create/create.mcp.test.ts +91 -7
- package/src/capabilities/create/create.render.ts +71 -7
- package/src/capabilities/create/create.test.ts +523 -162
- package/src/capabilities/create/create.verb.ts +361 -321
- package/src/capabilities/create/createGrammar.test.ts +865 -0
- package/src/capabilities/create/createHelp.ts +71 -0
- package/src/capabilities/create/createSurface.generated.ts +400 -0
- package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
- package/src/capabilities/create/cwdJail.test.ts +24 -5
- package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
- package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
- package/src/capabilities/create/index.ts +9 -14
- package/src/capabilities/create/messages.ts +18 -0
- package/src/capabilities/create/mount.ts +391 -0
- package/src/capabilities/create/pathJail.test.ts +90 -0
- package/src/capabilities/create/pathJail.ts +8 -5
- package/src/capabilities/create/pickGenerator.ts +40 -46
- package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
- package/src/capabilities/create/types.ts +29 -5
- package/src/capabilities/{standard/parity.test.ts → distribution.parity.test.ts} +24 -14
- package/src/capabilities/distribution.test.ts +122 -0
- package/src/capabilities/distribution.ts +54 -0
- package/src/capabilities/doctor/checks/checkKeStore.ts +9 -7
- package/src/capabilities/doctor/checks/checkPackageRefs.ts +82 -46
- package/src/capabilities/doctor/checks/checkPragmaVersion.ts +5 -4
- package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +125 -30
- package/src/capabilities/doctor/checks/checkShellCompletions.ts +113 -27
- package/src/capabilities/doctor/checks/index.ts +27 -0
- package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
- package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
- package/src/capabilities/doctor/checks/targetHealth.ts +274 -0
- package/src/capabilities/doctor/doctor.render.test.ts +24 -13
- package/src/capabilities/doctor/doctor.render.ts +45 -20
- package/src/capabilities/doctor/doctor.test.ts +158 -40
- package/src/capabilities/doctor/doctor.verb.ts +9 -5
- package/src/capabilities/doctor/runChecks.ts +65 -66
- package/src/capabilities/doctor/types.ts +21 -5
- package/src/capabilities/emptyRecovery.test.ts +44 -22
- package/src/capabilities/graph/examples.exec.test.ts +107 -0
- package/src/capabilities/graph/index.ts +1 -1
- package/src/capabilities/graph/inspect.render.ts +70 -22
- package/src/capabilities/graph/inspect.test.ts +260 -5
- package/src/capabilities/graph/inspect.verb.ts +18 -5
- package/src/capabilities/graph/query.render.ts +15 -3
- package/src/capabilities/graph/query.verb.ts +5 -4
- package/src/capabilities/graph/runQuery.ts +9 -7
- package/src/capabilities/index.ts +25 -19
- package/src/capabilities/info/collectInfo.ts +15 -10
- package/src/capabilities/info/info.render.ts +4 -3
- package/src/capabilities/info/info.verb.ts +4 -3
- package/src/capabilities/lazy.test.ts +125 -2
- package/src/capabilities/meta/complete.verb.ts +1 -1
- package/src/capabilities/meta/index.ts +1 -1
- package/src/capabilities/meta/mcp.verb.ts +10 -8
- package/src/capabilities/ontology/index.ts +15 -11
- package/src/capabilities/ontology/ontology.test.ts +6 -55
- package/src/capabilities/ontology/queries.ts +2 -2
- package/src/capabilities/ontology/render.ts +3 -4
- package/src/capabilities/ontology/verbs.ts +42 -83
- package/src/capabilities/prompt/index.ts +2 -2
- package/src/capabilities/prompt/prompt.render.ts +6 -2
- package/src/capabilities/prompt/prompt.test.ts +12 -6
- package/src/capabilities/prompt/types.ts +1 -1
- package/src/capabilities/prompt/verbs.ts +26 -14
- package/src/capabilities/reference.test.ts +63 -0
- package/src/capabilities/resources/provider.ts +367 -91
- package/src/capabilities/resources/resources.test.ts +411 -59
- package/src/capabilities/setup/buildPlan.ts +236 -0
- package/src/capabilities/setup/index.ts +7 -7
- package/src/capabilities/setup/mode.ts +74 -0
- package/src/capabilities/setup/operations/index.ts +74 -0
- package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
- package/src/capabilities/setup/operations/setupConfig.ts +124 -0
- package/src/capabilities/setup/operations/setupGenerator.ts +397 -320
- package/src/capabilities/setup/operations/setupLsp.ts +329 -68
- package/src/capabilities/setup/operations/setupMcp.ts +137 -97
- package/src/capabilities/setup/operations/setupSkills.ts +336 -108
- package/src/capabilities/setup/plan.render.ts +241 -0
- package/src/capabilities/setup/plan.ts +236 -0
- package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
- package/src/capabilities/setup/setup.render.test.ts +281 -73
- package/src/capabilities/setup/setup.render.ts +45 -77
- package/src/capabilities/setup/setup.test.ts +972 -209
- package/src/capabilities/setup/setup.verb.ts +233 -74
- package/src/capabilities/setup/shell.test.ts +86 -0
- package/src/capabilities/setup/shell.ts +166 -14
- package/src/capabilities/setup/targets.ts +367 -0
- package/src/capabilities/setup/types.ts +18 -57
- package/src/capabilities/shared/assertExecOk.ts +68 -10
- package/src/capabilities/shared/index.ts +32 -0
- package/src/capabilities/shared/packageManager.test.ts +55 -0
- package/src/capabilities/shared/packageManager.ts +62 -6
- package/src/capabilities/skill/discover.ts +47 -9
- package/src/capabilities/skill/index.ts +1 -1
- package/src/capabilities/skill/render.ts +14 -14
- package/src/capabilities/skill/skill.test.ts +7 -5
- package/src/capabilities/skill/verbs.ts +9 -10
- package/src/capabilities/sources/collectStatus.ts +61 -51
- package/src/capabilities/sources/index.ts +2 -2
- package/src/capabilities/sources/installSkills.ts +86 -9
- package/src/capabilities/sources/runUpdate.ts +164 -141
- package/src/capabilities/sources/sources.test.ts +265 -119
- package/src/capabilities/sources/status.render.test.ts +53 -24
- package/src/capabilities/sources/status.render.ts +25 -30
- package/src/capabilities/sources/status.verb.ts +16 -9
- package/src/capabilities/sources/types.ts +18 -25
- package/src/capabilities/sources/update.render.ts +10 -3
- package/src/capabilities/sources/update.verb.ts +13 -24
- package/src/capabilities/surface.test.ts +165 -25
- package/src/capabilities/tier.parity.test.ts +144 -0
- package/src/capabilities/upgrade/runUpgrade.ts +8 -8
- package/src/capabilities/upgrade/upgrade.render.ts +4 -5
- package/src/capabilities/upgrade/upgrade.test.ts +3 -3
- package/src/capabilities/upgrade/upgrade.verb.ts +8 -4
- package/src/capabilities/version/index.ts +12 -0
- package/src/capabilities/version/version.test.ts +66 -0
- package/src/capabilities/version/version.verb.ts +39 -0
- package/src/constants.test.ts +8 -6
- package/src/constants.ts +78 -22
- package/src/identity.test.ts +348 -0
- package/src/index.ts +2 -2
- package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +20 -15
- package/src/kernel/completion/complete.test.ts +12 -2
- package/src/kernel/completion/complete.ts +1 -1
- package/src/kernel/completion/emitScripts.test.ts +1 -1
- package/src/kernel/completion/emitScripts.ts +5 -3
- package/src/kernel/completion/entitySource.test.ts +185 -41
- package/src/kernel/completion/entitySource.ts +133 -110
- package/src/kernel/completion/model.test.ts +165 -13
- package/src/kernel/completion/model.ts +105 -14
- package/src/kernel/completion/parse.test.ts +4 -7
- package/src/kernel/completion/parse.ts +15 -0
- package/src/kernel/completion/resolve.test.ts +0 -1
- package/src/kernel/completion/safety.test.ts +104 -50
- package/src/kernel/completion/shellDrive.test.ts +611 -0
- package/src/kernel/completion/templates/bash.ts +7 -2
- package/src/kernel/completion/templates/fish.ts +28 -6
- package/src/kernel/completion/templates/index.ts +23 -0
- package/src/kernel/completion/types.ts +10 -3
- package/src/kernel/config/defaults.test.ts +108 -0
- package/src/kernel/config/defaults.ts +13 -23
- package/src/kernel/config/evaluateProjectConfig.ts +33 -11
- package/src/kernel/config/findProjectConfig.ts +4 -3
- package/src/kernel/config/firstRun.test.ts +44 -38
- package/src/kernel/config/firstRun.ts +24 -81
- package/src/kernel/config/globalConfig.ts +2 -2
- package/src/kernel/config/index.ts +5 -6
- package/src/kernel/config/paths.ts +17 -17
- package/src/kernel/config/readConfig.test.ts +246 -7
- package/src/kernel/config/readConfig.ts +8 -8
- package/src/kernel/config/schema.test.ts +50 -0
- package/src/kernel/config/schema.ts +100 -11
- package/src/kernel/config/types.ts +75 -19
- package/src/kernel/copy.test.ts +483 -0
- package/src/kernel/copy.ts +54 -0
- package/src/kernel/error/PragmaError.test.ts +6 -3
- package/src/kernel/error/PragmaError.ts +4 -2
- package/src/kernel/error/constants.ts +7 -4
- package/src/kernel/error/fromTaskError.ts +28 -6
- package/src/kernel/error/index.ts +1 -1
- package/src/kernel/error/recovery.test.ts +22 -45
- package/src/kernel/error/recovery.ts +36 -27
- package/src/kernel/error/renderError.ts +42 -1
- package/src/kernel/error/types.ts +25 -4
- package/src/kernel/index.ts +26 -0
- package/src/kernel/packs/collect.test.ts +195 -11
- package/src/kernel/packs/collect.ts +212 -61
- package/src/kernel/packs/compile.test.ts +293 -8
- package/src/kernel/packs/compile.ts +108 -15
- package/src/kernel/packs/disclosure.test.ts +5 -2
- package/src/kernel/packs/disclosure.ts +2 -2
- package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
- package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +13 -13
- package/src/kernel/packs/graphql/index.ts +20 -0
- package/src/kernel/packs/graphqlSource.test.ts +6 -3
- package/src/kernel/packs/index.ts +40 -0
- package/src/kernel/packs/iri.test.ts +73 -0
- package/src/kernel/packs/iri.ts +70 -20
- package/src/kernel/packs/renderPack.ts +28 -7
- package/src/kernel/packs/resolveEntity.test.ts +213 -0
- package/src/kernel/packs/resolveEntity.ts +132 -34
- package/src/kernel/packs/runBodies.ts +16 -16
- package/src/kernel/packs/sample.ts +1 -1
- package/src/kernel/packs/schema.ts +114 -11
- package/src/kernel/packs/sparql/applyFilters.ts +16 -17
- package/src/kernel/packs/sparql/buildLookupQuery.ts +75 -3
- package/src/kernel/packs/sparql/index.ts +37 -0
- package/src/kernel/packs/sparql/runSelect.test.ts +104 -10
- package/src/kernel/packs/sparql/runSelect.ts +75 -37
- package/src/kernel/packs/toolDescription.test.ts +52 -5
- package/src/kernel/packs/types.ts +52 -4
- package/src/kernel/packs/uniqueness.ts +5 -5
- package/src/kernel/project/cli/buildProgram.test.ts +157 -17
- package/src/kernel/project/cli/buildProgram.ts +77 -18
- package/src/kernel/project/cli/constants.ts +34 -0
- package/src/kernel/project/cli/dispatch.test.ts +227 -3
- package/src/kernel/project/cli/dispatch.ts +250 -48
- package/src/kernel/project/cli/exitCodes.ts +1 -1
- package/src/kernel/project/cli/globalFlags.test.ts +117 -1
- package/src/kernel/project/cli/globalFlags.ts +130 -30
- package/src/kernel/project/cli/helpFormat.ts +14 -1
- package/src/kernel/project/cli/rootHelp.ts +140 -111
- package/src/kernel/project/cli/suggest.test.ts +33 -1
- package/src/kernel/project/cli/suggest.ts +25 -1
- package/src/kernel/project/cli/verbHelp.test.ts +30 -0
- package/src/kernel/project/cli/verbHelp.ts +23 -7
- package/src/kernel/project/mcp/buildServer.ts +18 -10
- package/src/kernel/project/mcp/envelope.ts +2 -2
- package/src/kernel/project/mcp/instructions.ts +12 -7
- package/src/kernel/project/mcp/mcpError.ts +1 -1
- package/src/kernel/project/mcp/parity.test.ts +42 -1
- package/src/kernel/project/mcp/prompts/index.ts +37 -0
- package/src/kernel/project/mcp/prompts/prompts.test.ts +120 -5
- package/src/kernel/project/mcp/prompts/provider.ts +22 -8
- package/src/kernel/project/mcp/prompts/source.ts +69 -68
- package/src/kernel/project/mcp/registerVerb.ts +56 -11
- package/src/kernel/project/mcp/serve.ts +13 -5
- package/src/kernel/project/mcp/toolDescriptions.test.ts +6 -2
- package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
- package/src/kernel/render/contracts.ts +21 -0
- package/src/kernel/render/disclosure.ts +4 -2
- package/src/kernel/render/envelope.ts +2 -3
- package/src/kernel/render/formatters.ts +1 -1
- package/src/kernel/render/prefixes.test.ts +36 -0
- package/src/kernel/render/prefixes.ts +40 -13
- package/src/kernel/render/renderers.test.ts +244 -7
- package/src/kernel/render/renderers.ts +222 -20
- package/src/kernel/render/style.test.ts +75 -24
- package/src/kernel/render/style.ts +31 -1
- package/src/kernel/render/turtle.ts +222 -0
- package/src/kernel/runtime/graphpack/build.ts +29 -3
- package/src/kernel/runtime/graphpack/buildIndex.test.ts +46 -0
- package/src/kernel/runtime/graphpack/buildIndex.ts +53 -18
- package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +5 -5
- package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +3 -3
- package/src/kernel/runtime/graphpack/embedded/pack.stories.generated.ts +3 -0
- package/src/kernel/runtime/graphpack/embedded.ts +39 -13
- package/src/kernel/runtime/graphpack/graphpack.test.ts +205 -5
- package/src/kernel/runtime/graphpack/hash.ts +3 -2
- package/src/kernel/runtime/graphpack/index.ts +1 -1
- package/src/kernel/runtime/graphpack/manifest.ts +114 -12
- package/src/kernel/runtime/graphpack/read.ts +5 -11
- package/src/kernel/runtime/graphpack/schemas.ts +74 -0
- package/src/kernel/runtime/graphpack/stories.ts +84 -0
- package/src/kernel/runtime/graphpack/types.ts +61 -48
- package/src/kernel/runtime/loadSession.ts +1 -1
- package/src/kernel/runtime/paths.ts +64 -15
- package/src/kernel/runtime/probe.test.ts +8 -4
- package/src/kernel/runtime/probe.ts +6 -6
- package/src/kernel/runtime/readEntity.ts +477 -32
- package/src/kernel/runtime/refs/gitOps.ts +1 -19
- package/src/kernel/runtime/refs/index.ts +39 -0
- package/src/kernel/runtime/refs/parseRef.ts +8 -8
- package/src/kernel/runtime/refs/resolve.ts +82 -66
- package/src/kernel/runtime/resolveSources.test.ts +63 -24
- package/src/kernel/runtime/resolveSources.ts +36 -25
- package/src/kernel/runtime/storeReadiness.ts +10 -10
- package/src/kernel/runtime/storeless.test.ts +1 -1
- package/src/kernel/runtime/types.ts +15 -1
- package/src/kernel/runtime/wasmEmbed.test.ts +56 -55
- package/src/kernel/spec/emitReference.test.ts +3 -3
- package/src/kernel/spec/emitReference.ts +242 -34
- package/src/kernel/spec/emitSurface.ts +57 -11
- package/src/kernel/spec/surfaceConformance.test.ts +4 -2
- package/src/kernel/spec/surfaceConformance.ts +8 -0
- package/src/kernel/spec/types.ts +277 -13
- package/src/kernel/spec/validate.ts +2 -1
- package/src/kernel/vocabulary.test.ts +164 -0
- package/src/kernel/vocabulary.ts +146 -0
- package/src/testing/PARITY_GAPS.ts +8 -2
- package/src/testing/behavioral/README.md +3 -3
- package/src/testing/behavioral/completion.test.ts +19 -6
- package/src/testing/behavioral/docExamples.test.ts +14 -0
- package/src/testing/behavioral/errorMatrix.mcp.test.ts +6 -5
- package/src/testing/behavioral/errorMatrix.storeless.test.ts +1 -1
- package/src/testing/behavioral/exitCodes.e2e.test.ts +6 -5
- package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
- package/src/testing/behavioral/harness.foundation.test.ts +14 -5
- package/src/testing/behavioral/journeys.cli.test.ts +117 -76
- package/src/testing/behavioral/journeys.defaultPack.test.ts +88 -182
- package/src/testing/behavioral/journeys.firstInstall.test.ts +167 -0
- package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
- package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
- package/src/testing/behavioral/journeys.mcpLifecycle.mcp.test.ts +9 -6
- package/src/testing/behavioral/journeys.packageStories.test.ts +188 -0
- package/src/testing/behavioral/liveReadSurface.ts +4 -3
- package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
- package/src/testing/behavioral/mcpSurface.test.ts +10 -5
- package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
- package/src/testing/behavioral/staleCommands.test.ts +10 -0
- package/src/testing/eval/__snapshots__/eval.test.ts.snap +7 -7
- package/src/testing/eval/cases/assembly.ts +13 -6
- package/src/testing/eval/cases/effectful.ts +28 -15
- package/src/testing/eval/cases/readNouns.ts +22 -20
- package/src/testing/eval/cases/stable.ts +5 -1
- package/src/testing/eval/eval.test.ts +7 -1
- package/src/testing/fixtures/blockGraph.ts +79 -0
- package/src/testing/fixtures/fixtureCapability.ts +45 -1
- package/src/testing/fixtures/graph/canonical.ts +94 -5
- package/src/testing/fixtures/graph/defaultPack.ts +7 -6
- package/src/testing/fixtures/graph/owlExport.ts +7 -5
- package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
- package/src/testing/helpers/fixtureGraph.ts +33 -16
- package/src/testing/helpers/packRuntime.ts +2 -3
- package/src/testing/helpers/projectCli.ts +2 -1
- package/src/testing/helpers/projectMcp.ts +38 -6
- package/src/testing/helpers/runCli.ts +35 -18
- package/src/testing/perf/budgets.test.ts +24 -9
- package/src/testing/perf/budgets.ts +76 -12
- package/src/testing/perf/codegen.test.ts +126 -0
- package/src/testing/perf/globalSetup.test.ts +286 -0
- package/src/testing/perf/globalSetup.ts +611 -14
- package/src/testing/perf/measure.test.ts +38 -0
- package/src/testing/perf/measure.ts +23 -4
- package/src/testing/setupXdgIsolation.ts +81 -21
- package/src/testing/tempRoot.globalSetup.ts +122 -0
- package/src/types.ts +2 -2
- package/dist/pragma +0 -0
- package/src/capabilities/block/blockList.test.ts +0 -79
- package/src/capabilities/block/blockList.verb.ts +0 -163
- package/src/capabilities/block/index.ts +0 -25
- package/src/capabilities/block/pack.ts +0 -166
- package/src/capabilities/block/parity.test.ts +0 -187
- package/src/capabilities/block/tierChain.ts +0 -78
- package/src/capabilities/colophon/pragmaColophon.ts +0 -66
- package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -152
- package/src/capabilities/create/templates.embedded.generated.ts +0 -53
- package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -41
- package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
- package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -67
- package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -60
- package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
- package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
- package/src/capabilities/modifier/index.ts +0 -15
- package/src/capabilities/modifier/pack.ts +0 -64
- package/src/capabilities/standard/index.ts +0 -18
- package/src/capabilities/standard/pack.ts +0 -128
- package/src/capabilities/tier/index.ts +0 -19
- package/src/capabilities/tier/lookup.render.test.ts +0 -72
- package/src/capabilities/tier/lookup.render.ts +0 -59
- package/src/capabilities/tier/lookup.test.ts +0 -83
- package/src/capabilities/tier/lookup.verb.ts +0 -44
- package/src/capabilities/tier/pack.ts +0 -28
- package/src/capabilities/tier/runLookup.ts +0 -87
- package/src/capabilities/token/addConfig.render.ts +0 -27
- package/src/capabilities/token/addConfig.test.ts +0 -62
- package/src/capabilities/token/addConfig.verb.ts +0 -40
- package/src/capabilities/token/index.ts +0 -19
- package/src/capabilities/token/pack.ts +0 -58
- package/src/capabilities/token/runAddConfig.ts +0 -95
- package/src/kernel/completion/bashDrive.test.ts +0 -73
- package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
- package/src/kernel/runtime/graphpack/embedded/sample.ttl +0 -39
- package/src/kernel/runtime/lock.ts +0 -90
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import { BIN_NAME } from "../../../constants.js";
|
|
2
|
+
import type { PragmaRuntime } from "../../../kernel/runtime/index.js";
|
|
3
|
+
import { detectInstallSource } from "../../shared/index.js";
|
|
3
4
|
import type { CheckResult } from "../types.js";
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
|
-
* Report the
|
|
7
|
+
* Report the CLI version and how it was installed. Always passes — purely
|
|
7
8
|
* informational.
|
|
8
9
|
*
|
|
9
10
|
* @param rt - The per-invocation runtime (for `version`).
|
|
@@ -15,7 +16,7 @@ export async function checkPragmaVersion(
|
|
|
15
16
|
): Promise<CheckResult> {
|
|
16
17
|
const install = detectInstallSource();
|
|
17
18
|
return {
|
|
18
|
-
name:
|
|
19
|
+
name: `${BIN_NAME} version`,
|
|
19
20
|
status: "pass",
|
|
20
21
|
detail: `v${rt.version} (installed via ${install.label})`,
|
|
21
22
|
};
|
|
@@ -1,19 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `checkShellCompletions` — the doctor check that verifies completions are
|
|
3
|
-
* installed AND functional.
|
|
3
|
+
* installed AND up to date AND functional.
|
|
4
4
|
*
|
|
5
|
-
* Runs against an isolated HOME and
|
|
6
|
-
* the resolver effect test, the
|
|
7
|
-
*
|
|
5
|
+
* Runs against an isolated HOME and an injected shell so the gates —
|
|
6
|
+
* the resolver effect test, the install probe, and the zsh fpath activation
|
|
7
|
+
* gate — are deterministic. The effect test (gate 1) drives the real
|
|
8
8
|
* `runComplete` resolver; the install/fpath gates write real files under the
|
|
9
9
|
* temp HOME rather than mocking the fs.
|
|
10
|
+
*
|
|
11
|
+
* Gate 2 compares BYTES, not existence, so the "installed" cases here write the
|
|
12
|
+
* real `emitScripts(capabilities)[shell]` body. A file that merely exists is
|
|
13
|
+
* now the failing case, and it has its own test — as does the boundary on the
|
|
14
|
+
* other side, where a per-project `completion` config must NOT be able to
|
|
15
|
+
* condemn the one global script.
|
|
10
16
|
*/
|
|
11
17
|
|
|
12
18
|
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
13
19
|
import { tmpdir } from "node:os";
|
|
14
20
|
import { dirname, join } from "node:path";
|
|
15
21
|
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
16
|
-
import {
|
|
22
|
+
import { emitScripts } from "../../../kernel/completion/emitScripts.js";
|
|
23
|
+
import { capabilities } from "../../index.js";
|
|
24
|
+
import { detectCompletions } from "../../setup/operations/setupCompletions.js";
|
|
25
|
+
import {
|
|
26
|
+
completionScriptPath,
|
|
27
|
+
type ShellDetection,
|
|
28
|
+
type ShellId,
|
|
29
|
+
} from "../../setup/shell.js";
|
|
30
|
+
import type { CheckResult } from "../types.js";
|
|
17
31
|
import { checkShellCompletions } from "./checkShellCompletions.js";
|
|
18
32
|
|
|
19
33
|
const roots: string[] = [];
|
|
@@ -24,25 +38,49 @@ const tmp = (): string => {
|
|
|
24
38
|
};
|
|
25
39
|
|
|
26
40
|
let prevHome: string | undefined;
|
|
27
|
-
let
|
|
41
|
+
let prevPath: string | undefined;
|
|
28
42
|
beforeEach(() => {
|
|
29
43
|
prevHome = process.env.HOME;
|
|
30
|
-
|
|
44
|
+
prevPath = process.env.PATH;
|
|
31
45
|
process.env.HOME = tmp();
|
|
46
|
+
// The installed script spawns `pragma` for every name context, and the check
|
|
47
|
+
// now verifies that it can. Put one on an isolated PATH so these cases are
|
|
48
|
+
// about the SCRIPT rather than about the host's install.
|
|
49
|
+
const bin = tmp();
|
|
50
|
+
writeFileSync(join(bin, "pragma"), "");
|
|
51
|
+
process.env.PATH = bin;
|
|
32
52
|
});
|
|
33
53
|
afterEach(() => {
|
|
34
54
|
process.env.HOME = prevHome;
|
|
35
|
-
|
|
36
|
-
else process.env.SHELL = prevShell;
|
|
55
|
+
process.env.PATH = prevPath;
|
|
37
56
|
for (const dir of roots) rmSync(dir, { recursive: true, force: true });
|
|
38
57
|
roots.length = 0;
|
|
39
58
|
});
|
|
40
59
|
|
|
41
|
-
/** Write
|
|
42
|
-
function
|
|
60
|
+
/** Write `body` to the shell's real install path. */
|
|
61
|
+
function writeScript(shell: ShellId, body: string): void {
|
|
43
62
|
const path = completionScriptPath(shell);
|
|
44
63
|
mkdirSync(dirname(path), { recursive: true });
|
|
45
|
-
writeFileSync(path,
|
|
64
|
+
writeFileSync(path, body);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Install the script `setup completions` would write for this shell. */
|
|
68
|
+
function installScript(shell: ShellId): void {
|
|
69
|
+
writeScript(shell, emitScripts(capabilities)[shell]);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Run the check the way `doctor` does: the `completions` target detects once
|
|
74
|
+
* per invocation and the check reads that one answer, so the test drives the
|
|
75
|
+
* same pairing rather than letting the check re-read behind its own back.
|
|
76
|
+
*/
|
|
77
|
+
async function check(cwd: string, shell: ShellId | null): Promise<CheckResult> {
|
|
78
|
+
// The shell is INJECTED rather than forced through `$SHELL`: detection reads
|
|
79
|
+
// the process tree now, and a test that set `$SHELL` was only ever asserting
|
|
80
|
+
// against the login shell — the exact confusion this check exists to catch.
|
|
81
|
+
const detection: ShellDetection =
|
|
82
|
+
shell === null ? { kind: "unknown" } : { kind: "detected", shell };
|
|
83
|
+
return checkShellCompletions(cwd, await detectCompletions(cwd, detection));
|
|
46
84
|
}
|
|
47
85
|
|
|
48
86
|
/** Write a `.zshrc` that puts ~/.zfunc on fpath. */
|
|
@@ -57,43 +95,99 @@ describe("checkShellCompletions — effect test (gate 1)", () => {
|
|
|
57
95
|
it("passes the resolver gate: `pragma <TAB>` resolves nouns", async () => {
|
|
58
96
|
// No shell → skip, but only AFTER the resolver answered — the detail proves
|
|
59
97
|
// the effect test ran and succeeded.
|
|
60
|
-
|
|
61
|
-
const result = await checkShellCompletions(tmp());
|
|
98
|
+
const result = await check(tmp(), null);
|
|
62
99
|
expect(result.status).toBe("skip");
|
|
63
100
|
expect(result.detail).toMatch(/resolver OK/);
|
|
64
101
|
});
|
|
65
102
|
});
|
|
66
103
|
|
|
67
104
|
describe("checkShellCompletions — install probe (gate 2)", () => {
|
|
68
|
-
it("
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
expect(result.status).toBe("fail");
|
|
105
|
+
it("a never-installed script is available (opt-in, not a fault) with the setup command", async () => {
|
|
106
|
+
const result = await check(tmp(), "bash");
|
|
107
|
+
expect(result.status).toBe("available");
|
|
72
108
|
expect(result.detail).toMatch(/not installed/);
|
|
73
109
|
expect(result.remedy).toBe("pragma setup completions");
|
|
74
110
|
});
|
|
75
111
|
|
|
76
|
-
it("
|
|
77
|
-
|
|
112
|
+
it("does not claim a script is installed when the binary is off PATH", async () => {
|
|
113
|
+
// This gate runs before the install probe, so it saw only that the binary
|
|
114
|
+
// does not resolve — and reported `bash script installed, but ...` on a
|
|
115
|
+
// machine where nothing had ever been installed. Anyone invoking this CLI
|
|
116
|
+
// by absolute path lands here, and the row invented the file it exists to
|
|
117
|
+
// report on.
|
|
118
|
+
process.env.PATH = tmp(); // an empty PATH: no binary to find
|
|
119
|
+
const result = await check(tmp(), "bash");
|
|
120
|
+
expect(result.detail).not.toMatch(/script installed/);
|
|
121
|
+
expect(result.detail).toMatch(/is not on PATH/);
|
|
122
|
+
// Nothing was installed, so nothing that exists is broken.
|
|
123
|
+
expect(result.status).toBe("available");
|
|
124
|
+
expect(result.remedy).toMatch(/on your PATH/);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it("fails when an INSTALLED script cannot reach the binary", async () => {
|
|
78
128
|
installScript("bash");
|
|
79
|
-
|
|
129
|
+
process.env.PATH = tmp();
|
|
130
|
+
const result = await check(tmp(), "bash");
|
|
131
|
+
expect(result.status).toBe("fail");
|
|
132
|
+
expect(result.detail).toMatch(/script installed, but/);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it("passes for bash once the up-to-date script is at its real path", async () => {
|
|
136
|
+
installScript("bash");
|
|
137
|
+
const result = await check(tmp(), "bash");
|
|
80
138
|
expect(result.status).toBe("pass");
|
|
81
|
-
expect(result.detail).toMatch(
|
|
139
|
+
expect(result.detail).toMatch(
|
|
140
|
+
/bash \(the shell in use\) up to date and resolving/,
|
|
141
|
+
);
|
|
82
142
|
});
|
|
83
143
|
|
|
84
|
-
it("passes for fish once the script
|
|
85
|
-
process.env.SHELL = "/usr/bin/fish";
|
|
144
|
+
it("passes for fish once the up-to-date script is at its real path", async () => {
|
|
86
145
|
installScript("fish");
|
|
87
|
-
const result = await
|
|
146
|
+
const result = await check(tmp(), "fish");
|
|
88
147
|
expect(result.status).toBe("pass");
|
|
89
148
|
});
|
|
149
|
+
|
|
150
|
+
it("fails when the installed script is out of date", async () => {
|
|
151
|
+
// Reproduced against the compiled binary before this was fixed: overwrite
|
|
152
|
+
// the installed script with junk and `doctor` still reported
|
|
153
|
+
// "✓ Shell completions: bash installed and resolving (19 nouns)", while
|
|
154
|
+
// `setup completions` in the same breath said "Updating bash completions".
|
|
155
|
+
// Every user upgrading across a grammar change lands here: the old script
|
|
156
|
+
// offers the old nouns and misses the new ones, and doctor is the one
|
|
157
|
+
// command whose job is to say so.
|
|
158
|
+
writeScript("bash", "# STALE JUNK\n");
|
|
159
|
+
const result = await check(tmp(), "bash");
|
|
160
|
+
expect(result.status).toBe("fail");
|
|
161
|
+
expect(result.detail).toMatch(/out of date/);
|
|
162
|
+
expect(result.remedy).toBe("pragma setup completions");
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it("does NOT condemn the global script for one project's `completion` config", async () => {
|
|
166
|
+
// The script is ONE file per user; `completion` config is layered per
|
|
167
|
+
// project. Comparing the global file against only THIS directory's body
|
|
168
|
+
// made `doctor`'s verdict flip with `cd`: reproduced against the real
|
|
169
|
+
// check, a project declaring `minChars: 5` passed in its own directory and
|
|
170
|
+
// failed in every other, and running the offered remedy there moved the
|
|
171
|
+
// failure back rather than closing it. The first assertion is the
|
|
172
|
+
// discriminator — this project really does ask for a different body — so
|
|
173
|
+
// deleting the config write below turns the test red.
|
|
174
|
+
installScript("bash");
|
|
175
|
+
const cwd = tmp();
|
|
176
|
+
writeFileSync(
|
|
177
|
+
join(cwd, "pragma.config.ts"),
|
|
178
|
+
"export default { completion: { minChars: 5 } };\n",
|
|
179
|
+
);
|
|
180
|
+
expect(
|
|
181
|
+
(await detectCompletions(cwd, { kind: "detected", shell: "bash" })).state,
|
|
182
|
+
).toBe("stale");
|
|
183
|
+
expect((await check(cwd, "bash")).status).toBe("pass");
|
|
184
|
+
});
|
|
90
185
|
});
|
|
91
186
|
|
|
92
187
|
describe("checkShellCompletions — zsh fpath activation (gate 3)", () => {
|
|
93
188
|
it("fails when the zsh script is installed but ~/.zfunc is not on fpath", async () => {
|
|
94
|
-
process.env.SHELL = "/usr/bin/zsh";
|
|
95
189
|
installScript("zsh");
|
|
96
|
-
const result = await
|
|
190
|
+
const result = await check(tmp(), "zsh");
|
|
97
191
|
expect(result.status).toBe("fail");
|
|
98
192
|
expect(result.detail).toMatch(/not on your fpath/);
|
|
99
193
|
// The remedy IS the activation hint — the exact ~/.zshrc lines.
|
|
@@ -101,11 +195,12 @@ describe("checkShellCompletions — zsh fpath activation (gate 3)", () => {
|
|
|
101
195
|
});
|
|
102
196
|
|
|
103
197
|
it("passes once the zsh script is installed AND ~/.zfunc is on fpath", async () => {
|
|
104
|
-
process.env.SHELL = "/usr/bin/zsh";
|
|
105
198
|
installScript("zsh");
|
|
106
199
|
wireZfunc();
|
|
107
|
-
const result = await
|
|
200
|
+
const result = await check(tmp(), "zsh");
|
|
108
201
|
expect(result.status).toBe("pass");
|
|
109
|
-
expect(result.detail).toMatch(
|
|
202
|
+
expect(result.detail).toMatch(
|
|
203
|
+
/zsh \(the shell in use\) up to date and resolving/,
|
|
204
|
+
);
|
|
110
205
|
});
|
|
111
206
|
});
|
|
@@ -1,20 +1,48 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
+
import { BIN_NAME } from "../../../constants.js";
|
|
4
5
|
import {
|
|
6
|
+
emitScripts,
|
|
5
7
|
indexCompletionEnv,
|
|
6
8
|
runComplete,
|
|
7
9
|
} from "../../../kernel/completion/index.js";
|
|
8
10
|
import { capabilities } from "../../index.js";
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
completionScriptPath,
|
|
12
|
-
detectShell,
|
|
13
|
-
} from "../../setup/shell.js";
|
|
11
|
+
import type { CompletionsDetection } from "../../setup/operations/index.js";
|
|
12
|
+
import { activationHint, type ShellId } from "../../setup/shell.js";
|
|
14
13
|
import type { CheckResult } from "../types.js";
|
|
15
14
|
|
|
16
15
|
const NAME = "Shell completions";
|
|
17
16
|
|
|
17
|
+
/** The one remedy for an absent or out-of-date script. */
|
|
18
|
+
const INSTALL_REMEDY = `${BIN_NAME} setup completions`;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Whether the installed script is the config-free emit — the body
|
|
22
|
+
* `setup completions` writes when no `completion` config tunes it.
|
|
23
|
+
*
|
|
24
|
+
* The completion script is ONE file per user, but the `completion` config it is
|
|
25
|
+
* rendered from is layered per project. So `detectCompletions(cwd)`'s `stale`
|
|
26
|
+
* means only "not what THIS directory would write", and on its own it would let
|
|
27
|
+
* any project that tunes `minChars` call a globally-correct script out of date
|
|
28
|
+
* from every other directory — a `doctor` verdict that flips with `cd`, and a
|
|
29
|
+
* remedy that just moves the failure to the project you came from. A script
|
|
30
|
+
* that matches neither this project's body nor the untuned one is the one that
|
|
31
|
+
* is genuinely stale.
|
|
32
|
+
*
|
|
33
|
+
* @param path - The install path.
|
|
34
|
+
* @param shell - The detected shell.
|
|
35
|
+
* @returns Whether the file there is byte-identical to the untuned emit.
|
|
36
|
+
* @note Impure — reads the install path. An unreadable file counts as `false`.
|
|
37
|
+
*/
|
|
38
|
+
function isUntunedScript(path: string, shell: ShellId): boolean {
|
|
39
|
+
try {
|
|
40
|
+
return readFileSync(path, "utf-8") === emitScripts(capabilities)[shell];
|
|
41
|
+
} catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
18
46
|
/**
|
|
19
47
|
* Whether the user's `.zshrc` puts `~/.zfunc` on `$fpath` — the activation step
|
|
20
48
|
* `setup completions` cannot perform for the user. zsh loads nothing from
|
|
@@ -53,25 +81,42 @@ async function completeProbe(cwd: string): Promise<number> {
|
|
|
53
81
|
}
|
|
54
82
|
|
|
55
83
|
/**
|
|
56
|
-
* Check that shell completions are installed AND functional.
|
|
84
|
+
* Check that shell completions are installed AND up to date AND functional.
|
|
57
85
|
*
|
|
58
86
|
* Three gates, in order:
|
|
59
87
|
* 1. The resolver answers (`completeProbe` drives `runComplete` end to end) —
|
|
60
88
|
* the effect every installed script depends on. A failure here is a real
|
|
61
89
|
* regression, so it fails even when nothing is installed.
|
|
62
|
-
* 2. The script
|
|
63
|
-
*
|
|
64
|
-
*
|
|
90
|
+
* 2. The installed script is present AND is a script `setup completions` would
|
|
91
|
+
* write. Bytes, not existence: a file that merely exists proves nothing — a
|
|
92
|
+
* user upgrading across a grammar change keeps the old script, loses the
|
|
93
|
+
* moved nouns from TAB, and used to be told everything was fine. The path
|
|
94
|
+
* and this project's body come from `detectCompletions`, the ONE owner of
|
|
95
|
+
* that decision; {@link isUntunedScript} is what keeps a per-project
|
|
96
|
+
* `completion` config from condemning a global file (see its docblock).
|
|
65
97
|
* 3. For zsh, `~/.zfunc` is on `$fpath` — the activation step setup can only
|
|
66
98
|
* hint. Installed-but-unwired reports a distinct remedy.
|
|
67
99
|
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
100
|
+
* Fault tiers: a broken resolver, a stale installed script, or an unwired zsh
|
|
101
|
+
* install are `fail` — something that exists does not work. A script that was
|
|
102
|
+
* never installed is `available`: completions are opt-in and a fresh install
|
|
103
|
+
* is healthy without them.
|
|
104
|
+
*
|
|
105
|
+
* The detection is passed IN rather than re-read: the `completions` target
|
|
106
|
+
* detects once per invocation and both the setup plan and this row read that
|
|
107
|
+
* one answer, so the two surfaces cannot describe different files.
|
|
108
|
+
*
|
|
109
|
+
* @param cwd - The project directory (the resolver's entity seam).
|
|
110
|
+
* @param d - The `completions` target's detection for this invocation.
|
|
111
|
+
* @returns A CheckResult: pass (up to date + wired + answering), available
|
|
112
|
+
* (never installed, with the setup remedy), fail (with the attributable
|
|
113
|
+
* remedy), or skip (shell undetected).
|
|
114
|
+
* @note Impure — reads the install path, `.zshrc`, and drives the resolver.
|
|
73
115
|
*/
|
|
74
|
-
export async function checkShellCompletions(
|
|
116
|
+
export async function checkShellCompletions(
|
|
117
|
+
cwd: string,
|
|
118
|
+
d: CompletionsDetection,
|
|
119
|
+
): Promise<CheckResult> {
|
|
75
120
|
// 1. Effect test: the resolver the scripts delegate to must actually answer.
|
|
76
121
|
let candidates: number;
|
|
77
122
|
try {
|
|
@@ -82,34 +127,75 @@ export async function checkShellCompletions(cwd: string): Promise<CheckResult> {
|
|
|
82
127
|
name: NAME,
|
|
83
128
|
status: "fail",
|
|
84
129
|
detail: `completion resolver failed: ${reason}`,
|
|
85
|
-
remedy:
|
|
130
|
+
remedy: `Report this as a bug — \`${BIN_NAME} __complete\` should never throw.`,
|
|
86
131
|
};
|
|
87
132
|
}
|
|
88
133
|
if (candidates === 0) {
|
|
89
134
|
return {
|
|
90
135
|
name: NAME,
|
|
91
136
|
status: "fail",
|
|
92
|
-
detail:
|
|
137
|
+
detail: `completion resolver returned no candidates for \`${BIN_NAME} <TAB>\``,
|
|
93
138
|
remedy: "Report this as a bug — the noun context is always non-empty.",
|
|
94
139
|
};
|
|
95
140
|
}
|
|
96
141
|
|
|
97
|
-
// 2. The
|
|
98
|
-
|
|
99
|
-
|
|
142
|
+
// 2. The check is about the shell the user is IN. Reporting on the login
|
|
143
|
+
// shell instead is what let this row print a green check for a shell the
|
|
144
|
+
// user never opens while the one they live in had nothing installed.
|
|
145
|
+
const { shell, path, state } = d;
|
|
146
|
+
if (d.detection.kind === "ambiguous") {
|
|
100
147
|
return {
|
|
101
148
|
name: NAME,
|
|
102
149
|
status: "skip",
|
|
103
|
-
detail:
|
|
150
|
+
detail: `resolver OK; the running shell cannot be identified (SHELL names ${d.detection.login}, the login shell)`,
|
|
151
|
+
remedy: `Run \`${INSTALL_REMEDY}\` from the shell you want completions in.`,
|
|
104
152
|
};
|
|
105
153
|
}
|
|
106
|
-
|
|
107
|
-
if (!existsSync(path)) {
|
|
154
|
+
if (shell === null || path === null) {
|
|
108
155
|
return {
|
|
109
156
|
name: NAME,
|
|
110
|
-
status: "
|
|
157
|
+
status: "skip",
|
|
158
|
+
detail: "resolver OK; no bash, zsh, or fish in this process tree",
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
// The installed script delegates every name context to the binary. A script
|
|
162
|
+
// that cannot reach it is inert, and reporting it as current is the same
|
|
163
|
+
// false green this row already told once.
|
|
164
|
+
//
|
|
165
|
+
// This gate runs BEFORE the install probe, so it says only what it has
|
|
166
|
+
// verified: that the binary does not resolve. Claiming "script installed" here
|
|
167
|
+
// told a user running this CLI by absolute path that a script they had never
|
|
168
|
+
// installed was broken — an invented file, in the row whose whole job is to
|
|
169
|
+
// report the real one. Nothing installed is still the opt-in `available` tier.
|
|
170
|
+
if (!d.binOnPath) {
|
|
171
|
+
const installed = state !== "absent";
|
|
172
|
+
return {
|
|
173
|
+
name: NAME,
|
|
174
|
+
status: installed ? "fail" : "available",
|
|
175
|
+
detail: installed
|
|
176
|
+
? `${shell} script installed, but \`${BIN_NAME}\` is not on PATH — the script cannot run it`
|
|
177
|
+
: `resolver OK; \`${BIN_NAME}\` is not on PATH — an installed script cannot run it`,
|
|
178
|
+
remedy: `Put \`${BIN_NAME}\` on your PATH.`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if (state === "absent") {
|
|
182
|
+
// Never installed is `available`, not a fault: completions are opt-in and
|
|
183
|
+
// a fresh install is healthy without them. An INSTALLED script that is
|
|
184
|
+
// out of date or unwired (below) is the real failure — something the user
|
|
185
|
+
// set up no longer works.
|
|
186
|
+
return {
|
|
187
|
+
name: NAME,
|
|
188
|
+
status: "available",
|
|
111
189
|
detail: `resolver OK; ${shell} script not installed`,
|
|
112
|
-
remedy:
|
|
190
|
+
remedy: INSTALL_REMEDY,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
if (state === "stale" && !isUntunedScript(path, shell)) {
|
|
194
|
+
return {
|
|
195
|
+
name: NAME,
|
|
196
|
+
status: "fail",
|
|
197
|
+
detail: `resolver OK; ${shell} script at ${path} is out of date`,
|
|
198
|
+
remedy: INSTALL_REMEDY,
|
|
113
199
|
};
|
|
114
200
|
}
|
|
115
201
|
|
|
@@ -126,6 +212,6 @@ export async function checkShellCompletions(cwd: string): Promise<CheckResult> {
|
|
|
126
212
|
return {
|
|
127
213
|
name: NAME,
|
|
128
214
|
status: "pass",
|
|
129
|
-
detail: `${shell}
|
|
215
|
+
detail: `${shell} (the shell in use) up to date and resolving (${candidates} nouns)`,
|
|
130
216
|
};
|
|
131
217
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The doctor check catalogue — the diagnoses `doctor` composes into a report.
|
|
3
|
+
*
|
|
4
|
+
* A check is the whole shape of this domain: it inspects ONE thing, decides
|
|
5
|
+
* pass or fail, and hands back a `CheckResult` carrying the remedy. Keeping
|
|
6
|
+
* them apart from the report body is what lets `runChecks` stay a composition
|
|
7
|
+
* — it orders and awaits, and knows nothing about what any check looks at.
|
|
8
|
+
*
|
|
9
|
+
* Two kinds live here, and the barrel exposes them differently. The UNBANDED
|
|
10
|
+
* checks diagnose what `setup` cannot install — the Node floor, the CLI's own
|
|
11
|
+
* version and install source, the pack answering this project's reads, and the
|
|
12
|
+
* store — so each is its own named entry point. The BANDED rows are derived
|
|
13
|
+
* per target, per band, from the setup target table rather than authored here,
|
|
14
|
+
* so they surface as the one generator that derives them, never as a list of
|
|
15
|
+
* row names this file would then have to keep in step with `setup`.
|
|
16
|
+
*
|
|
17
|
+
* The per-target probes (the completions script check, the MCP command
|
|
18
|
+
* resolution helpers) stay internal on purpose: `bandedChecks` is the only way
|
|
19
|
+
* they are meant to be reached, and a row reachable past its band is a row
|
|
20
|
+
* `doctor` can report and `setup` cannot fix.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export { checkKeStore } from "./checkKeStore.js";
|
|
24
|
+
export { checkNodeVersion } from "./checkNodeVersion.js";
|
|
25
|
+
export { checkPackageRefs } from "./checkPackageRefs.js";
|
|
26
|
+
export { checkPragmaVersion } from "./checkPragmaVersion.js";
|
|
27
|
+
export { bandedChecks } from "./targetHealth.js";
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `commandOf` reads BOTH registered entry shapes.
|
|
3
|
+
*
|
|
4
|
+
* A harness whose schema requires `command` to be an argv array (OpenCode)
|
|
5
|
+
* carries the executable in the first element; a string-valued `command` IS the
|
|
6
|
+
* executable. Reading only the string form made doctor skip an entry `setup`
|
|
7
|
+
* had just written correctly — and report no command-based servers on a fully
|
|
8
|
+
* configured machine. The two shapes must resolve to the same executable, which
|
|
9
|
+
* is what these cases pin.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
13
|
+
import { tmpdir } from "node:os";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import type { PlatformEnv } from "@canonical/harnesses";
|
|
16
|
+
import { afterAll, describe, expect, it } from "vitest";
|
|
17
|
+
import { commandOf, commandResolves } from "./mcpCommand.js";
|
|
18
|
+
|
|
19
|
+
describe("commandOf — one executable, either entry shape", () => {
|
|
20
|
+
it("reads a string command", () => {
|
|
21
|
+
expect(commandOf({ command: "pragma", args: ["mcp", "serve"] })).toBe(
|
|
22
|
+
"pragma",
|
|
23
|
+
);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("reads the executable out of an argv array", () => {
|
|
27
|
+
expect(commandOf({ command: ["pragma", "mcp", "serve"] })).toBe("pragma");
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("skips the leading empty element rather than returning it", () => {
|
|
31
|
+
expect(commandOf({ command: ["", "pragma"] })).toBe("pragma");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("has no command for an HTTP entry", () => {
|
|
35
|
+
expect(commandOf({ type: "http", url: "https://example.test" })).toBe(
|
|
36
|
+
undefined,
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("has no command for an empty string, an empty array, or a non-entry", () => {
|
|
41
|
+
expect(commandOf({ command: "" })).toBe(undefined);
|
|
42
|
+
expect(commandOf({ command: [] })).toBe(undefined);
|
|
43
|
+
expect(commandOf(null)).toBe(undefined);
|
|
44
|
+
expect(commandOf("pragma")).toBe(undefined);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe("commandResolves — the host's own resolution rules", () => {
|
|
49
|
+
const dirs: string[] = [];
|
|
50
|
+
const tmp = (): string => {
|
|
51
|
+
const dir = mkdtempSync(join(tmpdir(), "pragma-mcp-path-"));
|
|
52
|
+
dirs.push(dir);
|
|
53
|
+
return dir;
|
|
54
|
+
};
|
|
55
|
+
afterAll(() => {
|
|
56
|
+
for (const dir of dirs) rmSync(dir, { recursive: true, force: true });
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const hostOf = (
|
|
60
|
+
platform: PlatformEnv["platform"],
|
|
61
|
+
dir: string,
|
|
62
|
+
): PlatformEnv => ({
|
|
63
|
+
platform,
|
|
64
|
+
env: { PATH: dir },
|
|
65
|
+
home: dir,
|
|
66
|
+
isWsl: false,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it("resolves a Windows shim, which a bare-name PATH join cannot see", async () => {
|
|
70
|
+
// npm installs the CLI as `pragma.cmd` on Windows. Joining the bare name
|
|
71
|
+
// onto each PATH directory found nothing, so a registration `setup` had
|
|
72
|
+
// just written correctly was reported as a dead command. (The file is
|
|
73
|
+
// spelled to match a default `PATHEXT` entry exactly, because this test
|
|
74
|
+
// runs on a case-sensitive filesystem.)
|
|
75
|
+
const dir = tmp();
|
|
76
|
+
writeFileSync(join(dir, "pragma.CMD"), "");
|
|
77
|
+
expect(await commandResolves("pragma", dir, hostOf("win32", dir))).toBe(
|
|
78
|
+
true,
|
|
79
|
+
);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("resolves a bare name off PATH elsewhere, and says no when it is absent", async () => {
|
|
83
|
+
const dir = tmp();
|
|
84
|
+
writeFileSync(join(dir, "pragma"), "");
|
|
85
|
+
expect(await commandResolves("pragma", dir, hostOf("linux", dir))).toBe(
|
|
86
|
+
true,
|
|
87
|
+
);
|
|
88
|
+
expect(await commandResolves("absent", dir, hostOf("linux", dir))).toBe(
|
|
89
|
+
false,
|
|
90
|
+
);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("checks a path-bearing command as a file, relative to the project root", async () => {
|
|
94
|
+
const dir = tmp();
|
|
95
|
+
writeFileSync(join(dir, "local-bin"), "");
|
|
96
|
+
expect(
|
|
97
|
+
await commandResolves("./local-bin", dir, hostOf("linux", dir)),
|
|
98
|
+
).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command resolution for MCP server entries.
|
|
3
|
+
*
|
|
4
|
+
* A dead `command` makes every agent session try and fail to boot the server,
|
|
5
|
+
* so the `mcp` doctor row reports whether the entry it owns resolves. The row
|
|
6
|
+
* judges ONLY the entry this CLI writes: an aggregate check over every server
|
|
7
|
+
* in the file failed the row whenever some FOREIGN server had a dead command,
|
|
8
|
+
* which is a fact about someone else's tool reported as this one's fault.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { existsSync } from "node:fs";
|
|
12
|
+
import { isAbsolute, join } from "node:path";
|
|
13
|
+
import type { PlatformEnv } from "@canonical/harnesses";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Extract the stdio command from an MCP server config entry, if any. HTTP/SSE
|
|
17
|
+
* entries (`{ type: "http", url }`) have no command and are not checked.
|
|
18
|
+
*
|
|
19
|
+
* Both entry shapes resolve to the same executable. A harness whose schema
|
|
20
|
+
* requires `command` to be an argv array (OpenCode) carries the executable in
|
|
21
|
+
* its first element; a string-valued `command` IS the executable. Reading only
|
|
22
|
+
* the string form made this check skip an entry `setup` had just written
|
|
23
|
+
* correctly, and report no command-based servers on a configured machine.
|
|
24
|
+
*/
|
|
25
|
+
export function commandOf(entry: unknown): string | undefined {
|
|
26
|
+
if (typeof entry !== "object" || entry === null) return undefined;
|
|
27
|
+
const command = (entry as { command?: unknown }).command;
|
|
28
|
+
if (typeof command === "string") {
|
|
29
|
+
return command.length > 0 ? command : undefined;
|
|
30
|
+
}
|
|
31
|
+
if (Array.isArray(command)) {
|
|
32
|
+
return command.find(
|
|
33
|
+
(part): part is string => typeof part === "string" && part.length > 0,
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Resolve a command the way the host would: a path-bearing entry is checked as
|
|
41
|
+
* a file (relative to the project root), a bare name is searched across `PATH`
|
|
42
|
+
* through `@canonical/harnesses`' `executableCandidates`, which owns the PATH
|
|
43
|
+
* split and the win32 `PATHEXT` rules in one place.
|
|
44
|
+
*
|
|
45
|
+
* The bare-name arm used to join the name onto each PATH directory, which
|
|
46
|
+
* cannot see the `.cmd` shim npm installs on Windows: a registration this CLI
|
|
47
|
+
* had just written correctly was reported as a dead command.
|
|
48
|
+
*
|
|
49
|
+
* @param command - The executable the entry names.
|
|
50
|
+
* @param cwd - The project root a relative command is resolved against.
|
|
51
|
+
* @param platform - The captured host to use instead of this one (tests).
|
|
52
|
+
* @returns Whether the command resolves on this machine.
|
|
53
|
+
* @note Impure — tests candidate paths on the filesystem.
|
|
54
|
+
*/
|
|
55
|
+
export async function commandResolves(
|
|
56
|
+
command: string,
|
|
57
|
+
cwd: string,
|
|
58
|
+
platform?: PlatformEnv,
|
|
59
|
+
): Promise<boolean> {
|
|
60
|
+
if (command.includes("/") || command.includes("\\")) {
|
|
61
|
+
return existsSync(isAbsolute(command) ? command : join(cwd, command));
|
|
62
|
+
}
|
|
63
|
+
const { executableCandidates, readPlatformEnv } = await import(
|
|
64
|
+
"@canonical/harnesses"
|
|
65
|
+
);
|
|
66
|
+
return executableCandidates(command, platform ?? readPlatformEnv()).some(
|
|
67
|
+
(candidate) => existsSync(candidate),
|
|
68
|
+
);
|
|
69
|
+
}
|