@girardmedia/bootspring 2.0.21 → 2.0.23

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 (159) hide show
  1. package/bin/bootspring.js +5 -0
  2. package/cli/org.js +474 -0
  3. package/cli/preseed/index.js +16 -0
  4. package/cli/preseed/interactive.js +143 -0
  5. package/cli/preseed/templates.js +227 -0
  6. package/cli/preseed.js +9 -301
  7. package/cli/seed/builders/ai-context-builder.js +85 -0
  8. package/cli/seed/builders/index.js +13 -0
  9. package/cli/seed/builders/seed-builder.js +272 -0
  10. package/cli/seed/extractors/content-extractors.js +383 -0
  11. package/cli/seed/extractors/index.js +47 -0
  12. package/cli/seed/extractors/metadata-extractors.js +167 -0
  13. package/cli/seed/extractors/section-extractor.js +54 -0
  14. package/cli/seed/extractors/stack-extractors.js +228 -0
  15. package/cli/seed/index.js +18 -0
  16. package/cli/seed/utils/folder-structure.js +84 -0
  17. package/cli/seed/utils/index.js +11 -0
  18. package/cli/seed.js +23 -1074
  19. package/core/api-client.js +77 -0
  20. package/core/entitlements.js +36 -0
  21. package/core/organizations.js +223 -0
  22. package/core/policies.js +51 -6
  23. package/core/policy-matrix.js +303 -0
  24. package/core/project-context.js +1 -0
  25. package/dist/cli/index.d.ts +3 -0
  26. package/dist/cli/index.js +3220 -0
  27. package/dist/cli/index.js.map +1 -0
  28. package/dist/context-McpJQa_2.d.ts +5710 -0
  29. package/dist/core/index.d.ts +635 -0
  30. package/dist/core/index.js +2593 -0
  31. package/dist/core/index.js.map +1 -0
  32. package/dist/index-QqbeEiDm.d.ts +857 -0
  33. package/dist/index-UiYCgwiH.d.ts +174 -0
  34. package/dist/index.d.ts +453 -0
  35. package/dist/index.js +44228 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/mcp/index.d.ts +1 -0
  38. package/dist/mcp/index.js +41173 -0
  39. package/dist/mcp/index.js.map +1 -0
  40. package/generators/index.ts +82 -0
  41. package/intelligence/orchestrator/config/failure-signatures.js +48 -0
  42. package/intelligence/orchestrator/config/index.js +23 -0
  43. package/intelligence/orchestrator/config/pack-lifecycle.js +262 -0
  44. package/intelligence/orchestrator/config/phases.js +111 -0
  45. package/intelligence/orchestrator/config/remediation.js +150 -0
  46. package/intelligence/orchestrator/config/workflows.js +168 -0
  47. package/intelligence/orchestrator/core/index.js +16 -0
  48. package/intelligence/orchestrator/core/state-manager.js +88 -0
  49. package/intelligence/orchestrator/core/telemetry.js +24 -0
  50. package/intelligence/orchestrator/index.js +17 -0
  51. package/intelligence/orchestrator.js +17 -512
  52. package/mcp/contracts/mcp-contract.v1.json +1 -1
  53. package/package.json +16 -3
  54. package/src/cli/agent.ts +703 -0
  55. package/src/cli/analyze.ts +640 -0
  56. package/src/cli/audit.ts +707 -0
  57. package/src/cli/auth.ts +930 -0
  58. package/src/cli/billing.ts +364 -0
  59. package/src/cli/build.ts +1089 -0
  60. package/src/cli/business.ts +508 -0
  61. package/src/cli/checkpoint-utils.ts +236 -0
  62. package/src/cli/checkpoint.ts +757 -0
  63. package/src/cli/cloud-sync.ts +534 -0
  64. package/src/cli/content.ts +273 -0
  65. package/src/cli/context.ts +667 -0
  66. package/src/cli/dashboard.ts +133 -0
  67. package/src/cli/deploy.ts +704 -0
  68. package/src/cli/doctor.ts +480 -0
  69. package/src/cli/fundraise.ts +494 -0
  70. package/src/cli/generate.ts +346 -0
  71. package/src/cli/github-cmd.ts +566 -0
  72. package/src/cli/health.ts +599 -0
  73. package/src/cli/index.ts +113 -0
  74. package/src/cli/init.ts +838 -0
  75. package/src/cli/legal.ts +495 -0
  76. package/src/cli/log.ts +316 -0
  77. package/src/cli/loop.ts +1660 -0
  78. package/src/cli/manager.ts +878 -0
  79. package/src/cli/mcp.ts +275 -0
  80. package/src/cli/memory.ts +346 -0
  81. package/src/cli/metrics.ts +590 -0
  82. package/src/cli/monitor.ts +960 -0
  83. package/src/cli/mvp.ts +662 -0
  84. package/src/cli/onboard.ts +663 -0
  85. package/src/cli/orchestrator.ts +622 -0
  86. package/src/cli/plugin.ts +483 -0
  87. package/src/cli/prd.ts +671 -0
  88. package/src/cli/preseed-start.ts +1633 -0
  89. package/src/cli/preseed.ts +2434 -0
  90. package/src/cli/project.ts +526 -0
  91. package/src/cli/quality.ts +885 -0
  92. package/src/cli/security.ts +1079 -0
  93. package/src/cli/seed.ts +1224 -0
  94. package/src/cli/skill.ts +537 -0
  95. package/src/cli/suggest.ts +1225 -0
  96. package/src/cli/switch.ts +518 -0
  97. package/src/cli/task.ts +780 -0
  98. package/src/cli/telemetry.ts +172 -0
  99. package/src/cli/todo.ts +627 -0
  100. package/src/cli/types.ts +15 -0
  101. package/src/cli/update.ts +334 -0
  102. package/src/cli/visualize.ts +609 -0
  103. package/src/cli/watch.ts +895 -0
  104. package/src/cli/workspace.ts +709 -0
  105. package/src/core/action-recorder.ts +673 -0
  106. package/src/core/analyze-workflow.ts +1453 -0
  107. package/src/core/api-client.ts +1120 -0
  108. package/src/core/audit-workflow.ts +1681 -0
  109. package/src/core/auth.ts +471 -0
  110. package/src/core/build-orchestrator.ts +509 -0
  111. package/src/core/build-state.ts +621 -0
  112. package/src/core/checkpoint-engine.ts +482 -0
  113. package/src/core/config.ts +1285 -0
  114. package/src/core/context-loader.ts +694 -0
  115. package/src/core/context.ts +410 -0
  116. package/src/core/deploy-workflow.ts +1085 -0
  117. package/src/core/entitlements.ts +322 -0
  118. package/src/core/github-sync.ts +720 -0
  119. package/src/core/index.ts +981 -0
  120. package/src/core/ingest.ts +1186 -0
  121. package/src/core/metrics-engine.ts +886 -0
  122. package/src/core/mvp.ts +847 -0
  123. package/src/core/onboard-workflow.ts +1293 -0
  124. package/src/core/policies.ts +81 -0
  125. package/src/core/preseed-workflow.ts +1163 -0
  126. package/src/core/preseed.ts +1826 -0
  127. package/src/core/project-context.ts +380 -0
  128. package/src/core/project-state.ts +699 -0
  129. package/src/core/r2-sync.ts +691 -0
  130. package/src/core/scaffold.ts +1715 -0
  131. package/src/core/session.ts +286 -0
  132. package/src/core/task-extractor.ts +799 -0
  133. package/src/core/telemetry.ts +371 -0
  134. package/src/core/tier-enforcement.ts +737 -0
  135. package/src/core/utils.ts +437 -0
  136. package/src/index.ts +29 -0
  137. package/src/intelligence/agent-collab.ts +2376 -0
  138. package/src/intelligence/auto-suggest.ts +713 -0
  139. package/src/intelligence/content-gen.ts +1351 -0
  140. package/src/intelligence/cross-project.ts +1692 -0
  141. package/src/intelligence/git-memory.ts +529 -0
  142. package/src/intelligence/index.ts +318 -0
  143. package/src/intelligence/orchestrator.ts +534 -0
  144. package/src/intelligence/prd.ts +466 -0
  145. package/src/intelligence/recommendations.ts +982 -0
  146. package/src/intelligence/workflow-composer.ts +1472 -0
  147. package/src/mcp/capabilities.ts +233 -0
  148. package/src/mcp/index.ts +37 -0
  149. package/src/mcp/registry.ts +1268 -0
  150. package/src/mcp/response-formatter.ts +797 -0
  151. package/src/mcp/server.ts +240 -0
  152. package/src/types/agent.ts +69 -0
  153. package/src/types/config.ts +86 -0
  154. package/src/types/context.ts +77 -0
  155. package/src/types/index.ts +53 -0
  156. package/src/types/mcp.ts +91 -0
  157. package/src/types/skills.ts +47 -0
  158. package/src/types/workflow.ts +155 -0
  159. package/generators/index.js +0 -18
