@canonical/pragma-cli 0.30.0 → 0.32.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/dist/pragma +0 -0
- package/package.json +27 -40
- package/src/bin.ts +292 -11
- package/src/capabilities/block/blockList.verb.ts +150 -0
- package/src/capabilities/block/index.ts +25 -0
- package/src/capabilities/block/pack.ts +155 -0
- package/src/capabilities/block/parity.test.ts +180 -0
- package/src/capabilities/block/tierChain.ts +78 -0
- package/src/capabilities/capabilities/capabilities.render.ts +89 -0
- package/src/capabilities/capabilities/capabilities.test.ts +131 -0
- package/src/capabilities/capabilities/capabilities.verb.ts +48 -0
- package/src/capabilities/capabilities/catalog.ts +144 -0
- package/src/capabilities/capabilities/hints.ts +221 -0
- package/src/capabilities/capabilities/index.ts +13 -0
- package/src/capabilities/capabilities/types.ts +58 -0
- package/src/capabilities/colophon/collectColophon.ts +68 -0
- package/src/capabilities/colophon/colophon.render.test.ts +87 -0
- package/src/capabilities/colophon/colophon.render.ts +38 -0
- package/src/capabilities/colophon/colophon.test.ts +241 -0
- package/src/capabilities/colophon/colophon.verb.ts +41 -0
- package/src/capabilities/colophon/index.ts +6 -0
- package/src/capabilities/colophon/markdownTerminal.test.ts +50 -0
- package/src/capabilities/colophon/markdownTerminal.ts +85 -0
- package/src/capabilities/colophon/pragmaColophon.ts +66 -0
- package/src/capabilities/colophon/types.ts +29 -0
- package/src/capabilities/config/collectConfigShow.ts +32 -0
- package/src/capabilities/config/field.render.ts +28 -0
- package/src/capabilities/config/field.test.ts +188 -0
- package/src/capabilities/config/fields.ts +152 -0
- package/src/capabilities/config/index.ts +6 -0
- package/src/capabilities/config/runField.ts +59 -0
- package/src/capabilities/config/runSet.ts +38 -0
- package/src/capabilities/config/set.test.ts +207 -0
- package/src/capabilities/config/set.verb.ts +70 -0
- package/src/capabilities/config/show.render.ts +61 -0
- package/src/capabilities/config/show.verb.ts +45 -0
- package/src/capabilities/config/types.ts +27 -0
- package/src/capabilities/create/byteEquality.subprocess.test.ts +88 -0
- package/src/capabilities/create/byteEquality.test.ts +222 -0
- package/src/capabilities/create/compiledCreate.subprocess.test.ts +152 -0
- package/src/capabilities/create/create.mcp.test.ts +139 -0
- package/src/capabilities/create/create.render.ts +50 -0
- package/src/capabilities/create/create.test.ts +403 -0
- package/src/capabilities/create/create.verb.ts +435 -0
- package/src/capabilities/create/cwdJail.test.ts +129 -0
- package/src/capabilities/create/generatorToVerbSpec.ts +111 -0
- package/src/capabilities/create/index.ts +25 -0
- package/src/capabilities/create/pathJail.ts +73 -0
- package/src/capabilities/create/pickGenerator.ts +63 -0
- package/src/capabilities/create/templates.embedded.generated.ts +53 -0
- package/src/capabilities/create/types.ts +8 -0
- package/src/capabilities/doctor/checks/checkConfigFile.ts +41 -0
- package/src/capabilities/doctor/checks/checkKeStore.ts +39 -0
- package/src/capabilities/doctor/checks/checkMcpCommands.ts +108 -0
- package/src/capabilities/doctor/checks/checkMcpConfigured.ts +61 -0
- package/src/capabilities/doctor/checks/checkNodeVersion.ts +25 -0
- package/src/capabilities/doctor/checks/checkPackageRefs.ts +73 -0
- package/src/capabilities/doctor/checks/checkPragmaVersion.ts +22 -0
- package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +111 -0
- package/src/capabilities/doctor/checks/checkShellCompletions.ts +131 -0
- package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +60 -0
- package/src/capabilities/doctor/doctor.render.ts +116 -0
- package/src/capabilities/doctor/doctor.test.ts +179 -0
- package/src/capabilities/doctor/doctor.verb.ts +46 -0
- package/src/capabilities/doctor/index.ts +6 -0
- package/src/capabilities/doctor/runChecks.ts +76 -0
- package/src/capabilities/doctor/types.ts +41 -0
- package/src/capabilities/emptyRecovery.test.ts +112 -0
- package/src/capabilities/graph/index.ts +21 -0
- package/src/capabilities/graph/inspect.render.ts +38 -0
- package/src/capabilities/graph/inspect.test.ts +80 -0
- package/src/capabilities/graph/inspect.verb.ts +51 -0
- package/src/capabilities/graph/query.render.ts +77 -0
- package/src/capabilities/graph/query.test.ts +156 -0
- package/src/capabilities/graph/query.verb.ts +58 -0
- package/src/capabilities/graph/runQuery.ts +49 -0
- package/src/capabilities/index.ts +54 -0
- package/src/capabilities/info/collectInfo.ts +76 -0
- package/src/capabilities/info/index.ts +6 -0
- package/src/capabilities/info/info.render.ts +72 -0
- package/src/capabilities/info/info.test.ts +127 -0
- package/src/capabilities/info/info.verb.ts +46 -0
- package/src/capabilities/info/types.ts +42 -0
- package/src/capabilities/lazy.test.ts +89 -0
- package/src/capabilities/meta/complete.verb.ts +52 -0
- package/src/capabilities/meta/index.ts +15 -0
- package/src/capabilities/meta/mcp.verb.ts +35 -0
- package/src/capabilities/modifier/index.ts +15 -0
- package/src/capabilities/modifier/pack.ts +64 -0
- package/src/capabilities/ontology/index.ts +12 -0
- package/src/capabilities/ontology/ontology.test.ts +94 -0
- package/src/capabilities/ontology/queries.ts +197 -0
- package/src/capabilities/ontology/render.ts +87 -0
- package/src/capabilities/ontology/verbs.ts +170 -0
- package/src/capabilities/prompt/index.ts +18 -0
- package/src/capabilities/prompt/prompt.render.ts +70 -0
- package/src/capabilities/prompt/prompt.test.ts +119 -0
- package/src/capabilities/prompt/types.ts +30 -0
- package/src/capabilities/prompt/verbs.ts +93 -0
- package/src/capabilities/resources/index.ts +15 -0
- package/src/capabilities/resources/provider.ts +231 -0
- package/src/capabilities/resources/resources.test.ts +114 -0
- package/src/capabilities/roundtrip.test.ts +107 -0
- package/src/capabilities/setup/index.ts +6 -0
- package/src/capabilities/setup/operations/setupCompletions.ts +108 -0
- package/src/capabilities/setup/operations/setupGenerator.ts +307 -0
- package/src/capabilities/setup/operations/setupLsp.ts +61 -0
- package/src/capabilities/setup/operations/setupMcp.ts +85 -0
- package/src/capabilities/setup/operations/setupSkills.ts +199 -0
- package/src/capabilities/setup/setup.render.ts +49 -0
- package/src/capabilities/setup/setup.test.ts +351 -0
- package/src/capabilities/setup/setup.verb.ts +209 -0
- package/src/capabilities/setup/shell.ts +85 -0
- package/src/capabilities/setup/types.ts +42 -0
- package/src/capabilities/shared/assertExecOk.ts +106 -0
- package/src/capabilities/shared/packageManager.ts +62 -0
- package/src/capabilities/shared/registry.ts +70 -0
- package/src/capabilities/skill/discover.ts +178 -0
- package/src/capabilities/skill/index.ts +12 -0
- package/src/capabilities/skill/render.ts +60 -0
- package/src/capabilities/skill/skill.test.ts +142 -0
- package/src/capabilities/skill/verbs.ts +100 -0
- package/src/capabilities/sources/collectStatus.ts +87 -0
- package/src/capabilities/sources/index.ts +15 -0
- package/src/capabilities/sources/installSkills.ts +124 -0
- package/src/capabilities/sources/runUpdate.ts +407 -0
- package/src/capabilities/sources/sources.test.ts +642 -0
- package/src/capabilities/sources/status.render.ts +56 -0
- package/src/capabilities/sources/status.verb.ts +42 -0
- package/src/capabilities/sources/types.ts +51 -0
- package/src/capabilities/sources/update.render.ts +35 -0
- package/src/capabilities/sources/update.verb.ts +76 -0
- package/src/capabilities/standard/index.ts +18 -0
- package/src/capabilities/standard/pack.ts +128 -0
- package/src/capabilities/standard/parity.test.ts +208 -0
- package/src/capabilities/surface.test.ts +208 -0
- package/src/capabilities/tier/index.ts +19 -0
- package/src/capabilities/tier/lookup.render.ts +34 -0
- package/src/capabilities/tier/lookup.test.ts +68 -0
- package/src/capabilities/tier/lookup.verb.ts +44 -0
- package/src/capabilities/tier/pack.ts +28 -0
- package/src/capabilities/tier/runLookup.ts +59 -0
- package/src/capabilities/token/addConfig.render.ts +27 -0
- package/src/capabilities/token/addConfig.test.ts +62 -0
- package/src/capabilities/token/addConfig.verb.ts +40 -0
- package/src/capabilities/token/index.ts +19 -0
- package/src/capabilities/token/pack.ts +58 -0
- package/src/capabilities/token/runAddConfig.ts +95 -0
- package/src/capabilities/upgrade/index.ts +6 -0
- package/src/capabilities/upgrade/runUpgrade.ts +119 -0
- package/src/capabilities/upgrade/types.ts +21 -0
- package/src/capabilities/upgrade/upgrade.render.ts +55 -0
- package/src/capabilities/upgrade/upgrade.test.ts +372 -0
- package/src/capabilities/upgrade/upgrade.verb.ts +56 -0
- package/src/constants.test.ts +33 -0
- package/src/constants.ts +38 -68
- package/src/index.ts +27 -134
- package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +340 -0
- package/src/kernel/completion/bashDrive.test.ts +73 -0
- package/src/kernel/completion/complete.test.ts +101 -0
- package/src/kernel/completion/complete.ts +77 -0
- package/src/kernel/completion/emitScripts.test.ts +173 -0
- package/src/kernel/completion/emitScripts.ts +122 -0
- package/src/kernel/completion/entitySource.test.ts +198 -0
- package/src/kernel/completion/entitySource.ts +269 -0
- package/src/kernel/completion/index.ts +42 -0
- package/src/kernel/completion/model.test.ts +405 -0
- package/src/kernel/completion/model.ts +259 -0
- package/src/kernel/completion/parse.test.ts +338 -0
- package/src/kernel/completion/parse.ts +294 -0
- package/src/kernel/completion/rank.test.ts +100 -0
- package/src/kernel/completion/rank.ts +118 -0
- package/src/kernel/completion/resolve.test.ts +204 -0
- package/src/kernel/completion/resolve.ts +133 -0
- package/src/kernel/completion/safety.test.ts +374 -0
- package/src/kernel/completion/templates/bash.ts +249 -0
- package/src/kernel/completion/templates/fish.ts +245 -0
- package/src/kernel/completion/templates/shared.ts +134 -0
- package/src/kernel/completion/templates/zsh.ts +246 -0
- package/src/kernel/completion/types.ts +153 -0
- package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +11 -0
- package/src/kernel/config/defaults.ts +28 -0
- package/src/kernel/config/evaluateProjectConfig.ts +119 -0
- package/src/kernel/config/findProjectConfig.ts +45 -0
- package/src/kernel/config/firstRun.test.ts +60 -0
- package/src/kernel/config/firstRun.ts +91 -0
- package/src/kernel/config/globalConfig.ts +94 -0
- package/src/kernel/config/index.ts +35 -0
- package/src/kernel/config/paths.ts +39 -0
- package/src/kernel/config/readConfig.test.ts +245 -0
- package/src/kernel/config/readConfig.ts +94 -0
- package/src/kernel/config/schema.ts +56 -0
- package/src/kernel/config/types.ts +106 -0
- package/src/kernel/config/writeConfigField.ts +82 -0
- package/src/kernel/error/PragmaError.test.ts +119 -0
- package/src/kernel/error/PragmaError.ts +182 -0
- package/src/kernel/error/constants.ts +38 -0
- package/src/kernel/error/fromTaskError.test.ts +83 -0
- package/src/kernel/error/fromTaskError.ts +80 -0
- package/src/kernel/error/index.ts +23 -0
- package/src/kernel/error/recovery.test.ts +60 -0
- package/src/kernel/error/recovery.ts +49 -0
- package/src/kernel/error/renderError.ts +101 -0
- package/src/kernel/error/serialize.ts +28 -0
- package/src/kernel/error/types.ts +62 -0
- package/src/kernel/packs/collect.test.ts +138 -0
- package/src/kernel/packs/collect.ts +108 -0
- package/src/kernel/packs/compile.test.ts +229 -0
- package/src/kernel/packs/compile.ts +315 -0
- package/src/kernel/packs/disclosure.test.ts +200 -0
- package/src/kernel/packs/disclosure.ts +98 -0
- package/src/kernel/packs/glob.ts +39 -0
- package/src/kernel/packs/graphql/buildLookupDocument.ts +397 -0
- package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +217 -0
- package/src/kernel/packs/graphql/nameMap.ts +67 -0
- package/src/kernel/packs/graphqlSource.test.ts +383 -0
- package/src/kernel/packs/iri.ts +78 -0
- package/src/kernel/packs/renderPack.ts +196 -0
- package/src/kernel/packs/resolveEntity.ts +232 -0
- package/src/kernel/packs/runBodies.ts +157 -0
- package/src/kernel/packs/sample.ts +60 -0
- package/src/kernel/packs/schema.ts +328 -0
- package/src/kernel/packs/sparql/applyFilters.ts +83 -0
- package/src/kernel/packs/sparql/applySearch.ts +33 -0
- package/src/kernel/packs/sparql/buildLookupQuery.ts +180 -0
- package/src/kernel/packs/sparql/escape.ts +22 -0
- package/src/kernel/packs/sparql/runSelect.test.ts +80 -0
- package/src/kernel/packs/sparql/runSelect.ts +84 -0
- package/src/kernel/packs/toolDescription.test.ts +81 -0
- package/src/kernel/packs/types.ts +337 -0
- package/src/kernel/packs/uniqueness.ts +35 -0
- package/src/kernel/project/cli/buildProgram.test.ts +387 -0
- package/src/kernel/project/cli/buildProgram.ts +280 -0
- package/src/kernel/project/cli/dispatch.test.ts +288 -0
- package/src/kernel/project/cli/dispatch.ts +334 -0
- package/src/kernel/project/cli/exitCodes.test.ts +59 -0
- package/src/kernel/project/cli/exitCodes.ts +68 -0
- package/src/kernel/project/cli/globalFlags.test.ts +99 -0
- package/src/kernel/project/cli/globalFlags.ts +149 -0
- package/src/kernel/project/cli/helpFormat.ts +58 -0
- package/src/kernel/project/cli/index.ts +21 -0
- package/src/kernel/project/cli/interactionSeam.test.ts +99 -0
- package/src/kernel/project/cli/rootHelp.ts +218 -0
- package/src/kernel/project/cli/suggest.test.ts +54 -0
- package/src/kernel/project/cli/suggest.ts +67 -0
- package/src/kernel/project/cli/suggestNames.ts +122 -0
- package/src/kernel/project/cli/verbHelp.test.ts +138 -0
- package/src/kernel/project/cli/verbHelp.ts +144 -0
- package/src/kernel/project/mcp/buildServer.ts +70 -0
- package/src/kernel/project/mcp/envelope.ts +44 -0
- package/src/kernel/project/mcp/index.ts +8 -0
- package/src/kernel/project/mcp/instructions.ts +48 -0
- package/src/kernel/project/mcp/parity.test.ts +72 -0
- package/src/kernel/project/mcp/prompts/prompts.test.ts +96 -0
- package/src/kernel/project/mcp/prompts/provider.ts +74 -0
- package/src/kernel/project/mcp/prompts/source.ts +194 -0
- package/src/kernel/project/mcp/registerVerb.test.ts +238 -0
- package/src/kernel/project/mcp/registerVerb.ts +296 -0
- package/src/kernel/project/mcp/serve.ts +34 -0
- package/src/kernel/project/mcp/toolDescriptions.test.ts +80 -0
- package/src/kernel/render/__snapshots__/renderers.test.ts.snap +127 -0
- package/src/kernel/render/compactUri.ts +25 -0
- package/src/kernel/render/contracts.ts +72 -0
- package/src/kernel/render/disclosure.ts +44 -0
- package/src/kernel/render/envelope.ts +50 -0
- package/src/kernel/render/formatters.ts +30 -0
- package/src/kernel/render/index.ts +30 -0
- package/src/kernel/render/prefixes.ts +21 -0
- package/src/kernel/render/renderers.test.ts +171 -0
- package/src/kernel/render/renderers.ts +429 -0
- package/src/kernel/render/writeStdout.test.ts +43 -0
- package/src/kernel/render/writeStdout.ts +49 -0
- package/src/kernel/runtime/boot.test.ts +69 -0
- package/src/kernel/runtime/boot.ts +59 -0
- package/src/kernel/runtime/facade.test.ts +125 -0
- package/src/kernel/runtime/facade.ts +47 -0
- package/src/kernel/runtime/graphpack/build.ts +148 -0
- package/src/kernel/runtime/graphpack/buildIndex.ts +229 -0
- package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +8 -0
- package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +4 -0
- package/src/kernel/runtime/graphpack/embedded/sample.ttl +39 -0
- package/src/kernel/runtime/graphpack/embedded.ts +70 -0
- package/src/kernel/runtime/graphpack/graphpack.test.ts +153 -0
- package/src/kernel/runtime/graphpack/hash.ts +46 -0
- package/src/kernel/runtime/graphpack/index.ts +21 -0
- package/src/kernel/runtime/graphpack/manifest.ts +55 -0
- package/src/kernel/runtime/graphpack/read.ts +102 -0
- package/src/kernel/runtime/graphpack/types.ts +111 -0
- package/src/kernel/runtime/index.ts +15 -0
- package/src/kernel/runtime/loadSession.ts +56 -0
- package/src/kernel/runtime/lock.ts +90 -0
- package/src/kernel/runtime/paths.ts +37 -0
- package/src/kernel/runtime/probe.test.ts +16 -0
- package/src/kernel/runtime/probe.ts +39 -0
- package/src/kernel/runtime/readEntity.ts +83 -0
- package/src/kernel/runtime/refs/gitOps.ts +88 -0
- package/src/kernel/runtime/refs/parseRef.test.ts +34 -0
- package/src/kernel/runtime/refs/parseRef.ts +103 -0
- package/src/kernel/runtime/refs/resolve.ts +320 -0
- package/src/kernel/runtime/resolveSources.test.ts +154 -0
- package/src/kernel/runtime/resolveSources.ts +66 -0
- package/src/kernel/runtime/store.test.ts +94 -0
- package/src/kernel/runtime/store.ts +90 -0
- package/src/kernel/runtime/storeless.test.ts +86 -0
- package/src/kernel/runtime/types.ts +210 -0
- package/src/kernel/runtime/wasmEmbed.test.ts +142 -0
- package/src/kernel/spec/asVerb.ts +23 -0
- package/src/kernel/spec/emitSurface.test.ts +65 -0
- package/src/kernel/spec/emitSurface.ts +223 -0
- package/src/kernel/spec/index.ts +34 -0
- package/src/kernel/spec/surfaceConformance.test.ts +94 -0
- package/src/kernel/spec/surfaceConformance.ts +135 -0
- package/src/kernel/spec/types.ts +233 -0
- package/src/kernel/spec/validate.test.ts +81 -0
- package/src/kernel/spec/validate.ts +125 -0
- package/src/testing/PARITY_GAPS.test.ts +32 -0
- package/src/testing/PARITY_GAPS.ts +179 -0
- package/src/testing/behavioral/README.md +164 -0
- package/src/testing/behavioral/agentSession.mcp.test.ts +160 -0
- package/src/testing/behavioral/autoLlm.e2e.test.ts +44 -0
- package/src/testing/behavioral/completion.test.ts +132 -0
- package/src/testing/behavioral/disclosure.test.ts +103 -0
- package/src/testing/behavioral/errorMatrix.mcp.test.ts +120 -0
- package/src/testing/behavioral/errorMatrix.storeless.test.ts +123 -0
- package/src/testing/behavioral/exitCodes.e2e.test.ts +53 -0
- package/src/testing/behavioral/firstRun.e2e.test.ts +40 -0
- package/src/testing/behavioral/harness.foundation.test.ts +136 -0
- package/src/testing/behavioral/journeys.cli.test.ts +129 -0
- package/src/testing/behavioral/liveReadSurface.ts +80 -0
- package/src/testing/behavioral/mcpServe.e2e.test.ts +21 -0
- package/src/testing/behavioral/mcpSurface.test.ts +139 -0
- package/src/testing/behavioral/parity.test.ts +224 -0
- package/src/testing/behavioral/rootCli.e2e.test.ts +62 -0
- package/src/testing/eval/__snapshots__/eval.test.ts.snap +201 -0
- package/src/testing/eval/cases/assembly.ts +195 -0
- package/src/testing/eval/cases/effectful.ts +245 -0
- package/src/testing/eval/cases/readNouns.ts +232 -0
- package/src/testing/eval/cases/stable.ts +163 -0
- package/src/testing/eval/eval.test.ts +74 -0
- package/src/testing/eval/harness.ts +91 -0
- package/src/testing/eval/report.ts +58 -0
- package/src/testing/fixtures/blockGraph.ts +112 -0
- package/src/testing/fixtures/completionFixture.ts +239 -0
- package/src/testing/fixtures/fixtureCapability.ts +175 -0
- package/src/testing/fixtures/graph/canonical.ts +184 -0
- package/src/testing/fixtures/packs/recipe.ts +78 -0
- package/src/testing/helpers/fixtureGraph.ts +148 -0
- package/src/testing/helpers/golden.ts +45 -0
- package/src/testing/helpers/packRuntime.ts +118 -0
- package/src/testing/helpers/parity.ts +86 -0
- package/src/testing/helpers/projectCli.ts +35 -0
- package/src/testing/helpers/projectMcp.ts +145 -0
- package/src/testing/helpers/runCli.ts +128 -0
- package/src/testing/perf/budgets.test.ts +164 -0
- package/src/testing/perf/budgets.ts +37 -0
- package/src/testing/perf/globalSetup.ts +30 -0
- package/src/testing/perf/measure.ts +97 -0
- package/src/testing/setupXdgIsolation.ts +17 -5
- package/src/types.ts +42 -0
- package/README.md +0 -429
- package/src/bin.test.ts +0 -54
- package/src/compile-validation.runner.ts +0 -137
- package/src/compile-validation.ts +0 -191
- package/src/completions/computeSocketPath.test.ts +0 -26
- package/src/completions/computeSocketPath.ts +0 -16
- package/src/completions/constants.ts +0 -18
- package/src/completions/handleQuery.test.ts +0 -93
- package/src/completions/handleQuery.ts +0 -30
- package/src/completions/index.ts +0 -14
- package/src/completions/queryCompletions.test.ts +0 -100
- package/src/completions/queryCompletions.ts +0 -61
- package/src/completions/querySocket.test.ts +0 -70
- package/src/completions/querySocket.ts +0 -44
- package/src/completions/startCompletionsServer.test.ts +0 -74
- package/src/completions/startCompletionsServer.ts +0 -75
- package/src/completions/startCompletionsServer.unit.test.ts +0 -131
- package/src/completions/waitForSocket.test.ts +0 -27
- package/src/completions/waitForSocket.ts +0 -27
- package/src/config/configExists.ts +0 -14
- package/src/config/defaultConfig.test.ts +0 -33
- package/src/config/defaultConfig.ts +0 -59
- package/src/config/defaults.json +0 -17
- package/src/config/findProjectConfigPath.test.ts +0 -53
- package/src/config/findProjectConfigPath.ts +0 -36
- package/src/config/index.ts +0 -21
- package/src/config/mergeConfigFileUpdate.ts +0 -58
- package/src/config/parseConfigValues.ts +0 -215
- package/src/config/readConfig.test.ts +0 -395
- package/src/config/readConfig.ts +0 -21
- package/src/config/readConfigLayers.test.ts +0 -107
- package/src/config/readConfigLayers.ts +0 -115
- package/src/config/resolveConfigPath.test.ts +0 -20
- package/src/config/resolveConfigPath.ts +0 -11
- package/src/config/resolveGlobalConfigPath.ts +0 -13
- package/src/config/resolveWriteConfigPath.test.ts +0 -53
- package/src/config/resolveWriteConfigPath.ts +0 -31
- package/src/config/types.ts +0 -121
- package/src/config/writeConfig.ts +0 -37
- package/src/domains/block/blockConfig.ts +0 -97
- package/src/domains/block/commands/index.ts +0 -5
- package/src/domains/block/commands/list.test.ts +0 -111
- package/src/domains/block/commands/list.ts +0 -11
- package/src/domains/block/commands/lookup.test.ts +0 -187
- package/src/domains/block/commands/lookup.ts +0 -14
- package/src/domains/block/commands/sample.ts +0 -55
- package/src/domains/block/formatters/index.ts +0 -5
- package/src/domains/block/formatters/list.test.ts +0 -107
- package/src/domains/block/formatters/list.ts +0 -50
- package/src/domains/block/formatters/lookup.test.ts +0 -318
- package/src/domains/block/formatters/lookup.ts +0 -149
- package/src/domains/block/formatters/sample.ts +0 -21
- package/src/domains/block/formatters/types.ts +0 -16
- package/src/domains/block/helpers/index.ts +0 -4
- package/src/domains/block/helpers/resolveAspects.test.ts +0 -64
- package/src/domains/block/helpers/resolveAspects.ts +0 -35
- package/src/domains/block/index.ts +0 -25
- package/src/domains/block/mcp/index.ts +0 -2
- package/src/domains/block/mcp/specs.ts +0 -67
- package/src/domains/block/operations/index.ts +0 -5
- package/src/domains/block/operations/list.test.ts +0 -80
- package/src/domains/block/operations/list.ts +0 -72
- package/src/domains/block/operations/lookup.test.ts +0 -129
- package/src/domains/block/operations/lookup.ts +0 -446
- package/src/domains/block/operations/sample.ts +0 -41
- package/src/domains/block/orchestration/blockEmptyError.test.ts +0 -26
- package/src/domains/block/orchestration/blockEmptyError.ts +0 -19
- package/src/domains/block/orchestration/buildBlockFilters.ts +0 -12
- package/src/domains/block/orchestration/enrichBlocks.ts +0 -41
- package/src/domains/block/orchestration/index.ts +0 -5
- package/src/domains/block/orchestration/resolveBlockList.ts +0 -39
- package/src/domains/block/orchestration/resolveBlockLookup.ts +0 -35
- package/src/domains/block/stories.test.ts +0 -28
- package/src/domains/block/stories.ts +0 -254
- package/src/domains/block/types.ts +0 -30
- package/src/domains/config/commands/channel.test.ts +0 -112
- package/src/domains/config/commands/channel.ts +0 -86
- package/src/domains/config/commands/configScope.ts +0 -46
- package/src/domains/config/commands/framework.test.ts +0 -105
- package/src/domains/config/commands/framework.ts +0 -91
- package/src/domains/config/commands/index.ts +0 -6
- package/src/domains/config/commands/show.test.ts +0 -61
- package/src/domains/config/commands/show.ts +0 -11
- package/src/domains/config/commands/tier.test.ts +0 -95
- package/src/domains/config/commands/tier.ts +0 -84
- package/src/domains/config/commands/trace.test.ts +0 -165
- package/src/domains/config/commands/trace.ts +0 -83
- package/src/domains/config/formatters/channel.test.ts +0 -70
- package/src/domains/config/formatters/channel.ts +0 -37
- package/src/domains/config/formatters/framework.ts +0 -37
- package/src/domains/config/formatters/index.ts +0 -6
- package/src/domains/config/formatters/show.test.ts +0 -153
- package/src/domains/config/formatters/show.ts +0 -89
- package/src/domains/config/formatters/tier.test.ts +0 -86
- package/src/domains/config/formatters/tier.ts +0 -48
- package/src/domains/config/formatters/trace.ts +0 -28
- package/src/domains/config/index.ts +0 -36
- package/src/domains/config/mcp/index.ts +0 -2
- package/src/domains/config/mcp/specs.ts +0 -100
- package/src/domains/config/operations/index.ts +0 -6
- package/src/domains/config/operations/show.test.ts +0 -78
- package/src/domains/config/operations/show.ts +0 -48
- package/src/domains/config/operations/types.ts +0 -20
- package/src/domains/config/operations/validateChannel.test.ts +0 -36
- package/src/domains/config/operations/validateChannel.ts +0 -24
- package/src/domains/config/operations/validateFramework.ts +0 -24
- package/src/domains/config/operations/validateTier.test.ts +0 -56
- package/src/domains/config/operations/validateTier.ts +0 -35
- package/src/domains/config/stories.ts +0 -42
- package/src/domains/config/tasks/index.ts +0 -6
- package/src/domains/config/tasks/setChannel.ts +0 -21
- package/src/domains/config/tasks/setFramework.ts +0 -21
- package/src/domains/config/tasks/setTier.ts +0 -20
- package/src/domains/config/tasks/setTrace.ts +0 -20
- package/src/domains/config/tasks/writeConfigField.ts +0 -41
- 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/create/index.ts +0 -15
- package/src/domains/create/mcp/index.ts +0 -2
- package/src/domains/create/mcp/specs.ts +0 -168
- package/src/domains/doctor/commands/doctor.test.ts +0 -75
- package/src/domains/doctor/commands/doctor.ts +0 -43
- package/src/domains/doctor/commands/index.ts +0 -2
- package/src/domains/doctor/formatters/doctor.test.ts +0 -117
- package/src/domains/doctor/formatters/doctor.ts +0 -84
- package/src/domains/doctor/formatters/index.ts +0 -2
- package/src/domains/doctor/index.ts +0 -9
- package/src/domains/doctor/mcp/index.ts +0 -2
- package/src/domains/doctor/mcp/specs.ts +0 -41
- package/src/domains/doctor/operations/checks/checkConfigFile.ts +0 -42
- package/src/domains/doctor/operations/checks/checkKeStore.ts +0 -38
- package/src/domains/doctor/operations/checks/checkMcpCommands.ts +0 -130
- package/src/domains/doctor/operations/checks/checkMcpConfigured.ts +0 -65
- package/src/domains/doctor/operations/checks/checkNodeVersion.ts +0 -25
- package/src/domains/doctor/operations/checks/checkPackageRefs.ts +0 -58
- package/src/domains/doctor/operations/checks/checkPragmaVersion.ts +0 -20
- package/src/domains/doctor/operations/checks/checkShellCompletions.ts +0 -42
- package/src/domains/doctor/operations/checks/checkSkillsSymlinked.ts +0 -64
- package/src/domains/doctor/operations/checks/index.ts +0 -10
- package/src/domains/doctor/operations/checks.test.ts +0 -305
- package/src/domains/doctor/operations/index.ts +0 -3
- package/src/domains/doctor/operations/runChecks.test.ts +0 -176
- package/src/domains/doctor/operations/runChecks.ts +0 -78
- package/src/domains/doctor/operations/types.ts +0 -20
- package/src/domains/graph/commands/index.ts +0 -4
- package/src/domains/graph/commands/inspect.test.ts +0 -94
- package/src/domains/graph/commands/inspect.ts +0 -63
- package/src/domains/graph/commands/query.test.ts +0 -92
- package/src/domains/graph/commands/query.ts +0 -60
- package/src/domains/graph/formatters/index.ts +0 -4
- package/src/domains/graph/formatters/inspect.ts +0 -50
- package/src/domains/graph/formatters/query.ts +0 -37
- package/src/domains/graph/helpers/index.ts +0 -3
- package/src/domains/graph/helpers/resolveUri.test.ts +0 -50
- package/src/domains/graph/helpers/resolveUri.ts +0 -77
- package/src/domains/graph/index.ts +0 -22
- package/src/domains/graph/mcp/index.ts +0 -2
- package/src/domains/graph/mcp/specs.ts +0 -82
- package/src/domains/graph/operations/executeQuery.test.ts +0 -68
- package/src/domains/graph/operations/executeQuery.ts +0 -32
- package/src/domains/graph/operations/index.ts +0 -4
- package/src/domains/graph/operations/inspectUri.test.ts +0 -101
- package/src/domains/graph/operations/inspectUri.ts +0 -64
- package/src/domains/graphql/commands/build.test.ts +0 -196
- package/src/domains/graphql/commands/build.ts +0 -117
- package/src/domains/graphql/commands/check.test.ts +0 -141
- package/src/domains/graphql/commands/check.ts +0 -81
- package/src/domains/graphql/commands/index.ts +0 -5
- package/src/domains/graphql/commands/serve.test.ts +0 -40
- package/src/domains/graphql/commands/serve.ts +0 -131
- package/src/domains/graphql/constants.ts +0 -10
- package/src/domains/graphql/formatters/index.ts +0 -3
- package/src/domains/graphql/formatters/report.ts +0 -78
- package/src/domains/graphql/helpers/gatherSources.test.ts +0 -92
- package/src/domains/graphql/helpers/gatherSources.ts +0 -58
- package/src/domains/graphql/helpers/index.ts +0 -6
- package/src/domains/graphql/helpers/parsePrefixes.test.ts +0 -44
- package/src/domains/graphql/helpers/parsePrefixes.ts +0 -38
- package/src/domains/graphql/helpers/resolveSourceFiles.test.ts +0 -56
- package/src/domains/graphql/helpers/resolveSourceFiles.ts +0 -45
- package/src/domains/graphql/helpers/routeGraphql.test.ts +0 -43
- package/src/domains/graphql/helpers/routeGraphql.ts +0 -28
- package/src/domains/graphql/index.ts +0 -24
- package/src/domains/graphql/operations/compileSchema.test.ts +0 -95
- package/src/domains/graphql/operations/compileSchema.ts +0 -107
- package/src/domains/graphql/operations/createSchemaServer.test.ts +0 -50
- package/src/domains/graphql/operations/createSchemaServer.ts +0 -75
- package/src/domains/graphql/operations/index.ts +0 -12
- package/src/domains/graphql/types.ts +0 -29
- package/src/domains/info/commands/index.ts +0 -4
- package/src/domains/info/commands/info.test.ts +0 -88
- package/src/domains/info/commands/info.ts +0 -47
- package/src/domains/info/commands/upgrade.test.ts +0 -183
- package/src/domains/info/commands/upgrade.ts +0 -153
- package/src/domains/info/constants.test.ts +0 -22
- package/src/domains/info/constants.ts +0 -15
- package/src/domains/info/formatters/index.ts +0 -8
- package/src/domains/info/formatters/info.test.ts +0 -207
- package/src/domains/info/formatters/info.ts +0 -131
- package/src/domains/info/formatters/upgrade.test.ts +0 -133
- package/src/domains/info/formatters/upgrade.ts +0 -68
- package/src/domains/info/index.ts +0 -9
- package/src/domains/info/mcp/index.ts +0 -2
- package/src/domains/info/mcp/specs.ts +0 -65
- package/src/domains/info/operations/checkRegistryVersion.test.ts +0 -124
- package/src/domains/info/operations/checkRegistryVersion.ts +0 -45
- package/src/domains/info/operations/collectInfo.test.ts +0 -122
- package/src/domains/info/operations/collectInfo.ts +0 -94
- package/src/domains/info/operations/collectStoreSummary.test.ts +0 -61
- package/src/domains/info/operations/collectStoreSummary.ts +0 -42
- package/src/domains/info/operations/index.ts +0 -5
- package/src/domains/info/types.test-d.ts +0 -35
- package/src/domains/info/types.ts +0 -54
- package/src/domains/llm/capabilities.test.ts +0 -91
- package/src/domains/llm/commands/capabilities.ts +0 -28
- package/src/domains/llm/commands/index.ts +0 -4
- package/src/domains/llm/commands/llm.ts +0 -37
- package/src/domains/llm/data/commandReference.ts +0 -97
- package/src/domains/llm/data/decisionTrees.ts +0 -50
- package/src/domains/llm/data/index.ts +0 -6
- package/src/domains/llm/data/toolCatalog.ts +0 -190
- package/src/domains/llm/formatters/capabilities.ts +0 -50
- package/src/domains/llm/formatters/index.ts +0 -4
- package/src/domains/llm/formatters/orientation.ts +0 -53
- package/src/domains/llm/index.ts +0 -9
- package/src/domains/llm/llmCommand.test.ts +0 -93
- package/src/domains/llm/mcp/index.ts +0 -2
- package/src/domains/llm/mcp/specs.ts +0 -94
- package/src/domains/llm/operations/collectContext.ts +0 -47
- package/src/domains/llm/operations/index.ts +0 -3
- package/src/domains/llm/types.ts +0 -72
- package/src/domains/modifier/commands/index.ts +0 -5
- package/src/domains/modifier/commands/list.test.ts +0 -57
- package/src/domains/modifier/commands/list.ts +0 -9
- package/src/domains/modifier/commands/lookup.test.ts +0 -91
- package/src/domains/modifier/commands/lookup.ts +0 -14
- package/src/domains/modifier/commands/sample.ts +0 -53
- package/src/domains/modifier/formatters/index.ts +0 -8
- package/src/domains/modifier/formatters/list.test.ts +0 -38
- package/src/domains/modifier/formatters/list.ts +0 -22
- package/src/domains/modifier/formatters/lookup.test.ts +0 -33
- package/src/domains/modifier/formatters/lookup.ts +0 -50
- package/src/domains/modifier/formatters/sample.ts +0 -15
- package/src/domains/modifier/index.ts +0 -27
- package/src/domains/modifier/mcp/index.ts +0 -2
- package/src/domains/modifier/mcp/specs.ts +0 -65
- package/src/domains/modifier/modifierConfig.ts +0 -36
- package/src/domains/modifier/operations/index.ts +0 -5
- package/src/domains/modifier/operations/list.test.ts +0 -39
- package/src/domains/modifier/operations/list.ts +0 -41
- package/src/domains/modifier/operations/lookup.test.ts +0 -37
- package/src/domains/modifier/operations/lookup.ts +0 -67
- package/src/domains/modifier/operations/sample.ts +0 -32
- package/src/domains/modifier/orchestration/index.ts +0 -3
- package/src/domains/modifier/orchestration/modifierEmptyError.test.ts +0 -26
- package/src/domains/modifier/orchestration/modifierEmptyError.ts +0 -15
- package/src/domains/modifier/orchestration/resolveModifierList.ts +0 -16
- package/src/domains/modifier/orchestration/resolveModifierLookup.ts +0 -33
- package/src/domains/modifier/stories.test.ts +0 -20
- package/src/domains/modifier/stories.ts +0 -77
- package/src/domains/modifier/types.ts +0 -5
- package/src/domains/ontology/commands/index.ts +0 -4
- package/src/domains/ontology/commands/list.test.ts +0 -82
- package/src/domains/ontology/commands/list.ts +0 -11
- package/src/domains/ontology/commands/show.test.ts +0 -103
- package/src/domains/ontology/commands/show.ts +0 -14
- package/src/domains/ontology/formatters/index.ts +0 -4
- package/src/domains/ontology/formatters/list.ts +0 -39
- package/src/domains/ontology/formatters/show.ts +0 -105
- package/src/domains/ontology/helpers/findNamespace.ts +0 -23
- package/src/domains/ontology/helpers/index.ts +0 -7
- package/src/domains/ontology/helpers/queryClasses.ts +0 -50
- package/src/domains/ontology/helpers/queryProperties.ts +0 -57
- package/src/domains/ontology/helpers/resolvePrefix.ts +0 -45
- package/src/domains/ontology/index.ts +0 -26
- package/src/domains/ontology/mcp/index.ts +0 -2
- package/src/domains/ontology/mcp/specs.ts +0 -16
- package/src/domains/ontology/operations/index.ts +0 -5
- package/src/domains/ontology/operations/listOntologies.test.ts +0 -45
- package/src/domains/ontology/operations/listOntologies.ts +0 -101
- package/src/domains/ontology/operations/showOntology.test.ts +0 -65
- package/src/domains/ontology/operations/showOntology.ts +0 -41
- package/src/domains/ontology/operations/showOntologyRaw.test.ts +0 -39
- package/src/domains/ontology/operations/showOntologyRaw.ts +0 -50
- package/src/domains/ontology/stories.test.ts +0 -36
- package/src/domains/ontology/stories.ts +0 -108
- package/src/domains/refs/commands/updateRefs.ts +0 -52
- package/src/domains/refs/formatters/updateRefs.ts +0 -27
- package/src/domains/refs/index.ts +0 -27
- package/src/domains/refs/operations/gitOps.test.ts +0 -155
- package/src/domains/refs/operations/gitOps.ts +0 -92
- package/src/domains/refs/operations/index.ts +0 -10
- package/src/domains/refs/operations/parseRef.test.ts +0 -157
- package/src/domains/refs/operations/parseRef.ts +0 -114
- package/src/domains/refs/operations/paths.test.ts +0 -98
- package/src/domains/refs/operations/paths.ts +0 -91
- package/src/domains/refs/operations/readGlobalRefs.test.ts +0 -63
- package/src/domains/refs/operations/readGlobalRefs.ts +0 -37
- package/src/domains/refs/operations/updateRefs.test.ts +0 -167
- package/src/domains/refs/operations/updateRefs.ts +0 -181
- package/src/domains/setup/commands/all.ts +0 -58
- package/src/domains/setup/commands/completions.ts +0 -85
- package/src/domains/setup/commands/entrypoints.test.ts +0 -170
- package/src/domains/setup/commands/index.ts +0 -6
- package/src/domains/setup/commands/lsp.ts +0 -49
- package/src/domains/setup/commands/mcp.ts +0 -119
- package/src/domains/setup/commands/skills.test.ts +0 -68
- package/src/domains/setup/commands/skills.ts +0 -110
- package/src/domains/setup/formatters/index.ts +0 -2
- package/src/domains/setup/formatters/skills.test.ts +0 -103
- package/src/domains/setup/formatters/skills.ts +0 -112
- package/src/domains/setup/formatters/types.ts +0 -7
- package/src/domains/setup/helpers/completionScripts.test.ts +0 -58
- package/src/domains/setup/helpers/completionScripts.ts +0 -92
- package/src/domains/setup/helpers/constants.ts +0 -2
- package/src/domains/setup/helpers/detectShell.test.ts +0 -48
- package/src/domains/setup/helpers/detectShell.ts +0 -20
- package/src/domains/setup/helpers/index.ts +0 -12
- package/src/domains/setup/helpers/runSetupTask.test.ts +0 -277
- package/src/domains/setup/helpers/runSetupTask.ts +0 -221
- package/src/domains/setup/index.ts +0 -33
- package/src/domains/setup/operations/index.ts +0 -6
- package/src/domains/setup/operations/setupAll.test.ts +0 -48
- package/src/domains/setup/operations/setupAll.ts +0 -41
- package/src/domains/setup/operations/setupCompletions.test.ts +0 -94
- package/src/domains/setup/operations/setupCompletions.ts +0 -54
- package/src/domains/setup/operations/setupLsp.test.ts +0 -29
- package/src/domains/setup/operations/setupLsp.ts +0 -17
- package/src/domains/setup/operations/setupMcp.test.ts +0 -120
- package/src/domains/setup/operations/setupMcp.ts +0 -108
- package/src/domains/setup/operations/setupSkills.test.ts +0 -191
- package/src/domains/setup/operations/setupSkills.ts +0 -160
- package/src/domains/setup/types.ts +0 -18
- package/src/domains/shared/ToolSpec.ts +0 -49
- package/src/domains/shared/bootStore.ts +0 -135
- package/src/domains/shared/buildQuery.ts +0 -18
- package/src/domains/shared/compactUri.test.ts +0 -32
- package/src/domains/shared/compactUri.ts +0 -21
- package/src/domains/shared/context.ts +0 -16
- package/src/domains/shared/contracts.ts +0 -164
- package/src/domains/shared/createInteractivePromptSession.test.ts +0 -439
- package/src/domains/shared/createInteractivePromptSession.ts +0 -236
- package/src/domains/shared/emptyErrorRecovery.test.ts +0 -109
- package/src/domains/shared/extractLocalName.test.ts +0 -21
- package/src/domains/shared/extractLocalName.ts +0 -14
- package/src/domains/shared/filters/buildChannelFilter.test.ts +0 -52
- package/src/domains/shared/filters/buildChannelFilter.ts +0 -41
- package/src/domains/shared/filters/buildFilterConfig.ts +0 -15
- package/src/domains/shared/filters/buildFilters.test.ts +0 -33
- package/src/domains/shared/filters/buildFilters.ts +0 -30
- package/src/domains/shared/filters/buildTierFilter.test.ts +0 -78
- package/src/domains/shared/filters/buildTierFilter.ts +0 -69
- package/src/domains/shared/filters/describeFilters.ts +0 -14
- package/src/domains/shared/filters/index.ts +0 -10
- package/src/domains/shared/formatters.ts +0 -82
- package/src/domains/shared/loaders/bundledLoader.test.ts +0 -248
- package/src/domains/shared/loaders/bundledLoader.ts +0 -206
- package/src/domains/shared/loaders/gitLoader.ts +0 -31
- package/src/domains/shared/loaders/index.ts +0 -9
- package/src/domains/shared/loaders/localLoader.ts +0 -87
- package/src/domains/shared/loaders/readPackageDir.ts +0 -147
- package/src/domains/shared/loaders/storyAssetsPlugin.test.ts +0 -84
- package/src/domains/shared/loaders/storyAssetsPlugin.ts +0 -46
- package/src/domains/shared/lookupMany.test.ts +0 -120
- package/src/domains/shared/lookupMany.ts +0 -85
- package/src/domains/shared/mergeAndParseRefs.test.ts +0 -89
- package/src/domains/shared/mergeAndParseRefs.ts +0 -44
- package/src/domains/shared/namespaces.ts +0 -18
- package/src/domains/shared/packages.ts +0 -20
- package/src/domains/shared/pickRandom.ts +0 -22
- package/src/domains/shared/prefixes.ts +0 -37
- package/src/domains/shared/renderers.ts +0 -410
- package/src/domains/shared/resolveConfiguredGraphs.test.ts +0 -27
- package/src/domains/shared/resolveConfiguredGraphs.ts +0 -41
- package/src/domains/shared/runtime.ts +0 -61
- package/src/domains/shared/sampleFormatters.ts +0 -47
- package/src/domains/shared/semanticPackage.ts +0 -112
- package/src/domains/shared/stories/compileLookupCommand.test.ts +0 -145
- package/src/domains/shared/stories/compileLookupCommand.ts +0 -100
- package/src/domains/shared/stories/compileLookupTool.test.ts +0 -105
- package/src/domains/shared/stories/compileLookupTool.ts +0 -96
- package/src/domains/shared/stories/compileReadCommand.test.ts +0 -121
- package/src/domains/shared/stories/compileReadCommand.ts +0 -48
- package/src/domains/shared/stories/compileReadTool.test.ts +0 -64
- package/src/domains/shared/stories/compileReadTool.ts +0 -38
- package/src/domains/shared/stories/condense.test.ts +0 -18
- package/src/domains/shared/stories/condense.ts +0 -15
- package/src/domains/shared/stories/index.ts +0 -20
- package/src/domains/shared/stories/normalizeNames.test.ts +0 -20
- package/src/domains/shared/stories/normalizeNames.ts +0 -22
- package/src/domains/shared/stories/pack/applyPackFilters.test.ts +0 -102
- package/src/domains/shared/stories/pack/applyPackFilters.ts +0 -76
- package/src/domains/shared/stories/pack/buildLookupQuery.test.ts +0 -51
- package/src/domains/shared/stories/pack/buildLookupQuery.ts +0 -80
- package/src/domains/shared/stories/pack/collectPackStories.test.ts +0 -108
- package/src/domains/shared/stories/pack/collectPackStories.ts +0 -76
- package/src/domains/shared/stories/pack/compilePackCommands.ts +0 -40
- package/src/domains/shared/stories/pack/compilePackStories.test.ts +0 -146
- package/src/domains/shared/stories/pack/compilePackStories.ts +0 -253
- package/src/domains/shared/stories/pack/compilePackToolSpecs.ts +0 -43
- package/src/domains/shared/stories/pack/index.ts +0 -28
- package/src/domains/shared/stories/pack/runSelectQuery.ts +0 -31
- package/src/domains/shared/stories/pack/standardParity.test.ts +0 -308
- package/src/domains/shared/stories/pack/types.ts +0 -104
- package/src/domains/shared/stories/pack/validateStoryPackDefinition.test.ts +0 -240
- package/src/domains/shared/stories/pack/validateStoryPackDefinition.ts +0 -408
- package/src/domains/shared/stories/projectCliParameters.test.ts +0 -59
- package/src/domains/shared/stories/projectCliParameters.ts +0 -57
- package/src/domains/shared/stories/projectToolParams.test.ts +0 -50
- package/src/domains/shared/stories/projectToolParams.ts +0 -32
- package/src/domains/shared/stories/requirePragmaContext.test.ts +0 -23
- package/src/domains/shared/stories/requirePragmaContext.ts +0 -23
- package/src/domains/shared/stories/resolveLookupDetailed.test.ts +0 -57
- package/src/domains/shared/stories/resolveLookupDetailed.ts +0 -27
- package/src/domains/shared/stories/types.ts +0 -171
- package/src/domains/shared/suggestions/detectCrossDomain.test.ts +0 -43
- package/src/domains/shared/suggestions/detectCrossDomain.ts +0 -116
- package/src/domains/shared/suggestions/expandGlob.test.ts +0 -92
- package/src/domains/shared/suggestions/expandGlob.ts +0 -52
- package/src/domains/shared/suggestions/expandLookupQueries.ts +0 -57
- package/src/domains/shared/suggestions/index.ts +0 -7
- package/src/domains/shared/suggestions/listDomainNames.ts +0 -61
- package/src/domains/shared/suggestions/suggestNames.test.ts +0 -70
- package/src/domains/shared/suggestions/suggestNames.ts +0 -130
- package/src/domains/shared/types/block.ts +0 -107
- package/src/domains/shared/types/common.ts +0 -33
- package/src/domains/shared/types/graph.ts +0 -17
- package/src/domains/shared/types/index.ts +0 -50
- package/src/domains/shared/types/modifier.ts +0 -22
- package/src/domains/shared/types/ontology.ts +0 -50
- package/src/domains/shared/types/runtime.ts +0 -24
- package/src/domains/shared/types/sample.ts +0 -17
- package/src/domains/shared/types/standard.ts +0 -64
- package/src/domains/shared/types/tier.ts +0 -15
- package/src/domains/shared/types/token.ts +0 -30
- package/src/domains/skill/commands/index.ts +0 -4
- package/src/domains/skill/commands/list.test.ts +0 -115
- package/src/domains/skill/commands/list.ts +0 -11
- package/src/domains/skill/commands/lookup.test.ts +0 -118
- package/src/domains/skill/commands/lookup.ts +0 -14
- package/src/domains/skill/formatters/index.ts +0 -3
- package/src/domains/skill/formatters/list.test.ts +0 -140
- package/src/domains/skill/formatters/list.ts +0 -119
- package/src/domains/skill/formatters/lookup.test.ts +0 -46
- package/src/domains/skill/formatters/lookup.ts +0 -57
- package/src/domains/skill/formatters/types.ts +0 -8
- package/src/domains/skill/helpers/index.ts +0 -6
- package/src/domains/skill/helpers/parseFrontmatter.test.ts +0 -122
- package/src/domains/skill/helpers/parseFrontmatter.ts +0 -112
- package/src/domains/skill/helpers/resolveSkillSources.ts +0 -70
- package/src/domains/skill/index.ts +0 -23
- package/src/domains/skill/mcp/index.ts +0 -2
- package/src/domains/skill/mcp/specs.ts +0 -19
- package/src/domains/skill/operations/discover.test.ts +0 -176
- package/src/domains/skill/operations/discover.ts +0 -59
- package/src/domains/skill/operations/index.ts +0 -5
- package/src/domains/skill/operations/list.test.ts +0 -76
- package/src/domains/skill/operations/list.ts +0 -47
- package/src/domains/skill/operations/lookup.test.ts +0 -91
- package/src/domains/skill/operations/lookup.ts +0 -70
- package/src/domains/skill/stories.test.ts +0 -43
- package/src/domains/skill/stories.ts +0 -103
- package/src/domains/skill/types.ts +0 -33
- 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 -11
- package/src/domains/standard/commands/lookup.test.ts +0 -135
- package/src/domains/standard/commands/lookup.ts +0 -14
- 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 -89
- 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 -33
- 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/stories.test.ts +0 -24
- package/src/domains/standard/stories.ts +0 -151
- 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 -9
- 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 -12
- 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/domains/tier/stories.test.ts +0 -22
- package/src/domains/tier/stories.ts +0 -52
- package/src/domains/token/commands/add-config.test.ts +0 -68
- package/src/domains/token/commands/add-config.ts +0 -62
- package/src/domains/token/commands/index.ts +0 -6
- package/src/domains/token/commands/list.test.ts +0 -82
- package/src/domains/token/commands/list.ts +0 -54
- package/src/domains/token/commands/lookup.test.ts +0 -125
- package/src/domains/token/commands/lookup.ts +0 -95
- package/src/domains/token/commands/sample.ts +0 -53
- package/src/domains/token/formatters/index.ts +0 -8
- package/src/domains/token/formatters/list.test.ts +0 -37
- package/src/domains/token/formatters/list.ts +0 -24
- package/src/domains/token/formatters/lookup.test.ts +0 -61
- package/src/domains/token/formatters/lookup.ts +0 -107
- package/src/domains/token/formatters/sample.ts +0 -16
- package/src/domains/token/index.ts +0 -40
- package/src/domains/token/mcp/index.ts +0 -2
- package/src/domains/token/mcp/specs.ts +0 -195
- package/src/domains/token/operations/add-config.test.ts +0 -68
- package/src/domains/token/operations/add-config.ts +0 -61
- package/src/domains/token/operations/index.ts +0 -8
- package/src/domains/token/operations/list.test.ts +0 -50
- package/src/domains/token/operations/list.ts +0 -52
- package/src/domains/token/operations/lookup.test.ts +0 -42
- package/src/domains/token/operations/lookup.ts +0 -75
- package/src/domains/token/operations/sample.ts +0 -32
- package/src/domains/token/orchestration/index.ts +0 -3
- package/src/domains/token/orchestration/resolveTokenList.ts +0 -17
- package/src/domains/token/orchestration/resolveTokenLookup.ts +0 -33
- package/src/domains/token/orchestration/tokenEmptyError.test.ts +0 -33
- package/src/domains/token/orchestration/tokenEmptyError.ts +0 -20
- package/src/domains/token/tokenConfig.ts +0 -38
- package/src/domains/token/types.ts +0 -6
- package/src/domains/trace/commands/clear.ts +0 -71
- package/src/domains/trace/commands/index.ts +0 -5
- package/src/domains/trace/commands/sessions.ts +0 -32
- package/src/domains/trace/commands/show.ts +0 -145
- package/src/domains/trace/formatters/index.ts +0 -9
- package/src/domains/trace/formatters/sessions.ts +0 -80
- package/src/domains/trace/formatters/show.ts +0 -122
- package/src/domains/trace/index.ts +0 -17
- package/src/domains/trace/operations/index.ts +0 -8
- package/src/domains/trace/operations/listSessions.test.ts +0 -55
- package/src/domains/trace/operations/listSessions.ts +0 -52
- package/src/domains/trace/operations/readTraceLog.test.ts +0 -100
- package/src/domains/trace/operations/readTraceLog.ts +0 -104
- package/src/domains/trace/tracePlugin.test.ts +0 -171
- package/src/domains/trace/tracePlugin.ts +0 -159
- package/src/domains/trace/types.ts +0 -65
- package/src/embedWasm.ts +0 -42
- package/src/error/PragmaError.test.ts +0 -121
- package/src/error/PragmaError.ts +0 -177
- package/src/error/constants.ts +0 -12
- package/src/error/index.ts +0 -4
- package/src/error/types.ts +0 -55
- package/src/mcp/createMcpServer.test.ts +0 -41
- package/src/mcp/createMcpServer.ts +0 -53
- package/src/mcp/error/buildRecovery.test.ts +0 -37
- package/src/mcp/error/buildRecovery.ts +0 -17
- package/src/mcp/error/index.ts +0 -12
- package/src/mcp/error/serializeError.test.ts +0 -121
- package/src/mcp/error/serializeError.ts +0 -31
- package/src/mcp/error/serializeErrorPayload.test.ts +0 -38
- package/src/mcp/error/serializeErrorPayload.ts +0 -34
- package/src/mcp/error/types.ts +0 -59
- package/src/mcp/index.ts +0 -15
- package/src/mcp/registerResources.test.ts +0 -566
- package/src/mcp/registerResources.ts +0 -9
- package/src/mcp/resources/buildGraphIndex.ts +0 -167
- package/src/mcp/resources/buildResourceList.test.ts +0 -97
- package/src/mcp/resources/buildResourceList.ts +0 -176
- package/src/mcp/resources/classifyEntity.test.ts +0 -40
- package/src/mcp/resources/classifyEntity.ts +0 -27
- package/src/mcp/resources/constants.ts +0 -105
- package/src/mcp/resources/displayPredicates.ts +0 -62
- package/src/mcp/resources/pickFirstValue.test.ts +0 -29
- package/src/mcp/resources/pickFirstValue.ts +0 -26
- package/src/mcp/resources/pickPrimaryType.test.ts +0 -41
- package/src/mcp/resources/pickPrimaryType.ts +0 -26
- package/src/mcp/resources/rankUriCompletions.test.ts +0 -52
- package/src/mcp/resources/rankUriCompletions.ts +0 -64
- package/src/mcp/resources/readEntity.ts +0 -169
- package/src/mcp/resources/registerResources.ts +0 -126
- package/src/mcp/resources/types.ts +0 -128
- package/src/mcp/runMcpServer.test.ts +0 -66
- package/src/mcp/runMcpServer.ts +0 -24
- package/src/mcp/tools/index.ts +0 -66
- package/src/mcp/tools/registerFromSpec.ts +0 -97
- package/src/mcp/tools/registerTools.test.ts +0 -1201
- package/src/mcp/types.ts +0 -66
- package/src/mcp/utils/estimateTokens.test.ts +0 -14
- package/src/mcp/utils/estimateTokens.ts +0 -9
- package/src/mcp/utils/index.ts +0 -11
- package/src/mcp/utils/wrapTool.test.ts +0 -109
- package/src/mcp/utils/wrapTool.ts +0 -81
- package/src/package-manager/constants.ts +0 -29
- package/src/package-manager/detectInstallSource.test.ts +0 -23
- package/src/package-manager/detectInstallSource.ts +0 -111
- package/src/package-manager/detectLocalInstall.test.ts +0 -16
- package/src/package-manager/detectLocalInstall.ts +0 -43
- package/src/package-manager/detectPackageManager.test.ts +0 -81
- package/src/package-manager/detectPackageManager.ts +0 -30
- package/src/package-manager/index.ts +0 -6
- package/src/package-manager/types.ts +0 -10
- package/src/pipeline/collectCommands.test.ts +0 -37
- package/src/pipeline/collectCommands.ts +0 -60
- package/src/pipeline/constants.ts +0 -14
- package/src/pipeline/createProgram.test.ts +0 -112
- package/src/pipeline/createProgram.ts +0 -89
- package/src/pipeline/formatTerminal.test.ts +0 -43
- package/src/pipeline/formatTerminal.ts +0 -53
- package/src/pipeline/index.ts +0 -22
- package/src/pipeline/mapExitCode.test.ts +0 -41
- package/src/pipeline/mapExitCode.ts +0 -12
- package/src/pipeline/parseGlobalFlags.test.ts +0 -92
- package/src/pipeline/parseGlobalFlags.ts +0 -46
- package/src/pipeline/renderError.test.ts +0 -151
- package/src/pipeline/renderError.ts +0 -129
- package/src/pipeline/resolveCommandKind.test.ts +0 -68
- package/src/pipeline/resolveCommandKind.ts +0 -78
- package/src/pipeline/runCli.orchestration.test.ts +0 -419
- package/src/pipeline/runCli.test.ts +0 -70
- package/src/pipeline/runCli.ts +0 -268
- package/src/pipeline/types.ts +0 -17
- package/src/testing/cli.ts +0 -43
- package/src/testing/createTestMcpClient.ts +0 -68
- package/src/testing/dsFixtures.ts +0 -506
- package/src/testing/fixtures/canonical-config.json +0 -4
- package/src/testing/fixtures/canonical.ttl +0 -437
- package/src/testing/fixtures/filtered-config.json +0 -4
- package/src/testing/fixtures.ts +0 -34
- package/src/testing/graphqlFixtures.ts +0 -72
- package/src/testing/helpers/assertParity.ts +0 -28
- package/src/testing/helpers/createTestMcpClient.ts +0 -40
- package/src/testing/helpers/createTestRuntime.ts +0 -67
- package/src/testing/index.ts +0 -25
- package/src/testing/integration/__snapshots__/executor-golden.test.ts.snap +0 -1207
- package/src/testing/integration/agent-session.test.ts +0 -148
- package/src/testing/integration/boot.test.ts +0 -105
- package/src/testing/integration/cli-user-stories.test.ts +0 -198
- package/src/testing/integration/cross-binary-byte-equality.test.ts +0 -129
- package/src/testing/integration/edge-cases.test.ts +0 -263
- package/src/testing/integration/executor-execution.test.ts +0 -101
- package/src/testing/integration/executor-golden.test.ts +0 -145
- package/src/testing/integration/mcp-surface.test.ts +0 -580
- package/src/testing/integration/parity.test.ts +0 -547
- package/src/testing/regression/0001-skill-discovery-granularity.test.ts +0 -71
- package/src/testing/standardParityFixtures.ts +0 -92
- package/src/testing/store.ts +0 -39
- package/src/testing/storyFixtures.ts +0 -63
- package/src/testing/types.ts +0 -20
- package/src/tui/components/BulletList/BulletList.tsx +0 -46
- package/src/tui/components/BulletList/index.ts +0 -2
- package/src/tui/components/BulletList/types.ts +0 -6
- package/src/tui/components/Card/Card.tsx +0 -73
- package/src/tui/components/Card/index.ts +0 -1
- package/src/tui/components/Card/types.ts +0 -12
- package/src/tui/components/CodeBlock/CodeBlock.tsx +0 -37
- package/src/tui/components/CodeBlock/index.ts +0 -2
- package/src/tui/components/CodeBlock/types.ts +0 -6
- package/src/tui/components/DataRow/DataRow.tsx +0 -80
- package/src/tui/components/DataRow/index.ts +0 -2
- package/src/tui/components/DataRow/types.ts +0 -14
- package/src/tui/components/FieldRow/FieldRow.tsx +0 -24
- package/src/tui/components/FieldRow/index.ts +0 -2
- package/src/tui/components/FieldRow/types.ts +0 -10
- package/src/tui/components/HeaderRow/HeaderRow.tsx +0 -32
- package/src/tui/components/HeaderRow/index.ts +0 -2
- package/src/tui/components/HeaderRow/types.ts +0 -8
- package/src/tui/components/MarkdownText/MarkdownText.tsx +0 -19
- package/src/tui/components/MarkdownText/index.ts +0 -2
- package/src/tui/components/MarkdownText/types.ts +0 -4
- package/src/tui/components/MiniTable/MiniTable.tsx +0 -82
- package/src/tui/components/MiniTable/index.ts +0 -2
- package/src/tui/components/MiniTable/types.ts +0 -6
- package/src/tui/components/SectionRenderer/SectionRenderer.tsx +0 -91
- package/src/tui/components/SectionRenderer/index.ts +0 -2
- package/src/tui/components/SectionRenderer/types.ts +0 -15
- package/src/tui/components/TreeView/TreeView.tsx +0 -84
- package/src/tui/components/TreeView/index.ts +0 -2
- package/src/tui/components/TreeView/types.ts +0 -6
- package/src/tui/components/index.ts +0 -19
- package/src/tui/constants.ts +0 -39
- package/src/tui/createListView.ts +0 -23
- package/src/tui/createLookupView.ts +0 -26
- package/src/tui/helpers/computeWidths.ts +0 -53
- package/src/tui/helpers/fitColumns.ts +0 -33
- package/src/tui/helpers/formatMarkdown.ts +0 -19
- package/src/tui/helpers/getTerminalSize.ts +0 -16
- package/src/tui/helpers/index.ts +0 -6
- package/src/tui/helpers/syntaxColor.ts +0 -67
- package/src/tui/helpers/truncateText.ts +0 -12
- package/src/tui/hooks/index.ts +0 -3
- package/src/tui/hooks/types.ts +0 -7
- package/src/tui/hooks/useAutoExit.ts +0 -17
- package/src/tui/hooks/useTerminalSize.ts +0 -19
- package/src/tui/index.ts +0 -15
- package/src/tui/renderInk.tsx +0 -18
- package/src/tui/types.ts +0 -12
- package/src/tui/views/ListView/ListView.tsx +0 -104
- package/src/tui/views/ListView/index.ts +0 -2
- package/src/tui/views/ListView/types.ts +0 -14
- package/src/tui/views/LookupView/LookupView.tsx +0 -244
- package/src/tui/views/LookupView/index.ts +0 -2
- package/src/tui/views/LookupView/types.ts +0 -16
- package/src/tui/views/index.ts +0 -4
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guard an `exec`-composing Task against a silently-swallowed nonzero exit.
|
|
3
|
+
*
|
|
4
|
+
* The `@canonical/task` interpreter RESOLVES the `exec` effect on a nonzero exit
|
|
5
|
+
* code — it only REJECTS on a spawn error (e.g. ENOENT). A consumer that yields
|
|
6
|
+
* `exec` and ignores `ExecResult.exitCode` therefore reports a failed command
|
|
7
|
+
* (the common case being an EACCES-denied global `npm i -g`) as a silent
|
|
8
|
+
* success, discarding the subprocess's own stderr. Every `exec` consumer in
|
|
9
|
+
* `next/src` (`upgrade`, `setup lsp`) calls this immediately after its `exec`
|
|
10
|
+
* yield, so a failed subprocess surfaces as UNSUPPORTED (exit 1) carrying the
|
|
11
|
+
* command and the captured stderr instead of being reported as done.
|
|
12
|
+
*
|
|
13
|
+
* A denied `npm i -g` (EACCES), a registry/network failure, or any other
|
|
14
|
+
* nonzero exit is a fixable ENVIRONMENT condition — NOT a pragma bug — so it is
|
|
15
|
+
* classified UNSUPPORTED with an actionable recovery, never INTERNAL_ERROR's
|
|
16
|
+
* "please report this issue". (A spawn error like ENOENT REJECTS the effect
|
|
17
|
+
* instead of resolving, so it never reaches here.)
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { type ExecResult, fail, recover, type Task } from "@canonical/task";
|
|
21
|
+
import { PragmaError } from "../../kernel/error/PragmaError.js";
|
|
22
|
+
import type { Recovery } from "../../kernel/error/types.js";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Raise UNSUPPORTED when an `exec` result carries a nonzero exit code.
|
|
26
|
+
*
|
|
27
|
+
* @param command - Human-readable command, surfaced in the error message.
|
|
28
|
+
* @param result - The {@link ExecResult} the `exec` effect yielded.
|
|
29
|
+
* @throws PragmaError UNSUPPORTED (exit 1) when `result.exitCode !== 0`,
|
|
30
|
+
* including the trimmed stderr when the subprocess emitted any, plus an
|
|
31
|
+
* actionable recovery (a permissions/network failure the user can retry).
|
|
32
|
+
*/
|
|
33
|
+
export function assertExecOk(command: string, result: ExecResult): void {
|
|
34
|
+
if (result.exitCode === 0) return;
|
|
35
|
+
const stderr = result.stderr.trim();
|
|
36
|
+
throw new PragmaError({
|
|
37
|
+
code: "UNSUPPORTED",
|
|
38
|
+
message: `\`${command}\` exited with code ${result.exitCode}.${
|
|
39
|
+
stderr ? `\n${stderr}` : ""
|
|
40
|
+
}`,
|
|
41
|
+
recovery: {
|
|
42
|
+
message:
|
|
43
|
+
"The command failed — often a permissions or network issue. Check the output above and retry (for a global install, try elevated privileges).",
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* True when a rejected/normalised `exec` error is a missing-binary spawn failure.
|
|
50
|
+
*
|
|
51
|
+
* A spawn `ENOENT` (the command is absent from PATH) REJECTS the `exec` effect —
|
|
52
|
+
* unlike a nonzero exit, which RESOLVES it (see {@link assertExecOk}). The task
|
|
53
|
+
* interpreter normalises that reject into a `FILE_NOT_FOUND` TaskError carrying
|
|
54
|
+
* the raw spawn error as `.cause`, so this unwraps one level to recognise both
|
|
55
|
+
* the raw and normalised shapes.
|
|
56
|
+
*
|
|
57
|
+
* @param error - The thrown/rejected value (raw spawn error or its TaskError).
|
|
58
|
+
* @returns Whether it denotes a binary missing from PATH.
|
|
59
|
+
*/
|
|
60
|
+
export function isMissingBinaryError(error: unknown): boolean {
|
|
61
|
+
const codeOf = (value: unknown): unknown =>
|
|
62
|
+
value && typeof value === "object" && "code" in value
|
|
63
|
+
? (value as { code: unknown }).code
|
|
64
|
+
: undefined;
|
|
65
|
+
if (codeOf(error) === "ENOENT") return true;
|
|
66
|
+
const cause = (error as { cause?: unknown } | null | undefined)?.cause;
|
|
67
|
+
return codeOf(cause) === "ENOENT";
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Wrap an `exec`-composing Task so a missing-binary spawn (ENOENT) surfaces as a
|
|
72
|
+
* named UNSUPPORTED "`<bin>` not found on PATH" error with actionable recovery,
|
|
73
|
+
* rather than the interpreter's raw reject collapsing to INTERNAL_ERROR ("please
|
|
74
|
+
* report this issue") at the CLI/MCP boundary. Every spawn site that may hit an
|
|
75
|
+
* absent binary (`upgrade`'s package manager, `setup lsp`'s `bunx`) wraps its
|
|
76
|
+
* Task with this so they never reach the catch-all.
|
|
77
|
+
*
|
|
78
|
+
* Only real execution can trip it: a dry-run/plan mocks `exec` (exit 0, no
|
|
79
|
+
* spawn), so the guard is transparent to the preview. A nonzero exit RESOLVES
|
|
80
|
+
* the effect and is still {@link assertExecOk}'s job (its throw is a synchronous
|
|
81
|
+
* generator-body throw, not an effect failure, so it bypasses this handler); any
|
|
82
|
+
* other effect failure re-raises unchanged.
|
|
83
|
+
*
|
|
84
|
+
* @param bin - The binary name surfaced in the error message.
|
|
85
|
+
* @param recovery - The install/PATH recovery hint.
|
|
86
|
+
* @param task - The Task whose `exec` effect may reject with ENOENT.
|
|
87
|
+
* @returns The Task, guarded against a missing-binary spawn.
|
|
88
|
+
*/
|
|
89
|
+
export function guardMissingBinary<A>(
|
|
90
|
+
bin: string,
|
|
91
|
+
recovery: Recovery,
|
|
92
|
+
task: Task<A>,
|
|
93
|
+
): Task<A> {
|
|
94
|
+
return recover(task, (error) => {
|
|
95
|
+
if (isMissingBinaryError(error)) {
|
|
96
|
+
throw new PragmaError({
|
|
97
|
+
code: "UNSUPPORTED",
|
|
98
|
+
message: `\`${bin}\` was not found on your PATH.`,
|
|
99
|
+
recovery,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// Not a missing binary — re-raise unchanged (the interpreter rethrows it as
|
|
103
|
+
// a TaskExecutionError, exactly as it would with no guard installed).
|
|
104
|
+
return fail(error);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storeless install-source heuristic, shared by `info`, `upgrade`, and
|
|
3
|
+
* `doctor`'s `pragma version` check.
|
|
4
|
+
*
|
|
5
|
+
* Promotes the detector that lived inline in `info/collectInfo.ts`: the package
|
|
6
|
+
* manager comes from npm's `npm_config_user_agent` (set by npm/pnpm/yarn/bun
|
|
7
|
+
* when they run a script), the scope from whether the binary sits under
|
|
8
|
+
* `node_modules`. With no agent we report the honest runtime rather than
|
|
9
|
+
* guessing. The old shell's full package.json walk (`#package-manager`) is
|
|
10
|
+
* dropped — only this heuristic and the update-command map survive.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** The install source: package manager and a display label. */
|
|
14
|
+
export interface InstallSource {
|
|
15
|
+
/** Package-manager name (`bun`/`npm`/`pnpm`/`yarn`), else the honest runtime. */
|
|
16
|
+
readonly pm: string;
|
|
17
|
+
/** `${pm} (${scope})` — the string `info`/`doctor` display. */
|
|
18
|
+
readonly label: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** The package manager from npm's user-agent, else the honest runtime. */
|
|
22
|
+
function packageManager(): string {
|
|
23
|
+
const agent = process.env.npm_config_user_agent;
|
|
24
|
+
const name = agent?.split("/")[0];
|
|
25
|
+
if (name) return name;
|
|
26
|
+
return process.versions.bun ? "bun" : "node";
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Detect how the binary was installed — package manager and scope.
|
|
31
|
+
*
|
|
32
|
+
* @returns The install source (pm, label).
|
|
33
|
+
* @note Impure — reads `process.argv`/`process.env`.
|
|
34
|
+
*/
|
|
35
|
+
export function detectInstallSource(): InstallSource {
|
|
36
|
+
const bin = process.argv[1] ?? "";
|
|
37
|
+
const scope = bin.includes("node_modules") ? "local" : "global";
|
|
38
|
+
const pm = packageManager();
|
|
39
|
+
return { pm, label: `${pm} (${scope})` };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** The npm global-update command — also the fallback for an unknown manager. */
|
|
43
|
+
const npmUpdateCommand = (pkg: string): string => `npm i -g ${pkg}`;
|
|
44
|
+
|
|
45
|
+
/** The global-update command per package manager (install-style). */
|
|
46
|
+
const PM_UPDATE_COMMAND: Record<string, (pkg: string) => string> = {
|
|
47
|
+
bun: (pkg) => `bun add -g ${pkg}`,
|
|
48
|
+
npm: npmUpdateCommand,
|
|
49
|
+
pnpm: (pkg) => `pnpm add -g ${pkg}`,
|
|
50
|
+
yarn: (pkg) => `yarn global add ${pkg}`,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The command that updates `pkg` globally for a package manager.
|
|
55
|
+
*
|
|
56
|
+
* @param pm - The package-manager name (`bun`/`npm`/`pnpm`/`yarn`).
|
|
57
|
+
* @param pkg - The package to update.
|
|
58
|
+
* @returns The shell command; falls back to npm for an unknown manager.
|
|
59
|
+
*/
|
|
60
|
+
export function pmUpdateCommand(pm: string, pkg: string): string {
|
|
61
|
+
return (PM_UPDATE_COMMAND[pm] ?? npmUpdateCommand)(pkg);
|
|
62
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* npm registry version check — the shared network read `info` (enrichment) and
|
|
3
|
+
* `upgrade` (mutation) both consume.
|
|
4
|
+
*
|
|
5
|
+
* Ported verbatim from the old shell's `info/operations/checkRegistryVersion` +
|
|
6
|
+
* its `DIST_TAG_MAP`/`REGISTRY_TIMEOUT_MS` constants. A single GET against the
|
|
7
|
+
* registry's package document, a 3s timeout, and `undefined` on any failure
|
|
8
|
+
* (offline, non-2xx, timeout, missing dist-tag) — so a caller degrades silently
|
|
9
|
+
* rather than erroring. The whole request is preview-safe: it is a plain read
|
|
10
|
+
* with no side effects.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { Channel } from "../../kernel/config/types.js";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The published package `info`/`upgrade` check for updates: the stable name
|
|
17
|
+
* users installed, so the check answers "is a newer release of the tool
|
|
18
|
+
* available".
|
|
19
|
+
*/
|
|
20
|
+
export const PRAGMA_PACKAGE = "@canonical/pragma-cli";
|
|
21
|
+
|
|
22
|
+
/** Maps each release channel to its corresponding npm dist-tag (internal). */
|
|
23
|
+
const DIST_TAG_MAP: Record<Channel, string> = {
|
|
24
|
+
normal: "latest",
|
|
25
|
+
experimental: "experimental",
|
|
26
|
+
prerelease: "next",
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/** Timeout in milliseconds for npm registry HTTP requests. */
|
|
30
|
+
export const REGISTRY_TIMEOUT_MS = 3_000;
|
|
31
|
+
|
|
32
|
+
/** Result of checking the npm registry for the latest package version. */
|
|
33
|
+
export interface RegistryCheckResult {
|
|
34
|
+
readonly latest: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Check the npm registry for the latest published version of a package.
|
|
39
|
+
*
|
|
40
|
+
* @param packageName - The npm package name (e.g. `@canonical/pragma-cli`).
|
|
41
|
+
* @param channel - The release channel, selecting which dist-tag to read.
|
|
42
|
+
* @returns The latest version for the channel's dist-tag, or `undefined` when
|
|
43
|
+
* offline / non-2xx / timed out / the dist-tag is absent.
|
|
44
|
+
* @note Impure — a single network GET (3s timeout, silent-fail).
|
|
45
|
+
*/
|
|
46
|
+
export async function checkRegistryVersion(
|
|
47
|
+
packageName: string,
|
|
48
|
+
channel: Channel,
|
|
49
|
+
): Promise<RegistryCheckResult | undefined> {
|
|
50
|
+
const distTag = DIST_TAG_MAP[channel];
|
|
51
|
+
const url = `https://registry.npmjs.org/${encodeURIComponent(packageName)}`;
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
const response = await fetch(url, {
|
|
55
|
+
signal: AbortSignal.timeout(REGISTRY_TIMEOUT_MS),
|
|
56
|
+
headers: { Accept: "application/json" },
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) return undefined;
|
|
59
|
+
|
|
60
|
+
const data = (await response.json()) as {
|
|
61
|
+
"dist-tags"?: Record<string, string>;
|
|
62
|
+
};
|
|
63
|
+
const version = data["dist-tags"]?.[distTag];
|
|
64
|
+
if (!version) return undefined;
|
|
65
|
+
|
|
66
|
+
return { latest: version };
|
|
67
|
+
} catch {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storeless skill discovery over the filesystem.
|
|
3
|
+
*
|
|
4
|
+
* A skill is a folder with a `SKILL.md` carrying YAML frontmatter (`name`,
|
|
5
|
+
* `description`, and the #856 `prompt` flag among others). Skills are discovered
|
|
6
|
+
* from conventional roots — project skills under `<cwd>/.pragma/skills`, which
|
|
7
|
+
* take precedence, then installed skills under `$XDG_DATA_HOME/pragma/skills` —
|
|
8
|
+
* with missing files and invalid frontmatter skipped gracefully. Reads only the
|
|
9
|
+
* filesystem, never the graph store, so `skill list`/`lookup` are storeless
|
|
10
|
+
* (needsStore: false).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
14
|
+
import { homedir } from "node:os";
|
|
15
|
+
import { basename, join } from "node:path";
|
|
16
|
+
|
|
17
|
+
/** Parsed SKILL.md frontmatter. */
|
|
18
|
+
export interface SkillFrontmatter {
|
|
19
|
+
readonly name: string;
|
|
20
|
+
readonly description: string;
|
|
21
|
+
/** #856 — whether this skill also registers as an MCP prompt. */
|
|
22
|
+
readonly prompt?: boolean;
|
|
23
|
+
readonly license?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** A discovered skill: its frontmatter plus where it was found. */
|
|
27
|
+
export interface DiscoveredSkill {
|
|
28
|
+
readonly name: string;
|
|
29
|
+
readonly description: string;
|
|
30
|
+
readonly folderName: string;
|
|
31
|
+
readonly sourcePath: string;
|
|
32
|
+
readonly frontmatter: SkillFrontmatter;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---/;
|
|
36
|
+
|
|
37
|
+
/** Parse one YAML scalar (string, boolean, number, or inline array). */
|
|
38
|
+
function parseYamlValue(raw: string): unknown {
|
|
39
|
+
const trimmed = raw.trim();
|
|
40
|
+
if (trimmed.startsWith("[") && trimmed.endsWith("]")) {
|
|
41
|
+
return trimmed
|
|
42
|
+
.slice(1, -1)
|
|
43
|
+
.split(",")
|
|
44
|
+
.map((s) => s.trim().replace(/^["']|["']$/g, ""))
|
|
45
|
+
.filter(Boolean);
|
|
46
|
+
}
|
|
47
|
+
if (trimmed === "true") return true;
|
|
48
|
+
if (trimmed === "false") return false;
|
|
49
|
+
const num = Number(trimmed);
|
|
50
|
+
if (!Number.isNaN(num) && trimmed !== "") return num;
|
|
51
|
+
return trimmed.replace(/^["']|["']$/g, "");
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Parse a simple YAML subset (top-level keys + one nesting level). */
|
|
55
|
+
function parseSimpleYaml(block: string): Record<string, unknown> {
|
|
56
|
+
const result: Record<string, unknown> = {};
|
|
57
|
+
let currentKey: string | null = null;
|
|
58
|
+
let nested: Record<string, unknown> | null = null;
|
|
59
|
+
for (const line of block.split("\n")) {
|
|
60
|
+
if (line.trim() === "" || line.trim().startsWith("#")) continue;
|
|
61
|
+
const indented = line.match(/^(\s+)(\w[\w-]*)\s*:\s*(.*)/);
|
|
62
|
+
const topLevel = line.match(/^(\w[\w-]*)\s*:\s*(.*)/);
|
|
63
|
+
if (indented && currentKey && (indented[1]?.length ?? 0) >= 2) {
|
|
64
|
+
if (!nested) nested = {};
|
|
65
|
+
nested[indented[2] as string] = parseYamlValue(
|
|
66
|
+
(indented[3] ?? "").trim(),
|
|
67
|
+
);
|
|
68
|
+
} else if (topLevel) {
|
|
69
|
+
if (currentKey && nested) {
|
|
70
|
+
result[currentKey] = nested;
|
|
71
|
+
nested = null;
|
|
72
|
+
}
|
|
73
|
+
const key = topLevel[1] as string;
|
|
74
|
+
const value = topLevel[2] ?? "";
|
|
75
|
+
currentKey = key;
|
|
76
|
+
if (value === "") {
|
|
77
|
+
nested = {};
|
|
78
|
+
} else {
|
|
79
|
+
result[key] = parseYamlValue(value);
|
|
80
|
+
nested = null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (currentKey && nested) result[currentKey] = nested;
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Extract and validate SKILL.md frontmatter; `null` when missing/invalid. */
|
|
89
|
+
export function parseFrontmatter(content: string): SkillFrontmatter | null {
|
|
90
|
+
const match = content.match(FRONTMATTER_RE);
|
|
91
|
+
if (!match?.[1]) return null;
|
|
92
|
+
const parsed = parseSimpleYaml(match[1]);
|
|
93
|
+
if (typeof parsed.name !== "string" || parsed.name === "") return null;
|
|
94
|
+
if (typeof parsed.description !== "string" || parsed.description === "") {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
name: parsed.name,
|
|
99
|
+
description: parsed.description,
|
|
100
|
+
...(typeof parsed.prompt === "boolean" ? { prompt: parsed.prompt } : {}),
|
|
101
|
+
...(typeof parsed.license === "string" ? { license: parsed.license } : {}),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* The installed-skills root: `$XDG_DATA_HOME/pragma/skills`. This is where
|
|
107
|
+
* `sources update` INSTALLS package-provided skills (U10) — a symlink per skill
|
|
108
|
+
* — and the second discovery root below reads them back. The single source of
|
|
109
|
+
* truth for both, so the install target and the discovery root can never drift.
|
|
110
|
+
*/
|
|
111
|
+
export function installedSkillsDir(): string {
|
|
112
|
+
const dataHome =
|
|
113
|
+
process.env.XDG_DATA_HOME ?? join(homedir(), ".local", "share");
|
|
114
|
+
return join(dataHome, "pragma", "skills");
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* The conventional roots skills are discovered from, in PRECEDENCE order: the
|
|
119
|
+
* project root (`<cwd>/.pragma/skills`) FIRST so a project-local skill overrides
|
|
120
|
+
* an installed skill of the same name (`discoverSkills` dedups first-seen-wins),
|
|
121
|
+
* then installed skills under `$XDG_DATA_HOME/pragma/skills` (where package
|
|
122
|
+
* skills land on `sources update`).
|
|
123
|
+
*/
|
|
124
|
+
export function skillRoots(cwd: string): string[] {
|
|
125
|
+
return [join(cwd, ".pragma", "skills"), installedSkillsDir()];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Immediate subdirectories of `root` (each a candidate skill folder). */
|
|
129
|
+
function subdirs(root: string): string[] {
|
|
130
|
+
try {
|
|
131
|
+
return readdirSync(root)
|
|
132
|
+
.map((name) => join(root, name))
|
|
133
|
+
.filter((path) => {
|
|
134
|
+
try {
|
|
135
|
+
return statSync(path).isDirectory();
|
|
136
|
+
} catch {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
} catch {
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Discover every skill reachable from the conventional roots.
|
|
147
|
+
*
|
|
148
|
+
* @param cwd - The project directory (project skills root).
|
|
149
|
+
* @returns Discovered skills, sorted by name; malformed ones are skipped.
|
|
150
|
+
* @note Impure — reads SKILL.md files.
|
|
151
|
+
*/
|
|
152
|
+
export function discoverSkills(cwd: string): DiscoveredSkill[] {
|
|
153
|
+
const skills: DiscoveredSkill[] = [];
|
|
154
|
+
const seen = new Set<string>();
|
|
155
|
+
for (const root of skillRoots(cwd)) {
|
|
156
|
+
for (const dir of subdirs(root)) {
|
|
157
|
+
let content: string;
|
|
158
|
+
try {
|
|
159
|
+
content = readFileSync(join(dir, "SKILL.md"), "utf-8");
|
|
160
|
+
} catch {
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const frontmatter = parseFrontmatter(content);
|
|
164
|
+
if (!frontmatter || seen.has(frontmatter.name)) continue;
|
|
165
|
+
seen.add(frontmatter.name);
|
|
166
|
+
skills.push({
|
|
167
|
+
name: frontmatter.name,
|
|
168
|
+
description: frontmatter.description,
|
|
169
|
+
folderName: basename(dir),
|
|
170
|
+
sourcePath: dir,
|
|
171
|
+
frontmatter,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return skills.sort((a, b) =>
|
|
176
|
+
a.name < b.name ? -1 : a.name > b.name ? 1 : 0,
|
|
177
|
+
);
|
|
178
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `skill` capability module — storeless filesystem discovery.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { CapabilityModule } from "../../kernel/spec/types.js";
|
|
6
|
+
import { skillListVerb, skillLookupVerb } from "./verbs.js";
|
|
7
|
+
|
|
8
|
+
/** The `skill` capability module (`list`, `lookup`). */
|
|
9
|
+
export const skillModule: CapabilityModule = {
|
|
10
|
+
name: "skill",
|
|
11
|
+
verbs: [skillListVerb, skillLookupVerb],
|
|
12
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatters for `skill list` and `skill lookup`.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { Formatters } from "../../kernel/spec/types.js";
|
|
6
|
+
import type { DiscoveredSkill } from "./discover.js";
|
|
7
|
+
import type { SkillLookup } from "./verbs.js";
|
|
8
|
+
|
|
9
|
+
/** Empty-state guidance (U5) — where skills come from now that packages ship them. */
|
|
10
|
+
const EMPTY_PLAIN =
|
|
11
|
+
"No skills found.\nSkills come from installed design-system packages — add one to your config, run `pragma sources update`, then `pragma setup skills`.";
|
|
12
|
+
const EMPTY_LLM =
|
|
13
|
+
"## Skills (0)\n\nNo skills found. Skills come from installed design-system packages — add one to the project config, run `pragma sources update`, then `pragma setup skills`.";
|
|
14
|
+
|
|
15
|
+
export const skillListFormatters: Formatters<DiscoveredSkill[]> = {
|
|
16
|
+
plain: (skills) =>
|
|
17
|
+
skills.length === 0
|
|
18
|
+
? EMPTY_PLAIN
|
|
19
|
+
: skills
|
|
20
|
+
.map(
|
|
21
|
+
(s) =>
|
|
22
|
+
`${s.name}${s.frontmatter.prompt ? " (prompt)" : ""} ${s.description}`,
|
|
23
|
+
)
|
|
24
|
+
.join("\n"),
|
|
25
|
+
llm: (skills) =>
|
|
26
|
+
skills.length === 0
|
|
27
|
+
? EMPTY_LLM
|
|
28
|
+
: [
|
|
29
|
+
`## Skills (${skills.length})`,
|
|
30
|
+
"",
|
|
31
|
+
...skills.map(
|
|
32
|
+
(s) =>
|
|
33
|
+
`- **${s.name}**${s.frontmatter.prompt ? " (prompt)" : ""} — ${s.description}`,
|
|
34
|
+
),
|
|
35
|
+
].join("\n"),
|
|
36
|
+
json: (skills) => JSON.stringify(skills, null, 2),
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const skillLookupFormatters: Formatters<SkillLookup> = {
|
|
40
|
+
plain(skill) {
|
|
41
|
+
const lines = [
|
|
42
|
+
skill.name,
|
|
43
|
+
"═".repeat(Math.max(skill.name.length, 24)),
|
|
44
|
+
"",
|
|
45
|
+
` ${skill.description}`,
|
|
46
|
+
];
|
|
47
|
+
if (skill.frontmatter.prompt) lines.push(" registers as an MCP prompt");
|
|
48
|
+
if (skill.frontmatter.license) {
|
|
49
|
+
lines.push(` license: ${skill.frontmatter.license}`);
|
|
50
|
+
}
|
|
51
|
+
if (skill.instructions) lines.push("", skill.instructions);
|
|
52
|
+
return lines.join("\n");
|
|
53
|
+
},
|
|
54
|
+
llm(skill) {
|
|
55
|
+
const lines = [`## ${skill.name}`, "", skill.description, ""];
|
|
56
|
+
if (skill.instructions) lines.push(skill.instructions);
|
|
57
|
+
return lines.join("\n").trimEnd();
|
|
58
|
+
},
|
|
59
|
+
json: (skill) => JSON.stringify(skill, null, 2),
|
|
60
|
+
};
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill discovery (list + lookup) — storeless filesystem reads.
|
|
3
|
+
*
|
|
4
|
+
* Skills are SKILL.md folders under the project root; discovery reads only the
|
|
5
|
+
* filesystem, so the store must never boot (needsStore: false). The #856
|
|
6
|
+
* `prompt` frontmatter flag is preserved.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
10
|
+
import { tmpdir } from "node:os";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
13
|
+
import { verbKey } from "../../kernel/packs/uniqueness.js";
|
|
14
|
+
import { bootRuntime } from "../../kernel/runtime/boot.js";
|
|
15
|
+
import type { PragmaRuntime } from "../../kernel/runtime/types.js";
|
|
16
|
+
import type { VerbSpec } from "../../kernel/spec/types.js";
|
|
17
|
+
import { TEST_FLAGS } from "../../testing/helpers/projectCli.js";
|
|
18
|
+
import type { DiscoveredSkill } from "./discover.js";
|
|
19
|
+
import { skillModule } from "./index.js";
|
|
20
|
+
import { skillListFormatters } from "./render.js";
|
|
21
|
+
import type { SkillLookup } from "./verbs.js";
|
|
22
|
+
|
|
23
|
+
const listVerb = skillModule.verbs.find(
|
|
24
|
+
(v) => verbKey(v.path) === "skill list",
|
|
25
|
+
) as VerbSpec;
|
|
26
|
+
const lookupVerb = skillModule.verbs.find(
|
|
27
|
+
(v) => verbKey(v.path) === "skill lookup",
|
|
28
|
+
) as VerbSpec;
|
|
29
|
+
|
|
30
|
+
let projectDir: string;
|
|
31
|
+
let rt: PragmaRuntime;
|
|
32
|
+
|
|
33
|
+
function writeSkill(name: string, body: string): void {
|
|
34
|
+
const dir = join(projectDir, ".pragma", "skills", name);
|
|
35
|
+
mkdirSync(dir, { recursive: true });
|
|
36
|
+
writeFileSync(join(dir, "SKILL.md"), body);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
beforeAll(() => {
|
|
40
|
+
projectDir = mkdtempSync(join(tmpdir(), "pragma-skills-"));
|
|
41
|
+
writeSkill(
|
|
42
|
+
"docx",
|
|
43
|
+
"---\nname: docx\ndescription: Work with Word documents.\n---\nUse this for .docx files.",
|
|
44
|
+
);
|
|
45
|
+
writeSkill(
|
|
46
|
+
"pdf",
|
|
47
|
+
"---\nname: pdf\ndescription: Work with PDF files.\nprompt: true\nlicense: MIT\n---\nUse this for PDFs.",
|
|
48
|
+
);
|
|
49
|
+
// A folder with no SKILL.md is skipped gracefully.
|
|
50
|
+
mkdirSync(join(projectDir, ".pragma", "skills", "empty"), {
|
|
51
|
+
recursive: true,
|
|
52
|
+
});
|
|
53
|
+
rt = bootRuntime(TEST_FLAGS, projectDir);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
afterAll(() => {
|
|
57
|
+
rmSync(projectDir, { recursive: true, force: true });
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe("skill list (storeless)", () => {
|
|
61
|
+
it("discovers skills by name, carrying the prompt flag", async () => {
|
|
62
|
+
const skills = (await listVerb.run({}, rt)) as DiscoveredSkill[];
|
|
63
|
+
expect(skills.map((s) => s.name)).toEqual(["docx", "pdf"]);
|
|
64
|
+
expect(skills.find((s) => s.name === "pdf")?.frontmatter.prompt).toBe(true);
|
|
65
|
+
expect(
|
|
66
|
+
skills.find((s) => s.name === "docx")?.frontmatter.prompt,
|
|
67
|
+
).toBeUndefined();
|
|
68
|
+
// needsStore: false — discovery never boots the store.
|
|
69
|
+
expect(rt.store.booted).toBe(false);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
describe("skill lookup (storeless)", () => {
|
|
74
|
+
it("returns metadata + instructions, and suggests on a miss", async () => {
|
|
75
|
+
const skill = (await lookupVerb.run({ name: "pdf" }, rt)) as SkillLookup;
|
|
76
|
+
expect(skill.description).toBe("Work with PDF files.");
|
|
77
|
+
expect(skill.frontmatter.license).toBe("MIT");
|
|
78
|
+
expect(skill.instructions).toBe("Use this for PDFs.");
|
|
79
|
+
expect(rt.store.booted).toBe(false);
|
|
80
|
+
|
|
81
|
+
await expect(lookupVerb.run({ name: "docs" }, rt)).rejects.toThrow(
|
|
82
|
+
/not found/i,
|
|
83
|
+
);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
describe("skill list empty-state (U5)", () => {
|
|
88
|
+
it("plain output is non-blank and guides toward package sources", () => {
|
|
89
|
+
const plain = skillListFormatters.plain([]);
|
|
90
|
+
expect(plain).not.toBe("");
|
|
91
|
+
expect(plain).toContain("No skills found");
|
|
92
|
+
expect(plain).toContain("pragma sources update");
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("llm output announces zero and guides, json stays []", () => {
|
|
96
|
+
expect(skillListFormatters.llm([])).toContain("Skills (0)");
|
|
97
|
+
expect(skillListFormatters.llm([])).toContain("pragma sources update");
|
|
98
|
+
expect(skillListFormatters.json([])).toBe("[]");
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
describe("skill precedence (project overrides installed)", () => {
|
|
103
|
+
let precedenceDir: string;
|
|
104
|
+
let installedHome: string;
|
|
105
|
+
let savedDataHome: string | undefined;
|
|
106
|
+
let precedenceRt: PragmaRuntime;
|
|
107
|
+
|
|
108
|
+
beforeAll(() => {
|
|
109
|
+
precedenceDir = mkdtempSync(join(tmpdir(), "pragma-skills-proj-"));
|
|
110
|
+
installedHome = mkdtempSync(join(tmpdir(), "pragma-skills-installed-"));
|
|
111
|
+
// An installed skill and a project skill both claim the name `shared`.
|
|
112
|
+
const installed = join(installedHome, "pragma", "skills", "shared");
|
|
113
|
+
mkdirSync(installed, { recursive: true });
|
|
114
|
+
writeFileSync(
|
|
115
|
+
join(installed, "SKILL.md"),
|
|
116
|
+
"---\nname: shared\ndescription: INSTALLED copy.\n---\nInstalled body.",
|
|
117
|
+
);
|
|
118
|
+
const project = join(precedenceDir, ".pragma", "skills", "shared");
|
|
119
|
+
mkdirSync(project, { recursive: true });
|
|
120
|
+
writeFileSync(
|
|
121
|
+
join(project, "SKILL.md"),
|
|
122
|
+
"---\nname: shared\ndescription: PROJECT copy.\n---\nProject body.",
|
|
123
|
+
);
|
|
124
|
+
savedDataHome = process.env.XDG_DATA_HOME;
|
|
125
|
+
process.env.XDG_DATA_HOME = installedHome;
|
|
126
|
+
precedenceRt = bootRuntime(TEST_FLAGS, precedenceDir);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
afterAll(() => {
|
|
130
|
+
if (savedDataHome === undefined) delete process.env.XDG_DATA_HOME;
|
|
131
|
+
else process.env.XDG_DATA_HOME = savedDataHome;
|
|
132
|
+
rmSync(precedenceDir, { recursive: true, force: true });
|
|
133
|
+
rmSync(installedHome, { recursive: true, force: true });
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it("returns the project skill, not the installed one, on a name clash", async () => {
|
|
137
|
+
const skills = (await listVerb.run({}, precedenceRt)) as DiscoveredSkill[];
|
|
138
|
+
const shared = skills.filter((s) => s.name === "shared");
|
|
139
|
+
expect(shared).toHaveLength(1);
|
|
140
|
+
expect(shared[0]?.description).toBe("PROJECT copy.");
|
|
141
|
+
});
|
|
142
|
+
});
|