@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kynetic-ai/spec",
3
- "version": "0.9.0",
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.0",
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.0",
3
+ "version": "0.10.0",
4
4
  "description": "kspec agent skills"
5
5
  }
@@ -241,5 +241,5 @@ kspec agents generate
241
241
  ## Integration
242
242
 
243
243
  - **`/kspec:reflect`** — Session reflections surface patterns worth formalizing
244
- - **`/kspec:observations`** — Friction observations may reveal missing workflows
244
+ - **`/kspec:observe`** — Friction observations may reveal missing workflows
245
245
  - **`kspec agents generate`** — Regenerate after creating workflows
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: observations
2
+ name: observe
3
3
  description: Capture and act on systemic patterns — friction, successes,
4
4
  questions, and ideas. The feedback loop that drives process improvement.
5
5
  ---
@@ -350,4 +350,4 @@ kspec validate --alignment
350
350
  - **`/kspec:writing-specs`** — Spec authoring details (types, AC format, traits)
351
351
  - **`/kspec:task-work`** — After specs are created, work on derived tasks
352
352
  - **`/kspec:triage`** — Inbox items may trigger plan creation
353
- - **`/kspec:observations`** — Friction during planning becomes observations
353
+ - **`/kspec:observe`** — Friction during planning becomes observations
@@ -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
 
@@ -325,5 +348,5 @@ kspec session start
325
348
  - **`/kspec:writing-specs`** — Create specs before deriving tasks
326
349
  - **`/kspec:plan`** — Plans create specs that become tasks
327
350
  - **`/kspec:review`** — Review checks AC coverage and code quality
328
- - **`/kspec:observations`** — Capture friction found during task work
351
+ - **`/kspec:observe`** — Capture friction found during task work
329
352
  - **`/kspec:reflect`** — Session reflection after completing tasks
@@ -228,5 +228,5 @@ At session end, provide summary:
228
228
  ## Integration
229
229
 
230
230
  - **`/kspec:reflect`** — Session reflection may generate inbox items for triage
231
- - **`/kspec:observations`** — Captures systemic patterns found during triage
231
+ - **`/kspec:observe`** — Captures systemic patterns found during triage
232
232
  - **`kspec session start`** — Shows inbox count for triage awareness
@@ -350,5 +350,5 @@ The derived task gets `spec_ref: @feature-slug` automatically.
350
350
  - **`/kspec:plan`** — Plans create specs via import or manual creation
351
351
  - **`/kspec:task-work`** — Tasks reference specs; AC guides implementation
352
352
  - **`/kspec:triage`** — Inbox items may reveal spec gaps
353
- - **`/kspec:observations`** — Friction may indicate missing specs
353
+ - **`/kspec:observe`** — Friction may indicate missing specs
354
354
  - **`/kspec:review`** — Reviews check AC coverage
@@ -20,3 +20,4 @@ Verify shadow branch health with `kspec shadow status` if you encounter issues.
20
20
  5. **Always confirm** — Ask before creating or modifying spec items.
21
21
  6. **Batch mutations** — Use `kspec batch` for 2+ sequential write operations (one atomic commit).
22
22
  7. **Regenerate agent instructions** — Run `kspec agents generate` after changing conventions, workflows, or skills. These are the inputs to `kspec-agents.md`.
23
+ 8. **Edit skill sources, not rendered output** — Do not edit `.agents/skills/` directly. Core skills live in `templates/skills/` (+ `templates/skills/manifest.yaml`), while project/local skills live in `.kspec/skills/`. Regenerate rendered files with `kspec skill render`/`kspec setup`.
@@ -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.
@@ -234,5 +234,5 @@ kspec agents generate
234
234
  ## Integration
235
235
 
236
236
  - **`{skill:reflect}`** — Session reflections surface patterns worth formalizing
237
- - **`{skill:observations}`** — Friction observations may reveal missing workflows
237
+ - **`{skill:observe}`** — Friction observations may reveal missing workflows
238
238
  - **`kspec agents generate`** — Regenerate after creating workflows
@@ -9,7 +9,7 @@ skills:
9
9
  platforms:
10
10
  - claude-code
11
11
  - codex
12
- - id: observations
12
+ - id: observe
13
13
  name: Observations
14
14
  description: Capture and act on systemic patterns — friction, successes, questions, and ideas. The feedback loop that drives process improvement.
15
15
  platforms:
@@ -343,4 +343,4 @@ kspec validate --alignment
343
343
  - **`{skill:writing-specs}`** — Spec authoring details (types, AC format, traits)
344
344
  - **`{skill:task-work}`** — After specs are created, work on derived tasks
345
345
  - **`{skill:triage}`** — Inbox items may trigger plan creation
346
- - **`{skill:observations}`** — Friction during planning becomes observations
346
+ - **`{skill:observe}`** — Friction during planning becomes observations
@@ -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
 
@@ -318,5 +341,5 @@ kspec session start
318
341
  - **`{skill:writing-specs}`** — Create specs before deriving tasks
319
342
  - **`{skill:plan}`** — Plans create specs that become tasks
320
343
  - **`{skill:review}`** — Review checks AC coverage and code quality
321
- - **`{skill:observations}`** — Capture friction found during task work
344
+ - **`{skill:observe}`** — Capture friction found during task work
322
345
  - **`{skill:reflect}`** — Session reflection after completing tasks
@@ -221,5 +221,5 @@ At session end, provide summary:
221
221
  ## Integration
222
222
 
223
223
  - **`{skill:reflect}`** — Session reflection may generate inbox items for triage
224
- - **`{skill:observations}`** — Captures systemic patterns found during triage
224
+ - **`{skill:observe}`** — Captures systemic patterns found during triage
225
225
  - **`kspec session start`** — Shows inbox count for triage awareness
@@ -343,5 +343,5 @@ The derived task gets `spec_ref: @feature-slug` automatically.
343
343
  - **`{skill:plan}`** — Plans create specs via import or manual creation
344
344
  - **`{skill:task-work}`** — Tasks reference specs; AC guides implementation
345
345
  - **`{skill:triage}`** — Inbox items may reveal spec gaps
346
- - **`{skill:observations}`** — Friction may indicate missing specs
346
+ - **`{skill:observe}`** — Friction may indicate missing specs
347
347
  - **`{skill:review}`** — Reviews check AC coverage
@@ -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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"}