@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
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `setup lsp` — ensure the Terrazzo LSP extension is installed in every
|
|
3
|
+
* VS Code-family editor present on this machine.
|
|
4
|
+
*
|
|
5
|
+
* There is no marketplace listing yet: the install is a VSIX SIDELOAD. The
|
|
6
|
+
* published npm package bundles the VSIX, so the install is two exec steps —
|
|
7
|
+
* fetch the package into a pragma-owned staging dir (`bun add`, so the VSIX
|
|
8
|
+
* lands at a DURABLE path a user can retry by hand, not bunx's ephemeral
|
|
9
|
+
* `/tmp/bunx-…` cache), then `<editor cli> --install-extension <vsix>` for
|
|
10
|
+
* each detected editor. The package's own `install.mjs` bin is deliberately
|
|
11
|
+
* NOT used: it hardcodes the `code` CLI, which is precisely what left
|
|
12
|
+
* VSCodium/Cursor/Windsurf/Antigravity machines unable to install at all.
|
|
13
|
+
*
|
|
14
|
+
* `detectLsp` probes FOR REAL up front, and spawns NOTHING: an editor is
|
|
15
|
+
* detected when its CLI resolves on PATH (the `editorClis` registry names
|
|
16
|
+
* them), carries the extension when its extensions dir holds a
|
|
17
|
+
* `canonical.terrazzo-lsp-extension-<version>/` entry, and is "installed" when
|
|
18
|
+
* that entry is also new enough to work. Running
|
|
19
|
+
* `--list-extensions` instead would be the natural probe, but Cursor's Linux
|
|
20
|
+
* launcher OPENS THE EDITOR on that flag — a detection step must never launch
|
|
21
|
+
* an app, so the fs is the source of truth. The full extension id is matched
|
|
22
|
+
* (not the old `terrazzo` substring, which any other terrazzo-named extension
|
|
23
|
+
* could false-positive).
|
|
24
|
+
*
|
|
25
|
+
* No editor CLI found is a NAMED SKIP, not an error: the message says what was
|
|
26
|
+
* looked for and what to do, and the run exits 0 — there is nothing on this
|
|
27
|
+
* machine the step could honestly fail at. Real failures (fetch, sideload)
|
|
28
|
+
* travel the task failure channel (`checkExecOk`) with a recovery that names a
|
|
29
|
+
* command runnable on THIS machine, so the run-all can isolate the step
|
|
30
|
+
* (S1-1) and a direct `setup lsp` still renders the original error.
|
|
31
|
+
*/
|
|
32
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
33
|
+
import { join } from "node:path";
|
|
34
|
+
import { exec, flatMap, mkdir, sequence_, } from "@canonical/task";
|
|
35
|
+
import { BIN_NAME } from "../../../constants.js";
|
|
36
|
+
import { checkExecOk, guardMissingBinary } from "../../shared/index.js";
|
|
37
|
+
/** The full extension id, as the editor's extensions dir spells it. */
|
|
38
|
+
const EXTENSION_ID = "canonical.terrazzo-lsp-extension";
|
|
39
|
+
/** The npm package whose tarball bundles the VSIX. */
|
|
40
|
+
const LSP_PACKAGE = "@canonical/terrazzo-lsp-extension";
|
|
41
|
+
/**
|
|
42
|
+
* Whether an editor CLI resolves on PATH, given the candidate paths the host
|
|
43
|
+
* would consider for it.
|
|
44
|
+
*
|
|
45
|
+
* The candidates come from `@canonical/harnesses`' `executableCandidates` —
|
|
46
|
+
* the same helper harness detection resolves `process` signals with — rather
|
|
47
|
+
* than from a local `PATH`-join here. That local version joined the BARE name
|
|
48
|
+
* onto each PATH directory, which resolves nothing on Windows: `code`,
|
|
49
|
+
* `codium` and friends install as `.cmd` shims, so every installed editor
|
|
50
|
+
* went unseen and `setup lsp` took the no-editor path. That path is a named
|
|
51
|
+
* SKIP, so the run exited 0 reporting a clean answer on a machine that had
|
|
52
|
+
* the editor — a wrong skip reads as correct, which is worse than a wrong
|
|
53
|
+
* failure. One implementation of the platform rules means the probe cannot
|
|
54
|
+
* drift away from detection's.
|
|
55
|
+
*/
|
|
56
|
+
const cliOnPath = (candidates) => candidates.some((candidate) => existsSync(candidate));
|
|
57
|
+
/**
|
|
58
|
+
* The oldest extension release whose bundled language server actually starts.
|
|
59
|
+
*
|
|
60
|
+
* Every VSIX before this one ships the server as ~166 loose modules importing
|
|
61
|
+
* `colorjs.io`, `@lezer/common` and `@lezer/css` by BARE SPECIFIER, with no
|
|
62
|
+
* `node_modules` beside them — so the server dies on load under `node` and
|
|
63
|
+
* under `bun --no-install`. It appeared to work only because the extension
|
|
64
|
+
* prefers Bun, and Bun silently fetches missing packages from the network at
|
|
65
|
+
* spawn time; a machine without that behaviour got a language server that
|
|
66
|
+
* never started, and one with it got a server resolving unpinned dependencies
|
|
67
|
+
* over the wire. Fixed in 0.8.3, which bundles the server into one file
|
|
68
|
+
* (canonical/design-tokens#110).
|
|
69
|
+
*/
|
|
70
|
+
const MIN_EXTENSION_VERSION = "0.8.3";
|
|
71
|
+
/** {@link MIN_EXTENSION_VERSION}, parsed once. */
|
|
72
|
+
const MINIMUM = MIN_EXTENSION_VERSION.split(".").map(Number);
|
|
73
|
+
/**
|
|
74
|
+
* A version this check can actually read: dot-separated digit runs, nothing
|
|
75
|
+
* else. Deliberately strict — see {@link parseVersion}.
|
|
76
|
+
*/
|
|
77
|
+
const NUMERIC_VERSION = /^\d+(?:\.\d+)*$/;
|
|
78
|
+
/**
|
|
79
|
+
* Parse a dotted numeric version, or `undefined` when it is not one.
|
|
80
|
+
*
|
|
81
|
+
* `Number.parseInt` is the wrong tool here and quietly breaks the fail-closed
|
|
82
|
+
* rule this module claims: it accepts numeric PREFIXES, so `1.0.0junk` reads
|
|
83
|
+
* as `[1, 0, 0]`, and `|| 0` turns a `NaN` component into a zero, so
|
|
84
|
+
* `1.invalid.0` also reads as `[1, 0, 0]`. Both then compare NEWER than the
|
|
85
|
+
* minimum and report a broken extension as installed — the exact wrong-skip
|
|
86
|
+
* this version check exists to prevent, reintroduced by the parser.
|
|
87
|
+
*
|
|
88
|
+
* So the whole string is validated before any component is trusted.
|
|
89
|
+
*/
|
|
90
|
+
const parseVersion = (value) => NUMERIC_VERSION.test(value)
|
|
91
|
+
? value.split(".").map((part) => Number(part))
|
|
92
|
+
: undefined;
|
|
93
|
+
/** Compare two dotted numeric versions. Returns <0, 0, >0 like a comparator. */
|
|
94
|
+
const compareVersions = (left, right) => {
|
|
95
|
+
for (let i = 0; i < Math.max(left.length, right.length); i++) {
|
|
96
|
+
const diff = (left[i] ?? 0) - (right[i] ?? 0);
|
|
97
|
+
if (diff !== 0)
|
|
98
|
+
return diff;
|
|
99
|
+
}
|
|
100
|
+
return 0;
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* The two facts an editor's extensions dir answers: is a copy THERE, and is it
|
|
104
|
+
* new enough to WORK.
|
|
105
|
+
*
|
|
106
|
+
* `current` is version-aware on purpose. Matching any
|
|
107
|
+
* `canonical.terrazzo-lsp-extension-*` entry meant a machine carrying a build
|
|
108
|
+
* whose server cannot start reported `installed`, so `setup lsp` skipped it and
|
|
109
|
+
* `doctor` called it healthy — a wrong skip that reads as correct, which is
|
|
110
|
+
* worse than a wrong failure. Everyone who ran `setup lsp` before
|
|
111
|
+
* {@link MIN_EXTENSION_VERSION} would have kept a dead language server forever,
|
|
112
|
+
* with nothing telling them why. An unparseable suffix counts as too old: a
|
|
113
|
+
* directory this function cannot read the version of is one it cannot vouch for.
|
|
114
|
+
*
|
|
115
|
+
* `present` is the same probe WITHOUT the version gate, and it exists because
|
|
116
|
+
* removal asks a different question. A pre-0.8.3 copy is not `current`, but it
|
|
117
|
+
* is unquestionably there, and it is a copy this command installed — so a
|
|
118
|
+
* removal keyed on `current` would leave the dead extension on disk while
|
|
119
|
+
* reporting success. See {@link DetectedEditor}.
|
|
120
|
+
*/
|
|
121
|
+
const extensionState = (editor, platform) => {
|
|
122
|
+
let entries;
|
|
123
|
+
try {
|
|
124
|
+
entries = readdirSync(editor.extensionsDir(platform));
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return { present: false, current: false }; // No dir — nothing installed.
|
|
128
|
+
}
|
|
129
|
+
const prefix = `${EXTENSION_ID}-`;
|
|
130
|
+
const matching = entries.filter((entry) => entry.toLowerCase().startsWith(prefix));
|
|
131
|
+
const current = matching.some((entry) => {
|
|
132
|
+
const version = parseVersion(entry.toLowerCase().slice(prefix.length));
|
|
133
|
+
if (version === undefined)
|
|
134
|
+
return false; // Unreadable: cannot vouch for it.
|
|
135
|
+
return compareVersions(version, MINIMUM) >= 0;
|
|
136
|
+
});
|
|
137
|
+
return { present: matching.length > 0, current };
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* Probe every registry editor: CLI presence via PATH lookup, installed-state
|
|
141
|
+
* via the extensions dir — no spawns (see the module docblock for why).
|
|
142
|
+
*
|
|
143
|
+
* @param _cwd - Unused; kept so every `detectX` shares the (cwd) shape.
|
|
144
|
+
* @returns The detected {@link LspDetection}.
|
|
145
|
+
* @note Impure — reads PATH dirs and editor extension dirs off the real fs.
|
|
146
|
+
*/
|
|
147
|
+
export async function detectLsp(_cwd) {
|
|
148
|
+
const { editorClis, executableCandidates, readPlatformEnv, userDataBase } = await import("@canonical/harnesses");
|
|
149
|
+
const platform = readPlatformEnv();
|
|
150
|
+
const editors = editorClis
|
|
151
|
+
.filter((editor) => cliOnPath(executableCandidates(editor.cli, platform)))
|
|
152
|
+
.map((editor) => {
|
|
153
|
+
const { present, current } = extensionState(editor, platform);
|
|
154
|
+
return {
|
|
155
|
+
editor,
|
|
156
|
+
present,
|
|
157
|
+
installed: current,
|
|
158
|
+
extensionsDir: editor.extensionsDir(platform),
|
|
159
|
+
};
|
|
160
|
+
});
|
|
161
|
+
const state = editors.length === 0
|
|
162
|
+
? "unknown"
|
|
163
|
+
: editors.every((e) => e.installed)
|
|
164
|
+
? "installed"
|
|
165
|
+
: "absent";
|
|
166
|
+
return {
|
|
167
|
+
available: true,
|
|
168
|
+
state,
|
|
169
|
+
editors,
|
|
170
|
+
probed: editorClis.map((editor) => editor.cli),
|
|
171
|
+
stagingDir: join(userDataBase(platform), BIN_NAME, "lsp"),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* The editors an install would act on: those missing the extension, narrowed to
|
|
176
|
+
* the user's per-editor selection when the wizard collected one.
|
|
177
|
+
*
|
|
178
|
+
* A machine commonly has several VS Code forks installed and the user wants the
|
|
179
|
+
* extension in one of them. Installing into all of them because they are on
|
|
180
|
+
* PATH is the same overreach the MCP row already avoids by offering its files.
|
|
181
|
+
*
|
|
182
|
+
* @param d - The detection gathered up front.
|
|
183
|
+
* @param chosen - Selected editor CLI names, or undefined for "all pending".
|
|
184
|
+
* @returns The editors to install into.
|
|
185
|
+
*/
|
|
186
|
+
export const selectedEditors = (d, chosen) => {
|
|
187
|
+
const pending = d.editors.filter((e) => !e.installed);
|
|
188
|
+
return chosen === undefined
|
|
189
|
+
? pending
|
|
190
|
+
: pending.filter((e) => chosen.includes(e.editor.cli));
|
|
191
|
+
};
|
|
192
|
+
/** The editor names in a detection (for messages/results). */
|
|
193
|
+
export const lspEditorNames = (d) => d.editors.map((e) => e.editor.name);
|
|
194
|
+
/**
|
|
195
|
+
* The named-skip reason for a machine with no VS Code-family CLI on PATH. It
|
|
196
|
+
* names every CLI that was probed, because a skip the user cannot act on is
|
|
197
|
+
* only honest if it says what would have counted.
|
|
198
|
+
*
|
|
199
|
+
* @param d - The detection gathered up front.
|
|
200
|
+
* @returns The reason line.
|
|
201
|
+
*/
|
|
202
|
+
export const lspSkipReason = (d) => `no VS Code-family editor CLI on PATH (${d.probed.join(", ")})`;
|
|
203
|
+
/**
|
|
204
|
+
* The remedy beneath that skip. It states plainly that nothing is possible here
|
|
205
|
+
* yet rather than offering a command for a binary this machine lacks — the rule
|
|
206
|
+
* every remedy line in this capability holds to.
|
|
207
|
+
*/
|
|
208
|
+
export const LSP_SKIP_REMEDY = "no action is possible on this machine yet — install VS Code or VSCodium, then run this again";
|
|
209
|
+
/**
|
|
210
|
+
* Compose the LSP-install effects for a detection.
|
|
211
|
+
*
|
|
212
|
+
* Built from re-runnable combinators (NOT a single-use `gen`) because
|
|
213
|
+
* `execute` interprets the task twice (preview + perform); a dry-run mocks
|
|
214
|
+
* every exec (exit 0), so the preview shows the fetch + per-editor sideloads
|
|
215
|
+
* without spawning. Failures travel the task failure channel with
|
|
216
|
+
* machine-honest recoveries (see module docblock).
|
|
217
|
+
*
|
|
218
|
+
* @param d - The detection gathered up front.
|
|
219
|
+
* @returns A Task installing the extension into each editor missing it.
|
|
220
|
+
*/
|
|
221
|
+
export function composeLsp(d, chosen) {
|
|
222
|
+
// Nothing to install: no editor CLI on PATH (a named skip the plan row
|
|
223
|
+
// carries) or every detected editor already has it. Both compose NOTHING —
|
|
224
|
+
// what the run SAYS about this target is the plan row's business.
|
|
225
|
+
if (d.state !== "absent")
|
|
226
|
+
return sequence_([]);
|
|
227
|
+
const pending = selectedEditors(d, chosen);
|
|
228
|
+
// Every pending editor was deselected — there is no fetch to do either.
|
|
229
|
+
if (pending.length === 0)
|
|
230
|
+
return sequence_([]);
|
|
231
|
+
const vsixPath = lspVsixPath(d);
|
|
232
|
+
// Fetch the VSIX-bundling package into the pragma-owned staging dir. `bun`
|
|
233
|
+
// (not bunx) so the unpacked package — and its VSIX — survives at a stable
|
|
234
|
+
// path the recovery lines below can honestly point at.
|
|
235
|
+
const fetchCommand = `bun add ${LSP_PACKAGE}@latest`;
|
|
236
|
+
const fetchVsix = guardMissingBinary("bun", {
|
|
237
|
+
message: `Install Bun (https://bun.sh), then run \`${BIN_NAME} setup lsp\` again.`,
|
|
238
|
+
}, sequence_([
|
|
239
|
+
mkdir(d.stagingDir, true),
|
|
240
|
+
flatMap(exec("bun", ["add", `${LSP_PACKAGE}@latest`], d.stagingDir), (result) => checkExecOk(fetchCommand, result, {
|
|
241
|
+
message: "The extension package cannot be fetched — this machine cannot reach registry.npmjs.org. Check the connection, then run " +
|
|
242
|
+
`\`${BIN_NAME} setup lsp\` again.`,
|
|
243
|
+
})),
|
|
244
|
+
]));
|
|
245
|
+
const sideloads = pending.map(({ editor }) => {
|
|
246
|
+
const command = `${editor.cli} --install-extension ${vsixPath}`;
|
|
247
|
+
return guardMissingBinary(editor.cli, {
|
|
248
|
+
message: `The \`${editor.cli}\` CLI disappeared from PATH mid-run — restore it, then run \`${BIN_NAME} setup lsp\` again.`,
|
|
249
|
+
}, flatMap(exec(editor.cli, ["--install-extension", vsixPath], d.stagingDir), (result) => checkExecOk(command, result, {
|
|
250
|
+
message: `${editor.name} refused the VSIX (its output is above). The file is kept at ${vsixPath} — retry by hand with ` +
|
|
251
|
+
`\`${command}\`, or update ${editor.name} first.`,
|
|
252
|
+
})));
|
|
253
|
+
});
|
|
254
|
+
return sequence_([fetchVsix, ...sideloads]);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* The editors this command OWNS an extension copy in right now — every detected
|
|
258
|
+
* editor whose extensions dir holds a `canonical.terrazzo-lsp-extension-*`
|
|
259
|
+
* entry, version-gate deliberately NOT applied (see {@link DetectedEditor}).
|
|
260
|
+
*
|
|
261
|
+
* Named and shaped like `ownedMcpGroups` and `ownedSkillLinks`, and for the
|
|
262
|
+
* same reason those exist: a reversal is composed from what detection says this
|
|
263
|
+
* command owns, never from what a fresh forward plan would create.
|
|
264
|
+
*
|
|
265
|
+
* @param d - The detection gathered up front.
|
|
266
|
+
* @returns The editors carrying a copy.
|
|
267
|
+
*/
|
|
268
|
+
export const ownedLspEditors = (d) => d.editors.filter((e) => e.present);
|
|
269
|
+
/**
|
|
270
|
+
* Compose the removal: one `<editor cli> --uninstall-extension <id>` per owned
|
|
271
|
+
* editor, carried as the `undo` of a forward no-op.
|
|
272
|
+
*
|
|
273
|
+
* The docblock this replaces claimed "an `exec` carries no reversal". That was
|
|
274
|
+
* factually wrong about the effect model — `Exec` has an `undo` slot and `exec`
|
|
275
|
+
* takes `UndoOptions`. What is true is that `exec` has no DEFAULT undo; the
|
|
276
|
+
* caller supplies one, exactly as `composeMcpRemoval` does for its `mkdir`.
|
|
277
|
+
*
|
|
278
|
+
* The carrier is copied from `composeMcpRemoval`, and its trap is the reason
|
|
279
|
+
* for the shape: `runUndo` collects undos by walking the FORWARD task with
|
|
280
|
+
* effects MOCKED, so the forward side must be walkable without reading or
|
|
281
|
+
* mutating anything. A `mkdir` of the editor's own extensions directory — which
|
|
282
|
+
* `present` proves already exists — reads nothing and is a genuine no-op. Phase
|
|
283
|
+
* two then runs the uninstall against the real editor.
|
|
284
|
+
*
|
|
285
|
+
* @param d - The detection gathered up front.
|
|
286
|
+
* @returns A Task whose undo uninstalls the extension from each owned editor.
|
|
287
|
+
*/
|
|
288
|
+
export function composeLspRemoval(d) {
|
|
289
|
+
const owned = ownedLspEditors(d);
|
|
290
|
+
// Nothing on this machine carries a copy — there is no honest work to model,
|
|
291
|
+
// and the plan row says so. Same shape as the other rows' empty removals.
|
|
292
|
+
if (owned.length === 0)
|
|
293
|
+
return sequence_([]);
|
|
294
|
+
return sequence_(owned.map(({ editor, extensionsDir }) => {
|
|
295
|
+
const command = `${editor.cli} --uninstall-extension ${EXTENSION_ID}`;
|
|
296
|
+
return mkdir(extensionsDir, true, {
|
|
297
|
+
undo: guardMissingBinary(editor.cli, {
|
|
298
|
+
message: `The \`${editor.cli}\` CLI disappeared from PATH mid-run — restore it, then run \`${BIN_NAME} setup lsp --undo\` again.`,
|
|
299
|
+
}, flatMap(exec(editor.cli, ["--uninstall-extension", EXTENSION_ID], extensionsDir), (result) => checkExecOk(command, result, {
|
|
300
|
+
message: `${editor.name} refused the uninstall (its output is above). ` +
|
|
301
|
+
`Remove it by hand with \`${command}\`.`,
|
|
302
|
+
}))),
|
|
303
|
+
});
|
|
304
|
+
}));
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* The uninstall instruction for a detection — a command that runs on THIS
|
|
308
|
+
* machine, or `undefined` when nothing here carries the extension and there is
|
|
309
|
+
* therefore nothing honest to print.
|
|
310
|
+
*
|
|
311
|
+
* It names an OWNING editor. Reading `d.editors.at(0)` named the first editor
|
|
312
|
+
* on PATH instead, so a machine with Cursor installed and the extension only in
|
|
313
|
+
* VSCodium printed a command against the wrong editor — one that would report
|
|
314
|
+
* success having uninstalled nothing.
|
|
315
|
+
*
|
|
316
|
+
* @param d - The detection gathered up front.
|
|
317
|
+
* @returns The uninstall command, or undefined.
|
|
318
|
+
*/
|
|
319
|
+
export function lspUninstallRemedy(d) {
|
|
320
|
+
const cli = ownedLspEditors(d).at(0)?.editor.cli;
|
|
321
|
+
return cli === undefined
|
|
322
|
+
? undefined
|
|
323
|
+
: `${cli} --uninstall-extension ${EXTENSION_ID}`;
|
|
324
|
+
}
|
|
325
|
+
/** The VSIX path a failed sideload leaves behind for a manual retry. */
|
|
326
|
+
export function lspVsixPath(d) {
|
|
327
|
+
return join(d.stagingDir, "node_modules", ...LSP_PACKAGE.split("/"), "terrazzo-lsp.vsix");
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=setupLsp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupLsp.js","sourceRoot":"","sources":["../../../../../src/capabilities/setup/operations/setupLsp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAEL,IAAI,EACJ,OAAO,EACP,KAAK,EACL,SAAS,GAEV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGxE,uEAAuE;AACvE,MAAM,YAAY,GAAG,kCAAkC,CAAC;AAExD,sDAAsD;AACtD,MAAM,WAAW,GAAG,mCAAmC,CAAC;AAgDxD;;;;;;;;;;;;;;GAcG;AACH,MAAM,SAAS,GAAG,CAAC,UAA6B,EAAW,EAAE,CAC3D,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AAExD;;;;;;;;;;;;GAYG;AACH,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAEtC,kDAAkD;AAClD,MAAM,OAAO,GAAa,qBAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAEvE;;;GAGG;AACH,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAE1C;;;;;;;;;;;GAWG;AACH,MAAM,YAAY,GAAG,CAAC,KAAa,EAAwB,EAAE,CAC3D,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;IACzB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,SAAS,CAAC;AAEhB,gFAAgF;AAChF,MAAM,eAAe,GAAG,CAAC,IAAc,EAAE,KAAe,EAAU,EAAE;IAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,cAAc,GAAG,CACrB,MAA2B,EAC3B,QAAqB,EACmB,EAAE;IAC1C,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,8BAA8B;IAC3E,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,YAAY,GAAG,CAAC;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CACxC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CACvC,CAAC;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACvE,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC,CAAC,mCAAmC;QAC5E,OAAO,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC;AACnD,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE,eAAe,EAAE,YAAY,EAAE,GACvE,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,OAAO,GAAqB,UAAU;SACzC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;SACzE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACd,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9D,OAAO;YACL,MAAM;YACN,OAAO;YACP,SAAS,EAAE,OAAO;YAClB,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;SAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;IACL,MAAM,KAAK,GACT,OAAO,CAAC,MAAM,KAAK,CAAC;QAClB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACjC,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,QAAQ,CAAC;IACjB,OAAO;QACL,SAAS,EAAE,IAAI;QACf,KAAK;QACL,OAAO;QACP,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;QAC9C,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,CAAe,EACf,MAA0B,EACC,EAAE;IAC7B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACtD,OAAO,MAAM,KAAK,SAAS;QACzB,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC,CAAC;AAEF,8DAA8D;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAe,EAAY,EAAE,CAC1D,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAEtC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAe,EAAU,EAAE,CACvD,yCAAyC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAElE;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAC1B,8FAA8F,CAAC;AAEjG;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU,CACxB,CAAe,EACf,MAA0B;IAE1B,uEAAuE;IACvE,2EAA2E;IAC3E,kEAAkE;IAClE,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC;IAE/C,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3C,wEAAwE;IACxE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAEhC,2EAA2E;IAC3E,2EAA2E;IAC3E,uDAAuD;IACvD,MAAM,YAAY,GAAG,WAAW,WAAW,SAAS,CAAC;IACrD,MAAM,SAAS,GAAG,kBAAkB,CAClC,KAAK,EACL;QACE,OAAO,EAAE,4CAA4C,QAAQ,qBAAqB;KACnF,EACD,SAAS,CAAC;QACR,KAAK,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC;QACzB,OAAO,CACL,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,WAAW,SAAS,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,EAC3D,CAAC,MAAM,EAAE,EAAE,CACT,WAAW,CAAC,YAAY,EAAE,MAAoB,EAAE;YAC9C,OAAO,EACL,yHAAyH;gBACzH,KAAK,QAAQ,qBAAqB;SACrC,CAAC,CACL;KACF,CAAC,CACH,CAAC;IAEF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,GAAG,wBAAwB,QAAQ,EAAE,CAAC;QAChE,OAAO,kBAAkB,CACvB,MAAM,CAAC,GAAG,EACV;YACE,OAAO,EAAE,SAAS,MAAM,CAAC,GAAG,iEAAiE,QAAQ,qBAAqB;SAC3H,EACD,OAAO,CACL,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,EACjE,CAAC,MAAM,EAAE,EAAE,CACT,WAAW,CAAC,OAAO,EAAE,MAAoB,EAAE;YACzC,OAAO,EACL,GAAG,MAAM,CAAC,IAAI,gEAAgE,QAAQ,wBAAwB;gBAC9G,KAAK,OAAO,iBAAiB,MAAM,CAAC,IAAI,SAAS;SACpD,CAAC,CACL,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAe,EAA6B,EAAE,CAC5E,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AAErC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAe;IAC/C,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IACjC,6EAA6E;IAC7E,0EAA0E;IAC1E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC;IAC7C,OAAO,SAAS,CACd,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,GAAG,0BAA0B,YAAY,EAAE,CAAC;QACtE,OAAO,KAAK,CAAC,aAAa,EAAE,IAAI,EAAE;YAChC,IAAI,EAAE,kBAAkB,CACtB,MAAM,CAAC,GAAG,EACV;gBACE,OAAO,EAAE,SAAS,MAAM,CAAC,GAAG,iEAAiE,QAAQ,4BAA4B;aAClI,EACD,OAAO,CACL,IAAI,CACF,MAAM,CAAC,GAAG,EACV,CAAC,uBAAuB,EAAE,YAAY,CAAC,EACvC,aAAa,CACd,EACD,CAAC,MAAM,EAAE,EAAE,CACT,WAAW,CAAC,OAAO,EAAE,MAAoB,EAAE;gBACzC,OAAO,EACL,GAAG,MAAM,CAAC,IAAI,gDAAgD;oBAC9D,4BAA4B,OAAO,KAAK;aAC3C,CAAC,CACL,CACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAe;IAChD,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC;IACjD,OAAO,GAAG,KAAK,SAAS;QACtB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,GAAG,GAAG,0BAA0B,YAAY,EAAE,CAAC;AACrD,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,WAAW,CAAC,CAAe;IACzC,OAAO,IAAI,CACT,CAAC,CAAC,UAAU,EACZ,cAAc,EACd,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,EACzB,mBAAmB,CACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `setup mcp` — register the pragma MCP server in detected AI harnesses.
|
|
3
|
+
*
|
|
4
|
+
* Split into `detectMcp` (harness detection runs FOR REAL up front, via
|
|
5
|
+
* `runTask` over safe reads, and the resolved config targets are deduplicated
|
|
6
|
+
* into per-file {@link TargetGroup}s for the chosen `--scope`) and `composeMcp`
|
|
7
|
+
* (a pure, re-runnable write body driven by the SELECTED groups). Each write is
|
|
8
|
+
* a distinct `(path, mcpKey)` so two harnesses sharing a file (VS Code + Cline)
|
|
9
|
+
* each preserve the other. What a run SAYS about each file is the plan row's
|
|
10
|
+
* per-file children, not a log line composed here.
|
|
11
|
+
*
|
|
12
|
+
* Detection ALSO reads each group's existing config (via `readMcpConfigFrom`,
|
|
13
|
+
* FOR REAL up front) and classifies every group as `absent` (no pragma entry
|
|
14
|
+
* yet), `registered` (the pragma entry already matches what we'd write), or
|
|
15
|
+
* `drifted` (a pragma entry exists but differs). The wizard shows that prior
|
|
16
|
+
* state in each row and DEFAULT-DESELECTS the already-`registered` files; the
|
|
17
|
+
* write itself stays idempotent (a re-merge of the identical entry is
|
|
18
|
+
* byte-for-byte), so a re-run is a no-op the recap reports as "unchanged" — the
|
|
19
|
+
* same state-awareness `setup skills` has always had.
|
|
20
|
+
*/
|
|
21
|
+
import { dirname } from "node:path";
|
|
22
|
+
import { mkdir, sequence_ } from "@canonical/task";
|
|
23
|
+
import { MCP_SERVER_NAME } from "../../../constants.js";
|
|
24
|
+
/**
|
|
25
|
+
* The argv a registered harness spawns to reach the server.
|
|
26
|
+
*
|
|
27
|
+
* The server verb is `mcp serve`: `mcp` is the noun, and the noun on its own is
|
|
28
|
+
* not the server entry. An entry still carrying the old single-token `mcp`
|
|
29
|
+
* spawns something that no longer serves, so it must not survive.
|
|
30
|
+
*
|
|
31
|
+
* It does not have to: `mcpEntryMatches` treats `args` as a controlled field,
|
|
32
|
+
* so an entry written before this rename classifies as `drifted` on the very
|
|
33
|
+
* next detection and the ordinary forward write repairs it. That is the whole
|
|
34
|
+
* migration — no flag, no prompt, no compatibility branch — and the run after
|
|
35
|
+
* it converges, because the repaired entry then matches byte for byte.
|
|
36
|
+
*/
|
|
37
|
+
const MCP_SERVE_ARGV = ["mcp", "serve"];
|
|
38
|
+
/**
|
|
39
|
+
* The pragma MCP server entry we register — the SINGLE source of truth both the
|
|
40
|
+
* classifier (does the existing entry match this?) and the writer (`composeMcp`)
|
|
41
|
+
* consume, so "already registered" means byte-for-byte what a write would emit.
|
|
42
|
+
*
|
|
43
|
+
* The entry is SCOPE-shaped: a project-scope entry records the project root as
|
|
44
|
+
* `cwd` (that binding is the point of a per-repo registration), while a
|
|
45
|
+
* global-scope entry OMITS `cwd` entirely — a per-user server must not be
|
|
46
|
+
* pinned to whatever directory `setup mcp --global` happened to run from
|
|
47
|
+
* (observed: a global registration from `~/Downloads` permanently served
|
|
48
|
+
* `~/Downloads`, and re-running from repo B "repaired" it to repo B,
|
|
49
|
+
* ping-ponging the machine scope between projects). The per-harness
|
|
50
|
+
* serializers already omit an undefined `cwd`, and the matcher treats an
|
|
51
|
+
* omitted controlled field as must-be-absent, so a stale global entry still
|
|
52
|
+
* carrying a `cwd` classifies as `drifted` and converges on the next write.
|
|
53
|
+
*
|
|
54
|
+
* @param cwd - The project root (recorded only on project-scope entries).
|
|
55
|
+
* @param scope - The config scope the entry is written to.
|
|
56
|
+
* @returns The pragma {@link McpServerConfig}.
|
|
57
|
+
*/
|
|
58
|
+
export function pragmaMcpEntry(cwd, scope) {
|
|
59
|
+
return scope === "project"
|
|
60
|
+
? { command: MCP_SERVER_NAME, args: [...MCP_SERVE_ARGV], cwd }
|
|
61
|
+
: { command: MCP_SERVER_NAME, args: [...MCP_SERVE_ARGV] };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Classify ONE write against its on-disk config: `absent` when the file carries
|
|
65
|
+
* no pragma entry under this write's `mcpKey`, `registered` when the entry
|
|
66
|
+
* already matches what this write would emit, `drifted` when one is there and
|
|
67
|
+
* differs. Reads the file for real via `readMcpConfigFrom` (which reads only
|
|
68
|
+
* this write's key), and matches the raw entry against what THAT write's
|
|
69
|
+
* per-harness serializer would emit for the group's SCOPE (`mcpEntryMatches`
|
|
70
|
+
* compares the serializer's controlled fields — so a global entry still
|
|
71
|
+
* pinning a `cwd` reads as drifted — and ignores extra keys a harness or user
|
|
72
|
+
* added, so we never churn a file we did not author).
|
|
73
|
+
*
|
|
74
|
+
* The write, not the file, is the unit that can be classified honestly: a
|
|
75
|
+
* shared `.vscode/mcp.json` holds VS Code's `servers` and Cline's `mcpServers`
|
|
76
|
+
* as two independent entries, and "the file" has no single state when one is
|
|
77
|
+
* current and the other is missing.
|
|
78
|
+
*
|
|
79
|
+
* @param write - The resolved config target to inspect.
|
|
80
|
+
* @param want - The canonical pragma entry for the group's scope.
|
|
81
|
+
* @param harnessesApi - The dynamically imported harnesses module.
|
|
82
|
+
* @param runTask - The node Task interpreter.
|
|
83
|
+
* @returns This write's {@link McpTargetState}.
|
|
84
|
+
* @note Impure — reads the write's config file.
|
|
85
|
+
*/
|
|
86
|
+
async function classifyWrite(write, want, harnessesApi, runTask) {
|
|
87
|
+
const servers = await runTask(harnessesApi.readMcpConfigFrom(write));
|
|
88
|
+
const existing = servers[MCP_SERVER_NAME];
|
|
89
|
+
if (existing === undefined)
|
|
90
|
+
return "absent";
|
|
91
|
+
return harnessesApi.mcpEntryMatches(existing, want, write.serializeEntry)
|
|
92
|
+
? "registered"
|
|
93
|
+
: "drifted";
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The state of a whole FILE, aggregated from its writes: `absent` when no write
|
|
97
|
+
* carries the entry, `registered` when every write already carries a matching
|
|
98
|
+
* one, `drifted` otherwise. This is the rule the write side needs — a file is
|
|
99
|
+
* rewritten unless it is `registered` everywhere — and it is deliberately the
|
|
100
|
+
* only place the per-write states are collapsed, so nothing else re-derives it.
|
|
101
|
+
*
|
|
102
|
+
* @param states - Each write's own state, in the group's write order.
|
|
103
|
+
* @returns The group's {@link McpTargetState}.
|
|
104
|
+
*/
|
|
105
|
+
const aggregateMcpStates = (states) => {
|
|
106
|
+
if (states.every((state) => state === "absent"))
|
|
107
|
+
return "absent";
|
|
108
|
+
if (states.every((state) => state === "registered"))
|
|
109
|
+
return "registered";
|
|
110
|
+
return "drifted";
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* The key one write's state is recorded under: the file it lands in AND the
|
|
114
|
+
* `mcpKey` it owns there. `(path, mcpKey)` is exactly the write-dedup key
|
|
115
|
+
* `groupConfigTargets` builds its `writes` from, so the map has one entry per
|
|
116
|
+
* write and no two harnesses sharing a file can collide. The separator is NUL
|
|
117
|
+
* because a config path may legally contain everything else.
|
|
118
|
+
*
|
|
119
|
+
* @param write - The resolved config target.
|
|
120
|
+
* @returns Its lookup key in {@link McpDetection.stateByWrite}.
|
|
121
|
+
*/
|
|
122
|
+
const mcpWriteKey = (write) => `${write.path}\u0000${write.mcpKey}`;
|
|
123
|
+
/**
|
|
124
|
+
* Detect the AI harnesses present in the project (real reads, up front),
|
|
125
|
+
* resolve+dedup their config targets for the chosen scope, AND read each
|
|
126
|
+
* group's existing config to classify it `absent`/`registered`/`drifted` — so
|
|
127
|
+
* the wizard can show prior state and default-deselect already-`registered`
|
|
128
|
+
* files.
|
|
129
|
+
*
|
|
130
|
+
* @param rt - The per-invocation runtime.
|
|
131
|
+
* @param scope - The scope being planned (global or project).
|
|
132
|
+
* @returns The scope's target groups, their prior states, + the config writer.
|
|
133
|
+
* @note Impure — reads the filesystem via `detectHarnesses` + `readMcpConfigFrom`.
|
|
134
|
+
*/
|
|
135
|
+
export async function detectMcp(rt, scope) {
|
|
136
|
+
const cwd = rt.cwd;
|
|
137
|
+
const [{ detectHarnesses, groupTargetsForScope, mcpEntryMatches, readMcpConfigFrom, readPlatformEnv, removeMcpConfigFrom, writeMcpConfigTargets, }, { runTask },] = await Promise.all([
|
|
138
|
+
import("@canonical/harnesses"),
|
|
139
|
+
import("@canonical/task/node"),
|
|
140
|
+
]);
|
|
141
|
+
const platform = readPlatformEnv();
|
|
142
|
+
const detected = await runTask(detectHarnesses(cwd, platform));
|
|
143
|
+
const groups = groupTargetsForScope(detected, cwd, scope, platform);
|
|
144
|
+
// Read each group's existing config (for real, up front) so the recap/preview
|
|
145
|
+
// and the default selection reflect true prior state — the same discipline
|
|
146
|
+
// `detectSkills` uses for its per-link create/skip/replace decision. The
|
|
147
|
+
// wanted entry is SCOPE-shaped (a global entry omits `cwd`), so it is built
|
|
148
|
+
// per group, not once. Each WRITE is classified and kept; the file's state is
|
|
149
|
+
// their aggregate, so the coarse view is derived from the fine one rather
|
|
150
|
+
// than measured separately.
|
|
151
|
+
const stateByPath = new Map();
|
|
152
|
+
const stateByWrite = new Map();
|
|
153
|
+
await Promise.all(groups.map(async (group) => {
|
|
154
|
+
const want = pragmaMcpEntry(cwd, group.scope);
|
|
155
|
+
const classified = await Promise.all(group.writes.map(async (write) => ({
|
|
156
|
+
write,
|
|
157
|
+
state: await classifyWrite(write, want, { readMcpConfigFrom, mcpEntryMatches }, runTask),
|
|
158
|
+
})));
|
|
159
|
+
for (const { write, state } of classified) {
|
|
160
|
+
stateByWrite.set(mcpWriteKey(write), state);
|
|
161
|
+
}
|
|
162
|
+
stateByPath.set(group.path, aggregateMcpStates(classified.map((c) => c.state)));
|
|
163
|
+
}));
|
|
164
|
+
return {
|
|
165
|
+
groups,
|
|
166
|
+
stateByPath,
|
|
167
|
+
stateByWrite,
|
|
168
|
+
cwd,
|
|
169
|
+
platform,
|
|
170
|
+
writeMcpConfigTargets,
|
|
171
|
+
removeMcpConfigFrom,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* The prior state of a group, defaulting to `absent` for an unknown path (so a
|
|
176
|
+
* caller never has to guard the map lookup).
|
|
177
|
+
*/
|
|
178
|
+
export function mcpGroupState(d, path) {
|
|
179
|
+
return d.stateByPath.get(path) ?? "absent";
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The prior state of ONE write — the state of the single harness key it owns,
|
|
183
|
+
* not of the file it shares. Defaults to `absent` for an unknown write, the
|
|
184
|
+
* same way {@link mcpGroupState} does for an unknown path.
|
|
185
|
+
*
|
|
186
|
+
* @param d - The detection gathered up front.
|
|
187
|
+
* @param write - One of a group's {@link ConfigTarget} writes.
|
|
188
|
+
* @returns That write's {@link McpTargetState}.
|
|
189
|
+
*/
|
|
190
|
+
export function mcpWriteState(d, write) {
|
|
191
|
+
return d.stateByWrite.get(mcpWriteKey(write)) ?? "absent";
|
|
192
|
+
}
|
|
193
|
+
/** The target groups the user selected (by path), or all when none recorded. */
|
|
194
|
+
export function selectedGroups(d, selectedPaths) {
|
|
195
|
+
return d.groups.filter((g) => selectedPaths.includes(g.path));
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Compose the per-target config writes for the SELECTED groups (pure —
|
|
199
|
+
* re-runnable; builds ABSOLUTE config paths itself). An already-`registered`
|
|
200
|
+
* group composes NOTHING: the entry on disk is byte-for-byte what a write would
|
|
201
|
+
* emit, so re-writing it would only move an mtime. Removal no longer depends on
|
|
202
|
+
* the forward plan having written something ({@link composeMcpRemoval}), which
|
|
203
|
+
* is what used to force the redundant write.
|
|
204
|
+
*
|
|
205
|
+
* The task carries no log effects — the plan row owns what the run says.
|
|
206
|
+
*
|
|
207
|
+
* @param d - The detection gathered up front.
|
|
208
|
+
* @param groups - The target groups the user chose (a subset of `d.groups`).
|
|
209
|
+
* @returns A Task that writes the pragma MCP config into each chosen file.
|
|
210
|
+
*/
|
|
211
|
+
export function composeMcp(d, groups) {
|
|
212
|
+
// Re-runnable combinators (NOT a single-use `gen`): `execute` interprets the
|
|
213
|
+
// task twice (preview + perform). One combined write per file keeps a shared
|
|
214
|
+
// file (VS Code + Cline) a single read-modify-write — dry-run safe. The
|
|
215
|
+
// written entry is SCOPE-shaped per group (a global entry omits `cwd`).
|
|
216
|
+
const pending = groups.filter((group) => mcpGroupState(d, group.path) !== "registered");
|
|
217
|
+
return sequence_(pending.map((group) => d.writeMcpConfigTargets(group.writes, MCP_SERVER_NAME, pragmaMcpEntry(d.cwd, group.scope))));
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* The groups this scope OWNS right now — every file where detection classifies a
|
|
221
|
+
* pragma entry as present (`registered` or `drifted`). Removal acts on exactly
|
|
222
|
+
* this set, so a file that never carried the entry is never rewritten and a
|
|
223
|
+
* foreign server in a file that does is never touched.
|
|
224
|
+
*/
|
|
225
|
+
export const ownedMcpGroups = (d) => d.groups.filter((group) => mcpGroupState(d, group.path) !== "absent");
|
|
226
|
+
/**
|
|
227
|
+
* Compose the removal of the pragma entry from every owned file.
|
|
228
|
+
*
|
|
229
|
+
* The FORWARD side of this task must be walkable without reading anything.
|
|
230
|
+
* `runUndo` collects undos by walking the forward task with effects MOCKED —
|
|
231
|
+
* real `Exists`, but `ReadFile` deliberately returns a placeholder, so that the
|
|
232
|
+
* walk cannot observe the forward run's own edits. Re-asserting the entry here
|
|
233
|
+
* (the obvious composition, and the one this had) put a read-parse-merge on
|
|
234
|
+
* that walk: the placeholder is not JSON, the parse failed closed, and the
|
|
235
|
+
* collection aborted before gathering a single undo. `setup mcp --undo` could
|
|
236
|
+
* not remove anything, and said so by refusing a config that was perfectly
|
|
237
|
+
* valid.
|
|
238
|
+
*
|
|
239
|
+
* So the forward effect is a `mkdir` of the config's own directory — which
|
|
240
|
+
* already exists, reads nothing, and is a genuine no-op — carrying the
|
|
241
|
+
* key-scoped removal as its `undo`. Phase two then runs that removal against
|
|
242
|
+
* the real file. Only the pragma key is ever deleted; a foreign server in the
|
|
243
|
+
* same file is never touched.
|
|
244
|
+
*
|
|
245
|
+
* @param d - The detection gathered up front.
|
|
246
|
+
* @returns A Task whose undo removes the pragma entry from each owned file.
|
|
247
|
+
*/
|
|
248
|
+
export function composeMcpRemoval(d) {
|
|
249
|
+
return sequence_(ownedMcpGroups(d).map((group) => mkdir(dirname(group.path), true, {
|
|
250
|
+
undo: sequence_(group.writes.map((write) => d.removeMcpConfigFrom(write, MCP_SERVER_NAME))),
|
|
251
|
+
})));
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=setupMcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupMcp.js","sourceRoot":"","sources":["../../../../../src/capabilities/setup/operations/setupMcp.ts"],"names":[],"mappings":"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"}
|