@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
@@ -585,15 +585,15 @@ Rate limiting may be applied to certain endpoints.
585
585
  sections.push(`## Endpoints
586
586
 
587
587
  ${Object.entries(endpointsByTag).map(([tag, endpoints]) => {
588
- return `### ${tag}
588
+ return `### ${tag}
589
589
 
590
590
  ${endpoints.map(e => `- [\`${e.method}\` ${e.path}](#${this.slugify(e.method + '-' + e.path)})`).join('\n')}`;
591
- }).join('\n\n')}
591
+ }).join('\n\n')}
592
592
 
593
593
  ---`);
594
594
 
595
595
  // Endpoint Details
596
- sections.push(`## Endpoint Reference\n`);
596
+ sections.push('## Endpoint Reference\n');
597
597
 
598
598
  for (const [tag, endpoints] of Object.entries(endpointsByTag)) {
599
599
  sections.push(`### ${tag}\n`);
@@ -274,17 +274,17 @@ This document tracks significant architecture and design decisions made during t
274
274
  | ID | Title | Category | Status | Impact | Date |
275
275
  |----|-------|----------|--------|--------|------|
276
276
  ${data.decisions.map(d => {
277
- const category = DECISION_CATEGORIES[d.category] || { emoji: '📋', label: d.category };
278
- const impact = IMPACT_LEVELS[d.impact] || { emoji: '🟡', label: d.impact };
279
- return `| [${d.id}](#${d.id.toLowerCase()}) | ${d.title} | ${category.emoji} ${category.label} | ${this.formatStatus(d.status)} | ${impact.emoji} ${impact.label} | ${d.date} |`;
280
- }).join('\n')}
277
+ const category = DECISION_CATEGORIES[d.category] || { emoji: '📋', label: d.category };
278
+ const impact = IMPACT_LEVELS[d.impact] || { emoji: '🟡', label: d.impact };
279
+ return `| [${d.id}](#${d.id.toLowerCase()}) | ${d.title} | ${category.emoji} ${category.label} | ${this.formatStatus(d.status)} | ${impact.emoji} ${impact.label} | ${d.date} |`;
280
+ }).join('\n')}
281
281
 
282
282
  ---`);
283
283
  }
284
284
 
285
285
  // Individual Decisions
286
286
  if (data.decisions.length > 0) {
287
- sections.push(`## Decisions\n`);
287
+ sections.push('## Decisions\n');
288
288
 
289
289
  for (const decision of data.decisions) {
290
290
  sections.push(this.formatDecision(decision));
@@ -318,16 +318,16 @@ bootspring docs decisions add "Decision Title"
318
318
  ### By Category
319
319
 
320
320
  ${Object.entries(stats.byCategory).map(([cat, count]) => {
321
- const category = DECISION_CATEGORIES[cat] || { emoji: '📋', label: cat };
322
- return `- ${category.emoji} **${category.label}:** ${count}`;
323
- }).join('\n')}
321
+ const category = DECISION_CATEGORIES[cat] || { emoji: '📋', label: cat };
322
+ return `- ${category.emoji} **${category.label}:** ${count}`;
323
+ }).join('\n')}
324
324
 
325
325
  ### By Impact
326
326
 
327
327
  ${Object.entries(stats.byImpact).map(([imp, count]) => {
328
- const impact = IMPACT_LEVELS[imp] || { emoji: '🟡', label: imp };
329
- return `- ${impact.emoji} **${impact.label}:** ${count}`;
330
- }).join('\n')}
328
+ const impact = IMPACT_LEVELS[imp] || { emoji: '🟡', label: imp };
329
+ return `- ${impact.emoji} **${impact.label}:** ${count}`;
330
+ }).join('\n')}
331
331
 
332
332
  ---`);
333
333
 
@@ -422,14 +422,14 @@ ${decision.rationale || '_No rationale provided._'}
422
422
  #### Options Considered
423
423
 
424
424
  ${decision.options.map((opt, i) => {
425
- const chosen = opt.chosen ? ' ✅ **CHOSEN**' : '';
426
- return `**Option ${i + 1}: ${opt.name}**${chosen}
425
+ const chosen = opt.chosen ? ' ✅ **CHOSEN**' : '';
426
+ return `**Option ${i + 1}: ${opt.name}**${chosen}
427
427
 
428
428
  ${opt.description || ''}
429
429
 
430
430
  - Pros: ${(opt.pros || []).join(', ') || 'None listed'}
431
431
  - Cons: ${(opt.cons || []).join(', ') || 'None listed'}`;
