wingfoil 0.2.1

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 (339) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +334 -0
  3. package/dist/cli/error.d.ts +11 -0
  4. package/dist/cli/error.d.ts.map +1 -0
  5. package/dist/cli/error.js +27 -0
  6. package/dist/cli/error.js.map +1 -0
  7. package/dist/cli/exit.d.ts +19 -0
  8. package/dist/cli/exit.d.ts.map +1 -0
  9. package/dist/cli/exit.js +14 -0
  10. package/dist/cli/exit.js.map +1 -0
  11. package/dist/cli/index.d.ts +28 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +36 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/init-command.d.ts +34 -0
  16. package/dist/cli/init-command.d.ts.map +1 -0
  17. package/dist/cli/init-command.js +100 -0
  18. package/dist/cli/init-command.js.map +1 -0
  19. package/dist/cli/mcp-command.d.ts +24 -0
  20. package/dist/cli/mcp-command.d.ts.map +1 -0
  21. package/dist/cli/mcp-command.js +42 -0
  22. package/dist/cli/mcp-command.js.map +1 -0
  23. package/dist/cli/output.d.ts +13 -0
  24. package/dist/cli/output.d.ts.map +1 -0
  25. package/dist/cli/output.js +28 -0
  26. package/dist/cli/output.js.map +1 -0
  27. package/dist/cli/program.d.ts +12 -0
  28. package/dist/cli/program.d.ts.map +1 -0
  29. package/dist/cli/program.js +279 -0
  30. package/dist/cli/program.js.map +1 -0
  31. package/dist/cli/registrar.d.ts +69 -0
  32. package/dist/cli/registrar.d.ts.map +1 -0
  33. package/dist/cli/registrar.js +82 -0
  34. package/dist/cli/registrar.js.map +1 -0
  35. package/dist/cli.d.ts +3 -0
  36. package/dist/cli.d.ts.map +1 -0
  37. package/dist/cli.js +45 -0
  38. package/dist/cli.js.map +1 -0
  39. package/dist/core/approval-authority.d.ts +83 -0
  40. package/dist/core/approval-authority.d.ts.map +1 -0
  41. package/dist/core/approval-authority.js +112 -0
  42. package/dist/core/approval-authority.js.map +1 -0
  43. package/dist/core/builtin-asset.d.ts +71 -0
  44. package/dist/core/builtin-asset.d.ts.map +1 -0
  45. package/dist/core/builtin-asset.js +137 -0
  46. package/dist/core/builtin-asset.js.map +1 -0
  47. package/dist/core/builtin-integrity.d.ts +32 -0
  48. package/dist/core/builtin-integrity.d.ts.map +1 -0
  49. package/dist/core/builtin-integrity.js +148 -0
  50. package/dist/core/builtin-integrity.js.map +1 -0
  51. package/dist/core/confinement.d.ts +57 -0
  52. package/dist/core/confinement.d.ts.map +1 -0
  53. package/dist/core/confinement.js +108 -0
  54. package/dist/core/confinement.js.map +1 -0
  55. package/dist/core/context.d.ts +187 -0
  56. package/dist/core/context.d.ts.map +1 -0
  57. package/dist/core/context.js +192 -0
  58. package/dist/core/context.js.map +1 -0
  59. package/dist/core/directive-assign.d.ts +131 -0
  60. package/dist/core/directive-assign.d.ts.map +1 -0
  61. package/dist/core/directive-assign.js +352 -0
  62. package/dist/core/directive-assign.js.map +1 -0
  63. package/dist/core/directives-list.d.ts +80 -0
  64. package/dist/core/directives-list.d.ts.map +1 -0
  65. package/dist/core/directives-list.js +148 -0
  66. package/dist/core/directives-list.js.map +1 -0
  67. package/dist/core/exit-code.d.ts +85 -0
  68. package/dist/core/exit-code.d.ts.map +1 -0
  69. package/dist/core/exit-code.js +163 -0
  70. package/dist/core/exit-code.js.map +1 -0
  71. package/dist/core/git-identity.d.ts +32 -0
  72. package/dist/core/git-identity.d.ts.map +1 -0
  73. package/dist/core/git-identity.js +72 -0
  74. package/dist/core/git-identity.js.map +1 -0
  75. package/dist/core/index.d.ts +388 -0
  76. package/dist/core/index.d.ts.map +1 -0
  77. package/dist/core/index.js +1331 -0
  78. package/dist/core/index.js.map +1 -0
  79. package/dist/core/init.d.ts +78 -0
  80. package/dist/core/init.d.ts.map +1 -0
  81. package/dist/core/init.js +167 -0
  82. package/dist/core/init.js.map +1 -0
  83. package/dist/core/loaders.d.ts +174 -0
  84. package/dist/core/loaders.d.ts.map +1 -0
  85. package/dist/core/loaders.js +364 -0
  86. package/dist/core/loaders.js.map +1 -0
  87. package/dist/core/memory-add-type.d.ts +43 -0
  88. package/dist/core/memory-add-type.d.ts.map +1 -0
  89. package/dist/core/memory-add-type.js +151 -0
  90. package/dist/core/memory-add-type.js.map +1 -0
  91. package/dist/core/memory-transition.d.ts +111 -0
  92. package/dist/core/memory-transition.d.ts.map +1 -0
  93. package/dist/core/memory-transition.js +269 -0
  94. package/dist/core/memory-transition.js.map +1 -0
  95. package/dist/core/registry.d.ts +189 -0
  96. package/dist/core/registry.d.ts.map +1 -0
  97. package/dist/core/registry.js +66 -0
  98. package/dist/core/registry.js.map +1 -0
  99. package/dist/core/relevance.d.ts +86 -0
  100. package/dist/core/relevance.d.ts.map +1 -0
  101. package/dist/core/relevance.js +258 -0
  102. package/dist/core/relevance.js.map +1 -0
  103. package/dist/core/require-reason.d.ts +27 -0
  104. package/dist/core/require-reason.d.ts.map +1 -0
  105. package/dist/core/require-reason.js +95 -0
  106. package/dist/core/require-reason.js.map +1 -0
  107. package/dist/core/types.d.ts +45 -0
  108. package/dist/core/types.d.ts.map +1 -0
  109. package/dist/core/types.js +22 -0
  110. package/dist/core/types.js.map +1 -0
  111. package/dist/core/usage-error.d.ts +20 -0
  112. package/dist/core/usage-error.d.ts.map +1 -0
  113. package/dist/core/usage-error.js +29 -0
  114. package/dist/core/usage-error.js.map +1 -0
  115. package/dist/core/write-guard.d.ts +99 -0
  116. package/dist/core/write-guard.d.ts.map +1 -0
  117. package/dist/core/write-guard.js +247 -0
  118. package/dist/core/write-guard.js.map +1 -0
  119. package/dist/directives/create.d.ts +47 -0
  120. package/dist/directives/create.d.ts.map +1 -0
  121. package/dist/directives/create.js +82 -0
  122. package/dist/directives/create.js.map +1 -0
  123. package/dist/directives/index.d.ts +20 -0
  124. package/dist/directives/index.d.ts.map +1 -0
  125. package/dist/directives/index.js +32 -0
  126. package/dist/directives/index.js.map +1 -0
  127. package/dist/directives/roles-edit.d.ts +53 -0
  128. package/dist/directives/roles-edit.d.ts.map +1 -0
  129. package/dist/directives/roles-edit.js +286 -0
  130. package/dist/directives/roles-edit.js.map +1 -0
  131. package/dist/directives/schema.d.ts +65 -0
  132. package/dist/directives/schema.d.ts.map +1 -0
  133. package/dist/directives/schema.js +68 -0
  134. package/dist/directives/schema.js.map +1 -0
  135. package/dist/dna/edit.d.ts +61 -0
  136. package/dist/dna/edit.d.ts.map +1 -0
  137. package/dist/dna/edit.js +429 -0
  138. package/dist/dna/edit.js.map +1 -0
  139. package/dist/dna/index.d.ts +24 -0
  140. package/dist/dna/index.d.ts.map +1 -0
  141. package/dist/dna/index.js +59 -0
  142. package/dist/dna/index.js.map +1 -0
  143. package/dist/dna/mutate.d.ts +74 -0
  144. package/dist/dna/mutate.d.ts.map +1 -0
  145. package/dist/dna/mutate.js +318 -0
  146. package/dist/dna/mutate.js.map +1 -0
  147. package/dist/dna/path.d.ts +175 -0
  148. package/dist/dna/path.d.ts.map +1 -0
  149. package/dist/dna/path.js +289 -0
  150. package/dist/dna/path.js.map +1 -0
  151. package/dist/dna/roles.d.ts +57 -0
  152. package/dist/dna/roles.d.ts.map +1 -0
  153. package/dist/dna/roles.js +50 -0
  154. package/dist/dna/roles.js.map +1 -0
  155. package/dist/dna/schema.d.ts +172 -0
  156. package/dist/dna/schema.d.ts.map +1 -0
  157. package/dist/dna/schema.js +182 -0
  158. package/dist/dna/schema.js.map +1 -0
  159. package/dist/dna/set.d.ts +145 -0
  160. package/dist/dna/set.d.ts.map +1 -0
  161. package/dist/dna/set.js +428 -0
  162. package/dist/dna/set.js.map +1 -0
  163. package/dist/mcp/dna-resource.d.ts +16 -0
  164. package/dist/mcp/dna-resource.d.ts.map +1 -0
  165. package/dist/mcp/dna-resource.js +56 -0
  166. package/dist/mcp/dna-resource.js.map +1 -0
  167. package/dist/mcp/index.d.ts +49 -0
  168. package/dist/mcp/index.d.ts.map +1 -0
  169. package/dist/mcp/index.js +60 -0
  170. package/dist/mcp/index.js.map +1 -0
  171. package/dist/mcp/memory-resource.d.ts +17 -0
  172. package/dist/mcp/memory-resource.d.ts.map +1 -0
  173. package/dist/mcp/memory-resource.js +133 -0
  174. package/dist/mcp/memory-resource.js.map +1 -0
  175. package/dist/mcp/prompt.d.ts +48 -0
  176. package/dist/mcp/prompt.d.ts.map +1 -0
  177. package/dist/mcp/prompt.js +176 -0
  178. package/dist/mcp/prompt.js.map +1 -0
  179. package/dist/mcp/read-only.d.ts +42 -0
  180. package/dist/mcp/read-only.d.ts.map +1 -0
  181. package/dist/mcp/read-only.js +93 -0
  182. package/dist/mcp/read-only.js.map +1 -0
  183. package/dist/mcp/registrar.d.ts +54 -0
  184. package/dist/mcp/registrar.d.ts.map +1 -0
  185. package/dist/mcp/registrar.js +72 -0
  186. package/dist/mcp/registrar.js.map +1 -0
  187. package/dist/mcp/server.d.ts +58 -0
  188. package/dist/mcp/server.d.ts.map +1 -0
  189. package/dist/mcp/server.js +64 -0
  190. package/dist/mcp/server.js.map +1 -0
  191. package/dist/mcp/workflow-resource.d.ts +17 -0
  192. package/dist/mcp/workflow-resource.d.ts.map +1 -0
  193. package/dist/mcp/workflow-resource.js +63 -0
  194. package/dist/mcp/workflow-resource.js.map +1 -0
  195. package/dist/memory/add.d.ts +50 -0
  196. package/dist/memory/add.d.ts.map +1 -0
  197. package/dist/memory/add.js +131 -0
  198. package/dist/memory/add.js.map +1 -0
  199. package/dist/memory/audit.d.ts +177 -0
  200. package/dist/memory/audit.d.ts.map +1 -0
  201. package/dist/memory/audit.js +287 -0
  202. package/dist/memory/audit.js.map +1 -0
  203. package/dist/memory/commit-message.d.ts +146 -0
  204. package/dist/memory/commit-message.d.ts.map +1 -0
  205. package/dist/memory/commit-message.js +203 -0
  206. package/dist/memory/commit-message.js.map +1 -0
  207. package/dist/memory/entry.d.ts +56 -0
  208. package/dist/memory/entry.d.ts.map +1 -0
  209. package/dist/memory/entry.js +28 -0
  210. package/dist/memory/entry.js.map +1 -0
  211. package/dist/memory/frontmatter-edit.d.ts +68 -0
  212. package/dist/memory/frontmatter-edit.d.ts.map +1 -0
  213. package/dist/memory/frontmatter-edit.js +333 -0
  214. package/dist/memory/frontmatter-edit.js.map +1 -0
  215. package/dist/memory/git-log.d.ts +32 -0
  216. package/dist/memory/git-log.d.ts.map +1 -0
  217. package/dist/memory/git-log.js +100 -0
  218. package/dist/memory/git-log.js.map +1 -0
  219. package/dist/memory/history.d.ts +142 -0
  220. package/dist/memory/history.d.ts.map +1 -0
  221. package/dist/memory/history.js +250 -0
  222. package/dist/memory/history.js.map +1 -0
  223. package/dist/memory/index.d.ts +58 -0
  224. package/dist/memory/index.d.ts.map +1 -0
  225. package/dist/memory/index.js +107 -0
  226. package/dist/memory/index.js.map +1 -0
  227. package/dist/memory/query.d.ts +150 -0
  228. package/dist/memory/query.d.ts.map +1 -0
  229. package/dist/memory/query.js +307 -0
  230. package/dist/memory/query.js.map +1 -0
  231. package/dist/memory/reject.d.ts +11 -0
  232. package/dist/memory/reject.d.ts.map +1 -0
  233. package/dist/memory/reject.js +32 -0
  234. package/dist/memory/reject.js.map +1 -0
  235. package/dist/memory/schema.d.ts +104 -0
  236. package/dist/memory/schema.d.ts.map +1 -0
  237. package/dist/memory/schema.js +161 -0
  238. package/dist/memory/schema.js.map +1 -0
  239. package/dist/memory/state-machine.d.ts +166 -0
  240. package/dist/memory/state-machine.d.ts.map +1 -0
  241. package/dist/memory/state-machine.js +431 -0
  242. package/dist/memory/state-machine.js.map +1 -0
  243. package/dist/memory/submit.d.ts +11 -0
  244. package/dist/memory/submit.d.ts.map +1 -0
  245. package/dist/memory/submit.js +44 -0
  246. package/dist/memory/submit.js.map +1 -0
  247. package/dist/storage/builtin-directives.d.ts +54 -0
  248. package/dist/storage/builtin-directives.d.ts.map +1 -0
  249. package/dist/storage/builtin-directives.js +152 -0
  250. package/dist/storage/builtin-directives.js.map +1 -0
  251. package/dist/storage/commit.d.ts +92 -0
  252. package/dist/storage/commit.d.ts.map +1 -0
  253. package/dist/storage/commit.js +201 -0
  254. package/dist/storage/commit.js.map +1 -0
  255. package/dist/storage/confinement.d.ts +93 -0
  256. package/dist/storage/confinement.d.ts.map +1 -0
  257. package/dist/storage/confinement.js +164 -0
  258. package/dist/storage/confinement.js.map +1 -0
  259. package/dist/storage/document.d.ts +27 -0
  260. package/dist/storage/document.d.ts.map +1 -0
  261. package/dist/storage/document.js +52 -0
  262. package/dist/storage/document.js.map +1 -0
  263. package/dist/storage/errors.d.ts +36 -0
  264. package/dist/storage/errors.d.ts.map +1 -0
  265. package/dist/storage/errors.js +46 -0
  266. package/dist/storage/errors.js.map +1 -0
  267. package/dist/storage/frontmatter.d.ts +27 -0
  268. package/dist/storage/frontmatter.d.ts.map +1 -0
  269. package/dist/storage/frontmatter.js +37 -0
  270. package/dist/storage/frontmatter.js.map +1 -0
  271. package/dist/storage/git-root.d.ts +17 -0
  272. package/dist/storage/git-root.d.ts.map +1 -0
  273. package/dist/storage/git-root.js +49 -0
  274. package/dist/storage/git-root.js.map +1 -0
  275. package/dist/storage/index.d.ts +29 -0
  276. package/dist/storage/index.d.ts.map +1 -0
  277. package/dist/storage/index.js +66 -0
  278. package/dist/storage/index.js.map +1 -0
  279. package/dist/storage/init-state.d.ts +9 -0
  280. package/dist/storage/init-state.d.ts.map +1 -0
  281. package/dist/storage/init-state.js +24 -0
  282. package/dist/storage/init-state.js.map +1 -0
  283. package/dist/storage/layout.d.ts +51 -0
  284. package/dist/storage/layout.d.ts.map +1 -0
  285. package/dist/storage/layout.js +88 -0
  286. package/dist/storage/layout.js.map +1 -0
  287. package/dist/storage/memory-path.d.ts +72 -0
  288. package/dist/storage/memory-path.d.ts.map +1 -0
  289. package/dist/storage/memory-path.js +127 -0
  290. package/dist/storage/memory-path.js.map +1 -0
  291. package/dist/storage/snapshot.d.ts +16 -0
  292. package/dist/storage/snapshot.d.ts.map +1 -0
  293. package/dist/storage/snapshot.js +72 -0
  294. package/dist/storage/snapshot.js.map +1 -0
  295. package/dist/storage/templates.d.ts +88 -0
  296. package/dist/storage/templates.d.ts.map +1 -0
  297. package/dist/storage/templates.js +422 -0
  298. package/dist/storage/templates.js.map +1 -0
  299. package/dist/validation/error-mapper.d.ts +16 -0
  300. package/dist/validation/error-mapper.d.ts.map +1 -0
  301. package/dist/validation/error-mapper.js +18 -0
  302. package/dist/validation/error-mapper.js.map +1 -0
  303. package/dist/validation/errors.d.ts +69 -0
  304. package/dist/validation/errors.d.ts.map +1 -0
  305. package/dist/validation/errors.js +69 -0
  306. package/dist/validation/errors.js.map +1 -0
  307. package/dist/validation/id.d.ts +16 -0
  308. package/dist/validation/id.d.ts.map +1 -0
  309. package/dist/validation/id.js +177 -0
  310. package/dist/validation/id.js.map +1 -0
  311. package/dist/validation/index.d.ts +18 -0
  312. package/dist/validation/index.d.ts.map +1 -0
  313. package/dist/validation/index.js +37 -0
  314. package/dist/validation/index.js.map +1 -0
  315. package/dist/validation/secret-scan.d.ts +129 -0
  316. package/dist/validation/secret-scan.d.ts.map +1 -0
  317. package/dist/validation/secret-scan.js +367 -0
  318. package/dist/validation/secret-scan.js.map +1 -0
  319. package/dist/validation/two-pass.d.ts +24 -0
  320. package/dist/validation/two-pass.d.ts.map +1 -0
  321. package/dist/validation/two-pass.js +24 -0
  322. package/dist/validation/two-pass.js.map +1 -0
  323. package/dist/validation/warning.d.ts +31 -0
  324. package/dist/validation/warning.d.ts.map +1 -0
  325. package/dist/validation/warning.js +81 -0
  326. package/dist/validation/warning.js.map +1 -0
  327. package/dist/validation/yaml.d.ts +9 -0
  328. package/dist/validation/yaml.d.ts.map +1 -0
  329. package/dist/validation/yaml.js +30 -0
  330. package/dist/validation/yaml.js.map +1 -0
  331. package/dist/workflow/index.d.ts +10 -0
  332. package/dist/workflow/index.d.ts.map +1 -0
  333. package/dist/workflow/index.js +16 -0
  334. package/dist/workflow/index.js.map +1 -0
  335. package/dist/workflow/schema.d.ts +89 -0
  336. package/dist/workflow/schema.d.ts.map +1 -0
  337. package/dist/workflow/schema.js +73 -0
  338. package/dist/workflow/schema.js.map +1 -0
  339. package/package.json +78 -0
