ralphy-spec 0.1.0 → 0.2.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/README.ja.md +126 -0
- package/README.ko.md +126 -0
- package/README.md +77 -133
- package/README.zh.md +126 -0
- package/bin/ralphy-spec.js +0 -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 +66 -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 +79 -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 +45 -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/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/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/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.js +366 -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 +45 -0
- package/dist/core/memory/persistence.d.ts.map +1 -0
- package/dist/core/memory/persistence.js +162 -0
- package/dist/core/memory/persistence.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 +51 -0
- package/dist/core/spec/loader.js.map +1 -0
- package/dist/core/spec/schemas.d.ts +278 -0
- package/dist/core/spec/schemas.d.ts.map +1 -0
- package/dist/core/spec/schemas.js +207 -0
- package/dist/core/spec/schemas.js.map +1 -0
- package/dist/core/spec/types.d.ts +71 -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/worktree-mode.d.ts +28 -0
- package/dist/core/workspace/worktree-mode.d.ts.map +1 -0
- package/dist/core/workspace/worktree-mode.js +156 -0
- package/dist/core/workspace/worktree-mode.js.map +1 -0
- package/dist/index.js +14 -4
- package/dist/index.js.map +1 -1
- package/dist/templates/claude-code/ralphy-archive.md +22 -0
- package/dist/templates/claude-code/ralphy-implement.md +30 -0
- package/dist/templates/claude-code/ralphy-plan.md +31 -0
- package/dist/templates/claude-code/ralphy-validate.md +21 -0
- package/dist/templates/cursor/ralphy-archive.md +20 -0
- package/dist/templates/cursor/ralphy-implement.md +31 -0
- package/dist/templates/cursor/ralphy-plan.md +39 -0
- package/dist/templates/cursor/ralphy-validate.md +24 -0
- package/dist/templates/opencode/AGENTS.md +46 -0
- package/dist/templates/shared/openspec-tasks-template.md +48 -0
- package/dist/templates/shared/project-template.yml +232 -0
- package/dist/templates/shared/ralph-loop-prompt-template.md +25 -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 +14 -4
- package/scripts/copy-templates.mjs +2 -1
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# ralphy-spec Project Configuration
|
|
2
|
+
# Generated by: ralphy-spec init
|
|
3
|
+
# Version: 2.1 (Budget Intelligence + Sprint Semantics)
|
|
4
|
+
|
|
5
|
+
version: "1.1"
|
|
6
|
+
|
|
7
|
+
project:
|
|
8
|
+
name: "my-project"
|
|
9
|
+
repoRoot: "."
|
|
10
|
+
language: "ts"
|
|
11
|
+
packageManager: "npm" # user-defined: npm | pnpm | yarn | bun
|
|
12
|
+
|
|
13
|
+
defaults:
|
|
14
|
+
backend: "cursor"
|
|
15
|
+
workspaceMode: "patch" # "worktree" | "patch"
|
|
16
|
+
checkpointMode: "commit" # "commit" | "patch"
|
|
17
|
+
validators:
|
|
18
|
+
- typecheck
|
|
19
|
+
- test
|
|
20
|
+
- lint
|
|
21
|
+
|
|
22
|
+
# Artifacts (IDE-friendly human interface)
|
|
23
|
+
# NOTE: These are defaults; users can override or disable.
|
|
24
|
+
artifacts:
|
|
25
|
+
enabled: true
|
|
26
|
+
rootDir: "ralphy-spec" # default; can be overridden via CLI: --artifact-dir
|
|
27
|
+
statusIcons: "emoji" # "emoji" | "ascii" | "none"
|
|
28
|
+
|
|
29
|
+
# Run-level budgets (hard limits for entire run)
|
|
30
|
+
budgets:
|
|
31
|
+
run:
|
|
32
|
+
money_usd: 20 # Max USD per run
|
|
33
|
+
tokens: 2000000 # Max tokens per run
|
|
34
|
+
wall_time_minutes: 90 # Max wall clock time
|
|
35
|
+
max_iterations_total: 80 # Max total iterations across all tasks
|
|
36
|
+
|
|
37
|
+
limits:
|
|
38
|
+
max_parallel_tasks: 1 # Concurrent tasks (v1: always 1)
|
|
39
|
+
max_parallel_validators: 2 # Concurrent validators
|
|
40
|
+
command_timeout_seconds: 900
|
|
41
|
+
|
|
42
|
+
# Sprint size defaults (applied when task has sprint.size but no explicit budget)
|
|
43
|
+
# Users can override per-task
|
|
44
|
+
sprint_defaults:
|
|
45
|
+
XS:
|
|
46
|
+
optimal: { usd: 0.20, tokens: 15000, time_minutes: 3 }
|
|
47
|
+
warning: { usd: 0.35, tokens: 25000, time_minutes: 5 }
|
|
48
|
+
hard: { usd: 0.50, tokens: 40000, time_minutes: 8, max_iterations: 3 }
|
|
49
|
+
S:
|
|
50
|
+
optimal: { usd: 0.50, tokens: 40000, time_minutes: 5 }
|
|
51
|
+
warning: { usd: 0.80, tokens: 65000, time_minutes: 8 }
|
|
52
|
+
hard: { usd: 1.20, tokens: 100000, time_minutes: 12, max_iterations: 5 }
|
|
53
|
+
M:
|
|
54
|
+
optimal: { usd: 1.20, tokens: 80000, time_minutes: 10 }
|
|
55
|
+
warning: { usd: 2.00, tokens: 150000, time_minutes: 15 }
|
|
56
|
+
hard: { usd: 3.00, tokens: 250000, time_minutes: 20, max_iterations: 8 }
|
|
57
|
+
L:
|
|
58
|
+
optimal: { usd: 2.50, tokens: 150000, time_minutes: 20 }
|
|
59
|
+
warning: { usd: 4.00, tokens: 280000, time_minutes: 35 }
|
|
60
|
+
hard: { usd: 6.00, tokens: 450000, time_minutes: 50, max_iterations: 12 }
|
|
61
|
+
XL:
|
|
62
|
+
optimal: { usd: 5.00, tokens: 300000, time_minutes: 40 }
|
|
63
|
+
warning: { usd: 8.00, tokens: 550000, time_minutes: 70 }
|
|
64
|
+
hard: { usd: 12.00, tokens: 900000, time_minutes: 100, max_iterations: 20 }
|
|
65
|
+
|
|
66
|
+
backends:
|
|
67
|
+
cursor:
|
|
68
|
+
command: "cursor"
|
|
69
|
+
modelTiers:
|
|
70
|
+
default: { hint: "balanced" }
|
|
71
|
+
cheap: { hint: "cheap" }
|
|
72
|
+
strong: { hint: "strong" }
|
|
73
|
+
opencode:
|
|
74
|
+
command: "opencode"
|
|
75
|
+
modelTiers:
|
|
76
|
+
default: {}
|
|
77
|
+
cheap: {}
|
|
78
|
+
claude_code:
|
|
79
|
+
command: "claude"
|
|
80
|
+
modelTiers:
|
|
81
|
+
default: {}
|
|
82
|
+
|
|
83
|
+
validators:
|
|
84
|
+
- id: "typecheck"
|
|
85
|
+
# Avoid hard-coding package manager. Choose commands that match your repo.
|
|
86
|
+
run: "npm run typecheck"
|
|
87
|
+
timeout_seconds: 600
|
|
88
|
+
parser: "tsc"
|
|
89
|
+
- id: "test"
|
|
90
|
+
run: "npm test"
|
|
91
|
+
timeout_seconds: 900
|
|
92
|
+
parser: "jest"
|
|
93
|
+
- id: "lint"
|
|
94
|
+
run: "npm run lint"
|
|
95
|
+
timeout_seconds: 600
|
|
96
|
+
parser: "eslint"
|
|
97
|
+
|
|
98
|
+
# Tasks - define your implementation tasks here
|
|
99
|
+
tasks: []
|
|
100
|
+
|
|
101
|
+
# ============================================================
|
|
102
|
+
# TASK EXAMPLES (uncomment and modify as needed)
|
|
103
|
+
# ============================================================
|
|
104
|
+
|
|
105
|
+
# Example 1: Simple fix (XS sprint, uses defaults)
|
|
106
|
+
# - id: "fix-typo-001"
|
|
107
|
+
# title: "Fix typo in error message"
|
|
108
|
+
# goal: "Correct spelling in validation error"
|
|
109
|
+
#
|
|
110
|
+
# sprint:
|
|
111
|
+
# size: XS # Uses XS defaults: $0.20 optimal, 3 max iter
|
|
112
|
+
# intent: "fix" # No refactoring allowed
|
|
113
|
+
#
|
|
114
|
+
# files_contract:
|
|
115
|
+
# allowed: ["src/utils/validation.ts"]
|
|
116
|
+
# forbidden: []
|
|
117
|
+
# allow_new_files: false
|
|
118
|
+
#
|
|
119
|
+
# acceptance:
|
|
120
|
+
# - id: "acc-1"
|
|
121
|
+
# text: "Error message spelled correctly"
|
|
122
|
+
# type: "behavior"
|
|
123
|
+
|
|
124
|
+
# Example 2: Feature (M sprint with custom budget)
|
|
125
|
+
# - id: "auth-001"
|
|
126
|
+
# title: "JWT middleware"
|
|
127
|
+
# goal: "Add JWT auth middleware for API routes"
|
|
128
|
+
#
|
|
129
|
+
# sprint:
|
|
130
|
+
# size: M
|
|
131
|
+
# intent: "feature" # Limited refactoring allowed
|
|
132
|
+
#
|
|
133
|
+
# budget: # Optional: override sprint defaults
|
|
134
|
+
# optimal:
|
|
135
|
+
# usd: 1.2
|
|
136
|
+
# tokens: 80000
|
|
137
|
+
# time_minutes: 10
|
|
138
|
+
# warning:
|
|
139
|
+
# usd: 2.0
|
|
140
|
+
# tokens: 150000
|
|
141
|
+
# time_minutes: 15
|
|
142
|
+
# hard:
|
|
143
|
+
# usd: 3.0
|
|
144
|
+
# tokens: 250000
|
|
145
|
+
# time_minutes: 20
|
|
146
|
+
# max_iterations: 8
|
|
147
|
+
#
|
|
148
|
+
# files_contract:
|
|
149
|
+
# allowed:
|
|
150
|
+
# - "src/middleware/**"
|
|
151
|
+
# - "src/api/**"
|
|
152
|
+
# forbidden:
|
|
153
|
+
# - "src/db/**"
|
|
154
|
+
# allow_new_files: true
|
|
155
|
+
#
|
|
156
|
+
# context:
|
|
157
|
+
# docs: ["README.md"]
|
|
158
|
+
# files: ["src/api/index.ts"]
|
|
159
|
+
#
|
|
160
|
+
# acceptance:
|
|
161
|
+
# - id: "acc-1"
|
|
162
|
+
# text: "Requests without token return 401"
|
|
163
|
+
# type: "behavior"
|
|
164
|
+
# - id: "acc-2"
|
|
165
|
+
# text: "Valid tokens allow access"
|
|
166
|
+
# type: "behavior"
|
|
167
|
+
# - id: "acc-3"
|
|
168
|
+
# text: "Unit tests added"
|
|
169
|
+
# type: "evidence"
|
|
170
|
+
# evidence:
|
|
171
|
+
# must_include_files: ["src/**/__tests__/**"]
|
|
172
|
+
#
|
|
173
|
+
# validators: ["typecheck", "test", "lint"]
|
|
174
|
+
# done_policy:
|
|
175
|
+
# require_all_validators_pass: true
|
|
176
|
+
# require_acceptance_evidence: true
|
|
177
|
+
|
|
178
|
+
# Example 3: Large refactor (L sprint)
|
|
179
|
+
# - id: "refactor-db-001"
|
|
180
|
+
# title: "Migrate to Prisma"
|
|
181
|
+
# goal: "Replace raw SQL with Prisma ORM"
|
|
182
|
+
# deps: ["auth-001"] # Depends on auth task
|
|
183
|
+
#
|
|
184
|
+
# sprint:
|
|
185
|
+
# size: L
|
|
186
|
+
# intent: "refactor" # Full refactoring allowed
|
|
187
|
+
#
|
|
188
|
+
# files_contract:
|
|
189
|
+
# allowed:
|
|
190
|
+
# - "src/db/**"
|
|
191
|
+
# - "prisma/**"
|
|
192
|
+
# forbidden:
|
|
193
|
+
# - "src/api/**" # Don't touch API layer
|
|
194
|
+
# allow_new_files: true
|
|
195
|
+
#
|
|
196
|
+
# acceptance:
|
|
197
|
+
# - id: "acc-1"
|
|
198
|
+
# text: "All database queries use Prisma"
|
|
199
|
+
# type: "behavior"
|
|
200
|
+
# - id: "acc-2"
|
|
201
|
+
# text: "Existing tests pass"
|
|
202
|
+
# type: "evidence"
|
|
203
|
+
|
|
204
|
+
# ============================================================
|
|
205
|
+
# BUDGET TIERS EXPLAINED
|
|
206
|
+
# ============================================================
|
|
207
|
+
#
|
|
208
|
+
# OPTIMAL: Expected cost for correct completion
|
|
209
|
+
# - Agent operates normally with full context
|
|
210
|
+
# - All features enabled (self-review, planning)
|
|
211
|
+
#
|
|
212
|
+
# WARNING: Still acceptable but attention needed
|
|
213
|
+
# - Context shrink: fewer files, only failing tests
|
|
214
|
+
# - Repair-only mode: "fix only, no refactor"
|
|
215
|
+
# - Optional calls disabled
|
|
216
|
+
# - STATUS.md shows pressure signals
|
|
217
|
+
#
|
|
218
|
+
# HARD: Must stop immediately
|
|
219
|
+
# - Task marked as BLOCKED
|
|
220
|
+
# - Workspace preserved for debugging
|
|
221
|
+
# - Failure summary written
|
|
222
|
+
# - No silent retries
|
|
223
|
+
#
|
|
224
|
+
# ============================================================
|
|
225
|
+
# SPRINT SIZES GUIDE
|
|
226
|
+
# ============================================================
|
|
227
|
+
#
|
|
228
|
+
# XS: Single file fix, typo, simple config change
|
|
229
|
+
# S: Small function, add a test, minor refactor
|
|
230
|
+
# M: Feature slice, new endpoint, component
|
|
231
|
+
# L: Multi-file feature, significant change
|
|
232
|
+
# XL: Infrastructure, major refactor, migration
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Ralph Loop Prompt Template (OpenSpec task runner)
|
|
2
|
+
|
|
3
|
+
Use this template when running an AI agent in a loop (Ralph methodology). The same prompt may be repeated until the completion promise is printed.
|
|
4
|
+
|
|
5
|
+
## Context
|
|
6
|
+
You are implementing OpenSpec change: `{{change_name}}`
|
|
7
|
+
|
|
8
|
+
## Current Task
|
|
9
|
+
{{current_task_from_tasks_md}}
|
|
10
|
+
|
|
11
|
+
## Acceptance Criteria
|
|
12
|
+
{{acceptance_criteria}}
|
|
13
|
+
|
|
14
|
+
## Instructions
|
|
15
|
+
1. Read the spec at `openspec/changes/{{change_name}}/` and the baseline specs in `openspec/specs/`.
|
|
16
|
+
2. Implement the current task.
|
|
17
|
+
3. Run tests to verify the acceptance criteria.
|
|
18
|
+
4. If tests pass, mark the task complete and output `<promise>TASK_COMPLETE</promise>`.
|
|
19
|
+
5. If tests fail, fix issues and continue iterating.
|
|
20
|
+
|
|
21
|
+
## Important
|
|
22
|
+
- Do NOT output the promise until tests pass.
|
|
23
|
+
- Prefer small, incremental changes.
|
|
24
|
+
- Keep tests aligned with OpenSpec scenarios.
|
|
25
|
+
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/utils/installer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/utils/installer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAiBvC,wBAAsB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD9E;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GACvB,OAAO,CAAC,IAAI,CAAC,CA+Df"}
|
package/dist/utils/installer.js
CHANGED
|
@@ -9,6 +9,7 @@ const promises_1 = __importDefault(require("node:fs/promises"));
|
|
|
9
9
|
const node_path_1 = __importDefault(require("node:path"));
|
|
10
10
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
11
11
|
const paths_1 = require("./paths");
|
|
12
|
+
const folders_1 = require("../core/folders");
|
|
12
13
|
async function ensureDir(p) {
|
|
13
14
|
await promises_1.default.mkdir(p, { recursive: true });
|
|
14
15
|
}
|
|
@@ -26,6 +27,35 @@ async function ensureOpenSpecScaffold(projectDir) {
|
|
|
26
27
|
await ensureDir(node_path_1.default.join(openspecDir, "specs"));
|
|
27
28
|
await ensureDir(node_path_1.default.join(openspecDir, "changes"));
|
|
28
29
|
await ensureDir(node_path_1.default.join(openspecDir, "archive"));
|
|
30
|
+
// v2+ project spec (template)
|
|
31
|
+
const templatesRoot = (0, paths_1.getDistTemplatesDir)();
|
|
32
|
+
const projectTemplatePath = node_path_1.default.join(templatesRoot, "shared", "project-template.yml");
|
|
33
|
+
let projectTemplate = [
|
|
34
|
+
"# ralphy-spec Project Configuration",
|
|
35
|
+
"# Generated by: ralphy-spec init",
|
|
36
|
+
'version: "1.0"',
|
|
37
|
+
"",
|
|
38
|
+
"project:",
|
|
39
|
+
' name: "my-project"',
|
|
40
|
+
' repoRoot: "."',
|
|
41
|
+
"",
|
|
42
|
+
"defaults:",
|
|
43
|
+
' backend: "cursor"',
|
|
44
|
+
' workspaceMode: "patch"',
|
|
45
|
+
' checkpointMode: "commit"',
|
|
46
|
+
" validators: []",
|
|
47
|
+
"",
|
|
48
|
+
"validators: []",
|
|
49
|
+
"tasks: []",
|
|
50
|
+
"",
|
|
51
|
+
].join("\n");
|
|
52
|
+
try {
|
|
53
|
+
projectTemplate = await promises_1.default.readFile(projectTemplatePath, "utf8");
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Fall back to embedded template.
|
|
57
|
+
}
|
|
58
|
+
await writeFileIfMissing(node_path_1.default.join(openspecDir, "project.yml"), projectTemplate);
|
|
29
59
|
await writeFileIfMissing(node_path_1.default.join(openspecDir, "project.md"), [
|
|
30
60
|
"# Project Context",
|
|
31
61
|
"",
|
|
@@ -77,7 +107,7 @@ async function installToolTemplates(projectDir, tools, opts) {
|
|
|
77
107
|
}
|
|
78
108
|
}
|
|
79
109
|
// Ralphy config/state
|
|
80
|
-
const ralphyDir = node_path_1.default.join(projectDir,
|
|
110
|
+
const ralphyDir = node_path_1.default.join(projectDir, folders_1.DEFAULT_ROOT_DIR);
|
|
81
111
|
await ensureDir(ralphyDir);
|
|
82
112
|
await writeFileIfMissing(node_path_1.default.join(ralphyDir, "config.json"), JSON.stringify({
|
|
83
113
|
testCommand: "npm test",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/utils/installer.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/utils/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAYxD,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,eAAe,EAAE,CAAC,CAmD5B"}
|
package/dist/utils/validator.js
CHANGED
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.validateProject = validateProject;
|
|
7
7
|
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
8
8
|
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const folders_1 = require("../core/folders");
|
|
9
10
|
async function exists(p) {
|
|
10
11
|
try {
|
|
11
12
|
await promises_1.default.access(p);
|
|
@@ -49,6 +50,15 @@ async function validateProject(projectDir, tools) {
|
|
|
49
50
|
issues.push({ level: "warning", message: `Missing ${p}`, path: p });
|
|
50
51
|
}
|
|
51
52
|
}
|
|
53
|
+
const newRoot = node_path_1.default.join(projectDir, folders_1.DEFAULT_ROOT_DIR);
|
|
54
|
+
const legacyRoot = node_path_1.default.join(projectDir, folders_1.LEGACY_ROOT_DIR);
|
|
55
|
+
if (!(await exists(newRoot)) && (await exists(legacyRoot))) {
|
|
56
|
+
issues.push({
|
|
57
|
+
level: "warning",
|
|
58
|
+
message: `Legacy folder detected. Consider migrating ${folders_1.LEGACY_ROOT_DIR}/ to ${folders_1.DEFAULT_ROOT_DIR}/`,
|
|
59
|
+
path: folders_1.LEGACY_ROOT_DIR,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
52
62
|
return issues;
|
|
53
63
|
}
|
|
54
64
|
//# sourceMappingURL=validator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/utils/validator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ralphy-spec",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "One-command setup for Ralph loop + OpenSpec workflows across Cursor, OpenCode, and Claude Code.",
|
|
5
5
|
"license": "BSD-3-Clause",
|
|
6
6
|
"author": "Wenqing Yu",
|
|
7
7
|
"homepage": "https://ralphy-spec.org",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
|
-
"url": "git+https://github.com/
|
|
10
|
+
"url": "git+https://github.com/wenqingyu/ralphy-openspec.git"
|
|
11
11
|
},
|
|
12
12
|
"bugs": {
|
|
13
|
-
"url": "https://github.com/
|
|
13
|
+
"url": "https://github.com/wenqingyu/ralphy-openspec/issues"
|
|
14
14
|
},
|
|
15
15
|
"keywords": [
|
|
16
16
|
"openspec",
|
|
@@ -33,6 +33,9 @@
|
|
|
33
33
|
"dist/",
|
|
34
34
|
"scripts/",
|
|
35
35
|
"README.md",
|
|
36
|
+
"README.zh.md",
|
|
37
|
+
"README.ko.md",
|
|
38
|
+
"README.ja.md",
|
|
36
39
|
"LICENSE"
|
|
37
40
|
],
|
|
38
41
|
"engines": {
|
|
@@ -50,13 +53,20 @@
|
|
|
50
53
|
},
|
|
51
54
|
"dependencies": {
|
|
52
55
|
"chalk": "^5.4.1",
|
|
56
|
+
"cli-table3": "^0.6.5",
|
|
53
57
|
"commander": "^14.0.0",
|
|
58
|
+
"execa": "^9.6.0",
|
|
59
|
+
"fast-glob": "^3.3.3",
|
|
54
60
|
"fs-extra": "^11.3.0",
|
|
55
61
|
"inquirer": "^12.6.3",
|
|
62
|
+
"minimatch": "^10.0.3",
|
|
56
63
|
"ora": "^9.0.0",
|
|
57
|
-
"yaml": "^2.8.0"
|
|
64
|
+
"yaml": "^2.8.0",
|
|
65
|
+
"zod": "^4.1.5",
|
|
66
|
+
"better-sqlite3": "^12.2.0"
|
|
58
67
|
},
|
|
59
68
|
"devDependencies": {
|
|
69
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
60
70
|
"@types/fs-extra": "^11.0.4",
|
|
61
71
|
"@types/node": "^22.13.0",
|
|
62
72
|
"typescript": "^5.7.3"
|
|
@@ -16,7 +16,8 @@ async function copyDir(srcDir, dstDir) {
|
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
const
|
|
19
|
+
const scriptsDir = path.dirname(new URL(import.meta.url).pathname);
|
|
20
|
+
const root = path.resolve(scriptsDir, "..");
|
|
20
21
|
const srcTemplates = path.join(root, "src", "templates");
|
|
21
22
|
const dstTemplates = path.join(root, "dist", "templates");
|
|
22
23
|
|