@canonical/pragma-cli 0.31.0 → 0.33.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 +35 -421
- package/dist/pragma +0 -0
- package/package.json +28 -42
- package/src/bin.ts +292 -11
- package/src/capabilities/block/blockList.test.ts +79 -0
- package/src/capabilities/block/blockList.verb.ts +163 -0
- package/src/capabilities/block/index.ts +25 -0
- package/src/capabilities/block/pack.ts +166 -0
- package/src/capabilities/block/parity.test.ts +187 -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 +140 -0
- package/src/capabilities/capabilities/capabilities.verb.ts +48 -0
- package/src/capabilities/capabilities/catalog.ts +148 -0
- package/src/capabilities/capabilities/hints.ts +212 -0
- package/src/capabilities/capabilities/index.ts +13 -0
- package/src/capabilities/capabilities/types.ts +60 -0
- package/src/capabilities/colophon/collectColophon.ts +68 -0
- package/src/capabilities/colophon/colophon.render.test.ts +114 -0
- package/src/capabilities/colophon/colophon.render.ts +47 -0
- package/src/capabilities/colophon/colophon.test.ts +241 -0
- package/src/capabilities/colophon/colophon.verb.ts +44 -0
- package/src/capabilities/colophon/index.ts +6 -0
- package/src/capabilities/colophon/markdownTerminal.test.ts +50 -0
- package/src/capabilities/colophon/markdownTerminal.ts +104 -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/fields.ts +81 -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.test.ts +65 -0
- package/src/capabilities/config/show.render.ts +107 -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 +225 -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 +432 -0
- package/src/capabilities/create/create.verb.ts +493 -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 +114 -0
- package/src/capabilities/doctor/checks/checkMcpConfigured.ts +67 -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/checks/deriveBand.test.ts +42 -0
- package/src/capabilities/doctor/checks/deriveBand.ts +28 -0
- package/src/capabilities/doctor/doctor.render.test.ts +170 -0
- package/src/capabilities/doctor/doctor.render.ts +198 -0
- package/src/capabilities/doctor/doctor.test.ts +209 -0
- package/src/capabilities/doctor/doctor.verb.ts +46 -0
- package/src/capabilities/doctor/index.ts +6 -0
- package/src/capabilities/doctor/runChecks.ts +100 -0
- package/src/capabilities/doctor/types.ts +56 -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 +19 -0
- package/src/capabilities/ontology/ontology.test.ts +246 -0
- package/src/capabilities/ontology/queries.ts +197 -0
- package/src/capabilities/ontology/render.ts +87 -0
- package/src/capabilities/ontology/verbs.ts +269 -0
- package/src/capabilities/prompt/index.ts +18 -0
- package/src/capabilities/prompt/prompt.render.test.ts +94 -0
- package/src/capabilities/prompt/prompt.render.ts +87 -0
- package/src/capabilities/prompt/prompt.test.ts +180 -0
- package/src/capabilities/prompt/types.ts +30 -0
- package/src/capabilities/prompt/verbs.ts +93 -0
- package/src/capabilities/reference.test.ts +32 -0
- package/src/capabilities/resources/index.ts +15 -0
- package/src/capabilities/resources/provider.ts +245 -0
- package/src/capabilities/resources/resources.test.ts +213 -0
- package/src/capabilities/roundtrip.test.ts +107 -0
- package/src/capabilities/scopeTypeSync.test.ts +37 -0
- package/src/capabilities/setup/index.ts +12 -0
- package/src/capabilities/setup/operations/setupCompletions.ts +141 -0
- package/src/capabilities/setup/operations/setupGenerator.ts +403 -0
- package/src/capabilities/setup/operations/setupLsp.ts +105 -0
- package/src/capabilities/setup/operations/setupMcp.ts +262 -0
- package/src/capabilities/setup/operations/setupSkills.ts +205 -0
- package/src/capabilities/setup/setup.render.test.ts +109 -0
- package/src/capabilities/setup/setup.render.ts +96 -0
- package/src/capabilities/setup/setup.test.ts +702 -0
- package/src/capabilities/setup/setup.verb.ts +261 -0
- package/src/capabilities/setup/shell.ts +85 -0
- package/src/capabilities/setup/types.ts +99 -0
- package/src/capabilities/shared/assertExecOk.ts +106 -0
- package/src/capabilities/shared/bands.ts +16 -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 +102 -0
- package/src/capabilities/sources/index.ts +15 -0
- package/src/capabilities/sources/installSkills.ts +124 -0
- package/src/capabilities/sources/runUpdate.ts +464 -0
- package/src/capabilities/sources/sources.test.ts +828 -0
- package/src/capabilities/sources/status.render.test.ts +65 -0
- package/src/capabilities/sources/status.render.ts +83 -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 +233 -0
- package/src/capabilities/tier/index.ts +19 -0
- package/src/capabilities/tier/lookup.render.test.ts +72 -0
- package/src/capabilities/tier/lookup.render.ts +59 -0
- package/src/capabilities/tier/lookup.test.ts +83 -0
- package/src/capabilities/tier/lookup.verb.ts +44 -0
- package/src/capabilities/tier/pack.ts +28 -0
- package/src/capabilities/tier/runLookup.ts +87 -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 -70
- package/src/index.ts +27 -122
- package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +339 -0
- package/src/kernel/completion/bashDrive.test.ts +73 -0
- package/src/kernel/completion/complete.test.ts +99 -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 +277 -0
- package/src/kernel/completion/index.ts +42 -0
- package/src/kernel/completion/model.test.ts +405 -0
- package/src/kernel/completion/model.ts +258 -0
- package/src/kernel/completion/parse.test.ts +336 -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 +431 -0
- package/src/kernel/project/cli/buildProgram.ts +291 -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 +107 -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 +220 -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/mcpError.ts +52 -0
- package/src/kernel/project/mcp/parity.test.ts +72 -0
- package/src/kernel/project/mcp/prompts/prompts.test.ts +104 -0
- package/src/kernel/project/mcp/prompts/provider.ts +104 -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 +31 -0
- package/src/kernel/render/index.ts +30 -0
- package/src/kernel/render/prefixes.ts +21 -0
- package/src/kernel/render/renderers.test.ts +205 -0
- package/src/kernel/render/renderers.ts +447 -0
- package/src/kernel/render/style.test.ts +31 -0
- package/src/kernel/render/style.ts +74 -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 +176 -0
- package/src/kernel/runtime/graphpack/buildIndex.test.ts +103 -0
- package/src/kernel/runtime/graphpack/buildIndex.ts +317 -0
- package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +5 -0
- package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +3 -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 +221 -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 +117 -0
- package/src/kernel/runtime/graphpack/types.ts +125 -0
- package/src/kernel/runtime/index.ts +15 -0
- package/src/kernel/runtime/loadSession.ts +48 -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 +380 -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/storeReadiness.ts +61 -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 +144 -0
- package/src/kernel/spec/asVerb.ts +23 -0
- package/src/kernel/spec/emitReference.test.ts +196 -0
- package/src/kernel/spec/emitReference.ts +491 -0
- package/src/kernel/spec/emitSurface.test.ts +65 -0
- package/src/kernel/spec/emitSurface.ts +225 -0
- package/src/kernel/spec/index.ts +36 -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 +54 -0
- package/src/testing/behavioral/completion.test.ts +132 -0
- package/src/testing/behavioral/disclosure.test.ts +115 -0
- package/src/testing/behavioral/docExamples.test.ts +283 -0
- package/src/testing/behavioral/errorMatrix.mcp.test.ts +120 -0
- package/src/testing/behavioral/errorMatrix.storeless.test.ts +124 -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 +131 -0
- package/src/testing/behavioral/journeys.defaultPack.test.ts +571 -0
- package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +66 -0
- package/src/testing/behavioral/journeys.livePack.e2e.test.ts +129 -0
- package/src/testing/behavioral/journeys.mcpLifecycle.mcp.test.ts +176 -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/behavioral/staleCommands.test.ts +76 -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 +248 -0
- package/src/testing/eval/cases/readNouns.ts +235 -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 +331 -0
- package/src/testing/fixtures/graph/canonical.ts +184 -0
- package/src/testing/fixtures/graph/defaultPack.ts +178 -0
- package/src/testing/fixtures/graph/owlExport.ts +95 -0
- package/src/testing/fixtures/packs/recipe.ts +78 -0
- package/src/testing/helpers/extractSnippets.ts +29 -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 +13 -12
- package/src/types.ts +42 -0
- 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 -25
- package/src/completions/handleQuery.test.ts +0 -125
- package/src/completions/handleQuery.ts +0 -49
- package/src/completions/index.ts +0 -14
- package/src/completions/queryCompletions.test.ts +0 -105
- package/src/completions/queryCompletions.ts +0 -75
- package/src/completions/querySocket.test.ts +0 -101
- package/src/completions/querySocket.ts +0 -71
- 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 -217
- package/src/config/readConfig.test.ts +0 -395
- package/src/config/readConfig.ts +0 -21
- package/src/config/readConfigLayers.test.ts +0 -109
- package/src/config/readConfigLayers.ts +0 -118
- 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 -128
- 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 -56
- 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 -44
- 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 -260
- package/src/domains/block/types.ts +0 -30
- package/src/domains/config/commands/channel.test.ts +0 -128
- package/src/domains/config/commands/channel.ts +0 -99
- package/src/domains/config/commands/configScope.ts +0 -46
- package/src/domains/config/commands/framework.test.ts +0 -119
- package/src/domains/config/commands/framework.ts +0 -103
- 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 -102
- package/src/domains/config/commands/tier.ts +0 -97
- 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 -65
- package/src/domains/config/operations/validateTier.ts +0 -43
- 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/generatorPack/bundled.ts +0 -49
- package/src/domains/create/generatorPack/compileGeneratorPack.test.ts +0 -159
- package/src/domains/create/generatorPack/compileGeneratorPack.ts +0 -312
- package/src/domains/create/index.ts +0 -21
- package/src/domains/create/mcp/index.ts +0 -2
- package/src/domains/create/mcp/specs.ts +0 -13
- package/src/domains/create/renderGeneratorUi.test.ts +0 -103
- package/src/domains/create/renderGeneratorUi.ts +0 -65
- 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 -165
- package/src/domains/doctor/formatters/doctor.ts +0 -136
- 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 -133
- 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 -76
- 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 -307
- 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 -42
- 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 -94
- 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.test.ts +0 -87
- package/src/domains/graph/formatters/query.ts +0 -74
- 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 -46
- package/src/domains/graphql/commands/serve.ts +0 -141
- 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 -65
- package/src/domains/graphql/helpers/resolveSourceFiles.ts +0 -66
- 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/ensureSchemaArtifact.test.ts +0 -167
- package/src/domains/graphql/operations/ensureSchemaArtifact.ts +0 -178
- package/src/domains/graphql/operations/index.ts +0 -17
- 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 -136
- package/src/domains/info/formatters/upgrade.ts +0 -70
- 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/collectEntityCounts.test.ts +0 -156
- package/src/domains/info/operations/collectEntityCounts.ts +0 -123
- 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 -6
- package/src/domains/info/types.test-d.ts +0 -35
- package/src/domains/info/types.ts +0 -67
- package/src/domains/llm/capabilities.test.ts +0 -111
- package/src/domains/llm/commands/capabilities.ts +0 -37
- package/src/domains/llm/commands/index.ts +0 -4
- package/src/domains/llm/commands/llm.ts +0 -41
- package/src/domains/llm/data/commandReference.ts +0 -106
- package/src/domains/llm/data/decisionTrees.ts +0 -55
- package/src/domains/llm/data/index.ts +0 -6
- package/src/domains/llm/data/toolCatalog.ts +0 -221
- 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 -57
- package/src/domains/llm/index.ts +0 -9
- package/src/domains/llm/llmCommand.test.ts +0 -101
- package/src/domains/llm/mcp/index.ts +0 -2
- package/src/domains/llm/mcp/specs.ts +0 -93
- package/src/domains/llm/operations/collectContext.test.ts +0 -64
- package/src/domains/llm/operations/collectContext.ts +0 -37
- 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 -54
- 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 -69
- 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 -86
- 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 -84
- package/src/domains/ontology/commands/list.ts +0 -11
- package/src/domains/ontology/commands/show.test.ts +0 -179
- package/src/domains/ontology/commands/show.ts +0 -14
- package/src/domains/ontology/formatters/index.ts +0 -5
- package/src/domains/ontology/formatters/list.ts +0 -64
- package/src/domains/ontology/formatters/show.ts +0 -396
- package/src/domains/ontology/helpers/buildClassTree.ts +0 -89
- package/src/domains/ontology/helpers/completeClassNames.ts +0 -43
- package/src/domains/ontology/helpers/expandOntologyIris.ts +0 -79
- package/src/domains/ontology/helpers/findNamespace.ts +0 -23
- package/src/domains/ontology/helpers/index.ts +0 -21
- package/src/domains/ontology/helpers/queryClasses.ts +0 -66
- package/src/domains/ontology/helpers/queryProperties.ts +0 -90
- package/src/domains/ontology/helpers/queryTboxFacts.ts +0 -160
- 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 -122
- package/src/domains/ontology/operations/listOntologies.ts +0 -197
- package/src/domains/ontology/operations/showOntology.test.ts +0 -184
- package/src/domains/ontology/operations/showOntology.ts +0 -323
- package/src/domains/ontology/operations/showOntologyRaw.test.ts +0 -41
- 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 -153
- 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 -180
- 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 -7
- package/src/domains/setup/commands/lsp.ts +0 -49
- package/src/domains/setup/commands/mcp.ts +0 -119
- package/src/domains/setup/commands/setup.ts +0 -70
- 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 -37
- 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 -30
- package/src/domains/setup/operations/setupLsp.ts +0 -22
- 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.bareCore.test.ts +0 -63
- package/src/domains/shared/bootStore.test.ts +0 -82
- package/src/domains/shared/bootStore.ts +0 -171
- 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 -106
- 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 -103
- package/src/domains/shared/listTiers.ts +0 -40
- package/src/domains/shared/loaders/bundledLoader.test.ts +0 -248
- package/src/domains/shared/loaders/bundledLoader.ts +0 -254
- package/src/domains/shared/loaders/gitLoader.ts +0 -30
- package/src/domains/shared/loaders/index.ts +0 -9
- package/src/domains/shared/loaders/localLoader.ts +0 -71
- package/src/domains/shared/loaders/readPackageDir.test.ts +0 -58
- package/src/domains/shared/loaders/readPackageDir.ts +0 -185
- 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 -135
- package/src/domains/shared/lookupMany.ts +0 -101
- package/src/domains/shared/mergeAndParseRefs.test.ts +0 -89
- package/src/domains/shared/mergeAndParseRefs.ts +0 -44
- package/src/domains/shared/namespaces.ts +0 -26
- package/src/domains/shared/packages.ts +0 -20
- package/src/domains/shared/parseSampleCount.test.ts +0 -47
- package/src/domains/shared/parseSampleCount.ts +0 -45
- package/src/domains/shared/pickRandom.ts +0 -22
- package/src/domains/shared/prefixes.test.ts +0 -211
- package/src/domains/shared/prefixes.ts +0 -204
- 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/resolveLookupExitCode.test.ts +0 -48
- package/src/domains/shared/resolveLookupExitCode.ts +0 -42
- package/src/domains/shared/runtime.ts +0 -61
- package/src/domains/shared/sampleFormatters.ts +0 -47
- package/src/domains/shared/semanticPackage.test.ts +0 -89
- package/src/domains/shared/semanticPackage.ts +0 -127
- package/src/domains/shared/stories/compileLookupCommand.test.ts +0 -145
- package/src/domains/shared/stories/compileLookupCommand.ts +0 -102
- 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 -151
- package/src/domains/shared/stories/pack/applyPackFilters.ts +0 -111
- package/src/domains/shared/stories/pack/applyPackSearch.test.ts +0 -57
- package/src/domains/shared/stories/pack/applyPackSearch.ts +0 -41
- package/src/domains/shared/stories/pack/buildLookupQuery.test.ts +0 -81
- package/src/domains/shared/stories/pack/buildLookupQuery.ts +0 -154
- package/src/domains/shared/stories/pack/bundled/index.ts +0 -23
- package/src/domains/shared/stories/pack/bundled/standardPack.ts +0 -164
- package/src/domains/shared/stories/pack/bundled/tierPack.ts +0 -50
- package/src/domains/shared/stories/pack/collectPackStories.test.ts +0 -406
- package/src/domains/shared/stories/pack/collectPackStories.ts +0 -158
- package/src/domains/shared/stories/pack/compilePackCommands.ts +0 -50
- package/src/domains/shared/stories/pack/compilePackStories.test.ts +0 -751
- package/src/domains/shared/stories/pack/compilePackStories.ts +0 -724
- package/src/domains/shared/stories/pack/compilePackToolSpecs.ts +0 -55
- package/src/domains/shared/stories/pack/index.ts +0 -42
- package/src/domains/shared/stories/pack/reservedVerbs.test.ts +0 -213
- package/src/domains/shared/stories/pack/reservedVerbs.ts +0 -170
- package/src/domains/shared/stories/pack/runSelectQuery.ts +0 -31
- package/src/domains/shared/stories/pack/standardParity.test.ts +0 -381
- package/src/domains/shared/stories/pack/types.ts +0 -224
- package/src/domains/shared/stories/pack/validateStoryPackDefinition.test.ts +0 -742
- package/src/domains/shared/stories/pack/validateStoryPackDefinition.ts +0 -859
- 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 -179
- 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 -46
- package/src/domains/shared/types/modifier.ts +0 -22
- package/src/domains/shared/types/ontology.ts +0 -145
- 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 -21
- 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/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 -133
- package/src/domains/token/commands/lookup.ts +0 -107
- package/src/domains/token/commands/sample.ts +0 -54
- package/src/domains/token/featureFlag.ts +0 -17
- 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 -45
- package/src/domains/token/mcp/index.ts +0 -2
- package/src/domains/token/mcp/specs.ts +0 -207
- 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/resolveTraceLimit.test.ts +0 -31
- package/src/domains/trace/commands/sessions.ts +0 -32
- package/src/domains/trace/commands/show.ts +0 -171
- 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 -74
- package/src/mcp/tools/registerFromSpec.ts +0 -97
- package/src/mcp/tools/registerTools.test.ts +0 -1277
- 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 -187
- package/src/pipeline/collectCommands.ts +0 -75
- package/src/pipeline/constants.ts +0 -14
- package/src/pipeline/createProgram.test.ts +0 -116
- package/src/pipeline/createProgram.ts +0 -89
- package/src/pipeline/firstRun.test.ts +0 -80
- package/src/pipeline/firstRun.ts +0 -99
- 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 -193
- package/src/pipeline/parseGlobalFlags.ts +0 -135
- package/src/pipeline/renderError.test.ts +0 -151
- package/src/pipeline/renderError.ts +0 -129
- package/src/pipeline/resolveCommandKind.test.ts +0 -80
- package/src/pipeline/resolveCommandKind.ts +0 -82
- package/src/pipeline/rootHelp.test.ts +0 -87
- package/src/pipeline/rootHelp.ts +0 -265
- package/src/pipeline/runCli.orchestration.test.ts +0 -435
- package/src/pipeline/runCli.test.ts +0 -83
- package/src/pipeline/runCli.ts +0 -411
- package/src/pipeline/types.ts +0 -17
- package/src/testing/cli.ts +0 -71
- package/src/testing/createTestMcpClient.ts +0 -68
- package/src/testing/dsFixtures.ts +0 -523
- 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 -22
- 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 -261
- package/src/testing/integration/cross-binary-byte-equality.test.ts +0 -129
- package/src/testing/integration/edge-cases.test.ts +0 -275
- package/src/testing/integration/executor-execution.test.ts +0 -103
- package/src/testing/integration/executor-golden.test.ts +0 -145
- package/src/testing/integration/mcp-surface.test.ts +0 -605
- package/src/testing/integration/parity.test.ts +0 -596
- package/src/testing/regression/0001-skill-discovery-granularity.test.ts +0 -71
- package/src/testing/standardParityFixtures.ts +0 -35
- 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,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `setup mcp` — register the pragma MCP server in detected AI harnesses.
|
|
3
|
+
*
|
|
4
|
+
* Split into `detectMcp` (harness detection runs FOR REAL up front, via
|
|
5
|
+
* `runTask` over safe reads, and the resolved config targets are deduplicated
|
|
6
|
+
* into per-file {@link TargetGroup}s for the chosen `--scope`) and `composeMcp`
|
|
7
|
+
* (a pure, re-runnable write body driven by the SELECTED groups). Each write is
|
|
8
|
+
* a distinct `(path, mcpKey)` so two harnesses sharing a file (VS Code + Cline)
|
|
9
|
+
* each preserve the other; every group emits a band-prefixed `info()` manifest
|
|
10
|
+
* line, so the recap and a `--dry-run` show which band each file belongs to.
|
|
11
|
+
*
|
|
12
|
+
* Detection ALSO reads each group's existing config (via `readMcpConfigFrom`,
|
|
13
|
+
* FOR REAL up front) and classifies every group as `absent` (no pragma entry
|
|
14
|
+
* yet), `configured` (the pragma entry already matches what we'd write), or
|
|
15
|
+
* `drifted` (a pragma entry exists but differs). The wizard shows that prior
|
|
16
|
+
* state in each row and DEFAULT-DESELECTS the already-`configured` files; the
|
|
17
|
+
* write itself stays idempotent (a re-merge of the identical entry is
|
|
18
|
+
* byte-for-byte), so a re-run is a no-op the recap reports as "unchanged" — the
|
|
19
|
+
* same state-awareness `setup skills` has always had.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import type {
|
|
23
|
+
McpServerConfig,
|
|
24
|
+
PlatformEnv,
|
|
25
|
+
TargetGroup,
|
|
26
|
+
} from "@canonical/harnesses";
|
|
27
|
+
import { info, sequence_, type Task, warn } from "@canonical/task";
|
|
28
|
+
import { MCP_SERVER_NAME } from "../../../constants.js";
|
|
29
|
+
import type { PragmaRuntime } from "../../../kernel/runtime/types.js";
|
|
30
|
+
import type {
|
|
31
|
+
ConfiguredTarget,
|
|
32
|
+
McpTargetState,
|
|
33
|
+
ScopeSelection,
|
|
34
|
+
} from "../types.js";
|
|
35
|
+
|
|
36
|
+
/** The `writeMcpConfigTargets` builder, captured from the dynamic harness import. */
|
|
37
|
+
type WriteMcpConfigTargets =
|
|
38
|
+
typeof import("@canonical/harnesses").writeMcpConfigTargets;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The detected MCP state: the per-file target groups (already scoped to the
|
|
42
|
+
* requested `--scope`), a by-path map of each group's prior
|
|
43
|
+
* {@link McpTargetState} (read up front), the project root, and the
|
|
44
|
+
* (dynamically imported) target-based writer the pure `composeMcp` needs
|
|
45
|
+
* synchronously. Keeping `groups` a plain {@link TargetGroup}[] leaves every
|
|
46
|
+
* existing `.groups` consumer (path/harnessNames/scope) unchanged; the state
|
|
47
|
+
* rides alongside, keyed by the group's `path`.
|
|
48
|
+
*/
|
|
49
|
+
export interface McpDetection {
|
|
50
|
+
readonly groups: readonly TargetGroup[];
|
|
51
|
+
readonly stateByPath: ReadonlyMap<string, McpTargetState>;
|
|
52
|
+
readonly cwd: string;
|
|
53
|
+
readonly platform: PlatformEnv;
|
|
54
|
+
readonly writeMcpConfigTargets: WriteMcpConfigTargets;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* The pragma MCP server entry we register — the SINGLE source of truth both the
|
|
59
|
+
* classifier (does the existing entry match this?) and the writer (`composeMcp`)
|
|
60
|
+
* consume, so "already configured" means byte-for-byte what a write would emit.
|
|
61
|
+
*
|
|
62
|
+
* @param cwd - The project root recorded on the entry.
|
|
63
|
+
* @returns The pragma {@link McpServerConfig}.
|
|
64
|
+
*/
|
|
65
|
+
export function pragmaMcpEntry(cwd: string): McpServerConfig {
|
|
66
|
+
return { command: "pragma", args: ["mcp"], cwd };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Whether an existing MCP entry equals the pragma entry we would write, over the
|
|
71
|
+
* fields we control (`command`/`args`/`cwd`). A shallow structural compare — a
|
|
72
|
+
* harness that carries extra keys (e.g. `env`) still reads as `configured` as
|
|
73
|
+
* long as our three fields match, so we never churn a file we did not author.
|
|
74
|
+
*/
|
|
75
|
+
function entryMatches(
|
|
76
|
+
existing: McpServerConfig,
|
|
77
|
+
want: McpServerConfig,
|
|
78
|
+
): boolean {
|
|
79
|
+
const sameArgs =
|
|
80
|
+
(existing.args ?? []).length === (want.args ?? []).length &&
|
|
81
|
+
(want.args ?? []).every((a, i) => existing.args?.[i] === a);
|
|
82
|
+
return (
|
|
83
|
+
existing.command === want.command && existing.cwd === want.cwd && sameArgs
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Classify one target group against its on-disk config: `absent` when no pragma
|
|
89
|
+
* entry exists in ANY of the group's writes, `configured` when EVERY write
|
|
90
|
+
* already carries a matching pragma entry, `drifted` otherwise (present in at
|
|
91
|
+
* least one write but not matching everywhere). Reads each write's file for real
|
|
92
|
+
* via `readMcpConfigFrom`.
|
|
93
|
+
*
|
|
94
|
+
* @param group - The target group whose writes to inspect.
|
|
95
|
+
* @param want - The pragma entry a write would emit.
|
|
96
|
+
* @param readMcpConfigFrom - The harness reader (dynamically imported).
|
|
97
|
+
* @param runTask - The node Task interpreter.
|
|
98
|
+
* @returns The group's {@link McpTargetState}.
|
|
99
|
+
* @note Impure — reads each write's config file.
|
|
100
|
+
*/
|
|
101
|
+
async function classifyGroup(
|
|
102
|
+
group: TargetGroup,
|
|
103
|
+
want: McpServerConfig,
|
|
104
|
+
readMcpConfigFrom: typeof import("@canonical/harnesses").readMcpConfigFrom,
|
|
105
|
+
runTask: typeof import("@canonical/task/node").runTask,
|
|
106
|
+
): Promise<McpTargetState> {
|
|
107
|
+
let present = 0;
|
|
108
|
+
let matching = 0;
|
|
109
|
+
for (const write of group.writes) {
|
|
110
|
+
const servers = await runTask(readMcpConfigFrom(write));
|
|
111
|
+
const existing = servers[MCP_SERVER_NAME];
|
|
112
|
+
if (existing === undefined) continue;
|
|
113
|
+
present += 1;
|
|
114
|
+
if (entryMatches(existing, want)) matching += 1;
|
|
115
|
+
}
|
|
116
|
+
if (present === 0) return "absent";
|
|
117
|
+
if (matching === group.writes.length) return "configured";
|
|
118
|
+
return "drifted";
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Detect the AI harnesses present in the project (real reads, up front),
|
|
123
|
+
* resolve+dedup their config targets for the chosen scope, AND read each
|
|
124
|
+
* group's existing config to classify it `absent`/`configured`/`drifted` — so
|
|
125
|
+
* the wizard can show prior state and default-deselect already-`configured`
|
|
126
|
+
* files.
|
|
127
|
+
*
|
|
128
|
+
* @param rt - The per-invocation runtime.
|
|
129
|
+
* @param scope - The resolved `--scope` selection.
|
|
130
|
+
* @returns The scoped target groups, their prior states, + the config writer.
|
|
131
|
+
* @note Impure — reads the filesystem via `detectHarnesses` + `readMcpConfigFrom`.
|
|
132
|
+
*/
|
|
133
|
+
export async function detectMcp(
|
|
134
|
+
rt: PragmaRuntime,
|
|
135
|
+
scope: ScopeSelection,
|
|
136
|
+
): Promise<McpDetection> {
|
|
137
|
+
const cwd = rt.cwd;
|
|
138
|
+
const [
|
|
139
|
+
{
|
|
140
|
+
detectHarnesses,
|
|
141
|
+
groupTargetsForScope,
|
|
142
|
+
readMcpConfigFrom,
|
|
143
|
+
readPlatformEnv,
|
|
144
|
+
writeMcpConfigTargets,
|
|
145
|
+
},
|
|
146
|
+
{ runTask },
|
|
147
|
+
] = await Promise.all([
|
|
148
|
+
import("@canonical/harnesses"),
|
|
149
|
+
import("@canonical/task/node"),
|
|
150
|
+
]);
|
|
151
|
+
const platform = readPlatformEnv();
|
|
152
|
+
const detected = await runTask(detectHarnesses(cwd, platform));
|
|
153
|
+
const groups = groupTargetsForScope(detected, cwd, scope, platform);
|
|
154
|
+
|
|
155
|
+
// Read each group's existing config (for real, up front) so the recap/preview
|
|
156
|
+
// and the default selection reflect true prior state — the same discipline
|
|
157
|
+
// `detectSkills` uses for its per-link create/skip/replace decision.
|
|
158
|
+
const want = pragmaMcpEntry(cwd);
|
|
159
|
+
const stateByPath = new Map<string, McpTargetState>();
|
|
160
|
+
await Promise.all(
|
|
161
|
+
groups.map(async (group) => {
|
|
162
|
+
const state = await classifyGroup(
|
|
163
|
+
group,
|
|
164
|
+
want,
|
|
165
|
+
readMcpConfigFrom,
|
|
166
|
+
runTask,
|
|
167
|
+
);
|
|
168
|
+
stateByPath.set(group.path, state);
|
|
169
|
+
}),
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
return { groups, stateByPath, cwd, platform, writeMcpConfigTargets };
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* The prior state of a group, defaulting to `absent` for an unknown path (so a
|
|
177
|
+
* caller never has to guard the map lookup).
|
|
178
|
+
*/
|
|
179
|
+
export function mcpGroupState(d: McpDetection, path: string): McpTargetState {
|
|
180
|
+
return d.stateByPath.get(path) ?? "absent";
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/** The target groups the user selected (by path), or all when none recorded. */
|
|
184
|
+
export function selectedGroups(
|
|
185
|
+
d: McpDetection,
|
|
186
|
+
selectedPaths: readonly string[],
|
|
187
|
+
): TargetGroup[] {
|
|
188
|
+
return d.groups.filter((g) => selectedPaths.includes(g.path));
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Compose the per-target config writes for the SELECTED groups (pure —
|
|
193
|
+
* re-runnable; builds ABSOLUTE config paths itself). The prior
|
|
194
|
+
* {@link McpTargetState} drives the manifest MESSAGE (already-configured /
|
|
195
|
+
* updated / added) but NOT whether the write runs: the idempotent
|
|
196
|
+
* read-modify-write is always composed so it carries its `undo` and a re-run is
|
|
197
|
+
* byte-identical when already `configured`. The wizard already default-DESELECTS
|
|
198
|
+
* `configured` files (so they are usually not in `groups` at all); a `configured`
|
|
199
|
+
* file that IS selected is still rewritten idempotently.
|
|
200
|
+
*
|
|
201
|
+
* @param d - The detection gathered up front.
|
|
202
|
+
* @param groups - The target groups the user chose (a subset of `d.groups`).
|
|
203
|
+
* @returns A Task that writes the pragma MCP config into each chosen file.
|
|
204
|
+
*/
|
|
205
|
+
export function composeMcp(
|
|
206
|
+
d: McpDetection,
|
|
207
|
+
groups: readonly TargetGroup[],
|
|
208
|
+
): Task<void> {
|
|
209
|
+
if (groups.length === 0) {
|
|
210
|
+
return warn("No AI harnesses selected — nothing to configure.");
|
|
211
|
+
}
|
|
212
|
+
const pragmaMcpConfig = pragmaMcpEntry(d.cwd);
|
|
213
|
+
// Re-runnable combinators (NOT a single-use `gen`): `execute` interprets the
|
|
214
|
+
// task twice (preview + perform). One combined write per file keeps a shared
|
|
215
|
+
// file (VS Code + Cline) a single read-modify-write — dry-run safe.
|
|
216
|
+
const tasks: Task<unknown>[] = [];
|
|
217
|
+
for (const group of groups) {
|
|
218
|
+
const state = mcpGroupState(d, group.path);
|
|
219
|
+
const names = group.harnessNames.join(", ");
|
|
220
|
+
tasks.push(
|
|
221
|
+
d.writeMcpConfigTargets(group.writes, MCP_SERVER_NAME, pragmaMcpConfig),
|
|
222
|
+
);
|
|
223
|
+
const verb =
|
|
224
|
+
state === "configured"
|
|
225
|
+
? "already configured →"
|
|
226
|
+
: state === "drifted"
|
|
227
|
+
? "updated →"
|
|
228
|
+
: "→";
|
|
229
|
+
tasks.push(
|
|
230
|
+
info(
|
|
231
|
+
`[${group.scope}] pragma MCP server ${verb} ${group.path} (${names})`,
|
|
232
|
+
),
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
return sequence_(tasks);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/** The harness names configured across a selection (for the result summary). */
|
|
239
|
+
export function mcpConfigured(groups: readonly TargetGroup[]): string[] {
|
|
240
|
+
const names = new Set<string>();
|
|
241
|
+
for (const group of groups) {
|
|
242
|
+
for (const name of group.harnessNames) names.add(name);
|
|
243
|
+
}
|
|
244
|
+
return [...names].sort();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* The per-file {@link ConfiguredTarget}s for a selection (for the result), each
|
|
249
|
+
* carrying its prior {@link McpTargetState} so the recap distinguishes newly
|
|
250
|
+
* added, updated, and already-configured targets.
|
|
251
|
+
*/
|
|
252
|
+
export function mcpTargets(
|
|
253
|
+
d: McpDetection,
|
|
254
|
+
groups: readonly TargetGroup[],
|
|
255
|
+
): ConfiguredTarget[] {
|
|
256
|
+
return groups.map((group) => ({
|
|
257
|
+
name: group.harnessNames.join(", "),
|
|
258
|
+
band: group.scope,
|
|
259
|
+
path: group.path,
|
|
260
|
+
state: mcpGroupState(d, group.path),
|
|
261
|
+
}));
|
|
262
|
+
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `setup skills` — symlink discovered skills into each harness skill directory
|
|
3
|
+
* and the cross-client `.agents/skills`.
|
|
4
|
+
*
|
|
5
|
+
* Split into `detectSkills` (skill discovery, harness detection, and the
|
|
6
|
+
* per-link create/skip/replace DECISION all run against REAL fs up front, so the
|
|
7
|
+
* wizard recap and a `--dry-run` plan reflect true state) and `composeSkills` (a
|
|
8
|
+
* pure, re-runnable body performing only the symlink/delete effects the dry-run
|
|
9
|
+
* interpreter mocks). Idempotent by construction.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { existsSync, readlinkSync } from "node:fs";
|
|
13
|
+
import { resolve } from "node:path";
|
|
14
|
+
import {
|
|
15
|
+
deleteFile,
|
|
16
|
+
info,
|
|
17
|
+
mkdir,
|
|
18
|
+
sequence_,
|
|
19
|
+
symlink,
|
|
20
|
+
type Task,
|
|
21
|
+
} from "@canonical/task";
|
|
22
|
+
import { RECOVERY_CLI_PREFIX } from "../../../constants.js";
|
|
23
|
+
import { PragmaError } from "../../../kernel/error/PragmaError.js";
|
|
24
|
+
import { cliRecovery } from "../../../kernel/error/recovery.js";
|
|
25
|
+
import type { PragmaRuntime } from "../../../kernel/runtime/types.js";
|
|
26
|
+
import type { SetupSkillsResult, SymlinkAction } from "../types.js";
|
|
27
|
+
|
|
28
|
+
/** Cross-client skill directory, shared across all harnesses. */
|
|
29
|
+
const CROSS_CLIENT_DIR = ".agents/skills";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The detected skill-linking plan: the target directories, the decided per-link
|
|
33
|
+
* actions, and the counts/warnings the result surface reports. `available` is
|
|
34
|
+
* false when no skills were discovered.
|
|
35
|
+
*/
|
|
36
|
+
export interface SkillsDetection {
|
|
37
|
+
readonly available: boolean;
|
|
38
|
+
readonly targets: readonly { readonly dir: string; readonly name: string }[];
|
|
39
|
+
readonly actions: readonly SymlinkAction[];
|
|
40
|
+
readonly skillCount: number;
|
|
41
|
+
readonly harnessCount: number;
|
|
42
|
+
readonly warnings: readonly string[];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** The current target of a symlink, or `null` when absent / not a symlink. */
|
|
46
|
+
function currentLink(linkPath: string): string | null {
|
|
47
|
+
if (!existsSync(linkPath)) return null;
|
|
48
|
+
try {
|
|
49
|
+
return readlinkSync(linkPath);
|
|
50
|
+
} catch {
|
|
51
|
+
return "";
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Discover skills, detect harnesses, and decide each link action (real fs, up
|
|
57
|
+
* front). Returns `available: false` (empty plan) when no skills exist — the
|
|
58
|
+
* run-all omits the step; the direct sub-verb turns it into {@link skillsEmptyError}.
|
|
59
|
+
*
|
|
60
|
+
* @param rt - The per-invocation runtime.
|
|
61
|
+
* @returns The link plan.
|
|
62
|
+
* @note Impure — reads the filesystem (skills + harnesses + existing links).
|
|
63
|
+
*/
|
|
64
|
+
export async function detectSkills(
|
|
65
|
+
rt: PragmaRuntime,
|
|
66
|
+
): Promise<SkillsDetection> {
|
|
67
|
+
const cwd = rt.cwd;
|
|
68
|
+
const [{ discoverSkills }, { detectHarnesses }, { runTask }] =
|
|
69
|
+
await Promise.all([
|
|
70
|
+
import("../../skill/discover.js"),
|
|
71
|
+
import("@canonical/harnesses"),
|
|
72
|
+
import("@canonical/task/node"),
|
|
73
|
+
]);
|
|
74
|
+
|
|
75
|
+
const skills = discoverSkills(cwd);
|
|
76
|
+
if (skills.length === 0) {
|
|
77
|
+
return {
|
|
78
|
+
available: false,
|
|
79
|
+
targets: [],
|
|
80
|
+
actions: [],
|
|
81
|
+
skillCount: 0,
|
|
82
|
+
harnessCount: 0,
|
|
83
|
+
warnings: [],
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const detected = await runTask(detectHarnesses(cwd));
|
|
88
|
+
|
|
89
|
+
// Target dirs (harness skill dirs + the cross-client dir), first-seen wins.
|
|
90
|
+
const seen = new Set<string>();
|
|
91
|
+
const targets: { dir: string; name: string }[] = [];
|
|
92
|
+
for (const d of detected) {
|
|
93
|
+
const dir = d.harness.skillsPath(cwd);
|
|
94
|
+
if (!seen.has(dir)) {
|
|
95
|
+
seen.add(dir);
|
|
96
|
+
targets.push({ dir, name: d.harness.name });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const crossDir = resolve(cwd, CROSS_CLIENT_DIR);
|
|
100
|
+
if (!seen.has(crossDir)) {
|
|
101
|
+
seen.add(crossDir);
|
|
102
|
+
targets.push({ dir: crossDir, name: CROSS_CLIENT_DIR });
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Decide each action against REAL fs (so the preview is accurate).
|
|
106
|
+
const actions: SymlinkAction[] = [];
|
|
107
|
+
for (const { dir, name } of targets) {
|
|
108
|
+
for (const skill of skills) {
|
|
109
|
+
const linkPath = resolve(dir, skill.folderName);
|
|
110
|
+
const current = currentLink(linkPath);
|
|
111
|
+
const action: SymlinkAction["action"] =
|
|
112
|
+
current === null
|
|
113
|
+
? "created"
|
|
114
|
+
: current === skill.sourcePath
|
|
115
|
+
? "skipped"
|
|
116
|
+
: "replaced";
|
|
117
|
+
actions.push({
|
|
118
|
+
skillName: skill.name,
|
|
119
|
+
target: skill.sourcePath,
|
|
120
|
+
linkPath,
|
|
121
|
+
action,
|
|
122
|
+
harnessName: name,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const warnings = actions
|
|
128
|
+
.filter((a) => a.action === "replaced")
|
|
129
|
+
.map(
|
|
130
|
+
(a) => `Replaced stale symlink for ${a.skillName} in ${a.harnessName}`,
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
available: true,
|
|
135
|
+
targets,
|
|
136
|
+
actions,
|
|
137
|
+
skillCount: skills.length,
|
|
138
|
+
harnessCount: detected.length,
|
|
139
|
+
warnings,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Compose the (re)link effects from a detection (builds ABSOLUTE link paths
|
|
145
|
+
* itself).
|
|
146
|
+
*
|
|
147
|
+
* Built from re-runnable combinators (NOT a single-use `gen`) because `execute`
|
|
148
|
+
* interprets the task twice (preview + perform). `created` links carry an undo;
|
|
149
|
+
* a `replaced` link is delete-then-relink (idempotent); `skipped` is a no-op.
|
|
150
|
+
*
|
|
151
|
+
* FOLLOW-UP(AV-284): global-band skills — skills only link into per-project
|
|
152
|
+
* harness dirs today; a `--scope global` machine-band skills location is
|
|
153
|
+
* deferred. The manifest line is `[project]`-prefixed to make that explicit.
|
|
154
|
+
*
|
|
155
|
+
* @param d - The detection gathered up front.
|
|
156
|
+
* @returns A Task that mkdirs each target and creates/replaces each symlink.
|
|
157
|
+
*/
|
|
158
|
+
export function composeSkills(d: SkillsDetection): Task<void> {
|
|
159
|
+
if (!d.available) return sequence_([]);
|
|
160
|
+
const tasks: Task<unknown>[] = [];
|
|
161
|
+
for (const { dir } of d.targets) {
|
|
162
|
+
tasks.push(mkdir(dir, true));
|
|
163
|
+
}
|
|
164
|
+
for (const a of d.actions) {
|
|
165
|
+
if (a.action === "created") {
|
|
166
|
+
tasks.push(
|
|
167
|
+
symlink(a.target, a.linkPath, { undo: deleteFile(a.linkPath) }),
|
|
168
|
+
);
|
|
169
|
+
} else if (a.action === "replaced") {
|
|
170
|
+
tasks.push(deleteFile(a.linkPath));
|
|
171
|
+
tasks.push(symlink(a.target, a.linkPath));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
tasks.push(
|
|
175
|
+
info(
|
|
176
|
+
`[project] Linked ${d.skillCount} skill(s) into ${d.targets.length} dir(s).`,
|
|
177
|
+
),
|
|
178
|
+
);
|
|
179
|
+
return sequence_(tasks);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** Project a detection onto the {@link SetupSkillsResult} output shape. */
|
|
183
|
+
export function toSkillsResult(d: SkillsDetection): SetupSkillsResult {
|
|
184
|
+
return {
|
|
185
|
+
actions: d.actions,
|
|
186
|
+
harnessCount: d.harnessCount,
|
|
187
|
+
skillCount: d.skillCount,
|
|
188
|
+
warnings: d.warnings,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* The EMPTY_RESULTS error the DIRECT `setup skills` sub-verb raises when no
|
|
194
|
+
* skills are discoverable (the run-all instead omits the step). Recovery points
|
|
195
|
+
* at where skills COME FROM (U8): package skills install on `sources update`.
|
|
196
|
+
*/
|
|
197
|
+
export function skillsEmptyError(): PragmaError {
|
|
198
|
+
return PragmaError.emptyResults("skill", {
|
|
199
|
+
message: "No skills found to link.",
|
|
200
|
+
recovery: cliRecovery(
|
|
201
|
+
`${RECOVERY_CLI_PREFIX}sources update`,
|
|
202
|
+
"Add a design-system package that ships skills to your config, then run `pragma sources update` to install them.",
|
|
203
|
+
),
|
|
204
|
+
});
|
|
205
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render goldens for `pragma setup` — the MCP recap grouped by band.
|
|
3
|
+
*
|
|
4
|
+
* `summarizeMcpTargets` (the recap's band grouping) previously shipped
|
|
5
|
+
* executed-but-never-asserted; this pins the ACTUAL banded recap text for BOTH
|
|
6
|
+
* the plain and llm formatters, and locks the unified Global/Project vocabulary
|
|
7
|
+
* (the recap no longer says MACHINE/PROJECT). The setup formatters use no
|
|
8
|
+
* colour, so no chalk level dance is needed.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { describe, expect, it } from "vitest";
|
|
12
|
+
import { setupFormatters } from "./setup.render.js";
|
|
13
|
+
import type { SetupResult } from "./types.js";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* A two-band MCP result: a global (Windsurf) and a project (Cursor) target,
|
|
17
|
+
* both newly `absent`→added — the clean first-run recap (no state tally).
|
|
18
|
+
*/
|
|
19
|
+
const BOTH_BANDS: SetupResult = {
|
|
20
|
+
kind: "mcp",
|
|
21
|
+
configured: ["Cursor", "Windsurf"],
|
|
22
|
+
targets: [
|
|
23
|
+
{
|
|
24
|
+
name: "Windsurf",
|
|
25
|
+
band: "global",
|
|
26
|
+
path: "/home/u/.codeium/windsurf/mcp_config.json",
|
|
27
|
+
state: "absent",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: "Cursor",
|
|
31
|
+
band: "project",
|
|
32
|
+
path: "/proj/.cursor/mcp.json",
|
|
33
|
+
state: "absent",
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
describe("setup render — MCP recap banded by Global/Project", () => {
|
|
39
|
+
it("plain lists the global band before the project band", () => {
|
|
40
|
+
expect(setupFormatters.plain(BOTH_BANDS)).toBe(
|
|
41
|
+
"Configured MCP — Global: Windsurf · Project: Cursor.",
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("llm is the same banded recap prefixed with a bullet", () => {
|
|
46
|
+
expect(setupFormatters.llm(BOTH_BANDS)).toBe(
|
|
47
|
+
"- Configured MCP — Global: Windsurf · Project: Cursor.",
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("uses the unified labels, never MACHINE/PROJECT", () => {
|
|
52
|
+
const out = setupFormatters.plain(BOTH_BANDS);
|
|
53
|
+
expect(out).not.toContain("MACHINE");
|
|
54
|
+
expect(out).not.toContain("PROJECT");
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("a single-band selection lists only that band", () => {
|
|
58
|
+
const projectOnly: SetupResult = {
|
|
59
|
+
kind: "mcp",
|
|
60
|
+
configured: ["Cursor"],
|
|
61
|
+
targets: [
|
|
62
|
+
{
|
|
63
|
+
name: "Cursor",
|
|
64
|
+
band: "project",
|
|
65
|
+
path: "/p/.cursor/mcp.json",
|
|
66
|
+
state: "absent",
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
expect(setupFormatters.plain(projectOnly)).toBe(
|
|
71
|
+
"Configured MCP — Project: Cursor.",
|
|
72
|
+
);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it("appends the state tally when a target was already present (re-run)", () => {
|
|
76
|
+
// A mix of already-configured + drifted + newly-added surfaces the
|
|
77
|
+
// idempotency breakdown, so a re-run reads as a no-op rather than a rewrite.
|
|
78
|
+
const rerun: SetupResult = {
|
|
79
|
+
kind: "mcp",
|
|
80
|
+
configured: ["Cursor", "Windsurf"],
|
|
81
|
+
targets: [
|
|
82
|
+
{
|
|
83
|
+
name: "Windsurf",
|
|
84
|
+
band: "global",
|
|
85
|
+
path: "/home/u/.codeium/windsurf/mcp_config.json",
|
|
86
|
+
state: "configured",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: "Cursor",
|
|
90
|
+
band: "project",
|
|
91
|
+
path: "/proj/.cursor/mcp.json",
|
|
92
|
+
state: "drifted",
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
};
|
|
96
|
+
expect(setupFormatters.plain(rerun)).toBe(
|
|
97
|
+
"Configured MCP — Global: Windsurf · Project: Cursor (0 added, 1 updated, 1 unchanged).",
|
|
98
|
+
);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("no targets → a plain 'nothing configured' line", () => {
|
|
102
|
+
const none: SetupResult = { kind: "mcp", configured: [], targets: [] };
|
|
103
|
+
expect(setupFormatters.plain(none)).toBe("No harnesses configured.");
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("json is the exact SetupResult round-trip", () => {
|
|
107
|
+
expect(JSON.parse(setupFormatters.json(BOTH_BANDS))).toEqual(BOTH_BANDS);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatters for `pragma setup` and its sub-verbs — one shared formatter over
|
|
3
|
+
* the tagged {@link SetupResult} union (plain, llm, json).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Formatters } from "../../kernel/spec/types.js";
|
|
7
|
+
import { BAND_LABELS } from "../shared/bands.js";
|
|
8
|
+
import type {
|
|
9
|
+
ConfiguredTarget,
|
|
10
|
+
SetupResult,
|
|
11
|
+
SetupSkillsResult,
|
|
12
|
+
} from "./types.js";
|
|
13
|
+
|
|
14
|
+
/** Summarize a skills result: created / skipped / replaced counts. */
|
|
15
|
+
function summarizeSkills(result: SetupSkillsResult): string {
|
|
16
|
+
const created = result.actions.filter((a) => a.action === "created").length;
|
|
17
|
+
const skipped = result.actions.filter((a) => a.action === "skipped").length;
|
|
18
|
+
const replaced = result.actions.filter((a) => a.action === "replaced").length;
|
|
19
|
+
return `${created} created, ${replaced} replaced, ${skipped} unchanged across ${result.harnessCount} harness(es)`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Summarize the MCP targets grouped by band — the global (user/home) band
|
|
24
|
+
* before the project (per-repo) band — so the recap shows which files at which
|
|
25
|
+
* level got the pragma server. The Global/Project labels match the doctor
|
|
26
|
+
* report and the CLI's `--global`/`--local` grammar (see {@link BAND_LABELS}).
|
|
27
|
+
*
|
|
28
|
+
* A trailing state tally is appended ONLY when something was already present
|
|
29
|
+
* (an `updated` or `unchanged` target) — a clean first run (every target newly
|
|
30
|
+
* `added`) keeps the plain `Configured MCP — …` line, so the idempotency detail
|
|
31
|
+
* surfaces exactly when it is informative (a re-run made clear it was a no-op).
|
|
32
|
+
*/
|
|
33
|
+
function summarizeMcpTargets(targets: readonly ConfiguredTarget[]): string {
|
|
34
|
+
if (targets.length === 0) return "No harnesses configured.";
|
|
35
|
+
const section = (band: ConfiguredTarget["band"], label: string): string => {
|
|
36
|
+
const names = targets.filter((t) => t.band === band).map((t) => t.name);
|
|
37
|
+
return names.length > 0 ? `${label}: ${names.join(", ")}` : "";
|
|
38
|
+
};
|
|
39
|
+
const parts = [
|
|
40
|
+
section("global", BAND_LABELS.global),
|
|
41
|
+
section("project", BAND_LABELS.project),
|
|
42
|
+
]
|
|
43
|
+
.filter((p) => p.length > 0)
|
|
44
|
+
.join(" · ");
|
|
45
|
+
const updated = targets.filter((t) => t.state === "drifted").length;
|
|
46
|
+
const unchanged = targets.filter((t) => t.state === "configured").length;
|
|
47
|
+
if (updated === 0 && unchanged === 0) {
|
|
48
|
+
// Clean first run — every target newly added; keep the original recap line.
|
|
49
|
+
return `Configured MCP — ${parts}.`;
|
|
50
|
+
}
|
|
51
|
+
const added = targets.filter((t) => t.state === "absent").length;
|
|
52
|
+
return `Configured MCP — ${parts} (${added} added, ${updated} updated, ${unchanged} unchanged).`;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Render a setup result to a single human line (shared by plain/llm). */
|
|
56
|
+
function renderSetupLine(data: SetupResult): string {
|
|
57
|
+
switch (data.kind) {
|
|
58
|
+
case "completions": {
|
|
59
|
+
if (!data.installed) {
|
|
60
|
+
return "No shell detected — completions were not installed.";
|
|
61
|
+
}
|
|
62
|
+
switch (data.state) {
|
|
63
|
+
case "installed":
|
|
64
|
+
return `${data.shell} completions already up to date at ${data.path}.`;
|
|
65
|
+
case "stale":
|
|
66
|
+
return `Updated ${data.shell} completions at ${data.path}.`;
|
|
67
|
+
default:
|
|
68
|
+
return `Installed ${data.shell} completions at ${data.path}.`;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
case "lsp":
|
|
72
|
+
return data.state === "installed"
|
|
73
|
+
? "Terrazzo LSP extension already installed (up to date)."
|
|
74
|
+
: "Terrazzo LSP extension is installed (up to date).";
|
|
75
|
+
case "mcp":
|
|
76
|
+
return summarizeMcpTargets(data.targets);
|
|
77
|
+
case "skills":
|
|
78
|
+
return `Skills: ${summarizeSkills(data.result)}.`;
|
|
79
|
+
case "all":
|
|
80
|
+
return data.steps.length > 0
|
|
81
|
+
? `Setup complete — ran: ${data.steps.join(", ")}.`
|
|
82
|
+
: "Setup complete — no steps selected.";
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export const setupFormatters: Formatters<SetupResult> = {
|
|
87
|
+
plain(data) {
|
|
88
|
+
return renderSetupLine(data);
|
|
89
|
+
},
|
|
90
|
+
llm(data) {
|
|
91
|
+
return `- ${renderSetupLine(data)}`;
|
|
92
|
+
},
|
|
93
|
+
json(data) {
|
|
94
|
+
return JSON.stringify(data);
|
|
95
|
+
},
|
|
96
|
+
};
|