432
- }).join('\n\n')}
432
+ }).join('\n\n')}
433
433
  `;
434
434
  }
435
435
 
@@ -590,12 +590,12 @@ ${scoreBar} **${metrics.overallScore}%**
590
590
  | Category | Score | Status |
591
591
  |----------|-------|--------|
592
592
  ${Object.entries(METRIC_CATEGORIES).map(([key, config]) => {
593
- const metricKey = this.categoryToMetricKey(key);
594
- const score = metrics[metricKey]?.score || 0;
595
- const catStatus = this.getStatusFromScore(score);
596
- const statusConfig = HEALTH_STATUS[catStatus];
597
- return `| ${config.emoji} ${config.label} | ${score}/100 | ${statusConfig.emoji} ${statusConfig.label} |`;
598
- }).join('\n')}
593
+ const metricKey = this.categoryToMetricKey(key);
594
+ const score = metrics[metricKey]?.score || 0;
595
+ const catStatus = this.getStatusFromScore(score);
596
+ const statusConfig = HEALTH_STATUS[catStatus];
597
+ return `| ${config.emoji} ${config.label} | ${score}/100 | ${statusConfig.emoji} ${statusConfig.label} |`;
598
+ }).join('\n')}
599
599
 
600
600
  ---`);
601
601
 
@@ -252,7 +252,7 @@ class SprintGenerator {
252
252
  const idealPointsPerDay = sprint.metrics.totalPoints / totalDays;
253
253
 
254
254
  const burndown = [];
255
- let currentDate = new Date(startDate);
255
+ const currentDate = new Date(startDate);
256
256
  let idealRemaining = sprint.metrics.totalPoints;
257
257
 
258
258
  while (currentDate <= endDate) {
@@ -364,10 +364,10 @@ ${progressBar} **${metrics.percentComplete}%** Complete
364
364
  sections.push(`## Sprint Goals
365
365
 
366
366
  ${sprint.goals.map((goal, i) => {
367
- const statusIcon = goal.status === 'completed' ? '✅' : goal.status === 'in_progress' ? '🔄' : '⬜';
368
- return `${i + 1}. ${statusIcon} **${goal.description}**
367
+ const statusIcon = goal.status === 'completed' ? '✅' : goal.status === 'in_progress' ? '🔄' : '⬜';
368
+ return `${i + 1}. ${statusIcon} **${goal.description}**
369
369
  ${goal.success_criteria.length > 0 ? goal.success_criteria.map(c => ` - ${c}`).join('\n') : ''}`;
370
- }).join('\n\n')}
370
+ }).join('\n\n')}
371
371
 
372
372
  ---`);
373
373
  }
@@ -284,8 +284,8 @@ function generateTodo(tasks, options = {}) {
284
284
  const checkbox = task.status === 'completed' ? '[x]' : '[ ]';
285
285
  const statusTag = task.status === 'completed' ? ' (`completed`)' :
286
286
  task.status === 'in_progress' ? ' (`in_progress`)' :
287
- task.status === 'blocked' ? ' (`blocked`)' :
288
- task.status === 'skipped' ? ' (`skipped`)' : '';
287
+ task.status === 'blocked' ? ' (`blocked`)' :
288
+ task.status === 'skipped' ? ' (`skipped`)' : '';
289
289
  content += `- ${checkbox} \`${task.id}\` ${task.title}${statusTag}\n`;
290
290
 
291
291
  // Source traceability
