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.
Files changed (187) hide show
  1. package/README.ja.md +126 -0
  2. package/README.ko.md +126 -0
  3. package/README.md +77 -133
  4. package/README.zh.md +126 -0
  5. package/bin/ralphy-spec.js +0 -0
  6. package/dist/cli/checkpoint.d.ts +3 -0
  7. package/dist/cli/checkpoint.d.ts.map +1 -0
  8. package/dist/cli/checkpoint.js +23 -0
  9. package/dist/cli/checkpoint.js.map +1 -0
  10. package/dist/cli/init.d.ts +3 -0
  11. package/dist/cli/init.d.ts.map +1 -0
  12. package/dist/cli/init.js +66 -0
  13. package/dist/cli/init.js.map +1 -0
  14. package/dist/cli/report.d.ts +3 -0
  15. package/dist/cli/report.d.ts.map +1 -0
  16. package/dist/cli/report.js +53 -0
  17. package/dist/cli/report.js.map +1 -0
  18. package/dist/cli/run.d.ts +3 -0
  19. package/dist/cli/run.d.ts.map +1 -0
  20. package/dist/cli/run.js +79 -0
  21. package/dist/cli/run.js.map +1 -0
  22. package/dist/cli/status.d.ts +3 -0
  23. package/dist/cli/status.d.ts.map +1 -0
  24. package/dist/cli/status.js +45 -0
  25. package/dist/cli/status.js.map +1 -0
  26. package/dist/cli/tail.d.ts +3 -0
  27. package/dist/cli/tail.d.ts.map +1 -0
  28. package/dist/cli/tail.js +46 -0
  29. package/dist/cli/tail.js.map +1 -0
  30. package/dist/cli/update.d.ts +3 -0
  31. package/dist/cli/update.d.ts.map +1 -0
  32. package/dist/cli/update.js +62 -0
  33. package/dist/cli/update.js.map +1 -0
  34. package/dist/cli/validate.d.ts +3 -0
  35. package/dist/cli/validate.d.ts.map +1 -0
  36. package/dist/cli/validate.js +83 -0
  37. package/dist/cli/validate.js.map +1 -0
  38. package/dist/core/backends/claude-code.d.ts +17 -0
  39. package/dist/core/backends/claude-code.d.ts.map +1 -0
  40. package/dist/core/backends/claude-code.js +75 -0
  41. package/dist/core/backends/claude-code.js.map +1 -0
  42. package/dist/core/backends/cursor.d.ts +17 -0
  43. package/dist/core/backends/cursor.d.ts.map +1 -0
  44. package/dist/core/backends/cursor.js +75 -0
  45. package/dist/core/backends/cursor.js.map +1 -0
  46. package/dist/core/backends/noop.d.ts +10 -0
  47. package/dist/core/backends/noop.d.ts.map +1 -0
  48. package/dist/core/backends/noop.js +17 -0
  49. package/dist/core/backends/noop.js.map +1 -0
  50. package/dist/core/backends/opencode.d.ts +16 -0
  51. package/dist/core/backends/opencode.d.ts.map +1 -0
  52. package/dist/core/backends/opencode.js +73 -0
  53. package/dist/core/backends/opencode.js.map +1 -0
  54. package/dist/core/backends/types.d.ts +21 -0
  55. package/dist/core/backends/types.d.ts.map +1 -0
  56. package/dist/core/backends/types.js +3 -0
  57. package/dist/core/backends/types.js.map +1 -0
  58. package/dist/core/budgets/manager.d.ts +21 -0
  59. package/dist/core/budgets/manager.d.ts.map +1 -0
  60. package/dist/core/budgets/manager.js +48 -0
  61. package/dist/core/budgets/manager.js.map +1 -0
  62. package/dist/core/budgets/state.d.ts +25 -0
  63. package/dist/core/budgets/state.d.ts.map +1 -0
  64. package/dist/core/budgets/state.js +33 -0
  65. package/dist/core/budgets/state.js.map +1 -0
  66. package/dist/core/budgets/tiers.d.ts +32 -0
  67. package/dist/core/budgets/tiers.d.ts.map +1 -0
  68. package/dist/core/budgets/tiers.js +67 -0
  69. package/dist/core/budgets/tiers.js.map +1 -0
  70. package/dist/core/engine/context-pack.d.ts +12 -0
  71. package/dist/core/engine/context-pack.d.ts.map +1 -0
  72. package/dist/core/engine/context-pack.js +45 -0
  73. package/dist/core/engine/context-pack.js.map +1 -0
  74. package/dist/core/engine/loop.d.ts +28 -0
  75. package/dist/core/engine/loop.d.ts.map +1 -0
  76. package/dist/core/engine/loop.js +366 -0
  77. package/dist/core/engine/loop.js.map +1 -0
  78. package/dist/core/engine/phases.d.ts +2 -0
  79. package/dist/core/engine/phases.d.ts.map +1 -0
  80. package/dist/core/engine/phases.js +3 -0
  81. package/dist/core/engine/phases.js.map +1 -0
  82. package/dist/core/engine/repair.d.ts +6 -0
  83. package/dist/core/engine/repair.d.ts.map +1 -0
  84. package/dist/core/engine/repair.js +23 -0
  85. package/dist/core/engine/repair.js.map +1 -0
  86. package/dist/core/folders.d.ts +26 -0
  87. package/dist/core/folders.d.ts.map +1 -0
  88. package/dist/core/folders.js +58 -0
  89. package/dist/core/folders.js.map +1 -0
  90. package/dist/core/memory/ledger.d.ts +13 -0
  91. package/dist/core/memory/ledger.d.ts.map +1 -0
  92. package/dist/core/memory/ledger.js +24 -0
  93. package/dist/core/memory/ledger.js.map +1 -0
  94. package/dist/core/memory/persistence.d.ts +45 -0
  95. package/dist/core/memory/persistence.d.ts.map +1 -0
  96. package/dist/core/memory/persistence.js +162 -0
  97. package/dist/core/memory/persistence.js.map +1 -0
  98. package/dist/core/reporting/spend.d.ts +40 -0
  99. package/dist/core/reporting/spend.d.ts.map +1 -0
  100. package/dist/core/reporting/spend.js +157 -0
  101. package/dist/core/reporting/spend.js.map +1 -0
  102. package/dist/core/spec/dag.d.ts +7 -0
  103. package/dist/core/spec/dag.d.ts.map +1 -0
  104. package/dist/core/spec/dag.js +65 -0
  105. package/dist/core/spec/dag.js.map +1 -0
  106. package/dist/core/spec/file-contract.d.ts +13 -0
  107. package/dist/core/spec/file-contract.d.ts.map +1 -0
  108. package/dist/core/spec/file-contract.js +29 -0
  109. package/dist/core/spec/file-contract.js.map +1 -0
  110. package/dist/core/spec/loader.d.ts +8 -0
  111. package/dist/core/spec/loader.d.ts.map +1 -0
  112. package/dist/core/spec/loader.js +51 -0
  113. package/dist/core/spec/loader.js.map +1 -0
  114. package/dist/core/spec/schemas.d.ts +278 -0
  115. package/dist/core/spec/schemas.d.ts.map +1 -0
  116. package/dist/core/spec/schemas.js +207 -0
  117. package/dist/core/spec/schemas.js.map +1 -0
  118. package/dist/core/spec/types.d.ts +71 -0
  119. package/dist/core/spec/types.d.ts.map +1 -0
  120. package/dist/core/spec/types.js +3 -0
  121. package/dist/core/spec/types.js.map +1 -0
  122. package/dist/core/validators/parsers/eslint.d.ts +3 -0
  123. package/dist/core/validators/parsers/eslint.d.ts.map +1 -0
  124. package/dist/core/validators/parsers/eslint.js +35 -0
  125. package/dist/core/validators/parsers/eslint.js.map +1 -0
  126. package/dist/core/validators/parsers/jest.d.ts +3 -0
  127. package/dist/core/validators/parsers/jest.d.ts.map +1 -0
  128. package/dist/core/validators/parsers/jest.js +16 -0
  129. package/dist/core/validators/parsers/jest.js.map +1 -0
  130. package/dist/core/validators/parsers/tsc.d.ts +3 -0
  131. package/dist/core/validators/parsers/tsc.d.ts.map +1 -0
  132. package/dist/core/validators/parsers/tsc.js +32 -0
  133. package/dist/core/validators/parsers/tsc.js.map +1 -0
  134. package/dist/core/validators/runner.d.ts +8 -0
  135. package/dist/core/validators/runner.d.ts.map +1 -0
  136. package/dist/core/validators/runner.js +85 -0
  137. package/dist/core/validators/runner.js.map +1 -0
  138. package/dist/core/validators/signatures.d.ts +3 -0
  139. package/dist/core/validators/signatures.d.ts.map +1 -0
  140. package/dist/core/validators/signatures.js +10 -0
  141. package/dist/core/validators/signatures.js.map +1 -0
  142. package/dist/core/validators/types.d.ts +27 -0
  143. package/dist/core/validators/types.d.ts.map +1 -0
  144. package/dist/core/validators/types.js +3 -0
  145. package/dist/core/validators/types.js.map +1 -0
  146. package/dist/core/workspace/contract-enforcer.d.ts +54 -0
  147. package/dist/core/workspace/contract-enforcer.d.ts.map +1 -0
  148. package/dist/core/workspace/contract-enforcer.js +128 -0
  149. package/dist/core/workspace/contract-enforcer.js.map +1 -0
  150. package/dist/core/workspace/manager.d.ts +28 -0
  151. package/dist/core/workspace/manager.d.ts.map +1 -0
  152. package/dist/core/workspace/manager.js +3 -0
  153. package/dist/core/workspace/manager.js.map +1 -0
  154. package/dist/core/workspace/merge.d.ts +38 -0
  155. package/dist/core/workspace/merge.d.ts.map +1 -0
  156. package/dist/core/workspace/merge.js +92 -0
  157. package/dist/core/workspace/merge.js.map +1 -0
  158. package/dist/core/workspace/patch-mode.d.ts +22 -0
  159. package/dist/core/workspace/patch-mode.d.ts.map +1 -0
  160. package/dist/core/workspace/patch-mode.js +91 -0
  161. package/dist/core/workspace/patch-mode.js.map +1 -0
  162. package/dist/core/workspace/worktree-mode.d.ts +28 -0
  163. package/dist/core/workspace/worktree-mode.d.ts.map +1 -0
  164. package/dist/core/workspace/worktree-mode.js +156 -0
  165. package/dist/core/workspace/worktree-mode.js.map +1 -0
  166. package/dist/index.js +14 -4
  167. package/dist/index.js.map +1 -1
  168. package/dist/templates/claude-code/ralphy-archive.md +22 -0
  169. package/dist/templates/claude-code/ralphy-implement.md +30 -0
  170. package/dist/templates/claude-code/ralphy-plan.md +31 -0
  171. package/dist/templates/claude-code/ralphy-validate.md +21 -0
  172. package/dist/templates/cursor/ralphy-archive.md +20 -0
  173. package/dist/templates/cursor/ralphy-implement.md +31 -0
  174. package/dist/templates/cursor/ralphy-plan.md +39 -0
  175. package/dist/templates/cursor/ralphy-validate.md +24 -0
  176. package/dist/templates/opencode/AGENTS.md +46 -0
  177. package/dist/templates/shared/openspec-tasks-template.md +48 -0
  178. package/dist/templates/shared/project-template.yml +232 -0
  179. package/dist/templates/shared/ralph-loop-prompt-template.md +25 -0
  180. package/dist/utils/installer.d.ts.map +1 -1
  181. package/dist/utils/installer.js +31 -1
  182. package/dist/utils/installer.js.map +1 -1
  183. package/dist/utils/validator.d.ts.map +1 -1
  184. package/dist/utils/validator.js +10 -0
  185. package/dist/utils/validator.js.map +1 -1
  186. package/package.json +14 -4
  187. 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;AAgBvC,wBAAsB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB9E;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"}
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"}
@@ -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, ".ralphy");
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":"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"}
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;AAWxD,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,eAAe,EAAE,CAAC,CAyC5B"}
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"}
@@ -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":";;;;;AAaA,0CA4CC;AAzDD,gEAAkC;AAClC,0DAA6B;AAG7B,KAAK,UAAU,MAAM,CAAC,CAAS;IAC7B,IAAI,CAAC;QACH,MAAM,kBAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,KAAe;IAEf,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,MAAM,WAAW,GAAG,mBAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,yDAAyD;YAClE,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,qBAAqB,CAAC,EAAE,CAAC;QAC9E,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,mBAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,gCAAgC,CAAC;QAC3C,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,mBAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,iCAAiC,CAAC;QAC5C,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,mBAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,WAAW,CAAC;QACtB,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,mBAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
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.1.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/anthropics/ralphy-openspec.git"
10
+ "url": "git+https://github.com/wenqingyu/ralphy-openspec.git"
11
11
  },
12
12
  "bugs": {
13
- "url": "https://github.com/anthropics/ralphy-openspec/issues"
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 root = path.resolve(new URL(".", import.meta.url).pathname, "..", "..");
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