@canonical/pragma-cli 0.34.0 → 0.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +153 -30
- package/dist/.build-ok +0 -0
- package/dist/package.json +83 -0
- package/dist/pragma.conf.js +814 -0
- package/dist/pragma.conf.js.map +1 -0
- package/dist/src/bin.js +356 -0
- package/dist/src/bin.js.map +1 -0
- package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
- package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
- package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
- package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
- package/dist/src/capabilities/capabilities/catalog.js +130 -0
- package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
- package/dist/src/capabilities/capabilities/hints.js +195 -0
- package/dist/src/capabilities/capabilities/hints.js.map +1 -0
- package/dist/src/capabilities/capabilities/index.js +11 -0
- package/dist/src/capabilities/capabilities/index.js.map +1 -0
- package/dist/src/capabilities/capabilities/types.js +11 -0
- package/dist/src/capabilities/capabilities/types.js.map +1 -0
- package/dist/src/capabilities/colophon/collectColophon.js +83 -0
- package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
- package/dist/src/capabilities/colophon/colophon.render.js +59 -0
- package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
- package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
- package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
- package/dist/src/capabilities/colophon/index.js +5 -0
- package/dist/src/capabilities/colophon/index.js.map +1 -0
- package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
- package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
- package/dist/src/capabilities/colophon/types.js +10 -0
- package/dist/src/capabilities/colophon/types.js.map +1 -0
- package/dist/src/capabilities/config/collectConfigShow.js +59 -0
- package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
- package/dist/src/capabilities/config/field.render.js +22 -0
- package/dist/src/capabilities/config/field.render.js.map +1 -0
- package/dist/src/capabilities/config/fields.js +46 -0
- package/dist/src/capabilities/config/fields.js.map +1 -0
- package/dist/src/capabilities/config/get.verb.js +61 -0
- package/dist/src/capabilities/config/get.verb.js.map +1 -0
- package/dist/src/capabilities/config/index.js +5 -0
- package/dist/src/capabilities/config/index.js.map +1 -0
- package/dist/src/capabilities/config/runField.js +59 -0
- package/dist/src/capabilities/config/runField.js.map +1 -0
- package/dist/src/capabilities/config/runGet.js +28 -0
- package/dist/src/capabilities/config/runGet.js.map +1 -0
- package/dist/src/capabilities/config/runSet.js +53 -0
- package/dist/src/capabilities/config/runSet.js.map +1 -0
- package/dist/src/capabilities/config/set.verb.js +66 -0
- package/dist/src/capabilities/config/set.verb.js.map +1 -0
- package/dist/src/capabilities/config/show.render.js +84 -0
- package/dist/src/capabilities/config/show.render.js.map +1 -0
- package/dist/src/capabilities/config/show.verb.js +44 -0
- package/dist/src/capabilities/config/show.verb.js.map +1 -0
- package/dist/src/capabilities/config/types.js +5 -0
- package/dist/src/capabilities/config/types.js.map +1 -0
- package/dist/src/capabilities/config/unset.verb.js +49 -0
- package/dist/src/capabilities/config/unset.verb.js.map +1 -0
- package/dist/src/capabilities/create/cliProjection.js +195 -0
- package/dist/src/capabilities/create/cliProjection.js.map +1 -0
- package/dist/src/capabilities/create/constants.js +47 -0
- package/dist/src/capabilities/create/constants.js.map +1 -0
- package/dist/src/capabilities/create/create.render.js +100 -0
- package/dist/src/capabilities/create/create.render.js.map +1 -0
- package/dist/src/capabilities/create/create.verb.js +438 -0
- package/dist/src/capabilities/create/create.verb.js.map +1 -0
- package/dist/src/capabilities/create/createHelp.js +47 -0
- package/dist/src/capabilities/create/createHelp.js.map +1 -0
- package/dist/src/capabilities/create/createSurface.generated.js +394 -0
- package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
- package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
- package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
- package/dist/src/capabilities/create/index.js +18 -0
- package/dist/src/capabilities/create/index.js.map +1 -0
- package/dist/src/capabilities/create/messages.js +16 -0
- package/dist/src/capabilities/create/messages.js.map +1 -0
- package/dist/src/capabilities/create/mount.js +293 -0
- package/dist/src/capabilities/create/mount.js.map +1 -0
- package/dist/src/capabilities/create/pathJail.js +65 -0
- package/dist/src/capabilities/create/pathJail.js.map +1 -0
- package/dist/src/capabilities/create/pickGenerator.js +53 -0
- package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
- package/dist/src/capabilities/create/types.js +2 -0
- package/dist/src/capabilities/create/types.js.map +1 -0
- package/dist/src/capabilities/distribution.js +40 -0
- package/dist/src/capabilities/distribution.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
- package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
- package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +92 -0
- package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
- package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
- package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/index.js +27 -0
- package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
- package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/targetHealth.js +205 -0
- package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.render.js +185 -0
- package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.verb.js +45 -0
- package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
- package/dist/src/capabilities/doctor/index.js +5 -0
- package/dist/src/capabilities/doctor/index.js.map +1 -0
- package/dist/src/capabilities/doctor/runChecks.js +83 -0
- package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
- package/dist/src/capabilities/doctor/types.js +5 -0
- package/dist/src/capabilities/doctor/types.js.map +1 -0
- package/dist/src/capabilities/graph/index.js +19 -0
- package/dist/src/capabilities/graph/index.js.map +1 -0
- package/dist/src/capabilities/graph/inspect.render.js +76 -0
- package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
- package/dist/src/capabilities/graph/inspect.verb.js +53 -0
- package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
- package/dist/src/capabilities/graph/query.render.js +73 -0
- package/dist/src/capabilities/graph/query.render.js.map +1 -0
- package/dist/src/capabilities/graph/query.verb.js +49 -0
- package/dist/src/capabilities/graph/query.verb.js.map +1 -0
- package/dist/src/capabilities/graph/runQuery.js +41 -0
- package/dist/src/capabilities/graph/runQuery.js.map +1 -0
- package/dist/src/capabilities/index.js +56 -0
- package/dist/src/capabilities/index.js.map +1 -0
- package/dist/src/capabilities/info/collectInfo.js +66 -0
- package/dist/src/capabilities/info/collectInfo.js.map +1 -0
- package/dist/src/capabilities/info/index.js +5 -0
- package/dist/src/capabilities/info/index.js.map +1 -0
- package/dist/src/capabilities/info/info.render.js +53 -0
- package/dist/src/capabilities/info/info.render.js.map +1 -0
- package/dist/src/capabilities/info/info.verb.js +42 -0
- package/dist/src/capabilities/info/info.verb.js.map +1 -0
- package/dist/src/capabilities/info/types.js +5 -0
- package/dist/src/capabilities/info/types.js.map +1 -0
- package/dist/src/capabilities/meta/complete.verb.js +43 -0
- package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
- package/dist/src/capabilities/meta/index.js +13 -0
- package/dist/src/capabilities/meta/index.js.map +1 -0
- package/dist/src/capabilities/meta/mcp.verb.js +34 -0
- package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
- package/dist/src/capabilities/ontology/index.js +21 -0
- package/dist/src/capabilities/ontology/index.js.map +1 -0
- package/dist/src/capabilities/ontology/queries.js +123 -0
- package/dist/src/capabilities/ontology/queries.js.map +1 -0
- package/dist/src/capabilities/ontology/render.js +66 -0
- package/dist/src/capabilities/ontology/render.js.map +1 -0
- package/dist/src/capabilities/ontology/verbs.js +181 -0
- package/dist/src/capabilities/ontology/verbs.js.map +1 -0
- package/dist/src/capabilities/prompt/index.js +16 -0
- package/dist/src/capabilities/prompt/index.js.map +1 -0
- package/dist/src/capabilities/prompt/prompt.render.js +78 -0
- package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
- package/dist/src/capabilities/prompt/types.js +10 -0
- package/dist/src/capabilities/prompt/types.js.map +1 -0
- package/dist/src/capabilities/prompt/verbs.js +93 -0
- package/dist/src/capabilities/prompt/verbs.js.map +1 -0
- package/dist/src/capabilities/resources/index.js +10 -0
- package/dist/src/capabilities/resources/index.js.map +1 -0
- package/dist/src/capabilities/resources/provider.js +423 -0
- package/dist/src/capabilities/resources/provider.js.map +1 -0
- package/dist/src/capabilities/setup/buildPlan.js +168 -0
- package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
- package/dist/src/capabilities/setup/index.js +5 -0
- package/dist/src/capabilities/setup/index.js.map +1 -0
- package/dist/src/capabilities/setup/mode.js +53 -0
- package/dist/src/capabilities/setup/mode.js.map +1 -0
- package/dist/src/capabilities/setup/operations/index.js +39 -0
- package/dist/src/capabilities/setup/operations/index.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
- package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
- package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupGenerator.js +343 -0
- package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js +277 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js +207 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupSkills.js +316 -0
- package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
- package/dist/src/capabilities/setup/plan.js +128 -0
- package/dist/src/capabilities/setup/plan.js.map +1 -0
- package/dist/src/capabilities/setup/plan.render.js +193 -0
- package/dist/src/capabilities/setup/plan.render.js.map +1 -0
- package/dist/src/capabilities/setup/setup.render.js +54 -0
- package/dist/src/capabilities/setup/setup.render.js.map +1 -0
- package/dist/src/capabilities/setup/setup.verb.js +334 -0
- package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
- package/dist/src/capabilities/setup/shell.js +196 -0
- package/dist/src/capabilities/setup/shell.js.map +1 -0
- package/dist/src/capabilities/setup/targets.js +263 -0
- package/dist/src/capabilities/setup/targets.js.map +1 -0
- package/dist/src/capabilities/setup/types.js +5 -0
- package/dist/src/capabilities/setup/types.js.map +1 -0
- package/dist/src/capabilities/shared/assertExecOk.js +137 -0
- package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
- package/dist/src/capabilities/shared/bands.js +16 -0
- package/dist/src/capabilities/shared/bands.js.map +1 -0
- package/dist/src/capabilities/shared/index.js +26 -0
- package/dist/src/capabilities/shared/index.js.map +1 -0
- package/dist/src/capabilities/shared/packageManager.js +103 -0
- package/dist/src/capabilities/shared/packageManager.js.map +1 -0
- package/dist/src/capabilities/shared/registry.js +55 -0
- package/dist/src/capabilities/shared/registry.js.map +1 -0
- package/dist/src/capabilities/skill/discover.js +195 -0
- package/dist/src/capabilities/skill/discover.js.map +1 -0
- package/dist/src/capabilities/skill/index.js +10 -0
- package/dist/src/capabilities/skill/index.js.map +1 -0
- package/dist/src/capabilities/skill/render.js +49 -0
- package/dist/src/capabilities/skill/render.js.map +1 -0
- package/dist/src/capabilities/skill/verbs.js +83 -0
- package/dist/src/capabilities/skill/verbs.js.map +1 -0
- package/dist/src/capabilities/sources/collectStatus.js +103 -0
- package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
- package/dist/src/capabilities/sources/index.js +13 -0
- package/dist/src/capabilities/sources/index.js.map +1 -0
- package/dist/src/capabilities/sources/installSkills.js +167 -0
- package/dist/src/capabilities/sources/installSkills.js.map +1 -0
- package/dist/src/capabilities/sources/runUpdate.js +394 -0
- package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
- package/dist/src/capabilities/sources/status.render.js +64 -0
- package/dist/src/capabilities/sources/status.render.js.map +1 -0
- package/dist/src/capabilities/sources/status.verb.js +40 -0
- package/dist/src/capabilities/sources/status.verb.js.map +1 -0
- package/dist/src/capabilities/sources/types.js +6 -0
- package/dist/src/capabilities/sources/types.js.map +1 -0
- package/dist/src/capabilities/sources/update.render.js +34 -0
- package/dist/src/capabilities/sources/update.render.js.map +1 -0
- package/dist/src/capabilities/sources/update.verb.js +55 -0
- package/dist/src/capabilities/sources/update.verb.js.map +1 -0
- package/dist/src/capabilities/upgrade/index.js +5 -0
- package/dist/src/capabilities/upgrade/index.js.map +1 -0
- package/dist/src/capabilities/upgrade/runUpgrade.js +99 -0
- package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
- package/dist/src/capabilities/upgrade/types.js +5 -0
- package/dist/src/capabilities/upgrade/types.js.map +1 -0
- package/dist/src/capabilities/upgrade/upgrade.render.js +44 -0
- package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
- package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
- package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
- package/dist/src/capabilities/version/index.js +10 -0
- package/dist/src/capabilities/version/index.js.map +1 -0
- package/dist/src/capabilities/version/version.verb.js +36 -0
- package/dist/src/capabilities/version/version.verb.js.map +1 -0
- package/dist/src/constants.js +82 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/index.js +12 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/kernel/completion/complete.js +66 -0
- package/dist/src/kernel/completion/complete.js.map +1 -0
- package/dist/src/kernel/completion/emitScripts.js +92 -0
- package/dist/src/kernel/completion/emitScripts.js.map +1 -0
- package/dist/src/kernel/completion/entitySource.js +285 -0
- package/dist/src/kernel/completion/entitySource.js.map +1 -0
- package/dist/src/kernel/completion/index.js +14 -0
- package/dist/src/kernel/completion/index.js.map +1 -0
- package/dist/src/kernel/completion/model.js +301 -0
- package/dist/src/kernel/completion/model.js.map +1 -0
- package/dist/src/kernel/completion/parse.js +253 -0
- package/dist/src/kernel/completion/parse.js.map +1 -0
- package/dist/src/kernel/completion/rank.js +101 -0
- package/dist/src/kernel/completion/rank.js.map +1 -0
- package/dist/src/kernel/completion/resolve.js +100 -0
- package/dist/src/kernel/completion/resolve.js.map +1 -0
- package/dist/src/kernel/completion/templates/bash.js +209 -0
- package/dist/src/kernel/completion/templates/bash.js.map +1 -0
- package/dist/src/kernel/completion/templates/fish.js +214 -0
- package/dist/src/kernel/completion/templates/fish.js.map +1 -0
- package/dist/src/kernel/completion/templates/index.js +23 -0
- package/dist/src/kernel/completion/templates/index.js.map +1 -0
- package/dist/src/kernel/completion/templates/shared.js +98 -0
- package/dist/src/kernel/completion/templates/shared.js.map +1 -0
- package/dist/src/kernel/completion/templates/zsh.js +201 -0
- package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
- package/dist/src/kernel/completion/types.js +13 -0
- package/dist/src/kernel/completion/types.js.map +1 -0
- package/dist/src/kernel/config/defaults.js +17 -0
- package/dist/src/kernel/config/defaults.js.map +1 -0
- package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
- package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
- package/dist/src/kernel/config/findProjectConfig.js +43 -0
- package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
- package/dist/src/kernel/config/firstRun.js +34 -0
- package/dist/src/kernel/config/firstRun.js.map +1 -0
- package/dist/src/kernel/config/globalConfig.js +79 -0
- package/dist/src/kernel/config/globalConfig.js.map +1 -0
- package/dist/src/kernel/config/index.js +16 -0
- package/dist/src/kernel/config/index.js.map +1 -0
- package/dist/src/kernel/config/paths.js +35 -0
- package/dist/src/kernel/config/paths.js.map +1 -0
- package/dist/src/kernel/config/readConfig.js +78 -0
- package/dist/src/kernel/config/readConfig.js.map +1 -0
- package/dist/src/kernel/config/schema.js +130 -0
- package/dist/src/kernel/config/schema.js.map +1 -0
- package/dist/src/kernel/config/types.js +19 -0
- package/dist/src/kernel/config/types.js.map +1 -0
- package/dist/src/kernel/config/writeConfigField.js +59 -0
- package/dist/src/kernel/config/writeConfigField.js.map +1 -0
- package/dist/src/kernel/copy.js +43 -0
- package/dist/src/kernel/copy.js.map +1 -0
- package/dist/src/kernel/error/PragmaError.js +149 -0
- package/dist/src/kernel/error/PragmaError.js.map +1 -0
- package/dist/src/kernel/error/constants.js +40 -0
- package/dist/src/kernel/error/constants.js.map +1 -0
- package/dist/src/kernel/error/fromTaskError.js +96 -0
- package/dist/src/kernel/error/fromTaskError.js.map +1 -0
- package/dist/src/kernel/error/index.js +13 -0
- package/dist/src/kernel/error/index.js.map +1 -0
- package/dist/src/kernel/error/recovery.js +52 -0
- package/dist/src/kernel/error/recovery.js.map +1 -0
- package/dist/src/kernel/error/renderError.js +115 -0
- package/dist/src/kernel/error/renderError.js.map +1 -0
- package/dist/src/kernel/error/serialize.js +25 -0
- package/dist/src/kernel/error/serialize.js.map +1 -0
- package/dist/src/kernel/error/types.js +9 -0
- package/dist/src/kernel/error/types.js.map +1 -0
- package/dist/src/kernel/index.js +25 -0
- package/dist/src/kernel/index.js.map +1 -0
- package/dist/src/kernel/packs/collect.js +187 -0
- package/dist/src/kernel/packs/collect.js.map +1 -0
- package/dist/src/kernel/packs/compile.js +304 -0
- package/dist/src/kernel/packs/compile.js.map +1 -0
- package/dist/src/kernel/packs/disclosure.js +76 -0
- package/dist/src/kernel/packs/disclosure.js.map +1 -0
- package/dist/src/kernel/packs/glob.js +38 -0
- package/dist/src/kernel/packs/glob.js.map +1 -0
- package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
- package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
- package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
- package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
- package/dist/src/kernel/packs/graphql/index.js +20 -0
- package/dist/src/kernel/packs/graphql/index.js.map +1 -0
- package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
- package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
- package/dist/src/kernel/packs/index.js +34 -0
- package/dist/src/kernel/packs/index.js.map +1 -0
- package/dist/src/kernel/packs/iri.js +110 -0
- package/dist/src/kernel/packs/iri.js.map +1 -0
- package/dist/src/kernel/packs/renderPack.js +129 -0
- package/dist/src/kernel/packs/renderPack.js.map +1 -0
- package/dist/src/kernel/packs/resolveEntity.js +223 -0
- package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
- package/dist/src/kernel/packs/runBodies.js +87 -0
- package/dist/src/kernel/packs/runBodies.js.map +1 -0
- package/dist/src/kernel/packs/sample.js +56 -0
- package/dist/src/kernel/packs/sample.js.map +1 -0
- package/dist/src/kernel/packs/schema.js +369 -0
- package/dist/src/kernel/packs/schema.js.map +1 -0
- package/dist/src/kernel/packs/sparql/applyFilters.js +68 -0
- package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
- package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
- package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
- package/dist/src/kernel/packs/sparql/buildLookupQuery.js +217 -0
- package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
- package/dist/src/kernel/packs/sparql/escape.js +21 -0
- package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
- package/dist/src/kernel/packs/sparql/index.js +31 -0
- package/dist/src/kernel/packs/sparql/index.js.map +1 -0
- package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
- package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
- package/dist/src/kernel/packs/types.js +30 -0
- package/dist/src/kernel/packs/types.js.map +1 -0
- package/dist/src/kernel/packs/uniqueness.js +30 -0
- package/dist/src/kernel/packs/uniqueness.js.map +1 -0
- package/dist/src/kernel/project/cli/buildProgram.js +263 -0
- package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
- package/dist/src/kernel/project/cli/constants.js +27 -0
- package/dist/src/kernel/project/cli/constants.js.map +1 -0
- package/dist/src/kernel/project/cli/dispatch.js +420 -0
- package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
- package/dist/src/kernel/project/cli/exitCodes.js +66 -0
- package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
- package/dist/src/kernel/project/cli/globalFlags.js +216 -0
- package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
- package/dist/src/kernel/project/cli/helpFormat.js +59 -0
- package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
- package/dist/src/kernel/project/cli/index.js +14 -0
- package/dist/src/kernel/project/cli/index.js.map +1 -0
- package/dist/src/kernel/project/cli/rootHelp.js +197 -0
- package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
- package/dist/src/kernel/project/cli/suggest.js +75 -0
- package/dist/src/kernel/project/cli/suggest.js.map +1 -0
- package/dist/src/kernel/project/cli/suggestNames.js +96 -0
- package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
- package/dist/src/kernel/project/cli/verbHelp.js +131 -0
- package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
- package/dist/src/kernel/project/mcp/buildServer.js +67 -0
- package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
- package/dist/src/kernel/project/mcp/envelope.js +37 -0
- package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
- package/dist/src/kernel/project/mcp/index.js +8 -0
- package/dist/src/kernel/project/mcp/index.js.map +1 -0
- package/dist/src/kernel/project/mcp/instructions.js +44 -0
- package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
- package/dist/src/kernel/project/mcp/mcpError.js +42 -0
- package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
- package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
- package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
- package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
- package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
- package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
- package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
- package/dist/src/kernel/project/mcp/registerVerb.js +300 -0
- package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
- package/dist/src/kernel/project/mcp/serve.js +35 -0
- package/dist/src/kernel/project/mcp/serve.js.map +1 -0
- package/dist/src/kernel/render/compactUri.js +24 -0
- package/dist/src/kernel/render/compactUri.js.map +1 -0
- package/dist/src/kernel/render/contracts.js +10 -0
- package/dist/src/kernel/render/contracts.js.map +1 -0
- package/dist/src/kernel/render/disclosure.js +34 -0
- package/dist/src/kernel/render/disclosure.js.map +1 -0
- package/dist/src/kernel/render/envelope.js +30 -0
- package/dist/src/kernel/render/envelope.js.map +1 -0
- package/dist/src/kernel/render/formatters.js +27 -0
- package/dist/src/kernel/render/formatters.js.map +1 -0
- package/dist/src/kernel/render/index.js +15 -0
- package/dist/src/kernel/render/index.js.map +1 -0
- package/dist/src/kernel/render/prefixes.js +46 -0
- package/dist/src/kernel/render/prefixes.js.map +1 -0
- package/dist/src/kernel/render/renderers.js +468 -0
- package/dist/src/kernel/render/renderers.js.map +1 -0
- package/dist/src/kernel/render/style.js +85 -0
- package/dist/src/kernel/render/style.js.map +1 -0
- package/dist/src/kernel/render/turtle.js +194 -0
- package/dist/src/kernel/render/turtle.js.map +1 -0
- package/dist/src/kernel/render/writeStdout.js +43 -0
- package/dist/src/kernel/render/writeStdout.js.map +1 -0
- package/dist/src/kernel/runtime/boot.js +49 -0
- package/dist/src/kernel/runtime/boot.js.map +1 -0
- package/dist/src/kernel/runtime/facade.js +39 -0
- package/dist/src/kernel/runtime/facade.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/build.js +122 -0
- package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
- package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
- package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
- package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/index.js +11 -0
- package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
- package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/read.js +92 -0
- package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
- package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
- package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/types.js +55 -0
- package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
- package/dist/src/kernel/runtime/index.js +8 -0
- package/dist/src/kernel/runtime/index.js.map +1 -0
- package/dist/src/kernel/runtime/loadSession.js +34 -0
- package/dist/src/kernel/runtime/loadSession.js.map +1 -0
- package/dist/src/kernel/runtime/paths.js +78 -0
- package/dist/src/kernel/runtime/paths.js.map +1 -0
- package/dist/src/kernel/runtime/probe.js +37 -0
- package/dist/src/kernel/runtime/probe.js.map +1 -0
- package/dist/src/kernel/runtime/readEntity.js +363 -0
- package/dist/src/kernel/runtime/readEntity.js.map +1 -0
- package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
- package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
- package/dist/src/kernel/runtime/refs/index.js +29 -0
- package/dist/src/kernel/runtime/refs/index.js.map +1 -0
- package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
- package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
- package/dist/src/kernel/runtime/refs/resolve.js +332 -0
- package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
- package/dist/src/kernel/runtime/resolveSources.js +62 -0
- package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
- package/dist/src/kernel/runtime/store.js +75 -0
- package/dist/src/kernel/runtime/store.js.map +1 -0
- package/dist/src/kernel/runtime/storeReadiness.js +51 -0
- package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
- package/dist/src/kernel/runtime/types.js +11 -0
- package/dist/src/kernel/runtime/types.js.map +1 -0
- package/dist/src/kernel/spec/asVerb.js +21 -0
- package/dist/src/kernel/spec/asVerb.js.map +1 -0
- package/dist/src/kernel/spec/emitReference.js +578 -0
- package/dist/src/kernel/spec/emitReference.js.map +1 -0
- package/dist/src/kernel/spec/emitSurface.js +202 -0
- package/dist/src/kernel/spec/emitSurface.js.map +1 -0
- package/dist/src/kernel/spec/index.js +11 -0
- package/dist/src/kernel/spec/index.js.map +1 -0
- package/dist/src/kernel/spec/surfaceConformance.js +103 -0
- package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
- package/dist/src/kernel/spec/types.js +14 -0
- package/dist/src/kernel/spec/types.js.map +1 -0
- package/dist/src/kernel/spec/validate.js +110 -0
- package/dist/src/kernel/spec/validate.js.map +1 -0
- package/dist/src/kernel/vocabulary.js +97 -0
- package/dist/src/kernel/vocabulary.js.map +1 -0
- package/dist/src/types.js +11 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +20 -22
- package/pragma.conf.ts +249 -60
- package/src/bin.ts +267 -82
- package/src/capabilities/block.parity.test.ts +6 -3
- package/src/capabilities/capabilities/capabilities.render.ts +1 -1
- package/src/capabilities/capabilities/capabilities.verb.ts +1 -1
- package/src/capabilities/capabilities/catalog.ts +3 -3
- package/src/capabilities/capabilities/hints.ts +32 -7
- package/src/capabilities/capabilities/index.ts +1 -1
- package/src/capabilities/colophon/collectColophon.ts +35 -24
- package/src/capabilities/colophon/colophon.render.ts +25 -1
- package/src/capabilities/colophon/colophon.test.ts +42 -21
- package/src/capabilities/colophon/colophon.verb.ts +4 -4
- package/src/capabilities/config/collectConfigShow.test.ts +1 -0
- package/src/capabilities/config/collectConfigShow.ts +3 -3
- package/src/capabilities/config/field.render.ts +4 -5
- package/src/capabilities/config/fields.ts +17 -10
- package/src/capabilities/config/get.verb.ts +70 -0
- package/src/capabilities/config/getUnset.test.ts +264 -0
- package/src/capabilities/config/index.ts +5 -1
- package/src/capabilities/config/runField.ts +40 -22
- package/src/capabilities/config/runGet.ts +34 -0
- package/src/capabilities/config/runSet.ts +35 -9
- package/src/capabilities/config/set.test.ts +48 -14
- package/src/capabilities/config/set.verb.ts +8 -7
- package/src/capabilities/config/show.render.ts +1 -1
- package/src/capabilities/config/show.verb.ts +9 -6
- package/src/capabilities/config/types.ts +18 -4
- package/src/capabilities/config/unset.verb.ts +58 -0
- package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
- package/src/capabilities/create/byteEquality.test.ts +25 -11
- package/src/capabilities/create/cliProjection.ts +227 -0
- package/src/capabilities/create/constants.ts +36 -61
- package/src/capabilities/create/create.mcp.test.ts +89 -5
- package/src/capabilities/create/create.render.ts +71 -7
- package/src/capabilities/create/create.test.ts +433 -219
- package/src/capabilities/create/create.verb.ts +297 -328
- package/src/capabilities/create/createGrammar.test.ts +865 -0
- package/src/capabilities/create/createHelp.ts +71 -0
- package/src/capabilities/create/createSurface.generated.ts +400 -0
- package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
- package/src/capabilities/create/cwdJail.test.ts +24 -5
- package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
- package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
- package/src/capabilities/create/index.ts +7 -4
- package/src/capabilities/create/messages.ts +18 -0
- package/src/capabilities/create/mount.ts +391 -0
- package/src/capabilities/create/pathJail.test.ts +90 -0
- package/src/capabilities/create/pathJail.ts +8 -5
- package/src/capabilities/create/pickGenerator.ts +23 -35
- package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
- package/src/capabilities/create/types.ts +20 -0
- package/src/capabilities/distribution.test.ts +3 -1
- package/src/capabilities/distribution.ts +10 -15
- package/src/capabilities/doctor/checks/checkKeStore.ts +7 -5
- package/src/capabilities/doctor/checks/checkPackageRefs.ts +6 -4
- package/src/capabilities/doctor/checks/checkPragmaVersion.ts +2 -2
- package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +72 -27
- package/src/capabilities/doctor/checks/checkShellCompletions.ts +59 -13
- package/src/capabilities/doctor/checks/index.ts +27 -0
- package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
- package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
- package/src/capabilities/doctor/checks/targetHealth.ts +274 -0
- package/src/capabilities/doctor/doctor.render.test.ts +18 -7
- package/src/capabilities/doctor/doctor.render.ts +43 -19
- package/src/capabilities/doctor/doctor.test.ts +123 -34
- package/src/capabilities/doctor/doctor.verb.ts +3 -3
- package/src/capabilities/doctor/runChecks.ts +62 -63
- package/src/capabilities/doctor/types.ts +20 -4
- package/src/capabilities/emptyRecovery.test.ts +13 -8
- package/src/capabilities/graph/examples.exec.test.ts +107 -0
- package/src/capabilities/graph/index.ts +1 -1
- package/src/capabilities/graph/inspect.render.ts +70 -22
- package/src/capabilities/graph/inspect.test.ts +260 -5
- package/src/capabilities/graph/inspect.verb.ts +18 -6
- package/src/capabilities/graph/query.render.ts +15 -3
- package/src/capabilities/graph/query.verb.ts +3 -3
- package/src/capabilities/graph/runQuery.ts +2 -3
- package/src/capabilities/index.ts +3 -1
- package/src/capabilities/info/collectInfo.ts +5 -4
- package/src/capabilities/info/info.render.ts +1 -1
- package/src/capabilities/info/info.verb.ts +1 -1
- package/src/capabilities/lazy.test.ts +32 -0
- package/src/capabilities/meta/complete.verb.ts +1 -1
- package/src/capabilities/meta/index.ts +1 -1
- package/src/capabilities/meta/mcp.verb.ts +10 -8
- package/src/capabilities/ontology/index.ts +15 -11
- package/src/capabilities/ontology/ontology.test.ts +6 -55
- package/src/capabilities/ontology/queries.ts +2 -2
- package/src/capabilities/ontology/render.ts +3 -4
- package/src/capabilities/ontology/verbs.ts +27 -68
- package/src/capabilities/prompt/index.ts +2 -2
- package/src/capabilities/prompt/prompt.render.ts +6 -2
- package/src/capabilities/prompt/types.ts +1 -1
- package/src/capabilities/prompt/verbs.ts +4 -5
- package/src/capabilities/reference.test.ts +63 -0
- package/src/capabilities/resources/provider.ts +342 -85
- package/src/capabilities/resources/resources.test.ts +355 -59
- package/src/capabilities/setup/buildPlan.ts +236 -0
- package/src/capabilities/setup/index.ts +7 -7
- package/src/capabilities/setup/mode.ts +74 -0
- package/src/capabilities/setup/operations/index.ts +74 -0
- package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
- package/src/capabilities/setup/operations/setupConfig.ts +124 -0
- package/src/capabilities/setup/operations/setupGenerator.ts +396 -326
- package/src/capabilities/setup/operations/setupLsp.ts +329 -68
- package/src/capabilities/setup/operations/setupMcp.ts +137 -97
- package/src/capabilities/setup/operations/setupSkills.ts +336 -108
- package/src/capabilities/setup/plan.render.ts +241 -0
- package/src/capabilities/setup/plan.ts +236 -0
- package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
- package/src/capabilities/setup/setup.render.test.ts +281 -73
- package/src/capabilities/setup/setup.render.ts +45 -77
- package/src/capabilities/setup/setup.test.ts +972 -209
- package/src/capabilities/setup/setup.verb.ts +223 -71
- package/src/capabilities/setup/shell.test.ts +86 -0
- package/src/capabilities/setup/shell.ts +137 -11
- package/src/capabilities/setup/targets.ts +367 -0
- package/src/capabilities/setup/types.ts +18 -57
- package/src/capabilities/shared/assertExecOk.ts +68 -10
- package/src/capabilities/shared/index.ts +32 -0
- package/src/capabilities/shared/packageManager.test.ts +55 -0
- package/src/capabilities/shared/packageManager.ts +62 -6
- package/src/capabilities/skill/discover.ts +37 -5
- package/src/capabilities/skill/index.ts +1 -1
- package/src/capabilities/skill/render.ts +10 -9
- package/src/capabilities/skill/skill.test.ts +7 -5
- package/src/capabilities/skill/verbs.ts +3 -4
- package/src/capabilities/sources/collectStatus.ts +7 -2
- package/src/capabilities/sources/index.ts +1 -1
- package/src/capabilities/sources/installSkills.ts +84 -7
- package/src/capabilities/sources/runUpdate.ts +53 -21
- package/src/capabilities/sources/sources.test.ts +154 -2
- package/src/capabilities/sources/status.render.ts +1 -1
- package/src/capabilities/sources/status.verb.ts +1 -1
- package/src/capabilities/sources/update.render.ts +1 -1
- package/src/capabilities/sources/update.verb.ts +1 -1
- package/src/capabilities/surface.test.ts +134 -17
- package/src/capabilities/upgrade/runUpgrade.ts +8 -8
- package/src/capabilities/upgrade/upgrade.render.ts +4 -5
- package/src/capabilities/upgrade/upgrade.test.ts +3 -3
- package/src/capabilities/upgrade/upgrade.verb.ts +1 -1
- package/src/capabilities/version/index.ts +12 -0
- package/src/capabilities/version/version.test.ts +66 -0
- package/src/capabilities/version/version.verb.ts +39 -0
- package/src/constants.ts +31 -1
- package/src/identity.test.ts +40 -25
- package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +15 -13
- package/src/kernel/completion/complete.test.ts +12 -2
- package/src/kernel/completion/complete.ts +1 -1
- package/src/kernel/completion/emitScripts.ts +1 -1
- package/src/kernel/completion/entitySource.test.ts +1 -1
- package/src/kernel/completion/entitySource.ts +21 -8
- package/src/kernel/completion/model.test.ts +164 -12
- package/src/kernel/completion/model.ts +94 -14
- package/src/kernel/completion/parse.test.ts +4 -7
- package/src/kernel/completion/parse.ts +15 -0
- package/src/kernel/completion/resolve.test.ts +0 -1
- package/src/kernel/completion/safety.test.ts +34 -26
- package/src/kernel/completion/shellDrive.test.ts +28 -9
- package/src/kernel/completion/templates/bash.ts +7 -2
- package/src/kernel/completion/templates/index.ts +23 -0
- package/src/kernel/completion/types.ts +7 -0
- package/src/kernel/config/defaults.test.ts +25 -2
- package/src/kernel/config/defaults.ts +4 -3
- package/src/kernel/config/evaluateProjectConfig.ts +31 -8
- package/src/kernel/config/firstRun.test.ts +44 -38
- package/src/kernel/config/firstRun.ts +24 -88
- package/src/kernel/config/index.ts +1 -1
- package/src/kernel/config/readConfig.test.ts +6 -3
- package/src/kernel/config/readConfig.ts +1 -1
- package/src/kernel/config/schema.ts +3 -1
- package/src/kernel/config/types.ts +3 -1
- package/src/kernel/copy.test.ts +34 -4
- package/src/kernel/copy.ts +54 -0
- package/src/kernel/error/PragmaError.test.ts +5 -2
- package/src/kernel/error/PragmaError.ts +4 -2
- package/src/kernel/error/constants.ts +7 -5
- package/src/kernel/error/fromTaskError.ts +28 -6
- package/src/kernel/error/recovery.ts +14 -0
- package/src/kernel/error/renderError.ts +42 -1
- package/src/kernel/error/types.ts +21 -1
- package/src/kernel/index.ts +26 -0
- package/src/kernel/packs/collect.ts +12 -16
- package/src/kernel/packs/compile.test.ts +130 -1
- package/src/kernel/packs/compile.ts +93 -3
- package/src/kernel/packs/disclosure.ts +2 -2
- package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
- package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +3 -4
- package/src/kernel/packs/graphql/index.ts +20 -0
- package/src/kernel/packs/index.ts +40 -0
- package/src/kernel/packs/iri.test.ts +73 -0
- package/src/kernel/packs/iri.ts +66 -14
- package/src/kernel/packs/renderPack.ts +24 -5
- package/src/kernel/packs/resolveEntity.test.ts +213 -0
- package/src/kernel/packs/resolveEntity.ts +112 -18
- package/src/kernel/packs/runBodies.ts +2 -3
- package/src/kernel/packs/sample.ts +1 -1
- package/src/kernel/packs/schema.ts +18 -1
- package/src/kernel/packs/sparql/applyFilters.ts +16 -17
- package/src/kernel/packs/sparql/buildLookupQuery.ts +75 -3
- package/src/kernel/packs/sparql/index.ts +37 -0
- package/src/kernel/packs/sparql/runSelect.test.ts +1 -1
- package/src/kernel/packs/sparql/runSelect.ts +3 -4
- package/src/kernel/packs/toolDescription.test.ts +42 -3
- package/src/kernel/packs/types.ts +13 -0
- package/src/kernel/packs/uniqueness.ts +1 -1
- package/src/kernel/project/cli/buildProgram.test.ts +147 -12
- package/src/kernel/project/cli/buildProgram.ts +77 -18
- package/src/kernel/project/cli/constants.ts +34 -0
- package/src/kernel/project/cli/dispatch.test.ts +160 -3
- package/src/kernel/project/cli/dispatch.ts +222 -42
- package/src/kernel/project/cli/exitCodes.ts +1 -1
- package/src/kernel/project/cli/globalFlags.test.ts +117 -1
- package/src/kernel/project/cli/globalFlags.ts +130 -30
- package/src/kernel/project/cli/helpFormat.ts +13 -0
- package/src/kernel/project/cli/rootHelp.ts +41 -12
- package/src/kernel/project/cli/suggest.test.ts +33 -1
- package/src/kernel/project/cli/suggest.ts +25 -1
- package/src/kernel/project/cli/verbHelp.test.ts +30 -0
- package/src/kernel/project/cli/verbHelp.ts +23 -7
- package/src/kernel/project/mcp/buildServer.ts +7 -4
- package/src/kernel/project/mcp/envelope.ts +2 -2
- package/src/kernel/project/mcp/instructions.ts +2 -2
- package/src/kernel/project/mcp/mcpError.ts +1 -1
- package/src/kernel/project/mcp/parity.test.ts +5 -2
- package/src/kernel/project/mcp/prompts/index.ts +37 -0
- package/src/kernel/project/mcp/prompts/source.ts +2 -2
- package/src/kernel/project/mcp/registerVerb.ts +35 -9
- package/src/kernel/project/mcp/serve.ts +2 -2
- package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
- package/src/kernel/render/contracts.ts +21 -0
- package/src/kernel/render/envelope.ts +2 -3
- package/src/kernel/render/formatters.ts +1 -1
- package/src/kernel/render/renderers.test.ts +243 -6
- package/src/kernel/render/renderers.ts +222 -20
- package/src/kernel/render/style.test.ts +75 -24
- package/src/kernel/render/style.ts +31 -1
- package/src/kernel/render/turtle.ts +222 -0
- package/src/kernel/runtime/graphpack/buildIndex.ts +1 -1
- package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +3 -3
- package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +1 -1
- package/src/kernel/runtime/graphpack/embedded.ts +3 -3
- package/src/kernel/runtime/graphpack/manifest.ts +1 -1
- package/src/kernel/runtime/graphpack/read.ts +1 -2
- package/src/kernel/runtime/loadSession.ts +1 -1
- package/src/kernel/runtime/probe.ts +6 -6
- package/src/kernel/runtime/readEntity.ts +472 -28
- package/src/kernel/runtime/refs/index.ts +39 -0
- package/src/kernel/runtime/refs/parseRef.ts +2 -2
- package/src/kernel/runtime/refs/resolve.ts +4 -4
- package/src/kernel/runtime/storeReadiness.ts +1 -2
- package/src/kernel/runtime/types.ts +15 -1
- package/src/kernel/runtime/wasmEmbed.test.ts +37 -39
- package/src/kernel/spec/emitReference.ts +105 -30
- package/src/kernel/spec/emitSurface.ts +48 -6
- package/src/kernel/spec/surfaceConformance.test.ts +4 -2
- package/src/kernel/spec/types.ts +248 -4
- package/src/testing/behavioral/docExamples.test.ts +14 -0
- package/src/testing/behavioral/errorMatrix.mcp.test.ts +2 -2
- package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
- package/src/testing/behavioral/journeys.cli.test.ts +1 -1
- package/src/testing/behavioral/journeys.defaultPack.test.ts +7 -7
- package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
- package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
- package/src/testing/behavioral/journeys.packageStories.test.ts +4 -4
- package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
- package/src/testing/behavioral/mcpSurface.test.ts +1 -1
- package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
- package/src/testing/eval/cases/effectful.ts +3 -2
- package/src/testing/fixtures/blockGraph.ts +79 -0
- package/src/testing/fixtures/graph/canonical.ts +88 -2
- package/src/testing/fixtures/graph/defaultPack.ts +1 -1
- package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
- package/src/testing/helpers/projectMcp.ts +32 -6
- package/src/testing/helpers/runCli.ts +35 -18
- package/src/testing/perf/budgets.test.ts +20 -9
- package/src/testing/perf/budgets.ts +58 -9
- package/src/testing/perf/codegen.test.ts +126 -0
- package/src/testing/perf/globalSetup.test.ts +286 -0
- package/src/testing/perf/globalSetup.ts +505 -23
- package/src/testing/perf/measure.test.ts +38 -0
- package/src/testing/perf/measure.ts +23 -4
- package/src/testing/setupXdgIsolation.ts +81 -21
- package/src/testing/tempRoot.globalSetup.ts +122 -0
- package/dist/pragma +0 -0
- package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -189
- package/src/capabilities/create/templates.embedded.generated.ts +0 -28
- package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -42
- package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
- package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -68
- package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -61
- package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
- package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
- package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PROTECTED — the shipped-entry `create` guard.
|
|
3
|
+
*
|
|
4
|
+
* Spawns the EMITTED entry the published package points at
|
|
5
|
+
* (`node dist/src/bin.js`) and asserts every `create` noun writes a tree
|
|
6
|
+
* BYTE-IDENTICAL to a source run of the same generator (`bun src/bin.ts …`).
|
|
7
|
+
* The source run is the reference: it reads the `.ejs` templates from disk with
|
|
8
|
+
* no indirection.
|
|
9
|
+
*
|
|
10
|
+
* WHAT THIS REPLACES. Until the distribution stopped shipping a
|
|
11
|
+
* `bun build --compile` executable, this guard covered `create component` only,
|
|
12
|
+
* and its sibling describe pinned the REFUSAL of `create package` /
|
|
13
|
+
* `create application`: those generators call `template({ source })`, summon-core
|
|
14
|
+
* fell through to `readFile(options.source)`, and inside the binary's virtual
|
|
15
|
+
* filesystem that died with `ENOENT … /$bunfs/templates/package.json.ejs` after
|
|
16
|
+
* `mkdir` had already run — a half-made package on the user's disk. The gate
|
|
17
|
+
* existed to turn that crash into a clean refusal.
|
|
18
|
+
*
|
|
19
|
+
* There is no virtual filesystem now. Every generator's templates are real
|
|
20
|
+
* files under its own package, so all three nouns run from the shipped entry and
|
|
21
|
+
* all three are asserted here. THE REFUSAL CASES ARE GONE ON PURPOSE: a test
|
|
22
|
+
* asserting `create package` refuses would now be asserting a defect.
|
|
23
|
+
*
|
|
24
|
+
* The svelte + lit cases stay load-bearing: `types.ts.ejs` / `index.ts.ejs` /
|
|
25
|
+
* `styles.css.ejs` / `stories.ts.ejs` exist in react/, svelte/ AND lit/, so a
|
|
26
|
+
* basename-matching regression could emit the WRONG framework's file. A wrong
|
|
27
|
+
* file differs from the source run → red here.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { execFileSync, spawnSync } from "node:child_process";
|
|
31
|
+
import { mkdtempSync, readdirSync, readFileSync } from "node:fs";
|
|
32
|
+
import { tmpdir } from "node:os";
|
|
33
|
+
import { dirname, join, resolve } from "node:path";
|
|
34
|
+
import { fileURLToPath } from "node:url";
|
|
35
|
+
import { describe, expect, it } from "vitest";
|
|
36
|
+
|
|
37
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
38
|
+
const repoRoot = resolve(here, "../../../../../..");
|
|
39
|
+
const cliNextDir = join(repoRoot, "packages/cli/pragma");
|
|
40
|
+
const sourceEntry = join(cliNextDir, "src/bin.ts");
|
|
41
|
+
const shippedEntry = join(cliNextDir, "dist/src/bin.js");
|
|
42
|
+
const freshCwd = (): string => mkdtempSync(join(tmpdir(), "pragma-shipped-"));
|
|
43
|
+
|
|
44
|
+
// `dist/` is provisioned by `testing/perf/globalSetup.ts`, which re-emits it
|
|
45
|
+
// whenever it is missing or older than `src/**`, `scripts/**`, `pragma.conf.ts`
|
|
46
|
+
// or `package.json` — so these tests exercise the current emit without a second
|
|
47
|
+
// `beforeAll` writing `dist/` in place while another worker is spawning it.
|
|
48
|
+
|
|
49
|
+
/** Read a directory tree into a sorted map of relative path → contents. */
|
|
50
|
+
function snapshot(dir: string): Map<string, string> {
|
|
51
|
+
const out = new Map<string, string>();
|
|
52
|
+
const walk = (d: string, base: string): void => {
|
|
53
|
+
for (const entry of readdirSync(d, { withFileTypes: true }).sort((a, b) =>
|
|
54
|
+
a.name.localeCompare(b.name),
|
|
55
|
+
)) {
|
|
56
|
+
const rel = base ? `${base}/${entry.name}` : entry.name;
|
|
57
|
+
if (entry.isDirectory()) walk(join(d, entry.name), rel);
|
|
58
|
+
else out.set(rel, readFileSync(join(d, entry.name), "utf-8"));
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
walk(dir, "");
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The create invocations under guard — a LITERAL table, deliberately not derived
|
|
67
|
+
* from `create`'s own declaration, so dropping a noun from the surface turns
|
|
68
|
+
* this red rather than silently shrinking the guard.
|
|
69
|
+
*
|
|
70
|
+
* No case installs dependencies (`runInstall` defaults false), so every tree is
|
|
71
|
+
* generator output alone and byte-comparable.
|
|
72
|
+
*/
|
|
73
|
+
const CASES: ReadonlyArray<{ label: string; args: readonly string[] }> = [
|
|
74
|
+
...(["react", "svelte", "lit"] as const).map((framework) => ({
|
|
75
|
+
label: `component ${framework}`,
|
|
76
|
+
// The framework is a PATH SEGMENT, not a flag — `create` mirrors summon's
|
|
77
|
+
// own tree (`summon component react <path>`), so the two CLIs take the
|
|
78
|
+
// same argv.
|
|
79
|
+
args: ["create", "component", framework, "src/components/Widget", "--yes"],
|
|
80
|
+
})),
|
|
81
|
+
{
|
|
82
|
+
label: "package",
|
|
83
|
+
args: ["create", "package", "--name", "@canonical/probe", "--yes"],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
label: "application",
|
|
87
|
+
// `react` is a path segment here too — the declared binding is
|
|
88
|
+
// `application/react`, and the tree mirrors summon's.
|
|
89
|
+
args: ["create", "application", "react", "probeapp", "--yes"],
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
/** Run one create invocation in its own cwd and snapshot what it wrote. */
|
|
94
|
+
function create(
|
|
95
|
+
command: string,
|
|
96
|
+
prefix: readonly string[],
|
|
97
|
+
args: readonly string[],
|
|
98
|
+
): Map<string, string> {
|
|
99
|
+
const dir = freshCwd();
|
|
100
|
+
execFileSync(command, [...prefix, ...args], { cwd: dir, stdio: "pipe" });
|
|
101
|
+
return snapshot(dir);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
describe("shipped pragma create (PROTECTED)", () => {
|
|
105
|
+
for (const { label, args } of CASES) {
|
|
106
|
+
it(`${label}: shipped entry ≡ source run, byte-for-byte`, () => {
|
|
107
|
+
// (1) The shipped entry, exactly as a consumer's `pragma` runs it.
|
|
108
|
+
const shipped = create(process.execPath, [shippedEntry], args);
|
|
109
|
+
// (2) A source run — the reference output.
|
|
110
|
+
const source = create("bun", [sourceEntry], args);
|
|
111
|
+
|
|
112
|
+
// Wrote something. Before the distribution stopped shipping a compiled
|
|
113
|
+
// binary, `package` and `application` wrote NOTHING here — they refused.
|
|
114
|
+
expect(shipped.size).toBeGreaterThan(0);
|
|
115
|
+
// Same file set …
|
|
116
|
+
expect([...shipped.keys()].sort()).toEqual([...source.keys()].sort());
|
|
117
|
+
// … and byte-identical contents.
|
|
118
|
+
for (const [path, content] of shipped) {
|
|
119
|
+
expect(source.get(path), `content of ${path}`).toBe(content);
|
|
120
|
+
}
|
|
121
|
+
}, 180_000);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* PROTECTED — the shipped-entry READ guard (U1-orig).
|
|
127
|
+
*
|
|
128
|
+
* A READ command (`block list`, `--help`) never calls a generator's
|
|
129
|
+
* `generate()`, so — with the generators loading their templates LAZILY on first
|
|
130
|
+
* `generate()` rather than at module-eval — it must never touch a `.ejs` at all.
|
|
131
|
+
* This is the exact gap the create-only smoke above missed: the component
|
|
132
|
+
* generators used to load templates via a top-level `await`, so a READ crashed
|
|
133
|
+
* with `Template not found`. The lazy load makes a READ template-free, and this
|
|
134
|
+
* pins it at the process boundary where an eager load would resurface.
|
|
135
|
+
*/
|
|
136
|
+
describe("shipped pragma READ smoke (PROTECTED)", () => {
|
|
137
|
+
// A cold store cleanly reports STORE_UNAVAILABLE (exit 3); `--help` never needs
|
|
138
|
+
// a store (exit 0). Both fully exercise startup + dispatch — the phase where an
|
|
139
|
+
// eager generator template load would have crashed — without a store or writes.
|
|
140
|
+
const READS: ReadonlyArray<{
|
|
141
|
+
args: readonly string[];
|
|
142
|
+
okExit: readonly number[];
|
|
143
|
+
}> = [
|
|
144
|
+
{ args: ["block", "list"], okExit: [0, 3] },
|
|
145
|
+
{ args: ["--help"], okExit: [0] },
|
|
146
|
+
];
|
|
147
|
+
|
|
148
|
+
for (const { args, okExit } of READS) {
|
|
149
|
+
it(`\`${args.join(" ")}\` runs without a Template-not-found crash`, () => {
|
|
150
|
+
const result = spawnSync(process.execPath, [shippedEntry, ...args], {
|
|
151
|
+
cwd: freshCwd(),
|
|
152
|
+
stdio: "pipe",
|
|
153
|
+
encoding: "utf-8",
|
|
154
|
+
});
|
|
155
|
+
const output = `${result.stdout ?? ""}${result.stderr ?? ""}`;
|
|
156
|
+
// The exact crash the lazy-template fix closes.
|
|
157
|
+
expect(output).not.toMatch(/Template not found/);
|
|
158
|
+
// Nor does it collapse to the internal-bug path (the crash's other tell).
|
|
159
|
+
expect(output).not.toMatch(/Internal error/);
|
|
160
|
+
// It reaches a clean dispatch outcome, not an uncaught startup crash.
|
|
161
|
+
expect(okExit).toContain(result.status);
|
|
162
|
+
}, 30_000);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
@@ -10,3 +10,23 @@ import type { CREATE_GENERATORS } from "./constants.js";
|
|
|
10
10
|
* heavy generator imports — into the static graph.
|
|
11
11
|
*/
|
|
12
12
|
export type CreateKind = keyof typeof CREATE_GENERATORS;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The REGISTERED CLI spelling of one generator prompt, baked into
|
|
16
|
+
* `createSurface.generated.ts` at build time (the build derives it with the
|
|
17
|
+
* same summon-core helpers the mount registers through). Consumers that need
|
|
18
|
+
* only the spelling — completion tokens, the reference's usage lines — read
|
|
19
|
+
* this baked record instead of calling the projection, which keeps the
|
|
20
|
+
* `--help`/`__complete` fast paths free of the registration machinery.
|
|
21
|
+
*/
|
|
22
|
+
export interface PromptCliSyntax {
|
|
23
|
+
/**
|
|
24
|
+
* The registered flag token (`--component-path`; a default-true confirm
|
|
25
|
+
* registers ONLY its `--no-<kebab>` form).
|
|
26
|
+
*/
|
|
27
|
+
readonly flag: string;
|
|
28
|
+
/** Whether the registered flag takes a value (`--styles` does not). */
|
|
29
|
+
readonly takesValue: boolean;
|
|
30
|
+
/** The prompt name's kebab-case CLI spelling (`componentPath` → `component-path`). */
|
|
31
|
+
readonly kebabName: string;
|
|
32
|
+
}
|
|
@@ -33,12 +33,14 @@ function declaredShape(verb: VerbSpec): Record<string, unknown> {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
describe("the distribution's declared stories (PROTECTED)", () => {
|
|
36
|
-
it("declares exactly the
|
|
36
|
+
it("declares exactly the seven domain nouns", () => {
|
|
37
37
|
// Every domain noun is now nothing BUT its story (L-OPEN-9), so a renamed
|
|
38
38
|
// or dropped noun deletes a whole command rather than shrinking one — it
|
|
39
39
|
// must fail HERE.
|
|
40
40
|
expect([...declaredStories.keys()].sort()).toEqual([
|
|
41
41
|
"block",
|
|
42
|
+
"concept",
|
|
43
|
+
"implementation",
|
|
42
44
|
"modifier",
|
|
43
45
|
"standard",
|
|
44
46
|
"tier",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* `pragma.conf.ts` declares them on the packs that supply them; this is the ONE
|
|
5
5
|
* place those declarations become capabilities. They come through the SAME door
|
|
6
|
-
* a third-party story does — {@link
|
|
6
|
+
* a third-party story does — {@link compileStoryModule} — so the mechanism the CLI
|
|
7
7
|
* offers forks is the mechanism the CLI itself runs on.
|
|
8
8
|
*
|
|
9
9
|
* They are compiled STATICALLY rather than merged at dispatch on purpose: the
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* `surface/surface.v2.json` freezes the emitted surface, so a noun that only
|
|
12
12
|
* arrived at dispatch would vanish from help and completion on a fresh install.
|
|
13
13
|
* That is affordable because this module is zod-free and pure — `pragma.conf.ts`
|
|
14
|
-
* is inert data and
|
|
14
|
+
* is inert data and the compiler builds specs without touching the store.
|
|
15
15
|
*
|
|
16
16
|
* Config- and package-declared stories still OVERRIDE these at dispatch; the
|
|
17
17
|
* `story` marker on each module is what tells `assembleEffectiveModules` which
|
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
21
|
import conf from "../../pragma.conf.js";
|
|
22
|
-
import {
|
|
22
|
+
import { compileStoryModule } from "../kernel/packs/compile.js";
|
|
23
23
|
import {
|
|
24
24
|
distributionSource,
|
|
25
25
|
type PackDefinition,
|
|
26
26
|
} from "../kernel/packs/types.js";
|
|
27
|
-
import { DEFAULT_PREFIX_MAP } from "../kernel/render/
|
|
28
|
-
import type { CapabilityModule } from "../kernel/spec/
|
|
27
|
+
import { DEFAULT_PREFIX_MAP } from "../kernel/render/index.js";
|
|
28
|
+
import type { CapabilityModule } from "../kernel/spec/index.js";
|
|
29
29
|
|
|
30
30
|
/** The read stories `pragma.conf.ts` declares on its packs, by noun. */
|
|
31
31
|
export const declaredStories: ReadonlyMap<string, PackDefinition> = new Map(
|
|
@@ -45,15 +45,10 @@ export const declaredStories: ReadonlyMap<string, PackDefinition> = new Map(
|
|
|
45
45
|
export const storyModules: ReadonlyMap<string, CapabilityModule> = new Map(
|
|
46
46
|
[...declaredStories].map(([noun, story]) => [
|
|
47
47
|
noun,
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
distributionSource("pragma.conf.ts"),
|
|
54
|
-
DEFAULT_PREFIX_MAP,
|
|
55
|
-
),
|
|
56
|
-
colophon: story.colophon,
|
|
57
|
-
},
|
|
48
|
+
compileStoryModule(
|
|
49
|
+
story,
|
|
50
|
+
distributionSource("pragma.conf.ts"),
|
|
51
|
+
DEFAULT_PREFIX_MAP,
|
|
52
|
+
),
|
|
58
53
|
]),
|
|
59
54
|
);
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { BIN_NAME } from "../../../constants.js";
|
|
2
2
|
import { entityTotal } from "../../../kernel/completion/entitySource.js";
|
|
3
|
-
import type { PragmaRuntime } from "../../../kernel/runtime/
|
|
3
|
+
import type { PragmaRuntime } from "../../../kernel/runtime/index.js";
|
|
4
4
|
import type { CheckResult } from "../types.js";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* Check that the
|
|
7
|
+
* Check that the local store boots, reporting the entity total and boot time.
|
|
8
|
+
* The check is NAMED "store" in the report — the same word every other surface
|
|
9
|
+
* uses for it; the ke library it boots through is an implementation detail.
|
|
8
10
|
*
|
|
9
11
|
* This is the ONE check that touches the store — it boots the shared lazy store
|
|
10
12
|
* inside a try/catch, so doctor stays storeless-by-default at the dispatch level
|
|
@@ -24,15 +26,15 @@ export async function checkKeStore(rt: PragmaRuntime): Promise<CheckResult> {
|
|
|
24
26
|
const total = entityTotal(session.index);
|
|
25
27
|
const elapsed = Math.round(performance.now() - start);
|
|
26
28
|
return {
|
|
27
|
-
name: "
|
|
29
|
+
name: "store",
|
|
28
30
|
status: "pass",
|
|
29
31
|
detail: `${total.toLocaleString()} entities in ${elapsed}ms`,
|
|
30
32
|
};
|
|
31
33
|
} catch {
|
|
32
34
|
return {
|
|
33
|
-
name: "
|
|
35
|
+
name: "store",
|
|
34
36
|
status: "fail",
|
|
35
|
-
detail: "
|
|
37
|
+
detail: "cannot boot",
|
|
36
38
|
remedy: `Ensure design-system packs are configured and run \`${BIN_NAME} sources update\`.`,
|
|
37
39
|
};
|
|
38
40
|
}
|
|
@@ -20,13 +20,15 @@ import {
|
|
|
20
20
|
entityTotal,
|
|
21
21
|
readPackIndex,
|
|
22
22
|
} from "../../../kernel/completion/entitySource.js";
|
|
23
|
-
import { validateStories } from "../../../kernel/packs/
|
|
24
|
-
import {
|
|
25
|
-
|
|
23
|
+
import { validateStories } from "../../../kernel/packs/index.js";
|
|
24
|
+
import {
|
|
25
|
+
embeddedManifest,
|
|
26
|
+
readManifest,
|
|
27
|
+
} from "../../../kernel/runtime/graphpack/index.js";
|
|
26
28
|
import { activeStories } from "../../../kernel/runtime/graphpack/stories.js";
|
|
29
|
+
import type { PragmaRuntime } from "../../../kernel/runtime/index.js";
|
|
27
30
|
import type { SourcesDecision } from "../../../kernel/runtime/resolveSources.js";
|
|
28
31
|
import { resolveSources } from "../../../kernel/runtime/resolveSources.js";
|
|
29
|
-
import type { PragmaRuntime } from "../../../kernel/runtime/types.js";
|
|
30
32
|
import type { CheckItem, CheckResult } from "../types.js";
|
|
31
33
|
|
|
32
34
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BIN_NAME } from "../../../constants.js";
|
|
2
|
-
import type { PragmaRuntime } from "../../../kernel/runtime/
|
|
3
|
-
import { detectInstallSource } from "../../shared/
|
|
2
|
+
import type { PragmaRuntime } from "../../../kernel/runtime/index.js";
|
|
3
|
+
import { detectInstallSource } from "../../shared/index.js";
|
|
4
4
|
import type { CheckResult } from "../types.js";
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* `checkShellCompletions` — the doctor check that verifies completions are
|
|
3
3
|
* installed AND up to date AND functional.
|
|
4
4
|
*
|
|
5
|
-
* Runs against an isolated HOME and
|
|
5
|
+
* Runs against an isolated HOME and an injected shell so the gates —
|
|
6
6
|
* the resolver effect test, the install probe, and the zsh fpath activation
|
|
7
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
|
|
@@ -22,7 +22,12 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
|
22
22
|
import { emitScripts } from "../../../kernel/completion/emitScripts.js";
|
|
23
23
|
import { capabilities } from "../../index.js";
|
|
24
24
|
import { detectCompletions } from "../../setup/operations/setupCompletions.js";
|
|
25
|
-
import {
|
|
25
|
+
import {
|
|
26
|
+
completionScriptPath,
|
|
27
|
+
type ShellDetection,
|
|
28
|
+
type ShellId,
|
|
29
|
+
} from "../../setup/shell.js";
|
|
30
|
+
import type { CheckResult } from "../types.js";
|
|
26
31
|
import { checkShellCompletions } from "./checkShellCompletions.js";
|
|
27
32
|
|
|
28
33
|
const roots: string[] = [];
|
|
@@ -33,16 +38,21 @@ const tmp = (): string => {
|
|
|
33
38
|
};
|
|
34
39
|
|
|
35
40
|
let prevHome: string | undefined;
|
|
36
|
-
let
|
|
41
|
+
let prevPath: string | undefined;
|
|
37
42
|
beforeEach(() => {
|
|
38
43
|
prevHome = process.env.HOME;
|
|
39
|
-
|
|
44
|
+
prevPath = process.env.PATH;
|
|
40
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;
|
|
41
52
|
});
|
|
42
53
|
afterEach(() => {
|
|
43
54
|
process.env.HOME = prevHome;
|
|
44
|
-
|
|
45
|
-
else process.env.SHELL = prevShell;
|
|
55
|
+
process.env.PATH = prevPath;
|
|
46
56
|
for (const dir of roots) rmSync(dir, { recursive: true, force: true });
|
|
47
57
|
roots.length = 0;
|
|
48
58
|
});
|
|
@@ -59,6 +69,20 @@ function installScript(shell: ShellId): void {
|
|
|
59
69
|
writeScript(shell, emitScripts(capabilities)[shell]);
|
|
60
70
|
}
|
|
61
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));
|
|
84
|
+
}
|
|
85
|
+
|
|
62
86
|
/** Write a `.zshrc` that puts ~/.zfunc on fpath. */
|
|
63
87
|
function wireZfunc(): void {
|
|
64
88
|
writeFileSync(
|
|
@@ -71,34 +95,55 @@ describe("checkShellCompletions — effect test (gate 1)", () => {
|
|
|
71
95
|
it("passes the resolver gate: `pragma <TAB>` resolves nouns", async () => {
|
|
72
96
|
// No shell → skip, but only AFTER the resolver answered — the detail proves
|
|
73
97
|
// the effect test ran and succeeded.
|
|
74
|
-
|
|
75
|
-
const result = await checkShellCompletions(tmp());
|
|
98
|
+
const result = await check(tmp(), null);
|
|
76
99
|
expect(result.status).toBe("skip");
|
|
77
100
|
expect(result.detail).toMatch(/resolver OK/);
|
|
78
101
|
});
|
|
79
102
|
});
|
|
80
103
|
|
|
81
104
|
describe("checkShellCompletions — install probe (gate 2)", () => {
|
|
82
|
-
it("
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
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");
|
|
86
108
|
expect(result.detail).toMatch(/not installed/);
|
|
87
109
|
expect(result.remedy).toBe("pragma setup completions");
|
|
88
110
|
});
|
|
89
111
|
|
|
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 () => {
|
|
128
|
+
installScript("bash");
|
|
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
|
+
|
|
90
135
|
it("passes for bash once the up-to-date script is at its real path", async () => {
|
|
91
|
-
process.env.SHELL = "/usr/bin/bash";
|
|
92
136
|
installScript("bash");
|
|
93
|
-
const result = await
|
|
137
|
+
const result = await check(tmp(), "bash");
|
|
94
138
|
expect(result.status).toBe("pass");
|
|
95
|
-
expect(result.detail).toMatch(
|
|
139
|
+
expect(result.detail).toMatch(
|
|
140
|
+
/bash \(the shell in use\) up to date and resolving/,
|
|
141
|
+
);
|
|
96
142
|
});
|
|
97
143
|
|
|
98
144
|
it("passes for fish once the up-to-date script is at its real path", async () => {
|
|
99
|
-
process.env.SHELL = "/usr/bin/fish";
|
|
100
145
|
installScript("fish");
|
|
101
|
-
const result = await
|
|
146
|
+
const result = await check(tmp(), "fish");
|
|
102
147
|
expect(result.status).toBe("pass");
|
|
103
148
|
});
|
|
104
149
|
|
|
@@ -110,9 +155,8 @@ describe("checkShellCompletions — install probe (gate 2)", () => {
|
|
|
110
155
|
// Every user upgrading across a grammar change lands here: the old script
|
|
111
156
|
// offers the old nouns and misses the new ones, and doctor is the one
|
|
112
157
|
// command whose job is to say so.
|
|
113
|
-
process.env.SHELL = "/usr/bin/bash";
|
|
114
158
|
writeScript("bash", "# STALE JUNK\n");
|
|
115
|
-
const result = await
|
|
159
|
+
const result = await check(tmp(), "bash");
|
|
116
160
|
expect(result.status).toBe("fail");
|
|
117
161
|
expect(result.detail).toMatch(/out of date/);
|
|
118
162
|
expect(result.remedy).toBe("pragma setup completions");
|
|
@@ -127,23 +171,23 @@ describe("checkShellCompletions — install probe (gate 2)", () => {
|
|
|
127
171
|
// failure back rather than closing it. The first assertion is the
|
|
128
172
|
// discriminator — this project really does ask for a different body — so
|
|
129
173
|
// deleting the config write below turns the test red.
|
|
130
|
-
process.env.SHELL = "/usr/bin/bash";
|
|
131
174
|
installScript("bash");
|
|
132
175
|
const cwd = tmp();
|
|
133
176
|
writeFileSync(
|
|
134
177
|
join(cwd, "pragma.config.ts"),
|
|
135
178
|
"export default { completion: { minChars: 5 } };\n",
|
|
136
179
|
);
|
|
137
|
-
expect(
|
|
138
|
-
|
|
180
|
+
expect(
|
|
181
|
+
(await detectCompletions(cwd, { kind: "detected", shell: "bash" })).state,
|
|
182
|
+
).toBe("stale");
|
|
183
|
+
expect((await check(cwd, "bash")).status).toBe("pass");
|
|
139
184
|
});
|
|
140
185
|
});
|
|
141
186
|
|
|
142
187
|
describe("checkShellCompletions — zsh fpath activation (gate 3)", () => {
|
|
143
188
|
it("fails when the zsh script is installed but ~/.zfunc is not on fpath", async () => {
|
|
144
|
-
process.env.SHELL = "/usr/bin/zsh";
|
|
145
189
|
installScript("zsh");
|
|
146
|
-
const result = await
|
|
190
|
+
const result = await check(tmp(), "zsh");
|
|
147
191
|
expect(result.status).toBe("fail");
|
|
148
192
|
expect(result.detail).toMatch(/not on your fpath/);
|
|
149
193
|
// The remedy IS the activation hint — the exact ~/.zshrc lines.
|
|
@@ -151,11 +195,12 @@ describe("checkShellCompletions — zsh fpath activation (gate 3)", () => {
|
|
|
151
195
|
});
|
|
152
196
|
|
|
153
197
|
it("passes once the zsh script is installed AND ~/.zfunc is on fpath", async () => {
|
|
154
|
-
process.env.SHELL = "/usr/bin/zsh";
|
|
155
198
|
installScript("zsh");
|
|
156
199
|
wireZfunc();
|
|
157
|
-
const result = await
|
|
200
|
+
const result = await check(tmp(), "zsh");
|
|
158
201
|
expect(result.status).toBe("pass");
|
|
159
|
-
expect(result.detail).toMatch(
|
|
202
|
+
expect(result.detail).toMatch(
|
|
203
|
+
/zsh \(the shell in use\) up to date and resolving/,
|
|
204
|
+
);
|
|
160
205
|
});
|
|
161
206
|
});
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
runComplete,
|
|
9
9
|
} from "../../../kernel/completion/index.js";
|
|
10
10
|
import { capabilities } from "../../index.js";
|
|
11
|
-
import {
|
|
11
|
+
import type { CompletionsDetection } from "../../setup/operations/index.js";
|
|
12
12
|
import { activationHint, type ShellId } from "../../setup/shell.js";
|
|
13
13
|
import type { CheckResult } from "../types.js";
|
|
14
14
|
|
|
@@ -97,14 +97,26 @@ async function completeProbe(cwd: string): Promise<number> {
|
|
|
97
97
|
* 3. For zsh, `~/.zfunc` is on `$fpath` — the activation step setup can only
|
|
98
98
|
* hint. Installed-but-unwired reports a distinct remedy.
|
|
99
99
|
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
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.
|
|
106
115
|
*/
|
|
107
|
-
export async function checkShellCompletions(
|
|
116
|
+
export async function checkShellCompletions(
|
|
117
|
+
cwd: string,
|
|
118
|
+
d: CompletionsDetection,
|
|
119
|
+
): Promise<CheckResult> {
|
|
108
120
|
// 1. Effect test: the resolver the scripts delegate to must actually answer.
|
|
109
121
|
let candidates: number;
|
|
110
122
|
try {
|
|
@@ -127,19 +139,53 @@ export async function checkShellCompletions(cwd: string): Promise<CheckResult> {
|
|
|
127
139
|
};
|
|
128
140
|
}
|
|
129
141
|
|
|
130
|
-
// 2. The
|
|
131
|
-
|
|
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") {
|
|
147
|
+
return {
|
|
148
|
+
name: NAME,
|
|
149
|
+
status: "skip",
|
|
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.`,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
132
154
|
if (shell === null || path === null) {
|
|
133
155
|
return {
|
|
134
156
|
name: NAME,
|
|
135
157
|
status: "skip",
|
|
136
|
-
detail: "resolver OK;
|
|
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.`,
|
|
137
179
|
};
|
|
138
180
|
}
|
|
139
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.
|
|
140
186
|
return {
|
|
141
187
|
name: NAME,
|
|
142
|
-
status: "
|
|
188
|
+
status: "available",
|
|
143
189
|
detail: `resolver OK; ${shell} script not installed`,
|
|
144
190
|
remedy: INSTALL_REMEDY,
|
|
145
191
|
};
|
|
@@ -166,6 +212,6 @@ export async function checkShellCompletions(cwd: string): Promise<CheckResult> {
|
|
|
166
212
|
return {
|
|
167
213
|
name: NAME,
|
|
168
214
|
status: "pass",
|
|
169
|
-
detail: `${shell} up to date and resolving (${candidates} nouns)`,
|
|
215
|
+
detail: `${shell} (the shell in use) up to date and resolving (${candidates} nouns)`,
|
|
170
216
|
};
|
|
171
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";
|