@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
|
@@ -17,6 +17,7 @@ import { buildLookupDocument } from "./graphql/buildLookupDocument.js";
|
|
|
17
17
|
import type { LookupOutput } from "./resolveEntity.js";
|
|
18
18
|
import { parsePackDefinition } from "./schema.js";
|
|
19
19
|
import type { PackDefinition, PackLookup } from "./types.js";
|
|
20
|
+
import { distributionSource } from "./types.js";
|
|
20
21
|
import { verbKey } from "./uniqueness.js";
|
|
21
22
|
|
|
22
23
|
const DS = "https://ds.canonical.com/";
|
|
@@ -292,9 +293,11 @@ describe("GraphQL lookup end to end + shape parity with SPARQL (PROTECTED)", ()
|
|
|
292
293
|
});
|
|
293
294
|
|
|
294
295
|
const lookupVia = (definition: PackDefinition, name: string) => {
|
|
295
|
-
const verb = compilePack(
|
|
296
|
-
|
|
297
|
-
|
|
296
|
+
const verb = compilePack(
|
|
297
|
+
definition,
|
|
298
|
+
distributionSource("t"),
|
|
299
|
+
BLOCK_PREFIXES,
|
|
300
|
+
).find((v) => verbKey(v.path) === `${definition.noun} lookup`);
|
|
298
301
|
if (!verb) throw new Error("no lookup verb");
|
|
299
302
|
return verb.run({ name: [name] }, rt) as Promise<LookupOutput>;
|
|
300
303
|
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The packs domain — declared stories become runnable verbs.
|
|
3
|
+
*
|
|
4
|
+
* One pipeline runs end to end inside this folder: a JSON pack declaration is
|
|
5
|
+
* parsed and validated, compiled into `VerbSpec`s, and given run bodies that
|
|
6
|
+
* resolve entities out of the graph and formatters that render them. The
|
|
7
|
+
* intermediate stages — the schema parser, the query/render/run-body builders,
|
|
8
|
+
* the entity resolver, the sampler, the glob expander — are steps in that
|
|
9
|
+
* pipeline, not services, and they stay off this barrel: a caller reaching for
|
|
10
|
+
* one of them is a caller reassembling the pipeline by hand, and the whole
|
|
11
|
+
* point of compiling a pack once is that nobody has to.
|
|
12
|
+
*
|
|
13
|
+
* What crosses the boundary is the pipeline's ends and the contracts naming
|
|
14
|
+
* them. `compilePack` is the entry the distribution and the config-story path
|
|
15
|
+
* both take. `validateStories` and `loadEffectiveModules` are the two ways
|
|
16
|
+
* third-party stories are admitted — the first screens records and reports
|
|
17
|
+
* every problem (which is how `doctor` reports a story the CLI drops rather
|
|
18
|
+
* than letting it vanish), the second is the full load the MCP server and the
|
|
19
|
+
* `capabilities` verb take. `resolvePackDetail` and `resolveUri` are the two
|
|
20
|
+
* decisions a pack's own reads defer to the runtime, and `verbKey` is the
|
|
21
|
+
* identity function every surface keys a verb by.
|
|
22
|
+
*
|
|
23
|
+
* `loadEffectiveModules` reads config and the answering pack behind DYNAMIC
|
|
24
|
+
* imports so a bare `--help` never pays for either; consumers reach it lazily
|
|
25
|
+
* today for exactly that reason, and routing it through this barrel statically
|
|
26
|
+
* would put the config reader back on the fast path.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
export type { StoryProblem } from "./collect.js";
|
|
30
|
+
export { loadEffectiveModules, validateStories } from "./collect.js";
|
|
31
|
+
export { compilePack } from "./compile.js";
|
|
32
|
+
export { resolvePackDetail } from "./disclosure.js";
|
|
33
|
+
export { resolveUri } from "./iri.js";
|
|
34
|
+
export type {
|
|
35
|
+
PackDefinition,
|
|
36
|
+
PackRow,
|
|
37
|
+
StorySource,
|
|
38
|
+
} from "./types.js";
|
|
39
|
+
export { distributionSource } from "./types.js";
|
|
40
|
+
export { verbKey } from "./uniqueness.js";
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URI resolution — what it accepts, and what it says when it refuses.
|
|
3
|
+
*
|
|
4
|
+
* Both halves matter and only one was covered. `resolveUri` is reached by every
|
|
5
|
+
* read (`graph inspect`, every pack lookup, the `pragma:{+uri}` resource), so
|
|
6
|
+
* its diagnostic is the sentence a user or an agent actually has to act on.
|
|
7
|
+
* Nothing asserted that sentence, which is how it came to quote a string the
|
|
8
|
+
* caller never typed.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { describe, expect, it } from "vitest";
|
|
12
|
+
import { resolveUri } from "./iri.js";
|
|
13
|
+
|
|
14
|
+
const DS = "https://ds.canonical.com/";
|
|
15
|
+
const PREFIXES: Readonly<Record<string, string>> = { ds: DS };
|
|
16
|
+
|
|
17
|
+
/** Run `resolveUri` and hand back whatever it threw, for assertion. */
|
|
18
|
+
function refusal(uri: string): { code?: string; message?: string } {
|
|
19
|
+
try {
|
|
20
|
+
resolveUri(uri, PREFIXES);
|
|
21
|
+
throw new Error(`expected "${uri}" to be refused`);
|
|
22
|
+
} catch (error) {
|
|
23
|
+
return error as { code?: string; message?: string };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
describe("resolveUri", () => {
|
|
28
|
+
it("resolves the plain forms", () => {
|
|
29
|
+
expect(resolveUri("ds:Component", PREFIXES)).toBe(`${DS}Component`);
|
|
30
|
+
expect(resolveUri(`${DS}Component`, PREFIXES)).toBe(`${DS}Component`);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("accepts a percent-encoded prefixed name", () => {
|
|
34
|
+
// A client that encodes the URI it puts in a `pragma:{+uri}` read is not
|
|
35
|
+
// doing anything wrong; refusing it made the resource surface reject its
|
|
36
|
+
// own advertised identifiers.
|
|
37
|
+
expect(resolveUri("ds%3AComponent", PREFIXES)).toBe(`${DS}Component`);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("names the URI the CALLER typed, not the expansion", () => {
|
|
41
|
+
// The safety check runs on the expanded IRI — it has to — but the message
|
|
42
|
+
// is for whoever typed the input, and they never typed the expansion.
|
|
43
|
+
const error = refusal("ds:my component");
|
|
44
|
+
expect(error.code).toBe("INVALID_INPUT");
|
|
45
|
+
expect(error.message).toContain("ds:my component");
|
|
46
|
+
expect(error.message).not.toContain(DS);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("refuses malformed percent input as INVALID_INPUT, not a URIError", () => {
|
|
50
|
+
// `decodeURIComponent` throws `URIError` on a truncated escape. Escaping as
|
|
51
|
+
// a raw TypeError would surface as an internal fault rather than the
|
|
52
|
+
// caller's bad input.
|
|
53
|
+
const error = refusal("%E0%A4%A");
|
|
54
|
+
expect(error.code).toBe("INVALID_INPUT");
|
|
55
|
+
expect(error).not.toBeInstanceOf(URIError);
|
|
56
|
+
expect(error.message).toContain("%E0%A4%A");
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("refuses an unknown prefix and offers the ones it knows", () => {
|
|
60
|
+
const error = refusal("nope:Thing") as {
|
|
61
|
+
code?: string;
|
|
62
|
+
validOptions?: string[];
|
|
63
|
+
};
|
|
64
|
+
expect(error.code).toBe("INVALID_INPUT");
|
|
65
|
+
expect(error.validOptions).toContain("ds");
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("refuses a payload that would break out of the <iri> token", () => {
|
|
69
|
+
// The injection guard, asserted here rather than only through a verb.
|
|
70
|
+
const error = refusal('ds:x> } INSERT { ?s ?p "y" } #');
|
|
71
|
+
expect(error.code).toBe("INVALID_INPUT");
|
|
72
|
+
});
|
|
73
|
+
});
|
package/src/kernel/packs/iri.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* before it can be interpolated into a generated `<iri>` query token.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { PragmaError } from "../error/
|
|
10
|
+
import { cliRecovery, PragmaError } from "../error/index.js";
|
|
11
11
|
|
|
12
12
|
/** Characters not allowed inside a SPARQL `<IRI>`. */
|
|
13
13
|
const UNSAFE_IRI_PATTERN = /[<>"{}|\\^`\s]/;
|
|
@@ -26,6 +26,11 @@ export function isEmbeddableIri(value: string): boolean {
|
|
|
26
26
|
/**
|
|
27
27
|
* Resolve a prefixed or absolute URI to its full form.
|
|
28
28
|
*
|
|
29
|
+
* A value that fails to resolve and carries a `%` is retried once decoded, so a
|
|
30
|
+
* client that percent-encodes the URI it addresses (`ds%3AComponent`) is served
|
|
31
|
+
* rather than rejected. Every diagnostic names the value the CALLER supplied —
|
|
32
|
+
* the safety check runs on the expansion, but nobody typed the expansion.
|
|
33
|
+
*
|
|
29
34
|
* @param uri - A full or prefixed URI string.
|
|
30
35
|
* @param prefixes - The store's merged prefix→namespace map.
|
|
31
36
|
* @returns The fully expanded URI.
|
|
@@ -35,12 +40,35 @@ export function resolveUri(
|
|
|
35
40
|
uri: string,
|
|
36
41
|
prefixes: Readonly<Record<string, string>>,
|
|
37
42
|
): string {
|
|
43
|
+
const direct = tryResolveUri(uri, prefixes);
|
|
44
|
+
if (typeof direct === "string") return direct;
|
|
45
|
+
|
|
46
|
+
const decoded = uri.includes("%") ? decodeOnce(uri) : undefined;
|
|
47
|
+
if (decoded !== undefined && decoded !== uri) {
|
|
48
|
+
const viaDecoded = tryResolveUri(decoded, prefixes);
|
|
49
|
+
if (typeof viaDecoded === "string") return viaDecoded;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Report the input as given, never the decoded or expanded form.
|
|
53
|
+
throw direct;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* One resolution attempt: the expanded IRI, or the error describing `uri`.
|
|
58
|
+
*
|
|
59
|
+
* @param uri - The candidate URI, as the caller wrote it.
|
|
60
|
+
* @param prefixes - The store's merged prefix→namespace map.
|
|
61
|
+
* @returns The expanded IRI on success, else the PragmaError to report.
|
|
62
|
+
*/
|
|
63
|
+
function tryResolveUri(
|
|
64
|
+
uri: string,
|
|
65
|
+
prefixes: Readonly<Record<string, string>>,
|
|
66
|
+
): string | PragmaError {
|
|
38
67
|
const colonIdx = uri.indexOf(":");
|
|
39
68
|
if (colonIdx === -1) {
|
|
40
|
-
|
|
69
|
+
return PragmaError.invalidInput("uri", uri, {
|
|
41
70
|
recovery: {
|
|
42
|
-
message:
|
|
43
|
-
'Use a prefixed URI (e.g. "ds:global.component.button") or a full URI.',
|
|
71
|
+
message: 'Use a prefixed URI (e.g. "prefix:name") or a full URI.',
|
|
44
72
|
},
|
|
45
73
|
});
|
|
46
74
|
}
|
|
@@ -49,30 +77,52 @@ export function resolveUri(
|
|
|
49
77
|
const namespace = prefixes[prefix];
|
|
50
78
|
if (namespace !== undefined) {
|
|
51
79
|
const resolved = `${namespace}${uri.slice(colonIdx + 1)}`;
|
|
52
|
-
|
|
53
|
-
return resolved;
|
|
80
|
+
return unsafeIriError(uri, resolved) ?? resolved;
|
|
54
81
|
}
|
|
55
82
|
|
|
56
83
|
if (ABSOLUTE_IRI_PATTERN.test(uri)) {
|
|
57
|
-
|
|
58
|
-
return uri;
|
|
84
|
+
return unsafeIriError(uri, uri) ?? uri;
|
|
59
85
|
}
|
|
60
86
|
|
|
61
|
-
|
|
87
|
+
return PragmaError.invalidInput("prefix", prefix, {
|
|
62
88
|
validOptions: Object.keys(prefixes),
|
|
63
|
-
recovery: {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
mcp: { tool: "ontology_list" },
|
|
67
|
-
},
|
|
89
|
+
recovery: cliRecovery("ontology list", "List known ontology prefixes.", {
|
|
90
|
+
tool: "ontology_list",
|
|
91
|
+
}),
|
|
68
92
|
});
|
|
69
93
|
}
|
|
70
94
|
|
|
71
|
-
/**
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
95
|
+
/**
|
|
96
|
+
* Guard the EXPANSION, name the INPUT: the check is on the IRI that would reach
|
|
97
|
+
* a query, the message is about the value the caller actually typed.
|
|
98
|
+
*
|
|
99
|
+
* @param input - The URI as the caller wrote it.
|
|
100
|
+
* @param resolved - The expanded IRI the check runs against.
|
|
101
|
+
* @returns The error when `resolved` carries IRI-breaking characters, else undefined.
|
|
102
|
+
*/
|
|
103
|
+
function unsafeIriError(
|
|
104
|
+
input: string,
|
|
105
|
+
resolved: string,
|
|
106
|
+
): PragmaError | undefined {
|
|
107
|
+
if (!UNSAFE_IRI_PATTERN.test(resolved)) return undefined;
|
|
108
|
+
return PragmaError.invalidInput("uri", input, {
|
|
109
|
+
recovery: { message: "URI contains characters not allowed in IRIs." },
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Percent-decode a value, tolerating malformed encodings.
|
|
115
|
+
*
|
|
116
|
+
* `decodeURIComponent` throws `URIError` on a stray `%` — a decode ATTEMPT must
|
|
117
|
+
* never turn a reportable input error into a crash.
|
|
118
|
+
*
|
|
119
|
+
* @param value - The possibly percent-encoded value.
|
|
120
|
+
* @returns The decoded value, or undefined when it cannot be decoded.
|
|
121
|
+
*/
|
|
122
|
+
function decodeOnce(value: string): string | undefined {
|
|
123
|
+
try {
|
|
124
|
+
return decodeURIComponent(value);
|
|
125
|
+
} catch {
|
|
126
|
+
return undefined;
|
|
77
127
|
}
|
|
78
128
|
}
|
|
@@ -9,20 +9,23 @@
|
|
|
9
9
|
* them (disclosure gates the fetch), never HOW it is laid out.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import { BIN_NAME, RECOVERY_CLI_PREFIX } from "../../constants.js";
|
|
12
13
|
import type {
|
|
13
14
|
ColumnDef,
|
|
14
15
|
LookupField,
|
|
15
16
|
RenderListOptions,
|
|
16
17
|
RenderLookupOptions,
|
|
17
18
|
SectionDef,
|
|
18
|
-
} from "../render/
|
|
19
|
+
} from "../render/index.js";
|
|
20
|
+
import { compactUri } from "../render/index.js";
|
|
19
21
|
import {
|
|
22
|
+
renderListEmptyNotice,
|
|
20
23
|
renderListLlm,
|
|
21
24
|
renderListPlain,
|
|
22
25
|
renderLookupLlm,
|
|
23
26
|
renderLookupPlain,
|
|
24
27
|
} from "../render/renderers.js";
|
|
25
|
-
import type { Formatters } from "../spec/
|
|
28
|
+
import type { Formatters } from "../spec/index.js";
|
|
26
29
|
import type { LookupOutput } from "./resolveEntity.js";
|
|
27
30
|
import type {
|
|
28
31
|
PackChildRow,
|
|
@@ -52,8 +55,7 @@ export interface RenderMeta {
|
|
|
52
55
|
* list on a BUILT store (a cold store would have failed with STORE_UNAVAILABLE
|
|
53
56
|
* first) means "nothing matched", so point at both possible fixes.
|
|
54
57
|
*/
|
|
55
|
-
const DEFAULT_EMPTY_HINT =
|
|
56
|
-
"If you haven't built the store yet, run `pragma sources update`; otherwise broaden your filter or channel.";
|
|
58
|
+
const DEFAULT_EMPTY_HINT = `Build the store with \`${BIN_NAME} sources update\`, or broaden the filter or channel.`;
|
|
57
59
|
|
|
58
60
|
/** Build the list formatters for a list-shaped verb (list or an extra verb). */
|
|
59
61
|
export function listFormatters(
|
|
@@ -69,7 +71,9 @@ export function listFormatters(
|
|
|
69
71
|
// `emptyRecovery` becomes the hint; otherwise the generic build/broaden hint.
|
|
70
72
|
const emptyHint = shape.emptyRecovery
|
|
71
73
|
? `${shape.emptyRecovery.message}${
|
|
72
|
-
shape.emptyRecovery.cli
|
|
74
|
+
shape.emptyRecovery.cli
|
|
75
|
+
? ` Run \`${RECOVERY_CLI_PREFIX}${shape.emptyRecovery.cli}\`.`
|
|
76
|
+
: ""
|
|
73
77
|
}`
|
|
74
78
|
: DEFAULT_EMPTY_HINT;
|
|
75
79
|
const options: RenderListOptions<PackRow> = {
|
|
@@ -80,9 +84,13 @@ export function listFormatters(
|
|
|
80
84
|
emptyHint,
|
|
81
85
|
};
|
|
82
86
|
return {
|
|
83
|
-
plain: (rows) => renderListPlain(rows, options),
|
|
87
|
+
plain: (rows, context) => renderListPlain(rows, options, context),
|
|
84
88
|
llm: (rows) => renderListLlm(rows, options),
|
|
85
89
|
json: (rows) => JSON.stringify(rows, null, 2),
|
|
90
|
+
// Zero rows: the dispatcher routes this to stderr (exit 0) so the plain
|
|
91
|
+
// stdout stream stays pure data; llm/json keep their own empty shapes.
|
|
92
|
+
emptyNotice: (rows) =>
|
|
93
|
+
rows.length === 0 ? renderListEmptyNotice(options) : undefined,
|
|
86
94
|
};
|
|
87
95
|
}
|
|
88
96
|
|
|
@@ -113,7 +121,11 @@ export function lookupOptions(
|
|
|
113
121
|
}),
|
|
114
122
|
);
|
|
115
123
|
return {
|
|
116
|
-
|
|
124
|
+
// An entity reached by IRI need not carry a `by` value, so the IRI is a
|
|
125
|
+
// real title, not a fallback nobody hits — and it is titled in the form the
|
|
126
|
+
// user addressed it with, not the expanded one they never typed.
|
|
127
|
+
title: (entity) =>
|
|
128
|
+
scalar(entity.name) ?? compactScalar(entity.uri, prefixes) ?? "(unnamed)",
|
|
117
129
|
fields,
|
|
118
130
|
sections: [...flatSections, ...expandSections],
|
|
119
131
|
prefixes,
|
|
@@ -191,6 +203,15 @@ function scalar(
|
|
|
191
203
|
return typeof value === "string" ? value : undefined;
|
|
192
204
|
}
|
|
193
205
|
|
|
206
|
+
/** A scalar URI in its prefixed display form, or undefined when it is neither. */
|
|
207
|
+
function compactScalar(
|
|
208
|
+
value: string | readonly PackChildRow[] | undefined,
|
|
209
|
+
prefixes: Readonly<Record<string, string>>,
|
|
210
|
+
): string | undefined {
|
|
211
|
+
const uri = scalar(value);
|
|
212
|
+
return uri === undefined ? undefined : compactUri(uri, prefixes);
|
|
213
|
+
}
|
|
214
|
+
|
|
194
215
|
function capitalize(value: string): string {
|
|
195
216
|
return value.charAt(0).toUpperCase() + value.slice(1);
|
|
196
217
|
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lookup ADDRESSING (PROTECTED): which argument shapes a pack lookup accepts,
|
|
3
|
+
* and whether the answer is the same twice.
|
|
4
|
+
*
|
|
5
|
+
* A lookup's `<name...>` positional is documented — in the generated reference,
|
|
6
|
+
* in the MCP tool schema, and by shell completion, which offers prefixed IRIs
|
|
7
|
+
* and nothing else — as accepting a name, a prefixed name, an absolute IRI, or
|
|
8
|
+
* a glob. These assert that the resolver honours the shape it is handed rather
|
|
9
|
+
* than the source its pack declares, that an entity is addressable by IRI even
|
|
10
|
+
* when it carries no `by` value, and that an ambiguous name resolves to the
|
|
11
|
+
* same entity on every store and every machine.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
15
|
+
import {
|
|
16
|
+
AMBIGUOUS_TTL,
|
|
17
|
+
BLOCK_PREFIXES,
|
|
18
|
+
BLOCK_TTL,
|
|
19
|
+
} from "../../testing/fixtures/blockGraph.js";
|
|
20
|
+
import { buildFixtureRuntime } from "../../testing/helpers/packRuntime.js";
|
|
21
|
+
import type { PragmaRuntime } from "../runtime/types.js";
|
|
22
|
+
import { compilePack } from "./compile.js";
|
|
23
|
+
import { lookupOptions } from "./renderPack.js";
|
|
24
|
+
import type { LookupOutput } from "./resolveEntity.js";
|
|
25
|
+
import type { PackDefinition, PackLookup } from "./types.js";
|
|
26
|
+
import { distributionSource } from "./types.js";
|
|
27
|
+
import { verbKey } from "./uniqueness.js";
|
|
28
|
+
|
|
29
|
+
const DS = "https://ds.canonical.com/";
|
|
30
|
+
|
|
31
|
+
/** A graphql-sourced pack — the shape `block` and `modifier` declare. */
|
|
32
|
+
const GQL: PackDefinition = {
|
|
33
|
+
noun: "gblock",
|
|
34
|
+
lookup: {
|
|
35
|
+
source: "graphql",
|
|
36
|
+
by: "ds:name",
|
|
37
|
+
types: ["ds:Component", "ds:Pattern", "ds:Subcomponent"],
|
|
38
|
+
graphqlType: "UIBlock",
|
|
39
|
+
fields: [{ name: "summary", property: "ds:summary" }],
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/** A sparql-sourced pack — the shape `tier`, `token` and `standard` declare. */
|
|
44
|
+
const SPQ: PackDefinition = {
|
|
45
|
+
noun: "sblock",
|
|
46
|
+
lookup: {
|
|
47
|
+
source: "sparql",
|
|
48
|
+
by: "ds:name",
|
|
49
|
+
type: "ds:Component",
|
|
50
|
+
fields: [{ name: "summary", property: "ds:summary" }],
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
describe("pack lookup addressing (PROTECTED)", () => {
|
|
55
|
+
let rt: PragmaRuntime;
|
|
56
|
+
|
|
57
|
+
beforeAll(async () => {
|
|
58
|
+
({ rt } = await buildFixtureRuntime({
|
|
59
|
+
ttl: BLOCK_TTL + AMBIGUOUS_TTL,
|
|
60
|
+
prefixes: BLOCK_PREFIXES,
|
|
61
|
+
detail: "detailed",
|
|
62
|
+
}));
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
afterAll(async () => {
|
|
66
|
+
(await rt.store.get()).store.dispose();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const lookupVia = (
|
|
70
|
+
definition: PackDefinition,
|
|
71
|
+
...name: string[]
|
|
72
|
+
): Promise<LookupOutput> => {
|
|
73
|
+
const verb = compilePack(
|
|
74
|
+
definition,
|
|
75
|
+
distributionSource("t"),
|
|
76
|
+
BLOCK_PREFIXES,
|
|
77
|
+
).find((v) => verbKey(v.path) === `${definition.noun} lookup`);
|
|
78
|
+
if (!verb) throw new Error("no lookup verb");
|
|
79
|
+
return verb.run({ name }, rt) as Promise<LookupOutput>;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const uris = (out: LookupOutput): string[] =>
|
|
83
|
+
out.results.map((entity) => String(entity.uri));
|
|
84
|
+
|
|
85
|
+
describe("an IRI addresses an entity on EVERY pack, not just sparql ones", () => {
|
|
86
|
+
it("resolves a prefixed name on a graphql-sourced pack", async () => {
|
|
87
|
+
const out = await lookupVia(GQL, "ds:button");
|
|
88
|
+
expect(out.errors).toEqual([]);
|
|
89
|
+
expect(uris(out)).toEqual([`${DS}button`]);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it("resolves an absolute IRI on a graphql-sourced pack", async () => {
|
|
93
|
+
const out = await lookupVia(GQL, `${DS}modal`);
|
|
94
|
+
expect(out.errors).toEqual([]);
|
|
95
|
+
expect(uris(out)).toEqual([`${DS}modal`]);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it("still resolves a plain name on a graphql-sourced pack", async () => {
|
|
99
|
+
const out = await lookupVia(GQL, "Modal");
|
|
100
|
+
expect(uris(out)).toEqual([`${DS}modal`]);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("reports an IRI that names nothing as a clean miss", async () => {
|
|
104
|
+
await expect(lookupVia(GQL, "ds:nosuchblock")).rejects.toMatchObject({
|
|
105
|
+
code: "ENTITY_NOT_FOUND",
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe("an IRI addresses an entity that carries no `by` value", () => {
|
|
111
|
+
it("resolves it on the sparql path", async () => {
|
|
112
|
+
const out = await lookupVia(SPQ, "ds:nameless.widget");
|
|
113
|
+
expect(out.errors).toEqual([]);
|
|
114
|
+
expect(uris(out)).toEqual([`${DS}nameless.widget`]);
|
|
115
|
+
expect(out.results.at(0)?.summary).toBe(
|
|
116
|
+
"Carries no ds:name; addressable only by IRI.",
|
|
117
|
+
);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("resolves it on the graphql path", async () => {
|
|
121
|
+
const out = await lookupVia(GQL, "ds:nameless.widget");
|
|
122
|
+
expect(out.errors).toEqual([]);
|
|
123
|
+
expect(uris(out)).toEqual([`${DS}nameless.widget`]);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("titles it with the prefixed IRI it was addressed by", () => {
|
|
127
|
+
const options = lookupOptions(SPQ.lookup as PackLookup, BLOCK_PREFIXES);
|
|
128
|
+
expect(options.title({ uri: `${DS}nameless.widget` })).toBe(
|
|
129
|
+
"ds:nameless.widget",
|
|
130
|
+
);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
describe("a glob expands over the population its own shape addresses", () => {
|
|
135
|
+
it("expands an IRI-shaped glob on a sparql-sourced pack", async () => {
|
|
136
|
+
const out = await lookupVia(SPQ, "ds:*.chip");
|
|
137
|
+
expect(out.errors).toEqual([]);
|
|
138
|
+
expect(uris(out).sort()).toEqual([`${DS}alpha.chip`, `${DS}zeta.chip`]);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it("expands an IRI-shaped glob on a graphql-sourced pack", async () => {
|
|
142
|
+
const out = await lookupVia(GQL, "ds:button*");
|
|
143
|
+
expect(out.errors).toEqual([]);
|
|
144
|
+
expect(uris(out).sort()).toEqual([`${DS}button`, `${DS}button.icon`]);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it("reaches an entity with no `by` value through an IRI glob", async () => {
|
|
148
|
+
const out = await lookupVia(SPQ, "ds:nameless.*");
|
|
149
|
+
expect(uris(out)).toEqual([`${DS}nameless.widget`]);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it("still expands a name-shaped glob over names", async () => {
|
|
153
|
+
const out = await lookupVia(SPQ, "Mod*");
|
|
154
|
+
expect(uris(out)).toEqual([`${DS}modal`]);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it("expands an ABSOLUTE-IRI glob, not only the compact spelling", async () => {
|
|
158
|
+
// An entity under a registered prefix has two legal spellings, and a
|
|
159
|
+
// literal lookup honours both — so a glob that generalises one of them
|
|
160
|
+
// must too. Expanding over the compact form alone made
|
|
161
|
+
// `https://ds.canonical.com/but*` an EMPTY_RESULTS while the exact IRI
|
|
162
|
+
// it generalises resolved fine.
|
|
163
|
+
const out = await lookupVia(GQL, `${DS}button*`);
|
|
164
|
+
expect(out.errors).toEqual([]);
|
|
165
|
+
expect(uris(out).sort()).toEqual([`${DS}button`, `${DS}button.icon`]);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
it("yields an entity ONCE when both its spellings match", async () => {
|
|
169
|
+
// Reachable, not defensive: a glob counts as IRI-shaped if it contains
|
|
170
|
+
// a colon, so `*:*chip` matches BOTH `ds:alpha.chip` and its absolute
|
|
171
|
+
// twin. That is why the population is a spelling→entity map rather than
|
|
172
|
+
// a flat list of both forms — a match under either spelling must render
|
|
173
|
+
// one row, not two.
|
|
174
|
+
const out = await lookupVia(SPQ, "*:*chip");
|
|
175
|
+
expect(uris(out).sort()).toEqual([`${DS}alpha.chip`, `${DS}zeta.chip`]);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it("reports an IRI-shaped glob that matches nothing", async () => {
|
|
179
|
+
await expect(lookupVia(SPQ, "ds:nosuch*")).rejects.toMatchObject({
|
|
180
|
+
code: "EMPTY_RESULTS",
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
describe("an ambiguous name resolves to the SAME entity every time", () => {
|
|
186
|
+
// `ds:zeta.chip` is declared BEFORE `ds:alpha.chip` in the fixture, so the
|
|
187
|
+
// store enumerates it first while IRI order puts `alpha` first. Without an
|
|
188
|
+
// explicit ORDER BY the winner is whichever the store happens to yield —
|
|
189
|
+
// exactly the cross-tier `Button` ambiguity in the live graph.
|
|
190
|
+
it("picks the lowest IRI on the sparql path", async () => {
|
|
191
|
+
const out = await lookupVia(SPQ, "Chip");
|
|
192
|
+
expect(uris(out)).toEqual([`${DS}alpha.chip`]);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it("picks the lowest IRI on the graphql path", async () => {
|
|
196
|
+
const out = await lookupVia(GQL, "Chip");
|
|
197
|
+
expect(uris(out)).toEqual([`${DS}alpha.chip`]);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it("agrees with itself across repeated resolves", async () => {
|
|
201
|
+
const runs = await Promise.all([
|
|
202
|
+
lookupVia(SPQ, "Chip"),
|
|
203
|
+
lookupVia(SPQ, "chip"),
|
|
204
|
+
lookupVia(GQL, "CHIP"),
|
|
205
|
+
]);
|
|
206
|
+
expect(runs.map(uris)).toEqual([
|
|
207
|
+
[`${DS}alpha.chip`],
|
|
208
|
+
[`${DS}alpha.chip`],
|
|
209
|
+
[`${DS}alpha.chip`],
|
|
210
|
+
]);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
});
|