@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,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The static shell-completion templates — one emitter per shell, all fed by
|
|
3
|
+
* the same completion model.
|
|
4
|
+
*
|
|
5
|
+
* The three exports are the domain: each takes the model and returns the text
|
|
6
|
+
* of a script `setup completions` writes to disk. They are grouped because
|
|
7
|
+
* they are interchangeable answers to one question — which shell is this — and
|
|
8
|
+
* because they must stay in step: a fact the model carries has to be
|
|
9
|
+
* expressible in all three, so a change to one is a change to all three.
|
|
10
|
+
*
|
|
11
|
+
* What the barrel does NOT expose is the rendering layer underneath
|
|
12
|
+
* (`shared.ts`): the per-verb views, the token allowlist re-assertion, the
|
|
13
|
+
* name/flag list derivations. Those exist so the scripts cannot disagree about
|
|
14
|
+
* structure, and they are safe only in the emit context they were built for —
|
|
15
|
+
* every token they return has been re-checked against the safety allowlist on
|
|
16
|
+
* its way into script text. Offering them across the domain boundary would
|
|
17
|
+
* offer a way to compose that text without that check, which is the one thing
|
|
18
|
+
* this domain exists to make impossible.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
export { bashScript } from "./bash.js";
|
|
22
|
+
export { fishScript } from "./fish.js";
|
|
23
|
+
export { zshScript } from "./zsh.js";
|
|
@@ -77,6 +77,13 @@ export interface VerbEntry {
|
|
|
77
77
|
readonly flags: readonly FlagEntry[];
|
|
78
78
|
/** The verb's positionals, in declared order. */
|
|
79
79
|
readonly positionals: readonly PositionalEntry[];
|
|
80
|
+
/**
|
|
81
|
+
* Segment pseudo-verbs beneath this verb (a module-mounted subtree, from
|
|
82
|
+
* `CapabilityModule.cliProjection.completionChildren`), each with its own
|
|
83
|
+
* flags/positionals/children. The parse walk descends into a matching
|
|
84
|
+
* child before flag/positional resolution.
|
|
85
|
+
*/
|
|
86
|
+
readonly children?: readonly VerbEntry[];
|
|
80
87
|
}
|
|
81
88
|
|
|
82
89
|
/** One noun with its self-verb (if any) and sub-verbs. */
|
|
@@ -15,6 +15,13 @@ describe("defaults — the validated distribution config (pragma.conf.ts)", () =
|
|
|
15
15
|
// `collectColophon` reads exactly this object. Pin the shape and the two
|
|
16
16
|
// stable fragments — the story's own subject and the maker line the old
|
|
17
17
|
// one-line `colophon` string carried (folded in when the field went live).
|
|
18
|
+
//
|
|
19
|
+
// DOMAIN FIRST: this section is deliberately a one-liner that hands off to
|
|
20
|
+
// `docs/architecture.md`. `pragma colophon` renders it ABOVE the active
|
|
21
|
+
// pack's domain colophon, and a reader reaching for the colophon wants the
|
|
22
|
+
// design system, not the toolchain that serves it. The length pin is the
|
|
23
|
+
// ruling: architecture prose belongs in the docs, not in front of the
|
|
24
|
+
// domain every reader came for.
|
|
18
25
|
expect(defaults.colophon?.markdown).toContain("domain-based toolchain");
|
|
19
26
|
expect(defaults.colophon?.markdown).toContain(
|
|
20
27
|
"Made by the Canonical Webteam — https://canonical.com.",
|
|
@@ -23,9 +30,21 @@ describe("defaults — the validated distribution config (pragma.conf.ts)", () =
|
|
|
23
30
|
// Bodies, not documents: the renderer supplies the H1 from the name.
|
|
24
31
|
expect(defaults.colophon?.markdown.startsWith("#")).toBe(false);
|
|
25
32
|
expect(defaults.colophon?.summary?.startsWith("#")).toBe(false);
|
|
33
|
+
// The handoff, and the brevity that makes it honest (see the note above).
|
|
34
|
+
// It is a URL, not a repo path: `docs/` is outside the package's `files`
|
|
35
|
+
// allowlist and is not copied into `dist`, so a path would name a file no
|
|
36
|
+
// installed user has. A bare `docs/architecture.md` must fail here.
|
|
37
|
+
expect(defaults.colophon?.markdown).toContain(
|
|
38
|
+
"https://github.com/canonical/pragma/blob/main/packages/cli/pragma/docs/architecture.md",
|
|
39
|
+
);
|
|
40
|
+
expect(defaults.colophon?.summary).toContain(
|
|
41
|
+
"https://github.com/canonical/pragma/blob/main/packages/cli/pragma/docs/architecture.md",
|
|
42
|
+
);
|
|
43
|
+
expect(defaults.colophon?.markdown.length).toBeLessThan(400);
|
|
44
|
+
expect(defaults.colophon?.summary?.length).toBeLessThan(400);
|
|
26
45
|
});
|
|
27
46
|
|
|
28
|
-
it("ships the
|
|
47
|
+
it("ships the four canonical default packs (git+https sources)", () => {
|
|
29
48
|
expect(
|
|
30
49
|
defaults.packs?.map((pack) =>
|
|
31
50
|
typeof pack === "string"
|
|
@@ -45,6 +64,10 @@ describe("defaults — the validated distribution config (pragma.conf.ts)", () =
|
|
|
45
64
|
name: "@canonical/code-standards",
|
|
46
65
|
source: "git+https://github.com/canonical/web-code-standards.git#main",
|
|
47
66
|
},
|
|
67
|
+
{
|
|
68
|
+
name: "@canonical/ds-implementations",
|
|
69
|
+
source: "git+https://github.com/canonical/pragma.git#main",
|
|
70
|
+
},
|
|
48
71
|
]);
|
|
49
72
|
});
|
|
50
73
|
|
|
@@ -55,7 +78,7 @@ describe("defaults — the validated distribution config (pragma.conf.ts)", () =
|
|
|
55
78
|
const storyCounts = defaults.packs?.map((pack) =>
|
|
56
79
|
typeof pack === "string" ? 0 : (pack.stories?.length ?? 0),
|
|
57
80
|
);
|
|
58
|
-
expect(storyCounts).toEqual([
|
|
81
|
+
expect(storyCounts).toEqual([5, 0, 1, 1]);
|
|
59
82
|
});
|
|
60
83
|
|
|
61
84
|
it("declares no removed field — the validator would refuse to load one", () => {
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
* Built-in configuration defaults — the validated distribution config.
|
|
3
3
|
*
|
|
4
4
|
* The lowest config layer is the distribution's own `pragma.conf.ts` (package
|
|
5
|
-
* root), STATICALLY imported so
|
|
6
|
-
* `evaluateProjectConfig` stats/imports from disk,
|
|
7
|
-
*
|
|
5
|
+
* root), STATICALLY imported so it travels with the emitted modules (no fs read
|
|
6
|
+
* — `evaluateProjectConfig` stats/imports from disk, which is right for a
|
|
7
|
+
* consumer's config and wrong for the distribution's own) and validated through
|
|
8
|
+
* the same `parseRawConfig` as every
|
|
8
9
|
* other layer. Statically imported by `readConfig` (itself dynamic-imported,
|
|
9
10
|
* off the `--help`/`__complete` fast path) and by its own test, so the eager
|
|
10
11
|
* validation and the zod import here add nothing to the storeless surfaces —
|
|
@@ -16,11 +16,19 @@
|
|
|
16
16
|
*
|
|
17
17
|
* LIMITATION (accepted, per the review fold): a *transitively*-imported file
|
|
18
18
|
* (e.g. `./pkgs.ts`) edited without touching the entry's mtime is not detected
|
|
19
|
-
* across processes. The fix that would catch it —
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
19
|
+
* across processes. The fix that would catch it — bundling the config and keying
|
|
20
|
+
* on the bundle hash — would blow the warm-load budget on every load. Touch the
|
|
21
|
+
* entry (or bump VERSION) to force a rebuild.
|
|
22
|
+
*
|
|
23
|
+
* THE CONFIG IS THE CONSUMER'S OWN TYPESCRIPT, and this is the one place the
|
|
24
|
+
* distribution executes code it did not author. `pragma` ships on a `node`
|
|
25
|
+
* shebang, so that import is served by node's type STRIPPING — which erases
|
|
26
|
+
* annotations and refuses syntax that would need real emit (`enum`, `namespace`,
|
|
27
|
+
* parameter properties). Those are rejected with `ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX`,
|
|
28
|
+
* which {@link evaluateProjectConfig} names specifically rather than letting it
|
|
29
|
+
* arrive as an anonymous load failure. The `engines` floor (node >= 22.18) is what
|
|
30
|
+
* makes stripping default-on — and the range excludes 23.0-23.5, which satisfy
|
|
31
|
+
* a bare `>=22.18` but predate the 23.x line's own default-on release (23.6).
|
|
24
32
|
*/
|
|
25
33
|
|
|
26
34
|
import { createHash } from "node:crypto";
|
|
@@ -34,7 +42,7 @@ import {
|
|
|
34
42
|
import { join } from "node:path";
|
|
35
43
|
import { pathToFileURL } from "node:url";
|
|
36
44
|
import { PROJECT_CONFIG_FILENAME, VERSION } from "../../constants.js";
|
|
37
|
-
import { PragmaError } from "../error/
|
|
45
|
+
import { PragmaError } from "../error/index.js";
|
|
38
46
|
import { configCacheDir } from "./paths.js";
|
|
39
47
|
import { parseRawConfig } from "./schema.js";
|
|
40
48
|
import type { RawConfig } from "./types.js";
|
|
@@ -94,7 +102,7 @@ export async function evaluateProjectConfig(path: string): Promise<RawConfig> {
|
|
|
94
102
|
const url = `${pathToFileURL(path).href}?v=${key}`;
|
|
95
103
|
// Evaluating real TypeScript can throw for reasons `parseRawConfig` never sees:
|
|
96
104
|
// a syntax error, a bad import, or a top-level throw in the config module. Left
|
|
97
|
-
// unwrapped, that raw throw collapses to INTERNAL_ERROR ("
|
|
105
|
+
// unwrapped, that raw throw collapses to INTERNAL_ERROR ("report this
|
|
98
106
|
// issue") on EVERY command that reads config. Name it: a CONFIG_ERROR that
|
|
99
107
|
// identifies the offending file and the underlying reason.
|
|
100
108
|
let module: { default?: unknown };
|
|
@@ -103,8 +111,23 @@ export async function evaluateProjectConfig(path: string): Promise<RawConfig> {
|
|
|
103
111
|
} catch (error) {
|
|
104
112
|
if (error instanceof PragmaError) throw error;
|
|
105
113
|
const reason = error instanceof Error ? error.message : String(error);
|
|
114
|
+
// Node strips types rather than compiling them, so a config using syntax that
|
|
115
|
+
// needs real emit fails here with a message naming neither the constraint nor
|
|
116
|
+
// the fix. Say both — this is a supported config that simply must be written
|
|
117
|
+
// in erasable TypeScript, and the author has no other way to learn that.
|
|
118
|
+
const { code } = (error ?? {}) as { code?: unknown };
|
|
119
|
+
if (code === "ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX") {
|
|
120
|
+
throw PragmaError.configError(
|
|
121
|
+
`Your ${PROJECT_CONFIG_FILENAME} uses TypeScript syntax that cannot be erased: ${reason}`,
|
|
122
|
+
{
|
|
123
|
+
recovery: {
|
|
124
|
+
message: `Rewrite it in erasable TypeScript — types, interfaces and \`satisfies\` are fine; \`enum\`, \`namespace\` and constructor parameter properties are not. A plain object literal with a \`default\` export always works.`,
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
);
|
|
128
|
+
}
|
|
106
129
|
throw PragmaError.configError(
|
|
107
|
-
`
|
|
130
|
+
`Cannot load project config ${path}: ${reason}`,
|
|
108
131
|
{
|
|
109
132
|
recovery: {
|
|
110
133
|
message: `Fix the error in your ${PROJECT_CONFIG_FILENAME} (it must evaluate to a default export), then try again.`,
|
|
@@ -1,60 +1,66 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* The setup hint — the read-only replacement for first-run seeding.
|
|
3
|
+
*
|
|
4
|
+
* Onboarding used to WRITE: a pipeline step ran before dispatch on every
|
|
5
|
+
* non-help invocation and created the global config, so `skill list` — a read —
|
|
6
|
+
* mutated the machine before the user had consented to anything. Seeding is now
|
|
7
|
+
* the `config` setup target, created inside a consented run. What is left is a
|
|
8
|
+
* stateless hint, and the property that matters most about it is the one these
|
|
9
|
+
* tests pin: reading it writes nothing.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
existsSync,
|
|
14
|
+
mkdirSync,
|
|
15
|
+
mkdtempSync,
|
|
16
|
+
readdirSync,
|
|
17
|
+
writeFileSync,
|
|
18
|
+
} from "node:fs";
|
|
2
19
|
import { tmpdir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
20
|
+
import { dirname, join } from "node:path";
|
|
4
21
|
import { afterEach, describe, expect, it } from "vitest";
|
|
5
|
-
import {
|
|
22
|
+
import { setupHintLines } from "./firstRun.js";
|
|
6
23
|
import { globalConfigPath } from "./paths.js";
|
|
7
24
|
|
|
8
25
|
const originalConfigHome = process.env.XDG_CONFIG_HOME;
|
|
9
26
|
|
|
10
|
-
function freshConfigHome():
|
|
11
|
-
|
|
27
|
+
function freshConfigHome(): string {
|
|
28
|
+
const dir = mkdtempSync(join(tmpdir(), "pragma-first-"));
|
|
29
|
+
process.env.XDG_CONFIG_HOME = dir;
|
|
30
|
+
return dir;
|
|
12
31
|
}
|
|
13
32
|
|
|
14
33
|
afterEach(() => {
|
|
15
34
|
process.env.XDG_CONFIG_HOME = originalConfigHome;
|
|
16
35
|
});
|
|
17
36
|
|
|
18
|
-
describe("
|
|
19
|
-
it("
|
|
37
|
+
describe("the setup hint", () => {
|
|
38
|
+
it("names the pre-release and the command that configures the machine", () => {
|
|
20
39
|
freshConfigHome();
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
await ensureFirstRun((line) => lines.push(line));
|
|
25
|
-
|
|
26
|
-
expect(existsSync(path)).toBe(true);
|
|
27
|
-
expect(readFileSync(path, "utf-8")).toBe("{}\n");
|
|
28
|
-
expect(lines[0]).toContain("Hello!");
|
|
29
|
-
expect(lines.some((line) => line.includes(path))).toBe(true);
|
|
30
|
-
// Snapshot the note with the volatile path masked.
|
|
31
|
-
expect(
|
|
32
|
-
lines.map((line) => line.replace(path, "<CONFIG>")),
|
|
33
|
-
).toMatchSnapshot();
|
|
40
|
+
const lines = setupHintLines();
|
|
41
|
+
expect(lines.some((line) => line.includes("pre-release"))).toBe(true);
|
|
42
|
+
expect(lines.some((line) => line.includes("pragma setup"))).toBe(true);
|
|
34
43
|
});
|
|
35
44
|
|
|
36
|
-
it("
|
|
37
|
-
|
|
38
|
-
|
|
45
|
+
it("writes NOTHING — presence of the config is the state, not a marker", () => {
|
|
46
|
+
// A marker file would itself be a pre-consent write, which is the exact
|
|
47
|
+
// defect being removed. The probe must leave the config home untouched.
|
|
48
|
+
const dir = freshConfigHome();
|
|
49
|
+
expect(existsSync(globalConfigPath())).toBe(false);
|
|
39
50
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
expect(second).toEqual([]);
|
|
51
|
+
setupHintLines();
|
|
52
|
+
setupHintLines();
|
|
43
53
|
|
|
44
|
-
|
|
45
|
-
expect(
|
|
54
|
+
expect(readdirSync(dir)).toEqual([]);
|
|
55
|
+
expect(existsSync(globalConfigPath())).toBe(false);
|
|
46
56
|
});
|
|
47
57
|
|
|
48
|
-
it("
|
|
58
|
+
it("goes quiet once the config exists", () => {
|
|
49
59
|
freshConfigHome();
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
ensureFirstRun((line) => lines.push(line)),
|
|
56
|
-
).resolves.toBeUndefined();
|
|
57
|
-
expect(lines).toHaveLength(1);
|
|
58
|
-
expect(lines[0]).toContain("Warning: could not create");
|
|
60
|
+
const path = globalConfigPath();
|
|
61
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
62
|
+
writeFileSync(path, "{}\n");
|
|
63
|
+
|
|
64
|
+
expect(setupHintLines()).toEqual([]);
|
|
59
65
|
});
|
|
60
66
|
});
|
|
@@ -1,98 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* The setup hint — the read-only replacement for first-run seeding.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* first-run pipeline; runs before dispatch and tolerates every failure.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { dirname } from "node:path";
|
|
14
|
-
import {
|
|
15
|
-
$,
|
|
16
|
-
exists,
|
|
17
|
-
gen,
|
|
18
|
-
info,
|
|
19
|
-
mkdir,
|
|
20
|
-
type Task,
|
|
21
|
-
writeFile,
|
|
22
|
-
} from "@canonical/task";
|
|
23
|
-
import { runTask } from "@canonical/task/node";
|
|
24
|
-
import {
|
|
25
|
-
BIN_NAME,
|
|
26
|
-
ISSUES_URL,
|
|
27
|
-
PROJECT_CONFIG_FILENAME,
|
|
28
|
-
} from "../../constants.js";
|
|
29
|
-
import { globalConfigPath } from "./paths.js";
|
|
30
|
-
|
|
31
|
-
/** Seed content: an empty object, so nothing is pinned the user did not choose. */
|
|
32
|
-
const SEED_CONFIG = "{}\n";
|
|
33
|
-
|
|
34
|
-
/** Build the welcome note; the resolved path is shown so it is copyable. */
|
|
35
|
-
function welcomeLines(path: string): string[] {
|
|
36
|
-
return [
|
|
37
|
-
`Hello! Thanks for taking the time to try the pre-release ${BIN_NAME} CLI.`,
|
|
38
|
-
`Please file issues and feedback at ${ISSUES_URL}.`,
|
|
39
|
-
`${BIN_NAME} stores its configuration in ${path} (just created with defaults).`,
|
|
40
|
-
`A \`${PROJECT_CONFIG_FILENAME}\` in this directory or above it overrides it per project.`,
|
|
41
|
-
"",
|
|
42
|
-
];
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* The first-run task: create the global config, announcing it on first run.
|
|
4
|
+
* Onboarding used to WRITE. A pipeline step ran before dispatch on every
|
|
5
|
+
* non-help invocation and created `$XDG_CONFIG_HOME/<bin>/config.json`, so
|
|
6
|
+
* `skill list` — a read — mutated the machine before the user had consented to
|
|
7
|
+
* anything, and a banner interleaved itself into the output of runs that were
|
|
8
|
+
* mutating something else entirely. The config layers already treat the missing
|
|
9
|
+
* file as "every field at its built-in default", so the write bought nothing.
|
|
47
10
|
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
11
|
+
* Seeding is now a setup target, created inside a consented run. What is left
|
|
12
|
+
* here is a STATELESS hint: shown when the global config file is absent, on
|
|
13
|
+
* read-only surfaces only. There is no marker file — a marker is itself a
|
|
14
|
+
* pre-consent write, which is the exact defect being removed — because the
|
|
15
|
+
* presence of the config IS the state.
|
|
50
16
|
*/
|
|
51
|
-
export function firstRunTask(): Task<{ created: boolean; path: string }> {
|
|
52
|
-
return gen(function* () {
|
|
53
|
-
const path = globalConfigPath();
|
|
54
|
-
|
|
55
|
-
if (yield* $(exists(path))) {
|
|
56
|
-
return { created: false, path };
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Create first, then greet: if creation fails the effects throw before any
|
|
60
|
-
// line is emitted, so onboarding degrades to the single stderr warning
|
|
61
|
-
// rather than a "just created" banner alongside a failure.
|
|
62
|
-
yield* $(mkdir(dirname(path), true));
|
|
63
|
-
yield* $(writeFile(path, SEED_CONFIG));
|
|
64
17
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return { created: true, path };
|
|
70
|
-
});
|
|
71
|
-
}
|
|
18
|
+
import { existsSync } from "node:fs";
|
|
19
|
+
import { BIN_NAME, ISSUES_URL } from "../../constants.js";
|
|
20
|
+
import { globalConfigPath } from "./paths.js";
|
|
72
21
|
|
|
73
22
|
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* Onboarding must never break an invocation: a read-only home or a race with a
|
|
77
|
-
* concurrent first run degrades to a single stderr warning and the invocation
|
|
78
|
-
* proceeds (the config layers treat a missing global file as defaults anyway).
|
|
23
|
+
* The hint lines for a machine that has not been set up, or none when it has.
|
|
79
24
|
*
|
|
80
|
-
* @
|
|
81
|
-
* @note Impure —
|
|
25
|
+
* @returns The lines to print, or an empty array.
|
|
26
|
+
* @note Impure — probes the global config path.
|
|
82
27
|
*/
|
|
83
|
-
export
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
// this is a greeting, not diagnostics.
|
|
90
|
-
onLog: (_level, message) => write(message),
|
|
91
|
-
});
|
|
92
|
-
} catch (error) {
|
|
93
|
-
const reason = error instanceof Error ? error.message : String(error);
|
|
94
|
-
write(
|
|
95
|
-
`Warning: could not create the global ${BIN_NAME} config — ${reason}`,
|
|
96
|
-
);
|
|
97
|
-
}
|
|
28
|
+
export function setupHintLines(): string[] {
|
|
29
|
+
if (existsSync(globalConfigPath())) return [];
|
|
30
|
+
return [
|
|
31
|
+
`${BIN_NAME} is pre-release — report issues at ${ISSUES_URL}.`,
|
|
32
|
+
`Run \`${BIN_NAME} setup\` to configure this machine.`,
|
|
33
|
+
];
|
|
98
34
|
}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
export { evaluateProjectConfig } from "./evaluateProjectConfig.js";
|
|
11
11
|
export { findProjectConfig } from "./findProjectConfig.js";
|
|
12
|
-
export {
|
|
12
|
+
export { setupHintLines } from "./firstRun.js";
|
|
13
13
|
export type { GlobalConfigRead } from "./globalConfig.js";
|
|
14
14
|
export { readGlobalConfig } from "./globalConfig.js";
|
|
15
15
|
export {
|
|
@@ -59,7 +59,7 @@ describe("readConfig — layering + provenance", () => {
|
|
|
59
59
|
expect(config.tier).toBe("core");
|
|
60
60
|
expect(config.channel).toBe("experimental");
|
|
61
61
|
expect(config.detail).toBe("detailed");
|
|
62
|
-
expect(config.packs).toHaveLength(
|
|
62
|
+
expect(config.packs).toHaveLength(4); // from defaults
|
|
63
63
|
|
|
64
64
|
expect(origins).toMatchObject({
|
|
65
65
|
tier: "project",
|
|
@@ -101,12 +101,15 @@ describe("readConfig — layering + provenance", () => {
|
|
|
101
101
|
freshXdg();
|
|
102
102
|
writeGlobal('{"help":"Global help"}');
|
|
103
103
|
const dir = projectWith(
|
|
104
|
-
'export default { name: "acme", colophon: { markdown: "By Acme." }, issuesUrl: "https://acme.test/issues", tier: "core" };',
|
|
104
|
+
'export default { name: "acme", logo: ["ACME"], colophon: { markdown: "By Acme." }, issuesUrl: "https://acme.test/issues", tier: "core" };',
|
|
105
105
|
);
|
|
106
106
|
|
|
107
107
|
const { config, origins } = await readConfig(dir);
|
|
108
108
|
|
|
109
109
|
expect(config).not.toHaveProperty("name");
|
|
110
|
+
// `logo` is identity too: accepted by the shared schema, silent in a layer.
|
|
111
|
+
expect(config).not.toHaveProperty("logo");
|
|
112
|
+
expect(origins).not.toHaveProperty("logo");
|
|
110
113
|
expect(config).not.toHaveProperty("help");
|
|
111
114
|
expect(config).not.toHaveProperty("colophon");
|
|
112
115
|
expect(config).not.toHaveProperty("issuesUrl");
|
|
@@ -461,7 +464,7 @@ describe("evaluateProjectConfig — mtime+VERSION cache", () => {
|
|
|
461
464
|
freshXdg();
|
|
462
465
|
// A malformed project config: references an undefined symbol → the module
|
|
463
466
|
// throws at evaluation. Left unwrapped this collapsed to INTERNAL_ERROR
|
|
464
|
-
// ("
|
|
467
|
+
// ("report this issue") on EVERY command that reads config.
|
|
465
468
|
const dir = projectWith("export default { tier: definitelyNotDefined };");
|
|
466
469
|
const path = join(dir, "pragma.config.ts");
|
|
467
470
|
|
|
@@ -51,7 +51,7 @@ export async function readConfig(
|
|
|
51
51
|
return { value: defaultValues[field], origin: "default" };
|
|
52
52
|
};
|
|
53
53
|
|
|
54
|
-
// `name`/`help`/`colophon`/`issuesUrl` are DELIBERATELY not picked: identity
|
|
54
|
+
// `name`/`help`/`logo`/`colophon`/`issuesUrl` are DELIBERATELY not picked: identity
|
|
55
55
|
// is read from `pragma.conf.ts` statically (`src/constants.ts`), so merging a
|
|
56
56
|
// layer's value here would report a provenance nothing honours.
|
|
57
57
|
const tier = pick("tier");
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
import { z } from "zod";
|
|
19
|
-
import { PragmaError } from "../error/
|
|
19
|
+
import { PragmaError } from "../error/index.js";
|
|
20
20
|
import { CHANNELS, DETAIL_LEVELS, type RawConfig } from "./types.js";
|
|
21
21
|
|
|
22
22
|
const packDeclarationSchema = z.union([
|
|
@@ -61,6 +61,8 @@ function declaredCompletion(value: unknown): Record<string, unknown> | null {
|
|
|
61
61
|
export const rawConfigSchema = z.object({
|
|
62
62
|
name: z.string().min(1).optional(),
|
|
63
63
|
help: z.string().min(1).optional(),
|
|
64
|
+
// Identity, like `name`/`help`: the wordmark root `--help` opens with.
|
|
65
|
+
logo: z.array(z.string()).optional(),
|
|
64
66
|
// Declared toolchain content: the `colophon` verb renders whatever the
|
|
65
67
|
// distribution declares here (markdown body + optional condensed summary).
|
|
66
68
|
colophon: z
|
|
@@ -109,7 +109,7 @@ export interface PragmaConfig {
|
|
|
109
109
|
* wins during the merge.
|
|
110
110
|
*
|
|
111
111
|
* WIDER than {@link PragmaConfig}: the DISTRIBUTION layer (`pragma.conf.ts`)
|
|
112
|
-
* is `satisfies RawConfig` and declares the
|
|
112
|
+
* is `satisfies RawConfig` and declares the five identity fields, which are
|
|
113
113
|
* read statically and never merged. A global or project layer declaring one is
|
|
114
114
|
* accepted by the validator and has no effect — `docs/reference/config.md`
|
|
115
115
|
* says so, and `readConfig.test.ts` pins it.
|
|
@@ -117,6 +117,8 @@ export interface PragmaConfig {
|
|
|
117
117
|
export interface RawConfig {
|
|
118
118
|
readonly name?: string;
|
|
119
119
|
readonly help?: string;
|
|
120
|
+
/** ASCII-art wordmark lines shown atop root `--help` (identity, like `name`). */
|
|
121
|
+
readonly logo?: readonly string[];
|
|
120
122
|
readonly colophon?: ColophonDeclaration;
|
|
121
123
|
readonly issuesUrl?: string;
|
|
122
124
|
readonly tier?: string;
|
package/src/kernel/copy.test.ts
CHANGED
|
@@ -28,6 +28,11 @@
|
|
|
28
28
|
* in a capability source — became content the config declares
|
|
29
29
|
* (`pragma.conf.ts#colophon`), which is what made removing it checkable.
|
|
30
30
|
*
|
|
31
|
+
* Beside the naming rules, the same scanner enforces the HOUSE VOICE rules for
|
|
32
|
+
* user-facing copy ({@link COPY_RULES}, authored as data in `copy.ts`) over
|
|
33
|
+
* both file sets — the kernel set above and `src/capabilities/**` — in the
|
|
34
|
+
* last describe of this file. See `copy.ts` for what each rule bans and why.
|
|
35
|
+
*
|
|
31
36
|
* NOTE for a reader of an older revision: this docblock used to say the
|
|
32
37
|
* `examples[].cmd` sweep and the `docs/reference/*.md` regen "have to move
|
|
33
38
|
* together". They must be CONSISTENT, not simultaneous — the whole sweep was
|
|
@@ -41,6 +46,7 @@ import { fileURLToPath } from "node:url";
|
|
|
41
46
|
import { describe, expect, it } from "vitest";
|
|
42
47
|
import conf from "../../pragma.conf.js";
|
|
43
48
|
import { BIN_NAME } from "../constants.js";
|
|
49
|
+
import { COPY_RULES } from "./copy.js";
|
|
44
50
|
|
|
45
51
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
46
52
|
const root = resolve(here, "..");
|
|
@@ -250,13 +256,17 @@ function pushCopy(copy: string[], literal: string): void {
|
|
|
250
256
|
* `file: literal` for every authored literal matching `pattern`, so a failure
|
|
251
257
|
* names its offenders instead of only counting them.
|
|
252
258
|
*
|
|
253
|
-
* @param pattern - What
|
|
259
|
+
* @param pattern - What the copy may not contain.
|
|
260
|
+
* @param sources - The files to read; the kernel set by default.
|
|
254
261
|
* @returns One entry per offending literal.
|
|
255
|
-
* @note Impure — reads every
|
|
262
|
+
* @note Impure — reads every listed source.
|
|
256
263
|
*/
|
|
257
|
-
function findOffenders(
|
|
264
|
+
function findOffenders(
|
|
265
|
+
pattern: RegExp,
|
|
266
|
+
sources: readonly string[] = files,
|
|
267
|
+
): string[] {
|
|
258
268
|
const found: string[] = [];
|
|
259
|
-
for (const file of
|
|
269
|
+
for (const file of sources) {
|
|
260
270
|
for (const literal of readCopy(readFileSync(file, "utf-8"))) {
|
|
261
271
|
if (pattern.test(literal)) {
|
|
262
272
|
found.push(`${relative(root, file)}: ${literal}`);
|
|
@@ -451,3 +461,23 @@ describe("capability commands (PROTECTED)", () => {
|
|
|
451
461
|
expect(offenders).toEqual([]);
|
|
452
462
|
});
|
|
453
463
|
});
|
|
464
|
+
|
|
465
|
+
describe("user-facing copy house style (PROTECTED)", () => {
|
|
466
|
+
// The voice rules ({@link COPY_RULES}) run over BOTH file sets the naming
|
|
467
|
+
// rules above read — the kernel set and the capability set — because voice,
|
|
468
|
+
// unlike the distribution's name, is not content anywhere: a capability's
|
|
469
|
+
// error is the same product speaking as a kernel diagnostic. `readCopy`
|
|
470
|
+
// keeps comments, regexes, specifiers and test files out of scope, so a
|
|
471
|
+
// rule fires only on a string a user can actually be shown.
|
|
472
|
+
//
|
|
473
|
+
// One `it` per rule, NAMED by the rule, so a red run states the rule that
|
|
474
|
+
// fired; the assertion message carries the fix. What a failure prints is the
|
|
475
|
+
// offender list plus those two strings — everything needed to correct the
|
|
476
|
+
// copy lives in this repo.
|
|
477
|
+
const allSources = [...files, ...capabilitySources];
|
|
478
|
+
for (const { pattern, rule, fix } of COPY_RULES) {
|
|
479
|
+
it(rule, () => {
|
|
480
|
+
expect(findOffenders(pattern, allSources), fix).toEqual([]);
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The house rules for user-facing copy, as data.
|
|
3
|
+
*
|
|
4
|
+
* Every string this CLI prints is one product speaking, and a product with one
|
|
5
|
+
* voice phrases one meaning one way. These descriptors name the phrasings that
|
|
6
|
+
* are out of that voice, why, and what to write instead; `copy.test.ts` runs
|
|
7
|
+
* them over every authored string literal in the tree — the same scanner and
|
|
8
|
+
* file sets as the naming rules there, so comments, regexes, module specifiers
|
|
9
|
+
* and test fixtures are never in scope. A failure quotes the offending literal,
|
|
10
|
+
* the rule, and the fix, and nothing else: everything a maintainer needs to
|
|
11
|
+
* correct the string lives in this file.
|
|
12
|
+
*
|
|
13
|
+
* Rules are DATA rather than assertions so the set can grow (or move into a
|
|
14
|
+
* shared standards package) without rewriting the guard, and so each rule's
|
|
15
|
+
* pattern, statement and fix are reviewed together as one unit. Precision is
|
|
16
|
+
* the set's credibility: a pattern that fires on domain vocabulary gets
|
|
17
|
+
* disabled in practice, so a carve-out is encoded in the pattern itself — with
|
|
18
|
+
* its reason — never in an exemption list beside it.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/** One banned phrasing: what copy may not contain, why, and the rewrite. */
|
|
22
|
+
export interface CopyRule {
|
|
23
|
+
/** What the copy must not contain. */
|
|
24
|
+
readonly pattern: RegExp;
|
|
25
|
+
/** The house rule, stated for a reader of THIS codebase. */
|
|
26
|
+
readonly rule: string;
|
|
27
|
+
/** How to fix an offending string. */
|
|
28
|
+
readonly fix: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** The banned phrasings for user-facing copy. Enforced by `copy.test.ts`. */
|
|
32
|
+
export const COPY_RULES: readonly CopyRule[] = [
|
|
33
|
+
{
|
|
34
|
+
pattern: /\b(?:could not|failed to|unable to)\b/i,
|
|
35
|
+
rule: "User-facing copy says `cannot` — one phrasing for one meaning, so the CLI reads as one voice.",
|
|
36
|
+
fix: "Rewrite with `cannot` (present tense, no hedging), naming what is wrong rather than what was attempted.",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
// `\w+n't` covers every negated contraction in one arm; the lookbehind
|
|
40
|
+
// carves out `do/don't`, which is domain vocabulary — the name of the
|
|
41
|
+
// paired good/bad example a coding standard ships — not conversational
|
|
42
|
+
// tone. The second arm lists the pronoun contractions, which have no
|
|
43
|
+
// shared suffix shape.
|
|
44
|
+
pattern:
|
|
45
|
+
/\b(?<!do\/)\w+n't\b|\b(?:you|we|they|it|that|there|here|what|let)'(?:re|ve|ll|s|d)\b|\bi'm\b/i,
|
|
46
|
+
rule: "No contractions in user-facing copy — instructions read as statements, not conversation.",
|
|
47
|
+
fix: "Spell the words out, or restructure the sentence to drop the second person.",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
pattern: /\b(?:please|sorry|oops)\b/i,
|
|
51
|
+
rule: "The CLI does not apologise or plead; it states the fact and the action.",
|
|
52
|
+
fix: "Drop the pleading word and instruct directly: `Report this issue at <url>.`",
|
|
53
|
+
},
|
|
54
|
+
];
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { ISSUES_URL } from "../../constants.js";
|
|
2
3
|
import { errorEnvelope, successEnvelope } from "../render/envelope.js";
|
|
3
4
|
import { PragmaError } from "./PragmaError.js";
|
|
4
5
|
import { cliRecovery } from "./recovery.js";
|
|
@@ -56,7 +57,9 @@ describe("PragmaError factories", () => {
|
|
|
56
57
|
it("internalError attaches a report hint", () => {
|
|
57
58
|
const error = PragmaError.internalError("boom");
|
|
58
59
|
expect(error.code).toBe("INTERNAL_ERROR");
|
|
59
|
-
expect(error.recovery).toEqual({
|
|
60
|
+
expect(error.recovery).toEqual({
|
|
61
|
+
message: `Report this issue at ${ISSUES_URL}.`,
|
|
62
|
+
});
|
|
60
63
|
});
|
|
61
64
|
});
|
|
62
65
|
|
|
@@ -66,7 +69,7 @@ describe("serializeError", () => {
|
|
|
66
69
|
expect(serializeError(error)).toEqual({
|
|
67
70
|
code: "INTERNAL_ERROR",
|
|
68
71
|
message: "Internal error: boom",
|
|
69
|
-
recovery: { message:
|
|
72
|
+
recovery: { message: `Report this issue at ${ISSUES_URL}.` },
|
|
70
73
|
});
|
|
71
74
|
});
|
|
72
75
|
|