agentblueprint 0.6.28 → 0.6.31
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/dist/__tests__/cli.test.js +8 -0
- package/dist/__tests__/cli.test.js.map +1 -1
- package/dist/__tests__/mcp-setup.test.d.ts +1 -0
- package/dist/__tests__/mcp-setup.test.js +214 -0
- package/dist/__tests__/mcp-setup.test.js.map +1 -0
- package/dist/__tests__/renderers.test.js +7 -118
- package/dist/__tests__/renderers.test.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/download.d.ts +1 -0
- package/dist/download.js +9 -2
- package/dist/download.js.map +1 -1
- package/dist/mcp-setup.d.ts +8 -0
- package/dist/mcp-setup.js +137 -0
- package/dist/mcp-setup.js.map +1 -0
- package/dist/renderers.d.ts +0 -1
- package/dist/renderers.js +4 -131
- package/dist/renderers.js.map +1 -1
- package/package.json +1 -1
|
@@ -36,6 +36,14 @@ describe('parseDownloadArgs', () => {
|
|
|
36
36
|
expect(result.dir).toBe('.agent-blueprint');
|
|
37
37
|
expect(result.list).toBe(false);
|
|
38
38
|
});
|
|
39
|
+
it('parses --no-mcp flag', () => {
|
|
40
|
+
const result = parseDownloadArgs(['abc-123', '--no-mcp']);
|
|
41
|
+
expect(result.noMcp).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
it('noMcp defaults to falsy', () => {
|
|
44
|
+
const result = parseDownloadArgs(['abc-123']);
|
|
45
|
+
expect(result.noMcp).toBeFalsy();
|
|
46
|
+
});
|
|
39
47
|
});
|
|
40
48
|
describe('CLI binary', () => {
|
|
41
49
|
it('shows help with --help', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../src/__tests__/cli.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../src/__tests__/cli.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
3
|
+
import { execFile } from 'node:child_process';
|
|
4
|
+
vi.mock('node:fs/promises', () => ({
|
|
5
|
+
readFile: vi.fn(),
|
|
6
|
+
writeFile: vi.fn(),
|
|
7
|
+
mkdir: vi.fn(),
|
|
8
|
+
access: vi.fn(),
|
|
9
|
+
}));
|
|
10
|
+
vi.mock('node:child_process', () => ({
|
|
11
|
+
execFile: vi.fn(),
|
|
12
|
+
}));
|
|
13
|
+
vi.mock('node:util', () => ({
|
|
14
|
+
promisify: (fn) => fn,
|
|
15
|
+
}));
|
|
16
|
+
// Readline mock: each test sets `mockAnswers` before calling setupServiceNowMcp
|
|
17
|
+
let mockAnswers = [];
|
|
18
|
+
let answerIndex = 0;
|
|
19
|
+
vi.mock('node:readline', () => ({
|
|
20
|
+
createInterface: vi.fn(() => ({
|
|
21
|
+
question: vi.fn((_prompt, cb) => {
|
|
22
|
+
cb(mockAnswers[answerIndex++] ?? '');
|
|
23
|
+
}),
|
|
24
|
+
close: vi.fn(),
|
|
25
|
+
})),
|
|
26
|
+
}));
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
vi.clearAllMocks();
|
|
29
|
+
mockAnswers = [];
|
|
30
|
+
answerIndex = 0;
|
|
31
|
+
});
|
|
32
|
+
// Helper to import fresh each time (module is stateless, but keeps mocks clean)
|
|
33
|
+
async function runSetup() {
|
|
34
|
+
const { setupServiceNowMcp } = await import('../mcp-setup.js');
|
|
35
|
+
return setupServiceNowMcp();
|
|
36
|
+
}
|
|
37
|
+
describe('setupServiceNowMcp', () => {
|
|
38
|
+
it('skips when user presses enter (empty instance name)', async () => {
|
|
39
|
+
mockAnswers = [''];
|
|
40
|
+
await runSetup();
|
|
41
|
+
expect(vi.mocked(execFile)).not.toHaveBeenCalled();
|
|
42
|
+
expect(vi.mocked(writeFile)).not.toHaveBeenCalled();
|
|
43
|
+
});
|
|
44
|
+
it('installs package when which fails', async () => {
|
|
45
|
+
mockAnswers = ['myinstance', 'admin', 'secret123'];
|
|
46
|
+
const mockedExecFile = vi.mocked(execFile);
|
|
47
|
+
// 1st which: not found
|
|
48
|
+
mockedExecFile.mockRejectedValueOnce(new Error('not found'));
|
|
49
|
+
// npm install -g
|
|
50
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '', stderr: '' });
|
|
51
|
+
// 2nd which: found after install
|
|
52
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/local/bin/servicenow-mcp-server\n', stderr: '' });
|
|
53
|
+
// npm root -g
|
|
54
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/local/lib/node_modules\n', stderr: '' });
|
|
55
|
+
vi.mocked(readFile).mockRejectedValue(Object.assign(new Error('ENOENT'), { code: 'ENOENT' }));
|
|
56
|
+
vi.mocked(writeFile).mockResolvedValue(undefined);
|
|
57
|
+
vi.mocked(mkdir).mockResolvedValue(undefined);
|
|
58
|
+
await runSetup();
|
|
59
|
+
// Verify npm install was called
|
|
60
|
+
expect(mockedExecFile).toHaveBeenCalledWith('npm', ['install', '-g', 'servicenow-mcp-server']);
|
|
61
|
+
});
|
|
62
|
+
it('skips install when which succeeds', async () => {
|
|
63
|
+
mockAnswers = ['myinstance', 'admin', 'secret123'];
|
|
64
|
+
const mockedExecFile = vi.mocked(execFile);
|
|
65
|
+
// 1st which: found
|
|
66
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/local/bin/servicenow-mcp-server\n', stderr: '' });
|
|
67
|
+
// 2nd which (resolve path): found
|
|
68
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/local/bin/servicenow-mcp-server\n', stderr: '' });
|
|
69
|
+
// npm root -g
|
|
70
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/local/lib/node_modules\n', stderr: '' });
|
|
71
|
+
vi.mocked(readFile).mockRejectedValue(Object.assign(new Error('ENOENT'), { code: 'ENOENT' }));
|
|
72
|
+
vi.mocked(writeFile).mockResolvedValue(undefined);
|
|
73
|
+
vi.mocked(mkdir).mockResolvedValue(undefined);
|
|
74
|
+
await runSetup();
|
|
75
|
+
// npm install should NOT have been called
|
|
76
|
+
expect(mockedExecFile).not.toHaveBeenCalledWith('npm', ['install', '-g', 'servicenow-mcp-server']);
|
|
77
|
+
});
|
|
78
|
+
it('writes config with correct JSON structure and 600 permissions', async () => {
|
|
79
|
+
mockAnswers = ['dev12345', 'svcadmin', 'p@ssw0rd'];
|
|
80
|
+
const mockedExecFile = vi.mocked(execFile);
|
|
81
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/local/bin/servicenow-mcp-server\n', stderr: '' });
|
|
82
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/local/bin/servicenow-mcp-server\n', stderr: '' });
|
|
83
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/local/lib/node_modules\n', stderr: '' });
|
|
84
|
+
vi.mocked(readFile).mockRejectedValue(Object.assign(new Error('ENOENT'), { code: 'ENOENT' }));
|
|
85
|
+
vi.mocked(writeFile).mockResolvedValue(undefined);
|
|
86
|
+
vi.mocked(mkdir).mockResolvedValue(undefined);
|
|
87
|
+
await runSetup();
|
|
88
|
+
// Find the writeFile call for the config file
|
|
89
|
+
const configCall = vi.mocked(writeFile).mock.calls.find((call) => String(call[0]).endsWith('config/servicenow-instances.json'));
|
|
90
|
+
expect(configCall).toBeDefined();
|
|
91
|
+
const configJson = JSON.parse(configCall[1]);
|
|
92
|
+
expect(configJson.instances).toHaveLength(1);
|
|
93
|
+
expect(configJson.instances[0]).toEqual({
|
|
94
|
+
name: 'dev12345',
|
|
95
|
+
url: 'https://dev12345.service-now.com',
|
|
96
|
+
username: 'svcadmin',
|
|
97
|
+
password: 'p@ssw0rd',
|
|
98
|
+
default: true,
|
|
99
|
+
});
|
|
100
|
+
expect(configCall[2]).toEqual({ encoding: 'utf-8', mode: 0o600 });
|
|
101
|
+
});
|
|
102
|
+
it('merges into existing .claude/settings.json without clobbering', async () => {
|
|
103
|
+
mockAnswers = ['myinst', 'admin', 'pass'];
|
|
104
|
+
const mockedExecFile = vi.mocked(execFile);
|
|
105
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/opt/bin/servicenow-mcp-server\n', stderr: '' });
|
|
106
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/opt/bin/servicenow-mcp-server\n', stderr: '' });
|
|
107
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/opt/lib/node_modules\n', stderr: '' });
|
|
108
|
+
const existingSettings = {
|
|
109
|
+
permissions: { allow: ['npm'] },
|
|
110
|
+
mcpServers: {
|
|
111
|
+
'other-server': { command: '/bin/other', args: ['--flag'] },
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
vi.mocked(readFile).mockImplementation(async (path) => {
|
|
115
|
+
if (String(path).endsWith('settings.json')) {
|
|
116
|
+
return JSON.stringify(existingSettings);
|
|
117
|
+
}
|
|
118
|
+
throw Object.assign(new Error('ENOENT'), { code: 'ENOENT' });
|
|
119
|
+
});
|
|
120
|
+
vi.mocked(writeFile).mockResolvedValue(undefined);
|
|
121
|
+
vi.mocked(mkdir).mockResolvedValue(undefined);
|
|
122
|
+
await runSetup();
|
|
123
|
+
// Find the settings.json write
|
|
124
|
+
const settingsCall = vi.mocked(writeFile).mock.calls.find((call) => String(call[0]).endsWith('settings.json'));
|
|
125
|
+
expect(settingsCall).toBeDefined();
|
|
126
|
+
const settingsJson = JSON.parse(settingsCall[1]);
|
|
127
|
+
// Existing keys preserved
|
|
128
|
+
expect(settingsJson.permissions).toEqual({ allow: ['npm'] });
|
|
129
|
+
expect(settingsJson.mcpServers['other-server']).toEqual({ command: '/bin/other', args: ['--flag'] });
|
|
130
|
+
// New key added
|
|
131
|
+
expect(settingsJson.mcpServers.servicenow).toEqual({
|
|
132
|
+
command: '/opt/bin/servicenow-mcp-server',
|
|
133
|
+
args: [],
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
it('creates new .claude/settings.json when absent', async () => {
|
|
137
|
+
mockAnswers = ['myinst', 'admin', 'pass'];
|
|
138
|
+
const mockedExecFile = vi.mocked(execFile);
|
|
139
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/bin/servicenow-mcp-server\n', stderr: '' });
|
|
140
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/bin/servicenow-mcp-server\n', stderr: '' });
|
|
141
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/lib/node_modules\n', stderr: '' });
|
|
142
|
+
vi.mocked(readFile).mockRejectedValue(Object.assign(new Error('ENOENT'), { code: 'ENOENT' }));
|
|
143
|
+
vi.mocked(writeFile).mockResolvedValue(undefined);
|
|
144
|
+
vi.mocked(mkdir).mockResolvedValue(undefined);
|
|
145
|
+
await runSetup();
|
|
146
|
+
const settingsCall = vi.mocked(writeFile).mock.calls.find((call) => String(call[0]).endsWith('settings.json'));
|
|
147
|
+
expect(settingsCall).toBeDefined();
|
|
148
|
+
const settingsJson = JSON.parse(settingsCall[1]);
|
|
149
|
+
expect(settingsJson).toEqual({
|
|
150
|
+
mcpServers: {
|
|
151
|
+
servicenow: {
|
|
152
|
+
command: '/usr/bin/servicenow-mcp-server',
|
|
153
|
+
args: [],
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
it('appends to .gitignore when entry missing', async () => {
|
|
159
|
+
mockAnswers = ['myinst', 'admin', 'pass'];
|
|
160
|
+
const mockedExecFile = vi.mocked(execFile);
|
|
161
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/bin/servicenow-mcp-server\n', stderr: '' });
|
|
162
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/bin/servicenow-mcp-server\n', stderr: '' });
|
|
163
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/lib/node_modules\n', stderr: '' });
|
|
164
|
+
vi.mocked(readFile).mockImplementation(async (path) => {
|
|
165
|
+
if (String(path).endsWith('.gitignore')) {
|
|
166
|
+
return 'node_modules\ndist\n';
|
|
167
|
+
}
|
|
168
|
+
throw Object.assign(new Error('ENOENT'), { code: 'ENOENT' });
|
|
169
|
+
});
|
|
170
|
+
vi.mocked(writeFile).mockResolvedValue(undefined);
|
|
171
|
+
vi.mocked(mkdir).mockResolvedValue(undefined);
|
|
172
|
+
await runSetup();
|
|
173
|
+
const gitignoreCall = vi.mocked(writeFile).mock.calls.find((call) => String(call[0]).endsWith('.gitignore'));
|
|
174
|
+
expect(gitignoreCall).toBeDefined();
|
|
175
|
+
const content = gitignoreCall[1];
|
|
176
|
+
expect(content).toContain('.claude/settings.json');
|
|
177
|
+
expect(content).toContain('node_modules');
|
|
178
|
+
});
|
|
179
|
+
it('skips .gitignore append when entry already present', async () => {
|
|
180
|
+
mockAnswers = ['myinst', 'admin', 'pass'];
|
|
181
|
+
const mockedExecFile = vi.mocked(execFile);
|
|
182
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/bin/servicenow-mcp-server\n', stderr: '' });
|
|
183
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/bin/servicenow-mcp-server\n', stderr: '' });
|
|
184
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/usr/lib/node_modules\n', stderr: '' });
|
|
185
|
+
vi.mocked(readFile).mockImplementation(async (path) => {
|
|
186
|
+
if (String(path).endsWith('.gitignore')) {
|
|
187
|
+
return 'node_modules\n.claude/settings.json\ndist\n';
|
|
188
|
+
}
|
|
189
|
+
throw Object.assign(new Error('ENOENT'), { code: 'ENOENT' });
|
|
190
|
+
});
|
|
191
|
+
vi.mocked(writeFile).mockResolvedValue(undefined);
|
|
192
|
+
vi.mocked(mkdir).mockResolvedValue(undefined);
|
|
193
|
+
await runSetup();
|
|
194
|
+
const gitignoreCall = vi.mocked(writeFile).mock.calls.find((call) => String(call[0]).endsWith('.gitignore'));
|
|
195
|
+
// Should not write .gitignore since entry already present
|
|
196
|
+
expect(gitignoreCall).toBeUndefined();
|
|
197
|
+
});
|
|
198
|
+
it('uses absolute binary path in settings', async () => {
|
|
199
|
+
mockAnswers = ['myinst', 'admin', 'pass'];
|
|
200
|
+
const mockedExecFile = vi.mocked(execFile);
|
|
201
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/home/user/.nvm/versions/node/v20/bin/servicenow-mcp-server\n', stderr: '' });
|
|
202
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/home/user/.nvm/versions/node/v20/bin/servicenow-mcp-server\n', stderr: '' });
|
|
203
|
+
mockedExecFile.mockResolvedValueOnce({ stdout: '/home/user/.nvm/versions/node/v20/lib/node_modules\n', stderr: '' });
|
|
204
|
+
vi.mocked(readFile).mockRejectedValue(Object.assign(new Error('ENOENT'), { code: 'ENOENT' }));
|
|
205
|
+
vi.mocked(writeFile).mockResolvedValue(undefined);
|
|
206
|
+
vi.mocked(mkdir).mockResolvedValue(undefined);
|
|
207
|
+
await runSetup();
|
|
208
|
+
const settingsCall = vi.mocked(writeFile).mock.calls.find((call) => String(call[0]).endsWith('settings.json'));
|
|
209
|
+
expect(settingsCall).toBeDefined();
|
|
210
|
+
const settingsJson = JSON.parse(settingsCall[1]);
|
|
211
|
+
expect(settingsJson.mcpServers.servicenow.command).toBe('/home/user/.nvm/versions/node/v20/bin/servicenow-mcp-server');
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
//# sourceMappingURL=mcp-setup.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-setup.test.js","sourceRoot":"","sources":["../../src/__tests__/mcp-setup.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -957,9 +957,8 @@ describe('renderSkillDirectory with no reality data', () => {
|
|
|
957
957
|
const files = renderSkillDirectory(input);
|
|
958
958
|
expect(files.size).toBe(14);
|
|
959
959
|
expect(files.has('CURRENT-STATE.md')).toBe(false);
|
|
960
|
-
expect(files.has('RECOMMENDATIONS.md')).toBe(false);
|
|
961
960
|
});
|
|
962
|
-
it('produces
|
|
961
|
+
it('produces 14 files with undefined implementationState', () => {
|
|
963
962
|
const input = { ...minimalInput };
|
|
964
963
|
const files = renderSkillDirectory(input);
|
|
965
964
|
expect(files.size).toBe(14);
|
|
@@ -978,16 +977,6 @@ describe('renderSkillDirectory with no reality data', () => {
|
|
|
978
977
|
const files = renderSkillDirectory(input);
|
|
979
978
|
expect(files.size).toBe(14);
|
|
980
979
|
expect(files.has('CURRENT-STATE.md')).toBe(false);
|
|
981
|
-
expect(files.has('RECOMMENDATIONS.md')).toBe(false);
|
|
982
|
-
});
|
|
983
|
-
it('treats empty progress actuals as no data', () => {
|
|
984
|
-
const input = {
|
|
985
|
-
...minimalInput,
|
|
986
|
-
progress: { ...sampleProgress, actuals: [], summary: { ...sampleProgress.summary, metricsRecorded: 0, onTrack: 0, minorDeviation: 0, majorDeviation: 0 } },
|
|
987
|
-
};
|
|
988
|
-
const files = renderSkillDirectory(input);
|
|
989
|
-
expect(files.size).toBe(14);
|
|
990
|
-
expect(files.has('RECOMMENDATIONS.md')).toBe(false);
|
|
991
980
|
});
|
|
992
981
|
});
|
|
993
982
|
describe('renderSkillDirectory with implementation state only', () => {
|
|
@@ -995,11 +984,10 @@ describe('renderSkillDirectory with implementation state only', () => {
|
|
|
995
984
|
...minimalInput,
|
|
996
985
|
implementationState: sampleImplementationState,
|
|
997
986
|
};
|
|
998
|
-
it('produces
|
|
987
|
+
it('produces 15 files (14 + CURRENT-STATE.md)', () => {
|
|
999
988
|
const files = renderSkillDirectory(stateOnlyInput);
|
|
1000
|
-
expect(files.size).toBe(
|
|
989
|
+
expect(files.size).toBe(15);
|
|
1001
990
|
expect(files.has('CURRENT-STATE.md')).toBe(true);
|
|
1002
|
-
expect(files.has('RECOMMENDATIONS.md')).toBe(true);
|
|
1003
991
|
});
|
|
1004
992
|
it('CURRENT-STATE.md contains agent status table', () => {
|
|
1005
993
|
const files = renderSkillDirectory(stateOnlyInput);
|
|
@@ -1044,7 +1032,6 @@ describe('renderSkillDirectory with implementation state only', () => {
|
|
|
1044
1032
|
const guide = files.get('GETTING-STARTED.md');
|
|
1045
1033
|
expect(guide).toContain('CONTINUING AN IMPLEMENTATION');
|
|
1046
1034
|
expect(guide).toContain('CURRENT-STATE.md');
|
|
1047
|
-
expect(guide).toContain('RECOMMENDATIONS.md');
|
|
1048
1035
|
});
|
|
1049
1036
|
it('return-visit Step 5 has MCP tool examples', () => {
|
|
1050
1037
|
const files = renderSkillDirectory(stateOnlyInput);
|
|
@@ -1062,12 +1049,6 @@ describe('renderSkillDirectory with implementation state only', () => {
|
|
|
1062
1049
|
const guide = files.get('GETTING-STARTED.md');
|
|
1063
1050
|
expect(guide).toContain('hooks/claude-code-sync.json');
|
|
1064
1051
|
});
|
|
1065
|
-
it('RECOMMENDATIONS.md contains deviation review', () => {
|
|
1066
|
-
const files = renderSkillDirectory(stateOnlyInput);
|
|
1067
|
-
const recs = files.get('RECOMMENDATIONS.md');
|
|
1068
|
-
expect(recs).toContain('## Deviations to Review');
|
|
1069
|
-
expect(recs).toContain('Flow Designer');
|
|
1070
|
-
});
|
|
1071
1052
|
it('evaluation-criteria.md is unchanged without progress', () => {
|
|
1072
1053
|
const files = renderSkillDirectory(stateOnlyInput);
|
|
1073
1054
|
const evalCriteria = files.get('references/evaluation-criteria.md');
|
|
@@ -1080,10 +1061,9 @@ describe('renderSkillDirectory with progress only', () => {
|
|
|
1080
1061
|
...minimalInput,
|
|
1081
1062
|
progress: sampleProgress,
|
|
1082
1063
|
};
|
|
1083
|
-
it('produces
|
|
1064
|
+
it('produces 14 files (no CURRENT-STATE.md without implementation state)', () => {
|
|
1084
1065
|
const files = renderSkillDirectory(progressOnlyInput);
|
|
1085
|
-
expect(files.size).toBe(
|
|
1086
|
-
expect(files.has('RECOMMENDATIONS.md')).toBe(true);
|
|
1066
|
+
expect(files.size).toBe(14);
|
|
1087
1067
|
expect(files.has('CURRENT-STATE.md')).toBe(false);
|
|
1088
1068
|
});
|
|
1089
1069
|
it('GETTING-STARTED.md is first-visit format', () => {
|
|
@@ -1099,13 +1079,6 @@ describe('renderSkillDirectory with progress only', () => {
|
|
|
1099
1079
|
expect(evalCriteria).toContain('94%');
|
|
1100
1080
|
expect(evalCriteria).toContain('minor_deviation');
|
|
1101
1081
|
});
|
|
1102
|
-
it('RECOMMENDATIONS.md contains metric deviation', () => {
|
|
1103
|
-
const files = renderSkillDirectory(progressOnlyInput);
|
|
1104
|
-
const recs = files.get('RECOMMENDATIONS.md');
|
|
1105
|
-
expect(recs).toContain('## Metrics Requiring Attention');
|
|
1106
|
-
expect(recs).toContain('Test Pass Rate');
|
|
1107
|
-
expect(recs).toContain('minor_deviation');
|
|
1108
|
-
});
|
|
1109
1082
|
});
|
|
1110
1083
|
describe('renderSkillDirectory with full reality data', () => {
|
|
1111
1084
|
const fullRealityInput = {
|
|
@@ -1113,11 +1086,10 @@ describe('renderSkillDirectory with full reality data', () => {
|
|
|
1113
1086
|
implementationState: twoAgentState,
|
|
1114
1087
|
progress: sampleProgress,
|
|
1115
1088
|
};
|
|
1116
|
-
it('produces
|
|
1089
|
+
it('produces 15 files', () => {
|
|
1117
1090
|
const files = renderSkillDirectory(fullRealityInput);
|
|
1118
|
-
expect(files.size).toBe(
|
|
1091
|
+
expect(files.size).toBe(15);
|
|
1119
1092
|
expect(files.has('CURRENT-STATE.md')).toBe(true);
|
|
1120
|
-
expect(files.has('RECOMMENDATIONS.md')).toBe(true);
|
|
1121
1093
|
});
|
|
1122
1094
|
it('CURRENT-STATE.md includes performance table', () => {
|
|
1123
1095
|
const files = renderSkillDirectory(fullRealityInput);
|
|
@@ -1131,20 +1103,6 @@ describe('renderSkillDirectory with full reality data', () => {
|
|
|
1131
1103
|
const state = files.get('CURRENT-STATE.md');
|
|
1132
1104
|
expect(state).toContain('1 of 2 agents implemented');
|
|
1133
1105
|
});
|
|
1134
|
-
it('RECOMMENDATIONS.md contains both agent and metric recommendations', () => {
|
|
1135
|
-
const files = renderSkillDirectory(fullRealityInput);
|
|
1136
|
-
const recs = files.get('RECOMMENDATIONS.md');
|
|
1137
|
-
expect(recs).toContain('## Next Agents to Implement');
|
|
1138
|
-
expect(recs).toContain('Second Agent');
|
|
1139
|
-
expect(recs).toContain('## Metrics Requiring Attention');
|
|
1140
|
-
expect(recs).toContain('Test Pass Rate');
|
|
1141
|
-
});
|
|
1142
|
-
it('RECOMMENDATIONS.md includes financial impact note with business case', () => {
|
|
1143
|
-
const files = renderSkillDirectory(fullRealityInput);
|
|
1144
|
-
const recs = files.get('RECOMMENDATIONS.md');
|
|
1145
|
-
expect(recs).toContain('## Financial Impact Note');
|
|
1146
|
-
expect(recs).toContain('285%');
|
|
1147
|
-
});
|
|
1148
1106
|
it('GETTING-STARTED.md is return-visit format with metrics summary', () => {
|
|
1149
1107
|
const files = renderSkillDirectory(fullRealityInput);
|
|
1150
1108
|
const guide = files.get('GETTING-STARTED.md');
|
|
@@ -1159,52 +1117,6 @@ describe('renderSkillDirectory with full reality data', () => {
|
|
|
1159
1117
|
expect(evalCriteria).toContain('94%');
|
|
1160
1118
|
});
|
|
1161
1119
|
});
|
|
1162
|
-
describe('RECOMMENDATIONS.md ordering', () => {
|
|
1163
|
-
it('in-progress agents show as "Continue"', () => {
|
|
1164
|
-
const input = {
|
|
1165
|
-
...minimalInput,
|
|
1166
|
-
blueprintData: {
|
|
1167
|
-
...minimalInput.blueprintData,
|
|
1168
|
-
enhancedDigitalTeam: [
|
|
1169
|
-
{ name: 'Agent A', role: 'Tester', agentRole: 'Worker' },
|
|
1170
|
-
{ name: 'Agent B', role: 'Builder', agentRole: 'Worker' },
|
|
1171
|
-
],
|
|
1172
|
-
},
|
|
1173
|
-
implementationState: {
|
|
1174
|
-
...sampleImplementationState,
|
|
1175
|
-
stateData: {
|
|
1176
|
-
...sampleImplementationState.stateData,
|
|
1177
|
-
agents: [
|
|
1178
|
-
{ name: 'Agent A', status: 'in_progress', platform_artifact: '', deviations: [], integrations_connected: [], notes: '' },
|
|
1179
|
-
{ name: 'Agent B', status: 'not_started', platform_artifact: '', deviations: [], integrations_connected: [], notes: '' },
|
|
1180
|
-
],
|
|
1181
|
-
},
|
|
1182
|
-
},
|
|
1183
|
-
};
|
|
1184
|
-
const files = renderSkillDirectory(input);
|
|
1185
|
-
const recs = files.get('RECOMMENDATIONS.md');
|
|
1186
|
-
expect(recs).toContain('Continue Agent A');
|
|
1187
|
-
expect(recs).toContain('Implement Agent B');
|
|
1188
|
-
});
|
|
1189
|
-
it('major deviations before minor in metrics', () => {
|
|
1190
|
-
const input = {
|
|
1191
|
-
...minimalInput,
|
|
1192
|
-
progress: {
|
|
1193
|
-
...sampleProgress,
|
|
1194
|
-
actuals: [
|
|
1195
|
-
{ id: 'm1', metricName: 'Minor Metric', metricType: 'operational', predictedValue: '90%', actualValue: '80%', deviationPercent: -11.1, status: 'minor_deviation', recordedAt: '2026-03-18T10:00:00Z', dataSource: 'manual', recordingCount: 1 },
|
|
1196
|
-
{ id: 'm2', metricName: 'Major Metric', metricType: 'operational', predictedValue: '95%', actualValue: '60%', deviationPercent: -36.8, status: 'major_deviation', recordedAt: '2026-03-18T10:00:00Z', dataSource: 'manual', recordingCount: 1 },
|
|
1197
|
-
],
|
|
1198
|
-
summary: { totalTargets: 2, metricsRecorded: 2, onTrack: 0, minorDeviation: 1, majorDeviation: 1 },
|
|
1199
|
-
},
|
|
1200
|
-
};
|
|
1201
|
-
const files = renderSkillDirectory(input);
|
|
1202
|
-
const recs = files.get('RECOMMENDATIONS.md');
|
|
1203
|
-
const majorIdx = recs.indexOf('Major Metric');
|
|
1204
|
-
const minorIdx = recs.indexOf('Minor Metric');
|
|
1205
|
-
expect(majorIdx).toBeLessThan(minorIdx);
|
|
1206
|
-
});
|
|
1207
|
-
});
|
|
1208
1120
|
describe('graceful degradation', () => {
|
|
1209
1121
|
it('handles null fields in stateData without crashing', () => {
|
|
1210
1122
|
const input = {
|
|
@@ -1222,7 +1134,6 @@ describe('graceful degradation', () => {
|
|
|
1222
1134
|
// Should not throw
|
|
1223
1135
|
const files = renderSkillDirectory(input);
|
|
1224
1136
|
expect(files.has('CURRENT-STATE.md')).toBe(true);
|
|
1225
|
-
expect(files.has('RECOMMENDATIONS.md')).toBe(true);
|
|
1226
1137
|
});
|
|
1227
1138
|
it('all plan files still present with reality data', () => {
|
|
1228
1139
|
const input = {
|
|
@@ -1237,28 +1148,6 @@ describe('graceful degradation', () => {
|
|
|
1237
1148
|
expect(files.has('GETTING-STARTED.md')).toBe(true);
|
|
1238
1149
|
expect(files.has('implementation-state.yaml')).toBe(true);
|
|
1239
1150
|
});
|
|
1240
|
-
it('RECOMMENDATIONS.md shows all-clear when everything is on track', () => {
|
|
1241
|
-
const input = {
|
|
1242
|
-
...minimalInput,
|
|
1243
|
-
implementationState: {
|
|
1244
|
-
...sampleImplementationState,
|
|
1245
|
-
stateData: {
|
|
1246
|
-
...sampleImplementationState.stateData,
|
|
1247
|
-
agents: [{ name: 'Test Agent', status: 'implemented', platform_artifact: 'x', deviations: [], integrations_connected: [], notes: '' }],
|
|
1248
|
-
},
|
|
1249
|
-
},
|
|
1250
|
-
progress: {
|
|
1251
|
-
...sampleProgress,
|
|
1252
|
-
actuals: [
|
|
1253
|
-
{ id: 'm1', metricName: 'Test Pass Rate', metricType: 'operational', predictedValue: '99%', actualValue: '99.5%', status: 'on_track', recordedAt: '2026-03-18T10:00:00Z', dataSource: 'manual', recordingCount: 1 },
|
|
1254
|
-
],
|
|
1255
|
-
summary: { totalTargets: 1, metricsRecorded: 1, onTrack: 1, minorDeviation: 0, majorDeviation: 0 },
|
|
1256
|
-
},
|
|
1257
|
-
};
|
|
1258
|
-
const files = renderSkillDirectory(input);
|
|
1259
|
-
const recs = files.get('RECOMMENDATIONS.md');
|
|
1260
|
-
expect(recs).toContain('All agents implemented and metrics on track');
|
|
1261
|
-
});
|
|
1262
1151
|
});
|
|
1263
1152
|
// =============================================================================
|
|
1264
1153
|
// Multi-file skill delivery tests
|