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
|
@@ -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,wDAAwD;IACxD,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC;IACnD,MAAM,eAAe,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhG,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;;;;;;;;;;;;;;;;;;mBAkBF,QAAQ;;;sBAGL,eAAe;;;;;;;;;;;;;;;;;;kBAkBnB,WAAW;;kBAEX,WAAW;;;;;;;;iBAQZ,gBAAgB;qEACoC,YAAY,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2B7F,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,EAAE,WAAoB;IAC/G,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,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/D,OAAO;;;;;;;;;;;;2CAYkC,SAAS,CAAC,CAAC,CAAC,sCAAsC,SAAS,uBAAuB,CAAC,CAAC,CAAC,oBAAoB;;;;;kBAKlI,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,EAC9B,WAAoB;IAEpB,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,EAAE,WAAW,CAAC,CAAC;IAC3E,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsJR,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,CAwI1E;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,62 @@ 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, config.projectMetadata?.name);
|
|
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
|
+
// Use custom logo if available, otherwise generate from initials
|
|
104
|
+
if (metadata.logoPath && await fs.pathExists(metadata.logoPath)) {
|
|
105
|
+
await fs.copyFile(metadata.logoPath, path.join(staticImgDir, 'logo.svg'));
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const logoSvg = generateLogoSVG(metadata.initials, PRIMARY_COLOR);
|
|
109
|
+
await fs.writeFile(path.join(staticImgDir, 'logo.svg'), logoSvg, 'utf-8');
|
|
110
|
+
}
|
|
111
|
+
const faviconSvg = generateFaviconSVG(metadata.initials, PRIMARY_COLOR);
|
|
112
|
+
await fs.writeFile(path.join(staticImgDir, 'favicon.svg'), faviconSvg, 'utf-8');
|
|
113
|
+
}
|
|
114
|
+
console.log(' \u2705 Assets generated\n');
|
|
115
|
+
// Step 12: Copy increment specs for link resolution in Docusaurus
|
|
116
|
+
console.log('11. Copying increment specs for link resolution...');
|
|
117
|
+
const incrementsSource = path.join(projectRoot, '.specweave', 'increments');
|
|
118
|
+
const incrementsStaticDest = path.join(targetDir, 'static', 'increments');
|
|
119
|
+
if (await fs.pathExists(incrementsSource)) {
|
|
120
|
+
let copiedCount = 0;
|
|
121
|
+
const incrementDirs = await fs.readdir(incrementsSource, { withFileTypes: true });
|
|
122
|
+
for (const dir of incrementDirs) {
|
|
123
|
+
if (!dir.isDirectory() || dir.name.startsWith('_'))
|
|
124
|
+
continue;
|
|
125
|
+
const specFile = path.join(incrementsSource, dir.name, 'spec.md');
|
|
126
|
+
if (await fs.pathExists(specFile)) {
|
|
127
|
+
const destDir = path.join(incrementsStaticDest, dir.name);
|
|
128
|
+
await fs.ensureDir(destDir);
|
|
129
|
+
await fs.copyFile(specFile, path.join(destDir, 'spec.md'));
|
|
130
|
+
copiedCount++;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
console.log(` \u2705 Copied ${copiedCount} increment spec(s)\n`);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.log(' \u2705 No increments to copy\n');
|
|
137
|
+
}
|
|
138
|
+
console.log('\u2705 Setup complete!\n');
|
|
90
139
|
}
|
|
91
140
|
/**
|
|
92
|
-
* Quick setup with defaults
|
|
141
|
+
* Quick setup with defaults — detects project metadata automatically
|
|
93
142
|
*/
|
|
94
143
|
export async function quickSetup(projectRoot) {
|
|
95
144
|
const targetDir = path.join(projectRoot, '.specweave', 'docs-site-internal');
|
|
@@ -100,15 +149,18 @@ export async function quickSetup(projectRoot) {
|
|
|
100
149
|
'Create documentation by completing your first increment:\n' +
|
|
101
150
|
' /sw:increment "your feature"');
|
|
102
151
|
}
|
|
152
|
+
// Detect project metadata
|
|
153
|
+
const metadata = await detectProjectMetadata(projectRoot, docsPath);
|
|
103
154
|
const config = {
|
|
104
|
-
title:
|
|
105
|
-
tagline:
|
|
155
|
+
title: `${metadata.name} Documentation`,
|
|
156
|
+
tagline: metadata.description,
|
|
106
157
|
url: 'http://localhost',
|
|
107
158
|
baseUrl: '/',
|
|
108
159
|
docsPath: '../docs/internal',
|
|
109
|
-
port:
|
|
160
|
+
port: DEFAULT_PORT_START,
|
|
110
161
|
theme: 'default',
|
|
111
|
-
excludeFolders: ['legacy', 'node_modules']
|
|
162
|
+
excludeFolders: ['legacy', 'node_modules', '_archive'],
|
|
163
|
+
projectMetadata: metadata
|
|
112
164
|
};
|
|
113
165
|
await setupDocusaurus({
|
|
114
166
|
projectRoot,
|
|
@@ -122,22 +174,43 @@ export async function quickSetup(projectRoot) {
|
|
|
122
174
|
*/
|
|
123
175
|
export async function launchPreview(projectRoot, options = {}) {
|
|
124
176
|
const targetDir = path.join(projectRoot, '.specweave', 'docs-site-internal');
|
|
125
|
-
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
177
|
+
// Always run quickSetup to regenerate configs with fresh metadata
|
|
178
|
+
// (packages are only installed once unless --force)
|
|
179
|
+
await quickSetup(projectRoot);
|
|
180
|
+
// Force reinstall packages if explicitly requested
|
|
181
|
+
if (options.force) {
|
|
182
|
+
const docsPath = path.join(projectRoot, '.specweave', 'docs', 'internal');
|
|
183
|
+
const metadata = await detectProjectMetadata(projectRoot, docsPath);
|
|
184
|
+
const config = {
|
|
185
|
+
title: `${metadata.name} Documentation`,
|
|
186
|
+
tagline: metadata.description,
|
|
187
|
+
url: 'http://localhost',
|
|
188
|
+
baseUrl: '/',
|
|
189
|
+
docsPath: '../docs/internal',
|
|
190
|
+
port: DEFAULT_PORT_START,
|
|
191
|
+
theme: 'default',
|
|
192
|
+
excludeFolders: ['legacy', 'node_modules', '_archive'],
|
|
193
|
+
projectMetadata: metadata
|
|
194
|
+
};
|
|
195
|
+
await setupDocusaurus({
|
|
196
|
+
projectRoot,
|
|
197
|
+
targetDir,
|
|
198
|
+
docsPath: path.join(projectRoot, '.specweave', 'docs', 'internal'),
|
|
199
|
+
config,
|
|
200
|
+
force: true
|
|
201
|
+
});
|
|
129
202
|
}
|
|
130
|
-
// Find available port
|
|
131
|
-
const port = options.port || await findAvailablePort(
|
|
203
|
+
// Find available port (avoids 3000)
|
|
204
|
+
const port = options.port || await findAvailablePort(DEFAULT_PORT_START, DEFAULT_PORT_END);
|
|
132
205
|
console.log(`Starting server on port ${port}...`);
|
|
133
206
|
// Start dev server
|
|
134
207
|
const server = await startDevServer(targetDir, {
|
|
135
208
|
port,
|
|
136
209
|
openBrowser: options.openBrowser !== false
|
|
137
210
|
});
|
|
138
|
-
console.log(`\n
|
|
139
|
-
console.log('
|
|
140
|
-
console.log('
|
|
211
|
+
console.log(`\n\u{1F310} Documentation available at: ${server.url}`);
|
|
212
|
+
console.log('\u{1F504} Hot reload enabled - edit docs and see changes instantly');
|
|
213
|
+
console.log('\u{1F4A1} Press Ctrl+C to stop the server\n');
|
|
141
214
|
return server;
|
|
142
215
|
}
|
|
143
216
|
/**
|
|
@@ -150,7 +223,7 @@ export async function buildStaticSite(projectRoot) {
|
|
|
150
223
|
throw new Error('Docusaurus not installed.\n' +
|
|
151
224
|
'Run: /sw:docs preview (this will install it)');
|
|
152
225
|
}
|
|
153
|
-
console.log('
|
|
226
|
+
console.log('\u{1F4E6} Building static documentation site...\n');
|
|
154
227
|
const { spawn } = await import('child_process');
|
|
155
228
|
return new Promise((resolve, reject) => {
|
|
156
229
|
const buildProcess = spawn('npm', ['run', 'build'], {
|
|
@@ -161,8 +234,8 @@ export async function buildStaticSite(projectRoot) {
|
|
|
161
234
|
buildProcess.on('close', (code) => {
|
|
162
235
|
if (code === 0) {
|
|
163
236
|
const buildPath = path.join(targetDir, 'build');
|
|
164
|
-
console.log('\n
|
|
165
|
-
console.log(
|
|
237
|
+
console.log('\n\u2705 Build complete!');
|
|
238
|
+
console.log(`\u{1F4C1} Output: ${buildPath}\n`);
|
|
166
239
|
resolve();
|
|
167
240
|
}
|
|
168
241
|
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,7 +1,8 @@
|
|
|
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
|
-
export { findAvailablePort, startDevServer, openBrowserUrl, killAllDocusaurusProcesses, isDocusaurusRunning, getServerUrl } from './server-manager.js';
|
|
6
|
+
export { findAvailablePort, startDevServer, openBrowserUrl, killAllDocusaurusProcesses, killProcessOnPort, isDocusaurusRunning, getServerUrl } from './server-manager.js';
|
|
6
7
|
export * from './types.js';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -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,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B,cAAc,YAAY,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
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
|
-
export { findAvailablePort, startDevServer, openBrowserUrl, killAllDocusaurusProcesses, isDocusaurusRunning, getServerUrl } from './server-manager.js';
|
|
6
|
+
export { findAvailablePort, startDevServer, openBrowserUrl, killAllDocusaurusProcesses, killProcessOnPort, isDocusaurusRunning, getServerUrl } from './server-manager.js';
|
|
6
7
|
export * from './types.js';
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -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,iBAAiB,EACjB,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,CAO1B;AAgDD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA8ClF"}
|
|
@@ -0,0 +1,234 @@
|
|
|
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
|
+
const logoPath = await detectCustomLogo(projectRoot);
|
|
41
|
+
return { name, description, initials, categories, source, logoPath: logoPath ?? undefined };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Detect project name and description from config.json, package.json, or directory
|
|
45
|
+
*/
|
|
46
|
+
async function detectNameAndDescription(projectRoot) {
|
|
47
|
+
// Source 1: .specweave/config.json
|
|
48
|
+
const configPath = path.join(projectRoot, '.specweave', 'config.json');
|
|
49
|
+
if (await fs.pathExists(configPath)) {
|
|
50
|
+
try {
|
|
51
|
+
const raw = JSON.parse(await fs.readFile(configPath, 'utf-8'));
|
|
52
|
+
// Try v2 format: { project: { name: "..." } }
|
|
53
|
+
const configName = raw.project?.name || raw.projectName;
|
|
54
|
+
if (configName && typeof configName === 'string') {
|
|
55
|
+
const description = raw.project?.description
|
|
56
|
+
|| raw.research?.vision?.rawVision
|
|
57
|
+
|| 'Project Documentation';
|
|
58
|
+
return { name: configName, description: truncateDescription(description), source: 'config' };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Config parse error, fall through
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Source 2: package.json
|
|
66
|
+
const packagePath = path.join(projectRoot, 'package.json');
|
|
67
|
+
if (await fs.pathExists(packagePath)) {
|
|
68
|
+
try {
|
|
69
|
+
const pkg = JSON.parse(await fs.readFile(packagePath, 'utf-8'));
|
|
70
|
+
if (pkg.name && typeof pkg.name === 'string') {
|
|
71
|
+
const name = formatPackageName(pkg.name);
|
|
72
|
+
const description = pkg.description || 'Project Documentation';
|
|
73
|
+
return { name, description: truncateDescription(description), source: 'package' };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Package parse error, fall through
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Source 3: directory name (resolve first so "." becomes actual dir name)
|
|
81
|
+
const dirName = path.basename(path.resolve(projectRoot));
|
|
82
|
+
const name = formatDirectoryName(dirName);
|
|
83
|
+
return { name, description: 'Project Documentation', source: 'directory' };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Detect actual doc categories from the docs folder
|
|
87
|
+
*/
|
|
88
|
+
export async function detectDocCategories(docsPath) {
|
|
89
|
+
if (!await fs.pathExists(docsPath)) {
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
const entries = await fs.readdir(docsPath, { withFileTypes: true });
|
|
93
|
+
const categories = [];
|
|
94
|
+
for (const entry of entries) {
|
|
95
|
+
if (!entry.isDirectory())
|
|
96
|
+
continue;
|
|
97
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules')
|
|
98
|
+
continue;
|
|
99
|
+
const folderPath = path.join(docsPath, entry.name);
|
|
100
|
+
const docCount = await countMarkdownFiles(folderPath);
|
|
101
|
+
if (docCount === 0)
|
|
102
|
+
continue;
|
|
103
|
+
const normalized = entry.name.toLowerCase();
|
|
104
|
+
const meta = CATEGORY_META[normalized] || {
|
|
105
|
+
description: `${formatLabel(entry.name)} documentation`,
|
|
106
|
+
icon: '\u{1F4C2}',
|
|
107
|
+
};
|
|
108
|
+
categories.push({
|
|
109
|
+
id: entry.name,
|
|
110
|
+
label: formatLabel(entry.name),
|
|
111
|
+
description: meta.description,
|
|
112
|
+
icon: meta.icon,
|
|
113
|
+
docCount,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
// Sort by known priority, then alphabetically
|
|
117
|
+
const PRIORITY = {
|
|
118
|
+
strategy: 1, specs: 2, specifications: 2, architecture: 3,
|
|
119
|
+
delivery: 4, operations: 5, governance: 6, projects: 7,
|
|
120
|
+
};
|
|
121
|
+
categories.sort((a, b) => {
|
|
122
|
+
const aPri = PRIORITY[a.id.toLowerCase()] || 99;
|
|
123
|
+
const bPri = PRIORITY[b.id.toLowerCase()] || 99;
|
|
124
|
+
if (aPri !== bPri)
|
|
125
|
+
return aPri - bPri;
|
|
126
|
+
return a.label.localeCompare(b.label);
|
|
127
|
+
});
|
|
128
|
+
return categories;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Count markdown files recursively in a directory
|
|
132
|
+
*/
|
|
133
|
+
async function countMarkdownFiles(dirPath) {
|
|
134
|
+
let count = 0;
|
|
135
|
+
try {
|
|
136
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
137
|
+
for (const entry of entries) {
|
|
138
|
+
if (entry.isDirectory() && !entry.name.startsWith('.')) {
|
|
139
|
+
count += await countMarkdownFiles(path.join(dirPath, entry.name));
|
|
140
|
+
}
|
|
141
|
+
else if (entry.isFile() && (entry.name.endsWith('.md') || entry.name.endsWith('.mdx'))) {
|
|
142
|
+
count++;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// Permission error or similar, skip
|
|
148
|
+
}
|
|
149
|
+
return count;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Extract 1-2 letter initials from project name
|
|
153
|
+
*/
|
|
154
|
+
function extractInitials(name) {
|
|
155
|
+
// Try CamelCase detection: "SpecWeave" → "SW", "MyProject" → "MP"
|
|
156
|
+
const camelParts = name.match(/[A-Z][a-z]*/g);
|
|
157
|
+
if (camelParts && camelParts.length >= 2) {
|
|
158
|
+
return (camelParts[0][0] + camelParts[1][0]).toUpperCase();
|
|
159
|
+
}
|
|
160
|
+
// Try space/dash/underscore separated: "My App" → "MA"
|
|
161
|
+
const words = name.split(/[\s\-_]+/).filter(w => w.length > 0);
|
|
162
|
+
if (words.length >= 2) {
|
|
163
|
+
return (words[0][0] + words[1][0]).toUpperCase();
|
|
164
|
+
}
|
|
165
|
+
// Single word: first letter
|
|
166
|
+
return name.charAt(0).toUpperCase();
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Format npm package name to human-readable
|
|
170
|
+
* "@scope/my-package" → "My Package"
|
|
171
|
+
*/
|
|
172
|
+
function formatPackageName(name) {
|
|
173
|
+
// Strip npm scope
|
|
174
|
+
const stripped = name.replace(/^@[^/]+\//, '');
|
|
175
|
+
return formatDirectoryName(stripped);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Format directory name to human-readable
|
|
179
|
+
* "my-cool-project" → "My Cool Project"
|
|
180
|
+
*/
|
|
181
|
+
function formatDirectoryName(name) {
|
|
182
|
+
return name
|
|
183
|
+
.replace(/[-_]/g, ' ')
|
|
184
|
+
.split(' ')
|
|
185
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
|
186
|
+
.join(' ');
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Format folder name to label
|
|
190
|
+
*/
|
|
191
|
+
function formatLabel(folderName) {
|
|
192
|
+
const specialCases = {
|
|
193
|
+
adr: 'ADRs', adrs: 'ADRs', hld: 'HLD', lld: 'LLD',
|
|
194
|
+
prd: 'PRDs', okr: 'OKRs', api: 'API', cli: 'CLI',
|
|
195
|
+
ui: 'UI', ux: 'UX', sre: 'SRE', devops: 'DevOps',
|
|
196
|
+
};
|
|
197
|
+
const normalized = folderName.toLowerCase();
|
|
198
|
+
if (specialCases[normalized])
|
|
199
|
+
return specialCases[normalized];
|
|
200
|
+
return folderName
|
|
201
|
+
.replace(/[-_]/g, ' ')
|
|
202
|
+
.split(' ')
|
|
203
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
204
|
+
.join(' ');
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Detect a custom logo file in the project
|
|
208
|
+
* Checks common locations in priority order
|
|
209
|
+
*/
|
|
210
|
+
async function detectCustomLogo(projectRoot) {
|
|
211
|
+
const candidates = [
|
|
212
|
+
path.join(projectRoot, '.specweave', 'logo.svg'),
|
|
213
|
+
path.join(projectRoot, '.specweave', 'logo.png'),
|
|
214
|
+
path.join(projectRoot, 'logo.svg'),
|
|
215
|
+
path.join(projectRoot, 'logo.png'),
|
|
216
|
+
];
|
|
217
|
+
for (const candidate of candidates) {
|
|
218
|
+
if (await fs.pathExists(candidate)) {
|
|
219
|
+
return candidate;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Truncate long descriptions for tagline use
|
|
226
|
+
*/
|
|
227
|
+
function truncateDescription(desc) {
|
|
228
|
+
// Take first sentence or first 120 chars
|
|
229
|
+
const firstSentence = desc.split(/[.!?]\s/)[0];
|
|
230
|
+
if (firstSentence.length <= 120)
|
|
231
|
+
return firstSentence;
|
|
232
|
+
return firstSentence.slice(0, 117) + '...';
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=project-detector.js.map
|