@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/billing.js
ADDED
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bootspring Billing Command
|
|
3
|
+
* Manage subscription and view usage
|
|
4
|
+
*
|
|
5
|
+
* @package bootspring
|
|
6
|
+
* @command billing
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const utils = require('../core/utils');
|
|
10
|
+
const auth = require('../core/auth');
|
|
11
|
+
const tierEnforcement = require('../core/tier-enforcement');
|
|
12
|
+
|
|
13
|
+
const { COLORS: C } = utils;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Show current subscription status
|
|
17
|
+
*/
|
|
18
|
+
async function showStatus() {
|
|
19
|
+
console.log(`\n${C.cyan}${C.bold}Subscription Status${C.reset}\n`);
|
|
20
|
+
|
|
21
|
+
if (!auth.isAuthenticated()) {
|
|
22
|
+
console.log(`${C.yellow}Not logged in${C.reset}`);
|
|
23
|
+
console.log(`${C.dim}Run: bootspring auth login${C.reset}\n`);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const spinner = utils.createSpinner('Fetching subscription info...');
|
|
28
|
+
spinner.start();
|
|
29
|
+
|
|
30
|
+
try {
|
|
31
|
+
const entitlements = await tierEnforcement.getEntitlements({ forceRefresh: true });
|
|
32
|
+
spinner.succeed('Subscription info loaded');
|
|
33
|
+
|
|
34
|
+
const tier = entitlements.tier || 'free';
|
|
35
|
+
const limits = entitlements.limits || tierEnforcement.DEFAULT_LIMITS[tier];
|
|
36
|
+
const usage = entitlements.usage || {};
|
|
37
|
+
|
|
38
|
+
console.log(`\n${C.bold}Plan${C.reset}`);
|
|
39
|
+
console.log(` Tier: ${tierEnforcement.formatTierBadge(tier)} ${tier}`);
|
|
40
|
+
|
|
41
|
+
if (entitlements.isFounder) {
|
|
42
|
+
console.log(` ${C.yellow}Lifetime Founder Member${C.reset}`);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (entitlements.expiresAt) {
|
|
46
|
+
const expiryDate = new Date(entitlements.expiresAt);
|
|
47
|
+
const daysLeft = Math.ceil((expiryDate - Date.now()) / (1000 * 60 * 60 * 24));
|
|
48
|
+
console.log(` Renews: ${expiryDate.toLocaleDateString()} (${daysLeft} days)`);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
console.log(`\n${C.bold}Limits${C.reset}`);
|
|
52
|
+
console.log(` Projects: ${usage.projects || 0} / ${limits.projects}`);
|
|
53
|
+
console.log(` API Calls: ${usage.apiCalls || 0} / ${limits.apiCallsPerMonth} per month`);
|
|
54
|
+
console.log(` Devices: ${usage.devices || 0} / ${limits.devices}`);
|
|
55
|
+
console.log(` Team Seats: ${usage.teamSeats || 0} / ${limits.teamSeats}`);
|
|
56
|
+
console.log(` Storage: ${usage.storage || '0MB'} / ${limits.storage}`);
|
|
57
|
+
|
|
58
|
+
console.log(`\n${C.bold}Features${C.reset}`);
|
|
59
|
+
const features = entitlements.features || tierEnforcement.FEATURE_GATES[tier] || [];
|
|
60
|
+
const featureLabels = {
|
|
61
|
+
'agents.technical': 'Technical Agents',
|
|
62
|
+
'agents.business': 'Business Agents',
|
|
63
|
+
'agents.enterprise': 'Enterprise Agents',
|
|
64
|
+
'agents.*': 'All Agents',
|
|
65
|
+
'skills.basic': 'Basic Skills',
|
|
66
|
+
'skills.advanced': 'Advanced Skills',
|
|
67
|
+
'skills.enterprise': 'Enterprise Skills',
|
|
68
|
+
'skills.*': 'All Skills',
|
|
69
|
+
'workflows.basic': 'Basic Workflows',
|
|
70
|
+
'workflows.advanced': 'Advanced Workflows',
|
|
71
|
+
'workflows.*': 'All Workflows',
|
|
72
|
+
'team_features': 'Team Collaboration',
|
|
73
|
+
'presence': 'Real-time Presence',
|
|
74
|
+
'audit_logs': 'Audit Logs',
|
|
75
|
+
'sso': 'SSO/SAML',
|
|
76
|
+
'priority_support': 'Priority Support',
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
for (const feature of features.slice(0, 8)) {
|
|
80
|
+
const label = featureLabels[feature] || feature;
|
|
81
|
+
console.log(` ${C.green}✓${C.reset} ${label}`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (features.length > 8) {
|
|
85
|
+
console.log(` ${C.dim}... and ${features.length - 8} more${C.reset}`);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (tier === 'free') {
|
|
89
|
+
console.log(`\n${C.yellow}${C.bold}Upgrade to Pro${C.reset}`);
|
|
90
|
+
console.log(`${C.dim}Unlock business agents, advanced skills, and priority support${C.reset}`);
|
|
91
|
+
console.log(` ${C.cyan}bootspring billing upgrade${C.reset}`);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
console.log();
|
|
95
|
+
} catch (error) {
|
|
96
|
+
spinner.fail('Failed to fetch subscription info');
|
|
97
|
+
console.log(`${C.red}Error: ${error.message}${C.reset}\n`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Show usage statistics
|
|
103
|
+
*/
|
|
104
|
+
async function showUsage() {
|
|
105
|
+
console.log(`\n${C.cyan}${C.bold}Usage Statistics${C.reset}\n`);
|
|
106
|
+
|
|
107
|
+
if (!auth.isAuthenticated()) {
|
|
108
|
+
console.log(`${C.yellow}Not logged in${C.reset}`);
|
|
109
|
+
console.log(`${C.dim}Run: bootspring auth login${C.reset}\n`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const spinner = utils.createSpinner('Fetching usage data...');
|
|
114
|
+
spinner.start();
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
const api = require('../core/api-client');
|
|
118
|
+
const usage = await api.getUsage();
|
|
119
|
+
spinner.succeed('Usage data loaded');
|
|
120
|
+
|
|
121
|
+
console.log(`\n${C.bold}This Month${C.reset}`);
|
|
122
|
+
console.log(` API Calls: ${usage.apiCalls || 0}`);
|
|
123
|
+
console.log(` Agent Invokes: ${usage.agentInvokes || 0}`);
|
|
124
|
+
console.log(` Skill Lookups: ${usage.skillLookups || 0}`);
|
|
125
|
+
console.log(` Workflows Run: ${usage.workflowsRun || 0}`);
|
|
126
|
+
|
|
127
|
+
if (usage.topAgents && usage.topAgents.length > 0) {
|
|
128
|
+
console.log(`\n${C.bold}Top Agents${C.reset}`);
|
|
129
|
+
for (const agent of usage.topAgents.slice(0, 5)) {
|
|
130
|
+
console.log(` ${C.cyan}${agent.id}${C.reset}: ${agent.count} invocations`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (usage.topSkills && usage.topSkills.length > 0) {
|
|
135
|
+
console.log(`\n${C.bold}Top Skills${C.reset}`);
|
|
136
|
+
for (const skill of usage.topSkills.slice(0, 5)) {
|
|
137
|
+
console.log(` ${C.cyan}${skill.id}${C.reset}: ${skill.count} lookups`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
console.log();
|
|
142
|
+
} catch (error) {
|
|
143
|
+
spinner.fail('Failed to fetch usage data');
|
|
144
|
+
console.log(`${C.red}Error: ${error.message}${C.reset}\n`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Open upgrade page
|
|
150
|
+
*/
|
|
151
|
+
async function upgrade() {
|
|
152
|
+
console.log(`\n${C.cyan}${C.bold}Upgrade Subscription${C.reset}\n`);
|
|
153
|
+
|
|
154
|
+
const tier = tierEnforcement.getTier();
|
|
155
|
+
|
|
156
|
+
if (tier === 'enterprise' || tier === 'custom') {
|
|
157
|
+
console.log(`${C.green}You're on the ${tier} plan.${C.reset}`);
|
|
158
|
+
console.log(`${C.dim}Contact support for plan changes: support@bootspring.com${C.reset}\n`);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
console.log(`${C.bold}Available Plans${C.reset}\n`);
|
|
163
|
+
|
|
164
|
+
console.log(` ${C.bold}Pro${C.reset} - $19/month`);
|
|
165
|
+
console.log(` ${C.dim}• 5 projects, 10k API calls/month${C.reset}`);
|
|
166
|
+
console.log(` ${C.dim}• Business agents (strategy, legal, financial)${C.reset}`);
|
|
167
|
+
console.log(` ${C.dim}• Advanced skills & workflows${C.reset}`);
|
|
168
|
+
console.log(` ${C.dim}• Priority support${C.reset}`);
|
|
169
|
+
|
|
170
|
+
console.log(`\n ${C.bold}Team${C.reset} - $49/month`);
|
|
171
|
+
console.log(` ${C.dim}• 20 projects, 50k API calls/month${C.reset}`);
|
|
172
|
+
console.log(` ${C.dim}• 5 team seats included${C.reset}`);
|
|
173
|
+
console.log(` ${C.dim}• Team collaboration features${C.reset}`);
|
|
174
|
+
console.log(` ${C.dim}• Enterprise agents (fundraising, partnerships)${C.reset}`);
|
|
175
|
+
|
|
176
|
+
console.log(`\n ${C.bold}Enterprise${C.reset} - $199/month`);
|
|
177
|
+
console.log(` ${C.dim}• 100 projects, 500k API calls/month${C.reset}`);
|
|
178
|
+
console.log(` ${C.dim}• 20 team seats, SSO/SAML${C.reset}`);
|
|
179
|
+
console.log(` ${C.dim}• Audit logs, custom policies${C.reset}`);
|
|
180
|
+
console.log(` ${C.dim}• Dedicated support${C.reset}`);
|
|
181
|
+
|
|
182
|
+
console.log(`\n${C.bold}Upgrade at:${C.reset}`);
|
|
183
|
+
console.log(` ${C.cyan}https://bootspring.com/pricing${C.reset}\n`);
|
|
184
|
+
|
|
185
|
+
// Try to get checkout URL
|
|
186
|
+
if (auth.isAuthenticated()) {
|
|
187
|
+
try {
|
|
188
|
+
const api = require('../core/api-client');
|
|
189
|
+
const { url } = await api.createCheckout('pro');
|
|
190
|
+
if (url) {
|
|
191
|
+
console.log(`${C.bold}Quick checkout:${C.reset}`);
|
|
192
|
+
console.log(` ${C.cyan}${url}${C.reset}\n`);
|
|
193
|
+
}
|
|
194
|
+
} catch {
|
|
195
|
+
// Ignore checkout URL errors
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Open billing portal
|
|
202
|
+
*/
|
|
203
|
+
async function portal() {
|
|
204
|
+
console.log(`\n${C.cyan}${C.bold}Billing Portal${C.reset}\n`);
|
|
205
|
+
|
|
206
|
+
if (!auth.isAuthenticated()) {
|
|
207
|
+
console.log(`${C.yellow}Not logged in${C.reset}`);
|
|
208
|
+
console.log(`${C.dim}Run: bootspring auth login${C.reset}\n`);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const spinner = utils.createSpinner('Getting portal URL...');
|
|
213
|
+
spinner.start();
|
|
214
|
+
|
|
215
|
+
try {
|
|
216
|
+
const api = require('../core/api-client');
|
|
217
|
+
const { url } = await api.getPortalUrl();
|
|
218
|
+
spinner.succeed('Portal URL ready');
|
|
219
|
+
|
|
220
|
+
console.log(`\n${C.bold}Manage your subscription:${C.reset}`);
|
|
221
|
+
console.log(` ${C.cyan}${url}${C.reset}\n`);
|
|
222
|
+
|
|
223
|
+
console.log(`${C.dim}In the portal you can:${C.reset}`);
|
|
224
|
+
console.log(`${C.dim} • Update payment method${C.reset}`);
|
|
225
|
+
console.log(`${C.dim} • View invoices${C.reset}`);
|
|
226
|
+
console.log(`${C.dim} • Change or cancel plan${C.reset}\n`);
|
|
227
|
+
} catch (error) {
|
|
228
|
+
spinner.fail('Failed to get portal URL');
|
|
229
|
+
console.log(`${C.red}Error: ${error.message}${C.reset}`);
|
|
230
|
+
console.log(`${C.dim}Visit https://bootspring.com/dashboard/billing directly${C.reset}\n`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Show help
|
|
236
|
+
*/
|
|
237
|
+
function showHelp() {
|
|
238
|
+
console.log(`
|
|
239
|
+
${C.cyan}${C.bold}bootspring billing${C.reset} - Manage subscription and billing
|
|
240
|
+
|
|
241
|
+
${C.bold}USAGE${C.reset}
|
|
242
|
+
bootspring billing <command>
|
|
243
|
+
|
|
244
|
+
${C.bold}COMMANDS${C.reset}
|
|
245
|
+
${C.cyan}status${C.reset} Show current subscription status
|
|
246
|
+
${C.cyan}usage${C.reset} Show usage statistics
|
|
247
|
+
${C.cyan}upgrade${C.reset} View upgrade options
|
|
248
|
+
${C.cyan}portal${C.reset} Open Stripe billing portal
|
|
249
|
+
${C.cyan}help${C.reset} Show this help
|
|
250
|
+
|
|
251
|
+
${C.bold}EXAMPLES${C.reset}
|
|
252
|
+
${C.dim}# Check your subscription${C.reset}
|
|
253
|
+
bootspring billing status
|
|
254
|
+
|
|
255
|
+
${C.dim}# View upgrade options${C.reset}
|
|
256
|
+
bootspring billing upgrade
|
|
257
|
+
|
|
258
|
+
${C.dim}# Manage billing in Stripe${C.reset}
|
|
259
|
+
bootspring billing portal
|
|
260
|
+
`);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Run billing command
|
|
265
|
+
*/
|
|
266
|
+
async function run(args) {
|
|
267
|
+
const subcommand = args[0] || 'status';
|
|
268
|
+
|
|
269
|
+
switch (subcommand) {
|
|
270
|
+
case 'status':
|
|
271
|
+
case 'info':
|
|
272
|
+
await showStatus();
|
|
273
|
+
break;
|
|
274
|
+
|
|
275
|
+
case 'usage':
|
|
276
|
+
case 'stats':
|
|
277
|
+
await showUsage();
|
|
278
|
+
break;
|
|
279
|
+
|
|
280
|
+
case 'upgrade':
|
|
281
|
+
case 'plans':
|
|
282
|
+
await upgrade();
|
|
283
|
+
break;
|
|
284
|
+
|
|
285
|
+
case 'portal':
|
|
286
|
+
case 'manage':
|
|
287
|
+
await portal();
|
|
288
|
+
break;
|
|
289
|
+
|
|
290
|
+
case 'help':
|
|
291
|
+
case '-h':
|
|
292
|
+
case '--help':
|
|
293
|
+
showHelp();
|
|
294
|
+
break;
|
|
295
|
+
|
|
296
|
+
default:
|
|
297
|
+
console.log(`${C.red}Unknown command: ${subcommand}${C.reset}`);
|
|
298
|
+
showHelp();
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
module.exports = { run, showHelp };
|