@canonical/pragma-cli 0.32.0 → 0.34.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.
Files changed (295) hide show
  1. package/README.md +72 -0
  2. package/dist/pragma +0 -0
  3. package/package.json +19 -15
  4. package/pragma.conf.ts +664 -0
  5. package/src/bin.ts +15 -6
  6. package/src/capabilities/block.parity.test.ts +250 -0
  7. package/src/capabilities/capabilities/capabilities.render.ts +3 -2
  8. package/src/capabilities/capabilities/capabilities.test.ts +10 -1
  9. package/src/capabilities/capabilities/capabilities.verb.ts +32 -14
  10. package/src/capabilities/capabilities/catalog.ts +20 -8
  11. package/src/capabilities/capabilities/hints.ts +21 -36
  12. package/src/capabilities/capabilities/types.ts +2 -0
  13. package/src/capabilities/colophon/collectColophon.ts +34 -19
  14. package/src/capabilities/colophon/colophon.render.test.ts +31 -4
  15. package/src/capabilities/colophon/colophon.render.ts +13 -4
  16. package/src/capabilities/colophon/colophon.test.ts +3 -3
  17. package/src/capabilities/colophon/colophon.verb.ts +11 -4
  18. package/src/capabilities/colophon/markdownTerminal.ts +33 -14
  19. package/src/capabilities/colophon/types.ts +16 -7
  20. package/src/capabilities/config/collectConfigShow.test.ts +57 -0
  21. package/src/capabilities/config/collectConfigShow.ts +41 -4
  22. package/src/capabilities/config/fields.ts +10 -108
  23. package/src/capabilities/config/set.test.ts +6 -6
  24. package/src/capabilities/config/set.verb.ts +12 -8
  25. package/src/capabilities/config/show.render.test.ts +137 -0
  26. package/src/capabilities/config/show.render.ts +57 -16
  27. package/src/capabilities/config/show.verb.ts +9 -8
  28. package/src/capabilities/config/types.ts +8 -0
  29. package/src/capabilities/create/byteEquality.subprocess.test.ts +1 -1
  30. package/src/capabilities/create/byteEquality.test.ts +82 -101
  31. package/src/capabilities/create/compiledCreate.subprocess.test.ts +53 -16
  32. package/src/capabilities/create/constants.ts +75 -0
  33. package/src/capabilities/create/create.mcp.test.ts +2 -2
  34. package/src/capabilities/create/create.test.ts +192 -16
  35. package/src/capabilities/create/create.verb.ts +208 -79
  36. package/src/capabilities/create/index.ts +2 -10
  37. package/src/capabilities/create/pickGenerator.ts +34 -28
  38. package/src/capabilities/create/templates.embedded.generated.ts +4 -29
  39. package/src/capabilities/create/types.ts +10 -6
  40. package/src/capabilities/{standard/parity.test.ts → distribution.parity.test.ts} +24 -14
  41. package/src/capabilities/distribution.test.ts +120 -0
  42. package/src/capabilities/distribution.ts +59 -0
  43. package/src/capabilities/doctor/checks/checkConfigFile.ts +6 -5
  44. package/src/capabilities/doctor/checks/checkKeStore.ts +2 -2
  45. package/src/capabilities/doctor/checks/checkMcpCommands.ts +6 -0
  46. package/src/capabilities/doctor/checks/checkMcpConfigured.ts +15 -8
  47. package/src/capabilities/doctor/checks/checkPackageRefs.ts +79 -45
  48. package/src/capabilities/doctor/checks/checkPragmaVersion.ts +3 -2
  49. package/src/capabilities/doctor/checks/checkShellCompletions.test.ts +61 -11
  50. package/src/capabilities/doctor/checks/checkShellCompletions.ts +63 -23
  51. package/src/capabilities/doctor/checks/checkSkillsSymlinked.ts +3 -2
  52. package/src/capabilities/doctor/checks/deriveBand.test.ts +42 -0
  53. package/src/capabilities/doctor/checks/deriveBand.ts +28 -0
  54. package/src/capabilities/doctor/doctor.render.test.ts +170 -0
  55. package/src/capabilities/doctor/doctor.render.ts +117 -34
  56. package/src/capabilities/doctor/doctor.test.ts +68 -9
  57. package/src/capabilities/doctor/doctor.verb.ts +6 -2
  58. package/src/capabilities/doctor/runChecks.ts +33 -9
  59. package/src/capabilities/doctor/types.ts +16 -1
  60. package/src/capabilities/emptyRecovery.test.ts +32 -15
  61. package/src/capabilities/graph/inspect.verb.ts +3 -2
  62. package/src/capabilities/graph/query.verb.ts +3 -2
  63. package/src/capabilities/graph/runQuery.ts +8 -5
  64. package/src/capabilities/index.ts +22 -18
  65. package/src/capabilities/info/collectInfo.ts +10 -6
  66. package/src/capabilities/info/info.render.ts +3 -2
  67. package/src/capabilities/info/info.verb.ts +3 -2
  68. package/src/capabilities/lazy.test.ts +93 -2
  69. package/src/capabilities/ontology/index.ts +10 -3
  70. package/src/capabilities/ontology/ontology.test.ts +157 -5
  71. package/src/capabilities/ontology/verbs.ts +203 -104
  72. package/src/capabilities/prompt/prompt.render.test.ts +94 -0
  73. package/src/capabilities/prompt/prompt.render.ts +23 -6
  74. package/src/capabilities/prompt/prompt.test.ts +68 -1
  75. package/src/capabilities/prompt/verbs.ts +24 -11
  76. package/src/capabilities/reference.test.ts +32 -0
  77. package/src/capabilities/resources/provider.ts +58 -25
  78. package/src/capabilities/resources/resources.test.ts +176 -21
  79. package/src/capabilities/scopeTypeSync.test.ts +37 -0
  80. package/src/capabilities/setup/index.ts +7 -1
  81. package/src/capabilities/setup/operations/setupCompletions.ts +49 -16
  82. package/src/capabilities/setup/operations/setupGenerator.ts +166 -63
  83. package/src/capabilities/setup/operations/setupLsp.ts +56 -12
  84. package/src/capabilities/setup/operations/setupMcp.ts +216 -39
  85. package/src/capabilities/setup/operations/setupSkills.ts +10 -4
  86. package/src/capabilities/setup/setup.render.test.ts +109 -0
  87. package/src/capabilities/setup/setup.render.ts +61 -14
  88. package/src/capabilities/setup/setup.test.ts +352 -1
  89. package/src/capabilities/setup/setup.verb.ts +68 -9
  90. package/src/capabilities/setup/shell.ts +29 -3
  91. package/src/capabilities/setup/types.ts +59 -2
  92. package/src/capabilities/shared/bands.ts +16 -0
  93. package/src/capabilities/skill/discover.ts +11 -5
  94. package/src/capabilities/skill/render.ts +4 -5
  95. package/src/capabilities/skill/verbs.ts +7 -7
  96. package/src/capabilities/sources/collectStatus.ts +69 -49
  97. package/src/capabilities/sources/index.ts +1 -1
  98. package/src/capabilities/sources/installSkills.ts +2 -2
  99. package/src/capabilities/sources/runUpdate.ts +146 -98
  100. package/src/capabilities/sources/sources.test.ts +264 -84
  101. package/src/capabilities/sources/status.render.test.ts +94 -0
  102. package/src/capabilities/sources/status.render.ts +55 -33
  103. package/src/capabilities/sources/status.verb.ts +15 -8
  104. package/src/capabilities/sources/types.ts +18 -25
  105. package/src/capabilities/sources/update.render.ts +9 -2
  106. package/src/capabilities/sources/update.verb.ts +12 -23
  107. package/src/capabilities/surface.test.ts +65 -17
  108. package/src/capabilities/tier.parity.test.ts +144 -0
  109. package/src/capabilities/upgrade/upgrade.verb.ts +7 -3
  110. package/src/constants.test.ts +9 -7
  111. package/src/constants.ts +49 -23
  112. package/src/identity.test.ts +333 -0
  113. package/src/index.ts +2 -2
  114. package/src/kernel/completion/__snapshots__/emitScripts.test.ts.snap +18 -16
  115. package/src/kernel/completion/complete.test.ts +3 -5
  116. package/src/kernel/completion/emitScripts.test.ts +1 -1
  117. package/src/kernel/completion/emitScripts.ts +4 -2
  118. package/src/kernel/completion/entitySource.test.ts +185 -41
  119. package/src/kernel/completion/entitySource.ts +131 -113
  120. package/src/kernel/completion/model.test.ts +3 -3
  121. package/src/kernel/completion/model.ts +11 -1
  122. package/src/kernel/completion/parse.test.ts +2 -4
  123. package/src/kernel/completion/safety.test.ts +82 -36
  124. package/src/kernel/completion/shellDrive.test.ts +592 -0
  125. package/src/kernel/completion/templates/fish.ts +28 -6
  126. package/src/kernel/completion/types.ts +3 -3
  127. package/src/kernel/config/__snapshots__/firstRun.test.ts.snap +1 -1
  128. package/src/kernel/config/defaults.test.ts +85 -0
  129. package/src/kernel/config/defaults.ts +12 -23
  130. package/src/kernel/config/evaluateProjectConfig.ts +2 -3
  131. package/src/kernel/config/findProjectConfig.ts +4 -3
  132. package/src/kernel/config/firstRun.ts +12 -5
  133. package/src/kernel/config/globalConfig.ts +2 -2
  134. package/src/kernel/config/index.ts +4 -5
  135. package/src/kernel/config/paths.ts +17 -17
  136. package/src/kernel/config/readConfig.test.ts +242 -6
  137. package/src/kernel/config/readConfig.ts +8 -8
  138. package/src/kernel/config/schema.test.ts +50 -0
  139. package/src/kernel/config/schema.ts +97 -10
  140. package/src/kernel/config/types.ts +73 -19
  141. package/src/kernel/copy.test.ts +453 -0
  142. package/src/kernel/error/PragmaError.test.ts +5 -5
  143. package/src/kernel/error/constants.ts +3 -2
  144. package/src/kernel/error/index.ts +1 -1
  145. package/src/kernel/error/recovery.test.ts +22 -45
  146. package/src/kernel/error/recovery.ts +22 -27
  147. package/src/kernel/error/renderError.ts +1 -1
  148. package/src/kernel/error/types.ts +5 -4
  149. package/src/kernel/packs/collect.test.ts +195 -11
  150. package/src/kernel/packs/collect.ts +213 -58
  151. package/src/kernel/packs/compile.test.ts +163 -7
  152. package/src/kernel/packs/compile.ts +15 -12
  153. package/src/kernel/packs/disclosure.test.ts +5 -2
  154. package/src/kernel/packs/graphql/fetchGraphqlLookup.ts +11 -10
  155. package/src/kernel/packs/graphqlSource.test.ts +6 -3
  156. package/src/kernel/packs/iri.ts +5 -7
  157. package/src/kernel/packs/renderPack.ts +5 -3
  158. package/src/kernel/packs/resolveEntity.ts +21 -17
  159. package/src/kernel/packs/runBodies.ts +15 -14
  160. package/src/kernel/packs/schema.ts +96 -10
  161. package/src/kernel/packs/sparql/runSelect.test.ts +104 -10
  162. package/src/kernel/packs/sparql/runSelect.ts +73 -34
  163. package/src/kernel/packs/toolDescription.test.ts +10 -2
  164. package/src/kernel/packs/types.ts +39 -4
  165. package/src/kernel/packs/uniqueness.ts +4 -4
  166. package/src/kernel/project/cli/buildProgram.test.ts +60 -11
  167. package/src/kernel/project/cli/buildProgram.ts +11 -0
  168. package/src/kernel/project/cli/dispatch.test.ts +67 -0
  169. package/src/kernel/project/cli/dispatch.ts +34 -12
  170. package/src/kernel/project/cli/globalFlags.test.ts +12 -4
  171. package/src/kernel/project/cli/globalFlags.ts +14 -14
  172. package/src/kernel/project/cli/helpFormat.ts +1 -1
  173. package/src/kernel/project/cli/rootHelp.ts +109 -107
  174. package/src/kernel/project/mcp/buildServer.ts +11 -6
  175. package/src/kernel/project/mcp/instructions.ts +12 -7
  176. package/src/kernel/project/mcp/mcpError.ts +52 -0
  177. package/src/kernel/project/mcp/parity.test.ts +39 -1
  178. package/src/kernel/project/mcp/prompts/prompts.test.ts +128 -5
  179. package/src/kernel/project/mcp/prompts/provider.ts +51 -7
  180. package/src/kernel/project/mcp/prompts/source.ts +68 -67
  181. package/src/kernel/project/mcp/registerVerb.ts +25 -6
  182. package/src/kernel/project/mcp/serve.ts +11 -3
  183. package/src/kernel/project/mcp/toolDescriptions.test.ts +6 -2
  184. package/src/kernel/render/disclosure.ts +4 -2
  185. package/src/kernel/render/formatters.ts +5 -4
  186. package/src/kernel/render/prefixes.test.ts +36 -0
  187. package/src/kernel/render/prefixes.ts +40 -13
  188. package/src/kernel/render/renderers.test.ts +35 -1
  189. package/src/kernel/render/renderers.ts +25 -7
  190. package/src/kernel/render/style.test.ts +31 -0
  191. package/src/kernel/render/style.ts +74 -0
  192. package/src/kernel/runtime/graphpack/build.ts +57 -3
  193. package/src/kernel/runtime/graphpack/buildIndex.test.ts +149 -0
  194. package/src/kernel/runtime/graphpack/buildIndex.ts +173 -50
  195. package/src/kernel/runtime/graphpack/embedded/pack.generated.ts +5 -8
  196. package/src/kernel/runtime/graphpack/embedded/pack.index.generated.ts +3 -4
  197. package/src/kernel/runtime/graphpack/embedded/pack.stories.generated.ts +3 -0
  198. package/src/kernel/runtime/graphpack/embedded.ts +37 -11
  199. package/src/kernel/runtime/graphpack/graphpack.test.ts +274 -6
  200. package/src/kernel/runtime/graphpack/hash.ts +3 -2
  201. package/src/kernel/runtime/graphpack/index.ts +1 -1
  202. package/src/kernel/runtime/graphpack/manifest.ts +114 -12
  203. package/src/kernel/runtime/graphpack/read.ts +32 -22
  204. package/src/kernel/runtime/graphpack/schemas.ts +74 -0
  205. package/src/kernel/runtime/graphpack/stories.ts +84 -0
  206. package/src/kernel/runtime/graphpack/types.ts +72 -45
  207. package/src/kernel/runtime/loadSession.ts +4 -12
  208. package/src/kernel/runtime/paths.ts +64 -15
  209. package/src/kernel/runtime/probe.test.ts +8 -4
  210. package/src/kernel/runtime/readEntity.ts +6 -5
  211. package/src/kernel/runtime/refs/gitOps.ts +1 -19
  212. package/src/kernel/runtime/refs/parseRef.ts +7 -7
  213. package/src/kernel/runtime/refs/resolve.ts +141 -65
  214. package/src/kernel/runtime/resolveSources.test.ts +63 -24
  215. package/src/kernel/runtime/resolveSources.ts +36 -25
  216. package/src/kernel/runtime/storeReadiness.ts +62 -0
  217. package/src/kernel/runtime/storeless.test.ts +1 -1
  218. package/src/kernel/runtime/types.ts +1 -1
  219. package/src/kernel/runtime/wasmEmbed.test.ts +25 -20
  220. package/src/kernel/spec/emitReference.test.ts +196 -0
  221. package/src/kernel/spec/emitReference.ts +624 -0
  222. package/src/kernel/spec/emitSurface.ts +13 -7
  223. package/src/kernel/spec/index.ts +2 -0
  224. package/src/kernel/spec/surfaceConformance.test.ts +2 -2
  225. package/src/kernel/spec/surfaceConformance.ts +8 -0
  226. package/src/kernel/spec/types.ts +29 -9
  227. package/src/kernel/spec/validate.ts +2 -1
  228. package/src/kernel/vocabulary.test.ts +164 -0
  229. package/src/kernel/vocabulary.ts +146 -0
  230. package/src/testing/PARITY_GAPS.ts +9 -3
  231. package/src/testing/behavioral/README.md +3 -3
  232. package/src/testing/behavioral/autoLlm.e2e.test.ts +12 -2
  233. package/src/testing/behavioral/completion.test.ts +21 -8
  234. package/src/testing/behavioral/disclosure.test.ts +12 -0
  235. package/src/testing/behavioral/docExamples.test.ts +283 -0
  236. package/src/testing/behavioral/errorMatrix.mcp.test.ts +4 -3
  237. package/src/testing/behavioral/errorMatrix.storeless.test.ts +3 -2
  238. package/src/testing/behavioral/exitCodes.e2e.test.ts +6 -5
  239. package/src/testing/behavioral/harness.foundation.test.ts +14 -5
  240. package/src/testing/behavioral/journeys.cli.test.ts +116 -73
  241. package/src/testing/behavioral/journeys.defaultPack.test.ts +477 -0
  242. package/src/testing/behavioral/journeys.firstInstall.test.ts +167 -0
  243. package/src/testing/behavioral/journeys.interactiveTty.e2e.test.ts +66 -0
  244. package/src/testing/behavioral/journeys.livePack.e2e.test.ts +129 -0
  245. package/src/testing/behavioral/journeys.mcpLifecycle.mcp.test.ts +179 -0
  246. package/src/testing/behavioral/journeys.packageStories.test.ts +188 -0
  247. package/src/testing/behavioral/liveReadSurface.ts +4 -3
  248. package/src/testing/behavioral/mcpSurface.test.ts +10 -5
  249. package/src/testing/behavioral/staleCommands.test.ts +86 -0
  250. package/src/testing/eval/__snapshots__/eval.test.ts.snap +9 -9
  251. package/src/testing/eval/cases/assembly.ts +16 -9
  252. package/src/testing/eval/cases/effectful.ts +31 -16
  253. package/src/testing/eval/cases/readNouns.ts +23 -18
  254. package/src/testing/eval/cases/stable.ts +5 -1
  255. package/src/testing/eval/eval.test.ts +7 -1
  256. package/src/testing/fixtures/fixtureCapability.ts +201 -1
  257. package/src/testing/fixtures/graph/canonical.ts +6 -3
  258. package/src/testing/fixtures/graph/defaultPack.ts +179 -0
  259. package/src/testing/fixtures/graph/owlExport.ts +97 -0
  260. package/src/testing/helpers/extractSnippets.ts +29 -0
  261. package/src/testing/helpers/fixtureGraph.ts +33 -16
  262. package/src/testing/helpers/golden.ts +1 -1
  263. package/src/testing/helpers/packRuntime.ts +2 -3
  264. package/src/testing/helpers/projectCli.ts +2 -1
  265. package/src/testing/helpers/projectMcp.ts +6 -0
  266. package/src/testing/perf/budgets.test.ts +4 -0
  267. package/src/testing/perf/budgets.ts +22 -7
  268. package/src/testing/perf/globalSetup.ts +121 -6
  269. package/src/types.ts +2 -2
  270. package/src/capabilities/block/blockList.verb.ts +0 -150
  271. package/src/capabilities/block/index.ts +0 -25
  272. package/src/capabilities/block/pack.ts +0 -155
  273. package/src/capabilities/block/parity.test.ts +0 -180
  274. package/src/capabilities/block/tierChain.ts +0 -78
  275. package/src/capabilities/colophon/pragmaColophon.ts +0 -66
  276. package/src/capabilities/config/field.test.ts +0 -188
  277. package/src/capabilities/modifier/index.ts +0 -15
  278. package/src/capabilities/modifier/pack.ts +0 -64
  279. package/src/capabilities/standard/index.ts +0 -18
  280. package/src/capabilities/standard/pack.ts +0 -128
  281. package/src/capabilities/tier/index.ts +0 -19
  282. package/src/capabilities/tier/lookup.render.ts +0 -34
  283. package/src/capabilities/tier/lookup.test.ts +0 -68
  284. package/src/capabilities/tier/lookup.verb.ts +0 -44
  285. package/src/capabilities/tier/pack.ts +0 -28
  286. package/src/capabilities/tier/runLookup.ts +0 -59
  287. package/src/capabilities/token/addConfig.render.ts +0 -27
  288. package/src/capabilities/token/addConfig.test.ts +0 -62
  289. package/src/capabilities/token/addConfig.verb.ts +0 -40
  290. package/src/capabilities/token/index.ts +0 -19
  291. package/src/capabilities/token/pack.ts +0 -58
  292. package/src/capabilities/token/runAddConfig.ts +0 -95
  293. package/src/kernel/completion/bashDrive.test.ts +0 -73
  294. package/src/kernel/runtime/graphpack/embedded/sample.ttl +0 -39
  295. package/src/kernel/runtime/lock.ts +0 -90
