@curdx/flow 2.0.0-beta.7 → 2.0.0-beta.8

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": "Claude Code Discipline Layer — spec-driven workflow + goal-backward verification + Karpathy 4 principles enforced via gates. Stops Claude from faking \"done\" on non-trivial features.",
9
- "version": "2.0.0-beta.7"
9
+ "version": "2.0.0-beta.8"
10
10
  },
11
11
  "plugins": [
12
12
  {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "curdx-flow",
3
- "version": "2.0.0-beta.7",
3
+ "version": "2.0.0-beta.8",
4
4
  "description": "Claude Code Discipline Layer — spec-driven workflow + goal-backward verification + Karpathy 4 principles enforced via gates. Stops Claude from faking \"done\" on non-trivial features.",
5
5
  "author": {
6
6
  "name": "wdx",
@@ -31,13 +31,6 @@
31
31
  "-y",
32
32
  "@modelcontextprotocol/server-sequential-thinking"
33
33
  ]
34
- },
35
- "chrome-devtools": {
36
- "command": "npx",
37
- "args": [
38
- "-y",
39
- "chrome-devtools-mcp@latest"
40
- ]
41
34
  }
42
35
  }
43
36
  }
package/cli/doctor.js CHANGED
@@ -50,9 +50,13 @@ export async function doctor(args = []) {
50
50
  }
51
51
 
52
52
  // ---------- MCPs ----------
53
+ // Bundled by curdx-flow plugin via .claude-plugin/plugin.json mcpServers.
54
+ // chrome-devtools is NOT here anymore — it was extracted into its own
55
+ // recommended plugin (see below) to align with the "each MCP owned by one
56
+ // plugin" model and avoid double-spawning the chrome-devtools-mcp process.
53
57
  console.log(`\n${color.bold("MCP Servers:")}`);
54
58
  const mcps = cv ? listMcps() : [];
55
- const expectedMcps = ["context7", "sequential-thinking", "chrome-devtools"];
59
+ const expectedMcps = ["context7", "sequential-thinking"];
56
60
  for (const m of expectedMcps) {
57
61
  const found = mcps.find((x) => x.name === m);
58
62
  if (found) {
@@ -73,6 +77,7 @@ export async function doctor(args = []) {
73
77
  { name: "pua", installCmd: "claude plugin install pua@pua-skills" },
74
78
  { name: "claude-mem", installCmd: "claude plugin install claude-mem@thedotmack" },
75
79
  { name: "frontend-design", installCmd: "claude plugin install frontend-design@claude-plugins-official" },
80
+ { name: "chrome-devtools-mcp", installCmd: "claude plugin install chrome-devtools-mcp@chrome-devtools-plugins" },
76
81
  ];
77
82
  let claudeMemEnabled = false;
78
83
  for (const r of recommended) {
package/cli/install.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * install command — install curdx-flow plugin + optional recommended plugins.
3
3
  */
4
4
 
5
- import { existsSync } from "node:fs";
5
+ import { existsSync, readFileSync } from "node:fs";
6
6
  import { dirname, join } from "node:path";
7
7
  import { fileURLToPath } from "node:url";
8
8
 
@@ -48,6 +48,12 @@ const RECOMMENDED = [
48
48
  installSpec: "frontend-design@claude-plugins-official",
49
49
  hint: "Anthropic official UI skill",
50
50
  },
51
+ {
52
+ name: "chrome-devtools-mcp",
53
+ marketplace: "ChromeDevTools/chrome-devtools-mcp",
54
+ installSpec: "chrome-devtools-mcp@chrome-devtools-plugins",
55
+ hint: "Chrome DevTools + Puppeteer (Google official)",
56
+ },
51
57
  ];
52
58
 
53
59
  export async function install(args = []) {
@@ -105,10 +111,38 @@ export async function install(args = []) {
105
111
 
106
112
  // ---------- Step 3: Install curdx-flow plugin ----------
107
113
  log.blank();
108
- log.step(3, 4, "Installing curdx-flow plugin (3 MCPs will auto-start)...");
114
+ log.step(3, 4, "Installing curdx-flow plugin (2 MCPs will auto-start)...");
115
+ // Read the version the marketplace is shipping so we can decide whether an
116
+ // already-installed plugin needs an update (same name but stale version
117
+ // previously silently skipped the upgrade — caused the beta.1 → beta.7 drift).
118
+ let shippedVersion = null;
119
+ try {
120
+ const mf = JSON.parse(
121
+ readFileSync(LOCAL_MARKETPLACE_MANIFEST, "utf-8")
122
+ );
123
+ shippedVersion = mf?.metadata?.version || null;
124
+ } catch {
125
+ // marketplace not local (online install) or unreadable — fall through
126
+ }
127
+
109
128
  const installed = listPlugins();
110
129
  const already = installed.find((p) => p.name === "curdx-flow");
111
- if (already) {
130
+ if (already && shippedVersion && already.version !== shippedVersion) {
131
+ log.info(
132
+ `curdx-flow installed at v${already.version}, marketplace ships v${shippedVersion} — updating...`
133
+ );
134
+ const r = await run(
135
+ "claude",
136
+ ["plugin", "update", "curdx-flow@curdx-flow-marketplace"],
137
+ { silent: true }
138
+ );
139
+ if (r.code !== 0) {
140
+ log.warn(`Update returned non-zero: ${r.stderr.trim() || r.stdout.trim()}`);
141
+ log.info(`If the version stays on v${already.version}, run: claude plugin uninstall curdx-flow@curdx-flow-marketplace && retry`);
142
+ } else {
143
+ log.ok(`curdx-flow updated to v${shippedVersion}`);
144
+ }
145
+ } else if (already) {
112
146
  log.ok(`curdx-flow already installed (v${already.version}, ${already.status})`);
113
147
  } else {
114
148
  const r = await run(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@curdx/flow",
3
- "version": "2.0.0-beta.7",
3
+ "version": "2.0.0-beta.8",
4
4
  "description": "CLI installer for CurDX-Flow — AI engineering workflow meta-framework for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {