agentblueprint 0.4.0

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 (83) hide show
  1. package/README.md +137 -0
  2. package/dist/__tests__/cli.test.d.ts +1 -0
  3. package/dist/__tests__/cli.test.js +136 -0
  4. package/dist/__tests__/cli.test.js.map +1 -0
  5. package/dist/__tests__/client.test.d.ts +1 -0
  6. package/dist/__tests__/client.test.js +99 -0
  7. package/dist/__tests__/client.test.js.map +1 -0
  8. package/dist/__tests__/config.test.d.ts +1 -0
  9. package/dist/__tests__/config.test.js +37 -0
  10. package/dist/__tests__/config.test.js.map +1 -0
  11. package/dist/__tests__/renderers.test.d.ts +1 -0
  12. package/dist/__tests__/renderers.test.js +471 -0
  13. package/dist/__tests__/renderers.test.js.map +1 -0
  14. package/dist/__tests__/token-store.test.d.ts +1 -0
  15. package/dist/__tests__/token-store.test.js +61 -0
  16. package/dist/__tests__/token-store.test.js.map +1 -0
  17. package/dist/__tests__/tools.test.d.ts +1 -0
  18. package/dist/__tests__/tools.test.js +379 -0
  19. package/dist/__tests__/tools.test.js.map +1 -0
  20. package/dist/cli.d.ts +2 -0
  21. package/dist/cli.js +233 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/client.d.ts +80 -0
  24. package/dist/client.js +56 -0
  25. package/dist/client.js.map +1 -0
  26. package/dist/config.d.ts +5 -0
  27. package/dist/config.js +11 -0
  28. package/dist/config.js.map +1 -0
  29. package/dist/download.d.ts +9 -0
  30. package/dist/download.js +113 -0
  31. package/dist/download.js.map +1 -0
  32. package/dist/errors.d.ts +5 -0
  33. package/dist/errors.js +18 -0
  34. package/dist/errors.js.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.js +4 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/renderers.d.ts +16 -0
  39. package/dist/renderers.js +1468 -0
  40. package/dist/renderers.js.map +1 -0
  41. package/dist/resources/blueprint.d.ts +14 -0
  42. package/dist/resources/blueprint.js +46 -0
  43. package/dist/resources/blueprint.js.map +1 -0
  44. package/dist/resources/blueprints.d.ts +14 -0
  45. package/dist/resources/blueprints.js +33 -0
  46. package/dist/resources/blueprints.js.map +1 -0
  47. package/dist/resources/business-profile.d.ts +14 -0
  48. package/dist/resources/business-profile.js +33 -0
  49. package/dist/resources/business-profile.js.map +1 -0
  50. package/dist/resources/spec.d.ts +14 -0
  51. package/dist/resources/spec.js +33 -0
  52. package/dist/resources/spec.js.map +1 -0
  53. package/dist/server.d.ts +3 -0
  54. package/dist/server.js +47 -0
  55. package/dist/server.js.map +1 -0
  56. package/dist/token-store.d.ts +7 -0
  57. package/dist/token-store.js +34 -0
  58. package/dist/token-store.js.map +1 -0
  59. package/dist/tools/download-blueprint.d.ts +17 -0
  60. package/dist/tools/download-blueprint.js +55 -0
  61. package/dist/tools/download-blueprint.js.map +1 -0
  62. package/dist/tools/get-blueprint.d.ts +17 -0
  63. package/dist/tools/get-blueprint.js +65 -0
  64. package/dist/tools/get-blueprint.js.map +1 -0
  65. package/dist/tools/get-business-case.d.ts +17 -0
  66. package/dist/tools/get-business-case.js +66 -0
  67. package/dist/tools/get-business-case.js.map +1 -0
  68. package/dist/tools/get-business-profile.d.ts +14 -0
  69. package/dist/tools/get-business-profile.js +21 -0
  70. package/dist/tools/get-business-profile.js.map +1 -0
  71. package/dist/tools/get-implementation-plan.d.ts +17 -0
  72. package/dist/tools/get-implementation-plan.js +67 -0
  73. package/dist/tools/get-implementation-plan.js.map +1 -0
  74. package/dist/tools/get-implementation-spec.d.ts +31 -0
  75. package/dist/tools/get-implementation-spec.js +35 -0
  76. package/dist/tools/get-implementation-spec.js.map +1 -0
  77. package/dist/tools/get-use-case.d.ts +31 -0
  78. package/dist/tools/get-use-case.js +35 -0
  79. package/dist/tools/get-use-case.js.map +1 -0
  80. package/dist/tools/list-blueprints.d.ts +22 -0
  81. package/dist/tools/list-blueprints.js +29 -0
  82. package/dist/tools/list-blueprints.js.map +1 -0
  83. package/package.json +38 -0
