@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
|
@@ -26,6 +26,16 @@
|
|
|
26
26
|
* ours to pin): 4 `ds:Component` (Button, Modal, LXD Panel, Beta Widget),
|
|
27
27
|
* `importance` family with value `primary`, code standard
|
|
28
28
|
* `code/function/purity`.
|
|
29
|
+
*
|
|
30
|
+
* Two of those anchors exist to pin an ABSENCE, and are load-bearing for the
|
|
31
|
+
* "declared, not inferred" halves of the read grammar:
|
|
32
|
+
* - `ds:token.legacy.borderRadius` — a `ds:Token` with no `ds:tokenId`, which
|
|
33
|
+
* `token list` therefore never publishes and `token lookup`/`token sample`
|
|
34
|
+
* must never reach (`PackLookup.nameFallback` is declared by `standard`
|
|
35
|
+
* alone).
|
|
36
|
+
* - `cs:archive` — a `cs:Category` with no standards, which `standard
|
|
37
|
+
* categories` reports at count 0 and `standard list --category archive` must
|
|
38
|
+
* answer with a calm empty list rather than INVALID_INPUT.
|
|
29
39
|
*/
|
|
30
40
|
|
|
31
41
|
import { BLOCK_PREFIXES, BLOCK_TTL } from "../blockGraph.js";
|
|
@@ -76,13 +86,46 @@ ds:token.spacing.medium a ds:Token ;
|
|
|
76
86
|
ds:tokenType ds:type.spacing ;
|
|
77
87
|
ds:valueLight "16px" ;
|
|
78
88
|
ds:valueDark "16px" .
|
|
89
|
+
|
|
90
|
+
# A ds:Token carrying NO ds:tokenId — the entity "token list" does not publish,
|
|
91
|
+
# because its query REQUIRES the id. It is here to pin what a lookup may NOT
|
|
92
|
+
# reach: "token lookup" addresses by ds:tokenId, and a story whose list requires
|
|
93
|
+
# its "by" property must not become addressable (or sampleable) under a name
|
|
94
|
+
# derived from its IRI. See PackLookup.nameFallback, declared by the "standard"
|
|
95
|
+
# story alone — the one story whose list DOES publish such a name.
|
|
96
|
+
ds:token.legacy.borderRadius a ds:Token ;
|
|
97
|
+
ds:tokenType ds:type.spacing ;
|
|
98
|
+
ds:valueLight "4px" ;
|
|
99
|
+
ds:valueDark "4px" .
|
|
79
100
|
`;
|
|
80
101
|
|
|
81
|
-
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
102
|
+
/**
|
|
103
|
+
* The `cs:` (code standards) section — shaped like the SHIPPED code-standards
|
|
104
|
+
* graph, not like a convenience fixture.
|
|
105
|
+
*
|
|
106
|
+
* Two facts about the real data are reproduced here on purpose, because the
|
|
107
|
+
* eval harness was blind to both while every fixture standard carried a
|
|
108
|
+
* `cs:name`:
|
|
109
|
+
*
|
|
110
|
+
* 1. **Most standards carry NO `cs:name`.** The shipped graph asserts it on 22
|
|
111
|
+
* of 156 (~13%); one of the eight standards below carries one (~13%). The
|
|
112
|
+
* ontology says so deliberately — `cs:name` is "an optional human-readable
|
|
113
|
+
* display title" that "never participates in identity", the canonical
|
|
114
|
+
* identifier being the compact IRI. So the name `standard list` publishes for
|
|
115
|
+
* the other seven is SYNTHESIZED from the IRI local name
|
|
116
|
+
* (`cs:react.component.props` → `react/component/props`), and a lookup that
|
|
117
|
+
* cannot resolve a synthesized name cannot resolve the graph.
|
|
118
|
+
* 2. **Categories are a two-level SKOS tree.** `cs:testing.unit skos:broader
|
|
119
|
+
* cs:testing`, exactly as the shipped graph declares for `testing.*` and
|
|
120
|
+
* `ui_blocks.nojs`, and one standard sits DIRECTLY on the parent — the case a
|
|
121
|
+
* non-reflexive roll-up (`skos:broader+`) silently drops.
|
|
122
|
+
*
|
|
123
|
+
* Anchor names (`code/function/purity`, `react/component/*`) are unchanged; they
|
|
124
|
+
* are simply reached the way the real graph reaches them.
|
|
125
|
+
*/
|
|
84
126
|
const CS_TTL = `
|
|
85
127
|
@prefix cs: <http://pragma.canonical.com/codestandards#> .
|
|
128
|
+
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
|
|
86
129
|
|
|
87
130
|
cs:CodeStandard a owl:Class .
|
|
88
131
|
cs:Category a owl:Class .
|
|
@@ -97,27 +140,66 @@ cs:dont a owl:ObjectProperty ; rdfs:domain cs:CodeStandard ; rdfs:range cs:Examp
|
|
|
97
140
|
cs:language a owl:DatatypeProperty ; rdfs:domain cs:Example ; rdfs:range xsd:string .
|
|
98
141
|
cs:code a owl:DatatypeProperty ; rdfs:domain cs:Example ; rdfs:range xsd:string .
|
|
99
142
|
|
|
100
|
-
|
|
101
|
-
cs:
|
|
143
|
+
# ---- Categories: flat roots, plus one two-level branch (testing) ----
|
|
144
|
+
cs:react a cs:Category ; rdfs:label "React" ; cs:slug "react" .
|
|
145
|
+
cs:code a cs:Category ; rdfs:label "Code" ; cs:slug "code" .
|
|
146
|
+
cs:turtle a cs:Category ; rdfs:label "Turtle" ; cs:slug "turtle" .
|
|
147
|
+
cs:testing a cs:Category ; rdfs:label "Testing" ; cs:slug "testing" .
|
|
148
|
+
cs:testing.unit a cs:Category ;
|
|
149
|
+
rdfs:label "Unit testing" ;
|
|
150
|
+
cs:slug "testing-unit" ;
|
|
151
|
+
skos:broader cs:testing .
|
|
102
152
|
|
|
153
|
+
# A category the graph DECLARES with no standards filed under it. The
|
|
154
|
+
# "standard categories" verb lists it with count 0, so
|
|
155
|
+
# "standard list --category archive" must be the documented calm empty list — a
|
|
156
|
+
# real slug, an empty answer. Validity read off the returned ROWS instead of the
|
|
157
|
+
# graph called it INVALID_INPUT.
|
|
158
|
+
cs:archive a cs:Category ;
|
|
159
|
+
rdfs:label "Archive" ;
|
|
160
|
+
cs:slug "archive" .
|
|
161
|
+
|
|
162
|
+
# ---- Standards. Seven of eight carry NO cs:name (the shipped ~13% split). ----
|
|
103
163
|
cs:react.component.props a cs:CodeStandard ;
|
|
104
|
-
cs:name "react/component/props" ;
|
|
105
164
|
cs:description "Type component props explicitly." ;
|
|
106
|
-
cs:hasCategory cs:
|
|
165
|
+
cs:hasCategory cs:react ;
|
|
107
166
|
cs:do [ a cs:Example ; cs:description "Do type props" ; cs:language "tsx" ; cs:code "interface P {}" ] ;
|
|
108
167
|
cs:dont [ a cs:Example ; cs:description "Avoid any" ; cs:language "tsx" ; cs:code "props: any" ] .
|
|
109
168
|
|
|
110
169
|
cs:react.component.structure a cs:CodeStandard ;
|
|
111
|
-
cs:name "react/component/structure" ;
|
|
112
170
|
cs:description "Keep folder structure flat." ;
|
|
113
|
-
cs:hasCategory cs:
|
|
171
|
+
cs:hasCategory cs:react ;
|
|
114
172
|
cs:extends cs:react.component.props ;
|
|
115
173
|
cs:do [ a cs:Example ; cs:description "Do flatten" ; cs:language "text" ; cs:code "src/Button.tsx" ] .
|
|
116
174
|
|
|
117
175
|
cs:code.function.purity a cs:CodeStandard ;
|
|
118
|
-
cs:name "code/function/purity" ;
|
|
119
176
|
cs:description "Prefer pure functions." ;
|
|
120
|
-
cs:hasCategory cs:
|
|
177
|
+
cs:hasCategory cs:code .
|
|
178
|
+
|
|
179
|
+
# The standard sitting DIRECTLY on the parent category: a skos:broader+
|
|
180
|
+
# roll-up loses it, a reflexive skos:broader* keeps it.
|
|
181
|
+
cs:testing.smoke a cs:CodeStandard ;
|
|
182
|
+
cs:description "Keep one end-to-end smoke path green." ;
|
|
183
|
+
cs:hasCategory cs:testing .
|
|
184
|
+
|
|
185
|
+
cs:testing.unit.isolation a cs:CodeStandard ;
|
|
186
|
+
cs:description "Isolate the unit under test." ;
|
|
187
|
+
cs:hasCategory cs:testing.unit .
|
|
188
|
+
|
|
189
|
+
cs:testing.unit.naming a cs:CodeStandard ;
|
|
190
|
+
cs:description "Name a unit test for the behaviour it pins." ;
|
|
191
|
+
cs:hasCategory cs:testing.unit ;
|
|
192
|
+
cs:do [ a cs:Example ; cs:description "Do name the behaviour" ; cs:language "ts" ; cs:code "it(\\"rejects an empty batch\\")" ] .
|
|
193
|
+
|
|
194
|
+
cs:testing.unit.fixtures a cs:CodeStandard ;
|
|
195
|
+
cs:description "Share one fixture per behavioural claim." ;
|
|
196
|
+
cs:hasCategory cs:testing.unit .
|
|
197
|
+
|
|
198
|
+
# The ~13%: a display title that adds something the IRI does not.
|
|
199
|
+
cs:turtle.naming.local_name_casing a cs:CodeStandard ;
|
|
200
|
+
cs:name "Turtle local-name casing" ;
|
|
201
|
+
cs:description "Use snake_case for multi-word local-name segments." ;
|
|
202
|
+
cs:hasCategory cs:turtle .
|
|
121
203
|
`;
|
|
122
204
|
|
|
123
205
|
/** The `ds:Prompt` workflow templates — the ONE source both the `prompt_list`/
|
|
@@ -160,19 +242,106 @@ ds:prompt.configure a ds:Prompt ;
|
|
|
160
242
|
ds:prompt.scaffold-component a ds:Prompt ;
|
|
161
243
|
rdfs:label "scaffold-component" ;
|
|
162
244
|
rdfs:comment "Scaffold a new component and align it to the standards." ;
|
|
163
|
-
ds:promptBody "Scaffold the {{componentName}} component in {{framework}}. Use create_component with
|
|
245
|
+
ds:promptBody "Scaffold the {{componentName}} component in {{framework}}. Use create_component with framework {{framework}} and the component path, then review the generated files against the react/component standards via standard_lookup." ;
|
|
164
246
|
ds:promptArgument [ ds:argName "componentName" ; rdfs:comment "Component name/path (e.g. Button)." ; ds:argRequired true ] ;
|
|
165
247
|
ds:promptArgument [ ds:argName "framework" ; rdfs:comment "react | svelte | lit." ; ds:argRequired false ] .
|
|
166
248
|
`;
|
|
167
249
|
|
|
250
|
+
/** The `ds:Concept` section — long-form documentation entries the `concept`
|
|
251
|
+
* story reads. Mirrors the real design-system data shape (canonical/design-system#64):
|
|
252
|
+
* `ds:name`/`ds:summary`/`ds:tier` base, the Markdown body in `ds:content`
|
|
253
|
+
* (standard disclosure), `ds:knownEdgeCases` (detailed), and `ds:conceptType`
|
|
254
|
+
* → a named `ds:ConceptType` individual carrying its own `ds:name`. */
|
|
255
|
+
const CONCEPT_TTL = `
|
|
256
|
+
ds:Concept a owl:Class .
|
|
257
|
+
ds:ConceptType a owl:Class .
|
|
258
|
+
ds:content a owl:DatatypeProperty ; rdfs:domain ds:Concept ; rdfs:range xsd:string .
|
|
259
|
+
ds:knownEdgeCases a owl:DatatypeProperty ; rdfs:domain ds:Concept ; rdfs:range xsd:string .
|
|
260
|
+
ds:conceptType a owl:ObjectProperty ; rdfs:domain ds:Concept ; rdfs:range ds:ConceptType .
|
|
261
|
+
|
|
262
|
+
ds:concepttype.Explanation a ds:ConceptType ;
|
|
263
|
+
ds:name "Explanation" ;
|
|
264
|
+
ds:summary "Concept documentation that deepens understanding of a topic." .
|
|
265
|
+
|
|
266
|
+
ds:concepttype.How-to-guide a ds:ConceptType ;
|
|
267
|
+
ds:name "How-to guide" ;
|
|
268
|
+
ds:summary "Concept documentation that walks through solving a problem." .
|
|
269
|
+
|
|
270
|
+
ds:concept.Foundations-Grid a ds:Concept ;
|
|
271
|
+
ds:name "Foundations: Grid" ;
|
|
272
|
+
ds:summary "How the grid system underpins every layout." ;
|
|
273
|
+
ds:tier ds:global ;
|
|
274
|
+
ds:conceptType ds:concepttype.Explanation ;
|
|
275
|
+
ds:content "The grid is the shared spatial contract every block lays out against." ;
|
|
276
|
+
ds:knownEdgeCases "Nested grids inherit the outer gutter unless re-declared." .
|
|
277
|
+
|
|
278
|
+
ds:concept.Question-mark-vs-information-icon a ds:Concept ;
|
|
279
|
+
ds:name "Question mark vs information icon" ;
|
|
280
|
+
ds:summary "Deciding between the information icon and the question mark icon." ;
|
|
281
|
+
ds:tier ds:global ;
|
|
282
|
+
ds:conceptType ds:concepttype.How-to-guide ;
|
|
283
|
+
ds:content "The information icon offers context proactively; the question mark answers a question the user already has." ;
|
|
284
|
+
ds:knownEdgeCases "Icon interpretation depends on the user's prior conventions." .
|
|
285
|
+
`;
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* The implementation graph: two libraries whose `ds:implementsBlock` edges point
|
|
289
|
+
* at `BLOCK_TTL`'s own Button/Modal IRIs, so a test can prove the cross-pack
|
|
290
|
+
* join (an implementation collected from source resolving to a block declared by
|
|
291
|
+
* the design system) rather than just the shape of a row. Button is implemented
|
|
292
|
+
* TWICE, on two platforms — the case `--platform` has to separate.
|
|
293
|
+
*/
|
|
294
|
+
const IMPLEMENTATION_TTL = `
|
|
295
|
+
ds:ImplementationLibrary a owl:Class .
|
|
296
|
+
ds:ImplementationObject a owl:Class .
|
|
297
|
+
ds:hasImplementation a owl:ObjectProperty ; rdfs:domain ds:ImplementationLibrary ; rdfs:range ds:ImplementationObject .
|
|
298
|
+
ds:implementsBlock a owl:ObjectProperty ; rdfs:domain ds:ImplementationObject ; rdfs:range ds:UIBlock .
|
|
299
|
+
ds:libraryName a owl:DatatypeProperty ; rdfs:domain ds:ImplementationLibrary ; rdfs:range xsd:string .
|
|
300
|
+
ds:platform a owl:DatatypeProperty ; rdfs:domain ds:ImplementationLibrary ; rdfs:range xsd:string .
|
|
301
|
+
ds:libraryTier a owl:ObjectProperty ; rdfs:domain ds:ImplementationLibrary ; rdfs:range ds:Tier .
|
|
302
|
+
ds:implementationCount a owl:DatatypeProperty ; rdfs:domain ds:ImplementationLibrary ; rdfs:range xsd:integer .
|
|
303
|
+
ds:headLink a owl:DatatypeProperty ; rdfs:domain ds:ImplementationObject ; rdfs:range xsd:string .
|
|
304
|
+
ds:versionedLink a owl:DatatypeProperty ; rdfs:domain ds:ImplementationObject ; rdfs:range xsd:string .
|
|
305
|
+
|
|
306
|
+
ds:implementation.library.react-ds-global a ds:ImplementationLibrary ;
|
|
307
|
+
ds:libraryName "@canonical/react-ds-global" ;
|
|
308
|
+
ds:platform "react" ;
|
|
309
|
+
ds:libraryTier ds:global ;
|
|
310
|
+
ds:version "0.34.0" ;
|
|
311
|
+
ds:implementationCount 2 ;
|
|
312
|
+
ds:hasImplementation ds:implementation.react-ds-global.button,
|
|
313
|
+
ds:implementation.react-ds-global.modal .
|
|
314
|
+
|
|
315
|
+
ds:implementation.react-ds-global.button a ds:ImplementationObject ;
|
|
316
|
+
ds:implementsBlock ds:button ;
|
|
317
|
+
ds:headLink "https://example.test/react/Button.tsx" .
|
|
318
|
+
|
|
319
|
+
ds:implementation.react-ds-global.modal a ds:ImplementationObject ;
|
|
320
|
+
ds:implementsBlock ds:modal ;
|
|
321
|
+
ds:headLink "https://example.test/react/Modal.tsx" .
|
|
322
|
+
|
|
323
|
+
ds:implementation.library.svelte-ds-global a ds:ImplementationLibrary ;
|
|
324
|
+
ds:libraryName "@canonical/svelte-ds-global" ;
|
|
325
|
+
ds:platform "svelte" ;
|
|
326
|
+
ds:libraryTier ds:global ;
|
|
327
|
+
ds:version "0.34.0" ;
|
|
328
|
+
ds:implementationCount 1 ;
|
|
329
|
+
ds:hasImplementation ds:implementation.svelte-ds-global.button .
|
|
330
|
+
|
|
331
|
+
ds:implementation.svelte-ds-global.button a ds:ImplementationObject ;
|
|
332
|
+
ds:implementsBlock ds:button ;
|
|
333
|
+
ds:headLink "https://example.test/svelte/Button.svelte" .
|
|
334
|
+
`;
|
|
335
|
+
|
|
168
336
|
/** The prefixes the canonical store is built and queried with. */
|
|
169
337
|
export const CANONICAL_PREFIXES: Readonly<Record<string, string>> = {
|
|
170
338
|
...BLOCK_PREFIXES,
|
|
171
339
|
cs: "http://pragma.canonical.com/codestandards#",
|
|
340
|
+
skos: "http://www.w3.org/2004/02/skos/core#",
|
|
172
341
|
};
|
|
173
342
|
|
|
174
343
|
/** The full canonical Turtle: PR3's `BLOCK_TTL` verbatim, plus the sections above. */
|
|
175
|
-
export const CANONICAL_TTL = `${BLOCK_TTL}\n${DS_EXTRA_TTL}\n${CS_TTL}\n${PROMPT_TTL}`;
|
|
344
|
+
export const CANONICAL_TTL = `${BLOCK_TTL}\n${DS_EXTRA_TTL}\n${CS_TTL}\n${PROMPT_TTL}\n${CONCEPT_TTL}\n${IMPLEMENTATION_TTL}`;
|
|
176
345
|
|
|
177
346
|
/** Default viewing config: no tier set, `normal` channel — drops the beta-only block. */
|
|
178
347
|
export const CANONICAL_CONFIG = { channel: "normal" as const };
|
|
@@ -171,7 +171,7 @@ ex:beta ex:name "Beta" .
|
|
|
171
171
|
/**
|
|
172
172
|
* A malformed Turtle source — a subject/predicate with no object — drives the
|
|
173
173
|
* `sources update` data-error classification path (a NAMED `CONFIG_ERROR`, not
|
|
174
|
-
* an INTERNAL "
|
|
174
|
+
* an INTERNAL "report this issue").
|
|
175
175
|
*/
|
|
176
176
|
export const MALFORMED_TTL = `@prefix ex: <https://ex.test/#> .
|
|
177
177
|
ex:One a ex:Widget .
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blank the @canonical/* dependency ranges inside a scaffolded application's
|
|
3
|
+
* `my-app/package.json` — identically on every snapshot — before a byte
|
|
4
|
+
* comparison. The application generator resolves its range through each
|
|
5
|
+
* producer's OWN `npm view` call (no timeout, no shared cache), so an
|
|
6
|
+
* asymmetric registry outcome (one producer reaches npm and another does
|
|
7
|
+
* not, or a @canonical/* release lands between the calls) would turn
|
|
8
|
+
* `^0.34.0` vs `^0.33.0` across all 11 ranges into a red that says nothing
|
|
9
|
+
* about the code under test. The networked cases prove the TEMPLATE surface;
|
|
10
|
+
* range truth belongs to the offline cells, where the outcome is forced
|
|
11
|
+
* (`capabilities/create/shippedCreate.subprocess.test.ts`).
|
|
12
|
+
*
|
|
13
|
+
* The regex preserves the dependency KEY (`$1`), so a key-set or
|
|
14
|
+
* non-@canonical divergence still fails; only the range value collapses.
|
|
15
|
+
* Deliberately import-free — a pure string transform no module-graph guard
|
|
16
|
+
* can ever see.
|
|
17
|
+
*
|
|
18
|
+
* @param tree - A tree snapshot (relative path → contents).
|
|
19
|
+
* @param manifestPath - The scaffolded manifest's path within the tree.
|
|
20
|
+
* @returns A NEW map with the manifest's @canonical/* ranges blanked; the
|
|
21
|
+
* input is untouched. A tree without the manifest comes back copied as-is.
|
|
22
|
+
*/
|
|
23
|
+
export function blankCanonicalRanges(
|
|
24
|
+
tree: ReadonlyMap<string, string>,
|
|
25
|
+
manifestPath = "my-app/package.json",
|
|
26
|
+
): Map<string, string> {
|
|
27
|
+
const out = new Map(tree);
|
|
28
|
+
const manifest = out.get(manifestPath);
|
|
29
|
+
if (manifest !== undefined) {
|
|
30
|
+
out.set(
|
|
31
|
+
manifestPath,
|
|
32
|
+
manifest.replaceAll(/("@canonical\/[^"]+": )"[^"]+"/g, '$1"<range>"'),
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
@@ -10,6 +10,7 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
|
10
10
|
import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
|
|
11
11
|
import type {
|
|
12
12
|
CallToolResult,
|
|
13
|
+
Resource,
|
|
13
14
|
ServerCapabilities,
|
|
14
15
|
} from "@modelcontextprotocol/sdk/types.js";
|
|
15
16
|
import { buildServer } from "../../kernel/project/mcp/buildServer.js";
|
|
@@ -34,12 +35,29 @@ export interface McpHarness {
|
|
|
34
35
|
): Promise<Record<string, unknown>>;
|
|
35
36
|
/** List the registered tools. */
|
|
36
37
|
listTools(): Promise<ToolInfo[]>;
|
|
37
|
-
/**
|
|
38
|
-
|
|
38
|
+
/**
|
|
39
|
+
* List the resources exposed by the `{+uri}` template's list callback.
|
|
40
|
+
*
|
|
41
|
+
* The WHOLE wire entry (title, annotations, `_meta`, …), not a projection of
|
|
42
|
+
* it: the listing's cost and its navigability are both properties of what
|
|
43
|
+
* actually crosses the wire, and a helper that trimmed the entry would hide
|
|
44
|
+
* exactly the fields under test.
|
|
45
|
+
*/
|
|
46
|
+
listResources(): Promise<Resource[]>;
|
|
39
47
|
/** Read one resource by URI; returns the first content's parsed/raw text. */
|
|
40
48
|
readResource(uri: string): Promise<{ mimeType?: string; text: string }>;
|
|
41
|
-
/**
|
|
42
|
-
|
|
49
|
+
/**
|
|
50
|
+
* Complete a resource-template variable against a partial value.
|
|
51
|
+
*
|
|
52
|
+
* Returns the full completion result — `total` and `hasMore` are derived by
|
|
53
|
+
* the SDK from the callback's array, so they are the only witness that a
|
|
54
|
+
* truncated result admits to being truncated.
|
|
55
|
+
*/
|
|
56
|
+
completeResource(partial: string): Promise<{
|
|
57
|
+
values: string[];
|
|
58
|
+
total?: number;
|
|
59
|
+
hasMore?: boolean;
|
|
60
|
+
}>;
|
|
43
61
|
/** The server capabilities negotiated at initialize (tools/resources/prompts). */
|
|
44
62
|
serverCapabilities(): ServerCapabilities | undefined;
|
|
45
63
|
/** The `serverInfo` the server introduced itself with at initialize. */
|
|
@@ -100,7 +118,7 @@ export async function projectMcp(
|
|
|
100
118
|
},
|
|
101
119
|
async listResources() {
|
|
102
120
|
const { resources } = await client.listResources();
|
|
103
|
-
return resources
|
|
121
|
+
return resources;
|
|
104
122
|
},
|
|
105
123
|
async readResource(uri) {
|
|
106
124
|
const result = await client.readResource({ uri });
|
|
@@ -117,7 +135,15 @@ export async function projectMcp(
|
|
|
117
135
|
ref: { type: "ref/resource", uri: "pragma:{+uri}" },
|
|
118
136
|
argument: { name: "uri", value: partial },
|
|
119
137
|
});
|
|
120
|
-
return
|
|
138
|
+
return {
|
|
139
|
+
values: result.completion.values,
|
|
140
|
+
...(result.completion.total === undefined
|
|
141
|
+
? {}
|
|
142
|
+
: { total: result.completion.total }),
|
|
143
|
+
...(result.completion.hasMore === undefined
|
|
144
|
+
? {}
|
|
145
|
+
: { hasMore: result.completion.hasMore }),
|
|
146
|
+
};
|
|
121
147
|
},
|
|
122
148
|
serverCapabilities() {
|
|
123
149
|
return client.getServerCapabilities();
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Test helper: spawn-and-CAPTURE the real `pragma`
|
|
2
|
+
* Test helper: spawn-and-CAPTURE the real `pragma` entry point.
|
|
3
3
|
*
|
|
4
4
|
* {@link measureCommand} (the perf helper) discards stdout/stderr — it only
|
|
5
5
|
* times spawns. This is the complementary helper for tests that need to READ
|
|
6
6
|
* what the process printed: the true end-to-end boundary (argv parsing,
|
|
7
|
-
* first-run, the
|
|
7
|
+
* first-run, the shipped entry point, real process exit codes).
|
|
8
8
|
*
|
|
9
9
|
* Kept THIN — most behavioral coverage should run in-process via
|
|
10
10
|
* `executeVerb`/`projectCli`/`projectMcp`; reserve `runCli` for tests where the
|
|
@@ -18,9 +18,12 @@ import { tmpdir } from "node:os";
|
|
|
18
18
|
import { join } from "node:path";
|
|
19
19
|
import { fileURLToPath } from "node:url";
|
|
20
20
|
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
/**
|
|
22
|
+
* The shipped entry the perf `globalSetup` guarantees exists before tests run —
|
|
23
|
+
* the `bin` the published package points at, run the way a consumer runs it.
|
|
24
|
+
*/
|
|
25
|
+
const SHIPPED_ENTRY = fileURLToPath(
|
|
26
|
+
new URL("../../../dist/src/bin.js", import.meta.url),
|
|
24
27
|
);
|
|
25
28
|
|
|
26
29
|
/** The `bin.ts` entry point, for fast source-mode spawns (no rebuild). */
|
|
@@ -37,11 +40,12 @@ export interface RunCliOptions {
|
|
|
37
40
|
*/
|
|
38
41
|
readonly env?: Record<string, string | undefined>;
|
|
39
42
|
/**
|
|
40
|
-
* `"
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
+
* `"shipped"` (default) spawns `node dist/src/bin.js` — the true release
|
|
44
|
+
* boundary, exactly what a consumer's `pragma` runs. `"source"` spawns
|
|
45
|
+
* `bun src/bin.ts` — faster, no rebuild required, for journeys that do not
|
|
46
|
+
* test the shipped-entry boundary itself.
|
|
43
47
|
*/
|
|
44
|
-
readonly mode?: "
|
|
48
|
+
readonly mode?: "shipped" | "source";
|
|
45
49
|
/** Spawn timeout in milliseconds (default 20000). */
|
|
46
50
|
readonly timeoutMs?: number;
|
|
47
51
|
}
|
|
@@ -76,7 +80,7 @@ function seededXdgConfigHome(): string {
|
|
|
76
80
|
/**
|
|
77
81
|
* Spawn the real `pragma` CLI and capture its output.
|
|
78
82
|
*
|
|
79
|
-
* @param args - Argv passed to the
|
|
83
|
+
* @param args - Argv passed to the CLI (no `pragma`/runtime prefix).
|
|
80
84
|
* @param options - cwd, env overrides, mode, and timeout.
|
|
81
85
|
* @returns The captured stdout/stderr/exitCode/signal.
|
|
82
86
|
* @note Impure — spawns a child process.
|
|
@@ -85,17 +89,30 @@ export function runCli(
|
|
|
85
89
|
args: readonly string[],
|
|
86
90
|
options: RunCliOptions = {},
|
|
87
91
|
): RunCliResult {
|
|
88
|
-
const mode = options.mode ?? "
|
|
89
|
-
|
|
90
|
-
|
|
92
|
+
const mode = options.mode ?? "shipped";
|
|
93
|
+
// Both modes spawn a RUNTIME with an entry argument now — the built entry is
|
|
94
|
+
// emitted JavaScript, not a self-executing binary, so `node` names it.
|
|
95
|
+
const command = mode === "shipped" ? process.execPath : "bun";
|
|
96
|
+
const entry = mode === "shipped" ? SHIPPED_ENTRY : SOURCE_ENTRY;
|
|
97
|
+
const spawnArgs = [entry, ...args];
|
|
98
|
+
|
|
99
|
+
// Colour OFF by default: these tests assert on bytes, and nx exports
|
|
100
|
+
// FORCE_COLOR to its test tasks, so a spawned CLI colours its help even
|
|
101
|
+
// through a pipe — green locally, red in CI, for a difference no assertion
|
|
102
|
+
// meant to make. NO_COLOR is the one convention the style seam obeys
|
|
103
|
+
// unconditionally. FORCE_COLOR is DELETED rather than overridden: Bun warns
|
|
104
|
+
// on stderr when it sees both, and stderr is part of what is asserted.
|
|
105
|
+
// `options.env` still wins, so a test that wants colour asks for it.
|
|
106
|
+
const env: NodeJS.ProcessEnv = {
|
|
107
|
+
...process.env,
|
|
108
|
+
NO_COLOR: "1",
|
|
109
|
+
XDG_CONFIG_HOME: seededXdgConfigHome(),
|
|
110
|
+
};
|
|
111
|
+
delete env.FORCE_COLOR;
|
|
91
112
|
|
|
92
113
|
const result = spawnSync(command, spawnArgs, {
|
|
93
114
|
cwd: options.cwd,
|
|
94
|
-
env: {
|
|
95
|
-
...process.env,
|
|
96
|
-
XDG_CONFIG_HOME: seededXdgConfigHome(),
|
|
97
|
-
...options.env,
|
|
98
|
-
},
|
|
115
|
+
env: { ...env, ...options.env },
|
|
99
116
|
encoding: "utf-8",
|
|
100
117
|
timeout: options.timeoutMs ?? 20_000,
|
|
101
118
|
});
|
|
@@ -15,8 +15,19 @@ import {
|
|
|
15
15
|
} from "./budgets.js";
|
|
16
16
|
import { measureCommand, percentile, trimmedMean } from "./measure.js";
|
|
17
17
|
|
|
18
|
-
/**
|
|
19
|
-
|
|
18
|
+
/**
|
|
19
|
+
* The shipped entry the perf globalSetup guarantees exists, spawned through
|
|
20
|
+
* `node` — which is what a consumer's `pragma` does, so node's own startup is
|
|
21
|
+
* inside every sample rather than excluded from it. The budgets below are
|
|
22
|
+
* ceilings on what a user waits, not on what a bundler produced.
|
|
23
|
+
*/
|
|
24
|
+
const NODE = process.execPath;
|
|
25
|
+
const ENTRY = fileURLToPath(
|
|
26
|
+
new URL("../../../dist/src/bin.js", import.meta.url),
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
/** Argv for one CLI invocation through the shipped entry. */
|
|
30
|
+
const cli = (...args: string[]): string[] => [ENTRY, ...args];
|
|
20
31
|
|
|
21
32
|
/** Fresh XDG dirs so spawned runs never touch real state (and first-run is isolated). */
|
|
22
33
|
const perfEnv = {
|
|
@@ -25,7 +36,7 @@ const perfEnv = {
|
|
|
25
36
|
};
|
|
26
37
|
|
|
27
38
|
/**
|
|
28
|
-
* Protected budget suite. Spawns the
|
|
39
|
+
* Protected budget suite. Spawns the shipped entry through `node`, discards
|
|
29
40
|
* warmups, and asserts median + p95 against the ceilings in budgets.ts. Given
|
|
30
41
|
* spawn-time variance, each spawn case retries.
|
|
31
42
|
*/
|
|
@@ -45,7 +56,7 @@ describe("perf budgets (PROTECTED)", () => {
|
|
|
45
56
|
});
|
|
46
57
|
|
|
47
58
|
it("pragma --help stays under budget", { retry: 2 }, () => {
|
|
48
|
-
const result = measureCommand(
|
|
59
|
+
const result = measureCommand(NODE, cli("--help"), {
|
|
49
60
|
runs: 15,
|
|
50
61
|
warmups: 3,
|
|
51
62
|
env: perfEnv,
|
|
@@ -55,7 +66,7 @@ describe("perf budgets (PROTECTED)", () => {
|
|
|
55
66
|
});
|
|
56
67
|
|
|
57
68
|
it("pragma __complete stays under budget", { retry: 3 }, () => {
|
|
58
|
-
const result = measureCommand(
|
|
69
|
+
const result = measureCommand(NODE, cli("__complete", "config"), {
|
|
59
70
|
runs: 30,
|
|
60
71
|
warmups: 5,
|
|
61
72
|
env: perfEnv,
|
|
@@ -77,8 +88,8 @@ describe("perf budgets (PROTECTED)", () => {
|
|
|
77
88
|
// dir → an empty walk, but it exercises the discoverSkills path per spawn;
|
|
78
89
|
// enforce the same robust statistic as the noun case.
|
|
79
90
|
const result = measureCommand(
|
|
80
|
-
|
|
81
|
-
|
|
91
|
+
NODE,
|
|
92
|
+
cli("__complete", "skill", "lookup", "do"),
|
|
82
93
|
{
|
|
83
94
|
runs: 30,
|
|
84
95
|
warmups: 5,
|
|
@@ -94,13 +105,13 @@ describe("perf budgets (PROTECTED)", () => {
|
|
|
94
105
|
|
|
95
106
|
it("warm store-backed verb stays under budget", { retry: 2 }, () => {
|
|
96
107
|
// __store-probe boots the embedded pack from its n-quads cache and queries
|
|
97
|
-
// it — the full store-backed verb cost
|
|
108
|
+
// it — the full store-backed verb cost through the shipped entry. The first
|
|
98
109
|
// spawn materializes the pack; warmups absorb it, then it is a cache hit.
|
|
99
110
|
// Note that with 9 kept samples a nearest-rank p95 IS the maximum (see
|
|
100
111
|
// BUDGETS.md's p95-stabilization section) — deliberately kept, because the
|
|
101
112
|
// honest statistic here is the one that catches real cost, and the ceiling
|
|
102
113
|
// is sized with a 1.25× margin over a projected p95 to absorb it.
|
|
103
|
-
const result = measureCommand(
|
|
114
|
+
const result = measureCommand(NODE, cli("__store-probe"), {
|
|
104
115
|
runs: 12,
|
|
105
116
|
warmups: 3,
|
|
106
117
|
env: {
|
|
@@ -1,29 +1,78 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Performance budgets for the
|
|
2
|
+
* Performance budgets for the shipped `pragma` entry.
|
|
3
3
|
*
|
|
4
4
|
* The ceilings the protected budget tests assert against. The surface
|
|
5
5
|
* covenant's designed target for `--help`/`__complete` is 50 ms; the day-1 perf
|
|
6
|
-
* spike (commit 6) found that unrealistic on the build hardware (cold
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* spike (commit 6) found that unrealistic on the build hardware (cold process
|
|
7
|
+
* start alone is ~45 ms here), so — per the plan — those ceilings are set to
|
|
8
|
+
* roughly 2× the measured median rather than silently weakening the target.
|
|
9
|
+
*
|
|
10
|
+
* A CEILING IS RELATIVE TO THE ARTIFACT IT WAS MEASURED ON. These were derived
|
|
11
|
+
* against a `bun build --compile` executable. The distribution now ships
|
|
12
|
+
* JavaScript that `node` executes, which costs roughly 2× on the fast paths, so
|
|
13
|
+
* a ceiling set at 2× the binary's median lands at the emit's median — where it
|
|
14
|
+
* cannot separate a regression from a slow runner. `__complete` proved that
|
|
15
|
+
* exactly: three CI attempts at 100.15, 100.20 and 100.37 ms against a 100 ms
|
|
16
|
+
* ceiling. Re-derived below on the same rule, against the artifact that now
|
|
17
|
+
* ships; the designed 50 ms target is recorded as unmet rather than quietly
|
|
18
|
+
* moved. {@link BUDGET_WARM_STORE_MS} is derived differently (from a projected
|
|
10
19
|
* p95, and it lands TIGHTER than 2× its median); its arithmetic is written out
|
|
11
20
|
* in full in BUDGETS.md, as are the measurements and environment for all of
|
|
12
21
|
* them.
|
|
13
22
|
*/
|
|
14
23
|
|
|
15
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* `pragma --help` ceiling (ms). Designed 50; the rule is 2× the measured median.
|
|
26
|
+
*
|
|
27
|
+
* Down from the provisional 220, which covered the create surface's eager
|
|
28
|
+
* registration imports on the capabilities barrel. Those are gone — the
|
|
29
|
+
* registered flag spellings are baked into `createSurface.generated.ts` at
|
|
30
|
+
* build time, the mount's adapter loads behind `CliProjection.prepare()`, and
|
|
31
|
+
* the bare-help path no longer loads Commander at all — and the lazy-graph
|
|
32
|
+
* guard in `lazy.test.ts` pins all three so the cost cannot creep back
|
|
33
|
+
* silently.
|
|
34
|
+
*
|
|
35
|
+
* MEASURED, paired: the pre-refactor tree and this one were each built and
|
|
36
|
+
* spawned alternately, 40 kept samples per cell, so drift on a shared box hits
|
|
37
|
+
* both arms. Median 74.6 → 64.7 ms; net of each arm's own `--version` control,
|
|
38
|
+
* the work this path does went 49.3 → 35.3 ms (−28%). 2 × 64.7 = 129.5, so
|
|
39
|
+
* 130 is the rule's own number rather than a number the rule tolerates. It is
|
|
40
|
+
* also where this path sat before the regression. BUDGETS.md carries the full
|
|
41
|
+
* table, the reference-box projection, and why this is the floor.
|
|
42
|
+
*/
|
|
16
43
|
export const BUDGET_HELP_MS = 130;
|
|
17
44
|
|
|
18
|
-
/**
|
|
19
|
-
|
|
45
|
+
/**
|
|
46
|
+
* `pragma __complete …` ceiling (ms). Designed 50 — **not met, and recorded as
|
|
47
|
+
* such**: the shipped entry cannot reach it, because node's own start is most
|
|
48
|
+
* of that number before pragma runs a line.
|
|
49
|
+
*
|
|
50
|
+
* Down from the provisional 220 for the same reason as {@link BUDGET_HELP_MS}:
|
|
51
|
+
* the eager create-surface imports both fast paths paid for are deferred, and
|
|
52
|
+
* completion additionally sheds Commander — nothing on the `__complete`
|
|
53
|
+
* closure imports it any more.
|
|
54
|
+
*
|
|
55
|
+
* MEASURED in the same paired run: median 79.1 → 69.2 ms for the noun case and
|
|
56
|
+
* 74.2 → 69.3 ms for the name-source case; net of the control, 53.7 → 39.7 ms
|
|
57
|
+
* and 48.9 → 39.8 ms.
|
|
58
|
+
*
|
|
59
|
+
* 2× the slower median is 138.5, BELOW this 150 — and it stays 150 anyway,
|
|
60
|
+
* because a ceiling is relative to the box as well as the artifact. This box's
|
|
61
|
+
* cold start is 25–30 ms against the reference box's 45.5; projecting the
|
|
62
|
+
* measured work onto the reference box gives a ~85 ms median, whose 2× is
|
|
63
|
+
* ~170. CI has already run this path at a ~100 ms trimmed mean. Cutting to 140
|
|
64
|
+
* on a local median would be deriving a ceiling on hardware the suite does not
|
|
65
|
+
* run on. Completion is typed interactively, so this stays the budget most
|
|
66
|
+
* worth defending — see BUDGETS.md for the arithmetic.
|
|
67
|
+
*/
|
|
68
|
+
export const BUDGET_COMPLETE_MS = 150;
|
|
20
69
|
|
|
21
70
|
/** Warm project-config (`pragma.config.ts`) load ceiling (ms). Cache hit is sub-ms. */
|
|
22
71
|
export const BUDGET_PROJECT_CONFIG_MS = 10;
|
|
23
72
|
|
|
24
73
|
/**
|
|
25
74
|
* Warm store-backed verb ceiling (ms) — a store boot from the cached n-quads
|
|
26
|
-
* dump plus a query,
|
|
75
|
+
* dump plus a query, through the shipped entry.
|
|
27
76
|
*
|
|
28
77
|
* Re-derived when the embed became the distribution's real 8 479-triple graph
|
|
29
78
|
* instead of a 23-triple sample. Netted against a `--version` control from the
|