@productbrain/cli 0.1.0-beta.8505 → 0.1.0-beta.8514
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__/vocabulary-leak.test.d.ts +1 -7
- package/dist/__tests__/vocabulary-leak.test.d.ts.map +1 -1
- package/dist/__tests__/vocabulary-leak.test.js +1 -104
- package/dist/__tests__/vocabulary-leak.test.js.map +1 -1
- package/dist/generated/routeLatencyBudget.generated.d.ts.map +1 -1
- package/dist/generated/routeLatencyBudget.generated.js +0 -1
- package/dist/generated/routeLatencyBudget.generated.js.map +1 -1
- package/dist/index.js +0 -18
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/__tests__/audit.test.d.ts +0 -2
- package/dist/__tests__/audit.test.d.ts.map +0 -1
- package/dist/__tests__/audit.test.js +0 -452
- package/dist/__tests__/audit.test.js.map +0 -1
- package/dist/commands/audit.d.ts +0 -25
- package/dist/commands/audit.d.ts.map +0 -1
- package/dist/commands/audit.js +0 -234
- package/dist/commands/audit.js.map +0 -1
- package/dist/formatters/audit.d.ts +0 -52
- package/dist/formatters/audit.d.ts.map +0 -1
- package/dist/formatters/audit.js +0 -81
- package/dist/formatters/audit.js.map +0 -1
|
@@ -1,452 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* pb audit — unit tests.
|
|
3
|
-
* BET-182 Slice 2: CLI command + auto-fix.
|
|
4
|
-
*
|
|
5
|
-
* Verifies:
|
|
6
|
-
* 1. JSON mode: correct structure on pipe (mock kernelCall with fixture)
|
|
7
|
-
* 2. TTY mode: PASS gates collapsed, FAIL gates expanded
|
|
8
|
-
* 3. Exit codes: 0/1/2/3 for each verdict
|
|
9
|
-
* 4. --gate flag: only specified gate runs
|
|
10
|
-
* 5. --phase flag: passed through to MCP call
|
|
11
|
-
* 6. --fix: calls update with fix values, reruns audit, stops after 1 rerun
|
|
12
|
-
* 7. Batch mode: multiple entryIds processed sequentially
|
|
13
|
-
* 8. Edge case: entry not found returns error
|
|
14
|
-
*/
|
|
15
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
16
|
-
import { runAudit } from '../commands/audit.js';
|
|
17
|
-
import { setOutputMode } from '../lib/runner.js';
|
|
18
|
-
import { clearVocabCache, setCachedVocabCtx } from '../lib/workspaceVocabCache.js';
|
|
19
|
-
const kernelCallMock = vi.fn();
|
|
20
|
-
const kernelCallWithSessionMock = vi.fn();
|
|
21
|
-
vi.mock('../lib/client.js', () => ({
|
|
22
|
-
kernelCall: (...args) => kernelCallMock(...args),
|
|
23
|
-
kernelCallWithSession: (...args) => kernelCallWithSessionMock(...args),
|
|
24
|
-
}));
|
|
25
|
-
vi.mock('../lib/config.js', () => ({
|
|
26
|
-
getConfigOrGuide: vi.fn((_fn) => Promise.resolve({ apiKey: 'pb_sk_test', siteUrl: 'https://test.convex.site' })),
|
|
27
|
-
}));
|
|
28
|
-
// Session mock — controlled per test
|
|
29
|
-
let mockSession = { sessionId: 'sess-test' };
|
|
30
|
-
vi.mock('../lib/session.js', () => ({
|
|
31
|
-
readSession: () => mockSession,
|
|
32
|
-
}));
|
|
33
|
-
// ─── Fixtures ───────────────────────────────────────────────────────────────
|
|
34
|
-
const PASS_FIXTURE = {
|
|
35
|
-
entryId: 'BET-182',
|
|
36
|
-
entryName: 'CLI Audit Gate',
|
|
37
|
-
phase: 'shaping',
|
|
38
|
-
verdict: 'pass',
|
|
39
|
-
gates: [
|
|
40
|
-
{ gate: 'intentional-relations', status: 'pass', blocking: true, detail: '3 intentional relations found' },
|
|
41
|
-
{ gate: 'strategic-anchor', status: 'pass', blocking: true, detail: 'Linked to WS-5' },
|
|
42
|
-
{ gate: 'field-completeness', status: 'pass', blocking: true, detail: 'All 4 required fields populated' },
|
|
43
|
-
],
|
|
44
|
-
summary: { total: 3, passed: 3, failed: 0, warned: 0 },
|
|
45
|
-
elapsed_ms: 42,
|
|
46
|
-
};
|
|
47
|
-
const FAIL_FIXTURE = {
|
|
48
|
-
entryId: 'BET-200',
|
|
49
|
-
entryName: 'Broken Bet',
|
|
50
|
-
phase: 'shaping',
|
|
51
|
-
verdict: 'fail',
|
|
52
|
-
gates: [
|
|
53
|
-
{ gate: 'intentional-relations', status: 'fail', blocking: true, detail: '0 intentional relations', fix: "Set field 'problem' to 'needs definition'", fixType: 'exact' },
|
|
54
|
-
{ gate: 'strategic-anchor', status: 'pass', blocking: true, detail: 'Linked to WS-5' },
|
|
55
|
-
{ gate: 'field-completeness', status: 'fail', blocking: true, detail: 'Missing: appetite, doneWhen', fix: "Set field 'appetite' to '6 weeks'", fixType: 'exact', hint: 'STD-113 requires these fields' },
|
|
56
|
-
],
|
|
57
|
-
summary: { total: 3, passed: 1, failed: 2, warned: 0 },
|
|
58
|
-
elapsed_ms: 55,
|
|
59
|
-
};
|
|
60
|
-
const WARN_FIXTURE = {
|
|
61
|
-
entryId: 'BET-201',
|
|
62
|
-
entryName: 'Warn Bet',
|
|
63
|
-
phase: 'handoff',
|
|
64
|
-
verdict: 'warn',
|
|
65
|
-
gates: [
|
|
66
|
-
{ gate: 'auto-link-noise', status: 'warn', blocking: false, detail: '2 auto-link relations found', hint: 'Consider removing auto-link noise' },
|
|
67
|
-
{ gate: 'strategic-anchor', status: 'pass', blocking: true, detail: 'Linked to WS-5' },
|
|
68
|
-
],
|
|
69
|
-
summary: { total: 2, passed: 1, failed: 0, warned: 1 },
|
|
70
|
-
elapsed_ms: 33,
|
|
71
|
-
};
|
|
72
|
-
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
73
|
-
let stdoutOutput;
|
|
74
|
-
let stderrOutput;
|
|
75
|
-
let stdoutWriteSpy;
|
|
76
|
-
let stderrWriteSpy;
|
|
77
|
-
let exitSpy;
|
|
78
|
-
// WP-744 / 1e-B: auto mode no longer infers JSON from stdout's TTY-ness — only PB_JSON=1 opts
|
|
79
|
-
// in. `json=true` simulates piping to a JSON consumer; `json=false` simulates the default card.
|
|
80
|
-
function withJsonMode(json, fn) {
|
|
81
|
-
return async () => {
|
|
82
|
-
const original = process.env.PB_JSON;
|
|
83
|
-
if (json) {
|
|
84
|
-
process.env.PB_JSON = '1';
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
delete process.env.PB_JSON;
|
|
88
|
-
}
|
|
89
|
-
try {
|
|
90
|
-
await fn();
|
|
91
|
-
}
|
|
92
|
-
finally {
|
|
93
|
-
if (original === undefined) {
|
|
94
|
-
delete process.env.PB_JSON;
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
process.env.PB_JSON = original;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Catch process.exit without actually exiting.
|
|
104
|
-
* Returns the exit code that was called with.
|
|
105
|
-
*/
|
|
106
|
-
function catchExit() {
|
|
107
|
-
const state = { code: undefined };
|
|
108
|
-
exitSpy = vi.spyOn(process, 'exit').mockImplementation(((code) => {
|
|
109
|
-
state.code = code;
|
|
110
|
-
throw new Error(`process.exit(${code})`);
|
|
111
|
-
}));
|
|
112
|
-
return state;
|
|
113
|
-
}
|
|
114
|
-
beforeEach(() => {
|
|
115
|
-
stdoutOutput = '';
|
|
116
|
-
stderrOutput = '';
|
|
117
|
-
stdoutWriteSpy = vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
118
|
-
stdoutOutput += String(chunk);
|
|
119
|
-
return true;
|
|
120
|
-
});
|
|
121
|
-
stderrWriteSpy = vi.spyOn(process.stderr, 'write').mockImplementation((chunk) => {
|
|
122
|
-
stderrOutput += String(chunk);
|
|
123
|
-
return true;
|
|
124
|
-
});
|
|
125
|
-
setOutputMode('auto');
|
|
126
|
-
mockSession = { sessionId: 'sess-test' };
|
|
127
|
-
vi.clearAllMocks();
|
|
128
|
-
// WP-438 S1: prime the workspace vocab cache so runAudit's chain.getVocabulary
|
|
129
|
-
// call short-circuits — keeps these tests' kernelCall sequences intact.
|
|
130
|
-
clearVocabCache();
|
|
131
|
-
setCachedVocabCtx('pb_sk_test', { collectionLabels: { work_package: { singular: 'Bet', plural: 'Bets' } } });
|
|
132
|
-
});
|
|
133
|
-
afterEach(() => {
|
|
134
|
-
stdoutWriteSpy.mockRestore();
|
|
135
|
-
stderrWriteSpy.mockRestore();
|
|
136
|
-
exitSpy?.mockRestore();
|
|
137
|
-
setOutputMode('auto');
|
|
138
|
-
});
|
|
139
|
-
// ─── Tests ──────────────────────────────────────────────────────────────────
|
|
140
|
-
describe('runAudit — JSON mode (non-TTY)', () => {
|
|
141
|
-
it('outputs correct JSON structure on pipe', withJsonMode(true, async () => {
|
|
142
|
-
kernelCallMock.mockResolvedValue(PASS_FIXTURE);
|
|
143
|
-
const exit = catchExit();
|
|
144
|
-
await expect(runAudit({ entryIds: ['BET-182'] })).rejects.toThrow('process.exit');
|
|
145
|
-
const parsed = JSON.parse(stdoutOutput);
|
|
146
|
-
expect(parsed.entryId).toBe('BET-182');
|
|
147
|
-
expect(parsed.entryName).toBe('CLI Audit Gate');
|
|
148
|
-
expect(parsed.verdict).toBe('pass');
|
|
149
|
-
expect(parsed.gates).toHaveLength(3);
|
|
150
|
-
expect(parsed.summary).toEqual({ total: 3, passed: 3, failed: 0, warned: 0 });
|
|
151
|
-
expect(parsed.elapsed_ms).toBe(42);
|
|
152
|
-
expect(exit.code).toBe(0);
|
|
153
|
-
}));
|
|
154
|
-
it('calls chain.auditBet with correct entryId', withJsonMode(true, async () => {
|
|
155
|
-
kernelCallMock.mockResolvedValue(PASS_FIXTURE);
|
|
156
|
-
catchExit();
|
|
157
|
-
await expect(runAudit({ entryIds: ['BET-182'] })).rejects.toThrow('process.exit');
|
|
158
|
-
expect(kernelCallMock).toHaveBeenCalledWith('chain.auditBet', { entryId: 'BET-182' });
|
|
159
|
-
}));
|
|
160
|
-
it('strips Convex internals from JSON output', withJsonMode(true, async () => {
|
|
161
|
-
const fixtureWithInternals = {
|
|
162
|
-
...PASS_FIXTURE,
|
|
163
|
-
_id: 'sys-internal-id',
|
|
164
|
-
_creationTime: 123456,
|
|
165
|
-
};
|
|
166
|
-
kernelCallMock.mockResolvedValue(fixtureWithInternals);
|
|
167
|
-
catchExit();
|
|
168
|
-
await expect(runAudit({ entryIds: ['BET-182'] })).rejects.toThrow('process.exit');
|
|
169
|
-
const parsed = JSON.parse(stdoutOutput);
|
|
170
|
-
expect(parsed).not.toHaveProperty('_id');
|
|
171
|
-
expect(parsed).not.toHaveProperty('_creationTime');
|
|
172
|
-
}));
|
|
173
|
-
});
|
|
174
|
-
describe('runAudit — TTY mode', () => {
|
|
175
|
-
it('collapses PASS gates (shows count), expands FAIL gates', withJsonMode(false, async () => {
|
|
176
|
-
kernelCallMock.mockResolvedValue(FAIL_FIXTURE);
|
|
177
|
-
catchExit();
|
|
178
|
-
await expect(runAudit({ entryIds: ['BET-200'] })).rejects.toThrow('process.exit');
|
|
179
|
-
// FAIL gates should be expanded with detail
|
|
180
|
-
expect(stdoutOutput).toContain('intentional-relations');
|
|
181
|
-
expect(stdoutOutput).toContain('0 intentional relations');
|
|
182
|
-
expect(stdoutOutput).toContain('field-completeness');
|
|
183
|
-
expect(stdoutOutput).toContain('Missing: appetite, doneWhen');
|
|
184
|
-
// PASS gate should be in collapsed summary
|
|
185
|
-
expect(stdoutOutput).toContain('PASS: 1 gate(s)');
|
|
186
|
-
expect(stdoutOutput).toContain('strategic-anchor');
|
|
187
|
-
}));
|
|
188
|
-
it('shows WARN gates expanded with hints', withJsonMode(false, async () => {
|
|
189
|
-
kernelCallMock.mockResolvedValue(WARN_FIXTURE);
|
|
190
|
-
catchExit();
|
|
191
|
-
await expect(runAudit({ entryIds: ['BET-201'] })).rejects.toThrow('process.exit');
|
|
192
|
-
expect(stdoutOutput).toContain('WARN:');
|
|
193
|
-
expect(stdoutOutput).toContain('auto-link-noise');
|
|
194
|
-
expect(stdoutOutput).toContain('2 auto-link relations found');
|
|
195
|
-
expect(stdoutOutput).toContain('Consider removing auto-link noise');
|
|
196
|
-
}));
|
|
197
|
-
it('--verbose expands all gates including PASS', withJsonMode(false, async () => {
|
|
198
|
-
kernelCallMock.mockResolvedValue(PASS_FIXTURE);
|
|
199
|
-
catchExit();
|
|
200
|
-
await expect(runAudit({ entryIds: ['BET-182'], verbose: true })).rejects.toThrow('process.exit');
|
|
201
|
-
// PASS gates should show detail, not just count
|
|
202
|
-
expect(stdoutOutput).toContain('PASS:');
|
|
203
|
-
expect(stdoutOutput).toContain('intentional-relations: 3 intentional relations found');
|
|
204
|
-
expect(stdoutOutput).toContain('strategic-anchor: Linked to WS-5');
|
|
205
|
-
// Should NOT have the collapsed format
|
|
206
|
-
expect(stdoutOutput).not.toContain('gate(s)');
|
|
207
|
-
}));
|
|
208
|
-
});
|
|
209
|
-
describe('runAudit — exit codes', () => {
|
|
210
|
-
it('exit 0 for pass verdict', withJsonMode(true, async () => {
|
|
211
|
-
kernelCallMock.mockResolvedValue(PASS_FIXTURE);
|
|
212
|
-
const exit = catchExit();
|
|
213
|
-
await expect(runAudit({ entryIds: ['BET-182'] })).rejects.toThrow('process.exit');
|
|
214
|
-
expect(exit.code).toBe(0);
|
|
215
|
-
}));
|
|
216
|
-
it('exit 1 for fail verdict', withJsonMode(true, async () => {
|
|
217
|
-
kernelCallMock.mockResolvedValue(FAIL_FIXTURE);
|
|
218
|
-
const exit = catchExit();
|
|
219
|
-
await expect(runAudit({ entryIds: ['BET-200'] })).rejects.toThrow('process.exit');
|
|
220
|
-
expect(exit.code).toBe(1);
|
|
221
|
-
}));
|
|
222
|
-
it('exit 2 for warn verdict', withJsonMode(true, async () => {
|
|
223
|
-
kernelCallMock.mockResolvedValue(WARN_FIXTURE);
|
|
224
|
-
const exit = catchExit();
|
|
225
|
-
await expect(runAudit({ entryIds: ['BET-201'] })).rejects.toThrow('process.exit');
|
|
226
|
-
expect(exit.code).toBe(2);
|
|
227
|
-
}));
|
|
228
|
-
it('exit 3 for error (entry not found)', withJsonMode(true, async () => {
|
|
229
|
-
kernelCallMock.mockRejectedValue(new Error('Entry "BET-999" not found.'));
|
|
230
|
-
const exit = catchExit();
|
|
231
|
-
await expect(runAudit({ entryIds: ['BET-999'] })).rejects.toThrow('process.exit');
|
|
232
|
-
expect(exit.code).toBe(3);
|
|
233
|
-
}));
|
|
234
|
-
});
|
|
235
|
-
describe('runAudit — --gate flag', () => {
|
|
236
|
-
it('filters JSON output to only specified gate(s)', withJsonMode(true, async () => {
|
|
237
|
-
kernelCallMock.mockResolvedValue(FAIL_FIXTURE);
|
|
238
|
-
catchExit();
|
|
239
|
-
await expect(runAudit({ entryIds: ['BET-200'], gate: ['field-completeness'] })).rejects.toThrow('process.exit');
|
|
240
|
-
const parsed = JSON.parse(stdoutOutput);
|
|
241
|
-
// Only the filtered gate should appear
|
|
242
|
-
expect(parsed.gates).toHaveLength(1);
|
|
243
|
-
expect(parsed.gates[0].gate).toBe('field-completeness');
|
|
244
|
-
}));
|
|
245
|
-
it('filters TTY output to only specified gate(s)', withJsonMode(false, async () => {
|
|
246
|
-
kernelCallMock.mockResolvedValue(FAIL_FIXTURE);
|
|
247
|
-
catchExit();
|
|
248
|
-
await expect(runAudit({ entryIds: ['BET-200'], gate: ['field-completeness'] })).rejects.toThrow('process.exit');
|
|
249
|
-
// Should show the filtered gate
|
|
250
|
-
expect(stdoutOutput).toContain('field-completeness');
|
|
251
|
-
// Should NOT show other gates
|
|
252
|
-
expect(stdoutOutput).not.toContain('intentional-relations');
|
|
253
|
-
}));
|
|
254
|
-
it('supports multiple --gate values', withJsonMode(true, async () => {
|
|
255
|
-
kernelCallMock.mockResolvedValue(FAIL_FIXTURE);
|
|
256
|
-
catchExit();
|
|
257
|
-
await expect(runAudit({ entryIds: ['BET-200'], gate: ['intentional-relations', 'field-completeness'] })).rejects.toThrow('process.exit');
|
|
258
|
-
const parsed = JSON.parse(stdoutOutput);
|
|
259
|
-
expect(parsed.gates).toHaveLength(2);
|
|
260
|
-
const gateNames = parsed.gates.map((g) => g.gate);
|
|
261
|
-
expect(gateNames).toContain('intentional-relations');
|
|
262
|
-
expect(gateNames).toContain('field-completeness');
|
|
263
|
-
}));
|
|
264
|
-
});
|
|
265
|
-
describe('runAudit — --phase flag', () => {
|
|
266
|
-
it('passes phase through to MCP call', withJsonMode(true, async () => {
|
|
267
|
-
kernelCallMock.mockResolvedValue(PASS_FIXTURE);
|
|
268
|
-
catchExit();
|
|
269
|
-
await expect(runAudit({ entryIds: ['BET-182'], phase: 'handoff' })).rejects.toThrow('process.exit');
|
|
270
|
-
expect(kernelCallMock).toHaveBeenCalledWith('chain.auditBet', { entryId: 'BET-182', phase: 'handoff' });
|
|
271
|
-
}));
|
|
272
|
-
it('omits phase from MCP call when not specified', withJsonMode(true, async () => {
|
|
273
|
-
kernelCallMock.mockResolvedValue(PASS_FIXTURE);
|
|
274
|
-
catchExit();
|
|
275
|
-
await expect(runAudit({ entryIds: ['BET-182'] })).rejects.toThrow('process.exit');
|
|
276
|
-
expect(kernelCallMock).toHaveBeenCalledWith('chain.auditBet', { entryId: 'BET-182' });
|
|
277
|
-
}));
|
|
278
|
-
});
|
|
279
|
-
describe('runAudit — --fix', () => {
|
|
280
|
-
it('calls updateEntry for exact fixes and reruns audit once', withJsonMode(true, async () => {
|
|
281
|
-
// First call: failing audit
|
|
282
|
-
// Second call (after fix): passing audit
|
|
283
|
-
kernelCallMock
|
|
284
|
-
.mockResolvedValueOnce(FAIL_FIXTURE)
|
|
285
|
-
.mockResolvedValueOnce({ ...PASS_FIXTURE, entryId: 'BET-200', entryName: 'Broken Bet' });
|
|
286
|
-
kernelCallWithSessionMock.mockResolvedValue({ id: 'result-id', warnings: [] });
|
|
287
|
-
const exit = catchExit();
|
|
288
|
-
await expect(runAudit({ entryIds: ['BET-200'], fix: true })).rejects.toThrow('process.exit');
|
|
289
|
-
// Should have called updateEntry for each exact fix
|
|
290
|
-
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.updateEntry', {
|
|
291
|
-
entryId: 'BET-200',
|
|
292
|
-
data: { problem: 'needs definition' },
|
|
293
|
-
changeNote: 'Auto-fix via pb audit: set problem',
|
|
294
|
-
});
|
|
295
|
-
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.updateEntry', {
|
|
296
|
-
entryId: 'BET-200',
|
|
297
|
-
data: { appetite: '6 weeks' },
|
|
298
|
-
changeNote: 'Auto-fix via pb audit: set appetite',
|
|
299
|
-
});
|
|
300
|
-
// Should have rerun the audit (2 kernelCall invocations total)
|
|
301
|
-
expect(kernelCallMock).toHaveBeenCalledTimes(2);
|
|
302
|
-
// Exit code should reflect the rerun result (pass = 0)
|
|
303
|
-
expect(exit.code).toBe(0);
|
|
304
|
-
}));
|
|
305
|
-
it('does not count a coherency-refused update as an applied fix, and does not rerun (WP-465 #36)', withJsonMode(false, async () => {
|
|
306
|
-
kernelCallMock.mockResolvedValue(FAIL_FIXTURE);
|
|
307
|
-
// Both auto-fix updates are refused by the coherency gate (RETURNED, not thrown).
|
|
308
|
-
kernelCallWithSessionMock.mockResolvedValue({
|
|
309
|
-
outcome: 'refused',
|
|
310
|
-
refusal: { reason: 'Not linked to the strategic spine.' },
|
|
311
|
-
});
|
|
312
|
-
const exit = catchExit();
|
|
313
|
-
await expect(runAudit({ entryIds: ['BET-200'], fix: true })).rejects.toThrow('process.exit');
|
|
314
|
-
// The fixes were attempted but refused — so the audit must NOT be rerun (applied === 0).
|
|
315
|
-
expect(kernelCallMock).toHaveBeenCalledTimes(1);
|
|
316
|
-
// The refusal is surfaced, and the original failing verdict stands.
|
|
317
|
-
expect(stderrOutput).toContain('Fix refused');
|
|
318
|
-
expect(stderrOutput).toContain('Not linked to the strategic spine.');
|
|
319
|
-
expect(exit.code).toBe(1); // fail verdict stands — refusal applied nothing
|
|
320
|
-
}));
|
|
321
|
-
// PR B (WP-757): same defect class as the CLI/MCP update receipts — a --fix write can be
|
|
322
|
-
// silently stripped by server-side normalization (unknown field on this entry's collection)
|
|
323
|
-
// with NO refusal and NO throw, yet executeFixActions used to print "Fixed:" and count it
|
|
324
|
-
// as applied regardless, because it never read normalization.rejected at all.
|
|
325
|
-
it('does not count a server-rejected field as an applied fix, and does not rerun', withJsonMode(false, async () => {
|
|
326
|
-
kernelCallMock.mockResolvedValue(FAIL_FIXTURE);
|
|
327
|
-
// Neither refused nor thrown — a normal success envelope, but the field itself was
|
|
328
|
-
// stripped by normalizeEntryData (unrecognized on this collection).
|
|
329
|
-
kernelCallWithSessionMock.mockImplementation((_fn, args) => {
|
|
330
|
-
const fieldKey = Object.keys(args.data)[0];
|
|
331
|
-
return Promise.resolve({
|
|
332
|
-
id: 'result-id',
|
|
333
|
-
warnings: [`Unknown field "${fieldKey}" dropped.`],
|
|
334
|
-
normalization: { remapped: {}, rejected: [fieldKey], accepted: [] },
|
|
335
|
-
});
|
|
336
|
-
});
|
|
337
|
-
const exit = catchExit();
|
|
338
|
-
await expect(runAudit({ entryIds: ['BET-200'], fix: true })).rejects.toThrow('process.exit');
|
|
339
|
-
// Both fixes were attempted but server-rejected — so the audit must NOT be rerun.
|
|
340
|
-
expect(kernelCallMock).toHaveBeenCalledTimes(1);
|
|
341
|
-
// The rejection is surfaced, never printed as "Fixed:".
|
|
342
|
-
expect(stderrOutput).toContain('Fix rejected');
|
|
343
|
-
expect(stderrOutput).not.toContain('Fixed:');
|
|
344
|
-
expect(exit.code).toBe(1); // fail verdict stands — nothing actually applied
|
|
345
|
-
}));
|
|
346
|
-
it('does not fix when no session is active', withJsonMode(true, async () => {
|
|
347
|
-
mockSession = null;
|
|
348
|
-
kernelCallMock.mockResolvedValue(FAIL_FIXTURE);
|
|
349
|
-
catchExit();
|
|
350
|
-
await expect(runAudit({ entryIds: ['BET-200'], fix: true })).rejects.toThrow('process.exit');
|
|
351
|
-
// Should NOT have called updateEntry
|
|
352
|
-
expect(kernelCallWithSessionMock).not.toHaveBeenCalled();
|
|
353
|
-
// Should still show the result
|
|
354
|
-
const parsed = JSON.parse(stdoutOutput);
|
|
355
|
-
expect(parsed.verdict).toBe('fail');
|
|
356
|
-
}));
|
|
357
|
-
it('skips non-exact fixType gates', withJsonMode(true, async () => {
|
|
358
|
-
const manualFixFixture = {
|
|
359
|
-
...FAIL_FIXTURE,
|
|
360
|
-
gates: [
|
|
361
|
-
{ gate: 'intentional-relations', status: 'fail', blocking: true, detail: '0 relations', fix: 'Add relations manually', fixType: 'manual' },
|
|
362
|
-
{ gate: 'strategic-anchor', status: 'pass', blocking: true, detail: 'OK' },
|
|
363
|
-
],
|
|
364
|
-
};
|
|
365
|
-
kernelCallMock.mockResolvedValue(manualFixFixture);
|
|
366
|
-
catchExit();
|
|
367
|
-
await expect(runAudit({ entryIds: ['BET-200'], fix: true })).rejects.toThrow('process.exit');
|
|
368
|
-
// No exact fixes → no updateEntry calls, no rerun
|
|
369
|
-
expect(kernelCallWithSessionMock).not.toHaveBeenCalled();
|
|
370
|
-
expect(kernelCallMock).toHaveBeenCalledTimes(1);
|
|
371
|
-
}));
|
|
372
|
-
it('stops after one rerun even if issues remain', withJsonMode(true, async () => {
|
|
373
|
-
// Both calls return failing audit (fix didn't resolve everything)
|
|
374
|
-
kernelCallMock
|
|
375
|
-
.mockResolvedValueOnce(FAIL_FIXTURE)
|
|
376
|
-
.mockResolvedValueOnce(FAIL_FIXTURE);
|
|
377
|
-
kernelCallWithSessionMock.mockResolvedValue({ id: 'result-id', warnings: [] });
|
|
378
|
-
const exit = catchExit();
|
|
379
|
-
await expect(runAudit({ entryIds: ['BET-200'], fix: true })).rejects.toThrow('process.exit');
|
|
380
|
-
// Should have run audit exactly 2 times (initial + 1 rerun), not 3
|
|
381
|
-
expect(kernelCallMock).toHaveBeenCalledTimes(2);
|
|
382
|
-
expect(exit.code).toBe(1);
|
|
383
|
-
}));
|
|
384
|
-
});
|
|
385
|
-
describe('runAudit — batch mode', () => {
|
|
386
|
-
it('audits multiple bets sequentially', withJsonMode(true, async () => {
|
|
387
|
-
kernelCallMock
|
|
388
|
-
.mockResolvedValueOnce(PASS_FIXTURE)
|
|
389
|
-
.mockResolvedValueOnce(FAIL_FIXTURE);
|
|
390
|
-
const exit = catchExit();
|
|
391
|
-
await expect(runAudit({ entryIds: ['BET-182', 'BET-200'] })).rejects.toThrow('process.exit');
|
|
392
|
-
// Both auditBet calls should have been made
|
|
393
|
-
expect(kernelCallMock).toHaveBeenCalledWith('chain.auditBet', { entryId: 'BET-182' });
|
|
394
|
-
expect(kernelCallMock).toHaveBeenCalledWith('chain.auditBet', { entryId: 'BET-200' });
|
|
395
|
-
// Exit code should be worst verdict (fail = 1)
|
|
396
|
-
expect(exit.code).toBe(1);
|
|
397
|
-
// Should have batch summary as last line of output
|
|
398
|
-
const lines = stdoutOutput.trim().split('\n');
|
|
399
|
-
const lastLine = lines[lines.length - 1];
|
|
400
|
-
const batchSummary = JSON.parse(lastLine);
|
|
401
|
-
expect(batchSummary.batch).toBe(true);
|
|
402
|
-
expect(batchSummary.count).toBe(2);
|
|
403
|
-
expect(batchSummary.passed).toBe(1);
|
|
404
|
-
expect(batchSummary.failed).toBe(1);
|
|
405
|
-
}));
|
|
406
|
-
it('shows separator between entries in TTY mode', withJsonMode(false, async () => {
|
|
407
|
-
kernelCallMock
|
|
408
|
-
.mockResolvedValueOnce(PASS_FIXTURE)
|
|
409
|
-
.mockResolvedValueOnce(WARN_FIXTURE);
|
|
410
|
-
catchExit();
|
|
411
|
-
await expect(runAudit({ entryIds: ['BET-182', 'BET-201'] })).rejects.toThrow('process.exit');
|
|
412
|
-
// Should have separator
|
|
413
|
-
expect(stdoutOutput).toContain('---');
|
|
414
|
-
// Both entries present
|
|
415
|
-
expect(stdoutOutput).toContain('BET-182');
|
|
416
|
-
expect(stdoutOutput).toContain('BET-201');
|
|
417
|
-
}));
|
|
418
|
-
it('continues after error on one entry', withJsonMode(true, async () => {
|
|
419
|
-
kernelCallMock
|
|
420
|
-
.mockRejectedValueOnce(new Error('Entry "BET-999" not found.'))
|
|
421
|
-
.mockResolvedValueOnce(PASS_FIXTURE);
|
|
422
|
-
const exit = catchExit();
|
|
423
|
-
await expect(runAudit({ entryIds: ['BET-999', 'BET-182'] })).rejects.toThrow('process.exit');
|
|
424
|
-
// Error is worst (3 > 0)
|
|
425
|
-
expect(exit.code).toBe(3);
|
|
426
|
-
// stderr should have the error
|
|
427
|
-
expect(stderrOutput).toContain('BET-999');
|
|
428
|
-
// stdout should have the successful result
|
|
429
|
-
expect(stdoutOutput).toContain('BET-182');
|
|
430
|
-
}));
|
|
431
|
-
});
|
|
432
|
-
describe('runAudit — error handling', () => {
|
|
433
|
-
it('outputs JSON error on pipe when entry not found', withJsonMode(true, async () => {
|
|
434
|
-
kernelCallMock.mockRejectedValue(new Error('Entry "BET-999" not found.'));
|
|
435
|
-
const exit = catchExit();
|
|
436
|
-
await expect(runAudit({ entryIds: ['BET-999'] })).rejects.toThrow('process.exit');
|
|
437
|
-
expect(exit.code).toBe(3);
|
|
438
|
-
const errParsed = JSON.parse(stderrOutput);
|
|
439
|
-
expect(errParsed).toHaveProperty('error');
|
|
440
|
-
expect(errParsed.error).toContain('BET-999');
|
|
441
|
-
expect(errParsed.entryId).toBe('BET-999');
|
|
442
|
-
}));
|
|
443
|
-
it('outputs human error in TTY when entry not found', withJsonMode(false, async () => {
|
|
444
|
-
kernelCallMock.mockRejectedValue(new Error('Entry "BET-999" not found.'));
|
|
445
|
-
const exit = catchExit();
|
|
446
|
-
await expect(runAudit({ entryIds: ['BET-999'] })).rejects.toThrow('process.exit');
|
|
447
|
-
expect(exit.code).toBe(3);
|
|
448
|
-
expect(stderrOutput).toContain('Error auditing BET-999');
|
|
449
|
-
expect(stderrOutput).toContain('not found');
|
|
450
|
-
}));
|
|
451
|
-
});
|
|
452
|
-
//# sourceMappingURL=audit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"audit.test.js","sourceRoot":"","sources":["../../src/__tests__/audit.test.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/audit.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* pb audit <BET-ID> [BET-ID...] — automated RULE-384 hygiene checker.
|
|
3
|
-
* BET-182 Slice 2: CLI command + auto-fix.
|
|
4
|
-
*
|
|
5
|
-
* Calls chain.auditBet via MCP, formats result for TTY or JSON,
|
|
6
|
-
* and exits with code based on verdict:
|
|
7
|
-
* 0 = pass, 1 = fail, 2 = warn, 3 = error
|
|
8
|
-
*
|
|
9
|
-
* Flags:
|
|
10
|
-
* --phase shaping|handoff — override phase detection
|
|
11
|
-
* --gate gate-name — run only specified gate(s), repeatable
|
|
12
|
-
* --fix — auto-execute "exact" fixType fixes via pb update
|
|
13
|
-
* --verbose — show all gates including PASS detail
|
|
14
|
-
*
|
|
15
|
-
* Chain: BET-182, RULE-384, STD-65 (structured output), STD-101
|
|
16
|
-
*/
|
|
17
|
-
export interface AuditOptions {
|
|
18
|
-
entryIds: string[];
|
|
19
|
-
phase?: 'shaping' | 'handoff';
|
|
20
|
-
gate?: string[];
|
|
21
|
-
fix?: boolean;
|
|
22
|
-
verbose?: boolean;
|
|
23
|
-
}
|
|
24
|
-
export declare function runAudit(options: AuditOptions): Promise<void>;
|
|
25
|
-
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAcH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAmLD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DnE"}
|