@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.
- package/bin/bootspring.js +5 -0
- package/cli/org.js +474 -0
- package/cli/preseed/index.js +16 -0
- package/cli/preseed/interactive.js +143 -0
- package/cli/preseed/templates.js +227 -0
- package/cli/preseed.js +9 -301
- package/cli/seed/builders/ai-context-builder.js +85 -0
- package/cli/seed/builders/index.js +13 -0
- package/cli/seed/builders/seed-builder.js +272 -0
- package/cli/seed/extractors/content-extractors.js +383 -0
- package/cli/seed/extractors/index.js +47 -0
- package/cli/seed/extractors/metadata-extractors.js +167 -0
- package/cli/seed/extractors/section-extractor.js +54 -0
- package/cli/seed/extractors/stack-extractors.js +228 -0
- package/cli/seed/index.js +18 -0
- package/cli/seed/utils/folder-structure.js +84 -0
- package/cli/seed/utils/index.js +11 -0
- package/cli/seed.js +23 -1074
- package/core/api-client.js +77 -0
- package/core/entitlements.js +36 -0
- package/core/organizations.js +223 -0
- package/core/policies.js +51 -6
- package/core/policy-matrix.js +303 -0
- package/core/project-context.js +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.js +3220 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/context-McpJQa_2.d.ts +5710 -0
- package/dist/core/index.d.ts +635 -0
- package/dist/core/index.js +2593 -0
- package/dist/core/index.js.map +1 -0
- package/dist/index-QqbeEiDm.d.ts +857 -0
- package/dist/index-UiYCgwiH.d.ts +174 -0
- package/dist/index.d.ts +453 -0
- package/dist/index.js +44228 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +1 -0
- package/dist/mcp/index.js +41173 -0
- package/dist/mcp/index.js.map +1 -0
- package/generators/index.ts +82 -0
- package/intelligence/orchestrator/config/failure-signatures.js +48 -0
- package/intelligence/orchestrator/config/index.js +23 -0
- package/intelligence/orchestrator/config/pack-lifecycle.js +262 -0
- package/intelligence/orchestrator/config/phases.js +111 -0
- package/intelligence/orchestrator/config/remediation.js +150 -0
- package/intelligence/orchestrator/config/workflows.js +168 -0
- package/intelligence/orchestrator/core/index.js +16 -0
- package/intelligence/orchestrator/core/state-manager.js +88 -0
- package/intelligence/orchestrator/core/telemetry.js +24 -0
- package/intelligence/orchestrator/index.js +17 -0
- package/intelligence/orchestrator.js +17 -512
- package/mcp/contracts/mcp-contract.v1.json +1 -1
- package/package.json +16 -3
- package/src/cli/agent.ts +703 -0
- package/src/cli/analyze.ts +640 -0
- package/src/cli/audit.ts +707 -0
- package/src/cli/auth.ts +930 -0
- package/src/cli/billing.ts +364 -0
- package/src/cli/build.ts +1089 -0
- package/src/cli/business.ts +508 -0
- package/src/cli/checkpoint-utils.ts +236 -0
- package/src/cli/checkpoint.ts +757 -0
- package/src/cli/cloud-sync.ts +534 -0
- package/src/cli/content.ts +273 -0
- package/src/cli/context.ts +667 -0
- package/src/cli/dashboard.ts +133 -0
- package/src/cli/deploy.ts +704 -0
- package/src/cli/doctor.ts +480 -0
- package/src/cli/fundraise.ts +494 -0
- package/src/cli/generate.ts +346 -0
- package/src/cli/github-cmd.ts +566 -0
- package/src/cli/health.ts +599 -0
- package/src/cli/index.ts +113 -0
- package/src/cli/init.ts +838 -0
- package/src/cli/legal.ts +495 -0
- package/src/cli/log.ts +316 -0
- package/src/cli/loop.ts +1660 -0
- package/src/cli/manager.ts +878 -0
- package/src/cli/mcp.ts +275 -0
- package/src/cli/memory.ts +346 -0
- package/src/cli/metrics.ts +590 -0
- package/src/cli/monitor.ts +960 -0
- package/src/cli/mvp.ts +662 -0
- package/src/cli/onboard.ts +663 -0
- package/src/cli/orchestrator.ts +622 -0
- package/src/cli/plugin.ts +483 -0
- package/src/cli/prd.ts +671 -0
- package/src/cli/preseed-start.ts +1633 -0
- package/src/cli/preseed.ts +2434 -0
- package/src/cli/project.ts +526 -0
- package/src/cli/quality.ts +885 -0
- package/src/cli/security.ts +1079 -0
- package/src/cli/seed.ts +1224 -0
- package/src/cli/skill.ts +537 -0
- package/src/cli/suggest.ts +1225 -0
- package/src/cli/switch.ts +518 -0
- package/src/cli/task.ts +780 -0
- package/src/cli/telemetry.ts +172 -0
- package/src/cli/todo.ts +627 -0
- package/src/cli/types.ts +15 -0
- package/src/cli/update.ts +334 -0
- package/src/cli/visualize.ts +609 -0
- package/src/cli/watch.ts +895 -0
- package/src/cli/workspace.ts +709 -0
- package/src/core/action-recorder.ts +673 -0
- package/src/core/analyze-workflow.ts +1453 -0
- package/src/core/api-client.ts +1120 -0
- package/src/core/audit-workflow.ts +1681 -0
- package/src/core/auth.ts +471 -0
- package/src/core/build-orchestrator.ts +509 -0
- package/src/core/build-state.ts +621 -0
- package/src/core/checkpoint-engine.ts +482 -0
- package/src/core/config.ts +1285 -0
- package/src/core/context-loader.ts +694 -0
- package/src/core/context.ts +410 -0
- package/src/core/deploy-workflow.ts +1085 -0
- package/src/core/entitlements.ts +322 -0
- package/src/core/github-sync.ts +720 -0
- package/src/core/index.ts +981 -0
- package/src/core/ingest.ts +1186 -0
- package/src/core/metrics-engine.ts +886 -0
- package/src/core/mvp.ts +847 -0
- package/src/core/onboard-workflow.ts +1293 -0
- package/src/core/policies.ts +81 -0
- package/src/core/preseed-workflow.ts +1163 -0
- package/src/core/preseed.ts +1826 -0
- package/src/core/project-context.ts +380 -0
- package/src/core/project-state.ts +699 -0
- package/src/core/r2-sync.ts +691 -0
- package/src/core/scaffold.ts +1715 -0
- package/src/core/session.ts +286 -0
- package/src/core/task-extractor.ts +799 -0
- package/src/core/telemetry.ts +371 -0
- package/src/core/tier-enforcement.ts +737 -0
- package/src/core/utils.ts +437 -0
- package/src/index.ts +29 -0
- package/src/intelligence/agent-collab.ts +2376 -0
- package/src/intelligence/auto-suggest.ts +713 -0
- package/src/intelligence/content-gen.ts +1351 -0
- package/src/intelligence/cross-project.ts +1692 -0
- package/src/intelligence/git-memory.ts +529 -0
- package/src/intelligence/index.ts +318 -0
- package/src/intelligence/orchestrator.ts +534 -0
- package/src/intelligence/prd.ts +466 -0
- package/src/intelligence/recommendations.ts +982 -0
- package/src/intelligence/workflow-composer.ts +1472 -0
- package/src/mcp/capabilities.ts +233 -0
- package/src/mcp/index.ts +37 -0
- package/src/mcp/registry.ts +1268 -0
- package/src/mcp/response-formatter.ts +797 -0
- package/src/mcp/server.ts +240 -0
- package/src/types/agent.ts +69 -0
- package/src/types/config.ts +86 -0
- package/src/types/context.ts +77 -0
- package/src/types/index.ts +53 -0
- package/src/types/mcp.ts +91 -0
- package/src/types/skills.ts +47 -0
- package/src/types/workflow.ts +155 -0
- 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
|
+
}
|