ridgeline 0.9.0 → 0.11.2

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 (318) hide show
  1. package/LICENSE +201 -21
  2. package/README.md +311 -133
  3. package/dist/agents/core/designer.md +38 -0
  4. package/dist/agents/core/direction-advisor.md +129 -0
  5. package/dist/agents/core/plan-reviewer.md +3 -1
  6. package/dist/agents/core/planner.md +22 -0
  7. package/dist/agents/core/retro-refiner.md +54 -0
  8. package/dist/agents/core/reviewer.md +27 -0
  9. package/dist/agents/specialists/design-specialist.md +93 -0
  10. package/dist/agents/specialists/reference-finder.md +70 -0
  11. package/dist/agents/specialists/visual-reviewer.md +103 -0
  12. package/dist/cli.js +168 -25
  13. package/dist/cli.js.map +1 -1
  14. package/dist/commands/auto.d.ts +21 -0
  15. package/dist/commands/auto.js +211 -0
  16. package/dist/commands/auto.js.map +1 -0
  17. package/dist/commands/build.js +3 -3
  18. package/dist/commands/build.js.map +1 -1
  19. package/dist/commands/create.d.ts +13 -2
  20. package/dist/commands/create.js +59 -12
  21. package/dist/commands/create.js.map +1 -1
  22. package/dist/commands/design.d.ts +9 -0
  23. package/dist/commands/design.js +267 -57
  24. package/dist/commands/design.js.map +1 -1
  25. package/dist/commands/directions.d.ts +13 -0
  26. package/dist/commands/directions.js +389 -0
  27. package/dist/commands/directions.js.map +1 -0
  28. package/dist/commands/ingest.d.ts +23 -0
  29. package/dist/commands/ingest.js +109 -0
  30. package/dist/commands/ingest.js.map +1 -0
  31. package/dist/commands/input.d.ts +21 -0
  32. package/dist/commands/input.js +83 -7
  33. package/dist/commands/input.js.map +1 -1
  34. package/dist/commands/qa-workflow.d.ts +19 -0
  35. package/dist/commands/qa-workflow.js +24 -1
  36. package/dist/commands/qa-workflow.js.map +1 -1
  37. package/dist/commands/retro-refine.d.ts +6 -0
  38. package/dist/commands/retro-refine.js +166 -0
  39. package/dist/commands/retro-refine.js.map +1 -0
  40. package/dist/commands/shape.d.ts +13 -0
  41. package/dist/commands/shape.js +112 -46
  42. package/dist/commands/shape.js.map +1 -1
  43. package/dist/commands/spec.d.ts +8 -0
  44. package/dist/commands/spec.js +8 -2
  45. package/dist/commands/spec.js.map +1 -1
  46. package/dist/engine/claude/claude.exec.js +1 -1
  47. package/dist/engine/claude/claude.exec.js.map +1 -1
  48. package/dist/engine/claude/sandbox.d.ts +2 -2
  49. package/dist/engine/claude/sandbox.greywall.js +4 -4
  50. package/dist/engine/claude/sandbox.greywall.js.map +1 -1
  51. package/dist/engine/claude/sandbox.js +2 -8
  52. package/dist/engine/claude/sandbox.js.map +1 -1
  53. package/dist/engine/claude/sandbox.types.d.ts +1 -1
  54. package/dist/engine/detect/index.d.ts +1 -0
  55. package/dist/engine/detect/index.js +13 -5
  56. package/dist/engine/detect/index.js.map +1 -1
  57. package/dist/engine/pipeline/build.exec.js +1 -1
  58. package/dist/engine/pipeline/build.exec.js.map +1 -1
  59. package/dist/engine/pipeline/ensemble.exec.js +2 -2
  60. package/dist/engine/pipeline/ensemble.exec.js.map +1 -1
  61. package/dist/engine/pipeline/phase.sequence.d.ts +17 -0
  62. package/dist/engine/pipeline/phase.sequence.js +107 -7
  63. package/dist/engine/pipeline/phase.sequence.js.map +1 -1
  64. package/dist/engine/pipeline/plan.exec.js +1 -1
  65. package/dist/engine/pipeline/plan.exec.js.map +1 -1
  66. package/dist/engine/pipeline/plan.review.js +2 -2
  67. package/dist/engine/pipeline/plan.review.js.map +1 -1
  68. package/dist/engine/pipeline/prompt.document.d.ts +5 -5
  69. package/dist/engine/pipeline/prompt.document.js +36 -39
  70. package/dist/engine/pipeline/prompt.document.js.map +1 -1
  71. package/dist/engine/pipeline/refine.exec.js +1 -1
  72. package/dist/engine/pipeline/refine.exec.js.map +1 -1
  73. package/dist/engine/pipeline/research.exec.js +3 -3
  74. package/dist/engine/pipeline/research.exec.js.map +1 -1
  75. package/dist/engine/pipeline/review.exec.js +1 -1
  76. package/dist/engine/pipeline/review.exec.js.map +1 -1
  77. package/dist/engine/pipeline/specify.exec.d.ts +6 -0
  78. package/dist/engine/pipeline/specify.exec.js +18 -5
  79. package/dist/engine/pipeline/specify.exec.js.map +1 -1
  80. package/dist/references/download.d.ts +30 -0
  81. package/dist/references/download.js +223 -0
  82. package/dist/references/download.js.map +1 -0
  83. package/dist/sensors/a11y.js +1 -1
  84. package/dist/sensors/a11y.js.map +1 -1
  85. package/dist/sensors/index.d.ts +10 -0
  86. package/dist/sensors/playwright.d.ts +6 -1
  87. package/dist/sensors/playwright.js +72 -50
  88. package/dist/sensors/playwright.js.map +1 -1
  89. package/dist/src/__tests__/cli.deep-ensemble-deprecation.test.js +64 -0
  90. package/dist/src/__tests__/cli.preflight-order.test.js +43 -0
  91. package/dist/src/__tests__/cli.preflight-wiring.test.js +87 -0
  92. package/dist/src/__tests__/cli.specialist-timeout-wiring.test.js +82 -0
  93. package/dist/src/__tests__/config.test.js +195 -0
  94. package/dist/src/__tests__/git.test.js +161 -0
  95. package/dist/src/catalog/__tests__/build-catalog.test.js +174 -0
  96. package/dist/src/catalog/__tests__/extract-metadata.test.js +108 -0
  97. package/dist/src/catalog/__tests__/parse-conventions.test.js +92 -0
  98. package/dist/src/catalog/__tests__/resolve-asset-dir.test.js +114 -0
  99. package/dist/src/catalog/build-catalog.js +305 -0
  100. package/dist/src/catalog/classify.js +189 -0
  101. package/dist/src/catalog/extract-metadata.js +174 -0
  102. package/dist/src/catalog/pack-sprites.js +106 -0
  103. package/dist/src/catalog/parse-conventions.js +85 -0
  104. package/dist/src/catalog/resolve-asset-dir.js +95 -0
  105. package/dist/src/catalog/types.js +2 -0
  106. package/dist/src/catalog/vision-describe.js +158 -0
  107. package/dist/src/cli.js +532 -0
  108. package/dist/src/commands/__tests__/build.test.js +223 -0
  109. package/dist/src/commands/__tests__/clean.test.js +12 -0
  110. package/dist/src/commands/__tests__/directions.test.js +165 -0
  111. package/dist/src/commands/__tests__/dry-run.test.js +119 -0
  112. package/dist/src/commands/__tests__/input.test.js +138 -0
  113. package/dist/src/commands/__tests__/plan.test.js +156 -0
  114. package/dist/src/commands/__tests__/qa-workflow.test.js +158 -0
  115. package/dist/src/commands/__tests__/refine.test.js +149 -0
  116. package/dist/src/commands/__tests__/research.test.js +156 -0
  117. package/dist/src/commands/__tests__/rewind.test.js +107 -0
  118. package/dist/src/commands/__tests__/shape.runtime.test.js +49 -0
  119. package/dist/src/commands/__tests__/spec.test.js +168 -0
  120. package/dist/src/commands/__tests__/ui.test.js +101 -0
  121. package/dist/src/commands/build.js +378 -0
  122. package/dist/src/commands/catalog.js +140 -0
  123. package/dist/src/commands/check.js +10 -0
  124. package/dist/src/commands/clean.js +8 -0
  125. package/dist/src/commands/create.js +130 -0
  126. package/dist/src/commands/design.js +411 -0
  127. package/dist/src/commands/directions.js +191 -0
  128. package/dist/src/commands/dry-run.js +65 -0
  129. package/dist/src/commands/index.js +13 -0
  130. package/dist/src/commands/ingest.js +104 -0
  131. package/dist/src/commands/input.js +129 -0
  132. package/dist/src/commands/plan.js +111 -0
  133. package/dist/src/commands/qa-workflow.js +162 -0
  134. package/dist/src/commands/refine.js +103 -0
  135. package/dist/src/commands/research.js +152 -0
  136. package/dist/src/commands/retrospective.js +125 -0
  137. package/dist/src/commands/rewind.js +79 -0
  138. package/dist/src/commands/shape.js +317 -0
  139. package/dist/src/commands/spec.js +143 -0
  140. package/dist/src/commands/ui.js +95 -0
  141. package/dist/src/config.js +115 -0
  142. package/dist/src/engine/__tests__/worktree.test.js +109 -0
  143. package/dist/src/engine/claude/__tests__/agent.prompt.test.js +83 -0
  144. package/dist/src/engine/claude/__tests__/claude.exec.stable.test.js +244 -0
  145. package/dist/src/engine/claude/__tests__/claude.exec.test.js +247 -0
  146. package/dist/src/engine/claude/__tests__/sandbox.greywall.test.js +180 -0
  147. package/dist/src/engine/claude/__tests__/sandbox.test.js +46 -0
  148. package/dist/src/engine/claude/__tests__/stable.prompt.test.js +280 -0
  149. package/dist/src/engine/claude/__tests__/stream.display.test.js +204 -0
  150. package/dist/src/engine/claude/__tests__/stream.parse.test.js +220 -0
  151. package/dist/src/engine/claude/__tests__/stream.result.test.js +121 -0
  152. package/dist/src/engine/claude/agent.prompt.js +49 -0
  153. package/dist/src/engine/claude/claude.exec.js +245 -0
  154. package/dist/src/engine/claude/sandbox.greywall.js +117 -0
  155. package/dist/src/engine/claude/sandbox.js +37 -0
  156. package/dist/src/engine/claude/sandbox.types.js +2 -0
  157. package/dist/src/engine/claude/stable.prompt.js +136 -0
  158. package/dist/src/engine/claude/stream.display.js +103 -0
  159. package/dist/src/engine/claude/stream.parse.js +100 -0
  160. package/dist/src/engine/claude/stream.result.js +65 -0
  161. package/dist/src/engine/claude/stream.types.js +22 -0
  162. package/dist/src/engine/detect/__tests__/detect.test.js +165 -0
  163. package/dist/src/engine/detect/index.js +159 -0
  164. package/dist/src/engine/discovery/__tests__/agent.registry.resolution.test.js +44 -0
  165. package/dist/src/engine/discovery/__tests__/agent.registry.test.js +164 -0
  166. package/dist/src/engine/discovery/__tests__/agent.scan.test.js +134 -0
  167. package/dist/src/engine/discovery/__tests__/plugin.scan.test.js +228 -0
  168. package/dist/src/engine/discovery/__tests__/skill.check.test.js +102 -0
  169. package/dist/src/engine/discovery/agent.registry.js +158 -0
  170. package/dist/src/engine/discovery/agent.scan.js +97 -0
  171. package/dist/src/engine/discovery/plugin.scan.js +136 -0
  172. package/dist/src/engine/discovery/skill.check.js +144 -0
  173. package/dist/src/engine/index.js +29 -0
  174. package/dist/src/engine/pipeline/__tests__/build.exec.test.js +189 -0
  175. package/dist/src/engine/pipeline/__tests__/ensemble.exec.test.js +317 -0
  176. package/dist/src/engine/pipeline/__tests__/extract-json.test.js +37 -0
  177. package/dist/src/engine/pipeline/__tests__/phase.graph.test.js +125 -0
  178. package/dist/src/engine/pipeline/__tests__/phase.sequence.cache-tokens.test.js +184 -0
  179. package/dist/src/engine/pipeline/__tests__/phase.sequence.required-tools.test.js +36 -0
  180. package/dist/src/engine/pipeline/__tests__/phase.sequence.required-views.test.js +69 -0
  181. package/dist/src/engine/pipeline/__tests__/phase.sequence.sensors.test.js +198 -0
  182. package/dist/src/engine/pipeline/__tests__/phase.sequence.test.js +272 -0
  183. package/dist/src/engine/pipeline/__tests__/pipeline.shared.test.js +284 -0
  184. package/dist/src/engine/pipeline/__tests__/plan.exec.test.js +119 -0
  185. package/dist/src/engine/pipeline/__tests__/prompt.document.test.js +61 -0
  186. package/dist/src/engine/pipeline/__tests__/review.exec.test.js +199 -0
  187. package/dist/src/engine/pipeline/__tests__/specialist.verdict.test.js +192 -0
  188. package/dist/src/engine/pipeline/__tests__/worktree.parallel.test.js +124 -0
  189. package/dist/src/engine/pipeline/build.exec.js +111 -0
  190. package/dist/src/engine/pipeline/ensemble.exec.js +584 -0
  191. package/dist/src/engine/pipeline/phase.graph.js +101 -0
  192. package/dist/src/engine/pipeline/phase.sequence.js +441 -0
  193. package/dist/src/engine/pipeline/pipeline.shared.js +187 -0
  194. package/dist/src/engine/pipeline/plan.exec.js +58 -0
  195. package/dist/src/engine/pipeline/plan.review.js +182 -0
  196. package/dist/src/engine/pipeline/prompt.document.js +49 -0
  197. package/dist/src/engine/pipeline/refine.exec.js +91 -0
  198. package/dist/src/engine/pipeline/research.exec.js +215 -0
  199. package/dist/src/engine/pipeline/review.exec.js +112 -0
  200. package/dist/src/engine/pipeline/sensors.collect.js +33 -0
  201. package/dist/src/engine/pipeline/specialist.verdict.js +188 -0
  202. package/dist/src/engine/pipeline/specify.exec.js +460 -0
  203. package/dist/src/engine/pipeline/worktree.parallel.js +121 -0
  204. package/dist/src/engine/worktree.js +98 -0
  205. package/dist/src/git.js +98 -0
  206. package/dist/src/references/__tests__/download.test.js +156 -0
  207. package/dist/src/references/download.js +222 -0
  208. package/dist/src/sensors/__tests__/a11y.test.js +169 -0
  209. package/dist/src/sensors/__tests__/contrast.test.js +91 -0
  210. package/dist/src/sensors/__tests__/index.test.js +53 -0
  211. package/dist/src/sensors/__tests__/playwright.test.js +381 -0
  212. package/dist/src/sensors/__tests__/vision.test.js +104 -0
  213. package/dist/src/sensors/a11y.js +133 -0
  214. package/dist/src/sensors/contrast.js +116 -0
  215. package/dist/src/sensors/index.js +2 -0
  216. package/dist/src/sensors/playwright.js +287 -0
  217. package/dist/src/sensors/vision.js +124 -0
  218. package/dist/src/shapes/__tests__/detect.test.js +131 -0
  219. package/dist/src/shapes/detect.js +86 -0
  220. package/dist/src/stores/__tests__/budget.test.js +129 -0
  221. package/dist/src/stores/__tests__/feedback.io.test.js +103 -0
  222. package/dist/src/stores/__tests__/feedback.verdict.test.js +227 -0
  223. package/dist/src/stores/__tests__/handoff.test.js +99 -0
  224. package/dist/src/stores/__tests__/inputs.test.js +131 -0
  225. package/dist/src/stores/__tests__/phases.test.js +213 -0
  226. package/dist/src/stores/__tests__/settings.test.js +255 -0
  227. package/dist/src/stores/__tests__/state.test.js +667 -0
  228. package/dist/src/stores/__tests__/tags.test.js +68 -0
  229. package/dist/src/stores/__tests__/trajectory.test.js +125 -0
  230. package/dist/src/stores/budget.js +78 -0
  231. package/dist/src/stores/feedback.format.js +70 -0
  232. package/dist/src/stores/feedback.io.js +63 -0
  233. package/dist/src/stores/feedback.parse.js +122 -0
  234. package/dist/src/stores/feedback.verdict.js +10 -0
  235. package/dist/src/stores/handoff.js +80 -0
  236. package/dist/src/stores/index.js +47 -0
  237. package/dist/src/stores/inputs.js +63 -0
  238. package/dist/src/stores/phases.js +101 -0
  239. package/dist/src/stores/settings.js +188 -0
  240. package/dist/src/stores/state.js +442 -0
  241. package/dist/src/stores/tags.js +33 -0
  242. package/dist/src/stores/trajectory.js +70 -0
  243. package/dist/src/types.js +2 -0
  244. package/dist/src/ui/__tests__/color.test.js +106 -0
  245. package/dist/src/ui/__tests__/contrast.test.js +53 -0
  246. package/dist/src/ui/__tests__/no-raw-ansi.test.js +73 -0
  247. package/dist/src/ui/__tests__/output.test.js +30 -0
  248. package/dist/src/ui/__tests__/preflight.caching.test.js +59 -0
  249. package/dist/src/ui/__tests__/preflight.install-hint.test.js +66 -0
  250. package/dist/src/ui/__tests__/preflight.test.js +216 -0
  251. package/dist/src/ui/__tests__/prompt.test.js +48 -0
  252. package/dist/src/ui/__tests__/spinner.test.js +179 -0
  253. package/dist/src/ui/__tests__/transcript.test.js +68 -0
  254. package/dist/src/ui/color.js +45 -0
  255. package/dist/src/ui/contrast.js +93 -0
  256. package/dist/src/ui/dashboard/__tests__/a11y.test.js +64 -0
  257. package/dist/src/ui/dashboard/__tests__/css.test.js +96 -0
  258. package/dist/src/ui/dashboard/__tests__/disconnect.test.js +76 -0
  259. package/dist/src/ui/dashboard/__tests__/events.test.js +40 -0
  260. package/dist/src/ui/dashboard/__tests__/html.test.js +80 -0
  261. package/dist/src/ui/dashboard/__tests__/no-watchfile.test.js +60 -0
  262. package/dist/src/ui/dashboard/__tests__/offline.test.js +49 -0
  263. package/dist/src/ui/dashboard/__tests__/reduced-motion.test.js +36 -0
  264. package/dist/src/ui/dashboard/__tests__/server.test.js +317 -0
  265. package/dist/src/ui/dashboard/__tests__/snapshot.test.js +82 -0
  266. package/dist/src/ui/dashboard/__tests__/watcher.test.js +81 -0
  267. package/dist/src/ui/dashboard/client.js +280 -0
  268. package/dist/src/ui/dashboard/css.js +340 -0
  269. package/dist/src/ui/dashboard/events.js +39 -0
  270. package/dist/src/ui/dashboard/favicon.js +19 -0
  271. package/dist/src/ui/dashboard/hex.js +15 -0
  272. package/dist/src/ui/dashboard/html.js +68 -0
  273. package/dist/src/ui/dashboard/server.js +256 -0
  274. package/dist/src/ui/dashboard/snapshot.js +70 -0
  275. package/dist/src/ui/dashboard/tokens.js +24 -0
  276. package/dist/src/ui/dashboard/watcher.js +237 -0
  277. package/dist/src/ui/index.js +13 -0
  278. package/dist/src/ui/logger.js +70 -0
  279. package/dist/src/ui/output.js +41 -0
  280. package/dist/src/ui/preflight.js +158 -0
  281. package/dist/src/ui/preflight.toolprobe.js +117 -0
  282. package/dist/src/ui/prompt.js +48 -0
  283. package/dist/src/ui/spinner.js +175 -0
  284. package/dist/src/ui/summary.js +93 -0
  285. package/dist/src/ui/transcript.js +69 -0
  286. package/dist/src/utils/__tests__/atomic-write.test.js +69 -0
  287. package/dist/src/utils/__tests__/file-lock.test.js +81 -0
  288. package/dist/src/utils/__tests__/flavour-removed.test.js +76 -0
  289. package/dist/src/utils/atomic-write.js +61 -0
  290. package/dist/src/utils/file-lock.js +94 -0
  291. package/dist/src/utils/flavour-removed.js +43 -0
  292. package/dist/stores/feedback.parse.js +1 -1
  293. package/dist/stores/feedback.parse.js.map +1 -1
  294. package/dist/stores/settings.d.ts +8 -1
  295. package/dist/stores/settings.js +13 -1
  296. package/dist/stores/settings.js.map +1 -1
  297. package/dist/stores/state.d.ts +4 -0
  298. package/dist/stores/state.js +22 -1
  299. package/dist/stores/state.js.map +1 -1
  300. package/dist/test/e2e/helpers.js +117 -0
  301. package/dist/test/e2e/pipeline.test.js +122 -0
  302. package/dist/test/e2e/planner.test.js +271 -0
  303. package/dist/test/factories.js +57 -0
  304. package/dist/test/setup.js +99 -0
  305. package/dist/types.d.ts +6 -0
  306. package/dist/ui/dashboard/events.d.ts +3 -6
  307. package/dist/ui/dashboard/events.js +24 -29
  308. package/dist/ui/dashboard/events.js.map +1 -1
  309. package/dist/ui/dashboard/server.js +1 -1
  310. package/dist/ui/dashboard/server.js.map +1 -1
  311. package/dist/ui/preflight.js +3 -0
  312. package/dist/ui/preflight.js.map +1 -1
  313. package/dist/utils/cli-args.d.ts +21 -0
  314. package/dist/utils/cli-args.js +81 -0
  315. package/dist/utils/cli-args.js.map +1 -0
  316. package/dist/vitest.config.js +11 -0
  317. package/dist/vitest.e2e.config.js +13 -0
  318. package/package.json +16 -4
