@kynetic-ai/spec 0.9.1 → 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 (262) hide show
  1. package/README.md +2 -1
  2. package/dist/acp/client.d.ts +6 -1
  3. package/dist/acp/client.d.ts.map +1 -1
  4. package/dist/acp/client.js +7 -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 +140 -62
  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/inbox.d.ts.map +1 -1
  41. package/dist/cli/commands/inbox.js +46 -22
  42. package/dist/cli/commands/inbox.js.map +1 -1
  43. package/dist/cli/commands/index.d.ts +1 -0
  44. package/dist/cli/commands/index.d.ts.map +1 -1
  45. package/dist/cli/commands/index.js +1 -0
  46. package/dist/cli/commands/index.js.map +1 -1
  47. package/dist/cli/commands/item.d.ts.map +1 -1
  48. package/dist/cli/commands/item.js +22 -16
  49. package/dist/cli/commands/item.js.map +1 -1
  50. package/dist/cli/commands/log.js +1 -1
  51. package/dist/cli/commands/log.js.map +1 -1
  52. package/dist/cli/commands/meta.d.ts.map +1 -1
  53. package/dist/cli/commands/meta.js +159 -6
  54. package/dist/cli/commands/meta.js.map +1 -1
  55. package/dist/cli/commands/module.d.ts.map +1 -1
  56. package/dist/cli/commands/module.js +2 -1
  57. package/dist/cli/commands/module.js.map +1 -1
  58. package/dist/cli/commands/plan-import.js +19 -3
  59. package/dist/cli/commands/plan-import.js.map +1 -1
  60. package/dist/cli/commands/plan.d.ts.map +1 -1
  61. package/dist/cli/commands/plan.js +87 -43
  62. package/dist/cli/commands/plan.js.map +1 -1
  63. package/dist/cli/commands/ralph.d.ts +5 -56
  64. package/dist/cli/commands/ralph.d.ts.map +1 -1
  65. package/dist/cli/commands/ralph.js +52 -1502
  66. package/dist/cli/commands/ralph.js.map +1 -1
  67. package/dist/cli/commands/search.d.ts.map +1 -1
  68. package/dist/cli/commands/search.js +22 -13
  69. package/dist/cli/commands/search.js.map +1 -1
  70. package/dist/cli/commands/serve.d.ts.map +1 -1
  71. package/dist/cli/commands/serve.js +70 -11
  72. package/dist/cli/commands/serve.js.map +1 -1
  73. package/dist/cli/commands/session/checkpoint.d.ts.map +1 -1
  74. package/dist/cli/commands/session/checkpoint.js +7 -2
  75. package/dist/cli/commands/session/checkpoint.js.map +1 -1
  76. package/dist/cli/commands/session/commands.d.ts.map +1 -1
  77. package/dist/cli/commands/session/commands.js +15 -0
  78. package/dist/cli/commands/session/commands.js.map +1 -1
  79. package/dist/cli/commands/session/context.d.ts.map +1 -1
  80. package/dist/cli/commands/session/context.js +10 -5
  81. package/dist/cli/commands/session/context.js.map +1 -1
  82. package/dist/cli/commands/session/log.d.ts +1 -0
  83. package/dist/cli/commands/session/log.d.ts.map +1 -1
  84. package/dist/cli/commands/session/log.js +124 -8
  85. package/dist/cli/commands/session/log.js.map +1 -1
  86. package/dist/cli/commands/session/stale-close.d.ts +17 -0
  87. package/dist/cli/commands/session/stale-close.d.ts.map +1 -0
  88. package/dist/cli/commands/session/stale-close.js +378 -0
  89. package/dist/cli/commands/session/stale-close.js.map +1 -0
  90. package/dist/cli/commands/setup.d.ts.map +1 -1
  91. package/dist/cli/commands/setup.js +95 -0
  92. package/dist/cli/commands/setup.js.map +1 -1
  93. package/dist/cli/commands/skill-crud.d.ts.map +1 -1
  94. package/dist/cli/commands/skill-crud.js +4 -3
  95. package/dist/cli/commands/skill-crud.js.map +1 -1
  96. package/dist/cli/commands/skill-diff.d.ts.map +1 -1
  97. package/dist/cli/commands/skill-diff.js +15 -0
  98. package/dist/cli/commands/skill-diff.js.map +1 -1
  99. package/dist/cli/commands/skill-install.d.ts.map +1 -1
  100. package/dist/cli/commands/skill-install.js +50 -18
  101. package/dist/cli/commands/skill-install.js.map +1 -1
  102. package/dist/cli/commands/task.d.ts.map +1 -1
  103. package/dist/cli/commands/task.js +536 -310
  104. package/dist/cli/commands/task.js.map +1 -1
  105. package/dist/cli/commands/tasks.js +1 -1
  106. package/dist/cli/commands/tasks.js.map +1 -1
  107. package/dist/cli/commands/triage.d.ts.map +1 -1
  108. package/dist/cli/commands/triage.js +37 -13
  109. package/dist/cli/commands/triage.js.map +1 -1
  110. package/dist/cli/commands/validate.d.ts.map +1 -1
  111. package/dist/cli/commands/validate.js +65 -25
  112. package/dist/cli/commands/validate.js.map +1 -1
  113. package/dist/cli/help/content.d.ts.map +1 -1
  114. package/dist/cli/help/content.js +5 -0
  115. package/dist/cli/help/content.js.map +1 -1
  116. package/dist/cli/index.d.ts.map +1 -1
  117. package/dist/cli/index.js +2 -1
  118. package/dist/cli/index.js.map +1 -1
  119. package/dist/cli/output.d.ts.map +1 -1
  120. package/dist/cli/output.js +5 -1
  121. package/dist/cli/output.js.map +1 -1
  122. package/dist/daemon/project-context.ts +22 -0
  123. package/dist/daemon/routes/agent-dispatch.ts +272 -0
  124. package/dist/daemon/server.ts +55 -20
  125. package/dist/daemon/websocket/handler.ts +67 -6
  126. package/dist/daemon/websocket/lifecycle.ts +19 -0
  127. package/dist/daemon/websocket/pubsub.ts +74 -3
  128. package/dist/export/html.d.ts.map +1 -1
  129. package/dist/export/html.js +5 -2
  130. package/dist/export/html.js.map +1 -1
  131. package/dist/export/triage.d.ts +1 -1
  132. package/dist/export/triage.d.ts.map +1 -1
  133. package/dist/export/triage.js +5 -3
  134. package/dist/export/triage.js.map +1 -1
  135. package/dist/parser/alignment.d.ts.map +1 -1
  136. package/dist/parser/alignment.js +6 -3
  137. package/dist/parser/alignment.js.map +1 -1
  138. package/dist/parser/assess.js +1 -1
  139. package/dist/parser/assess.js.map +1 -1
  140. package/dist/parser/config.d.ts +6 -6
  141. package/dist/parser/meta.d.ts.map +1 -1
  142. package/dist/parser/meta.js +9 -8
  143. package/dist/parser/meta.js.map +1 -1
  144. package/dist/parser/plan-document.d.ts +12 -12
  145. package/dist/parser/plans.d.ts +7 -0
  146. package/dist/parser/plans.d.ts.map +1 -1
  147. package/dist/parser/plans.js +100 -15
  148. package/dist/parser/plans.js.map +1 -1
  149. package/dist/parser/refs.d.ts +5 -0
  150. package/dist/parser/refs.d.ts.map +1 -1
  151. package/dist/parser/refs.js +17 -12
  152. package/dist/parser/refs.js.map +1 -1
  153. package/dist/parser/shadow.d.ts +1 -1
  154. package/dist/parser/shadow.d.ts.map +1 -1
  155. package/dist/parser/shadow.js +71 -4
  156. package/dist/parser/shadow.js.map +1 -1
  157. package/dist/parser/skill-render.d.ts.map +1 -1
  158. package/dist/parser/skill-render.js +6 -3
  159. package/dist/parser/skill-render.js.map +1 -1
  160. package/dist/parser/validate.d.ts.map +1 -1
  161. package/dist/parser/validate.js +35 -76
  162. package/dist/parser/validate.js.map +1 -1
  163. package/dist/parser/yaml.d.ts +24 -5
  164. package/dist/parser/yaml.d.ts.map +1 -1
  165. package/dist/parser/yaml.js +224 -64
  166. package/dist/parser/yaml.js.map +1 -1
  167. package/dist/schema/meta.d.ts +442 -119
  168. package/dist/schema/meta.d.ts.map +1 -1
  169. package/dist/schema/meta.js +55 -0
  170. package/dist/schema/meta.js.map +1 -1
  171. package/dist/schema/plan.d.ts +22 -22
  172. package/dist/schema/spec.d.ts +39 -39
  173. package/dist/schema/task.d.ts +43 -32
  174. package/dist/schema/task.d.ts.map +1 -1
  175. package/dist/schema/task.js +5 -0
  176. package/dist/schema/task.js.map +1 -1
  177. package/dist/sessions/store.d.ts +112 -0
  178. package/dist/sessions/store.d.ts.map +1 -1
  179. package/dist/sessions/store.js +414 -22
  180. package/dist/sessions/store.js.map +1 -1
  181. package/dist/sessions/types.d.ts +75 -17
  182. package/dist/sessions/types.d.ts.map +1 -1
  183. package/dist/sessions/types.js +51 -1
  184. package/dist/sessions/types.js.map +1 -1
  185. package/dist/triage/actions.d.ts +1 -0
  186. package/dist/triage/actions.d.ts.map +1 -1
  187. package/dist/triage/actions.js +34 -7
  188. package/dist/triage/actions.js.map +1 -1
  189. package/dist/utils/commit.js +1 -1
  190. package/dist/utils/commit.js.map +1 -1
  191. package/dist/web-ui/_app/env.js +1 -0
  192. package/dist/web-ui/_app/immutable/assets/0.BxCxvrZR.css +1 -0
  193. package/dist/web-ui/_app/immutable/assets/select-trigger.CV-KWLNP.css +1 -0
  194. package/dist/web-ui/_app/immutable/chunks/B-CZR0q8.js +1 -0
  195. package/dist/web-ui/_app/immutable/chunks/B1IR5Su5.js +1 -0
  196. package/dist/web-ui/_app/immutable/chunks/BCkp8Hs8.js +1 -0
  197. package/dist/web-ui/_app/immutable/chunks/B_Cvvtc4.js +1 -0
  198. package/dist/web-ui/_app/immutable/chunks/BtFaGGII.js +1 -0
  199. package/dist/web-ui/_app/immutable/chunks/Bu8JVsCH.js +1 -0
  200. package/dist/web-ui/_app/immutable/chunks/C87u-CNA.js +1 -0
  201. package/dist/web-ui/_app/immutable/chunks/CrFkBTYp.js +1 -0
  202. package/dist/web-ui/_app/immutable/chunks/D1ArdqNb.js +1 -0
  203. package/dist/web-ui/_app/immutable/chunks/D28BF5MJ.js +1 -0
  204. package/dist/web-ui/_app/immutable/chunks/D6RtLpzL.js +1 -0
  205. package/dist/web-ui/_app/immutable/chunks/D7FHSgx2.js +1 -0
  206. package/dist/web-ui/_app/immutable/chunks/DBXrsxZQ.js +2 -0
  207. package/dist/web-ui/_app/immutable/chunks/Da_hHMuA.js +1 -0
  208. package/dist/web-ui/_app/immutable/chunks/Do6LchSF.js +1 -0
  209. package/dist/web-ui/_app/immutable/chunks/DoNPtcAw.js +1 -0
  210. package/dist/web-ui/_app/immutable/chunks/DtUbXRZz.js +1 -0
  211. package/dist/web-ui/_app/immutable/chunks/DyFPRlLl.js +1 -0
  212. package/dist/web-ui/_app/immutable/chunks/DzAP8lRM.js +1 -0
  213. package/dist/web-ui/_app/immutable/chunks/DzVXElzN.js +2 -0
  214. package/dist/web-ui/_app/immutable/chunks/aoPBFken.js +1 -0
  215. package/dist/web-ui/_app/immutable/chunks/i-XnOIX0.js +1 -0
  216. package/dist/web-ui/_app/immutable/chunks/laxtrUO3.js +1 -0
  217. package/dist/web-ui/_app/immutable/chunks/q1nIWgqB.js +1 -0
  218. package/dist/web-ui/_app/immutable/chunks/sTLbk5Nm.js +1 -0
  219. package/dist/web-ui/_app/immutable/chunks/vwKgQu5P.js +5 -0
  220. package/dist/web-ui/_app/immutable/entry/app.BCwMcqnT.js +2 -0
  221. package/dist/web-ui/_app/immutable/entry/start.wKCQH-tt.js +1 -0
  222. package/dist/web-ui/_app/immutable/nodes/0.CjGVMG74.js +1 -0
  223. package/dist/web-ui/_app/immutable/nodes/1.B6_AIPan.js +1 -0
  224. package/dist/web-ui/_app/immutable/nodes/2.q4oCS7Ws.js +1 -0
  225. package/dist/web-ui/_app/immutable/nodes/3.rTKZf9o2.js +1 -0
  226. package/dist/web-ui/_app/immutable/nodes/4.DVIDRu1d.js +1 -0
  227. package/dist/web-ui/_app/immutable/nodes/5.8PtPXIOd.js +1 -0
  228. package/dist/web-ui/_app/immutable/nodes/6.ZZrTemy_.js +1 -0
  229. package/dist/web-ui/_app/immutable/nodes/7.IP-gxCxi.js +1 -0
  230. package/dist/web-ui/_app/version.json +1 -0
  231. package/dist/web-ui/index.html +36 -0
  232. package/dist/web-ui/robots.txt +3 -0
  233. package/package.json +3 -2
  234. package/plugin/.claude-plugin/marketplace.json +1 -1
  235. package/plugin/.claude-plugin/plugin.json +1 -1
  236. package/plugin/plugins/kspec/skills/task-work/SKILL.md +25 -2
  237. package/templates/agents-sections/06-ralph-loop.md +64 -11
  238. package/templates/skills/task-work/SKILL.md +25 -2
  239. package/dist/ralph/cli-renderer.d.ts +0 -27
  240. package/dist/ralph/cli-renderer.d.ts.map +0 -1
  241. package/dist/ralph/cli-renderer.js +0 -250
  242. package/dist/ralph/cli-renderer.js.map +0 -1
  243. package/dist/ralph/events.d.ts +0 -65
  244. package/dist/ralph/events.d.ts.map +0 -1
  245. package/dist/ralph/events.js +0 -600
  246. package/dist/ralph/events.js.map +0 -1
  247. package/dist/ralph/index.d.ts +0 -11
  248. package/dist/ralph/index.d.ts.map +0 -1
  249. package/dist/ralph/index.js +0 -16
  250. package/dist/ralph/index.js.map +0 -1
  251. package/dist/ralph/loop-errors.d.ts +0 -83
  252. package/dist/ralph/loop-errors.d.ts.map +0 -1
  253. package/dist/ralph/loop-errors.js +0 -150
  254. package/dist/ralph/loop-errors.js.map +0 -1
  255. package/dist/ralph/subagent.d.ts +0 -127
  256. package/dist/ralph/subagent.d.ts.map +0 -1
  257. package/dist/ralph/subagent.js +0 -268
  258. package/dist/ralph/subagent.js.map +0 -1
  259. package/dist/ralph/wrap-up.d.ts +0 -127
  260. package/dist/ralph/wrap-up.d.ts.map +0 -1
  261. package/dist/ralph/wrap-up.js +0 -271
  262. package/dist/ralph/wrap-up.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kynetic-ai/spec",
