@alecsibilia/luca 14.0.0-alpha.3 → 14.0.0-alpha.31

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 (346) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/README.md +8 -3
  3. package/board/client/board-look.ts +34 -1
  4. package/board/client/board-panel-parts.tsx +150 -0
  5. package/board/client/board-panel-stages.ts +99 -0
  6. package/board/client/board-panel-styles.ts +223 -0
  7. package/board/client/board-panel.tsx +77 -1275
  8. package/board/client/engine-life.ts +48 -0
  9. package/board/client/final-review-stack.tsx +144 -0
  10. package/board/client/heartbeat.tsx +61 -0
  11. package/board/client/helper-lines.tsx +69 -0
  12. package/board/client/live-feed.tsx +86 -0
  13. package/board/client/live-line.ts +73 -0
  14. package/board/client/model-line.tsx +189 -0
  15. package/board/client/needs-you-section.tsx +133 -0
  16. package/board/client/one-line.tsx +193 -0
  17. package/board/client/repo-wait-banner.tsx +69 -0
  18. package/board/client/run-footer.tsx +68 -0
  19. package/board/client/run-header.tsx +189 -0
  20. package/board/client/run-picker.tsx +98 -0
  21. package/board/client/status-bar.tsx +131 -0
  22. package/board/client/step-dots.tsx +127 -0
  23. package/board/client/stuck-actions.tsx +269 -0
  24. package/board/client/ticket-card-view.tsx +238 -0
  25. package/board/client/ticket-detail.tsx +87 -0
  26. package/board/client/ticket-stack.tsx +119 -0
  27. package/board/client/ticket-wait.ts +188 -0
  28. package/board/client/timeline-rows.tsx +41 -14
  29. package/board/client/usage-line.tsx +51 -0
  30. package/board/client/wait-line.tsx +39 -0
  31. package/board/index.server.ts +7 -1
  32. package/board/package.json +1 -1
  33. package/board/server/board-panel-state-helpers.ts +67 -0
  34. package/board/server/board-server-check.ts +313 -0
  35. package/board/server/board-server-engine.ts +129 -0
  36. package/board/server/board-server-events.ts +134 -0
  37. package/board/server/board-server-follow.ts +143 -0
  38. package/board/server/board-server-read.ts +217 -0
  39. package/board/server/board-server-resume.ts +164 -0
  40. package/board/server/board-server-start.ts +175 -0
  41. package/board/server/board-server-store.ts +305 -0
  42. package/board/server/board-server-types.ts +122 -0
  43. package/board/server/board-server-util.ts +4 -0
  44. package/board/server/board-server.ts +61 -1125
  45. package/board/server/board-vocabulary-engine.ts +144 -0
  46. package/board/server/board-vocabulary-review.ts +115 -0
  47. package/board/server/board-vocabulary-run.ts +149 -0
  48. package/board/server/board-vocabulary-shapes.ts +153 -0
  49. package/board/server/board-vocabulary.ts +21 -389
  50. package/board/server/current-step-panel-helpers.ts +108 -0
  51. package/board/server/describe-record.ts +406 -0
  52. package/board/server/engine-restart-helpers.ts +105 -0
  53. package/board/server/engine-watch.ts +33 -2
  54. package/board/server/journal-rebuild-helpers.ts +169 -0
  55. package/board/server/live-file.ts +130 -0
  56. package/board/server/luca-version.ts +1 -1
  57. package/board/server/make-rows.ts +14 -635
  58. package/board/server/record-texts.ts +350 -0
  59. package/board/server/reduce-board-agent-start.ts +224 -0
  60. package/board/server/reduce-board-agents.ts +160 -0
  61. package/board/server/reduce-board-counters.ts +138 -0
  62. package/board/server/reduce-board-create.ts +149 -0
  63. package/board/server/reduce-board-final-review.ts +174 -0
  64. package/board/server/reduce-board-needs-you.ts +283 -0
  65. package/board/server/reduce-board-reasons.ts +59 -0
  66. package/board/server/reduce-board-run.ts +277 -0
  67. package/board/server/reduce-board-settle.ts +91 -0
  68. package/board/server/reduce-board-steps.ts +226 -0
  69. package/board/server/reduce-board-text.ts +139 -0
  70. package/board/server/reduce-board-ticket-checks.ts +168 -0
  71. package/board/server/reduce-board-ticket-join.ts +144 -0
  72. package/board/server/reduce-board-ticket-start.ts +132 -0
  73. package/board/server/reduce-board-update.ts +117 -0
  74. package/board/server/reduce-board-usage.ts +247 -0
  75. package/board/server/reduce-board.ts +100 -1945
  76. package/board/server/reply-post.ts +407 -0
  77. package/board/server/repo-match.ts +74 -0
  78. package/board/server/run-registry.ts +12 -4
  79. package/board/server/ticket-stages-panel-helpers.ts +296 -0
  80. package/board/shared/board-rows.ts +9 -0
  81. package/board/shared/board-rpc.ts +42 -0
  82. package/board/shared/board-state-counts.ts +77 -0
  83. package/board/shared/board-state-live.ts +99 -0
  84. package/board/shared/board-state-review.ts +59 -0
  85. package/board/shared/board-state-run.ts +237 -0
  86. package/board/shared/board-state-ticket.ts +257 -0
  87. package/board/shared/board-state-usage.ts +107 -0
  88. package/board/shared/board-state.ts +102 -566
  89. package/board/shared/reply-actions.ts +207 -0
  90. package/engine/agents/agent-launcher.ts +42 -5
  91. package/engine/agents/claude-launcher-helpers.ts +238 -0
  92. package/engine/agents/claude-launcher.ts +27 -677
  93. package/engine/agents/claude-messages.ts +214 -0
  94. package/engine/agents/claude-options.ts +52 -23
  95. package/engine/agents/common-instructions.ts +140 -0
  96. package/engine/agents/input-channel.ts +36 -0
  97. package/engine/agents/launch-paths.ts +69 -0
  98. package/engine/agents/launch-session.ts +234 -0
  99. package/engine/agents/learner-instructions.ts +31 -0
  100. package/engine/agents/open-session.ts +210 -0
  101. package/engine/agents/prompt-sections.ts +95 -0
  102. package/engine/agents/refactor-update-prompts.ts +62 -0
  103. package/engine/agents/rejoin-prompts.ts +135 -0
  104. package/engine/agents/reviewer-instructions.ts +99 -0
  105. package/engine/agents/role-effort.ts +55 -0
  106. package/engine/agents/role-instructions.ts +31 -253
  107. package/engine/agents/role-prompts.ts +38 -172
  108. package/engine/agents/role-results.ts +106 -7
  109. package/engine/agents/role-turns.ts +23 -0
  110. package/engine/agents/scripted-launcher.ts +39 -6
  111. package/engine/agents/session-pool.ts +125 -0
  112. package/engine/agents/turn-progress.ts +283 -0
  113. package/engine/agents/writer-instructions.ts +164 -0
  114. package/engine/board/board-sync.ts +7 -3
  115. package/engine/cli/computer-adapters-real.ts +15 -3
  116. package/engine/cli/computer-adapters.ts +2 -0
  117. package/engine/cli/computer-checks.ts +87 -4
  118. package/engine/cli/config-reload-text.ts +39 -0
  119. package/engine/cli/decision-model-setup.ts +70 -0
  120. package/engine/cli/doctor-command.ts +1 -0
  121. package/engine/cli/doctor.ts +21 -3
  122. package/engine/cli/going-runs.ts +13 -3
  123. package/engine/cli/init-command.ts +1 -0
  124. package/engine/cli/init.ts +23 -1
  125. package/engine/cli/live-runs.ts +120 -6
  126. package/engine/cli/luca-run.ts +53 -8
  127. package/engine/cli/luca-skills.ts +183 -0
  128. package/engine/cli/luca.ts +8 -1
  129. package/engine/cli/models-command.ts +119 -0
  130. package/engine/cli/read-run.ts +81 -0
  131. package/engine/cli/run-args.ts +33 -6
  132. package/engine/cli/run-demo.ts +143 -0
  133. package/engine/cli/run-end.ts +184 -0
  134. package/engine/cli/run-modes-helpers.ts +81 -0
  135. package/engine/cli/run-modes.ts +62 -482
  136. package/engine/cli/setup-config.ts +215 -0
  137. package/engine/cli/setup-junit-check.ts +134 -0
  138. package/engine/cli/setup-repo-checks.ts +263 -0
  139. package/engine/cli/setup.ts +21 -481
  140. package/engine/cli/unfinished-runs.ts +122 -0
  141. package/engine/cli/upgrade-command.ts +208 -29
  142. package/engine/cli/upgrade-finish.ts +149 -0
  143. package/engine/cli/upgrade.ts +87 -68
  144. package/engine/config/config-fields.ts +128 -0
  145. package/engine/config/config-reload.ts +250 -0
  146. package/engine/config/engine-config-schema.ts +349 -0
  147. package/engine/config/engine-config.ts +80 -168
  148. package/engine/config/test-commands.ts +189 -0
  149. package/engine/core/agent-guards-helpers.ts +84 -0
  150. package/engine/core/agent-turn.ts +442 -0
  151. package/engine/core/already-done.ts +3 -1
  152. package/engine/core/build-action.ts +231 -0
  153. package/engine/core/build-context.ts +135 -0
  154. package/engine/core/build-launch.ts +279 -0
  155. package/engine/core/commit-in.ts +282 -0
  156. package/engine/core/decide-build-early.ts +108 -0
  157. package/engine/core/decide-build-ending.ts +145 -0
  158. package/engine/core/decide-build-helpers.ts +87 -0
  159. package/engine/core/decide-build-tickets.ts +207 -0
  160. package/engine/core/decide-build-view.ts +103 -0
  161. package/engine/core/decide-build.ts +91 -1552
  162. package/engine/core/decide-final-fix.ts +210 -0
  163. package/engine/core/decide-final-review.ts +85 -319
  164. package/engine/core/decide-red-green.ts +400 -0
  165. package/engine/core/decide-refactor-update.ts +109 -0
  166. package/engine/core/decide-rejoin.ts +259 -0
  167. package/engine/core/decide-repo-wait.ts +129 -0
  168. package/engine/core/decide-run-budget.ts +86 -12
  169. package/engine/core/decide-stuck-helpers.ts +127 -0
  170. package/engine/core/decide-stuck.ts +60 -8
  171. package/engine/core/decide-ticket-review.ts +95 -0
  172. package/engine/core/decide-ticket.ts +267 -0
  173. package/engine/core/decide-waits.ts +47 -0
  174. package/engine/core/decide.ts +74 -23
  175. package/engine/core/engine-chores.ts +163 -0
  176. package/engine/core/environment-rerun.ts +83 -0
  177. package/engine/core/evidence-text.ts +94 -0
  178. package/engine/core/execute-action.ts +304 -0
  179. package/engine/core/execute-already-done-check.ts +176 -0
  180. package/engine/core/execute-build.ts +78 -1161
  181. package/engine/core/execute-changeset.ts +6 -8
  182. package/engine/core/execute-final-review.ts +137 -14
  183. package/engine/core/execute-gates.ts +182 -0
  184. package/engine/core/execute-intake.ts +165 -0
  185. package/engine/core/execute-join.ts +276 -0
  186. package/engine/core/execute-memory.ts +24 -0
  187. package/engine/core/execute-pull-request.ts +92 -0
  188. package/engine/core/execute-red-check.ts +257 -0
  189. package/engine/core/execute-refactor-update.ts +107 -0
  190. package/engine/core/execute-repo-wait.ts +129 -0
  191. package/engine/core/execute-stuck.ts +25 -10
  192. package/engine/core/execute-waits.ts +158 -0
  193. package/engine/core/execute-with-jev.ts +118 -0
  194. package/engine/core/execute.ts +148 -833
  195. package/engine/core/final-failure-cap.ts +42 -0
  196. package/engine/core/final-review-action.ts +134 -0
  197. package/engine/core/final-review-text.ts +83 -19
  198. package/engine/core/final-stuck-text.ts +86 -0
  199. package/engine/core/fix-loop-text.ts +13 -2
  200. package/engine/core/left-out.ts +120 -0
  201. package/engine/core/live-file.ts +372 -0
  202. package/engine/core/loop-caps.ts +17 -2
  203. package/engine/core/network-wait.ts +88 -0
  204. package/engine/core/not-in-run.ts +7 -3
  205. package/engine/core/pull-request-text.ts +261 -8
  206. package/engine/core/repo-wait-text.ts +81 -0
  207. package/engine/core/review-text.ts +55 -1
  208. package/engine/core/run-crash-recovery-helpers.ts +16 -0
  209. package/engine/core/run-session-close-helpers.ts +96 -0
  210. package/engine/core/run-start.ts +148 -0
  211. package/engine/core/run-stuck-text.ts +86 -0
  212. package/engine/core/schedule-rules.ts +193 -0
  213. package/engine/core/session-close.ts +10 -2
  214. package/engine/core/stuck-detail-text.ts +89 -0
  215. package/engine/core/stuck-format.ts +34 -0
  216. package/engine/core/stuck-text.ts +29 -360
  217. package/engine/core/ticket-stuck-text.ts +192 -0
  218. package/engine/core/worktree-changes.ts +106 -0
  219. package/engine/gates/case-test-runner.ts +70 -0
  220. package/engine/gates/feature-map.ts +96 -0
  221. package/engine/gates/gate-runner.ts +143 -119
  222. package/engine/gates/gate-schemas.ts +69 -2
  223. package/engine/gates/junit-runner.ts +152 -0
  224. package/engine/gates/leftover-scan.ts +154 -31
  225. package/engine/gates/new-tests.ts +64 -0
  226. package/engine/gates/own-files-check.ts +96 -0
  227. package/engine/gates/own-slow-check.ts +147 -0
  228. package/engine/gates/prepare-check.ts +60 -0
  229. package/engine/gates/prepare-slots.ts +48 -11
  230. package/engine/gates/red-check.ts +298 -15
  231. package/engine/gates/shell-check.ts +64 -0
  232. package/engine/gates/slot-waits.ts +55 -0
  233. package/engine/gates/slow-test-runner.ts +61 -0
  234. package/engine/gates/swift-test-index.ts +121 -0
  235. package/engine/gates/swift-test-names.ts +128 -0
  236. package/engine/gates/test-checks.ts +182 -0
  237. package/engine/gates/test-runner.ts +179 -36
  238. package/engine/gates/test-slots.ts +48 -0
  239. package/engine/git/git-adapter.ts +44 -414
  240. package/engine/git/git-commits.ts +132 -0
  241. package/engine/git/git-join.ts +139 -0
  242. package/engine/git/git-read.ts +138 -0
  243. package/engine/git/git-run.ts +32 -0
  244. package/engine/git/git-worktrees.ts +143 -0
  245. package/engine/guards/after-turn-check.ts +31 -5
  246. package/engine/guards/guard-hook.ts +60 -12
  247. package/engine/guards/guard-roles.ts +68 -0
  248. package/engine/guards/helper-rules.ts +98 -0
  249. package/engine/guards/permission-rules.ts +163 -0
  250. package/engine/guards/role-rules-helpers.ts +48 -0
  251. package/engine/guards/role-rules.ts +34 -606
  252. package/engine/guards/sandbox-settings.ts +22 -2
  253. package/engine/guards/shell-rules.ts +345 -0
  254. package/engine/guards/worktree-git.ts +208 -0
  255. package/engine/guards/worktree-snapshot.ts +412 -0
  256. package/engine/guards/worktree-state.ts +28 -825
  257. package/engine/guards/worktree-undo.ts +260 -0
  258. package/engine/guards/write-rules.ts +149 -0
  259. package/engine/index.ts +35 -18
  260. package/engine/intake/criteria-checks.ts +114 -0
  261. package/engine/intake/intake-checks.ts +168 -27
  262. package/engine/intake/intake-schemas.ts +47 -3
  263. package/engine/jev/clef-client.ts +259 -0
  264. package/engine/jev/decision-model-credentials.ts +212 -0
  265. package/engine/jev/jev-jobs.ts +191 -60
  266. package/engine/jev/jev-schemas.ts +88 -5
  267. package/engine/jev/jev-shadow-helpers.ts +218 -0
  268. package/engine/jev/jev-shadow.ts +109 -64
  269. package/engine/jev/model-pick.ts +373 -0
  270. package/engine/journal/agent-entries.ts +174 -0
  271. package/engine/journal/agent-message-entries.ts +72 -0
  272. package/engine/journal/agent-turn-replay.ts +203 -0
  273. package/engine/journal/already-done-entries.ts +55 -0
  274. package/engine/journal/commit-entries.ts +56 -0
  275. package/engine/journal/cross-ticket-replay.ts +222 -0
  276. package/engine/journal/decision-model-entries.ts +86 -0
  277. package/engine/journal/entry-fields.ts +10 -0
  278. package/engine/journal/final-review-entries.ts +128 -0
  279. package/engine/journal/final-review-replay.ts +343 -0
  280. package/engine/journal/final-review-round.ts +382 -0
  281. package/engine/journal/final-review-state.ts +193 -0
  282. package/engine/journal/gate-entries.ts +81 -0
  283. package/engine/journal/intake-entries.ts +87 -0
  284. package/engine/journal/join-entries.ts +126 -0
  285. package/engine/journal/journal-entry-schema.ts +230 -0
  286. package/engine/journal/journal-kinds.ts +101 -0
  287. package/engine/journal/journal-record-schema.ts +230 -0
  288. package/engine/journal/journal-record.ts +43 -1470
  289. package/engine/journal/journal.ts +6 -1
  290. package/engine/journal/limit-entries.ts +90 -0
  291. package/engine/journal/memory-entries.ts +124 -0
  292. package/engine/journal/memory-replay.ts +157 -0
  293. package/engine/journal/network-wait-entries.ts +29 -0
  294. package/engine/journal/plan-replay.ts +139 -0
  295. package/engine/journal/pull-request-entries.ts +41 -0
  296. package/engine/journal/refactor-update-entries.ts +45 -0
  297. package/engine/journal/replay.ts +161 -2252
  298. package/engine/journal/reply-replay.ts +144 -0
  299. package/engine/journal/repo-wait-entries.ts +53 -0
  300. package/engine/journal/run-entries.ts +172 -0
  301. package/engine/journal/run-state.ts +264 -0
  302. package/engine/journal/shared-failure-replay.ts +133 -0
  303. package/engine/journal/stuck-entries.ts +193 -0
  304. package/engine/journal/ticket-progress.ts +424 -0
  305. package/engine/journal/ticket-replay.ts +431 -0
  306. package/engine/journal/ticket-result-replay.ts +399 -0
  307. package/engine/journal/ticket-retry-replay.ts +145 -0
  308. package/engine/journal/worktree-entries.ts +122 -0
  309. package/engine/models/model-score-facts.ts +294 -0
  310. package/engine/models/model-score-rules.ts +35 -0
  311. package/engine/models/model-score-sides.ts +80 -0
  312. package/engine/models/model-score.ts +493 -0
  313. package/engine/shell/run-command.ts +187 -18
  314. package/engine/testing/agent-turn-fixtures.ts +287 -0
  315. package/engine/testing/already-done-fixtures.ts +97 -0
  316. package/engine/testing/build-fixtures.ts +68 -1028
  317. package/engine/testing/checkouts-fixtures.ts +48 -0
  318. package/engine/testing/effort-pick-fixtures.ts +138 -0
  319. package/engine/testing/final-review-fixtures.ts +62 -1
  320. package/engine/testing/final-review-steps.ts +143 -0
  321. package/engine/testing/limit-fixtures.ts +85 -0
  322. package/engine/testing/live-file-fixtures.ts +57 -0
  323. package/engine/testing/model-score-fixtures.ts +329 -0
  324. package/engine/testing/practice-repo.ts +10 -4
  325. package/engine/testing/practice-run.ts +1 -1
  326. package/engine/testing/reply-fixtures.ts +88 -0
  327. package/engine/testing/run-budget-fixtures.ts +165 -0
  328. package/engine/testing/run-fixtures.ts +219 -0
  329. package/engine/testing/sdk-play.ts +177 -0
  330. package/engine/testing/setup-repo.ts +194 -0
  331. package/engine/testing/step-record-fixtures.ts +55 -0
  332. package/engine/testing/swift-junit-fixtures.ts +93 -0
  333. package/engine/testing/ticket-step-fixtures.ts +272 -0
  334. package/engine/testing/wait-scenarios.ts +186 -0
  335. package/engine/tracker/gh-retry.ts +250 -0
  336. package/engine/tracker/github-tracker.ts +310 -90
  337. package/engine/tracker/in-memory-tracker.ts +8 -4
  338. package/engine/tracker/tracker.ts +160 -6
  339. package/package.json +2 -1
  340. package/skills/luca-retro/SKILL.md +74 -0
  341. package/skills/luca-retro/scripts/retro-summary.ts +1356 -0
  342. package/skills/luca-spec-check/SKILL.md +86 -0
  343. package/skills/luca-spec-check/scripts/spec-bundle.ts +194 -0
  344. package/skills/luca-unstick/SKILL.md +153 -0
  345. package/skills/luca-unstick/scripts/stuck-summary.ts +1063 -0
  346. package/engine/jev/jev-client.ts +0 -173
