@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
|
@@ -150,10 +150,56 @@ export interface PackFilter {
|
|
|
150
150
|
* string matched case-insensitively against the variable).
|
|
151
151
|
*/
|
|
152
152
|
readonly values?: readonly string[];
|
|
153
|
+
/**
|
|
154
|
+
* How a provided value is compared to the row's cell.
|
|
155
|
+
*
|
|
156
|
+
* `"exact"` (the default) compares the whole cell. `"set"` reads the cell as
|
|
157
|
+
* a SPACE-SEPARATED set and matches when ANY member equals the provided
|
|
158
|
+
* value — the shape a `GROUP_CONCAT` produces, for a dimension where one row
|
|
159
|
+
* legitimately belongs to several values at once. The standing case is a
|
|
160
|
+
* hierarchy: a standard filed under `testing-unit` is, by the definition of
|
|
161
|
+
* the hierarchy, also a `testing` standard, and a filter that compared only
|
|
162
|
+
* the leaf answered `--category testing` with 1 of 8 — a silently wrong
|
|
163
|
+
* answer, exit 0.
|
|
164
|
+
*/
|
|
165
|
+
readonly match?: "exact" | "set";
|
|
166
|
+
/**
|
|
167
|
+
* Where the dimension's VOCABULARY lives in the graph, for a filter with no
|
|
168
|
+
* declared {@link values}.
|
|
169
|
+
*
|
|
170
|
+
* A value-free filter rejects a value the data does not carry. The question is
|
|
171
|
+
* what "the data" means. The rows a list just returned are the wrong answer:
|
|
172
|
+
* they are a POPULATION, and a value can be real while no row carries it — a
|
|
173
|
+
* category the graph declares with zero standards filed under it, a
|
|
174
|
+
* `ds:ConceptType` no concept uses yet. Validating against rows turns those
|
|
175
|
+
* into `INVALID_INPUT`, when the honest answer is a calm empty list.
|
|
176
|
+
*
|
|
177
|
+
* So the vocabulary is read from the graph directly, from the same terms the
|
|
178
|
+
* surface that ENUMERATES it reads (`standard categories` reads `cs:Category`
|
|
179
|
+
* / `cs:slug`; so does the `category` filter's vocabulary query). The ruling
|
|
180
|
+
* this honours is "the graph is the vocabulary, don't hard-code the slugs" —
|
|
181
|
+
* rows were never the graph, just the part of it that answered.
|
|
182
|
+
*
|
|
183
|
+
* Without it a value-free filter falls back to the observed rows, which is the
|
|
184
|
+
* only evidence available; that is a NARROWER vocabulary than the truth, and a
|
|
185
|
+
* story whose dimension has an authoritative source should declare it.
|
|
186
|
+
*/
|
|
187
|
+
readonly vocabulary?: PackFilterVocabulary;
|
|
153
188
|
/** Help text (defaults to a generated description). */
|
|
154
189
|
readonly description?: string;
|
|
155
190
|
}
|
|
156
191
|
|
|
192
|
+
/** The authoritative value set for a value-free {@link PackFilter}. */
|
|
193
|
+
export interface PackFilterVocabulary {
|
|
194
|
+
/** SPARQL SELECT producing one row per admissible value. */
|
|
195
|
+
readonly query: string;
|
|
196
|
+
/**
|
|
197
|
+
* SELECT variable carrying the value (without `?`). Defaults to the filter's
|
|
198
|
+
* own {@link PackFilter.variable}.
|
|
199
|
+
*/
|
|
200
|
+
readonly variable?: string;
|
|
201
|
+
}
|
|
202
|
+
|
|
157
203
|
/**
|
|
158
204
|
* Free-text search over list rows: a `--search` string keeping a row when ANY
|
|
159
205
|
* named SELECT variable contains the term (case-insensitive substring). Applied
|
|
@@ -239,6 +285,49 @@ export interface PackCompletion {
|
|
|
239
285
|
readonly minChars?: number;
|
|
240
286
|
}
|
|
241
287
|
|
|
288
|
+
/**
|
|
289
|
+
* How much an entity's containing SCOPE is worth when a name reaches several
|
|
290
|
+
* entities at once — the ranking factor {@link PackLookup.scopeWeight} declares.
|
|
291
|
+
*
|
|
292
|
+
* DERIVED, never enumerated. The scope's own name is a path (`Global`,
|
|
293
|
+
* `Apps/Launchpad`), so its DEPTH is a fact the graph already states, and a
|
|
294
|
+
* scope nobody has heard of yet inherits its place the day it appears. An
|
|
295
|
+
* enumerated ranking would have to be edited for each new one, and the one
|
|
296
|
+
* nobody edited would silently rank first.
|
|
297
|
+
*
|
|
298
|
+
* The weight falls by {@link falloff} per level below the top, so the top level
|
|
299
|
+
* is worth 1 and each nesting step costs the same again; floored at 0, so a very
|
|
300
|
+
* deep scope can never turn negative and invert the type factor it multiplies.
|
|
301
|
+
*
|
|
302
|
+
* {@link asserted} is the retirement path for the DERIVATION, not for this
|
|
303
|
+
* declaration: an asserted value wins over the derived one
|
|
304
|
+
* (`COALESCE(?asserted, ?derived)`), so the day the ontology states the ranking
|
|
305
|
+
* itself, the depth heuristic stops mattering and `falloff` becomes inert.
|
|
306
|
+
*
|
|
307
|
+
* The declaration itself must stay. Every read of {@link asserted} is reached
|
|
308
|
+
* through this object, so deleting it does not fall back to the ontology's rank
|
|
309
|
+
* — it removes scope ranking from the query altogether and silently returns the
|
|
310
|
+
* lookup to `STR(?uri)` order, which is the defect this exists to fix. What
|
|
311
|
+
* retires is the derivation, and what remains is `via` plus `asserted`.
|
|
312
|
+
*/
|
|
313
|
+
export interface PackScopeWeight {
|
|
314
|
+
/** The entity → scope edge (e.g. `ds:tier`). */
|
|
315
|
+
readonly via: string;
|
|
316
|
+
/**
|
|
317
|
+
* The scope property holding its path-shaped name (e.g. `ds:name`), whose
|
|
318
|
+
* `/`-separated depth derives the weight.
|
|
319
|
+
*
|
|
320
|
+
* It must be the NAME, not the IRI: the live tiers spell the same scope
|
|
321
|
+
* `ds:apps_launchpad` and `"Apps/Launchpad"`, and only the name carries the
|
|
322
|
+
* separator that makes the hierarchy legible.
|
|
323
|
+
*/
|
|
324
|
+
readonly by: string;
|
|
325
|
+
/** Score cost per level below the top, 0–1 (e.g. 0.2 → 1, 0.8, 0.6, …). */
|
|
326
|
+
readonly falloff: number;
|
|
327
|
+
/** An asserted weight on the scope, which WINS over the derived one. */
|
|
328
|
+
readonly asserted?: string;
|
|
329
|
+
}
|
|
330
|
+
|
|
242
331
|
/**
|
|
243
332
|
* The lookup half of a pack. The query is generated from `by` and `type`/`types`
|
|
244
333
|
* — user-supplied names are escaped by the generator, never interpolated by the
|
|
@@ -256,6 +345,29 @@ export interface PackLookup {
|
|
|
256
345
|
readonly source?: "sparql" | "graphql";
|
|
257
346
|
/** Property whose value names the entity — prefixed name or IRI. */
|
|
258
347
|
readonly by: string;
|
|
348
|
+
/**
|
|
349
|
+
* What names an entity that carries no {@link by} value. Absent (the default)
|
|
350
|
+
* means NOTHING does: the `by` triple is required, and an entity without one
|
|
351
|
+
* is not addressable by name and never drawn by `sample`.
|
|
352
|
+
*
|
|
353
|
+
* `"iri"` opts the family into an IRI-DERIVED name — the local name after the
|
|
354
|
+
* last `#`/`/`, with dot-separated hierarchy segments published as slashes
|
|
355
|
+
* (`cs:react.component.props` → `react/component/props`).
|
|
356
|
+
*
|
|
357
|
+
* DECLARE IT ONLY WHEN THE STORY'S `list` PUBLISHES THE SAME DERIVED NAME.
|
|
358
|
+
* The option exists to keep the two halves of the two-step grammar over ONE
|
|
359
|
+
* population: `standard list` synthesizes a name for the ~87% of code
|
|
360
|
+
* standards carrying no `cs:name`, so `standard lookup` must answer to it.
|
|
361
|
+
* Turning it on where the list does NOT publish such a name is the mirror
|
|
362
|
+
* defect — `token list` requires `ds:tokenId`, so a `ds:Token` without one
|
|
363
|
+
* would become addressable and sampleable under a name the list never
|
|
364
|
+
* published.
|
|
365
|
+
*
|
|
366
|
+
* Requires a class constraint ({@link type}/{@link types}): the derived name
|
|
367
|
+
* is only as trustworthy as the class that vouches for the entity, and
|
|
368
|
+
* without one there is nothing to bound the scan with either.
|
|
369
|
+
*/
|
|
370
|
+
readonly nameFallback?: "iri";
|
|
259
371
|
/** Optional single class constraint — prefixed name or IRI. */
|
|
260
372
|
readonly type?: string;
|
|
261
373
|
/** CLI description for the lookup command (defaults to a generated one). */
|
|
@@ -267,6 +379,30 @@ export interface PackLookup {
|
|
|
267
379
|
* VALUES constraint on the name resolve. Mutually exclusive with `type`.
|
|
268
380
|
*/
|
|
269
381
|
readonly types?: readonly string[];
|
|
382
|
+
/**
|
|
383
|
+
* Relative importance per addressed type, prefixed type → 0–1 (unlisted types
|
|
384
|
+
* default to 1). Editorial judgement about which of a noun's classes matters
|
|
385
|
+
* most, declared as DATA rather than frozen into the kernel — it feeds the MCP
|
|
386
|
+
* listing's `annotations.priority`, breaks ties in URI-completion ranking, AND
|
|
387
|
+
* is one factor of the score a name resolve ORDERS BY, so a `ds:Subcomponent`
|
|
388
|
+
* at 0.6 sinks below every component at equal match.
|
|
389
|
+
*
|
|
390
|
+
* A separate map rather than an entry shape on `types` so `types` keeps its
|
|
391
|
+
* flat `readonly string[]` form and the addition is non-breaking. A key naming
|
|
392
|
+
* a type the lookup does not address is REJECTED, not ignored: a silent no-op
|
|
393
|
+
* is how a weight that never applied survives review.
|
|
394
|
+
*/
|
|
395
|
+
readonly weights?: Readonly<Record<string, number>>;
|
|
396
|
+
/**
|
|
397
|
+
* The OTHER factor of that score: how much an entity's containing scope is
|
|
398
|
+
* worth, derived from how DEEP that scope sits in its own hierarchy.
|
|
399
|
+
*
|
|
400
|
+
* {@link weights} answers "which KIND of thing did they mean"; this answers
|
|
401
|
+
* "whose?". They multiply rather than tiebreak, because neither subsumes the
|
|
402
|
+
* other: a whole component in a narrow scope still beats a mere part of a
|
|
403
|
+
* block in the widest one.
|
|
404
|
+
*/
|
|
405
|
+
readonly scopeWeight?: PackScopeWeight;
|
|
270
406
|
/**
|
|
271
407
|
* GraphQL type or interface the generated document's inline fragment targets
|
|
272
408
|
* (`source: "graphql"` only). Defaults to the local name of `type`; required
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* conflict, reported with both sources.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import type { VerbSpec } from "../spec/
|
|
11
|
+
import type { VerbSpec } from "../spec/index.js";
|
|
12
12
|
|
|
13
13
|
/** The `(noun, verb)` key for a verb path (`["standard","list"]` → `standard list`). */
|
|
14
14
|
export function verbKey(path: readonly [string, string?]): string {
|
|
@@ -3,6 +3,7 @@ import { afterAll, describe, expect, it, vi } from "vitest";
|
|
|
3
3
|
import { VERSION } from "../../../constants.js";
|
|
4
4
|
import { fixtureModule } from "../../../testing/fixtures/fixtureCapability.js";
|
|
5
5
|
import { projectCli } from "../../../testing/helpers/projectCli.js";
|
|
6
|
+
import type { GlobalFlags } from "../../runtime/index.js";
|
|
6
7
|
import type { CapabilityModule, VerbSpec } from "../../spec/types.js";
|
|
7
8
|
import { formatRootHelp } from "./rootHelp.js";
|
|
8
9
|
|
|
@@ -105,6 +106,121 @@ describe("buildProgram — default-true boolean negation (B9)", () => {
|
|
|
105
106
|
});
|
|
106
107
|
});
|
|
107
108
|
|
|
109
|
+
describe("buildProgram — one spelling per flag", () => {
|
|
110
|
+
it("registers no short option anywhere in the tree", () => {
|
|
111
|
+
const program = projectCli([fixtureModule]);
|
|
112
|
+
const walk = (cmd: import("commander").Command): void => {
|
|
113
|
+
expect(cmd.options.some((o) => o.short !== undefined)).toBe(false);
|
|
114
|
+
for (const child of cmd.commands) walk(child);
|
|
115
|
+
};
|
|
116
|
+
walk(program);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it("still answers --help while -v/-h reject as unknown options", async () => {
|
|
120
|
+
const spyErr = vi
|
|
121
|
+
.spyOn(process.stderr, "write")
|
|
122
|
+
.mockImplementation(() => true);
|
|
123
|
+
const spyOut = vi
|
|
124
|
+
.spyOn(process.stdout, "write")
|
|
125
|
+
.mockImplementation(() => true);
|
|
126
|
+
await expect(
|
|
127
|
+
projectCli([fixtureModule]).parseAsync(["widget", "--help"], {
|
|
128
|
+
from: "user",
|
|
129
|
+
}),
|
|
130
|
+
).rejects.toMatchObject({ code: "commander.helpDisplayed" });
|
|
131
|
+
await expect(
|
|
132
|
+
projectCli([fixtureModule]).parseAsync(["widget", "list", "-h"], {
|
|
133
|
+
from: "user",
|
|
134
|
+
}),
|
|
135
|
+
).rejects.toMatchObject({ code: "commander.unknownOption" });
|
|
136
|
+
await expect(
|
|
137
|
+
projectCli([fixtureModule]).parseAsync(["widget", "list", "-v"], {
|
|
138
|
+
from: "user",
|
|
139
|
+
}),
|
|
140
|
+
).rejects.toMatchObject({ code: "commander.unknownOption" });
|
|
141
|
+
spyErr.mockRestore();
|
|
142
|
+
spyOut.mockRestore();
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
describe("buildProgram — repeatable filter flags", () => {
|
|
147
|
+
/** A verb with a repeatable enum filter and a repeatable string filter. */
|
|
148
|
+
const filterVerb: VerbSpec = {
|
|
149
|
+
path: ["thing", "list"],
|
|
150
|
+
summary: "thing list summary",
|
|
151
|
+
params: [
|
|
152
|
+
{
|
|
153
|
+
kind: "enum",
|
|
154
|
+
name: "category",
|
|
155
|
+
doc: "Filter by category.",
|
|
156
|
+
values: ["css", "git"],
|
|
157
|
+
repeatable: true,
|
|
158
|
+
},
|
|
159
|
+
{ kind: "string", name: "tag", doc: "Filter by tag.", repeatable: true },
|
|
160
|
+
],
|
|
161
|
+
output: {
|
|
162
|
+
formatters: {
|
|
163
|
+
plain: (d) => JSON.stringify(d),
|
|
164
|
+
llm: (d) => JSON.stringify(d),
|
|
165
|
+
json: (d) => JSON.stringify(d),
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
capability: { needsStore: false, mutates: false, mcp: { expose: true } },
|
|
169
|
+
run: async (params) => params,
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
/** Parse argv and capture the option bag the action receives. */
|
|
173
|
+
async function optsFor(argv: string[]): Promise<Record<string, unknown>> {
|
|
174
|
+
let seen: Record<string, unknown> = {};
|
|
175
|
+
const program = projectCli([
|
|
176
|
+
{
|
|
177
|
+
name: "thing",
|
|
178
|
+
verbs: [
|
|
179
|
+
{
|
|
180
|
+
...filterVerb,
|
|
181
|
+
run: async (params) => {
|
|
182
|
+
seen = params;
|
|
183
|
+
return null;
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
]);
|
|
189
|
+
await program.parseAsync(["thing", "list", ...argv], { from: "user" });
|
|
190
|
+
return seen;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
it("accumulates a repeated filter into the union, never last-wins", async () => {
|
|
194
|
+
const params = await optsFor([
|
|
195
|
+
"--category",
|
|
196
|
+
"css",
|
|
197
|
+
"--category",
|
|
198
|
+
"git",
|
|
199
|
+
"--tag",
|
|
200
|
+
"a",
|
|
201
|
+
"--tag",
|
|
202
|
+
"b",
|
|
203
|
+
]);
|
|
204
|
+
expect(params.category).toEqual(["css", "git"]);
|
|
205
|
+
expect(params.tag).toEqual(["a", "b"]);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it("keeps a single occurrence a one-element array and validates enum values", async () => {
|
|
209
|
+
const params = await optsFor(["--category", "css"]);
|
|
210
|
+
expect(params.category).toEqual(["css"]);
|
|
211
|
+
const program = projectCli([{ name: "thing", verbs: [filterVerb] }]);
|
|
212
|
+
const spy = vi
|
|
213
|
+
.spyOn(process.stderr, "write")
|
|
214
|
+
.mockImplementation(() => true);
|
|
215
|
+
await expect(
|
|
216
|
+
program.parseAsync(["thing", "list", "--category", "bogus"], {
|
|
217
|
+
from: "user",
|
|
218
|
+
}),
|
|
219
|
+
).rejects.toMatchObject({ code: "commander.invalidArgument" });
|
|
220
|
+
spy.mockRestore();
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
|
|
108
224
|
describe("buildProgram — early exits", () => {
|
|
109
225
|
it("throws commander.version for --version, writing the version", async () => {
|
|
110
226
|
const program = projectCli([fixtureModule]);
|
|
@@ -371,12 +487,88 @@ describe("buildProgram — sub-verb-only noun invoked bare (U2)", () => {
|
|
|
371
487
|
});
|
|
372
488
|
});
|
|
373
489
|
|
|
490
|
+
/** The global flags of a human at a terminal: plain output, nothing inferred. */
|
|
491
|
+
const HUMAN_FLAGS: GlobalFlags = {
|
|
492
|
+
llm: false,
|
|
493
|
+
format: "plain",
|
|
494
|
+
verbose: false,
|
|
495
|
+
};
|
|
496
|
+
|
|
497
|
+
/** A run whose stdout is captured: `llm`, inferred or asked for. */
|
|
498
|
+
const CAPTURED_FLAGS: GlobalFlags = {
|
|
499
|
+
llm: true,
|
|
500
|
+
autoLlm: true,
|
|
501
|
+
format: "plain",
|
|
502
|
+
verbose: false,
|
|
503
|
+
};
|
|
504
|
+
|
|
505
|
+
/** The first line of the wordmark art — present iff the wordmark printed. */
|
|
506
|
+
const WORDMARK_LINE = "(___,";
|
|
507
|
+
|
|
508
|
+
const rootHelpFor = (flags: GlobalFlags): string =>
|
|
509
|
+
formatRootHelp(
|
|
510
|
+
"pragma",
|
|
511
|
+
"pragma test",
|
|
512
|
+
[
|
|
513
|
+
makeVerb(["info"]),
|
|
514
|
+
makeVerb(["config", "show"]),
|
|
515
|
+
makeVerb(["block", "list"]),
|
|
516
|
+
],
|
|
517
|
+
"1.2.3",
|
|
518
|
+
"https://example.test/issues",
|
|
519
|
+
flags,
|
|
520
|
+
);
|
|
521
|
+
|
|
522
|
+
describe("formatRootHelp — the wordmark is gated on the AUDIENCE", () => {
|
|
523
|
+
// Asserted on the ART, never on styling: `golden.ts` strips ANSI and this
|
|
524
|
+
// suite pins `chalk.level = 0`, so a colour-only change would be invisible
|
|
525
|
+
// here — and chalk emits no escapes off a TTY anyway, so it would save an
|
|
526
|
+
// agent nothing. The lines have to go.
|
|
527
|
+
it("prints the art for a human reading plain output", () => {
|
|
528
|
+
expect(rootHelpFor(HUMAN_FLAGS)).toContain(WORDMARK_LINE);
|
|
529
|
+
});
|
|
530
|
+
|
|
531
|
+
it("drops the art — every line of it — when stdout is captured", () => {
|
|
532
|
+
const help = rootHelpFor(CAPTURED_FLAGS);
|
|
533
|
+
expect(help).not.toContain(WORDMARK_LINE);
|
|
534
|
+
// No leading blank line either: the header IS the first line.
|
|
535
|
+
expect(help.startsWith("pragma v1.2.3 — pragma test")).toBe(true);
|
|
536
|
+
// Only the art goes; the page itself is untouched.
|
|
537
|
+
expect(help).toContain("Usage: pragma <command> [subcommand] [flags]");
|
|
538
|
+
expect(help).toContain("Global flags");
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
it("drops the art for `--format json` too", () => {
|
|
542
|
+
expect(
|
|
543
|
+
rootHelpFor({ llm: false, format: "json", verbose: false }),
|
|
544
|
+
).not.toContain(WORDMARK_LINE);
|
|
545
|
+
});
|
|
546
|
+
|
|
547
|
+
it("keeps the art for an EXPLICIT `--format plain` down a pipe", () => {
|
|
548
|
+
// Explicit beats inference: asking for the human shape gets the human page,
|
|
549
|
+
// captured or not. (`parseGlobalFlags` leaves `llm` false whenever
|
|
550
|
+
// `--format` was requested.)
|
|
551
|
+
expect(
|
|
552
|
+
rootHelpFor({
|
|
553
|
+
llm: false,
|
|
554
|
+
autoLlm: false,
|
|
555
|
+
format: "plain",
|
|
556
|
+
verbose: false,
|
|
557
|
+
}),
|
|
558
|
+
).toContain(WORDMARK_LINE);
|
|
559
|
+
});
|
|
560
|
+
|
|
561
|
+
it("differs ONLY by the wordmark block", () => {
|
|
562
|
+
const human = rootHelpFor(HUMAN_FLAGS).split("\n");
|
|
563
|
+
const captured = rootHelpFor(CAPTURED_FLAGS).split("\n");
|
|
564
|
+
// 10 art lines + the blank that separates them from the header.
|
|
565
|
+
expect(human.length - captured.length).toBe(11);
|
|
566
|
+
expect(human.slice(11)).toEqual(captured);
|
|
567
|
+
});
|
|
568
|
+
});
|
|
569
|
+
|
|
374
570
|
describe("formatRootHelp — grouping", () => {
|
|
375
|
-
const help =
|
|
376
|
-
makeVerb(["info"]),
|
|
377
|
-
makeVerb(["config", "show"]),
|
|
378
|
-
makeVerb(["block", "list"]),
|
|
379
|
-
]);
|
|
571
|
+
const help = rootHelpFor(HUMAN_FLAGS);
|
|
380
572
|
|
|
381
573
|
it("leads with the uncurated nouns, untitled, under the usage line", () => {
|
|
382
574
|
// `block` is not in the kernel's curated table, so it leads the page with
|
|
@@ -389,11 +581,13 @@ describe("formatRootHelp — grouping", () => {
|
|
|
389
581
|
expect(help.match(/pragma test/g)).toHaveLength(1);
|
|
390
582
|
});
|
|
391
583
|
|
|
392
|
-
it("lists the live nouns and
|
|
584
|
+
it("lists the live nouns, and only those", () => {
|
|
393
585
|
expect(help).toContain("block");
|
|
394
586
|
expect(help).toContain("config");
|
|
395
587
|
expect(help).toContain("info");
|
|
396
|
-
|
|
588
|
+
// `mcp` is curated for PLACEMENT, not conjured into existence: a registry
|
|
589
|
+
// without an mcp verb has no mcp row.
|
|
590
|
+
expect(help).not.toContain("mcp");
|
|
397
591
|
});
|
|
398
592
|
|
|
399
593
|
it("drops nouns that are not present", () => {
|
|
@@ -410,7 +604,20 @@ describe("formatRootHelp — grouping", () => {
|
|
|
410
604
|
|
|
411
605
|
it("renders the unified root page (restyle golden)", () => {
|
|
412
606
|
expect(help).toMatchInlineSnapshot(`
|
|
413
|
-
"
|
|
607
|
+
" _
|
|
608
|
+
/' \`\\
|
|
609
|
+
/' )
|
|
610
|
+
/' (___,/'____ ____ ____ ,__________ ____
|
|
611
|
+
/' )' )--/' ) /' ) /' ) ) /' )
|
|
612
|
+
/' /' /' /' /' /' /' /' /' /' /'
|
|
613
|
+
(,/' /' (___,/(__(___,/(__/' /' /(__(___,/(__
|
|
614
|
+
/'
|
|
615
|
+
/ /'
|
|
616
|
+
(___,/'
|
|
617
|
+
|
|
618
|
+
pragma v1.2.3 — pragma test
|
|
619
|
+
|
|
620
|
+
This is a preview version. Issues and suggestions: https://example.test/issues
|
|
414
621
|
|
|
415
622
|
Usage: pragma <command> [subcommand] [flags]
|
|
416
623
|
|
|
@@ -420,13 +627,12 @@ describe("formatRootHelp — grouping", () => {
|
|
|
420
627
|
config Read and write pragma configuration
|
|
421
628
|
info Show version, config, and update status
|
|
422
629
|
|
|
423
|
-
For AI agents
|
|
424
|
-
mcp Start the MCP server over stdio
|
|
425
|
-
|
|
426
630
|
Global flags
|
|
427
631
|
--format <plain|llm|json> Select output format (llm = condensed Markdown for agents)
|
|
428
632
|
--detail <level> Progressive-disclosure level (summary, standard, detailed)
|
|
429
|
-
--
|
|
633
|
+
--no-headers Hide the table header row in plain output
|
|
634
|
+
--quiet Suppress success and progress output (errors still print)
|
|
635
|
+
--verbose Diagnostic output on stderr (sources update)
|
|
430
636
|
--help Show help (works on any command)
|
|
431
637
|
--version Show the CLI version
|
|
432
638
|
|
|
@@ -11,11 +11,17 @@
|
|
|
11
11
|
* the v1 cli-core `registerAll`, retargeted at the grammar.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import { Command, Option } from "commander";
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
import { Command, InvalidArgumentError, Option } from "commander";
|
|
15
|
+
import {
|
|
16
|
+
BIN_NAME,
|
|
17
|
+
ISSUES_URL,
|
|
18
|
+
PROGRAM_DESCRIPTION,
|
|
19
|
+
VERSION,
|
|
20
|
+
} from "../../../constants.js";
|
|
21
|
+
import type { GlobalFlags } from "../../runtime/index.js";
|
|
22
|
+
import { kebabCase } from "../../spec/index.js";
|
|
23
|
+
import type { CliProjection, ParamSpec, VerbSpec } from "../../spec/types.js";
|
|
24
|
+
import { MUTATION_FLAG_DOCS, negationFlagDoc } from "./constants.js";
|
|
19
25
|
import { dispatch } from "./dispatch.js";
|
|
20
26
|
import { formatRootHelp } from "./rootHelp.js";
|
|
21
27
|
import { formatNounHelp, formatVerbHelp } from "./verbHelp.js";
|
|
@@ -30,6 +36,15 @@ export interface BuildProgramOptions {
|
|
|
30
36
|
readonly description?: string;
|
|
31
37
|
/** Version string for `--version`. */
|
|
32
38
|
readonly version?: string;
|
|
39
|
+
/** Where root help's preview notice sends feedback. */
|
|
40
|
+
readonly issuesUrl?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Module-owned noun mounts (see `CapabilityModule.cliProjection`), keyed by
|
|
43
|
+
* noun. A mounted noun's parent command is created here exactly once and
|
|
44
|
+
* handed to the module's `mount` — the module owns everything beneath it;
|
|
45
|
+
* its verbs stay the binding-level grammar for help/surface/completion.
|
|
46
|
+
*/
|
|
47
|
+
readonly mounts?: ReadonlyMap<string, CliProjection>;
|
|
33
48
|
}
|
|
34
49
|
|
|
35
50
|
/** The positional usage token for a param (`<name>` / `[name]`, variadic `...`). */
|
|
@@ -61,7 +76,30 @@ function registerParams(command: Command, verb: VerbSpec): void {
|
|
|
61
76
|
for (const param of verb.params) {
|
|
62
77
|
if (param.positional) continue;
|
|
63
78
|
const spec = flagSpec(param);
|
|
64
|
-
if (
|
|
79
|
+
if (
|
|
80
|
+
(param.kind === "enum" || param.kind === "string") &&
|
|
81
|
+
param.repeatable === true
|
|
82
|
+
) {
|
|
83
|
+
// A repeatable flag ACCUMULATES — Commander's default keeps only the
|
|
84
|
+
// last occurrence, which silently drops data. The collector validates
|
|
85
|
+
// an enum's values itself, since a custom parser replaces the parser
|
|
86
|
+
// `.choices()` would install.
|
|
87
|
+
command.addOption(
|
|
88
|
+
new Option(spec, param.doc).argParser(
|
|
89
|
+
(value: string, previous: string[] | undefined) => {
|
|
90
|
+
if (
|
|
91
|
+
param.kind === "enum" &&
|
|
92
|
+
!(param.values as readonly string[]).includes(value)
|
|
93
|
+
) {
|
|
94
|
+
throw new InvalidArgumentError(
|
|
95
|
+
`Allowed choices are ${param.values.join(", ")}.`,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
return [...(previous ?? []), value];
|
|
99
|
+
},
|
|
100
|
+
),
|
|
101
|
+
);
|
|
102
|
+
} else if (param.kind === "enum") {
|
|
65
103
|
const option = new Option(spec, param.doc).choices([...param.values]);
|
|
66
104
|
if (param.default !== undefined) option.default(param.default);
|
|
67
105
|
command.addOption(option);
|
|
@@ -70,23 +108,28 @@ function registerParams(command: Command, verb: VerbSpec): void {
|
|
|
70
108
|
} else {
|
|
71
109
|
command.option(spec, param.doc);
|
|
72
110
|
}
|
|
73
|
-
// B9: a default-`true` boolean is otherwise undisableable — the grammar
|
|
74
|
-
// no negation form, so
|
|
75
|
-
//
|
|
111
|
+
// B9: a default-`true` boolean is otherwise undisableable — the grammar
|
|
112
|
+
// has no negation form, so a kernel-registered default-true boolean could
|
|
113
|
+
// never be turned off. Register a paired `--no-<flag>` so it can:
|
|
76
114
|
// Commander keeps the `true` default and lets `--no-<flag>` set it false
|
|
77
|
-
// (verified: an unset default-false boolean is left alone).
|
|
78
|
-
// PARSE convenience, never a ParamSpec —
|
|
79
|
-
//
|
|
115
|
+
// (verified: an unset default-false boolean is left alone). For verbs
|
|
116
|
+
// registered HERE this is a CLI PARSE convenience, never a ParamSpec —
|
|
117
|
+
// `emitSurface`/MCP/the covenant keep the positive kebab token and
|
|
118
|
+
// negation stays additive. A MOUNTED noun (`create`) never reaches this
|
|
119
|
+
// loop: its leaves register through the projection's `buildOptionInfo`,
|
|
120
|
+
// where a default-true confirm registers ONLY the `--no-` form — so its
|
|
121
|
+
// covenant/reference tokens come from the module's registered-syntax
|
|
122
|
+
// seam, not this convention (L-CIS-2).
|
|
80
123
|
if (param.kind === "boolean" && param.default === true) {
|
|
81
124
|
const flag = kebabCase(param.name);
|
|
82
|
-
command.option(`--no-${flag}`,
|
|
125
|
+
command.option(`--no-${flag}`, negationFlagDoc(flag));
|
|
83
126
|
}
|
|
84
127
|
}
|
|
85
128
|
|
|
86
129
|
if (verb.capability.mutates) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
130
|
+
for (const { flag, doc } of MUTATION_FLAG_DOCS) {
|
|
131
|
+
command.option(flag, doc);
|
|
132
|
+
}
|
|
90
133
|
}
|
|
91
134
|
}
|
|
92
135
|
|
|
@@ -241,15 +284,28 @@ export function buildProgram(
|
|
|
241
284
|
const programName = options.programName ?? BIN_NAME;
|
|
242
285
|
const description = options.description ?? PROGRAM_DESCRIPTION;
|
|
243
286
|
const version = options.version ?? VERSION;
|
|
287
|
+
const issuesUrl = options.issuesUrl ?? ISSUES_URL;
|
|
244
288
|
const live = verbs.filter((verb) => !verb.hidden);
|
|
245
289
|
|
|
246
290
|
const program = new Command();
|
|
247
291
|
program.name(programName).description(description);
|
|
248
|
-
|
|
292
|
+
// One spelling per flag: no shorts. `--version` drops `-v` (which reads as
|
|
293
|
+
// *verbose* everywhere else), and the help option is `--help` alone —
|
|
294
|
+
// subcommands created from here on inherit it (Commander copies the help
|
|
295
|
+
// option into children at creation), including a mounted subtree's.
|
|
296
|
+
program.version(version, "--version");
|
|
297
|
+
program.helpOption("--help", "Show help (works on any command)");
|
|
249
298
|
program.enablePositionalOptions();
|
|
250
299
|
program.exitOverride();
|
|
251
300
|
useDesignedHelp(program, () =>
|
|
252
|
-
formatRootHelp(
|
|
301
|
+
formatRootHelp(
|
|
302
|
+
programName,
|
|
303
|
+
description,
|
|
304
|
+
live,
|
|
305
|
+
version,
|
|
306
|
+
issuesUrl,
|
|
307
|
+
options.globalFlags,
|
|
308
|
+
),
|
|
253
309
|
);
|
|
254
310
|
|
|
255
311
|
const groups = new Map<string, VerbSpec[]>();
|
|
@@ -264,6 +320,16 @@ export function buildProgram(
|
|
|
264
320
|
const selfVerbs = bucket.filter((v) => v.path.length === 1);
|
|
265
321
|
const subVerbs = bucket.filter((v) => v.path.length > 1);
|
|
266
322
|
|
|
323
|
+
// A module-owned mount replaces the generic per-verb attachment for its
|
|
324
|
+
// noun: create the parent once, hand it over, move on.
|
|
325
|
+
const mounted = options.mounts?.get(noun);
|
|
326
|
+
if (mounted) {
|
|
327
|
+
const parent = program.command(noun);
|
|
328
|
+
parent.enablePositionalOptions();
|
|
329
|
+
mounted.mount(parent, { globalFlags: options.globalFlags, programName });
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
|
|
267
333
|
// Pure self-verb noun(s) — attach each leaf directly to the root, as before.
|
|
268
334
|
if (subVerbs.length === 0) {
|
|
269
335
|
for (const verb of selfVerbs) {
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI projector constants — the flag/doc pairs that must read identically
|
|
3
|
+
* wherever they surface.
|
|
4
|
+
*
|
|
5
|
+
* The mutation flags are auto-injected onto every mutating verb by
|
|
6
|
+
* `registerParams` (and by the mounted create subtree's own registration),
|
|
7
|
+
* and `formatVerbHelp` renders them in the Flags block; a default-true
|
|
8
|
+
* boolean's `--no-` negation is likewise both registered and rendered. Help
|
|
9
|
+
* and registration deriving from the SAME rows here is what keeps a page
|
|
10
|
+
* from denying a flag that parses — the defect this file exists to prevent.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** One auto-injected flag: the token and the doc both surfaces print. */
|
|
14
|
+
export interface FlagDoc {
|
|
15
|
+
readonly flag: string;
|
|
16
|
+
readonly doc: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** The three mutation flags every mutating verb accepts, in display order. */
|
|
20
|
+
export const MUTATION_FLAG_DOCS: readonly FlagDoc[] = [
|
|
21
|
+
{ flag: "--dry-run", doc: "Preview effects without applying them" },
|
|
22
|
+
{ flag: "--undo", doc: "Reverse a previous run of this command" },
|
|
23
|
+
{ flag: "--yes", doc: "Apply without an interactive confirmation" },
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The doc for the `--no-<flag>` negation a default-true boolean registers.
|
|
28
|
+
*
|
|
29
|
+
* @param kebab - The positive flag's kebab token (no dashes).
|
|
30
|
+
* @returns The doc string registration and help share.
|
|
31
|
+
*/
|
|
32
|
+
export function negationFlagDoc(kebab: string): string {
|
|
33
|
+
return `Disable --${kebab} (on by default).`;
|
|
34
|
+
}
|