@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
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: adoption-a3-forms
|
|
3
|
+
description: Migrate application forms to the Canonical form system built on react-hook-form (adoption track A3); also runs as a guided tutorial on a worked example
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Adoption A3 — Forms
|
|
7
|
+
|
|
8
|
+
The third adoption track: move the app's forms onto the design-system form package.
|
|
9
|
+
Prerequisite: track A1 (A2 recommended). Understand what this track is before starting:
|
|
10
|
+
the form system is a DIFFERENT PROGRAMMING MODEL built on react-hook-form, not a restyle
|
|
11
|
+
of your existing inputs.
|
|
12
|
+
|
|
13
|
+
## When to Use
|
|
14
|
+
|
|
15
|
+
- Track A1 is done and the app's forms should move onto the design-system form package
|
|
16
|
+
- A form is being built or rewritten and should use the `Form`/`Field` model from the
|
|
17
|
+
start
|
|
18
|
+
- A form contains an input type the system does not cover — the `custom` escape hatch
|
|
19
|
+
below keeps it inside the `Form` (and the gap is a finding to report)
|
|
20
|
+
|
|
21
|
+
## When NOT to Use
|
|
22
|
+
|
|
23
|
+
- The visual foundation is not in place yet — run `adoption-a1-styles` first
|
|
24
|
+
- Swapping non-form components — that is `adoption-a2-components`
|
|
25
|
+
|
|
26
|
+
## Opening move: ask, or offer the tutorial
|
|
27
|
+
|
|
28
|
+
Activation is an opening, not a starting gun. Unless the first message already names
|
|
29
|
+
the work, ask for the starting point — as a suggestion carrying an example, not as a
|
|
30
|
+
form to fill in:
|
|
31
|
+
|
|
32
|
+
> To get started, point me at the app and say which form you'd like moved first — or
|
|
33
|
+
> let me find the forms and suggest a starting one.
|
|
34
|
+
|
|
35
|
+
The smallest real form is usually the best first move: the programming-model switch is
|
|
36
|
+
easier to see on a short one. Ask again only for what the next step genuinely blocks
|
|
37
|
+
on.
|
|
38
|
+
|
|
39
|
+
If the activation message already carries the starting point, do not re-ask — say what
|
|
40
|
+
you took it to be, and go.
|
|
41
|
+
|
|
42
|
+
Offer the tutorial in the same breath, because this track doubles as one:
|
|
43
|
+
|
|
44
|
+
> Or if you'd rather see the model before touching your forms, I can run it as a
|
|
45
|
+
> tutorial: I'll take a plausible example — a couple of text fields and a select — and
|
|
46
|
+
> walk you through the migration on it.
|
|
47
|
+
|
|
48
|
+
Tutorial mode is the step narration below, turned up: the same outcome-path-conclusion
|
|
49
|
+
frame, with the reasoning behind each change made explicit. It runs on a scratch
|
|
50
|
+
example, not on the person's app — nothing in their repo changes unless they ask.
|
|
51
|
+
|
|
52
|
+
## Every step is narrated: outcome, path, conclusion
|
|
53
|
+
|
|
54
|
+
Every step is addressed to the person — once before it runs, once when it ends. This is
|
|
55
|
+
not tutorial manner. It holds in the ordinary flow too: the person is the design
|
|
56
|
+
authority, and they can only steer a step they saw coming. A decision gate met cold is
|
|
57
|
+
a decision they cannot really make.
|
|
58
|
+
|
|
59
|
+
**Open** the step with what it is FOR — the outcome it should leave behind — and how
|
|
60
|
+
you are about to get there. **Close** it with a sentence saying what it established and
|
|
61
|
+
what that means for the step after. One sentence each is enough; the failure mode is
|
|
62
|
+
silence, not length, and a step whose outcome looks obvious still gets its sentence
|
|
63
|
+
rather than a shrug.
|
|
64
|
+
|
|
65
|
+
Do:
|
|
66
|
+
|
|
67
|
+
> **The first field conversion.** The outcome is one field moved onto the `Form`/`Field`
|
|
68
|
+
> model, proving the wiring end to end before the rest follow. The path is to replace
|
|
69
|
+
> the input with a `<Field>` and let `Form` own the state `useState` was holding.
|
|
70
|
+
>
|
|
71
|
+
> …
|
|
72
|
+
>
|
|
73
|
+
> So: the field validates and submits through react-hook-form and the local `useState`
|
|
74
|
+
> is gone — every remaining field is the same move, except the file upload, which needs
|
|
75
|
+
> the `custom` escape hatch.
|
|
76
|
+
|
|
77
|
+
Don't:
|
|
78
|
+
|
|
79
|
+
> Converted the email field. Works.
|
|
80
|
+
|
|
81
|
+
Both carry the same facts. Only the first says what the step was trying to achieve and
|
|
82
|
+
what it settled — and only the first lets the person cut in with the thing they know
|
|
83
|
+
and the graph does not, which is the whole reason they are here.
|
|
84
|
+
|
|
85
|
+
## Asked about the skill: methodology and outcomes first
|
|
86
|
+
|
|
87
|
+
A question about what this skill does — what it covers, what its steps are, how it
|
|
88
|
+
works — is answered in that order: the METHOD it applies and the OUTCOMES it leaves
|
|
89
|
+
the person holding come first, the step-by-step breakdown comes after.
|
|
90
|
+
|
|
91
|
+
Two or three sentences of method is enough: what the skill treats as its object, the
|
|
92
|
+
discipline that makes it work, and what exists at the end that did not exist before.
|
|
93
|
+
The enumeration then reads as steps in service of something, rather than as a list to
|
|
94
|
+
be got through.
|
|
95
|
+
|
|
96
|
+
What this prevents is a table of contents standing in for an answer. A reply opening
|
|
97
|
+
with the step names tells someone who already knows the skill nothing new, and someone
|
|
98
|
+
who does not, nothing at all.
|
|
99
|
+
|
|
100
|
+
So, asked what this skill is:
|
|
101
|
+
|
|
102
|
+
> It moves forms onto the design-system form package, and the thing to understand
|
|
103
|
+
> before starting is that this is a DIFFERENT PROGRAMMING MODEL built on
|
|
104
|
+
> react-hook-form — fields as data, `Form` owning the state — not a restyle of the
|
|
105
|
+
> existing inputs. You end with forms on the `Form`/`Field` model, and anything the
|
|
106
|
+
> system does not cover kept inside the `Form` through the `custom` escape hatch.
|
|
107
|
+
|
|
108
|
+
Then, and only then, the breakdown.
|
|
109
|
+
|
|
110
|
+
## Install + the forms styles import
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
bun add @canonical/react-ds-global-form @canonical/styles
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Then BOTH stylesheets in the root stylesheet:
|
|
117
|
+
|
|
118
|
+
```css
|
|
119
|
+
@import url("@canonical/styles");
|
|
120
|
+
@import url("@canonical/react-ds-global-form/dist/esm/index.css");
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
The first brings the global reset and tokens; the second the input chrome and field
|
|
124
|
+
layout. The package builds on top of `@canonical/react-ds-global`.
|
|
125
|
+
|
|
126
|
+
Forms are the heaviest consumer of the density system: control heights, field spacing,
|
|
127
|
+
and baseline seating all read the `--density-*` channel, which only emits real values
|
|
128
|
+
when the app root carries its context and density classes
|
|
129
|
+
(`class="app comfortable"` — track A1's "Declare the surface" section). Confirm those
|
|
130
|
+
classes before judging any form layout: without them the primitives silently fall back
|
|
131
|
+
to app-comfortable values, and a `dense` or site-surface form renders with the wrong
|
|
132
|
+
geometry.
|
|
133
|
+
|
|
134
|
+
## Code standards are the gate
|
|
135
|
+
|
|
136
|
+
Form migration is component code, and it falls under the live code standards — the
|
|
137
|
+
`react` category at minimum, plus `testing` where the migration touches tests (take
|
|
138
|
+
the actual set from the live output, not from this list). Pull them BEFORE the first
|
|
139
|
+
field conversion and hold the Do/Don't pairs open while writing:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
pragma standard categories # the live category set — never from memory
|
|
143
|
+
pragma standard list --category react
|
|
144
|
+
pragma standard lookup <name> --detail detailed
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Apps follow the code standards as closely as the migration allows. Where a
|
|
148
|
+
conversion has to deviate from a pulled standard, record the deviation in the PR next
|
|
149
|
+
to the standard's name — and ideally file it as an issue, either to bring the app
|
|
150
|
+
into line later or to propose a change to the standard itself. The standards apply
|
|
151
|
+
even when the app has no pragma dependency, and they are open to contribution: a
|
|
152
|
+
missing or wrong standard is something to propose a change for, not to silently work
|
|
153
|
+
around.
|
|
154
|
+
|
|
155
|
+
## The react-hook-form switch
|
|
156
|
+
|
|
157
|
+
Form state moves INTO the form system:
|
|
158
|
+
|
|
159
|
+
- `<Form onSubmit={…}>` wraps a react-hook-form `FormProvider`. Pass your own `useForm`
|
|
160
|
+
return via the `methods` prop when you need external control; otherwise `defaultValues`
|
|
161
|
+
and `mode` are enough and the Form calls `useForm` internally.
|
|
162
|
+
- `Field` reads the form context via `useFormContext` — **a `Field` outside a `Form` is
|
|
163
|
+
a bug**, not a styling choice.
|
|
164
|
+
- Migrating a form means DELETING its `useState`/`onChange` handler plumbing, not
|
|
165
|
+
wrapping it. If the old state code survives the migration, the migration is not done.
|
|
166
|
+
|
|
167
|
+
## Fields as data
|
|
168
|
+
|
|
169
|
+
Each field is a declaration, not an assembly of label + input + error markup:
|
|
170
|
+
|
|
171
|
+
```tsx
|
|
172
|
+
<Form onSubmit={handleSubmit}>
|
|
173
|
+
<Field name="email" inputType="email" label="Email address" description="Work address preferred" />
|
|
174
|
+
</Form>
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
`inputType` is a discriminated union selecting the input subcomponent — text, textarea,
|
|
178
|
+
select, checkbox, radio-style choices, date/time, phone, combobox, and more — and the
|
|
179
|
+
label, description, and error wiring come with the frame.
|
|
180
|
+
|
|
181
|
+
> The covered set is whatever the graph answers today. Query it live — never copy its
|
|
182
|
+
> output into documentation, PRs, or this skill.
|
|
183
|
+
|
|
184
|
+
Enumerate the input types that exist TODAY from the package's `Field` types and its
|
|
185
|
+
Storybook stories — not from this skill.
|
|
186
|
+
|
|
187
|
+
## The custom escape hatch
|
|
188
|
+
|
|
189
|
+
A one-off input stays INSIDE the system:
|
|
190
|
+
|
|
191
|
+
```tsx
|
|
192
|
+
<Field name="tags" inputType="custom" CustomComponent={TagPicker} label="Tags" />
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
`CustomComponent` is a `React.ComponentType<InputProps>`: it keeps react-hook-form
|
|
196
|
+
registration, the label/description/error framing, and validation. The escape hatch is
|
|
197
|
+
for the INPUT, never for leaving the `Form`.
|
|
198
|
+
|
|
199
|
+
## WIP-stage warnings
|
|
200
|
+
|
|
201
|
+
Input maturity is graph data, not folklore. Before building on an input type, read its
|
|
202
|
+
documentation stage — the stage lives on the block's graph entity:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
pragma block list # find the input's row — it carries the block's IRI
|
|
206
|
+
pragma graph inspect <block IRI> # every triple, including ds:documentationStage
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Look the row up under the PACKAGE COMPONENT's name, not the `inputType` token — the
|
|
210
|
+
union maps several tokens onto one component (`"text"`, `"email"`, `"tel"` and `"url"`
|
|
211
|
+
all render `TextField`/`TextInput`; `"file"` renders `FileUploadField`; `"choices"`
|
|
212
|
+
renders `ChoicesField`). Read the component a token selects from the package's `Field`
|
|
213
|
+
types above, then find THAT name's row.
|
|
214
|
+
|
|
215
|
+
An input name can be declared at more than one tier, so the list can carry a row per
|
|
216
|
+
tier — names resolve globally, not within one tier. To list every tier that declares
|
|
217
|
+
the name, the name query
|
|
218
|
+
`pragma graph query "SELECT ?b WHERE { ?b ds:name ?n . FILTER(LCASE(?n) = LCASE('<Name>')) }"`
|
|
219
|
+
prints every tier's IRI. Inspect the one whose tier matches the package you
|
|
220
|
+
installed — `global` for `@canonical/react-ds-global-form`'s inputs; the stage
|
|
221
|
+
below is per-block, so another tier's row answers about a different block.
|
|
222
|
+
|
|
223
|
+
Read whatever `ds:documentationStage` tag comes back — the tag vocabulary is the
|
|
224
|
+
graph's, not this skill's, so do not expect a fixed value list; if the predicate is
|
|
225
|
+
absent, no stage is recorded for that block. The tag's MEANING is graph data too —
|
|
226
|
+
inspect the tag entity itself:
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
pragma graph inspect ds:tag.<name> # the tag the stage read returned; ds:whenToApply says what it means
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Split the action on what `ds:whenToApply` says. A tag meaning the block was rejected
|
|
233
|
+
or triaged out, or that it is only PROPOSED or postponed — not yet accepted into the
|
|
234
|
+
system: do NOT build on that input — raise it as a gap (the `custom` escape hatch
|
|
235
|
+
covers the form meanwhile). A tag meaning the documentation is unfinished: the block
|
|
236
|
+
may change under you — SAY SO in the migration PR rather than discovering it in
|
|
237
|
+
production. A tag whose `ds:whenToApply` comes back blank: the stage's meaning is
|
|
238
|
+
unrecorded — treat it as unknown, and say so in the PR.
|
|
239
|
+
|
|
240
|
+
Debug aid: `@canonical/storybook-addon-form-state` adds a Storybook panel showing the
|
|
241
|
+
live react-hook-form state while you exercise a story.
|
|
242
|
+
|
|
243
|
+
## Verify
|
|
244
|
+
|
|
245
|
+
- [ ] Root context and density classes present (track A1) — field spacing and control
|
|
246
|
+
seating read the `--density-*` channel.
|
|
247
|
+
- [ ] Submit round-trip works, with validation errors surfaced per field.
|
|
248
|
+
- [ ] The whole form is completable keyboard-only.
|
|
249
|
+
- [ ] Zero dev-console warnings from the form components.
|
|
250
|
+
|
|
251
|
+
## Support
|
|
252
|
+
|
|
253
|
+
If this skill leads somewhere broken — a command that errors, guidance that
|
|
254
|
+
contradicts what the live system answers, a gap the flow cannot cover — you are not
|
|
255
|
+
stuck:
|
|
256
|
+
|
|
257
|
+
- Raise an issue in the pragma repo: https://github.com/canonical/pragma/issues —
|
|
258
|
+
include the skill name, what was run, and expected vs. actual outcome.
|
|
259
|
+
- Or contact the design-system team owners directly through your organization's
|
|
260
|
+
professional messaging channels for assistance.
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
# Anatomy DSL Specification
|
|
2
|
+
|
|
3
|
+
This specification presents a DSL to represent design system anatomies, providing an accurate platform-agnostic markup primitive to precede implementation.
|
|
4
|
+
|
|
5
|
+
## Rationale
|
|
6
|
+
|
|
7
|
+
Design systems need a formal way to describe component structure that:
|
|
8
|
+
- Precedes and guides implementation
|
|
9
|
+
- Is platform-agnostic (works for React, SwiftUI, Flutter, etc.)
|
|
10
|
+
- Supports discussion and review
|
|
11
|
+
- Enables automated tooling (auditing, code generation)
|
|
12
|
+
|
|
13
|
+
## Intended Usage
|
|
14
|
+
|
|
15
|
+
1. **Documentation**: Implementation primitive for markup and style bindings
|
|
16
|
+
2. **Specification**: Using the tree-based DSL to identify entities to implement and/or reuse
|
|
17
|
+
3. **Discussion**: Using the DSL to discuss across conversations related to DS (e.g., "I believe these nodes should be siblings, not parents of one another")
|
|
18
|
+
4. **Inference**: Supporting automated inference to audit a codebase against its specifications or to support code generation
|
|
19
|
+
|
|
20
|
+
## Requirements
|
|
21
|
+
|
|
22
|
+
### General DSL Requirements
|
|
23
|
+
|
|
24
|
+
- The DSL MUST optimize for readability
|
|
25
|
+
- The DSL MUST be easy to get started with and use a familiar language
|
|
26
|
+
- The scope of the DSL MUST be minimized to cover only the strict necessary - additional specification information being covered in the schema
|
|
27
|
+
|
|
28
|
+
### Modelling Requirements
|
|
29
|
+
|
|
30
|
+
- The children of a node MUST be modelled through a reified relation for annotation purposes
|
|
31
|
+
- The DSL MUST support anonymous nodes (nodes that are not named components, for instance an unnamed "div"). In this case, the DSL should support role annotations
|
|
32
|
+
- The DSL MUST support reified annotations of cardinality
|
|
33
|
+
- The DSL MUST support all classes of UI Blocks identified in the ontology (Layout, Pattern, Component, Subcomponent, Group)
|
|
34
|
+
|
|
35
|
+
## Type System
|
|
36
|
+
|
|
37
|
+
We structure the children one-to-many relation following inspiration by [the Relay connection pattern](https://relay.dev/graphql/connections.htm) and propose the following typings.
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
/* Reusable types */
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Styles use a CTI (Category-Type-Item) inspired flat key structure for
|
|
44
|
+
* platform-agnostic UI properties. This allows to avoid using language
|
|
45
|
+
* specific keys such as CSS.
|
|
46
|
+
*
|
|
47
|
+
* KEY NAMING CONVENTION:
|
|
48
|
+
* Properties follow a dot-notation pattern: "category.type[.item]"
|
|
49
|
+
* - Category: Primary concern (layout, spacing, appearance, typography, size, etc.)
|
|
50
|
+
* - Type: Specific aspect within that category
|
|
51
|
+
* - Item: Optional further specification
|
|
52
|
+
*
|
|
53
|
+
* INVARIANT VS THEMEABLE:
|
|
54
|
+
* Whether a property is invariant (structural) or themeable depends on its
|
|
55
|
+
* semantic meaning and value type, rather than strict rules:
|
|
56
|
+
*
|
|
57
|
+
* Typically invariant (structural decisions):
|
|
58
|
+
* - layout.type: "stack" | "flow" | "grid" // Component structure
|
|
59
|
+
* - layout.direction: "horizontal" | "vertical"
|
|
60
|
+
* - size.width: "fill" | "hug" | "100%" // Structural sizing
|
|
61
|
+
*
|
|
62
|
+
* Typically themeable (brand/theme variations):
|
|
63
|
+
* - appearance.*: Color, shadow, radius values via tokens
|
|
64
|
+
* - spacing.*: When referencing design tokens
|
|
65
|
+
* - typography.*: Font properties via tokens
|
|
66
|
+
*
|
|
67
|
+
* Context-dependent:
|
|
68
|
+
* - size.width: "320px" or "size/card/width" // Token = themeable
|
|
69
|
+
* - size.width: "fill" or "100%" // Structural = invariant
|
|
70
|
+
* - spacing.internal: "16" // Fixed value = invariant
|
|
71
|
+
* - spacing.internal: "spacing/medium" // Token = themeable
|
|
72
|
+
*
|
|
73
|
+
* The distinction is semantic: does this property define structure or appearance?
|
|
74
|
+
*/
|
|
75
|
+
type Styles = Record<string, TokenPath | TokenPath[] | PrimitiveValue>;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* TokenPath represents a forward-slash delimited path to a design token.
|
|
79
|
+
* Follows design token naming conventions referenced by the W3C Design Token Format.
|
|
80
|
+
*
|
|
81
|
+
* Examples:
|
|
82
|
+
* - "spacing/medium"
|
|
83
|
+
* - "color/surface/primary"
|
|
84
|
+
* - "font/size/heading/1"
|
|
85
|
+
* - "border/width/thin"
|
|
86
|
+
* - "shadow/elevated/medium"
|
|
87
|
+
* - "radius/button/default"
|
|
88
|
+
*
|
|
89
|
+
* Token paths are resolved at runtime against the active theme.
|
|
90
|
+
*/
|
|
91
|
+
type TokenPath = string;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* PrimitiveValue represents direct values not resolved from tokens.
|
|
95
|
+
* Used for structural decisions and fixed values.
|
|
96
|
+
*
|
|
97
|
+
* Examples:
|
|
98
|
+
* - string: "stack", "flow", "center", "fill", "100%", "1fr"
|
|
99
|
+
* - number: 1.5 (aspect ratio), 2 (column count), -1 (z-index)
|
|
100
|
+
* - boolean: true/false (for wrap, reverse, etc.)
|
|
101
|
+
*/
|
|
102
|
+
type PrimitiveValue = string | number | boolean;
|
|
103
|
+
|
|
104
|
+
/* Main types */
|
|
105
|
+
|
|
106
|
+
interface Relation {
|
|
107
|
+
/**
|
|
108
|
+
* Cardinality represents the number of allowed instances of the related node.
|
|
109
|
+
* See https://en.wikipedia.org/wiki/Cardinality_(data_modeling) for reference.
|
|
110
|
+
*
|
|
111
|
+
* Examples:
|
|
112
|
+
* - "1" : Exactly one (required)
|
|
113
|
+
* - "0..1" : Zero or one (optional)
|
|
114
|
+
* - "0..*" : Zero or more
|
|
115
|
+
* - "1..*" : One or more
|
|
116
|
+
* - "2..5" : Between 2 and 5
|
|
117
|
+
*/
|
|
118
|
+
cardinality: string;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Maps content to a specific slot in the parent component.
|
|
122
|
+
*
|
|
123
|
+
* Common values:
|
|
124
|
+
* - "default" : Main content (React children)
|
|
125
|
+
* - "header" : Header slot
|
|
126
|
+
* - "footer" : Footer slot
|
|
127
|
+
* - "icon" : Icon placement
|
|
128
|
+
* - "label" : Text label
|
|
129
|
+
* - Custom slots as needed
|
|
130
|
+
*/
|
|
131
|
+
slotName?: string;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Base interface for all nodes in the anatomy tree.
|
|
136
|
+
*/
|
|
137
|
+
interface BaseNode {
|
|
138
|
+
/**
|
|
139
|
+
* Style properties using CTI-inspired keys.
|
|
140
|
+
*
|
|
141
|
+
* Common patterns and their platform mappings:
|
|
142
|
+
*
|
|
143
|
+
* LAYOUT:
|
|
144
|
+
* - "layout.type": "stack" | "flow" | "grid"
|
|
145
|
+
* -> CSS: display + flexDirection | SwiftUI: VStack/HStack | Flutter: Column/Row
|
|
146
|
+
* - "layout.align": "center" | "start" | "end"
|
|
147
|
+
* -> CSS: align-items | SwiftUI: alignment | Flutter: crossAxisAlignment
|
|
148
|
+
*
|
|
149
|
+
* SPACING:
|
|
150
|
+
* - "spacing.internal": "spacing/medium"
|
|
151
|
+
* -> CSS: padding | SwiftUI: .padding() | Flutter: EdgeInsets
|
|
152
|
+
* - "spacing.external": "spacing/large"
|
|
153
|
+
* -> CSS: margin | SwiftUI: frame modifiers | Flutter: Container margin
|
|
154
|
+
* - "spacing.gap": "spacing/small"
|
|
155
|
+
* -> CSS: gap | SwiftUI: spacing parameter | Flutter: SizedBox between
|
|
156
|
+
*
|
|
157
|
+
* APPEARANCE:
|
|
158
|
+
* - "appearance.background": "color/surface/primary"
|
|
159
|
+
* -> CSS: background | SwiftUI: .background() | Flutter: Container color
|
|
160
|
+
* - "appearance.radius": "radius/medium"
|
|
161
|
+
* -> CSS: border-radius | SwiftUI: .cornerRadius() | Flutter: BorderRadius
|
|
162
|
+
*
|
|
163
|
+
* SIZE:
|
|
164
|
+
* - "size.width": "fill" | "hug" | "size/card/width"
|
|
165
|
+
* -> CSS: width: 100% | auto | var() | SwiftUI: .frame() | Flutter: constraints
|
|
166
|
+
*
|
|
167
|
+
* Examples showing invariant vs themeable:
|
|
168
|
+
* {
|
|
169
|
+
* "layout.type": "grid", // Invariant: structural
|
|
170
|
+
* "layout.columns": "1fr 300px 1fr", // Invariant: grid structure
|
|
171
|
+
* "spacing.gap": "spacing/grid/gap", // Themeable: token reference
|
|
172
|
+
* "appearance.background": "color/surface", // Themeable: always
|
|
173
|
+
* "size.width": "fill", // Invariant: structural behavior
|
|
174
|
+
* "size.max.width": "size/container/max", // Themeable: token reference
|
|
175
|
+
* "typography.align": "center", // Invariant: structural
|
|
176
|
+
* "typography.size": "font/size/body", // Themeable: token reference
|
|
177
|
+
* }
|
|
178
|
+
*/
|
|
179
|
+
styles?: Styles;
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Child nodes and their relationships.
|
|
183
|
+
* Enables recursive component composition.
|
|
184
|
+
*/
|
|
185
|
+
edges?: Edge[];
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Named nodes represent identifiable components in the design system.
|
|
190
|
+
*/
|
|
191
|
+
interface NamedNode extends BaseNode {
|
|
192
|
+
/**
|
|
193
|
+
* Unique identifier following "tier.type.name" pattern.
|
|
194
|
+
* Maps to URI field on UI Block in the ontology.
|
|
195
|
+
*
|
|
196
|
+
* Examples:
|
|
197
|
+
* - "global.component.button"
|
|
198
|
+
* - "global.component.card"
|
|
199
|
+
* - "apps.layout.application_layout"
|
|
200
|
+
*/
|
|
201
|
+
uri: string;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Anonymous nodes represent structural elements without DS identity.
|
|
206
|
+
*/
|
|
207
|
+
interface AnonymousNode extends BaseNode {
|
|
208
|
+
/**
|
|
209
|
+
* Human-readable description of the node's purpose.
|
|
210
|
+
*
|
|
211
|
+
* Examples:
|
|
212
|
+
* - "content wrapper"
|
|
213
|
+
* - "spacer element"
|
|
214
|
+
* - "icon container"
|
|
215
|
+
* - "layout grid cell"
|
|
216
|
+
*/
|
|
217
|
+
role: string;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Union type for all possible nodes.
|
|
222
|
+
*/
|
|
223
|
+
type Node = NamedNode | AnonymousNode;
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* A switch fills one position with ONE of several alternatives,
|
|
227
|
+
* making polymorphism explicit at the edge level.
|
|
228
|
+
* The discriminator says who chooses:
|
|
229
|
+
* - "props" : the consumer chooses via component props
|
|
230
|
+
* - "internal" : the component chooses from its own state
|
|
231
|
+
* - "override" : the consumer may replace the default with a custom component
|
|
232
|
+
*/
|
|
233
|
+
interface Switch {
|
|
234
|
+
on: "props" | "internal" | "override";
|
|
235
|
+
cases: SwitchCase[];
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* One switch alternative — exactly one of `uri` or `node`.
|
|
240
|
+
* `uri` is the shorthand for `node: { uri }`; use the full `node` form
|
|
241
|
+
* when the case carries styles or edges. The reserved URI `$custom`
|
|
242
|
+
* marks a case filled by a user-provided component.
|
|
243
|
+
*/
|
|
244
|
+
interface SwitchCase {
|
|
245
|
+
uri?: string;
|
|
246
|
+
node?: Node;
|
|
247
|
+
|
|
248
|
+
/** Marks the default case. */
|
|
249
|
+
default?: boolean;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Represents a parent-child relationship in the anatomy tree.
|
|
254
|
+
*/
|
|
255
|
+
interface Edge {
|
|
256
|
+
/** The child node (Named or Anonymous) — exactly one of `node` or `switch` */
|
|
257
|
+
node?: Node;
|
|
258
|
+
|
|
259
|
+
/** A polymorphic position (mutually exclusive with node) */
|
|
260
|
+
switch?: Switch;
|
|
261
|
+
|
|
262
|
+
/** Relationship metadata (cardinality, slot) */
|
|
263
|
+
relation: Relation;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Root specification for a component anatomy.
|
|
268
|
+
* The top-level node must always be Named.
|
|
269
|
+
*/
|
|
270
|
+
interface AnatomySpec {
|
|
271
|
+
node: NamedNode;
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Language Choice
|
|
276
|
+
|
|
277
|
+
We propose the use of YAML, a mature indentation-based configuration syntax based on scalars, maps and lists. The main contender we have considered aside from YAML was JSON, rejected for its verbosity. We have also rejected TOML (maps with difficulty deeply nested nodes), SDLang and KDL (promising markup syntaxes without wide adoption at present).
|
|
278
|
+
|
|
279
|
+
## Examples
|
|
280
|
+
|
|
281
|
+
### Accordion
|
|
282
|
+
|
|
283
|
+
```yaml
|
|
284
|
+
node:
|
|
285
|
+
uri: global.component.accordion
|
|
286
|
+
styles:
|
|
287
|
+
# Structural (implicitly invariant)
|
|
288
|
+
layout.type: stack
|
|
289
|
+
layout.direction: vertical
|
|
290
|
+
|
|
291
|
+
# Themeable
|
|
292
|
+
appearance.border: border/style/accordion
|
|
293
|
+
|
|
294
|
+
edges:
|
|
295
|
+
# The repeating child is NAMED — reference its URI only; its subtree
|
|
296
|
+
# lives in its own anatomy. The live Accordion does the same.
|
|
297
|
+
- node:
|
|
298
|
+
uri: global.subcomponent.accordion-item
|
|
299
|
+
relation:
|
|
300
|
+
cardinality: "1..*"
|
|
301
|
+
slotName: default
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
The child's own anatomy — a separate spec on `global.subcomponent.accordion-item`
|
|
305
|
+
(transcribed from the live block) — carries the subtree as anonymous roles:
|
|
306
|
+
|
|
307
|
+
```yaml
|
|
308
|
+
node:
|
|
309
|
+
uri: global.subcomponent.accordion-item
|
|
310
|
+
styles:
|
|
311
|
+
layout.type: stack
|
|
312
|
+
layout.direction: vertical
|
|
313
|
+
edges:
|
|
314
|
+
- node:
|
|
315
|
+
role: header tab
|
|
316
|
+
styles:
|
|
317
|
+
layout.type: flow
|
|
318
|
+
layout.direction: horizontal
|
|
319
|
+
layout.align: center
|
|
320
|
+
interaction.cursor: pointer
|
|
321
|
+
edges:
|
|
322
|
+
- node:
|
|
323
|
+
role: control
|
|
324
|
+
styles:
|
|
325
|
+
size.width: size/icon/small
|
|
326
|
+
size.height: size/icon/small
|
|
327
|
+
relation:
|
|
328
|
+
cardinality: "1"
|
|
329
|
+
- node:
|
|
330
|
+
role: heading
|
|
331
|
+
relation:
|
|
332
|
+
cardinality: "1"
|
|
333
|
+
slotName: default
|
|
334
|
+
relation:
|
|
335
|
+
cardinality: "1"
|
|
336
|
+
slotName: header
|
|
337
|
+
|
|
338
|
+
- node:
|
|
339
|
+
role: content panel
|
|
340
|
+
styles:
|
|
341
|
+
layout.overflow: hidden
|
|
342
|
+
relation:
|
|
343
|
+
cardinality: "1"
|
|
344
|
+
slotName: default
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
### Card
|
|
348
|
+
|
|
349
|
+
```yaml
|
|
350
|
+
node:
|
|
351
|
+
uri: global.component.card
|
|
352
|
+
styles:
|
|
353
|
+
# Structural (implicitly invariant)
|
|
354
|
+
layout.type: stack
|
|
355
|
+
layout.direction: vertical
|
|
356
|
+
|
|
357
|
+
# Themeable
|
|
358
|
+
appearance.background: color/surface/card
|
|
359
|
+
appearance.shadow: shadow/card
|
|
360
|
+
appearance.radius: shape/rounded/full
|
|
361
|
+
spacing.gap: spacing/small
|
|
362
|
+
|
|
363
|
+
edges:
|
|
364
|
+
# Named children reference their URI only (each carries its own styles
|
|
365
|
+
# in its own anatomy); anonymous nodes carry their styles inline. A
|
|
366
|
+
# named child may carry contextual style overrides — never a copy of
|
|
367
|
+
# its subtree. The live Card models it the same way.
|
|
368
|
+
- node:
|
|
369
|
+
uri: global.subcomponent.card-header
|
|
370
|
+
relation:
|
|
371
|
+
cardinality: "0..1"
|
|
372
|
+
slotName: header
|
|
373
|
+
|
|
374
|
+
- node:
|
|
375
|
+
uri: global.subcomponent.card-image
|
|
376
|
+
relation:
|
|
377
|
+
cardinality: "0..1"
|
|
378
|
+
slotName: media
|
|
379
|
+
|
|
380
|
+
- node:
|
|
381
|
+
uri: global.subcomponent.card-content
|
|
382
|
+
relation:
|
|
383
|
+
cardinality: "1..1"
|
|
384
|
+
slotName: default
|
|
385
|
+
|
|
386
|
+
- node:
|
|
387
|
+
uri: global.subcomponent.card-footer
|
|
388
|
+
relation:
|
|
389
|
+
cardinality: "0..1"
|
|
390
|
+
slotName: footer
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
## Further Work
|
|
394
|
+
|
|
395
|
+
The following features would require additional work to this specification:
|
|
396
|
+
|
|
397
|
+
- Representation of related nodes displayed in portals
|
|
398
|
+
- Representation of conditional display
|
|
399
|
+
- Inheritance reference for styles (e.g., "NetworkCard" inherits the styles from "Card")
|
|
400
|
+
|
|
401
|
+
## References
|
|
402
|
+
|
|
403
|
+
Two main references have supported our reflection:
|
|
404
|
+
|
|
405
|
+
1. The work of the [Open UI W3C Working Group](https://open-ui.org/), which takes interest in a code-based anatomy for their specifications ([Example](https://open-ui.org/components/accordion.explainer/))
|
|
406
|
+
2. The work of Nathan Curtis, exploring a similar syntax in his article "[Components as Data](https://medium.com/@nathanacurtis/components-as-data-2be178777f21)"
|