@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.
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "CurDX-Flow marketplace — distributes the curdx-flow meta-framework plugin",
9
- "version": "1.1.8"
9
+ "version": "1.1.9"
10
10
  },
11
11
  "plugins": [
12
12
  {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "curdx-flow",
3
- "version": "1.1.8",
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
- # Health check
53
- npx @curdx/flow doctor
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 github:curdx/curdx-flow <command> [args]
7
- * (or after npm publish: npx @curdx/flow <command> [args])
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 Install curdx-flow plugin + optional recommended plugins
11
- * doctor Check health (claude CLI, plugin, MCPs, recommended plugins)
12
- * init Initialize .flow/ in current project (external version)
13
- * upgrade Update curdx-flow + recommended plugins to latest
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)
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-flow <command> [options]
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 github:curdx/curdx-flow install --all
65
+ npx @curdx/flow install --all
67
66
 
68
67
  ${color.dim("# Check what's installed")}
69
- npx github:curdx/curdx-flow doctor
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 github:curdx/curdx-flow upgrade
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-flow help")} for usage.`);
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 github:curdx/curdx-flow doctor
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 github:curdx/curdx-flow upgrade
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
- ### `init [path] [--force]`
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
- In `path` (default cwd) creates `.flow/` directory: PROJECT.md / CONTEXT.md / STATE.md / ROADMAP.md / config.json + updates `.gitignore`.
44
+ ```
45
+ claude
46
+ /curdx-flow:init
47
+ ```
47
48
 
48
- If the curdx-flow plugin is installed, reads templates from the plugin cache; otherwise uses embedded fallback templates.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@curdx/flow",
3
- "version": "1.1.8",
3
+ "version": "1.1.9",
4
4
  "description": "CLI installer for CurDX-Flow — AI engineering workflow meta-framework for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {
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
- }