@girardmedia/bootspring 2.1.3 → 2.2.1

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