ralphy-spec 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.ja.md +94 -127
  3. package/README.ko.md +94 -127
  4. package/README.md +94 -129
  5. package/README.zh.md +94 -127
  6. package/bin/ralphy-spec.js +0 -0
  7. package/dist/cli/budget.d.ts +3 -0
  8. package/dist/cli/budget.d.ts.map +1 -0
  9. package/dist/cli/budget.js +77 -0
  10. package/dist/cli/budget.js.map +1 -0
  11. package/dist/cli/checkpoint.d.ts +3 -0
  12. package/dist/cli/checkpoint.d.ts.map +1 -0
  13. package/dist/cli/checkpoint.js +23 -0
  14. package/dist/cli/checkpoint.js.map +1 -0
  15. package/dist/cli/init.d.ts +3 -0
  16. package/dist/cli/init.d.ts.map +1 -0
  17. package/dist/cli/init.js +72 -0
  18. package/dist/cli/init.js.map +1 -0
  19. package/dist/cli/report.d.ts +3 -0
  20. package/dist/cli/report.d.ts.map +1 -0
  21. package/dist/cli/report.js +53 -0
  22. package/dist/cli/report.js.map +1 -0
  23. package/dist/cli/run.d.ts +3 -0
  24. package/dist/cli/run.d.ts.map +1 -0
  25. package/dist/cli/run.js +112 -0
  26. package/dist/cli/run.js.map +1 -0
  27. package/dist/cli/status.d.ts +3 -0
  28. package/dist/cli/status.d.ts.map +1 -0
  29. package/dist/cli/status.js +76 -0
  30. package/dist/cli/status.js.map +1 -0
  31. package/dist/cli/tail.d.ts +3 -0
  32. package/dist/cli/tail.d.ts.map +1 -0
  33. package/dist/cli/tail.js +46 -0
  34. package/dist/cli/tail.js.map +1 -0
  35. package/dist/cli/update.d.ts +3 -0
  36. package/dist/cli/update.d.ts.map +1 -0
  37. package/dist/cli/update.js +62 -0
  38. package/dist/cli/update.js.map +1 -0
  39. package/dist/cli/validate.d.ts +3 -0
  40. package/dist/cli/validate.d.ts.map +1 -0
  41. package/dist/cli/validate.js +83 -0
  42. package/dist/cli/validate.js.map +1 -0
  43. package/dist/core/artifacts/budget-writer.d.ts +11 -0
  44. package/dist/core/artifacts/budget-writer.d.ts.map +1 -0
  45. package/dist/core/artifacts/budget-writer.js +28 -0
  46. package/dist/core/artifacts/budget-writer.js.map +1 -0
  47. package/dist/core/artifacts/run-log-writer.d.ts +20 -0
  48. package/dist/core/artifacts/run-log-writer.d.ts.map +1 -0
  49. package/dist/core/artifacts/run-log-writer.js +40 -0
  50. package/dist/core/artifacts/run-log-writer.js.map +1 -0
  51. package/dist/core/artifacts/run-log-writer.test.d.ts +2 -0
  52. package/dist/core/artifacts/run-log-writer.test.d.ts.map +1 -0
  53. package/dist/core/artifacts/run-log-writer.test.js +37 -0
  54. package/dist/core/artifacts/run-log-writer.test.js.map +1 -0
  55. package/dist/core/artifacts/status-writer.d.ts +16 -0
  56. package/dist/core/artifacts/status-writer.d.ts.map +1 -0
  57. package/dist/core/artifacts/status-writer.js +52 -0
  58. package/dist/core/artifacts/status-writer.js.map +1 -0
  59. package/dist/core/artifacts/status-writer.test.d.ts +2 -0
  60. package/dist/core/artifacts/status-writer.test.d.ts.map +1 -0
  61. package/dist/core/artifacts/status-writer.test.js +47 -0
  62. package/dist/core/artifacts/status-writer.test.js.map +1 -0
  63. package/dist/core/artifacts/task-artifacts.d.ts +19 -0
  64. package/dist/core/artifacts/task-artifacts.d.ts.map +1 -0
  65. package/dist/core/artifacts/task-artifacts.js +35 -0
  66. package/dist/core/artifacts/task-artifacts.js.map +1 -0
  67. package/dist/core/artifacts/tasks-writer.d.ts +19 -0
  68. package/dist/core/artifacts/tasks-writer.d.ts.map +1 -0
  69. package/dist/core/artifacts/tasks-writer.js +67 -0
  70. package/dist/core/artifacts/tasks-writer.js.map +1 -0
  71. package/dist/core/artifacts/tasks-writer.test.d.ts +2 -0
  72. package/dist/core/artifacts/tasks-writer.test.d.ts.map +1 -0
  73. package/dist/core/artifacts/tasks-writer.test.js +28 -0
  74. package/dist/core/artifacts/tasks-writer.test.js.map +1 -0
  75. package/dist/core/backends/claude-code.d.ts +17 -0
  76. package/dist/core/backends/claude-code.d.ts.map +1 -0
  77. package/dist/core/backends/claude-code.js +75 -0
  78. package/dist/core/backends/claude-code.js.map +1 -0
  79. package/dist/core/backends/cursor.d.ts +17 -0
  80. package/dist/core/backends/cursor.d.ts.map +1 -0
  81. package/dist/core/backends/cursor.js +75 -0
  82. package/dist/core/backends/cursor.js.map +1 -0
  83. package/dist/core/backends/noop.d.ts +10 -0
  84. package/dist/core/backends/noop.d.ts.map +1 -0
  85. package/dist/core/backends/noop.js +17 -0
  86. package/dist/core/backends/noop.js.map +1 -0
  87. package/dist/core/backends/opencode.d.ts +16 -0
  88. package/dist/core/backends/opencode.d.ts.map +1 -0
  89. package/dist/core/backends/opencode.js +73 -0
  90. package/dist/core/backends/opencode.js.map +1 -0
  91. package/dist/core/backends/types.d.ts +21 -0
  92. package/dist/core/backends/types.d.ts.map +1 -0
  93. package/dist/core/backends/types.js +3 -0
  94. package/dist/core/backends/types.js.map +1 -0
  95. package/dist/core/budgets/errors.d.ts +5 -0
  96. package/dist/core/budgets/errors.d.ts.map +1 -0
  97. package/dist/core/budgets/errors.js +11 -0
  98. package/dist/core/budgets/errors.js.map +1 -0
  99. package/dist/core/budgets/manager.d.ts +21 -0
  100. package/dist/core/budgets/manager.d.ts.map +1 -0
  101. package/dist/core/budgets/manager.js +48 -0
  102. package/dist/core/budgets/manager.js.map +1 -0
  103. package/dist/core/budgets/state.d.ts +25 -0
  104. package/dist/core/budgets/state.d.ts.map +1 -0
  105. package/dist/core/budgets/state.js +33 -0
  106. package/dist/core/budgets/state.js.map +1 -0
  107. package/dist/core/budgets/tiers.d.ts +32 -0
  108. package/dist/core/budgets/tiers.d.ts.map +1 -0
  109. package/dist/core/budgets/tiers.js +67 -0
  110. package/dist/core/budgets/tiers.js.map +1 -0
  111. package/dist/core/engine/constraints.d.ts +16 -0
  112. package/dist/core/engine/constraints.d.ts.map +1 -0
  113. package/dist/core/engine/constraints.js +21 -0
  114. package/dist/core/engine/constraints.js.map +1 -0
  115. package/dist/core/engine/constraints.policy.test.d.ts +2 -0
  116. package/dist/core/engine/constraints.policy.test.d.ts.map +1 -0
  117. package/dist/core/engine/constraints.policy.test.js +85 -0
  118. package/dist/core/engine/constraints.policy.test.js.map +1 -0
  119. package/dist/core/engine/context-pack.d.ts +12 -0
  120. package/dist/core/engine/context-pack.d.ts.map +1 -0
  121. package/dist/core/engine/context-pack.js +45 -0
  122. package/dist/core/engine/context-pack.js.map +1 -0
  123. package/dist/core/engine/loop.d.ts +28 -0
  124. package/dist/core/engine/loop.d.ts.map +1 -0
  125. package/dist/core/engine/loop.hardcap.test.d.ts +2 -0
  126. package/dist/core/engine/loop.hardcap.test.d.ts.map +1 -0
  127. package/dist/core/engine/loop.hardcap.test.js +77 -0
  128. package/dist/core/engine/loop.hardcap.test.js.map +1 -0
  129. package/dist/core/engine/loop.js +864 -0
  130. package/dist/core/engine/loop.js.map +1 -0
  131. package/dist/core/engine/phases.d.ts +2 -0
  132. package/dist/core/engine/phases.d.ts.map +1 -0
  133. package/dist/core/engine/phases.js +3 -0
  134. package/dist/core/engine/phases.js.map +1 -0
  135. package/dist/core/engine/repair.d.ts +6 -0
  136. package/dist/core/engine/repair.d.ts.map +1 -0
  137. package/dist/core/engine/repair.js +23 -0
  138. package/dist/core/engine/repair.js.map +1 -0
  139. package/dist/core/folders.d.ts +26 -0
  140. package/dist/core/folders.d.ts.map +1 -0
  141. package/dist/core/folders.js +58 -0
  142. package/dist/core/folders.js.map +1 -0
  143. package/dist/core/memory/ledger.d.ts +13 -0
  144. package/dist/core/memory/ledger.d.ts.map +1 -0
  145. package/dist/core/memory/ledger.js +24 -0
  146. package/dist/core/memory/ledger.js.map +1 -0
  147. package/dist/core/memory/persistence.d.ts +54 -0
  148. package/dist/core/memory/persistence.d.ts.map +1 -0
  149. package/dist/core/memory/persistence.js +180 -0
  150. package/dist/core/memory/persistence.js.map +1 -0
  151. package/dist/core/reporting/failure-summary.d.ts +23 -0
  152. package/dist/core/reporting/failure-summary.d.ts.map +1 -0
  153. package/dist/core/reporting/failure-summary.js +63 -0
  154. package/dist/core/reporting/failure-summary.js.map +1 -0
  155. package/dist/core/reporting/failure-summary.test.d.ts +2 -0
  156. package/dist/core/reporting/failure-summary.test.d.ts.map +1 -0
  157. package/dist/core/reporting/failure-summary.test.js +22 -0
  158. package/dist/core/reporting/failure-summary.test.js.map +1 -0
  159. package/dist/core/reporting/spend.d.ts +40 -0
  160. package/dist/core/reporting/spend.d.ts.map +1 -0
  161. package/dist/core/reporting/spend.js +157 -0
  162. package/dist/core/reporting/spend.js.map +1 -0
  163. package/dist/core/spec/dag.d.ts +7 -0
  164. package/dist/core/spec/dag.d.ts.map +1 -0
  165. package/dist/core/spec/dag.js +65 -0
  166. package/dist/core/spec/dag.js.map +1 -0
  167. package/dist/core/spec/file-contract.d.ts +13 -0
  168. package/dist/core/spec/file-contract.d.ts.map +1 -0
  169. package/dist/core/spec/file-contract.js +29 -0
  170. package/dist/core/spec/file-contract.js.map +1 -0
  171. package/dist/core/spec/loader.d.ts +8 -0
  172. package/dist/core/spec/loader.d.ts.map +1 -0
  173. package/dist/core/spec/loader.js +62 -0
  174. package/dist/core/spec/loader.js.map +1 -0
  175. package/dist/core/spec/schemas.d.ts +1135 -0
  176. package/dist/core/spec/schemas.d.ts.map +1 -0
  177. package/dist/core/spec/schemas.js +235 -0
  178. package/dist/core/spec/schemas.js.map +1 -0
  179. package/dist/core/spec/sprint-defaults.d.ts +16 -0
  180. package/dist/core/spec/sprint-defaults.d.ts.map +1 -0
  181. package/dist/core/spec/sprint-defaults.js +55 -0
  182. package/dist/core/spec/sprint-defaults.js.map +1 -0
  183. package/dist/core/spec/sprint-defaults.test.d.ts +2 -0
  184. package/dist/core/spec/sprint-defaults.test.d.ts.map +1 -0
  185. package/dist/core/spec/sprint-defaults.test.js +51 -0
  186. package/dist/core/spec/sprint-defaults.test.js.map +1 -0
  187. package/dist/core/spec/types.d.ts +82 -0
  188. package/dist/core/spec/types.d.ts.map +1 -0
  189. package/dist/core/spec/types.js +3 -0
  190. package/dist/core/spec/types.js.map +1 -0
  191. package/dist/core/validators/parsers/eslint.d.ts +3 -0
  192. package/dist/core/validators/parsers/eslint.d.ts.map +1 -0
  193. package/dist/core/validators/parsers/eslint.js +35 -0
  194. package/dist/core/validators/parsers/eslint.js.map +1 -0
  195. package/dist/core/validators/parsers/jest.d.ts +3 -0
  196. package/dist/core/validators/parsers/jest.d.ts.map +1 -0
  197. package/dist/core/validators/parsers/jest.js +16 -0
  198. package/dist/core/validators/parsers/jest.js.map +1 -0
  199. package/dist/core/validators/parsers/tsc.d.ts +3 -0
  200. package/dist/core/validators/parsers/tsc.d.ts.map +1 -0
  201. package/dist/core/validators/parsers/tsc.js +32 -0
  202. package/dist/core/validators/parsers/tsc.js.map +1 -0
  203. package/dist/core/validators/runner.d.ts +8 -0
  204. package/dist/core/validators/runner.d.ts.map +1 -0
  205. package/dist/core/validators/runner.js +85 -0
  206. package/dist/core/validators/runner.js.map +1 -0
  207. package/dist/core/validators/signatures.d.ts +3 -0
  208. package/dist/core/validators/signatures.d.ts.map +1 -0
  209. package/dist/core/validators/signatures.js +10 -0
  210. package/dist/core/validators/signatures.js.map +1 -0
  211. package/dist/core/validators/types.d.ts +27 -0
  212. package/dist/core/validators/types.d.ts.map +1 -0
  213. package/dist/core/validators/types.js +3 -0
  214. package/dist/core/validators/types.js.map +1 -0
  215. package/dist/core/workspace/contract-enforcer.d.ts +54 -0
  216. package/dist/core/workspace/contract-enforcer.d.ts.map +1 -0
  217. package/dist/core/workspace/contract-enforcer.js +128 -0
  218. package/dist/core/workspace/contract-enforcer.js.map +1 -0
  219. package/dist/core/workspace/manager.d.ts +28 -0
  220. package/dist/core/workspace/manager.d.ts.map +1 -0
  221. package/dist/core/workspace/manager.js +3 -0
  222. package/dist/core/workspace/manager.js.map +1 -0
  223. package/dist/core/workspace/merge.d.ts +38 -0
  224. package/dist/core/workspace/merge.d.ts.map +1 -0
  225. package/dist/core/workspace/merge.js +92 -0
  226. package/dist/core/workspace/merge.js.map +1 -0
  227. package/dist/core/workspace/patch-mode.d.ts +22 -0
  228. package/dist/core/workspace/patch-mode.d.ts.map +1 -0
  229. package/dist/core/workspace/patch-mode.js +91 -0
  230. package/dist/core/workspace/patch-mode.js.map +1 -0
  231. package/dist/core/workspace/scope-detector.d.ts +13 -0
  232. package/dist/core/workspace/scope-detector.d.ts.map +1 -0
  233. package/dist/core/workspace/scope-detector.js +34 -0
  234. package/dist/core/workspace/scope-detector.js.map +1 -0
  235. package/dist/core/workspace/worktree-mode.d.ts +28 -0
  236. package/dist/core/workspace/worktree-mode.d.ts.map +1 -0
  237. package/dist/core/workspace/worktree-mode.js +157 -0
  238. package/dist/core/workspace/worktree-mode.js.map +1 -0
  239. package/dist/index.js +16 -4
  240. package/dist/index.js.map +1 -1
  241. package/dist/templates/claude-code/ralphy-archive.md +1 -1
  242. package/dist/templates/claude-code/ralphy-implement.md +1 -1
  243. package/dist/templates/claude-code/ralphy-plan.md +1 -1
  244. package/dist/templates/claude-code/ralphy-validate.md +1 -1
  245. package/dist/templates/cursor/ralphy-archive.md +1 -1
  246. package/dist/templates/cursor/ralphy-implement.md +1 -1
  247. package/dist/templates/cursor/ralphy-plan.md +1 -1
  248. package/dist/templates/cursor/ralphy-validate.md +1 -1
  249. package/dist/templates/shared/openspec-tasks-template.md +23 -3
  250. package/dist/templates/shared/project-template.yml +232 -0
  251. package/dist/utils/installer.d.ts.map +1 -1
  252. package/dist/utils/installer.js +31 -1
  253. package/dist/utils/installer.js.map +1 -1
  254. package/dist/utils/validator.d.ts.map +1 -1
  255. package/dist/utils/validator.js +10 -0
  256. package/dist/utils/validator.js.map +1 -1
  257. package/package.json +15 -5
