@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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The embedded pack: the distribution's own graph, compiled from the packs
|
|
3
|
-
* `pragma.conf.ts` declares and inlined into the
|
|
3
|
+
* `pragma.conf.ts` declares and inlined into the source as escaped strings
|
|
4
4
|
* (`pack.generated.ts`, produced by `scripts/bundle.ts`). It is the store the
|
|
5
5
|
* CLI boots when the user has not pinned their own packs and has not built
|
|
6
6
|
* anything yet — so a fresh install answers real store-backed reads with no
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
* their OWN generated module (like the index): dispatch reads them on every
|
|
23
23
|
* command, and pulling them out of `pack.generated.ts` would load its ~1.9 MB
|
|
24
24
|
* of n-quads with them — a measured +28 ms on every invocation. Inlining as JS strings
|
|
25
|
-
* (rather than file assets)
|
|
26
|
-
*
|
|
25
|
+
* (rather than file assets) means the pack travels with the emitted modules —
|
|
26
|
+
* it needs no asset step in any build, and no file lookup at run time.
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
29
|
import {
|
|
@@ -104,7 +104,7 @@ export function readManifest(dir: string): Manifest | undefined {
|
|
|
104
104
|
* would silently drop every package-declared noun. Requiring all four present +
|
|
105
105
|
* non-empty makes `buildPack` rebuild a torn pack and makes the boot decision
|
|
106
106
|
* surface STORE_UNAVAILABLE (the ordinary "not built" recovery) instead of a
|
|
107
|
-
* "
|
|
107
|
+
* "report this" crash. `stories.json` is additionally gated on its SHAPE
|
|
108
108
|
* — see {@link storiesAreReadable} for why it, and only it, is parsed here. */
|
|
109
109
|
export function packIsComplete(dir: string): boolean {
|
|
110
110
|
if (readManifest(dir) === undefined) return false;
|
|
@@ -16,8 +16,7 @@ import { readFileSync } from "node:fs";
|
|
|
16
16
|
import { join } from "node:path";
|
|
17
17
|
import { createStore } from "@canonical/ke";
|
|
18
18
|
import { compileFromExtraction } from "@canonical/ke-graphql";
|
|
19
|
-
import { PragmaError } from "../../error/
|
|
20
|
-
import { cliRecovery } from "../../error/recovery.js";
|
|
19
|
+
import { cliRecovery, PragmaError } from "../../error/index.js";
|
|
21
20
|
import type { StoreSession } from "../types.js";
|
|
22
21
|
import { readManifest } from "./manifest.js";
|
|
23
22
|
import { packIndexSchema } from "./schemas.js";
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* than silently reaching out.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import type { ConfigLayers } from "../config/
|
|
12
|
+
import type { ConfigLayers } from "../config/index.js";
|
|
13
13
|
import { materializeEmbeddedPack } from "./graphpack/embedded.js";
|
|
14
14
|
import { readPack } from "./graphpack/read.js";
|
|
15
15
|
import { resolveSources } from "./resolveSources.js";
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The `__store-probe` diagnostic — boot the embedded pack and report a count.
|
|
3
3
|
*
|
|
4
|
-
* Its whole reason to exist is the
|
|
5
|
-
* store-boot path (oxigraph WASM load, n-quads cache load,
|
|
6
|
-
* a SPARQL count) so a spawned
|
|
7
|
-
* embedded pack
|
|
8
|
-
* the
|
|
9
|
-
* catch, so this is the guard. Storeless code never imports it — the bin
|
|
4
|
+
* Its whole reason to exist is the PROCESS BOUNDARY: it exercises the full
|
|
5
|
+
* store-boot path (oxigraph WASM load, n-quads cache load,
|
|
6
|
+
* `compileFromExtraction`, a SPARQL count) so a spawned smoke test can prove the
|
|
7
|
+
* WASM and the embedded pack load from what actually ships. A silent store-boot
|
|
8
|
+
* failure in the shipped artifact is the one failure vitest's in-process suite
|
|
9
|
+
* cannot catch, so this is the guard (`wasmEmbed.test.ts` spawns it). Storeless code never imports it — the bin
|
|
10
10
|
* fast-paths it behind a dynamic import.
|
|
11
11
|
*/
|
|
12
12
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Store-backed single-entity read:
|
|
3
|
-
* grouped by predicate.
|
|
2
|
+
* Store-backed single-entity read: the GRAPH NEIGHBOURHOOD of one URI.
|
|
4
3
|
*
|
|
5
4
|
* The ONE reader shared by the `graph inspect` CLI verb and the MCP resource
|
|
6
5
|
* `read` — so a resource read and a `graph inspect` of the same URI return
|
|
@@ -11,52 +10,328 @@
|
|
|
11
10
|
* absolute IRI addresses the subject exactly and user input never reaches the
|
|
12
11
|
* query text raw.
|
|
13
12
|
*
|
|
13
|
+
* Four things make the payload answerable rather than merely faithful:
|
|
14
|
+
*
|
|
15
|
+
* - **Typed terms.** Read from ke's `termBindings` (the term-preserving view of
|
|
16
|
+
* the SAME rows), never the stringly `bindings`. This is what makes prefix
|
|
17
|
+
* compaction SAFE: only a `NamedNode` is compacted, so a literal whose text
|
|
18
|
+
* happens to start with a namespace IRI is no longer silently rewritten into
|
|
19
|
+
* something that reads as an IRI. It also keeps `datatype`/`language`, which
|
|
20
|
+
* the string view drops.
|
|
21
|
+
* - **Inbound relations.** Everything pointing AT the subject, grouped by
|
|
22
|
+
* predicate. Without it the entity that a resource is supposed to describe
|
|
23
|
+
* cannot answer "what implements this?" or "what inherits from this?" — the
|
|
24
|
+
* relations live on the OTHER side of the arrow and were simply invisible.
|
|
25
|
+
* - **Nested blank nodes.** A blank node is a store-local handle: it re-mints on
|
|
26
|
+
* every load and is unreachable through `pragma:{+uri}`. Inlining one level
|
|
27
|
+
* turns a dead `_:hash` into the record it stands for (a changelog entry's
|
|
28
|
+
* text/type/timestamp). Depth ONE is not a shortcut — 11 of this graph's 922
|
|
29
|
+
* blank nodes nest, so one level is what there is to inline.
|
|
30
|
+
* - **Neighbour titles.** Every named neighbour carries the human name the index
|
|
31
|
+
* already holds, so a reader is not forced into a second read per IRI just to
|
|
32
|
+
* learn that `ds:tag.needsdocumentation` is "needs:documentation".
|
|
33
|
+
*
|
|
34
|
+
* Bounded by the SHARED disclosure ladder, and by what an inbound group IS —
|
|
35
|
+
* because not every edge pointing at an entity is the same kind of thing:
|
|
36
|
+
*
|
|
37
|
+
* - A RELATION fans in narrowly and every subject is part of the answer
|
|
38
|
+
* (`ds:implementsBlock`, `ds:inheritsFrom`), so it is LISTED.
|
|
39
|
+
* - A ROSTER fans in without bound because it grows with the data rather than
|
|
40
|
+
* the model — a class extension (`rdf:type`), a tier's membership (`ds:tier`,
|
|
41
|
+
* 141 deep here) — and is already answered by `pragma/instanceCount` and by
|
|
42
|
+
* the noun's list verb. So it is SAMPLED: a few exemplars, flagged `sampled`,
|
|
43
|
+
* never a page. Listing rosters cost a `detailed` read 19.5 KB on one class
|
|
44
|
+
* and 20.9 KB on one tier, restating what a single `*_list` answers properly.
|
|
45
|
+
*
|
|
46
|
+
* The two are told apart by FAN-IN, not by predicate name, so the kernel names
|
|
47
|
+
* no vocabulary and a graph whose rosters hang off different predicates is
|
|
48
|
+
* bounded just the same. `count` always reports the TRUE total either way: a
|
|
49
|
+
* sample that silently passed for the whole set is how "3 implementations"
|
|
50
|
+
* becomes a wrong answer.
|
|
51
|
+
*
|
|
14
52
|
* Reached only behind the lazy store (a `needsStore` verb / a resource read), so
|
|
15
53
|
* it never lands on the storeless fast path.
|
|
16
54
|
*/
|
|
17
55
|
|
|
18
|
-
import {
|
|
19
|
-
import { cliRecovery } from "../error/
|
|
56
|
+
import type { DetailLevel } from "../../constants.js";
|
|
57
|
+
import { cliRecovery, PragmaError } from "../error/index.js";
|
|
20
58
|
import { resolveUri } from "../packs/iri.js";
|
|
59
|
+
import { compactUri, resolveDetail } from "../render/index.js";
|
|
60
|
+
import type { PackIndex } from "./graphpack/types.js";
|
|
21
61
|
import type { PragmaRuntime } from "./types.js";
|
|
22
62
|
|
|
23
|
-
|
|
63
|
+
// Inline `import("…")` type (no `from`) — a static `import type` from
|
|
64
|
+
// @canonical/ke still puts the package on the module graph the lazy-dispatch
|
|
65
|
+
// probe walks (`capabilities/lazy.test.ts`), which would drag the store runtime
|
|
66
|
+
// onto the storeless `--help`/`__complete` fast path. Same device, and same
|
|
67
|
+
// reason, as `graph/query.render.ts`.
|
|
68
|
+
type Term = import("@canonical/ke").Term;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Where a relation stops being an answer and becomes a roster.
|
|
72
|
+
*
|
|
73
|
+
* A group at or under this fan-in is LISTED: every subject is part of the
|
|
74
|
+
* answer, and there are few enough that reading them is cheaper than going to
|
|
75
|
+
* fetch them. Above it, listing the head is not more useful than showing a few
|
|
76
|
+
* — only longer — so the group is SAMPLED instead.
|
|
77
|
+
*
|
|
78
|
+
* Derived from fan-in rather than from a predicate name, which is what keeps the
|
|
79
|
+
* kernel free of vocabulary: `rdf:type` inbound is the obvious roster (a class
|
|
80
|
+
* extension, unbounded by construction and already answered by
|
|
81
|
+
* `pragma/instanceCount` and the noun's list verb), but it is NOT the only one.
|
|
82
|
+
* Membership edges behave identically — this graph's `ds:tier` fans in 141 deep
|
|
83
|
+
* — and a rule keyed on `rdf:type` would have left a `detailed` read of one tier
|
|
84
|
+
* at 20.9 KB while congratulating itself on having fixed classes.
|
|
85
|
+
*/
|
|
86
|
+
const ROSTER_THRESHOLD = 20;
|
|
87
|
+
|
|
88
|
+
/** How many subjects each level lists for a genuine ANSWER (fan-in ≤ threshold). */
|
|
89
|
+
const ANSWER_CAP: Readonly<Record<DetailLevel, number>> = {
|
|
90
|
+
summary: 0,
|
|
91
|
+
standard: 10,
|
|
92
|
+
detailed: ROSTER_THRESHOLD,
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* How many EXEMPLARS each level shows for a roster — the move the `*_sample`
|
|
97
|
+
* verbs make, and for the same reason: enough to see the shape of a member,
|
|
98
|
+
* never the roster itself. `count` stays exact and {@link InboundGroup.sampled}
|
|
99
|
+
* says which kind of answer this is, so a reader reaches for the list verb
|
|
100
|
+
* rather than trying to page a resource read into one.
|
|
101
|
+
*/
|
|
102
|
+
const SAMPLE_CAP: Readonly<Record<DetailLevel, number>> = {
|
|
103
|
+
summary: 0,
|
|
104
|
+
standard: 3,
|
|
105
|
+
detailed: 5,
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* How many characters of a LITERAL each level carries.
|
|
110
|
+
*
|
|
111
|
+
* The measured cost of a rich entity is not its structure but its prose: one
|
|
112
|
+
* button spent 8,572 of its 9,734 literal characters on two fields
|
|
113
|
+
* (`ds:guidelines` 5,814, `ds:usage` 2,758). Serving those in full at the
|
|
114
|
+
* DEFAULT level makes every read of that entity pay for documentation the
|
|
115
|
+
* reader may not have asked for — and the noun's own lookup verb serves the
|
|
116
|
+
* same fields under its own disclosure, properly.
|
|
117
|
+
*
|
|
118
|
+
* So long-form prose is what `detailed` is FOR. Below it a literal is previewed
|
|
119
|
+
* and marked {@link ReadTerm.truncated} with its true {@link ReadTerm.length},
|
|
120
|
+
* so a reader can always see that there is more and how much.
|
|
121
|
+
*/
|
|
122
|
+
const LITERAL_CAP: Readonly<Record<DetailLevel, number>> = {
|
|
123
|
+
summary: 120,
|
|
124
|
+
standard: 400,
|
|
125
|
+
detailed: Number.POSITIVE_INFINITY,
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Ceiling on the EXEMPLAR rows fetched — never on the counts.
|
|
130
|
+
*
|
|
131
|
+
* Counting and exhibiting are two different questions, and answering both from
|
|
132
|
+
* one capped query answered neither: a single `LIMIT` applies to the whole
|
|
133
|
+
* ordered result, so the first predicate to fill it under-reported its own
|
|
134
|
+
* `count` and every predicate after it vanished from the read entirely — while
|
|
135
|
+
* `InboundGroup.count` promised the true total. Counts now come from an
|
|
136
|
+
* aggregate the store computes; only the exemplars are bounded.
|
|
137
|
+
*/
|
|
138
|
+
const EXEMPLAR_FETCH_LIMIT = 500;
|
|
139
|
+
|
|
140
|
+
/** The predicate whose object is a subject's type — hoisted out of nested records. */
|
|
141
|
+
const RDF_TYPE = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type";
|
|
142
|
+
|
|
143
|
+
/** An RDF term as the read projects it: typed, compacted, and named. */
|
|
144
|
+
export interface ReadTerm {
|
|
145
|
+
readonly termType: "NamedNode" | "BlankNode" | "Literal";
|
|
146
|
+
/** The full lexical value (the IRI, the literal text, or the blank label). */
|
|
147
|
+
readonly value: string;
|
|
148
|
+
/** Prefixed form — `NamedNode` only, and only when a namespace matches. */
|
|
149
|
+
readonly prefixed?: string;
|
|
150
|
+
/** Human name from the pack index — `NamedNode` only, when the index knows it. */
|
|
151
|
+
readonly title?: string;
|
|
152
|
+
/** Literal datatype, compacted; absent for plain `xsd:string` (ke's convention). */
|
|
153
|
+
readonly datatype?: string;
|
|
154
|
+
/** Literal language tag, when the literal carries one. */
|
|
155
|
+
readonly language?: string;
|
|
156
|
+
/**
|
|
157
|
+
* Base direction of an RDF 1.2 directional literal. Dropped, `"hello"@en--ltr`
|
|
158
|
+
* is indistinguishable from a plain `"hello"@en` — which is exactly the kind
|
|
159
|
+
* of quiet flattening reading the TERM view was meant to stop.
|
|
160
|
+
*/
|
|
161
|
+
readonly direction?: "ltr" | "rtl";
|
|
162
|
+
/** Set when `value` is a PREFIX of the real literal (see {@link length}). */
|
|
163
|
+
readonly truncated?: true;
|
|
164
|
+
/** The literal's true character count, present only when truncated. */
|
|
165
|
+
readonly length?: number;
|
|
166
|
+
/**
|
|
167
|
+
* Marks a term no `pragma:{+uri}` read can resolve. Only blank nodes carry it:
|
|
168
|
+
* their labels are store-local and re-mint on every load, so following one is
|
|
169
|
+
* always a dead end — stated here rather than left for the reader to discover.
|
|
170
|
+
*/
|
|
171
|
+
readonly addressable?: false;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** One inlined blank node: its fields, keyed by predicate, as terms. */
|
|
175
|
+
export type NestedRecord = Record<string, ReadTerm>;
|
|
176
|
+
|
|
177
|
+
/** All objects asserted for one predicate on the subject. */
|
|
24
178
|
export interface PredicateGroup {
|
|
25
|
-
readonly predicate:
|
|
26
|
-
readonly objects:
|
|
179
|
+
readonly predicate: ReadTerm;
|
|
180
|
+
readonly objects: ReadTerm[];
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/** Everything asserting one predicate ABOUT the subject. */
|
|
184
|
+
export interface InboundGroup {
|
|
185
|
+
readonly predicate: ReadTerm;
|
|
186
|
+
/** The TRUE number of subjects, whatever `subjects` was capped to. */
|
|
187
|
+
readonly count: number;
|
|
188
|
+
/** Subjects — listed for a relation, sampled for a roster; level-capped. */
|
|
189
|
+
readonly subjects: ReadTerm[];
|
|
190
|
+
/** Set when `subjects` is shorter than `count`. */
|
|
191
|
+
readonly truncated?: true;
|
|
192
|
+
/**
|
|
193
|
+
* Set when the group is a ROSTER rather than a relation: `subjects` are
|
|
194
|
+
* EXEMPLARS chosen to show the shape of a member, not the head of a page.
|
|
195
|
+
* Reach for the noun's list verb for the full set — paging a resource read
|
|
196
|
+
* will not produce one.
|
|
197
|
+
*/
|
|
198
|
+
readonly sampled?: true;
|
|
199
|
+
/**
|
|
200
|
+
* How many subjects this level would have exhibited, had any been nameable.
|
|
201
|
+
*
|
|
202
|
+
* Without it an empty `subjects` is ambiguous: at `summary` every group is
|
|
203
|
+
* empty because the level shows none, which is not the same as a group whose
|
|
204
|
+
* members are all blank nodes and cannot be shown at all. A renderer needs to
|
|
205
|
+
* tell those apart before it says anything about why the list is empty.
|
|
206
|
+
*/
|
|
207
|
+
readonly exhibits: number;
|
|
27
208
|
}
|
|
28
209
|
|
|
29
210
|
/** The result of inspecting one subject URI. */
|
|
30
211
|
export interface InspectResult {
|
|
31
212
|
/** The resolved (full) subject URI. */
|
|
32
213
|
readonly uri: string;
|
|
214
|
+
/** The subject's prefixed form, when a namespace matches. */
|
|
215
|
+
readonly prefixed?: string;
|
|
33
216
|
/** Human label from the pack index, when known. */
|
|
34
217
|
readonly label?: string | null;
|
|
35
|
-
/** Predicate/object groups, ordered by predicate. */
|
|
218
|
+
/** Predicate/object groups asserted BY the subject, ordered by predicate. */
|
|
36
219
|
readonly groups: PredicateGroup[];
|
|
220
|
+
/** Predicate groups asserted ABOUT the subject, ordered by predicate. */
|
|
221
|
+
readonly inbound: InboundGroup[];
|
|
222
|
+
/**
|
|
223
|
+
* Blank-node objects inlined one level, keyed by the predicate that reaches
|
|
224
|
+
* them. Omitted at `summary`.
|
|
225
|
+
*
|
|
226
|
+
* Field values are TERMS, not strings: a record's members are as much a part
|
|
227
|
+
* of the graph as the subject's own, and flattening them would reintroduce
|
|
228
|
+
* exactly the IRI-versus-literal ambiguity the term projection exists to
|
|
229
|
+
* close — and leave the Turtle serializer unable to tell `ds:Foo` from
|
|
230
|
+
* `"ds:Foo"`.
|
|
231
|
+
*/
|
|
232
|
+
readonly nested: Record<string, NestedRecord[]>;
|
|
233
|
+
/** The disclosure level this payload was built at. */
|
|
234
|
+
readonly detail: DetailLevel;
|
|
235
|
+
/**
|
|
236
|
+
* The prefix map every compacted name in this payload was produced from.
|
|
237
|
+
*
|
|
238
|
+
* Carried rather than left to be re-derived: a renderer that reconstructs it
|
|
239
|
+
* from the terms can only learn the prefixes that happen to appear on a named
|
|
240
|
+
* NODE, and misses any used solely by the subject, a nested record's key, or a
|
|
241
|
+
* literal's datatype — emitting compact names with no matching `@prefix`, i.e.
|
|
242
|
+
* invalid Turtle. The reader knows the real map; it should say so.
|
|
243
|
+
*/
|
|
244
|
+
readonly prefixes: Readonly<Record<string, string>>;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Whether a name tells a reader anything the URI's own local name did not.
|
|
249
|
+
*
|
|
250
|
+
* Measured on this graph, EVERY title a button's neighbourhood carried merely
|
|
251
|
+
* restated its local name in different casing (`ds:implementsBlock` titled
|
|
252
|
+
* "implementsBlock", `ds:apps.component.file_tree` titled "FileTree"). Emitting
|
|
253
|
+
* those spends a reader's attention — and an agent's context — to say the same
|
|
254
|
+
* word twice. A graph whose labels are real prose (a concept at `ds:concept.pd`
|
|
255
|
+
* named "Progressive disclosure") still keeps them, so this thins noise without
|
|
256
|
+
* deciding that labels are worthless.
|
|
257
|
+
*/
|
|
258
|
+
function isInformativeName(name: string, short: string): boolean {
|
|
259
|
+
const normalize = (value: string): string =>
|
|
260
|
+
value.replace(/[\s._:-]/g, "").toLowerCase();
|
|
261
|
+
const local = short.split(/[:.]/).pop() ?? short;
|
|
262
|
+
return normalize(name) !== normalize(local);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/** Index lookup for a neighbour's human name (`label`, else the first alt name). */
|
|
266
|
+
function nameIndex(index: PackIndex): ReadonlyMap<string, string> {
|
|
267
|
+
const names = new Map<string, string>();
|
|
268
|
+
for (const entity of index.entities) {
|
|
269
|
+
if (!entity.uri) continue;
|
|
270
|
+
const name = entity.label ?? entity.altNames?.[0];
|
|
271
|
+
if (name && !names.has(entity.uri)) names.set(entity.uri, name);
|
|
272
|
+
}
|
|
273
|
+
return names;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/** Project one ke term into a {@link ReadTerm}, previewing long literals. */
|
|
277
|
+
function toReadTerm(
|
|
278
|
+
term: Term,
|
|
279
|
+
prefixes: Readonly<Record<string, string>>,
|
|
280
|
+
names: ReadonlyMap<string, string>,
|
|
281
|
+
detail: DetailLevel,
|
|
282
|
+
): ReadTerm {
|
|
283
|
+
if (term.termType === "NamedNode") {
|
|
284
|
+
const prefixed = compactUri(term.value, prefixes);
|
|
285
|
+
const name = names.get(term.value);
|
|
286
|
+
const title = name && isInformativeName(name, prefixed) ? name : undefined;
|
|
287
|
+
return {
|
|
288
|
+
termType: "NamedNode",
|
|
289
|
+
value: term.value,
|
|
290
|
+
// compactUri returns the input unchanged when no namespace matches, so an
|
|
291
|
+
// unmatched IRI carries no `prefixed` rather than one echoing `value`.
|
|
292
|
+
...(prefixed === term.value ? {} : { prefixed }),
|
|
293
|
+
...(title ? { title } : {}),
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
if (term.termType === "BlankNode") {
|
|
297
|
+
return { termType: "BlankNode", value: term.value, addressable: false };
|
|
298
|
+
}
|
|
299
|
+
const cap = LITERAL_CAP[detail];
|
|
300
|
+
const overlong = term.value.length > cap;
|
|
301
|
+
return {
|
|
302
|
+
termType: "Literal",
|
|
303
|
+
value: overlong ? term.value.slice(0, cap) : term.value,
|
|
304
|
+
...(overlong
|
|
305
|
+
? { truncated: true as const, length: term.value.length }
|
|
306
|
+
: {}),
|
|
307
|
+
...(term.datatype ? { datatype: compactUri(term.datatype, prefixes) } : {}),
|
|
308
|
+
...(term.language ? { language: term.language } : {}),
|
|
309
|
+
...(term.direction ? { direction: term.direction } : {}),
|
|
310
|
+
};
|
|
37
311
|
}
|
|
38
312
|
|
|
39
313
|
/**
|
|
40
|
-
* Read one entity's
|
|
314
|
+
* Read one entity's graph neighbourhood.
|
|
41
315
|
*
|
|
42
|
-
* @param rt - The runtime (lazy store
|
|
316
|
+
* @param rt - The runtime (lazy store, query facade, config, global flags).
|
|
43
317
|
* @param uri - A prefixed name or absolute IRI.
|
|
44
|
-
* @returns The resolved
|
|
45
|
-
*
|
|
46
|
-
* @
|
|
318
|
+
* @returns The resolved subject, its outbound groups, inbound groups, inlined
|
|
319
|
+
* blank nodes, and the detail level the payload was built at.
|
|
320
|
+
* @throws PragmaError ENTITY_NOT_FOUND when the subject asserts no triples.
|
|
321
|
+
* @note Impure — boots the store and queries it (three reads: out, in, nested).
|
|
47
322
|
*/
|
|
48
323
|
export async function readEntity(
|
|
49
|
-
rt: Pick<PragmaRuntime, "store" | "query">,
|
|
324
|
+
rt: Pick<PragmaRuntime, "store" | "query" | "loadConfig" | "globalFlags">,
|
|
50
325
|
uri: string,
|
|
51
326
|
): Promise<InspectResult> {
|
|
52
327
|
const session = await rt.store.get();
|
|
53
328
|
const resolved = resolveUri(uri, session.prefixes);
|
|
54
329
|
|
|
55
|
-
const
|
|
330
|
+
const outbound = await rt.query.sparql(
|
|
56
331
|
`SELECT ?predicate ?object WHERE { <${resolved}> ?predicate ?object } ORDER BY ?predicate ?object`,
|
|
57
332
|
);
|
|
58
333
|
|
|
59
|
-
if (
|
|
334
|
+
if (outbound.type !== "select" || outbound.termBindings.length === 0) {
|
|
60
335
|
throw PragmaError.notFound("entity", uri, {
|
|
61
336
|
recovery: cliRecovery(
|
|
62
337
|
`graph query 'SELECT ?s WHERE { ?s ?p ?o } LIMIT 10'`,
|
|
@@ -66,19 +341,188 @@ export async function readEntity(
|
|
|
66
341
|
});
|
|
67
342
|
}
|
|
68
343
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
344
|
+
// The level is resolved from the SAME sources as every other disclosure: the
|
|
345
|
+
// `--detail` flag (which the MCP `detail` param also seeds), then config. A
|
|
346
|
+
// resource read carries no params of its own, so it lands on the config value
|
|
347
|
+
// — `config_set detail detailed` is how an agent asks a resource for more.
|
|
348
|
+
const detail = resolveDetail({
|
|
349
|
+
flag: rt.globalFlags.detail,
|
|
350
|
+
config: (await rt.loadConfig()).config.detail,
|
|
351
|
+
});
|
|
352
|
+
const names = nameIndex(session.index);
|
|
353
|
+
const term = (value: Term): ReadTerm =>
|
|
354
|
+
toReadTerm(value, session.prefixes, names, detail);
|
|
355
|
+
|
|
356
|
+
const groupMap = new Map<string, ReadTerm[]>();
|
|
357
|
+
const predicates = new Map<string, ReadTerm>();
|
|
358
|
+
let hasBlankObject = false;
|
|
359
|
+
for (const binding of outbound.termBindings) {
|
|
360
|
+
const predicate = binding.predicate;
|
|
361
|
+
const object = binding.object;
|
|
362
|
+
if (!predicate || !object) continue;
|
|
363
|
+
if (object.termType === "BlankNode") hasBlankObject = true;
|
|
364
|
+
predicates.set(predicate.value, term(predicate));
|
|
365
|
+
const objects = groupMap.get(predicate.value) ?? [];
|
|
366
|
+
objects.push(term(object));
|
|
367
|
+
groupMap.set(predicate.value, objects);
|
|
76
368
|
}
|
|
77
|
-
const groups = [...groupMap.entries()].map(
|
|
78
|
-
predicate,
|
|
79
|
-
|
|
80
|
-
|
|
369
|
+
const groups: PredicateGroup[] = [...groupMap.entries()].map(
|
|
370
|
+
([predicate, objects]) => ({
|
|
371
|
+
// Every key was written from a binding above, so the lookup cannot miss.
|
|
372
|
+
predicate: predicates.get(predicate) as ReadTerm,
|
|
373
|
+
objects,
|
|
374
|
+
}),
|
|
375
|
+
);
|
|
376
|
+
|
|
377
|
+
const inbound = await readInbound(rt, resolved, detail, term);
|
|
378
|
+
const nested =
|
|
379
|
+
detail === "summary" || !hasBlankObject
|
|
380
|
+
? {}
|
|
381
|
+
: await readNested(rt, resolved, session.prefixes, term);
|
|
81
382
|
|
|
383
|
+
const prefixed = compactUri(resolved, session.prefixes);
|
|
82
384
|
const label = session.index.entities.find((e) => e.uri === resolved)?.label;
|
|
83
|
-
return {
|
|
385
|
+
return {
|
|
386
|
+
uri: resolved,
|
|
387
|
+
...(prefixed === resolved ? {} : { prefixed }),
|
|
388
|
+
...(label != null ? { label } : {}),
|
|
389
|
+
groups,
|
|
390
|
+
inbound,
|
|
391
|
+
nested,
|
|
392
|
+
detail,
|
|
393
|
+
prefixes: session.prefixes,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Everything asserting a predicate about the subject, grouped and capped.
|
|
399
|
+
*
|
|
400
|
+
* One query rather than one per predicate: the rows are grouped in memory, so a
|
|
401
|
+
* hub costs the same round trip as a leaf.
|
|
402
|
+
*/
|
|
403
|
+
async function readInbound(
|
|
404
|
+
rt: Pick<PragmaRuntime, "query">,
|
|
405
|
+
resolved: string,
|
|
406
|
+
detail: DetailLevel,
|
|
407
|
+
term: (value: Term) => ReadTerm,
|
|
408
|
+
): Promise<InboundGroup[]> {
|
|
409
|
+
// Counts from an AGGREGATE, so every predicate is counted in full and no
|
|
410
|
+
// predicate can be pushed out of the answer by a noisy neighbour.
|
|
411
|
+
const totals = await rt.query.sparql(
|
|
412
|
+
`SELECT ?predicate (COUNT(*) AS ?total) WHERE { ?subject ?predicate <${resolved}> } GROUP BY ?predicate ORDER BY ?predicate`,
|
|
413
|
+
);
|
|
414
|
+
if (totals.type !== "select") return [];
|
|
415
|
+
|
|
416
|
+
const counts = new Map<string, number>();
|
|
417
|
+
const predicates = new Map<string, Term>();
|
|
418
|
+
for (const binding of totals.termBindings) {
|
|
419
|
+
const predicate = binding.predicate;
|
|
420
|
+
const total = binding.total;
|
|
421
|
+
if (!predicate || !total) continue;
|
|
422
|
+
predicates.set(predicate.value, predicate);
|
|
423
|
+
counts.set(predicate.value, Number(total.value));
|
|
424
|
+
}
|
|
425
|
+
if (counts.size === 0) return [];
|
|
426
|
+
|
|
427
|
+
// Exemplars in a second, separately bounded pass. Blank nodes are excluded in
|
|
428
|
+
// the QUERY rather than after it, so the limit is spent on subjects that can
|
|
429
|
+
// actually be exhibited — a hub whose members are all blank returns nothing
|
|
430
|
+
// here and is reported by its count alone.
|
|
431
|
+
const retained = new Map<string, Term[]>();
|
|
432
|
+
const widest = Math.max(
|
|
433
|
+
...Object.values(ANSWER_CAP),
|
|
434
|
+
...Object.values(SAMPLE_CAP),
|
|
435
|
+
);
|
|
436
|
+
if (widest > 0) {
|
|
437
|
+
const exemplars = await rt.query.sparql(
|
|
438
|
+
`SELECT ?predicate ?subject WHERE { ?subject ?predicate <${resolved}> . FILTER(isIRI(?subject)) } ORDER BY ?predicate ?subject LIMIT ${EXEMPLAR_FETCH_LIMIT}`,
|
|
439
|
+
);
|
|
440
|
+
if (exemplars.type === "select") {
|
|
441
|
+
for (const binding of exemplars.termBindings) {
|
|
442
|
+
const predicate = binding.predicate;
|
|
443
|
+
const subject = binding.subject;
|
|
444
|
+
if (!predicate || !subject) continue;
|
|
445
|
+
const rows = retained.get(predicate.value) ?? [];
|
|
446
|
+
if (rows.length < widest) rows.push(subject);
|
|
447
|
+
retained.set(predicate.value, rows);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
return [...counts.entries()].map(([key, count]) => {
|
|
453
|
+
// What the group IS decides how it is shown: a relation is listed, a roster
|
|
454
|
+
// is sampled. Derived from fan-in, so no predicate is named here.
|
|
455
|
+
const roster = count > ROSTER_THRESHOLD;
|
|
456
|
+
const cap = roster ? SAMPLE_CAP[detail] : ANSWER_CAP[detail];
|
|
457
|
+
const subjects = (retained.get(key) ?? []).slice(0, cap).map(term);
|
|
458
|
+
return {
|
|
459
|
+
predicate: term(predicates.get(key) as Term),
|
|
460
|
+
count,
|
|
461
|
+
subjects,
|
|
462
|
+
exhibits: cap,
|
|
463
|
+
...(subjects.length < count ? { truncated: true as const } : {}),
|
|
464
|
+
...(roster ? { sampled: true as const } : {}),
|
|
465
|
+
};
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* Blank-node objects inlined one level, as one record per node.
|
|
471
|
+
*
|
|
472
|
+
* Records rather than triples: the same content is roughly half the bytes and
|
|
473
|
+
* reads as the thing it models (a changelog entry, a property) instead of a
|
|
474
|
+
* scatter of rows the reader has to reassemble. `rdf:type` is hoisted to `type`
|
|
475
|
+
* — it is the record's kind, not one of its fields, and repeating it inline put
|
|
476
|
+
* the same IRI on every row.
|
|
477
|
+
*/
|
|
478
|
+
async function readNested(
|
|
479
|
+
rt: Pick<PragmaRuntime, "query">,
|
|
480
|
+
resolved: string,
|
|
481
|
+
prefixes: Readonly<Record<string, string>>,
|
|
482
|
+
term: (value: Term) => ReadTerm,
|
|
483
|
+
): Promise<Record<string, NestedRecord[]>> {
|
|
484
|
+
const result = await rt.query.sparql(
|
|
485
|
+
`SELECT ?predicate ?node ?nodePredicate ?nodeObject WHERE { <${resolved}> ?predicate ?node . FILTER(isBlank(?node)) . ?node ?nodePredicate ?nodeObject } ORDER BY ?predicate ?node ?nodePredicate`,
|
|
486
|
+
);
|
|
487
|
+
if (result.type !== "select") return {};
|
|
488
|
+
|
|
489
|
+
// Keyed by blank-node label so repeated nodes under one predicate stay
|
|
490
|
+
// separate records; the label itself never reaches the payload.
|
|
491
|
+
const records = new Map<string, { via: string; row: NestedRecord }>();
|
|
492
|
+
for (const binding of result.termBindings) {
|
|
493
|
+
const predicate = binding.predicate;
|
|
494
|
+
const node = binding.node;
|
|
495
|
+
const nodePredicate = binding.nodePredicate;
|
|
496
|
+
const nodeObject = binding.nodeObject;
|
|
497
|
+
if (!predicate || !node || !nodePredicate || !nodeObject) continue;
|
|
498
|
+
const via = compactUri(predicate.value, prefixes);
|
|
499
|
+
// Keyed by predicate AND node. Keyed by node alone, a blank node linked from
|
|
500
|
+
// two predicates kept only whichever `via` arrived first and the second edge
|
|
501
|
+
// silently disappeared — and in Turtle the ordinary blank object is filtered
|
|
502
|
+
// out too, so nothing was left to notice it by.
|
|
503
|
+
const key = `${predicate.value}\u0000${node.value}`;
|
|
504
|
+
const record = records.get(key) ?? { via, row: {} };
|
|
505
|
+
const field =
|
|
506
|
+
nodePredicate.value === RDF_TYPE
|
|
507
|
+
? "type"
|
|
508
|
+
: compactUri(nodePredicate.value, prefixes);
|
|
509
|
+
record.row[field] = term(nodeObject);
|
|
510
|
+
records.set(key, record);
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
const nested: Record<string, NestedRecord[]> = {};
|
|
514
|
+
for (const { via, row } of records.values()) {
|
|
515
|
+
const rows = nested[via] ?? [];
|
|
516
|
+
rows.push(row);
|
|
517
|
+
nested[via] = rows;
|
|
518
|
+
}
|
|
519
|
+
// Order records by their CONTENT, never by the blank-node label that grouped
|
|
520
|
+
// them. Oxigraph re-mints those labels on every load, so ordering by them made
|
|
521
|
+
// two reads of the same unchanged entity return the same records in different
|
|
522
|
+
// orders — nondeterminism the mirror test caught and a caller diffing two
|
|
523
|
+
// reads would have seen as spurious change.
|
|
524
|
+
for (const rows of Object.values(nested)) {
|
|
525
|
+
rows.sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b)));
|
|
526
|
+
}
|
|
527
|
+
return nested;
|
|
84
528
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package refs — turning what a project DECLARED into pinned, on-disk RDF.
|
|
3
|
+
*
|
|
4
|
+
* `sources update` is the only caller, and this domain is its whole
|
|
5
|
+
* resolution: parse a `packs` entry into a typed reference, resolve that
|
|
6
|
+
* reference to a revision and the TTL/story files it carries, and report what
|
|
7
|
+
* the resulting set of sources says about itself. Three declaration kinds
|
|
8
|
+
* (`npm`, `file`, `git`) resolve three different ways but converge on one
|
|
9
|
+
* `ResolvedPackage`, so callers pin, hash, and build from a single shape.
|
|
10
|
+
*
|
|
11
|
+
* The prefix inspectors belong here rather than with the pack builder because
|
|
12
|
+
* they answer a question about the RESOLVED SET, not about any one package: a
|
|
13
|
+
* label two packages bind to different IRIs is a conflict nobody can see from
|
|
14
|
+
* inside either one, and it must be caught before the sources are built rather
|
|
15
|
+
* than after, when it would surface as a query that silently reads the wrong
|
|
16
|
+
* namespace.
|
|
17
|
+
*
|
|
18
|
+
* `redactUrl` is on the surface because every one of these paths ends in a
|
|
19
|
+
* message: a git URL may carry a token, and the caller that reports what it
|
|
20
|
+
* resolved needs the redactor as much as it needs the result.
|
|
21
|
+
*
|
|
22
|
+
* The git operations underneath — clone, fetch, head — stay internal. They are
|
|
23
|
+
* how `git` refs resolve, and they are safe because refs and URLs reach them
|
|
24
|
+
* as argv and never as shell text; exposing them would offer the operations
|
|
25
|
+
* without the parsing that validated their arguments.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
export type { PackageRef } from "./parseRef.js";
|
|
29
|
+
export { parsePackDeclaration, redactUrl } from "./parseRef.js";
|
|
30
|
+
export type {
|
|
31
|
+
PrefixClash,
|
|
32
|
+
ResolvedPackage,
|
|
33
|
+
ResolveOptions,
|
|
34
|
+
} from "./resolve.js";
|
|
35
|
+
export {
|
|
36
|
+
detectPrefixClashes,
|
|
37
|
+
harvestPrefixes,
|
|
38
|
+
resolvePackage,
|
|
39
|
+
} from "./resolve.js";
|