@girardmedia/bootspring 1.2.0 → 2.0.3
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/README.md +107 -14
- package/bin/bootspring.js +166 -27
- package/cli/agent.js +189 -17
- package/cli/analyze.js +499 -0
- package/cli/audit.js +557 -0
- package/cli/auth.js +495 -38
- package/cli/billing.js +302 -0
- package/cli/build.js +695 -0
- package/cli/business.js +109 -26
- package/cli/checkpoint-utils.js +168 -0
- package/cli/checkpoint.js +639 -0
- package/cli/cloud-sync.js +447 -0
- package/cli/content.js +198 -0
- package/cli/context.js +1 -1
- package/cli/deploy.js +543 -0
- package/cli/fundraise.js +112 -50
- package/cli/github-cmd.js +435 -0
- package/cli/health.js +477 -0
- package/cli/init.js +84 -13
- package/cli/legal.js +107 -95
- package/cli/log.js +2 -2
- package/cli/loop.js +976 -73
- package/cli/manager.js +711 -0
- package/cli/metrics.js +480 -0
- package/cli/monitor.js +812 -0
- package/cli/onboard.js +521 -0
- package/cli/orchestrator.js +12 -24
- package/cli/prd.js +594 -0
- package/cli/preseed-start.js +1483 -0
- package/cli/preseed.js +2302 -0
- package/cli/project.js +436 -0
- package/cli/quality.js +233 -0
- package/cli/security.js +913 -0
- package/cli/seed.js +1441 -5
- package/cli/skill.js +273 -211
- package/cli/suggest.js +989 -0
- package/cli/switch.js +453 -0
- package/cli/visualize.js +527 -0
- package/cli/watch.js +769 -0
- package/cli/workspace.js +607 -0
- package/core/analyze-workflow.js +1134 -0
- package/core/api-client.js +535 -22
- package/core/audit-workflow.js +1350 -0
- package/core/build-orchestrator.js +480 -0
- package/core/build-state.js +577 -0
- package/core/checkpoint-engine.js +408 -0
- package/core/config.js +1109 -26
- package/core/context-loader.js +21 -1
- package/core/deploy-workflow.js +836 -0
- package/core/entitlements.js +93 -22
- package/core/github-sync.js +610 -0
- package/core/index.js +8 -1
- package/core/ingest.js +1111 -0
- package/core/metrics-engine.js +768 -0
- package/core/onboard-workflow.js +1007 -0
- package/core/preseed-workflow.js +934 -0
- package/core/preseed.js +1617 -0
- package/core/project-context.js +325 -0
- package/core/project-state.js +694 -0
- package/core/r2-sync.js +583 -0
- package/core/scaffold.js +525 -7
- package/core/session.js +258 -0
- package/core/task-extractor.js +758 -0
- package/core/telemetry.js +28 -6
- package/core/tier-enforcement.js +737 -0
- package/core/utils.js +38 -14
- package/generators/questionnaire.js +15 -12
- package/generators/sections/ai.js +7 -7
- package/generators/sections/content.js +300 -0
- package/generators/sections/index.js +3 -0
- package/generators/sections/plugins.js +7 -6
- package/generators/templates/build-planning.template.js +596 -0
- package/generators/templates/content.template.js +819 -0
- package/generators/templates/index.js +2 -1
- package/hooks/git-autopilot.js +1250 -0
- package/hooks/index.js +9 -0
- package/intelligence/agent-collab.js +2057 -0
- package/intelligence/auto-suggest.js +634 -0
- package/intelligence/content-gen.js +1589 -0
- package/intelligence/cross-project.js +1647 -0
- package/intelligence/index.js +184 -0
- package/intelligence/learning/insights.json +517 -7
- package/intelligence/learning/pattern-learner.js +1008 -14
- package/intelligence/memory/decision-tracker.js +1431 -31
- package/intelligence/memory/decisions.jsonl +0 -0
- package/intelligence/orchestrator.js +2896 -1
- package/intelligence/prd.js +92 -1
- package/intelligence/recommendation-weights.json +14 -2
- package/intelligence/recommendations.js +463 -9
- package/intelligence/workflow-composer.js +1451 -0
- package/marketplace/index.d.ts +324 -0
- package/marketplace/index.js +1921 -0
- package/mcp/contracts/mcp-contract.v1.json +342 -4
- package/mcp/registry.js +680 -3
- package/mcp/response-formatter.js +23 -0
- package/mcp/tools/assist-tool.js +78 -4
- package/mcp/tools/autopilot-tool.js +408 -0
- package/mcp/tools/content-tool.js +571 -0
- package/mcp/tools/dashboard-tool.js +251 -5
- package/mcp/tools/mvp-tool.js +344 -0
- package/mcp/tools/plugin-tool.js +23 -1
- package/mcp/tools/prd-tool.js +579 -0
- package/mcp/tools/seed-tool.js +447 -0
- package/mcp/tools/skill-tool.js +43 -14
- package/mcp/tools/suggest-tool.js +147 -0
- package/package.json +15 -6
- package/agents/README.md +0 -93
- package/agents/ai-integration-expert/context.md +0 -386
- package/agents/api-expert/context.md +0 -416
- package/agents/architecture-expert/context.md +0 -454
- package/agents/auth-expert/context.md +0 -399
- package/agents/backend-expert/context.md +0 -483
- package/agents/business-strategy-expert/context.md +0 -180
- package/agents/code-review-expert/context.md +0 -365
- package/agents/competitive-analysis-expert/context.md +0 -239
- package/agents/data-modeling-expert/context.md +0 -352
- package/agents/database-expert/context.md +0 -250
- package/agents/devops-expert/context.md +0 -446
- package/agents/email-expert/context.md +0 -379
- package/agents/financial-expert/context.md +0 -213
- package/agents/frontend-expert/context.md +0 -364
- package/agents/fundraising-expert/context.md +0 -257
- package/agents/growth-expert/context.md +0 -249
- package/agents/index.js +0 -140
- package/agents/investor-relations-expert/context.md +0 -266
- package/agents/legal-expert/context.md +0 -284
- package/agents/marketing-expert/context.md +0 -236
- package/agents/monitoring-expert/context.md +0 -362
- package/agents/operations-expert/context.md +0 -279
- package/agents/partnerships-expert/context.md +0 -286
- package/agents/payment-expert/context.md +0 -340
- package/agents/performance-expert/context.md +0 -377
- package/agents/private-equity-expert/context.md +0 -246
- package/agents/railway-expert/context.md +0 -284
- package/agents/research-expert/context.md +0 -245
- package/agents/sales-expert/context.md +0 -241
- package/agents/security-expert/context.md +0 -343
- package/agents/testing-expert/context.md +0 -414
- package/agents/ui-ux-expert/context.md +0 -448
- package/agents/vercel-expert/context.md +0 -426
- package/skills/index.js +0 -787
- package/skills/patterns/README.md +0 -163
- package/skills/patterns/ai/agents.md +0 -281
- package/skills/patterns/ai/claude.md +0 -138
- package/skills/patterns/ai/embeddings.md +0 -150
- package/skills/patterns/ai/rag.md +0 -266
- package/skills/patterns/ai/streaming.md +0 -170
- package/skills/patterns/ai/structured-output.md +0 -162
- package/skills/patterns/ai/tools.md +0 -154
- package/skills/patterns/analytics/tracking.md +0 -220
- package/skills/patterns/api/errors.md +0 -296
- package/skills/patterns/api/graphql.md +0 -440
- package/skills/patterns/api/middleware.md +0 -279
- package/skills/patterns/api/openapi.md +0 -285
- package/skills/patterns/api/rate-limiting.md +0 -231
- package/skills/patterns/api/route-handler.md +0 -217
- package/skills/patterns/api/server-action.md +0 -249
- package/skills/patterns/api/versioning.md +0 -443
- package/skills/patterns/api/webhooks.md +0 -247
- package/skills/patterns/auth/clerk.md +0 -132
- package/skills/patterns/auth/mfa.md +0 -313
- package/skills/patterns/auth/nextauth.md +0 -140
- package/skills/patterns/auth/oauth.md +0 -237
- package/skills/patterns/auth/rbac.md +0 -152
- package/skills/patterns/auth/session-management.md +0 -367
- package/skills/patterns/auth/session.md +0 -120
- package/skills/patterns/database/audit.md +0 -177
- package/skills/patterns/database/migrations.md +0 -177
- package/skills/patterns/database/pagination.md +0 -230
- package/skills/patterns/database/pooling.md +0 -357
- package/skills/patterns/database/prisma.md +0 -180
- package/skills/patterns/database/relations.md +0 -187
- package/skills/patterns/database/seeding.md +0 -246
- package/skills/patterns/database/soft-delete.md +0 -153
- package/skills/patterns/database/transactions.md +0 -162
- package/skills/patterns/deployment/ci-cd.md +0 -231
- package/skills/patterns/deployment/docker.md +0 -188
- package/skills/patterns/deployment/monitoring.md +0 -387
- package/skills/patterns/deployment/vercel.md +0 -160
- package/skills/patterns/email/resend.md +0 -143
- package/skills/patterns/email/templates.md +0 -245
- package/skills/patterns/email/transactional.md +0 -503
- package/skills/patterns/email/verification.md +0 -176
- package/skills/patterns/files/download.md +0 -243
- package/skills/patterns/files/upload.md +0 -239
- package/skills/patterns/i18n/nextintl.md +0 -188
- package/skills/patterns/logging/structured.md +0 -292
- package/skills/patterns/notifications/email-queue.md +0 -248
- package/skills/patterns/notifications/push.md +0 -279
- package/skills/patterns/payments/checkout.md +0 -303
- package/skills/patterns/payments/invoices.md +0 -287
- package/skills/patterns/payments/portal.md +0 -245
- package/skills/patterns/payments/stripe.md +0 -272
- package/skills/patterns/payments/subscriptions.md +0 -300
- package/skills/patterns/payments/usage.md +0 -279
- package/skills/patterns/performance/caching.md +0 -276
- package/skills/patterns/performance/code-splitting.md +0 -233
- package/skills/patterns/performance/edge.md +0 -254
- package/skills/patterns/performance/isr.md +0 -266
- package/skills/patterns/performance/lazy-loading.md +0 -281
- package/skills/patterns/realtime/sse.md +0 -327
- package/skills/patterns/realtime/websockets.md +0 -336
- package/skills/patterns/search/filtering.md +0 -329
- package/skills/patterns/search/fulltext.md +0 -260
- package/skills/patterns/security/audit-logging.md +0 -444
- package/skills/patterns/security/csrf.md +0 -234
- package/skills/patterns/security/headers.md +0 -252
- package/skills/patterns/security/sanitization.md +0 -258
- package/skills/patterns/security/secrets.md +0 -261
- package/skills/patterns/security/validation.md +0 -268
- package/skills/patterns/security/xss.md +0 -229
- package/skills/patterns/seo/metadata.md +0 -252
- package/skills/patterns/state/context.md +0 -349
- package/skills/patterns/state/react-query.md +0 -313
- package/skills/patterns/state/url-state.md +0 -482
- package/skills/patterns/state/zustand.md +0 -262
- package/skills/patterns/testing/api.md +0 -259
- package/skills/patterns/testing/component.md +0 -233
- package/skills/patterns/testing/coverage.md +0 -207
- package/skills/patterns/testing/fixtures.md +0 -225
- package/skills/patterns/testing/integration.md +0 -436
- package/skills/patterns/testing/mocking.md +0 -177
- package/skills/patterns/testing/playwright.md +0 -162
- package/skills/patterns/testing/snapshot.md +0 -175
- package/skills/patterns/testing/vitest.md +0 -307
- package/skills/patterns/ui/accordions.md +0 -395
- package/skills/patterns/ui/cards.md +0 -299
- package/skills/patterns/ui/dropdowns.md +0 -476
- package/skills/patterns/ui/empty-states.md +0 -320
- package/skills/patterns/ui/forms.md +0 -405
- package/skills/patterns/ui/inputs.md +0 -319
- package/skills/patterns/ui/layouts.md +0 -282
- package/skills/patterns/ui/loading.md +0 -291
- package/skills/patterns/ui/modals.md +0 -338
- package/skills/patterns/ui/navigation.md +0 -374
- package/skills/patterns/ui/tables.md +0 -407
- package/skills/patterns/ui/toasts.md +0 -300
- package/skills/patterns/ui/tooltips.md +0 -396
- package/skills/patterns/utils/dates.md +0 -435
- package/skills/patterns/utils/errors.md +0 -451
- package/skills/patterns/utils/formatting.md +0 -345
- package/skills/patterns/utils/validation.md +0 -434
- package/templates/bootspring.config.js +0 -83
- package/templates/business/business-model-canvas.md +0 -246
- package/templates/business/business-plan.md +0 -266
- package/templates/business/competitive-analysis.md +0 -312
- package/templates/fundraising/data-room-checklist.md +0 -300
- package/templates/fundraising/investor-research.md +0 -243
- package/templates/fundraising/pitch-deck-outline.md +0 -253
- package/templates/legal/gdpr-checklist.md +0 -339
- package/templates/legal/privacy-policy.md +0 -285
- package/templates/legal/terms-of-service.md +0 -222
- package/templates/mcp.json +0 -9
package/cli/business.js
CHANGED
|
@@ -9,11 +9,10 @@
|
|
|
9
9
|
const fs = require('fs');
|
|
10
10
|
const path = require('path');
|
|
11
11
|
const utils = require('../core/utils');
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const TEMPLATES_DIR = path.join(__dirname, '..', 'templates', 'business');
|
|
12
|
+
const projectState = require('../core/project-state');
|
|
13
|
+
const checkpointEngine = require('../core/checkpoint-engine');
|
|
14
|
+
const api = require('../core/api-client');
|
|
15
|
+
const auth = require('../core/auth');
|
|
17
16
|
|
|
18
17
|
/**
|
|
19
18
|
* Output directory for business docs
|
|
@@ -72,15 +71,44 @@ function processTemplate(content, config) {
|
|
|
72
71
|
.replace(/\{\{DOMAIN\}\}/g, config.domain || 'example.com');
|
|
73
72
|
}
|
|
74
73
|
|
|
74
|
+
/**
|
|
75
|
+
* Fetch template content from API
|
|
76
|
+
*/
|
|
77
|
+
async function fetchTemplate(templateFile) {
|
|
78
|
+
if (!auth.isAuthenticated()) {
|
|
79
|
+
return { error: 'auth_required' };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
const response = await api.getTemplate('business', templateFile);
|
|
84
|
+
return response;
|
|
85
|
+
} catch (error) {
|
|
86
|
+
if (error.status === 401) {
|
|
87
|
+
return { error: 'auth_required' };
|
|
88
|
+
}
|
|
89
|
+
if (error.status === 403) {
|
|
90
|
+
return { error: 'upgrade_required' };
|
|
91
|
+
}
|
|
92
|
+
return { error: 'network_error', message: error.message };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
75
96
|
/**
|
|
76
97
|
* Initialize business planning docs
|
|
77
98
|
*/
|
|
78
|
-
function businessInit() {
|
|
99
|
+
async function businessInit() {
|
|
79
100
|
console.log(`
|
|
80
101
|
${utils.COLORS.cyan}${utils.COLORS.bold}⚡ Business Planning${utils.COLORS.reset}
|
|
81
102
|
${utils.COLORS.dim}Initialize business planning documents${utils.COLORS.reset}
|
|
82
103
|
`);
|
|
83
104
|
|
|
105
|
+
// Check authentication
|
|
106
|
+
if (!auth.isAuthenticated()) {
|
|
107
|
+
utils.print.error('Authentication required');
|
|
108
|
+
console.log(`${utils.COLORS.dim}Run: bootspring auth login${utils.COLORS.reset}`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
|
|
84
112
|
const config = getProjectConfig();
|
|
85
113
|
const outputDir = path.join(process.cwd(), OUTPUT_DIR);
|
|
86
114
|
|
|
@@ -91,6 +119,10 @@ ${utils.COLORS.dim}Initialize business planning documents${utils.COLORS.reset}
|
|
|
91
119
|
|
|
92
120
|
const created = [];
|
|
93
121
|
const skipped = [];
|
|
122
|
+
const failed = [];
|
|
123
|
+
|
|
124
|
+
const spinner = utils.createSpinner('Loading templates...');
|
|
125
|
+
spinner.start();
|
|
94
126
|
|
|
95
127
|
// Create all business templates
|
|
96
128
|
for (const [key, template] of Object.entries(TEMPLATES)) {
|
|
@@ -101,15 +133,20 @@ ${utils.COLORS.dim}Initialize business planning documents${utils.COLORS.reset}
|
|
|
101
133
|
continue;
|
|
102
134
|
}
|
|
103
135
|
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
created.push(template.name);
|
|
136
|
+
const result = await fetchTemplate(template.file);
|
|
137
|
+
|
|
138
|
+
if (result.error) {
|
|
139
|
+
failed.push({ name: template.name, error: result.error });
|
|
140
|
+
continue;
|
|
110
141
|
}
|
|
142
|
+
|
|
143
|
+
const processed = processTemplate(result.content, config);
|
|
144
|
+
fs.writeFileSync(outputPath, processed);
|
|
145
|
+
created.push(template.name);
|
|
111
146
|
}
|
|
112
147
|
|
|
148
|
+
spinner.stop();
|
|
149
|
+
|
|
113
150
|
if (created.length > 0) {
|
|
114
151
|
console.log(`${utils.COLORS.bold}Created:${utils.COLORS.reset}`);
|
|
115
152
|
for (const name of created) {
|
|
@@ -126,6 +163,26 @@ ${utils.COLORS.dim}Initialize business planning documents${utils.COLORS.reset}
|
|
|
126
163
|
console.log();
|
|
127
164
|
}
|
|
128
165
|
|
|
166
|
+
if (failed.length > 0) {
|
|
167
|
+
console.log(`${utils.COLORS.bold}Failed:${utils.COLORS.reset}`);
|
|
168
|
+
for (const { name, error } of failed) {
|
|
169
|
+
console.log(` ${utils.COLORS.red}✗${utils.COLORS.reset} ${name} (${error})`);
|
|
170
|
+
}
|
|
171
|
+
console.log();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Auto-tag project as business type
|
|
175
|
+
try {
|
|
176
|
+
projectState.setProjectType(process.cwd(), projectState.PROJECT_TYPES.BUSINESS, {
|
|
177
|
+
autoTagged: true,
|
|
178
|
+
taggedBy: 'business-init'
|
|
179
|
+
});
|
|
180
|
+
checkpointEngine.syncCheckpoints(process.cwd(), { verbose: false });
|
|
181
|
+
utils.print.success('Project tagged as business type');
|
|
182
|
+
} catch (err) {
|
|
183
|
+
utils.print.debug(`Auto-tagging failed: ${err.message}`);
|
|
184
|
+
}
|
|
185
|
+
|
|
129
186
|
console.log(`${utils.COLORS.bold}Next Steps:${utils.COLORS.reset}`);
|
|
130
187
|
console.log(` 1. Edit ${utils.COLORS.cyan}${OUTPUT_DIR}/BUSINESS_PLAN.md${utils.COLORS.reset}`);
|
|
131
188
|
console.log(` 2. Run ${utils.COLORS.cyan}bootspring agent invoke business-strategy-expert${utils.COLORS.reset}`);
|
|
@@ -135,7 +192,7 @@ ${utils.COLORS.dim}Initialize business planning documents${utils.COLORS.reset}
|
|
|
135
192
|
/**
|
|
136
193
|
* Create or edit a specific business document
|
|
137
194
|
*/
|
|
138
|
-
function businessCreate(templateKey) {
|
|
195
|
+
async function businessCreate(templateKey) {
|
|
139
196
|
const template = TEMPLATES[templateKey];
|
|
140
197
|
|
|
141
198
|
if (!template) {
|
|
@@ -149,6 +206,13 @@ ${utils.COLORS.cyan}${utils.COLORS.bold}⚡ ${template.name}${utils.COLORS.reset
|
|
|
149
206
|
${utils.COLORS.dim}${template.description}${utils.COLORS.reset}
|
|
150
207
|
`);
|
|
151
208
|
|
|
209
|
+
// Check authentication
|
|
210
|
+
if (!auth.isAuthenticated()) {
|
|
211
|
+
utils.print.error('Authentication required');
|
|
212
|
+
console.log(`${utils.COLORS.dim}Run: bootspring auth login${utils.COLORS.reset}`);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
|
|
152
216
|
const config = getProjectConfig();
|
|
153
217
|
const outputDir = path.join(process.cwd(), OUTPUT_DIR);
|
|
154
218
|
const outputPath = path.join(outputDir, template.output);
|
|
@@ -164,21 +228,40 @@ ${utils.COLORS.dim}${template.description}${utils.COLORS.reset}
|
|
|
164
228
|
return;
|
|
165
229
|
}
|
|
166
230
|
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
|
|
231
|
+
const spinner = utils.createSpinner('Loading template...');
|
|
232
|
+
spinner.start();
|
|
233
|
+
|
|
234
|
+
const result = await fetchTemplate(template.file);
|
|
235
|
+
|
|
236
|
+
if (result.error === 'auth_required') {
|
|
237
|
+
spinner.fail('Authentication required');
|
|
238
|
+
console.log(`${utils.COLORS.dim}Run: bootspring auth login${utils.COLORS.reset}`);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (result.error === 'upgrade_required') {
|
|
243
|
+
spinner.fail('Upgrade required');
|
|
244
|
+
console.log(`${utils.COLORS.dim}This template requires a Pro subscription.${utils.COLORS.reset}`);
|
|
245
|
+
console.log(`${utils.COLORS.dim}Run: bootspring billing upgrade${utils.COLORS.reset}`);
|
|
170
246
|
return;
|
|
171
247
|
}
|
|
172
248
|
|
|
173
|
-
|
|
174
|
-
|
|
249
|
+
if (result.error) {
|
|
250
|
+
spinner.fail('Failed to load template');
|
|
251
|
+
console.log(`${utils.COLORS.dim}${result.message || 'Check your internet connection.'}${utils.COLORS.reset}`);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
spinner.succeed('Template loaded');
|
|
256
|
+
|
|
257
|
+
const processed = processTemplate(result.content, config);
|
|
175
258
|
fs.writeFileSync(outputPath, processed);
|
|
176
259
|
|
|
177
260
|
utils.print.success(`Created ${template.name}`);
|
|
178
261
|
console.log(`\nFile: ${utils.COLORS.cyan}${OUTPUT_DIR}/${template.output}${utils.COLORS.reset}`);
|
|
179
262
|
console.log(`\n${utils.COLORS.bold}Next Steps:${utils.COLORS.reset}`);
|
|
180
|
-
console.log(
|
|
181
|
-
console.log(
|
|
263
|
+
console.log(' 1. Open and edit the document');
|
|
264
|
+
console.log(' 2. Use AI agents for assistance:');
|
|
182
265
|
console.log(` ${utils.COLORS.cyan}bootspring agent invoke business-strategy-expert${utils.COLORS.reset}`);
|
|
183
266
|
}
|
|
184
267
|
|
|
@@ -192,7 +275,7 @@ ${utils.COLORS.cyan}${utils.COLORS.bold}⚡ Business Planning Status${utils.COLO
|
|
|
192
275
|
|
|
193
276
|
const outputDir = path.join(process.cwd(), OUTPUT_DIR);
|
|
194
277
|
let found = 0;
|
|
195
|
-
|
|
278
|
+
const total = Object.keys(TEMPLATES).length;
|
|
196
279
|
|
|
197
280
|
for (const [key, template] of Object.entries(TEMPLATES)) {
|
|
198
281
|
const outputPath = path.join(outputDir, template.output);
|
|
@@ -300,20 +383,20 @@ async function run(args) {
|
|
|
300
383
|
|
|
301
384
|
switch (subcommand) {
|
|
302
385
|
case 'init':
|
|
303
|
-
businessInit();
|
|
386
|
+
await businessInit();
|
|
304
387
|
break;
|
|
305
388
|
|
|
306
389
|
case 'plan':
|
|
307
|
-
businessCreate('plan');
|
|
390
|
+
await businessCreate('plan');
|
|
308
391
|
break;
|
|
309
392
|
|
|
310
393
|
case 'model':
|
|
311
|
-
businessCreate('model');
|
|
394
|
+
await businessCreate('model');
|
|
312
395
|
break;
|
|
313
396
|
|
|
314
397
|
case 'competitors':
|
|
315
398
|
case 'competitive':
|
|
316
|
-
businessCreate('competitors');
|
|
399
|
+
await businessCreate('competitors');
|
|
317
400
|
break;
|
|
318
401
|
|
|
319
402
|
case 'status':
|
|
@@ -338,7 +421,7 @@ async function run(args) {
|
|
|
338
421
|
default:
|
|
339
422
|
// Check if it's a template name
|
|
340
423
|
if (TEMPLATES[subcommand]) {
|
|
341
|
-
businessCreate(subcommand);
|
|
424
|
+
await businessCreate(subcommand);
|
|
342
425
|
} else {
|
|
343
426
|
utils.print.error(`Unknown subcommand: ${subcommand}`);
|
|
344
427
|
showHelp();
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bootspring Checkpoint Utilities
|
|
3
|
+
* Shared utilities for checkpoint scanning and syncing
|
|
4
|
+
*
|
|
5
|
+
* @package bootspring
|
|
6
|
+
* @module cli/checkpoint-utils
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const config = require('../core/config');
|
|
12
|
+
const auth = require('../core/auth');
|
|
13
|
+
const session = require('../core/session');
|
|
14
|
+
const projectState = require('../core/project-state');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Scan files for checkpoint evaluation
|
|
18
|
+
* Returns raw file data - server determines what checkpoints are complete
|
|
19
|
+
* @param {string} projectRoot - Project root directory
|
|
20
|
+
* @returns {object} File scan data
|
|
21
|
+
*/
|
|
22
|
+
function scanFilesForCheckpoints(projectRoot) {
|
|
23
|
+
const fileScan = {};
|
|
24
|
+
|
|
25
|
+
// List of files to scan (paths are relative to project root)
|
|
26
|
+
const filesToScan = [
|
|
27
|
+
'planning/PROJECT_STATE.json',
|
|
28
|
+
'planning/PRD.md',
|
|
29
|
+
'planning/TECHNICAL_SPEC.md',
|
|
30
|
+
'planning/ARCHITECTURE.md',
|
|
31
|
+
'planning/DATABASE_SCHEMA.md',
|
|
32
|
+
'planning/API_CONTRACTS.md',
|
|
33
|
+
'planning/TEST_PLAN.md',
|
|
34
|
+
'planning/DEPLOYMENT.md',
|
|
35
|
+
'planning/CONTENT_STRATEGY.md',
|
|
36
|
+
'planning/EDITORIAL_CALENDAR.md',
|
|
37
|
+
'planning/STYLE_GUIDE.md',
|
|
38
|
+
'planning/SEO_PLAN.md',
|
|
39
|
+
'planning/BUSINESS_PLAN.md',
|
|
40
|
+
'planning/MARKET_ANALYSIS.md',
|
|
41
|
+
'planning/COMPETITOR_ANALYSIS.md',
|
|
42
|
+
'planning/FINANCIAL_MODEL.md',
|
|
43
|
+
'planning/PITCH_DECK.md',
|
|
44
|
+
'planning/INVESTOR_LIST.md'
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
for (const relativePath of filesToScan) {
|
|
48
|
+
const fullPath = path.join(projectRoot, relativePath);
|
|
49
|
+
try {
|
|
50
|
+
if (fs.existsSync(fullPath)) {
|
|
51
|
+
const stats = fs.statSync(fullPath);
|
|
52
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
53
|
+
fileScan[relativePath] = {
|
|
54
|
+
exists: true,
|
|
55
|
+
size: stats.size,
|
|
56
|
+
// Only include content for files that need pattern matching
|
|
57
|
+
...(relativePath === 'planning/DEPLOYMENT.md' && { content })
|
|
58
|
+
};
|
|
59
|
+
} else {
|
|
60
|
+
fileScan[relativePath] = { exists: false, size: 0 };
|
|
61
|
+
}
|
|
62
|
+
} catch {
|
|
63
|
+
fileScan[relativePath] = { exists: false, size: 0 };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return fileScan;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Push checkpoints to dashboard
|
|
72
|
+
* Sends raw file scan data - server evaluates checkpoints and calculates scores
|
|
73
|
+
* @param {string} projectRoot - Project root directory
|
|
74
|
+
* @param {object} options - Options
|
|
75
|
+
* @param {boolean} options.quiet - Don't log output
|
|
76
|
+
* @param {boolean} options.autoSync - Mark as automatic sync
|
|
77
|
+
* @returns {Promise<object>} Push result
|
|
78
|
+
*/
|
|
79
|
+
async function pushCheckpointsToServer(projectRoot, options = {}) {
|
|
80
|
+
const apiKey = auth.getApiKey();
|
|
81
|
+
|
|
82
|
+
if (!apiKey) {
|
|
83
|
+
if (!options.quiet) {
|
|
84
|
+
throw new Error('Not authenticated. Run: bootspring auth login');
|
|
85
|
+
}
|
|
86
|
+
return { success: false, reason: 'not_authenticated' };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Get project ID from session
|
|
90
|
+
const currentProject = session.getCurrentProject();
|
|
91
|
+
const projectId = currentProject?.id;
|
|
92
|
+
|
|
93
|
+
if (!projectId) {
|
|
94
|
+
if (!options.quiet) {
|
|
95
|
+
throw new Error('No project selected. Run: bootspring switch <project>');
|
|
96
|
+
}
|
|
97
|
+
return { success: false, reason: 'no_project' };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Scan files - raw data only, no evaluation
|
|
101
|
+
const fileScan = scanFilesForCheckpoints(projectRoot);
|
|
102
|
+
|
|
103
|
+
// Load local state for config values
|
|
104
|
+
const state = projectState.loadState(projectRoot) || {};
|
|
105
|
+
const configValues = {
|
|
106
|
+
content: state.content || {},
|
|
107
|
+
business: state.business || {}
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
// Check github connection
|
|
111
|
+
const githubSync = require('../core/github-sync');
|
|
112
|
+
const githubMeta = githubSync.loadGitHubSyncMetadata(projectRoot);
|
|
113
|
+
const githubConnected = githubMeta?.connected || false;
|
|
114
|
+
|
|
115
|
+
// Get raw scores from local collectors (server will weight them)
|
|
116
|
+
let documentationScore, securityScore, testCoverage, githubActivity;
|
|
117
|
+
|
|
118
|
+
if (!options.skipMetrics) {
|
|
119
|
+
try {
|
|
120
|
+
const metricsEngine = require('../core/metrics-engine');
|
|
121
|
+
const rawMetrics = await metricsEngine.collectMetrics(projectRoot, { quiet: true });
|
|
122
|
+
documentationScore = rawMetrics.categories?.docs?.average;
|
|
123
|
+
securityScore = rawMetrics.categories?.security?.average;
|
|
124
|
+
testCoverage = rawMetrics.metrics?.test_coverage?.score;
|
|
125
|
+
githubActivity = rawMetrics.metrics?.commit_frequency?.score;
|
|
126
|
+
} catch {
|
|
127
|
+
// Metrics collection is optional
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Send raw data to server for evaluation
|
|
132
|
+
const cfg = config.load();
|
|
133
|
+
const apiBase = cfg.apiBase || 'https://bootspring.com';
|
|
134
|
+
const response = await fetch(`${apiBase}/api/projects/${projectId}/checkpoints/evaluate`, {
|
|
135
|
+
method: 'POST',
|
|
136
|
+
headers: {
|
|
137
|
+
'Content-Type': 'application/json',
|
|
138
|
+
'x-api-key': apiKey
|
|
139
|
+
},
|
|
140
|
+
body: JSON.stringify({
|
|
141
|
+
fileScan,
|
|
142
|
+
configValues,
|
|
143
|
+
githubConnected,
|
|
144
|
+
githubActivity,
|
|
145
|
+
documentationScore,
|
|
146
|
+
securityScore,
|
|
147
|
+
testCoverage,
|
|
148
|
+
autoSync: options.autoSync || false
|
|
149
|
+
}),
|
|
150
|
+
redirect: 'follow'
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
if (!response.ok) {
|
|
154
|
+
const error = await response.json().catch(() => ({}));
|
|
155
|
+
throw new Error(error.error || `HTTP ${response.status}`);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const result = await response.json();
|
|
159
|
+
return {
|
|
160
|
+
success: true,
|
|
161
|
+
...result
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
module.exports = {
|
|
166
|
+
scanFilesForCheckpoints,
|
|
167
|
+
pushCheckpointsToServer
|
|
168
|
+
};
|