@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
|
@@ -2,15 +2,25 @@
|
|
|
2
2
|
* Dynamic pack precedence + uniqueness (PROTECTED).
|
|
3
3
|
*
|
|
4
4
|
* Default config ⇒ effective == static (the golden holds, no config read cost on
|
|
5
|
-
* the fast path
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* the fast path, and the distribution's own declarations are compiled exactly
|
|
6
|
+
* once). A config story overrides a story-backed noun or introduces a new one;
|
|
7
|
+
* a story claiming an authored non-story noun, a duplicate noun within one
|
|
8
|
+
* config tier, or any surviving `(noun, verb)` collision is rejected. Across the
|
|
9
|
+
* two config tiers the closer declaration WINS rather than erroring.
|
|
8
10
|
*/
|
|
9
11
|
|
|
12
|
+
import { mkdtempSync } from "node:fs";
|
|
13
|
+
import { tmpdir } from "node:os";
|
|
14
|
+
import { join } from "node:path";
|
|
10
15
|
import { describe, expect, it } from "vitest";
|
|
16
|
+
import { capabilities } from "../../capabilities/index.js";
|
|
11
17
|
import type { ConfigLayers } from "../config/types.js";
|
|
12
18
|
import type { CapabilityModule, VerbSpec } from "../spec/types.js";
|
|
13
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
assembleEffectiveModules,
|
|
21
|
+
loadEffectiveModules,
|
|
22
|
+
validateStories,
|
|
23
|
+
} from "./collect.js";
|
|
14
24
|
import { assertUniqueVerbs } from "./uniqueness.js";
|
|
15
25
|
|
|
16
26
|
/** A trivial storeless verb for a fake authored module. */
|
|
@@ -33,7 +43,9 @@ function fakeVerb(noun: string, verb?: string): VerbSpec {
|
|
|
33
43
|
|
|
34
44
|
const STATIC: CapabilityModule[] = [
|
|
35
45
|
{ name: "config", verbs: [fakeVerb("config", "show")] },
|
|
36
|
-
|
|
46
|
+
// `story: true` marks a module compiled from a declared story — the ONLY
|
|
47
|
+
// kind a config/package story may replace.
|
|
48
|
+
{ name: "standard", story: true, verbs: [fakeVerb("standard", "list")] },
|
|
37
49
|
];
|
|
38
50
|
|
|
39
51
|
function layers(stories: unknown[]): ConfigLayers {
|
|
@@ -43,16 +55,36 @@ function layers(stories: unknown[]): ConfigLayers {
|
|
|
43
55
|
tier: "default",
|
|
44
56
|
channel: "default",
|
|
45
57
|
detail: "default",
|
|
46
|
-
|
|
58
|
+
packs: "default",
|
|
47
59
|
stories: stories.length > 0 ? "project" : "default",
|
|
48
60
|
prefixes: "default",
|
|
49
|
-
prompts: "default",
|
|
50
61
|
},
|
|
51
62
|
global: { path: "", exists: false },
|
|
52
63
|
project: { exists: false },
|
|
53
64
|
};
|
|
54
65
|
}
|
|
55
66
|
|
|
67
|
+
/**
|
|
68
|
+
* Config layers where the PROJECT declares `packs`, with stories on the pack
|
|
69
|
+
* entry and optionally at the top level (the stronger tier).
|
|
70
|
+
*/
|
|
71
|
+
function packLayers(
|
|
72
|
+
packStories: unknown[],
|
|
73
|
+
topLevel: unknown[] = [],
|
|
74
|
+
): ConfigLayers {
|
|
75
|
+
const base = layers(topLevel);
|
|
76
|
+
return {
|
|
77
|
+
...base,
|
|
78
|
+
config: {
|
|
79
|
+
...base.config,
|
|
80
|
+
packs: [
|
|
81
|
+
{ name: "recipes", source: "file:///recipes", stories: packStories },
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
origins: { ...base.origins, packs: "project" },
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
56
88
|
const validPack = (noun: string) => ({
|
|
57
89
|
noun,
|
|
58
90
|
list: {
|
|
@@ -66,13 +98,13 @@ describe("assembleEffectiveModules (PROTECTED)", () => {
|
|
|
66
98
|
expect(assembleEffectiveModules(STATIC, layers([]))).toBe(STATIC);
|
|
67
99
|
});
|
|
68
100
|
|
|
69
|
-
it("a config story overrides a
|
|
101
|
+
it("a config story overrides a story-backed noun", () => {
|
|
70
102
|
const effective = assembleEffectiveModules(
|
|
71
103
|
STATIC,
|
|
72
104
|
layers([validPack("standard")]),
|
|
73
105
|
);
|
|
74
106
|
const standard = effective.find((m) => m.name === "standard");
|
|
75
|
-
// The
|
|
107
|
+
// The static `standard` module was replaced by the config pack (source
|
|
76
108
|
// "config"); it still owns exactly `standard list`.
|
|
77
109
|
expect(standard?.verbs.map((v) => v.path.join(" "))).toEqual([
|
|
78
110
|
"standard list",
|
|
@@ -104,13 +136,13 @@ describe("assembleEffectiveModules (PROTECTED)", () => {
|
|
|
104
136
|
expect(plain.find((m) => m.name === "stew")?.colophon).toBeUndefined();
|
|
105
137
|
});
|
|
106
138
|
|
|
107
|
-
it("rejects a story claiming
|
|
139
|
+
it("rejects a story claiming an authored non-story noun", () => {
|
|
108
140
|
expect(() =>
|
|
109
141
|
assembleEffectiveModules(STATIC, layers([validPack("config")])),
|
|
110
142
|
).toThrow(/built-in command/);
|
|
111
143
|
});
|
|
112
144
|
|
|
113
|
-
it("rejects a duplicate story noun", () => {
|
|
145
|
+
it("rejects a duplicate story noun within one config tier", () => {
|
|
114
146
|
expect(() =>
|
|
115
147
|
assembleEffectiveModules(
|
|
116
148
|
STATIC,
|
|
@@ -119,6 +151,34 @@ describe("assembleEffectiveModules (PROTECTED)", () => {
|
|
|
119
151
|
).toThrow(/Duplicate/);
|
|
120
152
|
});
|
|
121
153
|
|
|
154
|
+
it("a story declared on a config pack contributes its noun", () => {
|
|
155
|
+
const effective = assembleEffectiveModules(
|
|
156
|
+
STATIC,
|
|
157
|
+
packLayers([validPack("recipe")]),
|
|
158
|
+
);
|
|
159
|
+
expect(effective.map((m) => m.name).sort()).toEqual([
|
|
160
|
+
"config",
|
|
161
|
+
"recipe",
|
|
162
|
+
"standard",
|
|
163
|
+
]);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it("the top-level stories tier overrides packs[].stories for one noun", () => {
|
|
167
|
+
// Two config sources naming one noun is a REFINEMENT, not a conflict: the
|
|
168
|
+
// more specific (top-level) declaration wins and nothing throws.
|
|
169
|
+
const effective = assembleEffectiveModules(
|
|
170
|
+
STATIC,
|
|
171
|
+
packLayers(
|
|
172
|
+
[{ ...validPack("recipe"), colophon: "declared on the pack" }],
|
|
173
|
+
[{ ...validPack("recipe"), colophon: "declared by the project" }],
|
|
174
|
+
),
|
|
175
|
+
);
|
|
176
|
+
expect(effective.filter((m) => m.name === "recipe")).toHaveLength(1);
|
|
177
|
+
expect(effective.find((m) => m.name === "recipe")?.colophon).toBe(
|
|
178
|
+
"declared by the project",
|
|
179
|
+
);
|
|
180
|
+
});
|
|
181
|
+
|
|
122
182
|
it("rejects an invalid story pack (via the zod validator)", () => {
|
|
123
183
|
expect(() =>
|
|
124
184
|
assembleEffectiveModules(STATIC, layers([{ noun: "Bad Noun" }])),
|
|
@@ -126,6 +186,130 @@ describe("assembleEffectiveModules (PROTECTED)", () => {
|
|
|
126
186
|
});
|
|
127
187
|
});
|
|
128
188
|
|
|
189
|
+
describe("validateStories — package stories NEVER throw (PROTECTED)", () => {
|
|
190
|
+
const record = (source: string, content: string) => ({ source, content });
|
|
191
|
+
|
|
192
|
+
it("drops an unparseable AND a schema-invalid story, keeping the valid one", () => {
|
|
193
|
+
// Both bad shapes in ONE case, deliberately: guarding the malformed file
|
|
194
|
+
// and letting the schema-invalid one through is exactly how a third-party
|
|
195
|
+
// story once bricked every command, `sources update` and `doctor` included.
|
|
196
|
+
const result = validateStories(
|
|
197
|
+
[
|
|
198
|
+
record("pkg/stories/broken.json", "{ not json"),
|
|
199
|
+
record("pkg/stories/invalid.json", '{"noun":"Bad Noun","list":{}}'),
|
|
200
|
+
record("pkg/stories/recipe.json", JSON.stringify(validPack("recipe"))),
|
|
201
|
+
],
|
|
202
|
+
STATIC,
|
|
203
|
+
);
|
|
204
|
+
expect(result.entries.map((entry) => entry.definition.noun)).toEqual([
|
|
205
|
+
"recipe",
|
|
206
|
+
]);
|
|
207
|
+
expect(result.problems.map((problem) => problem.source)).toEqual([
|
|
208
|
+
"pkg/stories/broken.json",
|
|
209
|
+
"pkg/stories/invalid.json",
|
|
210
|
+
]);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it("last declaration wins for a noun, and the shadowed file is reported", () => {
|
|
214
|
+
const result = validateStories(
|
|
215
|
+
[
|
|
216
|
+
record("a/stories/recipe.json", JSON.stringify(validPack("recipe"))),
|
|
217
|
+
record(
|
|
218
|
+
"b/stories/recipe.json",
|
|
219
|
+
JSON.stringify({ ...validPack("recipe"), colophon: "from b" }),
|
|
220
|
+
),
|
|
221
|
+
],
|
|
222
|
+
STATIC,
|
|
223
|
+
);
|
|
224
|
+
expect(result.entries).toHaveLength(1);
|
|
225
|
+
expect(result.entries.at(0)?.source).toBe("b/stories/recipe.json");
|
|
226
|
+
expect(result.problems.at(0)?.source).toBe("a/stories/recipe.json");
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it("refuses ANY noun the CLI already ships, without throwing", () => {
|
|
230
|
+
// Authored (`config`) and story-backed (`standard`) alike. A package may
|
|
231
|
+
// only ADD a noun: `assembleEffectiveModules` replaces a noun WHOLESALE, so
|
|
232
|
+
// a package claiming `standard` would swap this distribution's code-standard
|
|
233
|
+
// reads for its own in a project that did nothing but declare a dependency.
|
|
234
|
+
// Overriding a shipped noun stays a config decision.
|
|
235
|
+
const result = validateStories(
|
|
236
|
+
[
|
|
237
|
+
record("pkg/stories/config.json", JSON.stringify(validPack("config"))),
|
|
238
|
+
record(
|
|
239
|
+
"pkg/stories/standard.json",
|
|
240
|
+
JSON.stringify(validPack("standard")),
|
|
241
|
+
),
|
|
242
|
+
],
|
|
243
|
+
STATIC,
|
|
244
|
+
);
|
|
245
|
+
expect(result.entries).toEqual([]);
|
|
246
|
+
expect(result.problems.map((problem) => problem.message)).toEqual([
|
|
247
|
+
'its noun "config" is a command this CLI already ships and cannot be replaced by a package.',
|
|
248
|
+
'its noun "standard" is a command this CLI already ships and cannot be replaced by a package.',
|
|
249
|
+
]);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
it("leaves a declared noun's shipped verbs intact against a package claim", () => {
|
|
253
|
+
// The real registry, not a fixture. `token` used to be a COMPOSITE and this
|
|
254
|
+
// case guarded its hand-written `add-config` mutation; L-OPEN-9 removed that
|
|
255
|
+
// verb, so the same package-claim mechanics are now asserted against the
|
|
256
|
+
// story's own verbs — which is the case that still matters, since after the
|
|
257
|
+
// removal EVERY data noun is story-backed and a wholesale replacement is the
|
|
258
|
+
// only way one could be lost.
|
|
259
|
+
const before = capabilities.find((module) => module.name === "token");
|
|
260
|
+
expect(before?.verbs.map((verb) => verb.path.join(" "))).toEqual([
|
|
261
|
+
"token list",
|
|
262
|
+
"token lookup",
|
|
263
|
+
"token sample",
|
|
264
|
+
]);
|
|
265
|
+
const { entries, problems } = validateStories(
|
|
266
|
+
[record("pkg/stories/token.json", JSON.stringify(validPack("token")))],
|
|
267
|
+
capabilities,
|
|
268
|
+
);
|
|
269
|
+
expect(entries).toEqual([]);
|
|
270
|
+
expect(problems.at(0)?.source).toBe("pkg/stories/token.json");
|
|
271
|
+
const after = assembleEffectiveModules(capabilities, layers([]), entries);
|
|
272
|
+
expect(
|
|
273
|
+
after
|
|
274
|
+
.find((module) => module.name === "token")
|
|
275
|
+
?.verbs.map((verb) => verb.path.join(" ")),
|
|
276
|
+
).toEqual(before?.verbs.map((verb) => verb.path.join(" ")));
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
it("a config story still REPLACES a package one for the same noun", () => {
|
|
280
|
+
const { entries } = validateStories(
|
|
281
|
+
[record("pkg/stories/recipe.json", JSON.stringify(validPack("recipe")))],
|
|
282
|
+
STATIC,
|
|
283
|
+
);
|
|
284
|
+
const effective = assembleEffectiveModules(
|
|
285
|
+
STATIC,
|
|
286
|
+
layers([{ ...validPack("recipe"), colophon: "from the project" }]),
|
|
287
|
+
entries,
|
|
288
|
+
);
|
|
289
|
+
expect(effective.filter((m) => m.name === "recipe")).toHaveLength(1);
|
|
290
|
+
expect(effective.find((m) => m.name === "recipe")?.colophon).toBe(
|
|
291
|
+
"from the project",
|
|
292
|
+
);
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
describe("the default layer's stories are compiled exactly once (PROTECTED)", () => {
|
|
297
|
+
it("a fresh cwd's effective modules ARE the static capabilities", async () => {
|
|
298
|
+
// `pragma.conf.ts` declares the distribution's own stories on its packs,
|
|
299
|
+
// and `capabilities/distribution.ts` has already compiled them into the
|
|
300
|
+
// static set — that is what keeps those nouns on the `--help`/`__complete`
|
|
301
|
+
// fast path. Re-merging them at dispatch would recompile and re-validate
|
|
302
|
+
// them on every command, and would put the distribution's own declarations
|
|
303
|
+
// behind a validator whose failure is fatal. Identity (`toBe`), not
|
|
304
|
+
// equality, is the assertion: nothing was rebuilt.
|
|
305
|
+
const cwd = mkdtempSync(join(tmpdir(), "pragma-carve-out-"));
|
|
306
|
+
const { modules, problems } = await loadEffectiveModules(capabilities, cwd);
|
|
307
|
+
expect(modules).toBe(capabilities);
|
|
308
|
+
// The embedded snapshot carries no package stories, so nothing to report.
|
|
309
|
+
expect(problems).toEqual([]);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
|
|
129
313
|
describe("assertUniqueVerbs (PROTECTED)", () => {
|
|
130
314
|
it("passes disjoint verbs and catches a collision", () => {
|
|
131
315
|
expect(() =>
|
|
@@ -1,108 +1,259 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Assemble the EFFECTIVE capability modules at dispatch.
|
|
3
3
|
*
|
|
4
|
-
* The `--help`/`__complete` fast paths use the STATIC capabilities (
|
|
5
|
-
* authored
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* surviving `(noun, verb)`
|
|
4
|
+
* The `--help`/`__complete` fast paths use the STATIC capabilities (the
|
|
5
|
+
* authored modules plus the stories `pragma.conf.ts` declares, compiled at
|
|
6
|
+
* module load) only. When a real command runs, this merges in the stories the
|
|
7
|
+
* PROJECT declares: one may override a story-backed noun (replacing that
|
|
8
|
+
* module) or introduce a new one; one that claims an authored, non-story noun
|
|
9
|
+
* (config, ontology, …) is a hard error, and any surviving `(noun, verb)`
|
|
10
|
+
* collision is caught by uniqueness.
|
|
10
11
|
*
|
|
11
|
-
* Precedence is config > package >
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
* Precedence is config > package > static, and within config the closer
|
|
13
|
+
* declaration wins: `packs[].stories` (the story a declared pack supplies) is
|
|
14
|
+
* overridden by the top-level `stories` (the project's own, most specific,
|
|
15
|
+
* statement). PACKAGE stories — the `stories/*.json` the answering pack carries
|
|
16
|
+
* — are third-party data, so they go through {@link validateStories}, which
|
|
17
|
+
* drops a bad one with a reported problem, CANNOT throw, and lets a package
|
|
18
|
+
* ADD a noun but never replace one the CLI ships. Config stories stay fatal and
|
|
19
|
+
* may override: the user owns those, and a broken `pragma.config.ts` already
|
|
20
|
+
* fails every command.
|
|
14
21
|
*
|
|
15
22
|
* zod is reached only through {@link parsePackDefinition} (lazy) — this module
|
|
16
23
|
* is imported at dispatch, never on the fast path, so validating config stories
|
|
17
24
|
* costs nothing on `--help`/`__complete`.
|
|
18
25
|
*/
|
|
19
26
|
|
|
20
|
-
import type { ConfigLayers } from "../config/
|
|
21
|
-
import { PragmaError } from "../error/
|
|
22
|
-
import type {
|
|
23
|
-
import {
|
|
27
|
+
import type { ConfigLayers } from "../config/index.js";
|
|
28
|
+
import { PragmaError } from "../error/index.js";
|
|
29
|
+
import type { PackStoryRecord } from "../runtime/graphpack/stories.js";
|
|
30
|
+
import type { CapabilityModule } from "../spec/index.js";
|
|
31
|
+
import { compileStoryModule } from "./compile.js";
|
|
24
32
|
import { parsePackDefinition } from "./schema.js";
|
|
25
|
-
import type { PackDefinition } from "./types.js";
|
|
33
|
+
import type { PackDefinition, PackEntry } from "./types.js";
|
|
26
34
|
import { assertUniqueVerbs } from "./uniqueness.js";
|
|
27
35
|
|
|
28
|
-
/**
|
|
29
|
-
export
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
+
/** One package-declared story that could not be used, and why. */
|
|
37
|
+
export interface StoryProblem {
|
|
38
|
+
/** The story file, e.g. `@acme/recipes/stories/recipe.json`. */
|
|
39
|
+
readonly source: string;
|
|
40
|
+
/** Why it was ignored, in one sentence. */
|
|
41
|
+
readonly message: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** The outcome of validating the stories a pack carries. */
|
|
45
|
+
interface ValidatedStories {
|
|
46
|
+
/** The stories that can be used, one per noun. */
|
|
47
|
+
readonly entries: readonly PackEntry[];
|
|
48
|
+
/** The ones that were ignored, each with its reason. */
|
|
49
|
+
readonly problems: readonly StoryProblem[];
|
|
50
|
+
}
|
|
36
51
|
|
|
37
52
|
/**
|
|
38
|
-
*
|
|
53
|
+
* Turn pack-carried story records into usable entries, DROPPING (never throwing
|
|
54
|
+
* on) the ones that cannot be used.
|
|
55
|
+
*
|
|
56
|
+
* TOTAL by construction: `JSON.parse` and `parsePackDefinition` happen inside
|
|
57
|
+
* ONE try per record, so a malformed file and a schema-invalid one are handled
|
|
58
|
+
* identically. That is not a nicety — package stories reach dispatch before the
|
|
59
|
+
* command tree exists, so a throw here would fail EVERY command, including
|
|
60
|
+
* `sources update` and `doctor`, the only two that can recover from it.
|
|
39
61
|
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
62
|
+
* Two packages claiming one noun: the last declared wins and the shadowed one
|
|
63
|
+
* is reported, through this same channel.
|
|
64
|
+
*
|
|
65
|
+
* A package story may only introduce a NOUN THE CLI DOES NOT HAVE. Every static
|
|
66
|
+
* noun is reserved — the kernel's own AND the ones the distribution declares as
|
|
67
|
+
* stories — because the merge replaces a noun WHOLESALE: a package claiming
|
|
68
|
+
* `block` would swap this distribution's design-system reads for its own in a
|
|
69
|
+
* project that did nothing but declare a dependency. Overriding a shipped noun
|
|
70
|
+
* stays a CONFIG decision — that file is the user's own.
|
|
71
|
+
*
|
|
72
|
+
* @param records - The raw story records the answering pack carries.
|
|
73
|
+
* @param staticModules - The static capabilities, to detect a story claiming a
|
|
74
|
+
* noun the CLI already ships.
|
|
75
|
+
* @returns The usable entries and the problems, both possibly empty.
|
|
76
|
+
*/
|
|
77
|
+
export function validateStories(
|
|
78
|
+
records: readonly PackStoryRecord[],
|
|
79
|
+
staticModules: readonly CapabilityModule[],
|
|
80
|
+
): ValidatedStories {
|
|
81
|
+
const reserved = new Set(staticModules.map((module) => module.name));
|
|
82
|
+
const byNoun = new Map<string, PackEntry>();
|
|
83
|
+
const problems: StoryProblem[] = [];
|
|
84
|
+
for (const record of records) {
|
|
85
|
+
try {
|
|
86
|
+
const definition = parsePackDefinition(
|
|
87
|
+
JSON.parse(record.content),
|
|
88
|
+
record.source,
|
|
89
|
+
);
|
|
90
|
+
if (reserved.has(definition.noun)) {
|
|
91
|
+
problems.push({
|
|
92
|
+
source: record.source,
|
|
93
|
+
message: `its noun "${definition.noun}" is a command this CLI already ships and cannot be replaced by a package.`,
|
|
94
|
+
});
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const shadowed = byNoun.get(definition.noun);
|
|
98
|
+
if (shadowed) {
|
|
99
|
+
problems.push({
|
|
100
|
+
source: shadowed.source,
|
|
101
|
+
message: `its "${definition.noun}" story is shadowed by ${record.source}.`,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
byNoun.set(definition.noun, { source: record.source, definition });
|
|
105
|
+
} catch (error) {
|
|
106
|
+
problems.push({
|
|
107
|
+
source: record.source,
|
|
108
|
+
message: error instanceof Error ? error.message : String(error),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return { entries: [...byNoun.values()], problems };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* The PROJECT's config-declared stories, weakest tier first.
|
|
117
|
+
*
|
|
118
|
+
* A tier whose origin is `"default"` is the DISTRIBUTION's own declaration,
|
|
119
|
+
* which `capabilities/distribution.ts` has already compiled into the static
|
|
120
|
+
* modules — that is what keeps those nouns on the `--help`/`__complete` fast
|
|
121
|
+
* path. Merging it again would recompile and re-validate it on every dispatch,
|
|
122
|
+
* and would put the distribution's own declarations behind a validator whose
|
|
123
|
+
* failure is fatal. `readConfig`'s per-field pick replaces wholesale, so an
|
|
124
|
+
* origin off `"default"` means the project (or global layer) owns that field.
|
|
125
|
+
*
|
|
126
|
+
* @param layers - The resolved config layers.
|
|
127
|
+
* @returns The `packs[].stories` tier, then the top-level `stories` tier.
|
|
128
|
+
*/
|
|
129
|
+
function projectStoryTiers(layers: ConfigLayers): readonly unknown[][] {
|
|
130
|
+
const packStories =
|
|
131
|
+
layers.origins.packs === "default"
|
|
132
|
+
? []
|
|
133
|
+
: (layers.config.packs ?? []).flatMap((pack) =>
|
|
134
|
+
typeof pack === "string" ? [] : (pack.stories ?? []),
|
|
135
|
+
);
|
|
136
|
+
const topLevel =
|
|
137
|
+
layers.origins.stories === "default" ? [] : (layers.config.stories ?? []);
|
|
138
|
+
return [[...packStories], [...topLevel]];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Merge the package- and config-declared story packs into the static capabilities.
|
|
143
|
+
*
|
|
144
|
+
* @param staticModules - The static capabilities (authored + declared stories).
|
|
145
|
+
* @param layers - The resolved config layers (its `packs`, `stories`, `prefixes`).
|
|
146
|
+
* @param packageStories - The already-validated stories the answering pack
|
|
147
|
+
* carries (see {@link validateStories}); weaker than either config tier.
|
|
42
148
|
* @returns The effective modules, uniqueness-checked.
|
|
43
|
-
* @throws PragmaError CONFIG_ERROR on an invalid story, a story
|
|
44
|
-
* non-
|
|
149
|
+
* @throws PragmaError CONFIG_ERROR on an invalid CONFIG story, a config story
|
|
150
|
+
* claiming an authored non-story noun, or a duplicate noun within one config
|
|
151
|
+
* tier. Package stories were already screened and never throw here.
|
|
45
152
|
*/
|
|
46
153
|
export function assembleEffectiveModules(
|
|
47
154
|
staticModules: readonly CapabilityModule[],
|
|
48
155
|
layers: ConfigLayers,
|
|
156
|
+
packageStories: readonly PackEntry[] = [],
|
|
49
157
|
): readonly CapabilityModule[] {
|
|
50
|
-
const
|
|
51
|
-
if (
|
|
158
|
+
const tiers = projectStoryTiers(layers);
|
|
159
|
+
if (packageStories.length === 0 && tiers.every((tier) => tier.length === 0)) {
|
|
160
|
+
return staticModules;
|
|
161
|
+
}
|
|
52
162
|
|
|
53
163
|
const prefixes = layers.config.prefixes ?? {};
|
|
54
|
-
|
|
164
|
+
// Only a module compiled from a story may be replaced by one; the authored
|
|
165
|
+
// nouns (config, ontology, doctor, …) are the CLI itself.
|
|
166
|
+
const overridable = new Set(
|
|
167
|
+
staticModules.filter((module) => module.story).map((module) => module.name),
|
|
168
|
+
);
|
|
55
169
|
const staticNouns = new Set(staticModules.map((module) => module.name));
|
|
56
170
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
171
|
+
// Keyed by noun so the stronger tier REPLACES the weaker one — declaring a
|
|
172
|
+
// story both on its pack and at the top level is a refinement, not an error.
|
|
173
|
+
const dynamic = new Map<string, CapabilityModule>();
|
|
174
|
+
for (const entry of packageStories) {
|
|
175
|
+
dynamic.set(
|
|
176
|
+
entry.definition.noun,
|
|
177
|
+
compileStoryModule(
|
|
178
|
+
entry.definition,
|
|
179
|
+
{ label: entry.source, origin: "package" },
|
|
180
|
+
prefixes,
|
|
181
|
+
),
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
for (const tier of tiers) {
|
|
185
|
+
const seen = new Set<string>();
|
|
186
|
+
for (const raw of tier) {
|
|
187
|
+
const definition: PackDefinition = parsePackDefinition(raw, "config");
|
|
188
|
+
if (seen.has(definition.noun)) {
|
|
189
|
+
throw PragmaError.configError(
|
|
190
|
+
`Duplicate story noun "${definition.noun}" in config.`,
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
if (
|
|
194
|
+
staticNouns.has(definition.noun) &&
|
|
195
|
+
!overridable.has(definition.noun)
|
|
196
|
+
) {
|
|
197
|
+
throw PragmaError.configError(
|
|
198
|
+
`Story noun "${definition.noun}" collides with a built-in command.`,
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
seen.add(definition.noun);
|
|
202
|
+
dynamic.set(
|
|
203
|
+
definition.noun,
|
|
204
|
+
compileStoryModule(
|
|
205
|
+
definition,
|
|
206
|
+
{ label: "config", origin: "config" },
|
|
207
|
+
prefixes,
|
|
208
|
+
),
|
|
69
209
|
);
|
|
70
210
|
}
|
|
71
|
-
seen.add(definition.noun);
|
|
72
|
-
dynamic.push({
|
|
73
|
-
name: definition.noun,
|
|
74
|
-
verbs: compilePack(definition, "config", prefixes),
|
|
75
|
-
colophon: definition.colophon,
|
|
76
|
-
});
|
|
77
211
|
}
|
|
78
212
|
|
|
79
|
-
// Drop the
|
|
213
|
+
// Drop the static module for any noun a config story overrides, then append
|
|
80
214
|
// the dynamic modules.
|
|
81
|
-
const kept = staticModules.filter((module) => !
|
|
82
|
-
const effective = [...kept, ...dynamic];
|
|
215
|
+
const kept = staticModules.filter((module) => !dynamic.has(module.name));
|
|
216
|
+
const effective = [...kept, ...dynamic.values()];
|
|
83
217
|
assertUniqueVerbs(effective.flatMap((module) => [...module.verbs]));
|
|
84
218
|
return effective;
|
|
85
219
|
}
|
|
86
220
|
|
|
87
221
|
/**
|
|
88
222
|
* Load the effective modules for a real invocation: read the layered config and
|
|
89
|
-
*
|
|
223
|
+
* the answering pack's carried stories, and merge both into the static
|
|
224
|
+
* capabilities.
|
|
90
225
|
*
|
|
91
226
|
* Reached only at DISPATCH (real command / MCP serve), never on the
|
|
92
|
-
* `--help`/`__complete` fast path, so the config read and zod
|
|
93
|
-
* cost the storeless paths. The
|
|
94
|
-
* this module's static graph free of
|
|
227
|
+
* `--help`/`__complete` fast path, so the config read, the pack read and zod
|
|
228
|
+
* validation never cost the storeless paths. The runtime pieces are
|
|
229
|
+
* dynamic-imported to keep even this module's static graph free of them.
|
|
95
230
|
*
|
|
96
|
-
* @param staticModules - The static capabilities (
|
|
231
|
+
* @param staticModules - The static capabilities (authored + declared stories).
|
|
97
232
|
* @param cwd - The directory to resolve project config against.
|
|
98
|
-
* @returns The effective modules
|
|
99
|
-
*
|
|
233
|
+
* @returns The effective modules, plus the package stories that were ignored —
|
|
234
|
+
* callers surface those on stderr rather than failing the command.
|
|
235
|
+
* @note Impure — reads the project/global config and the answering pack.
|
|
100
236
|
*/
|
|
101
237
|
export async function loadEffectiveModules(
|
|
102
238
|
staticModules: readonly CapabilityModule[],
|
|
103
239
|
cwd: string,
|
|
104
|
-
): Promise<
|
|
105
|
-
|
|
240
|
+
): Promise<{
|
|
241
|
+
readonly modules: readonly CapabilityModule[];
|
|
242
|
+
readonly problems: readonly StoryProblem[];
|
|
243
|
+
}> {
|
|
244
|
+
const [{ readConfig }, { resolveSources }, { activeStories }] =
|
|
245
|
+
await Promise.all([
|
|
246
|
+
import("../config/readConfig.js"),
|
|
247
|
+
import("../runtime/resolveSources.js"),
|
|
248
|
+
import("../runtime/graphpack/stories.js"),
|
|
249
|
+
]);
|
|
106
250
|
const layers = await readConfig(cwd);
|
|
107
|
-
|
|
251
|
+
const { entries, problems } = validateStories(
|
|
252
|
+
activeStories(resolveSources(layers, cwd)),
|
|
253
|
+
staticModules,
|
|
254
|
+
);
|
|
255
|
+
return {
|
|
256
|
+
modules: assembleEffectiveModules(staticModules, layers, entries),
|
|
257
|
+
problems,
|
|
258
|
+
};
|
|
108
259
|
}
|