@kynetic-ai/spec 0.9.0 → 0.10.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 (291) hide show
  1. package/README.md +2 -1
  2. package/dist/acp/client.d.ts +13 -1
  3. package/dist/acp/client.d.ts.map +1 -1
  4. package/dist/acp/client.js +17 -2
  5. package/dist/acp/client.js.map +1 -1
  6. package/dist/acp/framing.d.ts +12 -1
  7. package/dist/acp/framing.d.ts.map +1 -1
  8. package/dist/acp/framing.js +27 -4
  9. package/dist/acp/framing.js.map +1 -1
  10. package/dist/agent-runtime/dispatch.d.ts +261 -0
  11. package/dist/agent-runtime/dispatch.d.ts.map +1 -0
  12. package/dist/agent-runtime/dispatch.js +791 -0
  13. package/dist/agent-runtime/dispatch.js.map +1 -0
  14. package/dist/agent-runtime/index.d.ts +11 -0
  15. package/dist/agent-runtime/index.d.ts.map +1 -0
  16. package/dist/agent-runtime/index.js +11 -0
  17. package/dist/agent-runtime/index.js.map +1 -0
  18. package/dist/agent-runtime/invocation.d.ts +86 -0
  19. package/dist/agent-runtime/invocation.d.ts.map +1 -0
  20. package/dist/agent-runtime/invocation.js +442 -0
  21. package/dist/agent-runtime/invocation.js.map +1 -0
  22. package/dist/agent-runtime/prompts.d.ts +50 -0
  23. package/dist/agent-runtime/prompts.d.ts.map +1 -0
  24. package/dist/agent-runtime/prompts.js +108 -0
  25. package/dist/agent-runtime/prompts.js.map +1 -0
  26. package/dist/agents/spawner.d.ts.map +1 -1
  27. package/dist/agents/spawner.js +60 -4
  28. package/dist/agents/spawner.js.map +1 -1
  29. package/dist/cli/batch-exec.d.ts.map +1 -1
  30. package/dist/cli/batch-exec.js +183 -81
  31. package/dist/cli/batch-exec.js.map +1 -1
  32. package/dist/cli/batch-write-buffer.d.ts +141 -0
  33. package/dist/cli/batch-write-buffer.d.ts.map +1 -0
  34. package/dist/cli/batch-write-buffer.js +400 -0
  35. package/dist/cli/batch-write-buffer.js.map +1 -0
  36. package/dist/cli/commands/agent.d.ts +20 -0
  37. package/dist/cli/commands/agent.d.ts.map +1 -0
  38. package/dist/cli/commands/agent.js +831 -0
  39. package/dist/cli/commands/agent.js.map +1 -0
  40. package/dist/cli/commands/agents.d.ts +1 -1
  41. package/dist/cli/commands/agents.d.ts.map +1 -1
  42. package/dist/cli/commands/agents.js +2 -1
  43. package/dist/cli/commands/agents.js.map +1 -1
  44. package/dist/cli/commands/batch.js +1 -1
  45. package/dist/cli/commands/batch.js.map +1 -1
  46. package/dist/cli/commands/inbox.d.ts.map +1 -1
  47. package/dist/cli/commands/inbox.js +46 -22
  48. package/dist/cli/commands/inbox.js.map +1 -1
  49. package/dist/cli/commands/index.d.ts +1 -0
  50. package/dist/cli/commands/index.d.ts.map +1 -1
  51. package/dist/cli/commands/index.js +1 -0
  52. package/dist/cli/commands/index.js.map +1 -1
  53. package/dist/cli/commands/init.d.ts.map +1 -1
  54. package/dist/cli/commands/init.js +4 -6
  55. package/dist/cli/commands/init.js.map +1 -1
  56. package/dist/cli/commands/item.d.ts.map +1 -1
  57. package/dist/cli/commands/item.js +34 -17
  58. package/dist/cli/commands/item.js.map +1 -1
  59. package/dist/cli/commands/log.js +1 -1
  60. package/dist/cli/commands/log.js.map +1 -1
  61. package/dist/cli/commands/merge-driver.d.ts.map +1 -1
  62. package/dist/cli/commands/merge-driver.js +8 -3
  63. package/dist/cli/commands/merge-driver.js.map +1 -1
  64. package/dist/cli/commands/meta.d.ts.map +1 -1
  65. package/dist/cli/commands/meta.js +159 -6
  66. package/dist/cli/commands/meta.js.map +1 -1
  67. package/dist/cli/commands/module.d.ts.map +1 -1
  68. package/dist/cli/commands/module.js +2 -1
  69. package/dist/cli/commands/module.js.map +1 -1
  70. package/dist/cli/commands/plan-import.js +19 -3
  71. package/dist/cli/commands/plan-import.js.map +1 -1
  72. package/dist/cli/commands/plan.d.ts.map +1 -1
  73. package/dist/cli/commands/plan.js +87 -43
  74. package/dist/cli/commands/plan.js.map +1 -1
  75. package/dist/cli/commands/ralph.d.ts +5 -51
  76. package/dist/cli/commands/ralph.d.ts.map +1 -1
  77. package/dist/cli/commands/ralph.js +52 -1462
  78. package/dist/cli/commands/ralph.js.map +1 -1
  79. package/dist/cli/commands/search.d.ts.map +1 -1
  80. package/dist/cli/commands/search.js +22 -13
  81. package/dist/cli/commands/search.js.map +1 -1
  82. package/dist/cli/commands/serve.d.ts.map +1 -1
  83. package/dist/cli/commands/serve.js +70 -11
  84. package/dist/cli/commands/serve.js.map +1 -1
  85. package/dist/cli/commands/session/checkpoint.d.ts.map +1 -1
  86. package/dist/cli/commands/session/checkpoint.js +7 -2
  87. package/dist/cli/commands/session/checkpoint.js.map +1 -1
  88. package/dist/cli/commands/session/commands.d.ts.map +1 -1
  89. package/dist/cli/commands/session/commands.js +15 -0
  90. package/dist/cli/commands/session/commands.js.map +1 -1
  91. package/dist/cli/commands/session/context.d.ts.map +1 -1
  92. package/dist/cli/commands/session/context.js +10 -5
  93. package/dist/cli/commands/session/context.js.map +1 -1
  94. package/dist/cli/commands/session/log.d.ts +1 -0
  95. package/dist/cli/commands/session/log.d.ts.map +1 -1
  96. package/dist/cli/commands/session/log.js +124 -8
  97. package/dist/cli/commands/session/log.js.map +1 -1
  98. package/dist/cli/commands/session/stale-close.d.ts +17 -0
  99. package/dist/cli/commands/session/stale-close.d.ts.map +1 -0
  100. package/dist/cli/commands/session/stale-close.js +378 -0
  101. package/dist/cli/commands/session/stale-close.js.map +1 -0
  102. package/dist/cli/commands/setup.d.ts +4 -0
  103. package/dist/cli/commands/setup.d.ts.map +1 -1
  104. package/dist/cli/commands/setup.js +150 -6
  105. package/dist/cli/commands/setup.js.map +1 -1
  106. package/dist/cli/commands/skill-crud.d.ts.map +1 -1
  107. package/dist/cli/commands/skill-crud.js +4 -3
  108. package/dist/cli/commands/skill-crud.js.map +1 -1
  109. package/dist/cli/commands/skill-diff.d.ts.map +1 -1
  110. package/dist/cli/commands/skill-diff.js +15 -0
  111. package/dist/cli/commands/skill-diff.js.map +1 -1
  112. package/dist/cli/commands/skill-install.d.ts.map +1 -1
  113. package/dist/cli/commands/skill-install.js +50 -18
  114. package/dist/cli/commands/skill-install.js.map +1 -1
  115. package/dist/cli/commands/task.d.ts.map +1 -1
  116. package/dist/cli/commands/task.js +552 -323
  117. package/dist/cli/commands/task.js.map +1 -1
  118. package/dist/cli/commands/tasks.js +1 -1
  119. package/dist/cli/commands/tasks.js.map +1 -1
  120. package/dist/cli/commands/triage.d.ts.map +1 -1
  121. package/dist/cli/commands/triage.js +37 -13
  122. package/dist/cli/commands/triage.js.map +1 -1
  123. package/dist/cli/commands/validate.d.ts.map +1 -1
  124. package/dist/cli/commands/validate.js +99 -50
  125. package/dist/cli/commands/validate.js.map +1 -1
  126. package/dist/cli/help/content.d.ts.map +1 -1
  127. package/dist/cli/help/content.js +5 -0
  128. package/dist/cli/help/content.js.map +1 -1
  129. package/dist/cli/index.d.ts.map +1 -1
  130. package/dist/cli/index.js +2 -1
  131. package/dist/cli/index.js.map +1 -1
  132. package/dist/cli/output.d.ts.map +1 -1
  133. package/dist/cli/output.js +5 -1
  134. package/dist/cli/output.js.map +1 -1
  135. package/dist/cli/validators.d.ts +4 -0
  136. package/dist/cli/validators.d.ts.map +1 -1
  137. package/dist/cli/validators.js +12 -0
  138. package/dist/cli/validators.js.map +1 -1
  139. package/dist/daemon/project-context.ts +22 -0
  140. package/dist/daemon/routes/agent-dispatch.ts +272 -0
  141. package/dist/daemon/server.ts +55 -20
  142. package/dist/daemon/websocket/handler.ts +67 -6
  143. package/dist/daemon/websocket/lifecycle.ts +19 -0
  144. package/dist/daemon/websocket/pubsub.ts +74 -3
  145. package/dist/export/html.d.ts.map +1 -1
  146. package/dist/export/html.js +5 -2
  147. package/dist/export/html.js.map +1 -1
  148. package/dist/export/triage.d.ts +1 -1
  149. package/dist/export/triage.d.ts.map +1 -1
  150. package/dist/export/triage.js +5 -3
  151. package/dist/export/triage.js.map +1 -1
  152. package/dist/parser/alignment.d.ts.map +1 -1
  153. package/dist/parser/alignment.js +6 -3
  154. package/dist/parser/alignment.js.map +1 -1
  155. package/dist/parser/assess.js +1 -1
  156. package/dist/parser/assess.js.map +1 -1
  157. package/dist/parser/config.d.ts +6 -6
  158. package/dist/parser/meta.d.ts.map +1 -1
  159. package/dist/parser/meta.js +9 -8
  160. package/dist/parser/meta.js.map +1 -1
  161. package/dist/parser/plan-document.d.ts +12 -12
  162. package/dist/parser/plans.d.ts +7 -0
  163. package/dist/parser/plans.d.ts.map +1 -1
  164. package/dist/parser/plans.js +100 -15
  165. package/dist/parser/plans.js.map +1 -1
  166. package/dist/parser/refs.d.ts +5 -0
  167. package/dist/parser/refs.d.ts.map +1 -1
  168. package/dist/parser/refs.js +17 -12
  169. package/dist/parser/refs.js.map +1 -1
  170. package/dist/parser/shadow.d.ts +1 -1
  171. package/dist/parser/shadow.d.ts.map +1 -1
  172. package/dist/parser/shadow.js +241 -76
  173. package/dist/parser/shadow.js.map +1 -1
  174. package/dist/parser/skill-render.d.ts.map +1 -1
  175. package/dist/parser/skill-render.js +6 -3
  176. package/dist/parser/skill-render.js.map +1 -1
  177. package/dist/parser/validate.d.ts.map +1 -1
  178. package/dist/parser/validate.js +70 -108
  179. package/dist/parser/validate.js.map +1 -1
  180. package/dist/parser/yaml.d.ts +24 -5
  181. package/dist/parser/yaml.d.ts.map +1 -1
  182. package/dist/parser/yaml.js +228 -66
  183. package/dist/parser/yaml.js.map +1 -1
  184. package/dist/schema/meta.d.ts +442 -119
  185. package/dist/schema/meta.d.ts.map +1 -1
  186. package/dist/schema/meta.js +55 -0
  187. package/dist/schema/meta.js.map +1 -1
  188. package/dist/schema/plan.d.ts +22 -22
  189. package/dist/schema/spec.d.ts +39 -39
  190. package/dist/schema/task.d.ts +43 -32
  191. package/dist/schema/task.d.ts.map +1 -1
  192. package/dist/schema/task.js +5 -0
  193. package/dist/schema/task.js.map +1 -1
  194. package/dist/sessions/store.d.ts +112 -0
  195. package/dist/sessions/store.d.ts.map +1 -1
  196. package/dist/sessions/store.js +414 -22
  197. package/dist/sessions/store.js.map +1 -1
  198. package/dist/sessions/types.d.ts +75 -17
  199. package/dist/sessions/types.d.ts.map +1 -1
  200. package/dist/sessions/types.js +51 -1
  201. package/dist/sessions/types.js.map +1 -1
  202. package/dist/triage/actions.d.ts +1 -0
  203. package/dist/triage/actions.d.ts.map +1 -1
  204. package/dist/triage/actions.js +34 -7
  205. package/dist/triage/actions.js.map +1 -1
  206. package/dist/utils/commit.js +1 -1
  207. package/dist/utils/commit.js.map +1 -1
  208. package/dist/web-ui/_app/env.js +1 -0
  209. package/dist/web-ui/_app/immutable/assets/0.BxCxvrZR.css +1 -0
  210. package/dist/web-ui/_app/immutable/assets/select-trigger.CV-KWLNP.css +1 -0
  211. package/dist/web-ui/_app/immutable/chunks/B-CZR0q8.js +1 -0
  212. package/dist/web-ui/_app/immutable/chunks/B1IR5Su5.js +1 -0
  213. package/dist/web-ui/_app/immutable/chunks/BCkp8Hs8.js +1 -0
  214. package/dist/web-ui/_app/immutable/chunks/B_Cvvtc4.js +1 -0
  215. package/dist/web-ui/_app/immutable/chunks/BtFaGGII.js +1 -0
  216. package/dist/web-ui/_app/immutable/chunks/Bu8JVsCH.js +1 -0
  217. package/dist/web-ui/_app/immutable/chunks/C87u-CNA.js +1 -0
  218. package/dist/web-ui/_app/immutable/chunks/CrFkBTYp.js +1 -0
  219. package/dist/web-ui/_app/immutable/chunks/D1ArdqNb.js +1 -0
  220. package/dist/web-ui/_app/immutable/chunks/D28BF5MJ.js +1 -0
  221. package/dist/web-ui/_app/immutable/chunks/D6RtLpzL.js +1 -0
  222. package/dist/web-ui/_app/immutable/chunks/D7FHSgx2.js +1 -0
  223. package/dist/web-ui/_app/immutable/chunks/DBXrsxZQ.js +2 -0
  224. package/dist/web-ui/_app/immutable/chunks/Da_hHMuA.js +1 -0
  225. package/dist/web-ui/_app/immutable/chunks/Do6LchSF.js +1 -0
  226. package/dist/web-ui/_app/immutable/chunks/DoNPtcAw.js +1 -0
  227. package/dist/web-ui/_app/immutable/chunks/DtUbXRZz.js +1 -0
  228. package/dist/web-ui/_app/immutable/chunks/DyFPRlLl.js +1 -0
  229. package/dist/web-ui/_app/immutable/chunks/DzAP8lRM.js +1 -0
  230. package/dist/web-ui/_app/immutable/chunks/DzVXElzN.js +2 -0
  231. package/dist/web-ui/_app/immutable/chunks/aoPBFken.js +1 -0
  232. package/dist/web-ui/_app/immutable/chunks/i-XnOIX0.js +1 -0
  233. package/dist/web-ui/_app/immutable/chunks/laxtrUO3.js +1 -0
  234. package/dist/web-ui/_app/immutable/chunks/q1nIWgqB.js +1 -0
  235. package/dist/web-ui/_app/immutable/chunks/sTLbk5Nm.js +1 -0
  236. package/dist/web-ui/_app/immutable/chunks/vwKgQu5P.js +5 -0
  237. package/dist/web-ui/_app/immutable/entry/app.BCwMcqnT.js +2 -0
  238. package/dist/web-ui/_app/immutable/entry/start.wKCQH-tt.js +1 -0
  239. package/dist/web-ui/_app/immutable/nodes/0.CjGVMG74.js +1 -0
  240. package/dist/web-ui/_app/immutable/nodes/1.B6_AIPan.js +1 -0
  241. package/dist/web-ui/_app/immutable/nodes/2.q4oCS7Ws.js +1 -0
  242. package/dist/web-ui/_app/immutable/nodes/3.rTKZf9o2.js +1 -0
  243. package/dist/web-ui/_app/immutable/nodes/4.DVIDRu1d.js +1 -0
  244. package/dist/web-ui/_app/immutable/nodes/5.8PtPXIOd.js +1 -0
  245. package/dist/web-ui/_app/immutable/nodes/6.ZZrTemy_.js +1 -0
  246. package/dist/web-ui/_app/immutable/nodes/7.IP-gxCxi.js +1 -0
  247. package/dist/web-ui/_app/version.json +1 -0
  248. package/dist/web-ui/index.html +36 -0
  249. package/dist/web-ui/robots.txt +3 -0
  250. package/package.json +3 -2
  251. package/plugin/.claude-plugin/marketplace.json +1 -1
  252. package/plugin/.claude-plugin/plugin.json +1 -1
  253. package/plugin/plugins/kspec/skills/create-workflow/SKILL.md +1 -1
  254. package/plugin/plugins/kspec/skills/{observations → observe}/SKILL.md +1 -1
  255. package/plugin/plugins/kspec/skills/plan/SKILL.md +1 -1
  256. package/plugin/plugins/kspec/skills/task-work/SKILL.md +26 -3
  257. package/plugin/plugins/kspec/skills/triage-inbox/SKILL.md +1 -1
  258. package/plugin/plugins/kspec/skills/writing-specs/SKILL.md +1 -1
  259. package/templates/agents-sections/01-quick-start.md +1 -0
  260. package/templates/agents-sections/06-ralph-loop.md +64 -11
  261. package/templates/skills/create-workflow/SKILL.md +1 -1
  262. package/templates/skills/manifest.yaml +1 -1
  263. package/templates/skills/plan/SKILL.md +1 -1
  264. package/templates/skills/task-work/SKILL.md +26 -3
  265. package/templates/skills/triage-inbox/SKILL.md +1 -1
  266. package/templates/skills/writing-specs/SKILL.md +1 -1
  267. package/dist/ralph/cli-renderer.d.ts +0 -27
  268. package/dist/ralph/cli-renderer.d.ts.map +0 -1
  269. package/dist/ralph/cli-renderer.js +0 -250
  270. package/dist/ralph/cli-renderer.js.map +0 -1
  271. package/dist/ralph/events.d.ts +0 -65
  272. package/dist/ralph/events.d.ts.map +0 -1
  273. package/dist/ralph/events.js +0 -600
  274. package/dist/ralph/events.js.map +0 -1
  275. package/dist/ralph/index.d.ts +0 -11
  276. package/dist/ralph/index.d.ts.map +0 -1
  277. package/dist/ralph/index.js +0 -16
  278. package/dist/ralph/index.js.map +0 -1
  279. package/dist/ralph/loop-errors.d.ts +0 -83
  280. package/dist/ralph/loop-errors.d.ts.map +0 -1
  281. package/dist/ralph/loop-errors.js +0 -150
  282. package/dist/ralph/loop-errors.js.map +0 -1
  283. package/dist/ralph/subagent.d.ts +0 -96
  284. package/dist/ralph/subagent.d.ts.map +0 -1
  285. package/dist/ralph/subagent.js +0 -195
  286. package/dist/ralph/subagent.js.map +0 -1
  287. package/dist/ralph/wrap-up.d.ts +0 -127
  288. package/dist/ralph/wrap-up.d.ts.map +0 -1
  289. package/dist/ralph/wrap-up.js +0 -271
  290. package/dist/ralph/wrap-up.js.map +0 -1
  291. /package/templates/skills/{observations → observe}/SKILL.md +0 -0
