specweave 1.0.262 → 1.0.264
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 +31 -27
- package/dist/src/cli/commands/docs.js +4 -4
- package/dist/src/cli/commands/docs.js.map +1 -1
- package/dist/src/dashboard/server/dashboard-server.d.ts.map +1 -1
- package/dist/src/dashboard/server/dashboard-server.js +2 -1
- package/dist/src/dashboard/server/dashboard-server.js.map +1 -1
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts +9 -1
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts.map +1 -1
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.js +140 -13
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.js.map +1 -1
- package/dist/src/dashboard/server/data/plugin-scanner.d.ts +1 -1
- package/dist/src/dashboard/server/data/plugin-scanner.d.ts.map +1 -1
- package/dist/src/dashboard/server/data/plugin-scanner.js +2 -2
- package/dist/src/dashboard/server/data/plugin-scanner.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 +504 -126
- 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 +92 -48
- package/dist/src/utils/docs-preview/docusaurus-setup.js.map +1 -1
- package/dist/src/utils/docs-preview/index.d.ts +2 -1
- package/dist/src/utils/docs-preview/index.d.ts.map +1 -1
- package/dist/src/utils/docs-preview/index.js +2 -1
- 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 +215 -0
- package/dist/src/utils/docs-preview/project-detector.js.map +1 -0
- package/dist/src/utils/docs-preview/types.d.ts +26 -0
- package/dist/src/utils/docs-preview/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/hooks/hooks.json +9 -0
- package/plugins/specweave/hooks/v2/dispatchers/post-tool-use-analytics.sh +83 -0
- 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/scripts/track-analytics.sh +4 -0
- package/plugins/specweave/skills/progress/SKILL.md +7 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-generator.js","sourceRoot":"","sources":["../../../../src/utils/docs-preview/config-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAG/C;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAwB;IAC/D,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,GAAG,
|
|
1
|
+
{"version":3,"file":"config-generator.js","sourceRoot":"","sources":["../../../../src/utils/docs-preview/config-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAG/C;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAwB;IAC/D,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,EAAE,IAAI,IAAI,KAAK,CAAC;IAE1D,yDAAyD;IACzD,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,EAAE,UAAU,IAAI,EAAE,CAAC;IAC5D,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CACnD,4CAA4C,GAAG,CAAC,KAAK,6BAA6B,GAAG,CAAC,EAAE,qBAAqB,CAC9G,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEd,MAAM,gBAAgB,GAAG,WAAW;QAClC,CAAC,CAAC;;;;EAIJ,WAAW;;;UAGH;QACN,CAAC,CAAC,IAAI,CAAC;IAET,OAAO;;gBAEO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;;;;YAM5B,KAAK;cACH,YAAY,CAAC,OAAO,CAAC;;;;UAIzB,GAAG;cACC,OAAO;;;;;;;;;;;;;;;;;;;mBAmBF,QAAQ;;;;;;;;;;;;;;;;;;;;;kBAqBT,KAAK;;kBAEL,WAAW;;;;;;;;;;;;;;;iBAeZ,gBAAgB;qEACoC,YAAY,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAwB7F,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,SAAiB,EAAE,MAAwB;IACrF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,GAAG,KAAK,uBAAuB;QAC5C,OAAO,EAAE,IAAI;QACb,OAAO,EAAE;YACP,UAAU,EAAE,YAAY;YACxB,KAAK,EAAE,kBAAkB;YACzB,KAAK,EAAE,kBAAkB;YACzB,OAAO,EAAE,oBAAoB;YAC7B,MAAM,EAAE,mBAAmB;YAC3B,KAAK,EAAE,kBAAkB;YACzB,KAAK,EAAE,kBAAkB;YACzB,oBAAoB,EAAE,+BAA+B;YACrD,mBAAmB,EAAE,8BAA8B;SACpD;QACD,YAAY,EAAE;YACZ,kBAAkB,EAAE,QAAQ;YAC5B,4BAA4B,EAAE,QAAQ;YACtC,2BAA2B,EAAE,QAAQ;YACrC,eAAe,EAAE,QAAQ;YACzB,IAAI,EAAE,QAAQ;YACd,sBAAsB,EAAE,QAAQ;YAChC,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,SAAS;SACvB;QACD,eAAe,EAAE;YACf,iCAAiC,EAAE,QAAQ;YAC3C,mBAAmB,EAAE,QAAQ;SAC9B;QACD,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ;SACf;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiB,EAAE,KAAa;IACrE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,eAAuB,SAAS;IAChF,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,OAAO;;;4CAGmC,YAAY;8CACV,WAAW;;;;;qBAKpC,QAAQ;+EACkD,QAAQ;OAChF,CAAC;AACR,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,eAAuB,SAAS;IACnF,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAElD,OAAO;;;4CAGmC,YAAY;8CACV,WAAW;;;;;;2DAME,SAAS;OAC7D,CAAC;AACR,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,MAAM,GAAoD;QAC9D,OAAO,EAAE;YACP,KAAK,EAAE;;;;;;;yCAO4B;YACnC,IAAI,EAAE;;;;;;;yCAO6B;SACpC;QACD,OAAO,EAAE;YACP,KAAK,EAAE;;;;;;;yCAO4B;YACnC,IAAI,EAAE;;;;;;;yCAO6B;SACpC;QACD,IAAI,EAAE;YACJ,KAAK,EAAE;;;;;;;yCAO4B;YACnC,IAAI,EAAE;;;;;;;yCAO6B;SACpC;KACF,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;IAEjD,OAAO;;;;;;;EAOP,QAAQ,CAAC,KAAK;;;;;;;;;EASd,QAAQ,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Nd,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAiB,EAAE,KAAa;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,OAAe,EAAE,UAAyB;IACzF,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAE/E,2BAA2B;IAC3B,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACzC,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAClD,OAAO,sBAAsB,GAAG,CAAC,EAAE,0CAA0C,GAAG,CAAC,EAAE;oDACnC,GAAG,CAAC,IAAI;kBAC1C,GAAG,CAAC,KAAK;iBACV,WAAW;gDACoB,GAAG,CAAC,QAAQ,YAAY,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;eACtF,CAAC;IACd,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;;;;;;;;;;;;;;;kBAiBS,iBAAiB;;;;;;;;;;;;;;qBAcd,YAAY,CAAC,OAAO,CAAC;;;;EAIxC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;EACxB,aAAa;iBACE,CAAC,CAAC,CAAC,EAAE;;;;;;CAMrB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAiB,EACjB,KAAa,EACb,OAAe,EACf,aAA4B,EAAE;IAE9B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0IR,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,SAAiB;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;IACzC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,GAAW,EAAE,OAAe;IAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;IAChE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;IAC1E,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACpE,CAAC"}
|
|
@@ -8,7 +8,7 @@ import { SetupOptions, ServerProcess } from './types.js';
|
|
|
8
8
|
*/
|
|
9
9
|
export declare function setupDocusaurus(options: SetupOptions): Promise<void>;
|
|
10
10
|
/**
|
|
11
|
-
* Quick setup with defaults
|
|
11
|
+
* Quick setup with defaults — detects project metadata automatically
|
|
12
12
|
*/
|
|
13
13
|
export declare function quickSetup(projectRoot: string): Promise<void>;
|
|
14
14
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docusaurus-setup.d.ts","sourceRoot":"","sources":["../../../../src/utils/docs-preview/docusaurus-setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"docusaurus-setup.d.ts","sourceRoot":"","sources":["../../../../src/utils/docs-preview/docusaurus-setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,EAAE,YAAY,EAAoB,aAAa,EAAE,MAAM,YAAY,CAAC;AAS3E;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA2G1E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCnE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GACtE,OAAO,CAAC,aAAa,CAAC,CA8CxB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCxE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGzE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
|
@@ -6,14 +6,20 @@ import * as path from 'path';
|
|
|
6
6
|
import * as fs from '../../utils/fs-native.js';
|
|
7
7
|
import { checkNodeVersion, installDocusaurus, isDocusaurusInstalled } from './package-installer.js';
|
|
8
8
|
import { buildSidebar, countDocuments, countCategories } from './sidebar-builder.js';
|
|
9
|
-
import { writeDocusaurusConfig, writePackageJSON, writeCustomCSS, writeIndexPage, writeIndexModuleCSS } from './config-generator.js';
|
|
9
|
+
import { writeDocusaurusConfig, writePackageJSON, writeCustomCSS, writeIndexPage, writeIndexModuleCSS, generateLogoSVG, generateFaviconSVG } from './config-generator.js';
|
|
10
10
|
import { startDevServer, findAvailablePort } from './server-manager.js';
|
|
11
|
+
import { detectProjectMetadata } from './project-detector.js';
|
|
12
|
+
/** Default port range — avoids 3000 which is commonly used by dev servers */
|
|
13
|
+
const DEFAULT_PORT_START = 3016;
|
|
14
|
+
const DEFAULT_PORT_END = 3030;
|
|
15
|
+
/** Primary theme color used for logo/favicon generation */
|
|
16
|
+
const PRIMARY_COLOR = '#4f46e5';
|
|
11
17
|
/**
|
|
12
18
|
* Full Docusaurus setup workflow
|
|
13
19
|
*/
|
|
14
20
|
export async function setupDocusaurus(options) {
|
|
15
21
|
const { projectRoot, targetDir, docsPath, config, force = false } = options;
|
|
16
|
-
console.log('
|
|
22
|
+
console.log('\u{1F4E6} Setting up documentation preview...\n');
|
|
17
23
|
// Step 1: Check Node.js version
|
|
18
24
|
console.log('1. Checking Node.js version...');
|
|
19
25
|
const nodeVersion = await checkNodeVersion();
|
|
@@ -21,29 +27,31 @@ export async function setupDocusaurus(options) {
|
|
|
21
27
|
throw new Error(`Node.js 18+ required (found: ${nodeVersion.version})\n` +
|
|
22
28
|
'Install Node.js from: https://nodejs.org/');
|
|
23
29
|
}
|
|
24
|
-
console.log(`
|
|
25
|
-
// Step 2: Check if already installed
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
30
|
+
console.log(` \u2705 Node.js ${nodeVersion.version}\n`);
|
|
31
|
+
// Step 2: Check if packages already installed (skip npm install if so)
|
|
32
|
+
const packagesInstalled = await isDocusaurusInstalled(targetDir);
|
|
33
|
+
if (!force && packagesInstalled) {
|
|
34
|
+
console.log('\u2705 Packages already installed\n');
|
|
29
35
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
else {
|
|
37
|
+
// Step 3: Create target directory
|
|
38
|
+
console.log('2. Creating docs-site directory...');
|
|
39
|
+
await fs.ensureDir(targetDir);
|
|
40
|
+
console.log(' \u2705 Directory created\n');
|
|
41
|
+
// Step 4: Generate package.json
|
|
42
|
+
console.log('3. Generating package.json...');
|
|
43
|
+
await writePackageJSON(targetDir, config.title);
|
|
44
|
+
console.log(' \u2705 package.json created\n');
|
|
45
|
+
// Step 5: Install Docusaurus packages
|
|
46
|
+
console.log('4. Installing packages (this may take 30-60 seconds)...');
|
|
47
|
+
await installDocusaurus(targetDir);
|
|
48
|
+
console.log(' \u2705 Installation complete\n');
|
|
49
|
+
}
|
|
50
|
+
// Always regenerate config files (picks up project metadata changes)
|
|
43
51
|
console.log('5. Generating docusaurus.config.js...');
|
|
44
52
|
await writeDocusaurusConfig(targetDir, config);
|
|
45
|
-
console.log('
|
|
46
|
-
// Step 7: Count docs for info display
|
|
53
|
+
console.log(' \u2705 Configuration generated\n');
|
|
54
|
+
// Step 7: Count docs for info display
|
|
47
55
|
console.log('6. Scanning documentation folders...');
|
|
48
56
|
const sidebar = await buildSidebar({
|
|
49
57
|
docsPath,
|
|
@@ -52,13 +60,12 @@ export async function setupDocusaurus(options) {
|
|
|
52
60
|
});
|
|
53
61
|
const docCount = countDocuments(sidebar);
|
|
54
62
|
const catCount = countCategories(sidebar);
|
|
55
|
-
console.log(`
|
|
56
|
-
// Step 8: Write autogenerated sidebar
|
|
63
|
+
console.log(` \u2705 Found ${docCount} documents in ${catCount} categories\n`);
|
|
64
|
+
// Step 8: Write autogenerated sidebar
|
|
57
65
|
console.log('7. Generating sidebars.js...');
|
|
58
66
|
const sidebarPath = path.join(targetDir, 'sidebars.js');
|
|
59
|
-
// Use Docusaurus autogenerated sidebar - much more reliable for large doc sets
|
|
60
67
|
const autogeneratedSidebar = `/**
|
|
61
|
-
* Auto-generated sidebar for
|
|
68
|
+
* Auto-generated sidebar for documentation
|
|
62
69
|
* Generated: ${new Date().toISOString()}
|
|
63
70
|
* Uses Docusaurus autogenerated sidebar for reliability with large doc sets
|
|
64
71
|
*/
|
|
@@ -76,20 +83,33 @@ const sidebars = {
|
|
|
76
83
|
module.exports = sidebars;
|
|
77
84
|
`;
|
|
78
85
|
await fs.writeFile(sidebarPath, autogeneratedSidebar, 'utf-8');
|
|
79
|
-
console.log('
|
|
86
|
+
console.log(' \u2705 Sidebar generated\n');
|
|
80
87
|
// Step 9: Create landing page
|
|
81
88
|
console.log('8. Creating landing page...');
|
|
82
|
-
|
|
89
|
+
const categories = config.projectMetadata?.categories || [];
|
|
90
|
+
await writeIndexPage(targetDir, config.title, config.tagline, categories);
|
|
83
91
|
await writeIndexModuleCSS(targetDir);
|
|
84
|
-
console.log('
|
|
92
|
+
console.log(' \u2705 Landing page created\n');
|
|
85
93
|
// Step 10: Create custom CSS
|
|
86
94
|
console.log('9. Creating custom theme...');
|
|
87
95
|
await writeCustomCSS(targetDir, config.theme || 'default');
|
|
88
|
-
console.log('
|
|
89
|
-
|
|
96
|
+
console.log(' \u2705 Theme configured\n');
|
|
97
|
+
// Step 11: Generate static assets (logo + favicon)
|
|
98
|
+
console.log('10. Generating project assets...');
|
|
99
|
+
const staticImgDir = path.join(targetDir, 'static', 'img');
|
|
100
|
+
await fs.ensureDir(staticImgDir);
|
|
101
|
+
const metadata = config.projectMetadata;
|
|
102
|
+
if (metadata) {
|
|
103
|
+
const logoSvg = generateLogoSVG(metadata.initials, PRIMARY_COLOR);
|
|
104
|
+
await fs.writeFile(path.join(staticImgDir, 'logo.svg'), logoSvg, 'utf-8');
|
|
105
|
+
const faviconSvg = generateFaviconSVG(metadata.initials, PRIMARY_COLOR);
|
|
106
|
+
await fs.writeFile(path.join(staticImgDir, 'favicon.svg'), faviconSvg, 'utf-8');
|
|
107
|
+
}
|
|
108
|
+
console.log(' \u2705 Assets generated\n');
|
|
109
|
+
console.log('\u2705 Setup complete!\n');
|
|
90
110
|
}
|
|
91
111
|
/**
|
|
92
|
-
* Quick setup with defaults
|
|
112
|
+
* Quick setup with defaults — detects project metadata automatically
|
|
93
113
|
*/
|
|
94
114
|
export async function quickSetup(projectRoot) {
|
|
95
115
|
const targetDir = path.join(projectRoot, '.specweave', 'docs-site-internal');
|
|
@@ -100,15 +120,18 @@ export async function quickSetup(projectRoot) {
|
|
|
100
120
|
'Create documentation by completing your first increment:\n' +
|
|
101
121
|
' /sw:increment "your feature"');
|
|
102
122
|
}
|
|
123
|
+
// Detect project metadata
|
|
124
|
+
const metadata = await detectProjectMetadata(projectRoot, docsPath);
|
|
103
125
|
const config = {
|
|
104
|
-
title:
|
|
105
|
-
tagline:
|
|
126
|
+
title: `${metadata.name} Documentation`,
|
|
127
|
+
tagline: metadata.description,
|
|
106
128
|
url: 'http://localhost',
|
|
107
129
|
baseUrl: '/',
|
|
108
130
|
docsPath: '../docs/internal',
|
|
109
|
-
port:
|
|
131
|
+
port: DEFAULT_PORT_START,
|
|
110
132
|
theme: 'default',
|
|
111
|
-
excludeFolders: ['legacy', 'node_modules']
|
|
133
|
+
excludeFolders: ['legacy', 'node_modules'],
|
|
134
|
+
projectMetadata: metadata
|
|
112
135
|
};
|
|
113
136
|
await setupDocusaurus({
|
|
114
137
|
projectRoot,
|
|
@@ -122,22 +145,43 @@ export async function quickSetup(projectRoot) {
|
|
|
122
145
|
*/
|
|
123
146
|
export async function launchPreview(projectRoot, options = {}) {
|
|
124
147
|
const targetDir = path.join(projectRoot, '.specweave', 'docs-site-internal');
|
|
125
|
-
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
148
|
+
// Always run quickSetup to regenerate configs with fresh metadata
|
|
149
|
+
// (packages are only installed once unless --force)
|
|
150
|
+
await quickSetup(projectRoot);
|
|
151
|
+
// Force reinstall packages if explicitly requested
|
|
152
|
+
if (options.force) {
|
|
153
|
+
const docsPath = path.join(projectRoot, '.specweave', 'docs', 'internal');
|
|
154
|
+
const metadata = await detectProjectMetadata(projectRoot, docsPath);
|
|
155
|
+
const config = {
|
|
156
|
+
title: `${metadata.name} Documentation`,
|
|
157
|
+
tagline: metadata.description,
|
|
158
|
+
url: 'http://localhost',
|
|
159
|
+
baseUrl: '/',
|
|
160
|
+
docsPath: '../docs/internal',
|
|
161
|
+
port: DEFAULT_PORT_START,
|
|
162
|
+
theme: 'default',
|
|
163
|
+
excludeFolders: ['legacy', 'node_modules'],
|
|
164
|
+
projectMetadata: metadata
|
|
165
|
+
};
|
|
166
|
+
await setupDocusaurus({
|
|
167
|
+
projectRoot,
|
|
168
|
+
targetDir,
|
|
169
|
+
docsPath: path.join(projectRoot, '.specweave', 'docs', 'internal'),
|
|
170
|
+
config,
|
|
171
|
+
force: true
|
|
172
|
+
});
|
|
129
173
|
}
|
|
130
|
-
// Find available port
|
|
131
|
-
const port = options.port || await findAvailablePort(
|
|
174
|
+
// Find available port (avoids 3000)
|
|
175
|
+
const port = options.port || await findAvailablePort(DEFAULT_PORT_START, DEFAULT_PORT_END);
|
|
132
176
|
console.log(`Starting server on port ${port}...`);
|
|
133
177
|
// Start dev server
|
|
134
178
|
const server = await startDevServer(targetDir, {
|
|
135
179
|
port,
|
|
136
180
|
openBrowser: options.openBrowser !== false
|
|
137
181
|
});
|
|
138
|
-
console.log(`\n
|
|
139
|
-
console.log('
|
|
140
|
-
console.log('
|
|
182
|
+
console.log(`\n\u{1F310} Documentation available at: ${server.url}`);
|
|
183
|
+
console.log('\u{1F504} Hot reload enabled - edit docs and see changes instantly');
|
|
184
|
+
console.log('\u{1F4A1} Press Ctrl+C to stop the server\n');
|
|
141
185
|
return server;
|
|
142
186
|
}
|
|
143
187
|
/**
|
|
@@ -150,7 +194,7 @@ export async function buildStaticSite(projectRoot) {
|
|
|
150
194
|
throw new Error('Docusaurus not installed.\n' +
|
|
151
195
|
'Run: /sw:docs preview (this will install it)');
|
|
152
196
|
}
|
|
153
|
-
console.log('
|
|
197
|
+
console.log('\u{1F4E6} Building static documentation site...\n');
|
|
154
198
|
const { spawn } = await import('child_process');
|
|
155
199
|
return new Promise((resolve, reject) => {
|
|
156
200
|
const buildProcess = spawn('npm', ['run', 'build'], {
|
|
@@ -161,8 +205,8 @@ export async function buildStaticSite(projectRoot) {
|
|
|
161
205
|
buildProcess.on('close', (code) => {
|
|
162
206
|
if (code === 0) {
|
|
163
207
|
const buildPath = path.join(targetDir, 'build');
|
|
164
|
-
console.log('\n
|
|
165
|
-
console.log(
|
|
208
|
+
console.log('\n\u2705 Build complete!');
|
|
209
|
+
console.log(`\u{1F4C1} Output: ${buildPath}\n`);
|
|
166
210
|
resolve();
|
|
167
211
|
}
|
|
168
212
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docusaurus-setup.js","sourceRoot":"","sources":["../../../../src/utils/docs-preview/docusaurus-setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpG,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"docusaurus-setup.js","sourceRoot":"","sources":["../../../../src/utils/docs-preview/docusaurus-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { setupDocusaurus, quickSetup, launchPreview, buildStaticSite, isSetupNeeded, getDocsSitePath, getDocsPath } from './docusaurus-setup.js';
|
|
2
2
|
export { buildSidebar, writeSidebar, generateSidebarsJS, countDocuments, countCategories } from './sidebar-builder.js';
|
|
3
|
-
export { generateDocusaurusConfig, writeDocusaurusConfig, generatePackageJSON, writePackageJSON, generateCustomCSS, writeCustomCSS, generateIndexPage, writeIndexPage, generateIndexModuleCSS, writeIndexModuleCSS } from './config-generator.js';
|
|
3
|
+
export { generateDocusaurusConfig, writeDocusaurusConfig, generatePackageJSON, writePackageJSON, generateCustomCSS, writeCustomCSS, generateIndexPage, writeIndexPage, generateIndexModuleCSS, writeIndexModuleCSS, generateLogoSVG, generateFaviconSVG } from './config-generator.js';
|
|
4
|
+
export { detectProjectMetadata, detectDocCategories } from './project-detector.js';
|
|
4
5
|
export { checkNodeVersion, checkNpmInstalled, installPackages, installDocusaurus, isDocusaurusInstalled, cleanNpmCache, getPackageVersion, estimateInstallSize, estimateInstallTime } from './package-installer.js';
|
|
5
6
|
export { findAvailablePort, startDevServer, openBrowserUrl, killAllDocusaurusProcesses, isDocusaurusRunning, getServerUrl } from './server-manager.js';
|
|
6
7
|
export * from './types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/docs-preview/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,eAAe,EACf,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utils/docs-preview/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,eAAe,EACf,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EACnB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B,cAAc,YAAY,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { setupDocusaurus, quickSetup, launchPreview, buildStaticSite, isSetupNeeded, getDocsSitePath, getDocsPath } from './docusaurus-setup.js';
|
|
2
2
|
export { buildSidebar, writeSidebar, generateSidebarsJS, countDocuments, countCategories } from './sidebar-builder.js';
|
|
3
|
-
export { generateDocusaurusConfig, writeDocusaurusConfig, generatePackageJSON, writePackageJSON, generateCustomCSS, writeCustomCSS, generateIndexPage, writeIndexPage, generateIndexModuleCSS, writeIndexModuleCSS } from './config-generator.js';
|
|
3
|
+
export { generateDocusaurusConfig, writeDocusaurusConfig, generatePackageJSON, writePackageJSON, generateCustomCSS, writeCustomCSS, generateIndexPage, writeIndexPage, generateIndexModuleCSS, writeIndexModuleCSS, generateLogoSVG, generateFaviconSVG } from './config-generator.js';
|
|
4
|
+
export { detectProjectMetadata, detectDocCategories } from './project-detector.js';
|
|
4
5
|
export { checkNodeVersion, checkNpmInstalled, installPackages, installDocusaurus, isDocusaurusInstalled, cleanNpmCache, getPackageVersion, estimateInstallSize, estimateInstallTime } from './package-installer.js';
|
|
5
6
|
export { findAvailablePort, startDevServer, openBrowserUrl, killAllDocusaurusProcesses, isDocusaurusRunning, getServerUrl } from './server-manager.js';
|
|
6
7
|
export * from './types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/docs-preview/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,eAAe,EACf,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/docs-preview/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,UAAU,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,eAAe,EACf,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EACnB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project metadata detector for docs preview
|
|
3
|
+
*
|
|
4
|
+
* Detects project name, description, initials, and doc categories
|
|
5
|
+
* from multiple sources (config.json, package.json, directory name).
|
|
6
|
+
*/
|
|
7
|
+
import { ProjectMetadata, DocCategory } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Detect project metadata from multiple sources
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectProjectMetadata(projectRoot: string, docsPath: string): Promise<ProjectMetadata>;
|
|
12
|
+
/**
|
|
13
|
+
* Detect actual doc categories from the docs folder
|
|
14
|
+
*/
|
|
15
|
+
export declare function detectDocCategories(docsPath: string): Promise<DocCategory[]>;
|
|
16
|
+
//# sourceMappingURL=project-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-detector.d.ts","sourceRoot":"","sources":["../../../../src/utils/docs-preview/project-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA2B1D;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC,CAM1B;AAgDD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA8ClF"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project metadata detector for docs preview
|
|
3
|
+
*
|
|
4
|
+
* Detects project name, description, initials, and doc categories
|
|
5
|
+
* from multiple sources (config.json, package.json, directory name).
|
|
6
|
+
*/
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import * as fs from '../../utils/fs-native.js';
|
|
9
|
+
/**
|
|
10
|
+
* Known category metadata for common doc folder names
|
|
11
|
+
*/
|
|
12
|
+
const CATEGORY_META = {
|
|
13
|
+
strategy: { description: 'Business rationale, PRDs, and OKRs', icon: '\u{1F9ED}' },
|
|
14
|
+
specs: { description: 'Feature specifications and user stories', icon: '\u{1F4DD}' },
|
|
15
|
+
specifications: { description: 'Feature specifications and user stories', icon: '\u{1F4DD}' },
|
|
16
|
+
architecture: { description: 'Technical design, ADRs, and diagrams', icon: '\u{1F3D7}\u{FE0F}' },
|
|
17
|
+
delivery: { description: 'Build processes and release management', icon: '\u{1F4E6}' },
|
|
18
|
+
operations: { description: 'Runbooks, SLOs, and incident management', icon: '\u{2699}\u{FE0F}' },
|
|
19
|
+
governance: { description: 'Policies, security, and compliance', icon: '\u{1F6E1}\u{FE0F}' },
|
|
20
|
+
guides: { description: 'How-to guides and tutorials', icon: '\u{1F4D6}' },
|
|
21
|
+
modules: { description: 'Module documentation and APIs', icon: '\u{1F4E6}' },
|
|
22
|
+
analysis: { description: 'Analysis reports and research', icon: '\u{1F4CA}' },
|
|
23
|
+
troubleshooting: { description: 'Debugging guides and known issues', icon: '\u{1F527}' },
|
|
24
|
+
repos: { description: 'Repository documentation', icon: '\u{1F500}' },
|
|
25
|
+
organization: { description: 'Team and organization structure', icon: '\u{1F465}' },
|
|
26
|
+
api: { description: 'API reference and endpoints', icon: '\u{1F517}' },
|
|
27
|
+
testing: { description: 'Test plans and quality assurance', icon: '\u{2705}' },
|
|
28
|
+
security: { description: 'Security policies and assessments', icon: '\u{1F510}' },
|
|
29
|
+
design: { description: 'Design documents and mockups', icon: '\u{1F3A8}' },
|
|
30
|
+
infrastructure: { description: 'Infrastructure and deployment', icon: '\u{2601}\u{FE0F}' },
|
|
31
|
+
projects: { description: 'Project documentation', icon: '\u{1F4C1}' },
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Detect project metadata from multiple sources
|
|
35
|
+
*/
|
|
36
|
+
export async function detectProjectMetadata(projectRoot, docsPath) {
|
|
37
|
+
const { name, description, source } = await detectNameAndDescription(projectRoot);
|
|
38
|
+
const initials = extractInitials(name);
|
|
39
|
+
const categories = await detectDocCategories(docsPath);
|
|
40
|
+
return { name, description, initials, categories, source };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Detect project name and description from config.json, package.json, or directory
|
|
44
|
+
*/
|
|
45
|
+
async function detectNameAndDescription(projectRoot) {
|
|
46
|
+
// Source 1: .specweave/config.json
|
|
47
|
+
const configPath = path.join(projectRoot, '.specweave', 'config.json');
|
|
48
|
+
if (await fs.pathExists(configPath)) {
|
|
49
|
+
try {
|
|
50
|
+
const raw = JSON.parse(await fs.readFile(configPath, 'utf-8'));
|
|
51
|
+
// Try v2 format: { project: { name: "..." } }
|
|
52
|
+
const configName = raw.project?.name || raw.projectName;
|
|
53
|
+
if (configName && typeof configName === 'string') {
|
|
54
|
+
const description = raw.project?.description
|
|
55
|
+
|| raw.research?.vision?.rawVision
|
|
56
|
+
|| `${configName} — Project Documentation`;
|
|
57
|
+
return { name: configName, description: truncateDescription(description), source: 'config' };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Config parse error, fall through
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Source 2: package.json
|
|
65
|
+
const packagePath = path.join(projectRoot, 'package.json');
|
|
66
|
+
if (await fs.pathExists(packagePath)) {
|
|
67
|
+
try {
|
|
68
|
+
const pkg = JSON.parse(await fs.readFile(packagePath, 'utf-8'));
|
|
69
|
+
if (pkg.name && typeof pkg.name === 'string') {
|
|
70
|
+
const name = formatPackageName(pkg.name);
|
|
71
|
+
const description = pkg.description || `${name} — Project Documentation`;
|
|
72
|
+
return { name, description: truncateDescription(description), source: 'package' };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Package parse error, fall through
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Source 3: directory name
|
|
80
|
+
const dirName = path.basename(projectRoot);
|
|
81
|
+
const name = formatDirectoryName(dirName);
|
|
82
|
+
return { name, description: `${name} — Project Documentation`, source: 'directory' };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Detect actual doc categories from the docs folder
|
|
86
|
+
*/
|
|
87
|
+
export async function detectDocCategories(docsPath) {
|
|
88
|
+
if (!await fs.pathExists(docsPath)) {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
const entries = await fs.readdir(docsPath, { withFileTypes: true });
|
|
92
|
+
const categories = [];
|
|
93
|
+
for (const entry of entries) {
|
|
94
|
+
if (!entry.isDirectory())
|
|
95
|
+
continue;
|
|
96
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules')
|
|
97
|
+
continue;
|
|
98
|
+
const folderPath = path.join(docsPath, entry.name);
|
|
99
|
+
const docCount = await countMarkdownFiles(folderPath);
|
|
100
|
+
if (docCount === 0)
|
|
101
|
+
continue;
|
|
102
|
+
const normalized = entry.name.toLowerCase();
|
|
103
|
+
const meta = CATEGORY_META[normalized] || {
|
|
104
|
+
description: `${formatLabel(entry.name)} documentation`,
|
|
105
|
+
icon: '\u{1F4C2}',
|
|
106
|
+
};
|
|
107
|
+
categories.push({
|
|
108
|
+
id: entry.name,
|
|
109
|
+
label: formatLabel(entry.name),
|
|
110
|
+
description: meta.description,
|
|
111
|
+
icon: meta.icon,
|
|
112
|
+
docCount,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
// Sort by known priority, then alphabetically
|
|
116
|
+
const PRIORITY = {
|
|
117
|
+
strategy: 1, specs: 2, specifications: 2, architecture: 3,
|
|
118
|
+
delivery: 4, operations: 5, governance: 6, projects: 7,
|
|
119
|
+
};
|
|
120
|
+
categories.sort((a, b) => {
|
|
121
|
+
const aPri = PRIORITY[a.id.toLowerCase()] || 99;
|
|
122
|
+
const bPri = PRIORITY[b.id.toLowerCase()] || 99;
|
|
123
|
+
if (aPri !== bPri)
|
|
124
|
+
return aPri - bPri;
|
|
125
|
+
return a.label.localeCompare(b.label);
|
|
126
|
+
});
|
|
127
|
+
return categories;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Count markdown files recursively in a directory
|
|
131
|
+
*/
|
|
132
|
+
async function countMarkdownFiles(dirPath) {
|
|
133
|
+
let count = 0;
|
|
134
|
+
try {
|
|
135
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
136
|
+
for (const entry of entries) {
|
|
137
|
+
if (entry.isDirectory() && !entry.name.startsWith('.')) {
|
|
138
|
+
count += await countMarkdownFiles(path.join(dirPath, entry.name));
|
|
139
|
+
}
|
|
140
|
+
else if (entry.isFile() && (entry.name.endsWith('.md') || entry.name.endsWith('.mdx'))) {
|
|
141
|
+
count++;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Permission error or similar, skip
|
|
147
|
+
}
|
|
148
|
+
return count;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Extract 1-2 letter initials from project name
|
|
152
|
+
*/
|
|
153
|
+
function extractInitials(name) {
|
|
154
|
+
// Try CamelCase detection: "SpecWeave" → "SW", "MyProject" → "MP"
|
|
155
|
+
const camelParts = name.match(/[A-Z][a-z]*/g);
|
|
156
|
+
if (camelParts && camelParts.length >= 2) {
|
|
157
|
+
return (camelParts[0][0] + camelParts[1][0]).toUpperCase();
|
|
158
|
+
}
|
|
159
|
+
// Try space/dash/underscore separated: "My App" → "MA"
|
|
160
|
+
const words = name.split(/[\s\-_]+/).filter(w => w.length > 0);
|
|
161
|
+
if (words.length >= 2) {
|
|
162
|
+
return (words[0][0] + words[1][0]).toUpperCase();
|
|
163
|
+
}
|
|
164
|
+
// Single word: first letter
|
|
165
|
+
return name.charAt(0).toUpperCase();
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Format npm package name to human-readable
|
|
169
|
+
* "@scope/my-package" → "My Package"
|
|
170
|
+
*/
|
|
171
|
+
function formatPackageName(name) {
|
|
172
|
+
// Strip npm scope
|
|
173
|
+
const stripped = name.replace(/^@[^/]+\//, '');
|
|
174
|
+
return formatDirectoryName(stripped);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Format directory name to human-readable
|
|
178
|
+
* "my-cool-project" → "My Cool Project"
|
|
179
|
+
*/
|
|
180
|
+
function formatDirectoryName(name) {
|
|
181
|
+
return name
|
|
182
|
+
.replace(/[-_]/g, ' ')
|
|
183
|
+
.split(' ')
|
|
184
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
|
185
|
+
.join(' ');
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Format folder name to label
|
|
189
|
+
*/
|
|
190
|
+
function formatLabel(folderName) {
|
|
191
|
+
const specialCases = {
|
|
192
|
+
adr: 'ADRs', adrs: 'ADRs', hld: 'HLD', lld: 'LLD',
|
|
193
|
+
prd: 'PRDs', okr: 'OKRs', api: 'API', cli: 'CLI',
|
|
194
|
+
ui: 'UI', ux: 'UX', sre: 'SRE', devops: 'DevOps',
|
|
195
|
+
};
|
|
196
|
+
const normalized = folderName.toLowerCase();
|
|
197
|
+
if (specialCases[normalized])
|
|
198
|
+
return specialCases[normalized];
|
|
199
|
+
return folderName
|
|
200
|
+
.replace(/[-_]/g, ' ')
|
|
201
|
+
.split(' ')
|
|
202
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
203
|
+
.join(' ');
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Truncate long descriptions for tagline use
|
|
207
|
+
*/
|
|
208
|
+
function truncateDescription(desc) {
|
|
209
|
+
// Take first sentence or first 120 chars
|
|
210
|
+
const firstSentence = desc.split(/[.!?]\s/)[0];
|
|
211
|
+
if (firstSentence.length <= 120)
|
|
212
|
+
return firstSentence;
|
|
213
|
+
return firstSentence.slice(0, 117) + '...';
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=project-detector.js.map
|
|
@@ -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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"}
|