@curdx/flow 2.2.3 → 2.2.5
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 +3 -2
- package/.claude-plugin/plugin.json +2 -1
- package/CHANGELOG.md +4 -566
- package/README.md +47 -113
- package/agents/flow-adversary.md +1 -0
- package/agents/flow-architect.md +9 -36
- package/agents/flow-brownfield-analyst.md +7 -18
- package/agents/flow-debugger.md +1 -0
- package/agents/flow-edge-hunter.md +1 -0
- package/agents/flow-executor.md +1 -0
- package/agents/flow-planner.md +11 -37
- package/agents/flow-product-designer.md +9 -41
- package/agents/flow-qa-engineer.md +1 -0
- package/agents/flow-researcher.md +9 -45
- package/agents/flow-reviewer.md +1 -0
- package/agents/flow-security-auditor.md +1 -0
- package/agents/flow-triage-analyst.md +1 -0
- package/agents/flow-ui-researcher.md +1 -0
- package/agents/flow-ux-designer.md +1 -0
- package/agents/flow-verifier.md +1 -0
- package/cli/doctor-workflow.js +5 -914
- package/cli/install-companions.js +8 -8
- package/cli/lib/doctor-claude-settings.js +736 -0
- package/cli/lib/doctor-runtime-environment.js +196 -0
- package/cli/lib/semver.js +14 -0
- package/cli/uninstall-actions.js +323 -0
- package/cli/uninstall.js +9 -253
- package/gates/coverage-audit-gate.md +1 -3
- package/gates/tdd-gate.md +0 -6
- package/gates/verification-gate.md +1 -5
- package/knowledge/artifact-output-discipline.md +24 -0
- package/knowledge/artifact-summary-contracts.md +50 -0
- package/knowledge/execution-strategies.md +6 -4
- package/knowledge/poc-first-workflow.md +2 -6
- package/knowledge/spec-driven-development.md +0 -4
- package/knowledge/systematic-debugging.md +0 -6
- package/knowledge/two-stage-review.md +8 -6
- package/knowledge/wave-execution.md +2 -1
- package/package.json +2 -2
- package/schemas/agent-frontmatter.schema.json +4 -0
- package/skills/brownfield-index/SKILL.md +14 -20
- package/skills/brownfield-index/references/applicability.md +12 -0
- package/skills/brownfield-index/references/handoff.md +8 -0
- package/skills/brownfield-index/references/index-contract.md +10 -0
- package/skills/browser-qa/SKILL.md +15 -35
- package/skills/browser-qa/references/handoff.md +6 -0
- package/skills/browser-qa/references/prerequisites.md +10 -0
- package/skills/browser-qa/references/qa-contract.md +20 -0
- package/skills/cancel/SKILL.md +20 -61
- package/skills/cancel/references/destructive-mode.md +17 -0
- package/skills/cancel/references/reporting.md +18 -0
- package/skills/cancel/references/state-recovery.md +30 -0
- package/skills/cancel/references/target-resolution.md +7 -0
- package/skills/debug/SKILL.md +23 -87
- package/skills/debug/references/context-gathering.md +11 -0
- package/skills/debug/references/failure-guard.md +25 -0
- package/skills/debug/references/intake.md +12 -0
- package/skills/debug/references/phase-workflow.md +34 -0
- package/skills/debug/references/reporting.md +20 -0
- package/skills/epic/SKILL.md +18 -50
- package/skills/epic/references/epic-artifacts.md +20 -0
- package/skills/epic/references/epic-intake.md +9 -0
- package/skills/epic/references/slice-handoff.md +16 -0
- package/skills/fast/SKILL.md +34 -102
- package/skills/fast/references/applicability.md +25 -0
- package/skills/fast/references/clarification.md +20 -0
- package/skills/fast/references/execution-contract.md +56 -0
- package/skills/help/SKILL.md +26 -132
- package/skills/help/references/dispatch.md +20 -0
- package/skills/help/references/overview.md +39 -0
- package/skills/help/references/troubleshoot.md +47 -0
- package/skills/help/references/workflow.md +37 -0
- package/skills/implement/SKILL.md +61 -237
- package/skills/implement/references/error-recovery.md +36 -0
- package/skills/implement/references/linear-execution.md +32 -0
- package/skills/implement/references/preflight.md +43 -0
- package/skills/implement/references/progress-contract.md +32 -0
- package/skills/implement/references/state-init.md +33 -0
- package/skills/implement/references/stop-hook-execution.md +36 -0
- package/skills/implement/references/strategy-router.md +38 -0
- package/skills/implement/references/subagent-execution.md +43 -0
- package/skills/init/SKILL.md +26 -95
- package/skills/init/references/gitignore-and-health.md +26 -0
- package/skills/init/references/next-steps.md +22 -0
- package/skills/init/references/preflight.md +15 -0
- package/skills/init/references/scaffold-contract.md +27 -0
- package/skills/review/SKILL.md +45 -153
- package/skills/review/references/optional-passes.md +48 -0
- package/skills/review/references/preflight.md +38 -0
- package/skills/review/references/report-contract.md +49 -0
- package/skills/review/references/reporting.md +20 -0
- package/skills/review/references/stage-execution.md +32 -0
- package/skills/security-audit/SKILL.md +16 -34
- package/skills/security-audit/references/audit-contract.md +21 -0
- package/skills/security-audit/references/gate-handoff.md +8 -0
- package/skills/security-audit/references/scope-and-depth.md +9 -0
- package/skills/spec/SKILL.md +55 -182
- package/skills/spec/references/artifact-landing.md +31 -0
- package/skills/spec/references/phase-execution.md +50 -0
- package/skills/spec/references/planning-review.md +31 -0
- package/skills/spec/references/preflight-and-routing.md +46 -0
- package/skills/spec/references/reporting.md +21 -0
- package/skills/start/SKILL.md +40 -123
- package/skills/start/references/branch-routing.md +51 -0
- package/skills/start/references/mode-semantics.md +12 -0
- package/skills/start/references/preflight.md +13 -0
- package/skills/start/references/reporting.md +20 -0
- package/skills/start/references/state-seeding.md +44 -0
- package/skills/start/references/workflow-handoff.md +26 -0
- package/skills/status/SKILL.md +17 -61
- package/skills/status/references/gather-contract.md +27 -0
- package/skills/status/references/health-rules.md +27 -0
- package/skills/status/references/output-contract.md +24 -0
- package/skills/status/references/preflight.md +10 -0
- package/skills/status/references/recovery-hints.md +18 -0
- package/skills/ui-sketch/SKILL.md +15 -34
- package/skills/ui-sketch/references/brief-intake.md +10 -0
- package/skills/ui-sketch/references/iteration-handoff.md +5 -0
- package/skills/ui-sketch/references/variant-contract.md +15 -0
- package/skills/verify/SKILL.md +31 -86
- package/skills/verify/references/evidence-workflow.md +39 -0
- package/skills/verify/references/output-contract.md +23 -0
- package/skills/verify/references/preflight.md +11 -0
- package/skills/verify/references/report-handoff.md +35 -0
- package/skills/verify/references/strict-mode.md +12 -0
- package/README.zh.md +0 -160
package/cli/uninstall.js
CHANGED
|
@@ -2,48 +2,22 @@
|
|
|
2
2
|
* uninstall command — remove curdx-flow plugin (and optionally recommended plugins / artifacts).
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
import { join } from "node:path";
|
|
7
|
-
import { homedir } from "node:os";
|
|
8
|
-
|
|
9
|
-
import {
|
|
10
|
-
color,
|
|
11
|
-
log,
|
|
12
|
-
resultLastLine,
|
|
13
|
-
resultOutput,
|
|
14
|
-
confirm,
|
|
15
|
-
listPlugins,
|
|
16
|
-
} from "./utils.js";
|
|
17
|
-
import { REQUIRED_PLUGINS, RECOMMENDED_PLUGINS, BUNDLED_MCPS } from "./registry.js";
|
|
18
|
-
import {
|
|
19
|
-
removeMcp,
|
|
20
|
-
removePluginMarketplace,
|
|
21
|
-
uninstallPlugin,
|
|
22
|
-
} from "./lib/claude-ops.js";
|
|
5
|
+
import { log } from "./utils.js";
|
|
23
6
|
import {
|
|
24
7
|
createUninstallContext,
|
|
25
8
|
ensureClaudeCliAvailableForUninstall,
|
|
26
|
-
getInstalledTargets,
|
|
27
|
-
getManagedMarketplaceIds,
|
|
28
9
|
printUninstallSummary,
|
|
29
10
|
removeProtocolsStep,
|
|
30
|
-
selectRecommendedPluginsToRemove,
|
|
31
|
-
shouldKeepBundledMcps,
|
|
32
|
-
shouldKeepRequiredPlugins,
|
|
33
|
-
UNINSTALL_STEP_COUNT,
|
|
34
11
|
confirmUninstallStep,
|
|
35
12
|
} from "./uninstall-workflow.js";
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
join(HOME, ".local", "bin", "bun"),
|
|
45
|
-
join(HOME, ".local", "bin", "uv"),
|
|
46
|
-
];
|
|
13
|
+
import {
|
|
14
|
+
maybePurgeRuntimeArtifacts,
|
|
15
|
+
maybeRemoveBundledMcps,
|
|
16
|
+
maybeRemoveProjectState,
|
|
17
|
+
maybeUninstallRecommendedPlugins,
|
|
18
|
+
maybeUninstallRequiredPlugins,
|
|
19
|
+
uninstallCurdxFlowPlugin,
|
|
20
|
+
} from "./uninstall-actions.js";
|
|
47
21
|
|
|
48
22
|
export async function uninstall(args = []) {
|
|
49
23
|
const context = createUninstallContext(args);
|
|
@@ -66,221 +40,3 @@ export async function uninstall(args = []) {
|
|
|
66
40
|
|
|
67
41
|
printUninstallSummary(context);
|
|
68
42
|
}
|
|
69
|
-
|
|
70
|
-
async function uninstallCurdxFlowPlugin() {
|
|
71
|
-
log.blank();
|
|
72
|
-
log.step(1, UNINSTALL_STEP_COUNT, "Uninstalling curdx-flow plugin...");
|
|
73
|
-
const curdx = listPlugins().find((plugin) => plugin.name === "curdx-flow");
|
|
74
|
-
if (!curdx) {
|
|
75
|
-
log.info("curdx-flow not installed, skipping");
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const result = await uninstallPlugin({
|
|
80
|
-
scope: "user",
|
|
81
|
-
uninstallSpec: "curdx-flow@curdx-flow-marketplace",
|
|
82
|
-
});
|
|
83
|
-
if (result.code === 0) {
|
|
84
|
-
log.ok("curdx-flow uninstalled");
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
log.err(`Uninstall failed: ${resultOutput(result)}`);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
async function maybeUninstallRecommendedPlugins({ yes, keepRecommended }) {
|
|
92
|
-
log.blank();
|
|
93
|
-
log.step(2, UNINSTALL_STEP_COUNT, "Recommended plugins");
|
|
94
|
-
if (keepRecommended) {
|
|
95
|
-
log.info("Keeping recommended plugins (--keep-recommended)");
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const present = getInstalledTargets(RECOMMENDED);
|
|
100
|
-
if (present.length === 0) {
|
|
101
|
-
log.info("No installed recommended plugins");
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const selected = await selectRecommendedPluginsToRemove({ yes, present });
|
|
106
|
-
for (const name of selected) {
|
|
107
|
-
const entry = present.find((plugin) => plugin.name === name);
|
|
108
|
-
if (!entry) continue;
|
|
109
|
-
await uninstallNamedPlugin(entry);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
async function uninstallNamedPlugin(entry) {
|
|
114
|
-
log.blank();
|
|
115
|
-
console.log(` ${color.cyan("▸")} Uninstalling ${color.bold(entry.name)}...`);
|
|
116
|
-
const result = await uninstallPlugin(entry);
|
|
117
|
-
if (result.code === 0) {
|
|
118
|
-
console.log(` ${color.green("✓")} ${entry.name} uninstalled`);
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
console.log(
|
|
123
|
-
` ${color.red("✗")} ${entry.name} uninstall failed: ${resultLastLine(result)}`
|
|
124
|
-
);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
async function maybeRemoveBundledMcps({ yes, keepRecommended }) {
|
|
128
|
-
log.blank();
|
|
129
|
-
log.info("Required MCP servers (context7, sequential-thinking)");
|
|
130
|
-
if (shouldKeepBundledMcps({ yes, keepRecommended })) {
|
|
131
|
-
log.info(
|
|
132
|
-
color.dim("--yes or --keep-recommended: keeping user-level MCPs (remove manually with `claude mcp remove <name>`)")
|
|
133
|
-
);
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
const removeMcps = await confirm(
|
|
138
|
-
`Remove user-level MCPs registered by install (${BUNDLED_MCPS.map((mcp) => mcp.name).join(", ")})? ${color.dim("(keeps them if other tools depend on them)")}`,
|
|
139
|
-
false
|
|
140
|
-
);
|
|
141
|
-
if (!removeMcps) {
|
|
142
|
-
log.info("Keeping user-level MCPs");
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
for (const mcp of BUNDLED_MCPS) {
|
|
147
|
-
const result = await removeMcp({ name: mcp.name });
|
|
148
|
-
if (result.code === 0) {
|
|
149
|
-
log.ok(` ${mcp.name.padEnd(22)} removed`);
|
|
150
|
-
} else {
|
|
151
|
-
log.info(` ${mcp.name.padEnd(22)} ${color.dim("not present or already removed")}`);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
async function maybeUninstallRequiredPlugins({ yes }) {
|
|
157
|
-
log.blank();
|
|
158
|
-
log.info("Required companion plugins");
|
|
159
|
-
if (shouldKeepRequiredPlugins({ yes })) {
|
|
160
|
-
log.info(
|
|
161
|
-
color.dim("--yes mode: keeping required companion plugins (use --purge to remove them)")
|
|
162
|
-
);
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
const removeRequired = await confirm(
|
|
167
|
-
`Remove required companion plugins (${REQUIRED.map((plugin) => plugin.name).join(", ")})? ${color.dim("(keeps shared tools available if other workflows depend on them)")}`,
|
|
168
|
-
false
|
|
169
|
-
);
|
|
170
|
-
if (!removeRequired) {
|
|
171
|
-
log.info("Keeping required companion plugins");
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
for (const plugin of REQUIRED) {
|
|
176
|
-
const result = await uninstallPlugin(plugin);
|
|
177
|
-
if (result.code === 0) {
|
|
178
|
-
log.ok(` ${plugin.name.padEnd(22)} uninstalled`);
|
|
179
|
-
} else {
|
|
180
|
-
log.info(` ${plugin.name.padEnd(22)} ${color.dim("not present or already removed")}`);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
async function maybePurgeRuntimeArtifacts({ purge }) {
|
|
186
|
-
log.blank();
|
|
187
|
-
log.step(3, UNINSTALL_STEP_COUNT, "Runtime symlinks and marketplaces");
|
|
188
|
-
if (!purge) {
|
|
189
|
-
log.info(
|
|
190
|
-
color.dim("Keeping ~/.local/bin/bun, ~/.local/bin/uv (use --purge to remove)")
|
|
191
|
-
);
|
|
192
|
-
log.info(
|
|
193
|
-
color.dim("Reason: these bun/uv binaries may be used by other tools — confirm before deleting")
|
|
194
|
-
);
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
await purgeManagedMarketplaces();
|
|
199
|
-
removeManagedSymlinks();
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
async function purgeManagedMarketplaces() {
|
|
203
|
-
const marketplaceIds = getManagedMarketplaceIds(RECOMMENDED.concat(REQUIRED));
|
|
204
|
-
|
|
205
|
-
for (const marketplaceId of marketplaceIds) {
|
|
206
|
-
const result = await removePluginMarketplace(marketplaceId);
|
|
207
|
-
if (result.code === 0) {
|
|
208
|
-
log.ok(`Removed marketplace ${marketplaceId}`);
|
|
209
|
-
} else if (!result.stderr.includes("not found")) {
|
|
210
|
-
log.warn(`Failed to remove marketplace ${marketplaceId}: ${resultLastLine(result)}`);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
function removeManagedSymlinks() {
|
|
216
|
-
for (const link of MANAGED_SYMLINKS) {
|
|
217
|
-
if (!existsSync(link) && !isBrokenSymlink(link)) {
|
|
218
|
-
continue;
|
|
219
|
-
}
|
|
220
|
-
try {
|
|
221
|
-
const stat = lstatSync(link);
|
|
222
|
-
if (!stat.isSymbolicLink()) {
|
|
223
|
-
log.warn(
|
|
224
|
-
`${link} is not a symlink (likely a real file placed by the user), skipping`
|
|
225
|
-
);
|
|
226
|
-
continue;
|
|
227
|
-
}
|
|
228
|
-
const target = readlinkSync(link);
|
|
229
|
-
unlinkSync(link);
|
|
230
|
-
log.ok(`Removed symlink ${link} ${color.dim(`(was → ${target})`)}`);
|
|
231
|
-
} catch (err) {
|
|
232
|
-
log.warn(`Failed to remove ${link}: ${err.message}`);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
async function maybeRemoveProjectState({ yes }) {
|
|
238
|
-
log.blank();
|
|
239
|
-
log.step(4, UNINSTALL_STEP_COUNT, "Project state directory");
|
|
240
|
-
const flowDir = join(process.cwd(), ".flow");
|
|
241
|
-
if (!existsSync(flowDir)) {
|
|
242
|
-
log.info(".flow/ does not exist, skipping");
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
if (yes) {
|
|
247
|
-
log.info(
|
|
248
|
-
color.dim("--yes mode: keeping .flow/ (contains specs & decisions — confirm by hand before deleting)")
|
|
249
|
-
);
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
const ok = await confirm(
|
|
254
|
-
`${color.red("DANGER:")} delete the ${color.bold(".flow/")} directory of the current project? ${color.dim("(includes all specs / decisions, not recoverable)")}`,
|
|
255
|
-
false
|
|
256
|
-
);
|
|
257
|
-
if (!ok) {
|
|
258
|
-
log.info("Keeping .flow/");
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
try {
|
|
263
|
-
rmSync(flowDir, { recursive: true, force: true });
|
|
264
|
-
log.ok(`Removed ${flowDir}`);
|
|
265
|
-
} catch (err) {
|
|
266
|
-
log.err(`Removal failed: ${err.message}`);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
function toUninstallTarget(entry) {
|
|
271
|
-
return {
|
|
272
|
-
name: entry.name,
|
|
273
|
-
uninstallSpec: entry.uninstallSpec,
|
|
274
|
-
uninstallArgs: entry.uninstallArgs || [],
|
|
275
|
-
marketplaceId: entry.marketplaceId,
|
|
276
|
-
scope: entry.scope,
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
function isBrokenSymlink(pathname) {
|
|
281
|
-
try {
|
|
282
|
-
return lstatSync(pathname).isSymbolicLink();
|
|
283
|
-
} catch {
|
|
284
|
-
return false;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
@@ -7,8 +7,6 @@ depends_on: []
|
|
|
7
7
|
|
|
8
8
|
# Coverage Audit Gate — Multi-Source Coverage Audit
|
|
9
9
|
|
|
10
|
-
> Derived from get-shit-done's "Multi-Source Coverage Audit".
|
|
11
|
-
>
|
|
12
10
|
> Rule: every claim in the spec must be covered by implementation/tests. Uncovered = missed = future bug.
|
|
13
11
|
|
|
14
12
|
---
|
|
@@ -181,4 +179,4 @@ Fix recommendations:
|
|
|
181
179
|
|
|
182
180
|
---
|
|
183
181
|
|
|
184
|
-
_Source:
|
|
182
|
+
_Source: CurDX-Flow multi-source coverage audit contract._
|
package/gates/tdd-gate.md
CHANGED
|
@@ -8,8 +8,6 @@ depends_on: []
|
|
|
8
8
|
# TDD Gate — Red/Green/Yellow Cycle Enforcement
|
|
9
9
|
|
|
10
10
|
> **Iron rule**: NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST.
|
|
11
|
-
>
|
|
12
|
-
> Source: superpowers' test-driven-development skill.
|
|
13
11
|
|
|
14
12
|
---
|
|
15
13
|
|
|
@@ -182,7 +180,3 @@ Compliant: 4
|
|
|
182
180
|
Fix recommendations:
|
|
183
181
|
T2: add test test(auth): red - password hashing, verify it fails, then redo GREEN
|
|
184
182
|
```
|
|
185
|
-
|
|
186
|
-
---
|
|
187
|
-
|
|
188
|
-
_Source: superpowers' test-driven-development skill._
|
|
@@ -7,7 +7,7 @@ depends_on: []
|
|
|
7
7
|
|
|
8
8
|
# Verification Gate — Verification Required Before Completion
|
|
9
9
|
|
|
10
|
-
> **Always enabled**. No evidence = no completion.
|
|
10
|
+
> **Always enabled**. No evidence = no completion. Verification must be based on observed proof, not claimed completion.
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -177,7 +177,3 @@ Warnings: 1
|
|
|
177
177
|
Fix recommendations:
|
|
178
178
|
V1: dispatch flow-executor to run tests, add evidence to the commit message body
|
|
179
179
|
```
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
|
-
_Source: superpowers' verification-before-completion skill. CurdX-Flow turns it into a gate._
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Artifact Output Discipline
|
|
2
|
+
|
|
3
|
+
Use this discipline for artifact-producing agents that write canonical files
|
|
4
|
+
such as `research.md`, `requirements.md`, `design.md`, `tasks.md`, or
|
|
5
|
+
`codebase-index.md`.
|
|
6
|
+
|
|
7
|
+
## Core Rules
|
|
8
|
+
|
|
9
|
+
1. Write the artifact first. The first substantive action should be the `Write`
|
|
10
|
+
tool call for the final file content.
|
|
11
|
+
2. Do not preview or paraphrase the artifact inline. The file is the
|
|
12
|
+
deliverable.
|
|
13
|
+
3. Keep status updates minimal: short bullets or fixed summary lines only.
|
|
14
|
+
4. End with the exact compact output contract defined by the agent-specific
|
|
15
|
+
section. No extra explanation before or after it.
|
|
16
|
+
5. If something blocks the write, report the blocker directly instead of
|
|
17
|
+
emitting a fake success summary.
|
|
18
|
+
|
|
19
|
+
## Why
|
|
20
|
+
|
|
21
|
+
- Prevents context waste from duplicating the artifact in chat
|
|
22
|
+
- Makes the written file the canonical output surface
|
|
23
|
+
- Keeps artifact-producing subagents consistent across research, product,
|
|
24
|
+
architecture, planning, and brownfield mapping
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Artifact Summary Contracts
|
|
2
|
+
|
|
3
|
+
Use these compact summary contracts after an artifact lands successfully. Pair
|
|
4
|
+
them with `artifact-output-discipline.md`: write first, no preview, then emit
|
|
5
|
+
the exact contract below and stop.
|
|
6
|
+
|
|
7
|
+
## research.md
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
✓ research.md generated
|
|
11
|
+
Recommendations: N
|
|
12
|
+
Next: /curdx-flow:spec --phase=requirements
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## requirements.md
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
✓ requirements.md generated
|
|
19
|
+
User stories: N
|
|
20
|
+
Functional requirements: N
|
|
21
|
+
Next: /curdx-flow:spec --phase=design
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## design.md
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
✓ design.md generated
|
|
28
|
+
Architecture decisions: N
|
|
29
|
+
Components: N
|
|
30
|
+
Next: /curdx-flow:spec --phase=tasks
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## tasks.md
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
✓ tasks.md generated
|
|
37
|
+
Total tasks: N
|
|
38
|
+
Coverage audit: PASS
|
|
39
|
+
Phases: 1-5
|
|
40
|
+
Next: /curdx-flow:implement
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## codebase-index.md
|
|
44
|
+
|
|
45
|
+
```text
|
|
46
|
+
✓ codebase-index.md generated
|
|
47
|
+
Modules: N
|
|
48
|
+
Entry points: N
|
|
49
|
+
Next: /curdx-flow:start <feature-name>
|
|
50
|
+
```
|
|
@@ -76,7 +76,7 @@ main agent
|
|
|
76
76
|
- ✓ Quality-first (every task must be high-quality, avoid context pollution)
|
|
77
77
|
- ✓ Moderate task size (2-15 minutes)
|
|
78
78
|
- ✓ Tasks relatively independent, no complex shared context needed
|
|
79
|
-
- ✓
|
|
79
|
+
- ✓ Stable per-task quality matters more than dispatch overhead
|
|
80
80
|
|
|
81
81
|
### Advantages
|
|
82
82
|
- Each subagent uses at most ~30% context → stable quality
|
|
@@ -127,7 +127,7 @@ Safety invariant: `ALL_TASKS_COMPLETE` is advisory, not authoritative. If `tasks
|
|
|
127
127
|
- ✓ Long task chains (20+)
|
|
128
128
|
- ✓ Unattended execution (overnight automation)
|
|
129
129
|
- ✓ You don't want to trigger each step manually
|
|
130
|
-
- ✓
|
|
130
|
+
- ✓ Long-running sequential work with checkpointed continuation
|
|
131
131
|
|
|
132
132
|
### Advantages
|
|
133
133
|
- Truly autonomous execution — the user can walk away
|
|
@@ -169,7 +169,7 @@ main agent
|
|
|
169
169
|
- ✓ Many `[P]` markers in tasks.md
|
|
170
170
|
- ✓ Tasks are independent (different files, different components)
|
|
171
171
|
- ✓ Time-pressured (parallelism is faster)
|
|
172
|
-
- ✓
|
|
172
|
+
- ✓ Parallel-safe delivery work
|
|
173
173
|
|
|
174
174
|
### Advantages
|
|
175
175
|
- Wall-clock time greatly reduced (N parallel tasks at once)
|
|
@@ -298,4 +298,6 @@ Claude Code checkpoints plus `.flow/specs/<name>/.progress.md` are the current r
|
|
|
298
298
|
|
|
299
299
|
---
|
|
300
300
|
|
|
301
|
-
|
|
301
|
+
This document defines CurDX-Flow's shipped strategy semantics: stop-hook for
|
|
302
|
+
checkpointed continuation, subagent for serial isolated execution, and wave for
|
|
303
|
+
parallel batches.
|
|
@@ -114,7 +114,7 @@ Commit: `refactor(scope): yellow - <what was cleaned up>`
|
|
|
114
114
|
### Pitfalls
|
|
115
115
|
- **Code first, tests after** → not TDD, this is post-hoc testing. Easily misses edge cases.
|
|
116
116
|
- **Tests only cover happy path** → no error handling coverage; the common cause of production issues.
|
|
117
|
-
- **Too much mocking** → tests disconnected from real behavior.
|
|
117
|
+
- **Too much mocking** → tests disconnected from real behavior. Keep primary evidence anchored to real integrations at system boundaries.
|
|
118
118
|
|
|
119
119
|
---
|
|
120
120
|
|
|
@@ -211,7 +211,7 @@ Feature is verified, reviewed, and ready for a human PR/release decision.
|
|
|
211
211
|
|
|
212
212
|
## Relationship to the TDD Iron Rule
|
|
213
213
|
|
|
214
|
-
**TDD iron rule
|
|
214
|
+
**TDD iron rule**: "NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST"
|
|
215
215
|
|
|
216
216
|
**POC-First's compromise**: Phase 1 allows skipping tests because the purpose of POC is to validate the idea, not to deliver.
|
|
217
217
|
|
|
@@ -221,7 +221,3 @@ Feature is verified, reviewed, and ready for a human PR/release decision.
|
|
|
221
221
|
- Newly added **production code**: must be covered by Phase 3 TDD loop
|
|
222
222
|
|
|
223
223
|
The two don't conflict: POC is not production code; production code starts at Phase 2.
|
|
224
|
-
|
|
225
|
-
---
|
|
226
|
-
|
|
227
|
-
_Adapted from smart-ralph's POC-First workflow, extended with superpowers' TDD discipline._
|
|
@@ -178,7 +178,3 @@ The two complement each other:
|
|
|
178
178
|
- Agents `mcp__claude_mem__search` the history before starting research
|
|
179
179
|
- What gets written into research.md is filtered, retention-worthy conclusions
|
|
180
180
|
- Subsequent sessions: claude-mem auto-injects recent context; spec files provide the structured overview
|
|
181
|
-
|
|
182
|
-
---
|
|
183
|
-
|
|
184
|
-
_Adapted from smart-ralph's spec engine, extended with get-shit-done's multi-source audit._
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
# Systematic Debugging — 4-Stage Methodology
|
|
2
2
|
|
|
3
|
-
> Inherited from superpowers' systematic-debugging skill.
|
|
4
|
-
>
|
|
5
3
|
> Agents reference this via `@${CLAUDE_PLUGIN_ROOT}/knowledge/systematic-debugging.md`.
|
|
6
4
|
|
|
7
5
|
---
|
|
@@ -378,7 +376,3 @@ The value of systematic debugging:
|
|
|
378
376
|
Unsystematic → fixes fast but fragile → bitten again by the same bug
|
|
379
377
|
Systematic → fixes slow but thorough → solved once, never looked back
|
|
380
378
|
```
|
|
381
|
-
|
|
382
|
-
---
|
|
383
|
-
|
|
384
|
-
_Source: superpowers' systematic-debugging skill._
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Two-Stage Review — Two-Stage Code Review
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> CurDX-Flow runtime contract for two-stage review.
|
|
4
4
|
>
|
|
5
5
|
> Agents reference this via `@${CLAUDE_PLUGIN_ROOT}/knowledge/two-stage-review.md`.
|
|
6
6
|
|
|
@@ -129,6 +129,12 @@ Stage 2 applies all enabled Gates (from `.flow/config.json`):
|
|
|
129
129
|
- Each applicable edge-case category addressed (N/A noted for the rest)?
|
|
130
130
|
- Gap list has priorities?
|
|
131
131
|
|
|
132
|
+
#### 2.8 (enterprise) DevEx review (devex-gate)
|
|
133
|
+
|
|
134
|
+
- Are naming, comments, and structure maintainable for the next engineer?
|
|
135
|
+
- Is setup, typing, and test ergonomics acceptable without tribal knowledge?
|
|
136
|
+
- Does the developer loop stay fast enough to keep future changes safe?
|
|
137
|
+
|
|
132
138
|
### Stage 2 verdict
|
|
133
139
|
|
|
134
140
|
- **EXCELLENT**: all enabled Gates pass, adversarial review clean or only low-severity findings
|
|
@@ -232,7 +238,7 @@ Some reviewers list 50 minor improvements — the user can't process.
|
|
|
232
238
|
↓ ↓
|
|
233
239
|
↓ review-report.md
|
|
234
240
|
↓
|
|
235
|
-
(optional) /curdx-flow:review --adversarial --edge-case
|
|
241
|
+
(optional) /curdx-flow:review --adversarial --edge-case --devex
|
|
236
242
|
↓
|
|
237
243
|
adversarial-review.md
|
|
238
244
|
edge-cases.md
|
|
@@ -241,7 +247,3 @@ Ready for human PR/release handoff with verification + review evidence
|
|
|
241
247
|
```
|
|
242
248
|
|
|
243
249
|
Verify is "did we implement the right thing", Review is "is the implementation good", Audit is "what else could be better". CurdX-Flow currently stops at evidence-backed handoff; do not reference non-existent ship/land commands.
|
|
244
|
-
|
|
245
|
-
---
|
|
246
|
-
|
|
247
|
-
_Source: superpowers' code-review two-stage design, extended with CurdX-Flow's Gate system._
|
|
@@ -399,4 +399,5 @@ As in "Case 3" above. Solutions:
|
|
|
399
399
|
|
|
400
400
|
---
|
|
401
401
|
|
|
402
|
-
_Source:
|
|
402
|
+
_Source: CurDX-Flow wave execution contract. This file defines the executable
|
|
403
|
+
parallel-delivery rules used by the plugin runtime._
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@curdx/flow",
|
|
3
|
-
"version": "2.2.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.2.5",
|
|
4
|
+
"description": "Skill-first discipline layer and CLI installer for Claude Code",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"curdx-flow": "bin/curdx-flow.js"
|
|
@@ -30,30 +30,24 @@ paths:
|
|
|
30
30
|
|
|
31
31
|
# Brownfield Index
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
This is a fast structural mapping skill for inherited codebases. Keep the
|
|
34
|
+
entrypoint focused on when to index, what the analyst must produce, and where
|
|
35
|
+
to route the user next. Detailed rules live in:
|
|
34
36
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
2. The project is not a new `/curdx-flow:init`-ed greenfield project (if it is, direct the user to `/curdx-flow:start` instead).
|
|
39
|
-
|
|
40
|
-
## Workflow
|
|
37
|
+
- `references/applicability.md`
|
|
38
|
+
- `references/index-contract.md`
|
|
39
|
+
- `references/handoff.md`
|
|
41
40
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
1. Detect the actual stack from the repo's manifests.
|
|
45
|
-
2. Scan structure, entry points, module boundaries, and developer-loop commands.
|
|
46
|
-
3. Map API / CLI surfaces when they exist.
|
|
47
|
-
4. Write `.flow/codebase-index.md` with concrete next actions.
|
|
41
|
+
## Preconditions
|
|
48
42
|
|
|
49
|
-
|
|
43
|
+
Use `references/applicability.md` to decide whether the repository actually
|
|
44
|
+
needs a brownfield index first.
|
|
50
45
|
|
|
51
|
-
|
|
52
|
-
- "Looking to add a feature here? Run `/curdx-flow:start <name>` to begin a spec."
|
|
53
|
-
- "Debugging something specific? Run `/curdx-flow:debug '<symptom>'`."
|
|
46
|
+
## Index Contract
|
|
54
47
|
|
|
55
|
-
|
|
48
|
+
`flow-brownfield-analyst` writes the structural map defined in
|
|
49
|
+
`references/index-contract.md`.
|
|
56
50
|
|
|
57
|
-
|
|
51
|
+
## Handoff
|
|
58
52
|
|
|
59
|
-
|
|
53
|
+
Use `references/handoff.md` to route the user to the next relevant command.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Brownfield Applicability — When to Index First
|
|
2
|
+
|
|
3
|
+
Use this skill when:
|
|
4
|
+
|
|
5
|
+
- the repository is unfamiliar, inherited, or legacy
|
|
6
|
+
- the user needs a quick structural map before feature work
|
|
7
|
+
|
|
8
|
+
Do not use it for a fresh greenfield repo that should start directly with:
|
|
9
|
+
|
|
10
|
+
```text
|
|
11
|
+
/curdx-flow:start <name> "<goal>"
|
|
12
|
+
```
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Brownfield Handoff — What to Do After Indexing
|
|
2
|
+
|
|
3
|
+
Route to the next concrete action:
|
|
4
|
+
|
|
5
|
+
- feature work -> `/curdx-flow:start <name> "<goal>"`
|
|
6
|
+
- targeted bug work -> `/curdx-flow:debug "<symptom>"`
|
|
7
|
+
|
|
8
|
+
For deep framework or library research, use Context7 directly.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Brownfield Index Contract — What the Analyst Must Produce
|
|
2
|
+
|
|
3
|
+
`flow-brownfield-analyst` should:
|
|
4
|
+
|
|
5
|
+
1. detect the actual stack from manifests
|
|
6
|
+
2. scan structure, entry points, boundaries, and developer-loop commands
|
|
7
|
+
3. map API or CLI surfaces when they exist
|
|
8
|
+
4. write `.flow/codebase-index.md`
|
|
9
|
+
|
|
10
|
+
The index should be quick and decision-useful, not exhaustive.
|