@canonical/pragma-cli 0.34.0 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +153 -30
- package/bundled-skills/add-standard/SKILL.md +338 -0
- package/bundled-skills/adoption-a1-styles/SKILL.md +269 -0
- package/bundled-skills/adoption-a2-components/SKILL.md +291 -0
- package/bundled-skills/adoption-a3-forms/SKILL.md +260 -0
- package/bundled-skills/anatomy-author/ANATOMY_DSL_SPEC.md +406 -0
- package/bundled-skills/anatomy-author/SKILL.md +1226 -0
- package/bundled-skills/design-auditor/SKILL.md +455 -0
- package/bundled-skills/implement-component/SKILL.md +333 -0
- package/bundled-skills/specify-component/SKILL.md +331 -0
- package/bundled-skills/specify-pattern/SKILL.md +292 -0
- package/dist/.build-ok +0 -0
- package/dist/package.json +84 -0
- package/dist/pragma.conf.js +1016 -0
- package/dist/pragma.conf.js.map +1 -0
- package/dist/src/bin.js +356 -0
- package/dist/src/bin.js.map +1 -0
- package/dist/src/capabilities/capabilities/capabilities.render.js +70 -0
- package/dist/src/capabilities/capabilities/capabilities.render.js.map +1 -0
- package/dist/src/capabilities/capabilities/capabilities.verb.js +59 -0
- package/dist/src/capabilities/capabilities/capabilities.verb.js.map +1 -0
- package/dist/src/capabilities/capabilities/catalog.js +130 -0
- package/dist/src/capabilities/capabilities/catalog.js.map +1 -0
- package/dist/src/capabilities/capabilities/hints.js +195 -0
- package/dist/src/capabilities/capabilities/hints.js.map +1 -0
- package/dist/src/capabilities/capabilities/index.js +11 -0
- package/dist/src/capabilities/capabilities/index.js.map +1 -0
- package/dist/src/capabilities/capabilities/types.js +11 -0
- package/dist/src/capabilities/capabilities/types.js.map +1 -0
- package/dist/src/capabilities/colophon/collectColophon.js +83 -0
- package/dist/src/capabilities/colophon/collectColophon.js.map +1 -0
- package/dist/src/capabilities/colophon/colophon.render.js +59 -0
- package/dist/src/capabilities/colophon/colophon.render.js.map +1 -0
- package/dist/src/capabilities/colophon/colophon.verb.js +43 -0
- package/dist/src/capabilities/colophon/colophon.verb.js.map +1 -0
- package/dist/src/capabilities/colophon/index.js +5 -0
- package/dist/src/capabilities/colophon/index.js.map +1 -0
- package/dist/src/capabilities/colophon/markdownTerminal.js +90 -0
- package/dist/src/capabilities/colophon/markdownTerminal.js.map +1 -0
- package/dist/src/capabilities/colophon/types.js +10 -0
- package/dist/src/capabilities/colophon/types.js.map +1 -0
- package/dist/src/capabilities/config/collectConfigShow.js +59 -0
- package/dist/src/capabilities/config/collectConfigShow.js.map +1 -0
- package/dist/src/capabilities/config/field.render.js +22 -0
- package/dist/src/capabilities/config/field.render.js.map +1 -0
- package/dist/src/capabilities/config/fields.js +46 -0
- package/dist/src/capabilities/config/fields.js.map +1 -0
- package/dist/src/capabilities/config/get.verb.js +61 -0
- package/dist/src/capabilities/config/get.verb.js.map +1 -0
- package/dist/src/capabilities/config/index.js +5 -0
- package/dist/src/capabilities/config/index.js.map +1 -0
- package/dist/src/capabilities/config/runField.js +59 -0
- package/dist/src/capabilities/config/runField.js.map +1 -0
- package/dist/src/capabilities/config/runGet.js +28 -0
- package/dist/src/capabilities/config/runGet.js.map +1 -0
- package/dist/src/capabilities/config/runSet.js +53 -0
- package/dist/src/capabilities/config/runSet.js.map +1 -0
- package/dist/src/capabilities/config/set.verb.js +66 -0
- package/dist/src/capabilities/config/set.verb.js.map +1 -0
- package/dist/src/capabilities/config/show.render.js +84 -0
- package/dist/src/capabilities/config/show.render.js.map +1 -0
- package/dist/src/capabilities/config/show.verb.js +44 -0
- package/dist/src/capabilities/config/show.verb.js.map +1 -0
- package/dist/src/capabilities/config/types.js +5 -0
- package/dist/src/capabilities/config/types.js.map +1 -0
- package/dist/src/capabilities/config/unset.verb.js +49 -0
- package/dist/src/capabilities/config/unset.verb.js.map +1 -0
- package/dist/src/capabilities/create/cliProjection.js +195 -0
- package/dist/src/capabilities/create/cliProjection.js.map +1 -0
- package/dist/src/capabilities/create/constants.js +47 -0
- package/dist/src/capabilities/create/constants.js.map +1 -0
- package/dist/src/capabilities/create/create.render.js +100 -0
- package/dist/src/capabilities/create/create.render.js.map +1 -0
- package/dist/src/capabilities/create/create.verb.js +438 -0
- package/dist/src/capabilities/create/create.verb.js.map +1 -0
- package/dist/src/capabilities/create/createHelp.js +47 -0
- package/dist/src/capabilities/create/createHelp.js.map +1 -0
- package/dist/src/capabilities/create/createSurface.generated.js +394 -0
- package/dist/src/capabilities/create/createSurface.generated.js.map +1 -0
- package/dist/src/capabilities/create/generatorToVerbSpec.js +106 -0
- package/dist/src/capabilities/create/generatorToVerbSpec.js.map +1 -0
- package/dist/src/capabilities/create/index.js +18 -0
- package/dist/src/capabilities/create/index.js.map +1 -0
- package/dist/src/capabilities/create/messages.js +16 -0
- package/dist/src/capabilities/create/messages.js.map +1 -0
- package/dist/src/capabilities/create/mount.js +294 -0
- package/dist/src/capabilities/create/mount.js.map +1 -0
- package/dist/src/capabilities/create/pathJail.js +65 -0
- package/dist/src/capabilities/create/pathJail.js.map +1 -0
- package/dist/src/capabilities/create/pickGenerator.js +53 -0
- package/dist/src/capabilities/create/pickGenerator.js.map +1 -0
- package/dist/src/capabilities/create/types.js +2 -0
- package/dist/src/capabilities/create/types.js.map +1 -0
- package/dist/src/capabilities/distribution.js +40 -0
- package/dist/src/capabilities/distribution.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkKeStore.js +40 -0
- package/dist/src/capabilities/doctor/checks/checkKeStore.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkNodeVersion.js +21 -0
- package/dist/src/capabilities/doctor/checks/checkNodeVersion.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkPackageRefs.js +148 -0
- package/dist/src/capabilities/doctor/checks/checkPackageRefs.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js +19 -0
- package/dist/src/capabilities/doctor/checks/checkPragmaVersion.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/checkShellCompletions.js +199 -0
- package/dist/src/capabilities/doctor/checks/checkShellCompletions.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/harnessInventory.js +195 -0
- package/dist/src/capabilities/doctor/checks/harnessInventory.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/index.js +27 -0
- package/dist/src/capabilities/doctor/checks/index.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/mcpCommand.js +57 -0
- package/dist/src/capabilities/doctor/checks/mcpCommand.js.map +1 -0
- package/dist/src/capabilities/doctor/checks/targetHealth.js +349 -0
- package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.render.js +164 -0
- package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.verb.js +49 -0
- package/dist/src/capabilities/doctor/doctor.verb.js.map +1 -0
- package/dist/src/capabilities/doctor/index.js +5 -0
- package/dist/src/capabilities/doctor/index.js.map +1 -0
- package/dist/src/capabilities/doctor/runChecks.js +86 -0
- package/dist/src/capabilities/doctor/runChecks.js.map +1 -0
- package/dist/src/capabilities/doctor/types.js +5 -0
- package/dist/src/capabilities/doctor/types.js.map +1 -0
- package/dist/src/capabilities/graph/index.js +19 -0
- package/dist/src/capabilities/graph/index.js.map +1 -0
- package/dist/src/capabilities/graph/inspect.render.js +76 -0
- package/dist/src/capabilities/graph/inspect.render.js.map +1 -0
- package/dist/src/capabilities/graph/inspect.verb.js +53 -0
- package/dist/src/capabilities/graph/inspect.verb.js.map +1 -0
- package/dist/src/capabilities/graph/query.render.js +73 -0
- package/dist/src/capabilities/graph/query.render.js.map +1 -0
- package/dist/src/capabilities/graph/query.verb.js +49 -0
- package/dist/src/capabilities/graph/query.verb.js.map +1 -0
- package/dist/src/capabilities/graph/runQuery.js +41 -0
- package/dist/src/capabilities/graph/runQuery.js.map +1 -0
- package/dist/src/capabilities/index.js +56 -0
- package/dist/src/capabilities/index.js.map +1 -0
- package/dist/src/capabilities/info/collectInfo.js +72 -0
- package/dist/src/capabilities/info/collectInfo.js.map +1 -0
- package/dist/src/capabilities/info/index.js +5 -0
- package/dist/src/capabilities/info/index.js.map +1 -0
- package/dist/src/capabilities/info/info.render.js +57 -0
- package/dist/src/capabilities/info/info.render.js.map +1 -0
- package/dist/src/capabilities/info/info.verb.js +42 -0
- package/dist/src/capabilities/info/info.verb.js.map +1 -0
- package/dist/src/capabilities/info/types.js +5 -0
- package/dist/src/capabilities/info/types.js.map +1 -0
- package/dist/src/capabilities/meta/complete.verb.js +43 -0
- package/dist/src/capabilities/meta/complete.verb.js.map +1 -0
- package/dist/src/capabilities/meta/index.js +13 -0
- package/dist/src/capabilities/meta/index.js.map +1 -0
- package/dist/src/capabilities/meta/mcp.verb.js +34 -0
- package/dist/src/capabilities/meta/mcp.verb.js.map +1 -0
- package/dist/src/capabilities/ontology/index.js +21 -0
- package/dist/src/capabilities/ontology/index.js.map +1 -0
- package/dist/src/capabilities/ontology/queries.js +123 -0
- package/dist/src/capabilities/ontology/queries.js.map +1 -0
- package/dist/src/capabilities/ontology/render.js +66 -0
- package/dist/src/capabilities/ontology/render.js.map +1 -0
- package/dist/src/capabilities/ontology/verbs.js +181 -0
- package/dist/src/capabilities/ontology/verbs.js.map +1 -0
- package/dist/src/capabilities/prompt/index.js +16 -0
- package/dist/src/capabilities/prompt/index.js.map +1 -0
- package/dist/src/capabilities/prompt/prompt.render.js +78 -0
- package/dist/src/capabilities/prompt/prompt.render.js.map +1 -0
- package/dist/src/capabilities/prompt/types.js +10 -0
- package/dist/src/capabilities/prompt/types.js.map +1 -0
- package/dist/src/capabilities/prompt/verbs.js +93 -0
- package/dist/src/capabilities/prompt/verbs.js.map +1 -0
- package/dist/src/capabilities/resources/index.js +10 -0
- package/dist/src/capabilities/resources/index.js.map +1 -0
- package/dist/src/capabilities/resources/provider.js +423 -0
- package/dist/src/capabilities/resources/provider.js.map +1 -0
- package/dist/src/capabilities/setup/buildPlan.js +172 -0
- package/dist/src/capabilities/setup/buildPlan.js.map +1 -0
- package/dist/src/capabilities/setup/index.js +5 -0
- package/dist/src/capabilities/setup/index.js.map +1 -0
- package/dist/src/capabilities/setup/mode.js +53 -0
- package/dist/src/capabilities/setup/mode.js.map +1 -0
- package/dist/src/capabilities/setup/operations/index.js +39 -0
- package/dist/src/capabilities/setup/operations/index.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupCompletions.js +160 -0
- package/dist/src/capabilities/setup/operations/setupCompletions.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupConfig.js +101 -0
- package/dist/src/capabilities/setup/operations/setupConfig.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupGenerator.js +390 -0
- package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js +329 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js +253 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupSkills.js +594 -0
- package/dist/src/capabilities/setup/operations/setupSkills.js.map +1 -0
- package/dist/src/capabilities/setup/plan.js +128 -0
- package/dist/src/capabilities/setup/plan.js.map +1 -0
- package/dist/src/capabilities/setup/plan.render.js +271 -0
- package/dist/src/capabilities/setup/plan.render.js.map +1 -0
- package/dist/src/capabilities/setup/setup.render.js +54 -0
- package/dist/src/capabilities/setup/setup.render.js.map +1 -0
- package/dist/src/capabilities/setup/setup.verb.js +387 -0
- package/dist/src/capabilities/setup/setup.verb.js.map +1 -0
- package/dist/src/capabilities/setup/shell.js +196 -0
- package/dist/src/capabilities/setup/shell.js.map +1 -0
- package/dist/src/capabilities/setup/targets.js +328 -0
- package/dist/src/capabilities/setup/targets.js.map +1 -0
- package/dist/src/capabilities/setup/types.js +5 -0
- package/dist/src/capabilities/setup/types.js.map +1 -0
- package/dist/src/capabilities/shared/assertExecOk.js +137 -0
- package/dist/src/capabilities/shared/assertExecOk.js.map +1 -0
- package/dist/src/capabilities/shared/index.js +27 -0
- package/dist/src/capabilities/shared/index.js.map +1 -0
- package/dist/src/capabilities/shared/packageManager.js +349 -0
- package/dist/src/capabilities/shared/packageManager.js.map +1 -0
- package/dist/src/capabilities/shared/registry.js +55 -0
- package/dist/src/capabilities/shared/registry.js.map +1 -0
- package/dist/src/capabilities/skill/discover.js +281 -0
- package/dist/src/capabilities/skill/discover.js.map +1 -0
- package/dist/src/capabilities/skill/index.js +10 -0
- package/dist/src/capabilities/skill/index.js.map +1 -0
- package/dist/src/capabilities/skill/render.js +49 -0
- package/dist/src/capabilities/skill/render.js.map +1 -0
- package/dist/src/capabilities/skill/verbs.js +83 -0
- package/dist/src/capabilities/skill/verbs.js.map +1 -0
- package/dist/src/capabilities/sources/collectStatus.js +103 -0
- package/dist/src/capabilities/sources/collectStatus.js.map +1 -0
- package/dist/src/capabilities/sources/index.js +13 -0
- package/dist/src/capabilities/sources/index.js.map +1 -0
- package/dist/src/capabilities/sources/installSkills.js +309 -0
- package/dist/src/capabilities/sources/installSkills.js.map +1 -0
- package/dist/src/capabilities/sources/runUpdate.js +460 -0
- package/dist/src/capabilities/sources/runUpdate.js.map +1 -0
- package/dist/src/capabilities/sources/status.render.js +64 -0
- package/dist/src/capabilities/sources/status.render.js.map +1 -0
- package/dist/src/capabilities/sources/status.verb.js +40 -0
- package/dist/src/capabilities/sources/status.verb.js.map +1 -0
- package/dist/src/capabilities/sources/types.js +6 -0
- package/dist/src/capabilities/sources/types.js.map +1 -0
- package/dist/src/capabilities/sources/update.render.js +34 -0
- package/dist/src/capabilities/sources/update.render.js.map +1 -0
- package/dist/src/capabilities/sources/update.verb.js +55 -0
- package/dist/src/capabilities/sources/update.verb.js.map +1 -0
- package/dist/src/capabilities/upgrade/index.js +5 -0
- package/dist/src/capabilities/upgrade/index.js.map +1 -0
- package/dist/src/capabilities/upgrade/runUpgrade.js +135 -0
- package/dist/src/capabilities/upgrade/runUpgrade.js.map +1 -0
- package/dist/src/capabilities/upgrade/types.js +5 -0
- package/dist/src/capabilities/upgrade/types.js.map +1 -0
- package/dist/src/capabilities/upgrade/upgrade.render.js +52 -0
- package/dist/src/capabilities/upgrade/upgrade.render.js.map +1 -0
- package/dist/src/capabilities/upgrade/upgrade.verb.js +52 -0
- package/dist/src/capabilities/upgrade/upgrade.verb.js.map +1 -0
- package/dist/src/capabilities/version/index.js +10 -0
- package/dist/src/capabilities/version/index.js.map +1 -0
- package/dist/src/capabilities/version/version.verb.js +36 -0
- package/dist/src/capabilities/version/version.verb.js.map +1 -0
- package/dist/src/constants.js +87 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/index.js +12 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/kernel/completion/complete.js +66 -0
- package/dist/src/kernel/completion/complete.js.map +1 -0
- package/dist/src/kernel/completion/emitScripts.js +92 -0
- package/dist/src/kernel/completion/emitScripts.js.map +1 -0
- package/dist/src/kernel/completion/entitySource.js +285 -0
- package/dist/src/kernel/completion/entitySource.js.map +1 -0
- package/dist/src/kernel/completion/index.js +14 -0
- package/dist/src/kernel/completion/index.js.map +1 -0
- package/dist/src/kernel/completion/model.js +301 -0
- package/dist/src/kernel/completion/model.js.map +1 -0
- package/dist/src/kernel/completion/parse.js +253 -0
- package/dist/src/kernel/completion/parse.js.map +1 -0
- package/dist/src/kernel/completion/rank.js +101 -0
- package/dist/src/kernel/completion/rank.js.map +1 -0
- package/dist/src/kernel/completion/resolve.js +100 -0
- package/dist/src/kernel/completion/resolve.js.map +1 -0
- package/dist/src/kernel/completion/templates/bash.js +209 -0
- package/dist/src/kernel/completion/templates/bash.js.map +1 -0
- package/dist/src/kernel/completion/templates/fish.js +214 -0
- package/dist/src/kernel/completion/templates/fish.js.map +1 -0
- package/dist/src/kernel/completion/templates/index.js +23 -0
- package/dist/src/kernel/completion/templates/index.js.map +1 -0
- package/dist/src/kernel/completion/templates/shared.js +98 -0
- package/dist/src/kernel/completion/templates/shared.js.map +1 -0
- package/dist/src/kernel/completion/templates/zsh.js +201 -0
- package/dist/src/kernel/completion/templates/zsh.js.map +1 -0
- package/dist/src/kernel/completion/types.js +13 -0
- package/dist/src/kernel/completion/types.js.map +1 -0
- package/dist/src/kernel/config/defaults.js +17 -0
- package/dist/src/kernel/config/defaults.js.map +1 -0
- package/dist/src/kernel/config/evaluateProjectConfig.js +126 -0
- package/dist/src/kernel/config/evaluateProjectConfig.js.map +1 -0
- package/dist/src/kernel/config/findProjectConfig.js +43 -0
- package/dist/src/kernel/config/findProjectConfig.js.map +1 -0
- package/dist/src/kernel/config/firstRun.js +34 -0
- package/dist/src/kernel/config/firstRun.js.map +1 -0
- package/dist/src/kernel/config/globalConfig.js +79 -0
- package/dist/src/kernel/config/globalConfig.js.map +1 -0
- package/dist/src/kernel/config/index.js +16 -0
- package/dist/src/kernel/config/index.js.map +1 -0
- package/dist/src/kernel/config/paths.js +35 -0
- package/dist/src/kernel/config/paths.js.map +1 -0
- package/dist/src/kernel/config/readConfig.js +78 -0
- package/dist/src/kernel/config/readConfig.js.map +1 -0
- package/dist/src/kernel/config/schema.js +130 -0
- package/dist/src/kernel/config/schema.js.map +1 -0
- package/dist/src/kernel/config/types.js +19 -0
- package/dist/src/kernel/config/types.js.map +1 -0
- package/dist/src/kernel/config/writeConfigField.js +59 -0
- package/dist/src/kernel/config/writeConfigField.js.map +1 -0
- package/dist/src/kernel/copy.js +43 -0
- package/dist/src/kernel/copy.js.map +1 -0
- package/dist/src/kernel/error/PragmaError.js +149 -0
- package/dist/src/kernel/error/PragmaError.js.map +1 -0
- package/dist/src/kernel/error/constants.js +40 -0
- package/dist/src/kernel/error/constants.js.map +1 -0
- package/dist/src/kernel/error/fromTaskError.js +96 -0
- package/dist/src/kernel/error/fromTaskError.js.map +1 -0
- package/dist/src/kernel/error/index.js +13 -0
- package/dist/src/kernel/error/index.js.map +1 -0
- package/dist/src/kernel/error/recovery.js +52 -0
- package/dist/src/kernel/error/recovery.js.map +1 -0
- package/dist/src/kernel/error/renderError.js +115 -0
- package/dist/src/kernel/error/renderError.js.map +1 -0
- package/dist/src/kernel/error/serialize.js +25 -0
- package/dist/src/kernel/error/serialize.js.map +1 -0
- package/dist/src/kernel/error/types.js +9 -0
- package/dist/src/kernel/error/types.js.map +1 -0
- package/dist/src/kernel/index.js +34 -0
- package/dist/src/kernel/index.js.map +1 -0
- package/dist/src/kernel/interactivity.js +68 -0
- package/dist/src/kernel/interactivity.js.map +1 -0
- package/dist/src/kernel/packs/collect.js +187 -0
- package/dist/src/kernel/packs/collect.js.map +1 -0
- package/dist/src/kernel/packs/compile.js +304 -0
- package/dist/src/kernel/packs/compile.js.map +1 -0
- package/dist/src/kernel/packs/disclosure.js +76 -0
- package/dist/src/kernel/packs/disclosure.js.map +1 -0
- package/dist/src/kernel/packs/glob.js +38 -0
- package/dist/src/kernel/packs/glob.js.map +1 -0
- package/dist/src/kernel/packs/graphql/buildLookupDocument.js +258 -0
- package/dist/src/kernel/packs/graphql/buildLookupDocument.js.map +1 -0
- package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js +157 -0
- package/dist/src/kernel/packs/graphql/fetchGraphqlLookup.js.map +1 -0
- package/dist/src/kernel/packs/graphql/index.js +20 -0
- package/dist/src/kernel/packs/graphql/index.js.map +1 -0
- package/dist/src/kernel/packs/graphql/nameMap.js +63 -0
- package/dist/src/kernel/packs/graphql/nameMap.js.map +1 -0
- package/dist/src/kernel/packs/index.js +34 -0
- package/dist/src/kernel/packs/index.js.map +1 -0
- package/dist/src/kernel/packs/iri.js +110 -0
- package/dist/src/kernel/packs/iri.js.map +1 -0
- package/dist/src/kernel/packs/renderPack.js +129 -0
- package/dist/src/kernel/packs/renderPack.js.map +1 -0
- package/dist/src/kernel/packs/resolveEntity.js +274 -0
- package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
- package/dist/src/kernel/packs/runBodies.js +140 -0
- package/dist/src/kernel/packs/runBodies.js.map +1 -0
- package/dist/src/kernel/packs/sample.js +56 -0
- package/dist/src/kernel/packs/sample.js.map +1 -0
- package/dist/src/kernel/packs/schema.js +421 -0
- package/dist/src/kernel/packs/schema.js.map +1 -0
- package/dist/src/kernel/packs/sparql/applyFilters.js +167 -0
- package/dist/src/kernel/packs/sparql/applyFilters.js.map +1 -0
- package/dist/src/kernel/packs/sparql/applySearch.js +25 -0
- package/dist/src/kernel/packs/sparql/applySearch.js.map +1 -0
- package/dist/src/kernel/packs/sparql/buildLookupQuery.js +480 -0
- package/dist/src/kernel/packs/sparql/buildLookupQuery.js.map +1 -0
- package/dist/src/kernel/packs/sparql/escape.js +21 -0
- package/dist/src/kernel/packs/sparql/escape.js.map +1 -0
- package/dist/src/kernel/packs/sparql/index.js +31 -0
- package/dist/src/kernel/packs/sparql/index.js.map +1 -0
- package/dist/src/kernel/packs/sparql/runSelect.js +101 -0
- package/dist/src/kernel/packs/sparql/runSelect.js.map +1 -0
- package/dist/src/kernel/packs/types.js +30 -0
- package/dist/src/kernel/packs/types.js.map +1 -0
- package/dist/src/kernel/packs/uniqueness.js +30 -0
- package/dist/src/kernel/packs/uniqueness.js.map +1 -0
- package/dist/src/kernel/project/cli/buildProgram.js +263 -0
- package/dist/src/kernel/project/cli/buildProgram.js.map +1 -0
- package/dist/src/kernel/project/cli/constants.js +27 -0
- package/dist/src/kernel/project/cli/constants.js.map +1 -0
- package/dist/src/kernel/project/cli/dispatch.js +420 -0
- package/dist/src/kernel/project/cli/dispatch.js.map +1 -0
- package/dist/src/kernel/project/cli/exitCodes.js +66 -0
- package/dist/src/kernel/project/cli/exitCodes.js.map +1 -0
- package/dist/src/kernel/project/cli/globalFlags.js +219 -0
- package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
- package/dist/src/kernel/project/cli/helpFormat.js +58 -0
- package/dist/src/kernel/project/cli/helpFormat.js.map +1 -0
- package/dist/src/kernel/project/cli/index.js +14 -0
- package/dist/src/kernel/project/cli/index.js.map +1 -0
- package/dist/src/kernel/project/cli/rootHelp.js +227 -0
- package/dist/src/kernel/project/cli/rootHelp.js.map +1 -0
- package/dist/src/kernel/project/cli/suggest.js +75 -0
- package/dist/src/kernel/project/cli/suggest.js.map +1 -0
- package/dist/src/kernel/project/cli/suggestNames.js +96 -0
- package/dist/src/kernel/project/cli/suggestNames.js.map +1 -0
- package/dist/src/kernel/project/cli/verbHelp.js +131 -0
- package/dist/src/kernel/project/cli/verbHelp.js.map +1 -0
- package/dist/src/kernel/project/mcp/buildServer.js +67 -0
- package/dist/src/kernel/project/mcp/buildServer.js.map +1 -0
- package/dist/src/kernel/project/mcp/envelope.js +37 -0
- package/dist/src/kernel/project/mcp/envelope.js.map +1 -0
- package/dist/src/kernel/project/mcp/index.js +8 -0
- package/dist/src/kernel/project/mcp/index.js.map +1 -0
- package/dist/src/kernel/project/mcp/instructions.js +44 -0
- package/dist/src/kernel/project/mcp/instructions.js.map +1 -0
- package/dist/src/kernel/project/mcp/mcpError.js +42 -0
- package/dist/src/kernel/project/mcp/mcpError.js.map +1 -0
- package/dist/src/kernel/project/mcp/prompts/index.js +36 -0
- package/dist/src/kernel/project/mcp/prompts/index.js.map +1 -0
- package/dist/src/kernel/project/mcp/prompts/provider.js +98 -0
- package/dist/src/kernel/project/mcp/prompts/provider.js.map +1 -0
- package/dist/src/kernel/project/mcp/prompts/source.js +154 -0
- package/dist/src/kernel/project/mcp/prompts/source.js.map +1 -0
- package/dist/src/kernel/project/mcp/registerVerb.js +315 -0
- package/dist/src/kernel/project/mcp/registerVerb.js.map +1 -0
- package/dist/src/kernel/project/mcp/serve.js +35 -0
- package/dist/src/kernel/project/mcp/serve.js.map +1 -0
- package/dist/src/kernel/render/compactUri.js +24 -0
- package/dist/src/kernel/render/compactUri.js.map +1 -0
- package/dist/src/kernel/render/contracts.js +10 -0
- package/dist/src/kernel/render/contracts.js.map +1 -0
- package/dist/src/kernel/render/disclosure.js +34 -0
- package/dist/src/kernel/render/disclosure.js.map +1 -0
- package/dist/src/kernel/render/envelope.js +30 -0
- package/dist/src/kernel/render/envelope.js.map +1 -0
- package/dist/src/kernel/render/formatters.js +27 -0
- package/dist/src/kernel/render/formatters.js.map +1 -0
- package/dist/src/kernel/render/index.js +15 -0
- package/dist/src/kernel/render/index.js.map +1 -0
- package/dist/src/kernel/render/prefixes.js +46 -0
- package/dist/src/kernel/render/prefixes.js.map +1 -0
- package/dist/src/kernel/render/renderers.js +468 -0
- package/dist/src/kernel/render/renderers.js.map +1 -0
- package/dist/src/kernel/render/style.js +105 -0
- package/dist/src/kernel/render/style.js.map +1 -0
- package/dist/src/kernel/render/turtle.js +194 -0
- package/dist/src/kernel/render/turtle.js.map +1 -0
- package/dist/src/kernel/render/vocabulary.js +174 -0
- package/dist/src/kernel/render/vocabulary.js.map +1 -0
- package/dist/src/kernel/render/writeStdout.js +43 -0
- package/dist/src/kernel/render/writeStdout.js.map +1 -0
- package/dist/src/kernel/runtime/boot.js +49 -0
- package/dist/src/kernel/runtime/boot.js.map +1 -0
- package/dist/src/kernel/runtime/facade.js +39 -0
- package/dist/src/kernel/runtime/facade.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/build.js +122 -0
- package/dist/src/kernel/runtime/graphpack/build.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/buildIndex.js +303 -0
- package/dist/src/kernel/runtime/graphpack/buildIndex.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js +6 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js +4 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.index.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js +4 -0
- package/dist/src/kernel/runtime/graphpack/embedded/pack.stories.generated.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/embedded.js +82 -0
- package/dist/src/kernel/runtime/graphpack/embedded.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/hash.js +38 -0
- package/dist/src/kernel/runtime/graphpack/hash.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/index.js +11 -0
- package/dist/src/kernel/runtime/graphpack/index.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/manifest.js +145 -0
- package/dist/src/kernel/runtime/graphpack/manifest.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/read.js +92 -0
- package/dist/src/kernel/runtime/graphpack/read.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/schemas.js +70 -0
- package/dist/src/kernel/runtime/graphpack/schemas.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/stories.js +68 -0
- package/dist/src/kernel/runtime/graphpack/stories.js.map +1 -0
- package/dist/src/kernel/runtime/graphpack/types.js +55 -0
- package/dist/src/kernel/runtime/graphpack/types.js.map +1 -0
- package/dist/src/kernel/runtime/index.js +8 -0
- package/dist/src/kernel/runtime/index.js.map +1 -0
- package/dist/src/kernel/runtime/loadSession.js +34 -0
- package/dist/src/kernel/runtime/loadSession.js.map +1 -0
- package/dist/src/kernel/runtime/paths.js +78 -0
- package/dist/src/kernel/runtime/paths.js.map +1 -0
- package/dist/src/kernel/runtime/probe.js +37 -0
- package/dist/src/kernel/runtime/probe.js.map +1 -0
- package/dist/src/kernel/runtime/readEntity.js +363 -0
- package/dist/src/kernel/runtime/readEntity.js.map +1 -0
- package/dist/src/kernel/runtime/refs/gitOps.js +65 -0
- package/dist/src/kernel/runtime/refs/gitOps.js.map +1 -0
- package/dist/src/kernel/runtime/refs/index.js +29 -0
- package/dist/src/kernel/runtime/refs/index.js.map +1 -0
- package/dist/src/kernel/runtime/refs/parseRef.js +70 -0
- package/dist/src/kernel/runtime/refs/parseRef.js.map +1 -0
- package/dist/src/kernel/runtime/refs/resolve.js +332 -0
- package/dist/src/kernel/runtime/refs/resolve.js.map +1 -0
- package/dist/src/kernel/runtime/resolveSources.js +62 -0
- package/dist/src/kernel/runtime/resolveSources.js.map +1 -0
- package/dist/src/kernel/runtime/store.js +75 -0
- package/dist/src/kernel/runtime/store.js.map +1 -0
- package/dist/src/kernel/runtime/storeReadiness.js +51 -0
- package/dist/src/kernel/runtime/storeReadiness.js.map +1 -0
- package/dist/src/kernel/runtime/types.js +11 -0
- package/dist/src/kernel/runtime/types.js.map +1 -0
- package/dist/src/kernel/spec/asVerb.js +21 -0
- package/dist/src/kernel/spec/asVerb.js.map +1 -0
- package/dist/src/kernel/spec/emitReference.js +578 -0
- package/dist/src/kernel/spec/emitReference.js.map +1 -0
- package/dist/src/kernel/spec/emitSurface.js +202 -0
- package/dist/src/kernel/spec/emitSurface.js.map +1 -0
- package/dist/src/kernel/spec/index.js +11 -0
- package/dist/src/kernel/spec/index.js.map +1 -0
- package/dist/src/kernel/spec/surfaceConformance.js +103 -0
- package/dist/src/kernel/spec/surfaceConformance.js.map +1 -0
- package/dist/src/kernel/spec/types.js +14 -0
- package/dist/src/kernel/spec/types.js.map +1 -0
- package/dist/src/kernel/spec/validate.js +110 -0
- package/dist/src/kernel/spec/validate.js.map +1 -0
- package/dist/src/kernel/vocabulary.js +97 -0
- package/dist/src/kernel/vocabulary.js.map +1 -0
- package/dist/src/types.js +11 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +22 -23
- package/pragma.conf.ts +486 -90
- package/src/bin.ts +274 -82
- package/src/capabilities/block.parity.test.ts +29 -12
- package/src/capabilities/block.shipped.exec.test.ts +282 -0
- package/src/capabilities/block.tierRank.exec.test.ts +300 -0
- package/src/capabilities/capabilities/capabilities.render.ts +1 -1
- package/src/capabilities/capabilities/capabilities.verb.ts +1 -1
- package/src/capabilities/capabilities/catalog.ts +3 -3
- package/src/capabilities/capabilities/hints.ts +32 -7
- package/src/capabilities/capabilities/index.ts +1 -1
- package/src/capabilities/colophon/collectColophon.ts +35 -24
- package/src/capabilities/colophon/colophon.render.ts +24 -1
- package/src/capabilities/colophon/colophon.test.ts +42 -21
- package/src/capabilities/colophon/colophon.verb.ts +4 -4
- package/src/capabilities/config/collectConfigShow.test.ts +1 -0
- package/src/capabilities/config/collectConfigShow.ts +3 -3
- package/src/capabilities/config/field.render.ts +4 -5
- package/src/capabilities/config/fields.ts +17 -10
- package/src/capabilities/config/get.verb.ts +70 -0
- package/src/capabilities/config/getUnset.test.ts +264 -0
- package/src/capabilities/config/index.ts +5 -1
- package/src/capabilities/config/runField.ts +40 -22
- package/src/capabilities/config/runGet.ts +34 -0
- package/src/capabilities/config/runSet.ts +35 -9
- package/src/capabilities/config/set.test.ts +48 -14
- package/src/capabilities/config/set.verb.ts +8 -7
- package/src/capabilities/config/show.render.ts +1 -1
- package/src/capabilities/config/show.verb.ts +9 -6
- package/src/capabilities/config/types.ts +18 -4
- package/src/capabilities/config/unset.verb.ts +58 -0
- package/src/capabilities/create/byteEquality.subprocess.test.ts +2 -3
- package/src/capabilities/create/byteEquality.test.ts +25 -11
- package/src/capabilities/create/cliProjection.ts +227 -0
- package/src/capabilities/create/constants.ts +36 -61
- package/src/capabilities/create/create.mcp.test.ts +89 -5
- package/src/capabilities/create/create.render.ts +71 -7
- package/src/capabilities/create/create.test.ts +433 -219
- package/src/capabilities/create/create.verb.ts +297 -328
- package/src/capabilities/create/createGrammar.test.ts +865 -0
- package/src/capabilities/create/createHelp.ts +71 -0
- package/src/capabilities/create/createSurface.generated.ts +400 -0
- package/src/capabilities/create/crossCli.subprocess.test.ts +745 -0
- package/src/capabilities/create/cwdJail.test.ts +24 -5
- package/src/capabilities/create/generatorToVerbSpec.test.ts +186 -0
- package/src/capabilities/create/generatorToVerbSpec.ts +13 -11
- package/src/capabilities/create/index.ts +7 -4
- package/src/capabilities/create/messages.ts +18 -0
- package/src/capabilities/create/mount.ts +391 -0
- package/src/capabilities/create/pathJail.test.ts +90 -0
- package/src/capabilities/create/pathJail.ts +8 -5
- package/src/capabilities/create/pickGenerator.ts +23 -35
- package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
- package/src/capabilities/create/types.ts +20 -0
- package/src/capabilities/distribution.parity.test.ts +4 -0
- package/src/capabilities/distribution.test.ts +3 -1
- package/src/capabilities/distribution.ts +10 -15
- package/src/capabilities/doctor/checks/checkKeStore.ts +7 -5
- package/src/capabilities/doctor/checks/checkPackageRefs.ts +75 -8
- package/src/capabilities/doctor/checks/checkPragmaVersion.ts +2 -2
- package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +76 -29
- package/src/capabilities/doctor/checks/checkShellCompletions.ts +63 -17
- package/src/capabilities/doctor/checks/harnessInventory.test.ts +219 -0
- package/src/capabilities/doctor/checks/harnessInventory.ts +298 -0
- package/src/capabilities/doctor/checks/index.ts +27 -0
- package/src/capabilities/doctor/checks/mcpCommand.test.ts +100 -0
- package/src/capabilities/doctor/checks/mcpCommand.ts +69 -0
- package/src/capabilities/doctor/checks/targetHealth.ts +444 -0
- package/src/capabilities/doctor/doctor.render.test.ts +125 -38
- package/src/capabilities/doctor/doctor.render.ts +74 -74
- package/src/capabilities/doctor/doctor.test.ts +338 -37
- package/src/capabilities/doctor/doctor.verb.ts +8 -3
- package/src/capabilities/doctor/runChecks.ts +65 -63
- package/src/capabilities/doctor/types.ts +22 -15
- package/src/capabilities/emptyRecovery.test.ts +21 -8
- package/src/capabilities/graph/examples.exec.test.ts +107 -0
- package/src/capabilities/graph/index.ts +1 -1
- package/src/capabilities/graph/inspect.render.ts +70 -22
- package/src/capabilities/graph/inspect.test.ts +260 -5
- package/src/capabilities/graph/inspect.verb.ts +18 -6
- package/src/capabilities/graph/query.render.ts +15 -3
- package/src/capabilities/graph/query.verb.ts +3 -3
- package/src/capabilities/graph/runQuery.ts +2 -3
- package/src/capabilities/index.ts +3 -1
- package/src/capabilities/info/collectInfo.ts +13 -5
- package/src/capabilities/info/info.render.ts +7 -3
- package/src/capabilities/info/info.test.ts +37 -1
- package/src/capabilities/info/info.verb.ts +1 -1
- package/src/capabilities/info/types.ts +10 -2
- package/src/capabilities/lazy.test.ts +32 -0
- package/src/capabilities/meta/complete.verb.ts +1 -1
- package/src/capabilities/meta/index.ts +1 -1
- package/src/capabilities/meta/mcp.verb.ts +10 -8
- package/src/capabilities/ontology/index.ts +15 -11
- package/src/capabilities/ontology/ontology.test.ts +6 -55
- package/src/capabilities/ontology/queries.ts +2 -2
- package/src/capabilities/ontology/render.ts +3 -4
- package/src/capabilities/ontology/verbs.ts +27 -68
- package/src/capabilities/prompt/index.ts +2 -2
- package/src/capabilities/prompt/prompt.render.ts +6 -2
- package/src/capabilities/prompt/types.ts +1 -1
- package/src/capabilities/prompt/verbs.ts +4 -5
- package/src/capabilities/reference.test.ts +63 -0
- package/src/capabilities/renderVocabularySync.test.ts +82 -0
- package/src/capabilities/resources/provider.ts +342 -85
- package/src/capabilities/resources/resources.test.ts +355 -59
- package/src/capabilities/scopeTypeSync.test.ts +29 -15
- package/src/capabilities/setup/buildPlan.ts +240 -0
- package/src/capabilities/setup/index.ts +7 -7
- package/src/capabilities/setup/mode.ts +74 -0
- package/src/capabilities/setup/operations/index.ts +79 -0
- package/src/capabilities/setup/operations/setupCompletions.ts +97 -24
- package/src/capabilities/setup/operations/setupConfig.ts +124 -0
- package/src/capabilities/setup/operations/setupGenerator.ts +478 -334
- package/src/capabilities/setup/operations/setupLsp.ts +420 -67
- package/src/capabilities/setup/operations/setupMcp.ts +238 -127
- package/src/capabilities/setup/operations/setupSkills.ts +667 -105
- package/src/capabilities/setup/plan.render.ts +336 -0
- package/src/capabilities/setup/plan.ts +241 -0
- package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
- package/src/capabilities/setup/setup.render.test.ts +297 -75
- package/src/capabilities/setup/setup.render.ts +45 -77
- package/src/capabilities/setup/setup.test.ts +1819 -225
- package/src/capabilities/setup/setup.verb.ts +288 -78
- package/src/capabilities/setup/shell.test.ts +86 -0
- package/src/capabilities/setup/shell.ts +137 -11
- package/src/capabilities/setup/targets.ts +435 -0
- package/src/capabilities/setup/types.ts +23 -70
- package/src/capabilities/shared/assertExecOk.ts +68 -10
- package/src/capabilities/shared/index.ts +43 -0
- package/src/capabilities/shared/packageManager.test.ts +470 -0
- package/src/capabilities/shared/packageManager.ts +425 -34
- package/src/capabilities/skill/bundledSkills.test.ts +347 -0
- package/src/capabilities/skill/discover.ts +131 -10
- package/src/capabilities/skill/index.ts +1 -1
- package/src/capabilities/skill/render.ts +10 -9
- package/src/capabilities/skill/skill.test.ts +22 -7
- package/src/capabilities/skill/verbs.ts +3 -4
- package/src/capabilities/sources/collectStatus.ts +7 -2
- package/src/capabilities/sources/index.ts +1 -1
- package/src/capabilities/sources/installSkills.ts +265 -10
- package/src/capabilities/sources/runUpdate.ts +131 -23
- package/src/capabilities/sources/sources.test.ts +382 -2
- package/src/capabilities/sources/status.render.ts +1 -1
- package/src/capabilities/sources/status.verb.ts +1 -1
- package/src/capabilities/sources/update.render.ts +1 -1
- package/src/capabilities/sources/update.verb.ts +4 -4
- package/src/capabilities/surface.test.ts +136 -19
- package/src/capabilities/upgrade/runUpgrade.ts +53 -14
- package/src/capabilities/upgrade/types.ts +10 -2
- package/src/capabilities/upgrade/upgrade.render.ts +13 -7
- package/src/capabilities/upgrade/upgrade.test.ts +75 -3
- package/src/capabilities/upgrade/upgrade.verb.ts +1 -1
- package/src/capabilities/version/index.ts +12 -0
- package/src/capabilities/version/version.test.ts +66 -0
- package/src/capabilities/version/version.verb.ts +39 -0
- package/src/constants.ts +36 -1
- package/src/identity.test.ts +57 -29
- package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +15 -13
- package/src/kernel/completion/complete.test.ts +12 -2
- package/src/kernel/completion/complete.ts +1 -1
- package/src/kernel/completion/emitScripts.ts +1 -1
- package/src/kernel/completion/entitySource.test.ts +16 -3
- package/src/kernel/completion/entitySource.ts +21 -8
- package/src/kernel/completion/model.test.ts +164 -12
- package/src/kernel/completion/model.ts +94 -14
- package/src/kernel/completion/parse.test.ts +4 -7
- package/src/kernel/completion/parse.ts +15 -0
- package/src/kernel/completion/resolve.test.ts +0 -1
- package/src/kernel/completion/safety.test.ts +50 -35
- package/src/kernel/completion/shellDrive.test.ts +28 -9
- package/src/kernel/completion/templates/bash.ts +7 -2
- package/src/kernel/completion/templates/index.ts +23 -0
- package/src/kernel/completion/types.ts +7 -0
- package/src/kernel/config/defaults.test.ts +27 -3
- package/src/kernel/config/defaults.ts +4 -3
- package/src/kernel/config/evaluateProjectConfig.ts +31 -8
- package/src/kernel/config/firstRun.test.ts +44 -38
- package/src/kernel/config/firstRun.ts +24 -88
- package/src/kernel/config/index.ts +1 -1
- package/src/kernel/config/readConfig.test.ts +6 -3
- package/src/kernel/config/readConfig.ts +1 -1
- package/src/kernel/config/schema.ts +3 -1
- package/src/kernel/config/types.ts +3 -1
- package/src/kernel/copy.test.ts +34 -4
- package/src/kernel/copy.ts +54 -0
- package/src/kernel/error/PragmaError.test.ts +5 -2
- package/src/kernel/error/PragmaError.ts +4 -2
- package/src/kernel/error/constants.ts +7 -5
- package/src/kernel/error/fromTaskError.ts +28 -6
- package/src/kernel/error/recovery.ts +14 -0
- package/src/kernel/error/renderError.ts +42 -1
- package/src/kernel/error/types.ts +21 -1
- package/src/kernel/index.ts +35 -0
- package/src/kernel/interactivity.test.ts +76 -0
- package/src/kernel/interactivity.ts +69 -0
- package/src/kernel/packs/collect.ts +12 -16
- package/src/kernel/packs/compile.test.ts +222 -1
- package/src/kernel/packs/compile.ts +93 -3
- package/src/kernel/packs/disclosure.ts +2 -2
- package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
- package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +3 -4
- package/src/kernel/packs/graphql/index.ts +20 -0
- package/src/kernel/packs/index.ts +40 -0
- package/src/kernel/packs/iri.test.ts +73 -0
- package/src/kernel/packs/iri.ts +66 -14
- package/src/kernel/packs/renderPack.ts +25 -6
- package/src/kernel/packs/resolveEntity.test.ts +274 -0
- package/src/kernel/packs/resolveEntity.ts +200 -42
- package/src/kernel/packs/runBodies.ts +86 -22
- package/src/kernel/packs/sample.ts +1 -1
- package/src/kernel/packs/schema.ts +78 -5
- package/src/kernel/packs/sparql/applyFilters.ts +136 -16
- package/src/kernel/packs/sparql/buildLookupQuery.test.ts +290 -0
- package/src/kernel/packs/sparql/buildLookupQuery.ts +367 -17
- package/src/kernel/packs/sparql/index.ts +37 -0
- package/src/kernel/packs/sparql/runSelect.test.ts +1 -1
- package/src/kernel/packs/sparql/runSelect.ts +3 -4
- package/src/kernel/packs/toolDescription.test.ts +77 -4
- package/src/kernel/packs/types.ts +136 -0
- package/src/kernel/packs/uniqueness.ts +1 -1
- package/src/kernel/project/cli/buildProgram.test.ts +218 -12
- package/src/kernel/project/cli/buildProgram.ts +84 -18
- package/src/kernel/project/cli/constants.ts +34 -0
- package/src/kernel/project/cli/dispatch.test.ts +160 -2
- package/src/kernel/project/cli/dispatch.ts +226 -45
- package/src/kernel/project/cli/exitCodes.ts +1 -1
- package/src/kernel/project/cli/globalFlags.test.ts +117 -1
- package/src/kernel/project/cli/globalFlags.ts +134 -31
- package/src/kernel/project/cli/helpFormat.ts +14 -2
- package/src/kernel/project/cli/rootHelp.ts +74 -12
- package/src/kernel/project/cli/suggest.test.ts +33 -1
- package/src/kernel/project/cli/suggest.ts +25 -1
- package/src/kernel/project/cli/verbHelp.test.ts +30 -0
- package/src/kernel/project/cli/verbHelp.ts +23 -7
- package/src/kernel/project/mcp/buildServer.ts +7 -4
- package/src/kernel/project/mcp/envelope.ts +2 -2
- package/src/kernel/project/mcp/instructions.ts +2 -2
- package/src/kernel/project/mcp/mcpError.ts +1 -1
- package/src/kernel/project/mcp/parity.test.ts +5 -2
- package/src/kernel/project/mcp/prompts/index.ts +37 -0
- package/src/kernel/project/mcp/prompts/source.ts +2 -2
- package/src/kernel/project/mcp/registerVerb.ts +55 -10
- package/src/kernel/project/mcp/serve.ts +2 -2
- package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
- package/src/kernel/render/contracts.ts +21 -0
- package/src/kernel/render/envelope.ts +2 -3
- package/src/kernel/render/formatters.ts +1 -1
- package/src/kernel/render/renderers.test.ts +243 -6
- package/src/kernel/render/renderers.ts +222 -20
- package/src/kernel/render/style.test.ts +75 -24
- package/src/kernel/render/style.ts +59 -6
- package/src/kernel/render/turtle.ts +222 -0
- package/src/kernel/render/vocabulary.ts +276 -0
- package/src/kernel/runtime/graphpack/buildIndex.ts +1 -1
- package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +3 -3
- package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +1 -1
- package/src/kernel/runtime/graphpack/embedded.ts +3 -3
- package/src/kernel/runtime/graphpack/manifest.ts +1 -1
- package/src/kernel/runtime/graphpack/read.ts +1 -2
- package/src/kernel/runtime/loadSession.ts +1 -1
- package/src/kernel/runtime/probe.ts +6 -6
- package/src/kernel/runtime/readEntity.ts +472 -28
- package/src/kernel/runtime/refs/index.ts +39 -0
- package/src/kernel/runtime/refs/parseRef.ts +2 -2
- package/src/kernel/runtime/refs/resolve.ts +4 -4
- package/src/kernel/runtime/storeReadiness.ts +1 -2
- package/src/kernel/runtime/types.ts +15 -1
- package/src/kernel/runtime/wasmEmbed.test.ts +37 -39
- package/src/kernel/spec/emitReference.ts +105 -30
- package/src/kernel/spec/emitSurface.ts +48 -6
- package/src/kernel/spec/surfaceConformance.test.ts +4 -2
- package/src/kernel/spec/types.ts +277 -4
- package/src/testing/PARITY_GAPS.ts +9 -3
- package/src/testing/behavioral/docExamples.test.ts +16 -0
- package/src/testing/behavioral/errorMatrix.mcp.test.ts +112 -9
- package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
- package/src/testing/behavioral/journeys.cli.test.ts +1 -1
- package/src/testing/behavioral/journeys.defaultPack.test.ts +7 -7
- package/src/testing/behavioral/journeys.firstInstall.test.ts +7 -2
- package/src/testing/behavioral/journeys.implementation.test.ts +206 -0
- package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +2 -2
- package/src/testing/behavioral/journeys.packageStories.test.ts +10 -7
- package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
- package/src/testing/behavioral/mcpSurface.test.ts +1 -1
- package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
- package/src/testing/eval/__snapshots__/eval.test.ts.snap +26 -1
- package/src/testing/eval/cases/effectful.ts +3 -2
- package/src/testing/eval/cases/readNouns.ts +245 -9
- package/src/testing/fixtures/blockGraph.ts +104 -10
- package/src/testing/fixtures/graph/canonical.ts +182 -13
- package/src/testing/fixtures/graph/defaultPack.ts +1 -1
- package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
- package/src/testing/helpers/projectMcp.ts +32 -6
- package/src/testing/helpers/runCli.ts +35 -18
- package/src/testing/perf/budgets.test.ts +20 -9
- package/src/testing/perf/budgets.ts +58 -9
- package/src/testing/perf/codegen.test.ts +126 -0
- package/src/testing/perf/globalSetup.test.ts +286 -0
- package/src/testing/perf/globalSetup.ts +505 -23
- package/src/testing/perf/measure.test.ts +38 -0
- package/src/testing/perf/measure.ts +23 -4
- package/src/testing/setupXdgIsolation.ts +81 -21
- package/src/testing/tempRoot.globalSetup.ts +122 -0
- package/dist/pragma +0 -0
- package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -189
- package/src/capabilities/create/templates.embedded.generated.ts +0 -28
- package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -42
- package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
- package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -68
- package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -61
- package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
- package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
- package/src/capabilities/shared/bands.ts +0 -16
- package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
|
@@ -11,7 +11,7 @@ import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
|
11
11
|
import { RECOVERY_CLI_PREFIX } from "../../constants.js";
|
|
12
12
|
import { buildFixtureRuntime } from "../../testing/helpers/packRuntime.js";
|
|
13
13
|
import type { PragmaRuntime } from "../runtime/types.js";
|
|
14
|
-
import { compilePack } from "./compile.js";
|
|
14
|
+
import { compileListable, compilePack, compileStoryModule } from "./compile.js";
|
|
15
15
|
import type { LookupOutput } from "./resolveEntity.js";
|
|
16
16
|
import { parsePackDefinition } from "./schema.js";
|
|
17
17
|
import type { PackDefinition, PackRow } from "./types.js";
|
|
@@ -383,3 +383,224 @@ describe("pack compiler — SPARQL fetch path (PROTECTED)", () => {
|
|
|
383
383
|
expect(data.totalCount).toBe(2);
|
|
384
384
|
});
|
|
385
385
|
});
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* The listing a story contributes to the MCP resource surface is DERIVED from
|
|
389
|
+
* the types its lookup already names — the story author writes the type set
|
|
390
|
+
* once, for the name resolve, and the resource listing reads that same
|
|
391
|
+
* declaration. Nothing to keep in sync because there is nothing written twice.
|
|
392
|
+
*/
|
|
393
|
+
describe("declared listing (derived from the lookup's types)", () => {
|
|
394
|
+
it("derives one collection per declared type, unweighted types at 1", () => {
|
|
395
|
+
expect(
|
|
396
|
+
compileListable({
|
|
397
|
+
noun: "gadget",
|
|
398
|
+
lookup: { by: "ex:name", types: ["ex:Widget", "ex:Part"] },
|
|
399
|
+
}),
|
|
400
|
+
).toEqual({
|
|
401
|
+
sources: [
|
|
402
|
+
{ type: "ex:Widget", as: "collection", weight: 1 },
|
|
403
|
+
{ type: "ex:Part", as: "collection", weight: 1 },
|
|
404
|
+
],
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
it("carries a declared weight onto the type it names", () => {
|
|
409
|
+
const listable = compileListable({
|
|
410
|
+
noun: "gadget",
|
|
411
|
+
lookup: {
|
|
412
|
+
by: "ex:name",
|
|
413
|
+
types: ["ex:Widget", "ex:Part"],
|
|
414
|
+
weights: { "ex:Part": 0.6 },
|
|
415
|
+
},
|
|
416
|
+
});
|
|
417
|
+
expect(listable?.sources.map((s) => s.weight)).toEqual([1, 0.6]);
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
it("declares nothing for a list-only noun (it addresses no class)", () => {
|
|
421
|
+
expect(
|
|
422
|
+
compileListable({ noun: "gadget", list: { query: "", columns: [] } }),
|
|
423
|
+
).toBeUndefined();
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
it("carries the listing onto the compiled module, beside its verbs", () => {
|
|
427
|
+
const module = compileStoryModule(
|
|
428
|
+
{ noun: "gadget", lookup: { by: "ex:name", type: "ex:Widget" } },
|
|
429
|
+
distributionSource("t"),
|
|
430
|
+
PREFIXES,
|
|
431
|
+
);
|
|
432
|
+
expect(module.story).toBe(true);
|
|
433
|
+
expect(module.mcpListable?.sources).toEqual([
|
|
434
|
+
{ type: "ex:Widget", as: "collection", weight: 1 },
|
|
435
|
+
]);
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
describe("weights validation (a weight that can never apply is rejected)", () => {
|
|
440
|
+
it("accepts a weight naming a type the lookup addresses", () => {
|
|
441
|
+
const definition = {
|
|
442
|
+
noun: "gadget",
|
|
443
|
+
lookup: {
|
|
444
|
+
by: "ex:name",
|
|
445
|
+
types: ["ex:Widget", "ex:Part"],
|
|
446
|
+
weights: { "ex:Part": 0.6 },
|
|
447
|
+
},
|
|
448
|
+
};
|
|
449
|
+
expect(parsePackDefinition(definition, "t")).toEqual(definition);
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
it("REJECTS a weight naming a type the lookup does not address", () => {
|
|
453
|
+
// A silent no-op is how a weight that never applied survives review: the
|
|
454
|
+
// type gets renamed, the weight stays pointed at the old name, and nothing
|
|
455
|
+
// says so — the ranking simply stops changing.
|
|
456
|
+
expect(() =>
|
|
457
|
+
parsePackDefinition(
|
|
458
|
+
{
|
|
459
|
+
noun: "gadget",
|
|
460
|
+
lookup: {
|
|
461
|
+
by: "ex:name",
|
|
462
|
+
types: ["ex:Widget"],
|
|
463
|
+
weights: { "ex:Gone": 0.6 },
|
|
464
|
+
},
|
|
465
|
+
},
|
|
466
|
+
"t",
|
|
467
|
+
),
|
|
468
|
+
).toThrow(/ex:Gone/);
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
it("REJECTS a weight outside 0–1", () => {
|
|
472
|
+
expect(() =>
|
|
473
|
+
parsePackDefinition(
|
|
474
|
+
{
|
|
475
|
+
noun: "gadget",
|
|
476
|
+
lookup: {
|
|
477
|
+
by: "ex:name",
|
|
478
|
+
type: "ex:Widget",
|
|
479
|
+
weights: { "ex:Widget": 2 },
|
|
480
|
+
},
|
|
481
|
+
},
|
|
482
|
+
"t",
|
|
483
|
+
),
|
|
484
|
+
).toThrow();
|
|
485
|
+
});
|
|
486
|
+
});
|
|
487
|
+
|
|
488
|
+
describe("nameFallback validation (a derived name needs a class to vouch for it)", () => {
|
|
489
|
+
it("accepts the fallback beside a class constraint", () => {
|
|
490
|
+
const definition = {
|
|
491
|
+
noun: "gadget",
|
|
492
|
+
lookup: { by: "ex:name", nameFallback: "iri", type: "ex:Widget" },
|
|
493
|
+
};
|
|
494
|
+
expect(parsePackDefinition(definition, "t")).toEqual(definition);
|
|
495
|
+
});
|
|
496
|
+
|
|
497
|
+
it("REJECTS the fallback with no class constraint", () => {
|
|
498
|
+
// Without one there is no triple bounding `?uri`, so the derived-name
|
|
499
|
+
// population would be scanned over the whole graph — and a derived name is
|
|
500
|
+
// only as trustworthy as the class vouching for the entity it came from.
|
|
501
|
+
expect(() =>
|
|
502
|
+
parsePackDefinition(
|
|
503
|
+
{ noun: "gadget", lookup: { by: "ex:name", nameFallback: "iri" } },
|
|
504
|
+
"t",
|
|
505
|
+
),
|
|
506
|
+
).toThrow(/nameFallback/);
|
|
507
|
+
});
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
describe("filter vocabulary validation (where a value-free filter's values live)", () => {
|
|
511
|
+
const listShape = {
|
|
512
|
+
query: "SELECT ?uri ?kind WHERE { ?uri a ex:Widget ; ex:kind ?kind }",
|
|
513
|
+
columns: [{ field: "uri" }],
|
|
514
|
+
};
|
|
515
|
+
|
|
516
|
+
it("accepts a vocabulary SELECT on a value-free filter", () => {
|
|
517
|
+
const definition = {
|
|
518
|
+
noun: "widget",
|
|
519
|
+
list: {
|
|
520
|
+
...listShape,
|
|
521
|
+
filters: [
|
|
522
|
+
{
|
|
523
|
+
param: "kind",
|
|
524
|
+
variable: "kind",
|
|
525
|
+
vocabulary: { query: "SELECT ?kind WHERE { ?k a ex:Kind }" },
|
|
526
|
+
},
|
|
527
|
+
],
|
|
528
|
+
},
|
|
529
|
+
};
|
|
530
|
+
expect(parsePackDefinition(definition, "t")).toEqual(definition);
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
it("REJECTS a vocabulary beside a declared `values` set", () => {
|
|
534
|
+
// A declared set IS the vocabulary — the filter projects it as an enum and
|
|
535
|
+
// canonicalizes against it. A second, graph-read one alongside is a silent
|
|
536
|
+
// no-op at best and a disagreement at worst.
|
|
537
|
+
expect(() =>
|
|
538
|
+
parsePackDefinition(
|
|
539
|
+
{
|
|
540
|
+
noun: "widget",
|
|
541
|
+
list: {
|
|
542
|
+
...listShape,
|
|
543
|
+
filters: [
|
|
544
|
+
{
|
|
545
|
+
param: "kind",
|
|
546
|
+
variable: "kind",
|
|
547
|
+
values: ["a", "b"],
|
|
548
|
+
vocabulary: { query: "SELECT ?kind WHERE { ?k a ex:Kind }" },
|
|
549
|
+
},
|
|
550
|
+
],
|
|
551
|
+
},
|
|
552
|
+
},
|
|
553
|
+
"t",
|
|
554
|
+
),
|
|
555
|
+
).toThrow(/mutually exclusive/);
|
|
556
|
+
});
|
|
557
|
+
|
|
558
|
+
it("REJECTS a vocabulary query that is not a SELECT", () => {
|
|
559
|
+
expect(() =>
|
|
560
|
+
parsePackDefinition(
|
|
561
|
+
{
|
|
562
|
+
noun: "widget",
|
|
563
|
+
list: {
|
|
564
|
+
...listShape,
|
|
565
|
+
filters: [
|
|
566
|
+
{
|
|
567
|
+
param: "kind",
|
|
568
|
+
variable: "kind",
|
|
569
|
+
vocabulary: { query: "ASK { ?k a ex:Kind }" },
|
|
570
|
+
},
|
|
571
|
+
],
|
|
572
|
+
},
|
|
573
|
+
},
|
|
574
|
+
"t",
|
|
575
|
+
),
|
|
576
|
+
).toThrow(/SELECT/);
|
|
577
|
+
});
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
describe("compileListable — absolute IRIs reach the prefixed contract", () => {
|
|
581
|
+
it("compacts an absolute lookup type, and its weight key with it", () => {
|
|
582
|
+
// `PackLookup.type`/`types` accept a prefixed name OR an absolute IRI, but
|
|
583
|
+
// the listing is keyed on the index's prefixed types. Verbatim, such a story
|
|
584
|
+
// compiled clean and then matched no class and no weight.
|
|
585
|
+
const listable = compileListable({
|
|
586
|
+
noun: "widget",
|
|
587
|
+
lookup: {
|
|
588
|
+
by: "ds:name",
|
|
589
|
+
types: ["https://ds.canonical.com/Component", "ds:Pattern"],
|
|
590
|
+
weights: { "https://ds.canonical.com/Component": 0.4 },
|
|
591
|
+
},
|
|
592
|
+
} as PackDefinition);
|
|
593
|
+
|
|
594
|
+
expect(listable?.sources.map((s) => s.type)).toEqual([
|
|
595
|
+
"ds:Component",
|
|
596
|
+
"ds:Pattern",
|
|
597
|
+
]);
|
|
598
|
+
// The weight followed its type through the same compaction, so it still
|
|
599
|
+
// applies — keying it on the raw IRI would have silently dropped it.
|
|
600
|
+
const component = listable?.sources.find((s) => s.type === "ds:Component");
|
|
601
|
+
expect(component?.weight).toBe(0.4);
|
|
602
|
+
expect(listable?.sources.find((s) => s.type === "ds:Pattern")?.weight).toBe(
|
|
603
|
+
1,
|
|
604
|
+
);
|
|
605
|
+
});
|
|
606
|
+
});
|
|
@@ -15,9 +15,16 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import { BIN_NAME } from "../../constants.js";
|
|
18
|
-
import
|
|
18
|
+
import { compactUri, DEFAULT_PREFIX_MAP } from "../render/index.js";
|
|
19
|
+
import type { PragmaRuntime } from "../runtime/index.js";
|
|
19
20
|
import { asVerb } from "../spec/asVerb.js";
|
|
20
|
-
import type {
|
|
21
|
+
import type {
|
|
22
|
+
CapabilityModule,
|
|
23
|
+
DisclosureSpec,
|
|
24
|
+
McpListable,
|
|
25
|
+
ParamSpec,
|
|
26
|
+
VerbSpec,
|
|
27
|
+
} from "../spec/types.js";
|
|
21
28
|
import {
|
|
22
29
|
listFormatters,
|
|
23
30
|
lookupFormatters,
|
|
@@ -107,6 +114,83 @@ export function compilePack(
|
|
|
107
114
|
return verbs;
|
|
108
115
|
}
|
|
109
116
|
|
|
117
|
+
/**
|
|
118
|
+
* Derive a story's MCP resource listing from the types its lookup addresses.
|
|
119
|
+
*
|
|
120
|
+
* ZERO new authoring: a read story ALREADY declares its type set
|
|
121
|
+
* (`lookup.type` / `lookup.types`) because that is what its name resolve is
|
|
122
|
+
* constrained by, so the slice of the index the noun contributes to the listing
|
|
123
|
+
* IS that declaration read a second time by a different reader — never written
|
|
124
|
+
* a second time by the author. Each type contributes ONE collection entry (its
|
|
125
|
+
* class entry, carrying the instance count); the individuals stay reachable
|
|
126
|
+
* through the `{+uri}` template and its autocomplete.
|
|
127
|
+
*
|
|
128
|
+
* Returns `undefined` for a story with no lookup (a list-only noun addresses no
|
|
129
|
+
* class, so it can name no slice).
|
|
130
|
+
*
|
|
131
|
+
* @param definition - A validated pack definition.
|
|
132
|
+
* @returns Its declared listing, or `undefined` when it declares no types.
|
|
133
|
+
*/
|
|
134
|
+
export function compileListable(
|
|
135
|
+
definition: PackDefinition,
|
|
136
|
+
): McpListable | undefined {
|
|
137
|
+
const lookup = definition.lookup;
|
|
138
|
+
if (!lookup) return undefined;
|
|
139
|
+
const types = lookup.types ?? (lookup.type ? [lookup.type] : []);
|
|
140
|
+
if (types.length === 0) return undefined;
|
|
141
|
+
// `PackLookup.type`/`types` accept a prefixed name OR an absolute IRI, but the
|
|
142
|
+
// listing is keyed on the index's PREFIXED types. Copied verbatim, a lookup
|
|
143
|
+
// legitimately constrained to `https://…/Widget` compiles clean and then
|
|
144
|
+
// matches no class and no weight — a story that is valid everywhere else and
|
|
145
|
+
// silently contributes nothing here. Compacted against the same map
|
|
146
|
+
// `resolveUri` expands with, so the two directions agree.
|
|
147
|
+
const compact = (type: string): string =>
|
|
148
|
+
compactUri(type, DEFAULT_PREFIX_MAP);
|
|
149
|
+
const weights = Object.fromEntries(
|
|
150
|
+
Object.entries(lookup.weights ?? {}).map(([type, weight]) => [
|
|
151
|
+
compact(type),
|
|
152
|
+
weight,
|
|
153
|
+
]),
|
|
154
|
+
);
|
|
155
|
+
return {
|
|
156
|
+
sources: types.map(compact).map((type) => ({
|
|
157
|
+
type,
|
|
158
|
+
as: "collection" as const,
|
|
159
|
+
// Unlisted types weigh 1 — the default is "as important as any other",
|
|
160
|
+
// so a story that declares no weights needs no weights.
|
|
161
|
+
weight: weights[type] ?? 1,
|
|
162
|
+
})),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Compile a story into the capability module that carries it.
|
|
168
|
+
*
|
|
169
|
+
* The ONE place a {@link PackDefinition} becomes a {@link CapabilityModule} —
|
|
170
|
+
* the distribution's static stories and the dynamic (config/package) ones come
|
|
171
|
+
* through here alike, so a module-level projection derived from the story
|
|
172
|
+
* (today: {@link compileListable}) cannot reach one tier and miss the other.
|
|
173
|
+
*
|
|
174
|
+
* @param definition - A validated pack definition.
|
|
175
|
+
* @param source - Where the definition came from, for diagnostics.
|
|
176
|
+
* @param prefixes - The merged prefix map used for display compaction.
|
|
177
|
+
* @returns The module: the compiled verbs plus the story's module-level data.
|
|
178
|
+
*/
|
|
179
|
+
export function compileStoryModule(
|
|
180
|
+
definition: PackDefinition,
|
|
181
|
+
source: StorySource,
|
|
182
|
+
prefixes: Readonly<Record<string, string>>,
|
|
183
|
+
): CapabilityModule {
|
|
184
|
+
const listable = compileListable(definition);
|
|
185
|
+
return {
|
|
186
|
+
name: definition.noun,
|
|
187
|
+
story: true,
|
|
188
|
+
verbs: compilePack(definition, source, prefixes),
|
|
189
|
+
colophon: definition.colophon,
|
|
190
|
+
...(listable ? { mcpListable: listable } : {}),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
|
|
110
194
|
/** Presentation facts for one compiled list-shaped verb. */
|
|
111
195
|
interface ListVerbMeta {
|
|
112
196
|
readonly noun: string;
|
|
@@ -287,9 +371,15 @@ function projectFilters(
|
|
|
287
371
|
name: filter.param,
|
|
288
372
|
doc,
|
|
289
373
|
values: [...filter.values],
|
|
374
|
+
repeatable: true,
|
|
290
375
|
} satisfies ParamSpec;
|
|
291
376
|
}
|
|
292
|
-
return {
|
|
377
|
+
return {
|
|
378
|
+
kind: "string",
|
|
379
|
+
name: filter.param,
|
|
380
|
+
doc,
|
|
381
|
+
repeatable: true,
|
|
382
|
+
} satisfies ParamSpec;
|
|
293
383
|
});
|
|
294
384
|
}
|
|
295
385
|
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
import { DETAIL_LEVELS } from "../../constants.js";
|
|
21
|
-
import { resolveDetail } from "../render/
|
|
22
|
-
import type { PragmaRuntime } from "../runtime/
|
|
21
|
+
import { resolveDetail } from "../render/index.js";
|
|
22
|
+
import type { PragmaRuntime } from "../runtime/index.js";
|
|
23
23
|
import type { PackDisclosure, PackExpand, PackField } from "./types.js";
|
|
24
24
|
|
|
25
25
|
/** The canonical level names, lowest → highest. */
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* stays off the storeless fast path).
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
|
-
import { PragmaError } from "../../error/
|
|
26
|
+
import { PragmaError } from "../../error/index.js";
|
|
27
27
|
import { activeExpands, activeFields } from "./../sparql/buildLookupQuery.js";
|
|
28
28
|
import type {
|
|
29
29
|
PackExpand,
|
|
@@ -14,9 +14,8 @@
|
|
|
14
14
|
* composed only from validated pack terms and compiled schema names.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import { PragmaError } from "../../error/
|
|
18
|
-
import {
|
|
19
|
-
import type { PragmaRuntime } from "../../runtime/types.js";
|
|
17
|
+
import { cliRecovery, PragmaError } from "../../error/index.js";
|
|
18
|
+
import type { PragmaRuntime } from "../../runtime/index.js";
|
|
20
19
|
import type { PackChildRow, PackEntity, PackLookup } from "../types.js";
|
|
21
20
|
import {
|
|
22
21
|
buildLookupDocument,
|
|
@@ -72,7 +71,7 @@ export async function fetchGraphqlLookup(
|
|
|
72
71
|
// ontology). That is a runtime not-found, not an unavailable store (exit 3).
|
|
73
72
|
throw new PragmaError({
|
|
74
73
|
code: "ENTITY_NOT_FOUND",
|
|
75
|
-
message: `
|
|
74
|
+
message: `Cannot resolve <${entityUri}> — its rdf:type may be missing from the ontology.`,
|
|
76
75
|
recovery: cliRecovery(
|
|
77
76
|
`graph inspect ${entityUri}`,
|
|
78
77
|
"Inspect the entity's triples to check its rdf:type.",
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The GraphQL lookup path — what a `source: "graphql"` pack story executes
|
|
3
|
+
* once SPARQL has resolved its name to an entity IRI.
|
|
4
|
+
*
|
|
5
|
+
* The three files here are one function split for testability, not three
|
|
6
|
+
* services: the naming rules derive schema field names from the RDF properties
|
|
7
|
+
* a pack declares, the document generator turns a lookup declaration plus
|
|
8
|
+
* those names into the single query to run, and the fetcher executes it and
|
|
9
|
+
* unwraps the Relay envelope into the same flat entity shape the SPARQL path
|
|
10
|
+
* produces. Only the last of those is something a caller does.
|
|
11
|
+
*
|
|
12
|
+
* So the barrel is one export, and the narrowness is the point. The document
|
|
13
|
+
* generator's contract is that the entity IRI travels as a query VARIABLE and
|
|
14
|
+
* never as interpolated text, and that a document is composed only from
|
|
15
|
+
* validated pack terms and compiled schema names. Handing out the generator on
|
|
16
|
+
* its own would hand out a way to build a document and execute it by some
|
|
17
|
+
* other route; handing out the fetcher hands out the guarantee with it.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
export { fetchGraphqlLookup } from "./fetchGraphqlLookup.js";
|
|
@@ -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,8 +7,7 @@
|
|
|
7
7
|
* before it can be interpolated into a generated `<iri>` query token.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { PragmaError } from "../error/
|
|
11
|
-
import { cliRecovery } from "../error/recovery.js";
|
|
10
|
+
import { cliRecovery, PragmaError } from "../error/index.js";
|
|
12
11
|
|
|
13
12
|
/** Characters not allowed inside a SPARQL `<IRI>`. */
|
|
14
13
|
const UNSAFE_IRI_PATTERN = /[<>"{}|\\^`\s]/;
|
|
@@ -27,6 +26,11 @@ export function isEmbeddableIri(value: string): boolean {
|
|
|
27
26
|
/**
|
|
28
27
|
* Resolve a prefixed or absolute URI to its full form.
|
|
29
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
|
+
*
|
|
30
34
|
* @param uri - A full or prefixed URI string.
|
|
31
35
|
* @param prefixes - The store's merged prefix→namespace map.
|
|
32
36
|
* @returns The fully expanded URI.
|
|
@@ -36,9 +40,33 @@ export function resolveUri(
|
|
|
36
40
|
uri: string,
|
|
37
41
|
prefixes: Readonly<Record<string, string>>,
|
|
38
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 {
|
|
39
67
|
const colonIdx = uri.indexOf(":");
|
|
40
68
|
if (colonIdx === -1) {
|
|
41
|
-
|
|
69
|
+
return PragmaError.invalidInput("uri", uri, {
|
|
42
70
|
recovery: {
|
|
43
71
|
message: 'Use a prefixed URI (e.g. "prefix:name") or a full URI.',
|
|
44
72
|
},
|
|
@@ -49,16 +77,14 @@ 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
89
|
recovery: cliRecovery("ontology list", "List known ontology prefixes.", {
|
|
64
90
|
tool: "ontology_list",
|
|
@@ -66,11 +92,37 @@ export function resolveUri(
|
|
|
66
92
|
});
|
|
67
93
|
}
|
|
68
94
|
|
|
69
|
-
/**
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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;
|
|
75
127
|
}
|
|
76
128
|
}
|