package/README.md CHANGED
@@ -5,40 +5,60 @@
5
5
  Build harness for long-horizon software execution using AI agents.
6
6
 
7
7
  Ridgeline decomposes large software ideas into phased builds using a
8
- multi-agent pipeline (shaper, designer, specifier, researcher, refiner, planner,
9
- builder, reviewer) driven by the Claude CLI. It manages state through git checkpoints,
10
- tracks costs, and supports resumable execution when things go wrong.
8
+ multi-agent pipeline (shaper, direction-advisor, designer, specifier,
9
+ researcher, refiner, planner, builder, reviewer) driven by the Claude CLI. It
10
+ manages state through git checkpoints, tracks costs, and supports resumable
11
+ execution when things go wrong.
11
12
 
12
13
  ## How it works
13
14
 
14
15
  1. **Shape** -- describe what you want built. The shaper agent analyzes your
15
- codebase and asks clarifying questions to produce a structured shape document.
16
- 2. **Design** (optional) -- the designer agent establishes a visual design system
17
- (`design.md`) through interactive Q&A. Auto-runs the asset catalog if assets
18
- exist, and injects catalog context (detected style, palette, resolution) into
19
- the design conversation. Works at build level or project level.
20
- 3. **Specify** -- an ensemble of three specialist agents (completeness, clarity,
21
- pragmatism) drafts spec proposals, then a synthesizer merges them into
22
- `spec.md`, `constraints.md`, and optionally `taste.md`.
23
- 4. **Research** (optional) -- an ensemble of research specialists (academic,
16
+ codebase and asks clarifying questions to produce a structured `shape.md`.
17
+ 2. **Directions** (optional, web-visual builds only) -- the
18
+ direction-advisor agent generates 2-3 differentiated visual direction
19
+ options as self-contained HTML demos under `directions/<NN>-<slug>/`. Each
20
+ direction lives in a different visual school with a named reference work.
21
+ You open the demos in a browser and pick one; the picked direction's
22
+ `tokens.md` and `brief.md` seed the design Q&A.
23
+ 3. **Design** (optional) -- the designer agent establishes a visual design
24
+ system (`design.md`) through interactive Q&A. If reference imagery is
25
+ named, the reference-finder pulls representative images into
26
+ `references/<slug>/` and writes a `visual-anchors.md` the downstream
27
+ stages read. Auto-runs the asset catalog if assets exist, and injects
28
+ catalog context (detected style, palette, resolution) into the design
29
+ conversation. Works at build level or project level.
30
+ 4. **Specify** -- an ensemble of three specialist agents (completeness,
31
+ clarity, pragmatism) drafts spec proposals, then a synthesizer merges
32
+ them into `spec.md`, `constraints.md`, and optionally `taste.md`.
33
+ 5. **Research** (optional) -- an ensemble of research specialists (academic,
24
34
  ecosystem, competitive) investigates the spec using web sources, then a
25
- synthesizer merges findings into `research.md`. A gap analysis agenda step
26
- runs before specialist dispatch to focus research on spec gaps. Findings
27
- accumulate across iterations rather than being overwritten. A `--quick`
28
- single-agent mode is also available. See [Research and Refine](docs/research.md).
29
- 5. **Refine** (optional) -- the refiner agent rewrites `spec.md` incorporating
30
- research findings and writes `spec.changelog.md` documenting what changed.
31
- Additive by default -- adds insights without removing user-authored content.
32
- 6. **Plan** -- an ensemble of three specialist planners (simplicity,
33
- thoroughness, velocity) proposes phase decompositions, then a synthesizer
34
- merges them into numbered phase files with acceptance criteria.
35
- 7. **Build** -- for each phase the builder agent implements the spec inside your
36
- repo, then creates a git checkpoint.
37
- 8. **Review** -- the reviewer agent (read-only) checks the output against the
38
- acceptance criteria and returns a structured verdict. On failure, the harness
39
- generates a feedback file from the verdict for the builder's next attempt.
40
- 9. **Retry or advance** -- failed phases are retried up to a configurable limit;
41
- passing phases hand off context to the next one.
35
+ synthesizer merges findings into `research.md`. A gap analysis agenda
36
+ step runs before specialist dispatch to focus research on spec gaps.
37
+ Findings accumulate across iterations rather than being overwritten. A
38
+ `--quick` single-agent mode is also available. See
39
+ [Research and Refine](docs/research.md).
40
+ 6. **Refine** (optional) -- the refiner agent rewrites `spec.md`
41
+ incorporating research findings and writes `spec.changelog.md`
42
+ documenting what changed. Additive by default -- adds insights without
43
+ removing user-authored content.
44
+ 7. **Plan** -- an ensemble of three specialist planners (simplicity,
45
+ thoroughness, velocity) proposes phase decompositions, then a
46
+ synthesizer merges them into numbered phase files with acceptance
47
+ criteria. An adversarial plan-reviewer audits the result and triggers a
48
+ one-shot revision if issues are found.
49
+ 8. **Build** -- for each phase the builder agent implements the spec inside
50
+ your repo, then creates a git checkpoint.
51
+ 9. **Review** -- the reviewer agent (read-only) checks the output against
52
+ the acceptance criteria and returns a structured verdict. For phases
53
+ that touch visual code, it dispatches the visual-reviewer specialist to
54
+ score rendered output against taste fidelity, motion discipline,
55
+ hierarchy, conventions, and anti-slop. On failure, the harness generates
56
+ a feedback file from the verdict for the builder's next attempt.
57
+ 10. **Retry or advance** -- failed phases are retried up to a configurable
58
+ limit; passing phases hand off context to the next one.
59
+
60
+ For a one-shot kickoff from an existing PRD/RFC/design doc (no Q&A), see
61
+ the [`ingest`](#ridgeline-ingest-build-name-input) command.
42
62
 
43
63
  ## Install
44
64
 
@@ -51,32 +71,45 @@ npm install -g ridgeline
51
71
  Ridgeline requires the [Claude CLI](https://docs.anthropic.com/en/docs/claude-code)
52
72
  to be installed and authenticated.
53
73
 
54
- For sandboxing (recommended), install one of:
74
+ For sandboxing (recommended), install
75
+ [Greywall](https://github.com/GreyhavenHQ/greywall) on macOS or Linux:
76
+ `brew install greywall`. Provides domain-level network allowlisting and
77
+ filesystem isolation.
55
78
 
56
- - **macOS/Linux:** [Greywall](https://github.com/GreyhavenHQ/greywall) --
57
- `brew install greywall` (domain-level network allowlisting + filesystem
58
- isolation)
59
- - **Linux:** [bubblewrap](https://github.com/containers/bubblewrap) --
60
- `apt install bubblewrap` (full network block + read-only filesystem)
61
-
62
- Sandboxing is on by default when a provider is detected. No flags needed.
79
+ Sandboxing is on by default when Greywall is detected. The default mode is
80
+ `semi-locked`; pass `--sandbox=strict` for tighter isolation or
81
+ `--sandbox=off` to disable.
63
82
 
64
83
  ## Quick start
65
84
 
66
85
  ```sh
67
- # Auto-advance through the pipeline (shape spec → plan → build)
86
+ # Step-through (one stage per invocation)
68
87
  ridgeline my-feature "Build a REST API for task management"
69
88
 
89
+ # Unattended end-to-end (--auto)
90
+ # Build name auto-derived from the input path (./idea.md → my-feature build "idea")
91
+ ridgeline ./idea.md --auto
92
+
93
+ # Full power: research + parallel directions + inspiration-driven picker
94
+ ridgeline ./idea.md --auto --research --directions 4 --inspiration ~/my-pics/
95
+
70
96
  # Or run each stage individually
71
97
  ridgeline shape my-feature "Build a REST API for task management"
98
+ ridgeline directions my-feature # optional: pick a visual direction (web-visual only)
72
99
  ridgeline design my-feature # optional: establish visual design system
73
100
  ridgeline spec my-feature
74
- ridgeline research my-feature # optional: enrich spec with web research
101
+ ridgeline research my-feature # optional: enrich spec with web research
75
102
  ridgeline refine my-feature # optional: merge research into spec
76
103
  ridgeline plan my-feature
77
- ridgeline dry-run my-feature # preview before committing
104
+ ridgeline dry-run my-feature # preview before committing
78
105
  ridgeline build my-feature
79
106
 
107
+ # One-shot kickoff from an existing spec doc (no Q&A)
108
+ ridgeline ingest my-feature ./path/to/PRD.md
109
+
110
+ # Refine the original input doc using lessons from learnings.md
111
+ ridgeline retro-refine my-feature
112
+
80
113
  # Catalog media assets (images, audio, video, text)
81
114
  ridgeline catalog my-feature --classify --describe
82
115
 
@@ -86,6 +119,9 @@ ridgeline build my-feature
86
119
  # Rewind to an earlier stage and redo from there
87
120
  ridgeline rewind my-feature --to spec
88
121
 
122
+ # Open the localhost dashboard for a build
123
+ ridgeline ui my-feature
124
+
89
125
  # Clean up stale worktrees from failed builds
90
126
  ridgeline clean
91
127
  ```
@@ -94,103 +130,199 @@ ridgeline clean
94
130
 
95
131
  ### `ridgeline [build-name] [input]` (default)
96
132
 
97
- Auto-advances the build through the next incomplete pipeline stage
98
- (shape → spec → plan → build; design, research, and refine are opt-in).
99
- Accepts all flags from the individual commands.
133
+ Without `--auto`, advances the build through the next incomplete required
134
+ pipeline stage (shape → spec → plan → build). With `--auto`, drives the
135
+ entire pipeline end-to-end including retrospective and (by default)
136
+ retro-refine. Accepts all flags from the individual commands.
137
+
138
+ The first positional argument is treated as the build name **unless** it
139
+ resolves to an existing file or directory on disk, in which case it's
140
+ treated as input and the build name is derived from `path.basename`.
141
+ Both `ridgeline my-name ./idea.md --auto` and `ridgeline ./idea.md
142
+ --auto` work.
143
+
144
+ | Flag | Default | Description |
145
+ |------|---------|-------------|
146
+ | `--auto` | off | Run the full orchestrator end-to-end without Q&A |
147
+ | `--stop-after <stage>` | `build` | In `--auto`, halt after this stage (`shape\|design\|spec\|plan\|build`) |
148
+ | `--no-refine` | off | In `--auto`, skip retro-refine at end of run |
149
+ | `--research [N]` | off | In `--auto`, run N research+refine iterations (default 1) |
150
+ | `--directions [N]` | off | In `--auto`, run N parallel design-specialists then a picker (default 3) |
151
+ | `--inspiration <src>` | none | Inspiration source for the directions picker (file/dir/text) |
152
+ | `--model <name>` | from settings, else `opus` | Model for all stages |
153
+ | `--timeout <minutes>` | `10` | Max duration per turn |
154
+ | `--max-budget-usd <n>` | none | Halt if cumulative cost exceeds this |
155
+ | `--max-retries <n>` | `2` | Max reviewer retry loops per phase |
156
+ | `--check <command>` | from constraints | Baseline check command |
157
+ | `--check-timeout <seconds>` | `1200` | Max duration for check command |
158
+ | `--constraints <path>` | auto | Path to constraints file |
159
+ | `--taste <path>` | auto | Path to taste file |
160
+ | `--context <text>` | none | Extra context appended to builder and planner prompts |
161
+ | `--sandbox <mode>` | `semi-locked` | Sandbox mode: `off`, `semi-locked`, or `strict` |
162
+ | `--specialists <n>` | `3` | Ensemble specialists per stage (1, 2, or 3) |
163
+ | `--thorough` | -- | Alias for `--specialists 3` (the default) |
164
+ | `-y, --yes` | off | Skip the preflight confirmation prompt |
165
+
166
+ In `--auto` mode the pipeline always produces a `design.md` (even for
167
+ non-visual builds, where it's a short placeholder) so downstream agents
168
+ have a consistent slot for visual data. After a successful build, a
169
+ retrospective runs and is appended to `learnings.md`; then
170
+ `retro-refine` produces a refined version of the input doc at
171
+ `<build-dir>/refined-input.md` for use in a re-run.
100
172
 
101
173
  ### `ridgeline shape [build-name] [input]`
102
174
 
103
- Gathers project context through interactive Q&A and codebase analysis. Produces
104
- `shape.md` in the build directory. Accepts an optional input argument -- a file
105
- path to an existing document or a natural language description.
175
+ Gathers project context through interactive Q&A and codebase analysis.
176
+ Produces `shape.md` in the build directory. Accepts an optional input
177
+ argument -- a file path to an existing document or a natural language
178
+ description.
106
179
 
107
180
  | Flag | Default | Description |
108
181
  |------|---------|-------------|
109
- | `--model <name>` | `opus` | Model for shaper agent |
182
+ | `--model <name>` | from settings, else `opus` | Model for shaper agent |
110
183
  | `--timeout <minutes>` | `10` | Max duration per turn |
111
- | `--flavour <name-or-path>` | none | Agent flavour: built-in name or path to custom agents |
184
+
185
+ ### `ridgeline directions [build-name]`
186
+
187
+ Generates differentiated visual direction options before the design Q&A.
188
+ Web-visual shapes only — exits no-op for backend / non-visual builds and
189
+ warns/skips for game-visual / print-layout.
190
+
191
+ In **interactive mode** (default), the direction-advisor produces N
192
+ directions in one call and prompts the user to pick by id. Each
193
+ direction lives in a separate visual school (with a named reference
194
+ work) under `directions/<NN>-<slug>/`, containing `brief.md`,
195
+ `tokens.md`, and a `demo/index.html`.
196
+
197
+ In **`--auto` mode**, the harness dispatches N parallel
198
+ `design-specialist` subagents — each generates one direction in a
199
+ distinct visual school — then `direction-advisor` runs in picker mode
200
+ to choose the best fit against `--inspiration`. If no inspiration is
201
+ provided or the picker returns ambiguous, it falls back to an
202
+ interactive prompt.
203
+
204
+ | Flag | Default | Description |
205
+ |------|---------|-------------|
206
+ | `--auto` | off | Run parallel specialists + auto picker (uses `--inspiration`) |
207
+ | `--inspiration <src>` | none | File, directory, or inline text the picker matches against |
208
+ | `--model <name>` | from settings, else `opus` | Model for direction-advisor agent |
209
+ | `--timeout <minutes>` | `15` | Max duration in minutes |
210
+ | `--count <n>` | from settings, else `2` | Number of directions to generate |
211
+ | `--thorough` | -- | Alias for `--count 3` |
212
+ | `--skip` | -- | Explicit no-op (skip direction generation) |
213
+ | `-y, --yes` | off | Skip the preflight confirmation prompt |
214
+
215
+ Typical cost is $2-5 per run with opus (interactive); $1.50-$2.50 per
216
+ specialist in `--auto` mode.
112
217
 
113
218
  ### `ridgeline design [build-name]`
114
219
 
115
- Establishes or updates a visual design system through interactive Q&A. Produces
116
- `design.md` in the build directory (or project-level if no build name is given).
117
- If an asset directory exists but no catalog has been built, the catalog is
118
- auto-run and its summary (detected style, palette, resolution, category
119
- breakdown) is injected into the designer's context.
220
+ Establishes or updates a visual design system through interactive Q&A.
221
+ Produces `design.md` in the build directory (or project-level if no build
222
+ name is given). If an asset directory exists but no catalog has been
223
+ built, the catalog is auto-run and its summary (detected style, palette,
224
+ resolution, category breakdown) is injected into the designer's context.
225
+ If `directions/picked.txt` exists, the picked direction's tokens seed the
226
+ Q&A defaults; if `references/visual-anchors.md` exists, it is loaded as
227
+ additional context.
120
228
 
121
229
  | Flag | Default | Description |
122
230
  |------|---------|-------------|
123
- | `--model <name>` | `opus` | Model for designer agent |
231
+ | `--model <name>` | from settings, else `opus` | Model for designer agent |
124
232
  | `--timeout <minutes>` | `10` | Max duration per turn |
125
- | `--flavour <name-or-path>` | none | Agent flavour: built-in name or path to custom agents |
126
233
 
127
- ### `ridgeline spec [build-name]`
234
+ ### `ridgeline spec [build-name] [input]`
128
235
 
129
- Runs the specifier ensemble: three specialist agents (completeness, clarity,
130
- pragmatism) draft proposals in parallel, then a synthesizer merges them into
131
- `spec.md`, `constraints.md`, and optionally `taste.md`.
236
+ Runs the specifier ensemble: specialist agents (completeness, clarity,
237
+ pragmatism, plus visual-coherence for visual shapes) draft proposals in
238
+ parallel, then a synthesizer merges them into `spec.md`, `constraints.md`,
239
+ and optionally `taste.md`. Optionally accepts an `input` argument -- a
240
+ path to a file (convention: `idea.md`) or raw text -- which the
241
+ synthesizer treats as authoritative source material to preserve alongside
242
+ `shape.md`.
132
243
 
133
244
  | Flag | Default | Description |
134
245
  |------|---------|-------------|
135
- | `--model <name>` | `opus` | Model for specifier agents |
246
+ | `--model <name>` | from settings, else `opus` | Model for specifier agents |
136
247
  | `--timeout <minutes>` | `10` | Max duration per turn |
137
248
  | `--max-budget-usd <n>` | none | Halt if cumulative cost exceeds this |
138
- | `--flavour <name-or-path>` | none | Agent flavour: built-in name or path to custom agents |
249
+ | `--specialists <n>` | `3` | Number of specialists (1, 2, or 3) |
250
+ | `--thorough` | -- | Alias for `--specialists 3` (the default) |
251
+
252
+ ### `ridgeline ingest [build-name] [input]`
253
+
254
+ One-shot non-interactive pipeline kickoff. Converts a freeform spec --
255
+ either a single file (PRD, RFC, design doc) or a directory of related
256
+ markdown/text files -- into `shape.md`, `spec.md`, `constraints.md`,
257
+ `taste.md`, plus `design.md` when visual shapes match, in a single run
258
+ with no Q&A. The synthesizer flags inferred facts in a `## Inferred /
259
+ Gaps` section per output file so you can patch holes by editing the
260
+ markdown rather than answering chat questions, before running `plan`.
261
+
262
+ | Flag | Default | Description |
263
+ |------|---------|-------------|
264
+ | `--model <name>` | from settings, else `opus` | Model for shaper, designer, and specifier |
265
+ | `--timeout <minutes>` | `10` | Max duration per turn |
266
+ | `--max-budget-usd <n>` | none | Halt if cumulative cost exceeds this |
267
+ | `--specialists <n>` | `3` | Number of specialists (1, 2, or 3) |
139
268
 
140
269
  ### `ridgeline research [build-name]`
141
270
 
142
- Researches the spec using web sources. Produces `research.md` in the build
143
- directory. Optional step between `spec` and `plan`. See
271
+ Researches the spec using web sources. Produces `research.md` in the
272
+ build directory. Optional step between `spec` and `plan`. See
144
273
  [Research and Refine](docs/research.md) for details.
145
274
 
146
275
  | Flag | Default | Description |
147
276
  |------|---------|-------------|
148
- | `--model <name>` | `opus` | Model for research agents |
277
+ | `--model <name>` | from settings, else `opus` | Model for research agents |
149
278
  | `--timeout <minutes>` | `15` | Max duration per agent |
150
279
  | `--max-budget-usd <n>` | none | Halt if cumulative cost exceeds this |
151
280
  | `--quick` | off | Run a single random specialist instead of the full ensemble |
152
281
  | `--auto [iterations]` | off | Auto-loop: research + refine for N iterations (default 2) |
153
- | `--flavour <name-or-path>` | none | Agent flavour: built-in name or path to custom agents |
282
+ | `--specialists <n>` | `3` | Number of specialists (1, 2, or 3) |
154
283
 
155
284
  ### `ridgeline refine [build-name]`
156
285
 
157
- Merges `research.md` findings into `spec.md`. Run after reviewing or editing
158
- `research.md`.
286
+ Merges `research.md` findings into `spec.md`. Run after reviewing or
287
+ editing `research.md`.
159
288
 
160
289
  | Flag | Default | Description |
161
290
  |------|---------|-------------|
162
- | `--model <name>` | `opus` | Model for refiner agent |
291
+ | `--model <name>` | from settings, else `opus` | Model for refiner agent |
163
292
  | `--timeout <minutes>` | `10` | Max duration |
164
- | `--flavour <name-or-path>` | none | Agent flavour: built-in name or path to custom agents |
165
293
 
166
294
  ### `ridgeline plan [build-name]`
167
295
 
168
- Runs the planner ensemble: three specialist planners (simplicity, thoroughness,
169
- velocity) propose phase decompositions in parallel, then a synthesizer merges
170
- them into numbered phase files (`01-slug.md`, `02-slug.md`, ...) stored in the
171
- build's `phases/` directory.
296
+ Runs the planner ensemble: three specialist planners (simplicity,
297
+ thoroughness, velocity) propose phase decompositions in parallel, then a
298
+ synthesizer merges them into numbered phase files (`01-slug.md`,
299
+ `02-slug.md`, ...) stored in the build's `phases/` directory. An
300
+ adversarial plan-reviewer audits the synthesized plan and triggers a
301
+ one-shot revision if it surfaces issues. Phase specs may declare a
302
+ `## Required Views` section (visual builds) and a `## Required Tools`
303
+ section (any build); the harness probes each before its phase runs.
172
304
 
173
305
  | Flag | Default | Description |
174
306
  |------|---------|-------------|
175
- | `--model <name>` | `opus` | Model for planner agents |
307
+ | `--model <name>` | from settings, else `opus` | Model for planner agents |
176
308
  | `--timeout <minutes>` | `120` | Max planning duration |
177
309
  | `--constraints <path>` | auto | Path to constraints file |
178
310
  | `--taste <path>` | auto | Path to taste file |
179
- | `--flavour <name-or-path>` | none | Agent flavour: built-in name or path to custom agents |
311
+ | `--specialists <n>` | `3` | Number of specialists (1, 2, or 3) |
180
312
 
181
313
  ### `ridgeline dry-run [build-name]`
182
314
 
183
- Displays the execution plan without invoking builders or reviewers. Accepts
184
- the same flags as `plan`.
315
+ Displays the execution plan without invoking builders or reviewers.
316
+ Accepts the same flags as `plan`.
185
317
 
186
318
  ### `ridgeline build [build-name]`
187
319
 
188
- Executes the full build pipeline: build each phase, evaluate, retry on failure,
189
- and advance on success.
320
+ Executes the full build pipeline: build each phase, evaluate, retry on
321
+ failure, and advance on success.
190
322
 
191
323
  | Flag | Default | Description |
192
324
  |------|---------|-------------|
193
- | `--model <name>` | `opus` | Model for builder and reviewer |
325
+ | `--model <name>` | from settings, else `opus` | Model for builder and reviewer |
194
326
  | `--timeout <minutes>` | `120` | Max duration per phase |
195
327
  | `--check-timeout <seconds>` | `1200` | Max duration for check command |
196
328
  | `--max-retries <n>` | `2` | Max reviewer retry loops per phase |
@@ -199,13 +331,13 @@ and advance on success.
199
331
  | `--constraints <path>` | auto | Path to constraints file |
200
332
  | `--taste <path>` | auto | Path to taste file |
201
333
  | `--context <text>` | none | Extra context appended to builder and planner prompts |
202
- | `--unsafe` | off | Disable sandbox auto-detection |
203
- | `--flavour <name-or-path>` | none | Agent flavour: built-in name or path to custom agents |
334
+ | `--sandbox <mode>` | `semi-locked` | Sandbox mode: `off`, `semi-locked`, or `strict` |
335
+ | `--no-structured-log` | off | Disable structured logging to `log.jsonl` |
204
336
 
205
337
  The build command automatically resumes from the last successful phase if
206
- previous state exists. Each build runs in an isolated git worktree -- completed
207
- phases are reflected back to your branch, and failed builds leave the worktree
208
- intact for inspection.
338
+ previous state exists. Each build runs in an isolated git worktree --
339
+ completed phases are reflected back to your branch, and failed builds
340
+ leave the worktree intact for inspection.
209
341
 
210
342
  ### `ridgeline rewind <build-name>`
211
343
 
@@ -217,29 +349,32 @@ Resets pipeline state to a given stage and deletes downstream artifacts.
217
349
 
218
350
  ### `ridgeline catalog [build-name]`
219
351
 
220
- Indexes media assets into `asset-catalog.json` a structured metadata file that
221
- feeds into the design and build phases. Supports images, audio, video, and text
222
- files. The catalog pipeline runs in three tiers:
223
-
224
- 1. **Deterministic metadata** (always runs) scans the asset directory, extracts
225
- file metadata (size, hash, dimensions for images), detects spritesheets and
226
- tileable textures, infers category from directory structure and filename
227
- conventions (e.g., `characters/knight-walk.png` → category "characters",
228
- subject "knight", state "walk"). Computes project-wide visual identity
229
- aggregates (detected style, palette, resolution).
230
- 2. **Classification** (with `--classify`) — assigns categories to uncategorized
231
- files. Filename heuristics run first (e.g., `bg_*` backgrounds, `sfx_*`
232
- sfx). Files that don't match any pattern fall through to AI classification
233
- using Claude vision for images or text prompts for other media types.
234
- 3. **Vision enrichment** (with `--describe`) — uses Claude vision to add semantic
235
- descriptions, facing direction, pose, style tags, and animation type for image
236
- assets. Layout and UI assets are auto-described regardless of the flag.
237
- 4. **Sprite packing** (with `--pack`) groups image assets by category and packs
238
- them into 2048×2048 sprite atlases with PixiJS-compatible JSON metadata.
239
- Backgrounds and layout references are excluded.
240
-
241
- The catalog is incremental unchanged files (by content hash) are skipped on
242
- subsequent runs unless `--force` is set.
352
+ Indexes media assets into `asset-catalog.json` -- a structured metadata
353
+ file that feeds into the design and build phases. Supports images, audio,
354
+ video, and text files. The catalog pipeline runs in tiers:
355
+
356
+ 1. **Deterministic metadata** (always runs) -- scans the asset directory,
357
+ extracts file metadata (size, hash, dimensions for images), detects
358
+ spritesheets and tileable textures, infers category from directory
359
+ structure and filename conventions (e.g., `characters/knight-walk.png`
360
+ → category "characters", subject "knight", state "walk"). Computes
361
+ project-wide visual identity aggregates (detected style, palette,
362
+ resolution).
363
+ 2. **Classification** (with `--classify`) -- assigns categories to
364
+ uncategorized files. Filename heuristics run first (e.g., `bg_*`
365
+ backgrounds, `sfx_*` sfx). Files that don't match any pattern fall
366
+ through to AI classification using Claude vision for images or text
367
+ prompts for other media types.
368
+ 3. **Vision enrichment** (with `--describe`) -- uses Claude vision to add
369
+ semantic descriptions, facing direction, pose, style tags, and
370
+ animation type for image assets. Layout and UI assets are
371
+ auto-described regardless of the flag.
372
+ 4. **Sprite packing** (with `--pack`) -- groups image assets by category
373
+ and packs them into 2048×2048 sprite atlases with PixiJS-compatible
374
+ JSON metadata. Backgrounds and layout references are excluded.
375
+
376
+ The catalog is incremental -- unchanged files (by content hash) are
377
+ skipped on subsequent runs unless `--force` is set.
243
378
 
244
379
  | Flag | Default | Description |
245
380
  |------|---------|-------------|
@@ -249,7 +384,7 @@ subsequent runs unless `--force` is set.
249
384
  | `--pack` | off | Generate sprite atlases after cataloging |
250
385
  | `--batch` | off | Batch multiple images per vision call |
251
386
  | `--force` | off | Re-process all assets ignoring content hash |
252
- | `--model <name>` | `opus` | Model for vision and classification |
387
+ | `--model <name>` | from settings, else `opus` | Model for vision and classification |
253
388
  | `--timeout <minutes>` | `5` | Max duration per AI call |
254
389
 
255
390
  Asset directory is resolved in order: `--asset-dir` flag,
@@ -258,38 +393,58 @@ Asset directory is resolved in order: `--asset-dir` flag,
258
393
 
259
394
  ### `ridgeline retrospective [build-name]`
260
395
 
261
- Analyzes a completed build and extracts learnings for future builds. Reads the
262
- trajectory log, budget, state, and any feedback files, then appends structured
263
- insights to `.ridgeline/learnings.md`. Future builds automatically pick up these
264
- learnings if the file exists.
396
+ Analyzes a completed build and extracts learnings for future builds.
397
+ Reads the trajectory log, budget, state, and any feedback files, then
398
+ appends structured insights to `.ridgeline/learnings.md`. Future builds
399
+ automatically pick up these learnings if the file exists.
265
400
 
266
401
  | Flag | Default | Description |
267
402
  |------|---------|-------------|
268
- | `--model <name>` | `opus` | Model for retrospective agent |
403
+ | `--model <name>` | from settings, else `opus` | Model for retrospective agent |
269
404
  | `--timeout <minutes>` | `10` | Max duration |
270
- | `--flavour <name-or-path>` | none | Agent flavour: built-in name or path to custom agents |
271
405
 
272
- ### `ridgeline check`
406
+ ### `ridgeline retro-refine [build-name]`
273
407
 
274
- Checks recommended tools and prerequisites for a flavour. Reports which
275
- external tools are available and which are missing.
408
+ Reads `.ridgeline/learnings.md` plus the build's spec/constraints/taste
409
+ and any phase feedback, then writes a refined version of the original
410
+ input doc to `<build-dir>/refined-input.md`. The original input is never
411
+ mutated — the refined doc is a separate file the user can review and
412
+ copy back over the source for a re-run that starts from a sharper spec.
413
+ Runs automatically at the tail of `--auto` (unless `--no-refine`); also
414
+ runnable manually after `retrospective`.
276
415
 
277
416
  | Flag | Default | Description |
278
417
  |------|---------|-------------|
279
- | `--flavour <name-or-path>` | from settings | Agent flavour to check |
418
+ | `--model <name>` | from settings, else `opus` | Model for retro-refiner agent |
419
+ | `--timeout <minutes>` | `10` | Max duration |
420
+
421
+ ### `ridgeline ui [build-name]`
422
+
423
+ Opens a localhost dashboard for monitoring a build. If no build name is
424
+ given, the most recently active build is selected. Streams trajectory
425
+ events, budget, and phase status in real time.
426
+
427
+ | Flag | Default | Description |
428
+ |------|---------|-------------|
429
+ | `--port <number>` | `4411` | Port to bind (falls back to next free port if taken) |
430
+
431
+ ### `ridgeline check`
432
+
433
+ Reports project prerequisites and tooling status.
280
434
 
281
435
  ### `ridgeline clean`
282
436
 
283
- Removes all build worktrees under `.ridgeline/worktrees/` and their associated
284
- WIP branches. Use this after inspecting a failed build.
437
+ Removes all build worktrees under `.ridgeline/worktrees/` and their
438
+ associated WIP branches. Use this after inspecting a failed build.
285
439
 
286
440
  ## Build directory structure
287
441
 
288
442
  ```text
289
443
  .ridgeline/
290
- ├── settings.json # Optional project-level config (network allowlist, etc.)
444
+ ├── settings.json # Optional project-level config (model, sandbox, network allowlist, etc.)
291
445
  ├── design.md # Optional project-level visual design system
292
446
  ├── learnings.md # Optional accumulated build learnings (from retrospective)
447
+ ├── directions/ # Optional project-level visual direction options
293
448
  ├── worktrees/ # Git worktrees for active builds
294
449
  │ └── <build-name>/ # Isolated working directory per build
295
450
  └── builds/<build-name>/
@@ -301,6 +456,16 @@ WIP branches. Use this after inspecting a failed build.
301
456
  ├── research.md # Optional research findings (from researcher)
302
457
  ├── spec.changelog.md # Optional changelog of spec refinements
303
458
  ├── asset-catalog.json # Optional indexed media assets (from catalog)
459
+ ├── directions/ # Optional visual direction options (from direction-advisor)
460
+ │ ├── 01-<slug>/
461
+ │ │ ├── brief.md
462
+ │ │ ├── tokens.md
463
+ │ │ └── demo/index.html
464
+ │ ├── 02-<slug>/
465
+ │ └── picked.txt # The id of the user-picked direction
466
+ ├── references/ # Optional reference imagery (from reference-finder)
467
+ │ ├── <slug>/ # Downloaded image files
468
+ │ └── visual-anchors.md # Per-anchor descriptions for downstream stages
304
469
  ├── phases/
305
470
  │ ├── 01-scaffold.md
306
471
  │ ├── 01-scaffold.feedback.md # Generated by harness on review failure
@@ -309,6 +474,7 @@ WIP branches. Use this after inspecting a failed build.
309
474
  ├── state.json # Phase statuses, retries, timestamps, git tags
310
475
  ├── budget.json # Per-invocation cost tracking
311
476
  ├── trajectory.jsonl # Event log (plan/build/eval start/complete)
477
+ ├── log.jsonl # Optional structured log
312
478
  └── handoff.md # Context passed to the next phase
313
479
  ```
314
480
 
@@ -320,23 +486,35 @@ Constraint and taste files are resolved in order:
320
486
  2. Build-level (`.ridgeline/builds/<build-name>/constraints.md`)
321
487
  3. Project-level (`.ridgeline/constraints.md`)
322
488
 
323
- Project-level settings (network allowlist, etc.) are loaded from
324
- `.ridgeline/settings.json`. See [SECURITY.md](SECURITY.md) for details.
489
+ Project-level settings (default model, sandbox extras, directions count,
490
+ specialist count, network allowlist, etc.) are loaded from
491
+ `.ridgeline/settings.json`. See [SECURITY.md](SECURITY.md) for details
492
+ on the sandbox model.
325
493
 
326
494
  ## Development
327
495
 
328
496
  ```sh
329
497
  npm install
330
- npm run build # Compile TypeScript and copy agent prompts
331
- npm run dev # Watch mode
332
- npm test # Typecheck, lint, and run unit tests
333
- npm run test:unit # Unit tests only (vitest)
334
- npm run test:e2e # End-to-end tests
335
- npm run test:watch # Watch mode
336
- npm run lint # Run all linters (oxlint, markdownlint, agnix, fallow)
337
- npm run typecheck # Type-check without emitting
498
+ npm run build # Compile TypeScript and copy agent prompts
499
+ npm run dev # Watch mode
500
+ npm run check # Single command for the full quality pipeline
501
+ npm run check:bail # Stop at the first failing step
502
+ npm run check:json # Machine-readable summary on stdout (for agents)
503
+ npm run check:all # Default checks plus stryker mutation testing
504
+ npm run test:unit # Unit tests only (vitest)
505
+ npm run test:e2e # End-to-end tests
506
+ npm run test:watch # Watch mode
338
507
  ```
339
508
 
509
+ `npm run check` is the canonical pre-commit gate. It runs eight checks
510
+ (typecheck, oxlint with type-aware tsgolint, ast-grep structural rules,
511
+ agnix agent metadata, fallow dead code / duplication / complexity,
512
+ markdownlint, cspell, and vitest), captures per-tool output to
513
+ `.check/`, and writes a normalized `summary.json` for agent ingestion.
514
+ See [docs/development-checks.md](docs/development-checks.md) for the
515
+ full breakdown, output schema, and how to add new structural rules or
516
+ words to the spell-check dictionary.
517
+
340
518
  ## License
341
519
 
342
- [MIT](LICENSE)
520
+ [Apache 2.0](LICENSE)