@canonical/pragma-cli 0.29.0 → 0.31.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 +128 -47
- package/dist/pragma +0 -0
- package/package.json +15 -13
- package/src/completions/constants.ts +7 -0
- package/src/completions/handleQuery.test.ts +32 -0
- package/src/completions/handleQuery.ts +20 -1
- package/src/completions/queryCompletions.test.ts +5 -0
- package/src/completions/queryCompletions.ts +17 -3
- package/src/completions/querySocket.test.ts +31 -0
- package/src/completions/querySocket.ts +36 -9
- package/src/config/defaultConfig.test.ts +33 -0
- package/src/config/defaultConfig.ts +59 -0
- package/src/config/defaults.json +17 -0
- package/src/config/findProjectConfigPath.test.ts +53 -0
- package/src/config/findProjectConfigPath.ts +36 -0
- package/src/config/index.ts +17 -2
- package/src/config/mergeConfigFileUpdate.ts +58 -0
- package/src/config/parseConfigValues.ts +217 -0
- package/src/config/readConfig.test.ts +104 -13
- package/src/config/readConfig.ts +12 -153
- package/src/config/readConfigLayers.test.ts +109 -0
- package/src/config/readConfigLayers.ts +118 -0
- package/src/config/resolveGlobalConfigPath.ts +13 -0
- package/src/config/resolveWriteConfigPath.test.ts +53 -0
- package/src/config/resolveWriteConfigPath.ts +31 -0
- package/src/config/types.ts +83 -1
- package/src/config/writeConfig.ts +25 -55
- package/src/constants.ts +3 -1
- package/src/domains/block/commands/list.ts +5 -90
- package/src/domains/block/commands/lookup.ts +8 -167
- package/src/domains/block/commands/sample.ts +2 -1
- package/src/domains/block/formatters/list.test.ts +3 -3
- package/src/domains/block/formatters/lookup.test.ts +5 -5
- package/src/domains/block/mcp/specs.ts +16 -196
- package/src/domains/block/orchestration/enrichBlocks.ts +6 -3
- package/src/domains/block/orchestration/resolveBlockLookup.ts +2 -1
- package/src/domains/block/stories.test.ts +28 -0
- package/src/domains/block/stories.ts +260 -0
- package/src/domains/config/commands/channel.test.ts +30 -3
- package/src/domains/config/commands/channel.ts +25 -8
- package/src/domains/config/commands/configScope.ts +46 -0
- package/src/domains/config/commands/framework.test.ts +32 -1
- package/src/domains/config/commands/framework.ts +26 -8
- package/src/domains/config/commands/show.ts +5 -45
- package/src/domains/config/commands/tier.test.ts +20 -2
- package/src/domains/config/commands/tier.ts +25 -8
- package/src/domains/config/commands/trace.test.ts +19 -2
- package/src/domains/config/commands/trace.ts +6 -3
- package/src/domains/config/formatters/channel.test.ts +20 -6
- package/src/domains/config/formatters/channel.ts +14 -11
- package/src/domains/config/formatters/framework.ts +14 -11
- package/src/domains/config/formatters/show.test.ts +27 -0
- package/src/domains/config/formatters/show.ts +27 -4
- package/src/domains/config/formatters/tier.test.ts +26 -10
- package/src/domains/config/formatters/tier.ts +19 -11
- package/src/domains/config/formatters/trace.ts +7 -7
- package/src/domains/config/mcp/specs.ts +33 -53
- package/src/domains/config/operations/show.test.ts +18 -0
- package/src/domains/config/operations/show.ts +7 -1
- package/src/domains/config/operations/types.ts +7 -0
- package/src/domains/config/operations/validateTier.test.ts +9 -0
- package/src/domains/config/operations/validateTier.ts +10 -2
- package/src/domains/config/stories.ts +42 -0
- package/src/domains/config/tasks/index.ts +1 -0
- package/src/domains/config/tasks/setChannel.ts +13 -28
- package/src/domains/config/tasks/setFramework.ts +11 -30
- package/src/domains/config/tasks/setTier.ts +10 -29
- package/src/domains/config/tasks/setTrace.ts +10 -28
- package/src/domains/config/tasks/writeConfigField.ts +41 -0
- package/src/domains/create/generatorPack/bundled.ts +49 -0
- package/src/domains/create/generatorPack/compileGeneratorPack.test.ts +159 -0
- package/src/domains/create/generatorPack/compileGeneratorPack.ts +312 -0
- package/src/domains/create/index.ts +13 -7
- package/src/domains/create/mcp/specs.ts +6 -161
- package/src/domains/create/renderGeneratorUi.test.ts +103 -0
- package/src/domains/create/renderGeneratorUi.ts +65 -0
- package/src/domains/doctor/formatters/doctor.test.ts +50 -2
- package/src/domains/doctor/formatters/doctor.ts +90 -38
- package/src/domains/doctor/operations/checks/checkConfigFile.ts +19 -5
- package/src/domains/doctor/operations/checks/checkMcpCommands.ts +133 -0
- package/src/domains/doctor/operations/checks/checkMcpConfigured.ts +1 -1
- package/src/domains/doctor/operations/checks/checkPackageRefs.ts +32 -26
- package/src/domains/doctor/operations/checks/checkSkillsSymlinked.ts +1 -1
- package/src/domains/doctor/operations/checks/index.ts +1 -0
- package/src/domains/doctor/operations/checks.test.ts +160 -7
- package/src/domains/doctor/operations/runChecks.test.ts +15 -6
- package/src/domains/doctor/operations/runChecks.ts +2 -0
- package/src/domains/doctor/operations/types.ts +23 -1
- package/src/domains/graph/commands/inspect.test.ts +2 -2
- package/src/domains/graph/commands/query.test.ts +5 -3
- package/src/domains/graph/formatters/inspect.ts +7 -7
- package/src/domains/graph/formatters/query.test.ts +87 -0
- package/src/domains/graph/formatters/query.ts +42 -5
- package/src/domains/graph/helpers/resolveUri.test.ts +50 -0
- package/src/domains/graph/helpers/resolveUri.ts +28 -21
- package/src/domains/graph/operations/inspectUri.test.ts +5 -5
- package/src/domains/graphql/commands/build.test.ts +5 -3
- package/src/domains/graphql/commands/build.ts +8 -16
- package/src/domains/graphql/commands/check.test.ts +5 -3
- package/src/domains/graphql/commands/check.ts +7 -13
- package/src/domains/graphql/commands/index.ts +1 -0
- package/src/domains/graphql/commands/serve.test.ts +46 -0
- package/src/domains/graphql/commands/serve.ts +141 -0
- package/src/domains/graphql/constants.ts +10 -0
- package/src/domains/graphql/helpers/gatherSources.test.ts +92 -0
- package/src/domains/graphql/helpers/gatherSources.ts +58 -0
- package/src/domains/graphql/helpers/index.ts +2 -0
- package/src/domains/graphql/helpers/parsePrefixes.test.ts +3 -3
- package/src/domains/graphql/helpers/parsePrefixes.ts +3 -3
- package/src/domains/graphql/helpers/resolveSourceFiles.test.ts +9 -0
- package/src/domains/graphql/helpers/resolveSourceFiles.ts +24 -3
- package/src/domains/graphql/helpers/routeGraphql.test.ts +43 -0
- package/src/domains/graphql/helpers/routeGraphql.ts +28 -0
- package/src/domains/graphql/index.ts +9 -6
- package/src/domains/graphql/operations/compileSchema.test.ts +23 -47
- package/src/domains/graphql/operations/compileSchema.ts +23 -25
- package/src/domains/graphql/operations/createSchemaServer.test.ts +50 -0
- package/src/domains/graphql/operations/createSchemaServer.ts +75 -0
- package/src/domains/graphql/operations/ensureSchemaArtifact.test.ts +167 -0
- package/src/domains/graphql/operations/ensureSchemaArtifact.ts +178 -0
- package/src/domains/graphql/operations/index.ts +10 -0
- package/src/domains/info/formatters/upgrade.test.ts +7 -4
- package/src/domains/info/formatters/upgrade.ts +3 -1
- package/src/domains/info/operations/collectEntityCounts.test.ts +156 -0
- package/src/domains/info/operations/collectEntityCounts.ts +123 -0
- package/src/domains/info/operations/collectInfo.test.ts +14 -3
- package/src/domains/info/operations/collectInfo.ts +12 -15
- package/src/domains/info/operations/index.ts +1 -0
- package/src/domains/info/types.ts +13 -0
- package/src/domains/llm/capabilities.test.ts +24 -4
- package/src/domains/llm/commands/capabilities.ts +12 -3
- package/src/domains/llm/commands/llm.ts +5 -1
- package/src/domains/llm/data/commandReference.ts +20 -11
- package/src/domains/llm/data/decisionTrees.ts +10 -5
- package/src/domains/llm/data/toolCatalog.ts +55 -18
- package/src/domains/llm/formatters/orientation.ts +5 -1
- package/src/domains/llm/llmCommand.test.ts +11 -3
- package/src/domains/llm/mcp/specs.ts +3 -4
- package/src/domains/llm/operations/collectContext.test.ts +64 -0
- package/src/domains/llm/operations/collectContext.ts +7 -17
- package/src/domains/modifier/commands/list.ts +5 -38
- package/src/domains/modifier/commands/lookup.ts +8 -79
- package/src/domains/modifier/commands/sample.ts +2 -1
- package/src/domains/modifier/mcp/specs.ts +15 -94
- package/src/domains/modifier/operations/lookup.ts +5 -3
- package/src/domains/modifier/orchestration/resolveModifierLookup.ts +2 -1
- package/src/domains/modifier/stories.test.ts +20 -0
- package/src/domains/modifier/stories.ts +86 -0
- package/src/domains/ontology/commands/list.test.ts +5 -3
- package/src/domains/ontology/commands/list.ts +5 -58
- package/src/domains/ontology/commands/show.test.ts +85 -9
- package/src/domains/ontology/commands/show.ts +6 -58
- package/src/domains/ontology/formatters/index.ts +1 -0
- package/src/domains/ontology/formatters/list.ts +37 -12
- package/src/domains/ontology/formatters/show.ts +361 -64
- package/src/domains/ontology/helpers/buildClassTree.ts +89 -0
- package/src/domains/ontology/helpers/completeClassNames.ts +43 -0
- package/src/domains/ontology/helpers/expandOntologyIris.ts +79 -0
- package/src/domains/ontology/helpers/index.ts +14 -0
- package/src/domains/ontology/helpers/queryClasses.ts +32 -16
- package/src/domains/ontology/helpers/queryProperties.ts +39 -6
- package/src/domains/ontology/helpers/queryTboxFacts.ts +160 -0
- package/src/domains/ontology/mcp/specs.ts +7 -84
- package/src/domains/ontology/operations/listOntologies.test.ts +80 -3
- package/src/domains/ontology/operations/listOntologies.ts +126 -30
- package/src/domains/ontology/operations/showOntology.test.ts +131 -12
- package/src/domains/ontology/operations/showOntology.ts +289 -7
- package/src/domains/ontology/operations/showOntologyRaw.test.ts +4 -2
- package/src/domains/ontology/stories.test.ts +36 -0
- package/src/domains/ontology/stories.ts +153 -0
- package/src/domains/refs/operations/updateRefs.ts +2 -38
- package/src/domains/setup/commands/index.ts +1 -0
- package/src/domains/setup/commands/setup.ts +70 -0
- package/src/domains/setup/commands/skills.test.ts +6 -2
- package/src/domains/setup/commands/skills.ts +6 -2
- package/src/domains/setup/helpers/runSetupTask.test.ts +148 -150
- package/src/domains/setup/helpers/runSetupTask.ts +62 -70
- package/src/domains/setup/index.ts +7 -3
- package/src/domains/setup/operations/setupLsp.test.ts +3 -2
- package/src/domains/setup/operations/setupLsp.ts +7 -2
- package/src/domains/setup/operations/setupMcp.test.ts +6 -1
- package/src/domains/shared/bootStore.bareCore.test.ts +63 -0
- package/src/domains/shared/bootStore.test.ts +82 -0
- package/src/domains/shared/bootStore.ts +57 -18
- package/src/domains/shared/compactUri.test.ts +11 -0
- package/src/domains/shared/compactUri.ts +10 -5
- package/src/domains/shared/context.ts +2 -2
- package/src/domains/shared/contracts.ts +11 -0
- package/src/domains/shared/createInteractivePromptSession.test.ts +439 -0
- package/src/domains/shared/createInteractivePromptSession.ts +236 -0
- package/src/domains/shared/emptyErrorRecovery.test.ts +23 -26
- package/src/domains/shared/extractLocalName.test.ts +3 -3
- package/src/domains/shared/formatters.ts +23 -2
- package/src/domains/shared/listTiers.ts +40 -0
- package/src/domains/shared/loaders/bundledLoader.test.ts +248 -0
- package/src/domains/shared/loaders/bundledLoader.ts +158 -12
- package/src/domains/shared/loaders/gitLoader.ts +1 -2
- package/src/domains/shared/loaders/index.ts +4 -1
- package/src/domains/shared/loaders/localLoader.ts +2 -4
- package/src/domains/shared/loaders/readPackageDir.test.ts +58 -0
- package/src/domains/shared/loaders/readPackageDir.ts +82 -9
- package/src/domains/shared/loaders/storyAssetsPlugin.test.ts +84 -0
- package/src/domains/shared/loaders/storyAssetsPlugin.ts +46 -0
- package/src/domains/shared/lookupMany.test.ts +135 -0
- package/src/domains/shared/lookupMany.ts +50 -2
- package/src/domains/shared/mergeAndParseRefs.test.ts +89 -0
- package/src/domains/shared/mergeAndParseRefs.ts +44 -0
- package/src/domains/shared/namespaces.ts +13 -5
- package/src/domains/shared/packages.ts +10 -17
- package/src/domains/shared/parseSampleCount.test.ts +47 -0
- package/src/domains/shared/parseSampleCount.ts +45 -0
- package/src/domains/shared/prefixes.test.ts +211 -0
- package/src/domains/shared/prefixes.ts +182 -15
- package/src/domains/shared/renderers.ts +5 -5
- package/src/domains/shared/resolveConfiguredGraphs.test.ts +27 -0
- package/src/domains/shared/resolveConfiguredGraphs.ts +41 -0
- package/src/domains/shared/resolveLookupExitCode.test.ts +48 -0
- package/src/domains/shared/resolveLookupExitCode.ts +42 -0
- package/src/domains/shared/runtime.ts +4 -63
- package/src/domains/shared/semanticPackage.test.ts +89 -0
- package/src/domains/shared/semanticPackage.ts +34 -3
- package/src/domains/shared/stories/compileLookupCommand.test.ts +145 -0
- package/src/domains/shared/stories/compileLookupCommand.ts +102 -0
- package/src/domains/shared/stories/compileLookupTool.test.ts +105 -0
- package/src/domains/shared/stories/compileLookupTool.ts +96 -0
- package/src/domains/shared/stories/compileReadCommand.test.ts +121 -0
- package/src/domains/shared/stories/compileReadCommand.ts +48 -0
- package/src/domains/shared/stories/compileReadTool.test.ts +64 -0
- package/src/domains/shared/stories/compileReadTool.ts +38 -0
- package/src/domains/shared/stories/condense.test.ts +18 -0
- package/src/domains/shared/stories/condense.ts +15 -0
- package/src/domains/shared/stories/index.ts +20 -0
- package/src/domains/shared/stories/normalizeNames.test.ts +20 -0
- package/src/domains/shared/stories/normalizeNames.ts +22 -0
- package/src/domains/shared/stories/pack/applyPackFilters.test.ts +151 -0
- package/src/domains/shared/stories/pack/applyPackFilters.ts +111 -0
- package/src/domains/shared/stories/pack/applyPackSearch.test.ts +57 -0
- package/src/domains/shared/stories/pack/applyPackSearch.ts +41 -0
- package/src/domains/shared/stories/pack/buildLookupQuery.test.ts +81 -0
- package/src/domains/shared/stories/pack/buildLookupQuery.ts +154 -0
- package/src/domains/shared/stories/pack/bundled/index.ts +23 -0
- package/src/domains/shared/stories/pack/bundled/standardPack.ts +164 -0
- package/src/domains/shared/stories/pack/bundled/tierPack.ts +50 -0
- package/src/domains/shared/stories/pack/collectPackStories.test.ts +406 -0
- package/src/domains/shared/stories/pack/collectPackStories.ts +158 -0
- package/src/domains/shared/stories/pack/compilePackCommands.ts +50 -0
- package/src/domains/shared/stories/pack/compilePackStories.test.ts +751 -0
- package/src/domains/shared/stories/pack/compilePackStories.ts +724 -0
- package/src/domains/shared/stories/pack/compilePackToolSpecs.ts +55 -0
- package/src/domains/shared/stories/pack/index.ts +42 -0
- package/src/domains/shared/stories/pack/reservedVerbs.test.ts +213 -0
- package/src/domains/shared/stories/pack/reservedVerbs.ts +170 -0
- package/src/domains/shared/stories/pack/runSelectQuery.ts +31 -0
- package/src/domains/shared/stories/pack/standardParity.test.ts +381 -0
- package/src/domains/shared/stories/pack/types.ts +224 -0
- package/src/domains/shared/stories/pack/validateStoryPackDefinition.test.ts +742 -0
- package/src/domains/shared/stories/pack/validateStoryPackDefinition.ts +859 -0
- package/src/domains/shared/stories/projectCliParameters.test.ts +59 -0
- package/src/domains/shared/stories/projectCliParameters.ts +57 -0
- package/src/domains/shared/stories/projectToolParams.test.ts +50 -0
- package/src/domains/shared/stories/projectToolParams.ts +32 -0
- package/src/domains/shared/stories/requirePragmaContext.test.ts +23 -0
- package/src/domains/shared/stories/requirePragmaContext.ts +23 -0
- package/src/domains/shared/stories/resolveLookupDetailed.test.ts +57 -0
- package/src/domains/shared/stories/resolveLookupDetailed.ts +27 -0
- package/src/domains/shared/stories/types.ts +179 -0
- package/src/domains/shared/suggestions/expandGlob.ts +1 -0
- package/src/domains/shared/suggestions/suggestNames.ts +43 -10
- package/src/domains/shared/types/index.ts +5 -9
- package/src/domains/shared/types/ontology.ts +119 -24
- package/src/domains/shared/types/standard.ts +9 -52
- package/src/domains/skill/commands/index.ts +3 -1
- package/src/domains/skill/commands/list.test.ts +6 -2
- package/src/domains/skill/commands/list.ts +5 -63
- package/src/domains/skill/commands/lookup.test.ts +118 -0
- package/src/domains/skill/commands/lookup.ts +14 -0
- package/src/domains/skill/formatters/index.ts +1 -0
- package/src/domains/skill/formatters/lookup.test.ts +46 -0
- package/src/domains/skill/formatters/lookup.ts +57 -0
- package/src/domains/skill/helpers/resolveSkillSources.ts +0 -1
- package/src/domains/skill/index.ts +7 -3
- package/src/domains/skill/mcp/specs.ts +10 -29
- package/src/domains/skill/operations/discover.test.ts +61 -30
- package/src/domains/skill/operations/discover.ts +28 -37
- package/src/domains/skill/operations/index.ts +2 -1
- package/src/domains/skill/operations/list.test.ts +15 -7
- package/src/domains/skill/operations/lookup.test.ts +91 -0
- package/src/domains/skill/operations/lookup.ts +70 -0
- package/src/domains/skill/stories.test.ts +43 -0
- package/src/domains/skill/stories.ts +103 -0
- package/src/domains/skill/types.ts +8 -0
- package/src/domains/token/commands/lookup.test.ts +8 -0
- package/src/domains/token/commands/lookup.ts +12 -0
- package/src/domains/token/commands/sample.ts +2 -1
- package/src/domains/token/featureFlag.ts +17 -0
- package/src/domains/token/index.ts +5 -0
- package/src/domains/token/mcp/specs.ts +18 -2
- package/src/domains/token/orchestration/resolveTokenLookup.ts +2 -1
- package/src/domains/trace/commands/resolveTraceLimit.test.ts +31 -0
- package/src/domains/trace/commands/show.ts +30 -4
- package/src/domains/trace/tracePlugin.test.ts +1 -1
- package/src/index.ts +1 -13
- package/src/mcp/registerResources.test.ts +382 -74
- package/src/mcp/registerResources.ts +5 -348
- package/src/mcp/resources/buildGraphIndex.ts +167 -0
- package/src/mcp/resources/buildResourceList.test.ts +97 -0
- package/src/mcp/resources/buildResourceList.ts +176 -0
- package/src/mcp/resources/classifyEntity.test.ts +40 -0
- package/src/mcp/resources/classifyEntity.ts +27 -0
- package/src/mcp/resources/constants.ts +105 -0
- package/src/mcp/resources/displayPredicates.ts +62 -0
- package/src/mcp/resources/pickFirstValue.test.ts +29 -0
- package/src/mcp/resources/pickFirstValue.ts +26 -0
- package/src/mcp/resources/pickPrimaryType.test.ts +41 -0
- package/src/mcp/resources/pickPrimaryType.ts +26 -0
- package/src/mcp/resources/rankUriCompletions.test.ts +52 -0
- package/src/mcp/resources/rankUriCompletions.ts +64 -0
- package/src/mcp/resources/readEntity.ts +169 -0
- package/src/mcp/resources/registerResources.ts +126 -0
- package/src/mcp/resources/types.ts +128 -0
- package/src/mcp/tools/index.ts +22 -5
- package/src/mcp/tools/registerTools.test.ts +167 -34
- package/src/mcp/types.ts +4 -0
- package/src/pipeline/collectCommands.test.ts +151 -1
- package/src/pipeline/collectCommands.ts +35 -13
- package/src/pipeline/createProgram.test.ts +5 -1
- package/src/pipeline/createProgram.ts +2 -2
- package/src/pipeline/firstRun.test.ts +80 -0
- package/src/pipeline/firstRun.ts +99 -0
- package/src/pipeline/parseGlobalFlags.test.ts +102 -1
- package/src/pipeline/parseGlobalFlags.ts +98 -9
- package/src/pipeline/resolveCommandKind.test.ts +12 -0
- package/src/pipeline/resolveCommandKind.ts +4 -0
- package/src/pipeline/rootHelp.test.ts +87 -0
- package/src/pipeline/rootHelp.ts +265 -0
- package/src/pipeline/runCli.orchestration.test.ts +28 -12
- package/src/pipeline/runCli.test.ts +17 -4
- package/src/pipeline/runCli.ts +202 -25
- package/src/testing/cli.ts +30 -2
- package/src/testing/createTestMcpClient.ts +4 -1
- package/src/testing/dsFixtures.ts +21 -4
- package/src/testing/index.ts +7 -0
- package/src/testing/integration/__snapshots__/executor-golden.test.ts.snap +1207 -0
- package/src/testing/integration/cli-user-stories.test.ts +63 -0
- package/src/testing/integration/cross-binary-byte-equality.test.ts +129 -0
- package/src/testing/integration/edge-cases.test.ts +62 -50
- package/src/testing/integration/executor-execution.test.ts +103 -0
- package/src/testing/integration/executor-golden.test.ts +145 -0
- package/src/testing/integration/mcp-surface.test.ts +40 -15
- package/src/testing/integration/parity.test.ts +136 -82
- package/src/testing/regression/0001-skill-discovery-granularity.test.ts +71 -0
- package/src/testing/setupXdgIsolation.ts +26 -0
- package/src/testing/standardParityFixtures.ts +35 -0
- package/src/testing/store.ts +4 -4
- package/src/testing/storyFixtures.ts +63 -0
- package/src/domains/create/commands/component.test.ts +0 -166
- package/src/domains/create/commands/component.ts +0 -123
- package/src/domains/create/commands/index.ts +0 -3
- package/src/domains/create/commands/package.test.ts +0 -35
- package/src/domains/create/commands/package.ts +0 -21
- package/src/domains/create/generators.ts +0 -8
- package/src/domains/standard/commands/categories.test.ts +0 -70
- package/src/domains/standard/commands/categories.ts +0 -48
- package/src/domains/standard/commands/index.ts +0 -6
- package/src/domains/standard/commands/list.test.ts +0 -105
- package/src/domains/standard/commands/list.ts +0 -90
- package/src/domains/standard/commands/lookup.test.ts +0 -135
- package/src/domains/standard/commands/lookup.ts +0 -99
- package/src/domains/standard/commands/sample.ts +0 -57
- package/src/domains/standard/formatters/categories.test.ts +0 -44
- package/src/domains/standard/formatters/categories.ts +0 -38
- package/src/domains/standard/formatters/index.ts +0 -10
- package/src/domains/standard/formatters/list.test.ts +0 -169
- package/src/domains/standard/formatters/list.ts +0 -184
- package/src/domains/standard/formatters/lookup.test.ts +0 -95
- package/src/domains/standard/formatters/lookup.ts +0 -101
- package/src/domains/standard/formatters/sample.ts +0 -15
- package/src/domains/standard/formatters/types.ts +0 -31
- package/src/domains/standard/index.ts +0 -40
- package/src/domains/standard/mcp/index.ts +0 -2
- package/src/domains/standard/mcp/specs.ts +0 -244
- package/src/domains/standard/operations/categories.test.ts +0 -61
- package/src/domains/standard/operations/categories.ts +0 -38
- package/src/domains/standard/operations/index.ts +0 -6
- package/src/domains/standard/operations/list.test.ts +0 -75
- package/src/domains/standard/operations/list.ts +0 -64
- package/src/domains/standard/operations/lookup.test.ts +0 -58
- package/src/domains/standard/operations/lookup.ts +0 -151
- package/src/domains/standard/operations/sample.ts +0 -35
- package/src/domains/standard/orchestration/buildStandardFilters.ts +0 -11
- package/src/domains/standard/orchestration/index.ts +0 -4
- package/src/domains/standard/orchestration/resolveStandardList.ts +0 -45
- package/src/domains/standard/orchestration/resolveStandardLookup.ts +0 -32
- package/src/domains/standard/orchestration/standardEmptyError.test.ts +0 -33
- package/src/domains/standard/orchestration/standardEmptyError.ts +0 -29
- package/src/domains/standard/standardConfig.ts +0 -42
- package/src/domains/standard/types.ts +0 -15
- package/src/domains/tier/commands/index.ts +0 -3
- package/src/domains/tier/commands/list.test.ts +0 -67
- package/src/domains/tier/commands/list.ts +0 -59
- package/src/domains/tier/formatters/index.ts +0 -3
- package/src/domains/tier/formatters/list.test.ts +0 -33
- package/src/domains/tier/formatters/list.ts +0 -45
- package/src/domains/tier/index.ts +0 -17
- package/src/domains/tier/mcp/index.ts +0 -2
- package/src/domains/tier/mcp/specs.ts +0 -38
- package/src/domains/tier/operations/index.ts +0 -3
- package/src/domains/tier/operations/list.test.ts +0 -32
- package/src/domains/tier/operations/list.ts +0 -33
- package/src/pipeline/runInteractiveCommand.ts +0 -198
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Returns a small number of complete standard instances as exemplars.
|
|
3
|
-
*
|
|
4
|
-
* Composes the existing list and lookup operations to avoid duplicating
|
|
5
|
-
* any SPARQL logic. Agents use this to learn the data shape before querying.
|
|
6
|
-
*
|
|
7
|
-
* @param store - ke store to query
|
|
8
|
-
* @param count - number of samples (clamped 1–5, default 2)
|
|
9
|
-
* @returns sample result with detailed standards and total count
|
|
10
|
-
* @note Queries ke store
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import type { Store } from "@canonical/ke";
|
|
14
|
-
import pickRandom from "../../shared/pickRandom.js";
|
|
15
|
-
import type {
|
|
16
|
-
SampleResult,
|
|
17
|
-
StandardDetailed,
|
|
18
|
-
} from "../../shared/types/index.js";
|
|
19
|
-
import listStandards from "./list.js";
|
|
20
|
-
import lookupStandard from "./lookup.js";
|
|
21
|
-
|
|
22
|
-
export default async function sampleStandards(
|
|
23
|
-
store: Store,
|
|
24
|
-
count = 2,
|
|
25
|
-
): Promise<SampleResult<StandardDetailed>> {
|
|
26
|
-
const clamped = Math.max(1, Math.min(5, count));
|
|
27
|
-
const all = await listStandards(store);
|
|
28
|
-
const selected = pickRandom(all, clamped);
|
|
29
|
-
|
|
30
|
-
const samples = await Promise.all(
|
|
31
|
-
selected.map((s) => lookupStandard(store, s.name)),
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
return { samples, totalCount: all.length };
|
|
35
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { StandardListFilters } from "../../shared/types/index.js";
|
|
2
|
-
|
|
3
|
-
export default function buildStandardFilters(params: {
|
|
4
|
-
category?: string;
|
|
5
|
-
search?: string;
|
|
6
|
-
}): StandardListFilters {
|
|
7
|
-
return {
|
|
8
|
-
category: params.category,
|
|
9
|
-
search: params.search,
|
|
10
|
-
};
|
|
11
|
-
}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export { default as buildStandardFilters } from "./buildStandardFilters.js";
|
|
2
|
-
export { default as resolveStandardList } from "./resolveStandardList.js";
|
|
3
|
-
export { default as resolveStandardLookup } from "./resolveStandardLookup.js";
|
|
4
|
-
export { default as standardEmptyError } from "./standardEmptyError.js";
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import type { ListParams } from "../../shared/contracts.js";
|
|
2
|
-
import type { PragmaRuntime } from "../../shared/runtime.js";
|
|
3
|
-
import type {
|
|
4
|
-
Disclosure,
|
|
5
|
-
StandardListFilters,
|
|
6
|
-
} from "../../shared/types/index.js";
|
|
7
|
-
import { listStandards, lookupStandard } from "../operations/index.js";
|
|
8
|
-
import type { StandardListResolution } from "../types.js";
|
|
9
|
-
import buildStandardFilters from "./buildStandardFilters.js";
|
|
10
|
-
import standardEmptyError from "./standardEmptyError.js";
|
|
11
|
-
|
|
12
|
-
export default async function resolveStandardList(
|
|
13
|
-
rt: Pick<PragmaRuntime, "store">,
|
|
14
|
-
params: ListParams & StandardListFilters,
|
|
15
|
-
): Promise<StandardListResolution> {
|
|
16
|
-
const filters = buildStandardFilters(params);
|
|
17
|
-
const items = await listStandards(rt.store, filters);
|
|
18
|
-
|
|
19
|
-
if (items.length === 0) {
|
|
20
|
-
throw standardEmptyError(filters);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const disclosure: Disclosure = params.detailed
|
|
24
|
-
? { level: "detailed" }
|
|
25
|
-
: params.digest
|
|
26
|
-
? { level: "digest" }
|
|
27
|
-
: { level: "summary" };
|
|
28
|
-
|
|
29
|
-
const details =
|
|
30
|
-
disclosure.level === "summary"
|
|
31
|
-
? undefined
|
|
32
|
-
: await Promise.all(
|
|
33
|
-
items.map((item) =>
|
|
34
|
-
lookupStandard(rt.store, item.name).catch(() => null),
|
|
35
|
-
),
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
return {
|
|
39
|
-
params,
|
|
40
|
-
items,
|
|
41
|
-
filters,
|
|
42
|
-
disclosure,
|
|
43
|
-
details,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import type { LookupContract, LookupResult } from "../../shared/contracts.js";
|
|
2
|
-
import lookupMany from "../../shared/lookupMany.js";
|
|
3
|
-
import type { PragmaRuntime } from "../../shared/runtime.js";
|
|
4
|
-
import { expandLookupQueries } from "../../shared/suggestions/index.js";
|
|
5
|
-
import type { StandardDetailed } from "../../shared/types/index.js";
|
|
6
|
-
import { lookupStandard } from "../operations/index.js";
|
|
7
|
-
|
|
8
|
-
export default async function resolveStandardLookup(
|
|
9
|
-
store: Pick<PragmaRuntime, "store">["store"],
|
|
10
|
-
queries: readonly string[],
|
|
11
|
-
): Promise<LookupContract<StandardDetailed>> {
|
|
12
|
-
const { names, globErrors } = await expandLookupQueries(
|
|
13
|
-
queries,
|
|
14
|
-
store,
|
|
15
|
-
"standard",
|
|
16
|
-
);
|
|
17
|
-
|
|
18
|
-
const lookupResult: LookupResult<StandardDetailed> =
|
|
19
|
-
names.length > 0
|
|
20
|
-
? await lookupMany(names, (query) => lookupStandard(store, query))
|
|
21
|
-
: { results: [], errors: [] };
|
|
22
|
-
|
|
23
|
-
const result: LookupResult<StandardDetailed> = {
|
|
24
|
-
results: lookupResult.results,
|
|
25
|
-
errors: [...lookupResult.errors, ...globErrors],
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
return {
|
|
29
|
-
params: { names: queries },
|
|
30
|
-
result,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import standardEmptyError from "./standardEmptyError.js";
|
|
3
|
-
|
|
4
|
-
describe("standardEmptyError", () => {
|
|
5
|
-
it("filter-narrowing: a category/search was active → clear filters and re-list", () => {
|
|
6
|
-
const err = standardEmptyError({ category: "react", search: "fold" });
|
|
7
|
-
|
|
8
|
-
expect(err.filters).toEqual({ category: "react", search: "fold" });
|
|
9
|
-
expect(err.recovery).toEqual({
|
|
10
|
-
message: "List all standards without filters.",
|
|
11
|
-
cli: "pragma standard list",
|
|
12
|
-
mcp: { tool: "standard_list" },
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it("store-empty: no filter active → install, not a self-looping list", () => {
|
|
17
|
-
const err = standardEmptyError({});
|
|
18
|
-
|
|
19
|
-
expect(err.filters).toBeUndefined();
|
|
20
|
-
// Must NOT suggest `pragma standard list` again — that just re-returns empty.
|
|
21
|
-
expect(err.recovery).toEqual({
|
|
22
|
-
message: "Install the code standards packages that provide standards.",
|
|
23
|
-
cli: "bun add -D @canonical/code-standards",
|
|
24
|
-
});
|
|
25
|
-
expect(err.recovery?.mcp).toBeUndefined();
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it("install branch cites the code-standards package", () => {
|
|
29
|
-
const err = standardEmptyError({});
|
|
30
|
-
expect(err.recovery?.cli).toContain("@canonical/code-standards");
|
|
31
|
-
expect(err.recovery?.cli).not.toContain("ds-global");
|
|
32
|
-
});
|
|
33
|
-
});
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { PragmaError } from "#error";
|
|
2
|
-
import type { StandardListFilters } from "../../shared/types/index.js";
|
|
3
|
-
|
|
4
|
-
export default function standardEmptyError(
|
|
5
|
-
filters: StandardListFilters,
|
|
6
|
-
): PragmaError {
|
|
7
|
-
const active: Record<string, string> = {};
|
|
8
|
-
if (filters.category) active.category = filters.category;
|
|
9
|
-
if (filters.search) active.search = filters.search;
|
|
10
|
-
const hasFilter = Object.keys(active).length > 0;
|
|
11
|
-
|
|
12
|
-
return PragmaError.emptyResults("standard", {
|
|
13
|
-
filters: hasFilter ? active : undefined,
|
|
14
|
-
recovery: hasFilter
|
|
15
|
-
? {
|
|
16
|
-
// Filter-narrowing: clear the active category/search and re-list.
|
|
17
|
-
message: "List all standards without filters.",
|
|
18
|
-
cli: "pragma standard list",
|
|
19
|
-
mcp: { tool: "standard_list" },
|
|
20
|
-
}
|
|
21
|
-
: {
|
|
22
|
-
// Store-empty with no filter active: suggesting `standard list`
|
|
23
|
-
// again would just re-return empty, so route to the install.
|
|
24
|
-
message:
|
|
25
|
-
"Install the code standards packages that provide standards.",
|
|
26
|
-
cli: "bun add -D @canonical/code-standards",
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import type { EntityDisplayConfig } from "../shared/contracts.js";
|
|
2
|
-
import { P } from "../shared/prefixes.js";
|
|
3
|
-
import type {
|
|
4
|
-
FilterConfig,
|
|
5
|
-
StandardDetailed,
|
|
6
|
-
StandardDigest,
|
|
7
|
-
StandardSummary,
|
|
8
|
-
} from "../shared/types/index.js";
|
|
9
|
-
|
|
10
|
-
/** Display-contract configuration for code-standard entities. */
|
|
11
|
-
export const standardConfig: EntityDisplayConfig<
|
|
12
|
-
StandardSummary,
|
|
13
|
-
StandardDigest,
|
|
14
|
-
StandardDetailed
|
|
15
|
-
> = {
|
|
16
|
-
domain: "standard",
|
|
17
|
-
entityName: "standard",
|
|
18
|
-
rdfTypes: [`${P.cs}CodeStandard`],
|
|
19
|
-
listColumns: [
|
|
20
|
-
{ key: "uri", label: "IRI" },
|
|
21
|
-
{ key: "name", label: "Name" },
|
|
22
|
-
{ key: "category", label: "Category" },
|
|
23
|
-
{ key: "description", label: "Description" },
|
|
24
|
-
],
|
|
25
|
-
digestColumns: [{ key: "extends", label: "Extends", showWhenEmpty: false }],
|
|
26
|
-
lookupSections: [
|
|
27
|
-
{ key: "description", heading: "Description", kind: "field" },
|
|
28
|
-
{ key: "extends", heading: "Extends", kind: "field", showWhenEmpty: false },
|
|
29
|
-
{ key: "dos", heading: "Do", kind: "table", showWhenEmpty: false },
|
|
30
|
-
{ key: "donts", heading: "Don't", kind: "table", showWhenEmpty: false },
|
|
31
|
-
],
|
|
32
|
-
emptyRecovery: (_filters: FilterConfig) => ({
|
|
33
|
-
message: "List available standards.",
|
|
34
|
-
cli: "pragma standard list",
|
|
35
|
-
mcp: { tool: "standard_list" },
|
|
36
|
-
}),
|
|
37
|
-
notFoundRecovery: (_query: string) => ({
|
|
38
|
-
message: "List available standards.",
|
|
39
|
-
cli: "pragma standard list",
|
|
40
|
-
mcp: { tool: "standard_list" },
|
|
41
|
-
}),
|
|
42
|
-
};
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { ListParams } from "../shared/contracts.js";
|
|
2
|
-
import type {
|
|
3
|
-
Disclosure,
|
|
4
|
-
StandardDetailed,
|
|
5
|
-
StandardListFilters,
|
|
6
|
-
StandardSummary,
|
|
7
|
-
} from "../shared/types/index.js";
|
|
8
|
-
|
|
9
|
-
export interface StandardListResolution {
|
|
10
|
-
readonly params: ListParams & StandardListFilters;
|
|
11
|
-
readonly items: readonly StandardSummary[];
|
|
12
|
-
readonly filters: StandardListFilters;
|
|
13
|
-
readonly disclosure: Disclosure;
|
|
14
|
-
readonly details?: readonly (StandardDetailed | null)[];
|
|
15
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import type { CommandOutputResult } from "@canonical/cli-core";
|
|
2
|
-
import type { Store } from "@canonical/ke";
|
|
3
|
-
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
4
|
-
import { createTestStore, DS_ALL_TTL } from "#testing";
|
|
5
|
-
import type { PragmaContext } from "../../shared/context.js";
|
|
6
|
-
import listCommand from "./list.js";
|
|
7
|
-
|
|
8
|
-
let store: Store;
|
|
9
|
-
let cleanup: () => void;
|
|
10
|
-
|
|
11
|
-
beforeAll(async () => {
|
|
12
|
-
const result = await createTestStore({ ttl: DS_ALL_TTL });
|
|
13
|
-
store = result.store;
|
|
14
|
-
cleanup = result.cleanup;
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
afterAll(() => cleanup());
|
|
18
|
-
|
|
19
|
-
function makeCtx(
|
|
20
|
-
overrides?: Partial<PragmaContext["globalFlags"]>,
|
|
21
|
-
): PragmaContext {
|
|
22
|
-
return {
|
|
23
|
-
cwd: "/tmp",
|
|
24
|
-
store,
|
|
25
|
-
config: { tier: undefined, channel: "normal" },
|
|
26
|
-
globalFlags: {
|
|
27
|
-
llm: false,
|
|
28
|
-
format: "text",
|
|
29
|
-
verbose: false,
|
|
30
|
-
...overrides,
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
describe("tier list command", () => {
|
|
36
|
-
it("returns tiers with hierarchy", async () => {
|
|
37
|
-
const ctx = makeCtx();
|
|
38
|
-
const cmd = listCommand(ctx);
|
|
39
|
-
const result = await cmd.execute({}, ctx);
|
|
40
|
-
expect(result.tag).toBe("output");
|
|
41
|
-
|
|
42
|
-
const output = result as CommandOutputResult;
|
|
43
|
-
const text = output.render.plain(output.value);
|
|
44
|
-
expect(text).toContain("global");
|
|
45
|
-
expect(text).toContain("apps");
|
|
46
|
-
expect(text).toContain("apps/lxd");
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it("renders flat tier list without parent references", async () => {
|
|
50
|
-
const ctx = makeCtx();
|
|
51
|
-
const cmd = listCommand(ctx);
|
|
52
|
-
const result = await cmd.execute({}, ctx);
|
|
53
|
-
const output = result as CommandOutputResult;
|
|
54
|
-
const text = output.render.plain(output.value);
|
|
55
|
-
expect(text).not.toContain("(parent:");
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it("renders LLM format with --llm", async () => {
|
|
59
|
-
const ctx = makeCtx({ llm: true });
|
|
60
|
-
const cmd = listCommand(ctx);
|
|
61
|
-
const result = await cmd.execute({}, ctx);
|
|
62
|
-
const output = result as CommandOutputResult;
|
|
63
|
-
const text = output.render.plain(output.value);
|
|
64
|
-
expect(text).toContain("## Tiers");
|
|
65
|
-
expect(text).toContain("**global**");
|
|
66
|
-
});
|
|
67
|
-
});
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Wires the `pragma tier list` CLI command.
|
|
3
|
-
*
|
|
4
|
-
* Lists all tiers defined in the design system ontology. Throws a
|
|
5
|
-
* structured recovery error when no tiers are found.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
type CommandDefinition,
|
|
10
|
-
createOutputResult,
|
|
11
|
-
} from "@canonical/cli-core";
|
|
12
|
-
import { PragmaError } from "#error";
|
|
13
|
-
import { createListView } from "#tui";
|
|
14
|
-
import type { PragmaContext } from "../../shared/context.js";
|
|
15
|
-
import type { ColumnDef } from "../../shared/contracts.js";
|
|
16
|
-
import { selectFormatter } from "../../shared/formatters.js";
|
|
17
|
-
import type { TierEntry } from "../../shared/types/tier.js";
|
|
18
|
-
import { listFormatters } from "../formatters/index.js";
|
|
19
|
-
import { listTiers } from "../operations/index.js";
|
|
20
|
-
|
|
21
|
-
const tierListColumns: readonly ColumnDef<TierEntry>[] = [
|
|
22
|
-
{ key: "uri", label: "IRI" },
|
|
23
|
-
{ key: "path", label: "Path" },
|
|
24
|
-
{ key: "parent", label: "Parent" },
|
|
25
|
-
];
|
|
26
|
-
|
|
27
|
-
export default function listCommand(ctx: PragmaContext): CommandDefinition {
|
|
28
|
-
return {
|
|
29
|
-
path: ["tier", "list"],
|
|
30
|
-
description: "List all tiers in the design system ontology",
|
|
31
|
-
parameters: [],
|
|
32
|
-
meta: {
|
|
33
|
-
examples: ["pragma tier list", "pragma tier list --llm"],
|
|
34
|
-
},
|
|
35
|
-
async execute() {
|
|
36
|
-
const tiers = await listTiers(ctx.store);
|
|
37
|
-
|
|
38
|
-
if (tiers.length === 0) {
|
|
39
|
-
throw PragmaError.emptyResults("tier", {
|
|
40
|
-
recovery: {
|
|
41
|
-
message:
|
|
42
|
-
"Ensure design system packages are installed: bun add -D @canonical/ds-global",
|
|
43
|
-
},
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return createOutputResult(tiers, {
|
|
48
|
-
plain: selectFormatter(ctx, listFormatters),
|
|
49
|
-
ink: (data) =>
|
|
50
|
-
createListView({
|
|
51
|
-
heading: "Tiers",
|
|
52
|
-
domain: "tier",
|
|
53
|
-
items: data,
|
|
54
|
-
columns: tierListColumns,
|
|
55
|
-
}),
|
|
56
|
-
});
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type { URI } from "@canonical/ke";
|
|
2
|
-
import { describe, expect, it } from "vitest";
|
|
3
|
-
import type { TierEntry } from "../../shared/types/index.js";
|
|
4
|
-
import formatters from "./list.js";
|
|
5
|
-
|
|
6
|
-
const TIERS: TierEntry[] = [
|
|
7
|
-
{ uri: "http://example.com/t1" as URI, path: "apps", depth: 0 },
|
|
8
|
-
{ uri: "http://example.com/t2" as URI, path: "apps/lxd", depth: 0 },
|
|
9
|
-
{ uri: "http://example.com/t3" as URI, path: "global", depth: 0 },
|
|
10
|
-
];
|
|
11
|
-
|
|
12
|
-
describe("tier list formatters", () => {
|
|
13
|
-
it("plain renders flat tier names", () => {
|
|
14
|
-
const text = formatters.plain(TIERS);
|
|
15
|
-
expect(text).toContain("global");
|
|
16
|
-
expect(text).toContain("apps");
|
|
17
|
-
expect(text).toContain("apps/lxd");
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
it("plain renders one tier per line", () => {
|
|
21
|
-
const text = formatters.plain(TIERS);
|
|
22
|
-
const lines = text.split("\n").filter(Boolean);
|
|
23
|
-
expect(lines).toHaveLength(3);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it("llm renders markdown heading and bold paths", () => {
|
|
27
|
-
const text = formatters.llm(TIERS);
|
|
28
|
-
expect(text).toContain("## Tiers");
|
|
29
|
-
expect(text).toContain("- **global**");
|
|
30
|
-
expect(text).toContain("- **apps**");
|
|
31
|
-
expect(text).toContain("- **apps/lxd**");
|
|
32
|
-
});
|
|
33
|
-
});
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import compactUri from "../../shared/compactUri.js";
|
|
2
|
-
import type { Formatters } from "../../shared/formatters.js";
|
|
3
|
-
import { PREFIX_MAP } from "../../shared/prefixes.js";
|
|
4
|
-
import type { TierEntry } from "../../shared/types/index.js";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Three-mode formatter for `pragma tier list` output.
|
|
8
|
-
*
|
|
9
|
-
* - **plain** — indented terminal text showing tier hierarchy with
|
|
10
|
-
* optional parent annotations.
|
|
11
|
-
* - **llm** — condensed Markdown consumed by LLM agents and reused
|
|
12
|
-
* by the MCP adapter when `condensed: true`.
|
|
13
|
-
* - **json** — structured JSON array for programmatic consumption.
|
|
14
|
-
*/
|
|
15
|
-
const formatters: Formatters<TierEntry[]> = {
|
|
16
|
-
plain: (tiers) => {
|
|
17
|
-
const lines: string[] = [];
|
|
18
|
-
for (const t of tiers) {
|
|
19
|
-
const indent = " ".repeat(t.depth);
|
|
20
|
-
const parent = t.parent ? ` (parent: ${t.parent})` : "";
|
|
21
|
-
lines.push(
|
|
22
|
-
`${compactUri(t.uri, PREFIX_MAP)} ${indent}${t.path}${parent}`,
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
return lines.join("\n");
|
|
26
|
-
},
|
|
27
|
-
|
|
28
|
-
llm: (tiers) => {
|
|
29
|
-
const lines: string[] = [];
|
|
30
|
-
lines.push("## Tiers");
|
|
31
|
-
lines.push("");
|
|
32
|
-
for (const t of tiers) {
|
|
33
|
-
const indent = " ".repeat(t.depth);
|
|
34
|
-
const parent = t.parent ? ` (parent: ${t.parent})` : "";
|
|
35
|
-
lines.push(
|
|
36
|
-
`${indent}- **${t.path}** \`${compactUri(t.uri, PREFIX_MAP)}\`${parent}`,
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
return lines.join("\n");
|
|
40
|
-
},
|
|
41
|
-
|
|
42
|
-
json: (tiers) => JSON.stringify(tiers, null, 2),
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export default formatters;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module Tier domain — CLI commands and operations.
|
|
3
|
-
*
|
|
4
|
-
* Commands: `pragma tier list`.
|
|
5
|
-
* Operations: {@link listTiers}.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { CommandDefinition } from "@canonical/cli-core";
|
|
9
|
-
import type { PragmaContext } from "../shared/context.js";
|
|
10
|
-
import { listCommand } from "./commands/index.js";
|
|
11
|
-
|
|
12
|
-
export function commands(ctx: PragmaContext): CommandDefinition[] {
|
|
13
|
-
return [listCommand(ctx)];
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export { specs as mcpSpecs } from "./mcp/index.js";
|
|
17
|
-
export { listTiers } from "./operations/index.js";
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP tool specs for the tier domain.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import type { ToolSpec } from "../../shared/ToolSpec.js";
|
|
6
|
-
import { listFormatters as tierListFmt } from "../formatters/index.js";
|
|
7
|
-
import { listTiers } from "../operations/index.js";
|
|
8
|
-
|
|
9
|
-
const specs: readonly ToolSpec[] = [
|
|
10
|
-
{
|
|
11
|
-
name: "tier_list",
|
|
12
|
-
description: "List all tiers in the design system ontology with hierarchy.",
|
|
13
|
-
params: {
|
|
14
|
-
condensed: {
|
|
15
|
-
type: "boolean",
|
|
16
|
-
description: "Token-optimized output",
|
|
17
|
-
optional: true,
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
readOnly: true,
|
|
21
|
-
async execute(rt, { condensed }) {
|
|
22
|
-
const result = await listTiers(rt.store);
|
|
23
|
-
|
|
24
|
-
if (condensed) {
|
|
25
|
-
const text = tierListFmt.llm(result);
|
|
26
|
-
return {
|
|
27
|
-
condensed: true,
|
|
28
|
-
text,
|
|
29
|
-
tokens: `~${Math.ceil(text.length / 4)}`,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return { data: result, meta: { count: result.length } };
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
];
|
|
37
|
-
|
|
38
|
-
export default specs;
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import type { Store } from "@canonical/ke";
|
|
2
|
-
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
3
|
-
import { createTestStore, DS_ALL_TTL } from "#testing";
|
|
4
|
-
import listTiers from "./list.js";
|
|
5
|
-
|
|
6
|
-
let store: Store;
|
|
7
|
-
let cleanup: () => void;
|
|
8
|
-
|
|
9
|
-
beforeAll(async () => {
|
|
10
|
-
const result = await createTestStore({ ttl: DS_ALL_TTL });
|
|
11
|
-
store = result.store;
|
|
12
|
-
cleanup = result.cleanup;
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
afterAll(() => cleanup());
|
|
16
|
-
|
|
17
|
-
describe("listTiers", () => {
|
|
18
|
-
it("returns all tiers from the ontology", async () => {
|
|
19
|
-
const result = await listTiers(store);
|
|
20
|
-
const paths = result.map((t) => t.path);
|
|
21
|
-
expect(paths).toContain("global");
|
|
22
|
-
expect(paths).toContain("apps");
|
|
23
|
-
expect(paths).toContain("apps/lxd");
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it("returns sorted by name", async () => {
|
|
27
|
-
const result = await listTiers(store);
|
|
28
|
-
const paths = result.map((t) => t.path);
|
|
29
|
-
const sorted = [...paths].sort();
|
|
30
|
-
expect(paths).toEqual(sorted);
|
|
31
|
-
});
|
|
32
|
-
});
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Lists all tiers defined in the design system ontology, ordered by name.
|
|
3
|
-
*
|
|
4
|
-
* @param store - ke store to query
|
|
5
|
-
* @returns array of tier entries, empty when none exist
|
|
6
|
-
* @note Queries ke store
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { Store, URI } from "@canonical/ke";
|
|
10
|
-
import { buildQuery } from "../../shared/buildQuery.js";
|
|
11
|
-
import { P } from "../../shared/prefixes.js";
|
|
12
|
-
import type { TierEntry } from "../../shared/types/index.js";
|
|
13
|
-
|
|
14
|
-
export default async function listTiers(store: Store): Promise<TierEntry[]> {
|
|
15
|
-
const result = await store.query(
|
|
16
|
-
buildQuery(`
|
|
17
|
-
SELECT ?tier ?name
|
|
18
|
-
WHERE {
|
|
19
|
-
?tier a ${P.ds}Tier ;
|
|
20
|
-
${P.ds}name ?name .
|
|
21
|
-
}
|
|
22
|
-
ORDER BY ?name
|
|
23
|
-
`),
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
if (result.type !== "select") return [];
|
|
27
|
-
|
|
28
|
-
return result.bindings.map((b) => ({
|
|
29
|
-
uri: (b.tier ?? "") as URI,
|
|
30
|
-
path: b.name ?? "",
|
|
31
|
-
depth: 0,
|
|
32
|
-
}));
|
|
33
|
-
}
|