@@ -0,0 +1,494 @@
1
+ /**
2
+ * Bootspring Fundraise Command
3
+ * Fundraising tools and templates
4
+ *
5
+ * @package bootspring
6
+ * @command fundraise
7
+ */
8
+
9
+ import * as fs from 'fs';
10
+ import * as path from 'path';
11
+
12
+ // Type interfaces for JS modules
13
+ interface Colors {
14
+ reset: string;
15
+ bold: string;
16
+ dim: string;
17
+ cyan: string;
18
+ green: string;
19
+ yellow: string;
20
+ red: string;
21
+ }
22
+
23
+ interface PrintModule {
24
+ error(msg: string): void;
25
+ dim(msg: string): void;
26
+ warning(msg: string): void;
27
+ success(msg: string): void;
28
+ }
29
+
30
+ interface Spinner {
31
+ start(): Spinner;
32
+ stop(): void;
33
+ succeed(text: string): void;
34
+ fail(text: string): void;
35
+ }
36
+
37
+ interface UtilsModule {
38
+ COLORS: Colors;
39
+ print: PrintModule;
40
+ createSpinner(text: string): Spinner;
41
+ }
42
+
43
+ interface AuthModule {
44
+ isAuthenticated(): boolean;
45
+ }
46
+
47
+ interface ApiModule {
48
+ getTemplate(category: string, templateFile: string): Promise<TemplateResponse>;
49
+ }
50
+
51
+ interface TemplateResponse {
52
+ content: string;
53
+ error?: string | undefined;
54
+ message?: string | undefined;
55
+ }
56
+
57
+ interface FetchTemplateResult {
58
+ content?: string | undefined;
59
+ error?: string | undefined;
60
+ message?: string | undefined;
61
+ }
62
+
63
+ interface Template {
64
+ name: string;
65
+ file: string;
66
+ output: string;
67
+ description: string;
68
+ }
69
+
70
+ interface FailedTemplate {
71
+ name: string;
72
+ error: string;
73
+ }
74
+
75
+ interface ProjectConfig {
76
+ projectName?: string | undefined;
77
+ name?: string | undefined;
78
+ domain?: string | undefined;
79
+ }
80
+
81
+ const utils = require('../core/utils') as UtilsModule;
82
+ const api = require('../core/api-client') as ApiModule;
83
+ const auth = require('../core/auth') as AuthModule;
84
+
85
+ /**
86
+ * Output directory for fundraising docs
87
+ */
88
+ const OUTPUT_DIR = 'planning';
89
+
90
+ /**
91
+ * Available fundraising templates
92
+ */
93
+ const TEMPLATES: Record<string, Template> = {
94
+ pitch: {
95
+ name: 'Pitch Deck Outline',
96
+ file: 'pitch-deck-outline.md',
97
+ output: 'PITCH_DECK.md',
98
+ description: 'Structured pitch deck with speaker notes'
99
+ },
100
+ dataroom: {
101
+ name: 'Data Room Checklist',
102
+ file: 'data-room-checklist.md',
103
+ output: 'DATA_ROOM_CHECKLIST.md',
104
+ description: 'Due diligence document checklist'
105
+ },
106
+ investors: {
107
+ name: 'Investor Research',
108
+ file: 'investor-research.md',
109
+ output: 'INVESTOR_RESEARCH.md',
110
+ description: 'Investor tracking and research template'
111
+ }
112
+ };
113
+
114
+ /**
115
+ * Get project config if available
116
+ */
117
+ function getProjectConfig(): ProjectConfig {
118
+ const configPath = path.join(process.cwd(), 'bootspring.config.js');
119
+ if (fs.existsSync(configPath)) {
120
+ try {
121
+ return require(configPath) as ProjectConfig;
122
+ } catch {
123
+ return {};
124
+ }
125
+ }
126
+ return {};
127
+ }
128
+
129
+ /**
130
+ * Replace template variables
131
+ */
132
+ function processTemplate(content: string, config: ProjectConfig): string {
133
+ const projectName = config.projectName || config.name || path.basename(process.cwd());
134
+ const date = new Date().toISOString().split('T')[0] || '';
135
+
136
+ return content
137
+ .replace(/\{\{PROJECT_NAME\}\}/g, projectName)
138
+ .replace(/\{\{DATE\}\}/g, date)
139
+ .replace(/\{\{DOMAIN\}\}/g, config.domain || 'example.com');
140
+ }
141
+
142
+ /**
143
+ * Fetch template content from API
144
+ */
145
+ async function fetchTemplate(templateFile: string): Promise<FetchTemplateResult> {
146
+ if (!auth.isAuthenticated()) {
147
+ return { error: 'auth_required' };
148
+ }
149
+
150
+ try {
151
+ const response = await api.getTemplate('fundraising', templateFile);
152
+ return response;
153
+ } catch (error) {
154
+ const err = error as { status?: number; message?: string };
155
+ if (err.status === 401) {
156
+ return { error: 'auth_required' };
157
+ }
158
+ if (err.status === 403) {
159
+ return { error: 'upgrade_required' };
160
+ }
161
+ return { error: 'network_error', message: err.message };
162
+ }
163
+ }
164
+
165
+ /**
166
+ * Initialize fundraising docs
167
+ */
168
+ async function fundraiseInit(): Promise<void> {
169
+ console.log(`
170
+ ${utils.COLORS.cyan}${utils.COLORS.bold}⚡ Fundraising Materials${utils.COLORS.reset}
171
+ ${utils.COLORS.dim}Initialize fundraising documents and checklists${utils.COLORS.reset}
172
+ `);
173
+
174
+ // Check authentication
175
+ if (!auth.isAuthenticated()) {
176
+ utils.print.error('Authentication required');
177
+ console.log(`${utils.COLORS.dim}Run: bootspring auth login${utils.COLORS.reset}`);
178
+ return;
179
+ }
180
+
181
+ const config = getProjectConfig();
182
+ const outputDir = path.join(process.cwd(), OUTPUT_DIR);
183
+
184
+ // Create output directory
185
+ if (!fs.existsSync(outputDir)) {
186
+ fs.mkdirSync(outputDir, { recursive: true });
187
+ }
188
+
189
+ const created: string[] = [];
190
+ const skipped: string[] = [];
191
+ const failed: FailedTemplate[] = [];
192
+
193
+ const spinner = utils.createSpinner('Loading templates...');
194
+ spinner.start();
195
+
196
+ // Create all fundraising templates
197
+ for (const [_key, template] of Object.entries(TEMPLATES)) {
198
+ const outputPath = path.join(outputDir, template.output);
199
+
200
+ if (fs.existsSync(outputPath)) {
201
+ skipped.push(template.name);
202
+ continue;
203
+ }
204
+
205
+ const result = await fetchTemplate(template.file);
206
+
207
+ if (result.error) {
208
+ failed.push({ name: template.name, error: result.error });
209
+ continue;
210
+ }
211
+
212
+ if (result.content) {
213
+ const processed = processTemplate(result.content, config);
214
+ fs.writeFileSync(outputPath, processed);
215
+ created.push(template.name);
216
+ }
217
+ }
218
+
219
+ spinner.stop();
220
+
221
+ if (created.length > 0) {
222
+ console.log(`${utils.COLORS.bold}Created:${utils.COLORS.reset}`);
223
+ for (const name of created) {
224
+ console.log(` ${utils.COLORS.green}✓${utils.COLORS.reset} ${name}`);
225
+ }
226
+ console.log();
227
+ }
228
+
229
+ if (skipped.length > 0) {
230
+ console.log(`${utils.COLORS.bold}Skipped (already exist):${utils.COLORS.reset}`);
231
+ for (const name of skipped) {
232
+ console.log(` ${utils.COLORS.dim}●${utils.COLORS.reset} ${name}`);
233
+ }
234
+ console.log();
235
+ }
236
+
237
+ if (failed.length > 0) {
238
+ console.log(`${utils.COLORS.bold}Failed:${utils.COLORS.reset}`);
239
+ for (const { name, error } of failed) {
240
+ console.log(` ${utils.COLORS.red}✗${utils.COLORS.reset} ${name} (${error})`);
241
+ }
242
+ console.log();
243
+ }
244
+
245
+ console.log(`${utils.COLORS.bold}Next Steps:${utils.COLORS.reset}`);
246
+ console.log(` 1. Fill out ${utils.COLORS.cyan}${OUTPUT_DIR}/PITCH_DECK.md${utils.COLORS.reset}`);
247
+ console.log(` 2. Run ${utils.COLORS.cyan}bootspring agent invoke fundraising-expert${utils.COLORS.reset}`);
248
+ console.log(` 3. Run ${utils.COLORS.cyan}bootspring fundraise status${utils.COLORS.reset} to check progress`);
249
+ }
250
+
251
+ /**
252
+ * Create a specific fundraising document
253
+ */
254
+ async function fundraiseCreate(templateKey: string): Promise<void> {
255
+ const template = TEMPLATES[templateKey];
256
+
257
+ if (!template) {
258
+ utils.print.error(`Unknown template: ${templateKey}`);
259
+ console.log(`\nAvailable templates: ${Object.keys(TEMPLATES).join(', ')}`);
260
+ return;
261
+ }
262
+
263
+ console.log(`
264
+ ${utils.COLORS.cyan}${utils.COLORS.bold}⚡ ${template.name}${utils.COLORS.reset}
265
+ ${utils.COLORS.dim}${template.description}${utils.COLORS.reset}
266
+ `);
267
+
268
+ // Check authentication
269
+ if (!auth.isAuthenticated()) {
270
+ utils.print.error('Authentication required');
271
+ console.log(`${utils.COLORS.dim}Run: bootspring auth login${utils.COLORS.reset}`);
272
+ return;
273
+ }
274
+
275
+ const config = getProjectConfig();
276
+ const outputDir = path.join(process.cwd(), OUTPUT_DIR);
277
+ const outputPath = path.join(outputDir, template.output);
278
+
279
+ // Create output directory
280
+ if (!fs.existsSync(outputDir)) {
281
+ fs.mkdirSync(outputDir, { recursive: true });
282
+ }
283
+
284
+ if (fs.existsSync(outputPath)) {
285
+ utils.print.warning(`File already exists: ${OUTPUT_DIR}/${template.output}`);
286
+ console.log(`Edit it directly or use ${utils.COLORS.cyan}bootspring fundraise show ${templateKey}${utils.COLORS.reset}`);
287
+ return;
288
+ }
289
+
290
+ const spinner = utils.createSpinner('Loading template...');
291
+ spinner.start();
292
+
293
+ const result = await fetchTemplate(template.file);
294
+
295
+ if (result.error === 'auth_required') {
296
+ spinner.fail('Authentication required');
297
+ console.log(`${utils.COLORS.dim}Run: bootspring auth login${utils.COLORS.reset}`);
298
+ return;
299
+ }
300
+
301
+ if (result.error === 'upgrade_required') {
302
+ spinner.fail('Upgrade required');
303
+ console.log(`${utils.COLORS.dim}This template requires a Pro subscription.${utils.COLORS.reset}`);
304
+ console.log(`${utils.COLORS.dim}Run: bootspring billing upgrade${utils.COLORS.reset}`);
305
+ return;
306
+ }
307
+
308
+ if (result.error) {
309
+ spinner.fail('Failed to load template');
310
+ console.log(`${utils.COLORS.dim}${result.message || 'Check your internet connection.'}${utils.COLORS.reset}`);
311
+ return;
312
+ }
313
+
314
+ spinner.succeed('Template loaded');
315
+
316
+ if (result.content) {
317
+ const processed = processTemplate(result.content, config);
318
+ fs.writeFileSync(outputPath, processed);
319
+ }
320
+
321
+ utils.print.success(`Created ${template.name}`);
322
+ console.log(`\nFile: ${utils.COLORS.cyan}${OUTPUT_DIR}/${template.output}${utils.COLORS.reset}`);
323
+ console.log(`\n${utils.COLORS.bold}Next Steps:${utils.COLORS.reset}`);
324
+ console.log(' 1. Open and edit the document');
325
+ console.log(' 2. Use AI agents for assistance:');
326
+ console.log(` ${utils.COLORS.cyan}bootspring agent invoke fundraising-expert${utils.COLORS.reset}`);
327
+ }
328
+
329
+ /**
330
+ * Show status of fundraising documents
331
+ */
332
+ function fundraiseStatus(): void {
333
+ console.log(`
334
+ ${utils.COLORS.cyan}${utils.COLORS.bold}⚡ Fundraising Materials Status${utils.COLORS.reset}
335
+ `);
336
+
337
+ const outputDir = path.join(process.cwd(), OUTPUT_DIR);
338
+ let found = 0;
339
+ const total = Object.keys(TEMPLATES).length;
340
+
341
+ for (const [key, template] of Object.entries(TEMPLATES)) {
342
+ const outputPath = path.join(outputDir, template.output);
343
+ const exists = fs.existsSync(outputPath);
344
+
345
+ if (exists) {
346
+ found++;
347
+ const stats = fs.statSync(outputPath);
348
+ const modified = stats.mtime.toISOString().split('T')[0] || '';
349
+ const size = Math.round(stats.size / 1024);
350
+
351
+ console.log(` ${utils.COLORS.green}✓${utils.COLORS.reset} ${template.name}`);
352
+ console.log(` ${utils.COLORS.dim}${OUTPUT_DIR}/${template.output} (${size}KB, modified ${modified})${utils.COLORS.reset}`);
353
+ } else {
354
+ console.log(` ${utils.COLORS.yellow}○${utils.COLORS.reset} ${template.name}`);
355
+ console.log(` ${utils.COLORS.dim}Not created - run: bootspring fundraise ${key}${utils.COLORS.reset}`);
356
+ }
357
+ }
358
+
359
+ console.log();
360
+ console.log(`${utils.COLORS.bold}Progress:${utils.COLORS.reset} ${found}/${total} documents created`);
361
+
362
+ if (found < total) {
363
+ console.log(`\n${utils.COLORS.bold}Create Missing:${utils.COLORS.reset}`);
364
+ console.log(` ${utils.COLORS.cyan}bootspring fundraise init${utils.COLORS.reset} - Create all documents`);
365
+ }
366
+ }
367
+
368
+ /**
369
+ * Show a fundraising document
370
+ */
371
+ function fundraiseShow(templateKey: string): void {
372
+ const template = TEMPLATES[templateKey];
373
+
374
+ if (!template) {
375
+ utils.print.error(`Unknown template: ${templateKey}`);
376
+ console.log(`\nAvailable templates: ${Object.keys(TEMPLATES).join(', ')}`);
377
+ return;
378
+ }
379
+
380
+ const outputPath = path.join(process.cwd(), OUTPUT_DIR, template.output);
381
+
382
+ if (!fs.existsSync(outputPath)) {
383
+ utils.print.warning(`${template.name} not created yet`);
384
+ console.log(`\nRun: ${utils.COLORS.cyan}bootspring fundraise ${templateKey}${utils.COLORS.reset}`);
385
+ return;
386
+ }
387
+
388
+ const content = fs.readFileSync(outputPath, 'utf-8');
389
+
390
+ console.log(`
391
+ ${utils.COLORS.cyan}${utils.COLORS.bold}⚡ ${template.name}${utils.COLORS.reset}
392
+ ${utils.COLORS.dim}${OUTPUT_DIR}/${template.output}${utils.COLORS.reset}
393
+ `);
394
+
395
+ // Show first 50 lines as preview
396
+ const lines = content.split('\n').slice(0, 50);
397
+ console.log(lines.join('\n'));
398
+
399
+ if (content.split('\n').length > 50) {
400
+ console.log(`\n${utils.COLORS.dim}... (${content.split('\n').length - 50} more lines)${utils.COLORS.reset}`);
401
+ console.log(`${utils.COLORS.dim}Open the full file to see more${utils.COLORS.reset}`);
402
+ }
403
+ }
404
+
405
+ /**
406
+ * Show help
407
+ */
408
+ function showHelp(): void {
409
+ console.log(`
410
+ ${utils.COLORS.cyan}${utils.COLORS.bold}⚡ Bootspring Fundraise${utils.COLORS.reset}
411
+ ${utils.COLORS.dim}Fundraising tools and templates${utils.COLORS.reset}
412
+
413
+ ${utils.COLORS.bold}Usage:${utils.COLORS.reset}
414
+ bootspring fundraise <command> [options]
415
+
416
+ ${utils.COLORS.bold}Commands:${utils.COLORS.reset}
417
+ ${utils.COLORS.cyan}init${utils.COLORS.reset} Initialize all fundraising documents
418
+ ${utils.COLORS.cyan}pitch${utils.COLORS.reset} Create pitch deck outline
419
+ ${utils.COLORS.cyan}dataroom${utils.COLORS.reset} Create data room checklist
420
+ ${utils.COLORS.cyan}investors${utils.COLORS.reset} Create investor research template
421
+ ${utils.COLORS.cyan}status${utils.COLORS.reset} Show status of fundraising documents
422
+ ${utils.COLORS.cyan}show${utils.COLORS.reset} <type> Preview a fundraising document
423
+
424
+ ${utils.COLORS.bold}Examples:${utils.COLORS.reset}
425
+ bootspring fundraise init # Create all fundraising docs
426
+ bootspring fundraise pitch # Create pitch deck outline
427
+ bootspring fundraise dataroom # Create data room checklist
428
+ bootspring fundraise investors # Create investor tracking
429
+ bootspring fundraise status # Check progress
430
+ bootspring fundraise show pitch # Preview pitch deck
431
+
432
+ ${utils.COLORS.bold}Related Agents:${utils.COLORS.reset}
433
+ ${utils.COLORS.cyan}fundraising-expert${utils.COLORS.reset} Pitch decks and investor relations
434
+ ${utils.COLORS.cyan}investor-relations-expert${utils.COLORS.reset} Board management and updates
435
+ ${utils.COLORS.cyan}financial-expert${utils.COLORS.reset} Financial modeling and projections
436
+ ${utils.COLORS.cyan}private-equity-expert${utils.COLORS.reset} Term sheets and negotiations
437
+ `);
438
+ }
439
+
440
+ /**
441
+ * Run fundraise command
442
+ */
443
+ export async function run(args: string[]): Promise<void> {
444
+ const subcommand = args[0] || 'help';
445
+
446
+ switch (subcommand) {
447
+ case 'init':
448
+ await fundraiseInit();
449
+ break;
450
+
451
+ case 'pitch':
452
+ case 'deck':
453
+ await fundraiseCreate('pitch');
454
+ break;
455
+
456
+ case 'dataroom':
457
+ case 'data-room':
458
+ await fundraiseCreate('dataroom');
459
+ break;
460
+
461
+ case 'investors':
462
+ case 'research':
463
+ await fundraiseCreate('investors');
464
+ break;
465
+
466
+ case 'status':
467
+ fundraiseStatus();
468
+ break;
469
+
470
+ case 'show':
471
+ if (!args[1]) {
472
+ utils.print.error('Please specify a document type');
473
+ console.log(`Usage: ${utils.COLORS.cyan}bootspring fundraise show <pitch|dataroom|investors>${utils.COLORS.reset}`);
474
+ return;
475
+ }
476
+ fundraiseShow(args[1]);
477
+ break;
478
+
479
+ case 'help':
480
+ case '-h':
481
+ case '--help':
482
+ showHelp();
483
+ break;
484
+
485
+ default:
486
+ // Check if it's a template name
487
+ if (TEMPLATES[subcommand]) {
488
+ await fundraiseCreate(subcommand);
489
+ } else {
490
+ utils.print.error(`Unknown subcommand: ${subcommand}`);
491
+ showHelp();
492
+ }
493
+ }
494
+ }