@curdx/flow 1.1.8 → 1.1.9
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +10 -3
- package/bin/curdx-flow.js +32 -23
- package/cli/README.md +10 -9
- package/package.json +1 -1
- package/cli/init.js +0 -312
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "curdx-flow",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.9",
|
|
4
4
|
"description": "AI engineering workflow meta-framework — spec-driven + autonomous execution + quality gates + multi-agent collaboration. Distills Karpathy + BMAD + GSD + Ralph + Superpowers + GStack and orchestrates context7 / sequential-thinking / chrome-devtools / frontend-design / claude-mem / pua dependencies.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "wdx",
|
package/README.md
CHANGED
|
@@ -43,14 +43,21 @@ Existing AI-coding workflows suffer from:
|
|
|
43
43
|
|
|
44
44
|
### Recommended: one-shot via npm (works in any project, fast on Chinese npm mirrors)
|
|
45
45
|
```bash
|
|
46
|
-
# Interactive (picks recommended plugins)
|
|
46
|
+
# Interactive install (picks recommended plugins)
|
|
47
47
|
npx @curdx/flow install
|
|
48
48
|
|
|
49
49
|
# Or install everything automatically
|
|
50
50
|
npx @curdx/flow install --all
|
|
51
51
|
|
|
52
|
-
#
|
|
53
|
-
|
|
52
|
+
# After the one-time install, initialize your project INSIDE Claude Code:
|
|
53
|
+
# $ claude
|
|
54
|
+
# /curdx-flow:init
|
|
55
|
+
# /curdx-flow:start my-feature "<description>"
|
|
56
|
+
|
|
57
|
+
# Other CLI lifecycle operations
|
|
58
|
+
npx @curdx/flow doctor # Health check
|
|
59
|
+
npx @curdx/flow upgrade # Update all plugins
|
|
60
|
+
npx @curdx/flow uninstall # Remove curdx-flow
|
|
54
61
|
```
|
|
55
62
|
|
|
56
63
|
### From the Claude Code marketplace
|
package/bin/curdx-flow.js
CHANGED
|
@@ -3,21 +3,24 @@
|
|
|
3
3
|
* curdx-flow CLI entry
|
|
4
4
|
*
|
|
5
5
|
* Usage:
|
|
6
|
-
* npx
|
|
7
|
-
*
|
|
6
|
+
* npx @curdx/flow <command> [args]
|
|
7
|
+
*
|
|
8
|
+
* The CLI only handles install-time and lifecycle operations that must
|
|
9
|
+
* happen outside Claude Code. Anything a user does while Claude Code is
|
|
10
|
+
* running (init a project, start a spec, run the workflow, etc.) is a
|
|
11
|
+
* slash command: /curdx-flow:init, /curdx-flow:start, and so on.
|
|
8
12
|
*
|
|
9
13
|
* Commands:
|
|
10
|
-
* install
|
|
11
|
-
* doctor
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* help
|
|
14
|
+
* install Install curdx-flow plugin + optional recommended plugins
|
|
15
|
+
* doctor Check health (claude CLI, plugin, MCPs, recommended plugins)
|
|
16
|
+
* upgrade Update curdx-flow + recommended plugins to latest
|
|
17
|
+
* uninstall Remove curdx-flow plugin (and optionally recommended / artifacts)
|
|
18
|
+
* help Show this help
|
|
15
19
|
* --version / -v
|
|
16
20
|
*/
|
|
17
21
|
|
|
18
22
|
import { install } from "../cli/install.js";
|
|
19
23
|
import { doctor } from "../cli/doctor.js";
|
|
20
|
-
import { init } from "../cli/init.js";
|
|
21
24
|
import { upgrade } from "../cli/upgrade.js";
|
|
22
25
|
import { uninstall } from "../cli/uninstall.js";
|
|
23
26
|
import { VERSION, color } from "../cli/utils.js";
|
|
@@ -32,7 +35,7 @@ ${color.bold("curdx-flow")} ${color.dim(`v${VERSION}`)}
|
|
|
32
35
|
CurDX-Flow installer & helper for Claude Code
|
|
33
36
|
|
|
34
37
|
${color.bold("USAGE")}
|
|
35
|
-
curdx
|
|
38
|
+
npx @curdx/flow <command> [options]
|
|
36
39
|
|
|
37
40
|
${color.bold("COMMANDS")}
|
|
38
41
|
${color.cyan("install")} Install curdx-flow plugin + optional recommended plugins
|
|
@@ -44,10 +47,6 @@ ${color.bold("COMMANDS")}
|
|
|
44
47
|
|
|
45
48
|
${color.cyan("doctor")} Check health (claude CLI, plugin, MCPs, recommended)
|
|
46
49
|
|
|
47
|
-
${color.cyan("init")} Initialize .flow/ in current project (no Claude Code needed)
|
|
48
|
-
[path] Target directory (default: cwd)
|
|
49
|
-
--force Overwrite existing .flow/
|
|
50
|
-
|
|
51
50
|
${color.cyan("upgrade")} Update curdx-flow and recommended plugins to latest
|
|
52
51
|
|
|
53
52
|
${color.cyan("uninstall")} Remove curdx-flow plugin (and optionally recommended / artifacts)
|
|
@@ -63,16 +62,20 @@ ${color.bold("OPTIONS")}
|
|
|
63
62
|
|
|
64
63
|
${color.bold("EXAMPLES")}
|
|
65
64
|
${color.dim("# First-time install with recommended plugins")}
|
|
66
|
-
npx
|
|
65
|
+
npx @curdx/flow install --all
|
|
67
66
|
|
|
68
67
|
${color.dim("# Check what's installed")}
|
|
69
|
-
npx
|
|
70
|
-
|
|
71
|
-
${color.dim("# Initialize your project")}
|
|
72
|
-
cd ~/my-project && npx github:curdx/curdx-flow init
|
|
68
|
+
npx @curdx/flow doctor
|
|
73
69
|
|
|
74
70
|
${color.dim("# Update everything")}
|
|
75
|
-
npx
|
|
71
|
+
npx @curdx/flow upgrade
|
|
72
|
+
|
|
73
|
+
${color.bold("INITIALIZING A PROJECT")}
|
|
74
|
+
Once curdx-flow is installed, initialize your project inside Claude Code:
|
|
75
|
+
|
|
76
|
+
${color.cyan("claude")}
|
|
77
|
+
${color.cyan("/curdx-flow:init")}
|
|
78
|
+
${color.cyan("/curdx-flow:start my-feature \"<description>\"")}
|
|
76
79
|
|
|
77
80
|
${color.bold("LEARN MORE")}
|
|
78
81
|
https://github.com/curdx/curdx-flow
|
|
@@ -101,9 +104,6 @@ async function main() {
|
|
|
101
104
|
case "doctor":
|
|
102
105
|
await doctor(rest);
|
|
103
106
|
break;
|
|
104
|
-
case "init":
|
|
105
|
-
await init(rest);
|
|
106
|
-
break;
|
|
107
107
|
case "upgrade":
|
|
108
108
|
await upgrade(rest);
|
|
109
109
|
break;
|
|
@@ -111,9 +111,18 @@ async function main() {
|
|
|
111
111
|
case "remove":
|
|
112
112
|
await uninstall(rest);
|
|
113
113
|
break;
|
|
114
|
+
case "init":
|
|
115
|
+
console.error(color.red(`The 'init' CLI command has been removed in 1.1.9.`));
|
|
116
|
+
console.error(``);
|
|
117
|
+
console.error(`Project initialization is now a Claude Code slash command:`);
|
|
118
|
+
console.error(` ${color.cyan("claude")}`);
|
|
119
|
+
console.error(` ${color.cyan("/curdx-flow:init")}`);
|
|
120
|
+
console.error(``);
|
|
121
|
+
console.error(`This keeps the CLI focused on install-time operations only.`);
|
|
122
|
+
process.exit(1);
|
|
114
123
|
default:
|
|
115
124
|
console.error(color.red(`Unknown command: ${cmd}`));
|
|
116
|
-
console.error(`Run ${color.cyan("curdx
|
|
125
|
+
console.error(`Run ${color.cyan("npx @curdx/flow help")} for usage.`);
|
|
117
126
|
process.exit(1);
|
|
118
127
|
}
|
|
119
128
|
} catch (err) {
|
package/cli/README.md
CHANGED
|
@@ -12,14 +12,10 @@ npx github:curdx/curdx-flow install
|
|
|
12
12
|
npx github:curdx/curdx-flow install --all
|
|
13
13
|
|
|
14
14
|
# Health check
|
|
15
|
-
npx
|
|
16
|
-
|
|
17
|
-
# Initialize a project (creates .flow/ in cwd)
|
|
18
|
-
cd ~/your-project
|
|
19
|
-
npx github:curdx/curdx-flow init
|
|
15
|
+
npx @curdx/flow doctor
|
|
20
16
|
|
|
21
17
|
# Update all plugins
|
|
22
|
-
npx
|
|
18
|
+
npx @curdx/flow upgrade
|
|
23
19
|
```
|
|
24
20
|
|
|
25
21
|
## Commands
|
|
@@ -41,11 +37,16 @@ Steps:
|
|
|
41
37
|
|
|
42
38
|
External diagnostics: claude CLI / curdx-flow / 3 MCPs / 3 recommended plugins / current directory `.flow/` state.
|
|
43
39
|
|
|
44
|
-
###
|
|
40
|
+
### Project initialization (not a CLI command)
|
|
41
|
+
|
|
42
|
+
Project initialization is a Claude Code slash command, not a CLI one. After `install`, open your project in Claude Code and run:
|
|
45
43
|
|
|
46
|
-
|
|
44
|
+
```
|
|
45
|
+
claude
|
|
46
|
+
/curdx-flow:init
|
|
47
|
+
```
|
|
47
48
|
|
|
48
|
-
|
|
49
|
+
This keeps the CLI scoped to install-time and lifecycle operations only — anything the user does while Claude Code is running stays inside Claude Code.
|
|
49
50
|
|
|
50
51
|
### `upgrade`
|
|
51
52
|
|
package/package.json
CHANGED
package/cli/init.js
DELETED
|
@@ -1,312 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* init command — external version of /curdx-flow:init.
|
|
3
|
-
* Creates .flow/ structure in target directory.
|
|
4
|
-
*
|
|
5
|
-
* Uses templates from plugin cache if available, falls back to embedded templates.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import fs from "node:fs/promises";
|
|
9
|
-
import path from "node:path";
|
|
10
|
-
import { existsSync } from "node:fs";
|
|
11
|
-
import { fileURLToPath } from "node:url";
|
|
12
|
-
import {
|
|
13
|
-
color,
|
|
14
|
-
log,
|
|
15
|
-
confirm,
|
|
16
|
-
pluginCacheDir,
|
|
17
|
-
has,
|
|
18
|
-
runSync,
|
|
19
|
-
} from "./utils.js";
|
|
20
|
-
|
|
21
|
-
// When installed via npm, this file lives at <pkg>/cli/init.js; the templates
|
|
22
|
-
// that ship with the npm package live at <pkg>/templates/. Always prefer those
|
|
23
|
-
// over plugin-cache templates so the version installed via npm controls which
|
|
24
|
-
// template language/content wins (plugin cache may lag behind npm releases).
|
|
25
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
26
|
-
const NPM_PKG_TEMPLATES = path.join(__dirname, "..", "templates");
|
|
27
|
-
|
|
28
|
-
export async function init(args = []) {
|
|
29
|
-
const force = args.includes("--force");
|
|
30
|
-
const target = args.find((a) => !a.startsWith("--")) || process.cwd();
|
|
31
|
-
const absTarget = path.resolve(target);
|
|
32
|
-
|
|
33
|
-
log.title(`📦 Initialize CurDX-Flow project`);
|
|
34
|
-
console.log(` Target: ${color.cyan(absTarget)}`);
|
|
35
|
-
|
|
36
|
-
// ---------- Check target exists ----------
|
|
37
|
-
try {
|
|
38
|
-
const stat = await fs.stat(absTarget);
|
|
39
|
-
if (!stat.isDirectory()) {
|
|
40
|
-
log.err(`Target is not a directory: ${absTarget}`);
|
|
41
|
-
process.exit(1);
|
|
42
|
-
}
|
|
43
|
-
} catch {
|
|
44
|
-
log.err(`Directory does not exist: ${absTarget}`);
|
|
45
|
-
process.exit(1);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// ---------- Check existing .flow/ ----------
|
|
49
|
-
const flowDir = path.join(absTarget, ".flow");
|
|
50
|
-
if (existsSync(flowDir)) {
|
|
51
|
-
if (!force) {
|
|
52
|
-
log.warn(`.flow/ already exists`);
|
|
53
|
-
const ok = await confirm("Overwrite existing .flow/?", false);
|
|
54
|
-
if (!ok) {
|
|
55
|
-
log.info("Cancelled");
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// ---------- Find templates ----------
|
|
62
|
-
const tmplDir = await findLatestTemplatesDir();
|
|
63
|
-
|
|
64
|
-
// ---------- Create directory structure ----------
|
|
65
|
-
log.step(1, 4, "Creating .flow/ directory structure...");
|
|
66
|
-
const dirs = [
|
|
67
|
-
".flow",
|
|
68
|
-
".flow/specs",
|
|
69
|
-
".flow/_epics",
|
|
70
|
-
".flow/checkpoints",
|
|
71
|
-
".flow/threads",
|
|
72
|
-
".flow/seeds",
|
|
73
|
-
];
|
|
74
|
-
for (const d of dirs) {
|
|
75
|
-
await fs.mkdir(path.join(absTarget, d), { recursive: true });
|
|
76
|
-
}
|
|
77
|
-
log.ok("Directories created");
|
|
78
|
-
|
|
79
|
-
// ---------- Generate files from templates ----------
|
|
80
|
-
log.step(2, 4, "Generating core files...");
|
|
81
|
-
const today = new Date().toISOString().slice(0, 10);
|
|
82
|
-
const userName = gitConfig("user.name") || "you";
|
|
83
|
-
const projectName = path.basename(absTarget);
|
|
84
|
-
|
|
85
|
-
const files = [
|
|
86
|
-
{ tmpl: "PROJECT.md.tmpl", out: "PROJECT.md" },
|
|
87
|
-
{ tmpl: "CONTEXT.md.tmpl", out: "CONTEXT.md" },
|
|
88
|
-
{ tmpl: "STATE.md.tmpl", out: "STATE.md" },
|
|
89
|
-
{ tmpl: "ROADMAP.md.tmpl", out: "ROADMAP.md" },
|
|
90
|
-
{ tmpl: "config.json.tmpl", out: "config.json" },
|
|
91
|
-
];
|
|
92
|
-
|
|
93
|
-
for (const f of files) {
|
|
94
|
-
const outPath = path.join(flowDir, f.out);
|
|
95
|
-
if (existsSync(outPath) && !force) {
|
|
96
|
-
log.info(` ${f.out} already exists, skipping`);
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
let content;
|
|
101
|
-
if (tmplDir) {
|
|
102
|
-
try {
|
|
103
|
-
content = await fs.readFile(path.join(tmplDir, f.tmpl), "utf-8");
|
|
104
|
-
} catch {
|
|
105
|
-
content = embeddedTemplate(f.tmpl);
|
|
106
|
-
}
|
|
107
|
-
} else {
|
|
108
|
-
content = embeddedTemplate(f.tmpl);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Placeholder replacement
|
|
112
|
-
content = content
|
|
113
|
-
.replace(/\{\{PROJECT_NAME\}\}/g, projectName)
|
|
114
|
-
.replace(/\{\{CREATED_DATE\}\}/g, today)
|
|
115
|
-
.replace(/\{\{USER_NAME\}\}/g, userName);
|
|
116
|
-
|
|
117
|
-
await fs.writeFile(outPath, content, "utf-8");
|
|
118
|
-
log.ok(` .flow/${f.out}`);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// ---------- Update .gitignore ----------
|
|
122
|
-
log.step(3, 4, "Updating .gitignore...");
|
|
123
|
-
const giPath = path.join(absTarget, ".gitignore");
|
|
124
|
-
const giAdd = [
|
|
125
|
-
"",
|
|
126
|
-
"# CurDX-Flow runtime (auto-generated, do not commit)",
|
|
127
|
-
".flow/checkpoints/",
|
|
128
|
-
".flow/threads/",
|
|
129
|
-
".flow/seeds/",
|
|
130
|
-
".flow/.active-spec",
|
|
131
|
-
".flow/specs/*/.state.json",
|
|
132
|
-
".flow/specs/*/.progress.md",
|
|
133
|
-
".flow/_epics/*/.epic-state.json",
|
|
134
|
-
].join("\n");
|
|
135
|
-
|
|
136
|
-
let existingGi = "";
|
|
137
|
-
try {
|
|
138
|
-
existingGi = await fs.readFile(giPath, "utf-8");
|
|
139
|
-
} catch {
|
|
140
|
-
// no .gitignore yet
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if (!existingGi.includes("CurDX-Flow")) {
|
|
144
|
-
await fs.writeFile(giPath, existingGi + giAdd + "\n", "utf-8");
|
|
145
|
-
log.ok(".gitignore appended with CurDX-Flow ignores");
|
|
146
|
-
} else {
|
|
147
|
-
log.info(".gitignore already has CurDX-Flow rules, skipping");
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// ---------- Done ----------
|
|
151
|
-
log.blank();
|
|
152
|
-
log.step(4, 4, "Done");
|
|
153
|
-
log.ok(`CurDX-Flow project initialized: ${color.cyan(absTarget)}`);
|
|
154
|
-
|
|
155
|
-
console.log(`\n${color.bold("Next steps:")}\n`);
|
|
156
|
-
console.log(` 1. Edit ${color.cyan(".flow/PROJECT.md")} — fill in the project vision (~5 min)`);
|
|
157
|
-
console.log(` 2. Edit ${color.cyan(".flow/CONTEXT.md")} — your preferences`);
|
|
158
|
-
console.log(` 3. Enter Claude Code:`);
|
|
159
|
-
console.log(` ${color.cyan("cd " + absTarget)}`);
|
|
160
|
-
console.log(` ${color.cyan("claude")}`);
|
|
161
|
-
console.log(` ${color.cyan("/curdx-flow:start my-feature \"<description>\"")}`);
|
|
162
|
-
console.log();
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// ---------- Helpers ----------
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Resolve the templates directory. Priority:
|
|
169
|
-
* 1. npm package's own templates/ (shipped with this CLI version — authoritative)
|
|
170
|
-
* 2. Latest Claude Code plugin cache (fallback for local-dev / unbundled runs)
|
|
171
|
-
* 3. null → embedded fallback in embeddedTemplate() below
|
|
172
|
-
*/
|
|
173
|
-
async function findLatestTemplatesDir() {
|
|
174
|
-
// 1. npm package ships its own templates (highest priority — never stale)
|
|
175
|
-
if (existsSync(NPM_PKG_TEMPLATES)) {
|
|
176
|
-
return NPM_PKG_TEMPLATES;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// 2. Claude Code plugin cache (for local-dev where pkg root is the plugin root)
|
|
180
|
-
const pluginBase = pluginCacheDir();
|
|
181
|
-
try {
|
|
182
|
-
const versions = await fs.readdir(pluginBase);
|
|
183
|
-
// Pick last (lexicographically — semver works for simple cases)
|
|
184
|
-
const sorted = versions.sort();
|
|
185
|
-
for (let i = sorted.length - 1; i >= 0; i--) {
|
|
186
|
-
const tmplDir = path.join(pluginBase, sorted[i], "templates");
|
|
187
|
-
if (existsSync(tmplDir)) return tmplDir;
|
|
188
|
-
}
|
|
189
|
-
} catch {
|
|
190
|
-
return null;
|
|
191
|
-
}
|
|
192
|
-
return null;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
function gitConfig(key) {
|
|
196
|
-
if (!has("git")) return null;
|
|
197
|
-
const r = runSync("git", ["config", "--get", key]);
|
|
198
|
-
return r.code === 0 ? r.stdout.trim() : null;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Embedded fallback templates — used when plugin cache not available.
|
|
203
|
-
* Keep these minimal; rich templates live in templates/*.tmpl.
|
|
204
|
-
*
|
|
205
|
-
* Note: these embedded templates are English. Users who want Chinese
|
|
206
|
-
* project state can edit the resulting files (or set lang preference
|
|
207
|
-
* in CONTEXT.md and use the rich templates from the plugin cache).
|
|
208
|
-
*/
|
|
209
|
-
function embeddedTemplate(name) {
|
|
210
|
-
const today = "{{CREATED_DATE}}";
|
|
211
|
-
const project = "{{PROJECT_NAME}}";
|
|
212
|
-
const user = "{{USER_NAME}}";
|
|
213
|
-
|
|
214
|
-
switch (name) {
|
|
215
|
-
case "PROJECT.md.tmpl":
|
|
216
|
-
return `# ${project}
|
|
217
|
-
|
|
218
|
-
> CurDX-Flow project vision
|
|
219
|
-
|
|
220
|
-
## One-line description
|
|
221
|
-
TODO: in one sentence — what is the project, who is it for, what problem does it solve
|
|
222
|
-
|
|
223
|
-
## Why this exists
|
|
224
|
-
TODO:
|
|
225
|
-
|
|
226
|
-
## Core users
|
|
227
|
-
TODO:
|
|
228
|
-
|
|
229
|
-
## Success criteria (verifiable metrics)
|
|
230
|
-
1. TODO:
|
|
231
|
-
2. TODO:
|
|
232
|
-
|
|
233
|
-
## Tech stack
|
|
234
|
-
TODO:
|
|
235
|
-
|
|
236
|
-
## Out of scope (Scope Guard)
|
|
237
|
-
- ✗ TODO:
|
|
238
|
-
|
|
239
|
-
---
|
|
240
|
-
|
|
241
|
-
_Generated by curdx-flow init on ${today}. Maintainer: ${user}_
|
|
242
|
-
`;
|
|
243
|
-
|
|
244
|
-
case "CONTEXT.md.tmpl":
|
|
245
|
-
return `# ${project} — User preferences
|
|
246
|
-
|
|
247
|
-
## Code style
|
|
248
|
-
- Indentation: TODO
|
|
249
|
-
- Quotes: TODO
|
|
250
|
-
- Naming: TODO
|
|
251
|
-
|
|
252
|
-
## Communication preferences
|
|
253
|
-
- Language: en
|
|
254
|
-
- Verbosity: balanced
|
|
255
|
-
|
|
256
|
-
## Tooling preferences
|
|
257
|
-
- Package manager: TODO
|
|
258
|
-
|
|
259
|
-
---
|
|
260
|
-
|
|
261
|
-
_Generated by curdx-flow init on ${today}_
|
|
262
|
-
`;
|
|
263
|
-
|
|
264
|
-
case "STATE.md.tmpl":
|
|
265
|
-
return `# ${project} — Cross-session state
|
|
266
|
-
|
|
267
|
-
## Key decisions (Decisions)
|
|
268
|
-
None yet.
|
|
269
|
-
|
|
270
|
-
## Blockers
|
|
271
|
-
None yet.
|
|
272
|
-
|
|
273
|
-
---
|
|
274
|
-
|
|
275
|
-
_Initialized on ${today}_
|
|
276
|
-
`;
|
|
277
|
-
|
|
278
|
-
case "ROADMAP.md.tmpl":
|
|
279
|
-
return `# ${project} — Roadmap
|
|
280
|
-
|
|
281
|
-
## Current version: v0.1 (MVP)
|
|
282
|
-
|
|
283
|
-
**Goal**: TODO
|
|
284
|
-
|
|
285
|
-
### Success criteria
|
|
286
|
-
- [ ] TODO
|
|
287
|
-
|
|
288
|
-
---
|
|
289
|
-
|
|
290
|
-
_Initialized on ${today}_
|
|
291
|
-
`;
|
|
292
|
-
|
|
293
|
-
case "config.json.tmpl":
|
|
294
|
-
return `{
|
|
295
|
-
"version": "1.0",
|
|
296
|
-
"mode": "standard",
|
|
297
|
-
"execution": {
|
|
298
|
-
"strategy": "auto",
|
|
299
|
-
"max_parallel": 5
|
|
300
|
-
},
|
|
301
|
-
"gates": {
|
|
302
|
-
"always_on": ["karpathy-gate", "verification-gate"],
|
|
303
|
-
"standard_mode": ["tdd-gate", "coverage-audit-gate"]
|
|
304
|
-
},
|
|
305
|
-
"created": "${today}"
|
|
306
|
-
}
|
|
307
|
-
`;
|
|
308
|
-
|
|
309
|
-
default:
|
|
310
|
-
return `# ${name}\n\n(template not found)\n`;
|
|
311
|
-
}
|
|
312
|
-
}
|