specweave 0.8.3 → 0.8.4

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.
Files changed (69) hide show
  1. package/.claude-plugin/marketplace.json +11 -0
  2. package/dist/adapters/adapter-loader.d.ts +4 -4
  3. package/dist/adapters/adapter-loader.d.ts.map +1 -1
  4. package/dist/adapters/adapter-loader.js +8 -7
  5. package/dist/adapters/adapter-loader.js.map +1 -1
  6. package/dist/cli/commands/init.d.ts.map +1 -1
  7. package/dist/cli/commands/init.js +7 -1
  8. package/dist/cli/commands/init.js.map +1 -1
  9. package/dist/utils/docs-preview/config-generator.d.ts +46 -0
  10. package/dist/utils/docs-preview/config-generator.d.ts.map +1 -0
  11. package/dist/utils/docs-preview/config-generator.js +377 -0
  12. package/dist/utils/docs-preview/config-generator.js.map +1 -0
  13. package/dist/utils/docs-preview/docusaurus-setup.d.ts +38 -0
  14. package/dist/utils/docs-preview/docusaurus-setup.d.ts.map +1 -0
  15. package/dist/utils/docs-preview/docusaurus-setup.js +177 -0
  16. package/dist/utils/docs-preview/docusaurus-setup.js.map +1 -0
  17. package/dist/utils/docs-preview/index.d.ts +11 -0
  18. package/dist/utils/docs-preview/index.d.ts.map +1 -0
  19. package/dist/utils/docs-preview/index.js +17 -0
  20. package/dist/utils/docs-preview/index.js.map +1 -0
  21. package/dist/utils/docs-preview/package-installer.d.ts +42 -0
  22. package/dist/utils/docs-preview/package-installer.d.ts.map +1 -0
  23. package/dist/utils/docs-preview/package-installer.js +182 -0
  24. package/dist/utils/docs-preview/package-installer.js.map +1 -0
  25. package/dist/utils/docs-preview/server-manager.d.ts +30 -0
  26. package/dist/utils/docs-preview/server-manager.d.ts.map +1 -0
  27. package/dist/utils/docs-preview/server-manager.js +207 -0
  28. package/dist/utils/docs-preview/server-manager.js.map +1 -0
  29. package/dist/utils/docs-preview/sidebar-builder.d.ts +31 -0
  30. package/dist/utils/docs-preview/sidebar-builder.d.ts.map +1 -0
  31. package/dist/utils/docs-preview/sidebar-builder.js +202 -0
  32. package/dist/utils/docs-preview/sidebar-builder.js.map +1 -0
  33. package/dist/utils/docs-preview/types.d.ts +60 -0
  34. package/dist/utils/docs-preview/types.d.ts.map +1 -0
  35. package/dist/utils/docs-preview/types.js +5 -0
  36. package/dist/utils/docs-preview/types.js.map +1 -0
  37. package/dist/utils/docs-preview.bak/config-generator.d.ts +46 -0
  38. package/dist/utils/docs-preview.bak/config-generator.d.ts.map +1 -0
  39. package/dist/utils/docs-preview.bak/config-generator.js +377 -0
  40. package/dist/utils/docs-preview.bak/config-generator.js.map +1 -0
  41. package/dist/utils/docs-preview.bak/package-installer.d.ts +42 -0
  42. package/dist/utils/docs-preview.bak/package-installer.d.ts.map +1 -0
  43. package/dist/utils/docs-preview.bak/package-installer.js +182 -0
  44. package/dist/utils/docs-preview.bak/package-installer.js.map +1 -0
  45. package/dist/utils/docs-preview.bak/server-manager.d.ts +30 -0
  46. package/dist/utils/docs-preview.bak/server-manager.d.ts.map +1 -0
  47. package/dist/utils/docs-preview.bak/server-manager.js +207 -0
  48. package/dist/utils/docs-preview.bak/server-manager.js.map +1 -0
  49. package/dist/utils/docs-preview.bak/sidebar-builder.d.ts +31 -0
  50. package/dist/utils/docs-preview.bak/sidebar-builder.d.ts.map +1 -0
  51. package/dist/utils/docs-preview.bak/sidebar-builder.js +202 -0
  52. package/dist/utils/docs-preview.bak/sidebar-builder.js.map +1 -0
  53. package/dist/utils/docs-preview.bak/types.d.ts +60 -0
  54. package/dist/utils/docs-preview.bak/types.d.ts.map +1 -0
  55. package/dist/utils/docs-preview.bak/types.js +5 -0
  56. package/dist/utils/docs-preview.bak/types.js.map +1 -0
  57. package/package.json +1 -1
  58. package/dist/cli/commands/plugin.js +0 -322
  59. package/dist/cli/commands/plugin.js.map +0 -1
  60. package/dist/core/plugin-detector.d.ts +0 -97
  61. package/dist/core/plugin-detector.d.ts.map +0 -1
  62. package/dist/core/plugin-detector.js +0 -374
  63. package/dist/core/plugin-detector.js.map +0 -1
  64. package/dist/core/plugin-manager.d.ts +0 -144
  65. package/dist/core/plugin-manager.d.ts.map +0 -1
  66. package/dist/core/plugin-manager.js +0 -393
  67. package/dist/core/plugin-manager.js.map +0 -1
  68. package/dist/utils/plugin-detection.js +0 -229
  69. package/dist/utils/plugin-detection.js.map +0 -1