@@ -0,0 +1,141 @@
1
+ /**
2
+ * In-memory write buffer for atomic batch execution.
3
+ *
4
+ * Replaces the fs.cp(realSpecDir, tempDir) approach in batch-exec.ts.
5
+ * During batch execution, all writes to the spec directory are intercepted
6
+ * and stored in memory. On success (flush), buffered writes are committed
7
+ * to disk. On failure (discard), the buffer is dropped — real .kspec/ is
8
+ * never touched.
9
+ *
10
+ * AC: @batch-write-buffer ac-1 — writes go to buffer, not disk
11
+ * AC: @batch-write-buffer ac-2 — reads check buffer first (read-after-write)
12
+ * AC: @batch-write-buffer ac-3 — only written files flushed on commit
13
+ * AC: @batch-write-buffer ac-4 — rollback discards buffer, no disk writes
14
+ * AC: @batch-write-buffer ac-5 — sessions/ never copied (buffer is per-file)
15
+ * AC: @batch-write-buffer ac-6 — buffer is process-local, disk unchanged until flush
16
+ * AC: @batch-write-buffer ac-7 — flush failure reported, .kspec/ left in pre-batch state
17
+ */
18
+ import type { Dirent } from "node:fs";
19
+ type BufferedFileContent = string | Uint8Array;
20
+ export declare class SyntheticDirent {
21
+ name: string;
22
+ readonly parentPath = "";
23
+ readonly path = "";
24
+ private readonly _isFile;
25
+ constructor(name: string, isFile: boolean);
26
+ isFile(): boolean;
27
+ isDirectory(): boolean;
28
+ isBlockDevice(): boolean;
29
+ isCharacterDevice(): boolean;
30
+ isSymbolicLink(): boolean;
31
+ isFIFO(): boolean;
32
+ isSocket(): boolean;
33
+ }
34
+ /**
35
+ * In-memory write buffer for a single batch execution.
36
+ *
37
+ * Maps absolute file paths to their buffered string content.
38
+ * A null value indicates the file should be deleted on flush.
39
+ */
40
+ export declare class WriteBuffer {
41
+ /** specDir this buffer is scoped to */
42
+ readonly specDir: string;
43
+ /** buffered writes: path → content (null = deleted) */
44
+ private readonly entries;
45
+ constructor(specDir: string);
46
+ /**
47
+ * Check if a file path falls within this buffer's specDir scope.
48
+ */
49
+ isInScope(filePath: string): boolean;
50
+ /**
51
+ * Write a file to the buffer.
52
+ * AC: @batch-write-buffer ac-1
53
+ */
54
+ write(filePath: string, content: BufferedFileContent): void;
55
+ /**
56
+ * Mark a file as deleted in the buffer.
57
+ */
58
+ delete(filePath: string): void;
59
+ /**
60
+ * Check if a file path has a buffered entry (write or delete).
61
+ */
62
+ has(filePath: string): boolean;
63
+ /**
64
+ * Check if a file has been buffered as a write (not deleted).
65
+ */
66
+ hasWrite(filePath: string): boolean;
67
+ /**
68
+ * Read a buffered file. Returns the buffered content if present,
69
+ * or undefined if not in buffer (caller should fall back to disk).
70
+ * AC: @batch-write-buffer ac-2
71
+ */
72
+ read(filePath: string): BufferedFileContent | null | undefined;
73
+ /**
74
+ * True when filePath or any ancestor directory has been deleted in the overlay.
75
+ */
76
+ isDeletedInOverlay(filePath: string): boolean;
77
+ /**
78
+ * Get all buffered paths (for tests and diagnostics).
79
+ */
80
+ getPaths(): string[];
81
+ /**
82
+ * Get number of buffered entries.
83
+ */
84
+ get size(): number;
85
+ private _buildDirectoryOverlay;
86
+ /**
87
+ * List a directory with buffered entries overlaid on disk entries.
88
+ * Used to keep batch read-after-write semantics for readdir callers.
89
+ */
90
+ listDir(directory: string, options?: {
91
+ withFileTypes?: boolean;
92
+ }): Promise<string[] | Dirent[]>;
93
+ /**
94
+ * Flush all buffered writes to disk.
95
+ *
96
+ * Strategy for ac-7 (flush failure atomicity):
97
+ * 1. Write all buffered content to staging files (.kspec-batch-staging suffix)
98
+ * 2. If any staging write fails: delete all staging files, throw — nothing committed
99
+ * 3. Rename all staging files to final paths
100
+ * 4. If any rename fails: report error with committed/uncommitted file list
101
+ *
102
+ * Phase 1 is fully atomic: a staging write failure means no files reach disk.
103
+ * Phase 2 is best-effort: rename failures are reported with a detailed error, but
104
+ * files already renamed in Phase 2 before the failure are committed. On healthy
105
+ * filesystems, Phase 2 rename failures are extremely rare (same-device, same-dir
106
+ * renames are near-atomic). Partial Phase 2 failure is always an explicit error,
107
+ * never a silent commit.
108
+ *
109
+ * AC: @batch-write-buffer ac-3 — only buffered files are written
110
+ * AC: @batch-write-buffer ac-7 — flush failure reported; .kspec/ not silently corrupted
111
+ */
112
+ flush(): Promise<void>;
113
+ /**
114
+ * Discard the buffer without writing anything to disk.
115
+ * AC: @batch-write-buffer ac-4
116
+ */
117
+ discard(): void;
118
+ private _cleanupStaging;
119
+ }
120
+ /**
121
+ * Activate an in-memory write buffer for the given specDir.
122
+ * All subsequent writes to paths under specDir will go to the buffer.
123
+ * AC: @batch-write-buffer ac-1
124
+ */
125
+ export declare function activateBatchBuffer(specDir: string): WriteBuffer;
126
+ /**
127
+ * Deactivate the active buffer (after flush or discard).
128
+ */
129
+ export declare function deactivateBatchBuffer(): void;
130
+ /**
131
+ * Get the currently active write buffer, or null if not in batch mode.
132
+ */
133
+ export declare function getActiveBatchBuffer(): WriteBuffer | null;
134
+ export declare function readdirBufferAware(directory: string, options?: {
135
+ withFileTypes?: boolean;
136
+ }): Promise<string[] | Dirent[]>;
137
+ export declare function accessBufferAware(filePath: string, mode?: number): Promise<void>;
138
+ export declare function writeFileBufferAware(filePath: string, content: BufferedFileContent): Promise<void>;
139
+ export declare function mkdirBufferAware(directoryPath: string): Promise<void>;
140
+ export {};
141
+ //# sourceMappingURL=batch-write-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-write-buffer.d.ts","sourceRoot":"","sources":["../../src/cli/batch-write-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAItC,KAAK,mBAAmB,GAAG,MAAM,GAAG,UAAU,CAAC;AAkB/C,qBAAa,eAAe;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,UAAU,MAAM;IACzB,QAAQ,CAAC,IAAI,MAAM;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAEtB,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAKzC,MAAM,IAAI,OAAO;IAIjB,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,OAAO;IAIxB,iBAAiB,IAAI,OAAO;IAI5B,cAAc,IAAI,OAAO;IAIzB,MAAM,IAAI,OAAO;IAIjB,QAAQ,IAAI,OAAO;CAGpB;AAED;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiD;gBAE7D,OAAO,EAAE,MAAM;IAI3B;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKpC;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAI3D;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI9B;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI9B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKnC;;;;OAIG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,GAAG,SAAS;IAM9D;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAqB7C;;OAEG;IACH,QAAQ,IAAI,MAAM,EAAE;IAIpB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,OAAO,CAAC,sBAAsB;IAgC9B;;;OAGG;IACG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GACpC,OAAO,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IA+D/B;;;;;;;;;;;;;;;;;;OAkBG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2D5B;;;OAGG;IACH,OAAO,IAAI,IAAI;YAID,eAAe;CAO9B;AAMD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAGhE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,WAAW,GAAG,IAAI,CAEzD;AAED,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GACpC,OAAO,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAU9B;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3E"}
@@ -0,0 +1,400 @@
1
+ /**
2
+ * In-memory write buffer for atomic batch execution.
3
+ *
4
+ * Replaces the fs.cp(realSpecDir, tempDir) approach in batch-exec.ts.
5
+ * During batch execution, all writes to the spec directory are intercepted
6
+ * and stored in memory. On success (flush), buffered writes are committed
7
+ * to disk. On failure (discard), the buffer is dropped — real .kspec/ is
8
+ * never touched.
9
+ *
10
+ * AC: @batch-write-buffer ac-1 — writes go to buffer, not disk
11
+ * AC: @batch-write-buffer ac-2 — reads check buffer first (read-after-write)
12
+ * AC: @batch-write-buffer ac-3 — only written files flushed on commit
13
+ * AC: @batch-write-buffer ac-4 — rollback discards buffer, no disk writes
14
+ * AC: @batch-write-buffer ac-5 — sessions/ never copied (buffer is per-file)
15
+ * AC: @batch-write-buffer ac-6 — buffer is process-local, disk unchanged until flush
16
+ * AC: @batch-write-buffer ac-7 — flush failure reported, .kspec/ left in pre-batch state
17
+ */
18
+ import * as fs from "node:fs/promises";
19
+ import * as path from "node:path";
20
+ function isNotFoundError(err) {
21
+ return err instanceof Error && "code" in err && err.code === "ENOENT";
22
+ }
23
+ function createNotFoundError(filePath) {
24
+ return Object.assign(new Error(`ENOENT: no such file or directory, open '${filePath}'`), { code: "ENOENT" });
25
+ }
26
+ export class SyntheticDirent {
27
+ name;
28
+ parentPath = "";
29
+ path = "";
30
+ _isFile;
31
+ constructor(name, isFile) {
32
+ this.name = name;
33
+ this._isFile = isFile;
34
+ }
35
+ isFile() {
36
+ return this._isFile;
37
+ }
38
+ isDirectory() {
39
+ return !this._isFile;
40
+ }
41
+ isBlockDevice() {
42
+ return false;
43
+ }
44
+ isCharacterDevice() {
45
+ return false;
46
+ }
47
+ isSymbolicLink() {
48
+ return false;
49
+ }
50
+ isFIFO() {
51
+ return false;
52
+ }
53
+ isSocket() {
54
+ return false;
55
+ }
56
+ }
57
+ /**
58
+ * In-memory write buffer for a single batch execution.
59
+ *
60
+ * Maps absolute file paths to their buffered string content.
61
+ * A null value indicates the file should be deleted on flush.
62
+ */
63
+ export class WriteBuffer {
64
+ /** specDir this buffer is scoped to */
65
+ specDir;
66
+ /** buffered writes: path → content (null = deleted) */
67
+ entries = new Map();
68
+ constructor(specDir) {
69
+ this.specDir = path.resolve(specDir);
70
+ }
71
+ /**
72
+ * Check if a file path falls within this buffer's specDir scope.
73
+ */
74
+ isInScope(filePath) {
75
+ const resolved = path.resolve(filePath);
76
+ return resolved === this.specDir || resolved.startsWith(this.specDir + path.sep);
77
+ }
78
+ /**
79
+ * Write a file to the buffer.
80
+ * AC: @batch-write-buffer ac-1
81
+ */
82
+ write(filePath, content) {
83
+ this.entries.set(path.resolve(filePath), content);
84
+ }
85
+ /**
86
+ * Mark a file as deleted in the buffer.
87
+ */
88
+ delete(filePath) {
89
+ this.entries.set(path.resolve(filePath), null);
90
+ }
91
+ /**
92
+ * Check if a file path has a buffered entry (write or delete).
93
+ */
94
+ has(filePath) {
95
+ return this.entries.has(path.resolve(filePath));
96
+ }
97
+ /**
98
+ * Check if a file has been buffered as a write (not deleted).
99
+ */
100
+ hasWrite(filePath) {
101
+ const resolved = path.resolve(filePath);
102
+ return this.entries.has(resolved) && this.entries.get(resolved) !== null;
103
+ }
104
+ /**
105
+ * Read a buffered file. Returns the buffered content if present,
106
+ * or undefined if not in buffer (caller should fall back to disk).
107
+ * AC: @batch-write-buffer ac-2
108
+ */
109
+ read(filePath) {
110
+ const resolved = path.resolve(filePath);
111
+ if (!this.entries.has(resolved))
112
+ return undefined;
113
+ return this.entries.get(resolved);
114
+ }
115
+ /**
116
+ * True when filePath or any ancestor directory has been deleted in the overlay.
117
+ */
118
+ isDeletedInOverlay(filePath) {
119
+ if (!this.isInScope(filePath))
120
+ return false;
121
+ let current = path.resolve(filePath);
122
+ while (true) {
123
+ if (this.entries.get(current) === null) {
124
+ return true;
125
+ }
126
+ if (current === this.specDir) {
127
+ break;
128
+ }
129
+ const parent = path.dirname(current);
130
+ if (parent === current) {
131
+ break;
132
+ }
133
+ current = parent;
134
+ }
135
+ return false;
136
+ }
137
+ /**
138
+ * Get all buffered paths (for tests and diagnostics).
139
+ */
140
+ getPaths() {
141
+ return [...this.entries.keys()];
142
+ }
143
+ /**
144
+ * Get number of buffered entries.
145
+ */
146
+ get size() {
147
+ return this.entries.size;
148
+ }
149
+ _buildDirectoryOverlay(directory) {
150
+ const resolvedDir = path.resolve(directory);
151
+ const directWrites = new Map();
152
+ const inferredDirectories = new Set();
153
+ for (const [bufferedPath, content] of this.entries) {
154
+ const relative = path.relative(resolvedDir, bufferedPath);
155
+ if (!relative || relative.startsWith("..") || path.isAbsolute(relative)) {
156
+ continue;
157
+ }
158
+ const parts = relative.split(path.sep).filter(Boolean);
159
+ if (parts.length === 0)
160
+ continue;
161
+ const rootName = parts[0];
162
+ if (parts.length === 1) {
163
+ directWrites.set(rootName, content === null ? "deleted" : "file");
164
+ }
165
+ else if (content !== null) {
166
+ inferredDirectories.add(rootName);
167
+ }
168
+ }
169
+ // A direct delete always wins over inferred directory presence.
170
+ for (const [name, state] of directWrites) {
171
+ if (state === "deleted") {
172
+ inferredDirectories.delete(name);
173
+ }
174
+ }
175
+ return { directWrites, inferredDirectories };
176
+ }
177
+ /**
178
+ * List a directory with buffered entries overlaid on disk entries.
179
+ * Used to keep batch read-after-write semantics for readdir callers.
180
+ */
181
+ async listDir(directory, options) {
182
+ const resolvedDir = path.resolve(directory);
183
+ const withFileTypes = options?.withFileTypes === true;
184
+ if (this.isDeletedInOverlay(resolvedDir)) {
185
+ throw createNotFoundError(resolvedDir);
186
+ }
187
+ let diskEntries = [];
188
+ let diskMissing = false;
189
+ try {
190
+ diskEntries = await fs.readdir(resolvedDir, { withFileTypes: true });
191
+ }
192
+ catch (err) {
193
+ if (!isNotFoundError(err)) {
194
+ throw err;
195
+ }
196
+ diskMissing = true;
197
+ }
198
+ const diskDirentsByName = new Map();
199
+ const mergedKinds = new Map();
200
+ for (const entry of diskEntries) {
201
+ diskDirentsByName.set(entry.name, entry);
202
+ mergedKinds.set(entry.name, entry.isDirectory() ? "directory" : "file");
203
+ }
204
+ const overlay = this._buildDirectoryOverlay(resolvedDir);
205
+ for (const [name, state] of overlay.directWrites) {
206
+ if (state === "deleted") {
207
+ mergedKinds.delete(name);
208
+ }
209
+ else {
210
+ mergedKinds.set(name, "file");
211
+ }
212
+ }
213
+ for (const name of overlay.inferredDirectories) {
214
+ mergedKinds.set(name, "directory");
215
+ }
216
+ if (diskMissing && mergedKinds.size === 0) {
217
+ throw createNotFoundError(resolvedDir);
218
+ }
219
+ const names = [...mergedKinds.keys()].sort((a, b) => a.localeCompare(b));
220
+ if (!withFileTypes) {
221
+ return names;
222
+ }
223
+ return names.map((name) => {
224
+ const mergedKind = mergedKinds.get(name);
225
+ const diskDirent = diskDirentsByName.get(name);
226
+ if (mergedKind &&
227
+ diskDirent &&
228
+ ((mergedKind === "directory" && diskDirent.isDirectory()) ||
229
+ (mergedKind === "file" && diskDirent.isFile()))) {
230
+ return diskDirent;
231
+ }
232
+ return new SyntheticDirent(name, mergedKind === "file");
233
+ });
234
+ }
235
+ /**
236
+ * Flush all buffered writes to disk.
237
+ *
238
+ * Strategy for ac-7 (flush failure atomicity):
239
+ * 1. Write all buffered content to staging files (.kspec-batch-staging suffix)
240
+ * 2. If any staging write fails: delete all staging files, throw — nothing committed
241
+ * 3. Rename all staging files to final paths
242
+ * 4. If any rename fails: report error with committed/uncommitted file list
243
+ *
244
+ * Phase 1 is fully atomic: a staging write failure means no files reach disk.
245
+ * Phase 2 is best-effort: rename failures are reported with a detailed error, but
246
+ * files already renamed in Phase 2 before the failure are committed. On healthy
247
+ * filesystems, Phase 2 rename failures are extremely rare (same-device, same-dir
248
+ * renames are near-atomic). Partial Phase 2 failure is always an explicit error,
249
+ * never a silent commit.
250
+ *
251
+ * AC: @batch-write-buffer ac-3 — only buffered files are written
252
+ * AC: @batch-write-buffer ac-7 — flush failure reported; .kspec/ not silently corrupted
253
+ */
254
+ async flush() {
255
+ if (this.entries.size === 0)
256
+ return;
257
+ const stagingMap = new Map(); // real path → staging path
258
+ // Phase 1: Write all entries to staging files
259
+ try {
260
+ for (const [filePath, content] of this.entries) {
261
+ if (content === null) {
262
+ // Deletions: record for phase 2 but no staging file needed
263
+ stagingMap.set(filePath, "");
264
+ continue;
265
+ }
266
+ const stagingPath = `${filePath}.kspec-batch-staging`;
267
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
268
+ await fs.writeFile(stagingPath, content, "utf-8");
269
+ stagingMap.set(filePath, stagingPath);
270
+ }
271
+ }
272
+ catch (err) {
273
+ // Staging failed — clean up staging files, nothing committed
274
+ await this._cleanupStaging(stagingMap);
275
+ throw new Error(`Batch flush staging failed: ${err instanceof Error ? err.message : err}. No files were committed.`);
276
+ }
277
+ // Phase 2: Rename staging files to real paths (atomic per-file)
278
+ const committed = [];
279
+ const uncommitted = [];
280
+ for (const [filePath, stagingPath] of stagingMap) {
281
+ const content = this.entries.get(filePath);
282
+ try {
283
+ if (content === null) {
284
+ // Delete the real file
285
+ await fs.rm(filePath, { force: true });
286
+ }
287
+ else {
288
+ // Rename staging → real (atomic)
289
+ await fs.rename(stagingPath, filePath);
290
+ }
291
+ committed.push(filePath);
292
+ }
293
+ catch (err) {
294
+ // Rename/delete failed — track uncommitted
295
+ uncommitted.push(filePath);
296
+ // Clean up remaining staging files
297
+ for (const [remainingPath, remainingStagingPath] of stagingMap) {
298
+ if (!committed.includes(remainingPath) && remainingStagingPath) {
299
+ await fs.rm(remainingStagingPath, { force: true }).catch(() => { });
300
+ }
301
+ }
302
+ throw new Error(`Batch flush commit failed: ${err instanceof Error ? err.message : err}.\n` +
303
+ `Committed (${committed.length}): ${committed.join(", ") || "none"}\n` +
304
+ `Uncommitted (${uncommitted.length + (stagingMap.size - committed.length - 1)}): remaining files`);
305
+ }
306
+ }
307
+ }
308
+ /**
309
+ * Discard the buffer without writing anything to disk.
310
+ * AC: @batch-write-buffer ac-4
311
+ */
312
+ discard() {
313
+ this.entries.clear();
314
+ }
315
+ async _cleanupStaging(stagingMap) {
316
+ for (const [, stagingPath] of stagingMap) {
317
+ if (stagingPath) {
318
+ await fs.rm(stagingPath, { force: true }).catch(() => { });
319
+ }
320
+ }
321
+ }
322
+ }
323
+ // ── Module Singleton ─────────────────────────────────────────────────────────
324
+ let _activeBuffer = null;
325
+ /**
326
+ * Activate an in-memory write buffer for the given specDir.
327
+ * All subsequent writes to paths under specDir will go to the buffer.
328
+ * AC: @batch-write-buffer ac-1
329
+ */
330
+ export function activateBatchBuffer(specDir) {
331
+ _activeBuffer = new WriteBuffer(specDir);
332
+ return _activeBuffer;
333
+ }
334
+ /**
335
+ * Deactivate the active buffer (after flush or discard).
336
+ */
337
+ export function deactivateBatchBuffer() {
338
+ _activeBuffer = null;
339
+ }
340
+ /**
341
+ * Get the currently active write buffer, or null if not in batch mode.
342
+ */
343
+ export function getActiveBatchBuffer() {
344
+ return _activeBuffer;
345
+ }
346
+ export async function readdirBufferAware(directory, options) {
347
+ const buffer = getActiveBatchBuffer();
348
+ if (buffer?.isInScope(directory)) {
349
+ return buffer.listDir(directory, options);
350
+ }
351
+ if (options?.withFileTypes) {
352
+ return fs.readdir(directory, { withFileTypes: true });
353
+ }
354
+ return fs.readdir(directory);
355
+ }
356
+ export async function accessBufferAware(filePath, mode) {
357
+ const buffer = getActiveBatchBuffer();
358
+ if (buffer?.isInScope(filePath)) {
359
+ if (buffer.isDeletedInOverlay(filePath)) {
360
+ throw createNotFoundError(filePath);
361
+ }
362
+ const buffered = buffer.read(filePath);
363
+ if (buffered === null) {
364
+ throw createNotFoundError(filePath);
365
+ }
366
+ if (buffered !== undefined) {
367
+ return;
368
+ }
369
+ const resolved = path.resolve(filePath);
370
+ const prefix = `${resolved}${path.sep}`;
371
+ for (const bufferedPath of buffer.getPaths()) {
372
+ if (bufferedPath.startsWith(prefix) && buffer.read(bufferedPath) !== null) {
373
+ return;
374
+ }
375
+ }
376
+ }
377
+ await fs.access(filePath, mode);
378
+ }
379
+ export async function writeFileBufferAware(filePath, content) {
380
+ const buffer = getActiveBatchBuffer();
381
+ if (buffer?.isInScope(filePath)) {
382
+ buffer.write(filePath, content);
383
+ return;
384
+ }
385
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
386
+ if (typeof content === "string") {
387
+ await fs.writeFile(filePath, content, "utf-8");
388
+ }
389
+ else {
390
+ await fs.writeFile(filePath, content);
391
+ }
392
+ }
393
+ export async function mkdirBufferAware(directoryPath) {
394
+ const buffer = getActiveBatchBuffer();
395
+ if (buffer?.isInScope(directoryPath)) {
396
+ return;
397
+ }
398
+ await fs.mkdir(directoryPath, { recursive: true });
399
+ }
400
+ //# sourceMappingURL=batch-write-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-write-buffer.js","sourceRoot":"","sources":["../../src/cli/batch-write-buffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * kspec agent commands — manage and run agents.
3
+ *
4
+ * Provides subcommands for listing agent definitions, running one-shot
5
+ * invocations, and managing the dispatch engine lifecycle via the daemon.
6
+ *
7
+ * AC: @cli-agent-commands ac-1 through ac-10
8
+ * AC: @trait-json-output ac-1 through ac-6
9
+ * AC: @trait-semantic-exit-codes ac-1 through ac-8
10
+ * AC: @trait-error-guidance ac-1 through ac-6
11
+ * AC: @trait-dry-run ac-1 through ac-6
12
+ * AC: @trait-filterable-list ac-1 through ac-8
13
+ */
14
+ import type { Command } from "commander";
15
+ /**
16
+ * Register the kspec agent command family.
17
+ * AC: @cli-agent-commands ac-1 through ac-10
18
+ */
19
+ export declare function registerAgentCommands(program: Command): void;
20
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDzC;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAg6B5D"}