@@ -629,7 +629,7 @@ class VisualDocGenerator {
629
629
  // Add header comment
630
630
  const content = [
631
631
  `%% ${diagram.title}`,
632
- `%% Generated by Bootspring Visual Doc Generator`,
632
+ '%% Generated by Bootspring Visual Doc Generator',
633
633
  `%% ${new Date().toISOString()}`,
634
634
  '',
635
635
  diagram.code
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@girardmedia/bootspring",
3
- "version": "2.1.3",
3
+ "version": "2.2.1",
4
4
  "description": "Thin client for Bootspring cloud MCP, hosted agents, and paywalled workflow intelligence",
5
5
  "keywords": [
6
6
  "ai",
@@ -26,84 +26,35 @@
26
26
  "bin": {
27
27
  "bootspring": "./bin/bootspring.js"
28
28
  },
29
- "main": "./core/index.js",
30
- "types": "./core/index.d.ts",
29
+ "main": "./dist/core.js",
30
+ "types": "./dist/core/index.d.ts",
31
31
  "exports": {
32
32
  ".": {
33
- "types": "./core/index.d.ts",
34
- "default": "./core/index.js"
33
+ "types": "./dist/core/index.d.ts",
34
+ "default": "./dist/core.js"
35
35
  },
36
36
  "./mcp": {
37
- "types": "./mcp/server.d.ts",
38
- "default": "./mcp/server.js"
39
- },
40
- "./auth": {
41
- "types": "./core/auth.d.ts",
42
- "default": "./core/auth.js"
43
- },
44
- "./api": {
45
- "types": "./core/api-client.d.ts",
46
- "default": "./core/api-client.js"
37
+ "types": "./dist/mcp/index.d.ts",
38
+ "default": "./dist/mcp-server.js"
47
39
  }
48
40
  },
49
41
  "files": [
50
42
  "bin/bootspring.js",
51
- "cli/agent.js",
52
- "cli/auth.js",
53
- "cli/billing.js",
54
- "cli/build.js",
55
- "cli/dashboard.js",
56
- "cli/init.js",
57
- "cli/mcp.js",
58
- "cli/orchestrator.js",
59
- "cli/project.js",
60
- "cli/quality.js",
61
- "cli/skill.js",
62
- "cli/switch.js",
63
- "cli/todo.js",
64
- "cli/update.js",
65
- "core/api-client.d.ts",
66
- "core/api-client.js",
67
- "core/auth.d.ts",
68
- "core/auth.js",
69
- "core/build-orchestrator.js",
70
- "core/build-state.js",
71
- "core/config.d.ts",
72
- "core/config.js",
73
- "core/context-loader.js",
74
- "core/context.d.ts",
75
- "core/context.js",
76
- "core/entitlements.d.ts",
77
- "core/entitlements.js",
78
- "core/index.d.ts",
79
- "core/index.js",
80
- "core/mcp-config.js",
81
- "core/policies.d.ts",
82
- "core/policies.js",
83
- "core/policy-matrix.js",
84
- "core/project-activity.js",
85
- "core/redaction.d.ts",
86
- "core/redaction.js",
87
- "core/self-update.js",
88
- "core/session.js",
89
- "core/task-extractor.js",
90
- "core/telemetry.d.ts",
91
- "core/telemetry.js",
92
- "core/tier-enforcement.js",
93
- "core/utils.d.ts",
94
- "core/utils.js",
95
- "core/validation.js",
96
- "mcp/server.d.ts",
97
- "mcp/server.js",
43
+ "dist/index.js",
44
+ "dist/core.js",
45
+ "dist/mcp-server.js",
46
+ "dist/core/index.d.ts",
47
+ "dist/mcp/index.d.ts",
98
48
  "generators/",
99
- "generators/templates/build-planning.template.js",
49
+ "claude-commands/",
100
50
  "scripts/postinstall.js"
101
51
  ],
102
52
  "scripts": {
103
53
  "postinstall": "node scripts/postinstall.js",
104
54
  "start": "node bin/bootspring.js",
105
55
  "dashboard": "node bin/bootspring.js dashboard",
106
- "mcp": "node mcp/server.js",
56
+ "mcp": "node dist/mcp-server.js",
57
+ "pretest": "npm run build",
107
58
  "test": "vitest run",
108
59
  "test:launch-smoke": "vitest run __tests__/unit/cli-first-run-smoke.test.js __tests__/unit/health-fresh-start.test.ts __tests__/unit/session-project-scope.test.ts __tests__/unit/auth-cli-mixed-states.test.ts __tests__/unit/api-client-project-auth-fallback.test.js __tests__/unit/cli-help-surface.test.js __tests__/unit/cli-command-manifest.test.js",
109
60
  "test:seed-ingestion": "vitest run __tests__/unit/seed-ingestion-regression.test.js",
@@ -119,6 +70,7 @@
119
70
  "verify:lint-budget": "node scripts/check-lint-budgets.js",
120
71
  "verify:release-gates": "node scripts/release-gate-check.js",
121
72
  "verify:shared-contracts": "node scripts/verify-shared-contracts.js",
73
+ "verify:thin-client-contract": "node scripts/verify-thin-client-contract.js",
122
74
  "build:mcp-contract": "node scripts/export-mcp-contract.js",
123
75
  "verify:mcp-contract": "node scripts/export-mcp-contract.js --check",
124
76
  "planning:sync": "node scripts/sync-planning-queue.js",
@@ -127,26 +79,28 @@
127
79
  "verify:package": "node scripts/check-package-boundaries.js",
128
80
  "db:sync": "node shared/db/sync.js",
129
81
  "db:sync:check": "node shared/db/sync.js --check",
130
- "prepublishOnly": "npm test && npm run lint --if-present && npm run verify:package && npm run verify:mcp-contract"
82
+ "prepublishOnly": "npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:mcp-contract"
131
83
  },
132
84
  "devDependencies": {
133
85
  "@eslint/js": "^9.39.2",
134
86
  "@swc/core": "^1.15.13",
135
87
  "@types/node": "^25.3.1",
88
+ "@typescript-eslint/eslint-plugin": "^8.57.0",
89
+ "@typescript-eslint/parser": "^8.57.0",
136
90
  "@vitest/coverage-v8": "^4.0.18",
137
91
  "eslint": "^9.39.2",
138
92
  "globals": "^17.3.0",
139
93
  "tsup": "^8.5.1",
140
94
  "tsx": "^4.21.0",
141
95
  "typescript": "^5.9.3",
142
- "vitest": "^4.0.18",
143
- "zod": "^4.3.6"
96
+ "vitest": "^4.0.18"
144
97
  },
145
98
  "dependencies": {
146
99
  "@modelcontextprotocol/sdk": "^1.0.0",
147
100
  "jsonwebtoken": "^9.0.3",
148
101
  "ws": "^8.18.0",
149
- "yaml": "^2.8.0"
102
+ "yaml": "^2.8.0",
103
+ "zod": "^4.3.6"
150
104
  },
151
105
  "engines": {
152
106
  "node": ">=18.0.0"