@canonical/pragma-cli 0.33.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 +25 -24
- package/pragma.conf.ts +853 -0
- package/src/bin.ts +276 -82
- package/src/capabilities/block.parity.test.ts +253 -0
- package/src/capabilities/capabilities/capabilities.render.ts +4 -3
- package/src/capabilities/capabilities/capabilities.verb.ts +32 -14
- package/src/capabilities/capabilities/catalog.ts +20 -12
- package/src/capabilities/capabilities/hints.ts +43 -24
- package/src/capabilities/capabilities/index.ts +1 -1
- package/src/capabilities/colophon/collectColophon.ts +50 -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 +9 -5
- package/src/capabilities/colophon/types.ts +16 -7
- package/src/capabilities/config/collectConfigShow.test.ts +58 -0
- package/src/capabilities/config/collectConfigShow.ts +43 -6
- package/src/capabilities/config/field.render.ts +4 -5
- package/src/capabilities/config/fields.ts +17 -37
- 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 +14 -9
- package/src/capabilities/config/show.render.test.ts +77 -5
- package/src/capabilities/config/show.render.ts +8 -13
- package/src/capabilities/config/show.verb.ts +13 -9
- package/src/capabilities/config/types.ts +26 -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 +95 -103
- package/src/capabilities/create/cliProjection.ts +227 -0
- package/src/capabilities/create/constants.ts +50 -0
- package/src/capabilities/create/create.mcp.test.ts +91 -7
- package/src/capabilities/create/create.render.ts +71 -7
- package/src/capabilities/create/create.test.ts +523 -162
- package/src/capabilities/create/create.verb.ts +361 -321
- 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 +9 -14
- 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 +40 -46
- package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
- package/src/capabilities/create/types.ts +29 -5
- package/src/capabilities/{standard/parity.test.ts → distribution.parity.test.ts} +24 -14
- package/src/capabilities/distribution.test.ts +122 -0
- package/src/capabilities/distribution.ts +54 -0
- package/src/capabilities/doctor/checks/checkKeStore.ts +9 -7
- package/src/capabilities/doctor/checks/checkPackageRefs.ts +82 -46
- package/src/capabilities/doctor/checks/checkPragmaVersion.ts +5 -4
- package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +125 -30
- package/src/capabilities/doctor/checks/checkShellCompletions.ts +113 -27
- 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 +24 -13
- package/src/capabilities/doctor/doctor.render.ts +45 -20
- package/src/capabilities/doctor/doctor.test.ts +158 -40
- package/src/capabilities/doctor/doctor.verb.ts +9 -5
- package/src/capabilities/doctor/runChecks.ts +65 -66
- package/src/capabilities/doctor/types.ts +21 -5
- package/src/capabilities/emptyRecovery.test.ts +44 -22
- 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 -5
- package/src/capabilities/graph/query.render.ts +15 -3
- package/src/capabilities/graph/query.verb.ts +5 -4
- package/src/capabilities/graph/runQuery.ts +9 -7
- package/src/capabilities/index.ts +25 -19
- package/src/capabilities/info/collectInfo.ts +15 -10
- package/src/capabilities/info/info.render.ts +4 -3
- package/src/capabilities/info/info.verb.ts +4 -3
- package/src/capabilities/lazy.test.ts +125 -2
- 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 +42 -83
- package/src/capabilities/prompt/index.ts +2 -2
- package/src/capabilities/prompt/prompt.render.ts +6 -2
- package/src/capabilities/prompt/prompt.test.ts +12 -6
- package/src/capabilities/prompt/types.ts +1 -1
- package/src/capabilities/prompt/verbs.ts +26 -14
- package/src/capabilities/reference.test.ts +63 -0
- package/src/capabilities/resources/provider.ts +367 -91
- package/src/capabilities/resources/resources.test.ts +411 -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 +397 -320
- 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 +233 -74
- package/src/capabilities/setup/shell.test.ts +86 -0
- package/src/capabilities/setup/shell.ts +166 -14
- 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 +47 -9
- package/src/capabilities/skill/index.ts +1 -1
- package/src/capabilities/skill/render.ts +14 -14
- package/src/capabilities/skill/skill.test.ts +7 -5
- package/src/capabilities/skill/verbs.ts +9 -10
- package/src/capabilities/sources/collectStatus.ts +61 -51
- package/src/capabilities/sources/index.ts +2 -2
- package/src/capabilities/sources/installSkills.ts +86 -9
- package/src/capabilities/sources/runUpdate.ts +164 -141
- package/src/capabilities/sources/sources.test.ts +265 -119
- package/src/capabilities/sources/status.render.test.ts +53 -24
- package/src/capabilities/sources/status.render.ts +25 -30
- package/src/capabilities/sources/status.verb.ts +16 -9
- package/src/capabilities/sources/types.ts +18 -25
- package/src/capabilities/sources/update.render.ts +10 -3
- package/src/capabilities/sources/update.verb.ts +13 -24
- package/src/capabilities/surface.test.ts +165 -25
- package/src/capabilities/tier.parity.test.ts +144 -0
- 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 +8 -4
- 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.test.ts +8 -6
- package/src/constants.ts +78 -22
- package/src/identity.test.ts +348 -0
- package/src/index.ts +2 -2
- package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +20 -15
- package/src/kernel/completion/complete.test.ts +12 -2
- package/src/kernel/completion/complete.ts +1 -1
- package/src/kernel/completion/emitScripts.test.ts +1 -1
- package/src/kernel/completion/emitScripts.ts +5 -3
- package/src/kernel/completion/entitySource.test.ts +185 -41
- package/src/kernel/completion/entitySource.ts +133 -110
- package/src/kernel/completion/model.test.ts +165 -13
- package/src/kernel/completion/model.ts +105 -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 +104 -50
- package/src/kernel/completion/shellDrive.test.ts +611 -0
- package/src/kernel/completion/templates/bash.ts +7 -2
- package/src/kernel/completion/templates/fish.ts +28 -6
- package/src/kernel/completion/templates/index.ts +23 -0
- package/src/kernel/completion/types.ts +10 -3
- package/src/kernel/config/defaults.test.ts +108 -0
- package/src/kernel/config/defaults.ts +13 -23
- package/src/kernel/config/evaluateProjectConfig.ts +33 -11
- package/src/kernel/config/findProjectConfig.ts +4 -3
- package/src/kernel/config/firstRun.test.ts +44 -38
- package/src/kernel/config/firstRun.ts +24 -81
- package/src/kernel/config/globalConfig.ts +2 -2
- package/src/kernel/config/index.ts +5 -6
- package/src/kernel/config/paths.ts +17 -17
- package/src/kernel/config/readConfig.test.ts +246 -7
- package/src/kernel/config/readConfig.ts +8 -8
- package/src/kernel/config/schema.test.ts +50 -0
- package/src/kernel/config/schema.ts +100 -11
- package/src/kernel/config/types.ts +75 -19
- package/src/kernel/copy.test.ts +483 -0
- package/src/kernel/copy.ts +54 -0
- package/src/kernel/error/PragmaError.test.ts +6 -3
- package/src/kernel/error/PragmaError.ts +4 -2
- package/src/kernel/error/constants.ts +7 -4
- package/src/kernel/error/fromTaskError.ts +28 -6
- package/src/kernel/error/index.ts +1 -1
- package/src/kernel/error/recovery.test.ts +22 -45
- package/src/kernel/error/recovery.ts +36 -27
- package/src/kernel/error/renderError.ts +42 -1
- package/src/kernel/error/types.ts +25 -4
- package/src/kernel/index.ts +26 -0
- package/src/kernel/packs/collect.test.ts +195 -11
- package/src/kernel/packs/collect.ts +212 -61
- package/src/kernel/packs/compile.test.ts +293 -8
- package/src/kernel/packs/compile.ts +108 -15
- package/src/kernel/packs/disclosure.test.ts +5 -2
- package/src/kernel/packs/disclosure.ts +2 -2
- package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
- package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +13 -13
- package/src/kernel/packs/graphql/index.ts +20 -0
- package/src/kernel/packs/graphqlSource.test.ts +6 -3
- package/src/kernel/packs/index.ts +40 -0
- package/src/kernel/packs/iri.test.ts +73 -0
- package/src/kernel/packs/iri.ts +70 -20
- package/src/kernel/packs/renderPack.ts +28 -7
- package/src/kernel/packs/resolveEntity.test.ts +213 -0
- package/src/kernel/packs/resolveEntity.ts +132 -34
- package/src/kernel/packs/runBodies.ts +16 -16
- package/src/kernel/packs/sample.ts +1 -1
- package/src/kernel/packs/schema.ts +114 -11
- 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 +104 -10
- package/src/kernel/packs/sparql/runSelect.ts +75 -37
- package/src/kernel/packs/toolDescription.test.ts +52 -5
- package/src/kernel/packs/types.ts +52 -4
- package/src/kernel/packs/uniqueness.ts +5 -5
- package/src/kernel/project/cli/buildProgram.test.ts +157 -17
- 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 +227 -3
- package/src/kernel/project/cli/dispatch.ts +250 -48
- 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 +14 -1
- package/src/kernel/project/cli/rootHelp.ts +140 -111
- 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 +18 -10
- package/src/kernel/project/mcp/envelope.ts +2 -2
- package/src/kernel/project/mcp/instructions.ts +12 -7
- package/src/kernel/project/mcp/mcpError.ts +1 -1
- package/src/kernel/project/mcp/parity.test.ts +42 -1
- package/src/kernel/project/mcp/prompts/index.ts +37 -0
- package/src/kernel/project/mcp/prompts/prompts.test.ts +120 -5
- package/src/kernel/project/mcp/prompts/provider.ts +22 -8
- package/src/kernel/project/mcp/prompts/source.ts +69 -68
- package/src/kernel/project/mcp/registerVerb.ts +56 -11
- package/src/kernel/project/mcp/serve.ts +13 -5
- package/src/kernel/project/mcp/toolDescriptions.test.ts +6 -2
- package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
- package/src/kernel/render/contracts.ts +21 -0
- package/src/kernel/render/disclosure.ts +4 -2
- package/src/kernel/render/envelope.ts +2 -3
- package/src/kernel/render/formatters.ts +1 -1
- package/src/kernel/render/prefixes.test.ts +36 -0
- package/src/kernel/render/prefixes.ts +40 -13
- package/src/kernel/render/renderers.test.ts +244 -7
- 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/build.ts +29 -3
- package/src/kernel/runtime/graphpack/buildIndex.test.ts +46 -0
- package/src/kernel/runtime/graphpack/buildIndex.ts +53 -18
- package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +5 -5
- package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +3 -3
- package/src/kernel/runtime/graphpack/embedded/pack.stories.generated.ts +3 -0
- package/src/kernel/runtime/graphpack/embedded.ts +39 -13
- package/src/kernel/runtime/graphpack/graphpack.test.ts +205 -5
- package/src/kernel/runtime/graphpack/hash.ts +3 -2
- package/src/kernel/runtime/graphpack/index.ts +1 -1
- package/src/kernel/runtime/graphpack/manifest.ts +114 -12
- package/src/kernel/runtime/graphpack/read.ts +5 -11
- package/src/kernel/runtime/graphpack/schemas.ts +74 -0
- package/src/kernel/runtime/graphpack/stories.ts +84 -0
- package/src/kernel/runtime/graphpack/types.ts +61 -48
- package/src/kernel/runtime/loadSession.ts +1 -1
- package/src/kernel/runtime/paths.ts +64 -15
- package/src/kernel/runtime/probe.test.ts +8 -4
- package/src/kernel/runtime/probe.ts +6 -6
- package/src/kernel/runtime/readEntity.ts +477 -32
- package/src/kernel/runtime/refs/gitOps.ts +1 -19
- package/src/kernel/runtime/refs/index.ts +39 -0
- package/src/kernel/runtime/refs/parseRef.ts +8 -8
- package/src/kernel/runtime/refs/resolve.ts +82 -66
- package/src/kernel/runtime/resolveSources.test.ts +63 -24
- package/src/kernel/runtime/resolveSources.ts +36 -25
- package/src/kernel/runtime/storeReadiness.ts +10 -10
- package/src/kernel/runtime/storeless.test.ts +1 -1
- package/src/kernel/runtime/types.ts +15 -1
- package/src/kernel/runtime/wasmEmbed.test.ts +56 -55
- package/src/kernel/spec/emitReference.test.ts +3 -3
- package/src/kernel/spec/emitReference.ts +242 -34
- package/src/kernel/spec/emitSurface.ts +57 -11
- package/src/kernel/spec/surfaceConformance.test.ts +4 -2
- package/src/kernel/spec/surfaceConformance.ts +8 -0
- package/src/kernel/spec/types.ts +277 -13
- package/src/kernel/spec/validate.ts +2 -1
- package/src/kernel/vocabulary.test.ts +164 -0
- package/src/kernel/vocabulary.ts +146 -0
- package/src/testing/PARITY_GAPS.ts +8 -2
- package/src/testing/behavioral/README.md +3 -3
- package/src/testing/behavioral/completion.test.ts +19 -6
- package/src/testing/behavioral/docExamples.test.ts +14 -0
- package/src/testing/behavioral/errorMatrix.mcp.test.ts +6 -5
- package/src/testing/behavioral/errorMatrix.storeless.test.ts +1 -1
- package/src/testing/behavioral/exitCodes.e2e.test.ts +6 -5
- package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
- package/src/testing/behavioral/harness.foundation.test.ts +14 -5
- package/src/testing/behavioral/journeys.cli.test.ts +117 -76
- package/src/testing/behavioral/journeys.defaultPack.test.ts +88 -182
- package/src/testing/behavioral/journeys.firstInstall.test.ts +167 -0
- 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.mcpLifecycle.mcp.test.ts +9 -6
- package/src/testing/behavioral/journeys.packageStories.test.ts +188 -0
- package/src/testing/behavioral/liveReadSurface.ts +4 -3
- package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
- package/src/testing/behavioral/mcpSurface.test.ts +10 -5
- package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
- package/src/testing/behavioral/staleCommands.test.ts +10 -0
- package/src/testing/eval/__snapshots__/eval.test.ts.snap +7 -7
- package/src/testing/eval/cases/assembly.ts +13 -6
- package/src/testing/eval/cases/effectful.ts +28 -15
- package/src/testing/eval/cases/readNouns.ts +22 -20
- package/src/testing/eval/cases/stable.ts +5 -1
- package/src/testing/eval/eval.test.ts +7 -1
- package/src/testing/fixtures/blockGraph.ts +79 -0
- package/src/testing/fixtures/fixtureCapability.ts +45 -1
- package/src/testing/fixtures/graph/canonical.ts +94 -5
- package/src/testing/fixtures/graph/defaultPack.ts +7 -6
- package/src/testing/fixtures/graph/owlExport.ts +7 -5
- package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
- package/src/testing/helpers/fixtureGraph.ts +33 -16
- package/src/testing/helpers/packRuntime.ts +2 -3
- package/src/testing/helpers/projectCli.ts +2 -1
- package/src/testing/helpers/projectMcp.ts +38 -6
- package/src/testing/helpers/runCli.ts +35 -18
- package/src/testing/perf/budgets.test.ts +24 -9
- package/src/testing/perf/budgets.ts +76 -12
- package/src/testing/perf/codegen.test.ts +126 -0
- package/src/testing/perf/globalSetup.test.ts +286 -0
- package/src/testing/perf/globalSetup.ts +611 -14
- 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/src/types.ts +2 -2
- package/dist/pragma +0 -0
- package/src/capabilities/block/blockList.test.ts +0 -79
- package/src/capabilities/block/blockList.verb.ts +0 -163
- package/src/capabilities/block/index.ts +0 -25
- package/src/capabilities/block/pack.ts +0 -166
- package/src/capabilities/block/parity.test.ts +0 -187
- package/src/capabilities/block/tierChain.ts +0 -78
- package/src/capabilities/colophon/pragmaColophon.ts +0 -66
- package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -152
- package/src/capabilities/create/templates.embedded.generated.ts +0 -53
- package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -41
- package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
- package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -67
- package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -60
- package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
- package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
- package/src/capabilities/modifier/index.ts +0 -15
- package/src/capabilities/modifier/pack.ts +0 -64
- package/src/capabilities/standard/index.ts +0 -18
- package/src/capabilities/standard/pack.ts +0 -128
- package/src/capabilities/tier/index.ts +0 -19
- package/src/capabilities/tier/lookup.render.test.ts +0 -72
- package/src/capabilities/tier/lookup.render.ts +0 -59
- package/src/capabilities/tier/lookup.test.ts +0 -83
- package/src/capabilities/tier/lookup.verb.ts +0 -44
- package/src/capabilities/tier/pack.ts +0 -28
- package/src/capabilities/tier/runLookup.ts +0 -87
- package/src/capabilities/token/addConfig.render.ts +0 -27
- package/src/capabilities/token/addConfig.test.ts +0 -62
- package/src/capabilities/token/addConfig.verb.ts +0 -40
- package/src/capabilities/token/index.ts +0 -19
- package/src/capabilities/token/pack.ts +0 -58
- package/src/capabilities/token/runAddConfig.ts +0 -95
- package/src/kernel/completion/bashDrive.test.ts +0 -73
- package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
- package/src/kernel/runtime/graphpack/embedded/sample.ttl +0 -39
- package/src/kernel/runtime/lock.ts +0 -90
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { execFileSync } from "node:child_process";
|
|
2
2
|
import {
|
|
3
3
|
existsSync,
|
|
4
|
+
lstatSync,
|
|
4
5
|
mkdirSync,
|
|
5
6
|
mkdtempSync,
|
|
7
|
+
readdirSync,
|
|
6
8
|
readFileSync,
|
|
9
|
+
readlinkSync,
|
|
7
10
|
rmSync,
|
|
8
11
|
symlinkSync,
|
|
9
12
|
writeFileSync,
|
|
@@ -14,13 +17,20 @@ import { join } from "node:path";
|
|
|
14
17
|
import { runTask } from "@canonical/task/node";
|
|
15
18
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
16
19
|
import { VERSION } from "../../constants.js";
|
|
17
|
-
import type {
|
|
20
|
+
import type {
|
|
21
|
+
ConfigLayers,
|
|
22
|
+
PackDeclaration,
|
|
23
|
+
} from "../../kernel/config/types.js";
|
|
18
24
|
import { PragmaError } from "../../kernel/error/PragmaError.js";
|
|
19
25
|
import { executeVerb } from "../../kernel/project/cli/dispatch.js";
|
|
20
26
|
import { bootRuntime } from "../../kernel/runtime/boot.js";
|
|
21
27
|
import { createQueryFacade } from "../../kernel/runtime/facade.js";
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
28
|
+
import { readManifest } from "../../kernel/runtime/graphpack/manifest.js";
|
|
29
|
+
import {
|
|
30
|
+
activePackPath,
|
|
31
|
+
packDir,
|
|
32
|
+
readActivePack,
|
|
33
|
+
} from "../../kernel/runtime/paths.js";
|
|
24
34
|
import {
|
|
25
35
|
detectPrefixClashes,
|
|
26
36
|
resolvePackageJson,
|
|
@@ -58,18 +68,17 @@ const tmp = (prefix: string): string => {
|
|
|
58
68
|
return dir;
|
|
59
69
|
};
|
|
60
70
|
|
|
61
|
-
/** A runtime whose config is the given
|
|
62
|
-
function runtimeFor(cwd: string,
|
|
71
|
+
/** A runtime whose config is the given pack list (no config files needed). */
|
|
72
|
+
function runtimeFor(cwd: string, packs: PackDeclaration[]): PragmaRuntime {
|
|
63
73
|
const layers: ConfigLayers = {
|
|
64
|
-
config: { channel: "normal",
|
|
74
|
+
config: { channel: "normal", packs },
|
|
65
75
|
origins: {
|
|
66
76
|
tier: "default",
|
|
67
77
|
channel: "default",
|
|
68
78
|
detail: "default",
|
|
69
|
-
|
|
79
|
+
packs: "project",
|
|
70
80
|
stories: "default",
|
|
71
81
|
prefixes: "default",
|
|
72
|
-
prompts: "default",
|
|
73
82
|
},
|
|
74
83
|
global: { path: "/nonexistent", exists: false },
|
|
75
84
|
project: { exists: false },
|
|
@@ -101,30 +110,24 @@ function filePackage(): string {
|
|
|
101
110
|
return pkg;
|
|
102
111
|
}
|
|
103
112
|
|
|
104
|
-
describe("sources
|
|
105
|
-
it("file source: builds
|
|
113
|
+
describe("sources update round-trip (PROTECTED)", () => {
|
|
114
|
+
it("file source: builds and points the project at the built pack", async () => {
|
|
106
115
|
const pkg = filePackage();
|
|
107
116
|
const cwd = tmp("pragma-proj-");
|
|
108
117
|
const runtime = runtimeFor(cwd, [
|
|
109
118
|
{ name: "pkg-a", source: `file://${pkg}` },
|
|
110
119
|
]);
|
|
111
120
|
|
|
112
|
-
const result = await runTask(await buildUpdateTask(runtime
|
|
121
|
+
const result = await runTask(await buildUpdateTask(runtime));
|
|
113
122
|
expect(result.contentHash).toMatch(/^[0-9a-f]{64}$/);
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
expect(
|
|
119
|
-
expect(lock?.contentHash).toBe(result.contentHash);
|
|
120
|
-
|
|
121
|
-
const firstBytes = readFileSync(lockPath(cwd), "utf-8");
|
|
122
|
-
// A --frozen re-run reproduces the locked state byte-for-byte.
|
|
123
|
-
await runTask(await buildUpdateTask(runtime, true));
|
|
124
|
-
expect(readFileSync(lockPath(cwd), "utf-8")).toBe(firstBytes);
|
|
123
|
+
expect(result.packs).toEqual([
|
|
124
|
+
{ name: "pkg-a", resolved: pkg, sourceCount: 1, storyCount: 0 },
|
|
125
|
+
]);
|
|
126
|
+
// The pointer the next boot reads names exactly the pack just built.
|
|
127
|
+
expect(readActivePack(cwd)).toBe(result.contentHash);
|
|
125
128
|
});
|
|
126
129
|
|
|
127
|
-
it("git source: resolves
|
|
130
|
+
it("git source: resolves the ref to a commit SHA", async () => {
|
|
128
131
|
const repo = tmp("pragma-repo-");
|
|
129
132
|
const git = (args: string[]) =>
|
|
130
133
|
execFileSync("git", args, {
|
|
@@ -149,34 +152,39 @@ describe("sources lock round-trip (PROTECTED)", () => {
|
|
|
149
152
|
{ name: "pkg-git", source: `git+file://${repo}#main` },
|
|
150
153
|
]);
|
|
151
154
|
|
|
152
|
-
await runTask(await buildUpdateTask(runtime
|
|
153
|
-
const
|
|
154
|
-
expect(
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
155
|
+
const result = await runTask(await buildUpdateTask(runtime));
|
|
156
|
+
const sha = result.packs.at(0)?.resolved;
|
|
157
|
+
expect(sha).toMatch(/^[0-9a-f]{40}$/);
|
|
158
|
+
expect(readActivePack(cwd)).toBe(result.contentHash);
|
|
159
|
+
// The revision reaches the manifest's provenance label, which is the only
|
|
160
|
+
// place `sources status` and `doctor` can read it from now that no lock
|
|
161
|
+
// records it. Same `<name>@<kind>:<resolved>` shape the bundler writes.
|
|
162
|
+
expect(readManifest(packDir(result.contentHash))?.sourceRef).toBe(
|
|
163
|
+
`pkg-git@git:${sha}`,
|
|
164
|
+
);
|
|
159
165
|
});
|
|
160
166
|
|
|
161
|
-
it("a
|
|
162
|
-
// On base
|
|
163
|
-
//
|
|
164
|
-
//
|
|
167
|
+
it("a re-run over an unchanged source leaves the pointer byte-identical (L1)", async () => {
|
|
168
|
+
// On base the lock file carried a `resolvedAt` timestamp, so a no-op re-run
|
|
169
|
+
// rewrote it and dirtied the tree. The pointer holds only the content hash,
|
|
170
|
+
// which is a pure function of the sources — so this is now true by
|
|
171
|
+
// construction. The guard stays because it is the property users cared
|
|
172
|
+
// about: repeating an update changes nothing when nothing changed.
|
|
165
173
|
const pkg = filePackage();
|
|
166
174
|
const cwd = tmp("pragma-proj-");
|
|
167
175
|
const runtime = runtimeFor(cwd, [
|
|
168
176
|
{ name: "pkg-a", source: `file://${pkg}` },
|
|
169
177
|
]);
|
|
170
|
-
await runTask(await buildUpdateTask(runtime
|
|
171
|
-
const firstBytes = readFileSync(
|
|
172
|
-
await runTask(await buildUpdateTask(runtime
|
|
173
|
-
expect(readFileSync(
|
|
178
|
+
await runTask(await buildUpdateTask(runtime));
|
|
179
|
+
const firstBytes = readFileSync(activePackPath(cwd), "utf-8");
|
|
180
|
+
await runTask(await buildUpdateTask(runtime));
|
|
181
|
+
expect(readFileSync(activePackPath(cwd), "utf-8")).toBe(firstBytes);
|
|
174
182
|
});
|
|
175
183
|
|
|
176
184
|
it("follows a symlinked .ttl into the build (L6)", async () => {
|
|
177
185
|
// pnpm / workspace trees symlink their sources; Dirent.isFile is false for a
|
|
178
186
|
// symlink, so on base the only `.ttl` was skipped → 0 sources → the empty
|
|
179
|
-
// build. Following the link ingests it and the build
|
|
187
|
+
// build. Following the link ingests it and the build succeeds.
|
|
180
188
|
const pkg = tmp("pragma-symlink-pkg-");
|
|
181
189
|
mkdirSync(join(pkg, "definitions"), { recursive: true });
|
|
182
190
|
const realTtl = join(pkg, "real.ttl");
|
|
@@ -187,15 +195,15 @@ describe("sources lock round-trip (PROTECTED)", () => {
|
|
|
187
195
|
{ name: "pkg-a", source: `file://${pkg}` },
|
|
188
196
|
]);
|
|
189
197
|
|
|
190
|
-
const result = await runTask(await buildUpdateTask(runtime
|
|
198
|
+
const result = await runTask(await buildUpdateTask(runtime));
|
|
191
199
|
expect(result.contentHash).toMatch(/^[0-9a-f]{64}$/);
|
|
192
|
-
expect(
|
|
200
|
+
expect(readActivePack(cwd)).toBe(result.contentHash);
|
|
193
201
|
});
|
|
194
202
|
|
|
195
203
|
it("does not recurse into a symlinked directory cycle (L6 safety)", async () => {
|
|
196
204
|
// The L6 fix follows symlinked FILES but must NOT recurse into a symlinked
|
|
197
205
|
// DIRECTORY: a link to an ancestor dir is a cycle that, if walked, recurses
|
|
198
|
-
// without bound → a stack-overflow RangeError (an INTERNAL "
|
|
206
|
+
// without bound → a stack-overflow RangeError (an INTERNAL "report").
|
|
199
207
|
// The real `.ttl` is still ingested and the build completes.
|
|
200
208
|
const pkg = tmp("pragma-symlink-cycle-");
|
|
201
209
|
mkdirSync(join(pkg, "definitions"), { recursive: true });
|
|
@@ -207,21 +215,20 @@ describe("sources lock round-trip (PROTECTED)", () => {
|
|
|
207
215
|
{ name: "pkg-a", source: `file://${pkg}` },
|
|
208
216
|
]);
|
|
209
217
|
|
|
210
|
-
const result = await runTask(await buildUpdateTask(runtime
|
|
218
|
+
const result = await runTask(await buildUpdateTask(runtime));
|
|
211
219
|
expect(result.contentHash).toMatch(/^[0-9a-f]{64}$/);
|
|
212
|
-
expect(
|
|
220
|
+
expect(readActivePack(cwd)).toBe(result.contentHash);
|
|
213
221
|
});
|
|
214
222
|
|
|
215
|
-
it("undo
|
|
223
|
+
it("undo removes the pointer when the project had none before", async () => {
|
|
216
224
|
const pkg = filePackage();
|
|
217
225
|
const cwd = tmp("pragma-proj-");
|
|
218
226
|
const runtime = runtimeFor(cwd, [
|
|
219
227
|
{ name: "pkg-a", source: `file://${pkg}` },
|
|
220
228
|
]);
|
|
221
229
|
const { runUndo } = await import("@canonical/task/node");
|
|
222
|
-
await runUndo(await buildUpdateTask(runtime
|
|
223
|
-
|
|
224
|
-
expect(readLock(cwd)).toBeUndefined();
|
|
230
|
+
await runUndo(await buildUpdateTask(runtime));
|
|
231
|
+
expect(readActivePack(cwd)).toBeUndefined();
|
|
225
232
|
});
|
|
226
233
|
});
|
|
227
234
|
|
|
@@ -237,7 +244,7 @@ describe("sources update — package-declared prefixes (M1)", () => {
|
|
|
237
244
|
{ name: "pkg-a", source: `file://${pkg}` },
|
|
238
245
|
]);
|
|
239
246
|
|
|
240
|
-
const result = await runTask(await buildUpdateTask(runtime
|
|
247
|
+
const result = await runTask(await buildUpdateTask(runtime));
|
|
241
248
|
const index = JSON.parse(
|
|
242
249
|
readFileSync(join(packDir(result.contentHash), "index.json"), "utf-8"),
|
|
243
250
|
) as {
|
|
@@ -267,30 +274,30 @@ describe("sources update — refuses an empty store (A4)", () => {
|
|
|
267
274
|
return pkg;
|
|
268
275
|
}
|
|
269
276
|
|
|
270
|
-
it("a package with no .ttl is refused, and no
|
|
277
|
+
it("a package with no .ttl is refused, and no pointer is written", async () => {
|
|
271
278
|
// On base this builds a 0-triple pack whose empty data.nq fails the
|
|
272
279
|
// completeness gate — so the "successful" update boots to a PERMANENT
|
|
273
|
-
// STORE_UNAVAILABLE loop. The fix refuses before writing the
|
|
280
|
+
// STORE_UNAVAILABLE loop. The fix refuses before writing the pointer.
|
|
274
281
|
const pkg = emptyPackage();
|
|
275
282
|
const cwd = tmp("pragma-proj-");
|
|
276
283
|
const runtime = runtimeFor(cwd, [
|
|
277
284
|
{ name: "pkg-a", source: `file://${pkg}` },
|
|
278
285
|
]);
|
|
279
286
|
|
|
280
|
-
await expect(buildUpdateTask(runtime
|
|
287
|
+
await expect(buildUpdateTask(runtime)).rejects.toMatchObject({
|
|
281
288
|
code: "CONFIG_ERROR",
|
|
282
289
|
});
|
|
283
|
-
// No
|
|
284
|
-
expect(
|
|
290
|
+
// No pointer → the embedded fallback / prior state survives, no boot loop.
|
|
291
|
+
expect(readActivePack(cwd)).toBeUndefined();
|
|
285
292
|
});
|
|
286
293
|
|
|
287
|
-
it("no configured
|
|
294
|
+
it("no configured packs is refused rather than pointing at an empty pack", async () => {
|
|
288
295
|
const cwd = tmp("pragma-proj-");
|
|
289
296
|
const runtime = runtimeFor(cwd, []);
|
|
290
|
-
await expect(buildUpdateTask(runtime
|
|
297
|
+
await expect(buildUpdateTask(runtime)).rejects.toMatchObject({
|
|
291
298
|
code: "CONFIG_ERROR",
|
|
292
299
|
});
|
|
293
|
-
expect(
|
|
300
|
+
expect(readActivePack(cwd)).toBeUndefined();
|
|
294
301
|
});
|
|
295
302
|
|
|
296
303
|
it("a comment-only .ttl (0 triples) is refused too", async () => {
|
|
@@ -305,10 +312,10 @@ describe("sources update — refuses an empty store (A4)", () => {
|
|
|
305
312
|
const runtime = runtimeFor(cwd, [
|
|
306
313
|
{ name: "pkg-a", source: `file://${pkg}` },
|
|
307
314
|
]);
|
|
308
|
-
await expect(buildUpdateTask(runtime
|
|
315
|
+
await expect(buildUpdateTask(runtime)).rejects.toMatchObject({
|
|
309
316
|
code: "CONFIG_ERROR",
|
|
310
317
|
});
|
|
311
|
-
expect(
|
|
318
|
+
expect(readActivePack(cwd)).toBeUndefined();
|
|
312
319
|
});
|
|
313
320
|
});
|
|
314
321
|
|
|
@@ -358,7 +365,7 @@ describe("sources update — conflicting @prefix detection (A5)", () => {
|
|
|
358
365
|
report: (message: string) => reports.push(message),
|
|
359
366
|
};
|
|
360
367
|
|
|
361
|
-
await runTask(await buildUpdateTask(runtime
|
|
368
|
+
await runTask(await buildUpdateTask(runtime));
|
|
362
369
|
expect(
|
|
363
370
|
reports.some(
|
|
364
371
|
(r) => r.includes('Prefix "ex:"') && r.includes("conflicting"),
|
|
@@ -385,11 +392,12 @@ describe("sources update — network-free preview (M2)", () => {
|
|
|
385
392
|
|
|
386
393
|
// A successful plan — the unreachable clone was never attempted.
|
|
387
394
|
expect(outcome.exitCode).toBe(0);
|
|
388
|
-
expect(outcome.stdout).toContain("Resolve and build 1
|
|
395
|
+
expect(outcome.stdout).toContain("Resolve and build 1 pack(s)");
|
|
389
396
|
expect(outcome.stdout).toContain(UNREACHABLE);
|
|
390
|
-
// The
|
|
391
|
-
|
|
392
|
-
expect(
|
|
397
|
+
// The project mutation is previewed, not performed: the plan names the
|
|
398
|
+
// exact pointer file a real run would write, and no pointer landed.
|
|
399
|
+
expect(outcome.stdout).toContain(activePackPath(cwd));
|
|
400
|
+
expect(readActivePack(cwd)).toBeUndefined();
|
|
393
401
|
// The store was never even asked for.
|
|
394
402
|
expect(runtime.store.booted).toBe(false);
|
|
395
403
|
});
|
|
@@ -398,7 +406,7 @@ describe("sources update — network-free preview (M2)", () => {
|
|
|
398
406
|
const cwd = tmp("pragma-proj-");
|
|
399
407
|
writeFileSync(
|
|
400
408
|
join(cwd, "pragma.config.ts"),
|
|
401
|
-
`export default {
|
|
409
|
+
`export default { packs: [{ name: "pkg-remote", source: "${UNREACHABLE}" }] };\n`,
|
|
402
410
|
);
|
|
403
411
|
|
|
404
412
|
const mcp = await projectMcp([sourcesModule], cwd);
|
|
@@ -412,25 +420,8 @@ describe("sources update — network-free preview (M2)", () => {
|
|
|
412
420
|
});
|
|
413
421
|
const plan = (envelope.data as { plan: string[] }).plan;
|
|
414
422
|
expect(plan.some((line) => line.includes(UNREACHABLE))).toBe(true);
|
|
415
|
-
// Plan-first withheld the write — no
|
|
416
|
-
expect(
|
|
417
|
-
});
|
|
418
|
-
});
|
|
419
|
-
|
|
420
|
-
describe("sources update — reproducible-or-fail (m5)", () => {
|
|
421
|
-
it("--frozen refuses a package that has no lock entry", async () => {
|
|
422
|
-
const pkg = filePackage();
|
|
423
|
-
const cwd = tmp("pragma-proj-");
|
|
424
|
-
const runtime = runtimeFor(cwd, [
|
|
425
|
-
{ name: "pkg-a", source: `file://${pkg}` },
|
|
426
|
-
]);
|
|
427
|
-
|
|
428
|
-
// No prior lock → nothing to reproduce → refuse rather than silently
|
|
429
|
-
// advance. The throw is raised during setup, before any Task is returned.
|
|
430
|
-
await expect(buildUpdateTask(runtime, true)).rejects.toMatchObject({
|
|
431
|
-
code: "CONFIG_ERROR",
|
|
432
|
-
});
|
|
433
|
-
expect(readLock(cwd)).toBeUndefined();
|
|
423
|
+
// Plan-first withheld the write — no pointer landed.
|
|
424
|
+
expect(readActivePack(cwd)).toBeUndefined();
|
|
434
425
|
});
|
|
435
426
|
});
|
|
436
427
|
|
|
@@ -498,7 +489,7 @@ describe("sources update — data-failure classification (U6)", () => {
|
|
|
498
489
|
|
|
499
490
|
let caught: unknown;
|
|
500
491
|
try {
|
|
501
|
-
await buildUpdateTask(runtime
|
|
492
|
+
await buildUpdateTask(runtime);
|
|
502
493
|
} catch (error) {
|
|
503
494
|
caught = error;
|
|
504
495
|
}
|
|
@@ -511,13 +502,13 @@ describe("sources update — data-failure classification (U6)", () => {
|
|
|
511
502
|
expect(err.message).toContain("bad-pkg/definitions/broken.ttl");
|
|
512
503
|
// … carries the parser's own detail …
|
|
513
504
|
expect(err.message.toLowerCase()).toContain("parser error");
|
|
514
|
-
// … and is NOT the internal-bug "
|
|
505
|
+
// … and is NOT the internal-bug "report this issue" path.
|
|
515
506
|
expect(err.message).not.toContain("Internal error");
|
|
516
507
|
expect(err.recovery?.message ?? "").not.toContain("report this issue");
|
|
517
508
|
// The recovery points the user at a runnable, useful next step.
|
|
518
509
|
expect(err.recovery?.cli).toBe("pragma sources update --verbose");
|
|
519
|
-
// Nothing was
|
|
520
|
-
expect(
|
|
510
|
+
// Nothing was pointed at on failure.
|
|
511
|
+
expect(readActivePack(cwd)).toBeUndefined();
|
|
521
512
|
});
|
|
522
513
|
|
|
523
514
|
it("classifies a git clone failure, naming the package (not INTERNAL)", async () => {
|
|
@@ -534,7 +525,7 @@ describe("sources update — data-failure classification (U6)", () => {
|
|
|
534
525
|
|
|
535
526
|
let caught: unknown;
|
|
536
527
|
try {
|
|
537
|
-
await buildUpdateTask(runtime
|
|
528
|
+
await buildUpdateTask(runtime);
|
|
538
529
|
} catch (error) {
|
|
539
530
|
caught = error;
|
|
540
531
|
}
|
|
@@ -543,7 +534,7 @@ describe("sources update — data-failure classification (U6)", () => {
|
|
|
543
534
|
expect(err.code).toBe("CONFIG_ERROR");
|
|
544
535
|
expect(err.message).toContain("pkg-remote");
|
|
545
536
|
expect(err.message).not.toContain("Internal error");
|
|
546
|
-
expect(
|
|
537
|
+
expect(readActivePack(cwd)).toBeUndefined();
|
|
547
538
|
});
|
|
548
539
|
|
|
549
540
|
it("names the SPECIFIC bad file among several good ones", async () => {
|
|
@@ -557,12 +548,12 @@ describe("sources update — data-failure classification (U6)", () => {
|
|
|
557
548
|
const cwd = tmp("pragma-proj-");
|
|
558
549
|
const runtime = runtimeFor(cwd, [{ name: "mix", source: `file://${pkg}` }]);
|
|
559
550
|
|
|
560
|
-
await expect(buildUpdateTask(runtime
|
|
551
|
+
await expect(buildUpdateTask(runtime)).rejects.toMatchObject({
|
|
561
552
|
code: "CONFIG_ERROR",
|
|
562
553
|
});
|
|
563
554
|
let caught: unknown;
|
|
564
555
|
try {
|
|
565
|
-
await buildUpdateTask(runtime
|
|
556
|
+
await buildUpdateTask(runtime);
|
|
566
557
|
} catch (error) {
|
|
567
558
|
caught = error;
|
|
568
559
|
}
|
|
@@ -594,9 +585,9 @@ describe("sources update — hidden files and --skip-invalid", () => {
|
|
|
594
585
|
{ name: "pkg-a", source: `file://${pkg}` },
|
|
595
586
|
]);
|
|
596
587
|
|
|
597
|
-
const result = await runTask(await buildUpdateTask(runtime
|
|
588
|
+
const result = await runTask(await buildUpdateTask(runtime));
|
|
598
589
|
expect(result.contentHash).toMatch(/^[0-9a-f]{64}$/);
|
|
599
|
-
expect(
|
|
590
|
+
expect(readActivePack(cwd)).toMatch(/^[0-9a-f]{64}$/);
|
|
600
591
|
});
|
|
601
592
|
|
|
602
593
|
it("without --skip-invalid, one malformed source fails the whole update", async () => {
|
|
@@ -605,10 +596,10 @@ describe("sources update — hidden files and --skip-invalid", () => {
|
|
|
605
596
|
const runtime = runtimeFor(cwd, [
|
|
606
597
|
{ name: "pkg-a", source: `file://${pkg}` },
|
|
607
598
|
]);
|
|
608
|
-
await expect(buildUpdateTask(runtime, false
|
|
599
|
+
await expect(buildUpdateTask(runtime, false)).rejects.toMatchObject({
|
|
609
600
|
code: "CONFIG_ERROR",
|
|
610
601
|
});
|
|
611
|
-
expect(
|
|
602
|
+
expect(readActivePack(cwd)).toBeUndefined();
|
|
612
603
|
});
|
|
613
604
|
|
|
614
605
|
it("with --skip-invalid, drops the bad source, warns loudly, and builds from the rest", async () => {
|
|
@@ -620,10 +611,10 @@ describe("sources update — hidden files and --skip-invalid", () => {
|
|
|
620
611
|
report: (message: string) => reports.push(message),
|
|
621
612
|
};
|
|
622
613
|
|
|
623
|
-
const result = await runTask(await buildUpdateTask(runtime,
|
|
614
|
+
const result = await runTask(await buildUpdateTask(runtime, true));
|
|
624
615
|
// Built from the good widget.ttl, not aborted.
|
|
625
616
|
expect(result.contentHash).toMatch(/^[0-9a-f]{64}$/);
|
|
626
|
-
expect(
|
|
617
|
+
expect(readActivePack(cwd)).toMatch(/^[0-9a-f]{64}$/);
|
|
627
618
|
// Loud per-source warning names the dropped file …
|
|
628
619
|
expect(
|
|
629
620
|
reports.some(
|
|
@@ -643,10 +634,10 @@ describe("sources update — hidden files and --skip-invalid", () => {
|
|
|
643
634
|
...runtimeFor(cwd, [{ name: "pkg-a", source: `file://${pkg}` }]),
|
|
644
635
|
report: () => {},
|
|
645
636
|
};
|
|
646
|
-
await expect(buildUpdateTask(runtime,
|
|
637
|
+
await expect(buildUpdateTask(runtime, true)).rejects.toMatchObject({
|
|
647
638
|
code: "CONFIG_ERROR",
|
|
648
639
|
});
|
|
649
|
-
expect(
|
|
640
|
+
expect(readActivePack(cwd)).toBeUndefined();
|
|
650
641
|
});
|
|
651
642
|
});
|
|
652
643
|
|
|
@@ -740,7 +731,7 @@ describe("sources update — installs package skills (U10)", () => {
|
|
|
740
731
|
{ name: "pkg-a", source: `file://${pkg}` },
|
|
741
732
|
]);
|
|
742
733
|
|
|
743
|
-
await runTask(await buildUpdateTask(runtime
|
|
734
|
+
await runTask(await buildUpdateTask(runtime));
|
|
744
735
|
|
|
745
736
|
// Installed as a symlink into $XDG_DATA_HOME/pragma/skills …
|
|
746
737
|
const linked = join(dataHome, "pragma", "skills", "foo");
|
|
@@ -762,7 +753,7 @@ describe("sources update — installs package skills (U10)", () => {
|
|
|
762
753
|
const runtime = runtimeFor(cwd, [
|
|
763
754
|
{ name: "pkg-a", source: `file://${pkg}` },
|
|
764
755
|
]);
|
|
765
|
-
await runTask(await buildUpdateTask(runtime
|
|
756
|
+
await runTask(await buildUpdateTask(runtime));
|
|
766
757
|
|
|
767
758
|
const shared = discoverSkills(cwd).filter((s) => s.name === "shared");
|
|
768
759
|
expect(shared).toHaveLength(1);
|
|
@@ -776,35 +767,191 @@ describe("sources update — installs package skills (U10)", () => {
|
|
|
776
767
|
{ name: "pkg-a", source: `file://${pkg}` },
|
|
777
768
|
]);
|
|
778
769
|
const { runUndo } = await import("@canonical/task/node");
|
|
779
|
-
await runUndo(await buildUpdateTask(runtime
|
|
770
|
+
await runUndo(await buildUpdateTask(runtime));
|
|
780
771
|
|
|
781
772
|
expect(existsSync(join(dataHome, "pragma", "skills", "bar"))).toBe(false);
|
|
782
773
|
});
|
|
774
|
+
|
|
775
|
+
/** The installed-skills root, created so a prior install can be seeded into it. */
|
|
776
|
+
function installedRoot(): string {
|
|
777
|
+
const root = join(dataHome, "pragma", "skills");
|
|
778
|
+
mkdirSync(root, { recursive: true });
|
|
779
|
+
return root;
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
/** A symlink at `<installedRoot>/<name>` whose target does not exist. */
|
|
783
|
+
function danglingLink(root: string, name: string): string {
|
|
784
|
+
const target = join(tmp("pragma-uninstalled-"), "skills", name);
|
|
785
|
+
symlinkSync(target, join(root, name));
|
|
786
|
+
return target;
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
// The `@canonical/design-system` 0.2.0 regression: 0.1.2 shipped
|
|
790
|
+
// `component-specifier`, 0.2.0 deleted it in favour of `specify-component`,
|
|
791
|
+
// and every machine that had updated against 0.1.2 kept a symlink into a
|
|
792
|
+
// package directory that no longer exists.
|
|
793
|
+
it("prunes a link whose package dropped the skill", async () => {
|
|
794
|
+
const pkg = skillPackage("specify-component"); // the 0.2.0 shape
|
|
795
|
+
const root = installedRoot();
|
|
796
|
+
danglingLink(root, "component-specifier"); // what 0.1.2 left behind
|
|
797
|
+
|
|
798
|
+
const cwd = tmp("pragma-proj-");
|
|
799
|
+
const runtime = runtimeFor(cwd, [
|
|
800
|
+
{ name: "design-system", source: `file://${pkg}` },
|
|
801
|
+
]);
|
|
802
|
+
await runTask(await buildUpdateTask(runtime));
|
|
803
|
+
|
|
804
|
+
expect(readdirSync(root)).toEqual(["specify-component"]);
|
|
805
|
+
expect(discoverSkills(cwd).map((s) => s.name)).not.toContain(
|
|
806
|
+
"component-specifier",
|
|
807
|
+
);
|
|
808
|
+
});
|
|
809
|
+
|
|
810
|
+
it("spares a manually-installed skill and a foreign link that still resolves", async () => {
|
|
811
|
+
const pkg = skillPackage("specify-component");
|
|
812
|
+
const root = installedRoot();
|
|
813
|
+
danglingLink(root, "component-specifier");
|
|
814
|
+
|
|
815
|
+
// A hand-installed skill: a REAL directory, belonging to no package. The
|
|
816
|
+
// install pass already refuses to clobber these; so must the prune pass.
|
|
817
|
+
const manual = join(root, "hand-written");
|
|
818
|
+
mkdirSync(manual, { recursive: true });
|
|
819
|
+
writeFileSync(
|
|
820
|
+
join(manual, "SKILL.md"),
|
|
821
|
+
"---\nname: hand-written\ndescription: Mine.\n---\n",
|
|
822
|
+
);
|
|
823
|
+
// Someone's own link into a checkout this update knows nothing about, and
|
|
824
|
+
// which still resolves. Deliberately RELATIVE: a relative target is stored
|
|
825
|
+
// relative to the LINK's directory, so resolving it against anything else
|
|
826
|
+
// (the cwd, say) would read as broken and eat a perfectly live link.
|
|
827
|
+
const foreign = join(dataHome, "elsewhere", "my-own");
|
|
828
|
+
mkdirSync(foreign, { recursive: true });
|
|
829
|
+
writeFileSync(
|
|
830
|
+
join(foreign, "SKILL.md"),
|
|
831
|
+
"---\nname: my-own\ndescription: Theirs.\n---\n",
|
|
832
|
+
);
|
|
833
|
+
symlinkSync(join("..", "..", "elsewhere", "my-own"), join(root, "my-own"));
|
|
834
|
+
|
|
835
|
+
const cwd = tmp("pragma-proj-");
|
|
836
|
+
const runtime = runtimeFor(cwd, [
|
|
837
|
+
{ name: "design-system", source: `file://${pkg}` },
|
|
838
|
+
]);
|
|
839
|
+
await runTask(await buildUpdateTask(runtime));
|
|
840
|
+
|
|
841
|
+
// Only the dangling link went.
|
|
842
|
+
expect(readdirSync(root).sort()).toEqual([
|
|
843
|
+
"hand-written",
|
|
844
|
+
"my-own",
|
|
845
|
+
"specify-component",
|
|
846
|
+
]);
|
|
847
|
+
expect(lstatSync(manual).isDirectory()).toBe(true);
|
|
848
|
+
expect(existsSync(join(manual, "SKILL.md"))).toBe(true);
|
|
849
|
+
expect(lstatSync(join(root, "my-own")).isSymbolicLink()).toBe(true);
|
|
850
|
+
expect(existsSync(join(root, "my-own"))).toBe(true); // still resolves
|
|
851
|
+
const found = discoverSkills(cwd).map((s) => s.name);
|
|
852
|
+
expect(found).toEqual(
|
|
853
|
+
expect.arrayContaining(["hand-written", "my-own", "specify-component"]),
|
|
854
|
+
);
|
|
855
|
+
});
|
|
856
|
+
|
|
857
|
+
it("re-points, rather than prunes, a dangling link the package still provides", async () => {
|
|
858
|
+
const pkg = skillPackage("foo");
|
|
859
|
+
const root = installedRoot();
|
|
860
|
+
danglingLink(root, "foo"); // e.g. the package moved to a new cache dir
|
|
861
|
+
|
|
862
|
+
const cwd = tmp("pragma-proj-");
|
|
863
|
+
const runtime = runtimeFor(cwd, [
|
|
864
|
+
{ name: "pkg-a", source: `file://${pkg}` },
|
|
865
|
+
]);
|
|
866
|
+
await runTask(await buildUpdateTask(runtime));
|
|
867
|
+
|
|
868
|
+
// `replaced`, never `pruned`: the prune pass skips every name this run
|
|
869
|
+
// planned, or it would delete the link the install pass just created.
|
|
870
|
+
expect(readlinkSync(join(root, "foo"))).toBe(join(pkg, "skills", "foo"));
|
|
871
|
+
expect(discoverSkills(cwd).map((s) => s.name)).toContain("foo");
|
|
872
|
+
});
|
|
873
|
+
|
|
874
|
+
it("is reversible — undo restores a pruned link, dangling target and all", async () => {
|
|
875
|
+
const pkg = skillPackage("specify-component");
|
|
876
|
+
const root = installedRoot();
|
|
877
|
+
const staleTarget = danglingLink(root, "component-specifier");
|
|
878
|
+
const link = join(root, "component-specifier");
|
|
879
|
+
|
|
880
|
+
const cwd = tmp("pragma-proj-");
|
|
881
|
+
const runtime = runtimeFor(cwd, [
|
|
882
|
+
{ name: "design-system", source: `file://${pkg}` },
|
|
883
|
+
]);
|
|
884
|
+
// The plan is made while the stale link is still there; `runUndo` MOCKS the
|
|
885
|
+
// forward effects, so stand in for the delete it would have performed.
|
|
886
|
+
const task = await buildUpdateTask(runtime);
|
|
887
|
+
rmSync(link);
|
|
888
|
+
|
|
889
|
+
const { runUndo } = await import("@canonical/task/node");
|
|
890
|
+
await runUndo(task);
|
|
891
|
+
|
|
892
|
+
expect(lstatSync(link).isSymbolicLink()).toBe(true);
|
|
893
|
+
expect(readlinkSync(link)).toBe(staleTarget); // the target it always had
|
|
894
|
+
});
|
|
895
|
+
|
|
896
|
+
it("undoes a prune whose forward delete never ran, rather than failing EEXIST", async () => {
|
|
897
|
+
const pkg = skillPackage("specify-component");
|
|
898
|
+
const root = installedRoot();
|
|
899
|
+
const staleTarget = danglingLink(root, "component-specifier");
|
|
900
|
+
|
|
901
|
+
const cwd = tmp("pragma-proj-");
|
|
902
|
+
const runtime = runtimeFor(cwd, [
|
|
903
|
+
{ name: "design-system", source: `file://${pkg}` },
|
|
904
|
+
]);
|
|
905
|
+
// No `rmSync` this time: the link is still in place when the undo re-links,
|
|
906
|
+
// and `fs.symlink` refuses an existing path — so the undo must clear it.
|
|
907
|
+
const { runUndo } = await import("@canonical/task/node");
|
|
908
|
+
await expect(runUndo(await buildUpdateTask(runtime))).resolves.toBeTruthy();
|
|
909
|
+
|
|
910
|
+
expect(readlinkSync(join(root, "component-specifier"))).toBe(staleTarget);
|
|
911
|
+
});
|
|
912
|
+
|
|
913
|
+
it("plans no prunes when nothing was ever installed", async () => {
|
|
914
|
+
const pkg = skillPackage("foo"); // $XDG_DATA_HOME/pragma/skills absent
|
|
915
|
+
const cwd = tmp("pragma-proj-");
|
|
916
|
+
const runtime = runtimeFor(cwd, [
|
|
917
|
+
{ name: "pkg-a", source: `file://${pkg}` },
|
|
918
|
+
]);
|
|
919
|
+
await runTask(await buildUpdateTask(runtime));
|
|
920
|
+
|
|
921
|
+
expect(readdirSync(join(dataHome, "pragma", "skills"))).toEqual(["foo"]);
|
|
922
|
+
});
|
|
783
923
|
});
|
|
784
924
|
|
|
785
925
|
describe("sources status — entityCount from the manifest (A10)", () => {
|
|
786
|
-
it("reports the count
|
|
787
|
-
|
|
926
|
+
it("reports the count from the manifest even when index.json is unreadable", async () => {
|
|
927
|
+
// A pack of its OWN (unique TTL ⇒ unique content hash), so corrupting its
|
|
928
|
+
// cached index cannot reach any other test's pack in the shared cache.
|
|
929
|
+
const pkg = tmp("pragma-a10-pkg-");
|
|
930
|
+
mkdirSync(join(pkg, "definitions"), { recursive: true });
|
|
931
|
+
writeFileSync(
|
|
932
|
+
join(pkg, "definitions", "widget.ttl"),
|
|
933
|
+
`${TTL}ex:a10only a ex:Widget ; rdfs:label "A10" .\n`,
|
|
934
|
+
);
|
|
788
935
|
const cwd = tmp("pragma-proj-");
|
|
789
936
|
const runtime = runtimeFor(cwd, [
|
|
790
|
-
{ name: "pkg-
|
|
937
|
+
{ name: "pkg-a10", source: `file://${pkg}` },
|
|
791
938
|
]);
|
|
792
|
-
const result = await runTask(await buildUpdateTask(runtime
|
|
939
|
+
const result = await runTask(await buildUpdateTask(runtime));
|
|
793
940
|
|
|
794
|
-
//
|
|
795
|
-
//
|
|
796
|
-
|
|
941
|
+
// Corrupt index.json but keep it non-empty, so the pack still reads as
|
|
942
|
+
// complete: any path that PARSED it to count would now yield null.
|
|
943
|
+
writeFileSync(join(packDir(result.contentHash), "index.json"), "not json");
|
|
797
944
|
|
|
798
945
|
const status = await collectStatus(bootRuntime(flagsJson, cwd));
|
|
799
|
-
//
|
|
800
|
-
expect(status.entityCount).toBe(
|
|
946
|
+
// Two abox individuals (ex:one, ex:a10only); ex:Widget is tbox, not counted.
|
|
947
|
+
expect(status.entityCount).toBe(2);
|
|
801
948
|
});
|
|
802
949
|
});
|
|
803
950
|
|
|
804
951
|
describe("sources status CLI-json == MCP tool (PROTECTED)", () => {
|
|
805
|
-
it("a
|
|
806
|
-
// Both surfaces boot from the SAME cwd + isolated config (default
|
|
807
|
-
//
|
|
952
|
+
it("a fresh install's status is byte-equal on both surfaces", async () => {
|
|
953
|
+
// Both surfaces boot from the SAME cwd + isolated config (default packs,
|
|
954
|
+
// nothing built), so the storeless status must be identical.
|
|
808
955
|
const cwd = tmp("pragma-proj-");
|
|
809
956
|
const cli = await executeVerb(
|
|
810
957
|
statusVerb,
|
|
@@ -820,9 +967,8 @@ describe("sources status CLI-json == MCP tool (PROTECTED)", () => {
|
|
|
820
967
|
|
|
821
968
|
expect(cliEnvelope).toEqual(mcpEnvelope);
|
|
822
969
|
expect(cliEnvelope.ok).toBe(true);
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
);
|
|
826
|
-
expect((cliEnvelope.data as { cached: boolean }).cached).toBe(false);
|
|
970
|
+
// Nothing built here, and the packs are the distribution's own — so the
|
|
971
|
+
// embedded snapshot is what answers reads, and status says exactly that.
|
|
972
|
+
expect((cliEnvelope.data as { store: string }).store).toBe("embedded");
|
|
827
973
|
});
|
|
828
974
|
});
|