ridgeline 0.6.0 → 0.7.4
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.
- package/README.md +8 -5
- package/dist/agents/core/designer.md +131 -0
- package/dist/agents/core/refiner.md +28 -1
- package/dist/agents/core/researcher.md +30 -11
- package/dist/agents/core/specifier.md +16 -0
- package/dist/agents/researchers/gaps.md +67 -0
- package/dist/agents/specifiers/visual-coherence.md +55 -0
- package/dist/cli.js +54 -10
- package/dist/cli.js.map +1 -1
- package/dist/commands/build.js +5 -19
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/check.d.ts +5 -0
- package/dist/commands/check.js +69 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/create.js +16 -1
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/design.d.ts +8 -0
- package/dist/commands/design.js +130 -0
- package/dist/commands/design.js.map +1 -0
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.js +3 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/plan.js +3 -3
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/qa-workflow.d.ts +33 -0
- package/dist/commands/qa-workflow.js +139 -0
- package/dist/commands/qa-workflow.js.map +1 -0
- package/dist/commands/refine.d.ts +1 -0
- package/dist/commands/refine.js +17 -4
- package/dist/commands/refine.js.map +1 -1
- package/dist/commands/research.d.ts +1 -1
- package/dist/commands/research.js +33 -12
- package/dist/commands/research.js.map +1 -1
- package/dist/commands/rewind.js +2 -2
- package/dist/commands/rewind.js.map +1 -1
- package/dist/commands/shape.js +36 -121
- package/dist/commands/shape.js.map +1 -1
- package/dist/commands/spec.js +1 -0
- package/dist/commands/spec.js.map +1 -1
- package/dist/engine/claude/stream.display.d.ts +2 -0
- package/dist/engine/claude/stream.display.js +1 -2
- package/dist/engine/claude/stream.display.js.map +1 -1
- package/dist/engine/claude/stream.parse.d.ts +1 -15
- package/dist/engine/claude/stream.parse.js +3 -21
- package/dist/engine/claude/stream.parse.js.map +1 -1
- package/dist/engine/claude/stream.result.js +2 -2
- package/dist/engine/claude/stream.types.d.ts +15 -0
- package/dist/engine/claude/stream.types.js +23 -0
- package/dist/engine/claude/stream.types.js.map +1 -0
- package/dist/engine/discovery/agent.registry.d.ts +4 -0
- package/dist/engine/discovery/agent.registry.js +46 -18
- package/dist/engine/discovery/agent.registry.js.map +1 -1
- package/dist/engine/discovery/flavour.config.d.ts +9 -0
- package/dist/engine/discovery/flavour.config.js +61 -0
- package/dist/engine/discovery/flavour.config.js.map +1 -0
- package/dist/engine/discovery/plugin.scan.d.ts +1 -0
- package/dist/engine/discovery/plugin.scan.js +29 -1
- package/dist/engine/discovery/plugin.scan.js.map +1 -1
- package/dist/engine/discovery/skill.check.d.ts +19 -0
- package/dist/engine/discovery/skill.check.js +145 -0
- package/dist/engine/discovery/skill.check.js.map +1 -0
- package/dist/engine/pipeline/build.exec.js +1 -0
- package/dist/engine/pipeline/build.exec.js.map +1 -1
- package/dist/engine/pipeline/ensemble.exec.js +2 -1
- package/dist/engine/pipeline/ensemble.exec.js.map +1 -1
- package/dist/engine/pipeline/phase.sequence.js +10 -10
- package/dist/engine/pipeline/phase.sequence.js.map +1 -1
- package/dist/engine/pipeline/pipeline.shared.d.ts +6 -0
- package/dist/engine/pipeline/pipeline.shared.js +24 -1
- package/dist/engine/pipeline/pipeline.shared.js.map +1 -1
- package/dist/engine/pipeline/plan.exec.js +1 -0
- package/dist/engine/pipeline/plan.exec.js.map +1 -1
- package/dist/engine/pipeline/refine.exec.d.ts +2 -0
- package/dist/engine/pipeline/refine.exec.js +13 -2
- package/dist/engine/pipeline/refine.exec.js.map +1 -1
- package/dist/engine/pipeline/research.exec.d.ts +4 -1
- package/dist/engine/pipeline/research.exec.js +82 -12
- package/dist/engine/pipeline/research.exec.js.map +1 -1
- package/dist/engine/pipeline/review.exec.js +23 -0
- package/dist/engine/pipeline/review.exec.js.map +1 -1
- package/dist/engine/pipeline/specify.exec.d.ts +1 -0
- package/dist/engine/pipeline/specify.exec.js +114 -44
- package/dist/engine/pipeline/specify.exec.js.map +1 -1
- package/dist/flavours/data-analysis/core/refiner.md +28 -1
- package/dist/flavours/data-analysis/core/researcher.md +30 -11
- package/dist/flavours/data-analysis/flavour.json +8 -0
- package/dist/flavours/data-analysis/researchers/gaps.md +59 -0
- package/dist/flavours/game-dev/core/refiner.md +28 -1
- package/dist/flavours/game-dev/core/researcher.md +30 -11
- package/dist/flavours/game-dev/flavour.json +8 -0
- package/dist/flavours/game-dev/researchers/gaps.md +59 -0
- package/dist/flavours/legal-drafting/core/refiner.md +28 -1
- package/dist/flavours/legal-drafting/core/researcher.md +30 -11
- package/dist/flavours/legal-drafting/flavour.json +8 -0
- package/dist/flavours/legal-drafting/researchers/gaps.md +59 -0
- package/dist/flavours/machine-learning/core/refiner.md +28 -1
- package/dist/flavours/machine-learning/core/researcher.md +30 -11
- package/dist/flavours/machine-learning/flavour.json +8 -0
- package/dist/flavours/machine-learning/researchers/gaps.md +59 -0
- package/dist/flavours/mobile-app/core/refiner.md +28 -1
- package/dist/flavours/mobile-app/core/researcher.md +30 -11
- package/dist/flavours/mobile-app/flavour.json +8 -0
- package/dist/flavours/mobile-app/researchers/gaps.md +59 -0
- package/dist/flavours/music-composition/core/refiner.md +28 -1
- package/dist/flavours/music-composition/core/researcher.md +30 -11
- package/dist/flavours/music-composition/flavour.json +8 -0
- package/dist/flavours/music-composition/researchers/gaps.md +59 -0
- package/dist/flavours/novel-writing/core/refiner.md +28 -1
- package/dist/flavours/novel-writing/core/researcher.md +30 -11
- package/dist/flavours/novel-writing/flavour.json +8 -0
- package/dist/flavours/novel-writing/researchers/gaps.md +59 -0
- package/dist/flavours/screenwriting/core/refiner.md +28 -1
- package/dist/flavours/screenwriting/core/researcher.md +30 -11
- package/dist/flavours/screenwriting/flavour.json +8 -0
- package/dist/flavours/screenwriting/researchers/gaps.md +59 -0
- package/dist/flavours/security-audit/core/refiner.md +28 -1
- package/dist/flavours/security-audit/core/researcher.md +30 -11
- package/dist/flavours/security-audit/flavour.json +8 -0
- package/dist/flavours/security-audit/researchers/gaps.md +59 -0
- package/dist/flavours/software-engineering/core/builder.md +2 -0
- package/dist/flavours/software-engineering/core/refiner.md +28 -1
- package/dist/flavours/software-engineering/core/researcher.md +30 -11
- package/dist/flavours/software-engineering/core/reviewer.md +2 -0
- package/dist/flavours/software-engineering/flavour.json +7 -0
- package/dist/flavours/software-engineering/researchers/gaps.md +59 -0
- package/dist/flavours/technical-writing/core/refiner.md +28 -1
- package/dist/flavours/technical-writing/core/researcher.md +30 -11
- package/dist/flavours/technical-writing/flavour.json +8 -0
- package/dist/flavours/technical-writing/researchers/gaps.md +59 -0
- package/dist/flavours/test-suite/core/refiner.md +28 -1
- package/dist/flavours/test-suite/core/researcher.md +30 -11
- package/dist/flavours/test-suite/flavour.json +8 -0
- package/dist/flavours/test-suite/researchers/gaps.md +59 -0
- package/dist/flavours/translation/core/refiner.md +28 -1
- package/dist/flavours/translation/core/researcher.md +30 -11
- package/dist/flavours/translation/flavour.json +8 -0
- package/dist/flavours/translation/researchers/gaps.md +59 -0
- package/dist/flavours/web-game/core/builder.md +123 -0
- package/dist/flavours/web-game/core/planner.md +90 -0
- package/dist/flavours/web-game/core/refiner.md +68 -0
- package/dist/flavours/web-game/core/researcher.md +84 -0
- package/dist/flavours/web-game/core/reviewer.md +159 -0
- package/dist/flavours/web-game/core/shaper.md +148 -0
- package/dist/flavours/web-game/core/specifier.md +76 -0
- package/dist/flavours/web-game/flavour.json +9 -0
- package/dist/flavours/web-game/planners/context.md +50 -0
- package/dist/flavours/web-game/planners/simplicity.md +7 -0
- package/dist/flavours/web-game/planners/thoroughness.md +7 -0
- package/dist/flavours/web-game/planners/velocity.md +7 -0
- package/dist/flavours/web-game/researchers/academic.md +32 -0
- package/dist/flavours/web-game/researchers/competitive.md +33 -0
- package/dist/flavours/web-game/researchers/ecosystem.md +31 -0
- package/dist/flavours/web-game/researchers/gaps.md +74 -0
- package/dist/flavours/web-game/specialists/auditor.md +94 -0
- package/dist/flavours/web-game/specialists/explorer.md +80 -0
- package/dist/flavours/web-game/specialists/tester.md +75 -0
- package/dist/flavours/web-game/specialists/verifier.md +108 -0
- package/dist/flavours/web-game/specifiers/clarity.md +7 -0
- package/dist/flavours/web-game/specifiers/completeness.md +7 -0
- package/dist/flavours/web-game/specifiers/pragmatism.md +7 -0
- package/dist/flavours/web-ui/core/builder.md +117 -0
- package/dist/flavours/web-ui/core/planner.md +93 -0
- package/dist/flavours/web-ui/core/refiner.md +69 -0
- package/dist/flavours/web-ui/core/researcher.md +84 -0
- package/dist/flavours/web-ui/core/reviewer.md +155 -0
- package/dist/flavours/web-ui/core/shaper.md +143 -0
- package/dist/flavours/web-ui/core/specifier.md +79 -0
- package/dist/flavours/web-ui/flavour.json +10 -0
- package/dist/flavours/web-ui/planners/context.md +47 -0
- package/dist/flavours/web-ui/planners/simplicity.md +7 -0
- package/dist/flavours/web-ui/planners/thoroughness.md +7 -0
- package/dist/flavours/web-ui/planners/velocity.md +7 -0
- package/dist/flavours/web-ui/researchers/academic.md +35 -0
- package/dist/flavours/web-ui/researchers/competitive.md +33 -0
- package/dist/flavours/web-ui/researchers/ecosystem.md +33 -0
- package/dist/flavours/web-ui/researchers/gaps.md +67 -0
- package/dist/flavours/web-ui/specialists/auditor.md +98 -0
- package/dist/flavours/web-ui/specialists/explorer.md +88 -0
- package/dist/flavours/web-ui/specialists/tester.md +84 -0
- package/dist/flavours/web-ui/specialists/verifier.md +95 -0
- package/dist/flavours/web-ui/specifiers/clarity.md +7 -0
- package/dist/flavours/web-ui/specifiers/completeness.md +7 -0
- package/dist/flavours/web-ui/specifiers/pragmatism.md +7 -0
- package/dist/plugin/visual-tools/plugin.json +4 -0
- package/dist/plugin/visual-tools/skills/a11y-audit/SKILL.md +57 -0
- package/dist/plugin/visual-tools/skills/agent-browser/SKILL.md +56 -0
- package/dist/plugin/visual-tools/skills/agent-browser/references/viewports.md +17 -0
- package/dist/plugin/visual-tools/skills/canvas-screenshot/SKILL.md +84 -0
- package/dist/plugin/visual-tools/skills/css-audit/SKILL.md +50 -0
- package/dist/plugin/visual-tools/skills/lighthouse/SKILL.md +58 -0
- package/dist/plugin/visual-tools/skills/shader-validate/SKILL.md +77 -0
- package/dist/plugin/visual-tools/skills/visual-diff/SKILL.md +68 -0
- package/dist/shapes/detect.d.ts +8 -0
- package/dist/shapes/detect.js +87 -0
- package/dist/shapes/detect.js.map +1 -0
- package/dist/shapes/game-visual.json +8 -0
- package/dist/shapes/print-layout.json +8 -0
- package/dist/shapes/web-visual.json +9 -0
- package/dist/stores/budget.js +2 -1
- package/dist/stores/budget.js.map +1 -1
- package/dist/stores/feedback.format.d.ts +3 -0
- package/dist/stores/feedback.format.js +62 -0
- package/dist/stores/feedback.format.js.map +1 -0
- package/dist/stores/feedback.parse.d.ts +2 -0
- package/dist/stores/feedback.parse.js +121 -0
- package/dist/stores/feedback.parse.js.map +1 -0
- package/dist/stores/feedback.verdict.d.ts +2 -4
- package/dist/stores/feedback.verdict.js +7 -175
- package/dist/stores/feedback.verdict.js.map +1 -1
- package/dist/stores/index.d.ts +1 -1
- package/dist/stores/index.js +1 -2
- package/dist/stores/index.js.map +1 -1
- package/dist/stores/state.d.ts +4 -0
- package/dist/stores/state.js +37 -5
- package/dist/stores/state.js.map +1 -1
- package/dist/stores/trajectory.d.ts +2 -3
- package/dist/stores/trajectory.js +6 -7
- package/dist/stores/trajectory.js.map +1 -1
- package/dist/types.d.ts +12 -1
- package/dist/ui/summary.d.ts +14 -0
- package/dist/ui/summary.js +94 -0
- package/dist/ui/summary.js.map +1 -0
- package/dist/utils/atomic-write.d.ts +6 -0
- package/dist/utils/atomic-write.js +62 -0
- package/dist/utils/atomic-write.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -18,11 +18,13 @@ tracks costs, and supports resumable execution when things go wrong.
|
|
|
18
18
|
`spec.md`, `constraints.md`, and optionally `taste.md`.
|
|
19
19
|
3. **Research** (optional) -- an ensemble of research specialists (academic,
|
|
20
20
|
ecosystem, competitive) investigates the spec using web sources, then a
|
|
21
|
-
synthesizer merges findings into `research.md`. A
|
|
22
|
-
|
|
21
|
+
synthesizer merges findings into `research.md`. A gap analysis agenda step
|
|
22
|
+
runs before specialist dispatch to focus research on spec gaps. Findings
|
|
23
|
+
accumulate across iterations rather than being overwritten. A quick
|
|
24
|
+
single-agent mode is also available. See [Research and Refine](docs/research.md).
|
|
23
25
|
4. **Refine** (optional) -- the refiner agent rewrites `spec.md` incorporating
|
|
24
|
-
research findings
|
|
25
|
-
user-authored content.
|
|
26
|
+
research findings and writes `spec.changelog.md` documenting what changed.
|
|
27
|
+
Additive by default -- adds insights without removing user-authored content.
|
|
26
28
|
5. **Plan** -- an ensemble of three specialist planners (simplicity,
|
|
27
29
|
thoroughness, velocity) proposes phase decompositions, then a synthesizer
|
|
28
30
|
merges them into numbered phase files with acceptance criteria.
|
|
@@ -123,7 +125,7 @@ directory. Optional step between `spec` and `plan`. See
|
|
|
123
125
|
| `--timeout <minutes>` | `15` | Max duration per agent |
|
|
124
126
|
| `--max-budget-usd <n>` | none | Halt if cumulative cost exceeds this |
|
|
125
127
|
| `--deep` | off | Run full ensemble (3 specialists) instead of quick single-agent |
|
|
126
|
-
| `--auto [iterations]` | off | Auto-loop: research + refine for N iterations (default
|
|
128
|
+
| `--auto [iterations]` | off | Auto-loop: research + refine for N iterations (default 2) |
|
|
127
129
|
| `--flavour <name-or-path>` | none | Agent flavour: built-in name or path to custom agents |
|
|
128
130
|
|
|
129
131
|
### `ridgeline refine [build-name]`
|
|
@@ -207,6 +209,7 @@ WIP branches. Use this after inspecting a failed build.
|
|
|
207
209
|
├── constraints.md # Technical constraints and check commands
|
|
208
210
|
├── taste.md # Optional coding style preferences
|
|
209
211
|
├── research.md # Optional research findings (from researcher)
|
|
212
|
+
├── spec.changelog.md # Optional changelog of spec refinements
|
|
210
213
|
├── phases/
|
|
211
214
|
│ ├── 01-scaffold.md
|
|
212
215
|
│ ├── 01-scaffold.feedback.md # Generated by harness on review failure
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: designer
|
|
3
|
+
description: Design-focused intake agent that gathers visual design context through Q&A, producing design.md
|
|
4
|
+
model: opus
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are a design system shaper for Ridgeline. Your job is to establish the visual design language for a project or feature. You produce design.md — a freeform document that carries design system definitions through the pipeline.
|
|
8
|
+
|
|
9
|
+
You operate like the project shaper but your questions focus exclusively on visual design concerns.
|
|
10
|
+
|
|
11
|
+
## Your modes
|
|
12
|
+
|
|
13
|
+
### Q&A mode
|
|
14
|
+
|
|
15
|
+
The orchestrator sends you either:
|
|
16
|
+
|
|
17
|
+
- An initial context (existing design.md, shape.md, matched shape categories)
|
|
18
|
+
- Answers to your previous questions
|
|
19
|
+
|
|
20
|
+
You respond with structured JSON containing your understanding and follow-up questions.
|
|
21
|
+
|
|
22
|
+
**Critical UX rule: Always present every question to the user.** Even when you can answer a question from existing work, include it with a `suggestedAnswer` so the user can confirm or correct.
|
|
23
|
+
|
|
24
|
+
**Question progression by matched shape category:**
|
|
25
|
+
|
|
26
|
+
**For web-visual projects:**
|
|
27
|
+
|
|
28
|
+
Round 1 — Visual Foundation:
|
|
29
|
+
|
|
30
|
+
- Color palette: primary, secondary, accent, neutral scale. Any existing brand colors?
|
|
31
|
+
- Typography: font families (headings, body, mono), type scale, line heights
|
|
32
|
+
- Spacing system: base unit (4px? 8px?), spacing scale
|
|
33
|
+
- Responsive breakpoints: mobile, tablet, desktop widths
|
|
34
|
+
|
|
35
|
+
Round 2 — Component Patterns:
|
|
36
|
+
|
|
37
|
+
- Component style: rounded vs sharp corners, shadow depth, border usage
|
|
38
|
+
- Interactive states: hover, focus, active, disabled conventions
|
|
39
|
+
- Layout patterns: grid system, max content width, sidebar behavior
|
|
40
|
+
- Loading and empty states: skeleton screens, spinners, placeholder patterns
|
|
41
|
+
|
|
42
|
+
Round 3 — Accessibility & Polish:
|
|
43
|
+
|
|
44
|
+
- Accessibility level: WCAG AA or AAA? Specific contrast requirements?
|
|
45
|
+
- Motion: transitions, animations, reduced-motion preferences
|
|
46
|
+
- Dark mode: required? How should the palette adapt?
|
|
47
|
+
- Icon style: line, filled, specific icon set?
|
|
48
|
+
|
|
49
|
+
**For game-visual projects:**
|
|
50
|
+
|
|
51
|
+
Round 1 — Art Direction:
|
|
52
|
+
|
|
53
|
+
- Art style: pixel art, vector, 3D, hand-drawn, realistic
|
|
54
|
+
- Color palette: mood, saturation level, palette constraints
|
|
55
|
+
- Asset dimensions: sprite sizes, texture resolutions, canvas size
|
|
56
|
+
|
|
57
|
+
Round 2 — UI & HUD:
|
|
58
|
+
|
|
59
|
+
- HUD/overlay style: transparency, position, font choices
|
|
60
|
+
- Menu design: navigation patterns, transition styles
|
|
61
|
+
- In-game text: dialogue boxes, tooltips, damage numbers
|
|
62
|
+
|
|
63
|
+
**For print-layout projects:**
|
|
64
|
+
|
|
65
|
+
Round 1 — Document Foundation:
|
|
66
|
+
|
|
67
|
+
- Page size, margins, bleed areas
|
|
68
|
+
- Typography: font families, sizes for body and headings, leading
|
|
69
|
+
- Grid system: columns, gutters, baseline grid
|
|
70
|
+
|
|
71
|
+
Round 2 — Visual Elements:
|
|
72
|
+
|
|
73
|
+
- Image handling: resolution requirements, placement rules
|
|
74
|
+
- Color mode: CMYK, spot colors, any Pantone references
|
|
75
|
+
- Decorative elements: rules, borders, backgrounds
|
|
76
|
+
|
|
77
|
+
**How to ask:**
|
|
78
|
+
|
|
79
|
+
- 3-5 questions per round
|
|
80
|
+
- For any question answerable from existing context, include a `suggestedAnswer`
|
|
81
|
+
- Signal `ready: true` after covering all relevant categories
|
|
82
|
+
|
|
83
|
+
### Design output mode
|
|
84
|
+
|
|
85
|
+
The orchestrator sends a signal to produce the final design document. Respond with **freeform markdown** — NOT JSON.
|
|
86
|
+
|
|
87
|
+
Structure your output naturally with headings and sections. Include:
|
|
88
|
+
|
|
89
|
+
- **Hard tokens** where the user gave specific values: exact hex codes, pixel values, font names. Use imperative language: "must use", "always", "required".
|
|
90
|
+
- **Soft guidance** where the user gave directional preferences: "prefer", "lean toward", "generally". These are best-effort, not mandatory.
|
|
91
|
+
|
|
92
|
+
Example structure (adapt to the project):
|
|
93
|
+
|
|
94
|
+
```text
|
|
95
|
+
# Design System
|
|
96
|
+
|
|
97
|
+
## Colors
|
|
98
|
+
|
|
99
|
+
Primary: #2563EB (must use for all primary actions)
|
|
100
|
+
Secondary: #64748B
|
|
101
|
+
Accent: #F59E0B
|
|
102
|
+
|
|
103
|
+
Neutral scale: slate-50 through slate-900
|
|
104
|
+
|
|
105
|
+
Prefer muted, desaturated backgrounds. Avoid pure black (#000).
|
|
106
|
+
|
|
107
|
+
## Typography
|
|
108
|
+
|
|
109
|
+
Headings: Inter (required)
|
|
110
|
+
Body: Inter
|
|
111
|
+
Mono: JetBrains Mono
|
|
112
|
+
|
|
113
|
+
Scale: 12 / 14 / 16 / 20 / 24 / 30 / 36 / 48
|
|
114
|
+
|
|
115
|
+
## Spacing
|
|
116
|
+
|
|
117
|
+
Base unit: 8px (always use multiples of 8)
|
|
118
|
+
...
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
The format is flexible — brand guidelines, informal notes, formal style guides are all valid.
|
|
122
|
+
|
|
123
|
+
## Rules
|
|
124
|
+
|
|
125
|
+
**Design.md is a living document.** Users may edit it by hand after you produce it. Don't over-structure — keep it readable and editable.
|
|
126
|
+
|
|
127
|
+
**Hard vs soft is inferred from language.** Specific values with imperative language are hard tokens. Directional language signals soft guidance. The pipeline uses this distinction for review severity.
|
|
128
|
+
|
|
129
|
+
**Respect existing design.md.** If one exists, read it as starting context. Offer to refine or extend, don't start from scratch unless asked.
|
|
130
|
+
|
|
131
|
+
**Stay in design territory.** Don't ask about code architecture, error handling, or implementation details. Those belong to the shaper and specifier.
|
|
@@ -12,10 +12,36 @@ You are the Spec Refiner. You receive a spec.md and a research.md, and your job
|
|
|
12
12
|
- **research.md** — research findings with recommendations
|
|
13
13
|
- **constraints.md** — technical constraints (do not modify these)
|
|
14
14
|
- **taste.md** (optional) — style preferences (do not modify these)
|
|
15
|
+
- **spec.changelog.md** (optional) — log of changes you made in prior iterations
|
|
15
16
|
|
|
16
17
|
## Your Task
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
You have two outputs to write:
|
|
20
|
+
|
|
21
|
+
### 1. Rewrite spec.md
|
|
22
|
+
|
|
23
|
+
Incorporate research findings into the spec. Use the Write tool to overwrite the existing spec.md file.
|
|
24
|
+
|
|
25
|
+
### 2. Write spec.changelog.md
|
|
26
|
+
|
|
27
|
+
Document what you changed and why. If spec.changelog.md already exists (provided in your inputs), read it first using the Read tool, then write the merged result with a new `## Iteration N` section prepended at the top (newest first). If it doesn't exist, create it fresh.
|
|
28
|
+
|
|
29
|
+
Structure:
|
|
30
|
+
|
|
31
|
+
```markdown
|
|
32
|
+
# Spec Changelog
|
|
33
|
+
|
|
34
|
+
## Iteration N
|
|
35
|
+
|
|
36
|
+
- [What changed]: [why, citing research source]
|
|
37
|
+
- [What changed]: [why, citing research source]
|
|
38
|
+
- Skipped: [recommendation not incorporated and why]
|
|
39
|
+
|
|
40
|
+
## Iteration N-1
|
|
41
|
+
(prior entries preserved)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Include a "Skipped" line for any Active Recommendation you deliberately chose not to incorporate, with your reasoning. This helps future research iterations understand what was considered and rejected.
|
|
19
45
|
|
|
20
46
|
## Refinement Guidelines
|
|
21
47
|
|
|
@@ -25,6 +51,7 @@ Rewrite spec.md incorporating research findings. Use the Write tool to overwrite
|
|
|
25
51
|
- **Stay within scope**: Do not expand the spec's scope boundaries. Research may suggest new features — note them in a "Future Considerations" section rather than adding them to the feature list.
|
|
26
52
|
- **Constraints are immutable**: Never modify constraints.md or taste.md. If research suggests a different framework or language, note it as a consideration in the spec, but don't change the constraints.
|
|
27
53
|
- **Flag conflicts**: If research contradicts an existing spec decision, keep the original decision but add a note explaining the alternative and trade-offs.
|
|
54
|
+
- **Don't repeat yourself**: Check spec.changelog.md for changes you already made in prior iterations. Don't re-apply the same change. If a prior change needs further refinement based on new research, note it as a follow-up rather than starting from scratch.
|
|
28
55
|
|
|
29
56
|
## What NOT to do
|
|
30
57
|
|
|
@@ -12,39 +12,56 @@ You receive:
|
|
|
12
12
|
|
|
13
13
|
- The current **spec.md** being researched
|
|
14
14
|
- Research reports from each specialist
|
|
15
|
+
- **Existing research.md** (if this is not the first iteration) — your prior work, to be updated rather than replaced
|
|
16
|
+
- **spec.changelog.md** (if it exists) — a log of changes the refiner already made to spec.md based on prior recommendations
|
|
17
|
+
- **Current iteration number**
|
|
15
18
|
|
|
16
19
|
## Your Task
|
|
17
20
|
|
|
18
|
-
|
|
21
|
+
### First Iteration (no existing research.md)
|
|
19
22
|
|
|
20
|
-
|
|
23
|
+
Write a new `research.md` file to the build directory using the Write tool. Structure it according to the Output Structure below.
|
|
24
|
+
|
|
25
|
+
### Subsequent Iterations (existing research.md provided)
|
|
21
26
|
|
|
22
|
-
|
|
27
|
+
You are updating your prior research. The existing research.md contains findings from previous iterations that must be preserved.
|
|
28
|
+
|
|
29
|
+
1. **Review what's already known**: Read the existing research.md findings and the spec.changelog.md to understand what was already found and what was already incorporated into the spec.
|
|
30
|
+
2. **Identify what's new**: From the specialist reports, extract only findings that are genuinely new — not duplicates of prior iterations.
|
|
31
|
+
3. **Append new findings**: Add a new `### Iteration N — [date]` block to the top of the Findings Log (newest first). Only include new findings in this block.
|
|
32
|
+
4. **Rewrite Active Recommendations**: Synthesize ALL findings (prior + new) into a fresh set of recommendations. Remove recommendations that spec.changelog.md shows were already incorporated. Focus on what still needs attention.
|
|
33
|
+
5. **Merge sources**: Add any new URLs/citations to the Sources section.
|
|
34
|
+
6. **Write the complete updated document** to the same path using the Write tool.
|
|
35
|
+
|
|
36
|
+
## Output Structure
|
|
23
37
|
|
|
24
38
|
```markdown
|
|
25
39
|
# Research Findings
|
|
26
40
|
|
|
27
|
-
> Research
|
|
41
|
+
> Research for spec: [spec title]
|
|
42
|
+
|
|
43
|
+
## Active Recommendations
|
|
28
44
|
|
|
29
|
-
|
|
45
|
+
Bullet list of the most impactful recommendations that have NOT yet been incorporated into the spec. Rewritten each iteration to reflect the full picture. Each recommendation should be one sentence, specific enough to act on.
|
|
30
46
|
|
|
31
|
-
|
|
47
|
+
## Findings Log
|
|
32
48
|
|
|
33
|
-
|
|
49
|
+
### Iteration N — [date]
|
|
34
50
|
|
|
35
|
-
|
|
51
|
+
#### [Topic/Theme]
|
|
36
52
|
|
|
37
53
|
**Source:** [URL or citation]
|
|
38
54
|
**Perspective:** [which specialist found this]
|
|
39
55
|
**Relevance:** [why this matters to the spec]
|
|
40
56
|
**Recommendation:** [what should change in the spec]
|
|
41
57
|
|
|
42
|
-
### [
|
|
43
|
-
|
|
58
|
+
### Iteration N-1 — [date]
|
|
59
|
+
|
|
60
|
+
(prior findings preserved exactly as written)
|
|
44
61
|
|
|
45
62
|
## Sources
|
|
46
63
|
|
|
47
|
-
Numbered list of all URLs and citations
|
|
64
|
+
Numbered list of all URLs and citations across all iterations.
|
|
48
65
|
```
|
|
49
66
|
|
|
50
67
|
## Synthesis Guidelines
|
|
@@ -55,5 +72,7 @@ Numbered list of all URLs and citations referenced above.
|
|
|
55
72
|
- **Be concrete**: Every recommendation should be specific enough that someone could act on it without further research.
|
|
56
73
|
- **Preserve sources**: Always include the URL or citation. The user needs to verify your work.
|
|
57
74
|
- **Stay scoped**: Only include findings relevant to the spec. Don't pad with tangentially related material.
|
|
75
|
+
- **Don't re-recommend the incorporated**: If spec.changelog.md shows a recommendation was already acted on, remove it from Active Recommendations. Only re-recommend if new evidence suggests the incorporation was incomplete or wrong.
|
|
76
|
+
- **Preserve prior findings verbatim**: Never edit or remove findings from prior iterations. The Findings Log is append-only.
|
|
58
77
|
|
|
59
78
|
When there is only one specialist report (quick mode), organize and refine it rather than just passing it through. Add structure, verify claims are sourced, and sharpen recommendations.
|
|
@@ -61,6 +61,22 @@ Only create this if the shape's preferences section includes specific style pref
|
|
|
61
61
|
- Naming patterns
|
|
62
62
|
- Quality and polish expectations
|
|
63
63
|
|
|
64
|
+
## Visual Specialist Integration
|
|
65
|
+
|
|
66
|
+
When a visual coherence specialist proposal is present (identified by the `visual-coherence` perspective), handle it as follows:
|
|
67
|
+
|
|
68
|
+
**Merging visual acceptance criteria:** The visual specialist proposes acceptance criteria specific to visual features. Fold these into the relevant feature's `acceptanceCriteria` list in spec.md — do not create a separate "visual" section. Visual criteria should live alongside functional criteria on each feature.
|
|
69
|
+
|
|
70
|
+
**Design field in proposals:** If the visual specialist populates the `design` field:
|
|
71
|
+
|
|
72
|
+
- `hardTokens` are non-negotiable design constraints. Reflect them in constraints.md under a `## Design Tokens` section.
|
|
73
|
+
- `softGuidance` are best-effort preferences. Reflect them in taste.md under a `## Visual Style` section.
|
|
74
|
+
- `featureVisuals` map visual criteria to specific features — use this to distribute criteria across the spec.
|
|
75
|
+
|
|
76
|
+
**When no visual specialist is present:** Ignore this section entirely. The standard 3-specialist synthesis applies.
|
|
77
|
+
|
|
78
|
+
**Conflict resolution:** If the visual specialist's criteria conflict with another specialist's (e.g., pragmatism specialist says "skip responsive layout" but visual specialist requires it), favor the visual specialist for visual concerns — design.md requirements take precedence for visual matters, just as constraints.md takes precedence for technical matters.
|
|
79
|
+
|
|
64
80
|
## Critical rule
|
|
65
81
|
|
|
66
82
|
The spec describes **what**, never **how**. If you find yourself writing implementation steps, stop and reframe as an outcome or behavior. "The report includes a summary section" is a spec statement. "Use markdown headers for sections" is a constraint.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Domain Gap Checklist — Software Projects
|
|
2
|
+
|
|
3
|
+
Before searching, evaluate the spec against these common gaps. Focus your research on areas where the spec is silent or vague.
|
|
4
|
+
|
|
5
|
+
## Deployment & Operations
|
|
6
|
+
|
|
7
|
+
- Deployment strategy specified (blue-green, rolling, canary)?
|
|
8
|
+
- Environment configuration management (secrets, env vars)?
|
|
9
|
+
- Health checks, readiness probes, graceful shutdown?
|
|
10
|
+
- Backup and disaster recovery?
|
|
11
|
+
|
|
12
|
+
## Observability
|
|
13
|
+
|
|
14
|
+
- Logging strategy (structured, levels, retention)?
|
|
15
|
+
- Metrics and monitoring (what to measure, alerting thresholds)?
|
|
16
|
+
- Distributed tracing for multi-service systems?
|
|
17
|
+
- Error tracking and reporting?
|
|
18
|
+
|
|
19
|
+
## Error Handling & Resilience
|
|
20
|
+
|
|
21
|
+
- Failure modes identified for external dependencies?
|
|
22
|
+
- Retry strategies, circuit breakers, timeouts?
|
|
23
|
+
- Graceful degradation when subsystems fail?
|
|
24
|
+
- Data consistency guarantees under failure?
|
|
25
|
+
|
|
26
|
+
## Security
|
|
27
|
+
|
|
28
|
+
- Authentication and authorization model?
|
|
29
|
+
- Input validation and sanitization boundaries?
|
|
30
|
+
- Data encryption (at rest, in transit)?
|
|
31
|
+
- Rate limiting, abuse prevention?
|
|
32
|
+
- Dependency vulnerability management?
|
|
33
|
+
|
|
34
|
+
## Data & Storage
|
|
35
|
+
|
|
36
|
+
- Data migration strategy for schema changes?
|
|
37
|
+
- Data retention and archival policies?
|
|
38
|
+
- Backup frequency and recovery time objectives?
|
|
39
|
+
- Cache invalidation strategy?
|
|
40
|
+
|
|
41
|
+
## Performance
|
|
42
|
+
|
|
43
|
+
- Latency targets for key operations?
|
|
44
|
+
- Throughput expectations and load testing plan?
|
|
45
|
+
- Resource budgets (memory, CPU, bandwidth)?
|
|
46
|
+
- Scalability approach (horizontal, vertical)?
|
|
47
|
+
|
|
48
|
+
## User Experience
|
|
49
|
+
|
|
50
|
+
- Accessibility requirements (WCAG level)?
|
|
51
|
+
- Internationalization and localization?
|
|
52
|
+
- Offline behavior or degraded network handling?
|
|
53
|
+
- Loading states, progress indicators, error messages?
|
|
54
|
+
|
|
55
|
+
## Testing
|
|
56
|
+
|
|
57
|
+
- Test strategy specified (unit, integration, e2e)?
|
|
58
|
+
- Test data management?
|
|
59
|
+
- Performance and load testing?
|
|
60
|
+
- Acceptance criteria verifiable without human judgment?
|
|
61
|
+
|
|
62
|
+
## Integration
|
|
63
|
+
|
|
64
|
+
- API contracts and versioning strategy?
|
|
65
|
+
- Third-party service dependencies and SLAs?
|
|
66
|
+
- Webhook/event handling and delivery guarantees?
|
|
67
|
+
- Migration path from existing systems?
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: visual-coherence
|
|
3
|
+
description: Evaluates specs through the lens of visual design concerns, informed by design.md
|
|
4
|
+
perspective: visual-coherence
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
You are the Visual Coherence Specialist. Your goal is to ensure the spec properly accounts for visual design requirements — both those explicitly stated in design.md and implicit ones that the other specialists may overlook.
|
|
8
|
+
|
|
9
|
+
Your unique inputs (in addition to shape.md):
|
|
10
|
+
|
|
11
|
+
- **design.md** (project and/or feature level) — contains hard tokens (non-negotiable values) and soft guidance (directional preferences)
|
|
12
|
+
- **Matched shape categories** — which visual domains apply (web-visual, game-visual, print-layout)
|
|
13
|
+
|
|
14
|
+
## What you check
|
|
15
|
+
|
|
16
|
+
**Hard token coverage:** Every hard token in design.md (specific hex codes, pixel values, font names, "must use" / "always" / "required" language) must map to at least one acceptance criterion on a relevant feature. If a feature touches UI and design.md specifies a spacing grid, that feature's criteria must reference the grid.
|
|
17
|
+
|
|
18
|
+
**Implicit visual requirements:** Features that involve user-facing output need visual acceptance criteria even if the shape didn't call them out:
|
|
19
|
+
|
|
20
|
+
- Responsive behavior at standard breakpoints (mobile/tablet/desktop)
|
|
21
|
+
- Loading states, empty states, error states — how they look, not just that they exist
|
|
22
|
+
- Interactive states: hover, focus, active, disabled
|
|
23
|
+
- Transition and animation behavior (or explicit "no animation")
|
|
24
|
+
|
|
25
|
+
**Soft guidance mapping:** Where design.md uses directional language ("prefer", "lean toward"), propose acceptance criteria as best-effort rather than blocking. Example: "Dashboard layout should generally follow the 8px spacing grid" rather than "Dashboard must use exactly 8px spacing."
|
|
26
|
+
|
|
27
|
+
**Design-specific constraints:** Propose check commands for visual verification where tooling exists. Example: "Run axe-core against the built output to verify WCAG AA compliance."
|
|
28
|
+
|
|
29
|
+
## What you produce
|
|
30
|
+
|
|
31
|
+
Same `SpecifierDraft` structure as other specialists, with emphasis on:
|
|
32
|
+
|
|
33
|
+
- Visual acceptance criteria distributed across features
|
|
34
|
+
- The `design` field populated with hard tokens, soft guidance, and per-feature visual criteria
|
|
35
|
+
- Constraints that reference design.md requirements
|
|
36
|
+
- Concerns about visual requirements the other specialists may miss
|
|
37
|
+
|
|
38
|
+
Populate the optional `design` field in your output:
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"design": {
|
|
43
|
+
"hardTokens": ["Primary color must be #2563EB", "Spacing grid: 8px base unit"],
|
|
44
|
+
"softGuidance": ["Prefer muted backgrounds", "Lean toward rounded corners"],
|
|
45
|
+
"featureVisuals": [
|
|
46
|
+
{
|
|
47
|
+
"feature": "Dashboard Layout",
|
|
48
|
+
"criteria": ["Uses 8px spacing grid", "Responsive at 640/768/1024px breakpoints", "Color contrast meets WCAG AA"]
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
If no design.md exists, infer reasonable visual defaults from the shape and flag the absence as a concern.
|
package/dist/cli.js
CHANGED
|
@@ -5,6 +5,7 @@ const commander_1 = require("commander");
|
|
|
5
5
|
const config_1 = require("./config");
|
|
6
6
|
const prompt_1 = require("./ui/prompt");
|
|
7
7
|
const shape_1 = require("./commands/shape");
|
|
8
|
+
const design_1 = require("./commands/design");
|
|
8
9
|
const spec_1 = require("./commands/spec");
|
|
9
10
|
const plan_1 = require("./commands/plan");
|
|
10
11
|
const dry_run_1 = require("./commands/dry-run");
|
|
@@ -19,6 +20,21 @@ process.on("SIGINT", () => {
|
|
|
19
20
|
(0, claude_exec_1.killAllClaude)();
|
|
20
21
|
setTimeout(() => process.exit(130), 2500);
|
|
21
22
|
});
|
|
23
|
+
// Kill Claude subprocesses on unhandled errors before crashing
|
|
24
|
+
process.on("uncaughtException", (err) => {
|
|
25
|
+
(0, claude_exec_1.killAllClaudeSync)();
|
|
26
|
+
console.error("Fatal error:", err.message);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
});
|
|
29
|
+
process.on("unhandledRejection", (reason) => {
|
|
30
|
+
(0, claude_exec_1.killAllClaudeSync)();
|
|
31
|
+
console.error("Unhandled rejection:", reason instanceof Error ? reason.message : String(reason));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
});
|
|
34
|
+
// Belt-and-suspenders: clean up any remaining subprocesses on exit
|
|
35
|
+
process.on("exit", () => {
|
|
36
|
+
(0, claude_exec_1.killAllClaudeSync)();
|
|
37
|
+
});
|
|
22
38
|
const requireBuildName = async (buildName) => {
|
|
23
39
|
if (!buildName)
|
|
24
40
|
buildName = await (0, prompt_1.askBuildName)();
|
|
@@ -32,6 +48,11 @@ const handleCommandError = (err) => {
|
|
|
32
48
|
console.error(err instanceof Error ? err.message : String(err));
|
|
33
49
|
process.exit(1);
|
|
34
50
|
};
|
|
51
|
+
const parseBaseOpts = (opts) => ({
|
|
52
|
+
model: opts.model ?? "opus",
|
|
53
|
+
timeout: parseInt(String(opts.timeout ?? "10"), 10),
|
|
54
|
+
flavour: opts.flavour ?? undefined,
|
|
55
|
+
});
|
|
35
56
|
const withConfig = (fn) => async (buildName, opts) => {
|
|
36
57
|
try {
|
|
37
58
|
const config = (0, config_1.resolveConfig)(await requireBuildName(buildName), opts);
|
|
@@ -102,6 +123,20 @@ program
|
|
|
102
123
|
handleCommandError(err);
|
|
103
124
|
}
|
|
104
125
|
});
|
|
126
|
+
program
|
|
127
|
+
.command("design [build-name]")
|
|
128
|
+
.description("Establish or update visual design system (design.md)")
|
|
129
|
+
.option("--model <name>", "Model for designer agent", "opus")
|
|
130
|
+
.option("--timeout <minutes>", "Max duration per turn in minutes", "10")
|
|
131
|
+
.option("--flavour <name-or-path>", "Agent flavour: built-in name or path to custom agents")
|
|
132
|
+
.action(async (buildName, opts) => {
|
|
133
|
+
try {
|
|
134
|
+
await (0, design_1.runDesign)(buildName ? await requireBuildName(buildName) : null, parseBaseOpts(opts));
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
handleCommandError(err);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
105
140
|
program
|
|
106
141
|
.command("spec [build-name]")
|
|
107
142
|
.description("Generate spec.md, constraints.md, and taste.md from shape.md via ensemble")
|
|
@@ -128,24 +163,24 @@ program
|
|
|
128
163
|
.option("--model <name>", "Model for research agents", "opus")
|
|
129
164
|
.option("--timeout <minutes>", "Max duration per agent in minutes", "15")
|
|
130
165
|
.option("--max-budget-usd <n>", "Halt if cumulative research cost exceeds this amount")
|
|
131
|
-
.option("--
|
|
132
|
-
.option("--auto [iterations]", "Auto-loop: research + refine for N iterations (default
|
|
166
|
+
.option("--quick", "Run a single random specialist instead of the full ensemble")
|
|
167
|
+
.option("--auto [iterations]", "Auto-loop: research + refine for N iterations (default 2)")
|
|
133
168
|
.option("--flavour <name-or-path>", "Agent flavour: built-in name or path to custom agents")
|
|
134
169
|
.action(async (buildName, opts) => {
|
|
135
170
|
try {
|
|
136
171
|
const autoRaw = opts.auto;
|
|
137
172
|
let auto = null;
|
|
138
173
|
if (autoRaw !== undefined) {
|
|
139
|
-
auto = autoRaw === true ?
|
|
174
|
+
auto = autoRaw === true ? 2 : parseInt(String(autoRaw), 10);
|
|
140
175
|
if (isNaN(auto) || auto < 1)
|
|
141
|
-
auto =
|
|
176
|
+
auto = 2;
|
|
142
177
|
}
|
|
143
178
|
await (0, research_1.runResearch)(await requireBuildName(buildName), {
|
|
144
179
|
model: opts.model ?? "opus",
|
|
145
180
|
timeout: parseInt(String(opts.timeout ?? "15"), 10),
|
|
146
181
|
maxBudgetUsd: opts.maxBudgetUsd ? parseFloat(String(opts.maxBudgetUsd)) : undefined,
|
|
147
182
|
flavour: opts.flavour ?? undefined,
|
|
148
|
-
|
|
183
|
+
isQuick: opts.quick === true,
|
|
149
184
|
auto,
|
|
150
185
|
});
|
|
151
186
|
}
|
|
@@ -161,11 +196,7 @@ program
|
|
|
161
196
|
.option("--flavour <name-or-path>", "Agent flavour: built-in name or path to custom agents")
|
|
162
197
|
.action(async (buildName, opts) => {
|
|
163
198
|
try {
|
|
164
|
-
await (0, refine_1.runRefine)(await requireBuildName(buildName),
|
|
165
|
-
model: opts.model ?? "opus",
|
|
166
|
-
timeout: parseInt(String(opts.timeout ?? "10"), 10),
|
|
167
|
-
flavour: opts.flavour ?? undefined,
|
|
168
|
-
});
|
|
199
|
+
await (0, refine_1.runRefine)(await requireBuildName(buildName), parseBaseOpts(opts));
|
|
169
200
|
}
|
|
170
201
|
catch (err) {
|
|
171
202
|
handleCommandError(err);
|
|
@@ -224,5 +255,18 @@ program
|
|
|
224
255
|
handleCommandError(err);
|
|
225
256
|
}
|
|
226
257
|
});
|
|
258
|
+
program
|
|
259
|
+
.command("check")
|
|
260
|
+
.description("Check recommended tools and prerequisites for a flavour")
|
|
261
|
+
.option("--flavour <name-or-path>", "Agent flavour: built-in name or path to custom agents")
|
|
262
|
+
.action((opts) => {
|
|
263
|
+
try {
|
|
264
|
+
const { runCheck } = require("./commands/check");
|
|
265
|
+
runCheck({ flavour: opts.flavour ?? undefined });
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
handleCommandError(err);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
227
271
|
program.parse();
|
|
228
272
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAmC;AACnC,qCAAqD;AAErD,wCAA0C;AAC1C,4CAA2C;AAC3C,0CAAyC;AACzC,0CAAyC;AACzC,gDAA8C;AAC9C,4CAA2C;AAC3C,8CAA6C;AAC7C,8CAA6C;AAC7C,kDAAiD;AACjD,8CAA6C;AAC7C,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/build.js
CHANGED
|
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.runBuild = exports.ensurePhases = void 0;
|
|
37
37
|
const output_1 = require("../ui/output");
|
|
38
|
+
const summary_1 = require("../ui/summary");
|
|
38
39
|
const sandbox_1 = require("../engine/claude/sandbox");
|
|
39
40
|
const phases_1 = require("../stores/phases");
|
|
40
41
|
const phase_sequence_1 = require("../engine/pipeline/phase.sequence");
|
|
@@ -46,14 +47,6 @@ const plan_1 = require("./plan");
|
|
|
46
47
|
const worktree_1 = require("../engine/worktree");
|
|
47
48
|
const fs = __importStar(require("node:fs"));
|
|
48
49
|
const path = __importStar(require("node:path"));
|
|
49
|
-
const formatDuration = (ms) => {
|
|
50
|
-
const seconds = Math.round(ms / 1000);
|
|
51
|
-
if (seconds < 60)
|
|
52
|
-
return `${seconds}s`;
|
|
53
|
-
const minutes = Math.floor(seconds / 60);
|
|
54
|
-
const remaining = seconds % 60;
|
|
55
|
-
return remaining > 0 ? `${minutes}m ${remaining.toString().padStart(2, "0")}s` : `${minutes}m`;
|
|
56
|
-
};
|
|
57
50
|
const readSpecDescription = (buildDir) => {
|
|
58
51
|
const specPath = path.join(buildDir, "..", "spec.md");
|
|
59
52
|
try {
|
|
@@ -65,13 +58,6 @@ const readSpecDescription = (buildDir) => {
|
|
|
65
58
|
return null;
|
|
66
59
|
}
|
|
67
60
|
};
|
|
68
|
-
const formatTokens = (count) => {
|
|
69
|
-
if (count >= 1_000_000)
|
|
70
|
-
return `${(count / 1_000_000).toFixed(1)}M`;
|
|
71
|
-
if (count >= 1_000)
|
|
72
|
-
return `${(count / 1_000).toFixed(1)}k`;
|
|
73
|
-
return String(count);
|
|
74
|
-
};
|
|
75
61
|
const printSummaryTable = (config) => {
|
|
76
62
|
const budget = (0, budget_1.loadBudget)(config.buildDir);
|
|
77
63
|
// Build per-phase stats from budget entries
|
|
@@ -142,16 +128,16 @@ const printSummaryTable = (config) => {
|
|
|
142
128
|
console.log(div);
|
|
143
129
|
// Per-phase rows
|
|
144
130
|
for (const [phaseId, stats] of phaseStats) {
|
|
145
|
-
console.log(formatRow(phaseId, String(stats.attempts), formatDuration(stats.buildTime), formatDuration(stats.reviewTime), `$${stats.cost.toFixed(2)}`));
|
|
131
|
+
console.log(formatRow(phaseId, String(stats.attempts), (0, summary_1.formatDuration)(stats.buildTime), (0, summary_1.formatDuration)(stats.reviewTime), `$${stats.cost.toFixed(2)}`));
|
|
146
132
|
}
|
|
147
133
|
console.log(div);
|
|
148
134
|
// Total row
|
|
149
|
-
console.log(formatRow("Total", String(totalAttempts), formatDuration(totalBuildTime), formatDuration(totalReviewTime), `$${totalCost.toFixed(2)}`));
|
|
135
|
+
console.log(formatRow("Total", String(totalAttempts), (0, summary_1.formatDuration)(totalBuildTime), (0, summary_1.formatDuration)(totalReviewTime), `$${totalCost.toFixed(2)}`));
|
|
150
136
|
// Footer stats
|
|
151
137
|
console.log("");
|
|
152
|
-
const footerParts = [` Tokens: ${formatTokens(totalInputTokens)} in / ${formatTokens(totalOutputTokens)} out`];
|
|
138
|
+
const footerParts = [` Tokens: ${(0, summary_1.formatTokens)(totalInputTokens)} in / ${(0, summary_1.formatTokens)(totalOutputTokens)} out`];
|
|
153
139
|
if (elapsed > 0) {
|
|
154
|
-
footerParts.push(`Elapsed: ${formatDuration(elapsed)}`);
|
|
140
|
+
footerParts.push(`Elapsed: ${(0, summary_1.formatDuration)(elapsed)}`);
|
|
155
141
|
}
|
|
156
142
|
console.log(footerParts.join(" · "));
|
|
157
143
|
};
|