@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
|
@@ -5,7 +5,47 @@
|
|
|
5
5
|
* and which properties to read; the query text is generated here so
|
|
6
6
|
* user-supplied names are always escaped SPARQL string literals, and level-gated
|
|
7
7
|
* fields below the active level are excluded from the projection (fetch-gating).
|
|
8
|
-
* Matching on the
|
|
8
|
+
* Matching on the name is exact and case-insensitive.
|
|
9
|
+
*
|
|
10
|
+
* WHAT an entity's name IS lives in one place — {@link nameBinding} — and every
|
|
11
|
+
* form here uses it: the asserted `by` value, plus, for a lookup that DECLARES
|
|
12
|
+
* `nameFallback: "iri"`, the IRI-derived name its class constraint can vouch
|
|
13
|
+
* for. That single binding is what makes the population a `list` publishes and
|
|
14
|
+
* the population a `lookup` answers to the same population.
|
|
15
|
+
*
|
|
16
|
+
* A name-addressed resolve RANKS, and returns every row it ranked. A name can
|
|
17
|
+
* reach several entities (25 of the live design system's block names do), and
|
|
18
|
+
* the `LIMIT 1` that used to sit under the ordering discarded all but the first
|
|
19
|
+
* inside the STORE, where nothing downstream could see that it had happened —
|
|
20
|
+
* `block lookup button` answered with Launchpad's Button and gave no sign the
|
|
21
|
+
* global one existed, because `apps_launchpad…` sorts before `global…`.
|
|
22
|
+
*
|
|
23
|
+
* The limit is gone from the NAME forms so the resolver can see what it is
|
|
24
|
+
* choosing between. It still answers with one entity — the arity is the tool's
|
|
25
|
+
* contract — but the rows it did not take become the IRIs of its notice, which
|
|
26
|
+
* is the only address that reaches them. (An IRI-addressed form keeps its
|
|
27
|
+
* `LIMIT 1`: an IRI is one entity by construction, so there is nothing to rank
|
|
28
|
+
* and nothing set aside.)
|
|
29
|
+
*
|
|
30
|
+
* The losers are NOT free, and an earlier draft of this comment claimed they
|
|
31
|
+
* were. `lookupProjection`'s optionals sit in the same SELECT as the ranking, so
|
|
32
|
+
* every matching URI has its declared fields projected, and a multi-valued field
|
|
33
|
+
* multiplies rows per entity before `firstRowPerEntity` throws them away. On the
|
|
34
|
+
* live graph that is small — 25 shared names, two entities each — but it is a
|
|
35
|
+
* product, not a constant, and the honest shape is a two-phase resolve: rank the
|
|
36
|
+
* URIs in a minimal SELECT, then project fields for the ones actually answered
|
|
37
|
+
* with. That restructure is deliberately not done here: it is the same query the
|
|
38
|
+
* pending no-limit change would rewrite again, and doing it twice would land two
|
|
39
|
+
* migrations on one seam.
|
|
40
|
+
*
|
|
41
|
+
* The order is {@link rankingClause}'s `?score`, then `STR(?uri)`. The score
|
|
42
|
+
* multiplies the two things a pack may declare about which entity a bare name
|
|
43
|
+
* MEANS — `weights` (which KIND of thing) and `scopeWeight` (WHOSE) — and a
|
|
44
|
+
* story that declares neither falls through to `STR(?uri)` alone, a total,
|
|
45
|
+
* engine-independent order over a variable that is always bound (`?uri` carries
|
|
46
|
+
* the class constraint, or the `by` triple when the name is not derived), so it
|
|
47
|
+
* needs no unbound-value sentinel. That final key is what makes the ranking a
|
|
48
|
+
* TOTAL order rather than a better arbitrary one.
|
|
9
49
|
*/
|
|
10
50
|
|
|
11
51
|
import { activeExpands, activeFields } from "../disclosure.js";
|
|
@@ -35,11 +75,15 @@ function buildTypeConstraint(lookup: PackLookup): string {
|
|
|
35
75
|
* differ ONLY in how `?uri` is bound (a `FILTER` on the escaped name vs a `BIND`
|
|
36
76
|
* of the resolved IRI), so both thread the active level through here and gate
|
|
37
77
|
* identically — an IRI-addressed lookup honours `--detail` just like a name one.
|
|
78
|
+
*
|
|
79
|
+
* `constraint` and `optionals` are handed back SEPARATELY because the `?name`
|
|
80
|
+
* binding has to sit between them: it reads `?uri`, which the class constraint
|
|
81
|
+
* binds, and a SPARQL `BIND` may only name variables already in scope.
|
|
38
82
|
*/
|
|
39
83
|
function lookupProjection(
|
|
40
84
|
lookup: PackLookup,
|
|
41
85
|
level: string | undefined,
|
|
42
|
-
): { header: string;
|
|
86
|
+
): { header: string; constraint: string; optionals: string } {
|
|
43
87
|
const fields = activeFields(lookup, level);
|
|
44
88
|
const vars = fields.map((field) => `?${field.name}`).join(" ");
|
|
45
89
|
const optionals = fields
|
|
@@ -50,31 +94,281 @@ function lookupProjection(
|
|
|
50
94
|
.join("\n");
|
|
51
95
|
return {
|
|
52
96
|
header: `SELECT ?uri ?name${vars.length > 0 ? ` ${vars}` : ""} WHERE {`,
|
|
53
|
-
|
|
97
|
+
constraint: buildTypeConstraint(lookup).trimEnd(),
|
|
98
|
+
optionals,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* The IRI-derived display name, in ONE spelling every relaxed form shares.
|
|
104
|
+
*
|
|
105
|
+
* The local name is everything after the last `#` or `/`, and its dot-separated
|
|
106
|
+
* hierarchy segments are published with slashes — `cs:react.component.props` →
|
|
107
|
+
* `react/component/props`. That is not an invention here: it is the derivation
|
|
108
|
+
* the `standard` list story already performs to PUBLISH a row's name, so this is
|
|
109
|
+
* the same rule read from the other side. Written once, so the name a list hands
|
|
110
|
+
* out and the name a lookup answers to cannot drift apart.
|
|
111
|
+
*/
|
|
112
|
+
const DERIVED_NAME = 'REPLACE(REPLACE(STR(?uri), "^.*[#/]", ""), "\\\\.", "/")';
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* The `?name` binding shared by every lookup form.
|
|
116
|
+
*
|
|
117
|
+
* By DEFAULT the `by` triple is required, and that is the honest default: `by`
|
|
118
|
+
* is documented as "the property whose value names the entity", so an entity
|
|
119
|
+
* without one has no name, is not addressable, and is not drawn by `sample`.
|
|
120
|
+
* It is also the one thing standing between a typo'd IRI and an empty entity.
|
|
121
|
+
*
|
|
122
|
+
* A story whose `list` SYNTHESIZES a name instead of reading one declares
|
|
123
|
+
* `nameFallback: "iri"`, and then the triple becomes OPTIONAL with
|
|
124
|
+
* {@link DERIVED_NAME} behind it. `standard` is the case that exists: 22 of the
|
|
125
|
+
* 156 live code standards carry a `cs:name`, and the code-standards ontology
|
|
126
|
+
* says so deliberately — it is "an optional human-readable display title" that
|
|
127
|
+
* "never participates in identity". `standard list` published
|
|
128
|
+
* `react/component/tsdoc` while `standard lookup react/component/tsdoc`
|
|
129
|
+
* answered ENTITY_NOT_FOUND with empty suggestions, because the only
|
|
130
|
+
* addressable population was the ~13% carrying an asserted name.
|
|
131
|
+
*
|
|
132
|
+
* INFERRING the fallback from the mere PRESENCE of a class constraint is what
|
|
133
|
+
* this option replaced, and it was over-reach in both directions of the same
|
|
134
|
+
* defect: `token list` requires `ds:tokenId`, so an inferred fallback made a
|
|
135
|
+
* `ds:Token` without one addressable and sampleable under a name `token list`
|
|
136
|
+
* never publishes. The declaration is per story because the list/lookup
|
|
137
|
+
* agreement is per story.
|
|
138
|
+
*
|
|
139
|
+
* The class constraint is still required for the fallback (the schema rejects
|
|
140
|
+
* the pairing, and this guard keeps a statically-compiled story from generating
|
|
141
|
+
* a query with nothing bounding `?uri`): a derived name is only as trustworthy
|
|
142
|
+
* as the class vouching for the entity it came from.
|
|
143
|
+
*
|
|
144
|
+
* One binding then serves the name resolve, the miss-suggestion pool, glob
|
|
145
|
+
* expansion and `sample`'s draw pool alike — every form that decides WHICH
|
|
146
|
+
* entities a name can reach. (The IRI-addressed forms reach an entity without
|
|
147
|
+
* going through a name at all: see {@link iriNameBinding}.)
|
|
148
|
+
*/
|
|
149
|
+
function nameBinding(lookup: PackLookup): string {
|
|
150
|
+
if (!derivesNames(lookup)) return ` ?uri ${formatTerm(lookup.by)} ?name .`;
|
|
151
|
+
return [
|
|
152
|
+
` OPTIONAL { ?uri ${formatTerm(lookup.by)} ?byName . }`,
|
|
153
|
+
` BIND(COALESCE(?byName, ${DERIVED_NAME}) AS ?name)`,
|
|
154
|
+
].join("\n");
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Whether this lookup names an entity that carries no `by` value.
|
|
159
|
+
*
|
|
160
|
+
* The class constraint is part of the condition, not merely a schema rule the
|
|
161
|
+
* builders trust: without one there is no triple bounding `?uri`, so a derived
|
|
162
|
+
* name would be scanned over the whole graph. The schema rejects the pairing
|
|
163
|
+
* for declared packs; this keeps a statically-compiled story from generating
|
|
164
|
+
* that query.
|
|
165
|
+
*/
|
|
166
|
+
function derivesNames(lookup: PackLookup): boolean {
|
|
167
|
+
return (
|
|
168
|
+
lookup.nameFallback === "iri" &&
|
|
169
|
+
Boolean(lookup.type ?? lookup.types?.length)
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* The `?name` binding for an IRI-ADDRESSED form.
|
|
175
|
+
*
|
|
176
|
+
* An IRI names the entity by itself, so here the `by` value is a LABEL to
|
|
177
|
+
* project, not the thing that identifies it — and the class constraint is
|
|
178
|
+
* already a sufficient existence check. So the triple is OPTIONAL wherever a
|
|
179
|
+
* class vouches for the entity, and `?name` is simply left unbound when there is
|
|
180
|
+
* no label; it is REQUIRED only for a lookup constraining no class, where it is
|
|
181
|
+
* the one thing standing between a typo'd IRI and an empty entity.
|
|
182
|
+
*
|
|
183
|
+
* A story that {@link derivesNames} gets the same COALESCE the name forms use,
|
|
184
|
+
* so an entity reached by IRI reports the name `list` published for it rather
|
|
185
|
+
* than a blank.
|
|
186
|
+
*/
|
|
187
|
+
function iriNameBinding(lookup: PackLookup): string {
|
|
188
|
+
if (derivesNames(lookup)) return nameBinding(lookup);
|
|
189
|
+
const named = `?uri ${formatTerm(lookup.by)} ?name .`;
|
|
190
|
+
const constrained = Boolean(lookup.type ?? lookup.types?.length);
|
|
191
|
+
return constrained ? ` OPTIONAL { ${named} }` : ` ${named}`;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Render a declared weight as a SPARQL numeric literal (never exponential).
|
|
196
|
+
*
|
|
197
|
+
* `toFixed` is the wrong instrument twice over, and both bite inside the 0–1
|
|
198
|
+
* range the schema allows. It ROUNDS — `0.1234567` became `0.123457`, silently
|
|
199
|
+
* altering a ranking a pack author declared — and stripping the trailing zeros
|
|
200
|
+
* off its output turns `0.0000001` into `0.`, which is not a numeric literal at
|
|
201
|
+
* all and makes the query a parse error rather than a wrong answer.
|
|
202
|
+
*
|
|
203
|
+
* `String` already prints the shortest exact round-trip, so it is the right
|
|
204
|
+
* source of digits; the only thing it does that SPARQL cannot read is
|
|
205
|
+
* exponent notation, which xsd:decimal's grammar has no form for. Expand that
|
|
206
|
+
* case and pass everything else through untouched.
|
|
207
|
+
*/
|
|
208
|
+
function sparqlNumber(value: number): string {
|
|
209
|
+
if (Number.isInteger(value)) return String(value);
|
|
210
|
+
const text = String(value);
|
|
211
|
+
const exponent = /e-(\d+)$/i.exec(text);
|
|
212
|
+
if (exponent === null) return text;
|
|
213
|
+
// `1e-7` / `1.5e-7`: the decimal places needed are the exponent plus whatever
|
|
214
|
+
// the mantissa already carried, which is exact — no rounding can occur.
|
|
215
|
+
const mantissaPlaces = text.split("e")[0]?.split(".")[1]?.length ?? 0;
|
|
216
|
+
return value.toFixed(Number(exponent[1]) + mantissaPlaces);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* `left * right`, guarded where an operand may be ZERO.
|
|
221
|
+
*
|
|
222
|
+
* Not defensiveness — a MEASURED engine defect, and the top scope hits it every
|
|
223
|
+
* time. oxigraph raises on an xsd:decimal times a zero (`0.2 * 0` errors, while
|
|
224
|
+
* `0.2 * 1` is `0.2`), and a raising expression inside a `BIND` leaves its
|
|
225
|
+
* variable unbound. Written the arithmetic way, the depth-0 scope — the one that
|
|
226
|
+
* is supposed to WIN — is the only one whose weight never binds, and what
|
|
227
|
+
* happens next is decided by whatever the surrounding `COALESCE` falls back to.
|
|
228
|
+
* The same expression on the `block list` side fell back to 0 and sorted every
|
|
229
|
+
* top-tier row LAST, which is how this was found. Both sides now say what they
|
|
230
|
+
* mean. Only VARIABLE operands are tested; a declared literal is resolved at
|
|
231
|
+
* build time by the callers.
|
|
232
|
+
*/
|
|
233
|
+
function sparqlProduct(left: string, right: string): string {
|
|
234
|
+
const guards = [left, right]
|
|
235
|
+
.filter((operand) => operand.startsWith("?"))
|
|
236
|
+
.map((operand) => `${operand} = 0`);
|
|
237
|
+
const product = `${left} * ${right}`;
|
|
238
|
+
return guards.length === 0
|
|
239
|
+
? product
|
|
240
|
+
: `IF(${guards.join(" || ")}, 0, ${product})`;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* The type factor: the LOWEST weight declared for any class the entity belongs
|
|
245
|
+
* to, 1 when none is.
|
|
246
|
+
*
|
|
247
|
+
* An IF-ladder over `EXISTS` rather than a weight column on the class VALUES,
|
|
248
|
+
* because a join would multiply rows for an entity in two weighted classes and
|
|
249
|
+
* the resolve now returns every row it finds. Lowest weight tested FIRST, so the
|
|
250
|
+
* ladder means MIN — the same rule the MCP listing's `effectiveWeight` states in
|
|
251
|
+
* prose: a demotion any membership asks for is not cancelled by a membership
|
|
252
|
+
* that asked for nothing.
|
|
253
|
+
*/
|
|
254
|
+
function typeWeightBind(lookup: PackLookup): string {
|
|
255
|
+
const declared = Object.entries(lookup.weights ?? {});
|
|
256
|
+
if (declared.length === 0) return "";
|
|
257
|
+
const ladder = [...declared]
|
|
258
|
+
.sort(([aType, aWeight], [bType, bWeight]) =>
|
|
259
|
+
aWeight === bWeight ? aType.localeCompare(bType) : aWeight - bWeight,
|
|
260
|
+
)
|
|
261
|
+
.reduceRight(
|
|
262
|
+
(fallback, [type, weight]) =>
|
|
263
|
+
`IF(EXISTS { ?uri a ${formatTerm(type)} }, ${sparqlNumber(weight)}, ${fallback})`,
|
|
264
|
+
"1",
|
|
265
|
+
);
|
|
266
|
+
return ` BIND(${ladder} AS ?rankType)`;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* The scope factor: how much the entity's containing scope is worth, DERIVED
|
|
271
|
+
* from the depth of that scope's own path-shaped name.
|
|
272
|
+
*
|
|
273
|
+
* Nested OPTIONALs, not a flat sequence: `?rankScope` is unbound for an entity
|
|
274
|
+
* outside any scope, and a following top-level `OPTIONAL { ?rankScope <by> ?n }`
|
|
275
|
+
* would then match every such triple in the graph and multiply the row.
|
|
276
|
+
*
|
|
277
|
+
* The depth is the separator count, so nothing is enumerated and a scope the
|
|
278
|
+
* ontology adds tomorrow inherits its place. `COALESCE` states the retirement
|
|
279
|
+
* path in the query itself: an ASSERTED weight wins, the derived one answers
|
|
280
|
+
* until there is one, and an entity with no scope at all scores a neutral 1
|
|
281
|
+
* rather than dropping below entities that have one.
|
|
282
|
+
*/
|
|
283
|
+
function scopeWeightBinds(lookup: PackLookup): string {
|
|
284
|
+
const scope = lookup.scopeWeight;
|
|
285
|
+
if (!scope) return "";
|
|
286
|
+
const name = "?rankScopeName";
|
|
287
|
+
const asserted = scope.asserted
|
|
288
|
+
? [
|
|
289
|
+
` OPTIONAL { ?rankScope ${formatTerm(scope.asserted)} ?rankAsserted . }`,
|
|
290
|
+
]
|
|
291
|
+
: [];
|
|
292
|
+
// A falloff of 0 ranks every scope alike, so the derived weight is the
|
|
293
|
+
// constant — and the depth it would multiply is never computed.
|
|
294
|
+
const derived =
|
|
295
|
+
scope.falloff === 0
|
|
296
|
+
? "1"
|
|
297
|
+
: `1 - ${sparqlProduct(sparqlNumber(scope.falloff), "?rankDepth")}`;
|
|
298
|
+
return [
|
|
299
|
+
" OPTIONAL {",
|
|
300
|
+
` ?uri ${formatTerm(scope.via)} ?rankScope .`,
|
|
301
|
+
` OPTIONAL { ?rankScope ${formatTerm(scope.by)} ${name} . }`,
|
|
302
|
+
...asserted,
|
|
303
|
+
" }",
|
|
304
|
+
` BIND(STRLEN(${name}) - STRLEN(REPLACE(${name}, "/", "")) AS ?rankDepth)`,
|
|
305
|
+
` BIND(${derived} AS ?rankDerived)`,
|
|
306
|
+
// Floored at 0: a scope deep enough to drive the factor negative would
|
|
307
|
+
// otherwise INVERT the type factor it multiplies, promoting a part of a
|
|
308
|
+
// block above a whole one.
|
|
309
|
+
` BIND(COALESCE(${scope.asserted ? "?rankAsserted, " : ""}IF(?rankDerived < 0, 0, ?rankDerived), 1) AS ?rankScopeWeight)`,
|
|
310
|
+
].join("\n");
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* The `?score` a name resolve orders by, and the ORDER BY that reads it.
|
|
315
|
+
*
|
|
316
|
+
* The two factors MULTIPLY rather than tiebreak, and that is the editorial
|
|
317
|
+
* ruling, not an implementation convenience: neither question subsumes the
|
|
318
|
+
* other. A whole component in a nested scope (1 × 0.8) outranks a mere PART of a
|
|
319
|
+
* block in the widest one (0.6 × 1), while two components of equal kind are
|
|
320
|
+
* separated by their scopes alone (1 × 1 beats 1 × 0.8). Both live cases fall
|
|
321
|
+
* out of one product.
|
|
322
|
+
*
|
|
323
|
+
* @returns The BIND lines to splice into the WHERE clause, and the ORDER BY
|
|
324
|
+
* line — a story declaring neither factor gets no BINDs and `STR(?uri)` alone.
|
|
325
|
+
*/
|
|
326
|
+
function rankingClause(lookup: PackLookup): {
|
|
327
|
+
binds: string;
|
|
328
|
+
orderBy: string;
|
|
329
|
+
} {
|
|
330
|
+
const factors = [typeWeightBind(lookup), scopeWeightBinds(lookup)].filter(
|
|
331
|
+
(line) => line !== "",
|
|
332
|
+
);
|
|
333
|
+
if (factors.length === 0) return { binds: "", orderBy: "ORDER BY STR(?uri)" };
|
|
334
|
+
const terms = [
|
|
335
|
+
lookup.weights && Object.keys(lookup.weights).length > 0 ? "?rankType" : "",
|
|
336
|
+
lookup.scopeWeight ? "?rankScopeWeight" : "",
|
|
337
|
+
].filter((term) => term !== "");
|
|
338
|
+
return {
|
|
339
|
+
binds: [
|
|
340
|
+
...factors,
|
|
341
|
+
` BIND(${terms.length === 2 ? sparqlProduct(terms[0] as string, terms[1] as string) : terms.join("")} AS ?score)`,
|
|
342
|
+
].join("\n"),
|
|
343
|
+
orderBy: "ORDER BY DESC(?score) STR(?uri)",
|
|
54
344
|
};
|
|
55
345
|
}
|
|
56
346
|
|
|
57
347
|
/**
|
|
58
|
-
* Build the SELECT retrieving
|
|
348
|
+
* Build the SELECT retrieving the entities a name reaches, with their declared
|
|
349
|
+
* fields, best first. The caller answers with the first and names the rest.
|
|
59
350
|
*
|
|
60
351
|
* @param lookup - The pack's lookup declaration.
|
|
61
352
|
* @param name - User-supplied entity name (escaped here).
|
|
62
353
|
* @param level - Active canonical level; gated fields below it are excluded.
|
|
63
|
-
* @returns SPARQL SELECT text.
|
|
354
|
+
* @returns SPARQL SELECT text, ranked and unlimited.
|
|
64
355
|
*/
|
|
65
356
|
export function buildLookupQuery(
|
|
66
357
|
lookup: PackLookup,
|
|
67
358
|
name: string,
|
|
68
359
|
level?: string,
|
|
69
360
|
): string {
|
|
70
|
-
const { header,
|
|
361
|
+
const { header, constraint, optionals } = lookupProjection(lookup, level);
|
|
362
|
+
const ranking = rankingClause(lookup);
|
|
71
363
|
return [
|
|
72
364
|
header,
|
|
73
|
-
|
|
74
|
-
|
|
365
|
+
constraint,
|
|
366
|
+
nameBinding(lookup),
|
|
367
|
+
ranking.binds,
|
|
368
|
+
optionals,
|
|
75
369
|
` FILTER (LCASE(STR(?name)) = LCASE("${escapeSparqlString(name)}"))`,
|
|
76
370
|
"}",
|
|
77
|
-
|
|
371
|
+
ranking.orderBy,
|
|
78
372
|
]
|
|
79
373
|
.filter((line) => line !== "")
|
|
80
374
|
.join("\n");
|
|
@@ -98,12 +392,13 @@ export function buildLookupByIriQuery(
|
|
|
98
392
|
iri: string,
|
|
99
393
|
level?: string,
|
|
100
394
|
): string {
|
|
101
|
-
const { header,
|
|
395
|
+
const { header, constraint, optionals } = lookupProjection(lookup, level);
|
|
102
396
|
return [
|
|
103
397
|
header,
|
|
104
398
|
` BIND(<${iri}> AS ?uri)`,
|
|
105
|
-
|
|
106
|
-
|
|
399
|
+
constraint,
|
|
400
|
+
iriNameBinding(lookup),
|
|
401
|
+
optionals,
|
|
107
402
|
"}",
|
|
108
403
|
"LIMIT 1",
|
|
109
404
|
]
|
|
@@ -114,26 +409,71 @@ export function buildLookupByIriQuery(
|
|
|
114
409
|
/**
|
|
115
410
|
* Build the minimal name→URI resolve for a graphql-sourced lookup (and the
|
|
116
411
|
* shared entry point for the sparql path's name form): maps the user-supplied
|
|
117
|
-
* name to the entity
|
|
412
|
+
* name to the entity IRIs, everything else comes from the field fetch. The name
|
|
118
413
|
* is an escaped literal; all terms are validated pack terms.
|
|
414
|
+
*
|
|
415
|
+
* Ranked and unlimited, exactly like {@link buildLookupQuery} — the two paths
|
|
416
|
+
* differ in where the VALUES come from, never in which entities a name reaches.
|
|
417
|
+
* `?score` is deliberately NOT projected: it orders the rows and is none of the
|
|
418
|
+
* caller's business, and projecting it would leak a ranking artefact into
|
|
419
|
+
* `--format json`.
|
|
119
420
|
*/
|
|
120
421
|
export function buildNameResolveQuery(
|
|
121
422
|
lookup: PackLookup,
|
|
122
423
|
name: string,
|
|
123
424
|
): string {
|
|
425
|
+
const ranking = rankingClause(lookup);
|
|
124
426
|
return [
|
|
125
427
|
"SELECT ?uri ?name WHERE {",
|
|
126
|
-
` ?uri ${formatTerm(lookup.by)} ?name .`,
|
|
127
428
|
buildTypeConstraint(lookup).trimEnd(),
|
|
429
|
+
nameBinding(lookup),
|
|
430
|
+
ranking.binds,
|
|
128
431
|
` FILTER (LCASE(STR(?name)) = LCASE("${escapeSparqlString(name)}"))`,
|
|
129
432
|
"}",
|
|
130
|
-
|
|
433
|
+
ranking.orderBy,
|
|
434
|
+
]
|
|
435
|
+
.filter((line) => line !== "")
|
|
436
|
+
.join("\n");
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* Build the minimal IRI→entity resolve for a graphql-sourced lookup: the mirror
|
|
441
|
+
* of {@link buildNameResolveQuery} for the other argument shape.
|
|
442
|
+
*
|
|
443
|
+
* The GraphQL lane fetches by IRI, so this exists to ANSWER ONE QUESTION — does
|
|
444
|
+
* the pack's class constraint vouch for this entity? — and to pick up a display
|
|
445
|
+
* name if there is one. Injection-safe by construction: `iri` is already
|
|
446
|
+
* resolved and validated against the embeddable-IRI shape by the caller.
|
|
447
|
+
*/
|
|
448
|
+
export function buildIriResolveQuery(lookup: PackLookup, iri: string): string {
|
|
449
|
+
return [
|
|
450
|
+
"SELECT ?uri ?name WHERE {",
|
|
451
|
+
` BIND(<${iri}> AS ?uri)`,
|
|
452
|
+
buildTypeConstraint(lookup).trimEnd(),
|
|
453
|
+
iriNameBinding(lookup),
|
|
454
|
+
"}",
|
|
131
455
|
"LIMIT 1",
|
|
132
456
|
]
|
|
133
457
|
.filter((line) => line !== "")
|
|
134
458
|
.join("\n");
|
|
135
459
|
}
|
|
136
460
|
|
|
461
|
+
/** Build the SELECT listing every entity IRI a lookup can address (IRI globs). */
|
|
462
|
+
export function buildLookupIrisQuery(lookup: PackLookup): string {
|
|
463
|
+
const constraint = buildTypeConstraint(lookup).trimEnd();
|
|
464
|
+
return [
|
|
465
|
+
"SELECT DISTINCT ?uri WHERE {",
|
|
466
|
+
// A pack that constrains by class is asking about its class; one that does
|
|
467
|
+
// not has only the `by` triple to bound the scan, so it keeps that bound
|
|
468
|
+
// (and, like the name population, addresses only entities that carry one).
|
|
469
|
+
constraint !== "" ? constraint : ` ?uri ${formatTerm(lookup.by)} ?name .`,
|
|
470
|
+
"}",
|
|
471
|
+
"ORDER BY STR(?uri)",
|
|
472
|
+
]
|
|
473
|
+
.filter((line) => line !== "")
|
|
474
|
+
.join("\n");
|
|
475
|
+
}
|
|
476
|
+
|
|
137
477
|
/**
|
|
138
478
|
* Build the sub-SELECT retrieving one expand's child rows for a resolved entity.
|
|
139
479
|
*
|
|
@@ -166,9 +506,19 @@ export function buildExpandQuery(
|
|
|
166
506
|
/** Build the SELECT listing all entity names — lookup-miss suggestions. */
|
|
167
507
|
export function buildLookupNamesQuery(lookup: PackLookup): string {
|
|
168
508
|
return [
|
|
169
|
-
|
|
170
|
-
|
|
509
|
+
// DISTINCT: this population feeds miss-suggestions and glob expansion, and
|
|
510
|
+
// a name that several entities share is one CANDIDATE, not several. Without
|
|
511
|
+
// it a glob matching such a name expanded to it once per entity carrying
|
|
512
|
+
// it, and `lookup` then resolved each copy to the same winner — so
|
|
513
|
+
// `block lookup 'Butt*'` listed one Button twice while the other Button
|
|
514
|
+
// never appeared at all.
|
|
515
|
+
"SELECT DISTINCT ?name WHERE {",
|
|
171
516
|
buildTypeConstraint(lookup).trimEnd(),
|
|
517
|
+
// Same {@link nameBinding} the resolves use, so the addressable population
|
|
518
|
+
// and the resolvable population are the same population. When they were
|
|
519
|
+
// not, a name a miss-suggestion offered could itself miss, and a glob
|
|
520
|
+
// expanded over a pool the resolve could not answer from.
|
|
521
|
+
nameBinding(lookup),
|
|
172
522
|
"}",
|
|
173
523
|
]
|
|
174
524
|
.filter((line) => line !== "")
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The SPARQL path — every generated read a pack story performs, and the two
|
|
3
|
+
* row operations that must NOT be generated.
|
|
4
|
+
*
|
|
5
|
+
* The domain is organised around one invariant: user input never reaches query
|
|
6
|
+
* text. The query builders compose only from validated pack terms and escaped
|
|
7
|
+
* literals, so a name a user typed becomes a SPARQL string literal or nothing;
|
|
8
|
+
* `runSelect` is the single choke point every one of those trusted queries
|
|
9
|
+
* goes through, which is what makes "a generated query failed" distinguishable
|
|
10
|
+
* from "the user's own `graph query` failed". Filtering and search then run as
|
|
11
|
+
* predicates over the resolved ROWS rather than as clauses in the query —
|
|
12
|
+
* which is why they live in this domain despite touching no SPARQL at all:
|
|
13
|
+
* they are the operations that would otherwise be tempting to express as query
|
|
14
|
+
* text, and keeping them here keeps the temptation answered.
|
|
15
|
+
*
|
|
16
|
+
* The escaping primitives stay internal. They are how the builders keep that
|
|
17
|
+
* invariant, not a service for composing query text elsewhere — a caller with
|
|
18
|
+
* the escaper is a caller who can build an unvalidated query, which is exactly
|
|
19
|
+
* the shape this domain exists to prevent.
|
|
20
|
+
*
|
|
21
|
+
* Two names re-exported by `buildLookupQuery.ts` for its own callers'
|
|
22
|
+
* convenience — the disclosure-level field and expand selectors — are also
|
|
23
|
+
* omitted. They belong to `kernel/packs/disclosure.ts`; laundering them
|
|
24
|
+
* through here would make this domain look like their owner and freeze a
|
|
25
|
+
* pass-through that has no reason to be permanent.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
export { applyPackFilters } from "./applyFilters.js";
|
|
29
|
+
export { applyPackSearch } from "./applySearch.js";
|
|
30
|
+
export {
|
|
31
|
+
buildExpandQuery,
|
|
32
|
+
buildLookupByIriQuery,
|
|
33
|
+
buildLookupNamesQuery,
|
|
34
|
+
buildLookupQuery,
|
|
35
|
+
buildNameResolveQuery,
|
|
36
|
+
} from "./buildLookupQuery.js";
|
|
37
|
+
export { runSelect } from "./runSelect.js";
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Pins the remap: a generated query is composed from declared and pack-authored
|
|
5
5
|
* terms, never from user input, so a "Prefix not found" from the facade means
|
|
6
6
|
* the store cannot answer this read — an actionable error, NOT a raw one
|
|
7
|
-
* collapsing to INTERNAL_ERROR ("
|
|
7
|
+
* collapsing to INTERNAL_ERROR ("report this issue").
|
|
8
8
|
*
|
|
9
9
|
* WHICH actionable error is the story's provenance to decide, which is the
|
|
10
10
|
* second thing pinned here. A DISTRIBUTION story keeps STORE_UNAVAILABLE and its
|
|
@@ -10,9 +10,8 @@
|
|
|
10
10
|
* (`graph query`) goes through the facade directly and stays INVALID_INPUT.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import { PragmaError } from "../../error/
|
|
14
|
-
import {
|
|
15
|
-
import type { PragmaRuntime } from "../../runtime/types.js";
|
|
13
|
+
import { cliRecovery, PragmaError } from "../../error/index.js";
|
|
14
|
+
import type { PragmaRuntime } from "../../runtime/index.js";
|
|
16
15
|
import type { PackRow, StorySource } from "../types.js";
|
|
17
16
|
|
|
18
17
|
/**
|
|
@@ -79,7 +78,7 @@ function unboundPrefixError(source: StorySource): PragmaError {
|
|
|
79
78
|
* Run the facade query, remapping a store that cannot answer it. A generated
|
|
80
79
|
* query hitting an unknown prefix surfaces an actionable error — chosen by the
|
|
81
80
|
* story's provenance, see {@link unboundPrefixError} — instead of a raw SPARQL
|
|
82
|
-
* "Prefix not found" wrapped as INTERNAL_ERROR ("
|
|
81
|
+
* "Prefix not found" wrapped as INTERNAL_ERROR ("report this issue").
|
|
83
82
|
* Returns the inferred facade result type, so this module stays clear of a
|
|
84
83
|
* static `@canonical/ke` import (the lazy-dispatch guard).
|
|
85
84
|
*/
|
|
@@ -47,9 +47,7 @@ describe("pack toolDescription wiring (PROTECTED)", () => {
|
|
|
47
47
|
"Get type and theme values for one or more design tokens by name.",
|
|
48
48
|
);
|
|
49
49
|
// The authored MCP tool-call example survives on the MCP surface.
|
|
50
|
-
expect(desc).toContain(
|
|
51
|
-
'Example: token_lookup { names: ["color.primary"] }',
|
|
52
|
-
);
|
|
50
|
+
expect(desc).toContain('Example: token_lookup { name: ["color.primary"] }');
|
|
53
51
|
});
|
|
54
52
|
|
|
55
53
|
it("routes the definition-level toolDescription to the MCP list tool", async () => {
|
|
@@ -70,7 +68,11 @@ describe("pack toolDescription wiring (PROTECTED)", () => {
|
|
|
70
68
|
(t) => t.name === "standard_categories",
|
|
71
69
|
)?.description;
|
|
72
70
|
await mcp.cleanup();
|
|
73
|
-
|
|
71
|
+
// The authored prose reaches the extra verb's tool, whole. Asserted by
|
|
72
|
+
// fragment rather than by exact string: the wiring is what this pins, and
|
|
73
|
+
// tool descriptions are explicitly not frozen (`registerVerb.ts:324-326`).
|
|
74
|
+
expect(desc).toContain("List all code standard categories");
|
|
75
|
+
expect(desc).toContain("Example: standard_categories {}");
|
|
74
76
|
});
|
|
75
77
|
|
|
76
78
|
it("CLI --help shows the rich prose but NEVER the MCP tool-call syntax", () => {
|
|
@@ -87,3 +89,74 @@ describe("pack toolDescription wiring (PROTECTED)", () => {
|
|
|
87
89
|
expect(listHelp).not.toContain("token_list {");
|
|
88
90
|
});
|
|
89
91
|
});
|
|
92
|
+
|
|
93
|
+
describe("a tool-call example names a parameter the tool ACCEPTS (PROTECTED)", () => {
|
|
94
|
+
// Four `*_lookup` descriptions taught agents `{ names: [...] }` while every
|
|
95
|
+
// schema required `name`. An agent copying the example — which is what an
|
|
96
|
+
// example is for — got `-32602 Invalid arguments`, and the description is
|
|
97
|
+
// the only instruction it has. Prose that contradicts the schema beside it
|
|
98
|
+
// is worse than no prose: it is a documented wrong answer.
|
|
99
|
+
it("every `Example: tool { key: … }` uses a declared property", async () => {
|
|
100
|
+
const mcp = await projectMcp([...storyModules.values()]);
|
|
101
|
+
try {
|
|
102
|
+
const tools = await mcp.listTools();
|
|
103
|
+
const offenders: string[] = [];
|
|
104
|
+
|
|
105
|
+
for (const tool of tools) {
|
|
106
|
+
const example = /Example:\s*\w+\s*\{\s*([A-Za-z_$][\w$]*)\s*:/.exec(
|
|
107
|
+
tool.description ?? "",
|
|
108
|
+
);
|
|
109
|
+
const key = example?.[1];
|
|
110
|
+
if (key === undefined) continue; // No call example to check.
|
|
111
|
+
const properties = Object.keys(
|
|
112
|
+
(tool.inputSchema as { properties?: Record<string, unknown> })
|
|
113
|
+
?.properties ?? {},
|
|
114
|
+
);
|
|
115
|
+
if (!properties.includes(key)) {
|
|
116
|
+
offenders.push(
|
|
117
|
+
`${tool.name}: example says \`${key}\`, schema declares ${properties.join(", ")}`,
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
expect(offenders).toEqual([]);
|
|
123
|
+
// Guard against a vacuous pass: some tool must actually carry an example.
|
|
124
|
+
expect(
|
|
125
|
+
tools.filter((t) => /Example:\s*\w+\s*\{/.test(t.description ?? ""))
|
|
126
|
+
.length,
|
|
127
|
+
).toBeGreaterThan(0);
|
|
128
|
+
} finally {
|
|
129
|
+
await mcp.cleanup();
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
describe("every story tool CARRIES a call example (PROTECTED)", () => {
|
|
135
|
+
// The check above only polices examples that exist. `standard` authored NONE,
|
|
136
|
+
// and the auto-generated one fires only for a filter declaring `values` —
|
|
137
|
+
// which the category filter deliberately does not, because the graph is the
|
|
138
|
+
// vocabulary. So the four `standard_*` tools shipped with no worked call at
|
|
139
|
+
// all, and the model that could not form one had nothing to copy.
|
|
140
|
+
//
|
|
141
|
+
// This asserts the gap cannot reappear on a future story: a compiled story
|
|
142
|
+
// tool must show an agent one call it can make, spelled with its OWN name so
|
|
143
|
+
// the example cannot be copied from a sibling tool and left stale.
|
|
144
|
+
it("names its own tool in an `Example: <tool_name> {…}` fragment", async () => {
|
|
145
|
+
const mcp = await projectMcp([...storyModules.values()]);
|
|
146
|
+
try {
|
|
147
|
+
const tools = await mcp.listTools();
|
|
148
|
+
expect(tools.length).toBeGreaterThan(0);
|
|
149
|
+
const missing = tools
|
|
150
|
+
.filter(
|
|
151
|
+
(tool) =>
|
|
152
|
+
!new RegExp(`Example:\\s*${tool.name}\\s*\\{`).test(
|
|
153
|
+
tool.description ?? "",
|
|
154
|
+
),
|
|
155
|
+
)
|
|
156
|
+
.map((tool) => tool.name);
|
|
157
|
+
expect(missing).toEqual([]);
|
|
158
|
+
} finally {
|
|
159
|
+
await mcp.cleanup();
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
});
|