@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.
- package/bin/bootspring.js +157 -83
- package/claude-commands/agent.md +34 -0
- package/claude-commands/bs.md +31 -0
- package/claude-commands/build.md +25 -0
- package/claude-commands/skill.md +31 -0
- package/claude-commands/todo.md +25 -0
- package/dist/core/index.d.ts +5814 -0
- package/dist/core.js +5779 -0
- package/dist/index.js +93883 -0
- package/dist/mcp/index.d.ts +1 -0
- package/dist/mcp-server.js +2298 -0
- package/generators/api-docs.js +3 -3
- package/generators/decisions.js +14 -14
- package/generators/health.js +6 -6
- package/generators/sprint.js +4 -4
- package/generators/templates/build-planning.template.js +2 -2
- package/generators/visual-doc-generator.js +1 -1
- package/package.json +22 -68
- package/cli/agent.js +0 -799
- package/cli/auth.js +0 -896
- package/cli/billing.js +0 -320
- package/cli/build.js +0 -1442
- package/cli/dashboard.js +0 -123
- package/cli/init.js +0 -669
- package/cli/mcp.js +0 -240
- package/cli/orchestrator.js +0 -240
- package/cli/project.js +0 -825
- package/cli/quality.js +0 -281
- package/cli/skill.js +0 -503
- package/cli/switch.js +0 -453
- package/cli/todo.js +0 -629
- package/cli/update.js +0 -132
- package/core/api-client.d.ts +0 -69
- package/core/api-client.js +0 -1482
- package/core/auth.d.ts +0 -98
- package/core/auth.js +0 -737
- package/core/build-orchestrator.js +0 -508
- package/core/build-state.js +0 -612
- package/core/config.d.ts +0 -106
- package/core/config.js +0 -1328
- package/core/context-loader.js +0 -580
- package/core/context.d.ts +0 -61
- package/core/context.js +0 -327
- package/core/entitlements.d.ts +0 -70
- package/core/entitlements.js +0 -322
- package/core/index.d.ts +0 -53
- package/core/index.js +0 -62
- package/core/mcp-config.js +0 -115
- package/core/policies.d.ts +0 -43
- package/core/policies.js +0 -113
- package/core/policy-matrix.js +0 -303
- package/core/project-activity.js +0 -175
- package/core/redaction.d.ts +0 -5
- package/core/redaction.js +0 -63
- package/core/self-update.js +0 -259
- package/core/session.js +0 -353
- package/core/task-extractor.js +0 -1098
- package/core/telemetry.d.ts +0 -55
- package/core/telemetry.js +0 -617
- package/core/tier-enforcement.js +0 -928
- package/core/utils.d.ts +0 -90
- package/core/utils.js +0 -455
- package/core/validation.js +0 -572
- package/mcp/server.d.ts +0 -57
- package/mcp/server.js +0 -264
package/generators/api-docs.js
CHANGED
|
@@ -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
|
-
|
|
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(
|
|
596
|
+
sections.push('## Endpoint Reference\n');
|
|
597
597
|
|
|
598
598
|
for (const [tag, endpoints] of Object.entries(endpointsByTag)) {
|
|
599
599
|
sections.push(`### ${tag}\n`);
|
package/generators/decisions.js
CHANGED
|
@@ -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
|
-
|
|
278
|
-
|
|
279
|
-
|
|
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(
|
|
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
|
-
|
|
322
|
-
|
|
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
|
-
|
|
329
|
-
|
|
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
|
-
|
|
426
|
-
|
|
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
|
|
package/generators/health.js
CHANGED
|
@@ -590,12 +590,12 @@ ${scoreBar} **${metrics.overallScore}%**
|
|
|
590
590
|
| Category | Score | Status |
|
|
591
591
|
|----------|-------|--------|
|
|
592
592
|
${Object.entries(METRIC_CATEGORIES).map(([key, config]) => {
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
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
|
|
package/generators/sprint.js
CHANGED
|
@@ -252,7 +252,7 @@ class SprintGenerator {
|
|
|
252
252
|
const idealPointsPerDay = sprint.metrics.totalPoints / totalDays;
|
|
253
253
|
|
|
254
254
|
const burndown = [];
|
|
255
|
-
|
|
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
|
-
|
|
368
|
-
|
|
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
|
-
|
|
288
|
-
|
|
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
|
-
|
|
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
|
+
"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
|
|
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
|
|
33
|
+
"types": "./dist/core/index.d.ts",
|
|
34
|
+
"default": "./dist/core.js"
|
|
35
35
|
},
|
|
36
36
|
"./mcp": {
|
|
37
|
-
"types": "./mcp/
|
|
38
|
-
"default": "./mcp
|
|
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
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
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
|
-
"
|
|
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
|
|
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"
|