@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,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shell detection + completion-script install paths
|
|
3
|
-
* shell's `setup/helpers/detectShell` + `completionScripts` path helpers).
|
|
2
|
+
* Shell detection + completion-script install paths.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Shell selection is detection-only, and detection means the shell the user is
|
|
5
|
+
* RUNNING — read from the process tree — not the login shell `$SHELL` records.
|
|
6
|
+
* The two differ constantly and the difference is invisible until TAB fails.
|
|
7
7
|
* `$HOME` is read at call time so tests can isolate it.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
+
import { execFileSync } from "node:child_process";
|
|
11
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
10
12
|
import { homedir } from "node:os";
|
|
11
13
|
import { join } from "node:path";
|
|
12
14
|
import { BIN_NAME } from "../../constants.js";
|
|
@@ -21,15 +23,139 @@ const SHELL_MAP: Record<string, ShellId> = {
|
|
|
21
23
|
};
|
|
22
24
|
|
|
23
25
|
/**
|
|
24
|
-
*
|
|
26
|
+
* What detection concluded about the shell the user is actually in.
|
|
25
27
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
+
* `ambiguous` is a first-class answer, not a failure to try harder. Installing
|
|
29
|
+
* for the wrong shell is INVISIBLE: the file is written, `doctor` goes green,
|
|
30
|
+
* and the user finds out when they press TAB months later and nothing happens.
|
|
31
|
+
* A named skip that says what was seen is worth more than a confident guess.
|
|
28
32
|
*/
|
|
29
|
-
export
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
export type ShellDetection =
|
|
34
|
+
| { readonly kind: "detected"; readonly shell: ShellId }
|
|
35
|
+
| {
|
|
36
|
+
readonly kind: "ambiguous";
|
|
37
|
+
/** What `$SHELL` claims, when it names a shell we support. */
|
|
38
|
+
readonly login: ShellId;
|
|
39
|
+
}
|
|
40
|
+
| { readonly kind: "unknown" };
|
|
41
|
+
|
|
42
|
+
/** One process in the ancestry: what it is called, and who started it. */
|
|
43
|
+
export interface ProcessEntry {
|
|
44
|
+
readonly name: string;
|
|
45
|
+
readonly ppid: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Look up one process. Injected in tests so the tree is deterministic. */
|
|
49
|
+
export type ProcessReader = (pid: number) => ProcessEntry | undefined;
|
|
50
|
+
|
|
51
|
+
/** How far up the process tree to look before giving up. */
|
|
52
|
+
const MAX_ANCESTRY = 8;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The command name and parent of a pid, read from `/proc` (Linux).
|
|
56
|
+
*
|
|
57
|
+
* `/proc/<pid>/stat` is `pid (comm) state ppid …`, and `comm` may itself
|
|
58
|
+
* contain spaces and parentheses — so the fields are taken after the LAST
|
|
59
|
+
* `)`, never by splitting the whole line.
|
|
60
|
+
*
|
|
61
|
+
* @param pid - The process to inspect.
|
|
62
|
+
* @returns Its command name and parent pid, or undefined when unreadable.
|
|
63
|
+
* @note Impure — reads /proc.
|
|
64
|
+
*/
|
|
65
|
+
function procEntry(pid: number): { name: string; ppid: number } | undefined {
|
|
66
|
+
try {
|
|
67
|
+
const stat = readFileSync(`/proc/${pid}/stat`, "utf8");
|
|
68
|
+
const close = stat.lastIndexOf(")");
|
|
69
|
+
const open = stat.indexOf("(");
|
|
70
|
+
if (close < 0 || open < 0) return undefined;
|
|
71
|
+
const name = stat.slice(open + 1, close);
|
|
72
|
+
const rest = stat.slice(close + 2).split(" ");
|
|
73
|
+
const ppid = Number.parseInt(rest[1] ?? "", 10);
|
|
74
|
+
return Number.isFinite(ppid) ? { name, ppid } : undefined;
|
|
75
|
+
} catch {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* The same lookup for platforms without `/proc`, via one `ps` call.
|
|
82
|
+
*
|
|
83
|
+
* @param pid - The process to inspect.
|
|
84
|
+
* @returns Its command name and parent pid, or undefined.
|
|
85
|
+
* @note Impure — spawns `ps`.
|
|
86
|
+
*/
|
|
87
|
+
function psEntry(pid: number): { name: string; ppid: number } | undefined {
|
|
88
|
+
try {
|
|
89
|
+
const out = execFileSync("ps", ["-o", "ppid=,comm=", "-p", String(pid)], {
|
|
90
|
+
encoding: "utf8",
|
|
91
|
+
timeout: 2000,
|
|
92
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
93
|
+
}).trim();
|
|
94
|
+
const match = /^(\d+)\s+(.*)$/.exec(out);
|
|
95
|
+
if (match === null) return undefined;
|
|
96
|
+
return { name: match[2] ?? "", ppid: Number.parseInt(match[1] ?? "", 10) };
|
|
97
|
+
} catch {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Normalize a process name to a shell id: `-zsh`, `/bin/bash`, `zsh` all map. */
|
|
103
|
+
function asShell(name: string): ShellId | undefined {
|
|
104
|
+
const base = (name.split("/").pop() ?? "").replace(/^-/, "");
|
|
105
|
+
return SHELL_MAP[base];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Walk the process ancestry looking for the shell this invocation is running
|
|
110
|
+
* inside.
|
|
111
|
+
*
|
|
112
|
+
* The walk matters: a CLI reached through `npm run`, `bunx`, or a wrapper
|
|
113
|
+
* script has `node` or `sh` as its immediate parent, and the user's actual
|
|
114
|
+
* shell is a level or two further up.
|
|
115
|
+
*
|
|
116
|
+
* @returns The shell found, or undefined.
|
|
117
|
+
* @note Impure — reads the process table.
|
|
118
|
+
*/
|
|
119
|
+
function runningShell(read?: ProcessReader): ShellId | undefined {
|
|
120
|
+
const entryOf = read ?? (existsSync("/proc") ? procEntry : psEntry);
|
|
121
|
+
let pid = process.ppid;
|
|
122
|
+
for (let step = 0; step < MAX_ANCESTRY && pid > 1; step += 1) {
|
|
123
|
+
const entry = entryOf(pid);
|
|
124
|
+
if (entry === undefined) return undefined;
|
|
125
|
+
const shell = asShell(entry.name);
|
|
126
|
+
if (shell !== undefined) return shell;
|
|
127
|
+
pid = entry.ppid;
|
|
128
|
+
}
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Detect the shell the user is actually running in.
|
|
134
|
+
*
|
|
135
|
+
* This reads the PROCESS TREE, not `$SHELL`. `$SHELL` is the login shell
|
|
136
|
+
* recorded in `/etc/passwd`; it is not changed by starting a different shell,
|
|
137
|
+
* so a user whose account says `bash` but who lives in `zsh` was silently
|
|
138
|
+
* given a bash script — and `doctor` then reported `✓ Shell completions: bash
|
|
139
|
+
* up to date and resolving`, a green check for a shell they never open, while
|
|
140
|
+
* the shell they do use had nothing.
|
|
141
|
+
*
|
|
142
|
+
* `$SHELL` survives only as a CONTRADICTION detector. When the process tree
|
|
143
|
+
* gives no answer (a CI runner, an editor task, a daemon), a `$SHELL` value is
|
|
144
|
+
* a guess about a session that may not exist, so the answer is `ambiguous` and
|
|
145
|
+
* the caller is expected to say so rather than pick.
|
|
146
|
+
*
|
|
147
|
+
* @param read - Injected process-table reader; defaults to the real one.
|
|
148
|
+
* @returns What could be established about the running shell.
|
|
149
|
+
* @note Impure — reads the process table and `$SHELL`.
|
|
150
|
+
*/
|
|
151
|
+
export function detectShell(read?: ProcessReader): ShellDetection {
|
|
152
|
+
const running = runningShell(read);
|
|
153
|
+
if (running !== undefined) return { kind: "detected", shell: running };
|
|
154
|
+
|
|
155
|
+
const login = SHELL_MAP[(process.env.SHELL ?? "").split("/").pop() ?? ""];
|
|
156
|
+
return login === undefined
|
|
157
|
+
? { kind: "unknown" }
|
|
158
|
+
: { kind: "ambiguous", login };
|
|
33
159
|
}
|
|
34
160
|
|
|
35
161
|
/**
|
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE target table — the one list `setup` and `doctor` both read.
|
|
3
|
+
*
|
|
4
|
+
* Five rows, each with a scope column. This table drives the `setup <target>`
|
|
5
|
+
* sub-verbs, the wizard's choices, the `--dry-run` plan, the progress lines, the
|
|
6
|
+
* recap, the doctor rows, and each doctor row's `fix:` line. Adding a sixth
|
|
7
|
+
* target is one row here — not a new sub-verb, a new check, a new recap branch
|
|
8
|
+
* and a new fix string that four separate files have to agree about.
|
|
9
|
+
*
|
|
10
|
+
* A row owns: its identity (`id` is BOTH the sub-verb argument and the doctor
|
|
11
|
+
* row name, so `mcp` and `setup mcp` visibly share a token), which scopes it can
|
|
12
|
+
* be installed into, how to DETECT its current state, how to PLAN a run from
|
|
13
|
+
* that detection, and how to COMPOSE the forward and removal effects. Detection
|
|
14
|
+
* runs once per invocation and feeds every reader, so setup and doctor cannot
|
|
15
|
+
* disagree about what they looked at.
|
|
16
|
+
*
|
|
17
|
+
* What a row does NOT own is diagnosis. `doctor/runChecks.ts` maps a row's
|
|
18
|
+
* detection onto a check result itself: the completions check needs helpers that
|
|
19
|
+
* live under `doctor/`, and importing them here would make the two directories
|
|
20
|
+
* import each other. The bijection is unaffected — doctor enumerates THIS table
|
|
21
|
+
* and derives every row name and `fix:` line from it.
|
|
22
|
+
*
|
|
23
|
+
* This module is reached only through the verb's lazy dynamic import (and
|
|
24
|
+
* doctor's), so nothing here lands on the `--help`/`__complete` fast path.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import type { Task } from "@canonical/task";
|
|
28
|
+
import { BIN_NAME } from "../../constants.js";
|
|
29
|
+
import type { PragmaRuntime } from "../../kernel/runtime/index.js";
|
|
30
|
+
import {
|
|
31
|
+
type CompletionsDetection,
|
|
32
|
+
composeCompletions,
|
|
33
|
+
composeCompletionsRemoval,
|
|
34
|
+
detectCompletions,
|
|
35
|
+
} from "./operations/setupCompletions.js";
|
|
36
|
+
import {
|
|
37
|
+
type ConfigDetection,
|
|
38
|
+
composeConfigFile,
|
|
39
|
+
composeConfigRemoval,
|
|
40
|
+
detectConfigFile,
|
|
41
|
+
} from "./operations/setupConfig.js";
|
|
42
|
+
import {
|
|
43
|
+
composeLsp,
|
|
44
|
+
composeLspRemoval,
|
|
45
|
+
detectLsp,
|
|
46
|
+
LSP_SKIP_REMEDY,
|
|
47
|
+
type LspDetection,
|
|
48
|
+
lspEditorNames,
|
|
49
|
+
lspSkipReason,
|
|
50
|
+
ownedLspEditors,
|
|
51
|
+
} from "./operations/setupLsp.js";
|
|
52
|
+
import {
|
|
53
|
+
composeMcp,
|
|
54
|
+
composeMcpRemoval,
|
|
55
|
+
detectMcp,
|
|
56
|
+
type McpDetection,
|
|
57
|
+
mcpGroupState,
|
|
58
|
+
ownedMcpGroups,
|
|
59
|
+
selectedGroups,
|
|
60
|
+
} from "./operations/setupMcp.js";
|
|
61
|
+
import {
|
|
62
|
+
composeSkills,
|
|
63
|
+
composeSkillsRemoval,
|
|
64
|
+
detectSkills,
|
|
65
|
+
ownedSkillLinks,
|
|
66
|
+
type SkillsDetection,
|
|
67
|
+
skillsSkipReason,
|
|
68
|
+
skillsSkipRemedy,
|
|
69
|
+
staleSkillLinks,
|
|
70
|
+
} from "./operations/setupSkills.js";
|
|
71
|
+
import {
|
|
72
|
+
type PlanAction,
|
|
73
|
+
type PlanChildRow,
|
|
74
|
+
type SetupPlan,
|
|
75
|
+
shortenPath,
|
|
76
|
+
type TargetId,
|
|
77
|
+
} from "./plan.js";
|
|
78
|
+
import type { Scope } from "./types.js";
|
|
79
|
+
|
|
80
|
+
/** What a target contributes to one plan row, before selection is applied. */
|
|
81
|
+
export interface TargetDraft {
|
|
82
|
+
readonly action: PlanAction;
|
|
83
|
+
readonly detail: string;
|
|
84
|
+
/** REQUIRED when the action is `skip`. */
|
|
85
|
+
readonly reason?: string;
|
|
86
|
+
readonly children?: readonly PlanChildRow[];
|
|
87
|
+
/** An action that works on THIS machine NOW, or absent. */
|
|
88
|
+
readonly remedy?: string;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** The context a draft is rendered against — the plan's two named roots. */
|
|
92
|
+
export type Roots = SetupPlan["roots"];
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* One row of the table, generic over its own detection type. Every consumer
|
|
96
|
+
* treats the detection as opaque and hands it straight back to the same row,
|
|
97
|
+
* which is what lets five unrelated detections share one loop.
|
|
98
|
+
*/
|
|
99
|
+
export interface TargetDefinition<D> {
|
|
100
|
+
readonly id: TargetId;
|
|
101
|
+
/** Human title, used where a sentence needs one; the id is the row name. */
|
|
102
|
+
readonly title: string;
|
|
103
|
+
readonly scopes: readonly Scope[];
|
|
104
|
+
/** Real reads, up front, once per (target, scope) per invocation. */
|
|
105
|
+
detect(rt: PragmaRuntime, scope: Scope): Promise<D>;
|
|
106
|
+
/** What a forward run would do. */
|
|
107
|
+
plan(detection: D, scope: Scope, roots: Roots): TargetDraft;
|
|
108
|
+
/** What a removal would do — composed from what detection says we own. */
|
|
109
|
+
removalPlan(detection: D, scope: Scope, roots: Roots): TargetDraft;
|
|
110
|
+
/**
|
|
111
|
+
* The forward effects. `chosen` is the row's per-child selection (MCP file
|
|
112
|
+
* paths); a row without children ignores it.
|
|
113
|
+
*/
|
|
114
|
+
compose(detection: D, chosen?: readonly string[]): Task<void>;
|
|
115
|
+
/** The removal effects: forward re-assertion carrying the reversal as `undo`. */
|
|
116
|
+
composeRemoval(detection: D): Task<void>;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** A table row with its detection type erased — how every consumer holds one. */
|
|
120
|
+
export type AnyTarget = TargetDefinition<never>;
|
|
121
|
+
|
|
122
|
+
/** Erase a row's detection type so the five rows can share one array. */
|
|
123
|
+
const defineTarget = <D>(target: TargetDefinition<D>): AnyTarget =>
|
|
124
|
+
target as unknown as AnyTarget;
|
|
125
|
+
|
|
126
|
+
// =============================================================================
|
|
127
|
+
// The rows
|
|
128
|
+
// =============================================================================
|
|
129
|
+
|
|
130
|
+
const configTarget = defineTarget<ConfigDetection>({
|
|
131
|
+
id: "config",
|
|
132
|
+
title: "Global configuration",
|
|
133
|
+
scopes: ["global"],
|
|
134
|
+
detect: () => detectConfigFile(),
|
|
135
|
+
plan: (d, _scope, roots) => {
|
|
136
|
+
const path = shortenPath(d.path, roots);
|
|
137
|
+
if (!d.exists) return { action: "install", detail: path };
|
|
138
|
+
return { action: "none", detail: `${path} — present` };
|
|
139
|
+
},
|
|
140
|
+
removalPlan: (d, _scope, roots) => {
|
|
141
|
+
const path = shortenPath(d.path, roots);
|
|
142
|
+
if (!d.exists) return { action: "none", detail: `${path} — absent` };
|
|
143
|
+
if (!d.isSeed) {
|
|
144
|
+
return {
|
|
145
|
+
action: "skip",
|
|
146
|
+
detail: path,
|
|
147
|
+
reason: `it holds your own settings, so ${path} stays`,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return { action: "remove", detail: path };
|
|
151
|
+
},
|
|
152
|
+
compose: (d) => composeConfigFile(d),
|
|
153
|
+
composeRemoval: (d) => composeConfigRemoval(d),
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
const completionsTarget = defineTarget<CompletionsDetection>({
|
|
157
|
+
id: "completions",
|
|
158
|
+
title: "Shell completions",
|
|
159
|
+
scopes: ["global"],
|
|
160
|
+
detect: (rt) => detectCompletions(rt.cwd),
|
|
161
|
+
plan: (d, _scope, roots) => {
|
|
162
|
+
// Never guess a shell. Installing for the wrong one is invisible until the
|
|
163
|
+
// user presses TAB and nothing happens, so an unresolved shell is a named
|
|
164
|
+
// skip whose remedy is the one action that DOES settle it.
|
|
165
|
+
if (d.detection.kind === "ambiguous") {
|
|
166
|
+
return {
|
|
167
|
+
action: "skip",
|
|
168
|
+
detail: "the running shell cannot be identified",
|
|
169
|
+
reason: `the running shell cannot be identified — SHELL names ${d.detection.login}, which is the login shell, not necessarily the one in use`,
|
|
170
|
+
remedy: `run \`${BIN_NAME} setup completions\` from the shell you want completions in`,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
if (d.detection.kind === "unknown" || d.shell === null || d.path === null) {
|
|
174
|
+
return {
|
|
175
|
+
action: "skip",
|
|
176
|
+
detail: "no supported shell detected",
|
|
177
|
+
reason: "no bash, zsh, or fish was found in this process tree",
|
|
178
|
+
remedy: `run \`${BIN_NAME} setup completions\` from bash, zsh, or fish`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// The script spawns the binary for every name context. Installing one that
|
|
182
|
+
// cannot reach it writes a file that silently does nothing.
|
|
183
|
+
if (!d.binOnPath) {
|
|
184
|
+
return {
|
|
185
|
+
action: "skip",
|
|
186
|
+
detail: `${BIN_NAME} is not on PATH`,
|
|
187
|
+
reason: `the completion script runs \`${BIN_NAME}\`, which this shell cannot find on PATH`,
|
|
188
|
+
remedy: `put \`${BIN_NAME}\` on your PATH, then run this again`,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
const where = `${d.shell} → ${shortenPath(d.path, roots)}`;
|
|
192
|
+
// A no-op row says what it FOUND, not just where it looked: `no change`
|
|
193
|
+
// beside a bare path leaves the reader to guess whether the script is
|
|
194
|
+
// there and current or missing and unreachable.
|
|
195
|
+
if (d.state === "installed") {
|
|
196
|
+
return { action: "none", detail: `${where} — already up to date` };
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
action: d.state === "stale" ? "update" : "install",
|
|
200
|
+
detail: where,
|
|
201
|
+
};
|
|
202
|
+
},
|
|
203
|
+
removalPlan: (d, _scope, roots) => {
|
|
204
|
+
if (d.path === null || d.state === "absent") {
|
|
205
|
+
return { action: "none", detail: "no script installed" };
|
|
206
|
+
}
|
|
207
|
+
return { action: "remove", detail: shortenPath(d.path, roots) };
|
|
208
|
+
},
|
|
209
|
+
compose: (d) => composeCompletions(d),
|
|
210
|
+
composeRemoval: (d) => composeCompletionsRemoval(d),
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
const lspTarget = defineTarget<LspDetection>({
|
|
214
|
+
id: "lsp",
|
|
215
|
+
title: "Terrazzo LSP extension",
|
|
216
|
+
scopes: ["global"],
|
|
217
|
+
detect: (rt) => detectLsp(rt.cwd),
|
|
218
|
+
plan: (d) => {
|
|
219
|
+
if (d.state === "unknown") {
|
|
220
|
+
return {
|
|
221
|
+
action: "skip",
|
|
222
|
+
detail: lspSkipReason(d),
|
|
223
|
+
reason: lspSkipReason(d),
|
|
224
|
+
remedy: LSP_SKIP_REMEDY,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
// One child per detected editor, exactly like the mcp row's files: a
|
|
228
|
+
// machine with several VS Code forks on PATH should not have the extension
|
|
229
|
+
// pushed into all of them because they happen to be installed.
|
|
230
|
+
const children: PlanChildRow[] = d.editors.map((e) => ({
|
|
231
|
+
key: e.editor.cli,
|
|
232
|
+
label: `${e.editor.cli} — ${e.editor.name}`,
|
|
233
|
+
action: e.installed ? ("unchanged" as const) : ("add" as const),
|
|
234
|
+
}));
|
|
235
|
+
// The detail names WHAT is being placed and WHERE — never the row's own
|
|
236
|
+
// state, which the action column already carries. `installed (VSCodium)`
|
|
237
|
+
// beside a child row reading `codium — VSCodium (unchanged)` said the
|
|
238
|
+
// editor's name twice and "nothing happens here" twice.
|
|
239
|
+
if (d.state === "installed") {
|
|
240
|
+
return {
|
|
241
|
+
action: "none",
|
|
242
|
+
detail: `Terrazzo extension in ${lspEditorNames(d).join(", ")}`,
|
|
243
|
+
children,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
const pending = d.editors.filter((e) => !e.installed);
|
|
247
|
+
return {
|
|
248
|
+
action: "install",
|
|
249
|
+
detail: `Terrazzo extension → ${pending
|
|
250
|
+
.map((e) => e.editor.name)
|
|
251
|
+
.join(", ")}`,
|
|
252
|
+
children,
|
|
253
|
+
};
|
|
254
|
+
},
|
|
255
|
+
removalPlan: (d) => {
|
|
256
|
+
// No editor CLI on PATH is the SAME named skip the forward plan reports:
|
|
257
|
+
// there is nothing on this machine to run an uninstall with.
|
|
258
|
+
if (d.state === "unknown") {
|
|
259
|
+
return {
|
|
260
|
+
action: "skip",
|
|
261
|
+
detail: lspSkipReason(d),
|
|
262
|
+
reason: lspSkipReason(d),
|
|
263
|
+
remedy: LSP_SKIP_REMEDY,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
// Removal is composed from what detection says we OWN — a copy that is
|
|
267
|
+
// present, whatever its version. The forward plan's version gate would let
|
|
268
|
+
// a dead pre-0.8.3 copy this command installed survive its own `--undo`.
|
|
269
|
+
const owned = ownedLspEditors(d);
|
|
270
|
+
if (owned.length === 0) {
|
|
271
|
+
return { action: "none", detail: "no editor carries the extension" };
|
|
272
|
+
}
|
|
273
|
+
return {
|
|
274
|
+
action: "remove",
|
|
275
|
+
detail: `Terrazzo extension from ${owned
|
|
276
|
+
.map((e) => e.editor.name)
|
|
277
|
+
.join(", ")}`,
|
|
278
|
+
children: owned.map((e) => ({
|
|
279
|
+
key: e.editor.cli,
|
|
280
|
+
label: `${e.editor.cli} — ${e.editor.name}`,
|
|
281
|
+
action: "update" as const,
|
|
282
|
+
})),
|
|
283
|
+
};
|
|
284
|
+
},
|
|
285
|
+
compose: (d, chosen) => composeLsp(d, chosen),
|
|
286
|
+
composeRemoval: (d) => composeLspRemoval(d),
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Why the `mcp` row has nothing to write in a scope — authored once, because
|
|
291
|
+
* `setup`'s row and `doctor`'s row are the same finding and must not word it
|
|
292
|
+
* differently. Neither sentence says "scope": the two scopes are `global` and
|
|
293
|
+
* `local project`, after the `--global` / `--local` flags that select them.
|
|
294
|
+
*/
|
|
295
|
+
export const MCP_NO_LOCATION: Record<Scope, string> = {
|
|
296
|
+
global: "no AI harness on this machine keeps a global config",
|
|
297
|
+
project: "no AI harness in this project keeps a per-project config",
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
/** One MCP file as a plan child: its path, the harnesses sharing it, its state. */
|
|
301
|
+
const mcpChild = (
|
|
302
|
+
d: McpDetection,
|
|
303
|
+
group: McpDetection["groups"][number],
|
|
304
|
+
roots: Roots,
|
|
305
|
+
): PlanChildRow => {
|
|
306
|
+
const state = mcpGroupState(d, group.path);
|
|
307
|
+
return {
|
|
308
|
+
key: group.path,
|
|
309
|
+
label: shortenPath(group.path, roots),
|
|
310
|
+
action:
|
|
311
|
+
state === "registered"
|
|
312
|
+
? "unchanged"
|
|
313
|
+
: state === "drifted"
|
|
314
|
+
? "update"
|
|
315
|
+
: "add",
|
|
316
|
+
};
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
const mcpTarget = defineTarget<McpDetection>({
|
|
320
|
+
id: "mcp",
|
|
321
|
+
title: "MCP server registration",
|
|
322
|
+
scopes: ["global", "project"],
|
|
323
|
+
detect: (rt, scope) => detectMcp(rt, scope),
|
|
324
|
+
plan: (d, scope, roots) => {
|
|
325
|
+
if (d.groups.length === 0) {
|
|
326
|
+
return {
|
|
327
|
+
action: "skip",
|
|
328
|
+
detail: MCP_NO_LOCATION[scope],
|
|
329
|
+
reason: MCP_NO_LOCATION[scope],
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
const children = d.groups.map((group) => mcpChild(d, group, roots));
|
|
333
|
+
const pending = children.filter((c) => c.action !== "unchanged");
|
|
334
|
+
return {
|
|
335
|
+
action: pending.length === 0 ? "none" : "update",
|
|
336
|
+
detail: `${d.groups.length} ${
|
|
337
|
+
d.groups.length === 1 ? "config file" : "config files"
|
|
338
|
+
}`,
|
|
339
|
+
children,
|
|
340
|
+
};
|
|
341
|
+
},
|
|
342
|
+
removalPlan: (d, _scope, roots) => {
|
|
343
|
+
const owned = ownedMcpGroups(d);
|
|
344
|
+
if (owned.length === 0) {
|
|
345
|
+
return { action: "none", detail: "no entry to remove" };
|
|
346
|
+
}
|
|
347
|
+
return {
|
|
348
|
+
action: "remove",
|
|
349
|
+
detail: `${owned.length} ${owned.length === 1 ? "config file" : "config files"}`,
|
|
350
|
+
children: owned.map((group) => ({
|
|
351
|
+
key: group.path,
|
|
352
|
+
label: shortenPath(group.path, roots),
|
|
353
|
+
action: "update" as const,
|
|
354
|
+
})),
|
|
355
|
+
};
|
|
356
|
+
},
|
|
357
|
+
compose: (d, chosen) =>
|
|
358
|
+
composeMcp(d, chosen ? selectedGroups(d, chosen) : d.groups),
|
|
359
|
+
composeRemoval: (d) => composeMcpRemoval(d),
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
const skillsTarget = defineTarget<SkillsDetection>({
|
|
363
|
+
id: "skills",
|
|
364
|
+
title: "Skill symlinks",
|
|
365
|
+
scopes: ["global", "project"],
|
|
366
|
+
detect: (rt, scope) => detectSkills(rt, scope),
|
|
367
|
+
plan: (d, scope, roots) => {
|
|
368
|
+
// A forward run RECONCILES: stale links this scope owns are its work too, so
|
|
369
|
+
// an orphan-only tree is actionable rather than a row that plans `none` and
|
|
370
|
+
// is then deselected into doing nothing. `staleSkillLinks` carries the
|
|
371
|
+
// absent-root safety gate, so a machine whose source root does not exist
|
|
372
|
+
// contributes no sweep and the row falls back to the honest skip.
|
|
373
|
+
const stale = staleSkillLinks(d);
|
|
374
|
+
if (!d.available && stale.length === 0) {
|
|
375
|
+
const short = shortenPath(d.sourceRoot, roots);
|
|
376
|
+
const reason = skillsSkipReason(short, scope, d.rootExists);
|
|
377
|
+
// A skip with no remedy is a dead end — this one names the command that
|
|
378
|
+
// fills the scope's source root, exactly as the completions and lsp skips
|
|
379
|
+
// beside it name theirs.
|
|
380
|
+
return {
|
|
381
|
+
action: "skip",
|
|
382
|
+
detail: reason,
|
|
383
|
+
reason,
|
|
384
|
+
remedy: skillsSkipRemedy(short, scope),
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
const dirs = d.targets.map((t) => shortenPath(t.dir, roots)).join(", ");
|
|
388
|
+
const where = `${d.skillCount} ${d.skillCount === 1 ? "skill" : "skills"} → ${d.targets.length} ${d.targets.length === 1 ? "folder" : "folders"} (${dirs})`;
|
|
389
|
+
const detail =
|
|
390
|
+
stale.length === 0
|
|
391
|
+
? where
|
|
392
|
+
: `${where}, ${stale.length} stale ${stale.length === 1 ? "link" : "links"} to remove`;
|
|
393
|
+
const pending = d.actions.filter((a) => a.action !== "skipped");
|
|
394
|
+
if (pending.length > 0) return { action: "link", detail };
|
|
395
|
+
// Nothing to link, but something to retire: `update` is the table's word
|
|
396
|
+
// for "this row has work that is not a fresh install".
|
|
397
|
+
if (stale.length > 0) return { action: "update", detail };
|
|
398
|
+
return { action: "none", detail };
|
|
399
|
+
},
|
|
400
|
+
removalPlan: (d, _scope, roots) => {
|
|
401
|
+
const owned = ownedSkillLinks(d);
|
|
402
|
+
if (owned.length === 0) {
|
|
403
|
+
return { action: "none", detail: "no link to remove" };
|
|
404
|
+
}
|
|
405
|
+
const dirs = [...new Set(owned.map((a) => shortenPath(a.linkPath, roots)))];
|
|
406
|
+
return {
|
|
407
|
+
action: "remove",
|
|
408
|
+
detail: `${owned.length} ${owned.length === 1 ? "link" : "links"}`,
|
|
409
|
+
children: dirs.map((dir) => ({
|
|
410
|
+
key: dir,
|
|
411
|
+
label: dir,
|
|
412
|
+
action: "update" as const,
|
|
413
|
+
})),
|
|
414
|
+
};
|
|
415
|
+
},
|
|
416
|
+
compose: (d) => composeSkills(d),
|
|
417
|
+
composeRemoval: (d) => composeSkillsRemoval(d),
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
/** THE table, in display order. */
|
|
421
|
+
export const TARGETS: readonly AnyTarget[] = [
|
|
422
|
+
configTarget,
|
|
423
|
+
completionsTarget,
|
|
424
|
+
lspTarget,
|
|
425
|
+
mcpTarget,
|
|
426
|
+
skillsTarget,
|
|
427
|
+
];
|
|
428
|
+
|
|
429
|
+
/** Look a row up by id. */
|
|
430
|
+
export const findTarget = (id: string): AnyTarget | undefined =>
|
|
431
|
+
TARGETS.find((target) => target.id === id);
|
|
432
|
+
|
|
433
|
+
/** Whether a target can be installed into a scope. */
|
|
434
|
+
export const supportsScope = (target: AnyTarget, scope: Scope): boolean =>
|
|
435
|
+
target.scopes.includes(scope);
|