@canonical/pragma-cli 0.34.0 → 0.36.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/bundled-skills/add-standard/SKILL.md +338 -0
- package/bundled-skills/adoption-a1-styles/SKILL.md +269 -0
- package/bundled-skills/adoption-a2-components/SKILL.md +291 -0
- package/bundled-skills/adoption-a3-forms/SKILL.md +260 -0
- package/bundled-skills/anatomy-author/ANATOMY_DSL_SPEC.md +406 -0
- package/bundled-skills/anatomy-author/SKILL.md +1226 -0
- package/bundled-skills/design-auditor/SKILL.md +455 -0
- package/bundled-skills/implement-component/SKILL.md +333 -0
- package/bundled-skills/specify-component/SKILL.md +331 -0
- package/bundled-skills/specify-pattern/SKILL.md +292 -0
- package/dist/.build-ok +0 -0
- package/dist/package.json +84 -0
- package/dist/pragma.conf.js +1016 -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 +294 -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 +148 -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/harnessInventory.js +195 -0
- package/dist/src/capabilities/doctor/checks/harnessInventory.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 +349 -0
- package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.render.js +164 -0
- package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.verb.js +49 -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 +86 -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 +72 -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 +57 -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 +172 -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 +390 -0
- package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js +329 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js +253 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupSkills.js +594 -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 +271 -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 +387 -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 +328 -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/index.js +27 -0
- package/dist/src/capabilities/shared/index.js.map +1 -0
- package/dist/src/capabilities/shared/packageManager.js +349 -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 +281 -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 +309 -0
- package/dist/src/capabilities/sources/installSkills.js.map +1 -0
- package/dist/src/capabilities/sources/runUpdate.js +460 -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 +135 -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 +52 -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 +87 -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 +34 -0
- package/dist/src/kernel/index.js.map +1 -0
- package/dist/src/kernel/interactivity.js +68 -0
- package/dist/src/kernel/interactivity.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 +274 -0
- package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
- package/dist/src/kernel/packs/runBodies.js +140 -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 +421 -0
- package/dist/src/kernel/packs/schema.js.map +1 -0
- package/dist/src/kernel/packs/sparql/applyFilters.js +167 -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 +480 -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 +219 -0
- package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
- package/dist/src/kernel/project/cli/helpFormat.js +58 -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 +227 -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 +315 -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 +105 -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/vocabulary.js +174 -0
- package/dist/src/kernel/render/vocabulary.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 +22 -23
- package/pragma.conf.ts +486 -90
- package/src/bin.ts +274 -82
- package/src/capabilities/block.parity.test.ts +29 -12
- package/src/capabilities/block.shipped.exec.test.ts +282 -0
- package/src/capabilities/block.tierRank.exec.test.ts +300 -0
- 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 +24 -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.parity.test.ts +4 -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 +75 -8
- package/src/capabilities/doctor/checks/checkPragmaVersion.ts +2 -2
- package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +76 -29
- package/src/capabilities/doctor/checks/checkShellCompletions.ts +63 -17
- package/src/capabilities/doctor/checks/harnessInventory.test.ts +219 -0
- package/src/capabilities/doctor/checks/harnessInventory.ts +298 -0
- 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 +444 -0
- package/src/capabilities/doctor/doctor.render.test.ts +125 -38
- package/src/capabilities/doctor/doctor.render.ts +74 -74
- package/src/capabilities/doctor/doctor.test.ts +338 -37
- package/src/capabilities/doctor/doctor.verb.ts +8 -3
- package/src/capabilities/doctor/runChecks.ts +65 -63
- package/src/capabilities/doctor/types.ts +22 -15
- package/src/capabilities/emptyRecovery.test.ts +21 -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 +13 -5
- package/src/capabilities/info/info.render.ts +7 -3
- package/src/capabilities/info/info.test.ts +37 -1
- package/src/capabilities/info/info.verb.ts +1 -1
- package/src/capabilities/info/types.ts +10 -2
- 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/renderVocabularySync.test.ts +82 -0
- package/src/capabilities/resources/provider.ts +342 -85
- package/src/capabilities/resources/resources.test.ts +355 -59
- package/src/capabilities/scopeTypeSync.test.ts +29 -15
- package/src/capabilities/setup/buildPlan.ts +240 -0
- package/src/capabilities/setup/index.ts +7 -7
- package/src/capabilities/setup/mode.ts +74 -0
- package/src/capabilities/setup/operations/index.ts +79 -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 +478 -334
- package/src/capabilities/setup/operations/setupLsp.ts +420 -67
- package/src/capabilities/setup/operations/setupMcp.ts +238 -127
- package/src/capabilities/setup/operations/setupSkills.ts +667 -105
- package/src/capabilities/setup/plan.render.ts +336 -0
- package/src/capabilities/setup/plan.ts +241 -0
- package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
- package/src/capabilities/setup/setup.render.test.ts +297 -75
- package/src/capabilities/setup/setup.render.ts +45 -77
- package/src/capabilities/setup/setup.test.ts +1819 -225
- package/src/capabilities/setup/setup.verb.ts +288 -78
- package/src/capabilities/setup/shell.test.ts +86 -0
- package/src/capabilities/setup/shell.ts +137 -11
- package/src/capabilities/setup/targets.ts +435 -0
- package/src/capabilities/setup/types.ts +23 -70
- package/src/capabilities/shared/assertExecOk.ts +68 -10
- package/src/capabilities/shared/index.ts +43 -0
- package/src/capabilities/shared/packageManager.test.ts +470 -0
- package/src/capabilities/shared/packageManager.ts +425 -34
- package/src/capabilities/skill/bundledSkills.test.ts +347 -0
- package/src/capabilities/skill/discover.ts +131 -10
- package/src/capabilities/skill/index.ts +1 -1
- package/src/capabilities/skill/render.ts +10 -9
- package/src/capabilities/skill/skill.test.ts +22 -7
- 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 +265 -10
- package/src/capabilities/sources/runUpdate.ts +131 -23
- package/src/capabilities/sources/sources.test.ts +382 -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 +4 -4
- package/src/capabilities/surface.test.ts +136 -19
- package/src/capabilities/upgrade/runUpgrade.ts +53 -14
- package/src/capabilities/upgrade/types.ts +10 -2
- package/src/capabilities/upgrade/upgrade.render.ts +13 -7
- package/src/capabilities/upgrade/upgrade.test.ts +75 -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 +36 -1
- package/src/identity.test.ts +57 -29
- 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 +16 -3
- 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 +50 -35
- 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 +27 -3
- 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 +35 -0
- package/src/kernel/interactivity.test.ts +76 -0
- package/src/kernel/interactivity.ts +69 -0
- package/src/kernel/packs/collect.ts +12 -16
- package/src/kernel/packs/compile.test.ts +222 -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 +25 -6
- package/src/kernel/packs/resolveEntity.test.ts +274 -0
- package/src/kernel/packs/resolveEntity.ts +200 -42
- package/src/kernel/packs/runBodies.ts +86 -22
- package/src/kernel/packs/sample.ts +1 -1
- package/src/kernel/packs/schema.ts +78 -5
- package/src/kernel/packs/sparql/applyFilters.ts +136 -16
- package/src/kernel/packs/sparql/buildLookupQuery.test.ts +290 -0
- package/src/kernel/packs/sparql/buildLookupQuery.ts +367 -17
- 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 +77 -4
- package/src/kernel/packs/types.ts +136 -0
- package/src/kernel/packs/uniqueness.ts +1 -1
- package/src/kernel/project/cli/buildProgram.test.ts +218 -12
- package/src/kernel/project/cli/buildProgram.ts +84 -18
- package/src/kernel/project/cli/constants.ts +34 -0
- package/src/kernel/project/cli/dispatch.test.ts +160 -2
- package/src/kernel/project/cli/dispatch.ts +226 -45
- 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 +134 -31
- package/src/kernel/project/cli/helpFormat.ts +14 -2
- package/src/kernel/project/cli/rootHelp.ts +74 -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 +55 -10
- 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 +59 -6
- package/src/kernel/render/turtle.ts +222 -0
- package/src/kernel/render/vocabulary.ts +276 -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 +277 -4
- package/src/testing/PARITY_GAPS.ts +9 -3
- package/src/testing/behavioral/docExamples.test.ts +16 -0
- package/src/testing/behavioral/errorMatrix.mcp.test.ts +112 -9
- 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.firstInstall.test.ts +7 -2
- 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 +10 -7
- 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/__snapshots__/eval.test.ts.snap +26 -1
- package/src/testing/eval/cases/effectful.ts +3 -2
- package/src/testing/eval/cases/readNouns.ts +245 -9
- package/src/testing/fixtures/blockGraph.ts +104 -10
- package/src/testing/fixtures/graph/canonical.ts +182 -13
- 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/capabilities/shared/bands.ts +0 -16
- package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
|
@@ -1,59 +1,88 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The `setup` verbs — the run-all self-verb plus the
|
|
3
|
-
* (`
|
|
2
|
+
* The `setup` verbs — the run-all self-verb plus the five CLI-only sub-verbs
|
|
3
|
+
* (`config`/`completions`/`lsp`/`mcp`/`skills`), every one of them derived from
|
|
4
|
+
* the target table.
|
|
4
5
|
*
|
|
5
6
|
* `setup` is the ONE covenant noun that is BOTH directly runnable and has
|
|
6
|
-
* sub-verbs
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* the
|
|
10
|
-
* advertising the `setup` tool as destructive.
|
|
7
|
+
* sub-verbs. All of them are storeless, interactive mutations. The sub-verbs are
|
|
8
|
+
* `mcp: false` (`buildServer` skips them, `buildProgram` still registers them);
|
|
9
|
+
* only the self-verb is an MCP tool. `destructive: false` keeps MCP from
|
|
10
|
+
* advertising the tool as destructive.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* and
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
12
|
+
* THE SCOPE DEFAULT IS GLOBAL. `--scope` used to default to `both`, and `both`
|
|
13
|
+
* runs each harness's own default scope — which is `project` for most of the
|
|
14
|
+
* registry — so a bare `setup` scattered `.mcp.json`, `.gemini/settings.json`
|
|
15
|
+
* and `opencode.json` into whatever directory you happened to be standing in.
|
|
16
|
+
* The user scope is what a machine-level installer configures; the project scope
|
|
17
|
+
* is a deliberate, checked-in, team-shared choice, and is now chosen with
|
|
18
|
+
* `--local` rather than assumed.
|
|
19
|
+
*
|
|
20
|
+
* Every sub-verb registers the scope flags UNIFORMLY. That is what lets the scope
|
|
21
|
+
* answer come from the table instead of per-verb flag wiring — previously
|
|
22
|
+
* `setup completions --local` died as an unknown option, while `setup mcp
|
|
23
|
+
* --local` worked, for no reason a user could see. Asking a target for a scope it
|
|
24
|
+
* cannot honour is a usage error (exit 2) with the corrected command; asking the
|
|
25
|
+
* RUN-ALL for such a band merely filters, and the out-of-band target still shows
|
|
26
|
+
* as a named row.
|
|
27
|
+
*
|
|
28
|
+
* summon-core + the generator ops stay behind a LAZY dynamic import (mirroring
|
|
29
|
+
* `create`'s `loadCreateRuntime`), so building the command tree / `--help` /
|
|
30
|
+
* `__complete` — and `setup --yes` — load no React/Ink.
|
|
20
31
|
*/
|
|
21
32
|
|
|
22
33
|
import type { GeneratorResult } from "@canonical/summon-core";
|
|
23
|
-
import { $, gen, type Task } from "@canonical/task";
|
|
34
|
+
import { $, gen, pure, type Task } from "@canonical/task";
|
|
24
35
|
import { BIN_NAME } from "../../constants.js";
|
|
25
|
-
import
|
|
36
|
+
import { PragmaError } from "../../kernel/error/index.js";
|
|
37
|
+
import type { PragmaRuntime } from "../../kernel/runtime/index.js";
|
|
26
38
|
import { asVerb } from "../../kernel/spec/asVerb.js";
|
|
27
39
|
import type {
|
|
28
40
|
CapabilityModule,
|
|
29
41
|
ParamSpec,
|
|
30
42
|
VerbSpec,
|
|
31
|
-
} from "../../kernel/spec/
|
|
32
|
-
import {
|
|
33
|
-
import
|
|
43
|
+
} from "../../kernel/spec/index.js";
|
|
44
|
+
import { resolveSetupMode, setupModeInput } from "./mode.js";
|
|
45
|
+
import {
|
|
46
|
+
isActionable,
|
|
47
|
+
planExitFailed,
|
|
48
|
+
planTally,
|
|
49
|
+
type SetupPlan,
|
|
50
|
+
TARGET_IDS,
|
|
51
|
+
} from "./plan.js";
|
|
52
|
+
import {
|
|
53
|
+
renderDetectionSummary,
|
|
54
|
+
renderProgressLine,
|
|
55
|
+
renderRecap,
|
|
56
|
+
} from "./plan.render.js";
|
|
57
|
+
import { renderDryRun, setupFormatters } from "./setup.render.js";
|
|
58
|
+
import type { Scope, ScopeSelection, SetupMode } from "./types.js";
|
|
34
59
|
|
|
35
60
|
/**
|
|
36
|
-
* The `--scope` flag + its `--global`/`--local` boolean sugars
|
|
37
|
-
*
|
|
38
|
-
*
|
|
61
|
+
* The `--scope` flag + its `--global`/`--local` boolean sugars. Registered by
|
|
62
|
+
* EVERY setup verb, including the single-scope ones: a flag that exists on some
|
|
63
|
+
* sub-verbs and not others is a grammar the user has to memorise, and the scope
|
|
64
|
+
* a single-scope target can honour is a question the target table answers.
|
|
65
|
+
*
|
|
66
|
+
* `--global` is a synonym of the default; it stays for scripts and for symmetry
|
|
67
|
+
* with `--local`.
|
|
39
68
|
*/
|
|
40
69
|
const SCOPE_PARAMS: readonly ParamSpec[] = [
|
|
41
70
|
{
|
|
42
71
|
kind: "enum",
|
|
43
72
|
name: "scope",
|
|
44
|
-
doc: "
|
|
73
|
+
doc: "Where to configure: global (your home directory, the default), project (this repository), or both.",
|
|
45
74
|
values: ["project", "global", "both"],
|
|
46
|
-
default: "
|
|
75
|
+
default: "global",
|
|
47
76
|
},
|
|
48
77
|
{
|
|
49
78
|
kind: "boolean",
|
|
50
79
|
name: "global",
|
|
51
|
-
doc: "Shorthand for --scope global
|
|
80
|
+
doc: "Shorthand for --scope global — configure your home directory.",
|
|
52
81
|
},
|
|
53
82
|
{
|
|
54
83
|
kind: "boolean",
|
|
55
84
|
name: "local",
|
|
56
|
-
doc: "Shorthand for --scope project
|
|
85
|
+
doc: "Shorthand for --scope project — configure this project only.",
|
|
57
86
|
},
|
|
58
87
|
];
|
|
59
88
|
|
|
@@ -62,13 +91,47 @@ const SCOPE_PARAMS: readonly ParamSpec[] = [
|
|
|
62
91
|
* The boolean sugars win over `--scope`; `--global` wins over `--local`.
|
|
63
92
|
*
|
|
64
93
|
* @param params - The coerced param bag.
|
|
65
|
-
* @returns The resolved scope selection (defaults to `
|
|
94
|
+
* @returns The resolved scope selection (defaults to `global`).
|
|
66
95
|
*/
|
|
67
96
|
function resolveScope(params: Record<string, unknown>): ScopeSelection {
|
|
68
97
|
if (params.global === true) return "global";
|
|
69
98
|
if (params.local === true) return "project";
|
|
70
99
|
const scope = params.scope;
|
|
71
|
-
return scope === "
|
|
100
|
+
return scope === "project" || scope === "both" ? scope : "global";
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Reject a sub-verb asked for a scope its target cannot hold.
|
|
105
|
+
*
|
|
106
|
+
* This is a usage error, not a skip: the user typed a contradiction, and
|
|
107
|
+
* correcting it is exactly what exit 2 means. The message names the scope the
|
|
108
|
+
* target DOES have and prints the command that works, so the correction is one
|
|
109
|
+
* paste rather than one manual page.
|
|
110
|
+
*
|
|
111
|
+
* @param mode - The sub-verb's target, or `all`.
|
|
112
|
+
* @param scope - The resolved selection.
|
|
113
|
+
* @throws PragmaError INVALID_INPUT when the target has no such scope.
|
|
114
|
+
*/
|
|
115
|
+
async function assertScopeIsPossible(
|
|
116
|
+
mode: SetupMode,
|
|
117
|
+
scope: ScopeSelection,
|
|
118
|
+
): Promise<void> {
|
|
119
|
+
if (mode === "all" || scope === "both") return;
|
|
120
|
+
const { findTarget } = await import("./targets.js");
|
|
121
|
+
const target = findTarget(mode);
|
|
122
|
+
if (target === undefined || target.scopes.includes(scope as Scope)) return;
|
|
123
|
+
const only = target.scopes[0] as Scope;
|
|
124
|
+
const level = only === "global" ? "global only" : "per-project only";
|
|
125
|
+
const asked = scope === "global" ? "globally" : "per project";
|
|
126
|
+
const corrected =
|
|
127
|
+
only === "global"
|
|
128
|
+
? `${BIN_NAME} setup ${mode}`
|
|
129
|
+
: `${BIN_NAME} setup ${mode} --local`;
|
|
130
|
+
throw new PragmaError({
|
|
131
|
+
code: "INVALID_INPUT",
|
|
132
|
+
message: `${mode} is ${level} — it cannot be configured ${asked}.`,
|
|
133
|
+
recovery: { message: `Run: ${corrected}` },
|
|
134
|
+
});
|
|
72
135
|
}
|
|
73
136
|
|
|
74
137
|
/** The exposed-to-MCP capability the run-all self-verb declares. */
|
|
@@ -101,38 +164,98 @@ const SUB_CAPABILITY = {
|
|
|
101
164
|
|
|
102
165
|
/**
|
|
103
166
|
* The one summon↔pragma seam per setup invocation: lazily load summon-core + the
|
|
104
|
-
* generator ops,
|
|
105
|
-
*
|
|
106
|
-
* {@link SetupResult}.
|
|
167
|
+
* generator ops, detect and plan, resolve the interaction mode, wire `rt.exec`,
|
|
168
|
+
* and return the plan with its outcomes filled in.
|
|
107
169
|
*
|
|
108
170
|
* NOTE: `rt.exec` carries NO per-call `cwd`. Unlike `create` (whose generator
|
|
109
|
-
* emits RELATIVE paths jailed to `rt.cwd`), setup's
|
|
110
|
-
* paths themselves
|
|
111
|
-
*
|
|
112
|
-
*
|
|
171
|
+
* emits RELATIVE paths jailed to `rt.cwd`), setup's targets build ABSOLUTE
|
|
172
|
+
* effect paths themselves; the interpreter leaves absolute paths unchanged, so
|
|
173
|
+
* no per-call write root is threaded. No stamping either — setup writes
|
|
174
|
+
* symlinks, config and scripts, not generated source.
|
|
113
175
|
*
|
|
114
|
-
* @param mode - Which entry point (`all` or one
|
|
115
|
-
* @param rt - The per-invocation runtime (mutated: `rt.exec`
|
|
116
|
-
* @
|
|
117
|
-
* @
|
|
118
|
-
*
|
|
176
|
+
* @param mode - Which entry point (`all` or one target).
|
|
177
|
+
* @param rt - The per-invocation runtime (mutated: `rt.exec` and `rt.planData`).
|
|
178
|
+
* @param scope - The resolved scope selection.
|
|
179
|
+
* @returns The `Task<SetupPlan>` the dispatcher/MCP handler interprets.
|
|
180
|
+
* @note Impure — runs every target's real detection before returning a Task.
|
|
119
181
|
*/
|
|
120
182
|
async function runSetup(
|
|
121
183
|
mode: SetupMode,
|
|
122
184
|
rt: PragmaRuntime,
|
|
123
185
|
scope: ScopeSelection,
|
|
124
|
-
): Promise<Task<
|
|
125
|
-
|
|
186
|
+
): Promise<Task<SetupPlan>> {
|
|
187
|
+
await assertScopeIsPossible(mode, scope);
|
|
188
|
+
|
|
189
|
+
// Lazy dynamic imports (lazy-React discipline): summon-core's barrel is
|
|
126
190
|
// React-free, and the non-TTY branch picks autoPrompt/mcpPrompt (never mounts
|
|
127
191
|
// Ink), so `setup --yes` loads no React — the guard test enforces this.
|
|
128
|
-
const [summon, ops] = await Promise.all([
|
|
192
|
+
const [summon, projection, ops] = await Promise.all([
|
|
129
193
|
import("@canonical/summon-core"),
|
|
194
|
+
import("@canonical/summon-core/projection"),
|
|
130
195
|
import("./operations/setupGenerator.js"),
|
|
131
196
|
]);
|
|
132
197
|
|
|
133
|
-
const
|
|
198
|
+
const input = setupModeInput(rt);
|
|
199
|
+
const run = await ops.buildSetupRun(rt, mode, scope, input.undo);
|
|
200
|
+
const interactionMode = resolveSetupMode(input, projection.decideInteraction);
|
|
201
|
+
|
|
202
|
+
// The dry-run seam: the kernel's `--dry-run` branch renders THIS instead of
|
|
203
|
+
// the raw effect dump, while its honest preview still runs underneath and
|
|
204
|
+
// still fails exactly when the real run would.
|
|
205
|
+
rt.planData = { ...run.plan, preview: true };
|
|
206
|
+
|
|
207
|
+
// Whether this invocation only PREVIEWS. The task below is driven either way
|
|
208
|
+
// — that is what makes the preview honest — so anything it says out loud has
|
|
209
|
+
// to know which of the two it is.
|
|
210
|
+
const previewing = interactionMode === "batch-dry-run";
|
|
134
211
|
|
|
135
|
-
|
|
212
|
+
// A CONVERGED machine has no question to ask. Every row is `none` or `skip`,
|
|
213
|
+
// so nothing composes an effect — and the wizard's confirm gate then mounted
|
|
214
|
+
// Ink to render summon-core's "No operations planned." above a "Proceed?"
|
|
215
|
+
// over an empty tally. For a sub-verb, whose prompt list is empty, that
|
|
216
|
+
// contentless gate was the FIRST AND ONLY thing the user ever saw. The
|
|
217
|
+
// explanation existed the whole time (each row's `none` detail, one child row
|
|
218
|
+
// per file/editor marked `unchanged`) and was dropped at the render seam.
|
|
219
|
+
//
|
|
220
|
+
// So: report the plan instead of asking a question with no content. There is
|
|
221
|
+
// no `preview: true` here — the run really did complete. `applied({})` marks
|
|
222
|
+
// each `none` row `{status:"noop", note:"unchanged"}`, `wasApplied` is then
|
|
223
|
+
// true, and `setupFormatters.plain` renders the recap. That also retires a
|
|
224
|
+
// second defect: a non-interactive converged run used to print the misleading
|
|
225
|
+
// "Nothing was applied. Run again with --yes to apply." over an all-`none`
|
|
226
|
+
// plan. A run whose every DETECTION threw is not converged in this sense —
|
|
227
|
+
// its rows are skips that report `failed` — so it falls through to the normal
|
|
228
|
+
// path, which is the one that raises.
|
|
229
|
+
if (!previewing && run.plan.rows.every((row) => !isActionable(row.action))) {
|
|
230
|
+
const converged = run.applied({});
|
|
231
|
+
if (!planExitFailed(converged)) return pure<SetupPlan>(converged);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Adaptation (b): a non-interactive run without `--yes` previews rather than
|
|
235
|
+
// mutating. It is the same plan the dry-run prints, plus one hint line, at
|
|
236
|
+
// exit 0 — the invocation completed a real read-only unit of work.
|
|
237
|
+
if (interactionMode === "refuse") {
|
|
238
|
+
return pure<SetupPlan>({ ...run.plan, preview: true });
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Say what was DETECTED before asking anything about it. The data has been
|
|
242
|
+
// sitting in `run.plan` since before the prompt list was built — `inkPrompt`
|
|
243
|
+
// mounts no React until the first Prompt effect — so this is a rendering gap,
|
|
244
|
+
// not an ordering one, and closing it is nearly free.
|
|
245
|
+
//
|
|
246
|
+
// It MUST be emitted here, before `execute` is driven: the summary and the
|
|
247
|
+
// Ink frame both write to stderr, and only a line written first lands in
|
|
248
|
+
// scrollback ABOVE the frame. `rt.report` is the non-Ink seam — `--quiet`
|
|
249
|
+
// silences it and it is a no-op over MCP — so no React is loaded to print it.
|
|
250
|
+
// A preview says nothing here: the plan table IS its output.
|
|
251
|
+
if (!previewing) {
|
|
252
|
+
const summary = renderDetectionSummary(run.plan, {
|
|
253
|
+
verbose: rt.globalFlags.verbose,
|
|
254
|
+
});
|
|
255
|
+
if (summary !== undefined) rt.report?.(summary);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const { transport, yes, signal, abort } = rt.interaction ?? {
|
|
136
259
|
isTTY: false,
|
|
137
260
|
transport: "cli" as const,
|
|
138
261
|
yes: true,
|
|
@@ -140,10 +263,27 @@ async function runSetup(
|
|
|
140
263
|
|
|
141
264
|
// TTY without --yes → the Ink wizard (recap + live progress). Its callbacks
|
|
142
265
|
// ride rt.exec; `onCancel` threads the run's abort in so an in-Ink Ctrl-C
|
|
143
|
-
// during execution actually stops the writes
|
|
266
|
+
// during execution actually stops the writes.
|
|
144
267
|
let task: Task<GeneratorResult>;
|
|
145
|
-
|
|
146
|
-
|
|
268
|
+
const wizard = interactionMode === "wizard";
|
|
269
|
+
if (wizard) {
|
|
270
|
+
const session = summon.inkPrompt(run.generator, {
|
|
271
|
+
signal,
|
|
272
|
+
onCancel: abort,
|
|
273
|
+
});
|
|
274
|
+
// Live progress in the PLAN's units, not the interpreter's: the wizard's
|
|
275
|
+
// default execution view is the per-effect transcript — right for `create`,
|
|
276
|
+
// whose unit of work IS the file, and wrong here, where one unit is one
|
|
277
|
+
// configured target and the transcript renders eighteen symlink rows for
|
|
278
|
+
// the row the plan called `skills link 9 skills → 2 folders`. Each row
|
|
279
|
+
// event carries the SAME sentence `renderProgressLine` prints, so the
|
|
280
|
+
// watcher and the recap reader see one dialect. `--verbose` withholds the
|
|
281
|
+
// listener, which falls the wizard back to the full effect transcript —
|
|
282
|
+
// the same detected-only-unless-verbose rule the detection summary and
|
|
283
|
+
// doctor already follow.
|
|
284
|
+
if (rt.globalFlags.verbose !== true) {
|
|
285
|
+
run.setRowListener((event) => session.reportStep(event));
|
|
286
|
+
}
|
|
147
287
|
rt.exec = {
|
|
148
288
|
promptHandler: session.promptHandler,
|
|
149
289
|
onEffectStart: session.onEffectStart,
|
|
@@ -152,7 +292,7 @@ async function runSetup(
|
|
|
152
292
|
dispose: session.dispose,
|
|
153
293
|
signal,
|
|
154
294
|
};
|
|
155
|
-
task = summon.execute(generator, {
|
|
295
|
+
task = summon.execute(run.generator, {
|
|
156
296
|
prompt: session.promptHandler,
|
|
157
297
|
params: {},
|
|
158
298
|
signal,
|
|
@@ -166,103 +306,173 @@ async function runSetup(
|
|
|
166
306
|
onLog: (_level, message) => process.stderr.write(`${message}\n`),
|
|
167
307
|
signal,
|
|
168
308
|
};
|
|
169
|
-
task = summon.execute(generator, { prompt, params: {}, signal });
|
|
309
|
+
task = summon.execute(run.generator, { prompt, params: {}, signal });
|
|
170
310
|
}
|
|
171
311
|
|
|
172
|
-
// execute yields a GeneratorResult; map it back onto setup's tagged result
|
|
173
|
-
// union (its --format json shape is frozen). The completion view is driven by
|
|
174
|
-
// controller phase, not this value, so mapping after execute is invisible to
|
|
175
|
-
// the wizard.
|
|
176
312
|
return gen(function* () {
|
|
177
313
|
const result = yield* $(task);
|
|
178
|
-
|
|
314
|
+
const applied = run.applied(result.answers);
|
|
315
|
+
|
|
316
|
+
// Progress: one line per row on stderr for an unattended run (the Ink
|
|
317
|
+
// session already draws them for the wizard). stdout stays the data stream.
|
|
318
|
+
//
|
|
319
|
+
// A dry run reports NOTHING here. Its honest preview drives this very task
|
|
320
|
+
// with writes recorded, so the progress lines ran for real and announced
|
|
321
|
+
// "✓ config — installed" above a plan that had installed nothing.
|
|
322
|
+
if (!previewing && (!wizard || yes)) {
|
|
323
|
+
const width = Math.max(...applied.rows.map((row) => row.target.length));
|
|
324
|
+
for (const row of applied.rows) {
|
|
325
|
+
if (row.outcome === undefined) continue;
|
|
326
|
+
rt.report?.(renderProgressLine(row, width));
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// A failed row exits 1, and the recap is still shown — partial success is
|
|
331
|
+
// first class, so the run reports every row before naming the ones that did
|
|
332
|
+
// not happen. The recap goes to stderr here because the error renderer owns
|
|
333
|
+
// stdout on a failing run.
|
|
334
|
+
if (planExitFailed(applied)) {
|
|
335
|
+
rt.report?.(renderRecap(applied));
|
|
336
|
+
const failed = applied.rows.filter(
|
|
337
|
+
(row) => row.outcome?.status === "failed",
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
// ONE failure reports itself. The row already carries the cause it was
|
|
341
|
+
// given ("`bun` is not found on your PATH") and a remedy that runs on
|
|
342
|
+
// this machine; replacing them with a count would throw away the only
|
|
343
|
+
// two sentences that say what is wrong and what to do about it.
|
|
344
|
+
const only = failed.length === 1 ? failed[0] : undefined;
|
|
345
|
+
if (only?.outcome !== undefined) {
|
|
346
|
+
throw new PragmaError({
|
|
347
|
+
code: "UNSUPPORTED",
|
|
348
|
+
message: `${only.target}: ${only.outcome.note ?? "the step did not complete"}`,
|
|
349
|
+
...(only.outcome.remedy === undefined
|
|
350
|
+
? {}
|
|
351
|
+
: { recovery: { message: only.outcome.remedy } }),
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// Several failures: name every one with its own cause, then point at the
|
|
356
|
+
// recap above. A bare list of target names would make the reader re-run
|
|
357
|
+
// each one to find out why it failed.
|
|
358
|
+
const named = failed
|
|
359
|
+
.map(
|
|
360
|
+
(row) =>
|
|
361
|
+
`${row.target} (${row.outcome?.note ?? "no cause recorded"})`,
|
|
362
|
+
)
|
|
363
|
+
.join("; ");
|
|
364
|
+
throw new PragmaError({
|
|
365
|
+
code: "UNSUPPORTED",
|
|
366
|
+
message: `${failed.length} of ${planTally(applied).accountable} targets did not complete: ${named}.`,
|
|
367
|
+
recovery: {
|
|
368
|
+
message: `The other targets are configured. Re-run the ones that did not complete: ${failed
|
|
369
|
+
.map((row) => `\`${BIN_NAME} setup ${row.target}\``)
|
|
370
|
+
.join(", ")}.`,
|
|
371
|
+
},
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
return applied;
|
|
179
375
|
});
|
|
180
376
|
}
|
|
181
377
|
|
|
182
378
|
/** Build a setup verb bound to its {@link SetupMode}. */
|
|
183
379
|
function setupVerb(
|
|
184
|
-
path: VerbSpec<Record<string, unknown>,
|
|
380
|
+
path: VerbSpec<Record<string, unknown>, SetupPlan>["path"],
|
|
185
381
|
summary: string,
|
|
186
382
|
mode: SetupMode,
|
|
187
383
|
capability: typeof SELF_CAPABILITY | typeof SUB_CAPABILITY,
|
|
188
|
-
extras: Partial<VerbSpec<Record<string, unknown>,
|
|
189
|
-
): VerbSpec<Record<string, unknown>,
|
|
384
|
+
extras: Partial<VerbSpec<Record<string, unknown>, SetupPlan>> = {},
|
|
385
|
+
): VerbSpec<Record<string, unknown>, SetupPlan> {
|
|
190
386
|
return {
|
|
191
387
|
path,
|
|
192
388
|
summary,
|
|
193
|
-
params:
|
|
194
|
-
output: {
|
|
389
|
+
params: SCOPE_PARAMS,
|
|
390
|
+
output: {
|
|
391
|
+
formatters: setupFormatters,
|
|
392
|
+
// The kernel's dry-run branch renders the plan through this seam instead
|
|
393
|
+
// of dumping raw effects. Absent on every other verb, so nothing else
|
|
394
|
+
// changes shape.
|
|
395
|
+
formatPlan: (planData) => renderDryRun(planData as SetupPlan),
|
|
396
|
+
},
|
|
195
397
|
capability,
|
|
196
398
|
...extras,
|
|
197
399
|
run: (params, rt) =>
|
|
198
|
-
runSetup(mode, rt, resolveScope(params)) as unknown as Task<
|
|
400
|
+
runSetup(mode, rt, resolveScope(params)) as unknown as Task<SetupPlan>,
|
|
199
401
|
};
|
|
200
402
|
}
|
|
201
403
|
|
|
202
404
|
const setupAllVerb = setupVerb(
|
|
203
405
|
["setup"],
|
|
204
|
-
"
|
|
406
|
+
"Set up your config file, TAB completion, the editor extension, MCP, and skills.",
|
|
205
407
|
"all",
|
|
206
408
|
SELF_CAPABILITY,
|
|
207
409
|
{
|
|
208
|
-
|
|
209
|
-
doc: "Runs the shell-completions, LSP, MCP, and skills installers as a single wizard: pick the steps, review the recap, then apply. The scope option targets the project band, the user/home band, or both.",
|
|
410
|
+
doc: "Shows what each target needs, then applies the ones you keep. Everything is configured in your home directory by default; the scope option moves the run to this project alone, or covers both. Without an attended terminal the plan is printed and nothing is written unless the run is explicitly confirmed.",
|
|
210
411
|
examples: [
|
|
211
412
|
{ cmd: `${BIN_NAME} setup` },
|
|
212
413
|
{
|
|
213
414
|
cmd: `${BIN_NAME} setup --dry-run`,
|
|
214
|
-
note: "
|
|
415
|
+
note: "show the plan, write nothing",
|
|
215
416
|
},
|
|
216
417
|
{
|
|
217
|
-
cmd: `${BIN_NAME} setup --
|
|
218
|
-
note: "configure
|
|
418
|
+
cmd: `${BIN_NAME} setup --local`,
|
|
419
|
+
note: "configure this project instead of your home directory",
|
|
219
420
|
},
|
|
220
421
|
{
|
|
221
422
|
cmd: `${BIN_NAME} setup mcp`,
|
|
222
|
-
note: "
|
|
423
|
+
note: "only register the MCP server",
|
|
223
424
|
},
|
|
224
425
|
],
|
|
225
426
|
},
|
|
226
427
|
);
|
|
227
428
|
|
|
429
|
+
const configVerb = setupVerb(
|
|
430
|
+
["setup", "config"],
|
|
431
|
+
"Create your global config file, filled in with the defaults.",
|
|
432
|
+
"config",
|
|
433
|
+
SUB_CAPABILITY,
|
|
434
|
+
);
|
|
435
|
+
|
|
228
436
|
const mcpVerb = setupVerb(
|
|
229
437
|
["setup", "mcp"],
|
|
230
|
-
`Register the ${BIN_NAME} MCP server
|
|
438
|
+
`Register the ${BIN_NAME} MCP server with the AI harnesses on this machine.`,
|
|
231
439
|
"mcp",
|
|
232
440
|
SUB_CAPABILITY,
|
|
233
|
-
{ params: SCOPE_PARAMS },
|
|
234
441
|
);
|
|
235
442
|
|
|
236
443
|
const completionsVerb = setupVerb(
|
|
237
444
|
["setup", "completions"],
|
|
238
|
-
"Install
|
|
445
|
+
"Install TAB completion for the shell you are running.",
|
|
239
446
|
"completions",
|
|
240
447
|
SUB_CAPABILITY,
|
|
241
448
|
);
|
|
242
449
|
|
|
243
450
|
const skillsVerb = setupVerb(
|
|
244
451
|
["setup", "skills"],
|
|
245
|
-
"
|
|
452
|
+
"Link the skills you have installed into every AI harness that reads them.",
|
|
246
453
|
"skills",
|
|
247
454
|
SUB_CAPABILITY,
|
|
248
|
-
{ params: SCOPE_PARAMS },
|
|
249
455
|
);
|
|
250
456
|
|
|
251
457
|
const lspVerb = setupVerb(
|
|
252
458
|
["setup", "lsp"],
|
|
253
|
-
"
|
|
459
|
+
"Install the Terrazzo design-token extension into your VS Code-family editors.",
|
|
254
460
|
"lsp",
|
|
255
461
|
SUB_CAPABILITY,
|
|
256
462
|
);
|
|
257
463
|
|
|
258
|
-
/** The `setup` capability module (run-all self-verb +
|
|
464
|
+
/** The `setup` capability module (run-all self-verb + five CLI-only sub-verbs). */
|
|
259
465
|
export const setupModule: CapabilityModule = {
|
|
260
466
|
name: "setup",
|
|
261
467
|
verbs: [
|
|
262
468
|
asVerb(setupAllVerb),
|
|
263
|
-
asVerb(
|
|
469
|
+
asVerb(configVerb),
|
|
264
470
|
asVerb(completionsVerb),
|
|
265
|
-
asVerb(skillsVerb),
|
|
266
471
|
asVerb(lspVerb),
|
|
472
|
+
asVerb(mcpVerb),
|
|
473
|
+
asVerb(skillsVerb),
|
|
267
474
|
],
|
|
268
475
|
};
|
|
476
|
+
|
|
477
|
+
/** Re-exported so the covenant emitter and tests can name the target set. */
|
|
478
|
+
export { TARGET_IDS };
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shell detection — the shell the user is RUNNING, not the one `/etc/passwd`
|
|
3
|
+
* records.
|
|
4
|
+
*
|
|
5
|
+
* The defect these pin: `$SHELL` is the LOGIN shell. It does not change when
|
|
6
|
+
* you start a different shell, so a user whose account says bash but who works
|
|
7
|
+
* in zsh was handed a bash completion script — and doctor then reported it
|
|
8
|
+
* green, for a shell they never open, while zsh had nothing. The failure is
|
|
9
|
+
* invisible until TAB does nothing months later, which is exactly why an
|
|
10
|
+
* unresolved shell must be reported rather than guessed.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
14
|
+
import { detectShell, type ProcessEntry } from "./shell.js";
|
|
15
|
+
|
|
16
|
+
/** A fake process tree: pid → entry, walked exactly as /proc would be. */
|
|
17
|
+
const tree = (entries: Record<number, ProcessEntry>) => (pid: number) =>
|
|
18
|
+
entries[pid];
|
|
19
|
+
|
|
20
|
+
const prevShell = process.env.SHELL;
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
process.env.SHELL = prevShell;
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe("the running shell wins over $SHELL", () => {
|
|
26
|
+
it("reports the shell that actually started this process", () => {
|
|
27
|
+
// The case from a real machine: login shell bash, working shell zsh.
|
|
28
|
+
process.env.SHELL = "/bin/bash";
|
|
29
|
+
const read = tree({
|
|
30
|
+
[process.ppid]: { name: "zsh", ppid: 100 },
|
|
31
|
+
100: { name: "systemd", ppid: 1 },
|
|
32
|
+
});
|
|
33
|
+
expect(detectShell(read)).toEqual({ kind: "detected", shell: "zsh" });
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("walks past the wrappers a CLI is usually reached through", () => {
|
|
37
|
+
// `npm run` / `bunx` / a shim script put node or sh between the shell and
|
|
38
|
+
// us, so the immediate parent is almost never the answer.
|
|
39
|
+
process.env.SHELL = "/bin/bash";
|
|
40
|
+
const read = tree({
|
|
41
|
+
[process.ppid]: { name: "node", ppid: 200 },
|
|
42
|
+
200: { name: "npm", ppid: 300 },
|
|
43
|
+
300: { name: "fish", ppid: 400 },
|
|
44
|
+
});
|
|
45
|
+
expect(detectShell(read)).toEqual({ kind: "detected", shell: "fish" });
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("strips the login dash and any path", () => {
|
|
49
|
+
const read = tree({ [process.ppid]: { name: "-zsh", ppid: 1 } });
|
|
50
|
+
expect(detectShell(read)).toEqual({ kind: "detected", shell: "zsh" });
|
|
51
|
+
const path = tree({ [process.ppid]: { name: "/usr/bin/bash", ppid: 1 } });
|
|
52
|
+
expect(detectShell(path)).toEqual({ kind: "detected", shell: "bash" });
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
describe("an unresolved shell is reported, never guessed", () => {
|
|
57
|
+
it("is ambiguous when only $SHELL has an opinion", () => {
|
|
58
|
+
// No shell in the ancestry — a CI runner, an editor task, a daemon. The
|
|
59
|
+
// login shell names a session that may not exist, so it is not an answer.
|
|
60
|
+
process.env.SHELL = "/bin/bash";
|
|
61
|
+
const read = tree({
|
|
62
|
+
[process.ppid]: { name: "node", ppid: 900 },
|
|
63
|
+
900: { name: "containerd", ppid: 1 },
|
|
64
|
+
});
|
|
65
|
+
expect(detectShell(read)).toEqual({ kind: "ambiguous", login: "bash" });
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("is unknown when nothing names a supported shell", () => {
|
|
69
|
+
process.env.SHELL = "/usr/bin/nu";
|
|
70
|
+
const read = tree({ [process.ppid]: { name: "init", ppid: 1 } });
|
|
71
|
+
expect(detectShell(read)).toEqual({ kind: "unknown" });
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("is unknown when $SHELL is unset and the tree is silent", () => {
|
|
75
|
+
process.env.SHELL = "";
|
|
76
|
+
const read = tree({ [process.ppid]: { name: "init", ppid: 1 } });
|
|
77
|
+
expect(detectShell(read)).toEqual({ kind: "unknown" });
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("gives up rather than walking an unbounded tree", () => {
|
|
81
|
+
// A cycle (or a very deep tree) must terminate.
|
|
82
|
+
process.env.SHELL = "";
|
|
83
|
+
const read = (pid: number): ProcessEntry => ({ name: "node", ppid: pid });
|
|
84
|
+
expect(detectShell(read)).toEqual({ kind: "unknown" });
|
|
85
|
+
});
|
|
86
|
+
});
|