package/CHANGELOG.md CHANGED
@@ -1,5 +1,119 @@
1
1
  # @alecsibilia/luca
2
2
 
3
+ ## 14.0.0-alpha.31
4
+
5
+ No changes in this release.
6
+
7
+ ## 14.0.0-alpha.30
8
+
9
+ No changes in this release.
10
+
11
+ ## 14.0.0-alpha.29
12
+
13
+ No changes in this release.
14
+
15
+ ## 14.0.0-alpha.28
16
+
17
+ No changes in this release.
18
+
19
+ ## 14.0.0-alpha.27
20
+
21
+ No changes in this release.
22
+
23
+ ## 14.0.0-alpha.26
24
+
25
+ ### Patch Changes
26
+
27
+ - 075d3a4: Spec: /luca-spec-check, a cold read of a spec by three fresh readers before ready-for-agent ([#678](https://github.com/asibilia/luca-framework/issues/678))
28
+
29
+ ## 14.0.0-alpha.25
30
+
31
+ No changes in this release.
32
+
33
+ ## 14.0.0-alpha.24
34
+
35
+ No changes in this release.
36
+
37
+ ## 14.0.0-alpha.23
38
+
39
+ No changes in this release.
40
+
41
+ ## 14.0.0-alpha.22
42
+
43
+ No changes in this release.
44
+
45
+ ## 14.0.0-alpha.21
46
+
47
+ No changes in this release.
48
+
49
+ ## 14.0.0-alpha.20
50
+
51
+ No changes in this release.
52
+
53
+ ## 14.0.0-alpha.19
54
+
55
+ No changes in this release.
56
+
57
+ ## 14.0.0-alpha.18
58
+
59
+ No changes in this release.
60
+
61
+ ## 14.0.0-alpha.17
62
+
63
+ No changes in this release.
64
+
65
+ ## 14.0.0-alpha.16
66
+
67
+ No changes in this release.
68
+
69
+ ## 14.0.0-alpha.15
70
+
71
+ No changes in this release.
72
+
73
+ ## 14.0.0-alpha.14
74
+
75
+ No changes in this release.
76
+
77
+ ## 14.0.0-alpha.13
78
+
79
+ No changes in this release.
80
+
81
+ ## 14.0.0-alpha.12
82
+
83
+ No changes in this release.
84
+
85
+ ## 14.0.0-alpha.11
86
+
87
+ No changes in this release.
88
+
89
+ ## 14.0.0-alpha.10
90
+
91
+ No changes in this release.
92
+
93
+ ## 14.0.0-alpha.9
94
+
95
+ No changes in this release.
96
+
97
+ ## 14.0.0-alpha.8
98
+
99
+ No changes in this release.
100
+
101
+ ## 14.0.0-alpha.7
102
+
103
+ No changes in this release.
104
+
105
+ ## 14.0.0-alpha.6
106
+
107
+ No changes in this release.
108
+
109
+ ## 14.0.0-alpha.5
110
+
111
+ No changes in this release.
112
+
113
+ ## 14.0.0-alpha.4
114
+
115
+ No changes in this release.
116
+
3
117
  ## 14.0.0-alpha.3
4
118
 
5
119
  No changes in this release.
package/README.md CHANGED
@@ -35,17 +35,21 @@ This is Luca v14, in alpha. Old Luca (v13) is still on npm; see [Coming from v13
35
35
  3. Check what `luca setup` wrote to `.luca/config.json`. It names your repo's GitHub name (like `tmnb`) as its memory vault in `muninn.vault`; change it if you want another.
36
36
 
37
37
  4. In Claude Code, in your repo, run `/setup-matt-pocock-skills` so the planning skills know your repo.
38
- 5. Write a spec with `/to-spec`, then split it into tickets with `/to-tickets`.
38
+ 5. Write a spec with `/to-spec`, then split it into tickets with `/to-tickets`. Before you add `ready-for-agent`, type `/luca-spec-check <spec number>` in Claude Code: three fresh readers give the spec a cold read and list what an agent would have to guess.
39
39
  6. In a Paseo chat, type `/luca-run <spec number>`. The board shows the run in the side panel, and the run ends in one pull request.
40
40
 
41
+ If a ticket gets stuck, Luca comments on the spec and waits for your one-word reply. Type `/luca-unstick` in Claude Code or a Paseo chat, in the repo: it reads why, says what to do, and posts the reply once you say yes.
42
+
43
+ After a run, type `/luca-retro` the same way to look back on it: it reads the run's journal, ranks what went wrong, and suggests a check, a rule, or a deletion for each, not a code change. It opens an issue for each one you pick, once you say yes.
44
+
41
45
  ## Commands
42
46
 
43
47
  | Command | What it does |
44
48
  | ------- | ------------ |
45
- | `luca init` | Sets up this computer, once (safe to run again): MuninnDB and its Claude Code entry, the board in Paseo with its engine and Bun paths, and the planning skills (`to-spec`, `to-tickets`, `setup-matt-pocock-skills`, `grilling`, `domain-modeling`). It asks before turning on Paseo's plugins, and leaves skills you already have alone. `--skip-skills` skips the skills. Inside a git repo, it then runs `luca setup` for that repo. |
49
+ | `luca init` | Sets up this computer, once (safe to run again): MuninnDB and its Claude Code entry, the board in Paseo with its engine and Bun paths, the planning skills (`to-spec`, `to-tickets`, `setup-matt-pocock-skills`, `grilling`, `domain-modeling`), and Luca's own `/luca-unstick`, `/luca-retro` and `/luca-spec-check` skills. It asks before turning on Paseo's plugins, and leaves skills you already have alone (it only replaces its own). `--skip-skills` skips the planning skills. Inside a git repo, it then runs `luca setup` for that repo. |
46
50
  | `luca setup` | Gets the repo in this folder ready: the labels a run needs (and the `release:*` labels when the repo uses changesets), `.luca/config.json` (a new one gets the repo's GitHub name as its vault; an existing vault is kept), and a check of GitHub sub-issues and dependencies. `--base <branch>` names the base branch. |
47
51
  | `luca doctor` | Checks this computer, this repo when you're in one, and what v13 left behind. Each problem comes with its exact fix. `luca doctor --fix` fixes what's safe without asking: it never deletes (v13 files go to a dated backup folder) and never commits, and it lists the repo files to commit. |
48
- | `luca upgrade` | Moves to the newest Luca on your channel: `alpha` stays on `alpha`, and it never goes back to v13. It refuses while any run is going (stuck runs and limit waits count) and lists them. A run that crashed, with no engine running it, doesn't stop it: upgrade says how to resume it on the new version. Then it reloads the board and says when to run `/reload-skills`. |
52
+ | `luca upgrade` | Moves to the newest Luca on your channel: `alpha` stays on `alpha`, and it never goes back to v13. It refuses while any run is going (stuck runs and limit waits count) and lists them. A run that crashed, with no engine running it, doesn't stop it: upgrade says how to resume it on the new version. Then the version it just installed finishes the job with its own code: it reloads the board, copies its skills (every one it ships, new ones included), and says when to run `/reload-skills`. |
49
53
  | `luca upgrade --to <version>` | Installs that exact version, an older one too, to go back when a version breaks. |
50
54
 
51
55
  `init`, `setup`, and `upgrade` end with their part of `luca doctor`'s checks.
@@ -88,6 +92,7 @@ This is the one package that goes to npm. It's TypeScript source with no build a
88
92
  | ------ | ---------- |
89
93
  | `engine/` | The engine's source, from [`packages/engine/src`](../engine/src). Both bins point into it. |
90
94
  | `board/` | The board plugin's folder, from [`packages/board`](../board): `paseo-plugin.json`, its entry points, its client, server, and shared code, and its own `package.json`, so Paseo can install it as a folder source. |
95
+ | `skills/` | Luca's own Claude Code skills, `luca-unstick`, `luca-retro` and `luca-spec-check`, from [`packages/engine/skills`](../engine/skills). `luca init` and `luca upgrade` copy every folder in it with a `SKILL.md` to `~/.claude/skills`. |
91
96
  | `LICENSE` | The repo's license. |
92
97
 
93
98
  Test files and test helpers stay out. The engine and the board stay private workspace packages, and this package lists every package they import at runtime as its own dependency.
@@ -13,7 +13,8 @@ import type {
13
13
 
14
14
  /**
15
15
  * Colors and words shared by the side panel and the chat rows, so both views
16
- * match. Every color comes from the host theme.
16
+ * match. Every color comes from the host theme, except the models' own
17
+ * (`MODEL_COLORS`).
17
18
  */
18
19
 
19
20
  export const MONO = Platform.select({ ios: 'Menlo', default: 'monospace' })
@@ -73,7 +74,11 @@ export const stageColor = ({
73
74
  switch (stage) {
74
75
  case 'building':
75
76
  case 'reviewing':
77
+ case 'testing':
78
+ case 'joining':
76
79
  return theme.colors.accent
80
+ case 'fixing':
81
+ return theme.colors.statusWarning
77
82
  case 'stuck':
78
83
  return theme.colors.statusDanger
79
84
  case 'done':
@@ -139,6 +144,7 @@ export const statusColor = ({
139
144
  return theme.colors.statusDanger
140
145
  case 'limit_wait':
141
146
  case 'usage_line_wait':
147
+ case 'network_wait':
142
148
  return theme.colors.statusWarning
143
149
  case 'starting':
144
150
  case 'intake':
@@ -150,6 +156,31 @@ export const statusColor = ({
150
156
  }
151
157
  }
152
158
 
159
+ /**
160
+ * The models' colors (#630): Opus purple, Sonnet orange, Haiku blue, and
161
+ * Clef (the decision model) green. Fixed hues that read on light and dark
162
+ * themes alike: the one exception to "every color from the host theme".
163
+ */
164
+ export const MODEL_COLORS: ReadonlyMap<string, string> = new Map([
165
+ ['opus', '#a371f7'],
166
+ ['sonnet', '#e8833a'],
167
+ ['haiku', '#3b9fe8'],
168
+ ['clef', '#3fb950'],
169
+ ])
170
+
171
+ /** Clef's confidence bar: green when sharp, orange when split. */
172
+ export const CONFIDENCE_COLORS = { sharp: '#3fb950', split: '#e3a23b' }
173
+
174
+ /** A model's color; the engine, or a model the board doesn't know, is muted. */
175
+ export const modelColor = ({
176
+ model,
177
+ theme,
178
+ }: {
179
+ model: string
180
+ theme: PluginTheme
181
+ }): string =>
182
+ MODEL_COLORS.get(model.toLowerCase()) ?? theme.colors.foregroundMuted
183
+
153
184
  /** A run status in words. */
154
185
  export const statusText = ({ status }: { status: RunStatus }): string => {
155
186
  switch (status) {
@@ -165,6 +196,8 @@ export const statusText = ({ status }: { status: RunStatus }): string => {
165
196
  return 'limit wait'
166
197
  case 'usage_line_wait':
167
198
  return 'paused at the usage line'
199
+ case 'network_wait':
200
+ return 'Waiting for GitHub to be reachable'
168
201
  case 'done':
169
202
  return 'done'
170
203
  case 'refused':
@@ -0,0 +1,150 @@
1
+ /**
2
+ * The small pieces the panel's sections share: a fix-loop counter, a running
3
+ * step with its time, a stage header, a banner, and a section.
4
+ */
5
+ import type { ReactNode } from 'react'
6
+
7
+ import { Icon } from '@getpaseo/plugin/client/react-native'
8
+ import { Pressable, Text, View } from 'react-native'
9
+
10
+ import { useNow } from './board-look'
11
+ import type { Look, Styles } from './board-panel-styles'
12
+ import { CutLine, useCloseBubble } from './one-line'
13
+
14
+ import {
15
+ LOOP_CAP,
16
+ currentStepText,
17
+ type CurrentStep,
18
+ } from '../shared/board-state'
19
+
20
+ export const Counter = ({
21
+ label,
22
+ value,
23
+ theme,
24
+ styles,
25
+ }: { label: string; value: number } & Look) => {
26
+ const color =
27
+ value >= LOOP_CAP
28
+ ? theme.colors.statusDanger
29
+ : value > 0
30
+ ? theme.colors.statusWarning
31
+ : theme.colors.foregroundMuted
32
+ return (
33
+ <Text
34
+ style={[styles.counter, { color, borderColor: color }]}
35
+ numberOfLines={1}
36
+ >
37
+ {label} {value}/{LOOP_CAP}
38
+ </Text>
39
+ )
40
+ }
41
+
42
+ /** A running step with its time, counting up by itself, on one line. */
43
+ export const StepLine = ({
44
+ step,
45
+ prefix,
46
+ at = null,
47
+ styles,
48
+ }: {
49
+ step: CurrentStep
50
+ prefix: string
51
+ /** A stopped clock (#635), in ms, in place of the ticking one. */
52
+ at?: number | null
53
+ styles: Styles
54
+ }) => {
55
+ const ticking = useNow()
56
+ const now = at ?? ticking
57
+ return (
58
+ <CutLine
59
+ text={`${prefix}${currentStepText({ step, now })}`}
60
+ style={styles.muted}
61
+ styles={styles}
62
+ />
63
+ )
64
+ }
65
+
66
+ export const StageHeader = ({
67
+ title,
68
+ hint,
69
+ icon,
70
+ count,
71
+ color,
72
+ folded,
73
+ onPress,
74
+ theme,
75
+ styles,
76
+ }: {
77
+ title: string
78
+ hint: string
79
+ icon: string
80
+ count: number
81
+ color: string
82
+ folded: boolean | null
83
+ onPress: (() => void) | null
84
+ } & Look) => {
85
+ const closeBubble = useCloseBubble()
86
+ const empty = count === 0
87
+ const tint = empty ? theme.colors.foregroundMuted : color
88
+ const content = (
89
+ <>
90
+ <Icon name={icon} size={13} color={tint} />
91
+ <Text style={[styles.stageTitle, { color: tint }]}>
92
+ {title.toUpperCase()}
93
+ </Text>
94
+ <Text style={styles.stageCount}>{count}</Text>
95
+ {empty || hint === '' ? null : (
96
+ <Text style={styles.stageHint} numberOfLines={1}>
97
+ {hint}
98
+ </Text>
99
+ )}
100
+ <View style={styles.spacer} />
101
+ {folded === null || empty ? null : (
102
+ <Icon
103
+ name={folded ? 'ChevronRight' : 'ChevronDown'}
104
+ size={13}
105
+ color={theme.colors.foregroundMuted}
106
+ />
107
+ )}
108
+ </>
109
+ )
110
+ const style = [styles.stageHeader, empty ? styles.stageHeaderThin : null]
111
+ if (!onPress || empty) return <View style={style}>{content}</View>
112
+ return (
113
+ <Pressable
114
+ accessibilityRole="button"
115
+ accessibilityLabel={`${title}, ${count}. ${folded ? 'Open' : 'Fold'} this stage`}
116
+ onPress={() => {
117
+ closeBubble()
118
+ onPress()
119
+ }}
120
+ style={style}
121
+ >
122
+ {content}
123
+ </Pressable>
124
+ )
125
+ }
126
+
127
+ export const Banner = ({
128
+ icon,
129
+ color,
130
+ children,
131
+ styles,
132
+ }: {
133
+ icon: string
134
+ color: string
135
+ children: ReactNode
136
+ styles: Styles
137
+ }) => (
138
+ <View style={[styles.banner, { borderColor: color }]}>
139
+ <Icon name={icon} size={13} color={color} />
140
+ <Text style={[styles.bannerText, { color }]}>{children}</Text>
141
+ </View>
142
+ )
143
+
144
+ export const Section = ({
145
+ children,
146
+ styles,
147
+ }: {
148
+ children: ReactNode
149
+ styles: Styles
150
+ }) => <View style={styles.block}>{children}</View>
@@ -0,0 +1,99 @@
1
+ /**
2
+ * The stages the panel stacks tickets and lenses in, and the keys of the
3
+ * cards and stages a person opens or folds.
4
+ */
5
+ import type { LensState, TicketStage } from '../shared/board-state'
6
+
7
+ type StackStage = Exclude<TicketStage, 'stuck'>
8
+
9
+ export const TICKET_STAGES: {
10
+ stage: StackStage
11
+ title: string
12
+ hint: string
13
+ icon: string
14
+ folded: boolean
15
+ }[] = [
16
+ {
17
+ stage: 'blocked',
18
+ title: 'Blocked',
19
+ hint: "waits on a ticket that isn't done",
20
+ icon: 'Lock',
21
+ folded: false,
22
+ },
23
+ {
24
+ stage: 'building',
25
+ title: 'Building',
26
+ hint: 'the first tests and code',
27
+ icon: 'Hammer',
28
+ folded: false,
29
+ },
30
+ {
31
+ stage: 'reviewing',
32
+ title: 'Reviewing',
33
+ hint: 'a reviewer reads the ticket',
34
+ icon: 'ScanSearch',
35
+ folded: false,
36
+ },
37
+ {
38
+ stage: 'testing',
39
+ title: 'Testing',
40
+ hint: 'the red check or the checks running',
41
+ icon: 'FlaskConical',
42
+ folded: false,
43
+ },
44
+ {
45
+ stage: 'fixing',
46
+ title: 'Fixing',
47
+ hint: 'a fix round after the checks, a review or a join',
48
+ icon: 'Wrench',
49
+ folded: false,
50
+ },
51
+ {
52
+ stage: 'joining',
53
+ title: 'Joining',
54
+ hint: 'joining the run branch and its checks there',
55
+ icon: 'GitMerge',
56
+ folded: false,
57
+ },
58
+ {
59
+ stage: 'done',
60
+ title: 'Done',
61
+ hint: 'joined the run branch',
62
+ icon: 'CircleCheck',
63
+ folded: true,
64
+ },
65
+ {
66
+ stage: 'skipped',
67
+ title: 'Skipped',
68
+ hint: 'left out of this run, stays open',
69
+ icon: 'SkipForward',
70
+ folded: true,
71
+ },
72
+ ]
73
+
74
+ export const LENS_STAGES: { stage: LensState; title: string; icon: string }[] =
75
+ [
76
+ { stage: 'waiting', title: 'Waiting', icon: 'Clock' },
77
+ { stage: 'reviewing', title: 'Reviewing', icon: 'ScanSearch' },
78
+ { stage: 'fixing', title: 'Fixing', icon: 'Wrench' },
79
+ { stage: 'clean', title: 'Clean', icon: 'CircleCheck' },
80
+ ]
81
+
82
+ /** A card or stage key. */
83
+ export type Key = string
84
+
85
+ /** The key of the fold for tickets left out for a person (#499). */
86
+ export const FOR_A_PERSON: Key = 'for_a_person'
87
+
88
+ export const toggled = ({
89
+ set,
90
+ key,
91
+ }: {
92
+ set: ReadonlySet<Key>
93
+ key: string
94
+ }): Set<Key> => {
95
+ const next = new Set(set)
96
+ if (next.has(key)) next.delete(key)
97
+ else next.add(key)
98
+ return next
99
+ }
@@ -0,0 +1,223 @@
1
+ /**
2
+ * The side panel's styles: one `StyleSheet` made from the host theme, and
3
+ * the `Look` (theme and styles) every piece of the panel takes.
4
+ */
5
+ import type { PluginTheme } from '@getpaseo/plugin'
6
+ import { StyleSheet } from 'react-native'
7
+
8
+ import { DIMMED, MONO } from './board-look'
9
+
10
+ export const makeStyles = ({
11
+ theme,
12
+ compact,
13
+ }: {
14
+ theme: PluginTheme
15
+ compact: boolean
16
+ }) => {
17
+ const { colors } = theme
18
+ return StyleSheet.create({
19
+ screen: { flex: 1, backgroundColor: colors.surface0 },
20
+ content: { padding: compact ? 10 : 16, gap: 8 },
21
+ /** Fills the scroll area, so a tap on its blank part lands too. */
22
+ fill: { flexGrow: 1 },
23
+ /** The cards' scroll area, above the pinned status bar. */
24
+ scroll: { flex: 1 },
25
+ /** The status bar, pinned at the bottom of the panel. */
26
+ statusBar: {
27
+ flexShrink: 0,
28
+ gap: 4,
29
+ borderTopColor: colors.border,
30
+ borderTopWidth: 1,
31
+ backgroundColor: colors.surface1,
32
+ paddingHorizontal: compact ? 10 : 16,
33
+ paddingVertical: 5,
34
+ },
35
+ row: {
36
+ flexDirection: 'row',
37
+ alignItems: 'center',
38
+ flexWrap: 'wrap',
39
+ gap: compact ? 6 : 10,
40
+ },
41
+ /** A row that stays on one line: its cut lines give way. */
42
+ line: {
43
+ flexDirection: 'row',
44
+ alignItems: 'center',
45
+ gap: compact ? 6 : 10,
46
+ },
47
+ /** A part that never shrinks or gets cut: a number, tag or time. */
48
+ fixed: { flexShrink: 0 },
49
+ /** What holds a cut line: it gives way, down to nothing. */
50
+ cut: { flexShrink: 1, minWidth: 0 },
51
+ /** The bubble a tap on a cut line opens, with its full text. */
52
+ bubble: {
53
+ color: colors.foreground,
54
+ backgroundColor: colors.surface2,
55
+ borderColor: colors.border,
56
+ borderWidth: 1,
57
+ borderRadius: 6,
58
+ paddingHorizontal: 8,
59
+ paddingVertical: 5,
60
+ fontSize: 12,
61
+ },
62
+ title: { color: colors.foreground, fontSize: 16, fontWeight: '700' },
63
+ spacer: { flex: 1 },
64
+ text: { color: colors.foreground, fontSize: 13 },
65
+ muted: { color: colors.foregroundMuted, fontSize: 12 },
66
+ mono: { color: colors.foregroundMuted, fontSize: 12, fontFamily: MONO },
67
+ small: { color: colors.foregroundMuted, fontSize: 11 },
68
+ pill: {
69
+ flexShrink: 0,
70
+ borderWidth: 1,
71
+ borderRadius: 999,
72
+ paddingHorizontal: 7,
73
+ paddingVertical: 1,
74
+ fontSize: 11,
75
+ fontWeight: '700',
76
+ },
77
+ chip: {
78
+ borderWidth: 1,
79
+ borderColor: colors.border,
80
+ borderRadius: 6,
81
+ paddingHorizontal: 8,
82
+ paddingVertical: 3,
83
+ },
84
+ chipOn: {
85
+ borderColor: colors.accent,
86
+ backgroundColor: colors.surface2,
87
+ },
88
+ banner: {
89
+ flexDirection: 'row',
90
+ alignItems: 'center',
91
+ gap: 6,
92
+ borderWidth: 1,
93
+ borderRadius: 6,
94
+ paddingHorizontal: 8,
95
+ paddingVertical: 5,
96
+ },
97
+ bannerText: { fontSize: 12, flexShrink: 1 },
98
+ block: { gap: 6 },
99
+ stageHeader: {
100
+ flexDirection: 'row',
101
+ alignItems: 'center',
102
+ gap: 6,
103
+ paddingVertical: 4,
104
+ paddingHorizontal: 6,
105
+ borderRadius: 6,
106
+ },
107
+ stageHeaderThin: { paddingVertical: 1, opacity: DIMMED },
108
+ stageTitle: { fontSize: 12, fontWeight: '700', letterSpacing: 1 },
109
+ stageCount: {
110
+ color: colors.foregroundMuted,
111
+ fontSize: 12,
112
+ fontFamily: MONO,
113
+ },
114
+ stageHint: {
115
+ color: colors.foregroundMuted,
116
+ fontSize: 11,
117
+ flexShrink: 1,
118
+ },
119
+ stageBody: { gap: 6, paddingLeft: compact ? 0 : 8 },
120
+ card: {
121
+ backgroundColor: colors.surface1,
122
+ borderColor: colors.border,
123
+ borderWidth: 1,
124
+ borderRadius: 8,
125
+ paddingHorizontal: compact ? 8 : 10,
126
+ paddingVertical: compact ? 7 : 8,
127
+ gap: 5,
128
+ },
129
+ cardStuck: { borderColor: colors.statusDanger, borderLeftWidth: 4 },
130
+ cardPressed: { backgroundColor: colors.surface2 },
131
+ cardTop: { flexDirection: 'row', alignItems: 'center', gap: 6 },
132
+ number: {
133
+ flexShrink: 0,
134
+ color: colors.foregroundMuted,
135
+ fontSize: 12,
136
+ fontWeight: '700',
137
+ fontFamily: MONO,
138
+ },
139
+ cardTitle: {
140
+ color: colors.foreground,
141
+ fontSize: 13,
142
+ fontWeight: '600',
143
+ flexShrink: 1,
144
+ },
145
+ tag: {
146
+ flexShrink: 0,
147
+ color: colors.foregroundMuted,
148
+ borderColor: colors.border,
149
+ borderWidth: 1,
150
+ borderRadius: 4,
151
+ paddingHorizontal: 4,
152
+ fontSize: 10,
153
+ },
154
+ /** Clef's confidence bar, and its part filled to the confidence. */
155
+ confidence: {
156
+ flexShrink: 0,
157
+ width: 28,
158
+ height: 5,
159
+ borderRadius: 3,
160
+ overflow: 'hidden',
161
+ backgroundColor: colors.surface2,
162
+ },
163
+ confidenceFill: { height: 5 },
164
+ /** A running helper's line (#636), its left edge in its model's colour. */
165
+ helperLine: { borderLeftWidth: 2, paddingLeft: 6 },
166
+ dots: { flexDirection: 'row', alignItems: 'center', flexShrink: 0 },
167
+ dotCell: { flexDirection: 'row', alignItems: 'center' },
168
+ link: { width: compact ? 7 : 10, height: 2 },
169
+ dot: { width: 8, height: 8, borderRadius: 4, borderWidth: 1.5 },
170
+ dotCurrent: { width: 12, height: 12, borderRadius: 6, borderWidth: 2 },
171
+ dotSkip: { borderStyle: 'dashed' },
172
+ stepLabel: { fontSize: 12, fontWeight: '600', marginLeft: 6 },
173
+ /** A waiting card's amber bar, where a heartbeat would be. */
174
+ waitBar: {
175
+ flexShrink: 0,
176
+ width: 28,
177
+ height: 4,
178
+ borderRadius: 2,
179
+ opacity: 0.8,
180
+ },
181
+ /** A busy card's heartbeat, and each of its bars, standing on the bottom. */
182
+ heartbeat: {
183
+ flexDirection: 'row',
184
+ alignItems: 'flex-end',
185
+ flexShrink: 0,
186
+ height: 14,
187
+ gap: 1,
188
+ },
189
+ heartbeatBar: { width: 2, borderRadius: 1 },
190
+ counter: {
191
+ flexShrink: 0,
192
+ borderWidth: 1,
193
+ borderRadius: 5,
194
+ paddingHorizontal: 5,
195
+ fontSize: 11,
196
+ fontFamily: MONO,
197
+ },
198
+ detail: {
199
+ gap: 3,
200
+ borderTopColor: colors.border,
201
+ borderTopWidth: 1,
202
+ paddingTop: 5,
203
+ },
204
+ label: {
205
+ color: colors.foregroundMuted,
206
+ fontSize: 12,
207
+ fontWeight: '700',
208
+ },
209
+ rule: { height: 1, backgroundColor: colors.border, marginVertical: 4 },
210
+ reviewTitle: {
211
+ color: colors.foreground,
212
+ fontSize: 14,
213
+ fontWeight: '700',
214
+ },
215
+ prLink: { color: colors.accent, fontSize: 12 },
216
+ })
217
+ }
218
+
219
+ type MakeStyles = typeof makeStyles
220
+
221
+ export type Styles = ReturnType<MakeStyles>
222
+
223
+ export type Look = { theme: PluginTheme; styles: Styles }