3
- "version": "0.9.1",
3
+ "version": "0.10.0",
4
4
  "description": "Kynetic Spec - Structured specification format for human-AI collaboration",
5
5
  "type": "module",
6
6
  "workspaces": [
@@ -22,9 +22,10 @@
22
22
  "author": "Kynetic AI",
23
23
  "scripts": {
24
24
  "bootstrap": "node scripts/bootstrap.cjs",
25
- "build": "tsc && chmod +x dist/cli/index.js && npm run build:daemon && npm run build:plugin",
25
+ "build": "tsc && chmod +x dist/cli/index.js && npm run build:daemon && npm run build:web-ui && npm run build:plugin",
26
26
  "build:plugin": "node scripts/build-plugin.cjs",
27
27
  "build:daemon": "shx rm -rf dist/daemon && shx mkdir -p dist/daemon && shx cp -r packages/daemon/src/* dist/daemon/",
28
+ "build:web-ui": "shx rm -rf dist/web-ui && cd packages/web-ui && npm run build && shx cp -r build ../../dist/web-ui",
28
29
  "dev": "tsx src/cli/index.ts",
29
30
  "setup:dev": "npm install && npm run build && npm link",
30
31
  "prepack": "npm run build:plugin",
@@ -9,7 +9,7 @@
9
9
  {
10
10
  "name": "kspec",
11
11
  "description": "kspec agent skills",
12
- "version": "0.9.1",
12
+ "version": "0.10.0",
13
13
  "source": "./plugins/kspec",
14
14
  "category": "development"
15
15
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "kspec",
3
- "version": "0.9.1",
3
+ "version": "0.10.0",
4
4
  "description": "kspec agent skills"
5
5
  }
@@ -61,6 +61,7 @@ Use CLI commands to find information. **Do NOT search `.kspec/` YAML files manua
61
61
  | List by type | `kspec item list --type feature` |
62
62
  | All traits | `kspec trait list` |
63
63
  | Task's linked spec | `kspec task get @ref` → read `spec_ref` field |
64
+ | Task's linked plan | `kspec task get @ref` → if `plan_ref` is non-null, run `kspec plan get @plan-ref` |
64
65
 
65
66
  **Key pattern:** When `kspec item get` output shows "Inherited from @trait-slug", run `kspec item get @trait-slug` to see the trait's ACs. One command — do not grep YAML files.
66
67
 
@@ -93,9 +94,30 @@ If already implemented: verify tests pass, AC coverage exists, then `kspec task
93
94
  ### 3. Start Task
94
95
 
95
96
  ```bash
97
+ # Check task links first
98
+ kspec task get @ref
99
+
100
+ # If plan_ref is non-null, load implementation context from the plan
101
+ kspec plan get @plan-ref
102
+
103
+ # Then start work
96
104
  kspec task start @ref
97
105
  ```
98
106
 
107
+ ### 3.5 Branch Isolation (Required Before Edits)
108
+
109
+ Immediately after `kspec task start` and before any file edits, create or switch to a dedicated branch for that task. Do not keep implementing on a branch that is tied to another pending-review task.
110
+
111
+ ```bash
112
+ # Example naming from task intent/slug
113
+ TASK_BRANCH="fix/<task-slug>"
114
+
115
+ # Create the branch if missing, otherwise switch to it
116
+ git checkout -b "$TASK_BRANCH" 2>/dev/null || git checkout "$TASK_BRANCH"
117
+ ```
118
+
119
+ This keeps each task's commits scoped to its own PR and prevents cross-task contamination.
120
+
99
121
  ### 4. Work and Note
100
122
 
101
123
  Read all ACs (own + trait) before implementing:
@@ -266,6 +288,7 @@ kspec tasks ready --eligible # Only automation-eligible tasks
266
288
  ### Key Behaviors
267
289
 
268
290
  - Verify work is needed before starting (prevent duplicates)
291
+ - Create/switch to a dedicated task branch before making code edits
269
292
  - Decisions auto-resolve without prompts
270
293
  - PR review handled externally (not this workflow)
271
294
  - All actions are logged and auditable
@@ -288,12 +311,12 @@ After blocking:
288
311
  kspec task block @ref --reason "Reason..."
289
312
  kspec tasks ready --eligible # Check for other work
290
313
  # If tasks exist: work on the next one
291
- # If empty: stop responding (ralph auto-exits)
314
+ # If empty: stop responding (agent dispatch exits automatically)
292
315
  ```
293
316
 
294
317
  ### Turn Completion
295
318
 
296
- After creating a PR, **stop responding**. Ralph continues automatically — it checks for remaining eligible tasks and exits the loop when none remain.
319
+ After creating a PR, **stop responding**. The agent dispatch engine continues automatically — it checks for remaining eligible tasks and exits when none remain.
297
320
 
298
321
  **Do NOT call `end-loop`** after creating a PR. That ends ALL remaining iterations. It's a rare escape hatch for when work is stalling across multiple iterations.
299
322
 
@@ -1,24 +1,77 @@
1
- ## Ralph Loop Mode
1
+ ## Agent Dispatch Mode
2
2
 
3
- When running in automated loop mode (ralph):
3
+ When running as an automated agent via the dispatch engine:
4
4
 
5
- ### The Loop
5
+ ### Dispatch Engine Commands
6
+
7
+ ```bash
8
+ # Start background dispatch (daemon must be running)
9
+ kspec agent dispatch start
10
+
11
+ # Inspect active/queued work and loaded agents
12
+ kspec agent dispatch status
13
+
14
+ # Stream live text output from running invocations
15
+ kspec agent dispatch watch
16
+
17
+ # Stop dispatch gracefully
18
+ kspec agent dispatch stop
19
+ ```
20
+
21
+ ### Built-In Agents
22
+
23
+ `kspec setup` ensures default worker/reviewer agent definitions exist in `kynetic.meta.yaml`:
24
+
25
+ - `task-worker` — handles automation-eligible `task.ready`, `task.in_progress`, and `task.needs_work`
26
+ - `pr-reviewer` — handles `task.pending_review`
27
+
28
+ Inspect current definitions with:
29
+
30
+ ```bash
31
+ kspec agent list
32
+ ```
33
+
34
+ ### Dispatch Rules and Trigger Events
35
+
36
+ | Trigger event | Typical handler | Notes |
37
+ |---------------|-----------------|-------|
38
+ | `task.ready` | `task-worker` | Worker picks up newly ready automation-eligible tasks |
39
+ | `task.in_progress` | `task-worker` | Worker can continue existing automation-eligible tasks |
40
+ | `task.needs_work` | `task-worker` | Fix-cycle tasks return to worker |
41
+ | `task.pending_review` | `pr-reviewer` | Review/merge workflow runs in separate invocation |
42
+
43
+ ### One-Shot Invocation
44
+
45
+ Run a single agent directly (outside dispatch):
46
+
47
+ ```bash
48
+ kspec agent run <agent-id> [prompt]
49
+ ```
50
+
51
+ Common flags:
52
+
53
+ - `--task @task-ref` to target a specific task
54
+ - `--dry-run` to preview prompt without spawning
55
+ - `--json` for structured output
56
+ - `--timeout <minutes>` and `--budget <n>` for execution limits
57
+
58
+ ### Dispatch Loop Behavior
6
59
 
7
60
  ```
8
- for each iteration:
9
- 1. Ralph checks eligible tasks — if none, exits loop
61
+ for each dispatched invocation:
62
+ 1. Agent runtime checks eligible tasks — if none, invocation ends
10
63
  2. Agent works on tasks, may create PR(s)
64
+ - Before editing files on a selected task, create/switch to a dedicated task branch
11
65
  3. Agent stops responding (turn complete)
12
- 4. Ralph sends reflection prompt
13
- 5. Ralph processes pending_review via subagent
14
- 6. Continue
66
+ 4. pr-reviewer agent handles pending_review tasks via separate dispatch
67
+ 5. Continue
15
68
  ```
16
69
 
17
- **When you stop responding, ralph continues automatically.** Do NOT call `end-loop` after creating a PR.
70
+ **When you stop responding, the dispatch engine continues automatically.** Do NOT call `kspec agent end-loop` after creating a PR.
18
71
 
19
72
  ### Task Inheritance
20
73
 
21
- Priority: `needs_work` > `in_progress` > `pending`. Always inherit existing work before starting new tasks. (`pending_review` tasks are handled by the review subagent, not the worker.)
74
+ Priority: `needs_work` > `in_progress` > `pending`. Always inherit existing work before starting new tasks. (`pending_review` tasks are handled by the pr-reviewer agent, not the worker.)
22
75
 
23
76
  ### Blocking Rules
24
77
 
@@ -39,7 +92,7 @@ Priority: `needs_work` > `in_progress` > `pending`. Always inherit existing work
39
92
  kspec task block @task --reason "Reason..."
40
93
  kspec tasks ready --eligible
41
94
  # If tasks returned: work on next one
42
- # If empty: stop responding — ralph auto-exits
95
+ # If empty: stop responding — dispatch engine auto-exits
43
96
  ```
44
97
 
45
98
  **One blocked task is NOT "no more work."** `kspec tasks ready --eligible` output is authoritative.
@@ -54,6 +54,7 @@ Use CLI commands to find information. **Do NOT search `.kspec/` YAML files manua
54
54
  | List by type | `kspec item list --type feature` |
55
55
  | All traits | `kspec trait list` |
56
56
  | Task's linked spec | `kspec task get @ref` → read `spec_ref` field |
57
+ | Task's linked plan | `kspec task get @ref` → if `plan_ref` is non-null, run `kspec plan get @plan-ref` |
57
58
 
58
59
  **Key pattern:** When `kspec item get` output shows "Inherited from @trait-slug", run `kspec item get @trait-slug` to see the trait's ACs. One command — do not grep YAML files.
59
60
 
@@ -86,9 +87,30 @@ If already implemented: verify tests pass, AC coverage exists, then `kspec task
86
87
  ### 3. Start Task
87
88
 
88
89
  ```bash
90
+ # Check task links first
91
+ kspec task get @ref
92
+
93
+ # If plan_ref is non-null, load implementation context from the plan
94
+ kspec plan get @plan-ref
95
+
96
+ # Then start work
89
97
  kspec task start @ref
90
98
  ```
91
99
 
100
+ ### 3.5 Branch Isolation (Required Before Edits)
101
+
102
+ Immediately after `kspec task start` and before any file edits, create or switch to a dedicated branch for that task. Do not keep implementing on a branch that is tied to another pending-review task.
103
+
104
+ ```bash
105
+ # Example naming from task intent/slug
106
+ TASK_BRANCH="fix/<task-slug>"
107
+
108
+ # Create the branch if missing, otherwise switch to it
109
+ git checkout -b "$TASK_BRANCH" 2>/dev/null || git checkout "$TASK_BRANCH"
110
+ ```
111
+
112
+ This keeps each task's commits scoped to its own PR and prevents cross-task contamination.
113
+
92
114
  ### 4. Work and Note
93
115
 
94
116
  Read all ACs (own + trait) before implementing:
@@ -259,6 +281,7 @@ kspec tasks ready --eligible # Only automation-eligible tasks
259
281
  ### Key Behaviors
260
282
 
261
283
  - Verify work is needed before starting (prevent duplicates)
284
+ - Create/switch to a dedicated task branch before making code edits
262
285
  - Decisions auto-resolve without prompts
263
286
  - PR review handled externally (not this workflow)
264
287
  - All actions are logged and auditable
@@ -281,12 +304,12 @@ After blocking:
281
304
  kspec task block @ref --reason "Reason..."
282
305
  kspec tasks ready --eligible # Check for other work
283
306
  # If tasks exist: work on the next one
284
- # If empty: stop responding (ralph auto-exits)
307
+ # If empty: stop responding (agent dispatch exits automatically)
285
308
  ```
286
309
 
287
310
  ### Turn Completion
288
311
 
289
- After creating a PR, **stop responding**. Ralph continues automatically — it checks for remaining eligible tasks and exits the loop when none remain.
312
+ After creating a PR, **stop responding**. The agent dispatch engine continues automatically — it checks for remaining eligible tasks and exits when none remain.
290
313
 
291
314
  **Do NOT call `end-loop`** after creating a PR. That ends ALL remaining iterations. It's a rare escape hatch for when work is stalling across multiple iterations.
292
315
 
@@ -1,27 +0,0 @@
1
- /**
2
- * Ralph CLI Renderer
3
- *
4
- * Renders RalphEvents to the terminal with chalk colors and formatting.
5
- * This is the CLI-specific implementation; other renderers (TUI) could
6
- * consume the same event stream with different display logic.
7
- */
8
- import type { RalphEvent } from "./events.js";
9
- export interface RalphRenderer {
10
- /**
11
- * Render an event to the output.
12
- */
13
- render(event: RalphEvent): void;
14
- /**
15
- * Called when a new section starts (e.g., iteration boundary).
16
- */
17
- newSection?(label: string): void;
18
- }
19
- export declare function createCliRenderer(): RalphRenderer;
20
- /**
21
- * Create a renderer that prefixes all output with a label.
22
- * Used to distinguish subagent output from main agent output.
23
- *
24
- * AC: @ralph-subagent-spawning ac-11
25
- */
26
- export declare function createPrefixedRenderer(prefix: string): RalphRenderer;
27
- //# sourceMappingURL=cli-renderer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-renderer.d.ts","sourceRoot":"","sources":["../../src/ralph/cli-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAGV,UAAU,EAKX,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAEhC;;OAEG;IACH,UAAU,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAgCD,wBAAgB,iBAAiB,IAAI,aAAa,CAgDjD;AA8JD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAqEpE"}
@@ -1,250 +0,0 @@
1
- /**
2
- * Ralph CLI Renderer
3
- *
4
- * Renders RalphEvents to the terminal with chalk colors and formatting.
5
- * This is the CLI-specific implementation; other renderers (TUI) could
6
- * consume the same event stream with different display logic.
7
- */
8
- import chalk from "chalk";
9
- // ============================================================================
10
- // Timestamp Formatting
11
- // ============================================================================
12
- /**
13
- * Format milliseconds as relative timestamp.
14
- * Examples: +0s, +5s, +1m, +2m30s
15
- */
16
- function formatTimestamp(ms) {
17
- const seconds = Math.floor(ms / 1000);
18
- if (seconds < 60) {
19
- return `+${seconds}s`;
20
- }
21
- const minutes = Math.floor(seconds / 60);
22
- const remainingSeconds = seconds % 60;
23
- if (remainingSeconds === 0) {
24
- return `+${minutes}m`;
25
- }
26
- return `+${minutes}m${remainingSeconds}s`;
27
- }
28
- export function createCliRenderer() {
29
- const state = {
30
- lastEventType: null,
31
- isStreaming: false,
32
- };
33
- function render(event) {
34
- const ts = chalk.gray(`[${formatTimestamp(event.timestamp)}]`);
35
- const data = event.data;
36
- switch (data.kind) {
37
- case "agent_message":
38
- renderAgentMessage(ts, data, state);
39
- break;
40
- case "agent_thought":
41
- renderAgentThought(ts, data, state);
42
- break;
43
- case "tool_start":
44
- renderToolStart(ts, data, state);
45
- break;
46
- case "tool_update":
47
- renderToolUpdate(ts, data);
48
- break;
49
- case "tool_result":
50
- renderToolResult(ts, data, state);
51
- break;
52
- case "status":
53
- renderStatus(ts, data);
54
- break;
55
- }
56
- }
57
- function newSection(label) {
58
- // End any streaming state
59
- if (state.isStreaming) {
60
- process.stdout.write("\n");
61
- state.isStreaming = false;
62
- }
63
- state.lastEventType = null;
64
- console.log("");
65
- console.log(chalk.cyan(`${"─".repeat(60)}`));
66
- console.log(chalk.cyan.bold(label));
67
- console.log(chalk.cyan(`${"─".repeat(60)}`));
68
- console.log("");
69
- }
70
- return { render, newSection };
71
- }
72
- // ============================================================================
73
- // Event Renderers
74
- // ============================================================================
75
- function renderAgentMessage(ts, data, state) {
76
- // New section header if switching from non-message
77
- if (state.lastEventType !== "agent_message" && !state.isStreaming) {
78
- if (state.lastEventType !== null) {
79
- console.log(""); // Spacing
80
- }
81
- console.log(`${ts} ${chalk.blue("--- Agent ---")}`);
82
- }
83
- // Stream content directly
84
- if (data.isStreaming) {
85
- process.stdout.write(data.content);
86
- state.isStreaming = true;
87
- }
88
- else {
89
- // Final content - ensure newline
90
- if (state.isStreaming) {
91
- process.stdout.write("\n");
92
- }
93
- state.isStreaming = false;
94
- }
95
- state.lastEventType = "agent_message";
96
- }
97
- function renderAgentThought(ts, data, state) {
98
- // New section header if switching from non-thought
99
- if (state.lastEventType !== "agent_thought" && !state.isStreaming) {
100
- if (state.lastEventType !== null) {
101
- console.log("");
102
- }
103
- console.log(`${ts} ${chalk.magenta("--- Thinking ---")}`);
104
- }
105
- // Stream content in dim/gray
106
- if (data.isStreaming) {
107
- process.stdout.write(chalk.dim(data.content));
108
- state.isStreaming = true;
109
- }
110
- else {
111
- if (state.isStreaming) {
112
- process.stdout.write("\n");
113
- }
114
- state.isStreaming = false;
115
- }
116
- state.lastEventType = "agent_thought";
117
- }
118
- function renderToolStart(ts, data, state) {
119
- // End any streaming
120
- if (state.isStreaming) {
121
- process.stdout.write("\n");
122
- state.isStreaming = false;
123
- }
124
- if (state.lastEventType !== null) {
125
- console.log("");
126
- }
127
- console.log(`${ts} ${chalk.yellow(`--- Tool: ${data.tool} ---`)}`);
128
- // Show summary if available
129
- if (data.summary) {
130
- console.log(`${ts} ${chalk.gray(data.summary)}`);
131
- }
132
- state.lastEventType = "tool_start";
133
- }
134
- function renderToolUpdate(ts, data) {
135
- // If summary is present, this is the phased input arrival - show the summary
136
- if (data.summary) {
137
- console.log(`${ts} ${chalk.gray(data.summary)}`);
138
- return;
139
- }
140
- // Otherwise show status update
141
- const statusIcon = data.status === "running" ? chalk.blue("⟳") : chalk.gray("○");
142
- console.log(`${ts} ${statusIcon} ${chalk.gray(data.status)}`);
143
- }
144
- function renderToolResult(ts, data, state) {
145
- // Status line
146
- const statusColor = data.status === "completed"
147
- ? chalk.green
148
- : data.status === "failed"
149
- ? chalk.red
150
- : chalk.yellow;
151
- const statusIcon = data.status === "completed" ? "✓" : data.status === "failed" ? "✗" : "○";
152
- console.log(`${ts} ${statusColor(`${statusIcon} ${data.status}`)}`);
153
- // Output (if any)
154
- if (data.output) {
155
- const outputLines = data.output.split("\n");
156
- const indent = " "; // Align with timestamp
157
- // Show output with indentation
158
- for (const line of outputLines.slice(0, 20)) {
159
- console.log(chalk.gray(`${indent}${line}`));
160
- }
161
- if (data.truncated) {
162
- console.log(chalk.gray(`${indent}... (truncated)`));
163
- }
164
- }
165
- state.lastEventType = "tool_result";
166
- }
167
- function renderStatus(ts, data) {
168
- const statusColor = data.status === "completed" || data.status === "end_turn"
169
- ? chalk.green
170
- : data.status === "error" || data.status === "crashed"
171
- ? chalk.red
172
- : chalk.gray;
173
- let statusText = data.status;
174
- if (data.message) {
175
- statusText += `: ${data.message}`;
176
- }
177
- console.log(`${ts} ${statusColor(`[${statusText}]`)}`);
178
- }
179
- /**
180
- * Create a renderer that prefixes all output with a label.
181
- * Used to distinguish subagent output from main agent output.
182
- *
183
- * AC: @ralph-subagent-spawning ac-11
184
- */
185
- export function createPrefixedRenderer(prefix) {
186
- const inner = createCliRenderer();
187
- const prefixStr = chalk.cyan(`${prefix} `);
188
- const state = {
189
- atLineStart: true,
190
- };
191
- /**
192
- * Execute a function with prefixed console.log and stdout.write.
193
- * Ensures all output is prefixed consistently.
194
- */
195
- function withPrefixedOutput(fn) {
196
- const originalLog = console.log;
197
- const originalWrite = process.stdout.write;
198
- // Wrap console.log - prefix is handled by stdout.write wrapper below,
199
- // so we just delegate to the original and mark line start.
200
- console.log = (...args) => {
201
- originalLog(...args);
202
- state.atLineStart = true;
203
- };
204
- // Wrap process.stdout.write for streaming content
205
- // Track line boundaries to only prefix at start of lines
206
- // biome-ignore lint/suspicious/noExplicitAny: stdout.write has complex overloads
207
- process.stdout.write = (chunk, ...args) => {
208
- if (typeof chunk === "string") {
209
- // Split by newlines but preserve them
210
- const parts = chunk.split(/(\n)/);
211
- let output = "";
212
- for (const part of parts) {
213
- if (part === "\n") {
214
- output += part;
215
- state.atLineStart = true;
216
- }
217
- else if (part.length > 0) {
218
- if (state.atLineStart) {
219
- output += prefixStr + part;
220
- state.atLineStart = false;
221
- }
222
- else {
223
- output += part;
224
- }
225
- }
226
- }
227
- return originalWrite.call(process.stdout, output, ...args);
228
- }
229
- // For Uint8Array, pass through unchanged
230
- return originalWrite.call(process.stdout, chunk, ...args);
231
- };
232
- try {
233
- return fn();
234
- }
235
- finally {
236
- console.log = originalLog;
237
- process.stdout.write = originalWrite;
238
- }
239
- }
240
- return {
241
- render(event) {
242
- withPrefixedOutput(() => inner.render(event));
243
- },
244
- newSection(label) {
245
- state.atLineStart = true;
246
- withPrefixedOutput(() => inner.newSection?.(label));
247
- },
248
- };
249
- }
250
- //# sourceMappingURL=cli-renderer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-renderer.js","sourceRoot":"","sources":["../../src/ralph/cli-renderer.ts"],"names":[],"mappings":"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"}
@@ -1,65 +0,0 @@
1
- /**
2
- * Ralph Event System
3
- *
4
- * Translates ACP SessionUpdate events into structured RalphEvents.
5
- * This layer is pure data - no rendering concerns. Enables future
6
- * TUI or other renderers to consume the same event stream.
7
- */
8
- import type { SessionUpdate } from "../acp/types.js";
9
- export type RalphEventType = "agent_message" | "agent_thought" | "tool_start" | "tool_update" | "tool_result" | "status";
10
- export interface RalphEvent {
11
- type: RalphEventType;
12
- timestamp: number;
13
- data: RalphEventData;
14
- }
15
- export type RalphEventData = AgentMessageData | AgentThoughtData | ToolStartData | ToolUpdateData | ToolResultData | StatusData;
16
- export interface AgentMessageData {
17
- kind: "agent_message";
18
- content: string;
19
- isStreaming: boolean;
20
- }
21
- export interface AgentThoughtData {
22
- kind: "agent_thought";
23
- content: string;
24
- isStreaming: boolean;
25
- }
26
- export interface ToolStartData {
27
- kind: "tool_start";
28
- toolCallId: string;
29
- tool: string;
30
- summary: string;
31
- input: unknown;
32
- }
33
- export interface ToolUpdateData {
34
- kind: "tool_update";
35
- toolCallId: string;
36
- tool: string;
37
- status: "pending" | "running";
38
- summary?: string;
39
- }
40
- export interface ToolResultData {
41
- kind: "tool_result";
42
- toolCallId: string;
43
- tool: string;
44
- status: "completed" | "failed" | "cancelled";
45
- output?: string;
46
- truncated: boolean;
47
- }
48
- export interface StatusData {
49
- kind: "status";
50
- status: string;
51
- message?: string;
52
- }
53
- export interface RalphTranslator {
54
- /**
55
- * Translate an ACP SessionUpdate to a RalphEvent.
56
- * Returns null if the update should be suppressed.
57
- */
58
- translate(update: SessionUpdate): RalphEvent | null;
59
- /**
60
- * Signal end of stream. Returns final event if there's pending state.
61
- */
62
- finalize(): RalphEvent | null;
63
- }
64
- export declare function createTranslator(): RalphTranslator;
65
- //# sourceMappingURL=events.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/ralph/events.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMrD,MAAM,MAAM,cAAc,GACtB,eAAe,GACf,eAAe,GACf,YAAY,GACZ,aAAa,GACb,aAAa,GACb,QAAQ,CAAC;AAEb,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,cAAc,CAAC;CACtB;AAED,MAAM,MAAM,cAAc,GACtB,gBAAgB,GAChB,gBAAgB,GAChB,aAAa,GACb,cAAc,GACd,cAAc,GACd,UAAU,CAAC;AAEf,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,GAAG,IAAI,CAAC;IAEpD;;OAEG;IACH,QAAQ,IAAI,UAAU,GAAG,IAAI,CAAC;CAC/B;AA2VD,wBAAgB,gBAAgB,IAAI,eAAe,CAqWlD"}