@@ -0,0 +1,428 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DNA_KEY_ALIASES = void 0;
4
+ exports.splitDnaPath = splitDnaPath;
5
+ exports.quoteDnaSegment = quoteDnaSegment;
6
+ exports.isValidKeyPath = isValidKeyPath;
7
+ exports.inlineCommentIndex = inlineCommentIndex;
8
+ exports.valueOf = valueOf;
9
+ exports.setDnaValueInText = setDnaValueInText;
10
+ /**
11
+ * Pure DNA key-path helpers for `wingfoil dna set` (P2.1, task-025-implement-dna-set). The `dna`
12
+ * pillar owns the semantics of a dotted key path into its own structure; `src/core`'s `dnaSet`
13
+ * operation composes these with the git-identity pre-flight, schema re-validation, write, and commit
14
+ * (which are cross-pillar / storage concerns and therefore live in `src/core`, not here). Nothing in
15
+ * this file imports `src/core` — the pillar stays a leaf under core (spec-006-core-domain-api §1).
16
+ *
17
+ * task-063 adds {@link setDnaValueInText}, the minimal **comment-preserving** in-place edit that
18
+ * replaces the whole-file `js-yaml` `dump()` round-trip as `dna set`'s primary write path
19
+ * (bug-004-dna-set-strips-yaml-comments). Only `js-yaml` is imported — no comment-preserving YAML
20
+ * library is added, per `dl-010-minimal-dependencies`.
21
+ */
22
+ const js_yaml_1 = require("js-yaml");
23
+ /**
24
+ * The first-segment alias `dna show` resolves: `tech_stack` -> `stacks`, the BDD-compatibility alias
25
+ * spec-002-dna-yaml-schema's Consequences describe (the schema renamed the BDD's `tech_stack` wording
26
+ * to `stacks`), so `dna show tech_stack` still reads the `stacks` subtree.
27
+ *
28
+ * **READ side only, since task-093** (`bug-084-dna-key-alias-writes-unschemad-keys`). It used to be
29
+ * applied on the write path too, and there it was a trap: `stacks` replaced a fixed-key `tech_stack`
30
+ * OBJECT, which is a change of shape rather than of name, so rewriting only the first segment
31
+ * produced a path that resolves nowhere — `dna set tech_stack.cli.framework Commander` wrote
32
+ * `stacks.cli.framework`, a key no schema declares, through `Stacks`'s `.passthrough()`, at exit 0.
33
+ * spec-002 says plainly that "any consumer that read `tech_stack.<key>` must now scan" the lists, and
34
+ * a first-segment alias cannot honour that sentence. The write path therefore does not alias at all;
35
+ * an old-shape path is refused as the unknown key it is (`src/dna/path.ts`, exit 1).
36
+ */
37
+ exports.DNA_KEY_ALIASES = { tech_stack: 'stacks' };
38
+ /** The delimiter that opens and closes a quoted path segment (`dl-083`). */
39
+ const QUOTE = '"';
40
+ /**
41
+ * Parse a dotted DNA key path into its segments — the ONE place a path is split, shared by
42
+ * {@link isValidKeyPath}, {@link setDnaValueInText}'s text resolver and `resolveDnaPath`
43
+ * (`./path.ts`). It replaced three copies of `keyPath.split('.')`, which is why the quoting rule
44
+ * below has one definition rather than three chances to disagree.
45
+ *
46
+ * **The grammar** (`dl-083-dotted-entry-names-in-paths`, ratified; it exists because
47
+ * `dl-081-dna-mutation-surface-shape` made an entry's `name` the key it is addressed by, and
48
+ * `stacks.technologies` really does carry entries named `Node.js` and `Commander.js`):
49
+ *
50
+ * - a segment that **begins** with `"` is quoted and ends at the **next** `"`. The quotes are
51
+ * delimiters and are not part of the name; between them `.` is an ordinary character, and so is
52
+ * everything else;
53
+ * - the closing `"` must be followed by `.` or by the end of the path;
54
+ * - a segment that does not begin with `"` ends at the next `.`;
55
+ * - quoting is optional where it is unnecessary: `team."members".roberto` and `team.members.roberto`
56
+ * are the same path.
57
+ *
58
+ * **The rule narrows what a path may mean, and for one class of path that is a breaking change.**
59
+ * Before it, `"` was an ordinary character inside a segment; under it every `"` is a delimiter. Two
60
+ * measured consequences, neither hypothetical: `isValidKeyPath('modules.co"re')` was `true` and is
61
+ * now `false`; and where a collection carries an entry named `"a"` beside one named `a` — the schema
62
+ * permits both, `uniquelyNamed` included — `stacks.technologies."a".category` resolved to the
63
+ * quote-named entry before and resolves to the **other** entry now, silently rather than by refusing.
64
+ * `dl-083` accepts the narrowing deliberately (a name containing `"` becomes unaddressable, with no
65
+ * escape sequence), but accepting it is not the same as nothing having changed.
66
+ *
67
+ * At a shell prompt the two quoting layers overlap and are easy to confuse:
68
+ * `wingfoil dna update 'stacks.technologies."Node.js".version' --value 22.14+` has the **shell's**
69
+ * single quotes outside and **WingFoil's** double quotes inside. This function sees only the inner
70
+ * form.
71
+ *
72
+ * **Three refusals, and the distinctions between them are load-bearing:**
73
+ *
74
+ * - an **empty** segment, quoted (`team.""`) or not (`..language`) — `invalid key path: '<path>'`,
75
+ * the message `P2.1-dna-set.feature` scenario 3 pins, unchanged;
76
+ * - an **unterminated** quote — a segment that opens with `"` and never closes. Refused as
77
+ * unterminated rather than taken as a name that happens to begin with a quote, so
78
+ * `dna update 'stacks."Node.js'` reports the typo instead of hunting for an entry named `"Node`;
79
+ * - a `"` **no delimiter can account for**: inside an unquoted segment (`modules.co"re`), or in the
80
+ * remainder of a quoted one (`stacks."say "hi""`). A quoted segment may not contain `"` and there
81
+ * is **no escape sequence** — `dl-083` accepted that cost deliberately rather than overlooking it —
82
+ * so the name being reached for has no spelling at all. The refusal says the **name** is
83
+ * unaddressable, not that the path is malformed, because the path is the only spelling an
84
+ * impossible request has. A quoted segment that merely fails to span its segment (`"Node.js"x`)
85
+ * carries no such `"` and is malformed instead: that is what keeps the unaddressable message true
86
+ * every time it is printed.
87
+ *
88
+ * All three are usage errors (exit 2, `spec-005-cli-command-contract` §1) — properties of how the
89
+ * argument is spelled, decided before anything is read. This is a pure function with no side effects,
90
+ * so the caller owns turning a refusal into that exit code.
91
+ */
92
+ function splitDnaPath(keyPath) {
93
+ const malformed = { ok: false, message: `invalid key path: '${keyPath}'` };
94
+ const segments = [];
95
+ let index = 0;
96
+ for (;;) {
97
+ let segment;
98
+ /** Index of the `.` that ended this segment, or `-1` when the segment ran to the end of the path. */
99
+ let dot;
100
+ if (keyPath[index] === QUOTE) {
101
+ const close = keyPath.indexOf(QUOTE, index + 1);
102
+ if (close < 0) {
103
+ return {
104
+ ok: false,
105
+ message: `invalid key path: '${keyPath}': unterminated quote — a segment that opens with ${QUOTE} must close with ${QUOTE}`,
106
+ };
107
+ }
108
+ dot = keyPath.indexOf('.', close + 1);
109
+ const trailer = dot < 0 ? keyPath.slice(close + 1) : keyPath.slice(close + 1, dot);
110
+ if (trailer.length > 0)
111
+ return trailer.includes(QUOTE) ? unaddressable(keyPath) : malformed;
112
+ segment = keyPath.slice(index + 1, close);
113
+ }
114
+ else {
115
+ dot = keyPath.indexOf('.', index);
116
+ segment = dot < 0 ? keyPath.slice(index) : keyPath.slice(index, dot);
117
+ if (segment.includes(QUOTE))
118
+ return unaddressable(keyPath);
119
+ }
120
+ if (segment.length === 0)
121
+ return malformed;
122
+ segments.push(segment);
123
+ // A `.` always opens another segment — `team.` owes one, and it is the empty one refused above.
124
+ if (dot < 0)
125
+ return { ok: true, segments };
126
+ index = dot + 1;
127
+ }
128
+ }
129
+ /** The refusal for a `"` that cannot be a delimiter: the NAME has no spelling, not the path. */
130
+ function unaddressable(keyPath) {
131
+ return {
132
+ ok: false,
133
+ message: `unaddressable entry name in key path '${keyPath}': a segment may not contain ${QUOTE} and there is ` +
134
+ `no escape sequence, so an entry whose name contains ${QUOTE} cannot be addressed`,
135
+ };
136
+ }
137
+ /**
138
+ * The path spelling of one segment: quoted when its name contains a `.`, bare otherwise. Used wherever
139
+ * a refusal echoes part of a path, so the reported prefix can be pasted back into a command — without
140
+ * it `stacks.technologies.Node.js` would be reported for the entry named `Node.js`, and that re-splits
141
+ * into four segments and names a different node.
142
+ *
143
+ * **It is the inverse of {@link splitDnaPath} on the segments `splitDnaPath` produces — not on every
144
+ * string**, and the difference is worth stating precisely rather than calling it "the inverse".
145
+ * Brute-forced over the alphabet `{a, ., "}` up to five characters (363 names): 62 round-trip
146
+ * unchanged, 294 produce a path `splitDnaPath` refuses, and **7 produce a path that parses back to a
147
+ * different name** — `"a"` contains no `.`, so it is returned bare and re-parses as `a`; `a"."a`
148
+ * becomes `"a"."a"`, which is two segments.
149
+ *
150
+ * All 7 have a `"` in the name, and that is why the gap is unreachable at the one call site
151
+ * (`prefixOf`, `./path.ts`), structurally rather than by luck: `prefixOf` is fed
152
+ * `DnaPathTarget.segments`, which comes from `splitDnaPath`, and a segment it returns can never
153
+ * contain a `"` — a bare segment containing one is refused as unaddressable, and a quoted segment
154
+ * ends at the *first* `"`. Measured over the same 363: **0** parse to a segment containing a quote.
155
+ * So the hardening a general inverse would need is unreachable code, and is deliberately not written;
156
+ * what is written instead is this note and the `"`-free precondition it rests on.
157
+ */
158
+ function quoteDnaSegment(name) {
159
+ return name.includes('.') ? `${QUOTE}${name}${QUOTE}` : name;
160
+ }
161
+ /**
162
+ * Whether `keyPath` is a well-formed dotted path — {@link splitDnaPath} reduced to a boolean, so the
163
+ * predicate and the parser cannot disagree about what "well-formed" means. A malformed path (the
164
+ * BDD's `..language`, an empty segment, an unterminated or unaccountable quote) is a usage error
165
+ * (exit 2, spec-005-cli-command-contract §1) the caller rejects before any write; a caller that
166
+ * reports a message uses `splitDnaPath` directly, because only it knows *which* of the three it was.
167
+ */
168
+ function isValidKeyPath(keyPath) {
169
+ return splitDnaPath(keyPath).ok;
170
+ }
171
+ /**
172
+ * A block-mapping key line: leading spaces, a plain scalar key, `:`, then end-of-line or a space.
173
+ * Deliberately narrow — quoted, complex or flow keys simply do not match, which can only make the
174
+ * scanner *miss* a key (falling back to the whole-file dump), never mis-target one.
175
+ */
176
+ const KEY_LINE = /^( *)([A-Za-z0-9_][A-Za-z0-9_.+-]*):(?=$| )(.*)$/;
177
+ /** Leading-space count of a line (its block-mapping indentation level). */
178
+ function indentOf(line) {
179
+ return line.length - line.trimStart().length;
180
+ }
181
+ /**
182
+ * Index within `rest` of the `#` that starts an inline comment, or `-1`. Quote-aware, so a `#`
183
+ * inside a `'single'`- or `"double"`-quoted scalar is not mistaken for a comment; per the YAML spec
184
+ * a comment must also be preceded by whitespace (or start the field).
185
+ *
186
+ * Exported for `./edit.ts`, the sequence-aware editor added by task-093: both write paths must agree
187
+ * on where a line's value ends and its comment begins, and two copies of this scanner would be two
188
+ * chances to disagree.
189
+ */
190
+ function inlineCommentIndex(rest) {
191
+ let quote;
192
+ for (let i = 0; i < rest.length; i += 1) {
193
+ const char = rest[i];
194
+ if (quote !== undefined) {
195
+ if (char === quote) {
196
+ if (quote === "'" && rest[i + 1] === "'")
197
+ i += 1;
198
+ else
199
+ quote = undefined;
200
+ }
201
+ else if (quote === '"' && char === '\\')
202
+ i += 1;
203
+ continue;
204
+ }
205
+ if (char === "'" || char === '"')
206
+ quote = char;
207
+ else if (char === '#' && (i === 0 || rest[i - 1] === ' ' || rest[i - 1] === '\t'))
208
+ return i;
209
+ }
210
+ return -1;
211
+ }
212
+ /** The value part of a key line's `rest`, with any inline comment and surrounding spaces removed. */
213
+ function valueOf(rest) {
214
+ const commentIndex = inlineCommentIndex(rest);
215
+ return (commentIndex < 0 ? rest : rest.slice(0, commentIndex)).trim();
216
+ }
217
+ /**
218
+ * Whether the value on line `line` continues past it — a nested block, a same-indent sequence, or a
219
+ * multi-line scalar. Such a line cannot be rewritten on its own without orphaning what follows, so
220
+ * the editor refuses (the caller falls back to the whole-file dump).
221
+ */
222
+ function hasContinuation(lines, line, indent) {
223
+ for (let i = line + 1; i < lines.length; i += 1) {
224
+ const candidate = lines[i];
225
+ if (candidate.trim() === '')
226
+ continue;
227
+ const candidateIndent = indentOf(candidate);
228
+ if (candidateIndent > indent)
229
+ return true;
230
+ return candidateIndent === indent && candidate.trimStart().startsWith('-');
231
+ }
232
+ return false;
233
+ }
234
+ /**
235
+ * Walk the document's block mappings top-down, tracking the current key path by indentation, and
236
+ * report where `segments` lands. Sequence branches are skipped wholesale (a dotted DNA key path only
237
+ * ever names mapping keys), as is block-scalar content, so neither can produce a false match.
238
+ */
239
+ function resolveKeyPath(lines, segments) {
240
+ const stack = [];
241
+ /** While set, every line indented at least this far is skipped (sequence / block-scalar content). */
242
+ let skipFrom;
243
+ let parent;
244
+ let depth = 0;
245
+ for (let i = 0; i < lines.length; i += 1) {
246
+ const line = lines[i];
247
+ if (line.trim() === '')
248
+ continue; // blank lines belong to whatever region is open; never close one
249
+ const indent = indentOf(line);
250
+ if (skipFrom !== undefined) {
251
+ if (indent >= skipFrom)
252
+ continue;
253
+ skipFrom = undefined;
254
+ }
255
+ const content = line.trimStart();
256
+ if (content.startsWith('#'))
257
+ continue;
258
+ if (content.startsWith('-')) {
259
+ skipFrom = indent; // a sequence item: skip this whole branch, items and their children alike
260
+ continue;
261
+ }
262
+ const match = KEY_LINE.exec(line);
263
+ if (match === null)
264
+ continue;
265
+ const key = match[2];
266
+ const rest = match[3];
267
+ while (stack.length > 0 && stack[stack.length - 1].indent >= indent)
268
+ stack.pop();
269
+ const path = [...stack.map((frame) => frame.key), key];
270
+ if (path.length <= segments.length && path.every((name, index) => name === segments[index])) {
271
+ if (path.length === segments.length) {
272
+ return { leaf: { line: i, indent, key, rest }, depth: segments.length };
273
+ }
274
+ parent = { line: i, indent, key, rest };
275
+ depth = path.length;
276
+ }
277
+ stack.push({ key, indent });
278
+ const value = valueOf(rest);
279
+ if (value.startsWith('|') || value.startsWith('>'))
280
+ skipFrom = indent + 1; // block scalar content
281
+ }
282
+ return { parent, depth };
283
+ }
284
+ /**
285
+ * Rewrite `leaf`'s value to `scalar`, keeping its indentation, its key, and any inline comment —
286
+ * realigned to the column it already occupied whenever the new value still leaves room for it, so a
287
+ * hand-aligned annotation block stays aligned. Returns `undefined` when the value spills past this
288
+ * one line (block scalar, nested block, hanging sequence): no single-line edit exists then.
289
+ */
290
+ function replaceLeafValue(lines, leaf, scalar) {
291
+ const value = valueOf(leaf.rest);
292
+ if (value.startsWith('|') || value.startsWith('>'))
293
+ return undefined;
294
+ if (hasContinuation(lines, leaf.line, leaf.indent))
295
+ return undefined;
296
+ const head = `${' '.repeat(leaf.indent)}${leaf.key}: ${scalar}`;
297
+ const commentIndex = inlineCommentIndex(leaf.rest);
298
+ if (commentIndex < 0) {
299
+ lines[leaf.line] = head;
300
+ return lines;
301
+ }
302
+ const column = leaf.indent + leaf.key.length + 1 + commentIndex;
303
+ const gap = column > head.length ? ' '.repeat(column - head.length) : ' ';
304
+ lines[leaf.line] = head + gap + leaf.rest.slice(commentIndex);
305
+ return lines;
306
+ }
307
+ /**
308
+ * Append `remaining` (the still-missing tail of the key path) to the end of `parent`'s block — or to
309
+ * the end of the document when `parent` is absent, i.e. the whole path is new. The new key lands
310
+ * after the block's last content line and *before* any trailing comment lines, so a comment that
311
+ * introduces the next section keeps introducing it. Returns `undefined` when the parent cannot hold
312
+ * a mapping key (it already holds an inline scalar, or its block is a sequence).
313
+ */
314
+ function insertKeyPath(lines, parent, remaining, scalar) {
315
+ if (parent !== undefined && valueOf(parent.rest) !== '')
316
+ return undefined;
317
+ const containerLine = parent?.line ?? -1;
318
+ const containerIndent = parent?.indent ?? -1;
319
+ let blockEnd = containerLine;
320
+ let childIndent;
321
+ for (let i = containerLine + 1; i < lines.length; i += 1) {
322
+ const line = lines[i];
323
+ if (line.trim() === '')
324
+ continue;
325
+ const indent = indentOf(line);
326
+ if (indent <= containerIndent)
327
+ break;
328
+ if (line.trimStart().startsWith('#'))
329
+ continue;
330
+ if (childIndent === undefined) {
331
+ if (line.trimStart().startsWith('-'))
332
+ return undefined; // the block is a sequence, not a mapping
333
+ childIndent = indent;
334
+ }
335
+ blockEnd = i;
336
+ }
337
+ const baseIndent = childIndent ?? (parent === undefined ? 0 : parent.indent + 2);
338
+ const inserted = remaining.map((segment, index) => {
339
+ const indent = ' '.repeat(baseIndent + index * 2);
340
+ return index === remaining.length - 1 ? `${indent}${segment}: ${scalar}` : `${indent}${segment}:`;
341
+ });
342
+ lines.splice(blockEnd + 1, 0, ...inserted);
343
+ return lines;
344
+ }
345
+ /**
346
+ * Render `value` as the YAML scalar token `js-yaml`'s own `dump()` would emit for it, so an in-place
347
+ * edit writes byte-identical bytes to a whole-file re-serialization at that position. This is what
348
+ * keeps `dna set`'s scalar-coercion contract intact: `dump('2')` is `'2'`, which reads back as the
349
+ * STRING `'2'` (and so still fails `version`'s `z.number()`), whereas a bare `2` would read back as
350
+ * a number. `undefined` when the scalar is itself multi-line (e.g. a `|-` block) — not inlinable.
351
+ */
352
+ function renderScalar(value) {
353
+ const scalar = (0, js_yaml_1.dump)(value, { lineWidth: -1 }).replace(/\n$/, '');
354
+ return scalar.includes('\n') ? undefined : scalar;
355
+ }
356
+ /** Whether `text` parses and the (already alias-resolved) `segments` read back as exactly `scalar`. */
357
+ function readsBackAs(text, segments, scalar) {
358
+ let node;
359
+ let expected;
360
+ try {
361
+ node = (0, js_yaml_1.load)(text);
362
+ expected = (0, js_yaml_1.load)(scalar);
363
+ }
364
+ catch {
365
+ return false;
366
+ }
367
+ for (const segment of segments) {
368
+ if (typeof node !== 'object' || node === null || Array.isArray(node))
369
+ return false;
370
+ if (!Object.prototype.hasOwnProperty.call(node, segment))
371
+ return false;
372
+ node = node[segment];
373
+ }
374
+ return node === expected;
375
+ }
376
+ /**
377
+ * Set the (alias-resolved) dotted `keyPath` to `value` inside the RAW TEXT of a `dna.yaml`, editing
378
+ * as few bytes as possible: one line rewritten, or one line inserted. Everything else — every
379
+ * comment, including the inline `[SPEC]`/`[AUTHORING]` field-provenance annotations, and every blank
380
+ * line, quote style and alignment — is returned byte-for-byte unchanged.
381
+ *
382
+ * This is `dna set`'s primary write path (bug-004): re-serializing the parsed object through
383
+ * `dump()` is correct but discards every comment token, which silently voids the field-provenance
384
+ * convention — a `[SPEC]` field may only be removed or renamed after changing the specification it
385
+ * cites, and that cannot be audited once the annotations are gone. A textual edit also needs no
386
+ * comment-preserving YAML library, keeping `dl-010-minimal-dependencies` intact.
387
+ *
388
+ * Returns `undefined` — deliberately, not as an error — whenever a provably-minimal edit does not
389
+ * exist, leaving the caller to fall back to the whole-file `dump()`:
390
+ * - `text` is not a single, valid YAML document;
391
+ * - the key path is malformed (the caller has already raised the exit-2 usage error for it);
392
+ * - the value's own YAML form is multi-line;
393
+ * - the target, or an ancestor of it, is a block/multi-line scalar, opens a nested block, or holds
394
+ * an inline scalar the path would have to descend through;
395
+ * - the parent block is a sequence rather than a mapping;
396
+ * - the edited text does not read back with the target key holding exactly the intended scalar.
397
+ *
398
+ * The result is a pure function of `(text, keyPath, value)` — no wall-clock, randomness or unordered
399
+ * iteration anywhere on the path (REQ-SYS-07).
400
+ */
401
+ function setDnaValueInText(text, keyPath, value) {
402
+ // task-093/bug-084: the write path does NOT apply `DNA_KEY_ALIASES` — see that constant's own note.
403
+ // task-099: one parser for every path, so a quoted segment means the same here as at the resolver,
404
+ // and a malformed path is the single `ok: false` this function turns into its `undefined` fallback.
405
+ const split = splitDnaPath(keyPath);
406
+ if (!split.ok)
407
+ return undefined;
408
+ const segments = split.segments;
409
+ try {
410
+ (0, js_yaml_1.load)(text); // a single, parseable document: never "repair" input the caller could not read
411
+ }
412
+ catch {
413
+ return undefined;
414
+ }
415
+ const scalar = renderScalar(value);
416
+ if (scalar === undefined)
417
+ return undefined;
418
+ const lines = text.split('\n');
419
+ const resolved = resolveKeyPath(lines, segments);
420
+ const edited = resolved.leaf !== undefined
421
+ ? replaceLeafValue(lines.slice(), resolved.leaf, scalar)
422
+ : insertKeyPath(lines.slice(), resolved.parent, segments.slice(resolved.depth), scalar);
423
+ if (edited === undefined)
424
+ return undefined;
425
+ const result = edited.join('\n');
426
+ return readsBackAs(result, segments, scalar) ? result : undefined;
427
+ }
428
+ //# sourceMappingURL=set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.js","sourceRoot":"","sources":["../../src/dna/set.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /** Options for {@link registerDnaResources}. */
3
+ export interface RegisterDnaResourcesOptions {
4
+ /** Resolves the project root each DNA Resource read is served from (an ambient concern, not a request parameter). */
5
+ readonly resolveRoot: () => string;
6
+ }
7
+ /** spec-004 §2.1 — the whole `dna.yaml` document. */
8
+ export declare const DNA_WHOLE_URI = "wingfoil://dna";
9
+ /** spec-004 §2.1 — one top-level `dna.yaml` section (`team`, `paths`, `modules`, `stacks`, ...). */
10
+ export declare const DNA_SECTION_URI_TEMPLATE = "wingfoil://dna/{section}";
11
+ /**
12
+ * Register both DNA Resources on `server`. Reads `.wingfoil/dna.yaml` fresh on every request (no
13
+ * server-lifetime cache), matching every other Resource this task registers.
14
+ */
15
+ export declare function registerDnaResources(server: McpServer, options: RegisterDnaResourcesOptions): void;
16
+ //# sourceMappingURL=dna-resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dna-resource.d.ts","sourceRoot":"","sources":["../../src/mcp/dna-resource.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,gDAAgD;AAChD,MAAM,WAAW,2BAA2B;IAC1C,qHAAqH;IACrH,QAAQ,CAAC,WAAW,EAAE,MAAM,MAAM,CAAC;CACpC;AAED,qDAAqD;AACrD,eAAO,MAAM,aAAa,mBAAmB,CAAC;AAC9C,oGAAoG;AACpG,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AAEnE;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,2BAA2B,GAAG,IAAI,CA+BlG"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DNA_SECTION_URI_TEMPLATE = exports.DNA_WHOLE_URI = void 0;
4
+ exports.registerDnaResources = registerDnaResources;
5
+ /**
6
+ * `wingfoil://dna` (whole file) and `wingfoil://dna/{section}` (one top-level key) Resources —
7
+ * task-011-mcp-resources-read-only, REQ-INT-01, spec-004-mcp-surface-contract §2.1. Distinct from
8
+ * `registerCoreModules`'s existing, mechanically-derived `wingfoil://dna/show` Resource
9
+ * (task-006-dual-interface-shared-core): that URI is `registerCoreModules`'s generic
10
+ * `wingfoil://{module}/{verb}` transform of the `dnaShow` `CoreOperation` and is left untouched here —
11
+ * this module adds the spec-004 §2.1-conformant addressing alongside it (both can and do coexist on
12
+ * the same server; they are different URIs, never registered twice for one address).
13
+ *
14
+ * `{section}` is any top-level key of the parsed `dna.yaml` document (`version`, `project`, `modules`,
15
+ * `stacks`, `team`, `paths`) — spec-002-dna-yaml-schema's own top-level shape, not a hand-maintained
16
+ * allowlist here, so a future DNA schema field is addressable the moment it exists in `dna.yaml`
17
+ * without a change to this module.
18
+ *
19
+ * Registered directly via `McpServer.registerResource`, not through `registerCoreModules`'s
20
+ * `CoreModule[]` registry — no `dnaSection`/`dnaShowFull` `CoreOperation` exists yet; same
21
+ * spec-006-core-domain-api §4 parity deviation `memory-resource.ts` documents for its own two
22
+ * Resources, for the same reason (task-030-implement-mcp-resources' scope, not this task's).
23
+ */
24
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
25
+ const core_1 = require("../core");
26
+ const read_only_1 = require("./read-only");
27
+ /** spec-004 §2.1 — the whole `dna.yaml` document. */
28
+ exports.DNA_WHOLE_URI = 'wingfoil://dna';
29
+ /** spec-004 §2.1 — one top-level `dna.yaml` section (`team`, `paths`, `modules`, `stacks`, ...). */
30
+ exports.DNA_SECTION_URI_TEMPLATE = 'wingfoil://dna/{section}';
31
+ /**
32
+ * Register both DNA Resources on `server`. Reads `.wingfoil/dna.yaml` fresh on every request (no
33
+ * server-lifetime cache), matching every other Resource this task registers.
34
+ */
35
+ function registerDnaResources(server, options) {
36
+ server.registerResource('dna.read', exports.DNA_WHOLE_URI, { description: 'the whole dna.yaml document (read-only)' }, async (uri, extra) => {
37
+ (0, read_only_1.refuseIfWriteIntent)(extra._meta);
38
+ const root = options.resolveRoot();
39
+ const dna = (0, core_1.loadDnaYaml)(root);
40
+ return (0, read_only_1.jsonResourceResult)(uri, dna);
41
+ });
42
+ const sectionTemplate = new mcp_js_1.ResourceTemplate(exports.DNA_SECTION_URI_TEMPLATE, { list: undefined });
43
+ server.registerResource('dna.section', sectionTemplate, { description: 'one top-level dna.yaml section (read-only)' }, async (uri, variables, extra) => {
44
+ (0, read_only_1.refuseIfWriteIntent)(extra._meta);
45
+ const root = options.resolveRoot();
46
+ const dna = (0, core_1.loadDnaYaml)(root);
47
+ // `variables.section` is typed `string | string[]` (see `memory-resource.ts`'s identical note
48
+ // on `{type}`/`{id}`) — this template's `{section}` has no explode modifier, so it is always a
49
+ // single string in practice.
50
+ const section = variables.section;
51
+ if (!(section in dna))
52
+ throw (0, read_only_1.resourceNotFoundError)(`dna/${section}`);
53
+ return (0, read_only_1.jsonResourceResult)(uri, dna[section]);
54
+ });
55
+ }
56
+ //# sourceMappingURL=dna-resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dna-resource.js","sourceRoot":"","sources":["../../src/mcp/dna-resource.ts"],"names":[],"mappings":";;;AAyCA,oDA+BC;AAxED;;;;;;;;;;;;;;;;;;GAkBG;AACH,oEAA2E;AAG3E,kCAAsC;AAEtC,2CAA6F;AAQ7F,qDAAqD;AACxC,QAAA,aAAa,GAAG,gBAAgB,CAAC;AAC9C,oGAAoG;AACvF,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AAEnE;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,MAAiB,EAAE,OAAoC;IAC1F,MAAM,CAAC,gBAAgB,CACrB,UAAU,EACV,qBAAa,EACb,EAAE,WAAW,EAAE,yCAAyC,EAAE,EAC1D,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,IAAA,+BAAmB,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAA,kBAAW,EAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAA,8BAAkB,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC,CACF,CAAC;IAEF,MAAM,eAAe,GAAG,IAAI,yBAAgB,CAAC,gCAAwB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5F,MAAM,CAAC,gBAAgB,CACrB,aAAa,EACb,eAAe,EACf,EAAE,WAAW,EAAE,4CAA4C,EAAE,EAC7D,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE;QAC9B,IAAA,+BAAmB,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAA,kBAAW,EAAC,IAAI,CAA4B,CAAC;QACzD,8FAA8F;QAC9F,+FAA+F;QAC/F,6BAA6B;QAC7B,MAAM,OAAO,GAAG,SAAS,CAAC,OAAiB,CAAC;QAC5C,IAAI,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC;YAAE,MAAM,IAAA,iCAAqB,EAAC,OAAO,OAAO,EAAE,CAAC,CAAC;QAErE,OAAO,IAAA,8BAAkB,EAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * `mcp-server` module — agent interface (MCP over stdio, Anthropic SDK); Resources, Prompts, Tools.
3
+ * Path is `src/mcp` per `dna.yaml`'s module entry (`name: mcp-server`, `path: src/mcp`).
4
+ *
5
+ * task-006-dual-interface-shared-core adds the thin adapter (spec-006 §2, spec-004): `registerCoreModules`
6
+ * derives every MCP Tool (mutating) and Resource (read-only) from the same `CoreModule[]` registry
7
+ * `src/cli` builds its commands from (`src/core/index.ts`'s `CORE_MODULES`), with no business logic
8
+ * of its own.
9
+ *
10
+ * task-011-mcp-resources-read-only adds the spec-004-mcp-surface-contract §2-conformant Resources
11
+ * channel (REQ-INT-01 / REQ-SEC-05): `registerMemoryResources` (`wingfoil://memory/{type}`,
12
+ * `wingfoil://memory/{type}/{id}` — REPLACING task-009-mcp-resource-fetch-latency's placeholder
13
+ * `wingfoil://memory/{id}` adapter), `registerDnaResources` (`wingfoil://dna`, `wingfoil://dna/{section}`),
14
+ * `registerWorkflowResources` (`wingfoil://workflows`, `wingfoil://workflows/{name}`), and
15
+ * `registerWriteRefusalHandler` (the structural `resources/write` refusal, spec-004 §2.3).
16
+ * `registerReadOnlyResources` wires all four together — the one call a future production entry point
17
+ * (`task-030-implement-mcp-resources`'s `StdioServerTransport`/`wingfoil mcp` command, out of this
18
+ * task's scope) needs alongside `registerCoreModules`. See `./read-only.ts` for the shared
19
+ * write-refusal/not-found conventions every one of these Resources follows.
20
+ */
21
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
22
+ /** This module's `dna.yaml` name (`mcp-server`) — the stable identifier surfaces and tests key it by. */
23
+ export declare const MODULE_NAME: "mcp-server";
24
+ export { registerCoreModules, deriveMcpToolName, deriveMcpResourceUri } from './registrar';
25
+ export type { RegisterCoreModulesOptions } from './registrar';
26
+ export { registerMemoryResources, MEMORY_COLLECTION_URI_TEMPLATE, MEMORY_DOCUMENT_URI_TEMPLATE, } from './memory-resource';
27
+ export type { RegisterMemoryResourcesOptions } from './memory-resource';
28
+ export { registerDnaResources, DNA_WHOLE_URI, DNA_SECTION_URI_TEMPLATE } from './dna-resource';
29
+ export type { RegisterDnaResourcesOptions } from './dna-resource';
30
+ export { registerWorkflowResources, WORKFLOWS_COLLECTION_URI, WORKFLOW_DOCUMENT_URI_TEMPLATE, } from './workflow-resource';
31
+ export type { RegisterWorkflowResourcesOptions } from './workflow-resource';
32
+ export { registerWriteRefusalHandler, refuseIfWriteIntent, resourceNotFoundError, WRITE_REFUSAL_MESSAGE, WRITE_INTENT_META_KEY, } from './read-only';
33
+ export { registerRolePrompts, roleSessionPromptName } from './prompt';
34
+ export type { RegisterRolePromptsOptions } from './prompt';
35
+ /** Options for {@link registerReadOnlyResources}. */
36
+ export interface RegisterReadOnlyResourcesOptions {
37
+ /** Resolves the project root each Resource read is served from (an ambient concern, not a request parameter). */
38
+ readonly resolveRoot: () => string;
39
+ }
40
+ /**
41
+ * Wire the full spec-004 §2 read-only Resources channel onto `server` in one call: the Memory, DNA,
42
+ * and Workflow Resources plus the structural `resources/write` refusal. Deliberately does not touch
43
+ * `registerCoreModules`/`CORE_MODULES` — a caller building a real server still calls that separately
44
+ * for the (today, zero) Tools/legacy-shaped Resources it derives from `src/core`.
45
+ */
46
+ export declare function registerReadOnlyResources(server: McpServer, options: RegisterReadOnlyResourcesOptions): void;
47
+ export { createMcpServer, startMcpServer } from './server';
48
+ export type { McpServerOptions } from './server';
49
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,yGAAyG;AACzG,eAAO,MAAM,WAAW,EAAG,YAAqB,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC3F,YAAY,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EACL,uBAAuB,EACvB,8BAA8B,EAC9B,4BAA4B,GAC7B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AAExE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/F,YAAY,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AAE5E,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAOrB,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACtE,YAAY,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAO3D,qDAAqD;AACrD,MAAM,WAAW,gCAAgC;IAC/C,iHAAiH;IACjH,QAAQ,CAAC,WAAW,EAAE,MAAM,MAAM,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,gCAAgC,GAAG,IAAI,CAK5G;AAMD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}