@jakkrichm/create-nexus-devflow 2.0.15 → 2.0.16
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/dist/bin/create-nexus-devflow.d.ts +14 -1
- package/dist/bin/create-nexus-devflow.js +45 -7
- package/dist/bin/create-nexus-devflow.js.map +1 -1
- package/dist/lib/current-work.d.ts +30 -0
- package/dist/lib/current-work.js +208 -0
- package/dist/lib/current-work.js.map +1 -0
- package/dist/lib/findings.d.ts +26 -0
- package/dist/lib/findings.js +110 -0
- package/dist/lib/findings.js.map +1 -0
- package/dist/lib/git-status.d.ts +13 -0
- package/dist/lib/git-status.js +98 -0
- package/dist/lib/git-status.js.map +1 -0
- package/dist/lib/project-metadata.d.ts +22 -0
- package/dist/lib/project-metadata.js +84 -0
- package/dist/lib/project-metadata.js.map +1 -0
- package/dist/lib/project-root.d.ts +3 -0
- package/dist/lib/project-root.js +76 -0
- package/dist/lib/project-root.js.map +1 -0
- package/dist/lib/status.d.ts +62 -0
- package/dist/lib/status.js +273 -0
- package/dist/lib/status.js.map +1 -0
- package/package.json +4 -3
- package/template/devflow/context/current-stage.md +1 -1
- package/template/devflow/history/HISTORY.md +1 -0
|
@@ -1,2 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
interface CliOptions {
|
|
3
|
+
command: "install" | "status" | "update";
|
|
4
|
+
target: string | null;
|
|
5
|
+
adapter: string;
|
|
6
|
+
force: boolean;
|
|
7
|
+
dryRun: boolean;
|
|
8
|
+
help: boolean;
|
|
9
|
+
json: boolean;
|
|
10
|
+
version: boolean;
|
|
11
|
+
yes: boolean;
|
|
12
|
+
}
|
|
13
|
+
declare function main(args?: readonly string[]): Promise<void>;
|
|
14
|
+
declare function parseArgs(args: readonly string[]): CliOptions;
|
|
15
|
+
export { main, parseArgs };
|
|
@@ -3,13 +3,14 @@ import fsSync from "node:fs";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import readline from "node:readline/promises";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { formatHumanStatus, readProjectStatus, shouldUseColor } from "../lib/status.js";
|
|
6
7
|
import { applyPreparedUpdate, prepareUpdate } from "../lib/update.js";
|
|
7
8
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
8
9
|
const packageRoot = path.resolve(__dirname, "..", "..");
|
|
9
10
|
const templateRoot = path.join(packageRoot, "template");
|
|
10
11
|
const adapterChoices = new Set(["codex", "antigravity", "claude", "both", "all"]);
|
|
11
|
-
async function main() {
|
|
12
|
-
const options = parseArgs(
|
|
12
|
+
async function main(args = process.argv.slice(2)) {
|
|
13
|
+
const options = parseArgs(args);
|
|
13
14
|
if (options.help) {
|
|
14
15
|
printHelp();
|
|
15
16
|
return;
|
|
@@ -18,10 +19,17 @@ async function main() {
|
|
|
18
19
|
console.log(readPackageVersion());
|
|
19
20
|
return;
|
|
20
21
|
}
|
|
22
|
+
const targetDir = path.resolve(process.cwd(), options.target || ".");
|
|
23
|
+
if (options.command === "status") {
|
|
24
|
+
const status = await readProjectStatus(targetDir);
|
|
25
|
+
console.log(options.json
|
|
26
|
+
? JSON.stringify(status, null, 2)
|
|
27
|
+
: formatHumanStatus(status, { color: shouldUseColor() }));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
21
30
|
if (!fsSync.existsSync(templateRoot)) {
|
|
22
31
|
throw new Error("Installer template is missing. Run `npm run prepare-template` before local testing.");
|
|
23
32
|
}
|
|
24
|
-
const targetDir = path.resolve(process.cwd(), options.target || ".");
|
|
25
33
|
const version = readPackageVersion();
|
|
26
34
|
if (options.command === "update") {
|
|
27
35
|
const prepared = await prepareUpdate({
|
|
@@ -68,6 +76,7 @@ function parseArgs(args) {
|
|
|
68
76
|
let force = false;
|
|
69
77
|
let dryRun = false;
|
|
70
78
|
let help = false;
|
|
79
|
+
let json = false;
|
|
71
80
|
let version = false;
|
|
72
81
|
let yes = false;
|
|
73
82
|
const positional = [];
|
|
@@ -81,6 +90,10 @@ function parseArgs(args) {
|
|
|
81
90
|
version = true;
|
|
82
91
|
continue;
|
|
83
92
|
}
|
|
93
|
+
if (arg === "--json") {
|
|
94
|
+
json = true;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
84
97
|
if (arg === "--force" || arg === "-f") {
|
|
85
98
|
force = true;
|
|
86
99
|
continue;
|
|
@@ -93,6 +106,18 @@ function parseArgs(args) {
|
|
|
93
106
|
yes = true;
|
|
94
107
|
continue;
|
|
95
108
|
}
|
|
109
|
+
if (arg === "--target" || arg === "-t") {
|
|
110
|
+
const next = args[++i];
|
|
111
|
+
if (!next) {
|
|
112
|
+
throw new Error(`${arg} requires a path`);
|
|
113
|
+
}
|
|
114
|
+
target = next;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (arg.startsWith("--target=")) {
|
|
118
|
+
target = arg.slice("--target=".length);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
96
121
|
if (arg === "--adapter") {
|
|
97
122
|
const value = args[++i];
|
|
98
123
|
if (!value || !adapterChoices.has(value.toLowerCase())) {
|
|
@@ -115,9 +140,13 @@ function parseArgs(args) {
|
|
|
115
140
|
positional.push(arg);
|
|
116
141
|
}
|
|
117
142
|
if (positional.length > 0) {
|
|
118
|
-
if (positional[0] === "
|
|
143
|
+
if (positional[0] === "status") {
|
|
144
|
+
command = "status";
|
|
145
|
+
target = positional[1] || target || ".";
|
|
146
|
+
}
|
|
147
|
+
else if (positional[0] === "update") {
|
|
119
148
|
command = "update";
|
|
120
|
-
target = positional[1] || ".";
|
|
149
|
+
target = positional[1] || target || ".";
|
|
121
150
|
}
|
|
122
151
|
else {
|
|
123
152
|
target = positional[0];
|
|
@@ -130,6 +159,7 @@ function parseArgs(args) {
|
|
|
130
159
|
force,
|
|
131
160
|
dryRun,
|
|
132
161
|
help,
|
|
162
|
+
json,
|
|
133
163
|
version,
|
|
134
164
|
yes
|
|
135
165
|
};
|
|
@@ -141,14 +171,21 @@ function readPackageVersion() {
|
|
|
141
171
|
}
|
|
142
172
|
function printHelp() {
|
|
143
173
|
console.log(`
|
|
144
|
-
Nexus-DevFlow
|
|
174
|
+
Nexus-DevFlow CLI v${readPackageVersion()}
|
|
145
175
|
|
|
146
176
|
Usage:
|
|
147
177
|
npx @jakkrichm/create-nexus-devflow [target-dir] [options]
|
|
148
|
-
|
|
178
|
+
nexus-devflow status [target-dir] [options]
|
|
179
|
+
nexus-devflow update [target-dir] [options]
|
|
180
|
+
|
|
181
|
+
Commands:
|
|
182
|
+
status Show project overview, progress, findings, git status, and next action
|
|
183
|
+
update Update existing DevFlow installation without overwriting user changes
|
|
149
184
|
|
|
150
185
|
Options:
|
|
151
186
|
--adapter <name> Tool adapters to install: codex, antigravity, claude, both (default: both)
|
|
187
|
+
--json Print status as structured JSON object
|
|
188
|
+
--target, -t Target project directory
|
|
152
189
|
--force, -f Overwrite conflicting files without prompting
|
|
153
190
|
--dry-run Preview changes without modifying disk
|
|
154
191
|
-y, --yes Automatically confirm interactive prompts
|
|
@@ -230,4 +267,5 @@ if (process.argv[1] &&
|
|
|
230
267
|
process.exit(1);
|
|
231
268
|
});
|
|
232
269
|
}
|
|
270
|
+
export { main, parseArgs };
|
|
233
271
|
//# sourceMappingURL=create-nexus-devflow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-nexus-devflow.js","sourceRoot":"","sources":["../../bin/create-nexus-devflow.ts"],"names":[],"mappings":";AAGA,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,mBAAmB,EACnB,aAAa,EAEd,MAAM,kBAAkB,CAAC;AAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACxD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AAExD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"create-nexus-devflow.js","sourceRoot":"","sources":["../../bin/create-nexus-devflow.ts"],"names":[],"mappings":";AAGA,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,aAAa,EAEd,MAAM,kBAAkB,CAAC;AAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACxD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AAExD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAclF,KAAK,UAAU,IAAI,CAAC,OAA0B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAEhC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;IAErE,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CACT,OAAO,CAAC,IAAI;YACV,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACjC,CAAC,CAAC,iBAAiB,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,CAC3D,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IAErC,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC;YACnC,SAAS;YACT,YAAY;YACZ,OAAO;YACP,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QACH,eAAe,CAAC,QAAQ,CAAC,CAAC;QAE1B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,gBAAgB,GACpB,OAAO,CAAC,KAAK,IAAI,CAAC,MAAM,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACzE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC;QACnC,SAAS;QACT,YAAY;QACZ,OAAO;QACP,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IAEH,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE3B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvD,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE;QACjD,gBAAgB,EAAE,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;KACpE,CAAC,CAAC;IAEH,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,SAAS,CAAC,IAAuB;IACxC,IAAI,OAAO,GAAoC,SAAS,CAAC;IACzD,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,OAAO,GAAG,MAAM,CAAC;IACrB,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,GAAG,GAAG,KAAK,CAAC;IAEhB,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,IAAI,GAAG,IAAI,CAAC;YACZ,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACxC,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,IAAI,GAAG,IAAI,CAAC;YACZ,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACtC,KAAK,GAAG,IAAI,CAAC;YACb,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpC,GAAG,GAAG,IAAI,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,kBAAkB,CAAC,CAAC;YAC5C,CAAC;YACD,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACvC,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBACvD,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,2DAA2D,CAC7F,CAAC;YACJ,CAAC;YACD,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC7C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CACb,4BAA4B,KAAK,2DAA2D,CAC7F,CAAC;YACJ,CAAC;YACD,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,yCAAyC,CAAC,CAAC;QACnF,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,GAAG,QAAQ,CAAC;YACnB,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,GAAG,CAAC;QAC1C,CAAC;aAAM,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,GAAG,QAAQ,CAAC;YACnB,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,GAAG,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO;QACP,MAAM;QACN,OAAO;QACP,KAAK;QACL,MAAM;QACN,IAAI;QACJ,IAAI;QACJ,OAAO;QACP,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrD,OAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAyB,CAAC,OAAO,CAAC;AAC9D,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;qBACO,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;CAoBxC,CAAC,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAwB;IAChD,OAAO,CAAC,GAAG,CAAC,oBAAoB,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzE,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IAEjE,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,OAAO,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,QAAwB;IAC/C,OAAO,CAAC,GAAG,CAAC,iCAAiC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzE,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,QAAwB,EAAE,OAAmB;IAClF,IAAI,OAAO,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAC9B,eAAe,QAAQ,CAAC,YAAY,CAAC,MAAM,8BAA8B,CAC1E,CAAC;IACF,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,QAAwB,EAAE,OAAmB;IACjF,IAAI,OAAO,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAC9B,eAAe,QAAQ,CAAC,YAAY,CAAC,MAAM,yCAAyC,CACrF,CAAC;IACF,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC;AAC7C,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,8FAA8F,CAAC,CAAC;IAC5G,OAAO,CAAC,GAAG,CAAC,yFAAyF,CAAC,CAAC;IACvG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,sFAAsF,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,0FAA0F,CAAC,CAAC;IACxG,OAAO,CAAC,GAAG,CAAC,+FAA+F,CAAC,CAAC;AAC/G,CAAC;AAED,SAAS,mBAAmB,CAAC,SAAiB,EAAE,MAAgC;IAC9E,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,YAAY,WAAW,CAAC,CAAC;IACvD,cAAc,EAAE,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAwB,EAAE,MAAsD;IAC1G,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,YAAY,qBAAqB,MAAM,CAAC,YAAY,oBAAoB,CAAC,CAAC;IACxG,cAAc,EAAE,CAAC;AACnB,CAAC;AAED,IACE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACf,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAC5F,CAAC;IACD,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QAC5B,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
type CurrentWorkState = "active" | "idle" | "malformed";
|
|
2
|
+
type CurrentWorkType = "feature" | "fix" | "rollback" | "stage";
|
|
3
|
+
interface CurrentWorkStep {
|
|
4
|
+
checked: boolean;
|
|
5
|
+
line: number;
|
|
6
|
+
title: string;
|
|
7
|
+
}
|
|
8
|
+
type CurrentWorkWarningCode = "empty_current_work" | "invalid_current_work_path" | "malformed_current_work" | "missing_current_work" | "unsafe_current_work_path";
|
|
9
|
+
interface CurrentWorkWarning {
|
|
10
|
+
code: CurrentWorkWarningCode;
|
|
11
|
+
message: string;
|
|
12
|
+
}
|
|
13
|
+
interface CurrentWorkSummary {
|
|
14
|
+
state: CurrentWorkState;
|
|
15
|
+
type: CurrentWorkType | null;
|
|
16
|
+
title: string | null;
|
|
17
|
+
status: string | null;
|
|
18
|
+
runId: string | null;
|
|
19
|
+
steps: CurrentWorkStep[];
|
|
20
|
+
completed: number;
|
|
21
|
+
remaining: number;
|
|
22
|
+
total: number;
|
|
23
|
+
nextStep: CurrentWorkStep | null;
|
|
24
|
+
warnings: CurrentWorkWarning[];
|
|
25
|
+
}
|
|
26
|
+
declare const CURRENT_STAGE_PATH: string;
|
|
27
|
+
declare function readCurrentWork(projectRoot: string): Promise<CurrentWorkSummary>;
|
|
28
|
+
declare function parseCurrentWork(markdown: string): CurrentWorkSummary;
|
|
29
|
+
export { CURRENT_STAGE_PATH, parseCurrentWork, readCurrentWork };
|
|
30
|
+
export type { CurrentWorkState, CurrentWorkStep, CurrentWorkSummary, CurrentWorkType, CurrentWorkWarning, CurrentWorkWarningCode };
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const CURRENT_STAGE_PATH = path.join("devflow", "context", "current-stage.md");
|
|
4
|
+
const LEGACY_FEATURE_PATH = path.join("blueprint", "context", "current-feature.md");
|
|
5
|
+
const RESET_MARKER = "_Nothing in progress.";
|
|
6
|
+
const CHECKBOX_PATTERN = /^\s*-\s+\[([ xX])\]\s+(.+?)\s*$/;
|
|
7
|
+
async function readCurrentWork(projectRoot) {
|
|
8
|
+
// First, check devflow/context/current-stage.md
|
|
9
|
+
const currentStageFile = path.join(projectRoot, CURRENT_STAGE_PATH);
|
|
10
|
+
try {
|
|
11
|
+
const stageStats = await fs.lstat(currentStageFile).catch(() => null);
|
|
12
|
+
if (stageStats?.isFile()) {
|
|
13
|
+
const stageContent = await fs.readFile(currentStageFile, "utf8");
|
|
14
|
+
const activeRunningIdMatch = stageContent.match(/-\s+\*\*Active Running ID\*\*:\s*`?([A-Za-z0-9-_]+|None)`?/i);
|
|
15
|
+
const activeRunningId = activeRunningIdMatch ? activeRunningIdMatch[1].trim() : null;
|
|
16
|
+
const stageMatch = stageContent.match(/-\s+\*\*Current Stage\*\*:\s*([^\r\n]+)/i);
|
|
17
|
+
const stageName = stageMatch ? stageMatch[1].trim() : "";
|
|
18
|
+
if (!activeRunningId ||
|
|
19
|
+
activeRunningId.toLowerCase() === "none" ||
|
|
20
|
+
stageName.toLowerCase().startsWith("idle")) {
|
|
21
|
+
return idleSummary();
|
|
22
|
+
}
|
|
23
|
+
// Check the active run directory
|
|
24
|
+
const activeRunDir = path.join(projectRoot, "devflow", "runs", activeRunningId);
|
|
25
|
+
const specPath = path.join(activeRunDir, "spec.md");
|
|
26
|
+
const specStats = await fs.lstat(specPath).catch(() => null);
|
|
27
|
+
if (specStats?.isFile()) {
|
|
28
|
+
const specContent = await fs.readFile(specPath, "utf8");
|
|
29
|
+
const parsed = parseCurrentWork(specContent);
|
|
30
|
+
parsed.runId = activeRunningId;
|
|
31
|
+
return parsed;
|
|
32
|
+
}
|
|
33
|
+
const checklistPath = path.join(activeRunDir, "checklists", "implementation-checklist.md");
|
|
34
|
+
const checklistStats = await fs.lstat(checklistPath).catch(() => null);
|
|
35
|
+
if (checklistStats?.isFile()) {
|
|
36
|
+
const checklistContent = await fs.readFile(checklistPath, "utf8");
|
|
37
|
+
return parseChecklistWork(checklistContent, activeRunningId);
|
|
38
|
+
}
|
|
39
|
+
return idleSummary();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Fall back to scanning devflow/runs
|
|
44
|
+
}
|
|
45
|
+
// If current-stage.md is absent, scan devflow/runs/
|
|
46
|
+
const devflowRunsDir = path.join(projectRoot, "devflow", "runs");
|
|
47
|
+
try {
|
|
48
|
+
const runsStats = await fs.lstat(devflowRunsDir).catch(() => null);
|
|
49
|
+
if (runsStats?.isDirectory()) {
|
|
50
|
+
const runEntries = (await fs.readdir(devflowRunsDir)).sort().reverse();
|
|
51
|
+
for (const runDirName of runEntries) {
|
|
52
|
+
const runDirPath = path.join(devflowRunsDir, runDirName);
|
|
53
|
+
const dirStats = await fs.lstat(runDirPath).catch(() => null);
|
|
54
|
+
if (!dirStats?.isDirectory())
|
|
55
|
+
continue;
|
|
56
|
+
const specPath = path.join(runDirPath, "spec.md");
|
|
57
|
+
const specStats = await fs.lstat(specPath).catch(() => null);
|
|
58
|
+
if (specStats?.isFile()) {
|
|
59
|
+
const specContent = await fs.readFile(specPath, "utf8");
|
|
60
|
+
const parsed = parseCurrentWork(specContent);
|
|
61
|
+
if (parsed.state === "active") {
|
|
62
|
+
parsed.runId = runDirName;
|
|
63
|
+
return parsed;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Continue to legacy fallback
|
|
71
|
+
}
|
|
72
|
+
// Fallback to legacy current-feature.md
|
|
73
|
+
const legacyPath = path.join(projectRoot, LEGACY_FEATURE_PATH);
|
|
74
|
+
try {
|
|
75
|
+
const stats = await fs.lstat(legacyPath);
|
|
76
|
+
if (stats.isFile()) {
|
|
77
|
+
const content = await fs.readFile(legacyPath, "utf8");
|
|
78
|
+
return parseCurrentWork(content);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Return idle
|
|
83
|
+
}
|
|
84
|
+
return idleSummary();
|
|
85
|
+
}
|
|
86
|
+
function parseCurrentWork(markdown) {
|
|
87
|
+
if (markdown.trim() === "") {
|
|
88
|
+
return malformedSummary({
|
|
89
|
+
code: "empty_current_work",
|
|
90
|
+
message: "Current work file is empty."
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (markdown.includes(RESET_MARKER)) {
|
|
94
|
+
return idleSummary();
|
|
95
|
+
}
|
|
96
|
+
const heading = markdown.match(/^#\s+(.+)$/m)?.[1]?.trim() || null;
|
|
97
|
+
const headingIdentity = heading?.match(/^(Feature|Fix|Rollback|Stage|Spec):\s*(.+)$/i);
|
|
98
|
+
const explicitType = markdown.match(/^\*\*Type:\*\*\s*(Feature|Fix|Rollback|Stage|Spec)\s*$/im)?.[1];
|
|
99
|
+
const typeLabel = explicitType || headingIdentity?.[1] || null;
|
|
100
|
+
const type = normalizeWorkType(typeLabel);
|
|
101
|
+
const title = headingIdentity?.[2]?.trim() || heading;
|
|
102
|
+
const status = markdown.match(/^\*\*Status:\*\*\s*(.+)$/im)?.[1]?.trim() || null;
|
|
103
|
+
const runId = markdown.match(/^\*\*Running ID:\*\*\s*`?([A-Za-z0-9-_]+)`?/im)?.[1] || null;
|
|
104
|
+
const steps = parseChecklistSteps(markdown);
|
|
105
|
+
const warnings = [];
|
|
106
|
+
if (!title) {
|
|
107
|
+
warnings.push({
|
|
108
|
+
code: "malformed_current_work",
|
|
109
|
+
message: "Current work does not contain a recognizable title."
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const normalizedSteps = steps || [];
|
|
113
|
+
const completed = normalizedSteps.filter((step) => step.checked).length;
|
|
114
|
+
return {
|
|
115
|
+
state: warnings.length > 0 ? "malformed" : "active",
|
|
116
|
+
type: type || "feature",
|
|
117
|
+
title,
|
|
118
|
+
status,
|
|
119
|
+
runId,
|
|
120
|
+
steps: normalizedSteps,
|
|
121
|
+
completed,
|
|
122
|
+
remaining: normalizedSteps.length - completed,
|
|
123
|
+
total: normalizedSteps.length,
|
|
124
|
+
nextStep: normalizedSteps.find((step) => !step.checked) || null,
|
|
125
|
+
warnings
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function parseChecklistWork(markdown, runId) {
|
|
129
|
+
const steps = parseChecklistSteps(markdown) || [];
|
|
130
|
+
const completed = steps.filter((step) => step.checked).length;
|
|
131
|
+
const heading = markdown.match(/^#\s+(.+)$/m)?.[1]?.trim() || "Implementation";
|
|
132
|
+
return {
|
|
133
|
+
state: "active",
|
|
134
|
+
type: "stage",
|
|
135
|
+
title: heading,
|
|
136
|
+
status: "In Progress",
|
|
137
|
+
runId,
|
|
138
|
+
steps,
|
|
139
|
+
completed,
|
|
140
|
+
remaining: steps.length - completed,
|
|
141
|
+
total: steps.length,
|
|
142
|
+
nextStep: steps.find((step) => !step.checked) || null,
|
|
143
|
+
warnings: []
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
function parseChecklistSteps(markdown) {
|
|
147
|
+
const lines = markdown.split(/\r?\n/);
|
|
148
|
+
const candidates = [];
|
|
149
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
150
|
+
const line = lines[index] || "";
|
|
151
|
+
const match = line.match(CHECKBOX_PATTERN);
|
|
152
|
+
if (!match) {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const marker = match[1] || "";
|
|
156
|
+
const content = match[2] || "";
|
|
157
|
+
candidates.push({
|
|
158
|
+
checked: marker.toLowerCase() === "x",
|
|
159
|
+
line: index + 1,
|
|
160
|
+
title: parseStepTitle(content)
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return candidates.length > 0 ? candidates : null;
|
|
164
|
+
}
|
|
165
|
+
function parseStepTitle(content) {
|
|
166
|
+
const boldTitle = content.match(/^\*\*(.+?)\*\*/)?.[1];
|
|
167
|
+
const label = boldTitle || content.split(/\s+-\s+/, 1)[0] || content;
|
|
168
|
+
return label.replace(/^Step\s+\d+\s*[-:]\s*/i, "").trim();
|
|
169
|
+
}
|
|
170
|
+
function normalizeWorkType(value) {
|
|
171
|
+
const normalized = value?.toLowerCase();
|
|
172
|
+
if (normalized === "feature" || normalized === "fix" || normalized === "rollback" || normalized === "stage" || normalized === "spec") {
|
|
173
|
+
return normalized === "spec" ? "feature" : normalized;
|
|
174
|
+
}
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
function idleSummary() {
|
|
178
|
+
return {
|
|
179
|
+
state: "idle",
|
|
180
|
+
type: null,
|
|
181
|
+
title: null,
|
|
182
|
+
status: null,
|
|
183
|
+
runId: null,
|
|
184
|
+
steps: [],
|
|
185
|
+
completed: 0,
|
|
186
|
+
remaining: 0,
|
|
187
|
+
total: 0,
|
|
188
|
+
nextStep: null,
|
|
189
|
+
warnings: []
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function malformedSummary(warning) {
|
|
193
|
+
return {
|
|
194
|
+
...idleSummary(),
|
|
195
|
+
state: "malformed",
|
|
196
|
+
warnings: [warning]
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
function getErrorCode(error) {
|
|
200
|
+
return typeof error === "object" &&
|
|
201
|
+
error !== null &&
|
|
202
|
+
"code" in error &&
|
|
203
|
+
typeof error.code === "string"
|
|
204
|
+
? error.code
|
|
205
|
+
: undefined;
|
|
206
|
+
}
|
|
207
|
+
export { CURRENT_STAGE_PATH, parseCurrentWork, readCurrentWork };
|
|
208
|
+
//# sourceMappingURL=current-work.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"current-work.js","sourceRoot":"","sources":["../../lib/current-work.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
type FindingSeverity = "P0" | "P1" | "P2" | "P3";
|
|
2
|
+
type FindingStatus = "unverified" | "open" | "fixed" | "closed" | "accepted" | "invalid";
|
|
3
|
+
interface Finding {
|
|
4
|
+
id: string;
|
|
5
|
+
severity: FindingSeverity;
|
|
6
|
+
status: FindingStatus;
|
|
7
|
+
title: string;
|
|
8
|
+
line: number;
|
|
9
|
+
}
|
|
10
|
+
type FindingsWarningCode = "invalid_findings_path" | "malformed_findings" | "unsafe_findings_path";
|
|
11
|
+
interface FindingsWarning {
|
|
12
|
+
code: FindingsWarningCode;
|
|
13
|
+
message: string;
|
|
14
|
+
}
|
|
15
|
+
interface FindingsSummary {
|
|
16
|
+
items: Finding[];
|
|
17
|
+
total: number;
|
|
18
|
+
byStatus: Record<FindingStatus, number>;
|
|
19
|
+
blockers: Finding[];
|
|
20
|
+
warnings: FindingsWarning[];
|
|
21
|
+
}
|
|
22
|
+
declare const DEVFLOW_FINDINGS_PATH: string;
|
|
23
|
+
declare function readFindings(projectRoot: string): Promise<FindingsSummary>;
|
|
24
|
+
declare function parseFindings(markdown: string): FindingsSummary;
|
|
25
|
+
export { DEVFLOW_FINDINGS_PATH, parseFindings, readFindings };
|
|
26
|
+
export type { Finding, FindingSeverity, FindingsSummary, FindingStatus, FindingsWarning, FindingsWarningCode };
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const DEVFLOW_FINDINGS_PATH = path.join("devflow", "context", "findings.md");
|
|
4
|
+
const BLUEPRINT_FINDINGS_PATH = path.join("blueprint", "context", "findings.md");
|
|
5
|
+
const FINDING_PATTERN = /^###\s+(\S+)\s+\[(P[0-3])\]\s+(unverified|open|fixed|closed|accepted|invalid)\s+-\s+(.+?)\s*$/i;
|
|
6
|
+
async function readFindings(projectRoot) {
|
|
7
|
+
let findingsPath = path.join(projectRoot, DEVFLOW_FINDINGS_PATH);
|
|
8
|
+
try {
|
|
9
|
+
let stats = await fs.lstat(findingsPath);
|
|
10
|
+
if (!stats.isFile()) {
|
|
11
|
+
const altPath = path.join(projectRoot, BLUEPRINT_FINDINGS_PATH);
|
|
12
|
+
const altStats = await fs.lstat(altPath).catch(() => null);
|
|
13
|
+
if (altStats?.isFile()) {
|
|
14
|
+
findingsPath = altPath;
|
|
15
|
+
stats = altStats;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (stats.isSymbolicLink()) {
|
|
19
|
+
return emptySummary({
|
|
20
|
+
code: "unsafe_findings_path",
|
|
21
|
+
message: "Findings file is a symbolic link and was not read."
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
if (!stats.isFile()) {
|
|
25
|
+
return emptySummary({
|
|
26
|
+
code: "invalid_findings_path",
|
|
27
|
+
message: "Findings path is not a regular file."
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return parseFindings(await fs.readFile(findingsPath, "utf8"));
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (getErrorCode(error) === "ENOENT") {
|
|
34
|
+
try {
|
|
35
|
+
const altPath = path.join(projectRoot, BLUEPRINT_FINDINGS_PATH);
|
|
36
|
+
const altContent = await fs.readFile(altPath, "utf8");
|
|
37
|
+
return parseFindings(altContent);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return emptySummary();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function parseFindings(markdown) {
|
|
47
|
+
const items = [];
|
|
48
|
+
let malformed = false;
|
|
49
|
+
for (const [index, line] of markdown.split(/\r?\n/).entries()) {
|
|
50
|
+
const match = line.match(FINDING_PATTERN);
|
|
51
|
+
if (match) {
|
|
52
|
+
items.push({
|
|
53
|
+
id: match[1] || "",
|
|
54
|
+
severity: (match[2] || "").toUpperCase(),
|
|
55
|
+
status: (match[3] || "").toLowerCase(),
|
|
56
|
+
title: (match[4] || "").trim(),
|
|
57
|
+
line: index + 1
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
else if (/^###\s+\S+\s+\[P/i.test(line)) {
|
|
61
|
+
malformed = true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const byStatus = createStatusCounts();
|
|
65
|
+
for (const finding of items) {
|
|
66
|
+
byStatus[finding.status] += 1;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
items,
|
|
70
|
+
total: items.length,
|
|
71
|
+
byStatus,
|
|
72
|
+
blockers: items.filter((finding) => (finding.severity === "P0" || finding.severity === "P1") &&
|
|
73
|
+
(finding.status === "open" || finding.status === "fixed")),
|
|
74
|
+
warnings: malformed
|
|
75
|
+
? [{
|
|
76
|
+
code: "malformed_findings",
|
|
77
|
+
message: "One or more finding headings do not match the required ledger format."
|
|
78
|
+
}]
|
|
79
|
+
: []
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function createStatusCounts() {
|
|
83
|
+
return {
|
|
84
|
+
unverified: 0,
|
|
85
|
+
open: 0,
|
|
86
|
+
fixed: 0,
|
|
87
|
+
closed: 0,
|
|
88
|
+
accepted: 0,
|
|
89
|
+
invalid: 0
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function emptySummary(warning) {
|
|
93
|
+
return {
|
|
94
|
+
items: [],
|
|
95
|
+
total: 0,
|
|
96
|
+
byStatus: createStatusCounts(),
|
|
97
|
+
blockers: [],
|
|
98
|
+
warnings: warning ? [warning] : []
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function getErrorCode(error) {
|
|
102
|
+
return typeof error === "object" &&
|
|
103
|
+
error !== null &&
|
|
104
|
+
"code" in error &&
|
|
105
|
+
typeof error.code === "string"
|
|
106
|
+
? error.code
|
|
107
|
+
: undefined;
|
|
108
|
+
}
|
|
109
|
+
export { DEVFLOW_FINDINGS_PATH, parseFindings, readFindings };
|
|
110
|
+
//# sourceMappingURL=findings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findings.js","sourceRoot":"","sources":["../../lib/findings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface GitStatusSummary {
|
|
2
|
+
available: boolean;
|
|
3
|
+
branch: string | null;
|
|
4
|
+
clean: boolean | null;
|
|
5
|
+
changedFiles: number;
|
|
6
|
+
lastCommit: string | null;
|
|
7
|
+
upstream: string | null;
|
|
8
|
+
ahead: number | null;
|
|
9
|
+
behind: number | null;
|
|
10
|
+
}
|
|
11
|
+
declare function readGitStatus(projectRoot: string): Promise<GitStatusSummary>;
|
|
12
|
+
export { readGitStatus };
|
|
13
|
+
export type { GitStatusSummary };
|