@@ -13,6 +13,7 @@
13
13
  import { readdirSync, readFileSync, statSync } from "node:fs";
14
14
  import { homedir } from "node:os";
15
15
  import { basename, join } from "node:path";
16
+ import { BIN_NAME } from "../../constants.js";
16
17
 
17
18
  /** Parsed SKILL.md frontmatter. */
18
19
  export interface SkillFrontmatter {
@@ -103,26 +104,31 @@ export function parseFrontmatter(content: string): SkillFrontmatter | null {
103
104
  }
104
105
 
105
106
  /**
106
- * The installed-skills root: `$XDG_DATA_HOME/pragma/skills`. This is where
107
+ * The installed-skills root: `$XDG_DATA_HOME/<bin>/skills`. This is where
107
108
  * `sources update` INSTALLS package-provided skills (U10) — a symlink per skill
108
109
  * — and the second discovery root below reads them back. The single source of
109
110
  * truth for both, so the install target and the discovery root can never drift.
111
+ *
112
+ * Namespaced by {@link BIN_NAME}, like config, state and cache: two
113
+ * distributions installed side by side owned ONE skills root, so a `recipes`
114
+ * build served skills a `pragma` build had installed and could not install its
115
+ * own without colliding.
110
116
  */
111
117
  export function installedSkillsDir(): string {
112
118
  const dataHome =
113
119
  process.env.XDG_DATA_HOME ?? join(homedir(), ".local", "share");
114
- return join(dataHome, "pragma", "skills");
120
+ return join(dataHome, BIN_NAME, "skills");
115
121
  }
116
122
 
117
123
  /**
118
124
  * The conventional roots skills are discovered from, in PRECEDENCE order: the
119
- * project root (`<cwd>/.pragma/skills`) FIRST so a project-local skill overrides
125
+ * project root (`<cwd>/.<bin>/skills`) FIRST so a project-local skill overrides
120
126
  * an installed skill of the same name (`discoverSkills` dedups first-seen-wins),
121
- * then installed skills under `$XDG_DATA_HOME/pragma/skills` (where package
127
+ * then installed skills under `$XDG_DATA_HOME/<bin>/skills` (where package
122
128
  * skills land on `sources update`).
123
129
  */
124
130
  export function skillRoots(cwd: string): string[] {
125
- return [join(cwd, ".pragma", "skills"), installedSkillsDir()];
131
+ return [join(cwd, `.${BIN_NAME}`, "skills"), installedSkillsDir()];
126
132
  }
127
133
 
128
134
  /** Immediate subdirectories of `root` (each a candidate skill folder). */
@@ -2,15 +2,14 @@
2
2
  * Formatters for `skill list` and `skill lookup`.
3
3
  */
4
4
 
5
+ import { BIN_NAME } from "../../constants.js";
5
6
  import type { Formatters } from "../../kernel/spec/types.js";
6
7
  import type { DiscoveredSkill } from "./discover.js";
7
8
  import type { SkillLookup } from "./verbs.js";
8
9
 
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`.";
10
+ /** Empty-state guidance (U5) — where skills come from now that packs ship them. */
11
+ const EMPTY_PLAIN = `No skills found.\nSkills come from design-system packs — add one to your config's packs, run \`${BIN_NAME} sources update\`, then \`${BIN_NAME} setup skills\`.`;
12
+ const EMPTY_LLM = `## Skills (0)\n\nNo skills found. Skills come from design-system packs — add one to the project config's packs, run \`${BIN_NAME} sources update\`, then \`${BIN_NAME} setup skills\`.`;
14
13
 
15
14
  export const skillListFormatters: Formatters<DiscoveredSkill[]> = {
16
15
  plain: (skills) =>
@@ -8,7 +8,9 @@
8
8
 
9
9
  import { readFileSync } from "node:fs";
10
10
  import { join } from "node:path";
11
+ import { BIN_NAME } from "../../constants.js";
11
12
  import { PragmaError } from "../../kernel/error/PragmaError.js";
13
+ import { cliRecovery } from "../../kernel/error/recovery.js";
12
14
  import { suggestNames } from "../../kernel/project/cli/suggestNames.js";
13
15
  import type { PragmaRuntime } from "../../kernel/runtime/types.js";
14
16
  import { asVerb } from "../../kernel/spec/asVerb.js";
@@ -26,7 +28,7 @@ const listVerb: VerbSpec<Record<string, unknown>, DiscoveredSkill[]> = {
26
28
  summary: "List discovered skills (SKILL.md files under the skill roots).",
27
29
  params: [],
28
30
  output: { formatters: skillListFormatters },
29
- examples: [{ cmd: "pragma skill list" }],
31
+ examples: [{ cmd: `${BIN_NAME} skill list` }],
30
32
  capability: {
31
33
  needsStore: false,
32
34
  mutates: false,
@@ -53,7 +55,7 @@ const lookupVerb: VerbSpec<Record<string, unknown>, SkillLookup> = {
53
55
  },
54
56
  ],
55
57
  output: { formatters: skillLookupFormatters },
56
- examples: [{ cmd: "pragma skill lookup docx" }],
58
+ examples: [{ cmd: `${BIN_NAME} skill lookup docx` }],
57
59
  capability: {
58
60
  needsStore: false,
59
61
  mutates: false,
@@ -74,11 +76,9 @@ const lookupVerb: VerbSpec<Record<string, unknown>, SkillLookup> = {
74
76
  name,
75
77
  skills.map((skill) => skill.name),
76
78
  ),
77
- recovery: {
78
- message: "List discovered skills.",
79
- cli: "pragma skill list",
80
- mcp: { tool: "skill_list" },
81
- },
79
+ recovery: cliRecovery("skill list", "List discovered skills.", {
80
+ tool: "skill_list",
81
+ }),
82
82
  });
83
83
  }
84
84
  return { ...match, instructions: readInstructions(match.sourcePath) };
@@ -1,42 +1,51 @@
1
1
  /**
2
2
  * Collect the `sources status` payload — storeless.
3
3
  *
4
- * Reports the store's readiness without booting it: it reads the lock, the
5
- * resolved config, and — if the locked pack is cached — the manifest and the
6
- * index.json count (a plain `JSON.parse`, no store, no oxigraph). This is the
7
- * capability that must stay off the store factory (the storeless-guarantee spy
8
- * covers it), so it reaches for the pack files directly rather than through a
9
- * store session. It absorbs the v1 `info store` summary.
4
+ * Reports the store's readiness without booting it. The `store` field IS the
5
+ * boot decision ({@link resolveSources}) — status never re-derives which pack
6
+ * answers reads, so it can never disagree with what the next read actually
7
+ * loads. Everything else is provenance read straight off that pack's manifest
8
+ * (a plain `JSON.parse`, no store, no oxigraph). This is the capability that
9
+ * must stay off the store factory (the storeless-guarantee spy covers it). It
10
+ * absorbs the v1 `info store` summary.
10
11
  */
11
12
 
12
13
  import { existsSync, readFileSync } from "node:fs";
13
14
  import { join } from "node:path";
14
- import type { PackageEntry } from "../../kernel/config/types.js";
15
+ import type { PackDeclaration } from "../../kernel/config/types.js";
16
+ import { embeddedManifest } from "../../kernel/runtime/graphpack/embedded.js";
15
17
  import { readManifest } from "../../kernel/runtime/graphpack/manifest.js";
16
18
  import { INDEX_FILE } from "../../kernel/runtime/graphpack/types.js";
17
- import { readLock } from "../../kernel/runtime/lock.js";
18
- import { packDir } from "../../kernel/runtime/paths.js";
19
+ import { resolveSources } from "../../kernel/runtime/resolveSources.js";
19
20
  import type { PragmaRuntime } from "../../kernel/runtime/types.js";
20
- import type {
21
- SourceStaleness,
22
- SourceStatusEntry,
23
- SourcesStatusData,
24
- } from "./types.js";
21
+ import type { SourcesStatusData } from "./types.js";
25
22
 
26
- const entryName = (entry: PackageEntry): string =>
23
+ const entryName = (entry: PackDeclaration): string =>
27
24
  typeof entry === "string" ? entry : entry.name;
28
- const entrySource = (entry: PackageEntry): string =>
25
+ const entrySource = (entry: PackDeclaration): string =>
29
26
  typeof entry === "string" ? entry : (entry.source ?? entry.name);
30
27
 
31
- /** The indexed entity count from a cached pack's index.json (storeless). */
28
+ /**
29
+ * The distinct-abox entity count from a built pack's index.json (storeless).
30
+ *
31
+ * Only reached for LEGACY packs whose manifest predates the persisted
32
+ * `entityCount` (A10) — a current pack's count is read straight from the
33
+ * manifest, no index parse. Counts distinct abox subjects so the figure matches
34
+ * both the manifest count and `info`'s `entityTotal` (A1).
35
+ */
32
36
  function indexEntityCount(dir: string): number | null {
33
37
  const path = join(dir, INDEX_FILE);
34
38
  if (!existsSync(path)) return null;
35
39
  try {
36
40
  const parsed = JSON.parse(readFileSync(path, "utf-8")) as {
37
- entities?: unknown[];
41
+ entities?: { box?: string; uri?: string; name?: string }[];
38
42
  };
39
- return Array.isArray(parsed.entities) ? parsed.entities.length : null;
43
+ if (!Array.isArray(parsed.entities)) return null;
44
+ const subjects = new Set<string>();
45
+ for (const entity of parsed.entities) {
46
+ if (entity.box === "abox") subjects.add(entity.uri ?? entity.name ?? "");
47
+ }
48
+ return subjects.size;
40
49
  } catch {
41
50
  return null;
42
51
  }
@@ -47,41 +56,52 @@ function indexEntityCount(dir: string): number | null {
47
56
  *
48
57
  * @param runtime - The per-invocation runtime.
49
58
  * @returns The storeless status payload.
50
- * @note Impure — reads config, the lock, and the pack cache from disk.
59
+ * @note Impure — reads config, the active-pack pointer, and the pack cache.
51
60
  */
52
61
  export async function collectStatus(
53
62
  runtime: PragmaRuntime,
54
63
  ): Promise<SourcesStatusData> {
55
64
  const layers = await runtime.loadConfig();
56
- const entries = layers.config.packages ?? [];
57
- const lock = readLock(runtime.cwd);
65
+ const sources = (layers.config.packs ?? []).map((entry) => ({
66
+ name: entryName(entry),
67
+ ref: entrySource(entry),
68
+ }));
69
+ const decision = resolveSources(layers, runtime.cwd);
70
+ const base = { cwd: runtime.cwd, sources };
58
71
 
59
- const dir = lock ? packDir(lock.contentHash) : undefined;
60
- const manifest = dir ? readManifest(dir) : undefined;
61
- const cached = manifest !== undefined;
62
-
63
- const sources: SourceStatusEntry[] = entries.map((entry) => {
64
- const name = entryName(entry);
65
- const ref = entrySource(entry);
66
- const lockEntry = lock?.packs.find((pack) => pack.name === name);
67
- let staleness: SourceStaleness;
68
- if (!lock || !cached) {
69
- staleness = "uncached";
70
- } else if (!lockEntry || lockEntry.source !== ref) {
71
- staleness = "config-drift";
72
- } else {
73
- staleness = "up-to-date";
72
+ switch (decision.kind) {
73
+ case "embedded": {
74
+ const manifest = embeddedManifest();
75
+ return {
76
+ ...base,
77
+ store: "embedded",
78
+ contentHash: manifest.contentHash,
79
+ sourceRef: manifest.sourceRef,
80
+ builtAt: manifest.createdAt,
81
+ entityCount: manifest.entityCount ?? null,
82
+ };
74
83
  }
75
- return { name, ref, resolved: lockEntry?.resolved ?? null, staleness };
76
- });
77
-
78
- return {
79
- cwd: runtime.cwd,
80
- lockPresent: lock !== undefined,
81
- contentHash: lock?.contentHash ?? null,
82
- cached,
83
- builtAt: manifest?.createdAt ?? null,
84
- entityCount: dir && cached ? indexEntityCount(dir) : null,
85
- sources,
86
- };
84
+ case "pack": {
85
+ const manifest = readManifest(decision.dir);
86
+ return {
87
+ ...base,
88
+ store: "built",
89
+ contentHash: decision.contentHash,
90
+ sourceRef: manifest?.sourceRef ?? null,
91
+ builtAt: manifest?.createdAt ?? null,
92
+ // Prefer the manifest's persisted count (no index parse); a legacy pack
93
+ // without it falls back to counting the index's abox subjects (A10).
94
+ entityCount: manifest?.entityCount ?? indexEntityCount(decision.dir),
95
+ };
96
+ }
97
+ case "unavailable":
98
+ return {
99
+ ...base,
100
+ store: "unavailable",
101
+ contentHash: null,
102
+ sourceRef: null,
103
+ builtAt: null,
104
+ entityCount: null,
105
+ };
106
+ }
87
107
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * The `sources` capability barrel — `status` (storeless read) and `update`
3
- * (the resolve/build/lock Task).
3
+ * (the resolve/build/point Task).
4
4
  */
5
5
 
6
6
  import { asVerb } from "../../kernel/spec/asVerb.js";
@@ -4,9 +4,9 @@
4
4
  * Design-system packages ship a top-level `skills/<name>/SKILL.md`, but skill
5
5
  * discovery only scans the project root and the installed-skills root — never a
6
6
  * resolved package's clone/dir. So `sources update` INSTALLS each package's
7
- * skills into the installed-skills root (`$XDG_DATA_HOME/pragma/skills`) as
7
+ * skills into the installed-skills root (`$XDG_DATA_HOME/<bin>/skills`) as
8
8
  * symlinks, exactly the root `discoverSkills` already reads. Precedence is
9
- * preserved (a project `.pragma/skills` entry still wins — it is discovered
9
+ * preserved (a project `.<bin>/skills` entry still wins — it is discovered
10
10
  * first), and the update Task stays reversible (each created link carries an
11
11
  * unlink undo).
12
12
  *