specweave 1.0.263 β 1.0.265
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.md +25 -25
- package/dist/src/cli/commands/docs.d.ts.map +1 -1
- package/dist/src/cli/commands/docs.js +13 -5
- package/dist/src/cli/commands/docs.js.map +1 -1
- package/dist/src/core/living-docs/content-distributor.js +1 -1
- package/dist/src/core/living-docs/content-distributor.js.map +1 -1
- package/dist/src/core/living-docs/scaffolding/template-engine.js +1 -1
- package/dist/src/core/living-docs/scaffolding/template-engine.js.map +1 -1
- package/dist/src/core/living-docs/sync-helpers/generators.js +1 -1
- package/dist/src/core/living-docs/sync-helpers/generators.js.map +1 -1
- package/dist/src/core/llm/consent.d.ts +33 -0
- package/dist/src/core/llm/consent.d.ts.map +1 -0
- package/dist/src/core/llm/consent.js +94 -0
- package/dist/src/core/llm/consent.js.map +1 -0
- package/dist/src/core/llm/provider-factory.d.ts +2 -0
- package/dist/src/core/llm/provider-factory.d.ts.map +1 -1
- package/dist/src/core/llm/provider-factory.js +12 -0
- package/dist/src/core/llm/provider-factory.js.map +1 -1
- package/dist/src/core/llm/types.d.ts +17 -0
- package/dist/src/core/llm/types.d.ts.map +1 -1
- package/dist/src/core/llm/types.js.map +1 -1
- package/dist/src/core/skills/skill-judge.d.ts.map +1 -1
- package/dist/src/core/skills/skill-judge.js +14 -0
- package/dist/src/core/skills/skill-judge.js.map +1 -1
- package/dist/src/utils/docs-preview/config-generator.d.ts +14 -6
- package/dist/src/utils/docs-preview/config-generator.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/config-generator.js +526 -137
- package/dist/src/utils/docs-preview/config-generator.js.map +1 -1
- package/dist/src/utils/docs-preview/docusaurus-setup.d.ts +1 -1
- package/dist/src/utils/docs-preview/docusaurus-setup.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/docusaurus-setup.js +121 -48
- package/dist/src/utils/docs-preview/docusaurus-setup.js.map +1 -1
- package/dist/src/utils/docs-preview/index.d.ts +3 -2
- package/dist/src/utils/docs-preview/index.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/index.js +3 -2
- package/dist/src/utils/docs-preview/index.js.map +1 -1
- package/dist/src/utils/docs-preview/project-detector.d.ts +16 -0
- package/dist/src/utils/docs-preview/project-detector.d.ts.map +1 -0
- package/dist/src/utils/docs-preview/project-detector.js +234 -0
- package/dist/src/utils/docs-preview/project-detector.js.map +1 -0
- package/dist/src/utils/docs-preview/server-manager.d.ts +4 -0
- package/dist/src/utils/docs-preview/server-manager.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/server-manager.js +102 -7
- package/dist/src/utils/docs-preview/server-manager.js.map +1 -1
- package/dist/src/utils/docs-preview/types.d.ts +28 -0
- package/dist/src/utils/docs-preview/types.d.ts.map +1 -1
- package/package.json +1 -6
- package/plugins/specweave/scripts/progress.js +148 -50
- package/plugins/specweave/scripts/read-progress.sh +128 -52
- package/plugins/specweave/scripts/rebuild-dashboard-cache.sh +23 -17
- package/plugins/specweave/skills/done/SKILL.md +5 -4
- package/plugins/specweave/skills/judge-llm/SKILL.md +18 -0
- package/plugins/specweave/skills/progress/SKILL.md +7 -21
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-detector.js","sourceRoot":"","sources":["../../../../src/utils/docs-preview/project-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,10 @@ export declare function openBrowserUrl(url: string): Promise<void>;
|
|
|
19
19
|
* Kill all Docusaurus processes (SAFE - uses execFileNoThrow)
|
|
20
20
|
*/
|
|
21
21
|
export declare function killAllDocusaurusProcesses(): Promise<number>;
|
|
22
|
+
/**
|
|
23
|
+
* Kill process occupying a specific port
|
|
24
|
+
*/
|
|
25
|
+
export declare function killProcessOnPort(port: number): Promise<boolean>;
|
|
22
26
|
/**
|
|
23
27
|
* Check if Docusaurus server is running
|
|
24
28
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-manager.d.ts","sourceRoot":"","sources":["../../../../src/utils/docs-preview/server-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,GAAE,MAAa,EAAE,OAAO,GAAE,MAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAQzG;AAsBD;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"server-manager.d.ts","sourceRoot":"","sources":["../../../../src/utils/docs-preview/server-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,GAAE,MAAa,EAAE,OAAO,GAAE,MAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAQzG;AAsBD;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAwEtG;AA8GD;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/D;AAED;;GAEG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,MAAM,CAAC,CAwDlE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgCtE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAExE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAoB,GAAG,MAAM,CAE7E"}
|
|
@@ -42,35 +42,94 @@ export async function startDevServer(targetDir, options) {
|
|
|
42
42
|
throw new Error(`Port ${port} is already in use`);
|
|
43
43
|
}
|
|
44
44
|
// Start Docusaurus dev server
|
|
45
|
-
const
|
|
45
|
+
const childProc = spawn('npm', ['run', 'start', '--', '--port', port.toString(), '--host', host], {
|
|
46
46
|
cwd: targetDir,
|
|
47
47
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
48
48
|
shell: true
|
|
49
49
|
});
|
|
50
|
+
// Collect stderr for diagnostics on failure (capped to prevent unbounded growth)
|
|
51
|
+
const STDERR_MAX = 8192;
|
|
52
|
+
let stderrOutput = '';
|
|
53
|
+
childProc.stderr?.on('data', (data) => {
|
|
54
|
+
if (stderrOutput.length < STDERR_MAX) {
|
|
55
|
+
stderrOutput += data.toString();
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
// Forward key stdout lines so users see Docusaurus compilation progress
|
|
59
|
+
// Filter out verbose warnings (broken links, deprecations) to keep output clean
|
|
60
|
+
childProc.stdout?.on('data', (data) => {
|
|
61
|
+
const lines = data.toString().split('\n');
|
|
62
|
+
for (const raw of lines) {
|
|
63
|
+
const line = raw.trim();
|
|
64
|
+
if (!line)
|
|
65
|
+
continue;
|
|
66
|
+
// Only show progress-relevant lines, skip verbose warnings
|
|
67
|
+
if (line.includes('[WARNING]'))
|
|
68
|
+
continue;
|
|
69
|
+
console.log(` ${line}`);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
// Track whether the process has exited
|
|
73
|
+
let processExited = false;
|
|
74
|
+
let exitCode = null;
|
|
75
|
+
childProc.on('exit', (code) => {
|
|
76
|
+
processExited = true;
|
|
77
|
+
exitCode = code;
|
|
78
|
+
});
|
|
50
79
|
const url = `http://${host}:${port}`;
|
|
51
|
-
// Wait for server to be ready
|
|
52
|
-
//
|
|
53
|
-
await waitForServer(url,
|
|
80
|
+
// Wait for server to be ready (fail fast if process crashes)
|
|
81
|
+
// 180s timeout for very large doc sites on slow machines; crash detection makes this a soft ceiling
|
|
82
|
+
await waitForServer(url, 180000, () => {
|
|
83
|
+
if (processExited) {
|
|
84
|
+
const errorSnippet = extractErrorFromOutput(stderrOutput);
|
|
85
|
+
throw new Error(`Docusaurus process exited with code ${exitCode} before server was ready.` +
|
|
86
|
+
(errorSnippet ? `\n\nError details:\n${errorSnippet}` : '\n\nRun manually for full output: cd .specweave/docs-site-internal && npx docusaurus start'));
|
|
87
|
+
}
|
|
88
|
+
});
|
|
54
89
|
// Open browser if requested
|
|
55
90
|
if (openBrowser) {
|
|
56
91
|
await openBrowserUrl(url);
|
|
57
92
|
}
|
|
58
93
|
return {
|
|
59
|
-
pid:
|
|
94
|
+
pid: childProc.pid,
|
|
60
95
|
port,
|
|
61
96
|
url,
|
|
62
97
|
stop: async () => {
|
|
63
|
-
await stopServer(
|
|
98
|
+
await stopServer(childProc);
|
|
64
99
|
}
|
|
65
100
|
};
|
|
66
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Extract meaningful error message from Docusaurus stderr output
|
|
104
|
+
*/
|
|
105
|
+
function extractErrorFromOutput(output) {
|
|
106
|
+
if (!output)
|
|
107
|
+
return '';
|
|
108
|
+
// Look for [ERROR] lines which Docusaurus uses for fatal errors
|
|
109
|
+
const errorLines = output.split('\n').filter(line => line.includes('[ERROR]') || line.includes('Error:') || line.includes('YAMLException'));
|
|
110
|
+
if (errorLines.length > 0) {
|
|
111
|
+
return errorLines.slice(0, 5).join('\n');
|
|
112
|
+
}
|
|
113
|
+
// Return last meaningful lines if no specific error pattern found
|
|
114
|
+
const lines = output.trim().split('\n').filter(l => l.trim());
|
|
115
|
+
return lines.slice(-5).join('\n');
|
|
116
|
+
}
|
|
67
117
|
/**
|
|
68
118
|
* Wait for server to be ready
|
|
119
|
+
* @param checkProcessAlive - Optional callback that throws if the server process has crashed
|
|
69
120
|
*/
|
|
70
|
-
function waitForServer(url, timeout) {
|
|
121
|
+
function waitForServer(url, timeout, checkProcessAlive) {
|
|
71
122
|
return new Promise((resolve, reject) => {
|
|
72
123
|
const startTime = Date.now();
|
|
73
124
|
const check = async () => {
|
|
125
|
+
// Check if process crashed before making HTTP request
|
|
126
|
+
try {
|
|
127
|
+
checkProcessAlive?.();
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
reject(err);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
74
133
|
try {
|
|
75
134
|
const http = await import('http');
|
|
76
135
|
const urlObj = new URL(url);
|
|
@@ -198,6 +257,42 @@ export async function killAllDocusaurusProcesses() {
|
|
|
198
257
|
return 0;
|
|
199
258
|
}
|
|
200
259
|
}
|
|
260
|
+
/**
|
|
261
|
+
* Kill process occupying a specific port
|
|
262
|
+
*/
|
|
263
|
+
export async function killProcessOnPort(port) {
|
|
264
|
+
const platform = process.platform;
|
|
265
|
+
try {
|
|
266
|
+
if (platform === 'win32') {
|
|
267
|
+
const result = await execFileNoThrow('netstat', ['-ano']);
|
|
268
|
+
if (!result.success)
|
|
269
|
+
return false;
|
|
270
|
+
const lines = result.stdout.split('\n')
|
|
271
|
+
.filter(line => line.includes(`:${port}`) && line.includes('LISTENING'));
|
|
272
|
+
for (const line of lines) {
|
|
273
|
+
const parts = line.trim().split(/\s+/);
|
|
274
|
+
const pid = parts[parts.length - 1];
|
|
275
|
+
if (pid && /^\d+$/.test(pid)) {
|
|
276
|
+
await execFileNoThrow('taskkill', ['/F', '/PID', pid]);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return lines.length > 0;
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
const result = await execFileNoThrow('lsof', ['-ti', `:${port}`]);
|
|
283
|
+
if (!result.success || !result.stdout.trim())
|
|
284
|
+
return false;
|
|
285
|
+
const pids = result.stdout.trim().split('\n').filter(p => p.trim());
|
|
286
|
+
for (const pid of pids) {
|
|
287
|
+
await execFileNoThrow('kill', ['-9', pid.trim()]);
|
|
288
|
+
}
|
|
289
|
+
return pids.length > 0;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
201
296
|
/**
|
|
202
297
|
* Check if Docusaurus server is running
|
|
203
298
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-manager.js","sourceRoot":"","sources":["../../../../src/utils/docs-preview/server-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAgB,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,YAAoB,IAAI,EAAE,UAAkB,IAAI;IACtF,KAAK,IAAI,IAAI,GAAG,SAAS,EAAE,IAAI,IAAI,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QACnD,IAAI,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAElC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAiB,EAAE,OAAsB;IAC5E,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC;IAE1D,6BAA6B;IAC7B,IAAI,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,oBAAoB,CAAC,CAAC;IACpD,CAAC;IAED,8BAA8B;IAC9B,MAAM,
|
|
1
|
+
{"version":3,"file":"server-manager.js","sourceRoot":"","sources":["../../../../src/utils/docs-preview/server-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,29 @@
|
|
|
1
|
+
export interface DocCategory {
|
|
2
|
+
/** Folder name (e.g., 'strategy') */
|
|
3
|
+
id: string;
|
|
4
|
+
/** Human-readable label (e.g., 'Strategy') */
|
|
5
|
+
label: string;
|
|
6
|
+
/** Short description for landing page */
|
|
7
|
+
description: string;
|
|
8
|
+
/** Emoji icon for the category */
|
|
9
|
+
icon: string;
|
|
10
|
+
/** Number of markdown documents found */
|
|
11
|
+
docCount: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ProjectMetadata {
|
|
14
|
+
/** Project name */
|
|
15
|
+
name: string;
|
|
16
|
+
/** Project description / tagline */
|
|
17
|
+
description: string;
|
|
18
|
+
/** 1-2 letter initials for logo generation */
|
|
19
|
+
initials: string;
|
|
20
|
+
/** Detected doc categories that actually exist */
|
|
21
|
+
categories: DocCategory[];
|
|
22
|
+
/** Source of the project name detection */
|
|
23
|
+
source: 'config' | 'package' | 'directory';
|
|
24
|
+
/** Path to custom logo file if found */
|
|
25
|
+
logoPath?: string;
|
|
26
|
+
}
|
|
1
27
|
export interface DocusaurusConfig {
|
|
2
28
|
title: string;
|
|
3
29
|
tagline: string;
|
|
@@ -7,6 +33,8 @@ export interface DocusaurusConfig {
|
|
|
7
33
|
port?: number;
|
|
8
34
|
theme?: 'default' | 'classic' | 'dark';
|
|
9
35
|
excludeFolders?: string[];
|
|
36
|
+
/** Auto-detected project metadata */
|
|
37
|
+
projectMetadata?: ProjectMetadata;
|
|
10
38
|
}
|
|
11
39
|
export interface SidebarItem {
|
|
12
40
|
type: 'doc' | 'category';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/utils/docs-preview/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/utils/docs-preview/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,2CAA2C;IAC3C,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IAC3C,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,qCAAqC;IACrC,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,KAAK,GAAG,UAAU,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.265",
|
|
4
4
|
"description": "Spec-driven development framework for AI coding agents. First-class support for Claude Code β compatible with any LLM-powered coding tool. Living documentation, autonomous execution, quality gates, and multilingual support (9 languages).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -38,11 +38,6 @@
|
|
|
38
38
|
"validate:platforms": "node scripts/validation/validate-platforms.js",
|
|
39
39
|
"metrics:dora": "node dist/src/metrics/dora-calculator.js",
|
|
40
40
|
"generate:diagrams": "bash scripts/generation/generate-diagram-svgs.sh",
|
|
41
|
-
"docs:dev": "cd docs-site && npm start",
|
|
42
|
-
"docs:build": "cd docs-site && npm run build",
|
|
43
|
-
"docs:install": "cd docs-site && npm install --legacy-peer-deps",
|
|
44
|
-
"docs:internal": "cd docs-site && npm run start:internal",
|
|
45
|
-
"docs:internal:build": "cd docs-site && npm run build:internal",
|
|
46
41
|
"release:patch": "bash scripts/build/bump-version.sh patch",
|
|
47
42
|
"release:minor": "bash scripts/build/bump-version.sh minor",
|
|
48
43
|
"release:major": "bash scripts/build/bump-version.sh major",
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Instant Increment Progress
|
|
3
|
+
* Instant Increment Progress (Node.js fallback)
|
|
4
4
|
*
|
|
5
|
-
* Executed by UserPromptSubmit hook for /sw:progress
|
|
6
|
-
*
|
|
5
|
+
* Executed by UserPromptSubmit hook for /sw:progress when jq is unavailable.
|
|
6
|
+
* Reads files directly (no cache needed). Bypasses LLM entirely.
|
|
7
7
|
*
|
|
8
8
|
* Usage: node progress.js [incrementId] [--help]
|
|
9
9
|
*/
|
|
@@ -67,34 +67,80 @@ if (incrementFolders.length === 0) {
|
|
|
67
67
|
function parseIncrement(folder) {
|
|
68
68
|
const metaPath = path.join(incrementsDir, folder, 'metadata.json');
|
|
69
69
|
const tasksPath = path.join(incrementsDir, folder, 'tasks.md');
|
|
70
|
-
|
|
70
|
+
const specPath = path.join(incrementsDir, folder, 'spec.md');
|
|
71
|
+
|
|
71
72
|
let metadata = { status: 'unknown' };
|
|
72
73
|
if (fs.existsSync(metaPath)) {
|
|
73
74
|
try {
|
|
74
75
|
metadata = JSON.parse(fs.readFileSync(metaPath, 'utf-8'));
|
|
75
76
|
} catch {}
|
|
76
77
|
}
|
|
77
|
-
|
|
78
|
+
|
|
78
79
|
let totalTasks = 0;
|
|
79
80
|
let completedTasks = 0;
|
|
80
|
-
|
|
81
|
+
|
|
81
82
|
if (fs.existsSync(tasksPath)) {
|
|
82
83
|
const content = fs.readFileSync(tasksPath, 'utf-8');
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
84
|
+
const headingTasks = (content.match(/^#{2,} T-\d+/gm) || []).length;
|
|
85
|
+
const checklistTasks = (content.match(/^- \[[x ]\] T-\d+/gm) || []).length;
|
|
86
|
+
totalTasks = headingTasks + checklistTasks;
|
|
87
|
+
|
|
88
|
+
const completedStatus = (content.match(/\*\*Status\*\*:\s*\[x\]/gi) || []).length;
|
|
89
|
+
const completedDate = (content.match(/\*\*Completed\*\*:\s*\d/gi) || []).length;
|
|
90
|
+
const completedChecklist = (content.match(/^- \[x\] T-\d+/gm) || []).length;
|
|
91
|
+
completedTasks = completedStatus + completedDate + completedChecklist;
|
|
88
92
|
}
|
|
89
|
-
|
|
93
|
+
|
|
94
|
+
let totalAcs = 0;
|
|
95
|
+
let completedAcs = 0;
|
|
96
|
+
if (fs.existsSync(specPath)) {
|
|
97
|
+
const specContent = fs.readFileSync(specPath, 'utf-8');
|
|
98
|
+
const acMatches = specContent.match(/- \[.\] \*\*AC-/g);
|
|
99
|
+
totalAcs = acMatches ? acMatches.length : 0;
|
|
100
|
+
const acDone = specContent.match(/- \[x\] \*\*AC-/g);
|
|
101
|
+
completedAcs = acDone ? acDone.length : 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Get last activity from newest file mtime
|
|
105
|
+
let lastActivity = 0;
|
|
106
|
+
try {
|
|
107
|
+
if (fs.existsSync(metaPath)) lastActivity = Math.max(lastActivity, fs.statSync(metaPath).mtimeMs);
|
|
108
|
+
if (fs.existsSync(tasksPath)) lastActivity = Math.max(lastActivity, fs.statSync(tasksPath).mtimeMs);
|
|
109
|
+
if (fs.existsSync(specPath)) lastActivity = Math.max(lastActivity, fs.statSync(specPath).mtimeMs);
|
|
110
|
+
} catch {}
|
|
111
|
+
|
|
90
112
|
return {
|
|
91
113
|
id: folder,
|
|
92
114
|
status: metadata.status || 'unknown',
|
|
93
115
|
type: metadata.type || 'feature',
|
|
116
|
+
priority: metadata.priority || 'P1',
|
|
94
117
|
totalTasks,
|
|
95
118
|
completedTasks,
|
|
96
|
-
|
|
119
|
+
totalAcs,
|
|
120
|
+
completedAcs,
|
|
121
|
+
percentage: totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0,
|
|
122
|
+
lastActivity
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Helpers
|
|
127
|
+
function createProgressBar(pct, width = 20) {
|
|
128
|
+
const filled = Math.round((pct / 100) * width);
|
|
129
|
+
const empty = width - filled;
|
|
130
|
+
return `[${'β'.repeat(filled)}${'β'.repeat(empty)}]`;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function formatStatus(status) {
|
|
134
|
+
const icons = {
|
|
135
|
+
'active': 'π active',
|
|
136
|
+
'planning': 'π planning',
|
|
137
|
+
'backlog': 'π backlog',
|
|
138
|
+
'ready_for_review': 'π ready for review',
|
|
139
|
+
'paused': 'βΈοΈ paused',
|
|
140
|
+
'completed': 'β
completed',
|
|
141
|
+
'abandoned': 'β abandoned'
|
|
97
142
|
};
|
|
143
|
+
return icons[status] || status;
|
|
98
144
|
}
|
|
99
145
|
|
|
100
146
|
// If specific increment requested
|
|
@@ -104,67 +150,139 @@ if (specificId) {
|
|
|
104
150
|
console.log(`Increment not found: ${specificId}`);
|
|
105
151
|
process.exit(1);
|
|
106
152
|
}
|
|
107
|
-
|
|
153
|
+
|
|
108
154
|
const inc = parseIncrement(folder);
|
|
109
155
|
const bar = createProgressBar(inc.percentage);
|
|
110
|
-
|
|
156
|
+
|
|
111
157
|
console.log(`\nπ Progress: ${inc.id}\n`);
|
|
112
158
|
console.log(`Status: ${formatStatus(inc.status)}`);
|
|
113
159
|
console.log(`Type: ${inc.type}`);
|
|
114
160
|
console.log(`Tasks: ${inc.completedTasks}/${inc.totalTasks} (${inc.percentage}%)`);
|
|
115
161
|
console.log(`Progress: ${bar}`);
|
|
162
|
+
if (inc.totalAcs > 0) {
|
|
163
|
+
const acPct = Math.round((inc.completedAcs / inc.totalAcs) * 100);
|
|
164
|
+
console.log(`ACs: ${inc.completedAcs}/${inc.totalAcs} (${acPct}%)`);
|
|
165
|
+
}
|
|
116
166
|
process.exit(0);
|
|
117
167
|
}
|
|
118
168
|
|
|
119
169
|
// Show all active increments
|
|
120
170
|
const increments = incrementFolders.map(parseIncrement);
|
|
121
|
-
|
|
122
|
-
|
|
171
|
+
|
|
172
|
+
// Categorize increments
|
|
173
|
+
const needsClosure = increments
|
|
174
|
+
.filter(i => ['active', 'planning', 'planned'].includes(i.status) && i.totalTasks > 0 && i.completedTasks === i.totalTasks)
|
|
175
|
+
.sort((a, b) => b.lastActivity - a.lastActivity);
|
|
176
|
+
|
|
177
|
+
const readyForReview = increments
|
|
178
|
+
.filter(i => i.status === 'ready_for_review')
|
|
179
|
+
.sort((a, b) => b.lastActivity - a.lastActivity);
|
|
180
|
+
|
|
181
|
+
const active = increments
|
|
182
|
+
.filter(i => ['active', 'planning', 'planned'].includes(i.status) &&
|
|
183
|
+
(i.totalTasks > 0 || i.totalAcs > 0) &&
|
|
184
|
+
!(i.totalTasks > 0 && i.completedTasks === i.totalTasks))
|
|
185
|
+
.sort((a, b) => b.lastActivity - a.lastActivity);
|
|
186
|
+
|
|
187
|
+
const emptyActive = increments
|
|
188
|
+
.filter(i => ['active', 'planning', 'planned'].includes(i.status) && i.totalTasks === 0 && i.totalAcs === 0);
|
|
189
|
+
|
|
190
|
+
const backlog = increments
|
|
191
|
+
.filter(i => i.status === 'backlog')
|
|
192
|
+
.sort((a, b) => b.lastActivity - a.lastActivity);
|
|
193
|
+
|
|
123
194
|
const paused = increments.filter(i => i.status === 'paused');
|
|
124
195
|
|
|
125
196
|
console.log('\nπ Increment Progress\n');
|
|
126
197
|
|
|
127
|
-
//
|
|
198
|
+
// Section 1: Needs Closure
|
|
199
|
+
if (needsClosure.length > 0) {
|
|
200
|
+
console.log('β οΈ Needs Closure (100% tasks done):');
|
|
201
|
+
for (const inc of needsClosure) {
|
|
202
|
+
console.log(` ${inc.id} β /sw:done ${inc.id}`);
|
|
203
|
+
}
|
|
204
|
+
console.log('');
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Section 2: Ready for Review
|
|
128
208
|
if (readyForReview.length > 0) {
|
|
129
|
-
console.log(
|
|
209
|
+
console.log('π Ready for Review:');
|
|
130
210
|
for (const inc of readyForReview) {
|
|
131
|
-
const bar = createProgressBar(inc.percentage,
|
|
132
|
-
|
|
133
|
-
|
|
211
|
+
const bar = createProgressBar(inc.percentage, 12);
|
|
212
|
+
const priBadge = inc.priority === 'P0' ? 'π΄' : inc.priority === 'P1' ? 'π ' : '';
|
|
213
|
+
let acInfo = '';
|
|
214
|
+
if (inc.totalAcs > 0) {
|
|
215
|
+
const acPct = Math.round((inc.completedAcs / inc.totalAcs) * 100);
|
|
216
|
+
acInfo = ` | ${inc.completedAcs}/${inc.totalAcs} ACs (${acPct}%)`;
|
|
217
|
+
}
|
|
218
|
+
console.log(` ${priBadge} ${inc.id}`);
|
|
219
|
+
console.log(` ${bar} ${inc.completedTasks}/${inc.totalTasks} tasks${acInfo}`);
|
|
134
220
|
console.log(` β /sw:done ${inc.id}`);
|
|
135
221
|
}
|
|
136
222
|
console.log('');
|
|
137
223
|
}
|
|
138
224
|
|
|
225
|
+
// Section 3: Active (with work, not done, not empty)
|
|
139
226
|
if (active.length > 0) {
|
|
140
|
-
console.log(
|
|
227
|
+
console.log('π Active:');
|
|
141
228
|
for (const inc of active) {
|
|
142
|
-
const bar = createProgressBar(inc.percentage,
|
|
143
|
-
|
|
144
|
-
|
|
229
|
+
const bar = createProgressBar(inc.percentage, 12);
|
|
230
|
+
const priBadge = inc.priority === 'P0' ? 'π΄' : inc.priority === 'P1' ? 'π ' : '';
|
|
231
|
+
const statusInd = ['planning', 'planned'].includes(inc.status) ? ' (π planning)' : '';
|
|
232
|
+
let acInfo = '';
|
|
233
|
+
if (inc.totalAcs > 0) {
|
|
234
|
+
const acPct = Math.round((inc.completedAcs / inc.totalAcs) * 100);
|
|
235
|
+
acInfo = ` | ${inc.completedAcs}/${inc.totalAcs} ACs (${acPct}%)`;
|
|
236
|
+
}
|
|
237
|
+
console.log(` ${priBadge} ${inc.id}${statusInd}`);
|
|
238
|
+
console.log(` ${bar} ${inc.completedTasks}/${inc.totalTasks} tasks${acInfo}`);
|
|
145
239
|
}
|
|
146
240
|
console.log('');
|
|
147
241
|
}
|
|
148
242
|
|
|
243
|
+
// Section 4: Planning (no tasks) β collapsed
|
|
244
|
+
if (emptyActive.length > 0) {
|
|
245
|
+
const ids = emptyActive.map(i => i.id).join(', ');
|
|
246
|
+
console.log(`π Planning (no tasks): ${ids}`);
|
|
247
|
+
console.log('');
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Section 5: Backlog
|
|
251
|
+
if (backlog.length > 0) {
|
|
252
|
+
console.log('π Backlog:');
|
|
253
|
+
for (const inc of backlog) {
|
|
254
|
+
const priBadge = inc.priority === 'P0' ? 'π΄' : inc.priority === 'P1' ? 'π ' : '';
|
|
255
|
+
console.log(` ${priBadge} ${inc.id} - ${inc.percentage}% planned`);
|
|
256
|
+
}
|
|
257
|
+
console.log('');
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// Section 6: Paused
|
|
149
261
|
if (paused.length > 0) {
|
|
150
262
|
console.log(`βΈοΈ Paused (${paused.length}):`);
|
|
151
263
|
for (const inc of paused) {
|
|
152
|
-
console.log(` ${inc.id} - ${inc.percentage}
|
|
264
|
+
console.log(` ${inc.id} - ${inc.percentage}% tasks`);
|
|
153
265
|
}
|
|
154
266
|
console.log('');
|
|
155
267
|
}
|
|
156
268
|
|
|
157
|
-
// Summary
|
|
158
|
-
|
|
269
|
+
// Summary
|
|
270
|
+
const totalActionable = needsClosure.length + readyForReview.length + active.length + emptyActive.length + backlog.length + paused.length;
|
|
271
|
+
if (totalActionable > 0) {
|
|
159
272
|
console.log('β'.repeat(40));
|
|
160
273
|
const parts = [];
|
|
274
|
+
if (needsClosure.length > 0) parts.push(`${needsClosure.length} needs closure`);
|
|
161
275
|
if (readyForReview.length > 0) parts.push(`${readyForReview.length} ready for review`);
|
|
162
276
|
if (active.length > 0) parts.push(`${active.length} active`);
|
|
277
|
+
if (emptyActive.length > 0) parts.push(`${emptyActive.length} planning`);
|
|
278
|
+
if (backlog.length > 0) parts.push(`${backlog.length} backlog`);
|
|
163
279
|
if (paused.length > 0) parts.push(`${paused.length} paused`);
|
|
164
280
|
console.log(`Summary: ${parts.join(', ')}`);
|
|
165
281
|
console.log('');
|
|
166
282
|
|
|
167
|
-
if (
|
|
283
|
+
if (needsClosure.length > 0) {
|
|
284
|
+
console.log('π‘ Run /sw:done <id> to close completed increments');
|
|
285
|
+
} else if (readyForReview.length > 0) {
|
|
168
286
|
console.log('π‘ Run /sw:done <id> to close reviewed increments');
|
|
169
287
|
} else {
|
|
170
288
|
console.log('π‘ For details: /sw:progress <incrementId>');
|
|
@@ -178,23 +296,3 @@ if (readyForReview.length > 0 || active.length > 0 || paused.length > 0) {
|
|
|
178
296
|
console.log('');
|
|
179
297
|
console.log('π‘ Run /sw:increment to start new work');
|
|
180
298
|
}
|
|
181
|
-
|
|
182
|
-
// Helpers
|
|
183
|
-
function createProgressBar(pct, width = 20) {
|
|
184
|
-
const filled = Math.round((pct / 100) * width);
|
|
185
|
-
const empty = width - filled;
|
|
186
|
-
return `[${'β'.repeat(filled)}${'β'.repeat(empty)}]`;
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
function formatStatus(status) {
|
|
190
|
-
const icons = {
|
|
191
|
-
'active': 'π active',
|
|
192
|
-
'planning': 'π planning',
|
|
193
|
-
'backlog': 'π backlog',
|
|
194
|
-
'ready_for_review': 'π ready for review',
|
|
195
|
-
'paused': 'βΈοΈ paused',
|
|
196
|
-
'completed': 'β
completed',
|
|
197
|
-
'abandoned': 'β abandoned'
|
|
198
|
-
};
|
|
199
|
-
return icons[status] || status;
|
|
200
|
-
}
|