@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
|
@@ -2,49 +2,144 @@
|
|
|
2
2
|
|
|
3
3
|
/** Summary of a loaded ontology namespace from `ontology list`. */
|
|
4
4
|
export interface OntologySummary {
|
|
5
|
-
/** Short prefix alias (e.g., `"ds"
|
|
5
|
+
/** Short prefix alias (e.g., `"ds"`), or `""` when none is registered. */
|
|
6
6
|
readonly prefix: string;
|
|
7
7
|
/** Full namespace URI the prefix expands to. */
|
|
8
8
|
readonly namespace: string;
|
|
9
|
+
/** rdfs:label of the namespace's owl:Ontology header, when declared. */
|
|
10
|
+
readonly title?: string;
|
|
11
|
+
/** owl:versionInfo of the namespace's owl:Ontology header, when declared. */
|
|
12
|
+
readonly version?: string;
|
|
9
13
|
/** Number of OWL/RDFS classes defined in this namespace. */
|
|
10
14
|
readonly classCount: number;
|
|
11
|
-
/** Number of properties (
|
|
12
|
-
readonly
|
|
15
|
+
/** Number of object properties (class-to-class relations). */
|
|
16
|
+
readonly relationCount: number;
|
|
17
|
+
/** Number of datatype properties (literal-valued attributes). */
|
|
18
|
+
readonly attributeCount: number;
|
|
19
|
+
/** Number of SHACL node shapes constraining this namespace. */
|
|
20
|
+
readonly shapeCount: number;
|
|
13
21
|
readonly anatomyCount: number;
|
|
14
22
|
}
|
|
15
23
|
|
|
16
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* A property in an ontology namespace.
|
|
26
|
+
*
|
|
27
|
+
* All IRIs are compact (`ds:tier`); the owning {@link OntologyDetailed}
|
|
28
|
+
* carries the `prefixes` map needed to expand them.
|
|
29
|
+
*/
|
|
30
|
+
export interface OntologyProperty {
|
|
31
|
+
/** Compact IRI of the property. */
|
|
32
|
+
readonly iri: string;
|
|
33
|
+
/** Human-readable label (rdfs:label, falling back to the local name). */
|
|
34
|
+
readonly label: string;
|
|
35
|
+
/** Whether this is an object property (links classes) or datatype property (links to literals). */
|
|
36
|
+
readonly kind: "object" | "datatype";
|
|
37
|
+
/** Compact IRI of the domain class this property applies to, if declared. */
|
|
38
|
+
readonly domain?: string;
|
|
39
|
+
/** Compact IRI of the range class or datatype, if declared. */
|
|
40
|
+
readonly range?: string;
|
|
41
|
+
/** Present (true) when the property is an owl:FunctionalProperty. */
|
|
42
|
+
readonly functional?: true;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* A class in an ontology's class hierarchy.
|
|
47
|
+
*
|
|
48
|
+
* Classes arrive in deterministic topological order (roots first,
|
|
49
|
+
* alphabetical among siblings) with their direct properties attached.
|
|
50
|
+
*/
|
|
17
51
|
export interface OntologyClass {
|
|
18
|
-
/**
|
|
19
|
-
readonly
|
|
20
|
-
/** Human-readable label (rdfs:label). */
|
|
52
|
+
/** Compact IRI of the class. */
|
|
53
|
+
readonly iri: string;
|
|
54
|
+
/** Human-readable label (rdfs:label, falling back to the local name). */
|
|
21
55
|
readonly label: string;
|
|
22
|
-
/**
|
|
23
|
-
readonly
|
|
56
|
+
/** Class documentation (rdfs:comment), omitted when absent. */
|
|
57
|
+
readonly comment?: string;
|
|
58
|
+
/** Compact IRIs of all direct superclasses (empty for roots). */
|
|
59
|
+
readonly subClassOf: readonly string[];
|
|
60
|
+
/** Number of instances typed with this class, omitted when zero. */
|
|
61
|
+
readonly instances?: number;
|
|
62
|
+
/** Properties whose rdfs:domain is this class. */
|
|
63
|
+
readonly properties: readonly OntologyProperty[];
|
|
24
64
|
}
|
|
25
65
|
|
|
26
|
-
/**
|
|
27
|
-
export interface
|
|
28
|
-
/**
|
|
29
|
-
readonly
|
|
30
|
-
/**
|
|
66
|
+
/** Summary of a SHACL node shape constraining a class. */
|
|
67
|
+
export interface OntologyConstraint {
|
|
68
|
+
/** Compact IRI of the sh:NodeShape. */
|
|
69
|
+
readonly shape: string;
|
|
70
|
+
/** Compact IRI of the sh:targetClass, if declared. */
|
|
71
|
+
readonly targetClass?: string;
|
|
72
|
+
/** Number of sh:property constraints on the shape. */
|
|
73
|
+
readonly propertyCount: number;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** owl:Ontology header metadata, when the namespace declares one. */
|
|
77
|
+
export interface OntologyMeta {
|
|
78
|
+
/** rdfs:label / dcterms:title of the ontology node. */
|
|
79
|
+
readonly title?: string;
|
|
80
|
+
/** owl:versionInfo. */
|
|
81
|
+
readonly version?: string;
|
|
82
|
+
/** Compact IRIs of owl:imports. */
|
|
83
|
+
readonly imports?: readonly string[];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** A ready-to-run SPARQL hint for follow-up querying. */
|
|
87
|
+
export interface OntologyQueryHint {
|
|
88
|
+
/** What the query answers (e.g. "instances of ds:Component"). */
|
|
31
89
|
readonly label: string;
|
|
32
|
-
/**
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
readonly type: "object" | "datatype";
|
|
90
|
+
/**
|
|
91
|
+
* SPARQL using compact IRIs — runnable as-is via `pragma graph query`,
|
|
92
|
+
* which resolves the store's prefix map.
|
|
93
|
+
*/
|
|
94
|
+
readonly sparql: string;
|
|
38
95
|
}
|
|
39
96
|
|
|
40
|
-
/**
|
|
97
|
+
/** Deep-dive view of one class, produced by `ontology show <ns> --class <C>`. */
|
|
98
|
+
export interface OntologyClassFocus {
|
|
99
|
+
/** Compact IRI of the focused class. */
|
|
100
|
+
readonly iri: string;
|
|
101
|
+
readonly label: string;
|
|
102
|
+
readonly comment?: string;
|
|
103
|
+
/** Superclass chain within the namespace, nearest first. */
|
|
104
|
+
readonly superChain: readonly string[];
|
|
105
|
+
/** Compact IRIs of direct subclasses. */
|
|
106
|
+
readonly subclasses: readonly string[];
|
|
107
|
+
/** Number of instances typed with this class. */
|
|
108
|
+
readonly instances: number;
|
|
109
|
+
/** Properties declared directly on this class. */
|
|
110
|
+
readonly directProperties: readonly OntologyProperty[];
|
|
111
|
+
/** Properties inherited from the super chain. */
|
|
112
|
+
readonly inheritedProperties: readonly OntologyProperty[];
|
|
113
|
+
/** Properties elsewhere in the namespace whose range is this class. */
|
|
114
|
+
readonly referencedBy: readonly OntologyProperty[];
|
|
115
|
+
/** Up to a few instance IRIs, as entry points for `graph inspect` / lookups. */
|
|
116
|
+
readonly sampleInstances: readonly string[];
|
|
117
|
+
/** Ready-to-run SPARQL for the natural follow-up questions. */
|
|
118
|
+
readonly queries: readonly OntologyQueryHint[];
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Detailed view of a single ontology namespace from `ontology show`.
|
|
123
|
+
*
|
|
124
|
+
* This is the single complete structure every output mode projects:
|
|
125
|
+
* plain, `--llm`, `--format json`, and the MCP `ontology_show` envelope
|
|
126
|
+
* all render from this shape and nothing else.
|
|
127
|
+
*/
|
|
41
128
|
export interface OntologyDetailed {
|
|
42
129
|
/** Short prefix alias (e.g., `"ds"`). */
|
|
43
130
|
readonly prefix: string;
|
|
44
131
|
/** Full namespace URI the prefix expands to. */
|
|
45
132
|
readonly namespace: string;
|
|
46
|
-
/**
|
|
133
|
+
/** Prefix map covering every compact IRI used in this structure. */
|
|
134
|
+
readonly prefixes: Readonly<Record<string, string>>;
|
|
135
|
+
/** owl:Ontology header metadata, omitted when the namespace declares none. */
|
|
136
|
+
readonly meta?: OntologyMeta;
|
|
137
|
+
/** All classes, topologically ordered, with direct properties attached. */
|
|
47
138
|
readonly classes: readonly OntologyClass[];
|
|
48
|
-
/**
|
|
49
|
-
readonly
|
|
139
|
+
/** Properties with no domain, or a domain outside this namespace's classes. */
|
|
140
|
+
readonly unattached: readonly OntologyProperty[];
|
|
141
|
+
/** SHACL node-shape summaries, omitted when none exist. */
|
|
142
|
+
readonly constraints?: readonly OntologyConstraint[];
|
|
143
|
+
/** Per-class deep dive, present when a class filter was requested. */
|
|
144
|
+
readonly focus?: OntologyClassFocus;
|
|
50
145
|
}
|
|
@@ -1,58 +1,15 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Standard cross-reference type.
|
|
3
|
+
*
|
|
4
|
+
* The hand-written standard domain's return types (StandardSummary,
|
|
5
|
+
* StandardDetailed, CodeBlock, …) were deleted with the domain — the
|
|
6
|
+
* `standard` noun is served by the bundled story pack, whose rows and
|
|
7
|
+
* entities are generic string records. Only {@link StandardRef} remains:
|
|
8
|
+
* block lookups still cross-reference standards by name/URI/category.
|
|
9
|
+
*/
|
|
2
10
|
|
|
3
11
|
import type { URI } from "@canonical/ke";
|
|
4
12
|
|
|
5
|
-
/** Summary view of a design-system standard (guideline or rule). */
|
|
6
|
-
export interface StandardSummary {
|
|
7
|
-
/** Full RDF URI identifying this standard in the ke store. */
|
|
8
|
-
readonly uri: URI;
|
|
9
|
-
/** Human-readable name of the standard. */
|
|
10
|
-
readonly name: string;
|
|
11
|
-
/** Category grouping (e.g., `"accessibility"`, `"layout"`). */
|
|
12
|
-
readonly category: string;
|
|
13
|
-
/** Brief prose description of what the standard prescribes. */
|
|
14
|
-
readonly description: string;
|
|
15
|
-
/** URI of the parent standard this one extends, if any. */
|
|
16
|
-
readonly extends?: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/** Digest view of a standard for generic list contracts. */
|
|
20
|
-
export type StandardDigest = StandardSummary;
|
|
21
|
-
|
|
22
|
-
/** Fenced code block used in standard do/don't examples. */
|
|
23
|
-
export interface CodeBlock {
|
|
24
|
-
/** Programming language identifier for syntax highlighting. */
|
|
25
|
-
readonly language: string;
|
|
26
|
-
/** Source code content of the example. */
|
|
27
|
-
readonly code: string;
|
|
28
|
-
/** Optional explanatory caption displayed alongside the code. */
|
|
29
|
-
readonly caption?: string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** Detailed view of a standard, extending the summary with code examples. */
|
|
33
|
-
export interface StandardDetailed extends StandardSummary {
|
|
34
|
-
/** Positive examples demonstrating correct usage. */
|
|
35
|
-
readonly dos: readonly CodeBlock[];
|
|
36
|
-
/** Negative examples demonstrating incorrect usage. */
|
|
37
|
-
readonly donts: readonly CodeBlock[];
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/** Summary of a standards category with its member count. */
|
|
41
|
-
export interface CategorySummary {
|
|
42
|
-
/** Category name (e.g., `"accessibility"`, `"layout"`). */
|
|
43
|
-
readonly name: string;
|
|
44
|
-
/** Number of standards belonging to this category. */
|
|
45
|
-
readonly standardCount: number;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/** Optional filters for narrowing the standards list. */
|
|
49
|
-
export interface StandardListFilters {
|
|
50
|
-
/** Restrict results to a single category name. */
|
|
51
|
-
readonly category?: string;
|
|
52
|
-
/** Free-text search term matched against standard names and descriptions. */
|
|
53
|
-
readonly search?: string;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
13
|
/** Lightweight reference to a standard, used in block cross-references. */
|
|
57
14
|
export interface StandardRef {
|
|
58
15
|
/** Human-readable standard name. */
|
|
@@ -9,9 +9,13 @@ import buildListCommand from "./list.js";
|
|
|
9
9
|
|
|
10
10
|
const TMP_ROOT = join(tmpdir(), `pragma-skill-cmd-${Date.now()}`);
|
|
11
11
|
|
|
12
|
+
/** One source per skill directory, matching the loader granularity. */
|
|
12
13
|
const TEST_SOURCES = [
|
|
13
14
|
{
|
|
14
|
-
dir: join(
|
|
15
|
+
dir: join(
|
|
16
|
+
TMP_ROOT,
|
|
17
|
+
"node_modules/@canonical/design-system/skills/design-audit",
|
|
18
|
+
),
|
|
15
19
|
packageName: "@canonical/design-system",
|
|
16
20
|
},
|
|
17
21
|
];
|
|
@@ -23,7 +27,7 @@ vi.mock("../helpers/resolveSkillSources.js", () => ({
|
|
|
23
27
|
beforeAll(() => {
|
|
24
28
|
mkdirSync(TMP_ROOT, { recursive: true });
|
|
25
29
|
|
|
26
|
-
const dir =
|
|
30
|
+
const dir = TEST_SOURCES.at(0)?.dir ?? "";
|
|
27
31
|
mkdirSync(dir, { recursive: true });
|
|
28
32
|
writeFileSync(
|
|
29
33
|
join(dir, "SKILL.md"),
|
|
@@ -1,69 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type CommandDefinition,
|
|
3
|
-
type CommandResult,
|
|
4
|
-
createOutputResult,
|
|
5
|
-
} from "@canonical/cli-core";
|
|
6
|
-
import { PragmaError } from "#error";
|
|
1
|
+
import type { CommandDefinition } from "@canonical/cli-core";
|
|
7
2
|
import type { PragmaContext } from "../../shared/context.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import type { SkillListInput } from "../formatters/types.js";
|
|
11
|
-
import { listSkills } from "../operations/index.js";
|
|
3
|
+
import { compileReadCommand } from "../../shared/stories/index.js";
|
|
4
|
+
import { skillListStory } from "../stories.js";
|
|
12
5
|
|
|
13
|
-
/**
|
|
14
|
-
* Build the `pragma skill list` command definition.
|
|
15
|
-
*
|
|
16
|
-
* Discovers skills from installed packages and formats the result.
|
|
17
|
-
* Throws when no skills are found, with a recovery hint.
|
|
18
|
-
*
|
|
19
|
-
* @param ctx - Pragma context providing cwd and formatter selection.
|
|
20
|
-
* @returns The command definition for `pragma skill list`.
|
|
21
|
-
* @note Impure
|
|
22
|
-
*/
|
|
6
|
+
/** Wire the `pragma skill list` CLI command from the skill list story. */
|
|
23
7
|
export default function buildListCommand(
|
|
24
8
|
ctx: PragmaContext,
|
|
25
9
|
): CommandDefinition {
|
|
26
|
-
return
|
|
27
|
-
path: ["skill", "list"],
|
|
28
|
-
description: "List available agent skills from design system packages",
|
|
29
|
-
parameters: [
|
|
30
|
-
{
|
|
31
|
-
name: "detailed",
|
|
32
|
-
description: "Show full metadata for each skill",
|
|
33
|
-
type: "boolean",
|
|
34
|
-
default: false,
|
|
35
|
-
},
|
|
36
|
-
],
|
|
37
|
-
meta: {
|
|
38
|
-
examples: [
|
|
39
|
-
"pragma skill list",
|
|
40
|
-
"pragma skill list --detailed",
|
|
41
|
-
"pragma skill list --llm",
|
|
42
|
-
"pragma skill list --format json",
|
|
43
|
-
],
|
|
44
|
-
},
|
|
45
|
-
execute: async (
|
|
46
|
-
params: Record<string, unknown>,
|
|
47
|
-
): Promise<CommandResult> => {
|
|
48
|
-
const detailed = params.detailed === true;
|
|
49
|
-
const { skills, sources } = await listSkills(ctx.cwd);
|
|
50
|
-
|
|
51
|
-
if (skills.length === 0) {
|
|
52
|
-
const allUnavailable = sources.every((s) => !s.available);
|
|
53
|
-
throw PragmaError.emptyResults("skill", {
|
|
54
|
-
recovery: {
|
|
55
|
-
message: allUnavailable
|
|
56
|
-
? "Install @canonical packages first"
|
|
57
|
-
: "No SKILL.md files found in source packages",
|
|
58
|
-
},
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const input: SkillListInput = { skills, sources, detailed };
|
|
63
|
-
|
|
64
|
-
return createOutputResult(input, {
|
|
65
|
-
plain: selectFormatter(ctx, listFormatters),
|
|
66
|
-
});
|
|
67
|
-
},
|
|
68
|
-
};
|
|
10
|
+
return compileReadCommand(ctx, skillListStory);
|
|
69
11
|
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import type { CommandDefinition } from "@canonical/cli-core";
|
|
5
|
+
import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { PragmaError } from "#error";
|
|
7
|
+
import type { PragmaContext } from "../../shared/context.js";
|
|
8
|
+
import buildLookupCommand from "./lookup.js";
|
|
9
|
+
|
|
10
|
+
const TMP_ROOT = join(tmpdir(), `pragma-skill-lookup-cmd-${Date.now()}`);
|
|
11
|
+
|
|
12
|
+
/** One source per skill directory, matching the loader granularity. */
|
|
13
|
+
const TEST_SOURCES = [
|
|
14
|
+
{
|
|
15
|
+
dir: join(
|
|
16
|
+
TMP_ROOT,
|
|
17
|
+
"node_modules/@canonical/design-system/skills/design-auditor",
|
|
18
|
+
),
|
|
19
|
+
packageName: "@canonical/design-system",
|
|
20
|
+
},
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
vi.mock("../helpers/resolveSkillSources.js", () => ({
|
|
24
|
+
default: () => TEST_SOURCES,
|
|
25
|
+
}));
|
|
26
|
+
|
|
27
|
+
beforeAll(() => {
|
|
28
|
+
const dir = TEST_SOURCES.at(0)?.dir ?? "";
|
|
29
|
+
mkdirSync(dir, { recursive: true });
|
|
30
|
+
writeFileSync(
|
|
31
|
+
join(dir, "SKILL.md"),
|
|
32
|
+
`---
|
|
33
|
+
name: design-auditor
|
|
34
|
+
description: Audit design system coverage
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
# Design Auditor
|
|
38
|
+
`,
|
|
39
|
+
);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
afterAll(() => {
|
|
43
|
+
rmSync(TMP_ROOT, { recursive: true, force: true });
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
function makeCtx(overrides: Partial<PragmaContext> = {}): PragmaContext {
|
|
47
|
+
return {
|
|
48
|
+
cwd: TMP_ROOT,
|
|
49
|
+
globalFlags: { llm: false, format: "text" as const, verbose: false },
|
|
50
|
+
store: {} as PragmaContext["store"],
|
|
51
|
+
config: { tier: undefined, channel: "normal" },
|
|
52
|
+
...overrides,
|
|
53
|
+
} as PragmaContext;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function executeText(
|
|
57
|
+
cmd: CommandDefinition,
|
|
58
|
+
params: Record<string, unknown>,
|
|
59
|
+
ctx: PragmaContext,
|
|
60
|
+
): Promise<string> {
|
|
61
|
+
const result = await cmd.execute(params, ctx);
|
|
62
|
+
expect(result.tag).toBe("output");
|
|
63
|
+
if (result.tag !== "output") throw new Error("Expected output result");
|
|
64
|
+
return result.render.plain(result.value);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
describe("buildLookupCommand", () => {
|
|
68
|
+
it("serves the full SKILL.md content", async () => {
|
|
69
|
+
const ctx = makeCtx();
|
|
70
|
+
const text = await executeText(
|
|
71
|
+
buildLookupCommand(ctx),
|
|
72
|
+
{ names: ["design-auditor"] },
|
|
73
|
+
ctx,
|
|
74
|
+
);
|
|
75
|
+
expect(text).toContain("design-auditor");
|
|
76
|
+
expect(text).toContain("# Design Auditor");
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("renders JSON with content under --format json", async () => {
|
|
80
|
+
const ctx = makeCtx({
|
|
81
|
+
globalFlags: { llm: false, format: "json", verbose: false },
|
|
82
|
+
});
|
|
83
|
+
const text = await executeText(
|
|
84
|
+
buildLookupCommand(ctx),
|
|
85
|
+
{ names: ["design-auditor"] },
|
|
86
|
+
ctx,
|
|
87
|
+
);
|
|
88
|
+
const data = JSON.parse(text) as { name: string; content: string };
|
|
89
|
+
expect(data.name).toBe("design-auditor");
|
|
90
|
+
expect(data.content).toContain("# Design Auditor");
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("reports unknown skills in the errors section", async () => {
|
|
94
|
+
const ctx = makeCtx();
|
|
95
|
+
const text = await executeText(
|
|
96
|
+
buildLookupCommand(ctx),
|
|
97
|
+
{ names: ["nope"] },
|
|
98
|
+
ctx,
|
|
99
|
+
);
|
|
100
|
+
expect(text).toContain("Errors:");
|
|
101
|
+
expect(text).toContain('skill "nope" not found.');
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it("rejects an empty names list with a recovery hint", async () => {
|
|
105
|
+
const ctx = makeCtx();
|
|
106
|
+
const cmd = buildLookupCommand(ctx);
|
|
107
|
+
await expect(cmd.execute({ names: [] }, ctx)).rejects.toThrow(PragmaError);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("completes skill names from discovery", async () => {
|
|
111
|
+
const ctx = makeCtx();
|
|
112
|
+
const cmd = buildLookupCommand(ctx);
|
|
113
|
+
const names = cmd.parameters.at(0);
|
|
114
|
+
await expect(names?.complete?.("des", ctx)).resolves.toEqual([
|
|
115
|
+
"design-auditor",
|
|
116
|
+
]);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CommandDefinition } from "@canonical/cli-core";
|
|
2
|
+
import type { PragmaContext } from "../../shared/context.js";
|
|
3
|
+
import { compileLookupCommand } from "../../shared/stories/index.js";
|
|
4
|
+
import { skillLookupStory } from "../stories.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Wire the `pragma skill lookup <name...>` CLI command from the skill
|
|
8
|
+
* lookup story.
|
|
9
|
+
*/
|
|
10
|
+
export default function buildLookupCommand(
|
|
11
|
+
ctx: PragmaContext,
|
|
12
|
+
): CommandDefinition {
|
|
13
|
+
return compileLookupCommand(ctx, skillLookupStory);
|
|
14
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import type { SkillDetailed } from "../types.js";
|
|
3
|
+
import formatters from "./lookup.js";
|
|
4
|
+
|
|
5
|
+
const skill: SkillDetailed = {
|
|
6
|
+
name: "design-auditor",
|
|
7
|
+
description: "Audit design system coverage",
|
|
8
|
+
sourcePath: "/pkgs/design-system/skills/design-auditor",
|
|
9
|
+
sourcePackage: "@canonical/design-system",
|
|
10
|
+
folderName: "design-auditor",
|
|
11
|
+
frontmatter: {
|
|
12
|
+
name: "design-auditor",
|
|
13
|
+
description: "Audit design system coverage",
|
|
14
|
+
},
|
|
15
|
+
content: "---\nname: design-auditor\n---\n\n# Design Auditor\n",
|
|
16
|
+
files: ["AUDIT_SPEC.md"],
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
describe("skill lookup formatters", () => {
|
|
20
|
+
it("plain renders a header and the full content", () => {
|
|
21
|
+
const text = formatters.plain(skill);
|
|
22
|
+
expect(text).toContain("design-auditor");
|
|
23
|
+
expect(text).toContain("@canonical/design-system");
|
|
24
|
+
expect(text).toContain("Companion files: AUDIT_SPEC.md");
|
|
25
|
+
expect(text).toContain("# Design Auditor");
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("llm renders a markdown header above the content", () => {
|
|
29
|
+
const text = formatters.llm(skill);
|
|
30
|
+
expect(text).toContain("## Skill: design-auditor");
|
|
31
|
+
expect(text).toContain("**Companion files:** AUDIT_SPEC.md");
|
|
32
|
+
expect(text).toContain("# Design Auditor");
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("llm omits the companion files line when there are none", () => {
|
|
36
|
+
const text = formatters.llm({ ...skill, files: [] });
|
|
37
|
+
expect(text).not.toContain("Companion files");
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("json serializes the skill with content and files", () => {
|
|
41
|
+
const data = JSON.parse(formatters.json(skill)) as Record<string, unknown>;
|
|
42
|
+
expect(data.name).toBe("design-auditor");
|
|
43
|
+
expect(data.files).toEqual(["AUDIT_SPEC.md"]);
|
|
44
|
+
expect(data.content).toContain("# Design Auditor");
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import type { Formatters } from "../../shared/formatters.js";
|
|
3
|
+
import type { SkillDetailed } from "../types.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Formatters for `pragma skill lookup` output.
|
|
7
|
+
*
|
|
8
|
+
* - **plain** renders a chalk-styled header (name, source, files) above
|
|
9
|
+
* the full SKILL.md content.
|
|
10
|
+
* - **llm** renders a markdown header above the content — the skill body
|
|
11
|
+
* is already markdown, so it is served verbatim.
|
|
12
|
+
* - **json** serializes the skill with its content and companion files.
|
|
13
|
+
*/
|
|
14
|
+
const formatters: Formatters<SkillDetailed> = {
|
|
15
|
+
plain(skill) {
|
|
16
|
+
const lines: string[] = [
|
|
17
|
+
chalk.bold(skill.name),
|
|
18
|
+
chalk.dim(skill.description),
|
|
19
|
+
chalk.dim(`Source: ${skill.sourcePackage} (${skill.sourcePath})`),
|
|
20
|
+
];
|
|
21
|
+
if (skill.files.length > 0) {
|
|
22
|
+
lines.push(chalk.dim(`Companion files: ${skill.files.join(", ")}`));
|
|
23
|
+
}
|
|
24
|
+
lines.push("", skill.content);
|
|
25
|
+
return lines.join("\n");
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
llm(skill) {
|
|
29
|
+
const lines: string[] = [
|
|
30
|
+
`## Skill: ${skill.name}`,
|
|
31
|
+
"",
|
|
32
|
+
`**Source:** ${skill.sourcePackage} (${skill.folderName})`,
|
|
33
|
+
];
|
|
34
|
+
if (skill.files.length > 0) {
|
|
35
|
+
lines.push(`**Companion files:** ${skill.files.join(", ")}`);
|
|
36
|
+
}
|
|
37
|
+
lines.push("", skill.content);
|
|
38
|
+
return lines.join("\n");
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
json(skill) {
|
|
42
|
+
return JSON.stringify(
|
|
43
|
+
{
|
|
44
|
+
name: skill.name,
|
|
45
|
+
description: skill.description,
|
|
46
|
+
source: skill.sourcePackage,
|
|
47
|
+
path: skill.sourcePath,
|
|
48
|
+
files: skill.files,
|
|
49
|
+
content: skill.content,
|
|
50
|
+
},
|
|
51
|
+
null,
|
|
52
|
+
2,
|
|
53
|
+
);
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export default formatters;
|
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
} from "../../shared/loaders/index.js";
|
|
6
6
|
import { DEFAULT_PACKAGES } from "../../shared/packages.js";
|
|
7
7
|
import type { SemanticPackage } from "../../shared/semanticPackage.js";
|
|
8
|
-
import { resolveSemanticPackages } from "../../shared/semanticPackage.js";
|
|
9
8
|
|
|
10
9
|
/** A resolved skill source directory from an installed package. */
|
|
11
10
|
export interface SkillSource {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import type { CommandDefinition } from "@canonical/cli-core";
|
|
4
4
|
import type { PragmaContext } from "../shared/context.js";
|
|
5
|
-
import { listCommand } from "./commands/index.js";
|
|
5
|
+
import { listCommand, lookupCommand } from "./commands/index.js";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Return all skill command definitions.
|
|
@@ -11,9 +11,13 @@ import { listCommand } from "./commands/index.js";
|
|
|
11
11
|
* @returns An array of CommandDefinitions for the skill subcommands.
|
|
12
12
|
*/
|
|
13
13
|
export function commands(ctx: PragmaContext): CommandDefinition[] {
|
|
14
|
-
return [listCommand(ctx)];
|
|
14
|
+
return [listCommand(ctx), lookupCommand(ctx)];
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export { specs as mcpSpecs } from "./mcp/index.js";
|
|
18
18
|
export type { SkillListResult } from "./operations/index.js";
|
|
19
|
-
export {
|
|
19
|
+
export {
|
|
20
|
+
discoverSkills,
|
|
21
|
+
listSkills,
|
|
22
|
+
lookupSkill,
|
|
23
|
+
} from "./operations/index.js";
|
|
@@ -1,38 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* MCP tool specs for the skill domain
|
|
2
|
+
* MCP tool specs for the skill domain — skill_list and skill_lookup,
|
|
3
|
+
* compiled from the skill read stories in `../stories.ts`. skill_lookup
|
|
4
|
+
* serves full SKILL.md content so agents can load skills over MCP.
|
|
3
5
|
*/
|
|
4
6
|
|
|
7
|
+
import {
|
|
8
|
+
compileLookupTool,
|
|
9
|
+
compileReadTool,
|
|
10
|
+
} from "../../shared/stories/index.js";
|
|
5
11
|
import type { ToolSpec } from "../../shared/ToolSpec.js";
|
|
6
|
-
import {
|
|
7
|
-
import { listSkills } from "../operations/index.js";
|
|
12
|
+
import { skillListStory, skillLookupStory } from "../stories.js";
|
|
8
13
|
|
|
9
14
|
const specs: readonly ToolSpec[] = [
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
description: "List available agent skills from design system packages.",
|
|
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 { skills, sources } = await listSkills(rt.cwd);
|
|
23
|
-
|
|
24
|
-
if (condensed) {
|
|
25
|
-
const text = skillListFmt.llm({ skills, sources, detailed: false });
|
|
26
|
-
return {
|
|
27
|
-
condensed: true,
|
|
28
|
-
text,
|
|
29
|
-
tokens: `~${Math.ceil(text.length / 4)}`,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return { data: { skills, sources }, meta: { count: skills.length } };
|
|
34
|
-
},
|
|
35
|
-
},
|
|
15
|
+
compileReadTool(skillListStory),
|
|
16
|
+
compileLookupTool(skillLookupStory),
|
|
36
17
|
];
|
|
37
18
|
|
|
38
19
|
export default specs;
|