@@ -0,0 +1,377 @@
1
+ /**
2
+ * Docusaurus configuration generator
3
+ * Generates docusaurus.config.js with sensible defaults
4
+ */
5
+ import * as path from 'path';
6
+ import * as fs from 'fs-extra';
7
+ /**
8
+ * Generate docusaurus.config.js content
9
+ */
10
+ export function generateDocusaurusConfig(config) {
11
+ const { title, tagline, url, baseUrl, docsPath, theme = 'default' } = config;
12
+ return `// @ts-check
13
+ // This is a Docusaurus site configuration object.
14
+ // Auto-generated by SpecWeave docs-preview plugin
15
+ // Generated: ${new Date().toISOString()}
16
+
17
+ import {themes as prismThemes} from 'prism-react-renderer';
18
+
19
+ /** @type {import('@docusaurus/types').Config} */
20
+ const config = {
21
+ title: '${title}',
22
+ tagline: '${tagline}',
23
+ favicon: 'img/favicon.ico',
24
+
25
+ // Production URL
26
+ url: '${url}',
27
+ baseUrl: '${baseUrl}',
28
+
29
+ // GitHub Pages deployment config
30
+ organizationName: 'your-org',
31
+ projectName: 'your-repo',
32
+
33
+ onBrokenLinks: 'warn',
34
+ onBrokenMarkdownLinks: 'warn',
35
+
36
+ // Internationalization
37
+ i18n: {
38
+ defaultLocale: 'en',
39
+ locales: ['en'],
40
+ },
41
+
42
+ presets: [
43
+ [
44
+ 'classic',
45
+ /** @type {import('@docusaurus/preset-classic').Options} */
46
+ ({
47
+ docs: {
48
+ routeBasePath: '/',
49
+ path: '${docsPath}',
50
+ sidebarPath: './sidebars.js',
51
+ editUrl: undefined, // Disable "Edit this page" for internal docs
52
+ },
53
+ blog: false, // Disable blog
54
+ theme: {
55
+ customCss: './src/css/custom.css',
56
+ },
57
+ }),
58
+ ],
59
+ ],
60
+
61
+ themeConfig:
62
+ /** @type {import('@docusaurus/preset-classic').ThemeConfig} */
63
+ ({
64
+ // Social card image (optional)
65
+ image: 'img/docusaurus-social-card.jpg',
66
+
67
+ navbar: {
68
+ title: '${title}',
69
+ logo: {
70
+ alt: '${title} Logo',
71
+ src: 'img/logo.svg',
72
+ },
73
+ items: [
74
+ {
75
+ type: 'docSidebar',
76
+ sidebarId: 'docs',
77
+ position: 'left',
78
+ label: 'Documentation',
79
+ },
80
+ ],
81
+ },
82
+
83
+ footer: {
84
+ style: 'dark',
85
+ links: [
86
+ {
87
+ title: 'Documentation',
88
+ items: [
89
+ {
90
+ label: 'Strategy',
91
+ to: '/strategy',
92
+ },
93
+ {
94
+ label: 'Architecture',
95
+ to: '/architecture',
96
+ },
97
+ ],
98
+ },
99
+ ],
100
+ copyright: \`Copyright © \${new Date().getFullYear()} SpecWeave. Built with Docusaurus.\`,
101
+ },
102
+
103
+ prism: {
104
+ theme: prismThemes.github,
105
+ darkTheme: prismThemes.dracula,
106
+ additionalLanguages: ['bash', 'typescript', 'javascript', 'json', 'yaml'],
107
+ },
108
+ }),
109
+
110
+ // Mermaid diagrams support
111
+ markdown: {
112
+ mermaid: true,
113
+ },
114
+ themes: ['@docusaurus/theme-mermaid'],
115
+ };
116
+
117
+ export default config;
118
+ `;
119
+ }
120
+ /**
121
+ * Write docusaurus.config.js to file
122
+ */
123
+ export async function writeDocusaurusConfig(targetDir, config) {
124
+ const configPath = path.join(targetDir, 'docusaurus.config.js');
125
+ const content = generateDocusaurusConfig(config);
126
+ await fs.ensureDir(targetDir);
127
+ await fs.writeFile(configPath, content, 'utf-8');
128
+ }
129
+ /**
130
+ * Generate package.json for Docusaurus site
131
+ */
132
+ export function generatePackageJSON(title) {
133
+ return JSON.stringify({
134
+ name: 'specweave-docs',
135
+ version: '1.0.0',
136
+ description: `${title} - Documentation Site`,
137
+ private: true,
138
+ scripts: {
139
+ docusaurus: 'docusaurus',
140
+ start: 'docusaurus start',
141
+ build: 'docusaurus build',
142
+ swizzle: 'docusaurus swizzle',
143
+ deploy: 'docusaurus deploy',
144
+ clear: 'docusaurus clear',
145
+ serve: 'docusaurus serve',
146
+ 'write-translations': 'docusaurus write-translations',
147
+ 'write-heading-ids': 'docusaurus write-heading-ids'
148
+ },
149
+ dependencies: {
150
+ '@docusaurus/core': '^3.0.0',
151
+ '@docusaurus/preset-classic': '^3.0.0',
152
+ '@docusaurus/theme-mermaid': '^3.0.0',
153
+ '@mdx-js/react': '^3.0.0',
154
+ 'clsx': '^2.0.0',
155
+ 'prism-react-renderer': '^2.1.0',
156
+ 'react': '^18.0.0',
157
+ 'react-dom': '^18.0.0'
158
+ },
159
+ devDependencies: {
160
+ '@docusaurus/module-type-aliases': '^3.0.0',
161
+ '@docusaurus/types': '^3.0.0'
162
+ },
163
+ engines: {
164
+ node: '>=18.0'
165
+ }
166
+ }, null, 2);
167
+ }
168
+ /**
169
+ * Write package.json to file
170
+ */
171
+ export async function writePackageJSON(targetDir, title) {
172
+ const packagePath = path.join(targetDir, 'package.json');
173
+ const content = generatePackageJSON(title);
174
+ await fs.ensureDir(targetDir);
175
+ await fs.writeFile(packagePath, content, 'utf-8');
176
+ }
177
+ /**
178
+ * Generate custom CSS for theme customization
179
+ */
180
+ export function generateCustomCSS(theme) {
181
+ const themes = {
182
+ default: `
183
+ :root {
184
+ --ifm-color-primary: #2e8555;
185
+ --ifm-color-primary-dark: #29784c;
186
+ --ifm-color-primary-darker: #277148;
187
+ --ifm-color-primary-darkest: #205d3b;
188
+ --ifm-color-primary-light: #33925d;
189
+ --ifm-color-primary-lighter: #359962;
190
+ --ifm-color-primary-lightest: #3cad6e;
191
+ --ifm-code-font-size: 95%;
192
+ --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
193
+ }
194
+
195
+ [data-theme='dark'] {
196
+ --ifm-color-primary: #25c2a0;
197
+ --ifm-color-primary-dark: #21af90;
198
+ --ifm-color-primary-darker: #1fa588;
199
+ --ifm-color-primary-darkest: #1a8870;
200
+ --ifm-color-primary-light: #29d5b0;
201
+ --ifm-color-primary-lighter: #32d8b4;
202
+ --ifm-color-primary-lightest: #4fddbf;
203
+ --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
204
+ }
205
+ `,
206
+ classic: `
207
+ :root {
208
+ --ifm-color-primary: #0066cc;
209
+ --ifm-color-primary-dark: #005cb8;
210
+ --ifm-color-primary-darker: #0056ad;
211
+ --ifm-color-primary-darkest: #00478f;
212
+ --ifm-color-primary-light: #0070e0;
213
+ --ifm-color-primary-lighter: #0076eb;
214
+ --ifm-color-primary-lightest: #1a85ff;
215
+ --ifm-code-font-size: 95%;
216
+ }
217
+ `,
218
+ dark: `
219
+ :root {
220
+ --ifm-color-primary: #1e1e1e;
221
+ --ifm-background-color: #0d1117;
222
+ --ifm-code-font-size: 95%;
223
+ }
224
+
225
+ [data-theme='dark'] {
226
+ --ifm-color-primary: #58a6ff;
227
+ --ifm-background-color: #0d1117;
228
+ }
229
+ `
230
+ };
231
+ return `/**
232
+ * Custom CSS for SpecWeave documentation
233
+ * Theme: ${theme}
234
+ * Auto-generated by SpecWeave docs-preview plugin
235
+ */
236
+
237
+ ${themes[theme]}
238
+
239
+ /* Custom styles */
240
+ .markdown {
241
+ --ifm-h1-font-size: 2rem;
242
+ --ifm-h2-font-size: 1.5rem;
243
+ --ifm-h3-font-size: 1.25rem;
244
+ }
245
+
246
+ /* Code blocks */
247
+ .prism-code {
248
+ font-size: 0.9rem;
249
+ }
250
+
251
+ /* Mermaid diagrams */
252
+ .docusaurus-mermaid-container {
253
+ text-align: center;
254
+ margin: 2rem 0;
255
+ }
256
+ `;
257
+ }
258
+ /**
259
+ * Write custom CSS to file
260
+ */
261
+ export async function writeCustomCSS(targetDir, theme) {
262
+ const cssPath = path.join(targetDir, 'src', 'css', 'custom.css');
263
+ const content = generateCustomCSS(theme);
264
+ await fs.ensureDir(path.dirname(cssPath));
265
+ await fs.writeFile(cssPath, content, 'utf-8');
266
+ }
267
+ /**
268
+ * Generate index page (landing page)
269
+ */
270
+ export function generateIndexPage(title, tagline) {
271
+ return `import React from 'react';
272
+ import clsx from 'clsx';
273
+ import Link from '@docusaurus/Link';
274
+ import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
275
+ import Layout from '@theme/Layout';
276
+ import styles from './index.module.css';
277
+
278
+ function HomepageHeader() {
279
+ const {siteConfig} = useDocusaurusContext();
280
+ return (
281
+ <header className={clsx('hero hero--primary', styles.heroBanner)}>
282
+ <div className="container">
283
+ <h1 className="hero__title">{siteConfig.title}</h1>
284
+ <p className="hero__subtitle">{siteConfig.tagline}</p>
285
+ <div className={styles.buttons}>
286
+ <Link
287
+ className="button button--secondary button--lg"
288
+ to="/strategy">
289
+ View Documentation
290
+ </Link>
291
+ </div>
292
+ </div>
293
+ </header>
294
+ );
295
+ }
296
+
297
+ export default function Home() {
298
+ const {siteConfig} = useDocusaurusContext();
299
+ return (
300
+ <Layout
301
+ title={\`\${siteConfig.title}\`}
302
+ description="${tagline}">
303
+ <HomepageHeader />
304
+ <main>
305
+ <div className="container" style={{marginTop: '2rem', marginBottom: '2rem'}}>
306
+ <div className="row">
307
+ <div className="col col--12">
308
+ <h2>Welcome to ${title}</h2>
309
+ <p>
310
+ This is your SpecWeave documentation site, automatically generated from your
311
+ <code>.specweave/docs/</code> folder.
312
+ </p>
313
+ <p>
314
+ Use the sidebar to navigate through your documentation:
315
+ </p>
316
+ <ul>
317
+ <li><strong>Strategy</strong>: Business rationale, PRDs, OKRs</li>
318
+ <li><strong>Specs</strong>: Feature specifications and user stories</li>
319
+ <li><strong>Architecture</strong>: Technical design, ADRs, diagrams</li>
320
+ <li><strong>Delivery</strong>: Build & release processes</li>
321
+ <li><strong>Operations</strong>: Runbooks, SLOs, incidents</li>
322
+ <li><strong>Governance</strong>: Policies, security, compliance</li>
323
+ </ul>
324
+ </div>
325
+ </div>
326
+ </div>
327
+ </main>
328
+ </Layout>
329
+ );
330
+ }
331
+ `;
332
+ }
333
+ /**
334
+ * Write index page to file
335
+ */
336
+ export async function writeIndexPage(targetDir, title, tagline) {
337
+ const indexPath = path.join(targetDir, 'src', 'pages', 'index.js');
338
+ const content = generateIndexPage(title, tagline);
339
+ await fs.ensureDir(path.dirname(indexPath));
340
+ await fs.writeFile(indexPath, content, 'utf-8');
341
+ }
342
+ /**
343
+ * Generate index.module.css for landing page styles
344
+ */
345
+ export function generateIndexModuleCSS() {
346
+ return `.heroBanner {
347
+ padding: 4rem 0;
348
+ text-align: center;
349
+ position: relative;
350
+ overflow: hidden;
351
+ }
352
+
353
+ @media screen and (max-width: 996px) {
354
+ .heroBanner {
355
+ padding: 2rem;
356
+ }
357
+ }
358
+
359
+ .buttons {
360
+ display: flex;
361
+ align-items: center;
362
+ justify-content: center;
363
+ gap: 1rem;
364
+ margin-top: 2rem;
365
+ }
366
+ `;
367
+ }
368
+ /**
369
+ * Write index.module.css to file
370
+ */
371
+ export async function writeIndexModuleCSS(targetDir) {
372
+ const cssPath = path.join(targetDir, 'src', 'pages', 'index.module.css');
373
+ const content = generateIndexModuleCSS();
374
+ await fs.ensureDir(path.dirname(cssPath));
375
+ await fs.writeFile(cssPath, content, 'utf-8');
376
+ }
377
+ //# sourceMappingURL=config-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-generator.js","sourceRoot":"","sources":["../../../src/utils/docs-preview.bak/config-generator.ts"],"names":[],"mappings":"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"}
@@ -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.bak/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.bak/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.bak/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"}