@curdx/flow 1.1.8 → 1.1.10
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 +51 -28
- 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.10",
|
|
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,25 @@
|
|
|
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 Show this 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)
|
|
15
18
|
* --version / -v
|
|
19
|
+
* --help / -h (CLI usage summary — use /curdx-flow:help in Claude Code
|
|
20
|
+
* for the full command/workflow reference)
|
|
16
21
|
*/
|
|
17
22
|
|
|
18
23
|
import { install } from "../cli/install.js";
|
|
19
24
|
import { doctor } from "../cli/doctor.js";
|
|
20
|
-
import { init } from "../cli/init.js";
|
|
21
25
|
import { upgrade } from "../cli/upgrade.js";
|
|
22
26
|
import { uninstall } from "../cli/uninstall.js";
|
|
23
27
|
import { VERSION, color } from "../cli/utils.js";
|
|
@@ -32,7 +36,7 @@ ${color.bold("curdx-flow")} ${color.dim(`v${VERSION}`)}
|
|
|
32
36
|
CurDX-Flow installer & helper for Claude Code
|
|
33
37
|
|
|
34
38
|
${color.bold("USAGE")}
|
|
35
|
-
curdx
|
|
39
|
+
npx @curdx/flow <command> [options]
|
|
36
40
|
|
|
37
41
|
${color.bold("COMMANDS")}
|
|
38
42
|
${color.cyan("install")} Install curdx-flow plugin + optional recommended plugins
|
|
@@ -44,10 +48,6 @@ ${color.bold("COMMANDS")}
|
|
|
44
48
|
|
|
45
49
|
${color.cyan("doctor")} Check health (claude CLI, plugin, MCPs, recommended)
|
|
46
50
|
|
|
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
51
|
${color.cyan("upgrade")} Update curdx-flow and recommended plugins to latest
|
|
52
52
|
|
|
53
53
|
${color.cyan("uninstall")} Remove curdx-flow plugin (and optionally recommended / artifacts)
|
|
@@ -55,24 +55,30 @@ ${color.bold("COMMANDS")}
|
|
|
55
55
|
--keep-recommended Don't ask about pua/claude-mem/frontend-design
|
|
56
56
|
--purge Also remove ~/.local/bin/bun, ~/.local/bin/uv symlinks
|
|
57
57
|
|
|
58
|
-
${color.cyan("help")} Show this help (same as --help / -h)
|
|
59
|
-
|
|
60
58
|
${color.bold("OPTIONS")}
|
|
61
59
|
-v, --version Print version
|
|
62
|
-
-h, --help Show
|
|
60
|
+
-h, --help Show this CLI usage summary
|
|
61
|
+
|
|
62
|
+
${color.dim("For the full command / workflow reference (including all slash")}
|
|
63
|
+
${color.dim("commands like /curdx-flow:start, /curdx-flow:spec, …) run:")}
|
|
64
|
+
${color.cyan("/curdx-flow:help")} ${color.dim("(inside Claude Code)")}
|
|
63
65
|
|
|
64
66
|
${color.bold("EXAMPLES")}
|
|
65
67
|
${color.dim("# First-time install with recommended plugins")}
|
|
66
|
-
npx
|
|
68
|
+
npx @curdx/flow install --all
|
|
67
69
|
|
|
68
70
|
${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
|
|
71
|
+
npx @curdx/flow doctor
|
|
73
72
|
|
|
74
73
|
${color.dim("# Update everything")}
|
|
75
|
-
npx
|
|
74
|
+
npx @curdx/flow upgrade
|
|
75
|
+
|
|
76
|
+
${color.bold("INITIALIZING A PROJECT")}
|
|
77
|
+
Once curdx-flow is installed, initialize your project inside Claude Code:
|
|
78
|
+
|
|
79
|
+
${color.cyan("claude")}
|
|
80
|
+
${color.cyan("/curdx-flow:init")}
|
|
81
|
+
${color.cyan("/curdx-flow:start my-feature \"<description>\"")}
|
|
76
82
|
|
|
77
83
|
${color.bold("LEARN MORE")}
|
|
78
84
|
https://github.com/curdx/curdx-flow
|
|
@@ -86,8 +92,8 @@ async function main() {
|
|
|
86
92
|
return;
|
|
87
93
|
}
|
|
88
94
|
|
|
89
|
-
// Help flags
|
|
90
|
-
if (!cmd || cmd === "
|
|
95
|
+
// Help flags (standard CLI convention: -h / --help / no args)
|
|
96
|
+
if (!cmd || cmd === "--help" || cmd === "-h") {
|
|
91
97
|
printHelp();
|
|
92
98
|
return;
|
|
93
99
|
}
|
|
@@ -101,9 +107,6 @@ async function main() {
|
|
|
101
107
|
case "doctor":
|
|
102
108
|
await doctor(rest);
|
|
103
109
|
break;
|
|
104
|
-
case "init":
|
|
105
|
-
await init(rest);
|
|
106
|
-
break;
|
|
107
110
|
case "upgrade":
|
|
108
111
|
await upgrade(rest);
|
|
109
112
|
break;
|
|
@@ -111,9 +114,29 @@ async function main() {
|
|
|
111
114
|
case "remove":
|
|
112
115
|
await uninstall(rest);
|
|
113
116
|
break;
|
|
117
|
+
case "init":
|
|
118
|
+
console.error(color.red(`The 'init' CLI command has been removed in 1.1.9.`));
|
|
119
|
+
console.error(``);
|
|
120
|
+
console.error(`Project initialization is a Claude Code slash command:`);
|
|
121
|
+
console.error(` ${color.cyan("claude")}`);
|
|
122
|
+
console.error(` ${color.cyan("/curdx-flow:init")}`);
|
|
123
|
+
console.error(``);
|
|
124
|
+
console.error(`The CLI only handles install-time operations.`);
|
|
125
|
+
process.exit(1);
|
|
126
|
+
case "help":
|
|
127
|
+
console.error(color.red(`The 'help' CLI subcommand has been removed in 1.1.10.`));
|
|
128
|
+
console.error(``);
|
|
129
|
+
console.error(`For a brief CLI usage summary, use the standard flag:`);
|
|
130
|
+
console.error(` ${color.cyan("npx @curdx/flow --help")} ${color.dim("(or -h)")}`);
|
|
131
|
+
console.error(``);
|
|
132
|
+
console.error(`For the full command / workflow reference, use the slash command`);
|
|
133
|
+
console.error(`inside Claude Code:`);
|
|
134
|
+
console.error(` ${color.cyan("claude")}`);
|
|
135
|
+
console.error(` ${color.cyan("/curdx-flow:help")}`);
|
|
136
|
+
process.exit(1);
|
|
114
137
|
default:
|
|
115
138
|
console.error(color.red(`Unknown command: ${cmd}`));
|
|
116
|
-
console.error(`Run ${color.cyan("curdx
|
|
139
|
+
console.error(`Run ${color.cyan("npx @curdx/flow --help")} for CLI usage.`);
|
|
117
140
|
process.exit(1);
|
|
118
141
|
}
|
|
119
142
|
} 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
|
-
}
|