specweave 0.8.3 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +11 -0
- package/dist/adapters/adapter-loader.d.ts +4 -4
- package/dist/adapters/adapter-loader.d.ts.map +1 -1
- package/dist/adapters/adapter-loader.js +8 -7
- package/dist/adapters/adapter-loader.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +12 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/utils/docs-preview/config-generator.d.ts +46 -0
- package/dist/utils/docs-preview/config-generator.d.ts.map +1 -0
- package/dist/utils/docs-preview/config-generator.js +377 -0
- package/dist/utils/docs-preview/config-generator.js.map +1 -0
- package/dist/utils/docs-preview/docusaurus-setup.d.ts +38 -0
- package/dist/utils/docs-preview/docusaurus-setup.d.ts.map +1 -0
- package/dist/utils/docs-preview/docusaurus-setup.js +177 -0
- package/dist/utils/docs-preview/docusaurus-setup.js.map +1 -0
- package/dist/utils/docs-preview/index.d.ts +11 -0
- package/dist/utils/docs-preview/index.d.ts.map +1 -0
- package/dist/utils/docs-preview/index.js +17 -0
- package/dist/utils/docs-preview/index.js.map +1 -0
- package/dist/utils/docs-preview/package-installer.d.ts +42 -0
- package/dist/utils/docs-preview/package-installer.d.ts.map +1 -0
- package/dist/utils/docs-preview/package-installer.js +182 -0
- package/dist/utils/docs-preview/package-installer.js.map +1 -0
- package/dist/utils/docs-preview/server-manager.d.ts +30 -0
- package/dist/utils/docs-preview/server-manager.d.ts.map +1 -0
- package/dist/utils/docs-preview/server-manager.js +207 -0
- package/dist/utils/docs-preview/server-manager.js.map +1 -0
- package/dist/utils/docs-preview/sidebar-builder.d.ts +31 -0
- package/dist/utils/docs-preview/sidebar-builder.d.ts.map +1 -0
- package/dist/utils/docs-preview/sidebar-builder.js +202 -0
- package/dist/utils/docs-preview/sidebar-builder.js.map +1 -0
- package/dist/utils/docs-preview/types.d.ts +60 -0
- package/dist/utils/docs-preview/types.d.ts.map +1 -0
- package/dist/utils/docs-preview/types.js +5 -0
- package/dist/utils/docs-preview/types.js.map +1 -0
- package/dist/utils/docs-preview.bak/config-generator.d.ts +46 -0
- package/dist/utils/docs-preview.bak/config-generator.d.ts.map +1 -0
- package/dist/utils/docs-preview.bak/config-generator.js +377 -0
- package/dist/utils/docs-preview.bak/config-generator.js.map +1 -0
- package/dist/utils/docs-preview.bak/package-installer.d.ts +42 -0
- package/dist/utils/docs-preview.bak/package-installer.d.ts.map +1 -0
- package/dist/utils/docs-preview.bak/package-installer.js +182 -0
- package/dist/utils/docs-preview.bak/package-installer.js.map +1 -0
- package/dist/utils/docs-preview.bak/server-manager.d.ts +30 -0
- package/dist/utils/docs-preview.bak/server-manager.d.ts.map +1 -0
- package/dist/utils/docs-preview.bak/server-manager.js +207 -0
- package/dist/utils/docs-preview.bak/server-manager.js.map +1 -0
- package/dist/utils/docs-preview.bak/sidebar-builder.d.ts +31 -0
- package/dist/utils/docs-preview.bak/sidebar-builder.d.ts.map +1 -0
- package/dist/utils/docs-preview.bak/sidebar-builder.js +202 -0
- package/dist/utils/docs-preview.bak/sidebar-builder.js.map +1 -0
- package/dist/utils/docs-preview.bak/types.d.ts +60 -0
- package/dist/utils/docs-preview.bak/types.d.ts.map +1 -0
- package/dist/utils/docs-preview.bak/types.js +5 -0
- package/dist/utils/docs-preview.bak/types.js.map +1 -0
- package/package.json +1 -1
- package/src/templates/.gitattributes.template +35 -0
- package/dist/cli/commands/plugin.js +0 -322
- package/dist/cli/commands/plugin.js.map +0 -1
- package/dist/core/plugin-detector.d.ts +0 -97
- package/dist/core/plugin-detector.d.ts.map +0 -1
- package/dist/core/plugin-detector.js +0 -374
- package/dist/core/plugin-detector.js.map +0 -1
- package/dist/core/plugin-manager.d.ts +0 -144
- package/dist/core/plugin-manager.d.ts.map +0 -1
- package/dist/core/plugin-manager.js +0 -393
- package/dist/core/plugin-manager.js.map +0 -1
- package/dist/utils/plugin-detection.js +0 -229
- package/dist/utils/plugin-detection.js.map +0 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package installer for Docusaurus dependencies
|
|
3
|
+
* Handles npm install with progress tracking
|
|
4
|
+
*/
|
|
5
|
+
import { InstallOptions, NodeVersion } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Check Node.js version
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkNodeVersion(): Promise<NodeVersion>;
|
|
10
|
+
/**
|
|
11
|
+
* Check if npm is installed
|
|
12
|
+
*/
|
|
13
|
+
export declare function checkNpmInstalled(): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Install npm packages
|
|
16
|
+
*/
|
|
17
|
+
export declare function installPackages(options: InstallOptions): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Install Docusaurus packages
|
|
20
|
+
*/
|
|
21
|
+
export declare function installDocusaurus(targetDir: string): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Check if Docusaurus is installed
|
|
24
|
+
*/
|
|
25
|
+
export declare function isDocusaurusInstalled(targetDir: string): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Clean npm cache
|
|
28
|
+
*/
|
|
29
|
+
export declare function cleanNpmCache(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Get installed npm package version
|
|
32
|
+
*/
|
|
33
|
+
export declare function getPackageVersion(targetDir: string, packageName: string): Promise<string | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Estimate install size (rough estimate)
|
|
36
|
+
*/
|
|
37
|
+
export declare function estimateInstallSize(): string;
|
|
38
|
+
/**
|
|
39
|
+
* Estimate install time (rough estimate)
|
|
40
|
+
*/
|
|
41
|
+
export declare function estimateInstallTime(): string;
|
|
42
|
+
//# sourceMappingURL=package-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-installer.d.ts","sourceRoot":"","sources":["../../../src/utils/docs-preview/package-installer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzD;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,CAqB7D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO1D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD5E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BxE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyB/E;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAEnD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAatG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAG5C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAG5C"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package installer for Docusaurus dependencies
|
|
3
|
+
* Handles npm install with progress tracking
|
|
4
|
+
*/
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import * as fs from 'fs-extra';
|
|
7
|
+
import { spawn } from 'child_process';
|
|
8
|
+
import { execFileNoThrow } from '../execFileNoThrow.js';
|
|
9
|
+
/**
|
|
10
|
+
* Check Node.js version
|
|
11
|
+
*/
|
|
12
|
+
export async function checkNodeVersion() {
|
|
13
|
+
try {
|
|
14
|
+
const result = await execFileNoThrow('node', ['--version']);
|
|
15
|
+
if (result.status !== 0) {
|
|
16
|
+
throw new Error('Node.js not found');
|
|
17
|
+
}
|
|
18
|
+
const versionString = result.stdout.trim().replace('v', '');
|
|
19
|
+
const [major, minor, patch] = versionString.split('.').map(Number);
|
|
20
|
+
return {
|
|
21
|
+
version: versionString,
|
|
22
|
+
major,
|
|
23
|
+
minor,
|
|
24
|
+
patch,
|
|
25
|
+
compatible: major >= 18
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
throw new Error('Node.js not found. Please install Node.js 18+ from https://nodejs.org/');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if npm is installed
|
|
34
|
+
*/
|
|
35
|
+
export async function checkNpmInstalled() {
|
|
36
|
+
try {
|
|
37
|
+
const result = await execFileNoThrow('npm', ['--version']);
|
|
38
|
+
return result.status === 0;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Install npm packages
|
|
46
|
+
*/
|
|
47
|
+
export async function installPackages(options) {
|
|
48
|
+
const { targetDir, packages, dev = false } = options;
|
|
49
|
+
// Ensure target directory exists
|
|
50
|
+
await fs.ensureDir(targetDir);
|
|
51
|
+
// Build npm install command
|
|
52
|
+
const args = ['install'];
|
|
53
|
+
if (dev) {
|
|
54
|
+
args.push('--save-dev');
|
|
55
|
+
}
|
|
56
|
+
args.push(...packages);
|
|
57
|
+
// Spawn npm install process
|
|
58
|
+
return new Promise((resolve, reject) => {
|
|
59
|
+
const npmProcess = spawn('npm', args, {
|
|
60
|
+
cwd: targetDir,
|
|
61
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
62
|
+
shell: true
|
|
63
|
+
});
|
|
64
|
+
let stdout = '';
|
|
65
|
+
let stderr = '';
|
|
66
|
+
npmProcess.stdout.on('data', (data) => {
|
|
67
|
+
stdout += data.toString();
|
|
68
|
+
// Show progress to console
|
|
69
|
+
process.stdout.write('.');
|
|
70
|
+
});
|
|
71
|
+
npmProcess.stderr.on('data', (data) => {
|
|
72
|
+
stderr += data.toString();
|
|
73
|
+
});
|
|
74
|
+
npmProcess.on('close', (code) => {
|
|
75
|
+
if (code === 0) {
|
|
76
|
+
console.log(' ✅');
|
|
77
|
+
resolve();
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
console.log(' ❌');
|
|
81
|
+
reject(new Error(`npm install failed with code ${code}\n${stderr}`));
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
npmProcess.on('error', (error) => {
|
|
85
|
+
reject(new Error(`Failed to start npm install: ${error.message}`));
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Install Docusaurus packages
|
|
91
|
+
*/
|
|
92
|
+
export async function installDocusaurus(targetDir) {
|
|
93
|
+
const packages = [
|
|
94
|
+
'@docusaurus/core@^3.0.0',
|
|
95
|
+
'@docusaurus/preset-classic@^3.0.0',
|
|
96
|
+
'@docusaurus/theme-mermaid@^3.0.0',
|
|
97
|
+
'@mdx-js/react@^3.0.0',
|
|
98
|
+
'clsx@^2.0.0',
|
|
99
|
+
'prism-react-renderer@^2.1.0',
|
|
100
|
+
'react@^18.0.0',
|
|
101
|
+
'react-dom@^18.0.0'
|
|
102
|
+
];
|
|
103
|
+
const devPackages = [
|
|
104
|
+
'@docusaurus/module-type-aliases@^3.0.0',
|
|
105
|
+
'@docusaurus/types@^3.0.0'
|
|
106
|
+
];
|
|
107
|
+
console.log(' Installing Docusaurus packages...');
|
|
108
|
+
await installPackages({
|
|
109
|
+
targetDir,
|
|
110
|
+
packages,
|
|
111
|
+
dev: false
|
|
112
|
+
});
|
|
113
|
+
console.log(' Installing dev dependencies...');
|
|
114
|
+
await installPackages({
|
|
115
|
+
targetDir,
|
|
116
|
+
packages: devPackages,
|
|
117
|
+
dev: true
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check if Docusaurus is installed
|
|
122
|
+
*/
|
|
123
|
+
export async function isDocusaurusInstalled(targetDir) {
|
|
124
|
+
try {
|
|
125
|
+
const packageJsonPath = path.join(targetDir, 'package.json');
|
|
126
|
+
const nodeModulesPath = path.join(targetDir, 'node_modules');
|
|
127
|
+
// Check if package.json exists
|
|
128
|
+
if (!await fs.pathExists(packageJsonPath)) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
// Check if node_modules exists
|
|
132
|
+
if (!await fs.pathExists(nodeModulesPath)) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
// Check if @docusaurus/core is installed
|
|
136
|
+
const docusaurusCorePath = path.join(nodeModulesPath, '@docusaurus', 'core');
|
|
137
|
+
if (!await fs.pathExists(docusaurusCorePath)) {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Clean npm cache
|
|
148
|
+
*/
|
|
149
|
+
export async function cleanNpmCache() {
|
|
150
|
+
await execFileNoThrow('npm', ['cache', 'clean', '--force']);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get installed npm package version
|
|
154
|
+
*/
|
|
155
|
+
export async function getPackageVersion(targetDir, packageName) {
|
|
156
|
+
try {
|
|
157
|
+
const packageJsonPath = path.join(targetDir, 'node_modules', packageName, 'package.json');
|
|
158
|
+
if (!await fs.pathExists(packageJsonPath)) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
const packageJson = await fs.readJSON(packageJsonPath);
|
|
162
|
+
return packageJson.version || null;
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Estimate install size (rough estimate)
|
|
170
|
+
*/
|
|
171
|
+
export function estimateInstallSize() {
|
|
172
|
+
// Docusaurus + React + dependencies ≈ 150-200 MB
|
|
173
|
+
return '~150 MB';
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Estimate install time (rough estimate)
|
|
177
|
+
*/
|
|
178
|
+
export function estimateInstallTime() {
|
|
179
|
+
// Typically 20-40 seconds depending on network and CPU
|
|
180
|
+
return '~30 seconds';
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=package-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-installer.js","sourceRoot":"","sources":["../../../src/utils/docs-preview/package-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server manager for Docusaurus dev server
|
|
3
|
+
* Handles port finding, server start/stop, browser opening
|
|
4
|
+
*/
|
|
5
|
+
import { ServerOptions, ServerProcess } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Find an available port in the given range
|
|
8
|
+
*/
|
|
9
|
+
export declare function findAvailablePort(startPort?: number, endPort?: number): Promise<number>;
|
|
10
|
+
/**
|
|
11
|
+
* Start Docusaurus dev server
|
|
12
|
+
*/
|
|
13
|
+
export declare function startDevServer(targetDir: string, options: ServerOptions): Promise<ServerProcess>;
|
|
14
|
+
/**
|
|
15
|
+
* Open URL in default browser
|
|
16
|
+
*/
|
|
17
|
+
export declare function openBrowserUrl(url: string): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Kill all Docusaurus processes (SAFE - uses execFileNoThrow)
|
|
20
|
+
*/
|
|
21
|
+
export declare function killAllDocusaurusProcesses(): Promise<number>;
|
|
22
|
+
/**
|
|
23
|
+
* Check if Docusaurus server is running
|
|
24
|
+
*/
|
|
25
|
+
export declare function isDocusaurusRunning(port: number): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Get server URL
|
|
28
|
+
*/
|
|
29
|
+
export declare function getServerUrl(port: number, host?: string): string;
|
|
30
|
+
//# sourceMappingURL=server-manager.d.ts.map
|
|
@@ -0,0 +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;AAG1D;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,GAAE,MAAa,EAAE,OAAO,GAAE,MAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAQzG;AAsBD;;GAEG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,aAAa,CAAC,CAiCxB;AA8ED;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/D;AAED;;GAEG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,MAAM,CAAC,CAwDlE;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"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server manager for Docusaurus dev server
|
|
3
|
+
* Handles port finding, server start/stop, browser opening
|
|
4
|
+
*/
|
|
5
|
+
import { spawn } from 'child_process';
|
|
6
|
+
import * as net from 'net';
|
|
7
|
+
import { execFileNoThrow } from '../execFileNoThrow.js';
|
|
8
|
+
/**
|
|
9
|
+
* Find an available port in the given range
|
|
10
|
+
*/
|
|
11
|
+
export async function findAvailablePort(startPort = 3000, endPort = 3010) {
|
|
12
|
+
for (let port = startPort; port <= endPort; port++) {
|
|
13
|
+
if (await isPortAvailable(port)) {
|
|
14
|
+
return port;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
throw new Error(`No available ports found in range ${startPort}-${endPort}`);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if a port is available
|
|
21
|
+
*/
|
|
22
|
+
function isPortAvailable(port) {
|
|
23
|
+
return new Promise((resolve) => {
|
|
24
|
+
const server = net.createServer();
|
|
25
|
+
server.once('error', () => {
|
|
26
|
+
resolve(false);
|
|
27
|
+
});
|
|
28
|
+
server.once('listening', () => {
|
|
29
|
+
server.close();
|
|
30
|
+
resolve(true);
|
|
31
|
+
});
|
|
32
|
+
server.listen(port);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Start Docusaurus dev server
|
|
37
|
+
*/
|
|
38
|
+
export async function startDevServer(targetDir, options) {
|
|
39
|
+
const { port, openBrowser, host = 'localhost' } = options;
|
|
40
|
+
// Check if port is available
|
|
41
|
+
if (!await isPortAvailable(port)) {
|
|
42
|
+
throw new Error(`Port ${port} is already in use`);
|
|
43
|
+
}
|
|
44
|
+
// Start Docusaurus dev server
|
|
45
|
+
const process = spawn('npm', ['run', 'start', '--', '--port', port.toString(), '--host', host], {
|
|
46
|
+
cwd: targetDir,
|
|
47
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
48
|
+
shell: true
|
|
49
|
+
});
|
|
50
|
+
const url = `http://${host}:${port}`;
|
|
51
|
+
// Wait for server to be ready
|
|
52
|
+
await waitForServer(url, 30000); // 30 second timeout
|
|
53
|
+
// Open browser if requested
|
|
54
|
+
if (openBrowser) {
|
|
55
|
+
await openBrowserUrl(url);
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
pid: process.pid,
|
|
59
|
+
port,
|
|
60
|
+
url,
|
|
61
|
+
stop: async () => {
|
|
62
|
+
await stopServer(process);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Wait for server to be ready
|
|
68
|
+
*/
|
|
69
|
+
function waitForServer(url, timeout) {
|
|
70
|
+
return new Promise((resolve, reject) => {
|
|
71
|
+
const startTime = Date.now();
|
|
72
|
+
const check = async () => {
|
|
73
|
+
try {
|
|
74
|
+
const http = await import('http');
|
|
75
|
+
const urlObj = new URL(url);
|
|
76
|
+
const req = http.get({
|
|
77
|
+
hostname: urlObj.hostname,
|
|
78
|
+
port: urlObj.port,
|
|
79
|
+
path: urlObj.pathname,
|
|
80
|
+
timeout: 2000
|
|
81
|
+
}, (res) => {
|
|
82
|
+
if (res.statusCode === 200 || res.statusCode === 304) {
|
|
83
|
+
resolve();
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
scheduleNextCheck();
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
req.on('error', () => {
|
|
90
|
+
scheduleNextCheck();
|
|
91
|
+
});
|
|
92
|
+
req.on('timeout', () => {
|
|
93
|
+
req.destroy();
|
|
94
|
+
scheduleNextCheck();
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
scheduleNextCheck();
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const scheduleNextCheck = () => {
|
|
102
|
+
if (Date.now() - startTime > timeout) {
|
|
103
|
+
reject(new Error(`Server failed to start within ${timeout}ms`));
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
setTimeout(check, 1000);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
check();
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Stop server process
|
|
114
|
+
*/
|
|
115
|
+
function stopServer(process) {
|
|
116
|
+
return new Promise((resolve) => {
|
|
117
|
+
if (!process.pid) {
|
|
118
|
+
resolve();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
process.once('exit', () => {
|
|
122
|
+
resolve();
|
|
123
|
+
});
|
|
124
|
+
// Try graceful shutdown first
|
|
125
|
+
process.kill('SIGTERM');
|
|
126
|
+
// Force kill after 5 seconds if still running
|
|
127
|
+
setTimeout(() => {
|
|
128
|
+
if (process.pid) {
|
|
129
|
+
process.kill('SIGKILL');
|
|
130
|
+
}
|
|
131
|
+
}, 5000);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Open URL in default browser
|
|
136
|
+
*/
|
|
137
|
+
export async function openBrowserUrl(url) {
|
|
138
|
+
const { default: open } = await import('open');
|
|
139
|
+
await open(url);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Kill all Docusaurus processes (SAFE - uses execFileNoThrow)
|
|
143
|
+
*/
|
|
144
|
+
export async function killAllDocusaurusProcesses() {
|
|
145
|
+
const platform = process.platform;
|
|
146
|
+
try {
|
|
147
|
+
if (platform === 'win32') {
|
|
148
|
+
// Windows: Use tasklist and taskkill
|
|
149
|
+
const listResult = await execFileNoThrow('tasklist', ['/FI', 'IMAGENAME eq node.exe', '/FO', 'CSV']);
|
|
150
|
+
if (listResult.status !== 0) {
|
|
151
|
+
return 0;
|
|
152
|
+
}
|
|
153
|
+
const processes = listResult.stdout
|
|
154
|
+
.split('\n')
|
|
155
|
+
.filter(line => line.includes('docusaurus'))
|
|
156
|
+
.map(line => {
|
|
157
|
+
const match = line.match(/"([^"]+)","\d+"/);
|
|
158
|
+
return match ? match[1] : null;
|
|
159
|
+
})
|
|
160
|
+
.filter(Boolean);
|
|
161
|
+
for (const pid of processes) {
|
|
162
|
+
await execFileNoThrow('taskkill', ['/F', '/PID', pid]);
|
|
163
|
+
}
|
|
164
|
+
return processes.length;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// Unix-like (macOS, Linux): Use ps and kill
|
|
168
|
+
const psResult = await execFileNoThrow('ps', ['aux']);
|
|
169
|
+
if (psResult.status !== 0) {
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
172
|
+
const processes = psResult.stdout
|
|
173
|
+
.split('\n')
|
|
174
|
+
.filter(line => line.includes('docusaurus') && !line.includes('grep'))
|
|
175
|
+
.map(line => {
|
|
176
|
+
const parts = line.trim().split(/\s+/);
|
|
177
|
+
return parts[1]; // PID is second column
|
|
178
|
+
});
|
|
179
|
+
for (const pid of processes) {
|
|
180
|
+
try {
|
|
181
|
+
await execFileNoThrow('kill', [pid]);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Ignore errors (process may have already exited)
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return processes.length;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
// No processes found or error occurred
|
|
192
|
+
return 0;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Check if Docusaurus server is running
|
|
197
|
+
*/
|
|
198
|
+
export async function isDocusaurusRunning(port) {
|
|
199
|
+
return !(await isPortAvailable(port));
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Get server URL
|
|
203
|
+
*/
|
|
204
|
+
export function getServerUrl(port, host = 'localhost') {
|
|
205
|
+
return `http://${host}:${port}`;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=server-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-manager.js","sourceRoot":"","sources":["../../../src/utils/docs-preview/server-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sidebar builder for Docusaurus
|
|
3
|
+
* Automatically generates sidebar.js from .specweave/docs/ folder structure
|
|
4
|
+
*/
|
|
5
|
+
import { Sidebar } from './types.js';
|
|
6
|
+
export interface SidebarBuilderOptions {
|
|
7
|
+
docsPath: string;
|
|
8
|
+
excludeFolders?: string[];
|
|
9
|
+
maxDepth?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Build sidebar from folder structure
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildSidebar(options: SidebarBuilderOptions): Promise<Sidebar>;
|
|
15
|
+
/**
|
|
16
|
+
* Generate sidebars.js content as string
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateSidebarsJS(sidebar: Sidebar): string;
|
|
19
|
+
/**
|
|
20
|
+
* Write sidebar to file
|
|
21
|
+
*/
|
|
22
|
+
export declare function writeSidebar(filePath: string, sidebar: Sidebar): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Count total documents in sidebar
|
|
25
|
+
*/
|
|
26
|
+
export declare function countDocuments(sidebar: Sidebar): number;
|
|
27
|
+
/**
|
|
28
|
+
* Count total categories in sidebar
|
|
29
|
+
*/
|
|
30
|
+
export declare function countCategories(sidebar: Sidebar): number;
|
|
31
|
+
//# sourceMappingURL=sidebar-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidebar-builder.d.ts","sourceRoot":"","sources":["../../../src/utils/docs-preview/sidebar-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,OAAO,EAAe,MAAM,YAAY,CAAC;AA0BlD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBnF;AAwHD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAW3D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAevD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAgBxD"}
|