package/README.md CHANGED
@@ -2,182 +2,147 @@
2
2
 
3
3
  [English](README.md) | [简体中文](README.zh.md) | [한국어](README.ko.md) | [日本語](README.ja.md)
4
4
 
5
- One-command setup for **Ralph loop + OpenSpec** workflows across:
6
- - Cursor
7
- - OpenCode
8
- - Claude Code
5
+ **Spec-driven AI development with iterative execution.** Combines OpenSpec + Ralph Loop for predictable AI-assisted coding.
9
6
 
10
7
  **Website:** [https://ralphy-spec.org](https://ralphy-spec.org)
8
+ **Docs:** [https://ralphy-spec.org/en/docs/](https://ralphy-spec.org/en/docs/)
9
+ **Changelog:** [https://ralphy-spec.org/en/changelog/](https://ralphy-spec.org/en/changelog/) · [GitHub](https://github.com/wenqingyu/ralphy-openspec/blob/main/CHANGELOG.md)
11
10
 
12
- ## What is Ralphy-Spec?
13
-
14
- Ralphy-Spec combines two powerful AI development methodologies:
15
-
16
- ### The Ralph Wiggum Loop
17
-
18
- The Ralph methodology (coined by [Geoffrey Huntley](https://ghuntley.com/ralph)) is a development approach where an AI agent receives the **same prompt repeatedly** until it completes a task. Each iteration, the AI sees its previous work in files and git history, creating a self-correction feedback loop.
19
-
20
- ```
21
- while true; do
22
- ai_agent "Build feature X. Output <promise>DONE</promise> when complete."
23
- # AI sees previous work, fixes mistakes, continues progress
24
- done
25
- ```
26
-
27
- ### OpenSpec (Spec-Driven Development)
28
-
29
- [OpenSpec](https://github.com/Fission-AI/OpenSpec) brings structure to AI coding by requiring specs before code:
30
- - `openspec/specs/` - Source of truth specifications
31
- - `openspec/changes/` - Proposed changes with acceptance criteria
32
- - Archive workflow to merge completed changes back
33
-
34
- ### Why Combine Them?
35
-
36
- | Problem | Solution |
37
- |---------|----------|
38
- | Vague requirements in chat history | OpenSpec locks intent in structured specs |
39
- | AI stops mid-task or makes mistakes | Ralph loop retries until completion |
40
- | No way to verify correctness | Acceptance criteria + tests validate output |
41
- | Tool-specific setup is tedious | One command sets up Cursor, OpenCode, Claude Code |
42
-
43
- ## What it installs into your project
44
-
45
- - `openspec/` scaffold:
46
- - `openspec/specs/` (source of truth)
47
- - `openspec/changes/` (active changes)
48
- - `openspec/archive/` (completed changes)
49
- - `openspec/project.md` (project context)
50
- - Tool integrations:
51
- - Cursor: `.cursor/prompts/ralphy-*.md`
52
- - Claude Code: `.claude/commands/ralphy-*.md`
53
- - OpenCode: `AGENTS.md`
54
- - Ralph loop state/config:
55
- - `.ralphy/config.json`
56
- - `.ralphy/ralph-loop.state.json`
57
-
58
- ## Installation
59
-
60
- ### npm (global)
61
-
62
- ```bash
63
- npm install -g ralphy-spec
64
- ```
65
-
66
- ### npx (no install)
11
+ ## Quick Start
67
12
 
68
13
  ```bash
69
14
  npx ralphy-spec init
70
15
  ```
71
16
 
72
- ### curl install script
17
+ CLI basics:
73
18
 
74
19
  ```bash
75
- curl -fsSL https://raw.githubusercontent.com/anthropics/ralphy-openspec/main/scripts/install.sh | sh
20
+ ralphy-spec run --dry-run
21
+ ralphy-spec run
22
+ ralphy-spec status
23
+ ralphy-spec budget --json
76
24
  ```
77
25
 
78
- ## Usage
26
+ Then use the commands for your AI tool:
79
27
 
80
- ### Initialize in a project
28
+ ### Cursor
81
29
 
82
- ```bash
83
- cd your-project
84
- ralphy-spec init
85
- ```
30
+ | Command | What it does |
31
+ |---------|--------------|
32
+ | `/ralphy-plan` | Create specs from requirements |
33
+ | `/ralphy-implement` | Build with iterative loop |
34
+ | `/ralphy-validate` | Verify acceptance criteria |
35
+ | `/ralphy-archive` | Complete and archive |
86
36
 
87
- Non-interactive tool selection:
37
+ ### Claude Code
88
38
 
89
- ```bash
90
- ralphy-spec init --tools cursor,claude-code,opencode
91
- ```
39
+ | Command | What it does |
40
+ |---------|--------------|
41
+ | `/ralphy-plan` | Create specs from requirements |
42
+ | `/ralphy-implement` | Build with iterative loop |
43
+ | `/ralphy-validate` | Verify acceptance criteria |
44
+ | `/ralphy-archive` | Complete and archive |
92
45
 
93
- Overwrite existing files:
46
+ ### OpenCode
94
47
 
95
- ```bash
96
- ralphy-spec init --force
97
- ```
98
-
99
- ### Validate setup
48
+ Use natural language with AGENTS.md:
49
+ - `"Follow AGENTS.md to plan [feature]"`
50
+ - `"Follow AGENTS.md to implement [change]"`
51
+ - `"Follow AGENTS.md to validate"`
52
+ - `"Follow AGENTS.md to archive [change]"`
100
53
 
54
+ **With Ralph Loop Runner:**
101
55
  ```bash
102
- ralphy-spec validate
56
+ npm install -g @th0rgal/ralph-wiggum
57
+ ralph "Follow AGENTS.md to implement add-api. Output <promise>TASK_COMPLETE</promise> when done." --max-iterations 20
103
58
  ```
104
59
 
105
- ### Update templates
60
+ ## Example Workflow
106
61
 
107
62
  ```bash
108
- ralphy-spec update --force
109
- ```
63
+ # 1. Plan: Create spec from your idea
64
+ You: /ralphy-plan Add user authentication with JWT
110
65
 
111
- ## Workflow (PRD -> Ship)
112
-
113
- ```
114
- PRD/Requirements --> OpenSpec (specs + tasks + acceptance criteria)
115
- |
116
- v
117
- Ralph Loop (iterate until tests pass)
118
- |
119
- v
120
- Archive (merge back to source specs)
121
- ```
66
+ # 2. Implement: AI builds it iteratively
67
+ You: /ralphy-implement add-user-auth
122
68
 
123
- ### 1) Plan: PRD -> OpenSpec change
69
+ # 3. Validate: Verify tests pass
70
+ You: /ralphy-validate
124
71
 
125
- Use your AI tool with `/ralphy:plan` (Cursor / Claude Code), or ask OpenCode to follow `AGENTS.md`.
72
+ # 4. Archive: Complete the change
73
+ You: /ralphy-archive add-user-auth
74
+ ```
126
75
 
127
- Expected output in your repo:
76
+ ## What Gets Created
128
77
 
129
78
  ```
130
- openspec/changes/<change-name>/
131
- proposal.md
132
- tasks.md
133
- specs/
134
- <domain>/
135
- spec.md
136
- ```
137
-
138
- ### 2) Implement: iterate until done
79
+ .cursor/prompts/ # or .claude/commands/
80
+ ├── ralphy-plan.md
81
+ ├── ralphy-implement.md
82
+ ├── ralphy-validate.md
83
+ └── ralphy-archive.md
139
84
 
140
- Use `/ralphy:implement` to implement tasks and add tests.
85
+ AGENTS.md # For OpenCode
141
86
 
142
- If you run this via a Ralph loop runner, the agent should only output:
87
+ openspec/
88
+ ├── specs/ # Source of truth
89
+ ├── changes/ # Active work
90
+ ├── archive/ # Completed
91
+ └── project.md # Context
143
92
 
144
- ```
145
- <promise>TASK_COMPLETE</promise>
93
+ ralphy-spec/ # Local state + artifacts (IDE-friendly)
94
+ ├── state.db # SQLite run/task ledger
95
+ ├── STATUS.md # Live run snapshot (primary for `ralphy-spec status`)
96
+ ├── TASKS.md # Task board view
97
+ ├── BUDGET.md # Spend/budget breakdown
98
+ ├── runs/ # Immutable run logs (`runs/<runId>.md`)
99
+ ├── logs/ # Raw backend outputs (best-effort)
100
+ ├── worktrees/ # Git worktrees per task (when enabled)
101
+ └── tasks/ # Per-task artifacts (CONTEXT / REPAIR / NOTES)
102
+ └── <taskId>/
103
+ ├── CONTEXT.md
104
+ ├── REPAIR.md
105
+ └── NOTES.md
146
106
  ```
147
107
 
148
- when **all tasks are done and tests pass**.
108
+ > Note: Legacy `.ralphy/` folders are migrated to `ralphy-spec/` automatically when found.
149
109
 
150
- ### 3) Validate: tests prove acceptance criteria
110
+ ## How It Works
151
111
 
152
- Use `/ralphy:validate` to run tests and map passing tests back to OpenSpec scenarios.
112
+ **Ralph Wiggum Loop:** AI receives the same prompt repeatedly until task completion. Each iteration, it sees previous work in files and self-corrects.
153
113
 
154
- ### 4) Archive: merge change back into specs
114
+ **OpenSpec:** Specs before code. Structured specifications with acceptance criteria ensure AI knows exactly what to build.
155
115
 
156
- Use `/ralphy:archive` and (if available) the OpenSpec CLI:
116
+ **The Combination:**
157
117
 
158
- ```bash
159
- openspec archive <change-name> --yes
160
- ```
161
-
162
- ## Credits and Appreciation
118
+ | Problem | Solution |
119
+ |---------|----------|
120
+ | Vague requirements in chat | Specs lock intent |
121
+ | AI stops mid-task | Loop retries until done |
122
+ | No way to verify | Tests validate output |
123
+ | Tool-specific setup | One command for all |
163
124
 
164
- Ralphy-Spec stands on the shoulders of giants:
125
+ ## Installation Options
165
126
 
166
- - **Ralph Wiggum Methodology** - Conceived by [Geoffrey Huntley](https://ghuntley.com/ralph). The insight that AI agents can self-correct through iteration changed how we think about AI-assisted development.
127
+ ```bash
128
+ # npx (recommended)
129
+ npx ralphy-spec init
167
130
 
168
- - **[opencode-ralph-wiggum](https://github.com/Th0rgal/opencode-ralph-wiggum)** by [@Th0rgal](https://github.com/Th0rgal) - A clean CLI implementation of the Ralph loop for OpenCode that inspired our integration approach.
131
+ # Global install
132
+ npm install -g ralphy-spec
133
+ ralphy-spec init
169
134
 
170
- - **[OpenSpec](https://github.com/Fission-AI/OpenSpec)** by [Fission-AI](https://github.com/Fission-AI) - The spec-driven development framework that brings structure and predictability to AI coding. Their `specs/` + `changes/` model is elegant and practical.
135
+ # With specific tools
136
+ ralphy-spec init --tools cursor,claude-code,opencode
137
+ ```
171
138
 
172
- We are grateful to these projects and their maintainers for pioneering these approaches.
139
+ ## Credits
173
140
 
174
- ## Development
141
+ Built on the work of:
175
142
 
176
- ```bash
177
- npm install
178
- npm run build
179
- node bin/ralphy-spec.js --help
180
- ```
143
+ - **[Ralph Methodology](https://ghuntley.com/ralph)** by Geoffrey Huntley
144
+ - **[opencode-ralph-wiggum](https://github.com/Th0rgal/opencode-ralph-wiggum)** by @Th0rgal
145
+ - **[OpenSpec](https://github.com/Fission-AI/OpenSpec)** by Fission-AI
181
146
 
182
147
  ## License
183
148
 
package/README.zh.md CHANGED
@@ -2,180 +2,147 @@
2
2
 
3
3
  [English](README.md) | [简体中文](README.zh.md) | [한국어](README.ko.md) | [日本語](README.ja.md)
4
4
 
5
- 一条命令为以下工具设置 **Ralph 循环 + OpenSpec** 工作流:
6
- - Cursor
7
- - OpenCode
8
- - Claude Code
5
+ **规范驱动的 AI 开发 + 迭代执行。** 结合 OpenSpec 和 Ralph 循环,实现可预测的 AI 辅助编码。
9
6
 
10
7
  **官网:** [https://ralphy-spec.org](https://ralphy-spec.org)
8
+ **文档:** [https://ralphy-spec.org/zh/docs/](https://ralphy-spec.org/zh/docs/)
9
+ **更新日志:** [https://ralphy-spec.org/zh/changelog/](https://ralphy-spec.org/zh/changelog/) · [GitHub](https://github.com/wenqingyu/ralphy-openspec/blob/main/CHANGELOG.md)
11
10
 
12
- ## 什么是 Ralphy-Spec?
13
-
14
- Ralphy-Spec 结合了两种强大的 AI 开发方法:
15
-
16
- ### Ralph Wiggum 循环
17
-
18
- Ralph 方法论(由 [Geoffrey Huntley](https://ghuntley.com/ralph) 提出)是一种开发方式,AI 代理会**重复接收相同的提示**直到完成任务。每次迭代,AI 都能看到之前在文件和 git 历史中的工作成果,形成自我纠正的反馈循环。
19
-
20
- ```
21
- while true; do
22
- ai_agent "构建功能 X。完成后输出 <promise>DONE</promise>。"
23
- # AI 看到之前的工作,修复错误,继续进展
24
- done
25
- ```
26
-
27
- ### OpenSpec(规范驱动开发)
28
-
29
- [OpenSpec](https://github.com/Fission-AI/OpenSpec) 通过在编码前要求规范来为 AI 编码带来结构:
30
- - `openspec/specs/` - 真实来源的规范
31
- - `openspec/changes/` - 带验收标准的变更提案
32
- - 归档工作流将已完成的变更合并回来
33
-
34
- ### 为什么要结合使用?
35
-
36
- | 问题 | 解决方案 |
37
- |------|----------|
38
- | 聊天记录中的需求模糊 | OpenSpec 将意图锁定在结构化规范中 |
39
- | AI 中途停止或出错 | Ralph 循环重试直到完成 |
40
- | 无法验证正确性 | 验收标准 + 测试验证输出 |
41
- | 特定工具的设置很繁琐 | 一条命令设置 Cursor、OpenCode、Claude Code |
42
-
43
- ## 安装到项目中的内容
44
-
45
- - `openspec/` 脚手架:
46
- - `openspec/specs/`(真实来源)
47
- - `openspec/changes/`(活跃变更)
48
- - `openspec/archive/`(已完成的变更)
49
- - `openspec/project.md`(项目上下文)
50
- - 工具集成:
51
- - Cursor:`.cursor/prompts/ralphy-*.md`
52
- - Claude Code:`.claude/commands/ralphy-*.md`
53
- - OpenCode:`AGENTS.md`
54
- - Ralph 循环状态/配置:
55
- - `.ralphy/config.json`
56
- - `.ralphy/ralph-loop.state.json`
57
-
58
- ## 安装
59
-
60
- ### npm(全局安装)
61
-
62
- ```bash
63
- npm install -g ralphy-spec
64
- ```
65
-
66
- ### npx(无需安装)
11
+ ## 快速开始
67
12
 
68
13
  ```bash
69
14
  npx ralphy-spec init
70
15
  ```
71
16
 
72
- ### curl 安装脚本
17
+ CLI 基础用法:
73
18
 
74
19
  ```bash
75
- curl -fsSL https://raw.githubusercontent.com/anthropics/ralphy-openspec/main/scripts/install.sh | sh
20
+ ralphy-spec run --dry-run
21
+ ralphy-spec run
22
+ ralphy-spec status
23
+ ralphy-spec budget --json
76
24
  ```
77
25
 
78
- ## 使用方法
79
-
80
- ### 在项目中初始化
26
+ 然后使用你的 AI 工具对应的命令:
81
27
 
82
- ```bash
83
- cd your-project
84
- ralphy-spec init
85
- ```
28
+ ### Cursor
86
29
 
87
- 非交互式工具选择:
30
+ | 命令 | 功能 |
31
+ |------|------|
32
+ | `/ralphy-plan` | 从需求创建规范 |
33
+ | `/ralphy-implement` | 迭代循环构建 |
34
+ | `/ralphy-validate` | 验证验收标准 |
35
+ | `/ralphy-archive` | 完成并归档 |
88
36
 
89
- ```bash
90
- ralphy-spec init --tools cursor,claude-code,opencode
91
- ```
37
+ ### Claude Code
92
38
 
93
- 覆盖现有文件:
39
+ | 命令 | 功能 |
40
+ |------|------|
41
+ | `/ralphy-plan` | 从需求创建规范 |
42
+ | `/ralphy-implement` | 迭代循环构建 |
43
+ | `/ralphy-validate` | 验证验收标准 |
44
+ | `/ralphy-archive` | 完成并归档 |
94
45
 
95
- ```bash
96
- ralphy-spec init --force
97
- ```
46
+ ### OpenCode
98
47
 
99
- ### 验证设置
48
+ 使用自然语言配合 AGENTS.md:
49
+ - `"Follow AGENTS.md to plan [功能]"`
50
+ - `"Follow AGENTS.md to implement [变更]"`
51
+ - `"Follow AGENTS.md to validate"`
52
+ - `"Follow AGENTS.md to archive [变更]"`
100
53
 
54
+ **配合 Ralph 循环运行器:**
101
55
  ```bash
102
- ralphy-spec validate
56
+ npm install -g @th0rgal/ralph-wiggum
57
+ ralph "Follow AGENTS.md to implement add-api. Output <promise>TASK_COMPLETE</promise> when done." --max-iterations 20
103
58
  ```
104
59
 
105
- ### 更新模板
60
+ ## 工作流示例
106
61
 
107
62
  ```bash
108
- ralphy-spec update --force
109
- ```
63
+ # 1. 规划:从你的想法创建规范
64
+ You: /ralphy-plan 添加 JWT 用户认证
110
65
 
111
- ## 工作流程(PRD -> 交付)
112
-
113
- ```
114
- PRD/需求 --> OpenSpec(规范 + 任务 + 验收标准)
115
- |
116
- v
117
- Ralph 循环(迭代直到测试通过)
118
- |
119
- v
120
- 归档(合并回源规范)
121
- ```
66
+ # 2. 实现:AI 迭代构建
67
+ You: /ralphy-implement add-user-auth
122
68
 
123
- ### 1)规划:PRD -> OpenSpec 变更
69
+ # 3. 验证:确保测试通过
70
+ You: /ralphy-validate
124
71
 
125
- 使用 AI 工具的 `/ralphy:plan`(Cursor / Claude Code),或让 OpenCode 遵循 `AGENTS.md`。
72
+ # 4. 归档:完成变更
73
+ You: /ralphy-archive add-user-auth
74
+ ```
126
75
 
127
- 仓库中的预期输出:
76
+ ## 创建的文件
128
77
 
129
78
  ```
130
- openspec/changes/<change-name>/
131
- proposal.md
132
- tasks.md
133
- specs/
134
- <domain>/
135
- spec.md
136
- ```
137
-
138
- ### 2)实现:迭代直到完成
79
+ .cursor/prompts/ # 或 .claude/commands/
80
+ ├── ralphy-plan.md
81
+ ├── ralphy-implement.md
82
+ ├── ralphy-validate.md
83
+ └── ralphy-archive.md
139
84
 
140
- 使用 `/ralphy:implement` 实现任务并添加测试。
85
+ AGENTS.md # OpenCode 使用
141
86
 
142
- 如果通过 Ralph 循环运行器运行,代理应该只在**所有任务完成且测试通过**时输出:
87
+ openspec/
88
+ ├── specs/ # 真实来源
89
+ ├── changes/ # 进行中的工作
90
+ ├── archive/ # 已完成
91
+ └── project.md # 上下文
143
92
 
144
- ```
145
- <promise>TASK_COMPLETE</promise>
93
+ ralphy-spec/ # 本地状态 + 可读产物(IDE 友好)
94
+ ├── state.db # SQLite 运行/任务日志
95
+ ├── STATUS.md # 实时状态(`ralphy-spec status` 优先读取)
96
+ ├── TASKS.md # 任务看板
97
+ ├── BUDGET.md # 花费/预算
98
+ ├── runs/ # 不可变运行日志(`runs/<runId>.md`)
99
+ ├── logs/ # 后端原始输出(尽力写入)
100
+ ├── worktrees/ # Git worktree(启用 worktree 模式时)
101
+ └── tasks/ # 单任务产物(CONTEXT / REPAIR / NOTES)
102
+ └── <taskId>/
103
+ ├── CONTEXT.md
104
+ ├── REPAIR.md
105
+ └── NOTES.md
146
106
  ```
147
107
 
148
- ### 3)验证:测试证明验收标准
108
+ > 注意:如果检测到旧的 `.ralphy/`,会自动迁移到 `ralphy-spec/` 并提示。
149
109
 
150
- 使用 `/ralphy:validate` 运行测试并将通过的测试映射回 OpenSpec 场景。
110
+ ## 工作原理
151
111
 
152
- ### 4)归档:将变更合并回规范
112
+ **Ralph Wiggum 循环:** AI 重复接收相同提示直到任务完成。每次迭代,它都能看到文件中的之前工作并自我纠正。
153
113
 
154
- 使用 `/ralphy:archive`,如果可用的话,使用 OpenSpec CLI:
114
+ **OpenSpec:** 先有规范后有代码。结构化的规范和验收标准确保 AI 知道要构建什么。
155
115
 
156
- ```bash
157
- openspec archive <change-name> --yes
158
- ```
116
+ **为什么结合使用:**
159
117
 
160
- ## 致谢
118
+ | 问题 | 解决方案 |
119
+ |------|----------|
120
+ | 聊天中的模糊需求 | 规范锁定意图 |
121
+ | AI 中途停止 | 循环重试直到完成 |
122
+ | 无法验证 | 测试验证输出 |
123
+ | 工具特定设置 | 一条命令搞定所有 |
161
124
 
162
- Ralphy-Spec 站在巨人的肩膀上:
125
+ ## 安装选项
163
126
 
164
- - **Ralph Wiggum 方法论** - 由 [Geoffrey Huntley](https://ghuntley.com/ralph) 构思。AI 代理可以通过迭代进行自我纠正的洞见改变了我们对 AI 辅助开发的看法。
127
+ ```bash
128
+ # npx(推荐)
129
+ npx ralphy-spec init
165
130
 
166
- - **[opencode-ralph-wiggum](https://github.com/Th0rgal/opencode-ralph-wiggum)** by [@Th0rgal](https://github.com/Th0rgal) - 一个简洁的 OpenCode Ralph 循环 CLI 实现,启发了我们的集成方式。
131
+ # 全局安装
132
+ npm install -g ralphy-spec
133
+ ralphy-spec init
167
134
 
168
- - **[OpenSpec](https://github.com/Fission-AI/OpenSpec)** by [Fission-AI](https://github.com/Fission-AI) - 为 AI 编码带来结构和可预测性的规范驱动开发框架。他们的 `specs/` + `changes/` 模型优雅而实用。
135
+ # 指定工具
136
+ ralphy-spec init --tools cursor,claude-code,opencode
137
+ ```
169
138
 
170
- 我们感谢这些项目及其维护者开创了这些方法。
139
+ ## 致谢
171
140
 
172
- ## 开发
141
+ 基于以下项目:
173
142
 
174
- ```bash
175
- npm install
176
- npm run build
177
- node bin/ralphy-spec.js --help
178
- ```
143
+ - **[Ralph 方法论](https://ghuntley.com/ralph)** by Geoffrey Huntley
144
+ - **[opencode-ralph-wiggum](https://github.com/Th0rgal/opencode-ralph-wiggum)** by @Th0rgal
145
+ - **[OpenSpec](https://github.com/Fission-AI/OpenSpec)** by Fission-AI
179
146
 
180
147
  ## 许可证
181
148
 
File without changes
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerBudgetCommand(program: Command): void;
3
+ //# sourceMappingURL=budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../src/cli/budget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwE5D"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerBudgetCommand = registerBudgetCommand;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const persistence_1 = require("../core/memory/persistence");
10
+ const folders_1 = require("../core/folders");
11
+ const spend_1 = require("../core/reporting/spend");
12
+ const loader_1 = require("../core/spec/loader");
13
+ function registerBudgetCommand(program) {
14
+ program
15
+ .command("budget")
16
+ .description("Show budget/spend information for the latest run")
17
+ .option("--json", "Machine-readable output", false)
18
+ .action(async (opts) => {
19
+ const repoRoot = process.cwd();
20
+ const candidateRoots = [];
21
+ try {
22
+ const spec = await new loader_1.SpecLoader(repoRoot).loadProjectSpec();
23
+ if (spec.artifacts?.rootDir)
24
+ candidateRoots.push(spec.artifacts.rootDir);
25
+ }
26
+ catch {
27
+ // ignore
28
+ }
29
+ candidateRoots.push(undefined);
30
+ for (const rootDir of candidateRoots) {
31
+ const budgetPath = node_path_1.default.join((0, folders_1.getRalphyRoot)(repoRoot, rootDir), folders_1.FILES.budget);
32
+ try {
33
+ const md = await promises_1.default.readFile(budgetPath, "utf8");
34
+ if (!opts.json) {
35
+ process.stdout.write(md.trimEnd() + "\n");
36
+ return;
37
+ }
38
+ // If JSON requested, fall back to DB-derived structure below.
39
+ break;
40
+ }
41
+ catch {
42
+ // try next
43
+ }
44
+ }
45
+ const persistence = await persistence_1.PersistenceLayer.openForRepo(repoRoot);
46
+ try {
47
+ const run = persistence.getLatestRun();
48
+ if (!run) {
49
+ process.stdout.write(opts.json ? JSON.stringify({ ok: true, run: null }) + "\n" : "No runs found.\n");
50
+ return;
51
+ }
52
+ const ledger = persistence.listLedger({ runId: run.runId, limit: 2000 });
53
+ const entries = (0, spend_1.extractSpendFromLedger)(ledger);
54
+ const breakdown = (0, spend_1.aggregateSpend)(entries);
55
+ if (opts.json) {
56
+ process.stdout.write(JSON.stringify({
57
+ ok: true,
58
+ runId: run.runId,
59
+ spend: {
60
+ total: breakdown.total,
61
+ byTask: Object.fromEntries(breakdown.byTask),
62
+ byBackend: Object.fromEntries(breakdown.byBackend),
63
+ byPhase: Object.fromEntries(breakdown.byPhase),
64
+ entries: breakdown.entries,
65
+ },
66
+ }, null, 2) + "\n");
67
+ }
68
+ else {
69
+ process.stdout.write(`No ${folders_1.FILES.budget} artifact found.\nRun again with artifacts enabled to generate it.\n`);
70
+ }
71
+ }
72
+ finally {
73
+ persistence.close();
74
+ }
75
+ });
76
+ }
77
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/cli/budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerCheckpointCommand(program: Command): void;
3
+ //# sourceMappingURL=checkpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../../src/cli/checkpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAahE"}