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.
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAM,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;AAEhE,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;QACrG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,aAAa,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,mEAAmE;QACnE,mDAAmD;QACnD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE;gBAC7B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,uBAAuB,EAAE,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE;aACxF,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,GAAuC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,GAAuC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,GAAuC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;YACtF,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,GAAuC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;YAC9E,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,GAAuC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;YACxF,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,GAAuC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACrC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,uBAAuB,EAAE,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE;aACxF,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,GAAuC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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 13 files with undefined implementationState', () => {
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 16 files (14 + CURRENT-STATE.md + RECOMMENDATIONS.md)', () => {
987
+ it('produces 15 files (14 + CURRENT-STATE.md)', () => {
999
988
  const files = renderSkillDirectory(stateOnlyInput);
1000
- expect(files.size).toBe(16);
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 15 files (14 + RECOMMENDATIONS.md, no CURRENT-STATE.md)', () => {
1064
+ it('produces 14 files (no CURRENT-STATE.md without implementation state)', () => {
1084
1065
  const files = renderSkillDirectory(progressOnlyInput);
1085
- expect(files.size).toBe(15);
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 16 files', () => {
1089
+ it('produces 15 files', () => {
1117
1090
  const files = renderSkillDirectory(fullRealityInput);
1118
- expect(files.size).toBe(16);
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