@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
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { asVerb } from "../../kernel/spec/asVerb.js";
|
|
7
|
-
import type { CapabilityModule } from "../../kernel/spec/
|
|
7
|
+
import type { CapabilityModule } from "../../kernel/spec/index.js";
|
|
8
8
|
import { statusVerb } from "./status.verb.js";
|
|
9
9
|
import { updateVerb } from "./update.verb.js";
|
|
10
10
|
|
|
@@ -10,27 +10,62 @@
|
|
|
10
10
|
* first), and the update Task stays reversible (each created link carries an
|
|
11
11
|
* unlink undo).
|
|
12
12
|
*
|
|
13
|
+
* Installing alone leaks, because planning walks the PACKAGES and so only ever
|
|
14
|
+
* visits a skill that still exists. When a package DROPS one (a `0.1.2` that
|
|
15
|
+
* shipped `component-specifier` upgrading to a `0.2.0` that does not), the link
|
|
16
|
+
* the previous update installed is never revisited and is left dangling at a
|
|
17
|
+
* target that no longer exists — which reads as a broken install rather than the
|
|
18
|
+
* intentional removal it is, and which `skill` commands can still list or try to
|
|
19
|
+
* open. So planning ALSO walks the installed root and prunes those, under a
|
|
20
|
+
* deliberately narrow rule: an entry is removed only when this run did not plan
|
|
21
|
+
* it AND it is a symlink whose target is gone. A real directory is a
|
|
22
|
+
* manually-installed skill and a still-resolving symlink is someone's own link;
|
|
23
|
+
* neither is this update's to delete.
|
|
24
|
+
*
|
|
13
25
|
* Decisions run against REAL fs here so the update's `--dry-run` plan is
|
|
14
26
|
* accurate; the composed Task performs only the symlink/delete effects.
|
|
15
27
|
*/
|
|
16
28
|
|
|
17
|
-
import {
|
|
29
|
+
import {
|
|
30
|
+
existsSync,
|
|
31
|
+
lstatSync,
|
|
32
|
+
readdirSync,
|
|
33
|
+
readlinkSync,
|
|
34
|
+
statSync,
|
|
35
|
+
} from "node:fs";
|
|
18
36
|
import { basename, join, resolve } from "node:path";
|
|
19
|
-
import type { ResolvedPackage } from "../../kernel/runtime/refs/
|
|
37
|
+
import type { ResolvedPackage } from "../../kernel/runtime/refs/index.js";
|
|
38
|
+
// The ownership test, imported rather than reimplemented: `setup skills` and
|
|
39
|
+
// this module must not be able to disagree about which links belong to pragma.
|
|
40
|
+
// `setupSkills.ts` reaches `@canonical/harnesses` only through a DYNAMIC
|
|
41
|
+
// import, so this edge adds no static one (`capabilities/lazy.test.ts`).
|
|
42
|
+
import { withinAnyRoot } from "../setup/operations/setupSkills.js";
|
|
20
43
|
import { installedSkillsDir } from "../skill/discover.js";
|
|
21
44
|
|
|
22
45
|
/** One planned skill symlink into the installed-skills root. */
|
|
23
46
|
export interface SkillLinkAction {
|
|
24
|
-
/**
|
|
47
|
+
/**
|
|
48
|
+
* The symlink target: the package's skill folder for an install, or — on a
|
|
49
|
+
* `pruned` entry — the missing target the stale link still points at, kept so
|
|
50
|
+
* the prune's undo can put the link back exactly as it was.
|
|
51
|
+
*/
|
|
25
52
|
readonly target: string;
|
|
26
53
|
/** `<installedSkillsDir>/<folderName>` — where the symlink is created. */
|
|
27
54
|
readonly linkPath: string;
|
|
28
|
-
/**
|
|
29
|
-
|
|
55
|
+
/**
|
|
56
|
+
* created (absent), skipped (already correct / a real dir), replaced, or
|
|
57
|
+
* pruned (an unplanned link whose target is gone — deleted, not re-created).
|
|
58
|
+
*/
|
|
59
|
+
readonly action: "created" | "skipped" | "replaced" | "pruned";
|
|
30
60
|
/** The skill folder name (the discovery key). */
|
|
31
61
|
readonly folderName: string;
|
|
32
|
-
/**
|
|
33
|
-
|
|
62
|
+
/**
|
|
63
|
+
* The package the skill came from. Absent on a `pruned` entry: a stale link
|
|
64
|
+
* records only a target path, and the package that installed it is precisely
|
|
65
|
+
* the one that no longer provides the skill — there is nothing honest left to
|
|
66
|
+
* attribute it to.
|
|
67
|
+
*/
|
|
68
|
+
readonly packageName?: string;
|
|
34
69
|
}
|
|
35
70
|
|
|
36
71
|
/** What currently occupies a candidate link path. */
|
|
@@ -70,7 +105,11 @@ function packageSkillDirs(root: string): string[] {
|
|
|
70
105
|
for (const name of names) {
|
|
71
106
|
const dir = join(skillsDir, name);
|
|
72
107
|
try {
|
|
73
|
-
|
|
108
|
+
// `stat`, not `lstat`: a package that ships `skills/<name>` as a SYMLINK
|
|
109
|
+
// — the ordinary pnpm / monorepo / `file:` layout — contributed nothing
|
|
110
|
+
// at all, silently, because `lstat` reports the link and not the
|
|
111
|
+
// directory behind it. Discovery uses `stat`; so does this now.
|
|
112
|
+
if (statSync(dir).isDirectory() && existsSync(join(dir, "SKILL.md"))) {
|
|
74
113
|
out.push(dir);
|
|
75
114
|
}
|
|
76
115
|
} catch {
|
|
@@ -80,9 +119,58 @@ function packageSkillDirs(root: string): string[] {
|
|
|
80
119
|
return out;
|
|
81
120
|
}
|
|
82
121
|
|
|
122
|
+
/**
|
|
123
|
+
* Plan the removal of the links a package has since dropped.
|
|
124
|
+
*
|
|
125
|
+
* The install pass walks the packages, so it can only ever visit a skill that
|
|
126
|
+
* still exists; this pass walks the installed root, which is the ONLY place a
|
|
127
|
+
* dropped skill still shows up. An entry is pruned only when both hold: this run
|
|
128
|
+
* did not plan it, and it is a symlink whose target is gone. Both halves matter —
|
|
129
|
+
*
|
|
130
|
+
* - a real (non-symlink) entry is a manually-installed skill, which the install
|
|
131
|
+
* pass already refuses to clobber (`skipped`) and which this pass must refuse
|
|
132
|
+
* just as firmly: "unplanned" is exactly what a hand-placed skill looks like;
|
|
133
|
+
* - a symlink whose target still resolves is someone's own link into a checkout
|
|
134
|
+
* this command knows nothing about. Unplanned does not make it garbage, and an
|
|
135
|
+
* update that silently ate it would be a worse bug than the dangling link.
|
|
136
|
+
*
|
|
137
|
+
* A broken target, by contrast, cannot be anything but debris: nothing can read
|
|
138
|
+
* it, and re-creating it is a matter of re-running the update that installed it
|
|
139
|
+
* (which is also what this prune's undo does).
|
|
140
|
+
*
|
|
141
|
+
* @param dest - The installed-skills root.
|
|
142
|
+
* @param planned - Every folder name the install pass planned, whatever action.
|
|
143
|
+
* @returns One `pruned` action per stale link, for the plan and its preview.
|
|
144
|
+
* @note Impure — reads the installed root and stats each entry's target.
|
|
145
|
+
*/
|
|
146
|
+
function planStaleLinkPrunes(
|
|
147
|
+
dest: string,
|
|
148
|
+
planned: ReadonlySet<string>,
|
|
149
|
+
): SkillLinkAction[] {
|
|
150
|
+
let names: string[];
|
|
151
|
+
try {
|
|
152
|
+
names = readdirSync(dest);
|
|
153
|
+
} catch {
|
|
154
|
+
return []; // No installed root — nothing was ever installed to go stale.
|
|
155
|
+
}
|
|
156
|
+
const out: SkillLinkAction[] = [];
|
|
157
|
+
for (const folderName of names) {
|
|
158
|
+
if (planned.has(folderName)) continue;
|
|
159
|
+
const linkPath = resolve(dest, folderName);
|
|
160
|
+
const state = linkState(linkPath);
|
|
161
|
+
if (state.kind !== "symlink") continue;
|
|
162
|
+
// A relative target is stored relative to the link's OWN directory, which
|
|
163
|
+
// for an entry of the installed root is that root itself.
|
|
164
|
+
if (existsSync(resolve(dest, state.target))) continue;
|
|
165
|
+
out.push({ target: state.target, linkPath, action: "pruned", folderName });
|
|
166
|
+
}
|
|
167
|
+
return out;
|
|
168
|
+
}
|
|
169
|
+
|
|
83
170
|
/**
|
|
84
171
|
* Plan the symlink actions that install each resolved package's `skills/*` into
|
|
85
|
-
* the installed-skills discovery root
|
|
172
|
+
* the installed-skills discovery root, then the removals that retire the links
|
|
173
|
+
* a package has since dropped. First-seen wins on a folder-name clash
|
|
86
174
|
* across packages. A real (non-symlink) entry at the link path is left untouched
|
|
87
175
|
* (`skipped`) so a manually-installed skill is never clobbered.
|
|
88
176
|
*
|
|
@@ -103,10 +191,17 @@ export function planSkillInstall(
|
|
|
103
191
|
seen.add(folderName);
|
|
104
192
|
const linkPath = resolve(dest, folderName);
|
|
105
193
|
const state = linkState(linkPath);
|
|
194
|
+
// Already correct means the link RESOLVES to the skill dir, not that its
|
|
195
|
+
// raw `readlink` string equals an absolute path. A relative link was
|
|
196
|
+
// therefore never "already correct": it was torn down and rebuilt on
|
|
197
|
+
// every single update, and the sibling planner reported it as drift.
|
|
198
|
+
const resolvesToSkill =
|
|
199
|
+
state.kind === "symlink" &&
|
|
200
|
+
resolve(dest, state.target) === resolve(skillDir);
|
|
106
201
|
const action: SkillLinkAction["action"] =
|
|
107
202
|
state.kind === "absent"
|
|
108
203
|
? "created"
|
|
109
|
-
:
|
|
204
|
+
: resolvesToSkill
|
|
110
205
|
? "skipped"
|
|
111
206
|
: state.kind === "symlink"
|
|
112
207
|
? "replaced"
|
|
@@ -120,5 +215,165 @@ export function planSkillInstall(
|
|
|
120
215
|
});
|
|
121
216
|
}
|
|
122
217
|
}
|
|
218
|
+
// `seen` is every folder name this run planned — the `skipped` ones included,
|
|
219
|
+
// so a name a package still provides is never a prune candidate even when the
|
|
220
|
+
// install pass decided to leave its entry alone.
|
|
221
|
+
actions.push(...planStaleLinkPrunes(dest, seen));
|
|
123
222
|
return actions;
|
|
124
223
|
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* One planned link action in a HARNESS skills directory (layer 2).
|
|
227
|
+
*
|
|
228
|
+
* Layer 1 (`<installedSkillsDir>/<name>` → the package's folder) is what
|
|
229
|
+
* {@link planSkillInstall} owns. This is the layer above it: the links inside
|
|
230
|
+
* `~/.claude/skills` and `~/.agents/skills` that point AT layer 1 — a link to a
|
|
231
|
+
* link — and that `setup skills` owns.
|
|
232
|
+
*/
|
|
233
|
+
export interface HarnessLinkAction {
|
|
234
|
+
readonly target: string;
|
|
235
|
+
readonly linkPath: string;
|
|
236
|
+
readonly action: "created" | "replaced" | "pruned";
|
|
237
|
+
readonly folderName: string;
|
|
238
|
+
/** The harness directory's display name, for the progress line. */
|
|
239
|
+
readonly dirName: string;
|
|
240
|
+
/**
|
|
241
|
+
* The target the link ALREADY holds, recorded only for a `replaced` action so
|
|
242
|
+
* its undo can put that link back. Without it the undo could only delete what
|
|
243
|
+
* the forward run created, which restores an ABSENT path — a state that never
|
|
244
|
+
* existed — instead of the link the run overwrote.
|
|
245
|
+
*
|
|
246
|
+
* Stored as `readlink` returned it, not resolved: a relative link is relative
|
|
247
|
+
* to its own directory, which for a candidate of `dir` is `dir` itself, so
|
|
248
|
+
* re-linking the raw value reproduces the link exactly as found.
|
|
249
|
+
*/
|
|
250
|
+
readonly previousTarget?: string;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Plan the CONVERGE-ONLY refresh of the global scope's harness skill links.
|
|
255
|
+
*
|
|
256
|
+
* The reported bug lives here. `sources update` installed and pruned layer 1
|
|
257
|
+
* and stopped, so a new pack skill reached no harness directory until the user
|
|
258
|
+
* separately ran `setup skills`, and a dropped one left its layer-2 link
|
|
259
|
+
* dangling with nothing that would ever clear it. This closes the loop, under
|
|
260
|
+
* two rules that are the entire safety argument:
|
|
261
|
+
*
|
|
262
|
+
* 1. CONVERGE-ONLY. `dirs` are directories that already exist — this function
|
|
263
|
+
* never creates one, and the caller composes no `mkdir`. A `sources update`
|
|
264
|
+
* that materialised `~/.claude/skills` would be litter, and would silently
|
|
265
|
+
* opt the user into linking they never asked for.
|
|
266
|
+
* 2. OWNERSHIP, by the SAME test `setup skills` uses. A path is this command's
|
|
267
|
+
* to touch only when it holds a symlink resolving INSIDE one of the global
|
|
268
|
+
* scope's roots (`withinAnyRoot`, a pure path-SEGMENT test that reads nothing
|
|
269
|
+
* — so it still answers correctly after the layer-1 target is gone, which is
|
|
270
|
+
* exactly the stale case). A real directory is a hand-installed skill; a
|
|
271
|
+
* symlink pointing anywhere else is the user's own; a `<root>-backup/foo`
|
|
272
|
+
* sibling is not "inside" despite sharing a string prefix. None is removed.
|
|
273
|
+
*
|
|
274
|
+
* THE SET, NOT JUST THE INSTALLED ROOT, and that is what keeps precedence
|
|
275
|
+
* true one layer up. A harness link left pointing at the BUNDLED snapshot
|
|
276
|
+
* for a skill this update has just installed for real is owned, so it is
|
|
277
|
+
* `replaced` onto the installed copy. Tested against the installed root
|
|
278
|
+
* alone it read as "someone else's link" and was skipped — and the user who
|
|
279
|
+
* deliberately ran `sources update` would have kept running the shipped copy.
|
|
280
|
+
*
|
|
281
|
+
* The plan is derived from the layer-1 plan rather than from a filesystem
|
|
282
|
+
* re-read, because at planning time the layer-1 writes have not happened yet:
|
|
283
|
+
* `surviving` is the post-update truth, and reading the disk would see the
|
|
284
|
+
* pre-update state. That is also why a surviving name always targets
|
|
285
|
+
* `roots[0]`: layer 1 is about to hold it, whether or not it does now.
|
|
286
|
+
*
|
|
287
|
+
* A RETIRED NAME IS NOT AUTOMATICALLY DEBRIS any more. The fallback roots
|
|
288
|
+
* (today: the bundled snapshot) are NOT written by this update, so their
|
|
289
|
+
* contents ARE readable at plan time — and a skill the packages dropped that
|
|
290
|
+
* the shipped snapshot still carries is still discoverable, still listed by
|
|
291
|
+
* `skill list`, and so still belongs in the harness directory. Such a link is
|
|
292
|
+
* RETARGETED onto the surviving root rather than pruned; only a name no root
|
|
293
|
+
* provides at all is deleted.
|
|
294
|
+
*
|
|
295
|
+
* @param dirs - The EXISTING global link directories.
|
|
296
|
+
* @param roots - The global scope's source roots in PRECEDENCE order.
|
|
297
|
+
* `roots[0]` is the installed root (layer 1) every surviving name targets;
|
|
298
|
+
* the rest are fallbacks a retired name may still resolve in. The whole set
|
|
299
|
+
* is the ownership set.
|
|
300
|
+
* @param surviving - Folder names layer 1 will hold after this update.
|
|
301
|
+
* @param retired - Folder names layer 1 is pruning in this update.
|
|
302
|
+
* @returns The layer-2 actions, for the plan and its effects.
|
|
303
|
+
* @note Impure — lstats each candidate link path, and stats the fallback roots
|
|
304
|
+
* for each retired name.
|
|
305
|
+
*/
|
|
306
|
+
export function planHarnessSkillLinks(
|
|
307
|
+
dirs: readonly { dir: string; name: string }[],
|
|
308
|
+
roots: readonly string[],
|
|
309
|
+
surviving: readonly string[],
|
|
310
|
+
retired: readonly string[],
|
|
311
|
+
): HarnessLinkAction[] {
|
|
312
|
+
const dest = resolve(roots[0] as string);
|
|
313
|
+
/** The first FALLBACK root that still holds `folderName`, if any. */
|
|
314
|
+
const fallback = (folderName: string): string | undefined =>
|
|
315
|
+
roots
|
|
316
|
+
.slice(1)
|
|
317
|
+
.map((root) => resolve(root, folderName))
|
|
318
|
+
.find((candidate) => existsSync(candidate));
|
|
319
|
+
const out: HarnessLinkAction[] = [];
|
|
320
|
+
for (const { dir, name } of dirs) {
|
|
321
|
+
for (const folderName of surviving) {
|
|
322
|
+
const linkPath = resolve(dir, folderName);
|
|
323
|
+
const target = resolve(dest, folderName);
|
|
324
|
+
const state = linkState(linkPath);
|
|
325
|
+
if (state.kind === "other") continue; // A hand-placed entry — never ours.
|
|
326
|
+
if (state.kind === "absent") {
|
|
327
|
+
out.push({
|
|
328
|
+
target,
|
|
329
|
+
linkPath,
|
|
330
|
+
action: "created",
|
|
331
|
+
folderName,
|
|
332
|
+
dirName: name,
|
|
333
|
+
});
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
if (resolve(dir, state.target) === target) continue; // Already correct.
|
|
337
|
+
// A symlink pointing outside every scope root is the user's own link into
|
|
338
|
+
// their own checkout. Unplanned does not make it ours to replace.
|
|
339
|
+
if (!withinAnyRoot(roots, linkPath, state.target)) continue;
|
|
340
|
+
out.push({
|
|
341
|
+
target,
|
|
342
|
+
linkPath,
|
|
343
|
+
action: "replaced",
|
|
344
|
+
folderName,
|
|
345
|
+
dirName: name,
|
|
346
|
+
previousTarget: state.target,
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
for (const folderName of retired) {
|
|
350
|
+
const linkPath = resolve(dir, folderName);
|
|
351
|
+
const state = linkState(linkPath);
|
|
352
|
+
if (state.kind !== "symlink") continue;
|
|
353
|
+
if (!withinAnyRoot(roots, linkPath, state.target)) continue;
|
|
354
|
+
const surviving = fallback(folderName);
|
|
355
|
+
if (surviving !== undefined) {
|
|
356
|
+
// Dropped upstream, still shipped: retarget rather than delete. Already
|
|
357
|
+
// correct is nothing to do.
|
|
358
|
+
if (resolve(dir, state.target) === surviving) continue;
|
|
359
|
+
out.push({
|
|
360
|
+
target: surviving,
|
|
361
|
+
linkPath,
|
|
362
|
+
action: "replaced",
|
|
363
|
+
folderName,
|
|
364
|
+
dirName: name,
|
|
365
|
+
previousTarget: state.target,
|
|
366
|
+
});
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
out.push({
|
|
370
|
+
target: resolve(dir, state.target),
|
|
371
|
+
linkPath,
|
|
372
|
+
action: "pruned",
|
|
373
|
+
folderName,
|
|
374
|
+
dirName: name,
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return out;
|
|
379
|
+
}
|
|
@@ -31,24 +31,30 @@ import {
|
|
|
31
31
|
writeFile,
|
|
32
32
|
} from "@canonical/task";
|
|
33
33
|
import { VERSION } from "../../constants.js";
|
|
34
|
-
import { PragmaError } from "../../kernel/error/
|
|
35
|
-
|
|
34
|
+
import { cliRecovery, PragmaError } from "../../kernel/error/index.js";
|
|
35
|
+
// DIRECT LEAF IMPORT, not `graphpack/index.js`. The barrel re-exports
|
|
36
|
+
// `embedded.ts`, which statically imports the ~1.9 MB generated pack — and
|
|
37
|
+
// with per-file `tsc` output ESM evaluates that re-export when this module
|
|
38
|
+
// loads. `sources update` builds a USER pack; it must not pay the embedded
|
|
39
|
+
// pack's cost to do it.
|
|
36
40
|
import { buildPack } from "../../kernel/runtime/graphpack/build.js";
|
|
41
|
+
import type { PragmaRuntime } from "../../kernel/runtime/index.js";
|
|
37
42
|
import { activePackPath, readActivePack } from "../../kernel/runtime/paths.js";
|
|
38
|
-
import type { PackageRef } from "../../kernel/runtime/refs/
|
|
39
|
-
import {
|
|
40
|
-
parsePackDeclaration,
|
|
41
|
-
redactUrl,
|
|
42
|
-
} from "../../kernel/runtime/refs/parseRef.js";
|
|
43
|
+
import type { PackageRef } from "../../kernel/runtime/refs/index.js";
|
|
43
44
|
import {
|
|
44
45
|
detectPrefixClashes,
|
|
45
46
|
harvestPrefixes,
|
|
47
|
+
parsePackDeclaration,
|
|
46
48
|
type ResolvedPackage,
|
|
49
|
+
redactUrl,
|
|
47
50
|
resolvePackage,
|
|
48
|
-
} from "../../kernel/runtime/refs/
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
} from "../../kernel/runtime/refs/index.js";
|
|
52
|
+
// The global scope's EXISTING link directories, from the module that owns the
|
|
53
|
+
// scope covenant — so `sources update` cannot drift away from what
|
|
54
|
+
// `setup skills --global` links, or widen the scope on its own.
|
|
55
|
+
import { existingGlobalSkillDirs } from "../setup/operations/setupSkills.js";
|
|
56
|
+
import { globalSkillRoots, installedSkillsDir } from "../skill/discover.js";
|
|
57
|
+
import { planHarnessSkillLinks, planSkillInstall } from "./installSkills.js";
|
|
52
58
|
import type { SourcesUpdateData } from "./types.js";
|
|
53
59
|
|
|
54
60
|
/** Generic-core prefixes; config `prefixes` merge over them (config wins). */
|
|
@@ -209,17 +215,17 @@ export async function buildUpdateTask(
|
|
|
209
215
|
// prefix. Display-only, so a warning (not a hard failure) is the right call.
|
|
210
216
|
for (const clash of detectPrefixClashes(inputs)) {
|
|
211
217
|
report?.(
|
|
212
|
-
`Prefix "${clash.label}:" is declared with conflicting IRIs across
|
|
218
|
+
`Prefix "${clash.label}:" is declared with conflicting IRIs across packs (${clash.iris.join(" vs ")}); last wins, so some entities may compact to the wrong prefix.`,
|
|
213
219
|
);
|
|
214
220
|
}
|
|
215
221
|
|
|
216
222
|
report?.(`Building store from ${inputs.length} source(s)`);
|
|
217
223
|
if (verbose) for (const input of inputs) report?.(` parse ${input.path}`);
|
|
218
224
|
if (stories.length > 0)
|
|
219
|
-
report?.(`Carrying ${stories.length}
|
|
225
|
+
report?.(`Carrying ${stories.length} pack read story file(s)`);
|
|
220
226
|
|
|
221
227
|
// Build the pack. On a parse/build failure, classify it as a NAMED data error
|
|
222
|
-
// (U6) — not INTERNAL_ERROR's "
|
|
228
|
+
// (U6) — not INTERNAL_ERROR's "report this issue" — identifying the
|
|
223
229
|
// offending package source, since ke's parser error carries only line/column.
|
|
224
230
|
// With `--skip-invalid`, drop the unparseable sources (warning LOUDLY about
|
|
225
231
|
// each — never a silent partial graph) and build from the rest instead of
|
|
@@ -262,7 +268,7 @@ export async function buildUpdateTask(
|
|
|
262
268
|
);
|
|
263
269
|
if (usableInputs.length === 0)
|
|
264
270
|
throw PragmaError.configError(
|
|
265
|
-
`
|
|
271
|
+
`None of the ${inputs.length} configured source(s) can be parsed — nothing to build.`,
|
|
266
272
|
{
|
|
267
273
|
recovery: cliRecovery(
|
|
268
274
|
"sources update --verbose",
|
|
@@ -299,7 +305,7 @@ export async function buildUpdateTask(
|
|
|
299
305
|
{
|
|
300
306
|
recovery: cliRecovery(
|
|
301
307
|
"sources update --verbose",
|
|
302
|
-
"Check that the
|
|
308
|
+
"Check that the pack sources actually contain RDF triples, then re-run.",
|
|
303
309
|
),
|
|
304
310
|
},
|
|
305
311
|
);
|
|
@@ -322,13 +328,63 @@ export async function buildUpdateTask(
|
|
|
322
328
|
|
|
323
329
|
// Install package-provided skills (U10): symlink each resolved package's
|
|
324
330
|
// `skills/*` into the installed-skills root, so `skill list` / `setup skills`
|
|
325
|
-
// see them after an update
|
|
326
|
-
//
|
|
327
|
-
|
|
328
|
-
|
|
331
|
+
// see them after an update — and RETIRE the links of skills those packages
|
|
332
|
+
// have since dropped, which the same plan reports as `pruned`. Kept in this
|
|
333
|
+
// Task (reversible: a created link carries an unlink undo, a pruned one a
|
|
334
|
+
// re-link undo) so `sources update --undo` restores the root as it was.
|
|
335
|
+
//
|
|
336
|
+
// The two are split, not counted together: a prune is a deletion, so folding
|
|
337
|
+
// it into "Installing N skill(s)" would report a removal as an install.
|
|
338
|
+
const skillPlan = planSkillInstall(resolved);
|
|
339
|
+
const skillLinks = skillPlan.filter(
|
|
340
|
+
(link) => link.action === "created" || link.action === "replaced",
|
|
329
341
|
);
|
|
342
|
+
const staleLinks = skillPlan.filter((link) => link.action === "pruned");
|
|
330
343
|
if (skillLinks.length > 0)
|
|
331
344
|
report?.(`Installing ${skillLinks.length} skill(s)`);
|
|
345
|
+
if (staleLinks.length > 0)
|
|
346
|
+
report?.(
|
|
347
|
+
`Removing ${staleLinks.length} skill link(s) no longer provided by any package`,
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
// Converge the GLOBAL scope (layer 2). Layer 1 above is the installed root;
|
|
351
|
+
// the harness directories link AT it, and until now nothing here touched
|
|
352
|
+
// them — a new pack skill reached no harness directory until the user
|
|
353
|
+
// separately ran `setup skills`, and a dropped one left a dangling link that
|
|
354
|
+
// nothing would ever clear. That two-step was the reported bug.
|
|
355
|
+
//
|
|
356
|
+
// CONVERGE-ONLY, and this is a policy line, not an optimisation:
|
|
357
|
+
// `existingGlobalSkillDirs` returns only directories that ALREADY EXIST, and
|
|
358
|
+
// nothing below composes a `mkdir`. `sources update` is `mcp: {expose:true}`
|
|
359
|
+
// with `mutates: true` and `needsNetwork: true`, so creating directories here
|
|
360
|
+
// would mean an agent, over MCP, after a network fetch, conjuring
|
|
361
|
+
// `~/.claude/skills` into being and opting the user into linking they never
|
|
362
|
+
// asked for. Refresh what is there; never bring a directory into existence.
|
|
363
|
+
//
|
|
364
|
+
// Ownership is the SAME `withinAnyRoot` test `setup skills` applies, over the
|
|
365
|
+
// SAME root set (`globalSkillRoots`), so a real directory, a still-resolving
|
|
366
|
+
// link into the user's own checkout, and a `<root>-backup/foo` sibling are all
|
|
367
|
+
// left exactly as found — while a link still pointing at the BUNDLED snapshot
|
|
368
|
+
// for a skill this update just installed is ours, and is moved onto it.
|
|
369
|
+
const harnessPlan = planHarnessSkillLinks(
|
|
370
|
+
await existingGlobalSkillDirs(runtime.cwd),
|
|
371
|
+
globalSkillRoots(),
|
|
372
|
+
skillPlan
|
|
373
|
+
.filter((link) => link.action !== "pruned")
|
|
374
|
+
.map((link) => link.folderName),
|
|
375
|
+
staleLinks.map((link) => link.folderName),
|
|
376
|
+
);
|
|
377
|
+
const harnessLinks = harnessPlan.filter((link) => link.action !== "pruned");
|
|
378
|
+
const harnessStale = harnessPlan.filter((link) => link.action === "pruned");
|
|
379
|
+
if (harnessLinks.length > 0)
|
|
380
|
+
report?.(
|
|
381
|
+
`Linking ${harnessLinks.length} skill(s) into your harness folders`,
|
|
382
|
+
);
|
|
383
|
+
if (harnessStale.length > 0)
|
|
384
|
+
report?.(`Removing ${harnessStale.length} stale harness skill link(s)`);
|
|
385
|
+
if (verbose)
|
|
386
|
+
for (const link of harnessPlan)
|
|
387
|
+
report?.(` ${link.action} ${link.folderName} in ${link.dirName}`);
|
|
332
388
|
|
|
333
389
|
report?.(`Pointing ${runtime.cwd} at pack ${built.contentHash.slice(0, 12)}`);
|
|
334
390
|
return gen(function* () {
|
|
@@ -344,6 +400,58 @@ export async function buildUpdateTask(
|
|
|
344
400
|
);
|
|
345
401
|
}
|
|
346
402
|
}
|
|
403
|
+
// No `mkdir` guard here: a stale link can only have been enumerated FROM
|
|
404
|
+
// the installed root, so the root necessarily exists.
|
|
405
|
+
//
|
|
406
|
+
// The undo re-creates the link exactly as found — dangling target and all —
|
|
407
|
+
// because undo's job is to restore the prior state, not to improve on it. It
|
|
408
|
+
// clears the path first because the undo interpreter MOCKS forward effects
|
|
409
|
+
// when collecting: the delete above may never have run, and `fs.symlink`
|
|
410
|
+
// refuses a path that already exists. Same delete-then-link shape the
|
|
411
|
+
// `replaced` branch above uses, for the same reason.
|
|
412
|
+
for (const stale of staleLinks) {
|
|
413
|
+
yield* $(
|
|
414
|
+
deleteFile(stale.linkPath, {
|
|
415
|
+
undo: gen(function* () {
|
|
416
|
+
yield* $(deleteFile(stale.linkPath));
|
|
417
|
+
yield* $(symlink(stale.target, stale.linkPath));
|
|
418
|
+
}),
|
|
419
|
+
}),
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
// Layer 2, in the same Task and so under the same `--undo`. Still no
|
|
423
|
+
// `mkdir`: every directory here was proven to exist at plan time, and
|
|
424
|
+
// creating one is the thing converge-only exists to forbid.
|
|
425
|
+
for (const link of harnessLinks) {
|
|
426
|
+
// A `created` link undoes by deletion — absent IS the state it replaced.
|
|
427
|
+
// A `replaced` one does not: the path held a link, and the delete above
|
|
428
|
+
// carries no undo of its own, so deleting what the symlink created would
|
|
429
|
+
// leave the path ABSENT rather than pointing where it pointed before.
|
|
430
|
+
// Its undo is therefore the same delete-then-relink shape the prunes
|
|
431
|
+
// below use, against the target detection recorded — and it clears the
|
|
432
|
+
// path first because undo collection MOCKS forward effects, so the link
|
|
433
|
+
// may still be there and `fs.symlink` refuses an existing path.
|
|
434
|
+
const previous = link.previousTarget;
|
|
435
|
+
const undoLink =
|
|
436
|
+
link.action === "replaced" && previous !== undefined
|
|
437
|
+
? gen(function* () {
|
|
438
|
+
yield* $(deleteFile(link.linkPath));
|
|
439
|
+
yield* $(symlink(previous, link.linkPath));
|
|
440
|
+
})
|
|
441
|
+
: deleteFile(link.linkPath);
|
|
442
|
+
if (link.action === "replaced") yield* $(deleteFile(link.linkPath));
|
|
443
|
+
yield* $(symlink(link.target, link.linkPath, { undo: undoLink }));
|
|
444
|
+
}
|
|
445
|
+
for (const stale of harnessStale) {
|
|
446
|
+
yield* $(
|
|
447
|
+
deleteFile(stale.linkPath, {
|
|
448
|
+
undo: gen(function* () {
|
|
449
|
+
yield* $(deleteFile(stale.linkPath));
|
|
450
|
+
yield* $(symlink(stale.target, stale.linkPath));
|
|
451
|
+
}),
|
|
452
|
+
}),
|
|
453
|
+
);
|
|
454
|
+
}
|
|
347
455
|
return data;
|
|
348
456
|
});
|
|
349
457
|
}
|
|
@@ -385,12 +493,12 @@ export async function classifySourceBuildError(
|
|
|
385
493
|
const culprit = await isolateBadSource(inputs);
|
|
386
494
|
const detail = culprit?.message ?? parserMessage;
|
|
387
495
|
const where = culprit
|
|
388
|
-
? `
|
|
389
|
-
: "The configured
|
|
496
|
+
? `Pack source "${culprit.path}" cannot be parsed`
|
|
497
|
+
: "The configured packs cannot be built into a store";
|
|
390
498
|
return PragmaError.configError(`${where}: ${detail}`, {
|
|
391
499
|
recovery: cliRecovery(
|
|
392
500
|
"sources update --verbose",
|
|
393
|
-
"Re-run with --verbose to see each file as it parses. If a
|
|
501
|
+
"Re-run with --verbose to see each file as it parses. If a pack ships malformed RDF, report it to that pack's maintainer.",
|
|
394
502
|
),
|
|
395
503
|
});
|
|
396
504
|
}
|