@@ -0,0 +1,471 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { renderSkillDirectory, slugify } from '../renderers.js';
3
+ // ─── Test fixtures ──────────────────────────────────────────────────
4
+ const minimalInput = {
5
+ blueprintTitle: 'Test Blueprint',
6
+ blueprintId: 'bp-123',
7
+ blueprintData: {
8
+ title: 'Test Blueprint',
9
+ executiveSummary: 'A test blueprint for unit testing.',
10
+ agenticPattern: 'Supervisor',
11
+ enhancedDigitalTeam: [
12
+ {
13
+ name: 'Test Agent',
14
+ role: 'Handles test tasks',
15
+ agentRole: 'Worker',
16
+ supervisionLevel: 'Supervised',
17
+ instructions: { description: 'Process incoming test requests' },
18
+ responsibilities: ['Handle tests', 'Report results'],
19
+ enhancedTools: [
20
+ { name: 'TestRunner', toolCategory: 'Testing', description: 'Runs tests' },
21
+ ],
22
+ guardrails: [
23
+ { type: 'Safety', condition: 'Must not delete production data' },
24
+ ],
25
+ escalationRules: ['Escalate on failure'],
26
+ successMetrics: [
27
+ { metric: 'Test Pass Rate', target: '99%' },
28
+ ],
29
+ },
30
+ ],
31
+ platformRecommendation: {
32
+ primaryPlatform: { name: 'ServiceNow', summary: 'Enterprise platform' },
33
+ },
34
+ riskAssessment: {
35
+ technicalRisks: ['Integration complexity'],
36
+ businessRisks: ['Adoption risk'],
37
+ mitigationStrategies: ['Phased rollout'],
38
+ },
39
+ phases: [
40
+ { name: 'Pilot Phase', durationWeeks: 4, phaseGoal: 'Validate approach', phaseCost: '$50,000' },
41
+ { name: 'Full Rollout', durationWeeks: 12, phaseGoal: 'Enterprise deployment' },
42
+ ],
43
+ },
44
+ };
45
+ const fullInput = {
46
+ ...minimalInput,
47
+ businessCaseData: {
48
+ executiveSummary: {
49
+ purpose: 'Automate testing processes',
50
+ ask: {
51
+ investmentAmount: '$200,000',
52
+ timeline: '6 months',
53
+ keyOutcomes: ['50% faster testing', 'Reduced errors'],
54
+ },
55
+ valueProposition: 'Significant ROI through automation',
56
+ },
57
+ benefits: {
58
+ quantifiedROI: {
59
+ roi: '285%',
60
+ npv: '$450,000',
61
+ paybackPeriod: '8 months',
62
+ laborCostDetail: {
63
+ currentStateBaseline: {
64
+ blendedHourlyRate: { value: '$95/hr' },
65
+ totalAnnualCost: { value: '$300,000' },
66
+ totalAnnualHours: { value: '3,150' },
67
+ },
68
+ projectedSavings: {
69
+ costSavingsAnnual: { value: '$180,000' },
70
+ },
71
+ },
72
+ costBreakdown: {
73
+ implementation: { value: '$150,000' },
74
+ annualLicensing: { value: '$30,000' },
75
+ annualSupportMaintenance: { value: '$15,000' },
76
+ },
77
+ pilotROI: {
78
+ pilotCapex: { value: '$37,500', calculation: '$150,000 × 25%' },
79
+ pilotOpex: { value: '$7,500', calculation: '$37,500 × 20%' },
80
+ pilotAnnualSavings: { value: '$27,000', calculation: '$180,000 × 15%' },
81
+ pilotPaybackMonths: '20',
82
+ pilotYear1Net: { value: '-$18,000', calculation: '$27,000 - $45,000' },
83
+ },
84
+ sensitivity: {
85
+ conservative: { roiPercentage: 180, paybackMonths: 12, annualSavings: '$144,000' },
86
+ realistic: { roiPercentage: 285, paybackMonths: 8, annualSavings: '$180,000' },
87
+ optimistic: { roiPercentage: 380, paybackMonths: 5, annualSavings: '$228,000' },
88
+ },
89
+ fiveYearProjection: [
90
+ { year: 1, costsThisYear: '$200K', valueDelivered: '$100K', netThisYear: '-$100K', runningTotal: '-$100K' },
91
+ { year: 2, costsThisYear: '$50K', valueDelivered: '$250K', netThisYear: '$200K', runningTotal: '$100K' },
92
+ ],
93
+ },
94
+ },
95
+ risks: {
96
+ implementationRisks: [
97
+ { title: 'Data migration', severity: 'High', impact: 'Schedule delay' },
98
+ ],
99
+ mitigationPlan: [
100
+ { riskTitle: 'Data migration', strategy: 'Parallel run', owner: 'PM', timeline: 'Week 4-8' },
101
+ ],
102
+ },
103
+ },
104
+ implementationPlanData: {
105
+ projectOverview: {
106
+ projectName: 'Test Automation Project',
107
+ executiveSummary: 'Deploy AI-powered test automation',
108
+ scope: 'All testing functions',
109
+ assumptions: ['Stable API', 'Team availability'],
110
+ },
111
+ epics: [
112
+ {
113
+ name: 'Infrastructure Setup',
114
+ phase: 'Phase 1',
115
+ priority: 'P0',
116
+ estimatedDuration: '2 weeks',
117
+ businessValue: 'Foundation for all agents',
118
+ stories: [
119
+ { title: 'Setup CI/CD', asA: 'developer', iWant: 'automated pipelines', soThat: 'deploys are reliable' },
120
+ ],
121
+ dependencies: ['Cloud access'],
122
+ },
123
+ ],
124
+ resources: {
125
+ timeline: {
126
+ totalDuration: '6 months',
127
+ phases: [
128
+ { name: 'Phase 1', duration: '2 months', milestones: ['Pilot complete'] },
129
+ ],
130
+ },
131
+ roles: [
132
+ { role: 'Developer', allocation: 'Full-time', duration: '6 months', skillsRequired: ['TypeScript', 'AI'] },
133
+ ],
134
+ },
135
+ dependencies: [
136
+ { type: 'Technical', criticality: 'High', description: 'API access required' },
137
+ ],
138
+ },
139
+ useCaseData: {
140
+ title: 'Test Automation',
141
+ description: 'Automate manual testing processes',
142
+ businessChallenge: 'Manual testing is slow and error-prone',
143
+ currentPainPoints: ['Slow feedback loops', 'Human error'],
144
+ desiredBusinessOutcomes: ['Faster releases', 'Higher quality'],
145
+ transformationStory: {
146
+ situation: 'Manual testing taking 2 weeks per release',
147
+ complication: 'Growing product complexity',
148
+ resolution: 'AI-powered automation reduces to 2 days',
149
+ },
150
+ },
151
+ };
152
+ // ─── Tests ──────────────────────────────────────────────────────────
153
+ describe('slugify', () => {
154
+ it('converts title to URL-safe slug', () => {
155
+ expect(slugify('My Test Blueprint')).toBe('my-test-blueprint');
156
+ });
157
+ it('removes special characters', () => {
158
+ expect(slugify('AI-Powered Testing (v2.0)!')).toBe('ai-powered-testing-v2-0');
159
+ });
160
+ it('truncates at 60 characters', () => {
161
+ const long = 'a'.repeat(100);
162
+ expect(slugify(long).length).toBeLessThanOrEqual(60);
163
+ });
164
+ it('handles empty string', () => {
165
+ expect(slugify('')).toBe('');
166
+ });
167
+ });
168
+ describe('renderSkillDirectory', () => {
169
+ it('returns all expected files', () => {
170
+ const files = renderSkillDirectory(minimalInput);
171
+ const paths = Array.from(files.keys());
172
+ expect(paths).toContain('SKILL.md');
173
+ expect(paths).toContain('references/business-context.md');
174
+ expect(paths).toContain('references/organization-context.md');
175
+ expect(paths).toContain('references/agent-specifications.md');
176
+ expect(paths).toContain('references/financial-case.md');
177
+ expect(paths).toContain('references/implementation-roadmap.md');
178
+ expect(paths).toContain('references/architecture-decisions.md');
179
+ expect(paths).toContain('references/guardrails-and-governance.md');
180
+ expect(paths).toContain('references/evaluation-criteria.md');
181
+ expect(paths).toContain('scripts/validate-spec.sh');
182
+ expect(files.size).toBe(10);
183
+ });
184
+ it('SKILL.md starts with YAML frontmatter', () => {
185
+ const files = renderSkillDirectory(minimalInput);
186
+ const skill = files.get('SKILL.md');
187
+ expect(skill.startsWith('---\n')).toBe(true);
188
+ expect(skill).toContain('name: test-blueprint');
189
+ expect(skill).toContain('blueprint-id: "bp-123"');
190
+ expect(skill).toContain('target-platform: "ServiceNow"');
191
+ expect(skill).toContain('agent-count: "1"');
192
+ expect(skill).toContain('pattern: "Supervisor"');
193
+ });
194
+ it('SKILL.md body contains agent table', () => {
195
+ const files = renderSkillDirectory(minimalInput);
196
+ const skill = files.get('SKILL.md');
197
+ expect(skill).toContain('| # | Agent | Role | Type |');
198
+ expect(skill).toContain('Test Agent');
199
+ });
200
+ it('SKILL.md includes phase information', () => {
201
+ const files = renderSkillDirectory(minimalInput);
202
+ const skill = files.get('SKILL.md');
203
+ expect(skill).toContain('Phase 1: Pilot');
204
+ expect(skill).toContain('4 weeks');
205
+ expect(skill).toContain('Full Rollout');
206
+ });
207
+ it('agent-specifications.md includes tool table', () => {
208
+ const files = renderSkillDirectory(minimalInput);
209
+ const agentSpec = files.get('references/agent-specifications.md');
210
+ expect(agentSpec).toContain('## Test Agent');
211
+ expect(agentSpec).toContain('TestRunner');
212
+ expect(agentSpec).toContain('### Guardrails');
213
+ expect(agentSpec).toContain('Must not delete production data');
214
+ expect(agentSpec).toContain('### Success Metrics');
215
+ expect(agentSpec).toContain('99%');
216
+ });
217
+ it('architecture-decisions.md includes platform info', () => {
218
+ const files = renderSkillDirectory(minimalInput);
219
+ const arch = files.get('references/architecture-decisions.md');
220
+ expect(arch).toContain('## Platform: ServiceNow');
221
+ });
222
+ it('guardrails-and-governance.md includes risks', () => {
223
+ const files = renderSkillDirectory(minimalInput);
224
+ const guardrails = files.get('references/guardrails-and-governance.md');
225
+ expect(guardrails).toContain('Integration complexity');
226
+ expect(guardrails).toContain('Adoption risk');
227
+ expect(guardrails).toContain('Phased rollout');
228
+ });
229
+ it('validate-spec.sh is executable bash script', () => {
230
+ const files = renderSkillDirectory(minimalInput);
231
+ const script = files.get('scripts/validate-spec.sh');
232
+ expect(script).toContain('#!/bin/bash');
233
+ expect(script).toContain('check_file "SKILL.md"');
234
+ });
235
+ });
236
+ describe('renderSkillDirectory with full data', () => {
237
+ it('financial-case.md includes ROI and sensitivity', () => {
238
+ const files = renderSkillDirectory(fullInput);
239
+ const financial = files.get('references/financial-case.md');
240
+ expect(financial).toContain('285%');
241
+ expect(financial).toContain('$450,000');
242
+ expect(financial).toContain('8 months');
243
+ expect(financial).toContain('## Sensitivity Analysis');
244
+ expect(financial).toContain('Conservative');
245
+ expect(financial).toContain('180%'); // conservative ROI
246
+ expect(financial).toContain('## Five-Year Projection');
247
+ expect(financial).toContain('$200K'); // year 1 costs
248
+ expect(financial).toContain('## Pilot Economics');
249
+ expect(financial).toContain('$37,500'); // pilot capex
250
+ expect(financial).toContain('## Labor Cost Analysis');
251
+ expect(financial).toContain('$95/hr'); // blended rate
252
+ expect(financial).toContain('## Cost Breakdown');
253
+ expect(financial).toContain('$150,000'); // implementation
254
+ });
255
+ it('implementation-roadmap.md includes epics and stories', () => {
256
+ const files = renderSkillDirectory(fullInput);
257
+ const roadmap = files.get('references/implementation-roadmap.md');
258
+ expect(roadmap).toContain('Test Automation Project');
259
+ expect(roadmap).toContain('### Infrastructure Setup');
260
+ expect(roadmap).toContain('Setup CI/CD');
261
+ expect(roadmap).toContain('## Timeline');
262
+ expect(roadmap).toContain('6 months');
263
+ expect(roadmap).toContain('## Required Roles');
264
+ expect(roadmap).toContain('## Dependencies');
265
+ });
266
+ it('business-context.md includes use case data', () => {
267
+ const files = renderSkillDirectory(fullInput);
268
+ const context = files.get('references/business-context.md');
269
+ expect(context).toContain('## Use Case: Test Automation');
270
+ expect(context).toContain('Manual testing is slow');
271
+ expect(context).toContain('## Transformation Story');
272
+ expect(context).toContain('AI-powered automation');
273
+ });
274
+ it('guardrails includes business case risks', () => {
275
+ const files = renderSkillDirectory(fullInput);
276
+ const guardrails = files.get('references/guardrails-and-governance.md');
277
+ expect(guardrails).toContain('Implementation Risks (Business Case)');
278
+ expect(guardrails).toContain('Data migration');
279
+ expect(guardrails).toContain('## Mitigation Plan');
280
+ expect(guardrails).toContain('Parallel run');
281
+ });
282
+ it('SKILL.md includes financial summary when business case present', () => {
283
+ const files = renderSkillDirectory(fullInput);
284
+ const skill = files.get('SKILL.md');
285
+ expect(skill).toContain('**ROI:** 285%');
286
+ expect(skill).toContain('**NPV:** $450,000');
287
+ // Pilot economics should use nested field structure
288
+ expect(skill).toContain('Pilot capex: $37,500');
289
+ expect(skill).toContain('Pilot annual savings: $27,000');
290
+ });
291
+ });
292
+ describe('investment tier with multi-number amounts', () => {
293
+ it('parses first number from compound investment string', () => {
294
+ const input = {
295
+ ...minimalInput,
296
+ businessCaseData: {
297
+ executiveSummary: {
298
+ ask: { investmentAmount: '$13,143 one-time + $2,981 annual ongoing' },
299
+ },
300
+ benefits: {},
301
+ },
302
+ };
303
+ const files = renderSkillDirectory(input);
304
+ const skill = files.get('SKILL.md');
305
+ expect(skill).toContain('investment-tier: "low"');
306
+ });
307
+ it('handles simple investment amount', () => {
308
+ const input = {
309
+ ...minimalInput,
310
+ businessCaseData: {
311
+ executiveSummary: {
312
+ ask: { investmentAmount: '$200,000' },
313
+ },
314
+ benefits: {},
315
+ },
316
+ };
317
+ const files = renderSkillDirectory(input);
318
+ const skill = files.get('SKILL.md');
319
+ expect(skill).toContain('investment-tier: "medium"');
320
+ });
321
+ it('returns pending when no business case', () => {
322
+ const files = renderSkillDirectory(minimalInput);
323
+ const skill = files.get('SKILL.md');
324
+ expect(skill).toContain('investment-tier: "pending"');
325
+ });
326
+ });
327
+ describe('renderSkillDirectory with missing data', () => {
328
+ it('handles missing business case gracefully', () => {
329
+ const input = {
330
+ ...minimalInput,
331
+ businessCaseData: undefined,
332
+ };
333
+ const files = renderSkillDirectory(input);
334
+ const financial = files.get('references/financial-case.md');
335
+ expect(financial).toContain('No business case data available');
336
+ });
337
+ it('handles missing implementation plan gracefully', () => {
338
+ const input = {
339
+ ...minimalInput,
340
+ implementationPlanData: undefined,
341
+ };
342
+ const files = renderSkillDirectory(input);
343
+ const roadmap = files.get('references/implementation-roadmap.md');
344
+ expect(roadmap).toContain('No implementation plan data available');
345
+ });
346
+ it('handles missing use case gracefully', () => {
347
+ const input = {
348
+ ...minimalInput,
349
+ useCaseData: undefined,
350
+ };
351
+ const files = renderSkillDirectory(input);
352
+ const context = files.get('references/business-context.md');
353
+ expect(context).toContain('Use case data not available');
354
+ });
355
+ it('handles empty team gracefully', () => {
356
+ const input = {
357
+ ...minimalInput,
358
+ blueprintData: { ...minimalInput.blueprintData, enhancedDigitalTeam: [] },
359
+ };
360
+ const files = renderSkillDirectory(input);
361
+ const skill = files.get('SKILL.md');
362
+ expect(skill).toContain('agent-count: "0"');
363
+ });
364
+ it('handles null fields in blueprint data', () => {
365
+ const input = {
366
+ blueprintTitle: 'Null Test',
367
+ blueprintId: 'bp-null',
368
+ blueprintData: {
369
+ title: null,
370
+ executiveSummary: null,
371
+ enhancedDigitalTeam: null,
372
+ phases: null,
373
+ platformRecommendation: null,
374
+ riskAssessment: null,
375
+ },
376
+ };
377
+ // Should not throw
378
+ const files = renderSkillDirectory(input);
379
+ expect(files.size).toBe(10);
380
+ });
381
+ it('SKILL.md renders phases from implementation plan epics', () => {
382
+ const input = {
383
+ ...minimalInput,
384
+ implementationPlanData: {
385
+ epics: [
386
+ { name: 'Agent Setup', phase: 'Pilot', estimatedDuration: '3 weeks' },
387
+ { name: 'Full Deployment', phase: 'Phase 2', estimatedDuration: '8 weeks' },
388
+ ],
389
+ },
390
+ };
391
+ const files = renderSkillDirectory(input);
392
+ const skill = files.get('SKILL.md');
393
+ expect(skill).toContain('**Agent Setup** (3 weeks)');
394
+ expect(skill).toContain('**Full Deployment** (8 weeks)');
395
+ });
396
+ it('evaluation-criteria.md renders with full data', () => {
397
+ const input = {
398
+ ...minimalInput,
399
+ blueprintData: {
400
+ ...minimalInput.blueprintData,
401
+ roiBaseline: {
402
+ generatedAt: '2026-01-01T00:00:00Z',
403
+ operational: [
404
+ { name: 'Test Pass Rate', predictedValue: '99%', unit: '%', direction: 'higher_is_better', source: 'successCriteria.kpis' },
405
+ ],
406
+ financial: [
407
+ { name: 'ROI', predictedValue: '285%', unit: '%', direction: 'higher_is_better', source: 'quantifiedROI' },
408
+ ],
409
+ },
410
+ },
411
+ businessCaseData: fullInput.businessCaseData,
412
+ };
413
+ const files = renderSkillDirectory(input);
414
+ const evalCriteria = files.get('references/evaluation-criteria.md');
415
+ expect(evalCriteria).toContain('## Operational Metrics');
416
+ expect(evalCriteria).toContain('Test Pass Rate');
417
+ expect(evalCriteria).toContain('99%');
418
+ expect(evalCriteria).toContain('## Financial Metrics');
419
+ expect(evalCriteria).toContain('ROI');
420
+ expect(evalCriteria).toContain('285%');
421
+ expect(evalCriteria).toContain('## Agent-Level Metrics');
422
+ expect(evalCriteria).toContain('Test Agent');
423
+ });
424
+ it('evaluation-criteria.md shows placeholder without data', () => {
425
+ const input = {
426
+ ...minimalInput,
427
+ blueprintData: {
428
+ ...minimalInput.blueprintData,
429
+ enhancedDigitalTeam: [
430
+ { name: 'Plain Agent', role: 'Does things', agentRole: 'Worker' },
431
+ ],
432
+ },
433
+ };
434
+ const files = renderSkillDirectory(input);
435
+ const evalCriteria = files.get('references/evaluation-criteria.md');
436
+ expect(evalCriteria).toContain('No evaluation criteria available yet');
437
+ });
438
+ it('evaluation-criteria.md includes agent-level metrics', () => {
439
+ const files = renderSkillDirectory(minimalInput);
440
+ const evalCriteria = files.get('references/evaluation-criteria.md');
441
+ expect(evalCriteria).toContain('## Agent-Level Metrics');
442
+ expect(evalCriteria).toContain('Test Agent');
443
+ expect(evalCriteria).toContain('Test Pass Rate');
444
+ expect(evalCriteria).toContain('99%');
445
+ });
446
+ it('validate-spec.sh checks for evaluation-criteria.md', () => {
447
+ const files = renderSkillDirectory(minimalInput);
448
+ const script = files.get('scripts/validate-spec.sh');
449
+ expect(script).toContain('check_optional "references/evaluation-criteria.md"');
450
+ });
451
+ it('five-year projection renders with old field names for backward compat', () => {
452
+ const input = {
453
+ ...minimalInput,
454
+ businessCaseData: {
455
+ executiveSummary: { purpose: 'Test' },
456
+ benefits: {
457
+ quantifiedROI: {
458
+ fiveYearProjection: [
459
+ { year: 1, investment: '$100K', value: '$50K', netCashFlow: '-$50K', cumulative: '-$50K' },
460
+ ],
461
+ },
462
+ },
463
+ },
464
+ };
465
+ const files = renderSkillDirectory(input);
466
+ const financial = files.get('references/financial-case.md');
467
+ expect(financial).toContain('$100K');
468
+ expect(financial).toContain('$50K');
469
+ });
470
+ });
471
+ //# sourceMappingURL=renderers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderers.test.js","sourceRoot":"","sources":["../../src/__tests__/renderers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,61 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
3
+ vi.mock('node:fs', () => ({
4
+ readFileSync: vi.fn(),
5
+ writeFileSync: vi.fn(),
6
+ mkdirSync: vi.fn(),
7
+ }));
8
+ import { saveToken, loadToken } from '../token-store.js';
9
+ describe('token-store', () => {
10
+ beforeEach(() => {
11
+ vi.clearAllMocks();
12
+ });
13
+ afterEach(() => {
14
+ vi.restoreAllMocks();
15
+ });
16
+ describe('saveToken', () => {
17
+ it('creates config dir and writes token with restricted permissions', () => {
18
+ saveToken('ab_live_test123');
19
+ expect(mkdirSync).toHaveBeenCalledWith(expect.stringContaining('agentblueprint'), { recursive: true });
20
+ expect(writeFileSync).toHaveBeenCalledWith(expect.stringContaining('config.json'), expect.stringContaining('"apiKey": "ab_live_test123"'), { encoding: 'utf-8', mode: 0o600 });
21
+ });
22
+ it('includes apiUrl when provided', () => {
23
+ saveToken('ab_live_test123', 'http://localhost:3000');
24
+ const written = writeFileSync.mock.calls[0][1];
25
+ const parsed = JSON.parse(written);
26
+ expect(parsed.apiKey).toBe('ab_live_test123');
27
+ expect(parsed.apiUrl).toBe('http://localhost:3000');
28
+ });
29
+ it('omits apiUrl when not provided', () => {
30
+ saveToken('ab_live_test123');
31
+ const written = writeFileSync.mock.calls[0][1];
32
+ const parsed = JSON.parse(written);
33
+ expect(parsed.apiUrl).toBeUndefined();
34
+ });
35
+ });
36
+ describe('loadToken', () => {
37
+ it('returns stored config when file exists', () => {
38
+ readFileSync.mockReturnValue(JSON.stringify({ apiKey: 'ab_live_stored', apiUrl: 'https://custom.example.com' }));
39
+ const result = loadToken();
40
+ expect(result).toEqual({
41
+ apiKey: 'ab_live_stored',
42
+ apiUrl: 'https://custom.example.com',
43
+ });
44
+ });
45
+ it('returns null when file does not exist', () => {
46
+ readFileSync.mockImplementation(() => {
47
+ throw new Error('ENOENT');
48
+ });
49
+ expect(loadToken()).toBeNull();
50
+ });
51
+ it('returns null when file contains invalid JSON', () => {
52
+ readFileSync.mockReturnValue('not json');
53
+ expect(loadToken()).toBeNull();
54
+ });
55
+ it('returns null when apiKey is empty', () => {
56
+ readFileSync.mockReturnValue(JSON.stringify({ apiKey: '' }));
57
+ expect(loadToken()).toBeNull();
58
+ });
59
+ });
60
+ });
61
+ //# sourceMappingURL=token-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-store.test.js","sourceRoot":"","sources":["../../src/__tests__/token-store.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};