@canonical/pragma-cli 0.18.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 +377 -0
- package/package.json +78 -0
- package/src/bin.test.ts +52 -0
- package/src/bin.ts +19 -0
- package/src/compile-validation.runner.ts +137 -0
- package/src/compile-validation.ts +192 -0
- package/src/completions/computeSocketPath.test.ts +26 -0
- package/src/completions/computeSocketPath.ts +16 -0
- package/src/completions/constants.ts +18 -0
- package/src/completions/handleQuery.test.ts +93 -0
- package/src/completions/handleQuery.ts +30 -0
- package/src/completions/index.ts +14 -0
- package/src/completions/queryCompletions.test.ts +100 -0
- package/src/completions/queryCompletions.ts +61 -0
- package/src/completions/querySocket.test.ts +70 -0
- package/src/completions/querySocket.ts +44 -0
- package/src/completions/startCompletionsServer.test.ts +74 -0
- package/src/completions/startCompletionsServer.ts +75 -0
- package/src/completions/startCompletionsServer.unit.test.ts +131 -0
- package/src/completions/waitForSocket.test.ts +27 -0
- package/src/completions/waitForSocket.ts +27 -0
- package/src/config/configExists.ts +14 -0
- package/src/config/index.ts +6 -0
- package/src/config/readConfig.test.ts +152 -0
- package/src/config/readConfig.ts +64 -0
- package/src/config/resolveConfigPath.test.ts +20 -0
- package/src/config/resolveConfigPath.ts +11 -0
- package/src/config/types.ts +26 -0
- package/src/config/writeConfig.ts +49 -0
- package/src/constants.ts +78 -0
- package/src/domains/block/blockConfig.ts +53 -0
- package/src/domains/block/commands/index.ts +4 -0
- package/src/domains/block/commands/list.test.ts +111 -0
- package/src/domains/block/commands/list.ts +69 -0
- package/src/domains/block/commands/lookup.test.ts +187 -0
- package/src/domains/block/commands/lookup.ts +199 -0
- package/src/domains/block/formatters/index.ts +4 -0
- package/src/domains/block/formatters/list.test.ts +107 -0
- package/src/domains/block/formatters/list.ts +64 -0
- package/src/domains/block/formatters/lookup.test.ts +317 -0
- package/src/domains/block/formatters/lookup.ts +354 -0
- package/src/domains/block/formatters/types.ts +16 -0
- package/src/domains/block/helpers/index.ts +4 -0
- package/src/domains/block/helpers/resolveAspects.test.ts +64 -0
- package/src/domains/block/helpers/resolveAspects.ts +35 -0
- package/src/domains/block/index.ts +25 -0
- package/src/domains/block/mcp/index.ts +2 -0
- package/src/domains/block/mcp/specs.ts +199 -0
- package/src/domains/block/operations/index.ts +4 -0
- package/src/domains/block/operations/list.test.ts +80 -0
- package/src/domains/block/operations/list.ts +72 -0
- package/src/domains/block/operations/lookup.test.ts +108 -0
- package/src/domains/block/operations/lookup.ts +359 -0
- package/src/domains/block/orchestration/blockEmptyError.ts +19 -0
- package/src/domains/block/orchestration/buildBlockFilters.ts +12 -0
- package/src/domains/block/orchestration/enrichBlocks.ts +37 -0
- package/src/domains/block/orchestration/index.ts +5 -0
- package/src/domains/block/orchestration/resolveBlockList.ts +39 -0
- package/src/domains/block/orchestration/resolveBlockLookup.ts +21 -0
- package/src/domains/block/types.ts +30 -0
- package/src/domains/config/commands/channel.test.ts +101 -0
- package/src/domains/config/commands/channel.ts +80 -0
- package/src/domains/config/commands/index.ts +4 -0
- package/src/domains/config/commands/show.test.ts +61 -0
- package/src/domains/config/commands/show.ts +51 -0
- package/src/domains/config/commands/tier.test.ts +84 -0
- package/src/domains/config/commands/tier.ts +78 -0
- package/src/domains/config/formatters/channel.test.ts +56 -0
- package/src/domains/config/formatters/channel.ts +34 -0
- package/src/domains/config/formatters/index.ts +4 -0
- package/src/domains/config/formatters/show.test.ts +126 -0
- package/src/domains/config/formatters/show.ts +66 -0
- package/src/domains/config/formatters/tier.test.ts +70 -0
- package/src/domains/config/formatters/tier.ts +40 -0
- package/src/domains/config/index.ts +23 -0
- package/src/domains/config/mcp/index.ts +2 -0
- package/src/domains/config/mcp/specs.ts +108 -0
- package/src/domains/config/operations/index.ts +5 -0
- package/src/domains/config/operations/show.test.ts +60 -0
- package/src/domains/config/operations/show.ts +42 -0
- package/src/domains/config/operations/types.ts +13 -0
- package/src/domains/config/operations/validateChannel.test.ts +36 -0
- package/src/domains/config/operations/validateChannel.ts +24 -0
- package/src/domains/config/operations/validateTier.test.ts +56 -0
- package/src/domains/config/operations/validateTier.ts +35 -0
- package/src/domains/create/commands/component.test.ts +166 -0
- package/src/domains/create/commands/component.ts +129 -0
- package/src/domains/create/commands/index.ts +3 -0
- package/src/domains/create/commands/package.test.ts +35 -0
- package/src/domains/create/commands/package.ts +21 -0
- package/src/domains/create/index.ts +15 -0
- package/src/domains/create/mcp/index.ts +2 -0
- package/src/domains/create/mcp/specs.ts +174 -0
- package/src/domains/doctor/commands/doctor.test.ts +75 -0
- package/src/domains/doctor/commands/doctor.ts +43 -0
- package/src/domains/doctor/commands/index.ts +2 -0
- package/src/domains/doctor/formatters/doctor.test.ts +117 -0
- package/src/domains/doctor/formatters/doctor.ts +84 -0
- package/src/domains/doctor/formatters/index.ts +2 -0
- package/src/domains/doctor/index.ts +9 -0
- package/src/domains/doctor/mcp/index.ts +2 -0
- package/src/domains/doctor/mcp/specs.ts +88 -0
- package/src/domains/doctor/operations/checks/checkConfigFile.ts +28 -0
- package/src/domains/doctor/operations/checks/checkKeStore.ts +38 -0
- package/src/domains/doctor/operations/checks/checkMcpConfigured.ts +65 -0
- package/src/domains/doctor/operations/checks/checkNodeVersion.ts +25 -0
- package/src/domains/doctor/operations/checks/checkPragmaVersion.ts +20 -0
- package/src/domains/doctor/operations/checks/checkShellCompletions.ts +42 -0
- package/src/domains/doctor/operations/checks/checkSkillsSymlinked.ts +64 -0
- package/src/domains/doctor/operations/checks/index.ts +8 -0
- package/src/domains/doctor/operations/checks.test.ts +151 -0
- package/src/domains/doctor/operations/index.ts +3 -0
- package/src/domains/doctor/operations/runChecks.test.ts +89 -0
- package/src/domains/doctor/operations/runChecks.ts +38 -0
- package/src/domains/doctor/operations/types.ts +20 -0
- package/src/domains/graph/commands/index.ts +4 -0
- package/src/domains/graph/commands/inspect.test.ts +94 -0
- package/src/domains/graph/commands/inspect.ts +63 -0
- package/src/domains/graph/commands/query.test.ts +92 -0
- package/src/domains/graph/commands/query.ts +60 -0
- package/src/domains/graph/formatters/index.ts +4 -0
- package/src/domains/graph/formatters/inspect.ts +45 -0
- package/src/domains/graph/formatters/query.ts +37 -0
- package/src/domains/graph/helpers/index.ts +3 -0
- package/src/domains/graph/helpers/resolveUri.ts +70 -0
- package/src/domains/graph/index.ts +22 -0
- package/src/domains/graph/mcp/index.ts +2 -0
- package/src/domains/graph/mcp/specs.ts +82 -0
- package/src/domains/graph/operations/executeQuery.test.ts +68 -0
- package/src/domains/graph/operations/executeQuery.ts +32 -0
- package/src/domains/graph/operations/index.ts +4 -0
- package/src/domains/graph/operations/inspectUri.test.ts +101 -0
- package/src/domains/graph/operations/inspectUri.ts +61 -0
- package/src/domains/info/commands/index.ts +4 -0
- package/src/domains/info/commands/info.test.ts +88 -0
- package/src/domains/info/commands/info.ts +47 -0
- package/src/domains/info/commands/upgrade.test.ts +183 -0
- package/src/domains/info/commands/upgrade.ts +150 -0
- package/src/domains/info/constants.test.ts +22 -0
- package/src/domains/info/constants.ts +15 -0
- package/src/domains/info/formatters/index.ts +8 -0
- package/src/domains/info/formatters/info.test.ts +173 -0
- package/src/domains/info/formatters/info.ts +116 -0
- package/src/domains/info/formatters/upgrade.test.ts +133 -0
- package/src/domains/info/formatters/upgrade.ts +68 -0
- package/src/domains/info/index.ts +7 -0
- package/src/domains/info/operations/checkRegistryVersion.test.ts +124 -0
- package/src/domains/info/operations/checkRegistryVersion.ts +45 -0
- package/src/domains/info/operations/collectInfo.test.ts +111 -0
- package/src/domains/info/operations/collectInfo.ts +68 -0
- package/src/domains/info/operations/collectStoreSummary.test.ts +61 -0
- package/src/domains/info/operations/collectStoreSummary.ts +42 -0
- package/src/domains/info/operations/index.ts +5 -0
- package/src/domains/info/types.test-d.ts +35 -0
- package/src/domains/info/types.ts +46 -0
- package/src/domains/llm/commands/index.ts +3 -0
- package/src/domains/llm/commands/llm.ts +37 -0
- package/src/domains/llm/data/commandReference.ts +25 -0
- package/src/domains/llm/data/decisionTrees.ts +46 -0
- package/src/domains/llm/data/index.ts +4 -0
- package/src/domains/llm/formatters/index.ts +3 -0
- package/src/domains/llm/formatters/orientation.ts +53 -0
- package/src/domains/llm/index.ts +8 -0
- package/src/domains/llm/llmCommand.test.ts +93 -0
- package/src/domains/llm/mcp/index.ts +2 -0
- package/src/domains/llm/mcp/specs.ts +87 -0
- package/src/domains/llm/operations/collectContext.ts +47 -0
- package/src/domains/llm/operations/index.ts +3 -0
- package/src/domains/llm/types.ts +32 -0
- package/src/domains/modifier/commands/index.ts +4 -0
- package/src/domains/modifier/commands/list.test.ts +57 -0
- package/src/domains/modifier/commands/list.ts +33 -0
- package/src/domains/modifier/commands/lookup.test.ts +91 -0
- package/src/domains/modifier/commands/lookup.ts +105 -0
- package/src/domains/modifier/formatters/index.ts +4 -0
- package/src/domains/modifier/formatters/list.test.ts +38 -0
- package/src/domains/modifier/formatters/list.ts +35 -0
- package/src/domains/modifier/formatters/lookup.test.ts +33 -0
- package/src/domains/modifier/formatters/lookup.ts +38 -0
- package/src/domains/modifier/index.ts +22 -0
- package/src/domains/modifier/mcp/index.ts +2 -0
- package/src/domains/modifier/mcp/specs.ts +97 -0
- package/src/domains/modifier/operations/index.ts +4 -0
- package/src/domains/modifier/operations/list.test.ts +39 -0
- package/src/domains/modifier/operations/list.ts +41 -0
- package/src/domains/modifier/operations/lookup.test.ts +37 -0
- package/src/domains/modifier/operations/lookup.ts +57 -0
- package/src/domains/modifier/orchestration/index.ts +3 -0
- package/src/domains/modifier/orchestration/modifierEmptyError.ts +10 -0
- package/src/domains/modifier/orchestration/resolveModifierList.ts +16 -0
- package/src/domains/modifier/orchestration/resolveModifierLookup.ts +20 -0
- package/src/domains/modifier/types.ts +5 -0
- package/src/domains/ontology/commands/index.ts +4 -0
- package/src/domains/ontology/commands/list.test.ts +82 -0
- package/src/domains/ontology/commands/list.ts +46 -0
- package/src/domains/ontology/commands/show.test.ts +103 -0
- package/src/domains/ontology/commands/show.ts +66 -0
- package/src/domains/ontology/formatters/index.ts +4 -0
- package/src/domains/ontology/formatters/list.ts +37 -0
- package/src/domains/ontology/formatters/show.ts +74 -0
- package/src/domains/ontology/helpers/findNamespace.ts +23 -0
- package/src/domains/ontology/helpers/index.ts +7 -0
- package/src/domains/ontology/helpers/queryClasses.ts +50 -0
- package/src/domains/ontology/helpers/queryProperties.ts +57 -0
- package/src/domains/ontology/helpers/resolvePrefix.ts +45 -0
- package/src/domains/ontology/index.ts +26 -0
- package/src/domains/ontology/mcp/index.ts +2 -0
- package/src/domains/ontology/mcp/specs.ts +93 -0
- package/src/domains/ontology/operations/index.ts +5 -0
- package/src/domains/ontology/operations/listOntologies.test.ts +45 -0
- package/src/domains/ontology/operations/listOntologies.ts +101 -0
- package/src/domains/ontology/operations/showOntology.test.ts +65 -0
- package/src/domains/ontology/operations/showOntology.ts +41 -0
- package/src/domains/ontology/operations/showOntologyRaw.test.ts +39 -0
- package/src/domains/ontology/operations/showOntologyRaw.ts +50 -0
- package/src/domains/setup/commands/all.ts +58 -0
- package/src/domains/setup/commands/completions.ts +85 -0
- package/src/domains/setup/commands/entrypoints.test.ts +170 -0
- package/src/domains/setup/commands/index.ts +6 -0
- package/src/domains/setup/commands/lsp.ts +49 -0
- package/src/domains/setup/commands/mcp.ts +119 -0
- package/src/domains/setup/commands/skills.test.ts +64 -0
- package/src/domains/setup/commands/skills.ts +106 -0
- package/src/domains/setup/formatters/index.ts +2 -0
- package/src/domains/setup/formatters/skills.test.ts +103 -0
- package/src/domains/setup/formatters/skills.ts +112 -0
- package/src/domains/setup/formatters/types.ts +7 -0
- package/src/domains/setup/helpers/completionScripts.test.ts +58 -0
- package/src/domains/setup/helpers/completionScripts.ts +92 -0
- package/src/domains/setup/helpers/constants.ts +2 -0
- package/src/domains/setup/helpers/detectShell.test.ts +48 -0
- package/src/domains/setup/helpers/detectShell.ts +20 -0
- package/src/domains/setup/helpers/index.ts +12 -0
- package/src/domains/setup/helpers/runSetupTask.test.ts +279 -0
- package/src/domains/setup/helpers/runSetupTask.ts +229 -0
- package/src/domains/setup/index.ts +33 -0
- package/src/domains/setup/operations/index.ts +6 -0
- package/src/domains/setup/operations/setupAll.test.ts +48 -0
- package/src/domains/setup/operations/setupAll.ts +41 -0
- package/src/domains/setup/operations/setupCompletions.test.ts +94 -0
- package/src/domains/setup/operations/setupCompletions.ts +54 -0
- package/src/domains/setup/operations/setupLsp.test.ts +29 -0
- package/src/domains/setup/operations/setupLsp.ts +17 -0
- package/src/domains/setup/operations/setupMcp.test.ts +115 -0
- package/src/domains/setup/operations/setupMcp.ts +108 -0
- package/src/domains/setup/operations/setupSkills.test.ts +191 -0
- package/src/domains/setup/operations/setupSkills.ts +160 -0
- package/src/domains/setup/types.ts +18 -0
- package/src/domains/shared/ToolSpec.ts +49 -0
- package/src/domains/shared/bootStore.ts +77 -0
- package/src/domains/shared/buildQuery.ts +18 -0
- package/src/domains/shared/compactUri.test.ts +21 -0
- package/src/domains/shared/compactUri.ts +16 -0
- package/src/domains/shared/context.ts +15 -0
- package/src/domains/shared/contracts.ts +113 -0
- package/src/domains/shared/extractLocalName.test.ts +21 -0
- package/src/domains/shared/extractLocalName.ts +14 -0
- package/src/domains/shared/filters/buildChannelFilter.test.ts +52 -0
- package/src/domains/shared/filters/buildChannelFilter.ts +41 -0
- package/src/domains/shared/filters/buildFilterConfig.ts +16 -0
- package/src/domains/shared/filters/buildFilters.test.ts +33 -0
- package/src/domains/shared/filters/buildFilters.ts +30 -0
- package/src/domains/shared/filters/buildTierFilter.test.ts +78 -0
- package/src/domains/shared/filters/buildTierFilter.ts +69 -0
- package/src/domains/shared/filters/describeFilters.ts +14 -0
- package/src/domains/shared/filters/index.ts +10 -0
- package/src/domains/shared/formatters.ts +35 -0
- package/src/domains/shared/lookupMany.ts +45 -0
- package/src/domains/shared/namespaces.ts +18 -0
- package/src/domains/shared/packages.ts +76 -0
- package/src/domains/shared/prefixes.ts +37 -0
- package/src/domains/shared/runtime.ts +62 -0
- package/src/domains/shared/types.test-d.ts +127 -0
- package/src/domains/shared/types.ts +348 -0
- package/src/domains/skill/commands/index.ts +2 -0
- package/src/domains/skill/commands/list.test.ts +111 -0
- package/src/domains/skill/commands/list.ts +69 -0
- package/src/domains/skill/formatters/index.ts +2 -0
- package/src/domains/skill/formatters/list.test.ts +140 -0
- package/src/domains/skill/formatters/list.ts +119 -0
- package/src/domains/skill/formatters/types.ts +8 -0
- package/src/domains/skill/helpers/index.ts +6 -0
- package/src/domains/skill/helpers/parseFrontmatter.test.ts +122 -0
- package/src/domains/skill/helpers/parseFrontmatter.ts +112 -0
- package/src/domains/skill/helpers/resolveSkillSources.ts +34 -0
- package/src/domains/skill/index.ts +19 -0
- package/src/domains/skill/mcp/index.ts +2 -0
- package/src/domains/skill/mcp/specs.ts +38 -0
- package/src/domains/skill/operations/discover.test.ts +145 -0
- package/src/domains/skill/operations/discover.ts +68 -0
- package/src/domains/skill/operations/index.ts +4 -0
- package/src/domains/skill/operations/list.test.ts +68 -0
- package/src/domains/skill/operations/list.ts +47 -0
- package/src/domains/skill/types.ts +25 -0
- package/src/domains/standard/commands/categories.test.ts +70 -0
- package/src/domains/standard/commands/categories.ts +48 -0
- package/src/domains/standard/commands/index.ts +5 -0
- package/src/domains/standard/commands/list.test.ts +105 -0
- package/src/domains/standard/commands/list.ts +81 -0
- package/src/domains/standard/commands/lookup.test.ts +135 -0
- package/src/domains/standard/commands/lookup.ts +127 -0
- package/src/domains/standard/formatters/categories.test.ts +44 -0
- package/src/domains/standard/formatters/categories.ts +38 -0
- package/src/domains/standard/formatters/index.ts +6 -0
- package/src/domains/standard/formatters/list.test.ts +166 -0
- package/src/domains/standard/formatters/list.ts +156 -0
- package/src/domains/standard/formatters/lookup.test.ts +95 -0
- package/src/domains/standard/formatters/lookup.ts +86 -0
- package/src/domains/standard/formatters/types.ts +31 -0
- package/src/domains/standard/index.ts +32 -0
- package/src/domains/standard/mcp/index.ts +2 -0
- package/src/domains/standard/mcp/specs.ts +197 -0
- package/src/domains/standard/operations/categories.test.ts +61 -0
- package/src/domains/standard/operations/categories.ts +38 -0
- package/src/domains/standard/operations/index.ts +5 -0
- package/src/domains/standard/operations/list.test.ts +75 -0
- package/src/domains/standard/operations/list.ts +64 -0
- package/src/domains/standard/operations/lookup.test.ts +58 -0
- package/src/domains/standard/operations/lookup.ts +142 -0
- package/src/domains/standard/orchestration/buildStandardFilters.ts +11 -0
- package/src/domains/standard/orchestration/index.ts +4 -0
- package/src/domains/standard/orchestration/resolveStandardList.ts +42 -0
- package/src/domains/standard/orchestration/resolveStandardLookup.ts +20 -0
- package/src/domains/standard/orchestration/standardEmptyError.ts +19 -0
- package/src/domains/standard/types.ts +15 -0
- package/src/domains/tier/commands/index.ts +3 -0
- package/src/domains/tier/commands/list.test.ts +67 -0
- package/src/domains/tier/commands/list.ts +43 -0
- package/src/domains/tier/formatters/index.ts +3 -0
- package/src/domains/tier/formatters/list.test.ts +33 -0
- package/src/domains/tier/formatters/list.ts +40 -0
- package/src/domains/tier/index.ts +17 -0
- package/src/domains/tier/mcp/index.ts +2 -0
- package/src/domains/tier/mcp/specs.ts +38 -0
- package/src/domains/tier/operations/index.ts +3 -0
- package/src/domains/tier/operations/list.test.ts +32 -0
- package/src/domains/tier/operations/list.ts +33 -0
- package/src/domains/token/commands/add-config.test.ts +68 -0
- package/src/domains/token/commands/add-config.ts +62 -0
- package/src/domains/token/commands/index.ts +5 -0
- package/src/domains/token/commands/list.test.ts +82 -0
- package/src/domains/token/commands/list.ts +45 -0
- package/src/domains/token/commands/lookup.test.ts +125 -0
- package/src/domains/token/commands/lookup.ts +121 -0
- package/src/domains/token/formatters/index.ts +4 -0
- package/src/domains/token/formatters/list.test.ts +37 -0
- package/src/domains/token/formatters/list.ts +37 -0
- package/src/domains/token/formatters/lookup.test.ts +61 -0
- package/src/domains/token/formatters/lookup.ts +72 -0
- package/src/domains/token/index.ts +32 -0
- package/src/domains/token/mcp/index.ts +2 -0
- package/src/domains/token/mcp/specs.ts +145 -0
- package/src/domains/token/operations/add-config.test.ts +68 -0
- package/src/domains/token/operations/add-config.ts +61 -0
- package/src/domains/token/operations/index.ts +7 -0
- package/src/domains/token/operations/list.test.ts +50 -0
- package/src/domains/token/operations/list.ts +52 -0
- package/src/domains/token/operations/lookup.test.ts +42 -0
- package/src/domains/token/operations/lookup.ts +66 -0
- package/src/domains/token/orchestration/index.ts +3 -0
- package/src/domains/token/orchestration/resolveTokenList.ts +17 -0
- package/src/domains/token/orchestration/resolveTokenLookup.ts +20 -0
- package/src/domains/token/orchestration/tokenEmptyError.ts +17 -0
- package/src/domains/token/types.ts +6 -0
- package/src/error/PragmaError.test.ts +121 -0
- package/src/error/PragmaError.ts +164 -0
- package/src/error/constants.ts +12 -0
- package/src/error/index.ts +4 -0
- package/src/error/types.ts +41 -0
- package/src/index.ts +141 -0
- package/src/mcp/createMcpServer.test.ts +41 -0
- package/src/mcp/createMcpServer.ts +53 -0
- package/src/mcp/error/buildRecovery.test.ts +37 -0
- package/src/mcp/error/buildRecovery.ts +17 -0
- package/src/mcp/error/index.ts +12 -0
- package/src/mcp/error/serializeError.test.ts +121 -0
- package/src/mcp/error/serializeError.ts +31 -0
- package/src/mcp/error/serializeErrorPayload.test.ts +38 -0
- package/src/mcp/error/serializeErrorPayload.ts +27 -0
- package/src/mcp/error/types.ts +51 -0
- package/src/mcp/index.ts +15 -0
- package/src/mcp/registerResources.test.ts +236 -0
- package/src/mcp/registerResources.ts +303 -0
- package/src/mcp/runMcpServer.test.ts +66 -0
- package/src/mcp/runMcpServer.ts +24 -0
- package/src/mcp/tools/index.ts +55 -0
- package/src/mcp/tools/registerFromSpec.ts +97 -0
- package/src/mcp/tools/registerTools.test.ts +1124 -0
- package/src/mcp/types.ts +62 -0
- package/src/mcp/utils/estimateTokens.test.ts +14 -0
- package/src/mcp/utils/estimateTokens.ts +9 -0
- package/src/mcp/utils/index.ts +11 -0
- package/src/mcp/utils/wrapTool.test.ts +108 -0
- package/src/mcp/utils/wrapTool.ts +81 -0
- package/src/package-manager/constants.ts +29 -0
- package/src/package-manager/detectInstallSource.test.ts +23 -0
- package/src/package-manager/detectInstallSource.ts +111 -0
- package/src/package-manager/detectLocalInstall.test.ts +16 -0
- package/src/package-manager/detectLocalInstall.ts +43 -0
- package/src/package-manager/detectPackageManager.test.ts +81 -0
- package/src/package-manager/detectPackageManager.ts +30 -0
- package/src/package-manager/index.ts +6 -0
- package/src/package-manager/types.ts +12 -0
- package/src/pipeline/collectCommands.test.ts +37 -0
- package/src/pipeline/collectCommands.ts +47 -0
- package/src/pipeline/constants.ts +14 -0
- package/src/pipeline/createProgram.test.ts +112 -0
- package/src/pipeline/createProgram.ts +70 -0
- package/src/pipeline/formatTerminal.test.ts +43 -0
- package/src/pipeline/formatTerminal.ts +53 -0
- package/src/pipeline/index.ts +19 -0
- package/src/pipeline/mapExitCode.test.ts +41 -0
- package/src/pipeline/mapExitCode.ts +12 -0
- package/src/pipeline/parseGlobalFlags.ts +21 -0
- package/src/pipeline/renderError.test.ts +151 -0
- package/src/pipeline/renderError.ts +114 -0
- package/src/pipeline/resolveCommandKind.test.ts +68 -0
- package/src/pipeline/resolveCommandKind.ts +71 -0
- package/src/pipeline/runCli.orchestration.test.ts +418 -0
- package/src/pipeline/runCli.test.ts +70 -0
- package/src/pipeline/runCli.ts +215 -0
- package/src/pipeline/types.ts +17 -0
- package/src/testing/cli.ts +43 -0
- package/src/testing/createTestMcpClient.ts +64 -0
- package/src/testing/dsFixtures.ts +506 -0
- package/src/testing/fixtures/canonical-config.json +4 -0
- package/src/testing/fixtures/canonical.ttl +437 -0
- package/src/testing/fixtures/filtered-config.json +4 -0
- package/src/testing/fixtures.ts +34 -0
- package/src/testing/helpers/assertParity.ts +28 -0
- package/src/testing/helpers/createTestMcpClient.ts +40 -0
- package/src/testing/helpers/createTestRuntime.ts +67 -0
- package/src/testing/index.ts +8 -0
- package/src/testing/integration/agent-session.test.ts +148 -0
- package/src/testing/integration/boot.test.ts +67 -0
- package/src/testing/integration/mcp-surface.test.ts +574 -0
- package/src/testing/integration/parity.test.ts +192 -0
- package/src/testing/store.ts +39 -0
- package/src/testing/types.ts +20 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { PragmaError } from "./PragmaError.js";
|
|
3
|
+
|
|
4
|
+
describe("PragmaError", () => {
|
|
5
|
+
describe("notFound", () => {
|
|
6
|
+
it("creates an ENTITY_NOT_FOUND error with entity info", () => {
|
|
7
|
+
const err = PragmaError.notFound("component", "Buton", {
|
|
8
|
+
suggestions: ["Button", "ButtonGroup"],
|
|
9
|
+
recovery: {
|
|
10
|
+
message: "List available components.",
|
|
11
|
+
cli: "pragma block list",
|
|
12
|
+
mcp: { tool: "block_list" },
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
expect(err).toBeInstanceOf(PragmaError);
|
|
17
|
+
expect(err.code).toBe("ENTITY_NOT_FOUND");
|
|
18
|
+
expect(err.message).toBe('component "Buton" not found.');
|
|
19
|
+
expect(err.entity).toEqual({ type: "component", name: "Buton" });
|
|
20
|
+
expect(err.suggestions).toEqual(["Button", "ButtonGroup"]);
|
|
21
|
+
expect(err.recovery).toEqual({
|
|
22
|
+
message: "List available components.",
|
|
23
|
+
cli: "pragma block list",
|
|
24
|
+
mcp: { tool: "block_list" },
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("defaults suggestions to empty array", () => {
|
|
29
|
+
const err = PragmaError.notFound("standard", "react/fold");
|
|
30
|
+
expect(err.suggestions).toEqual([]);
|
|
31
|
+
expect(err.recovery).toBeUndefined();
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe("emptyResults", () => {
|
|
36
|
+
it("creates an EMPTY_RESULTS error with filters", () => {
|
|
37
|
+
const err = PragmaError.emptyResults("component", {
|
|
38
|
+
filters: { tier: "apps/lxd", channel: "normal" },
|
|
39
|
+
recovery: {
|
|
40
|
+
message: "Widen the search to show all tiers.",
|
|
41
|
+
cli: "pragma block list --all-tiers",
|
|
42
|
+
mcp: { tool: "block_list", params: { allTiers: true } },
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
expect(err.code).toBe("EMPTY_RESULTS");
|
|
47
|
+
expect(err.message).toBe("No components found.");
|
|
48
|
+
expect(err.filters).toEqual({ tier: "apps/lxd", channel: "normal" });
|
|
49
|
+
expect(err.recovery).toEqual({
|
|
50
|
+
message: "Widen the search to show all tiers.",
|
|
51
|
+
cli: "pragma block list --all-tiers",
|
|
52
|
+
mcp: { tool: "block_list", params: { allTiers: true } },
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
describe("invalidInput", () => {
|
|
58
|
+
it("creates an INVALID_INPUT error with valid options", () => {
|
|
59
|
+
const err = PragmaError.invalidInput("channel", "aggressive", {
|
|
60
|
+
validOptions: ["normal", "experimental", "prerelease"],
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
expect(err.code).toBe("INVALID_INPUT");
|
|
64
|
+
expect(err.message).toBe('Invalid channel "aggressive".');
|
|
65
|
+
expect(err.validOptions).toEqual([
|
|
66
|
+
"normal",
|
|
67
|
+
"experimental",
|
|
68
|
+
"prerelease",
|
|
69
|
+
]);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
describe("storeError", () => {
|
|
74
|
+
it("creates a STORE_ERROR with reason and recovery", () => {
|
|
75
|
+
const err = PragmaError.storeError("WASM module failed to load", {
|
|
76
|
+
recovery: {
|
|
77
|
+
message: "Run pragma doctor to diagnose.",
|
|
78
|
+
cli: "pragma doctor",
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
expect(err.code).toBe("STORE_ERROR");
|
|
83
|
+
expect(err.message).toContain("WASM module failed to load");
|
|
84
|
+
expect(err.recovery).toEqual({
|
|
85
|
+
message: "Run pragma doctor to diagnose.",
|
|
86
|
+
cli: "pragma doctor",
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
describe("configError", () => {
|
|
92
|
+
it("creates a CONFIG_ERROR with valid options", () => {
|
|
93
|
+
const err = PragmaError.configError(
|
|
94
|
+
'Tier "apps/nonexistent" not found in ontology.',
|
|
95
|
+
{ validOptions: ["global", "apps", "apps/lxd"] },
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
expect(err.code).toBe("CONFIG_ERROR");
|
|
99
|
+
expect(err.message).toContain("apps/nonexistent");
|
|
100
|
+
expect(err.validOptions).toEqual(["global", "apps", "apps/lxd"]);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
describe("internalError", () => {
|
|
105
|
+
it("creates an INTERNAL_ERROR with recovery", () => {
|
|
106
|
+
const err = PragmaError.internalError("Unexpected null in query result");
|
|
107
|
+
|
|
108
|
+
expect(err.code).toBe("INTERNAL_ERROR");
|
|
109
|
+
expect(err.message).toContain("Unexpected null");
|
|
110
|
+
expect(err.recovery).toEqual({
|
|
111
|
+
message: "Please report this issue.",
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("is an instance of Error", () => {
|
|
117
|
+
const err = PragmaError.notFound("component", "Foo");
|
|
118
|
+
expect(err).toBeInstanceOf(Error);
|
|
119
|
+
expect(err.name).toBe("PragmaError");
|
|
120
|
+
});
|
|
121
|
+
});
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import type { ErrorCode, PragmaErrorData, Recovery } from "./types.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Structured error for all pragma domain operations.
|
|
5
|
+
*
|
|
6
|
+
* Carries a machine-readable {@link ErrorCode}, optional recovery hints,
|
|
7
|
+
* and contextual metadata (suggestions, valid options, active filters)
|
|
8
|
+
* so that CLI and MCP adapters can render actionable diagnostics.
|
|
9
|
+
*/
|
|
10
|
+
class PragmaError extends Error {
|
|
11
|
+
/** Machine-readable error classification. */
|
|
12
|
+
readonly code: ErrorCode;
|
|
13
|
+
/** Entity that triggered the error (type + name), if applicable. */
|
|
14
|
+
readonly entity: PragmaErrorData["entity"];
|
|
15
|
+
/** Fuzzy-matched alternative names the user may have intended. */
|
|
16
|
+
readonly suggestions: string[];
|
|
17
|
+
/** Structured recovery hint with optional CLI command or MCP tool call. */
|
|
18
|
+
readonly recovery: Recovery | undefined;
|
|
19
|
+
/** Active filters at the time of the error, for diagnostic context. */
|
|
20
|
+
readonly filters: Record<string, string> | undefined;
|
|
21
|
+
/** Enumerated valid options when input was rejected. */
|
|
22
|
+
readonly validOptions: string[] | undefined;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @param data - Structured error payload.
|
|
26
|
+
*/
|
|
27
|
+
constructor(data: PragmaErrorData) {
|
|
28
|
+
super(data.message);
|
|
29
|
+
this.name = "PragmaError";
|
|
30
|
+
this.code = data.code;
|
|
31
|
+
this.entity = data.entity;
|
|
32
|
+
this.suggestions = data.suggestions ?? [];
|
|
33
|
+
this.recovery = data.recovery;
|
|
34
|
+
this.filters = data.filters;
|
|
35
|
+
this.validOptions = data.validOptions;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Factory: entity not found by name.
|
|
40
|
+
*
|
|
41
|
+
* @param entityType - Kind of entity (e.g., `"block"`, `"token"`).
|
|
42
|
+
* @param entityName - Name the user supplied.
|
|
43
|
+
* @param opts - Optional suggestions and recovery hint.
|
|
44
|
+
* @returns PragmaError with code `ENTITY_NOT_FOUND`.
|
|
45
|
+
*/
|
|
46
|
+
static notFound(
|
|
47
|
+
entityType: string,
|
|
48
|
+
entityName: string,
|
|
49
|
+
opts: {
|
|
50
|
+
suggestions?: string[];
|
|
51
|
+
recovery?: Recovery;
|
|
52
|
+
} = {},
|
|
53
|
+
): PragmaError {
|
|
54
|
+
return new PragmaError({
|
|
55
|
+
code: "ENTITY_NOT_FOUND",
|
|
56
|
+
message: `${entityType} "${entityName}" not found.`,
|
|
57
|
+
entity: { type: entityType, name: entityName },
|
|
58
|
+
suggestions: opts.suggestions,
|
|
59
|
+
recovery: opts.recovery,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Factory: query returned zero results.
|
|
65
|
+
*
|
|
66
|
+
* @param entityType - Kind of entity being listed.
|
|
67
|
+
* @param opts - Optional active filters and recovery hint.
|
|
68
|
+
* @returns PragmaError with code `EMPTY_RESULTS`.
|
|
69
|
+
*/
|
|
70
|
+
static emptyResults(
|
|
71
|
+
entityType: string,
|
|
72
|
+
opts: {
|
|
73
|
+
filters?: Record<string, string>;
|
|
74
|
+
recovery?: Recovery;
|
|
75
|
+
} = {},
|
|
76
|
+
): PragmaError {
|
|
77
|
+
return new PragmaError({
|
|
78
|
+
code: "EMPTY_RESULTS",
|
|
79
|
+
message: `No ${entityType}s found.`,
|
|
80
|
+
filters: opts.filters,
|
|
81
|
+
recovery: opts.recovery,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Factory: user-supplied input is invalid.
|
|
87
|
+
*
|
|
88
|
+
* @param field - Name of the invalid field or argument.
|
|
89
|
+
* @param value - The rejected value.
|
|
90
|
+
* @param opts - Optional valid alternatives and recovery hint.
|
|
91
|
+
* @returns PragmaError with code `INVALID_INPUT`.
|
|
92
|
+
*/
|
|
93
|
+
static invalidInput(
|
|
94
|
+
field: string,
|
|
95
|
+
value: string,
|
|
96
|
+
opts: {
|
|
97
|
+
validOptions?: string[];
|
|
98
|
+
recovery?: Recovery;
|
|
99
|
+
} = {},
|
|
100
|
+
): PragmaError {
|
|
101
|
+
return new PragmaError({
|
|
102
|
+
code: "INVALID_INPUT",
|
|
103
|
+
message: `Invalid ${field} "${value}".`,
|
|
104
|
+
validOptions: opts.validOptions,
|
|
105
|
+
recovery: opts.recovery,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Factory: ke store failed to initialize or query.
|
|
111
|
+
*
|
|
112
|
+
* @param reason - Human-readable failure description.
|
|
113
|
+
* @param opts - Optional recovery hint.
|
|
114
|
+
* @returns PragmaError with code `STORE_ERROR`.
|
|
115
|
+
*/
|
|
116
|
+
static storeError(
|
|
117
|
+
reason: string,
|
|
118
|
+
opts: { recovery?: Recovery } = {},
|
|
119
|
+
): PragmaError {
|
|
120
|
+
return new PragmaError({
|
|
121
|
+
code: "STORE_ERROR",
|
|
122
|
+
message: `Failed to initialize store. ${reason}`,
|
|
123
|
+
recovery: opts.recovery,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Factory: configuration file is invalid or contains bad values.
|
|
129
|
+
*
|
|
130
|
+
* @param reason - Human-readable description of the config problem.
|
|
131
|
+
* @param opts - Optional valid alternatives and recovery hint.
|
|
132
|
+
* @returns PragmaError with code `CONFIG_ERROR`.
|
|
133
|
+
*/
|
|
134
|
+
static configError(
|
|
135
|
+
reason: string,
|
|
136
|
+
opts: {
|
|
137
|
+
validOptions?: string[];
|
|
138
|
+
recovery?: Recovery;
|
|
139
|
+
} = {},
|
|
140
|
+
): PragmaError {
|
|
141
|
+
return new PragmaError({
|
|
142
|
+
code: "CONFIG_ERROR",
|
|
143
|
+
message: reason,
|
|
144
|
+
validOptions: opts.validOptions,
|
|
145
|
+
recovery: opts.recovery,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Factory: unexpected internal failure (bug).
|
|
151
|
+
*
|
|
152
|
+
* @param reason - Description of the internal error.
|
|
153
|
+
* @returns PragmaError with code `INTERNAL_ERROR` and a "please report" recovery.
|
|
154
|
+
*/
|
|
155
|
+
static internalError(reason: string): PragmaError {
|
|
156
|
+
return new PragmaError({
|
|
157
|
+
code: "INTERNAL_ERROR",
|
|
158
|
+
message: `Internal error: ${reason}`,
|
|
159
|
+
recovery: { message: "Please report this issue." },
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export { PragmaError };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** All recognized pragma error codes as a const tuple. */
|
|
2
|
+
const ERROR_CODES = [
|
|
3
|
+
"ENTITY_NOT_FOUND",
|
|
4
|
+
"EMPTY_RESULTS",
|
|
5
|
+
"INVALID_INPUT",
|
|
6
|
+
"AMBIGUOUS_INPUT",
|
|
7
|
+
"STORE_ERROR",
|
|
8
|
+
"CONFIG_ERROR",
|
|
9
|
+
"INTERNAL_ERROR",
|
|
10
|
+
] as const;
|
|
11
|
+
|
|
12
|
+
export { ERROR_CODES };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error type definitions for the pragma error system.
|
|
3
|
+
*
|
|
4
|
+
* Separates the data shapes from the PragmaError class to allow
|
|
5
|
+
* lightweight imports by consumers that only need type information.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { ERROR_CODES } from "./constants.js";
|
|
9
|
+
|
|
10
|
+
/** Union of all recognized error code literals. */
|
|
11
|
+
type ErrorCode = (typeof ERROR_CODES)[number];
|
|
12
|
+
|
|
13
|
+
/** Structured recovery hint attached to a PragmaError. */
|
|
14
|
+
interface Recovery {
|
|
15
|
+
/** Human-readable recovery guidance. */
|
|
16
|
+
message: string;
|
|
17
|
+
/** CLI command the user can run to recover. */
|
|
18
|
+
cli?: string;
|
|
19
|
+
/** MCP tool invocation an LLM agent can call to recover. */
|
|
20
|
+
mcp?: { tool: string; params?: Record<string, unknown> };
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Raw data payload used to construct a PragmaError. */
|
|
24
|
+
interface PragmaErrorData {
|
|
25
|
+
/** Machine-readable error classification. */
|
|
26
|
+
code: ErrorCode;
|
|
27
|
+
/** Human-readable error message. */
|
|
28
|
+
message: string;
|
|
29
|
+
/** Entity that triggered the error, if applicable. */
|
|
30
|
+
entity?: { type: string; name: string };
|
|
31
|
+
/** Fuzzy-matched alternative names. */
|
|
32
|
+
suggestions?: string[];
|
|
33
|
+
/** Recovery hint for CLI and MCP adapters. */
|
|
34
|
+
recovery?: Recovery;
|
|
35
|
+
/** Active filters at the time of the error. */
|
|
36
|
+
filters?: Record<string, string>;
|
|
37
|
+
/** Enumerated valid options when input was rejected. */
|
|
38
|
+
validOptions?: string[];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export type { ErrorCode, PragmaErrorData, Recovery };
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public API surface for `@canonical/pragma-cli`.
|
|
3
|
+
*
|
|
4
|
+
* Exports types, boot functions, domain operations, and the MCP adapter.
|
|
5
|
+
* Internal formatters, command builders, and infrastructure are not exported.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// — Config & Error ————————————————————————————————————————————————————————————
|
|
11
|
+
|
|
12
|
+
export type { PragmaConfig } from "./config/index.js";
|
|
13
|
+
export { readConfig } from "./config/index.js";
|
|
14
|
+
export type { ErrorCode, PragmaErrorData, Recovery } from "./error/index.js";
|
|
15
|
+
export { PragmaError } from "./error/index.js";
|
|
16
|
+
|
|
17
|
+
// — Runtime ———————————————————————————————————————————————————————————————————
|
|
18
|
+
|
|
19
|
+
export type { PragmaRuntime } from "./domains/shared/runtime.js";
|
|
20
|
+
export { bootPragma } from "./domains/shared/runtime.js";
|
|
21
|
+
|
|
22
|
+
// — Shared Types —————————————————————————————————————————————————————————————
|
|
23
|
+
|
|
24
|
+
export type {
|
|
25
|
+
ColumnDef,
|
|
26
|
+
EntityDisplayConfig,
|
|
27
|
+
ListContract,
|
|
28
|
+
ListParams,
|
|
29
|
+
ListResult,
|
|
30
|
+
LookupContract,
|
|
31
|
+
LookupParams,
|
|
32
|
+
LookupResult,
|
|
33
|
+
MutateContract,
|
|
34
|
+
SectionDef,
|
|
35
|
+
SectionKind,
|
|
36
|
+
ShowContract,
|
|
37
|
+
} from "./domains/shared/contracts.js";
|
|
38
|
+
|
|
39
|
+
export type {
|
|
40
|
+
AnatomyNode,
|
|
41
|
+
AnatomyTree,
|
|
42
|
+
BatchResult,
|
|
43
|
+
BlockDetailed,
|
|
44
|
+
BlockDigest,
|
|
45
|
+
BlockSummary,
|
|
46
|
+
CategorySummary,
|
|
47
|
+
CodeBlock,
|
|
48
|
+
Disclosure,
|
|
49
|
+
FilterConfig,
|
|
50
|
+
InspectResult,
|
|
51
|
+
ModifierFamily,
|
|
52
|
+
OntologyClass,
|
|
53
|
+
OntologyDetailed,
|
|
54
|
+
OntologyProperty,
|
|
55
|
+
OntologySummary,
|
|
56
|
+
PredicateGroup,
|
|
57
|
+
StandardDetailed,
|
|
58
|
+
StandardListFilters,
|
|
59
|
+
StandardRef,
|
|
60
|
+
StandardSummary,
|
|
61
|
+
TierEntry,
|
|
62
|
+
TokenDetailed,
|
|
63
|
+
TokenRef,
|
|
64
|
+
TokenSummary,
|
|
65
|
+
} from "./domains/shared/types.js";
|
|
66
|
+
|
|
67
|
+
// — Domain Operations —————————————————————————————————————————————————————————
|
|
68
|
+
|
|
69
|
+
export {
|
|
70
|
+
buildBlockFilters,
|
|
71
|
+
listBlocks,
|
|
72
|
+
lookupBlock,
|
|
73
|
+
resolveBlockList,
|
|
74
|
+
resolveBlockLookup,
|
|
75
|
+
} from "./domains/block/index.js";
|
|
76
|
+
export { runChecks } from "./domains/doctor/operations/index.js";
|
|
77
|
+
export {
|
|
78
|
+
executeQuery,
|
|
79
|
+
inspectUri,
|
|
80
|
+
} from "./domains/graph/operations/index.js";
|
|
81
|
+
export {
|
|
82
|
+
listModifiers,
|
|
83
|
+
lookupModifier,
|
|
84
|
+
modifierEmptyError,
|
|
85
|
+
resolveModifierList,
|
|
86
|
+
resolveModifierLookup,
|
|
87
|
+
} from "./domains/modifier/index.js";
|
|
88
|
+
export {
|
|
89
|
+
listOntologies,
|
|
90
|
+
showOntology,
|
|
91
|
+
showOntologyRaw,
|
|
92
|
+
} from "./domains/ontology/operations/index.js";
|
|
93
|
+
export {
|
|
94
|
+
discoverSkills,
|
|
95
|
+
listSkills,
|
|
96
|
+
} from "./domains/skill/operations/index.js";
|
|
97
|
+
export {
|
|
98
|
+
listCategories,
|
|
99
|
+
listStandards,
|
|
100
|
+
lookupStandard,
|
|
101
|
+
resolveStandardList,
|
|
102
|
+
resolveStandardLookup,
|
|
103
|
+
} from "./domains/standard/index.js";
|
|
104
|
+
export { listTiers } from "./domains/tier/operations/index.js";
|
|
105
|
+
export {
|
|
106
|
+
listTokens,
|
|
107
|
+
lookupToken,
|
|
108
|
+
resolveTokenList,
|
|
109
|
+
resolveTokenLookup,
|
|
110
|
+
tokenEmptyError,
|
|
111
|
+
} from "./domains/token/index.js";
|
|
112
|
+
|
|
113
|
+
// — Domain Types ——————————————————————————————————————————————————————————————
|
|
114
|
+
|
|
115
|
+
export type { ConfigShowData } from "./domains/config/operations/index.js";
|
|
116
|
+
export type {
|
|
117
|
+
CheckContext,
|
|
118
|
+
CheckResult,
|
|
119
|
+
DoctorData,
|
|
120
|
+
} from "./domains/doctor/operations/index.js";
|
|
121
|
+
export type {
|
|
122
|
+
InfoData,
|
|
123
|
+
RegistryCheckResult,
|
|
124
|
+
StoreSummary,
|
|
125
|
+
UpgradeData,
|
|
126
|
+
} from "./domains/info/types.js";
|
|
127
|
+
export type { SkillListResult } from "./domains/skill/operations/index.js";
|
|
128
|
+
export type {
|
|
129
|
+
DiscoveredSkill,
|
|
130
|
+
SkillFrontmatter,
|
|
131
|
+
SkillSource,
|
|
132
|
+
} from "./domains/skill/types.js";
|
|
133
|
+
|
|
134
|
+
// — MCP Adapter ——————————————————————————————————————————————————————————————
|
|
135
|
+
|
|
136
|
+
export {
|
|
137
|
+
createMcpServer,
|
|
138
|
+
createMcpServerFromRuntime,
|
|
139
|
+
} from "./mcp/index.js";
|
|
140
|
+
export { default as registerAllTools } from "./mcp/tools/index.js";
|
|
141
|
+
export type { McpErrorPayload, McpRecovery } from "./mcp/types.js";
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
3
|
+
import { createTestMcpClient } from "#testing";
|
|
4
|
+
|
|
5
|
+
let client: Client;
|
|
6
|
+
let cleanup: () => Promise<void>;
|
|
7
|
+
|
|
8
|
+
beforeAll(async () => {
|
|
9
|
+
const result = await createTestMcpClient();
|
|
10
|
+
client = result.client;
|
|
11
|
+
cleanup = result.cleanup;
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
afterAll(async () => {
|
|
15
|
+
await cleanup();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
describe("createMcpServer", () => {
|
|
19
|
+
it("creates a server with registered tools", async () => {
|
|
20
|
+
const { tools } = await client.listTools();
|
|
21
|
+
expect(tools.length).toBeGreaterThan(0);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("all tools have input schemas", async () => {
|
|
25
|
+
const { tools } = await client.listTools();
|
|
26
|
+
for (const tool of tools) {
|
|
27
|
+
expect(tool.inputSchema).toBeDefined();
|
|
28
|
+
expect(tool.inputSchema.type).toBe("object");
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("creates a server with registered resources", async () => {
|
|
33
|
+
const { resources } = await client.listResources();
|
|
34
|
+
expect(resources.length).toBeGreaterThan(0);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("creates a server with registered resource templates", async () => {
|
|
38
|
+
const { resourceTemplates } = await client.listResourceTemplates();
|
|
39
|
+
expect(resourceTemplates.length).toBeGreaterThan(0);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP server factory.
|
|
3
|
+
*
|
|
4
|
+
* Groups two construction paths for the MCP server: full boot (reads
|
|
5
|
+
* config and ke store) and runtime-injection (for tests that own the
|
|
6
|
+
* runtime lifecycle). Both paths register the same set of tools and
|
|
7
|
+
* resources.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { SourceSpec } from "@canonical/ke";
|
|
11
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
12
|
+
import { VERSION } from "../constants.js";
|
|
13
|
+
import type { PragmaRuntime } from "../domains/shared/runtime.js";
|
|
14
|
+
import { bootPragma } from "../domains/shared/runtime.js";
|
|
15
|
+
import registerResources from "./registerResources.js";
|
|
16
|
+
import registerAllTools from "./tools/index.js";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Create a fully configured MCP server with its own runtime.
|
|
20
|
+
*
|
|
21
|
+
* The caller owns the returned `dispose` function and must call it when
|
|
22
|
+
* the transport disconnects or the process exits.
|
|
23
|
+
*
|
|
24
|
+
* @param options - Optional overrides for working directory and TTL sources.
|
|
25
|
+
* @returns The MCP server and a dispose callback to release the runtime.
|
|
26
|
+
*
|
|
27
|
+
* @note Impure
|
|
28
|
+
*/
|
|
29
|
+
export async function createMcpServer(options?: {
|
|
30
|
+
cwd?: string;
|
|
31
|
+
sources?: SourceSpec[];
|
|
32
|
+
}): Promise<{ server: McpServer; dispose: () => void }> {
|
|
33
|
+
const runtime = await bootPragma(options);
|
|
34
|
+
const { server } = createMcpServerFromRuntime(runtime);
|
|
35
|
+
return { server, dispose: () => runtime.dispose() };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Create an MCP server from an existing runtime (no boot).
|
|
40
|
+
*
|
|
41
|
+
* Used in testing where the test controls the runtime lifecycle.
|
|
42
|
+
*
|
|
43
|
+
* @param runtime - An already-booted pragma runtime.
|
|
44
|
+
* @returns The MCP server instance.
|
|
45
|
+
*/
|
|
46
|
+
export function createMcpServerFromRuntime(runtime: PragmaRuntime): {
|
|
47
|
+
server: McpServer;
|
|
48
|
+
} {
|
|
49
|
+
const server = new McpServer({ name: "pragma", version: VERSION });
|
|
50
|
+
registerAllTools(server, runtime);
|
|
51
|
+
registerResources(server, runtime);
|
|
52
|
+
return { server };
|
|
53
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import buildRecovery from "./buildRecovery.js";
|
|
3
|
+
|
|
4
|
+
describe("buildRecovery", () => {
|
|
5
|
+
it("returns undefined for undefined input", () => {
|
|
6
|
+
expect(buildRecovery(undefined)).toBeUndefined();
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
it("returns undefined when recovery has no mcp field", () => {
|
|
10
|
+
expect(
|
|
11
|
+
buildRecovery({
|
|
12
|
+
message: "Please report this issue.",
|
|
13
|
+
}),
|
|
14
|
+
).toBeUndefined();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("extracts mcp recovery object", () => {
|
|
18
|
+
const result = buildRecovery({
|
|
19
|
+
message: "List available tokens.",
|
|
20
|
+
cli: "pragma token list",
|
|
21
|
+
mcp: { tool: "token_list" },
|
|
22
|
+
});
|
|
23
|
+
expect(result).toEqual({ tool: "token_list" });
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("extracts mcp recovery with params", () => {
|
|
27
|
+
const result = buildRecovery({
|
|
28
|
+
message: "Widen the search.",
|
|
29
|
+
cli: "pragma block list --all-tiers",
|
|
30
|
+
mcp: { tool: "block_list", params: { allTiers: true } },
|
|
31
|
+
});
|
|
32
|
+
expect(result).toEqual({
|
|
33
|
+
tool: "block_list",
|
|
34
|
+
params: { allTiers: true },
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Recovery } from "#error";
|
|
2
|
+
import type { McpRecovery } from "./types.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Build an {@link McpRecovery} object from the structured Recovery type.
|
|
6
|
+
*
|
|
7
|
+
* Extracts `recovery.mcp` directly — no regex parsing needed.
|
|
8
|
+
*
|
|
9
|
+
* @param recovery - The structured recovery attached to a PragmaError, if any.
|
|
10
|
+
* @returns The MCP recovery hint, or `undefined` when no MCP path exists.
|
|
11
|
+
*/
|
|
12
|
+
export default function buildRecovery(
|
|
13
|
+
recovery: Recovery | undefined,
|
|
14
|
+
): McpRecovery | undefined {
|
|
15
|
+
if (!recovery?.mcp) return undefined;
|
|
16
|
+
return recovery.mcp;
|
|
17
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP error serialization pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports functions that transform PragmaError instances into
|
|
5
|
+
* MCP-compatible error payloads and tool responses.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export { default as buildRecovery } from "./buildRecovery.js";
|
|
11
|
+
export { default as serializeError } from "./serializeError.js";
|
|
12
|
+
export { default as serializeErrorPayload } from "./serializeErrorPayload.js";
|