@canonical/pragma-cli 0.33.0 → 0.35.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/dist/.build-ok +0 -0
- package/dist/package.json +83 -0
- package/dist/pragma.conf.js +814 -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 +293 -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 +92 -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/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 +205 -0
- package/dist/src/capabilities/doctor/checks/targetHealth.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.render.js +185 -0
- package/dist/src/capabilities/doctor/doctor.render.js.map +1 -0
- package/dist/src/capabilities/doctor/doctor.verb.js +45 -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 +83 -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 +66 -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 +53 -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 +168 -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 +343 -0
- package/dist/src/capabilities/setup/operations/setupGenerator.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js +277 -0
- package/dist/src/capabilities/setup/operations/setupLsp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js +207 -0
- package/dist/src/capabilities/setup/operations/setupMcp.js.map +1 -0
- package/dist/src/capabilities/setup/operations/setupSkills.js +316 -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 +193 -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 +334 -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 +263 -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/bands.js +16 -0
- package/dist/src/capabilities/shared/bands.js.map +1 -0
- package/dist/src/capabilities/shared/index.js +26 -0
- package/dist/src/capabilities/shared/index.js.map +1 -0
- package/dist/src/capabilities/shared/packageManager.js +103 -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 +195 -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 +167 -0
- package/dist/src/capabilities/sources/installSkills.js.map +1 -0
- package/dist/src/capabilities/sources/runUpdate.js +394 -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 +99 -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 +44 -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 +82 -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 +25 -0
- package/dist/src/kernel/index.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 +223 -0
- package/dist/src/kernel/packs/resolveEntity.js.map +1 -0
- package/dist/src/kernel/packs/runBodies.js +87 -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 +369 -0
- package/dist/src/kernel/packs/schema.js.map +1 -0
- package/dist/src/kernel/packs/sparql/applyFilters.js +68 -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 +217 -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 +216 -0
- package/dist/src/kernel/project/cli/globalFlags.js.map +1 -0
- package/dist/src/kernel/project/cli/helpFormat.js +59 -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 +197 -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 +300 -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 +85 -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/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 +25 -24
- package/pragma.conf.ts +853 -0
- package/src/bin.ts +276 -82
- package/src/capabilities/block.parity.test.ts +253 -0
- package/src/capabilities/capabilities/capabilities.render.ts +4 -3
- package/src/capabilities/capabilities/capabilities.verb.ts +32 -14
- package/src/capabilities/capabilities/catalog.ts +20 -12
- package/src/capabilities/capabilities/hints.ts +43 -24
- package/src/capabilities/capabilities/index.ts +1 -1
- package/src/capabilities/colophon/collectColophon.ts +50 -24
- package/src/capabilities/colophon/colophon.render.ts +25 -1
- package/src/capabilities/colophon/colophon.test.ts +42 -21
- package/src/capabilities/colophon/colophon.verb.ts +9 -5
- package/src/capabilities/colophon/types.ts +16 -7
- package/src/capabilities/config/collectConfigShow.test.ts +58 -0
- package/src/capabilities/config/collectConfigShow.ts +43 -6
- package/src/capabilities/config/field.render.ts +4 -5
- package/src/capabilities/config/fields.ts +17 -37
- 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 +14 -9
- package/src/capabilities/config/show.render.test.ts +77 -5
- package/src/capabilities/config/show.render.ts +8 -13
- package/src/capabilities/config/show.verb.ts +13 -9
- package/src/capabilities/config/types.ts +26 -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 +95 -103
- package/src/capabilities/create/cliProjection.ts +227 -0
- package/src/capabilities/create/constants.ts +50 -0
- package/src/capabilities/create/create.mcp.test.ts +91 -7
- package/src/capabilities/create/create.render.ts +71 -7
- package/src/capabilities/create/create.test.ts +523 -162
- package/src/capabilities/create/create.verb.ts +361 -321
- 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 +9 -14
- 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 +40 -46
- package/src/capabilities/create/shippedCreate.subprocess.test.ts +164 -0
- package/src/capabilities/create/types.ts +29 -5
- package/src/capabilities/{standard/parity.test.ts → distribution.parity.test.ts} +24 -14
- package/src/capabilities/distribution.test.ts +122 -0
- package/src/capabilities/distribution.ts +54 -0
- package/src/capabilities/doctor/checks/checkKeStore.ts +9 -7
- package/src/capabilities/doctor/checks/checkPackageRefs.ts +82 -46
- package/src/capabilities/doctor/checks/checkPragmaVersion.ts +5 -4
- package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +125 -30
- package/src/capabilities/doctor/checks/checkShellCompletions.ts +113 -27
- 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 +274 -0
- package/src/capabilities/doctor/doctor.render.test.ts +24 -13
- package/src/capabilities/doctor/doctor.render.ts +45 -20
- package/src/capabilities/doctor/doctor.test.ts +158 -40
- package/src/capabilities/doctor/doctor.verb.ts +9 -5
- package/src/capabilities/doctor/runChecks.ts +65 -66
- package/src/capabilities/doctor/types.ts +21 -5
- package/src/capabilities/emptyRecovery.test.ts +44 -22
- 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 -5
- package/src/capabilities/graph/query.render.ts +15 -3
- package/src/capabilities/graph/query.verb.ts +5 -4
- package/src/capabilities/graph/runQuery.ts +9 -7
- package/src/capabilities/index.ts +25 -19
- package/src/capabilities/info/collectInfo.ts +15 -10
- package/src/capabilities/info/info.render.ts +4 -3
- package/src/capabilities/info/info.verb.ts +4 -3
- package/src/capabilities/lazy.test.ts +125 -2
- 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 +42 -83
- package/src/capabilities/prompt/index.ts +2 -2
- package/src/capabilities/prompt/prompt.render.ts +6 -2
- package/src/capabilities/prompt/prompt.test.ts +12 -6
- package/src/capabilities/prompt/types.ts +1 -1
- package/src/capabilities/prompt/verbs.ts +26 -14
- package/src/capabilities/reference.test.ts +63 -0
- package/src/capabilities/resources/provider.ts +367 -91
- package/src/capabilities/resources/resources.test.ts +411 -59
- package/src/capabilities/setup/buildPlan.ts +236 -0
- package/src/capabilities/setup/index.ts +7 -7
- package/src/capabilities/setup/mode.ts +74 -0
- package/src/capabilities/setup/operations/index.ts +74 -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 +397 -320
- package/src/capabilities/setup/operations/setupLsp.ts +329 -68
- package/src/capabilities/setup/operations/setupMcp.ts +137 -97
- package/src/capabilities/setup/operations/setupSkills.ts +336 -108
- package/src/capabilities/setup/plan.render.ts +241 -0
- package/src/capabilities/setup/plan.ts +236 -0
- package/src/capabilities/setup/setup.mcp.correctness.test.ts +432 -0
- package/src/capabilities/setup/setup.render.test.ts +281 -73
- package/src/capabilities/setup/setup.render.ts +45 -77
- package/src/capabilities/setup/setup.test.ts +972 -209
- package/src/capabilities/setup/setup.verb.ts +233 -74
- package/src/capabilities/setup/shell.test.ts +86 -0
- package/src/capabilities/setup/shell.ts +166 -14
- package/src/capabilities/setup/targets.ts +367 -0
- package/src/capabilities/setup/types.ts +18 -57
- package/src/capabilities/shared/assertExecOk.ts +68 -10
- package/src/capabilities/shared/index.ts +32 -0
- package/src/capabilities/shared/packageManager.test.ts +55 -0
- package/src/capabilities/shared/packageManager.ts +62 -6
- package/src/capabilities/skill/discover.ts +47 -9
- package/src/capabilities/skill/index.ts +1 -1
- package/src/capabilities/skill/render.ts +14 -14
- package/src/capabilities/skill/skill.test.ts +7 -5
- package/src/capabilities/skill/verbs.ts +9 -10
- package/src/capabilities/sources/collectStatus.ts +61 -51
- package/src/capabilities/sources/index.ts +2 -2
- package/src/capabilities/sources/installSkills.ts +86 -9
- package/src/capabilities/sources/runUpdate.ts +164 -141
- package/src/capabilities/sources/sources.test.ts +265 -119
- package/src/capabilities/sources/status.render.test.ts +53 -24
- package/src/capabilities/sources/status.render.ts +25 -30
- package/src/capabilities/sources/status.verb.ts +16 -9
- package/src/capabilities/sources/types.ts +18 -25
- package/src/capabilities/sources/update.render.ts +10 -3
- package/src/capabilities/sources/update.verb.ts +13 -24
- package/src/capabilities/surface.test.ts +165 -25
- package/src/capabilities/tier.parity.test.ts +144 -0
- package/src/capabilities/upgrade/runUpgrade.ts +8 -8
- package/src/capabilities/upgrade/upgrade.render.ts +4 -5
- package/src/capabilities/upgrade/upgrade.test.ts +3 -3
- package/src/capabilities/upgrade/upgrade.verb.ts +8 -4
- 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.test.ts +8 -6
- package/src/constants.ts +78 -22
- package/src/identity.test.ts +348 -0
- package/src/index.ts +2 -2
- package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +20 -15
- package/src/kernel/completion/complete.test.ts +12 -2
- package/src/kernel/completion/complete.ts +1 -1
- package/src/kernel/completion/emitScripts.test.ts +1 -1
- package/src/kernel/completion/emitScripts.ts +5 -3
- package/src/kernel/completion/entitySource.test.ts +185 -41
- package/src/kernel/completion/entitySource.ts +133 -110
- package/src/kernel/completion/model.test.ts +165 -13
- package/src/kernel/completion/model.ts +105 -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 +104 -50
- package/src/kernel/completion/shellDrive.test.ts +611 -0
- package/src/kernel/completion/templates/bash.ts +7 -2
- package/src/kernel/completion/templates/fish.ts +28 -6
- package/src/kernel/completion/templates/index.ts +23 -0
- package/src/kernel/completion/types.ts +10 -3
- package/src/kernel/config/defaults.test.ts +108 -0
- package/src/kernel/config/defaults.ts +13 -23
- package/src/kernel/config/evaluateProjectConfig.ts +33 -11
- package/src/kernel/config/findProjectConfig.ts +4 -3
- package/src/kernel/config/firstRun.test.ts +44 -38
- package/src/kernel/config/firstRun.ts +24 -81
- package/src/kernel/config/globalConfig.ts +2 -2
- package/src/kernel/config/index.ts +5 -6
- package/src/kernel/config/paths.ts +17 -17
- package/src/kernel/config/readConfig.test.ts +246 -7
- package/src/kernel/config/readConfig.ts +8 -8
- package/src/kernel/config/schema.test.ts +50 -0
- package/src/kernel/config/schema.ts +100 -11
- package/src/kernel/config/types.ts +75 -19
- package/src/kernel/copy.test.ts +483 -0
- package/src/kernel/copy.ts +54 -0
- package/src/kernel/error/PragmaError.test.ts +6 -3
- package/src/kernel/error/PragmaError.ts +4 -2
- package/src/kernel/error/constants.ts +7 -4
- package/src/kernel/error/fromTaskError.ts +28 -6
- package/src/kernel/error/index.ts +1 -1
- package/src/kernel/error/recovery.test.ts +22 -45
- package/src/kernel/error/recovery.ts +36 -27
- package/src/kernel/error/renderError.ts +42 -1
- package/src/kernel/error/types.ts +25 -4
- package/src/kernel/index.ts +26 -0
- package/src/kernel/packs/collect.test.ts +195 -11
- package/src/kernel/packs/collect.ts +212 -61
- package/src/kernel/packs/compile.test.ts +293 -8
- package/src/kernel/packs/compile.ts +108 -15
- package/src/kernel/packs/disclosure.test.ts +5 -2
- package/src/kernel/packs/disclosure.ts +2 -2
- package/src/kernel/packs/graphql/buildLookupDocument.ts +1 -1
- package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +13 -13
- package/src/kernel/packs/graphql/index.ts +20 -0
- package/src/kernel/packs/graphqlSource.test.ts +6 -3
- package/src/kernel/packs/index.ts +40 -0
- package/src/kernel/packs/iri.test.ts +73 -0
- package/src/kernel/packs/iri.ts +70 -20
- package/src/kernel/packs/renderPack.ts +28 -7
- package/src/kernel/packs/resolveEntity.test.ts +213 -0
- package/src/kernel/packs/resolveEntity.ts +132 -34
- package/src/kernel/packs/runBodies.ts +16 -16
- package/src/kernel/packs/sample.ts +1 -1
- package/src/kernel/packs/schema.ts +114 -11
- package/src/kernel/packs/sparql/applyFilters.ts +16 -17
- package/src/kernel/packs/sparql/buildLookupQuery.ts +75 -3
- package/src/kernel/packs/sparql/index.ts +37 -0
- package/src/kernel/packs/sparql/runSelect.test.ts +104 -10
- package/src/kernel/packs/sparql/runSelect.ts +75 -37
- package/src/kernel/packs/toolDescription.test.ts +52 -5
- package/src/kernel/packs/types.ts +52 -4
- package/src/kernel/packs/uniqueness.ts +5 -5
- package/src/kernel/project/cli/buildProgram.test.ts +157 -17
- package/src/kernel/project/cli/buildProgram.ts +77 -18
- package/src/kernel/project/cli/constants.ts +34 -0
- package/src/kernel/project/cli/dispatch.test.ts +227 -3
- package/src/kernel/project/cli/dispatch.ts +250 -48
- 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 +130 -30
- package/src/kernel/project/cli/helpFormat.ts +14 -1
- package/src/kernel/project/cli/rootHelp.ts +140 -111
- 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 +18 -10
- package/src/kernel/project/mcp/envelope.ts +2 -2
- package/src/kernel/project/mcp/instructions.ts +12 -7
- package/src/kernel/project/mcp/mcpError.ts +1 -1
- package/src/kernel/project/mcp/parity.test.ts +42 -1
- package/src/kernel/project/mcp/prompts/index.ts +37 -0
- package/src/kernel/project/mcp/prompts/prompts.test.ts +120 -5
- package/src/kernel/project/mcp/prompts/provider.ts +22 -8
- package/src/kernel/project/mcp/prompts/source.ts +69 -68
- package/src/kernel/project/mcp/registerVerb.ts +56 -11
- package/src/kernel/project/mcp/serve.ts +13 -5
- package/src/kernel/project/mcp/toolDescriptions.test.ts +6 -2
- package/src/kernel/render/__snapshots__/renderers.test.ts.snap +7 -4
- package/src/kernel/render/contracts.ts +21 -0
- package/src/kernel/render/disclosure.ts +4 -2
- package/src/kernel/render/envelope.ts +2 -3
- package/src/kernel/render/formatters.ts +1 -1
- package/src/kernel/render/prefixes.test.ts +36 -0
- package/src/kernel/render/prefixes.ts +40 -13
- package/src/kernel/render/renderers.test.ts +244 -7
- package/src/kernel/render/renderers.ts +222 -20
- package/src/kernel/render/style.test.ts +75 -24
- package/src/kernel/render/style.ts +31 -1
- package/src/kernel/render/turtle.ts +222 -0
- package/src/kernel/runtime/graphpack/build.ts +29 -3
- package/src/kernel/runtime/graphpack/buildIndex.test.ts +46 -0
- package/src/kernel/runtime/graphpack/buildIndex.ts +53 -18
- package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +5 -5
- package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +3 -3
- package/src/kernel/runtime/graphpack/embedded/pack.stories.generated.ts +3 -0
- package/src/kernel/runtime/graphpack/embedded.ts +39 -13
- package/src/kernel/runtime/graphpack/graphpack.test.ts +205 -5
- package/src/kernel/runtime/graphpack/hash.ts +3 -2
- package/src/kernel/runtime/graphpack/index.ts +1 -1
- package/src/kernel/runtime/graphpack/manifest.ts +114 -12
- package/src/kernel/runtime/graphpack/read.ts +5 -11
- package/src/kernel/runtime/graphpack/schemas.ts +74 -0
- package/src/kernel/runtime/graphpack/stories.ts +84 -0
- package/src/kernel/runtime/graphpack/types.ts +61 -48
- package/src/kernel/runtime/loadSession.ts +1 -1
- package/src/kernel/runtime/paths.ts +64 -15
- package/src/kernel/runtime/probe.test.ts +8 -4
- package/src/kernel/runtime/probe.ts +6 -6
- package/src/kernel/runtime/readEntity.ts +477 -32
- package/src/kernel/runtime/refs/gitOps.ts +1 -19
- package/src/kernel/runtime/refs/index.ts +39 -0
- package/src/kernel/runtime/refs/parseRef.ts +8 -8
- package/src/kernel/runtime/refs/resolve.ts +82 -66
- package/src/kernel/runtime/resolveSources.test.ts +63 -24
- package/src/kernel/runtime/resolveSources.ts +36 -25
- package/src/kernel/runtime/storeReadiness.ts +10 -10
- package/src/kernel/runtime/storeless.test.ts +1 -1
- package/src/kernel/runtime/types.ts +15 -1
- package/src/kernel/runtime/wasmEmbed.test.ts +56 -55
- package/src/kernel/spec/emitReference.test.ts +3 -3
- package/src/kernel/spec/emitReference.ts +242 -34
- package/src/kernel/spec/emitSurface.ts +57 -11
- package/src/kernel/spec/surfaceConformance.test.ts +4 -2
- package/src/kernel/spec/surfaceConformance.ts +8 -0
- package/src/kernel/spec/types.ts +277 -13
- package/src/kernel/spec/validate.ts +2 -1
- package/src/kernel/vocabulary.test.ts +164 -0
- package/src/kernel/vocabulary.ts +146 -0
- package/src/testing/PARITY_GAPS.ts +8 -2
- package/src/testing/behavioral/README.md +3 -3
- package/src/testing/behavioral/completion.test.ts +19 -6
- package/src/testing/behavioral/docExamples.test.ts +14 -0
- package/src/testing/behavioral/errorMatrix.mcp.test.ts +6 -5
- package/src/testing/behavioral/errorMatrix.storeless.test.ts +1 -1
- package/src/testing/behavioral/exitCodes.e2e.test.ts +6 -5
- package/src/testing/behavioral/firstRun.e2e.test.ts +24 -24
- package/src/testing/behavioral/harness.foundation.test.ts +14 -5
- package/src/testing/behavioral/journeys.cli.test.ts +117 -76
- package/src/testing/behavioral/journeys.defaultPack.test.ts +88 -182
- package/src/testing/behavioral/journeys.firstInstall.test.ts +167 -0
- 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.mcpLifecycle.mcp.test.ts +9 -6
- package/src/testing/behavioral/journeys.packageStories.test.ts +188 -0
- package/src/testing/behavioral/liveReadSurface.ts +4 -3
- package/src/testing/behavioral/mcpServe.e2e.test.ts +57 -2
- package/src/testing/behavioral/mcpSurface.test.ts +10 -5
- package/src/testing/behavioral/rootCli.e2e.test.ts +26 -2
- package/src/testing/behavioral/staleCommands.test.ts +10 -0
- package/src/testing/eval/__snapshots__/eval.test.ts.snap +7 -7
- package/src/testing/eval/cases/assembly.ts +13 -6
- package/src/testing/eval/cases/effectful.ts +28 -15
- package/src/testing/eval/cases/readNouns.ts +22 -20
- package/src/testing/eval/cases/stable.ts +5 -1
- package/src/testing/eval/eval.test.ts +7 -1
- package/src/testing/fixtures/blockGraph.ts +79 -0
- package/src/testing/fixtures/fixtureCapability.ts +45 -1
- package/src/testing/fixtures/graph/canonical.ts +94 -5
- package/src/testing/fixtures/graph/defaultPack.ts +7 -6
- package/src/testing/fixtures/graph/owlExport.ts +7 -5
- package/src/testing/helpers/blankCanonicalRanges.ts +36 -0
- package/src/testing/helpers/fixtureGraph.ts +33 -16
- package/src/testing/helpers/packRuntime.ts +2 -3
- package/src/testing/helpers/projectCli.ts +2 -1
- package/src/testing/helpers/projectMcp.ts +38 -6
- package/src/testing/helpers/runCli.ts +35 -18
- package/src/testing/perf/budgets.test.ts +24 -9
- package/src/testing/perf/budgets.ts +76 -12
- package/src/testing/perf/codegen.test.ts +126 -0
- package/src/testing/perf/globalSetup.test.ts +286 -0
- package/src/testing/perf/globalSetup.ts +611 -14
- 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/src/types.ts +2 -2
- package/dist/pragma +0 -0
- package/src/capabilities/block/blockList.test.ts +0 -79
- package/src/capabilities/block/blockList.verb.ts +0 -163
- package/src/capabilities/block/index.ts +0 -25
- package/src/capabilities/block/pack.ts +0 -166
- package/src/capabilities/block/parity.test.ts +0 -187
- package/src/capabilities/block/tierChain.ts +0 -78
- package/src/capabilities/colophon/pragmaColophon.ts +0 -66
- package/src/capabilities/create/compiledCreate.subprocess.test.ts +0 -152
- package/src/capabilities/create/templates.embedded.generated.ts +0 -53
- package/src/capabilities/doctor/checks/checkConfigFile.ts +0 -41
- package/src/capabilities/doctor/checks/checkMcpCommands.ts +0 -114
- package/src/capabilities/doctor/checks/checkMcpConfigured.ts +0 -67
- package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +0 -60
- package/src/capabilities/doctor/checks/deriveBand.test.ts +0 -42
- package/src/capabilities/doctor/checks/deriveBand.ts +0 -28
- package/src/capabilities/modifier/index.ts +0 -15
- package/src/capabilities/modifier/pack.ts +0 -64
- package/src/capabilities/standard/index.ts +0 -18
- package/src/capabilities/standard/pack.ts +0 -128
- package/src/capabilities/tier/index.ts +0 -19
- package/src/capabilities/tier/lookup.render.test.ts +0 -72
- package/src/capabilities/tier/lookup.render.ts +0 -59
- package/src/capabilities/tier/lookup.test.ts +0 -83
- package/src/capabilities/tier/lookup.verb.ts +0 -44
- package/src/capabilities/tier/pack.ts +0 -28
- package/src/capabilities/tier/runLookup.ts +0 -87
- package/src/capabilities/token/addConfig.render.ts +0 -27
- package/src/capabilities/token/addConfig.test.ts +0 -62
- package/src/capabilities/token/addConfig.verb.ts +0 -40
- package/src/capabilities/token/index.ts +0 -19
- package/src/capabilities/token/pack.ts +0 -58
- package/src/capabilities/token/runAddConfig.ts +0 -95
- package/src/kernel/completion/bashDrive.test.ts +0 -73
- package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +0 -11
- package/src/kernel/runtime/graphpack/embedded/sample.ttl +0 -39
- package/src/kernel/runtime/lock.ts +0 -90
|
@@ -6,9 +6,16 @@ import {
|
|
|
6
6
|
renderErrorLlm,
|
|
7
7
|
renderErrorPlain,
|
|
8
8
|
} from "../error/renderError.js";
|
|
9
|
-
import type {
|
|
9
|
+
import type {
|
|
10
|
+
ColumnDef,
|
|
11
|
+
LookupField,
|
|
12
|
+
RenderContext,
|
|
13
|
+
SectionDef,
|
|
14
|
+
} from "./contracts.js";
|
|
10
15
|
import { resolveDetail } from "./disclosure.js";
|
|
11
16
|
import {
|
|
17
|
+
MAX_PLAIN_CELL_WIDTH,
|
|
18
|
+
renderListEmptyNotice,
|
|
12
19
|
renderListLlm,
|
|
13
20
|
renderListPlain,
|
|
14
21
|
renderLookupLlm,
|
|
@@ -16,6 +23,11 @@ import {
|
|
|
16
23
|
} from "./renderers.js";
|
|
17
24
|
import { type RenderStyle, styleFor } from "./style.js";
|
|
18
25
|
|
|
26
|
+
/** An interactive stdout with headers on — the default terminal shape. */
|
|
27
|
+
const TTY_CONTEXT: RenderContext = { headers: true, stdoutIsTty: true };
|
|
28
|
+
/** A piped stdout with headers on — the field-splitting consumer shape. */
|
|
29
|
+
const PIPE_CONTEXT: RenderContext = { headers: true, stdoutIsTty: false };
|
|
30
|
+
|
|
19
31
|
interface Widget {
|
|
20
32
|
readonly uri: string;
|
|
21
33
|
readonly name: string;
|
|
@@ -111,18 +123,21 @@ describe("render matrix (list/lookup/empty × plain/llm/json × detail)", () =>
|
|
|
111
123
|
expect(matrix).toMatchSnapshot();
|
|
112
124
|
});
|
|
113
125
|
|
|
114
|
-
it("
|
|
126
|
+
it("separates the empty notice (stderr's text) from the stdout rendering", () => {
|
|
115
127
|
const options = {
|
|
116
128
|
heading: "Widgets",
|
|
117
129
|
columns: columnsFor("summary"),
|
|
118
130
|
emptyMessage: "No widget entries found.",
|
|
119
131
|
emptyHint: "Run `pragma sources update`.",
|
|
120
132
|
};
|
|
121
|
-
//
|
|
122
|
-
|
|
133
|
+
// The notice is its own render — the dispatcher routes it to stderr so a
|
|
134
|
+
// pipe never receives a human sentence as data.
|
|
135
|
+
expect(renderListEmptyNotice(options)).toBe(
|
|
123
136
|
"No widget entries found.\nRun `pragma sources update`.",
|
|
124
137
|
);
|
|
125
|
-
//
|
|
138
|
+
// Plain stdout for an empty list on a TTY: nothing (the notice suffices).
|
|
139
|
+
expect(renderListPlain([], options, TTY_CONTEXT)).toBe("");
|
|
140
|
+
// Llm keeps its byte-frozen shape: the `(0)` heading, then message + hint.
|
|
126
141
|
expect(renderListLlm([], options)).toBe(
|
|
127
142
|
"## Widgets (0)\n\nNo widget entries found.\nRun `pragma sources update`.",
|
|
128
143
|
);
|
|
@@ -130,7 +145,8 @@ describe("render matrix (list/lookup/empty × plain/llm/json × detail)", () =>
|
|
|
130
145
|
|
|
131
146
|
it("keeps the bare-empty behavior when no emptyMessage is declared", () => {
|
|
132
147
|
const options = { heading: "Widgets", columns: columnsFor("summary") };
|
|
133
|
-
expect(
|
|
148
|
+
expect(renderListEmptyNotice(options)).toBe("");
|
|
149
|
+
expect(renderListPlain([], options, TTY_CONTEXT)).toBe("");
|
|
134
150
|
expect(renderListLlm([], options)).toBe("## Widgets (0)\n");
|
|
135
151
|
});
|
|
136
152
|
|
|
@@ -145,6 +161,101 @@ describe("render matrix (list/lookup/empty × plain/llm/json × detail)", () =>
|
|
|
145
161
|
});
|
|
146
162
|
});
|
|
147
163
|
|
|
164
|
+
describe("plain list table contract (headers, rectangular grid, cell discipline)", () => {
|
|
165
|
+
const columns: ColumnDef<Widget>[] = [
|
|
166
|
+
{ key: "name", label: "Name" },
|
|
167
|
+
{ key: "kind", label: "Kind" },
|
|
168
|
+
{ key: "note", label: "Note" },
|
|
169
|
+
];
|
|
170
|
+
const options = { heading: "Widgets", columns };
|
|
171
|
+
|
|
172
|
+
it("emits a bold-eligible UPPERCASE header row built from the column labels", () => {
|
|
173
|
+
const lines = renderListPlain(widgets, options, TTY_CONTEXT).split("\n");
|
|
174
|
+
expect(lines[0]).toMatch(/^NAME\s+KIND\s+NOTE$/);
|
|
175
|
+
expect(lines).toHaveLength(1 + widgets.length);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it("suppresses the header row when the context disables headers", () => {
|
|
179
|
+
const lines = renderListPlain(widgets, options, {
|
|
180
|
+
headers: false,
|
|
181
|
+
stdoutIsTty: true,
|
|
182
|
+
}).split("\n");
|
|
183
|
+
expect(lines[0]).not.toMatch(/^NAME/);
|
|
184
|
+
expect(lines).toHaveLength(widgets.length);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it("keeps the grid rectangular — an empty cell renders as -", () => {
|
|
188
|
+
// Card's note is "": the NOTE column is populated on another row, so the
|
|
189
|
+
// grid keeps the column and marks the hole instead of shifting fields.
|
|
190
|
+
const lines = renderListPlain(widgets, options, TTY_CONTEXT).split("\n");
|
|
191
|
+
const cardRow = lines.find((line) => line.startsWith("Card"));
|
|
192
|
+
expect(cardRow?.trim().split(/\s{2,}/)).toEqual(["Card", "pattern", "-"]);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it("drops a column no row populates (unless it opts into showWhenEmpty)", () => {
|
|
196
|
+
const noteless = widgets.map((w) => ({ ...w, note: "" }));
|
|
197
|
+
const lines = renderListPlain(noteless, options, TTY_CONTEXT).split("\n");
|
|
198
|
+
expect(lines[0]).toMatch(/^NAME\s+KIND$/);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it("collapses newlines and truncates a long cell with an ellipsis", () => {
|
|
202
|
+
const prose = [
|
|
203
|
+
{
|
|
204
|
+
...widgets[0],
|
|
205
|
+
note: `first line\nsecond line ${"x".repeat(2 * MAX_PLAIN_CELL_WIDTH)}`,
|
|
206
|
+
},
|
|
207
|
+
] as Widget[];
|
|
208
|
+
const lines = renderListPlain(prose, options, TTY_CONTEXT).split("\n");
|
|
209
|
+
const row = lines[1] as string;
|
|
210
|
+
expect(row).not.toContain("\n");
|
|
211
|
+
expect(row).toContain("first line second line");
|
|
212
|
+
const noteCell = row
|
|
213
|
+
.trim()
|
|
214
|
+
.split(/\s{2,}/)
|
|
215
|
+
.at(-1) as string;
|
|
216
|
+
expect(noteCell.length).toBeLessThanOrEqual(MAX_PLAIN_CELL_WIDTH);
|
|
217
|
+
expect(noteCell.endsWith("…")).toBe(true);
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
it("renders only the header row for an empty list on a piped stdout", () => {
|
|
221
|
+
// An explicit `--format plain` down a pipe gets a well-formed zero-record
|
|
222
|
+
// table: every declared column, no rows — so `awk` sees a schema.
|
|
223
|
+
expect(renderListPlain([], options, PIPE_CONTEXT)).toMatch(
|
|
224
|
+
/^NAME\s+KIND\s+NOTE$/,
|
|
225
|
+
);
|
|
226
|
+
// With headers off there is nothing to print at all.
|
|
227
|
+
expect(
|
|
228
|
+
renderListPlain([], options, { headers: false, stdoutIsTty: false }),
|
|
229
|
+
).toBe("");
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it("bolds the header row on a color-capable TTY, leaving cells unstyled", () => {
|
|
233
|
+
const tagged: RenderStyle = {
|
|
234
|
+
enabled: true,
|
|
235
|
+
bold: (t) => `B(${t})`,
|
|
236
|
+
dim: (t) => t,
|
|
237
|
+
cyan: (t) => t,
|
|
238
|
+
green: (t) => t,
|
|
239
|
+
yellow: (t) => t,
|
|
240
|
+
};
|
|
241
|
+
const lines = renderListPlain(widgets, options, TTY_CONTEXT, tagged).split(
|
|
242
|
+
"\n",
|
|
243
|
+
);
|
|
244
|
+
expect(lines[0]).toMatch(/^B\(NAME\s+KIND\s+NOTE\)$/);
|
|
245
|
+
expect(lines[1]).not.toContain("B(");
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
it("is byte-identical plain text when the styler is disabled", () => {
|
|
249
|
+
const lines = renderListPlain(
|
|
250
|
+
widgets,
|
|
251
|
+
options,
|
|
252
|
+
TTY_CONTEXT,
|
|
253
|
+
styleFor(false),
|
|
254
|
+
).split("\n");
|
|
255
|
+
expect(lines[0]).toMatch(/^NAME\s+KIND\s+NOTE$/);
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
|
|
148
259
|
describe("lookup beautify (TTY style seam)", () => {
|
|
149
260
|
const lookupOpts = {
|
|
150
261
|
title: (w: Widget) => w.name,
|
|
@@ -182,7 +293,7 @@ describe("error render matrix (× plain/llm/json)", () => {
|
|
|
182
293
|
it("renders each error across the three formats", () => {
|
|
183
294
|
const notFound = PragmaError.notFound("block", "Buton", {
|
|
184
295
|
suggestions: ["Button"],
|
|
185
|
-
recovery: cliRecovery("
|
|
296
|
+
recovery: cliRecovery("block list", "List available blocks."),
|
|
186
297
|
});
|
|
187
298
|
const empty = PragmaError.emptyResults("token", {
|
|
188
299
|
filters: { channel: "stable", tier: "core" },
|
|
@@ -203,3 +314,129 @@ describe("error render matrix (× plain/llm/json)", () => {
|
|
|
203
314
|
}).toMatchSnapshot();
|
|
204
315
|
});
|
|
205
316
|
});
|
|
317
|
+
|
|
318
|
+
describe("section-body headings nest under the heading the renderer gives them", () => {
|
|
319
|
+
interface Doc {
|
|
320
|
+
readonly guidelines: string;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
const render = (guidelines: string): string =>
|
|
324
|
+
renderLookupLlm<Doc>(
|
|
325
|
+
{ guidelines },
|
|
326
|
+
{
|
|
327
|
+
title: () => "Button",
|
|
328
|
+
fields: [],
|
|
329
|
+
sections: [{ key: "guidelines", heading: "Guidelines", kind: "field" }],
|
|
330
|
+
},
|
|
331
|
+
);
|
|
332
|
+
|
|
333
|
+
it("demotes authored headings that collide with the section heading", () => {
|
|
334
|
+
const out = render(
|
|
335
|
+
"### Accessibility\n\n- Label the button.\n\n### Content\n\n- Verb first.",
|
|
336
|
+
);
|
|
337
|
+
expect(out).toContain("### Guidelines");
|
|
338
|
+
expect(out).toContain("#### Accessibility");
|
|
339
|
+
expect(out).toContain("#### Content");
|
|
340
|
+
expect(out).not.toMatch(/^### Accessibility$/m);
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
it("preserves the content's own hierarchy while shifting it as a block", () => {
|
|
344
|
+
const out = render("## Overview\n\ntext\n\n### Detail\n\nmore");
|
|
345
|
+
expect(out).toContain("#### Overview");
|
|
346
|
+
expect(out).toContain("##### Detail");
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
it("leaves content already nested below the section alone", () => {
|
|
350
|
+
const out = render("#### Already nested\n\ntext");
|
|
351
|
+
expect(out).toContain("#### Already nested");
|
|
352
|
+
expect(out).not.toContain("##### Already nested");
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
it("never emits a heading deeper than markdown's floor", () => {
|
|
356
|
+
const out = render("###### Deep\n\ntext");
|
|
357
|
+
expect(out).toContain("###### Deep");
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
it("leaves `#` inside a fenced code block exactly as authored", () => {
|
|
361
|
+
const out = render("### Setup\n\n```sh\n# not a heading\nbun install\n```");
|
|
362
|
+
expect(out).toContain("#### Setup");
|
|
363
|
+
expect(out).toContain("# not a heading");
|
|
364
|
+
expect(out).not.toContain("## not a heading");
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
it("leaves a body with no headings untouched", () => {
|
|
368
|
+
const out = render("Plain prose with a # hash mid-line.");
|
|
369
|
+
expect(out).toContain("Plain prose with a # hash mid-line.");
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
it("does not rewrite the plain body, where `###` is literal text", () => {
|
|
373
|
+
const out = renderLookupPlain<Doc>(
|
|
374
|
+
{ guidelines: "### Accessibility" },
|
|
375
|
+
{
|
|
376
|
+
title: () => "Button",
|
|
377
|
+
fields: [],
|
|
378
|
+
sections: [{ key: "guidelines", heading: "Guidelines", kind: "field" }],
|
|
379
|
+
},
|
|
380
|
+
);
|
|
381
|
+
expect(out).toContain("Guidelines:");
|
|
382
|
+
expect(out).toContain(" ### Accessibility");
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
describe("section-body nesting follows CommonMark, not a near-enough reading", () => {
|
|
387
|
+
interface Doc {
|
|
388
|
+
readonly guidelines: string;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
const render = (guidelines: string): string =>
|
|
392
|
+
renderLookupLlm<Doc>(
|
|
393
|
+
{ guidelines },
|
|
394
|
+
{
|
|
395
|
+
title: () => "Button",
|
|
396
|
+
fields: [],
|
|
397
|
+
sections: [{ key: "guidelines", heading: "Guidelines", kind: "field" }],
|
|
398
|
+
},
|
|
399
|
+
);
|
|
400
|
+
|
|
401
|
+
it("nests a heading indented up to three spaces, keeping its indent", () => {
|
|
402
|
+
// Four spaces would make the line an indented code block; three or fewer
|
|
403
|
+
// leave it a heading. Missing that left an indented heading at the
|
|
404
|
+
// section's own level while its unindented twin was demoted — one body
|
|
405
|
+
// rendered with two conflicting hierarchies.
|
|
406
|
+
expect(render(" ### Accessibility\n\ntext")).toMatch(
|
|
407
|
+
/^ {2}#### Accessibility$/m,
|
|
408
|
+
);
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
it("does not close a four-backtick fence on a three-backtick sample", () => {
|
|
412
|
+
// A closing fence must be AT LEAST as long as the opener. Toggling on any
|
|
413
|
+
// same-character run let the inner sample read as the close, after which
|
|
414
|
+
// every `#` line in that code block was rewritten — the renderer silently
|
|
415
|
+
// editing the user's sample code.
|
|
416
|
+
const out = render(
|
|
417
|
+
[
|
|
418
|
+
"````md",
|
|
419
|
+
"```",
|
|
420
|
+
"### Sample text, not a heading",
|
|
421
|
+
"```",
|
|
422
|
+
"````",
|
|
423
|
+
"",
|
|
424
|
+
"### A real heading",
|
|
425
|
+
].join("\n"),
|
|
426
|
+
);
|
|
427
|
+
// Anchored: `#### x` CONTAINS `### x`, so a substring check would pass
|
|
428
|
+
// against the very rewrite this pins against.
|
|
429
|
+
expect(out).toMatch(/^### Sample text, not a heading$/m);
|
|
430
|
+
expect(out).toMatch(/^#### A real heading$/m);
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
it("does not close a fence on a run that carries an info string", () => {
|
|
434
|
+
// An opener may carry an info string; a CLOSER may not. A ```js line
|
|
435
|
+
// inside a block opens nothing and closes nothing.
|
|
436
|
+
const out = render(
|
|
437
|
+
["```", "### inside", "```js", "### also inside", "```"].join("\n"),
|
|
438
|
+
);
|
|
439
|
+
expect(out).toMatch(/^### inside$/m);
|
|
440
|
+
expect(out).toMatch(/^### also inside$/m);
|
|
441
|
+
});
|
|
442
|
+
});
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import { compactUri } from "./compactUri.js";
|
|
11
11
|
import type {
|
|
12
12
|
ColumnDef,
|
|
13
|
+
RenderContext,
|
|
13
14
|
RenderListOptions,
|
|
14
15
|
RenderLookupOptions,
|
|
15
16
|
SectionDef,
|
|
@@ -19,6 +20,56 @@ import { defaultStyle, type RenderStyle, styleFor } from "./style.js";
|
|
|
19
20
|
|
|
20
21
|
type RenderMode = "plain" | "llm";
|
|
21
22
|
|
|
23
|
+
/**
|
|
24
|
+
* The widest a plain-table cell renders. Cells are records, not documents: a
|
|
25
|
+
* pack can ship arbitrary prose in a column (one shipped an 834-character
|
|
26
|
+
* multi-line description), and a single cell that wraps destroys the
|
|
27
|
+
* one-row-one-record model every field-splitting consumer relies on. Longer
|
|
28
|
+
* values are truncated with an ellipsis; the detail escape hatch is `lookup`.
|
|
29
|
+
*/
|
|
30
|
+
export const MAX_PLAIN_CELL_WIDTH = 80;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The placeholder for an empty cell in a populated column. The grid stays
|
|
34
|
+
* rectangular: a value's absence must not shift its neighbours left, or
|
|
35
|
+
* `awk '{print $4}'` reads a different field on every row.
|
|
36
|
+
*/
|
|
37
|
+
const EMPTY_CELL = "-";
|
|
38
|
+
|
|
39
|
+
/** The context assumed when a caller passes none: interactive, headers on. */
|
|
40
|
+
const DEFAULT_CONTEXT: RenderContext = { headers: true, stdoutIsTty: true };
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The markdown heading level `renderLookupSections` gives a section in llm mode
|
|
44
|
+
* — the lookup title is `##`, so a section is `###`. Read, not re-typed, by
|
|
45
|
+
* {@link nestHeadings}: the renderer is the only party that knows its own
|
|
46
|
+
* nesting depth, and it must stay the only party that encodes it.
|
|
47
|
+
*/
|
|
48
|
+
const SECTION_HEADING_LEVEL = 3;
|
|
49
|
+
|
|
50
|
+
/** Markdown's deepest heading. Demotion clamps here rather than overflowing. */
|
|
51
|
+
const MAX_HEADING_LEVEL = 6;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* An ATX heading: up to three spaces of indent, 1–6 `#`, whitespace, text.
|
|
55
|
+
*
|
|
56
|
+
* The indent is CommonMark's — four spaces would make the line an indented
|
|
57
|
+
* code block, three or fewer leave it a heading. Missing it left
|
|
58
|
+
* ` ### Accessibility` un-nested while its unindented twin was demoted, so
|
|
59
|
+
* one body could come out with two conflicting hierarchies. The indent is
|
|
60
|
+
* captured so a rewrite preserves it.
|
|
61
|
+
*/
|
|
62
|
+
const ATX_HEADING = /^( {0,3})(#{1,6})(\s+\S.*)$/;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* A fenced code-block delimiter: up to three spaces of indent, then the run of
|
|
66
|
+
* markers, then whatever follows on the line (the info string).
|
|
67
|
+
*
|
|
68
|
+
* The RUN LENGTH and the info string both matter for closing, which is why
|
|
69
|
+
* they are captured rather than just recognised — see {@link nestHeadings}.
|
|
70
|
+
*/
|
|
71
|
+
const CODE_FENCE = /^ {0,3}((`{3,})|(~{3,}))([^`]*)$/;
|
|
72
|
+
|
|
22
73
|
/**
|
|
23
74
|
* The empty-state body — the message plus its optional hint on a second line,
|
|
24
75
|
* or "" when the caller declared no message (bare-empty behavior preserved).
|
|
@@ -30,37 +81,112 @@ function emptyBody<T>(options: RenderListOptions<T>): string {
|
|
|
30
81
|
: options.emptyMessage;
|
|
31
82
|
}
|
|
32
83
|
|
|
84
|
+
/**
|
|
85
|
+
* The empty-list notice a dispatcher routes to STDERR (exit 0): zero rows is
|
|
86
|
+
* a calm success, and stdout — the data stream — must not carry a human
|
|
87
|
+
* sentence a pipe would read as a record. Exported for the formatter seam's
|
|
88
|
+
* `emptyNotice`; the plain renderer itself no longer prints it.
|
|
89
|
+
*/
|
|
90
|
+
export function renderListEmptyNotice<T>(
|
|
91
|
+
options: RenderListOptions<T>,
|
|
92
|
+
): string {
|
|
93
|
+
return emptyBody(options);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* One plain-table cell: single-line (embedded newlines collapse to a space)
|
|
98
|
+
* and at most {@link MAX_PLAIN_CELL_WIDTH} characters, truncated with an
|
|
99
|
+
* ellipsis — see the constant's rationale.
|
|
100
|
+
*/
|
|
101
|
+
function disciplineCell(value: string): string {
|
|
102
|
+
const singleLine = value.replace(/\s*\n\s*/g, " ").trim();
|
|
103
|
+
if (singleLine.length <= MAX_PLAIN_CELL_WIDTH) return singleLine;
|
|
104
|
+
return `${singleLine.slice(0, MAX_PLAIN_CELL_WIDTH - 1).trimEnd()}…`;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Render a list as a plain table: a bold UPPERCASE header row (from
|
|
109
|
+
* `column.label`), then one padded row per item over a RECTANGULAR grid — a
|
|
110
|
+
* column is included when any row (or `showWhenEmpty`) populates it, and an
|
|
111
|
+
* empty cell in an included column renders `-` so fields never shift. An
|
|
112
|
+
* empty list renders nothing on a terminal (the notice is stderr's, see
|
|
113
|
+
* {@link renderListEmptyNotice}) and just the header row on a pipe, so a
|
|
114
|
+
* zero-record table stays well-formed for field-splitting consumers.
|
|
115
|
+
*
|
|
116
|
+
* @param items - The rows.
|
|
117
|
+
* @param options - Columns and empty-state copy.
|
|
118
|
+
* @param context - Header/TTY presentation facts (defaults to a terminal
|
|
119
|
+
* with headers on).
|
|
120
|
+
* @param style - TTY styling; off a TTY the styler is inert, so piped bytes
|
|
121
|
+
* carry no escape sequences.
|
|
122
|
+
* @returns The formatted table.
|
|
123
|
+
*/
|
|
33
124
|
export function renderListPlain<T>(
|
|
34
125
|
items: readonly T[],
|
|
35
126
|
options: RenderListOptions<T>,
|
|
127
|
+
context: RenderContext = DEFAULT_CONTEXT,
|
|
128
|
+
style: RenderStyle = defaultStyle(),
|
|
36
129
|
): string {
|
|
37
|
-
if (items.length === 0)
|
|
130
|
+
if (items.length === 0) {
|
|
131
|
+
// A piped zero-record table keeps its schema; a terminal needs nothing.
|
|
132
|
+
return context.headers && !context.stdoutIsTty
|
|
133
|
+
? renderHeaderRow(options.columns, style)
|
|
134
|
+
: "";
|
|
135
|
+
}
|
|
38
136
|
|
|
39
137
|
const prefixes = options.prefixes ?? DEFAULT_PREFIX_MAP;
|
|
40
|
-
const
|
|
41
|
-
options.columns
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
138
|
+
const cells = items.map((item) =>
|
|
139
|
+
options.columns.map((column) =>
|
|
140
|
+
disciplineCell(formatColumnValue(item, column, prefixes)),
|
|
141
|
+
),
|
|
142
|
+
);
|
|
143
|
+
const included = options.columns
|
|
144
|
+
.map((column, index) => ({ column, index }))
|
|
145
|
+
.filter(
|
|
146
|
+
({ column, index }) =>
|
|
147
|
+
column.showWhenEmpty === true ||
|
|
148
|
+
cells.some((row) => (row[index] ?? "").length > 0),
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
const header = included.map(({ column }) => column.label.toUpperCase());
|
|
152
|
+
const rows = cells.map((row) =>
|
|
153
|
+
included.map(({ index }) => {
|
|
154
|
+
const value = row[index] ?? "";
|
|
155
|
+
return value.length > 0 ? value : EMPTY_CELL;
|
|
156
|
+
}),
|
|
48
157
|
);
|
|
49
158
|
|
|
50
|
-
const
|
|
159
|
+
const layoutRows = context.headers ? [header, ...rows] : rows;
|
|
160
|
+
const widths = layoutRows.reduce<number[]>(
|
|
51
161
|
(acc, row) =>
|
|
52
162
|
row.map((value, index) => Math.max(acc[index] ?? 0, value.length)),
|
|
53
163
|
[],
|
|
54
164
|
);
|
|
165
|
+
const padded = layoutRows.map((row) =>
|
|
166
|
+
row
|
|
167
|
+
.map((value, index) => value.padEnd(widths[index] ?? value.length))
|
|
168
|
+
.join(" ")
|
|
169
|
+
.trimEnd(),
|
|
170
|
+
);
|
|
55
171
|
|
|
56
|
-
return
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
172
|
+
if (!context.headers) return padded.join("\n");
|
|
173
|
+
const [headerLine, ...bodyLines] = padded;
|
|
174
|
+
const styledHeader = style.enabled
|
|
175
|
+
? style.bold(headerLine ?? "")
|
|
176
|
+
: (headerLine ?? "");
|
|
177
|
+
return [styledHeader, ...bodyLines].join("\n");
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** The zero-record header row (every declared column, uppercase labels). */
|
|
181
|
+
function renderHeaderRow<T>(
|
|
182
|
+
columns: readonly ColumnDef<T>[],
|
|
183
|
+
style: RenderStyle,
|
|
184
|
+
): string {
|
|
185
|
+
const line = columns
|
|
186
|
+
.map((column) => column.label.toUpperCase())
|
|
187
|
+
.join(" ")
|
|
188
|
+
.trimEnd();
|
|
189
|
+
return style.enabled ? style.bold(line) : line;
|
|
64
190
|
}
|
|
65
191
|
|
|
66
192
|
export function renderListLlm<T>(
|
|
@@ -196,7 +322,9 @@ function renderLookupSections<T>(
|
|
|
196
322
|
|
|
197
323
|
sections.push("");
|
|
198
324
|
sections.push(
|
|
199
|
-
mode === "llm"
|
|
325
|
+
mode === "llm"
|
|
326
|
+
? `${"#".repeat(SECTION_HEADING_LEVEL)} ${section.heading}`
|
|
327
|
+
: `${section.heading}:`,
|
|
200
328
|
);
|
|
201
329
|
sections.push(body);
|
|
202
330
|
}
|
|
@@ -238,7 +366,81 @@ function renderFieldValue(
|
|
|
238
366
|
}
|
|
239
367
|
|
|
240
368
|
const text = formatScalarValue(value, prefixes);
|
|
241
|
-
|
|
369
|
+
// Plain mode is not markdown — a `###` there is literal text, and rewriting
|
|
370
|
+
// it would corrupt the value. Only the llm mode's markdown has a hierarchy to
|
|
371
|
+
// collide with, so only it nests.
|
|
372
|
+
return mode === "llm"
|
|
373
|
+
? nestHeadings(text, SECTION_HEADING_LEVEL)
|
|
374
|
+
: indentBlock(text);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Demote a section body's own ATX headings so they nest UNDER the heading the
|
|
379
|
+
* renderer gave the section.
|
|
380
|
+
*
|
|
381
|
+
* Authored markdown cannot know what level it will be rendered at; the renderer
|
|
382
|
+
* can, and so the renderer is the side that moves. A block whose shallowest
|
|
383
|
+
* heading is at or above `parentLevel` is shifted down as a whole — `###
|
|
384
|
+
* Accessibility` inside a `### Guidelines` section becomes `#### Accessibility`
|
|
385
|
+
* — which fixes the collision (a section heading immediately followed by a
|
|
386
|
+
* same-level heading reads as an empty section) while preserving the content's
|
|
387
|
+
* internal hierarchy exactly. Content already nested deeper is left alone.
|
|
388
|
+
*
|
|
389
|
+
* Headings inside a fenced code block are content, not structure — a `# ` in a
|
|
390
|
+
* shell sample is a comment — so fenced regions pass through untouched.
|
|
391
|
+
*
|
|
392
|
+
* @param text - The section body as authored.
|
|
393
|
+
* @param parentLevel - The heading level the section itself was rendered at.
|
|
394
|
+
* @returns The body with its headings nested below `parentLevel`.
|
|
395
|
+
*/
|
|
396
|
+
function nestHeadings(text: string, parentLevel: number): string {
|
|
397
|
+
const lines = text.split("\n");
|
|
398
|
+
const headings = new Map<number, number>();
|
|
399
|
+
// A fence CLOSES only on the same marker character, a run at least as long
|
|
400
|
+
// as the opener's, and no info string — CommonMark's rule, and the reason
|
|
401
|
+
// the opener's length is remembered rather than just its character. Toggling
|
|
402
|
+
// on any same-character run let a ``` sample inside a ```` block read as the
|
|
403
|
+
// close, after which every `#` line in that code block was rewritten as a
|
|
404
|
+
// heading: the renderer editing someone's sample code.
|
|
405
|
+
let fence: { marker: string; length: number } | undefined;
|
|
406
|
+
for (const [index, line] of lines.entries()) {
|
|
407
|
+
const delimiter = CODE_FENCE.exec(line);
|
|
408
|
+
const run = delimiter?.[1];
|
|
409
|
+
if (run !== undefined) {
|
|
410
|
+
const marker = run.charAt(0);
|
|
411
|
+
const info = (delimiter?.[4] ?? "").trim();
|
|
412
|
+
if (fence === undefined) {
|
|
413
|
+
fence = { marker, length: run.length };
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
if (
|
|
417
|
+
marker === fence.marker &&
|
|
418
|
+
run.length >= fence.length &&
|
|
419
|
+
info === ""
|
|
420
|
+
) {
|
|
421
|
+
fence = undefined;
|
|
422
|
+
}
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
if (fence !== undefined) continue;
|
|
426
|
+
const level = ATX_HEADING.exec(line)?.[2]?.length;
|
|
427
|
+
if (level !== undefined) headings.set(index, level);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
if (headings.size === 0) return text;
|
|
431
|
+
const shift = parentLevel + 1 - Math.min(...headings.values());
|
|
432
|
+
if (shift <= 0) return text;
|
|
433
|
+
|
|
434
|
+
return lines
|
|
435
|
+
.map((line, index) => {
|
|
436
|
+
const level = headings.get(index);
|
|
437
|
+
if (level === undefined) return line;
|
|
438
|
+
const hashes = "#".repeat(Math.min(level + shift, MAX_HEADING_LEVEL));
|
|
439
|
+
// `$1` keeps the line's own indent: rewriting it away would turn a
|
|
440
|
+
// legally indented heading into an unindented one.
|
|
441
|
+
return line.replace(ATX_HEADING, `$1${hashes}$3`);
|
|
442
|
+
})
|
|
443
|
+
.join("\n");
|
|
242
444
|
}
|
|
243
445
|
|
|
244
446
|
function renderCodeValue<T>(
|