@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
|
@@ -2,27 +2,37 @@
|
|
|
2
2
|
* Look up one or more pack entities by name, prefixed name, absolute IRI, or
|
|
3
3
|
* glob, via the fetch strategy the pack declares.
|
|
4
4
|
*
|
|
5
|
-
* The
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* The resolve is ALWAYS generated SPARQL (an escaped literal or a validated
|
|
6
|
+
* `<iri>` BIND) regardless of `source`; from the resolved IRI, values are
|
|
7
|
+
* fetched either through more generated SELECTs (`sparql`) or one generated
|
|
8
8
|
* GraphQL document (`graphql`). One poisoned query never discards the batch —
|
|
9
9
|
* per-query failures are collected as structured error entries.
|
|
10
10
|
*
|
|
11
|
+
* WHICH query is chosen is decided by the ARGUMENT'S SHAPE first and the pack's
|
|
12
|
+
* `source` second, and both dispatches live here. Getting that order wrong is
|
|
13
|
+
* not a style question: it is what made an IRI reach a name FILTER on every
|
|
14
|
+
* graphql-sourced pack, and what left an IRI-shaped glob expanding against a
|
|
15
|
+
* population of names. The shape a user typed is a fact about the argument; the
|
|
16
|
+
* fetch strategy is a fact about the pack, and it cannot change what the
|
|
17
|
+
* argument means.
|
|
18
|
+
*
|
|
11
19
|
* Reached only behind a dynamic import from the lookup run body, so its imports
|
|
12
20
|
* (including the GraphQL path) stay off the storeless fast path.
|
|
13
21
|
*/
|
|
14
22
|
|
|
15
|
-
import { PragmaError } from "../error/
|
|
16
|
-
import { cliRecovery } from "../error/recovery.js";
|
|
23
|
+
import { cliRecovery, PragmaError } from "../error/index.js";
|
|
17
24
|
import { suggestNames } from "../project/cli/suggestNames.js";
|
|
18
|
-
import
|
|
25
|
+
import { compactUri } from "../render/index.js";
|
|
26
|
+
import type { PragmaRuntime } from "../runtime/index.js";
|
|
19
27
|
import { activeExpands } from "./disclosure.js";
|
|
20
28
|
import { expandGlob, isGlobPattern } from "./glob.js";
|
|
21
29
|
import { fetchGraphqlLookup } from "./graphql/fetchGraphqlLookup.js";
|
|
22
30
|
import { isEmbeddableIri, resolveUri } from "./iri.js";
|
|
23
31
|
import {
|
|
24
32
|
buildExpandQuery,
|
|
33
|
+
buildIriResolveQuery,
|
|
25
34
|
buildLookupByIriQuery,
|
|
35
|
+
buildLookupIrisQuery,
|
|
26
36
|
buildLookupNamesQuery,
|
|
27
37
|
buildLookupQuery,
|
|
28
38
|
buildNameResolveQuery,
|
|
@@ -32,6 +42,7 @@ import type {
|
|
|
32
42
|
PackChildRow,
|
|
33
43
|
PackEntity,
|
|
34
44
|
PackLookup,
|
|
45
|
+
PackRow,
|
|
35
46
|
StorySource,
|
|
36
47
|
} from "./types.js";
|
|
37
48
|
|
|
@@ -43,7 +54,15 @@ export interface LookupError {
|
|
|
43
54
|
readonly suggestions?: readonly string[];
|
|
44
55
|
}
|
|
45
56
|
|
|
46
|
-
/**
|
|
57
|
+
/**
|
|
58
|
+
* The result of a (possibly multi-name) lookup.
|
|
59
|
+
*
|
|
60
|
+
* `results` may be LONGER than the arguments that produced it: a name several
|
|
61
|
+
* entities share answers with all of them, ranked. There is no companion field
|
|
62
|
+
* naming the ones not answered with, because there are none — an earlier draft
|
|
63
|
+
* kept the single-entity arity and carried the rest as IRIs in a notice, which
|
|
64
|
+
* is a sentence about an address where the payload is the address.
|
|
65
|
+
*/
|
|
47
66
|
export interface LookupOutput {
|
|
48
67
|
readonly results: PackEntity[];
|
|
49
68
|
readonly errors: LookupError[];
|
|
@@ -70,11 +89,21 @@ export async function resolveLookup(
|
|
|
70
89
|
throw PragmaError.invalidInput("names", "(empty)", {
|
|
71
90
|
recovery: cliRecovery(`${noun} list`, `List available ${noun} entries.`, {
|
|
72
91
|
tool: `${noun}_list`,
|
|
92
|
+
// A concrete, valid argument bag rather than a bare tool name: an
|
|
93
|
+
// agent can call the recovery as written instead of guessing one.
|
|
94
|
+
params: {},
|
|
73
95
|
}),
|
|
74
96
|
});
|
|
75
97
|
}
|
|
76
98
|
|
|
77
|
-
const expanded = await expandQueries(
|
|
99
|
+
const expanded = await expandQueries(
|
|
100
|
+
rt,
|
|
101
|
+
lookup,
|
|
102
|
+
noun,
|
|
103
|
+
source,
|
|
104
|
+
queries,
|
|
105
|
+
prefixes,
|
|
106
|
+
);
|
|
78
107
|
const results: PackEntity[] = [];
|
|
79
108
|
const errors: LookupError[] = [...expanded.globErrors];
|
|
80
109
|
const settled = await Promise.allSettled(
|
|
@@ -86,7 +115,7 @@ export async function resolveLookup(
|
|
|
86
115
|
const query = expanded.names[index];
|
|
87
116
|
if (query === undefined) continue;
|
|
88
117
|
if (outcome.status === "fulfilled") {
|
|
89
|
-
results.push(outcome.value);
|
|
118
|
+
results.push(...outcome.value);
|
|
90
119
|
continue;
|
|
91
120
|
}
|
|
92
121
|
const error = outcome.reason;
|
|
@@ -110,17 +139,34 @@ export async function resolveLookup(
|
|
|
110
139
|
return { results, errors };
|
|
111
140
|
}
|
|
112
141
|
|
|
113
|
-
/**
|
|
142
|
+
/**
|
|
143
|
+
* Expand glob queries against the population their own shape addresses;
|
|
144
|
+
* literals pass through.
|
|
145
|
+
*
|
|
146
|
+
* A name glob expands over the `by` values, an IRI glob over the entity IRIs —
|
|
147
|
+
* the same split {@link buildResolveQuery} makes, because a glob is just a
|
|
148
|
+
* lookup argument with a `*` in it. Expanding an IRI pattern over names was why
|
|
149
|
+
* `ds:global.component.but*` matched nothing on any pack while shell completion
|
|
150
|
+
* offered nothing BUT those IRIs. Each population is fetched at most once, and
|
|
151
|
+
* only when a glob of that shape is actually present.
|
|
152
|
+
*/
|
|
114
153
|
async function expandQueries(
|
|
115
154
|
rt: LookupRuntime,
|
|
116
155
|
lookup: PackLookup,
|
|
117
156
|
noun: string,
|
|
118
157
|
source: StorySource,
|
|
119
158
|
queries: readonly string[],
|
|
159
|
+
prefixes: Readonly<Record<string, string>>,
|
|
120
160
|
): Promise<{ names: string[]; globErrors: LookupError[] }> {
|
|
121
161
|
if (!queries.some(isGlobPattern))
|
|
122
162
|
return { names: [...queries], globErrors: [] };
|
|
123
|
-
const
|
|
163
|
+
const globs = queries.filter(isGlobPattern);
|
|
164
|
+
const byIri = globs.some(looksLikeIri)
|
|
165
|
+
? await listEntityIriSpellings(rt, lookup, source, prefixes)
|
|
166
|
+
: new Map<string, string>();
|
|
167
|
+
const byName = globs.some((glob) => !looksLikeIri(glob))
|
|
168
|
+
? await listEntityNames(rt, lookup, source)
|
|
169
|
+
: [];
|
|
124
170
|
const names: string[] = [];
|
|
125
171
|
const globErrors: LookupError[] = [];
|
|
126
172
|
for (const query of queries) {
|
|
@@ -128,7 +174,17 @@ async function expandQueries(
|
|
|
128
174
|
names.push(query);
|
|
129
175
|
continue;
|
|
130
176
|
}
|
|
131
|
-
|
|
177
|
+
// An IRI glob expands over every spelling, then collapses to the entity:
|
|
178
|
+
// matching `ds:button` and its absolute twin must not list it twice.
|
|
179
|
+
const matches = looksLikeIri(query)
|
|
180
|
+
? [
|
|
181
|
+
...new Set(
|
|
182
|
+
expandGlob(query, [...byIri.keys()]).map(
|
|
183
|
+
(spelling) => byIri.get(spelling) ?? spelling,
|
|
184
|
+
),
|
|
185
|
+
),
|
|
186
|
+
]
|
|
187
|
+
: expandGlob(query, byName);
|
|
132
188
|
if (matches.length === 0) {
|
|
133
189
|
globErrors.push({
|
|
134
190
|
query,
|
|
@@ -142,7 +198,35 @@ async function expandQueries(
|
|
|
142
198
|
return { names, globErrors };
|
|
143
199
|
}
|
|
144
200
|
|
|
145
|
-
/**
|
|
201
|
+
/**
|
|
202
|
+
* Look up every entity a lookup argument reaches, dispatching to the pack's
|
|
203
|
+
* declared fetch source.
|
|
204
|
+
*
|
|
205
|
+
* One argument, EVERY entity it reaches — ranked, best first.
|
|
206
|
+
*
|
|
207
|
+
* `lookup` is deliberately one tool for the singular and the plural case. An
|
|
208
|
+
* agent that had to decide up front whether a name is unique would pay two
|
|
209
|
+
* round trips to find out, and the answer is not knowable from the name: 25
|
|
210
|
+
* live block names reach two or three blocks apiece, and the caller cannot
|
|
211
|
+
* tell which until it asks. Returning them all costs the caller nothing when a
|
|
212
|
+
* name is unique — the array is one long — and saves a whole exchange when it
|
|
213
|
+
* is not.
|
|
214
|
+
*
|
|
215
|
+
* That is why the `LIMIT 1` had to go rather than be compensated for. With it,
|
|
216
|
+
* `block lookup button` answered with Launchpad's Button and gave no sign the
|
|
217
|
+
* global one existed, because `apps_launchpad…` sorts before `global…`. An
|
|
218
|
+
* earlier draft of this change kept the arity and named the losers in a notice;
|
|
219
|
+
* a notice is a sentence about an address, and the payload is the address.
|
|
220
|
+
*
|
|
221
|
+
* Ranking still matters, and matters more: it is now what ORDERS the answer
|
|
222
|
+
* rather than what silently picks it. The best row leads, so a caller reading
|
|
223
|
+
* only the first gets the entity the ranking believes was meant.
|
|
224
|
+
*
|
|
225
|
+
* The rows are collapsed to one per `?uri` first. The sparql form projects its
|
|
226
|
+
* fields in the same SELECT, so a multi-valued field yields one row per value;
|
|
227
|
+
* that has always been true and `LIMIT 1` merely hid it. Without the collapse
|
|
228
|
+
* one entity would report itself as several.
|
|
229
|
+
*/
|
|
146
230
|
async function lookupOne(
|
|
147
231
|
rt: LookupRuntime,
|
|
148
232
|
lookup: PackLookup,
|
|
@@ -151,59 +235,94 @@ async function lookupOne(
|
|
|
151
235
|
source: StorySource,
|
|
152
236
|
prefixes: Readonly<Record<string, string>>,
|
|
153
237
|
level: string | undefined,
|
|
154
|
-
): Promise<PackEntity> {
|
|
238
|
+
): Promise<PackEntity[]> {
|
|
155
239
|
const graphqlSourced = lookup.source === "graphql";
|
|
156
240
|
const rows = await runSelect(
|
|
157
241
|
rt,
|
|
158
|
-
|
|
159
|
-
? buildNameResolveQuery(lookup, query)
|
|
160
|
-
: buildEntityQuery(lookup, query, prefixes, level),
|
|
242
|
+
buildResolveQuery(lookup, query, prefixes, level),
|
|
161
243
|
source,
|
|
162
244
|
);
|
|
163
|
-
const
|
|
164
|
-
if (
|
|
245
|
+
const bases = firstRowPerEntity(rows);
|
|
246
|
+
if (bases.length === 0) {
|
|
165
247
|
const candidates = await listEntityNames(rt, lookup, source);
|
|
166
248
|
throw PragmaError.notFound(noun, query, {
|
|
167
249
|
suggestions: suggestNames(query, candidates),
|
|
168
250
|
recovery: cliRecovery(`${noun} list`, `List available ${noun} entries.`, {
|
|
169
251
|
tool: `${noun}_list`,
|
|
252
|
+
// A concrete, valid argument bag rather than a bare tool name: an
|
|
253
|
+
// agent can call the recovery as written instead of guessing one.
|
|
254
|
+
params: {},
|
|
170
255
|
}),
|
|
171
256
|
});
|
|
172
257
|
}
|
|
173
258
|
|
|
174
259
|
if (graphqlSourced) {
|
|
175
|
-
return
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
260
|
+
return Promise.all(
|
|
261
|
+
bases.map((base) =>
|
|
262
|
+
fetchGraphqlLookup(
|
|
263
|
+
rt,
|
|
264
|
+
lookup,
|
|
265
|
+
String(base.uri),
|
|
266
|
+
base.name ?? query,
|
|
267
|
+
// The GraphQL lane's only use of the source is CONFIG_ERROR
|
|
268
|
+
// attribution, which is right for any origin — so it takes the label,
|
|
269
|
+
// not provenance.
|
|
270
|
+
source.label,
|
|
271
|
+
prefixes,
|
|
272
|
+
level,
|
|
273
|
+
),
|
|
274
|
+
),
|
|
185
275
|
);
|
|
186
276
|
}
|
|
187
277
|
|
|
188
|
-
const
|
|
189
|
-
for (const
|
|
190
|
-
entity
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
278
|
+
const entities: PackEntity[] = [];
|
|
279
|
+
for (const base of bases) {
|
|
280
|
+
const entity: PackEntity = { ...base };
|
|
281
|
+
for (const expand of activeExpands(lookup, level)) {
|
|
282
|
+
entity[expand.name] = (await runSelect(
|
|
283
|
+
rt,
|
|
284
|
+
buildExpandQuery(expand, String(base.uri)),
|
|
285
|
+
source,
|
|
286
|
+
)) as readonly PackChildRow[];
|
|
287
|
+
}
|
|
288
|
+
entities.push(entity);
|
|
289
|
+
}
|
|
290
|
+
return entities;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/** Collapse a ranked resolve to one row per entity, keeping the best-ranked. */
|
|
294
|
+
function firstRowPerEntity(rows: readonly PackRow[]): PackRow[] {
|
|
295
|
+
const seen = new Set<string>();
|
|
296
|
+
const bases: PackRow[] = [];
|
|
297
|
+
for (const row of rows) {
|
|
298
|
+
if (!row.uri || seen.has(row.uri)) continue;
|
|
299
|
+
seen.add(row.uri);
|
|
300
|
+
bases.push(row);
|
|
195
301
|
}
|
|
196
|
-
return
|
|
302
|
+
return bases;
|
|
197
303
|
}
|
|
198
304
|
|
|
199
|
-
/**
|
|
200
|
-
|
|
305
|
+
/**
|
|
306
|
+
* Build the resolve SELECT for one lookup argument: shape first, source second.
|
|
307
|
+
*
|
|
308
|
+
* The four cells of that 2×2 are the whole dispatch. A graphql-sourced pack
|
|
309
|
+
* resolves to an IRI and fetches everything else through its document, so both
|
|
310
|
+
* of its queries are the minimal `?uri ?name` pair; a sparql-sourced pack reads
|
|
311
|
+
* its fields in the same SELECT, so both of its queries carry the level-gated
|
|
312
|
+
* projection.
|
|
313
|
+
*/
|
|
314
|
+
function buildResolveQuery(
|
|
201
315
|
lookup: PackLookup,
|
|
202
316
|
query: string,
|
|
203
317
|
prefixes: Readonly<Record<string, string>>,
|
|
204
318
|
level: string | undefined,
|
|
205
319
|
): string {
|
|
206
|
-
|
|
320
|
+
const graphqlSourced = lookup.source === "graphql";
|
|
321
|
+
if (!looksLikeIri(query)) {
|
|
322
|
+
return graphqlSourced
|
|
323
|
+
? buildNameResolveQuery(lookup, query)
|
|
324
|
+
: buildLookupQuery(lookup, query, level);
|
|
325
|
+
}
|
|
207
326
|
const resolved = resolveUri(query, prefixes);
|
|
208
327
|
if (!isEmbeddableIri(resolved)) {
|
|
209
328
|
throw PragmaError.invalidInput("name", query, {
|
|
@@ -213,7 +332,9 @@ function buildEntityQuery(
|
|
|
213
332
|
},
|
|
214
333
|
});
|
|
215
334
|
}
|
|
216
|
-
return
|
|
335
|
+
return graphqlSourced
|
|
336
|
+
? buildIriResolveQuery(lookup, resolved)
|
|
337
|
+
: buildLookupByIriQuery(lookup, resolved, level);
|
|
217
338
|
}
|
|
218
339
|
|
|
219
340
|
/** Whether a lookup query addresses an entity by IRI or prefixed name. */
|
|
@@ -221,10 +342,47 @@ function looksLikeIri(query: string): boolean {
|
|
|
221
342
|
return (
|
|
222
343
|
query.startsWith("http://") ||
|
|
223
344
|
query.startsWith("https://") ||
|
|
224
|
-
|
|
345
|
+
// Neither an IRI nor a SPARQL prefixed name may contain whitespace, so a
|
|
346
|
+
// colon in a spaced string is part of a plain entity name — e.g. the
|
|
347
|
+
// concept "Foundations: Grid" — not a prefix separator.
|
|
348
|
+
(query.includes(":") && !/\s/.test(query))
|
|
225
349
|
);
|
|
226
350
|
}
|
|
227
351
|
|
|
352
|
+
/**
|
|
353
|
+
* Every SPELLING an IRI-shaped glob may be written against, mapped to the one
|
|
354
|
+
* entity it addresses.
|
|
355
|
+
*
|
|
356
|
+
* An entity under a registered prefix has two legal spellings — the compact
|
|
357
|
+
* `ds:button` shell completion offers, and the absolute
|
|
358
|
+
* `https://ds.canonical.com/button` a user pastes from a browser. Both resolve
|
|
359
|
+
* to the same entity in a literal lookup, so a glob must expand over both;
|
|
360
|
+
* offering only the compact form made `https://ds.canonical.com/but*` return
|
|
361
|
+
* EMPTY_RESULTS while the literal IRI it generalises succeeded.
|
|
362
|
+
*
|
|
363
|
+
* The map is spelling → CANONICAL IRI precisely so a pattern that matches an
|
|
364
|
+
* entity under both spellings still yields it once. Matching over a flat list
|
|
365
|
+
* of both would render the entity twice, which is why the previous shape
|
|
366
|
+
* offered only one.
|
|
367
|
+
*/
|
|
368
|
+
async function listEntityIriSpellings(
|
|
369
|
+
rt: LookupRuntime,
|
|
370
|
+
lookup: PackLookup,
|
|
371
|
+
source: StorySource,
|
|
372
|
+
prefixes: Readonly<Record<string, string>>,
|
|
373
|
+
): Promise<Map<string, string>> {
|
|
374
|
+
const rows = await runSelect(rt, buildLookupIrisQuery(lookup), source);
|
|
375
|
+
const spellings = new Map<string, string>();
|
|
376
|
+
for (const row of rows) {
|
|
377
|
+
const uri = row.uri ?? "";
|
|
378
|
+
if (uri === "") continue;
|
|
379
|
+
spellings.set(uri, uri);
|
|
380
|
+
const compact = compactUri(uri, prefixes);
|
|
381
|
+
if (compact !== uri) spellings.set(compact, uri);
|
|
382
|
+
}
|
|
383
|
+
return spellings;
|
|
384
|
+
}
|
|
385
|
+
|
|
228
386
|
/** List every entity name the lookup can address (miss suggestions + sample/glob). */
|
|
229
387
|
export async function listEntityNames(
|
|
230
388
|
rt: LookupRuntime,
|
|
@@ -9,9 +9,8 @@
|
|
|
9
9
|
* factories carry no heavy static import.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import { PragmaError } from "../error/
|
|
13
|
-
import {
|
|
14
|
-
import type { PragmaRuntime } from "../runtime/types.js";
|
|
12
|
+
import { cliRecovery, PragmaError } from "../error/index.js";
|
|
13
|
+
import type { PragmaRuntime } from "../runtime/index.js";
|
|
15
14
|
import { resolvePackDetail } from "./disclosure.js";
|
|
16
15
|
import type { SampleOutput } from "./renderPack.js";
|
|
17
16
|
import {
|
|
@@ -20,14 +19,39 @@ import {
|
|
|
20
19
|
resolveLookup,
|
|
21
20
|
} from "./resolveEntity.js";
|
|
22
21
|
import { parseSampleCount, pickRandom } from "./sample.js";
|
|
23
|
-
import {
|
|
22
|
+
import {
|
|
23
|
+
applyPackFilters,
|
|
24
|
+
type FilterVocabularies,
|
|
25
|
+
} from "./sparql/applyFilters.js";
|
|
24
26
|
import { applyPackSearch } from "./sparql/applySearch.js";
|
|
25
27
|
import { runSelect } from "./sparql/runSelect.js";
|
|
26
|
-
import type {
|
|
28
|
+
import type {
|
|
29
|
+
PackFilter,
|
|
30
|
+
PackList,
|
|
31
|
+
PackLookup,
|
|
32
|
+
PackRow,
|
|
33
|
+
StorySource,
|
|
34
|
+
} from "./types.js";
|
|
27
35
|
|
|
28
36
|
/** The highest canonical level — sample fetches everything for shape discovery. */
|
|
29
37
|
const HIGHEST_LEVEL = "detailed";
|
|
30
38
|
|
|
39
|
+
/**
|
|
40
|
+
* The recovery every lookup-shaped miss carries: browse the noun's list.
|
|
41
|
+
*
|
|
42
|
+
* `mcp.params` is populated rather than left off. A bare tool NAME is only half
|
|
43
|
+
* an instruction to an agent — it still has to guess an argument bag, and a
|
|
44
|
+
* guess that misses returns `-32602 Invalid arguments`, which reads like the
|
|
45
|
+
* recovery itself was wrong. `{}` is the concrete, valid call: every compiled
|
|
46
|
+
* list verb's params are optional, so the recovery is now copy-pasteable.
|
|
47
|
+
*/
|
|
48
|
+
function listRecovery(noun: string) {
|
|
49
|
+
return cliRecovery(`${noun} list`, `List available ${noun} entries.`, {
|
|
50
|
+
tool: `${noun}_list`,
|
|
51
|
+
params: {},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
31
55
|
/** Facts a list-shaped run body needs beyond its `shape`. */
|
|
32
56
|
export interface ListRunMeta {
|
|
33
57
|
readonly source: StorySource;
|
|
@@ -46,16 +70,64 @@ export function makeListRun(
|
|
|
46
70
|
shape: PackList,
|
|
47
71
|
meta: ListRunMeta,
|
|
48
72
|
): (params: Record<string, unknown>, rt: PragmaRuntime) => Promise<PackRow[]> {
|
|
49
|
-
return async (params, rt) =>
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
73
|
+
return async (params, rt) => {
|
|
74
|
+
const rows = await runSelect(rt, shape.query, meta.source);
|
|
75
|
+
const vocabularies = await readFilterVocabularies(
|
|
76
|
+
rt,
|
|
77
|
+
shape.filters,
|
|
78
|
+
params,
|
|
79
|
+
meta.source,
|
|
80
|
+
);
|
|
81
|
+
return applyPackSearch(
|
|
82
|
+
applyPackFilters(rows, shape.filters, params, vocabularies),
|
|
56
83
|
shape.search,
|
|
57
84
|
params,
|
|
58
85
|
);
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Read the declared vocabulary of each value-free filter the caller actually
|
|
91
|
+
* used.
|
|
92
|
+
*
|
|
93
|
+
* WHY a second query rather than the rows already in hand: the rows are a
|
|
94
|
+
* population, not a vocabulary. A category the graph declares with no standards
|
|
95
|
+
* filed under it, or a `ds:ConceptType` no concept uses yet, is a REAL value
|
|
96
|
+
* that appears in no row — and rejecting it as `INVALID_INPUT` contradicts both
|
|
97
|
+
* `standard categories` (which lists it, with count 0) and the documented calm
|
|
98
|
+
* empty list. The query reads the same terms the enumerating surface reads, so
|
|
99
|
+
* "the graph is the vocabulary" stays true of the graph rather than of whatever
|
|
100
|
+
* the list happened to return.
|
|
101
|
+
*
|
|
102
|
+
* Only for a filter that is DECLARED with a vocabulary, carries no `values`
|
|
103
|
+
* (a declared set is already the vocabulary), and was actually PROVIDED — an
|
|
104
|
+
* unfiltered `list` runs exactly the one query it always did.
|
|
105
|
+
*/
|
|
106
|
+
async function readFilterVocabularies(
|
|
107
|
+
rt: PragmaRuntime,
|
|
108
|
+
filters: readonly PackFilter[] | undefined,
|
|
109
|
+
params: Record<string, unknown>,
|
|
110
|
+
source: StorySource,
|
|
111
|
+
): Promise<FilterVocabularies | undefined> {
|
|
112
|
+
const needed = (filters ?? []).filter(
|
|
113
|
+
(filter) =>
|
|
114
|
+
filter.vocabulary !== undefined &&
|
|
115
|
+
filter.values === undefined &&
|
|
116
|
+
params[filter.param] !== undefined,
|
|
117
|
+
);
|
|
118
|
+
if (needed.length === 0) return undefined;
|
|
119
|
+
const resolved = new Map<string, readonly string[]>();
|
|
120
|
+
for (const filter of needed) {
|
|
121
|
+
const vocabulary = filter.vocabulary;
|
|
122
|
+
if (!vocabulary) continue;
|
|
123
|
+
const variable = vocabulary.variable ?? filter.variable;
|
|
124
|
+
const rows = await runSelect(rt, vocabulary.query, source);
|
|
125
|
+
resolved.set(
|
|
126
|
+
filter.param,
|
|
127
|
+
rows.map((row) => row[variable] ?? "").filter((value) => value !== ""),
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
return resolved;
|
|
59
131
|
}
|
|
60
132
|
|
|
61
133
|
/** Build the run body for a lookup verb (variadic names → resolved entities). */
|
|
@@ -89,11 +161,7 @@ export function makeLookupRun(
|
|
|
89
161
|
code: first.code as PragmaError["code"],
|
|
90
162
|
message: first.message,
|
|
91
163
|
suggestions: first.suggestions ? [...first.suggestions] : undefined,
|
|
92
|
-
recovery:
|
|
93
|
-
`${noun} list`,
|
|
94
|
-
`List available ${noun} entries.`,
|
|
95
|
-
{ tool: `${noun}_list` },
|
|
96
|
-
),
|
|
164
|
+
recovery: listRecovery(noun),
|
|
97
165
|
});
|
|
98
166
|
}
|
|
99
167
|
}
|
|
@@ -120,11 +188,7 @@ export function makeSampleRun(
|
|
|
120
188
|
if (names.length === 0) {
|
|
121
189
|
throw PragmaError.emptyResults(noun, {
|
|
122
190
|
message: `No ${noun} entries to sample.`,
|
|
123
|
-
recovery:
|
|
124
|
-
`${noun} list`,
|
|
125
|
-
`List available ${noun} entries.`,
|
|
126
|
-
{ tool: `${noun}_list` },
|
|
127
|
-
),
|
|
191
|
+
recovery: listRecovery(noun),
|
|
128
192
|
});
|
|
129
193
|
}
|
|
130
194
|
const selected = pickRandom(names, count);
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* the supported 1–5 range. Selection is a Fisher-Yates partial shuffle.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { PragmaError } from "../error/
|
|
9
|
+
import { PragmaError } from "../error/index.js";
|
|
10
10
|
import type { PackLookup } from "./types.js";
|
|
11
11
|
|
|
12
12
|
/** Smallest number of samples the `sample` verb returns. */
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
import { z } from "zod";
|
|
20
20
|
import { DETAIL_LEVELS, RECOVERY_CLI_PREFIX } from "../../constants.js";
|
|
21
|
-
import { PragmaError } from "../error/
|
|
21
|
+
import { PragmaError } from "../error/index.js";
|
|
22
22
|
import type { PackDefinition } from "./types.js";
|
|
23
23
|
|
|
24
24
|
const NOUN_PATTERN = /^[a-z][a-z0-9-]*$/;
|
|
@@ -41,6 +41,16 @@ const TERM_PATTERN =
|
|
|
41
41
|
/** Params a filter/verb may not claim (they are the shared read vocabulary). */
|
|
42
42
|
const RESERVED_PARAMS = new Set(["search", "detail", "name", "count"]);
|
|
43
43
|
|
|
44
|
+
/**
|
|
45
|
+
* Whether an author-supplied query is a SELECT (optionally preceded by its own
|
|
46
|
+
* PREFIX lines). Every author query a story declares runs through `runSelect`,
|
|
47
|
+
* which reads `result.bindings` — so a non-SELECT is a shape mismatch caught
|
|
48
|
+
* here rather than downstream.
|
|
49
|
+
*/
|
|
50
|
+
function isSelectQuery(query: string): boolean {
|
|
51
|
+
return /^\s*(?:PREFIX\s+[^\n]*\n\s*)*SELECT\s/i.test(query);
|
|
52
|
+
}
|
|
53
|
+
|
|
44
54
|
const term = z.string().regex(TERM_PATTERN, "must be a prefixed name or IRI");
|
|
45
55
|
const graphqlName = z.string().regex(GRAPHQL_NAME_PATTERN);
|
|
46
56
|
const fieldName = z.string().regex(FIELD_PATTERN);
|
|
@@ -49,16 +59,35 @@ const columnSchema = z
|
|
|
49
59
|
.object({ field: fieldName, label: z.string().optional() })
|
|
50
60
|
.strict();
|
|
51
61
|
|
|
62
|
+
const vocabularySchema = z
|
|
63
|
+
.object({
|
|
64
|
+
query: z.string().min(1),
|
|
65
|
+
variable: fieldName.optional(),
|
|
66
|
+
})
|
|
67
|
+
.strict();
|
|
68
|
+
|
|
52
69
|
const filterSchema = z
|
|
53
70
|
.object({
|
|
54
71
|
param: z.string().regex(FILTER_PARAM_PATTERN),
|
|
55
72
|
variable: fieldName,
|
|
56
73
|
values: z.array(z.string()).min(1).optional(),
|
|
74
|
+
match: z.enum(["exact", "set"]).optional(),
|
|
75
|
+
vocabulary: vocabularySchema.optional(),
|
|
57
76
|
description: z.string().optional(),
|
|
58
77
|
})
|
|
59
78
|
.strict()
|
|
60
79
|
.refine((f) => !RESERVED_PARAMS.has(f.param), {
|
|
61
80
|
message: "filter param is a reserved name",
|
|
81
|
+
})
|
|
82
|
+
// A declared `values` set IS the vocabulary — the filter projects it as an
|
|
83
|
+
// enum and canonicalizes against it. A second, graph-read one alongside would
|
|
84
|
+
// be a silent no-op at best and a disagreement at worst.
|
|
85
|
+
.refine((f) => !(f.values && f.vocabulary), {
|
|
86
|
+
message:
|
|
87
|
+
'"values" and "vocabulary" are mutually exclusive — a declared value set is already the vocabulary',
|
|
88
|
+
})
|
|
89
|
+
.refine((f) => !f.vocabulary || isSelectQuery(f.vocabulary.query), {
|
|
90
|
+
message: '"vocabulary.query" must be a SPARQL SELECT query',
|
|
62
91
|
});
|
|
63
92
|
|
|
64
93
|
const searchSchema = z
|
|
@@ -204,14 +233,31 @@ const completionSchema = z
|
|
|
204
233
|
})
|
|
205
234
|
.strict();
|
|
206
235
|
|
|
236
|
+
/**
|
|
237
|
+
* The declared scope-ranking factor (`PackScopeWeight`). `falloff` is bounded
|
|
238
|
+
* the same way `weights` is — a factor outside 0–1 is a promotion, and this
|
|
239
|
+
* declaration only ever DEMOTES a deeper scope below a shallower one.
|
|
240
|
+
*/
|
|
241
|
+
const scopeWeightSchema = z
|
|
242
|
+
.object({
|
|
243
|
+
via: term,
|
|
244
|
+
by: term,
|
|
245
|
+
falloff: z.number().min(0).max(1),
|
|
246
|
+
asserted: term.optional(),
|
|
247
|
+
})
|
|
248
|
+
.strict();
|
|
249
|
+
|
|
207
250
|
const lookupSchema = z
|
|
208
251
|
.object({
|
|
209
252
|
source: z.enum(["sparql", "graphql"]).optional(),
|
|
210
253
|
by: term,
|
|
254
|
+
nameFallback: z.enum(["iri"]).optional(),
|
|
211
255
|
type: term.optional(),
|
|
212
256
|
description: z.string().optional(),
|
|
213
257
|
toolDescription: z.string().optional(),
|
|
214
258
|
types: z.array(term).min(1).optional(),
|
|
259
|
+
weights: z.record(term, z.number().min(0).max(1)).optional(),
|
|
260
|
+
scopeWeight: scopeWeightSchema.optional(),
|
|
215
261
|
graphqlType: graphqlName.optional(),
|
|
216
262
|
fields: z.array(fieldSchema).min(1).optional(),
|
|
217
263
|
sections: z.array(sectionSchema).min(1).optional(),
|
|
@@ -240,10 +286,7 @@ const definitionSchema = z
|
|
|
240
286
|
message: 'a pack must declare at least one of "list" or "lookup".',
|
|
241
287
|
});
|
|
242
288
|
}
|
|
243
|
-
if (
|
|
244
|
-
def.list &&
|
|
245
|
-
!/^\s*(?:PREFIX\s+[^\n]*\n\s*)*SELECT\s/i.test(def.list.query)
|
|
246
|
-
) {
|
|
289
|
+
if (def.list && !isSelectQuery(def.list.query)) {
|
|
247
290
|
ctx.addIssue({
|
|
248
291
|
code: z.ZodIssueCode.custom,
|
|
249
292
|
message: '"list.query" must be a SPARQL SELECT query.',
|
|
@@ -332,6 +375,36 @@ function refineLookup(
|
|
|
332
375
|
});
|
|
333
376
|
}
|
|
334
377
|
|
|
378
|
+
// An IRI-derived name is only as trustworthy as the class vouching for the
|
|
379
|
+
// entity it came from, and without a class constraint nothing bounds the scan
|
|
380
|
+
// the derived-name population would run. Rejected rather than ignored, for the
|
|
381
|
+
// same reason a stale weight is: a silent no-op is how a declaration that
|
|
382
|
+
// never applied survives review.
|
|
383
|
+
if (lookup.nameFallback !== undefined && !lookup.type && !lookup.types) {
|
|
384
|
+
ctx.addIssue({
|
|
385
|
+
code: z.ZodIssueCode.custom,
|
|
386
|
+
message:
|
|
387
|
+
'"lookup.nameFallback" requires a class constraint ("lookup.type" or "lookup.types") to vouch for the entities it names.',
|
|
388
|
+
path: ["lookup", "nameFallback"],
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// A weight naming a type the lookup does not address can never apply. Reject
|
|
393
|
+
// it rather than ignore it — a silent no-op is how a stale weight survives a
|
|
394
|
+
// rename (the type moves, the weight stays, and nothing says so).
|
|
395
|
+
const addressed = new Set<string>(
|
|
396
|
+
lookup.types ?? (lookup.type ? [lookup.type] : []),
|
|
397
|
+
);
|
|
398
|
+
for (const named of Object.keys(lookup.weights ?? {})) {
|
|
399
|
+
if (!addressed.has(named)) {
|
|
400
|
+
ctx.addIssue({
|
|
401
|
+
code: z.ZodIssueCode.custom,
|
|
402
|
+
message: `"lookup.weights" names "${named}", which is not in "lookup.type"/"lookup.types".`,
|
|
403
|
+
path: ["lookup", "weights"],
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
335
408
|
if (source === "graphql" && !lookup.graphqlType && !lookup.type) {
|
|
336
409
|
ctx.addIssue({
|
|
337
410
|
code: z.ZodIssueCode.custom,
|