@canonical/pragma-cli 0.34.0 → 0.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +153 -30
- package/dist/.build-ok +0 -0
- package/dist/package.json +83 -0
- package/dist/pragma.conf.js +814 -0
- package/dist/pragma.conf.js.map +1 -0
- package/dist/src/bin.js +356 -0
- package/dist/src/bin.js.map +1 -0
- package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
- package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
- package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
- package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
- package/dist/src/capabilities/capabilities/catalog.js +130 -0
- package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
- package/dist/src/capabilities/capabilities/hints.js +195 -0
- package/dist/src/capabilities/capabilities/hints.js.map +1 -0
- package/dist/src/capabilities/capabilities/index.js +11 -0
- package/dist/src/capabilities/capabilities/index.js.map +1 -0
- package/dist/src/capabilities/capabilities/types.js +11 -0
- package/dist/src/capabilities/capabilities/types.js.map +1 -0
- package/dist/src/capabilities/colophon/collectColophon.js +83 -0
- package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
- package/dist/src/capabilities/colophon/colophon.render.js +59 -0
- package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
- package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
- package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
- package/dist/src/capabilities/colophon/index.js +5 -0
- package/dist/src/capabilities/colophon/index.js.map +1 -0
- package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
- package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
- package/dist/src/capabilities/colophon/types.js +10 -0
- package/dist/src/capabilities/colophon/types.js.map +1 -0
- package/dist/src/capabilities/config/collectConfigShow.js +59 -0
- package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
- package/dist/src/capabilities/config/field.render.js +22 -0
- package/dist/src/capabilities/config/field.render.js.map +1 -0
- package/dist/src/capabilities/config/fields.js +46 -0
- package/dist/src/capabilities/config/fields.js.map +1 -0
- package/dist/src/capabilities/config/get.verb.js +61 -0
- package/dist/src/capabilities/config/get.verb.js.map +1 -0
- package/dist/src/capabilities/config/index.js +5 -0
- package/dist/src/capabilities/config/index.js.map +1 -0
- package/dist/src/capabilities/config/runField.js +59 -0
- package/dist/src/capabilities/config/runField.js.map +1 -0
- package/dist/src/capabilities/config/runGet.js +28 -0
- package/dist/src/capabilities/config/runGet.js.map +1 -0
- package/dist/src/capabilities/config/runSet.js +53 -0
- package/dist/src/capabilities/config/runSet.js.map +1 -0
- package/dist/src/capabilities/config/set.verb.js +66 -0
- package/dist/src/capabilities/config/set.verb.js.map +1 -0
- package/dist/src/capabilities/config/show.render.js +84 -0
- package/dist/src/capabilities/config/show.render.js.map +1 -0
- package/dist/src/capabilities/config/show.verb.js +44 -0
- package/dist/src/capabilities/config/show.verb.js.map +1 -0
- package/dist/src/capabilities/config/types.js +5 -0
- package/dist/src/capabilities/config/types.js.map +1 -0
- package/dist/src/capabilities/config/unset.verb.js +49 -0
- package/dist/src/capabilities/config/unset.verb.js.map +1 -0
- package/dist/src/capabilities/create/cliProjection.js +195 -0
- package/dist/src/capabilities/create/cliProjection.js.map +1 -0
- package/dist/src/capabilities/create/constants.js +47 -0
- package/dist/src/capabilities/create/constants.js.map +1 -0
- package/dist/src/capabilities/create/create.render.js +100 -0
- package/dist/src/capabilities/create/create.render.js.map +1 -0
- package/dist/src/capabilities/create/create.verb.js +438 -0
- package/dist/src/capabilities/create/create.verb.js.map +1 -0
- package/dist/src/capabilities/create/createHelp.js +47 -0
- package/dist/src/capabilities/create/createHelp.js.map +1 -0
- package/dist/src/capabilities/create/createSurface.generated.js +394 -0
- package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
- package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
- package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
- package/dist/src/capabilities/create/index.js +18 -0
- package/dist/src/capabilities/create/index.js.map +1 -0
- package/dist/src/capabilities/create/messages.js +16 -0
- package/dist/src/capabilities/create/messages.js.map +1 -0
- package/dist/src/capabilities/create/mount.js +293 -0
- package/dist/src/capabilities/create/mount.js.map +1 -0
- package/dist/src/capabilities/create/pathJail.js +65 -0
- package/dist/src/capabilities/create/pathJail.js.map +1 -0
- package/dist/src/capabilities/create/pickGenerator.js +53 -0
- package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
- package/dist/src/capabilities/create/types.js +2 -0
- package/dist/src/capabilities/create/types.js.map +1 -0
- package/dist/src/capabilities/distribution.js +40 -0
- package/dist/src/capabilities/distribution.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
- package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
- package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +92 -0
- package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
- package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
- package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/index.js +27 -0
- package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
- package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/targetHealth.js +205 -0
- package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.render.js +185 -0
- package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.verb.js +45 -0
- package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
- package/dist/src/capabilities/doctor/index.js +5 -0
- package/dist/src/capabilities/doctor/index.js.map +1 -0
- package/dist/src/capabilities/doctor/runChecks.js +83 -0
- package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
- package/dist/src/capabilities/doctor/types.js +5 -0
- package/dist/src/capabilities/doctor/types.js.map +1 -0
- package/dist/src/capabilities/graph/index.js +19 -0
- package/dist/src/capabilities/graph/index.js.map +1 -0
- package/dist/src/capabilities/graph/inspect.render.js +76 -0
- package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
- package/dist/src/capabilities/graph/inspect.verb.js +53 -0
- package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
- package/dist/src/capabilities/graph/query.render.js +73 -0
- package/dist/src/capabilities/graph/query.render.js.map +1 -0
- package/dist/src/capabilities/graph/query.verb.js +49 -0
- package/dist/src/capabilities/graph/query.verb.js.map +1 -0
- package/dist/src/capabilities/graph/runQuery.js +41 -0
- package/dist/src/capabilities/graph/runQuery.js.map +1 -0
- package/dist/src/capabilities/index.js +56 -0
- package/dist/src/capabilities/index.js.map +1 -0
- package/dist/src/capabilities/info/collectInfo.js +66 -0
- package/dist/src/capabilities/info/collectInfo.js.map +1 -0
- package/dist/src/capabilities/info/index.js +5 -0
- package/dist/src/capabilities/info/index.js.map +1 -0
- package/dist/src/capabilities/info/info.render.js +53 -0
- package/dist/src/capabilities/info/info.render.js.map +1 -0
- package/dist/src/capabilities/info/info.verb.js +42 -0
- package/dist/src/capabilities/info/info.verb.js.map +1 -0
- package/dist/src/capabilities/info/types.js +5 -0
- package/dist/src/capabilities/info/types.js.map +1 -0
- package/dist/src/capabilities/meta/complete.verb.js +43 -0
- package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
- package/dist/src/capabilities/meta/index.js +13 -0
- package/dist/src/capabilities/meta/index.js.map +1 -0
- package/dist/src/capabilities/meta/mcp.verb.js +34 -0
- package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
- package/dist/src/capabilities/ontology/index.js +21 -0
- package/dist/src/capabilities/ontology/index.js.map +1 -0
- package/dist/src/capabilities/ontology/queries.js +123 -0
- package/dist/src/capabilities/ontology/queries.js.map +1 -0
- package/dist/src/capabilities/ontology/render.js +66 -0
- package/dist/src/capabilities/ontology/render.js.map +1 -0
- package/dist/src/capabilities/ontology/verbs.js +181 -0
- package/dist/src/capabilities/ontology/verbs.js.map +1 -0
- package/dist/src/capabilities/prompt/index.js +16 -0
- package/dist/src/capabilities/prompt/index.js.map +1 -0
- package/dist/src/capabilities/prompt/prompt.render.js +78 -0
- package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
- package/dist/src/capabilities/prompt/types.js +10 -0
- package/dist/src/capabilities/prompt/types.js.map +1 -0
- package/dist/src/capabilities/prompt/verbs.js +93 -0
- package/dist/src/capabilities/prompt/verbs.js.map +1 -0
- package/dist/src/capabilities/resources/index.js +10 -0
- package/dist/src/capabilities/resources/index.js.map +1 -0
- package/dist/src/capabilities/resources/provider.js +423 -0
- package/dist/src/capabilities/resources/provider.js.map +1 -0
- package/dist/src/capabilities/setup/buildPlan.js +168 -0
- package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
- package/dist/src/capabilities/setup/index.js +5 -0
- package/dist/src/capabilities/setup/index.js.map +1 -0
- package/dist/src/capabilities/setup/mode.js +53 -0
- package/dist/src/capabilities/setup/mode.js.map +1 -0
- package/dist/src/capabilities/setup/operations/index.js +39 -0
- package/dist/src/capabilities/setup/operations/index.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
- package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
- package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupGenerator.js +343 -0
- package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js +277 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js +207 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupSkills.js +316 -0
- package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
- package/dist/src/capabilities/setup/plan.js +128 -0
- package/dist/src/capabilities/setup/plan.js.map +1 -0
- package/dist/src/capabilities/setup/plan.render.js +193 -0
- package/dist/src/capabilities/setup/plan.render.js.map +1 -0
- package/dist/src/capabilities/setup/setup.render.js +54 -0
- package/dist/src/capabilities/setup/setup.render.js.map +1 -0
- package/dist/src/capabilities/setup/setup.verb.js +334 -0
- package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
- package/dist/src/capabilities/setup/shell.js +196 -0
- package/dist/src/capabilities/setup/shell.js.map +1 -0
- package/dist/src/capabilities/setup/targets.js +263 -0
- package/dist/src/capabilities/setup/targets.js.map +1 -0
- package/dist/src/capabilities/setup/types.js +5 -0
- package/dist/src/capabilities/setup/types.js.map +1 -0
- package/dist/src/capabilities/shared/assertExecOk.js +137 -0
- package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
- package/dist/src/capabilities/shared/bands.js +16 -0
- package/dist/src/capabilities/shared/bands.js.map +1 -0
- package/dist/src/capabilities/shared/index.js +26 -0
- package/dist/src/capabilities/shared/index.js.map +1 -0
- package/dist/src/capabilities/shared/packageManager.js +103 -0
- package/dist/src/capabilities/shared/packageManager.js.map +1 -0
- package/dist/src/capabilities/shared/registry.js +55 -0
- package/dist/src/capabilities/shared/registry.js.map +1 -0
- package/dist/src/capabilities/skill/discover.js +195 -0
- package/dist/src/capabilities/skill/discover.js.map +1 -0
- package/dist/src/capabilities/skill/index.js +10 -0
- package/dist/src/capabilities/skill/index.js.map +1 -0
- package/dist/src/capabilities/skill/render.js +49 -0
- package/dist/src/capabilities/skill/render.js.map +1 -0
- package/dist/src/capabilities/skill/verbs.js +83 -0
- package/dist/src/capabilities/skill/verbs.js.map +1 -0
- package/dist/src/capabilities/sources/collectStatus.js +103 -0
- package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
- package/dist/src/capabilities/sources/index.js +13 -0
- package/dist/src/capabilities/sources/index.js.map +1 -0
- package/dist/src/capabilities/sources/installSkills.js +167 -0
- package/dist/src/capabilities/sources/installSkills.js.map +1 -0
- package/dist/src/capabilities/sources/runUpdate.js +394 -0
- package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
- package/dist/src/capabilities/sources/status.render.js +64 -0
- package/dist/src/capabilities/sources/status.render.js.map +1 -0
- package/dist/src/capabilities/sources/status.verb.js +40 -0
- package/dist/src/capabilities/sources/status.verb.js.map +1 -0
- package/dist/src/capabilities/sources/types.js +6 -0
- package/dist/src/capabilities/sources/types.js.map +1 -0
- package/dist/src/capabilities/sources/update.render.js +34 -0
- package/dist/src/capabilities/sources/update.render.js.map +1 -0
- package/dist/src/capabilities/sources/update.verb.js +55 -0
- package/dist/src/capabilities/sources/update.verb.js.map +1 -0
- package/dist/src/capabilities/upgrade/index.js +5 -0
- package/dist/src/capabilities/upgrade/index.js.map +1 -0
- package/dist/src/capabilities/upgrade/runUpgrade.js +99 -0
- package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
- package/dist/src/capabilities/upgrade/types.js +5 -0
- package/dist/src/capabilities/upgrade/types.js.map +1 -0
- package/dist/src/capabilities/upgrade/upgrade.render.js +44 -0
- package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
- package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
- package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
- package/dist/src/capabilities/version/index.js +10 -0
- package/dist/src/capabilities/version/index.js.map +1 -0
- package/dist/src/capabilities/version/version.verb.js +36 -0
- package/dist/src/capabilities/version/version.verb.js.map +1 -0
- package/dist/src/constants.js +82 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/index.js +12 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/kernel/completion/complete.js +66 -0
- package/dist/src/kernel/completion/complete.js.map +1 -0
- package/dist/src/kernel/completion/emitScripts.js +92 -0
- package/dist/src/kernel/completion/emitScripts.js.map +1 -0
- package/dist/src/kernel/completion/entitySource.js +285 -0
- package/dist/src/kernel/completion/entitySource.js.map +1 -0
- package/dist/src/kernel/completion/index.js +14 -0
- package/dist/src/kernel/completion/index.js.map +1 -0
- package/dist/src/kernel/completion/model.js +301 -0
- package/dist/src/kernel/completion/model.js.map +1 -0
- package/dist/src/kernel/completion/parse.js +253 -0
- package/dist/src/kernel/completion/parse.js.map +1 -0
- package/dist/src/kernel/completion/rank.js +101 -0
- package/dist/src/kernel/completion/rank.js.map +1 -0
- package/dist/src/kernel/completion/resolve.js +100 -0
- package/dist/src/kernel/completion/resolve.js.map +1 -0
- package/dist/src/kernel/completion/templates/bash.js +209 -0
- package/dist/src/kernel/completion/templates/bash.js.map +1 -0
- package/dist/src/kernel/completion/templates/fish.js +214 -0
- package/dist/src/kernel/completion/templates/fish.js.map +1 -0
- package/dist/src/kernel/completion/templates/index.js +23 -0
- package/dist/src/kernel/completion/templates/index.js.map +1 -0
- package/dist/src/kernel/completion/templates/shared.js +98 -0
- package/dist/src/kernel/completion/templates/shared.js.map +1 -0
- package/dist/src/kernel/completion/templates/zsh.js +201 -0
- package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
- package/dist/src/kernel/completion/types.js +13 -0
- package/dist/src/kernel/completion/types.js.map +1 -0
- package/dist/src/kernel/config/defaults.js +17 -0
- package/dist/src/kernel/config/defaults.js.map +1 -0
- package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
- package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
- package/dist/src/kernel/config/findProjectConfig.js +43 -0
- package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
- package/dist/src/kernel/config/firstRun.js +34 -0
- package/dist/src/kernel/config/firstRun.js.map +1 -0
- package/dist/src/kernel/config/globalConfig.js +79 -0
- package/dist/src/kernel/config/globalConfig.js.map +1 -0
- package/dist/src/kernel/config/index.js +16 -0
- package/dist/src/kernel/config/index.js.map +1 -0
- package/dist/src/kernel/config/paths.js +35 -0
- package/dist/src/kernel/config/paths.js.map +1 -0
- package/dist/src/kernel/config/readConfig.js +78 -0
- package/dist/src/kernel/config/readConfig.js.map +1 -0
- package/dist/src/kernel/config/schema.js +130 -0
- package/dist/src/kernel/config/schema.js.map +1 -0
- package/dist/src/kernel/config/types.js +19 -0
- package/dist/src/kernel/config/types.js.map +1 -0
- package/dist/src/kernel/config/writeConfigField.js +59 -0
- package/dist/src/kernel/config/writeConfigField.js.map +1 -0
- package/dist/src/kernel/copy.js +43 -0
- package/dist/src/kernel/copy.js.map +1 -0
- package/dist/src/kernel/error/PragmaError.js +149 -0
- package/dist/src/kernel/error/PragmaError.js.map +1 -0
- package/dist/src/kernel/error/constants.js +40 -0
- package/dist/src/kernel/error/constants.js.map +1 -0
- package/dist/src/kernel/error/fromTaskError.js +96 -0
- package/dist/src/kernel/error/fromTaskError.js.map +1 -0
- package/dist/src/kernel/error/index.js +13 -0
- package/dist/src/kernel/error/index.js.map +1 -0
- package/dist/src/kernel/error/recovery.js +52 -0
- package/dist/src/kernel/error/recovery.js.map +1 -0
- package/dist/src/kernel/error/renderError.js +115 -0
- package/dist/src/kernel/error/renderError.js.map +1 -0
- package/dist/src/kernel/error/serialize.js +25 -0
- package/dist/src/kernel/error/serialize.js.map +1 -0
- package/dist/src/kernel/error/types.js +9 -0
- package/dist/src/kernel/error/types.js.map +1 -0
- package/dist/src/kernel/index.js +25 -0
- package/dist/src/kernel/index.js.map +1 -0
- package/dist/src/kernel/packs/collect.js +187 -0
- package/dist/src/kernel/packs/collect.js.map +1 -0
- package/dist/src/kernel/packs/compile.js +304 -0
- package/dist/src/kernel/packs/compile.js.map +1 -0
- package/dist/src/kernel/packs/disclosure.js +76 -0
- package/dist/src/kernel/packs/disclosure.js.map +1 -0
- package/dist/src/kernel/packs/glob.js +38 -0
- package/dist/src/kernel/packs/glob.js.map +1 -0
- package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
- package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
- package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
- package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
- package/dist/src/kernel/packs/graphql/index.js +20 -0
- package/dist/src/kernel/packs/graphql/index.js.map +1 -0
- package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
- package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
- package/dist/src/kernel/packs/index.js +34 -0
- package/dist/src/kernel/packs/index.js.map +1 -0
- package/dist/src/kernel/packs/iri.js +110 -0
- package/dist/src/kernel/packs/iri.js.map +1 -0
- package/dist/src/kernel/packs/renderPack.js +129 -0
- package/dist/src/kernel/packs/renderPack.js.map +1 -0
- package/dist/src/kernel/packs/resolveEntity.js +223 -0
- package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
- package/dist/src/kernel/packs/runBodies.js +87 -0
- package/dist/src/kernel/packs/runBodies.js.map +1 -0
- package/dist/src/kernel/packs/sample.js +56 -0
- package/dist/src/kernel/packs/sample.js.map +1 -0
- package/dist/src/kernel/packs/schema.js +369 -0
- package/dist/src/kernel/packs/schema.js.map +1 -0
- package/dist/src/kernel/packs/sparql/applyFilters.js +68 -0
- package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
- package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
- package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
- package/dist/src/kernel/packs/sparql/buildLookupQuery.js +217 -0
- package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
- package/dist/src/kernel/packs/sparql/escape.js +21 -0
- package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
- package/dist/src/kernel/packs/sparql/index.js +31 -0
- package/dist/src/kernel/packs/sparql/index.js.map +1 -0
- package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
- package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
- package/dist/src/kernel/packs/types.js +30 -0
- package/dist/src/kernel/packs/types.js.map +1 -0
- package/dist/src/kernel/packs/uniqueness.js +30 -0
- package/dist/src/kernel/packs/uniqueness.js.map +1 -0
- package/dist/src/kernel/project/cli/buildProgram.js +263 -0
- package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
- package/dist/src/kernel/project/cli/constants.js +27 -0
- package/dist/src/kernel/project/cli/constants.js.map +1 -0
- package/dist/src/kernel/project/cli/dispatch.js +420 -0
- package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
- package/dist/src/kernel/project/cli/exitCodes.js +66 -0
- package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
- package/dist/src/kernel/project/cli/globalFlags.js +216 -0
- package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
- package/dist/src/kernel/project/cli/helpFormat.js +59 -0
- package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
- package/dist/src/kernel/project/cli/index.js +14 -0
- package/dist/src/kernel/project/cli/index.js.map +1 -0
- package/dist/src/kernel/project/cli/rootHelp.js +197 -0
- package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
- package/dist/src/kernel/project/cli/suggest.js +75 -0
- package/dist/src/kernel/project/cli/suggest.js.map +1 -0
- package/dist/src/kernel/project/cli/suggestNames.js +96 -0
- package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
- package/dist/src/kernel/project/cli/verbHelp.js +131 -0
- package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
- package/dist/src/kernel/project/mcp/buildServer.js +67 -0
- package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
- package/dist/src/kernel/project/mcp/envelope.js +37 -0
- package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
- package/dist/src/kernel/project/mcp/index.js +8 -0
- package/dist/src/kernel/project/mcp/index.js.map +1 -0
- package/dist/src/kernel/project/mcp/instructions.js +44 -0
- package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
- package/dist/src/kernel/project/mcp/mcpError.js +42 -0
- package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
- package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
- package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
- package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
- package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
- package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
- package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
- package/dist/src/kernel/project/mcp/registerVerb.js +300 -0
- package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
- package/dist/src/kernel/project/mcp/serve.js +35 -0
- package/dist/src/kernel/project/mcp/serve.js.map +1 -0
- package/dist/src/kernel/render/compactUri.js +24 -0
- package/dist/src/kernel/render/compactUri.js.map +1 -0
- package/dist/src/kernel/render/contracts.js +10 -0
- package/dist/src/kernel/render/contracts.js.map +1 -0
- package/dist/src/kernel/render/disclosure.js +34 -0
- package/dist/src/kernel/render/disclosure.js.map +1 -0
- package/dist/src/kernel/render/envelope.js +30 -0
- package/dist/src/kernel/render/envelope.js.map +1 -0
- package/dist/src/kernel/render/formatters.js +27 -0
- package/dist/src/kernel/render/formatters.js.map +1 -0
- package/dist/src/kernel/render/index.js +15 -0
- package/dist/src/kernel/render/index.js.map +1 -0
- package/dist/src/kernel/render/prefixes.js +46 -0
- package/dist/src/kernel/render/prefixes.js.map +1 -0
- package/dist/src/kernel/render/renderers.js +468 -0
- package/dist/src/kernel/render/renderers.js.map +1 -0
- package/dist/src/kernel/render/style.js +85 -0
- package/dist/src/kernel/render/style.js.map +1 -0
- package/dist/src/kernel/render/turtle.js +194 -0
- package/dist/src/kernel/render/turtle.js.map +1 -0
- package/dist/src/kernel/render/writeStdout.js +43 -0
- package/dist/src/kernel/render/writeStdout.js.map +1 -0
- package/dist/src/kernel/runtime/boot.js +49 -0
- package/dist/src/kernel/runtime/boot.js.map +1 -0
- package/dist/src/kernel/runtime/facade.js +39 -0
- package/dist/src/kernel/runtime/facade.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/build.js +122 -0
- package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
- package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
- package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
- package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/index.js +11 -0
- package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
- package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/read.js +92 -0
- package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
- package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
- package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/types.js +55 -0
- package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
- package/dist/src/kernel/runtime/index.js +8 -0
- package/dist/src/kernel/runtime/index.js.map +1 -0
- package/dist/src/kernel/runtime/loadSession.js +34 -0
- package/dist/src/kernel/runtime/loadSession.js.map +1 -0
- package/dist/src/kernel/runtime/paths.js +78 -0
- package/dist/src/kernel/runtime/paths.js.map +1 -0
- package/dist/src/kernel/runtime/probe.js +37 -0
- package/dist/src/kernel/runtime/probe.js.map +1 -0
- package/dist/src/kernel/runtime/readEntity.js +363 -0
- package/dist/src/kernel/runtime/readEntity.js.map +1 -0
- package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
- package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
- package/dist/src/kernel/runtime/refs/index.js +29 -0
- package/dist/src/kernel/runtime/refs/index.js.map +1 -0
- package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
- package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
- package/dist/src/kernel/runtime/refs/resolve.js +332 -0
- package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
- package/dist/src/kernel/runtime/resolveSources.js +62 -0
- package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
- package/dist/src/kernel/runtime/store.js +75 -0
- package/dist/src/kernel/runtime/store.js.map +1 -0
- package/dist/src/kernel/runtime/storeReadiness.js +51 -0
- package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
- package/dist/src/kernel/runtime/types.js +11 -0
- package/dist/src/kernel/runtime/types.js.map +1 -0
- package/dist/src/kernel/spec/asVerb.js +21 -0
- package/dist/src/kernel/spec/asVerb.js.map +1 -0
- package/dist/src/kernel/spec/emitReference.js +578 -0
- package/dist/src/kernel/spec/emitReference.js.map +1 -0
- package/dist/src/kernel/spec/emitSurface.js +202 -0
- package/dist/src/kernel/spec/emitSurface.js.map +1 -0
- package/dist/src/kernel/spec/index.js +11 -0
- package/dist/src/kernel/spec/index.js.map +1 -0
- package/dist/src/kernel/spec/surfaceConformance.js +103 -0
- package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
- package/dist/src/kernel/spec/types.js +14 -0
- package/dist/src/kernel/spec/types.js.map +1 -0
- package/dist/src/kernel/spec/validate.js +110 -0
- package/dist/src/kernel/spec/validate.js.map +1 -0
- package/dist/src/kernel/vocabulary.js +97 -0
- package/dist/src/kernel/vocabulary.js.map +1 -0
- package/dist/src/types.js +11 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +20 -22
- package/pragma.conf.ts +249 -60
- package/src/bin.ts +267 -82
- package/src/capabilities/block.parity.test.ts +6 -3
- package/src/capabilities/capabilities/capabilities.render.ts +1 -1
- package/src/capabilities/capabilities/capabilities.verb.ts +1 -1
- package/src/capabilities/capabilities/catalog.ts +3 -3
- package/src/capabilities/capabilities/hints.ts +32 -7
- package/src/capabilities/capabilities/index.ts +1 -1
- package/src/capabilities/colophon/collectColophon.ts +35 -24
- package/src/capabilities/colophon/colophon.render.ts +25 -1
- package/src/capabilities/colophon/colophon.test.ts +42 -21
- package/src/capabilities/colophon/colophon.verb.ts +4 -4
- package/src/capabilities/config/collectConfigShow.test.ts +1 -0
- package/src/capabilities/config/collectConfigShow.ts +3 -3
- package/src/capabilities/config/field.render.ts +4 -5
- package/src/capabilities/config/fields.ts +17 -10
- package/src/capabilities/config/get.verb.ts +70 -0
- package/src/capabilities/config/getUnset.test.ts +264 -0
- package/src/capabilities/config/index.ts +5 -1
- package/src/capabilities/config/runField.ts +40 -22
- package/src/capabilities/config/runGet.ts +34 -0
- package/src/capabilities/config/runSet.ts +35 -9
- package/src/capabilities/config/set.test.ts +48 -14
- package/src/capabilities/config/set.verb.ts +8 -7
- package/src/capabilities/config/show.render.ts +1 -1
- package/src/capabilities/config/show.verb.ts +9 -6
- package/src/capabilities/config/types.ts +18 -4
- package/src/capabilities/config/unset.verb.ts +58 -0
- package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
- package/src/capabilities/create/byteEquality.test.ts +25 -11
- package/src/capabilities/create/cliProjection.ts +227 -0
- package/src/capabilities/create/constants.ts +36 -61
- package/src/capabilities/create/create.mcp.test.ts +89 -5
- package/src/capabilities/create/create.render.ts +71 -7
- package/src/capabilities/create/create.test.ts +433 -219
- package/src/capabilities/create/create.verb.ts +297 -328
- package/src/capabilities/create/createGrammar.test.ts +865 -0
- package/src/capabilities/create/createHelp.ts +71 -0
- package/src/capabilities/create/createSurface.generated.ts +400 -0
- package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
- package/src/capabilities/create/cwdJail.test.ts +24 -5
- package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
- package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
- package/src/capabilities/create/index.ts +7 -4
- package/src/capabilities/create/messages.ts +18 -0
- package/src/capabilities/create/mount.ts +391 -0
- package/src/capabilities/create/pathJail.test.ts +90 -0
- package/src/capabilities/create/pathJail.ts +8 -5
- package/src/capabilities/create/pickGenerator.ts +23 -35
- package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
- package/src/capabilities/create/types.ts +20 -0
- package/src/capabilities/distribution.test.ts +3 -1
- package/src/capabilities/distribution.ts +10 -15
- package/src/capabilities/doctor/checks/checkKeStore.ts +7 -5
- package/src/capabilities/doctor/checks/checkPackageRefs.ts +6 -4
- package/src/capabilities/doctor/checks/checkPragmaVersion.ts +2 -2
- package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +72 -27
- package/src/capabilities/doctor/checks/checkShellCompletions.ts +59 -13
- package/src/capabilities/doctor/checks/index.ts +27 -0
- package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
- package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
- package/src/capabilities/doctor/checks/targetHealth.ts +274 -0
- package/src/capabilities/doctor/doctor.render.test.ts +18 -7
- package/src/capabilities/doctor/doctor.render.ts +43 -19
- package/src/capabilities/doctor/doctor.test.ts +123 -34
- package/src/capabilities/doctor/doctor.verb.ts +3 -3
- package/src/capabilities/doctor/runChecks.ts +62 -63
- package/src/capabilities/doctor/types.ts +20 -4
- package/src/capabilities/emptyRecovery.test.ts +13 -8
- package/src/capabilities/graph/examples.exec.test.ts +107 -0
- package/src/capabilities/graph/index.ts +1 -1
- package/src/capabilities/graph/inspect.render.ts +70 -22
- package/src/capabilities/graph/inspect.test.ts +260 -5
- package/src/capabilities/graph/inspect.verb.ts +18 -6
- package/src/capabilities/graph/query.render.ts +15 -3
- package/src/capabilities/graph/query.verb.ts +3 -3
- package/src/capabilities/graph/runQuery.ts +2 -3
- package/src/capabilities/index.ts +3 -1
- package/src/capabilities/info/collectInfo.ts +5 -4
- package/src/capabilities/info/info.render.ts +1 -1
- package/src/capabilities/info/info.verb.ts +1 -1
- package/src/capabilities/lazy.test.ts +32 -0
- package/src/capabilities/meta/complete.verb.ts +1 -1
- package/src/capabilities/meta/index.ts +1 -1
- package/src/capabilities/meta/mcp.verb.ts +10 -8
- package/src/capabilities/ontology/index.ts +15 -11
- package/src/capabilities/ontology/ontology.test.ts +6 -55
- package/src/capabilities/ontology/queries.ts +2 -2
- package/src/capabilities/ontology/render.ts +3 -4
- package/src/capabilities/ontology/verbs.ts +27 -68
- package/src/capabilities/prompt/index.ts +2 -2
- package/src/capabilities/prompt/prompt.render.ts +6 -2
- package/src/capabilities/prompt/types.ts +1 -1
- package/src/capabilities/prompt/verbs.ts +4 -5
- package/src/capabilities/reference.test.ts +63 -0
- package/src/capabilities/resources/provider.ts +342 -85
- package/src/capabilities/resources/resources.test.ts +355 -59
- package/src/capabilities/setup/buildPlan.ts +236 -0
- package/src/capabilities/setup/index.ts +7 -7
- package/src/capabilities/setup/mode.ts +74 -0
- package/src/capabilities/setup/operations/index.ts +74 -0
- package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
- package/src/capabilities/setup/operations/setupConfig.ts +124 -0
- package/src/capabilities/setup/operations/setupGenerator.ts +396 -326
- package/src/capabilities/setup/operations/setupLsp.ts +329 -68
- package/src/capabilities/setup/operations/setupMcp.ts +137 -97
- package/src/capabilities/setup/operations/setupSkills.ts +336 -108
- package/src/capabilities/setup/plan.render.ts +241 -0
- package/src/capabilities/setup/plan.ts +236 -0
- package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
- package/src/capabilities/setup/setup.render.test.ts +281 -73
- package/src/capabilities/setup/setup.render.ts +45 -77
- package/src/capabilities/setup/setup.test.ts +972 -209
- package/src/capabilities/setup/setup.verb.ts +223 -71
- package/src/capabilities/setup/shell.test.ts +86 -0
- package/src/capabilities/setup/shell.ts +137 -11
- package/src/capabilities/setup/targets.ts +367 -0
- package/src/capabilities/setup/types.ts +18 -57
- package/src/capabilities/shared/assertExecOk.ts +68 -10
- package/src/capabilities/shared/index.ts +32 -0
- package/src/capabilities/shared/packageManager.test.ts +55 -0
- package/src/capabilities/shared/packageManager.ts +62 -6
- package/src/capabilities/skill/discover.ts +37 -5
- package/src/capabilities/skill/index.ts +1 -1
- package/src/capabilities/skill/render.ts +10 -9
- package/src/capabilities/skill/skill.test.ts +7 -5
- package/src/capabilities/skill/verbs.ts +3 -4
- package/src/capabilities/sources/collectStatus.ts +7 -2
- package/src/capabilities/sources/index.ts +1 -1
- package/src/capabilities/sources/installSkills.ts +84 -7
- package/src/capabilities/sources/runUpdate.ts +53 -21
- package/src/capabilities/sources/sources.test.ts +154 -2
- package/src/capabilities/sources/status.render.ts +1 -1
- package/src/capabilities/sources/status.verb.ts +1 -1
- package/src/capabilities/sources/update.render.ts +1 -1
- package/src/capabilities/sources/update.verb.ts +1 -1
- package/src/capabilities/surface.test.ts +134 -17
- package/src/capabilities/upgrade/runUpgrade.ts +8 -8
- package/src/capabilities/upgrade/upgrade.render.ts +4 -5
- package/src/capabilities/upgrade/upgrade.test.ts +3 -3
- package/src/capabilities/upgrade/upgrade.verb.ts +1 -1
- package/src/capabilities/version/index.ts +12 -0
- package/src/capabilities/version/version.test.ts +66 -0
- package/src/capabilities/version/version.verb.ts +39 -0
- package/src/constants.ts +31 -1
- package/src/identity.test.ts +40 -25
- package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +15 -13
- package/src/kernel/completion/complete.test.ts +12 -2
- package/src/kernel/completion/complete.ts +1 -1
- package/src/kernel/completion/emitScripts.ts +1 -1
- package/src/kernel/completion/entitySource.test.ts +1 -1
- package/src/kernel/completion/entitySource.ts +21 -8
- package/src/kernel/completion/model.test.ts +164 -12
- package/src/kernel/completion/model.ts +94 -14
- package/src/kernel/completion/parse.test.ts +4 -7
- package/src/kernel/completion/parse.ts +15 -0
- package/src/kernel/completion/resolve.test.ts +0 -1
- package/src/kernel/completion/safety.test.ts +34 -26
- package/src/kernel/completion/shellDrive.test.ts +28 -9
- package/src/kernel/completion/templates/bash.ts +7 -2
- package/src/kernel/completion/templates/index.ts +23 -0
- package/src/kernel/completion/types.ts +7 -0
- package/src/kernel/config/defaults.test.ts +25 -2
- package/src/kernel/config/defaults.ts +4 -3
- package/src/kernel/config/evaluateProjectConfig.ts +31 -8
- package/src/kernel/config/firstRun.test.ts +44 -38
- package/src/kernel/config/firstRun.ts +24 -88
- package/src/kernel/config/index.ts +1 -1
- package/src/kernel/config/readConfig.test.ts +6 -3
- package/src/kernel/config/readConfig.ts +1 -1
- package/src/kernel/config/schema.ts +3 -1
- package/src/kernel/config/types.ts +3 -1
- package/src/kernel/copy.test.ts +34 -4
- package/src/kernel/copy.ts +54 -0
- package/src/kernel/error/PragmaError.test.ts +5 -2
- package/src/kernel/error/PragmaError.ts +4 -2
- package/src/kernel/error/constants.ts +7 -5
- package/src/kernel/error/fromTaskError.ts +28 -6
- package/src/kernel/error/recovery.ts +14 -0
- package/src/kernel/error/renderError.ts +42 -1
- package/src/kernel/error/types.ts +21 -1
- package/src/kernel/index.ts +26 -0
- package/src/kernel/packs/collect.ts +12 -16
- package/src/kernel/packs/compile.test.ts +130 -1
- package/src/kernel/packs/compile.ts +93 -3
- package/src/kernel/packs/disclosure.ts +2 -2
- package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
- package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +3 -4
- package/src/kernel/packs/graphql/index.ts +20 -0
- package/src/kernel/packs/index.ts +40 -0
- package/src/kernel/packs/iri.test.ts +73 -0
- package/src/kernel/packs/iri.ts +66 -14
- package/src/kernel/packs/renderPack.ts +24 -5
- package/src/kernel/packs/resolveEntity.test.ts +213 -0
- package/src/kernel/packs/resolveEntity.ts +112 -18
- package/src/kernel/packs/runBodies.ts +2 -3
- package/src/kernel/packs/sample.ts +1 -1
- package/src/kernel/packs/schema.ts +18 -1
- package/src/kernel/packs/sparql/applyFilters.ts +16 -17
- package/src/kernel/packs/sparql/buildLookupQuery.ts +75 -3
- package/src/kernel/packs/sparql/index.ts +37 -0
- package/src/kernel/packs/sparql/runSelect.test.ts +1 -1
- package/src/kernel/packs/sparql/runSelect.ts +3 -4
- package/src/kernel/packs/toolDescription.test.ts +42 -3
- package/src/kernel/packs/types.ts +13 -0
- package/src/kernel/packs/uniqueness.ts +1 -1
- package/src/kernel/project/cli/buildProgram.test.ts +147 -12
- package/src/kernel/project/cli/buildProgram.ts +77 -18
- package/src/kernel/project/cli/constants.ts +34 -0
- package/src/kernel/project/cli/dispatch.test.ts +160 -3
- package/src/kernel/project/cli/dispatch.ts +222 -42
- package/src/kernel/project/cli/exitCodes.ts +1 -1
- package/src/kernel/project/cli/globalFlags.test.ts +117 -1
- package/src/kernel/project/cli/globalFlags.ts +130 -30
- package/src/kernel/project/cli/helpFormat.ts +13 -0
- package/src/kernel/project/cli/rootHelp.ts +41 -12
- package/src/kernel/project/cli/suggest.test.ts +33 -1
- package/src/kernel/project/cli/suggest.ts +25 -1
- package/src/kernel/project/cli/verbHelp.test.ts +30 -0
- package/src/kernel/project/cli/verbHelp.ts +23 -7
- package/src/kernel/project/mcp/buildServer.ts +7 -4
- package/src/kernel/project/mcp/envelope.ts +2 -2
- package/src/kernel/project/mcp/instructions.ts +2 -2
- package/src/kernel/project/mcp/mcpError.ts +1 -1
- package/src/kernel/project/mcp/parity.test.ts +5 -2
- package/src/kernel/project/mcp/prompts/index.ts +37 -0
- package/src/kernel/project/mcp/prompts/source.ts +2 -2
- package/src/kernel/project/mcp/registerVerb.ts +35 -9
- package/src/kernel/project/mcp/serve.ts +2 -2
- package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
- package/src/kernel/render/contracts.ts +21 -0
- package/src/kernel/render/envelope.ts +2 -3
- package/src/kernel/render/formatters.ts +1 -1
- package/src/kernel/render/renderers.test.ts +243 -6
- package/src/kernel/render/renderers.ts +222 -20
- package/src/kernel/render/style.test.ts +75 -24
- package/src/kernel/render/style.ts +31 -1
- package/src/kernel/render/turtle.ts +222 -0
- package/src/kernel/runtime/graphpack/buildIndex.ts +1 -1
- package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +3 -3
- package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +1 -1
- package/src/kernel/runtime/graphpack/embedded.ts +3 -3
- package/src/kernel/runtime/graphpack/manifest.ts +1 -1
- package/src/kernel/runtime/graphpack/read.ts +1 -2
- package/src/kernel/runtime/loadSession.ts +1 -1
- package/src/kernel/runtime/probe.ts +6 -6
- package/src/kernel/runtime/readEntity.ts +472 -28
- package/src/kernel/runtime/refs/index.ts +39 -0
- package/src/kernel/runtime/refs/parseRef.ts +2 -2
- package/src/kernel/runtime/refs/resolve.ts +4 -4
- package/src/kernel/runtime/storeReadiness.ts +1 -2
- package/src/kernel/runtime/types.ts +15 -1
- package/src/kernel/runtime/wasmEmbed.test.ts +37 -39
- package/src/kernel/spec/emitReference.ts +105 -30
- package/src/kernel/spec/emitSurface.ts +48 -6
- package/src/kernel/spec/surfaceConformance.test.ts +4 -2
- package/src/kernel/spec/types.ts +248 -4
- package/src/testing/behavioral/docExamples.test.ts +14 -0
- package/src/testing/behavioral/errorMatrix.mcp.test.ts +2 -2
- package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
- package/src/testing/behavioral/journeys.cli.test.ts +1 -1
- package/src/testing/behavioral/journeys.defaultPack.test.ts +7 -7
- package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
- package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
- package/src/testing/behavioral/journeys.packageStories.test.ts +4 -4
- package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
- package/src/testing/behavioral/mcpSurface.test.ts +1 -1
- package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
- package/src/testing/eval/cases/effectful.ts +3 -2
- package/src/testing/fixtures/blockGraph.ts +79 -0
- package/src/testing/fixtures/graph/canonical.ts +88 -2
- package/src/testing/fixtures/graph/defaultPack.ts +1 -1
- package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
- package/src/testing/helpers/projectMcp.ts +32 -6
- package/src/testing/helpers/runCli.ts +35 -18
- package/src/testing/perf/budgets.test.ts +20 -9
- package/src/testing/perf/budgets.ts +58 -9
- package/src/testing/perf/codegen.test.ts +126 -0
- package/src/testing/perf/globalSetup.test.ts +286 -0
- package/src/testing/perf/globalSetup.ts +505 -23
- package/src/testing/perf/measure.test.ts +38 -0
- package/src/testing/perf/measure.ts +23 -4
- package/src/testing/setupXdgIsolation.ts +81 -21
- package/src/testing/tempRoot.globalSetup.ts +122 -0
- package/dist/pragma +0 -0
- package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -189
- package/src/capabilities/create/templates.embedded.generated.ts +0 -28
- package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -42
- package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
- package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -68
- package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -61
- package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
- package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
- package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
|
@@ -1,125 +1,323 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `setup skills` — symlink discovered skills into
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
2
|
+
* `setup skills` — symlink discovered skills into harness skill directories.
|
|
3
|
+
*
|
|
4
|
+
* BAND-MATCHED: the band picks the source root AND the link destination, and
|
|
5
|
+
* the two always match.
|
|
6
|
+
*
|
|
7
|
+
* - global (the default): INSTALLED skills (`$XDG_DATA_HOME/<bin>/skills`, where
|
|
8
|
+
* `sources update` puts package skills) link into user-level harness skill
|
|
9
|
+
* directories — the cross-client `~/.agents/skills`, plus the user-level
|
|
10
|
+
* directory of each detected harness whose user-level location is verified.
|
|
11
|
+
* - project (`--local`): PROJECT skills (`<cwd>/.<bin>/skills`) link into the
|
|
12
|
+
* project's harness directories — the checked-in, team-shared arrangement.
|
|
13
|
+
*
|
|
14
|
+
* Cross-band linking is what this replaces: linking installed skills into a
|
|
15
|
+
* repository's directories leaks machine state into a checkout, and linking a
|
|
16
|
+
* repository's skills into the home directory applies one project's skills
|
|
17
|
+
* machine-wide. Neither is ever what the user asked for.
|
|
18
|
+
*
|
|
19
|
+
* Split into `detectSkills` (discovery, harness detection, and the per-link
|
|
20
|
+
* create/skip/replace DECISION, all against the real filesystem up front, so
|
|
21
|
+
* the plan and the recap reflect true state) and pure compose bodies performing
|
|
22
|
+
* only the symlink/delete effects the dry-run interpreter mocks.
|
|
10
23
|
*/
|
|
11
24
|
|
|
12
|
-
import {
|
|
13
|
-
import { resolve } from "node:path";
|
|
25
|
+
import { lstatSync, readdirSync, readlinkSync } from "node:fs";
|
|
26
|
+
import { dirname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
14
27
|
import {
|
|
15
28
|
deleteFile,
|
|
16
|
-
info,
|
|
17
29
|
mkdir,
|
|
18
30
|
sequence_,
|
|
19
31
|
symlink,
|
|
20
32
|
type Task,
|
|
21
33
|
} from "@canonical/task";
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import { cliRecovery } from "../../../kernel/error/recovery.js";
|
|
25
|
-
import type { PragmaRuntime } from "../../../kernel/runtime/types.js";
|
|
26
|
-
import type { SetupSkillsResult, SymlinkAction } from "../types.js";
|
|
34
|
+
import type { PragmaRuntime } from "../../../kernel/runtime/index.js";
|
|
35
|
+
import type { ScopeBand } from "../types.js";
|
|
27
36
|
|
|
28
37
|
/** Cross-client skill directory, shared across all harnesses. */
|
|
29
38
|
const CROSS_CLIENT_DIR = ".agents/skills";
|
|
30
39
|
|
|
31
40
|
/**
|
|
32
|
-
* The
|
|
33
|
-
*
|
|
34
|
-
*
|
|
41
|
+
* The harnesses whose USER-LEVEL skills directory is verified against the
|
|
42
|
+
* harness's own documentation, and therefore safe to link into on the global
|
|
43
|
+
* band. A harness absent from this set simply contributes no global link
|
|
44
|
+
* directory: an invented `~/.<something>/skills` would be a directory nothing
|
|
45
|
+
* reads, and creating it would be litter dressed up as configuration.
|
|
46
|
+
*
|
|
47
|
+
* The path itself is still the registry's — `skillsPath` is a function of a
|
|
48
|
+
* root, so a user-level location is `skillsPath(home)`. What lives here is only
|
|
49
|
+
* the JUDGEMENT that the location has been confirmed.
|
|
50
|
+
*/
|
|
51
|
+
const VERIFIED_GLOBAL_SKILL_HARNESSES: ReadonlySet<string> = new Set([
|
|
52
|
+
"claude-code",
|
|
53
|
+
]);
|
|
54
|
+
|
|
55
|
+
/** One symlink create/skip/replace action decided during detection. */
|
|
56
|
+
export interface SymlinkAction {
|
|
57
|
+
readonly skillName: string;
|
|
58
|
+
readonly target: string;
|
|
59
|
+
readonly linkPath: string;
|
|
60
|
+
readonly action: "created" | "skipped" | "replaced";
|
|
61
|
+
readonly harnessName: string;
|
|
62
|
+
/**
|
|
63
|
+
* Whether this link path currently holds a symlink INTO the band's skill
|
|
64
|
+
* root — the ownership test removal turns on. A link pointing anywhere else
|
|
65
|
+
* is the user's and is never this command's to delete, and a real (non-link)
|
|
66
|
+
* entry is never touched at all.
|
|
67
|
+
*/
|
|
68
|
+
readonly owned: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Whether a REAL (non-symlink) entry occupies the link path. Such a path is
|
|
71
|
+
* `skipped` for the same reason an already-correct link is — neither is
|
|
72
|
+
* anything to do — but they are not the same state: one is a link this
|
|
73
|
+
* command maintains, the other is a hand-placed directory it will never
|
|
74
|
+
* touch, and reporting both as "current" told the user a link exists where
|
|
75
|
+
* none does.
|
|
76
|
+
*/
|
|
77
|
+
readonly blocked: boolean;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* The detected skill-linking plan for ONE band: the source root, the target
|
|
82
|
+
* directories, the decided per-link actions, and the counts the plan row
|
|
83
|
+
* reports. `available` is false when the band's root holds no skills.
|
|
35
84
|
*/
|
|
36
85
|
export interface SkillsDetection {
|
|
86
|
+
readonly band: ScopeBand;
|
|
87
|
+
/** The band's source root — the directory skills are discovered from. */
|
|
88
|
+
readonly sourceRoot: string;
|
|
37
89
|
readonly available: boolean;
|
|
38
90
|
readonly targets: readonly { readonly dir: string; readonly name: string }[];
|
|
39
91
|
readonly actions: readonly SymlinkAction[];
|
|
92
|
+
/**
|
|
93
|
+
* Links this band OWNS that no CURRENT skill accounts for: the source root
|
|
94
|
+
* emptied, or one skill removed upstream. They are not part of the forward
|
|
95
|
+
* plan — there is nothing left to link them to — but they are exactly what
|
|
96
|
+
* removal exists to clear, and deriving removal from the per-skill actions
|
|
97
|
+
* alone left them on disk while `--undo` reported zero work.
|
|
98
|
+
*/
|
|
99
|
+
readonly orphans: readonly SymlinkAction[];
|
|
40
100
|
readonly skillCount: number;
|
|
41
101
|
readonly harnessCount: number;
|
|
42
102
|
readonly warnings: readonly string[];
|
|
43
103
|
}
|
|
44
104
|
|
|
45
|
-
/**
|
|
46
|
-
|
|
47
|
-
|
|
105
|
+
/** What currently occupies a candidate link path. */
|
|
106
|
+
type LinkState =
|
|
107
|
+
| { readonly kind: "absent" }
|
|
108
|
+
| { readonly kind: "symlink"; readonly target: string }
|
|
109
|
+
| { readonly kind: "other" };
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Whether a link's destination lives INSIDE the band's skill root — the
|
|
113
|
+
* ownership test, and the one that decides what `--undo` deletes.
|
|
114
|
+
*
|
|
115
|
+
* A raw `readlink` target may be relative, so it is resolved against the link's
|
|
116
|
+
* own directory first; then containment is tested by PATH SEGMENT. A string
|
|
117
|
+
* prefix answered yes for `<root>-backup/foo`, so a user's own link into a
|
|
118
|
+
* sibling directory was classified as ours and removed by `--undo` — a file we
|
|
119
|
+
* never created and had no business deleting.
|
|
120
|
+
*
|
|
121
|
+
* The root itself is not "inside" it: a link pointing AT the root is not one of
|
|
122
|
+
* the per-skill links this command writes.
|
|
123
|
+
*
|
|
124
|
+
* @param root - The band's skill source root, absolute.
|
|
125
|
+
* @param linkPath - The absolute path of the link being classified.
|
|
126
|
+
* @param rawTarget - The link's destination exactly as `readlink` reported it.
|
|
127
|
+
* @returns Whether the destination is a path under the root.
|
|
128
|
+
* @note Pure — it resolves and compares strings, and reads nothing.
|
|
129
|
+
*/
|
|
130
|
+
function withinRoot(
|
|
131
|
+
root: string,
|
|
132
|
+
linkPath: string,
|
|
133
|
+
rawTarget: string,
|
|
134
|
+
): boolean {
|
|
135
|
+
const destination = resolve(dirname(linkPath), rawTarget);
|
|
136
|
+
const rel = relative(root, destination);
|
|
137
|
+
return (
|
|
138
|
+
rel.length > 0 &&
|
|
139
|
+
rel !== ".." &&
|
|
140
|
+
!rel.startsWith(`..${sep}`) &&
|
|
141
|
+
!isAbsolute(rel)
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Classify a link path WITHOUT following it: absent, a symlink (with its raw
|
|
147
|
+
* target, resolving or not), or a real (non-symlink) entry. `lstat`-based, the
|
|
148
|
+
* same classification `sources/installSkills.ts`'s `linkState` uses — probing
|
|
149
|
+
* with `existsSync` FOLLOWS the link, so a DANGLING symlink read as "absent",
|
|
150
|
+
* the plan said `created`, and the real `symlink()` crashed EEXIST while the
|
|
151
|
+
* dry-run previewed a clean create.
|
|
152
|
+
*/
|
|
153
|
+
function linkState(linkPath: string): LinkState {
|
|
154
|
+
let stat: ReturnType<typeof lstatSync>;
|
|
48
155
|
try {
|
|
49
|
-
|
|
156
|
+
stat = lstatSync(linkPath);
|
|
50
157
|
} catch {
|
|
51
|
-
return "";
|
|
158
|
+
return { kind: "absent" };
|
|
159
|
+
}
|
|
160
|
+
if (stat.isSymbolicLink()) {
|
|
161
|
+
try {
|
|
162
|
+
return { kind: "symlink", target: readlinkSync(linkPath) };
|
|
163
|
+
} catch {
|
|
164
|
+
return { kind: "other" };
|
|
165
|
+
}
|
|
52
166
|
}
|
|
167
|
+
return { kind: "other" };
|
|
53
168
|
}
|
|
54
169
|
|
|
55
170
|
/**
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
171
|
+
* The link directories for a band. Project: every detected harness's
|
|
172
|
+
* project-rooted skills directory plus the cross-client one, exactly as
|
|
173
|
+
* before. Global: the same construction rooted at the user's home directory,
|
|
174
|
+
* but only for the harnesses in {@link VERIFIED_GLOBAL_SKILL_HARNESSES} —
|
|
175
|
+
* plus the cross-client directory, which every client reads by convention.
|
|
176
|
+
*
|
|
177
|
+
* @param detected - The detected harnesses.
|
|
178
|
+
* @param band - The band being set up.
|
|
179
|
+
* @param root - The band's link root (`cwd` for project, home for global).
|
|
180
|
+
* @returns The deduplicated target directories, first-seen wins.
|
|
181
|
+
*/
|
|
182
|
+
function linkTargets(
|
|
183
|
+
detected: readonly {
|
|
184
|
+
harness: { id: string; name: string; skillsPath: (root: string) => string };
|
|
185
|
+
}[],
|
|
186
|
+
band: ScopeBand,
|
|
187
|
+
root: string,
|
|
188
|
+
): { dir: string; name: string }[] {
|
|
189
|
+
const seen = new Set<string>();
|
|
190
|
+
const targets: { dir: string; name: string }[] = [];
|
|
191
|
+
for (const d of detected) {
|
|
192
|
+
if (
|
|
193
|
+
band === "global" &&
|
|
194
|
+
!VERIFIED_GLOBAL_SKILL_HARNESSES.has(d.harness.id)
|
|
195
|
+
) {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const dir = d.harness.skillsPath(root);
|
|
199
|
+
if (seen.has(dir)) continue;
|
|
200
|
+
seen.add(dir);
|
|
201
|
+
targets.push({ dir, name: d.harness.name });
|
|
202
|
+
}
|
|
203
|
+
const crossDir = resolve(root, CROSS_CLIENT_DIR);
|
|
204
|
+
if (!seen.has(crossDir))
|
|
205
|
+
targets.push({ dir: crossDir, name: CROSS_CLIENT_DIR });
|
|
206
|
+
return targets;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Every owned link sitting in the target directories that the per-skill pass
|
|
211
|
+
* did not already visit.
|
|
212
|
+
*
|
|
213
|
+
* The forward pass enumerates CURRENT skills, so it can only ever see links a
|
|
214
|
+
* skill still exists for. Once the source root is emptied — or one skill is
|
|
215
|
+
* removed upstream — the link it left behind is invisible to that pass, and
|
|
216
|
+
* removal derived from it found nothing to do. Ownership is the same
|
|
217
|
+
* containment test the forward pass applies, so a user's own link is no more
|
|
218
|
+
* removable here than it is there.
|
|
219
|
+
*
|
|
220
|
+
* @param targets - The band's link directories.
|
|
221
|
+
* @param sourceRoot - The band's skill source root.
|
|
222
|
+
* @param covered - Link paths the per-skill pass already decided.
|
|
223
|
+
* @returns The owned links no current skill accounts for.
|
|
224
|
+
* @note Impure — reads each target directory and lstats its entries.
|
|
225
|
+
*/
|
|
226
|
+
function orphanedLinks(
|
|
227
|
+
targets: readonly { dir: string; name: string }[],
|
|
228
|
+
sourceRoot: string,
|
|
229
|
+
covered: ReadonlySet<string>,
|
|
230
|
+
): SymlinkAction[] {
|
|
231
|
+
const orphans: SymlinkAction[] = [];
|
|
232
|
+
for (const { dir, name } of targets) {
|
|
233
|
+
let entries: string[];
|
|
234
|
+
try {
|
|
235
|
+
entries = readdirSync(dir);
|
|
236
|
+
} catch {
|
|
237
|
+
continue; // The directory does not exist — it holds no links.
|
|
238
|
+
}
|
|
239
|
+
for (const entry of entries) {
|
|
240
|
+
const linkPath = resolve(dir, entry);
|
|
241
|
+
if (covered.has(linkPath)) continue;
|
|
242
|
+
const state = linkState(linkPath);
|
|
243
|
+
if (state.kind !== "symlink") continue;
|
|
244
|
+
if (!withinRoot(sourceRoot, linkPath, state.target)) continue;
|
|
245
|
+
orphans.push({
|
|
246
|
+
skillName: entry,
|
|
247
|
+
target: resolve(dirname(linkPath), state.target),
|
|
248
|
+
linkPath,
|
|
249
|
+
action: "skipped",
|
|
250
|
+
harnessName: name,
|
|
251
|
+
blocked: false,
|
|
252
|
+
owned: true,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return orphans;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Discover the band's skills, detect harnesses, and decide each link action
|
|
261
|
+
* (real filesystem, up front).
|
|
262
|
+
*
|
|
263
|
+
* Target discovery runs even when the band holds NO skills: the directories are
|
|
264
|
+
* where this command's own links live, and a removal has to be able to find
|
|
265
|
+
* them after the source root has been emptied.
|
|
59
266
|
*
|
|
60
267
|
* @param rt - The per-invocation runtime.
|
|
61
|
-
* @
|
|
268
|
+
* @param band - Which band to plan: global (installed skills) or project.
|
|
269
|
+
* @returns The band's link plan.
|
|
62
270
|
* @note Impure — reads the filesystem (skills + harnesses + existing links).
|
|
63
271
|
*/
|
|
64
272
|
export async function detectSkills(
|
|
65
273
|
rt: PragmaRuntime,
|
|
274
|
+
band: ScopeBand,
|
|
66
275
|
): Promise<SkillsDetection> {
|
|
67
276
|
const cwd = rt.cwd;
|
|
68
|
-
const [
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
return {
|
|
78
|
-
available: false,
|
|
79
|
-
targets: [],
|
|
80
|
-
actions: [],
|
|
81
|
-
skillCount: 0,
|
|
82
|
-
harnessCount: 0,
|
|
83
|
-
warnings: [],
|
|
84
|
-
};
|
|
85
|
-
}
|
|
277
|
+
const [
|
|
278
|
+
{ discoverSkillsFrom, installedSkillsDir, projectSkillsDir },
|
|
279
|
+
{ detectHarnesses, readPlatformEnv, userHome },
|
|
280
|
+
{ runTask },
|
|
281
|
+
] = await Promise.all([
|
|
282
|
+
import("../../skill/discover.js"),
|
|
283
|
+
import("@canonical/harnesses"),
|
|
284
|
+
import("@canonical/task/node"),
|
|
285
|
+
]);
|
|
86
286
|
|
|
287
|
+
const sourceRoot =
|
|
288
|
+
band === "project" ? projectSkillsDir(cwd) : installedSkillsDir();
|
|
289
|
+
const linkRoot = band === "project" ? cwd : userHome(readPlatformEnv());
|
|
290
|
+
const skills = discoverSkillsFrom([sourceRoot]);
|
|
87
291
|
const detected = await runTask(detectHarnesses(cwd));
|
|
292
|
+
const targets = linkTargets(detected, band, linkRoot);
|
|
88
293
|
|
|
89
|
-
//
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
const dir = d.harness.skillsPath(cwd);
|
|
94
|
-
if (!seen.has(dir)) {
|
|
95
|
-
seen.add(dir);
|
|
96
|
-
targets.push({ dir, name: d.harness.name });
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
const crossDir = resolve(cwd, CROSS_CLIENT_DIR);
|
|
100
|
-
if (!seen.has(crossDir)) {
|
|
101
|
-
seen.add(crossDir);
|
|
102
|
-
targets.push({ dir: crossDir, name: CROSS_CLIENT_DIR });
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Decide each action against REAL fs (so the preview is accurate).
|
|
294
|
+
// Decide each action against REAL fs (so the preview is accurate). Dangling
|
|
295
|
+
// or wrong-target symlinks are `replaced` (delete + relink); a real
|
|
296
|
+
// (non-symlink) file or directory at the path is `skipped` — a hand-placed
|
|
297
|
+
// skill is never this command's to delete.
|
|
106
298
|
const actions: SymlinkAction[] = [];
|
|
107
299
|
for (const { dir, name } of targets) {
|
|
108
300
|
for (const skill of skills) {
|
|
109
301
|
const linkPath = resolve(dir, skill.folderName);
|
|
110
|
-
const
|
|
302
|
+
const state = linkState(linkPath);
|
|
111
303
|
const action: SymlinkAction["action"] =
|
|
112
|
-
|
|
304
|
+
state.kind === "absent"
|
|
113
305
|
? "created"
|
|
114
|
-
:
|
|
306
|
+
: state.kind === "symlink" && state.target === skill.sourcePath
|
|
115
307
|
? "skipped"
|
|
116
|
-
: "
|
|
308
|
+
: state.kind === "symlink"
|
|
309
|
+
? "replaced"
|
|
310
|
+
: "skipped";
|
|
117
311
|
actions.push({
|
|
118
312
|
skillName: skill.name,
|
|
119
313
|
target: skill.sourcePath,
|
|
120
314
|
linkPath,
|
|
121
315
|
action,
|
|
122
316
|
harnessName: name,
|
|
317
|
+
blocked: state.kind === "other",
|
|
318
|
+
owned:
|
|
319
|
+
state.kind === "symlink" &&
|
|
320
|
+
withinRoot(sourceRoot, linkPath, state.target),
|
|
123
321
|
});
|
|
124
322
|
}
|
|
125
323
|
}
|
|
@@ -127,15 +325,22 @@ export async function detectSkills(
|
|
|
127
325
|
const warnings = actions
|
|
128
326
|
.filter((a) => a.action === "replaced")
|
|
129
327
|
.map(
|
|
130
|
-
(a) => `Replaced stale symlink for ${a.skillName} in ${a.harnessName}`,
|
|
328
|
+
(a) => `Replaced a stale symlink for ${a.skillName} in ${a.harnessName}`,
|
|
131
329
|
);
|
|
132
330
|
|
|
133
331
|
return {
|
|
134
|
-
|
|
332
|
+
band,
|
|
333
|
+
sourceRoot,
|
|
334
|
+
available: skills.length > 0,
|
|
135
335
|
targets,
|
|
136
336
|
actions,
|
|
337
|
+
orphans: orphanedLinks(
|
|
338
|
+
targets,
|
|
339
|
+
sourceRoot,
|
|
340
|
+
new Set(actions.map((a) => a.linkPath)),
|
|
341
|
+
),
|
|
137
342
|
skillCount: skills.length,
|
|
138
|
-
harnessCount:
|
|
343
|
+
harnessCount: targets.length,
|
|
139
344
|
warnings,
|
|
140
345
|
};
|
|
141
346
|
}
|
|
@@ -146,60 +351,83 @@ export async function detectSkills(
|
|
|
146
351
|
*
|
|
147
352
|
* Built from re-runnable combinators (NOT a single-use `gen`) because `execute`
|
|
148
353
|
* interprets the task twice (preview + perform). `created` links carry an undo;
|
|
149
|
-
* a `replaced` link is delete-then-relink (idempotent); `skipped` is a no-op
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
* harness dirs today; a `--scope global` machine-band skills location is
|
|
153
|
-
* deferred. The manifest line is `[project]`-prefixed to make that explicit.
|
|
354
|
+
* a `replaced` link is delete-then-relink (idempotent); `skipped` is a no-op —
|
|
355
|
+
* and a detection where every action is `skipped` composes NOTHING, so a
|
|
356
|
+
* converged re-run performs zero filesystem mutations.
|
|
154
357
|
*
|
|
155
358
|
* @param d - The detection gathered up front.
|
|
156
|
-
* @returns A Task that mkdirs each target and creates/replaces
|
|
359
|
+
* @returns A Task that mkdirs each needed target and creates/replaces links.
|
|
157
360
|
*/
|
|
158
361
|
export function composeSkills(d: SkillsDetection): Task<void> {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
362
|
+
const pending = d.actions.filter((a) => a.action !== "skipped");
|
|
363
|
+
if (!d.available || pending.length === 0) return sequence_([]);
|
|
364
|
+
const dirs = new Set(pending.map((a) => dirname(a.linkPath)));
|
|
365
|
+
const tasks: Task<unknown>[] = [...dirs]
|
|
366
|
+
.sort()
|
|
367
|
+
.map((dir) => mkdir(dir, true));
|
|
368
|
+
for (const a of pending) {
|
|
165
369
|
if (a.action === "created") {
|
|
166
370
|
tasks.push(
|
|
167
371
|
symlink(a.target, a.linkPath, { undo: deleteFile(a.linkPath) }),
|
|
168
372
|
);
|
|
169
|
-
} else
|
|
373
|
+
} else {
|
|
170
374
|
tasks.push(deleteFile(a.linkPath));
|
|
171
|
-
tasks.push(
|
|
375
|
+
tasks.push(
|
|
376
|
+
symlink(a.target, a.linkPath, { undo: deleteFile(a.linkPath) }),
|
|
377
|
+
);
|
|
172
378
|
}
|
|
173
379
|
}
|
|
174
|
-
tasks.push(
|
|
175
|
-
info(
|
|
176
|
-
`[project] Linked ${d.skillCount} skill(s) into ${d.targets.length} dir(s).`,
|
|
177
|
-
),
|
|
178
|
-
);
|
|
179
380
|
return sequence_(tasks);
|
|
180
381
|
}
|
|
181
382
|
|
|
182
|
-
/**
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
383
|
+
/**
|
|
384
|
+
* The links this band OWNS right now — every existing symlink pointing into the
|
|
385
|
+
* band's skill root, including dangling ones, ones already correct, and the
|
|
386
|
+
* ones no current skill accounts for. This is what removal acts on, and it is
|
|
387
|
+
* deliberately NOT the forward plan: undoing a freshly composed forward plan on
|
|
388
|
+
* an already-linked tree reversed the mkdirs and removed nothing, while
|
|
389
|
+
* reporting a step count.
|
|
390
|
+
*/
|
|
391
|
+
/**
|
|
392
|
+
* The named reason a skills row skips, shared by the setup plan and the doctor
|
|
393
|
+
* row so the two surfaces cannot word the same finding differently. Two strings
|
|
394
|
+
* for one condition is how a user ends up unsure whether they are looking at one
|
|
395
|
+
* problem or two.
|
|
396
|
+
*
|
|
397
|
+
* @param sourceRoot - The band's skill source root, already root-relative.
|
|
398
|
+
* @param band - The band being reported.
|
|
399
|
+
* @returns The reason line.
|
|
400
|
+
*/
|
|
401
|
+
export const skillsSkipReason = (
|
|
402
|
+
sourceRoot: string,
|
|
403
|
+
band: ScopeBand,
|
|
404
|
+
): string =>
|
|
405
|
+
band === "project"
|
|
406
|
+
? `no project skills (${sourceRoot} is absent)`
|
|
407
|
+
: "no skills installed";
|
|
408
|
+
|
|
409
|
+
export const ownedSkillLinks = (
|
|
410
|
+
d: SkillsDetection,
|
|
411
|
+
): readonly SymlinkAction[] => [
|
|
412
|
+
...d.actions.filter((a) => a.owned),
|
|
413
|
+
...d.orphans,
|
|
414
|
+
];
|
|
191
415
|
|
|
192
416
|
/**
|
|
193
|
-
*
|
|
194
|
-
*
|
|
195
|
-
*
|
|
417
|
+
* Compose the removal of every owned link. Each forward effect re-asserts the
|
|
418
|
+
* link (idempotent) and carries its deletion as `undo`, which is what the undo
|
|
419
|
+
* interpreter executes — so the reversal is composed from what detection says
|
|
420
|
+
* this command owns, never from what a fresh forward plan would create.
|
|
421
|
+
*
|
|
422
|
+
* @param d - The detection gathered up front.
|
|
423
|
+
* @returns A Task whose undo removes every owned link.
|
|
196
424
|
*/
|
|
197
|
-
export function
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
425
|
+
export function composeSkillsRemoval(d: SkillsDetection): Task<void> {
|
|
426
|
+
const owned = ownedSkillLinks(d);
|
|
427
|
+
if (owned.length === 0) return sequence_([]);
|
|
428
|
+
return sequence_(
|
|
429
|
+
owned.map((a) =>
|
|
430
|
+
symlink(a.target, a.linkPath, { undo: deleteFile(a.linkPath) }),
|
|
203
431
|
),
|
|
204
|
-
|
|
432
|
+
);
|
|
205
433
|
}
|