@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -8
- package/cli/doctor.js +6 -1
- package/cli/install.js +37 -3
- package/package.json +1 -1
|
@@ -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.
|
|
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.
|
|
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"
|
|
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 (
|
|
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(
|