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.
- package/CHANGELOG.md +32 -0
- package/README.ja.md +94 -127
- package/README.ko.md +94 -127
- package/README.md +94 -129
- package/README.zh.md +94 -127
- package/bin/ralphy-spec.js +0 -0
- package/dist/cli/budget.d.ts +3 -0
- package/dist/cli/budget.d.ts.map +1 -0
- package/dist/cli/budget.js +77 -0
- package/dist/cli/budget.js.map +1 -0
- package/dist/cli/checkpoint.d.ts +3 -0
- package/dist/cli/checkpoint.d.ts.map +1 -0
- package/dist/cli/checkpoint.js +23 -0
- package/dist/cli/checkpoint.js.map +1 -0
- package/dist/cli/init.d.ts +3 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +72 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/report.d.ts +3 -0
- package/dist/cli/report.d.ts.map +1 -0
- package/dist/cli/report.js +53 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/run.d.ts +3 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +112 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/status.d.ts +3 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +76 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/tail.d.ts +3 -0
- package/dist/cli/tail.d.ts.map +1 -0
- package/dist/cli/tail.js +46 -0
- package/dist/cli/tail.js.map +1 -0
- package/dist/cli/update.d.ts +3 -0
- package/dist/cli/update.d.ts.map +1 -0
- package/dist/cli/update.js +62 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/cli/validate.d.ts +3 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +83 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/core/artifacts/budget-writer.d.ts +11 -0
- package/dist/core/artifacts/budget-writer.d.ts.map +1 -0
- package/dist/core/artifacts/budget-writer.js +28 -0
- package/dist/core/artifacts/budget-writer.js.map +1 -0
- package/dist/core/artifacts/run-log-writer.d.ts +20 -0
- package/dist/core/artifacts/run-log-writer.d.ts.map +1 -0
- package/dist/core/artifacts/run-log-writer.js +40 -0
- package/dist/core/artifacts/run-log-writer.js.map +1 -0
- package/dist/core/artifacts/run-log-writer.test.d.ts +2 -0
- package/dist/core/artifacts/run-log-writer.test.d.ts.map +1 -0
- package/dist/core/artifacts/run-log-writer.test.js +37 -0
- package/dist/core/artifacts/run-log-writer.test.js.map +1 -0
- package/dist/core/artifacts/status-writer.d.ts +16 -0
- package/dist/core/artifacts/status-writer.d.ts.map +1 -0
- package/dist/core/artifacts/status-writer.js +52 -0
- package/dist/core/artifacts/status-writer.js.map +1 -0
- package/dist/core/artifacts/status-writer.test.d.ts +2 -0
- package/dist/core/artifacts/status-writer.test.d.ts.map +1 -0
- package/dist/core/artifacts/status-writer.test.js +47 -0
- package/dist/core/artifacts/status-writer.test.js.map +1 -0
- package/dist/core/artifacts/task-artifacts.d.ts +19 -0
- package/dist/core/artifacts/task-artifacts.d.ts.map +1 -0
- package/dist/core/artifacts/task-artifacts.js +35 -0
- package/dist/core/artifacts/task-artifacts.js.map +1 -0
- package/dist/core/artifacts/tasks-writer.d.ts +19 -0
- package/dist/core/artifacts/tasks-writer.d.ts.map +1 -0
- package/dist/core/artifacts/tasks-writer.js +67 -0
- package/dist/core/artifacts/tasks-writer.js.map +1 -0
- package/dist/core/artifacts/tasks-writer.test.d.ts +2 -0
- package/dist/core/artifacts/tasks-writer.test.d.ts.map +1 -0
- package/dist/core/artifacts/tasks-writer.test.js +28 -0
- package/dist/core/artifacts/tasks-writer.test.js.map +1 -0
- package/dist/core/backends/claude-code.d.ts +17 -0
- package/dist/core/backends/claude-code.d.ts.map +1 -0
- package/dist/core/backends/claude-code.js +75 -0
- package/dist/core/backends/claude-code.js.map +1 -0
- package/dist/core/backends/cursor.d.ts +17 -0
- package/dist/core/backends/cursor.d.ts.map +1 -0
- package/dist/core/backends/cursor.js +75 -0
- package/dist/core/backends/cursor.js.map +1 -0
- package/dist/core/backends/noop.d.ts +10 -0
- package/dist/core/backends/noop.d.ts.map +1 -0
- package/dist/core/backends/noop.js +17 -0
- package/dist/core/backends/noop.js.map +1 -0
- package/dist/core/backends/opencode.d.ts +16 -0
- package/dist/core/backends/opencode.d.ts.map +1 -0
- package/dist/core/backends/opencode.js +73 -0
- package/dist/core/backends/opencode.js.map +1 -0
- package/dist/core/backends/types.d.ts +21 -0
- package/dist/core/backends/types.d.ts.map +1 -0
- package/dist/core/backends/types.js +3 -0
- package/dist/core/backends/types.js.map +1 -0
- package/dist/core/budgets/errors.d.ts +5 -0
- package/dist/core/budgets/errors.d.ts.map +1 -0
- package/dist/core/budgets/errors.js +11 -0
- package/dist/core/budgets/errors.js.map +1 -0
- package/dist/core/budgets/manager.d.ts +21 -0
- package/dist/core/budgets/manager.d.ts.map +1 -0
- package/dist/core/budgets/manager.js +48 -0
- package/dist/core/budgets/manager.js.map +1 -0
- package/dist/core/budgets/state.d.ts +25 -0
- package/dist/core/budgets/state.d.ts.map +1 -0
- package/dist/core/budgets/state.js +33 -0
- package/dist/core/budgets/state.js.map +1 -0
- package/dist/core/budgets/tiers.d.ts +32 -0
- package/dist/core/budgets/tiers.d.ts.map +1 -0
- package/dist/core/budgets/tiers.js +67 -0
- package/dist/core/budgets/tiers.js.map +1 -0
- package/dist/core/engine/constraints.d.ts +16 -0
- package/dist/core/engine/constraints.d.ts.map +1 -0
- package/dist/core/engine/constraints.js +21 -0
- package/dist/core/engine/constraints.js.map +1 -0
- package/dist/core/engine/constraints.policy.test.d.ts +2 -0
- package/dist/core/engine/constraints.policy.test.d.ts.map +1 -0
- package/dist/core/engine/constraints.policy.test.js +85 -0
- package/dist/core/engine/constraints.policy.test.js.map +1 -0
- package/dist/core/engine/context-pack.d.ts +12 -0
- package/dist/core/engine/context-pack.d.ts.map +1 -0
- package/dist/core/engine/context-pack.js +45 -0
- package/dist/core/engine/context-pack.js.map +1 -0
- package/dist/core/engine/loop.d.ts +28 -0
- package/dist/core/engine/loop.d.ts.map +1 -0
- package/dist/core/engine/loop.hardcap.test.d.ts +2 -0
- package/dist/core/engine/loop.hardcap.test.d.ts.map +1 -0
- package/dist/core/engine/loop.hardcap.test.js +77 -0
- package/dist/core/engine/loop.hardcap.test.js.map +1 -0
- package/dist/core/engine/loop.js +864 -0
- package/dist/core/engine/loop.js.map +1 -0
- package/dist/core/engine/phases.d.ts +2 -0
- package/dist/core/engine/phases.d.ts.map +1 -0
- package/dist/core/engine/phases.js +3 -0
- package/dist/core/engine/phases.js.map +1 -0
- package/dist/core/engine/repair.d.ts +6 -0
- package/dist/core/engine/repair.d.ts.map +1 -0
- package/dist/core/engine/repair.js +23 -0
- package/dist/core/engine/repair.js.map +1 -0
- package/dist/core/folders.d.ts +26 -0
- package/dist/core/folders.d.ts.map +1 -0
- package/dist/core/folders.js +58 -0
- package/dist/core/folders.js.map +1 -0
- package/dist/core/memory/ledger.d.ts +13 -0
- package/dist/core/memory/ledger.d.ts.map +1 -0
- package/dist/core/memory/ledger.js +24 -0
- package/dist/core/memory/ledger.js.map +1 -0
- package/dist/core/memory/persistence.d.ts +54 -0
- package/dist/core/memory/persistence.d.ts.map +1 -0
- package/dist/core/memory/persistence.js +180 -0
- package/dist/core/memory/persistence.js.map +1 -0
- package/dist/core/reporting/failure-summary.d.ts +23 -0
- package/dist/core/reporting/failure-summary.d.ts.map +1 -0
- package/dist/core/reporting/failure-summary.js +63 -0
- package/dist/core/reporting/failure-summary.js.map +1 -0
- package/dist/core/reporting/failure-summary.test.d.ts +2 -0
- package/dist/core/reporting/failure-summary.test.d.ts.map +1 -0
- package/dist/core/reporting/failure-summary.test.js +22 -0
- package/dist/core/reporting/failure-summary.test.js.map +1 -0
- package/dist/core/reporting/spend.d.ts +40 -0
- package/dist/core/reporting/spend.d.ts.map +1 -0
- package/dist/core/reporting/spend.js +157 -0
- package/dist/core/reporting/spend.js.map +1 -0
- package/dist/core/spec/dag.d.ts +7 -0
- package/dist/core/spec/dag.d.ts.map +1 -0
- package/dist/core/spec/dag.js +65 -0
- package/dist/core/spec/dag.js.map +1 -0
- package/dist/core/spec/file-contract.d.ts +13 -0
- package/dist/core/spec/file-contract.d.ts.map +1 -0
- package/dist/core/spec/file-contract.js +29 -0
- package/dist/core/spec/file-contract.js.map +1 -0
- package/dist/core/spec/loader.d.ts +8 -0
- package/dist/core/spec/loader.d.ts.map +1 -0
- package/dist/core/spec/loader.js +62 -0
- package/dist/core/spec/loader.js.map +1 -0
- package/dist/core/spec/schemas.d.ts +1135 -0
- package/dist/core/spec/schemas.d.ts.map +1 -0
- package/dist/core/spec/schemas.js +235 -0
- package/dist/core/spec/schemas.js.map +1 -0
- package/dist/core/spec/sprint-defaults.d.ts +16 -0
- package/dist/core/spec/sprint-defaults.d.ts.map +1 -0
- package/dist/core/spec/sprint-defaults.js +55 -0
- package/dist/core/spec/sprint-defaults.js.map +1 -0
- package/dist/core/spec/sprint-defaults.test.d.ts +2 -0
- package/dist/core/spec/sprint-defaults.test.d.ts.map +1 -0
- package/dist/core/spec/sprint-defaults.test.js +51 -0
- package/dist/core/spec/sprint-defaults.test.js.map +1 -0
- package/dist/core/spec/types.d.ts +82 -0
- package/dist/core/spec/types.d.ts.map +1 -0
- package/dist/core/spec/types.js +3 -0
- package/dist/core/spec/types.js.map +1 -0
- package/dist/core/validators/parsers/eslint.d.ts +3 -0
- package/dist/core/validators/parsers/eslint.d.ts.map +1 -0
- package/dist/core/validators/parsers/eslint.js +35 -0
- package/dist/core/validators/parsers/eslint.js.map +1 -0
- package/dist/core/validators/parsers/jest.d.ts +3 -0
- package/dist/core/validators/parsers/jest.d.ts.map +1 -0
- package/dist/core/validators/parsers/jest.js +16 -0
- package/dist/core/validators/parsers/jest.js.map +1 -0
- package/dist/core/validators/parsers/tsc.d.ts +3 -0
- package/dist/core/validators/parsers/tsc.d.ts.map +1 -0
- package/dist/core/validators/parsers/tsc.js +32 -0
- package/dist/core/validators/parsers/tsc.js.map +1 -0
- package/dist/core/validators/runner.d.ts +8 -0
- package/dist/core/validators/runner.d.ts.map +1 -0
- package/dist/core/validators/runner.js +85 -0
- package/dist/core/validators/runner.js.map +1 -0
- package/dist/core/validators/signatures.d.ts +3 -0
- package/dist/core/validators/signatures.d.ts.map +1 -0
- package/dist/core/validators/signatures.js +10 -0
- package/dist/core/validators/signatures.js.map +1 -0
- package/dist/core/validators/types.d.ts +27 -0
- package/dist/core/validators/types.d.ts.map +1 -0
- package/dist/core/validators/types.js +3 -0
- package/dist/core/validators/types.js.map +1 -0
- package/dist/core/workspace/contract-enforcer.d.ts +54 -0
- package/dist/core/workspace/contract-enforcer.d.ts.map +1 -0
- package/dist/core/workspace/contract-enforcer.js +128 -0
- package/dist/core/workspace/contract-enforcer.js.map +1 -0
- package/dist/core/workspace/manager.d.ts +28 -0
- package/dist/core/workspace/manager.d.ts.map +1 -0
- package/dist/core/workspace/manager.js +3 -0
- package/dist/core/workspace/manager.js.map +1 -0
- package/dist/core/workspace/merge.d.ts +38 -0
- package/dist/core/workspace/merge.d.ts.map +1 -0
- package/dist/core/workspace/merge.js +92 -0
- package/dist/core/workspace/merge.js.map +1 -0
- package/dist/core/workspace/patch-mode.d.ts +22 -0
- package/dist/core/workspace/patch-mode.d.ts.map +1 -0
- package/dist/core/workspace/patch-mode.js +91 -0
- package/dist/core/workspace/patch-mode.js.map +1 -0
- package/dist/core/workspace/scope-detector.d.ts +13 -0
- package/dist/core/workspace/scope-detector.d.ts.map +1 -0
- package/dist/core/workspace/scope-detector.js +34 -0
- package/dist/core/workspace/scope-detector.js.map +1 -0
- package/dist/core/workspace/worktree-mode.d.ts +28 -0
- package/dist/core/workspace/worktree-mode.d.ts.map +1 -0
- package/dist/core/workspace/worktree-mode.js +157 -0
- package/dist/core/workspace/worktree-mode.js.map +1 -0
- package/dist/index.js +16 -4
- package/dist/index.js.map +1 -1
- package/dist/templates/claude-code/ralphy-archive.md +1 -1
- package/dist/templates/claude-code/ralphy-implement.md +1 -1
- package/dist/templates/claude-code/ralphy-plan.md +1 -1
- package/dist/templates/claude-code/ralphy-validate.md +1 -1
- package/dist/templates/cursor/ralphy-archive.md +1 -1
- package/dist/templates/cursor/ralphy-implement.md +1 -1
- package/dist/templates/cursor/ralphy-plan.md +1 -1
- package/dist/templates/cursor/ralphy-validate.md +1 -1
- package/dist/templates/shared/openspec-tasks-template.md +23 -3
- package/dist/templates/shared/project-template.yml +232 -0
- package/dist/utils/installer.d.ts.map +1 -1
- package/dist/utils/installer.js +31 -1
- package/dist/utils/installer.js.map +1 -1
- package/dist/utils/validator.d.ts.map +1 -1
- package/dist/utils/validator.js +10 -0
- package/dist/utils/validator.js.map +1 -1
- 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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
17
|
+
CLI basics:
|
|
73
18
|
|
|
74
19
|
```bash
|
|
75
|
-
|
|
20
|
+
ralphy-spec run --dry-run
|
|
21
|
+
ralphy-spec run
|
|
22
|
+
ralphy-spec status
|
|
23
|
+
ralphy-spec budget --json
|
|
76
24
|
```
|
|
77
25
|
|
|
78
|
-
|
|
26
|
+
Then use the commands for your AI tool:
|
|
79
27
|
|
|
80
|
-
###
|
|
28
|
+
### Cursor
|
|
81
29
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
ralphy-
|
|
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
|
-
|
|
37
|
+
### Claude Code
|
|
88
38
|
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
46
|
+
### OpenCode
|
|
94
47
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
|
|
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
|
+
## Example Workflow
|
|
106
61
|
|
|
107
62
|
```bash
|
|
108
|
-
|
|
109
|
-
|
|
63
|
+
# 1. Plan: Create spec from your idea
|
|
64
|
+
You: /ralphy-plan Add user authentication with JWT
|
|
110
65
|
|
|
111
|
-
|
|
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
|
-
|
|
69
|
+
# 3. Validate: Verify tests pass
|
|
70
|
+
You: /ralphy-validate
|
|
124
71
|
|
|
125
|
-
|
|
72
|
+
# 4. Archive: Complete the change
|
|
73
|
+
You: /ralphy-archive add-user-auth
|
|
74
|
+
```
|
|
126
75
|
|
|
127
|
-
|
|
76
|
+
## What Gets Created
|
|
128
77
|
|
|
129
78
|
```
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
-
|
|
85
|
+
AGENTS.md # For OpenCode
|
|
141
86
|
|
|
142
|
-
|
|
87
|
+
openspec/
|
|
88
|
+
├── specs/ # Source of truth
|
|
89
|
+
├── changes/ # Active work
|
|
90
|
+
├── archive/ # Completed
|
|
91
|
+
└── project.md # Context
|
|
143
92
|
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
|
|
108
|
+
> Note: Legacy `.ralphy/` folders are migrated to `ralphy-spec/` automatically when found.
|
|
149
109
|
|
|
150
|
-
|
|
110
|
+
## How It Works
|
|
151
111
|
|
|
152
|
-
|
|
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
|
-
|
|
114
|
+
**OpenSpec:** Specs before code. Structured specifications with acceptance criteria ensure AI knows exactly what to build.
|
|
155
115
|
|
|
156
|
-
|
|
116
|
+
**The Combination:**
|
|
157
117
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
125
|
+
## Installation Options
|
|
165
126
|
|
|
166
|
-
|
|
127
|
+
```bash
|
|
128
|
+
# npx (recommended)
|
|
129
|
+
npx ralphy-spec init
|
|
167
130
|
|
|
168
|
-
|
|
131
|
+
# Global install
|
|
132
|
+
npm install -g ralphy-spec
|
|
133
|
+
ralphy-spec init
|
|
169
134
|
|
|
170
|
-
|
|
135
|
+
# With specific tools
|
|
136
|
+
ralphy-spec init --tools cursor,claude-code,opencode
|
|
137
|
+
```
|
|
171
138
|
|
|
172
|
-
|
|
139
|
+
## Credits
|
|
173
140
|
|
|
174
|
-
|
|
141
|
+
Built on the work of:
|
|
175
142
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
17
|
+
CLI 基础用法:
|
|
73
18
|
|
|
74
19
|
```bash
|
|
75
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
109
|
-
|
|
63
|
+
# 1. 规划:从你的想法创建规范
|
|
64
|
+
You: /ralphy-plan 添加 JWT 用户认证
|
|
110
65
|
|
|
111
|
-
|
|
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
|
-
|
|
69
|
+
# 3. 验证:确保测试通过
|
|
70
|
+
You: /ralphy-validate
|
|
124
71
|
|
|
125
|
-
|
|
72
|
+
# 4. 归档:完成变更
|
|
73
|
+
You: /ralphy-archive add-user-auth
|
|
74
|
+
```
|
|
126
75
|
|
|
127
|
-
|
|
76
|
+
## 创建的文件
|
|
128
77
|
|
|
129
78
|
```
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
-
|
|
85
|
+
AGENTS.md # OpenCode 使用
|
|
141
86
|
|
|
142
|
-
|
|
87
|
+
openspec/
|
|
88
|
+
├── specs/ # 真实来源
|
|
89
|
+
├── changes/ # 进行中的工作
|
|
90
|
+
├── archive/ # 已完成
|
|
91
|
+
└── project.md # 上下文
|
|
143
92
|
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
|
|
108
|
+
> 注意:如果检测到旧的 `.ralphy/`,会自动迁移到 `ralphy-spec/` 并提示。
|
|
149
109
|
|
|
150
|
-
|
|
110
|
+
## 工作原理
|
|
151
111
|
|
|
152
|
-
|
|
112
|
+
**Ralph Wiggum 循环:** AI 重复接收相同提示直到任务完成。每次迭代,它都能看到文件中的之前工作并自我纠正。
|
|
153
113
|
|
|
154
|
-
|
|
114
|
+
**OpenSpec:** 先有规范后有代码。结构化的规范和验收标准确保 AI 知道要构建什么。
|
|
155
115
|
|
|
156
|
-
|
|
157
|
-
openspec archive <change-name> --yes
|
|
158
|
-
```
|
|
116
|
+
**为什么结合使用:**
|
|
159
117
|
|
|
160
|
-
|
|
118
|
+
| 问题 | 解决方案 |
|
|
119
|
+
|------|----------|
|
|
120
|
+
| 聊天中的模糊需求 | 规范锁定意图 |
|
|
121
|
+
| AI 中途停止 | 循环重试直到完成 |
|
|
122
|
+
| 无法验证 | 测试验证输出 |
|
|
123
|
+
| 工具特定设置 | 一条命令搞定所有 |
|
|
161
124
|
|
|
162
|
-
|
|
125
|
+
## 安装选项
|
|
163
126
|
|
|
164
|
-
|
|
127
|
+
```bash
|
|
128
|
+
# npx(推荐)
|
|
129
|
+
npx ralphy-spec init
|
|
165
130
|
|
|
166
|
-
|
|
131
|
+
# 全局安装
|
|
132
|
+
npm install -g ralphy-spec
|
|
133
|
+
ralphy-spec init
|
|
167
134
|
|
|
168
|
-
|
|
135
|
+
# 指定工具
|
|
136
|
+
ralphy-spec init --tools cursor,claude-code,opencode
|
|
137
|
+
```
|
|
169
138
|
|
|
170
|
-
|
|
139
|
+
## 致谢
|
|
171
140
|
|
|
172
|
-
|
|
141
|
+
基于以下项目:
|
|
173
142
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
|
package/bin/ralphy-spec.js
CHANGED
|
File without changes
|
|
@@ -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 @@
|
|
|
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"}
|