@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
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modifier read stories — the single declaration of `modifier list` and
|
|
3
|
+
* `modifier lookup` for both surfaces.
|
|
4
|
+
*
|
|
5
|
+
* The story kernel compiles these into the CLI commands and MCP tools,
|
|
6
|
+
* so descriptions, parameters, resolution, and rendering live here once.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { createListView, createLookupView } from "#tui";
|
|
10
|
+
import { PragmaError } from "../../error/index.js";
|
|
11
|
+
import type { LookupStory, ReadStory } from "../shared/stories/index.js";
|
|
12
|
+
import type { ModifierFamily } from "../shared/types/index.js";
|
|
13
|
+
import {
|
|
14
|
+
createInkLookupOptions,
|
|
15
|
+
listFormatters,
|
|
16
|
+
lookupFormatters,
|
|
17
|
+
} from "./formatters/index.js";
|
|
18
|
+
import { modifierConfig } from "./modifierConfig.js";
|
|
19
|
+
import {
|
|
20
|
+
resolveModifierList,
|
|
21
|
+
resolveModifierLookup,
|
|
22
|
+
} from "./orchestration/index.js";
|
|
23
|
+
import type { ModifierListResolution } from "./types.js";
|
|
24
|
+
|
|
25
|
+
/** The `modifier list` / `modifier_list` read story. */
|
|
26
|
+
export const modifierListStory: ReadStory<
|
|
27
|
+
ModifierListResolution,
|
|
28
|
+
ModifierFamily[]
|
|
29
|
+
> = {
|
|
30
|
+
noun: "modifier",
|
|
31
|
+
verb: "list",
|
|
32
|
+
description: "List all modifier families",
|
|
33
|
+
toolDescription: "List all modifier families with their values.",
|
|
34
|
+
params: [],
|
|
35
|
+
examples: ["pragma modifier list", "pragma modifier list --llm"],
|
|
36
|
+
resolve: (rt) => resolveModifierList(rt),
|
|
37
|
+
toOutput: (resolution) => [...resolution.items],
|
|
38
|
+
formatters: listFormatters,
|
|
39
|
+
toEnvelope: (resolution) => ({
|
|
40
|
+
data: resolution.items,
|
|
41
|
+
meta: { count: resolution.items.length },
|
|
42
|
+
}),
|
|
43
|
+
renderInk: (items) =>
|
|
44
|
+
createListView({
|
|
45
|
+
heading: "Modifiers",
|
|
46
|
+
domain: "modifier",
|
|
47
|
+
items,
|
|
48
|
+
columns: modifierConfig.listColumns,
|
|
49
|
+
}),
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/** The `modifier lookup` / `modifier_lookup` read story. */
|
|
53
|
+
export const modifierLookupStory: LookupStory<ModifierFamily, ModifierFamily> =
|
|
54
|
+
{
|
|
55
|
+
noun: "modifier",
|
|
56
|
+
description: "Look up a modifier family and its values",
|
|
57
|
+
toolDescription: "Get one or more modifier families and their values.",
|
|
58
|
+
namesDescription: "Modifier family names or IRIs",
|
|
59
|
+
namesToolDescription: "Modifier family names or IRIs to look up",
|
|
60
|
+
examples: [
|
|
61
|
+
"pragma modifier lookup importance",
|
|
62
|
+
"pragma modifier lookup importance density",
|
|
63
|
+
"pragma modifier lookup importance --llm",
|
|
64
|
+
],
|
|
65
|
+
resolve: async (rt, names) => {
|
|
66
|
+
const contract = await resolveModifierLookup(rt.store, names);
|
|
67
|
+
return contract.result;
|
|
68
|
+
},
|
|
69
|
+
toFmtInput: (family) => family,
|
|
70
|
+
formatters: lookupFormatters,
|
|
71
|
+
emptyNamesError: () =>
|
|
72
|
+
PragmaError.invalidInput("names", "(empty)", {
|
|
73
|
+
recovery: {
|
|
74
|
+
message: "List available modifier families.",
|
|
75
|
+
cli: "pragma modifier list",
|
|
76
|
+
mcp: { tool: "modifier_list" },
|
|
77
|
+
},
|
|
78
|
+
}),
|
|
79
|
+
renderInk: (result) =>
|
|
80
|
+
createLookupView({
|
|
81
|
+
results: result.results,
|
|
82
|
+
errors: result.errors,
|
|
83
|
+
domain: "modifier",
|
|
84
|
+
options: createInkLookupOptions(),
|
|
85
|
+
}),
|
|
86
|
+
};
|
|
@@ -52,8 +52,10 @@ describe("ontology list command", () => {
|
|
|
52
52
|
const { text } = await executeOutput(cmd, {}, ctx);
|
|
53
53
|
|
|
54
54
|
expect(text).toContain("ds");
|
|
55
|
-
expect(text).toContain("classes
|
|
56
|
-
expect(text).toContain("
|
|
55
|
+
expect(text).toContain("classes");
|
|
56
|
+
expect(text).toContain("relations");
|
|
57
|
+
expect(text).toContain("attributes");
|
|
58
|
+
expect(text).toContain("Next: pragma ontology show <prefix>");
|
|
57
59
|
});
|
|
58
60
|
|
|
59
61
|
it("renders llm output", async () => {
|
|
@@ -65,7 +67,7 @@ describe("ontology list command", () => {
|
|
|
65
67
|
|
|
66
68
|
expect(text).toContain("## Ontologies");
|
|
67
69
|
expect(text).toContain("**ds:**");
|
|
68
|
-
expect(text).toContain("
|
|
70
|
+
expect(text).toContain("relations");
|
|
69
71
|
});
|
|
70
72
|
|
|
71
73
|
it("renders json output", async () => {
|
|
@@ -1,64 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type CommandDefinition,
|
|
3
|
-
type CommandResult,
|
|
4
|
-
createOutputResult,
|
|
5
|
-
} from "@canonical/cli-core";
|
|
6
|
-
import { PragmaError } from "#error";
|
|
7
|
-
import { createListView } from "#tui";
|
|
1
|
+
import type { CommandDefinition } from "@canonical/cli-core";
|
|
8
2
|
import type { PragmaContext } from "../../shared/context.js";
|
|
9
|
-
import
|
|
10
|
-
import {
|
|
11
|
-
import type { OntologySummary } from "../../shared/types/ontology.js";
|
|
12
|
-
import { listFormatters } from "../formatters/index.js";
|
|
13
|
-
import { listOntologies } from "../operations/index.js";
|
|
3
|
+
import { compileReadCommand } from "../../shared/stories/index.js";
|
|
4
|
+
import { ontologyListStory } from "../stories.js";
|
|
14
5
|
|
|
15
|
-
|
|
16
|
-
{ key: "prefix", label: "Prefix" },
|
|
17
|
-
{ key: "namespace", label: "Namespace" },
|
|
18
|
-
{ key: "classCount", label: "Classes" },
|
|
19
|
-
{ key: "propertyCount", label: "Properties" },
|
|
20
|
-
{ key: "anatomyCount", label: "Anatomies" },
|
|
21
|
-
];
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Builds the `pragma ontology list` command definition.
|
|
25
|
-
*
|
|
26
|
-
* Lists all loaded ontology namespaces with class and property counts.
|
|
27
|
-
*
|
|
28
|
-
* @param ctx - Pragma runtime context providing the ke store and config.
|
|
29
|
-
* @returns A command definition for `ontology list`.
|
|
30
|
-
*/
|
|
6
|
+
/** Wire the `pragma ontology list` CLI command from the ontology list story. */
|
|
31
7
|
export default function buildListCommand(
|
|
32
8
|
ctx: PragmaContext,
|
|
33
9
|
): CommandDefinition {
|
|
34
|
-
return
|
|
35
|
-
path: ["ontology", "list"],
|
|
36
|
-
description: "List loaded ontologies",
|
|
37
|
-
parameters: [],
|
|
38
|
-
meta: {
|
|
39
|
-
examples: ["pragma ontology list", "pragma ontology list --llm"],
|
|
40
|
-
},
|
|
41
|
-
execute: async (): Promise<CommandResult> => {
|
|
42
|
-
const ontologies = await listOntologies(ctx.store);
|
|
43
|
-
|
|
44
|
-
if (ontologies.length === 0) {
|
|
45
|
-
throw PragmaError.emptyResults("ontology", {
|
|
46
|
-
recovery: {
|
|
47
|
-
message: "Ensure design system packages are installed.",
|
|
48
|
-
},
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return createOutputResult(ontologies, {
|
|
53
|
-
plain: selectFormatter(ctx, listFormatters),
|
|
54
|
-
ink: (data) =>
|
|
55
|
-
createListView({
|
|
56
|
-
heading: "Ontologies",
|
|
57
|
-
domain: "ontology",
|
|
58
|
-
items: data,
|
|
59
|
-
columns: ontologyListColumns,
|
|
60
|
-
}),
|
|
61
|
-
});
|
|
62
|
-
},
|
|
63
|
-
};
|
|
10
|
+
return compileReadCommand(ctx, ontologyListStory);
|
|
64
11
|
}
|
|
@@ -3,7 +3,7 @@ import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
|
3
3
|
import createTestRuntime from "../../../testing/helpers/createTestRuntime.js";
|
|
4
4
|
import type { PragmaContext } from "../../shared/context.js";
|
|
5
5
|
import type { PragmaRuntime } from "../../shared/runtime.js";
|
|
6
|
-
import type {
|
|
6
|
+
import type { OntologyShowInput } from "../formatters/index.js";
|
|
7
7
|
import buildShowCommand from "./show.js";
|
|
8
8
|
|
|
9
9
|
let runtime: PragmaRuntime;
|
|
@@ -41,10 +41,69 @@ describe("ontology show command", () => {
|
|
|
41
41
|
const cmd = buildShowCommand(ctx);
|
|
42
42
|
const { value } = await executeOutput(cmd, { prefix: "ds" }, ctx);
|
|
43
43
|
|
|
44
|
-
const
|
|
45
|
-
expect(
|
|
46
|
-
expect(
|
|
47
|
-
|
|
44
|
+
const { ontology } = value as OntologyShowInput;
|
|
45
|
+
expect(ontology.prefix).toBe("ds");
|
|
46
|
+
expect(ontology.classes.length).toBeGreaterThan(0);
|
|
47
|
+
const propertyCount =
|
|
48
|
+
ontology.classes.reduce((n, c) => n + c.properties.length, 0) +
|
|
49
|
+
ontology.unattached.length;
|
|
50
|
+
expect(propertyCount).toBeGreaterThan(0);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("deep-dives into a class via the class param", async () => {
|
|
54
|
+
const ctx = makeCtx();
|
|
55
|
+
const cmd = buildShowCommand(ctx);
|
|
56
|
+
const { value, text } = await executeOutput(
|
|
57
|
+
cmd,
|
|
58
|
+
{ prefix: "ds", class: "Component" },
|
|
59
|
+
ctx,
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const { ontology } = value as OntologyShowInput;
|
|
63
|
+
expect(ontology.focus?.iri).toBe("ds:Component");
|
|
64
|
+
expect(text).toContain("Component");
|
|
65
|
+
expect(text).toContain("extends:");
|
|
66
|
+
// Follow-up querying: the deep dive hands over runnable SPARQL.
|
|
67
|
+
expect(text).toContain(
|
|
68
|
+
"SELECT ?instance WHERE { ?instance a ds:Component }",
|
|
69
|
+
);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("hides attributes by default and shows them with --properties", async () => {
|
|
73
|
+
const ctx = makeCtx();
|
|
74
|
+
const cmd = buildShowCommand(ctx);
|
|
75
|
+
|
|
76
|
+
const bare = await executeOutput(cmd, { prefix: "ds" }, ctx);
|
|
77
|
+
// Attributes render as `label: range` — absent by default.
|
|
78
|
+
expect(bare.text).not.toContain(": xsd:");
|
|
79
|
+
// hasModifierFamily is an object property (relation) — always shown.
|
|
80
|
+
expect(bare.text).toContain("hasModifierFamily");
|
|
81
|
+
|
|
82
|
+
const withProps = await executeOutput(
|
|
83
|
+
cmd,
|
|
84
|
+
{ prefix: "ds", properties: true },
|
|
85
|
+
ctx,
|
|
86
|
+
);
|
|
87
|
+
expect(withProps.text).toContain(": xsd:");
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it("expands IRIs with --full-uris", async () => {
|
|
91
|
+
const ctx = makeCtx({
|
|
92
|
+
globalFlags: { llm: true, format: "text" as const, verbose: false },
|
|
93
|
+
});
|
|
94
|
+
const cmd = buildShowCommand(ctx);
|
|
95
|
+
const { value, text } = await executeOutput(
|
|
96
|
+
cmd,
|
|
97
|
+
{ prefix: "ds", fullUris: true },
|
|
98
|
+
ctx,
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
const { ontology } = value as OntologyShowInput;
|
|
102
|
+
const component = ontology.classes.find((c) => c.label === "Component");
|
|
103
|
+
expect(component?.iri).toBe("https://ds.canonical.com/Component");
|
|
104
|
+
expect(text).toContain("https://ds.canonical.com/Component");
|
|
105
|
+
// The seeded footer query must stay valid SPARQL: full URIs need <...>.
|
|
106
|
+
expect(text).toMatch(/\?s a <https:\/\/ds\.canonical\.com\//);
|
|
48
107
|
});
|
|
49
108
|
|
|
50
109
|
it("completes ontology prefixes", async () => {
|
|
@@ -57,13 +116,30 @@ describe("ontology show command", () => {
|
|
|
57
116
|
expect(matches).toContain("ds");
|
|
58
117
|
});
|
|
59
118
|
|
|
119
|
+
it("completes class names for --class", async () => {
|
|
120
|
+
const ctx = makeCtx();
|
|
121
|
+
const cmd = buildShowCommand(ctx);
|
|
122
|
+
const classParam = cmd.parameters.find((p) => p.name === "class");
|
|
123
|
+
const complete = classParam?.complete;
|
|
124
|
+
|
|
125
|
+
expect(complete).toBeTypeOf("function");
|
|
126
|
+
const matches = await complete?.("comp", ctx);
|
|
127
|
+
expect(matches).toContain("Component");
|
|
128
|
+
// Case-insensitive prefix match, sorted, no non-matches.
|
|
129
|
+
expect(matches?.every((m) => m.toLowerCase().startsWith("comp"))).toBe(
|
|
130
|
+
true,
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
|
|
60
134
|
it("renders plain output", async () => {
|
|
61
135
|
const ctx = makeCtx();
|
|
62
136
|
const cmd = buildShowCommand(ctx);
|
|
63
137
|
const { text } = await executeOutput(cmd, { prefix: "ds" }, ctx);
|
|
64
138
|
|
|
65
|
-
expect(text).toContain("
|
|
66
|
-
expect(text).toContain("
|
|
139
|
+
expect(text).toContain("Ontology ds:");
|
|
140
|
+
expect(text).toContain("classes");
|
|
141
|
+
// Hierarchy: children render beneath their parent with tree branches.
|
|
142
|
+
expect(text).toContain("└─");
|
|
67
143
|
});
|
|
68
144
|
|
|
69
145
|
it("renders llm output", async () => {
|
|
@@ -73,7 +149,7 @@ describe("ontology show command", () => {
|
|
|
73
149
|
const cmd = buildShowCommand(ctx);
|
|
74
150
|
const { text } = await executeOutput(cmd, { prefix: "ds" }, ctx);
|
|
75
151
|
|
|
76
|
-
expect(text).toContain("## ds:");
|
|
152
|
+
expect(text).toContain("## Ontology ds:");
|
|
77
153
|
expect(text).toContain("### Classes");
|
|
78
154
|
});
|
|
79
155
|
|
|
@@ -84,7 +160,7 @@ describe("ontology show command", () => {
|
|
|
84
160
|
const cmd = buildShowCommand(ctx);
|
|
85
161
|
const { text } = await executeOutput(cmd, { prefix: "ds" }, ctx);
|
|
86
162
|
|
|
87
|
-
const parsed = JSON.parse(text) as
|
|
163
|
+
const parsed = JSON.parse(text) as { prefix: string };
|
|
88
164
|
expect(parsed.prefix).toBe("ds");
|
|
89
165
|
});
|
|
90
166
|
|
|
@@ -1,66 +1,14 @@
|
|
|
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 { listOntologies, showOntology } from "../operations/index.js";
|
|
3
|
+
import { compileReadCommand } from "../../shared/stories/index.js";
|
|
4
|
+
import { ontologyShowStory } from "../stories.js";
|
|
11
5
|
|
|
12
6
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* Displays detailed schema (classes and properties) for a given ontology
|
|
16
|
-
* prefix. Provides tab-completion for the prefix parameter.
|
|
17
|
-
*
|
|
18
|
-
* @param ctx - Pragma runtime context providing the ke store and config.
|
|
19
|
-
* @returns A command definition for `ontology show`.
|
|
7
|
+
* Wire the `pragma ontology show <prefix>` CLI command from the ontology
|
|
8
|
+
* show story.
|
|
20
9
|
*/
|
|
21
10
|
export default function buildShowCommand(
|
|
22
11
|
ctx: PragmaContext,
|
|
23
12
|
): CommandDefinition {
|
|
24
|
-
return
|
|
25
|
-
path: ["ontology", "show"],
|
|
26
|
-
description: "Show ontology schema details",
|
|
27
|
-
parameters: [
|
|
28
|
-
{
|
|
29
|
-
name: "prefix",
|
|
30
|
-
description: "Ontology prefix (e.g. 'ds', 'cs')",
|
|
31
|
-
type: "string",
|
|
32
|
-
positional: true,
|
|
33
|
-
required: true,
|
|
34
|
-
complete: async (partial: string) => {
|
|
35
|
-
const all = await listOntologies(ctx.store);
|
|
36
|
-
return all
|
|
37
|
-
.map((o) => o.prefix)
|
|
38
|
-
.filter((p) => p.toLowerCase().startsWith(partial.toLowerCase()));
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
],
|
|
42
|
-
meta: {
|
|
43
|
-
examples: ["pragma ontology show ds", "pragma ontology show cs --llm"],
|
|
44
|
-
},
|
|
45
|
-
execute: async (
|
|
46
|
-
params: Record<string, unknown>,
|
|
47
|
-
): Promise<CommandResult> => {
|
|
48
|
-
const prefix = params.prefix as string;
|
|
49
|
-
if (!prefix) {
|
|
50
|
-
throw PragmaError.invalidInput("prefix", "(empty)", {
|
|
51
|
-
recovery: {
|
|
52
|
-
message: "List loaded ontologies to find valid prefixes.",
|
|
53
|
-
cli: "pragma ontology list",
|
|
54
|
-
mcp: { tool: "ontology_list" },
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const result = await showOntology(ctx.store, prefix);
|
|
60
|
-
|
|
61
|
-
return createOutputResult(result, {
|
|
62
|
-
plain: selectFormatter(ctx, showFormatters),
|
|
63
|
-
});
|
|
64
|
-
},
|
|
65
|
-
};
|
|
13
|
+
return compileReadCommand(ctx, ontologyShowStory);
|
|
66
14
|
}
|
|
@@ -1,33 +1,39 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
|
-
import compactUri from "../../shared/compactUri.js";
|
|
3
2
|
import type { Formatters } from "../../shared/formatters.js";
|
|
4
|
-
import { PREFIX_MAP } from "../../shared/prefixes.js";
|
|
5
3
|
import type { OntologySummary } from "../../shared/types/index.js";
|
|
6
4
|
|
|
7
5
|
/**
|
|
8
6
|
* Formatters for `pragma ontology list` output.
|
|
9
7
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
8
|
+
* One line per namespace mirroring the `ontology show` summary line —
|
|
9
|
+
* name, metadata, and split counts — plus a next-command footer, so the
|
|
10
|
+
* list is the entry point of the same drill-down path
|
|
11
|
+
* (`list → show <prefix> → show <prefix> --class <Class>`).
|
|
12
|
+
*
|
|
13
|
+
* - **plain**: chalk-styled lines with counts and a dimmed footer.
|
|
14
|
+
* - **llm**: the same content as condensed Markdown bullets.
|
|
15
|
+
* - **json**: the {@link OntologySummary} array itself.
|
|
13
16
|
*/
|
|
14
17
|
const formatters: Formatters<readonly OntologySummary[]> = {
|
|
15
18
|
plain(ontologies) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
(o)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
const lines = ontologies.map(
|
|
20
|
+
(o) =>
|
|
21
|
+
`${chalk.bold(prefixLabel(o))} ${o.namespace} ${chalk.dim(`— ${summaryLine(o)}`)}`,
|
|
22
|
+
);
|
|
23
|
+
lines.push("");
|
|
24
|
+
lines.push(chalk.dim("Next: pragma ontology show <prefix>"));
|
|
25
|
+
return lines.join("\n");
|
|
22
26
|
},
|
|
23
27
|
|
|
24
28
|
llm(ontologies) {
|
|
25
29
|
const lines = ["## Ontologies", ""];
|
|
26
30
|
for (const o of ontologies) {
|
|
27
31
|
lines.push(
|
|
28
|
-
`- **${o
|
|
32
|
+
`- **${prefixLabel(o)}** \`${o.namespace}\` — ${summaryLine(o)}`,
|
|
29
33
|
);
|
|
30
34
|
}
|
|
35
|
+
lines.push("");
|
|
36
|
+
lines.push("Next: `ontology show <prefix>` for the class hierarchy.");
|
|
31
37
|
return lines.join("\n");
|
|
32
38
|
},
|
|
33
39
|
|
|
@@ -37,3 +43,22 @@ const formatters: Formatters<readonly OntologySummary[]> = {
|
|
|
37
43
|
};
|
|
38
44
|
|
|
39
45
|
export default formatters;
|
|
46
|
+
|
|
47
|
+
/** `ds:` for prefixed namespaces, a placeholder for unprefixed ones. */
|
|
48
|
+
function prefixLabel(o: OntologySummary): string {
|
|
49
|
+
return o.prefix ? `${o.prefix}:` : "(no prefix)";
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** The same counts-and-metadata line `ontology show` leads with. */
|
|
53
|
+
function summaryLine(o: OntologySummary): string {
|
|
54
|
+
const parts = [
|
|
55
|
+
`${o.classCount} classes`,
|
|
56
|
+
`${o.relationCount} relations`,
|
|
57
|
+
`${o.attributeCount} attributes`,
|
|
58
|
+
];
|
|
59
|
+
if (o.shapeCount > 0) parts.push(`${o.shapeCount} shapes`);
|
|
60
|
+
if (o.anatomyCount > 0) parts.push(`${o.anatomyCount} anatomies`);
|
|
61
|
+
if (o.version) parts.push(`v${o.version}`);
|
|
62
|
+
if (o.title) parts.push(o.title);
|
|
63
|
+
return parts.join(" · ");
|
|
64
|
+
}
|