@productbrain/cli 0.1.0-beta.3384 → 0.1.0-beta.3399
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/commands/__tests__/quality.test.d.ts +2 -0
- package/dist/commands/__tests__/quality.test.d.ts.map +1 -0
- package/dist/commands/__tests__/quality.test.js +156 -0
- package/dist/commands/__tests__/quality.test.js.map +1 -0
- package/dist/commands/conflicts.d.ts +30 -1
- package/dist/commands/conflicts.d.ts.map +1 -1
- package/dist/commands/conflicts.js +130 -7
- package/dist/commands/conflicts.js.map +1 -1
- package/dist/commands/conflicts.test.js +111 -9
- package/dist/commands/conflicts.test.js.map +1 -1
- package/dist/commands/quality.d.ts +16 -0
- package/dist/commands/quality.d.ts.map +1 -0
- package/dist/commands/quality.js +29 -0
- package/dist/commands/quality.js.map +1 -0
- package/dist/formatters/conflicts.d.ts +26 -1
- package/dist/formatters/conflicts.d.ts.map +1 -1
- package/dist/formatters/conflicts.js +46 -8
- package/dist/formatters/conflicts.js.map +1 -1
- package/dist/formatters/conflicts.test.js +62 -9
- package/dist/formatters/conflicts.test.js.map +1 -1
- package/dist/formatters/scoreboard.d.ts.map +1 -1
- package/dist/formatters/scoreboard.js +39 -0
- package/dist/formatters/scoreboard.js.map +1 -1
- package/dist/formatters/scoreboard.test.js +118 -0
- package/dist/formatters/scoreboard.test.js.map +1 -1
- package/dist/formatters/spineCheck.d.ts +59 -0
- package/dist/formatters/spineCheck.d.ts.map +1 -0
- package/dist/formatters/spineCheck.js +89 -0
- package/dist/formatters/spineCheck.js.map +1 -0
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -22
- package/dist/index.js.map +1 -1
- package/dist/scoreboard/diagnose.d.ts +23 -7
- package/dist/scoreboard/diagnose.d.ts.map +1 -1
- package/dist/scoreboard/diagnose.js.map +1 -1
- package/dist/scoreboard/diagnose.test.js +6 -0
- package/dist/scoreboard/diagnose.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/quality.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pb quality spine-check — unit tests (A2, WP-581/FEAT-1402).
|
|
3
|
+
*
|
|
4
|
+
* Verifies:
|
|
5
|
+
* 1. Calls quality.spineCheck with includeStory reflecting --story, then reads back via
|
|
6
|
+
* quality.getLatestSpineVerdict (store-then-read-back, never the write's own return value).
|
|
7
|
+
* 2. Renders "no spine entries yet" for an empty spine.
|
|
8
|
+
* 3. Renders "no spine check has been run yet" when the read-back is null.
|
|
9
|
+
* 4. Renders the [stale] prefix when the read-back reports stale.
|
|
10
|
+
*/
|
|
11
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
12
|
+
import { runQualitySpineCheck } from '../quality.js';
|
|
13
|
+
import { setOutputMode } from '../../lib/runner.js';
|
|
14
|
+
const kernelCallMock = vi.fn();
|
|
15
|
+
vi.mock('../../lib/client.js', () => ({
|
|
16
|
+
kernelCall: (...args) => kernelCallMock(...args),
|
|
17
|
+
}));
|
|
18
|
+
vi.mock('../../lib/config.js', () => ({
|
|
19
|
+
getConfigOrGuide: vi.fn(() => Promise.resolve({ apiKey: 'pb_sk_test', siteUrl: 'https://test.convex.site' })),
|
|
20
|
+
}));
|
|
21
|
+
let stdoutOutput;
|
|
22
|
+
let stdoutWriteSpy;
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
stdoutOutput = '';
|
|
25
|
+
stdoutWriteSpy = vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
26
|
+
stdoutOutput += String(chunk);
|
|
27
|
+
return true;
|
|
28
|
+
});
|
|
29
|
+
vi.clearAllMocks();
|
|
30
|
+
});
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
stdoutWriteSpy.mockRestore();
|
|
33
|
+
setOutputMode('auto');
|
|
34
|
+
});
|
|
35
|
+
const PASSING_ROW = {
|
|
36
|
+
verdict: {
|
|
37
|
+
structural: {
|
|
38
|
+
passed: true, missing: [], duplicateSingletons: { purpose: null, vision: null }, unconnectedStrategyIds: [],
|
|
39
|
+
strategiesWithUnknownConnectivity: [], visionConnectedToPurpose: true, visionPurposeConnectivityTruncated: false,
|
|
40
|
+
},
|
|
41
|
+
noSpineEntries: false,
|
|
42
|
+
perStrategy: [{ entryId: 's1', refusal: { entryId: 's1', hasRefusalSignal: true }, rogerMartin: { isStrategicChoice: true, oppositeReasonable: true, reasoning: 'ok', suggestion: null } }],
|
|
43
|
+
story: null,
|
|
44
|
+
strategiesTruncated: false,
|
|
45
|
+
},
|
|
46
|
+
includesStoryPass: false,
|
|
47
|
+
createdAt: 123,
|
|
48
|
+
stale: false,
|
|
49
|
+
staleMemberIds: [],
|
|
50
|
+
};
|
|
51
|
+
describe('runQualitySpineCheck — call shape', () => {
|
|
52
|
+
it('calls quality.spineCheck with includeStory:false by default, then reads back via getLatestSpineVerdict', async () => {
|
|
53
|
+
kernelCallMock.mockResolvedValueOnce(undefined).mockResolvedValueOnce(PASSING_ROW);
|
|
54
|
+
setOutputMode('json');
|
|
55
|
+
await runQualitySpineCheck({});
|
|
56
|
+
expect(kernelCallMock).toHaveBeenNthCalledWith(1, 'quality.spineCheck', { includeStory: false });
|
|
57
|
+
expect(kernelCallMock).toHaveBeenNthCalledWith(2, 'quality.getLatestSpineVerdict', {});
|
|
58
|
+
});
|
|
59
|
+
it('passes includeStory:true when --story is set', async () => {
|
|
60
|
+
kernelCallMock.mockResolvedValueOnce(undefined).mockResolvedValueOnce(PASSING_ROW);
|
|
61
|
+
setOutputMode('json');
|
|
62
|
+
await runQualitySpineCheck({ story: true });
|
|
63
|
+
expect(kernelCallMock).toHaveBeenNthCalledWith(1, 'quality.spineCheck', { includeStory: true });
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('runQualitySpineCheck — rendering', () => {
|
|
67
|
+
it('renders "no spine entries yet" for an empty spine', async () => {
|
|
68
|
+
kernelCallMock.mockResolvedValueOnce(undefined).mockResolvedValueOnce({
|
|
69
|
+
...PASSING_ROW,
|
|
70
|
+
verdict: { ...PASSING_ROW.verdict, noSpineEntries: true },
|
|
71
|
+
});
|
|
72
|
+
setOutputMode('pretty');
|
|
73
|
+
await runQualitySpineCheck({});
|
|
74
|
+
expect(stdoutOutput).toMatch(/no spine entries yet/i);
|
|
75
|
+
});
|
|
76
|
+
it('renders "no spine check has been run yet" when the read-back is null', async () => {
|
|
77
|
+
kernelCallMock.mockResolvedValueOnce(undefined).mockResolvedValueOnce(null);
|
|
78
|
+
setOutputMode('pretty');
|
|
79
|
+
await runQualitySpineCheck({});
|
|
80
|
+
expect(stdoutOutput).toMatch(/no spine check has been run yet/i);
|
|
81
|
+
});
|
|
82
|
+
it('renders the [stale] prefix when the read-back reports stale', async () => {
|
|
83
|
+
kernelCallMock.mockResolvedValueOnce(undefined).mockResolvedValueOnce({
|
|
84
|
+
...PASSING_ROW, stale: true, staleMemberIds: ['e1'],
|
|
85
|
+
});
|
|
86
|
+
setOutputMode('pretty');
|
|
87
|
+
await runQualitySpineCheck({});
|
|
88
|
+
expect(stdoutOutput).toMatch(/\[stale/);
|
|
89
|
+
});
|
|
90
|
+
it('names the failed story criterion on a FAIL', async () => {
|
|
91
|
+
kernelCallMock.mockResolvedValueOnce(undefined).mockResolvedValueOnce({
|
|
92
|
+
...PASSING_ROW,
|
|
93
|
+
includesStoryPass: true,
|
|
94
|
+
verdict: {
|
|
95
|
+
...PASSING_ROW.verdict,
|
|
96
|
+
story: {
|
|
97
|
+
passed: false,
|
|
98
|
+
failedCriterion: 'strategy_serves_vision',
|
|
99
|
+
criteria: [{ id: 'strategy_serves_vision', passed: false, reasoning: 'unrelated' }],
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
setOutputMode('pretty');
|
|
104
|
+
await runQualitySpineCheck({ story: true });
|
|
105
|
+
expect(stdoutOutput).toMatch(/strategy_serves_vision/);
|
|
106
|
+
expect(stdoutOutput).toMatch(/unvalidated/i);
|
|
107
|
+
});
|
|
108
|
+
it('distinguishes a FAILED story pass (requested, LLM returned nothing usable) from one never requested (PR #530 P2)', async () => {
|
|
109
|
+
kernelCallMock.mockResolvedValueOnce(undefined).mockResolvedValueOnce({
|
|
110
|
+
...PASSING_ROW,
|
|
111
|
+
includesStoryPass: true, // requested this row
|
|
112
|
+
verdict: { ...PASSING_ROW.verdict, story: null }, // but the LLM pass produced nothing usable
|
|
113
|
+
});
|
|
114
|
+
setOutputMode('pretty');
|
|
115
|
+
await runQualitySpineCheck({ story: true });
|
|
116
|
+
expect(stdoutOutput).toMatch(/requested, but the LLM pass did not return a usable result/i);
|
|
117
|
+
expect(stdoutOutput).not.toMatch(/not run this pass/i);
|
|
118
|
+
});
|
|
119
|
+
it('renders truncation and unknown-connectivity disclosures rather than silently omitting them (PR #530 P2)', async () => {
|
|
120
|
+
kernelCallMock.mockResolvedValueOnce(undefined).mockResolvedValueOnce({
|
|
121
|
+
...PASSING_ROW,
|
|
122
|
+
verdict: {
|
|
123
|
+
...PASSING_ROW.verdict,
|
|
124
|
+
structural: {
|
|
125
|
+
...PASSING_ROW.verdict.structural,
|
|
126
|
+
strategiesWithUnknownConnectivity: ['s9'],
|
|
127
|
+
visionConnectedToPurpose: false,
|
|
128
|
+
visionPurposeConnectivityTruncated: true,
|
|
129
|
+
},
|
|
130
|
+
strategiesTruncated: true,
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
setOutputMode('pretty');
|
|
134
|
+
await runQualitySpineCheck({});
|
|
135
|
+
expect(stdoutOutput).toMatch(/connectivity unknown/i);
|
|
136
|
+
expect(stdoutOutput).toMatch(/no vision informs any purpose/i);
|
|
137
|
+
expect(stdoutOutput).toMatch(/vision.*purpose connectivity unknown/i);
|
|
138
|
+
expect(stdoutOutput).toMatch(/strategy set truncated/i);
|
|
139
|
+
});
|
|
140
|
+
it('renders a FAILED Roger Martin probe explicitly — never silently omitted as if not attempted (PR #530 round 2)', async () => {
|
|
141
|
+
kernelCallMock.mockResolvedValueOnce(undefined).mockResolvedValueOnce({
|
|
142
|
+
...PASSING_ROW,
|
|
143
|
+
verdict: {
|
|
144
|
+
...PASSING_ROW.verdict,
|
|
145
|
+
// runSpineCheck ALWAYS attempts a probe per strategy — null here is a
|
|
146
|
+
// failed attempt (timeout/budget-reject/malformed response), never "skipped".
|
|
147
|
+
perStrategy: [{ entryId: 's1', refusal: { entryId: 's1', hasRefusalSignal: false }, rogerMartin: null }],
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
setOutputMode('pretty');
|
|
151
|
+
await runQualitySpineCheck({});
|
|
152
|
+
expect(stdoutOutput).toMatch(/failed to evaluate/i);
|
|
153
|
+
expect(stdoutOutput).not.toMatch(/not attempted|not requested/i);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=quality.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/quality.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,39 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
/** Review fix (PR #528 round 3, P2): detects a pre-C2 backend's exact-match args validator
|
|
3
|
+
* rejecting the additive `mode` field — never over-matches to a genuinely different failure
|
|
4
|
+
* (auth/network/other-field errors retry with the SAME payload and correctly still throw). */
|
|
5
|
+
export declare function isUnexpectedArgumentRejection(err: unknown): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* C2 (WP-468/FEAT-1407, DEC-1491): `pb conflicts list` now defaults to the ACTIONABLE view
|
|
8
|
+
* (open, unverdicted, unsnoozed) — the shared actionable-predicate helper
|
|
9
|
+
* (convex/agentKnowledge/conflictQueue.ts's isActionableConflictIssue). `--all` requests the
|
|
10
|
+
* full open debt pile server-side (verdicted + snoozed rows included, with per-row guidance
|
|
11
|
+
* text). `--status open` is the PRE-C2 flag, kept as a back-compat ALIAS for `--all` — review
|
|
12
|
+
* finding (PR #528 P2): the option no longer carries a Commander default, so `options.status`
|
|
13
|
+
* is `undefined` when the flag is omitted and `'open'` only when a caller EXPLICITLY passes it
|
|
14
|
+
* (an omitted flag and an explicit `--status open` must not collapse to the same value, or the
|
|
15
|
+
* alias can never be told apart from silence, ST22).
|
|
16
|
+
*/
|
|
2
17
|
export declare function runConflictsList(options: {
|
|
3
|
-
status
|
|
18
|
+
status?: string;
|
|
19
|
+
all?: boolean;
|
|
4
20
|
}): Promise<void>;
|
|
5
21
|
export declare function runConflictsResolve(issueId: string, options: {
|
|
6
22
|
verdict: string;
|
|
7
23
|
}): Promise<void>;
|
|
8
24
|
export declare function runConflictsSummary(options: Record<string, never>): Promise<void>;
|
|
25
|
+
/** `pb conflicts snooze <id> --until <days> --reason "<why>"` — bounded, logged debt (Q6,
|
|
26
|
+
* DEC-1491). Never an ack: it does not touch humanVerdict/status. */
|
|
27
|
+
export declare function runConflictsSnooze(issueId: string, options: {
|
|
28
|
+
until: string;
|
|
29
|
+
reason: string;
|
|
30
|
+
}): Promise<void>;
|
|
31
|
+
/** `pb conflicts reverdict <id> --verdict real|noise --reason "<why>"` — a logged amendment
|
|
32
|
+
* to an already-verdicted row (point 3). The double-verdict guard on `resolve` still blocks
|
|
33
|
+
* a SILENT re-verdict; this is the explicit, reasoned exception. */
|
|
34
|
+
export declare function runConflictsReverdict(issueId: string, options: {
|
|
35
|
+
verdict: string;
|
|
36
|
+
reason: string;
|
|
37
|
+
}): Promise<void>;
|
|
9
38
|
export declare function createConflictsCommand(): Command;
|
|
10
39
|
//# sourceMappingURL=conflicts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../src/commands/conflicts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../src/commands/conflicts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuCpC;;+FAE+F;AAC/F,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAInE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CjG;AAOD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BtG;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvF;AAID;sEACsE;AACtE,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzC,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED;;qEAEqE;AACrE,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAiChD"}
|
|
@@ -4,7 +4,7 @@ import { kernelCall, kernelCallWithSession } from '../lib/client.js';
|
|
|
4
4
|
import { CLIError, ErrorCode } from '../lib/errors.js';
|
|
5
5
|
import { runCliCommand } from '../lib/runner.js';
|
|
6
6
|
import { readSession } from '../lib/session.js';
|
|
7
|
-
import { formatConflictsList, formatConflictResolve, formatConflictsSummary, } from '../formatters/conflicts.js';
|
|
7
|
+
import { formatConflictsList, formatConflictResolve, formatConflictsSummary, formatConflictSnooze, formatConflictReverdict, } from '../formatters/conflicts.js';
|
|
8
8
|
/**
|
|
9
9
|
* `pb conflicts` — agent/CLI reachability for the human/agent conflict-verdict loop
|
|
10
10
|
* (TEN-2744, WP-499 Slice A). Structurally mirrors packages/cli/src/commands/feedback.ts:
|
|
@@ -24,8 +24,27 @@ function requireConflictsSession() {
|
|
|
24
24
|
return session;
|
|
25
25
|
}
|
|
26
26
|
const SUPPORTED_LIST_STATUS = 'open';
|
|
27
|
+
/** Review fix (PR #528 round 3, P2): detects a pre-C2 backend's exact-match args validator
|
|
28
|
+
* rejecting the additive `mode` field — never over-matches to a genuinely different failure
|
|
29
|
+
* (auth/network/other-field errors retry with the SAME payload and correctly still throw). */
|
|
30
|
+
export function isUnexpectedArgumentRejection(err) {
|
|
31
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
32
|
+
return /\bmode\b/i.test(message)
|
|
33
|
+
&& /(extra field|unexpected field|not in the validator|does not match the validator|ArgumentValidationError)/i.test(message);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* C2 (WP-468/FEAT-1407, DEC-1491): `pb conflicts list` now defaults to the ACTIONABLE view
|
|
37
|
+
* (open, unverdicted, unsnoozed) — the shared actionable-predicate helper
|
|
38
|
+
* (convex/agentKnowledge/conflictQueue.ts's isActionableConflictIssue). `--all` requests the
|
|
39
|
+
* full open debt pile server-side (verdicted + snoozed rows included, with per-row guidance
|
|
40
|
+
* text). `--status open` is the PRE-C2 flag, kept as a back-compat ALIAS for `--all` — review
|
|
41
|
+
* finding (PR #528 P2): the option no longer carries a Commander default, so `options.status`
|
|
42
|
+
* is `undefined` when the flag is omitted and `'open'` only when a caller EXPLICITLY passes it
|
|
43
|
+
* (an omitted flag and an explicit `--status open` must not collapse to the same value, or the
|
|
44
|
+
* alias can never be told apart from silence, ST22).
|
|
45
|
+
*/
|
|
27
46
|
export async function runConflictsList(options) {
|
|
28
|
-
if (options.status !== SUPPORTED_LIST_STATUS) {
|
|
47
|
+
if (options.status !== undefined && options.status !== SUPPORTED_LIST_STATUS) {
|
|
29
48
|
throw new CLIError(`Only --status open is supported today (got "${options.status}").`, {
|
|
30
49
|
code: ErrorCode.VALIDATION_FAILED,
|
|
31
50
|
category: 'validation',
|
|
@@ -38,9 +57,36 @@ export async function runConflictsList(options) {
|
|
|
38
57
|
const config = await getConfigOrGuide(() => runConflictsList(options));
|
|
39
58
|
if (!config)
|
|
40
59
|
return;
|
|
60
|
+
// --all OR an explicitly-passed --status open both mean "the full debt pile" (legacy alias).
|
|
61
|
+
const mode = options.all || options.status === SUPPORTED_LIST_STATUS ? 'all' : 'actionable';
|
|
62
|
+
// Review fix (PR #528 round 2/3, P2): a pre-C2 deployment's conflicts.list validator does not
|
|
63
|
+
// declare `mode` — Convex's exact-match args validator rejects any UNEXPECTED key, so sending
|
|
64
|
+
// `{mode}` unconditionally breaks version skew (a freshly-published CLI talking to a
|
|
65
|
+
// not-yet-redeployed backend; deploy-convex-dev is not a dependency of the CLI-beta publish
|
|
66
|
+
// job, so this window is real, not merely theoretical). The default 'actionable' case omits
|
|
67
|
+
// `mode` entirely — an old backend then runs its unchanged legacy handler instead of throwing.
|
|
68
|
+
// `--all` still sends `mode:'all'` up front (a post-C2 backend needs it to distinguish the
|
|
69
|
+
// debt pile from the default), but round 3's finding was real: that request alone still
|
|
70
|
+
// crashes against a pre-C2 backend with nothing to fall back to. Retry with the bare legacy
|
|
71
|
+
// payload on that specific rejection — an old backend's unconditional behavior already IS the
|
|
72
|
+
// full open-row view `--all` asks for, so the retry recovers the exact intended result instead
|
|
73
|
+
// of a hard failure.
|
|
74
|
+
const now = Math.floor(Date.now() / 60_000) * 60_000; // PR #528 R3 P2: cache-key freshness — see conflictQueue.ts's doc comment
|
|
75
|
+
const payload = mode === 'all' ? { mode, now } : { now };
|
|
41
76
|
await runCliCommand({
|
|
42
|
-
fn: () =>
|
|
43
|
-
|
|
77
|
+
fn: async () => {
|
|
78
|
+
try {
|
|
79
|
+
return (await kernelCall('conflicts.list', payload));
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
if (mode === 'all' && isUnexpectedArgumentRejection(err)) {
|
|
83
|
+
// Legacy backend: retry with the bare pre-C2 payload it actually understands.
|
|
84
|
+
return (await kernelCall('conflicts.list', {}));
|
|
85
|
+
}
|
|
86
|
+
throw err;
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
formatPretty: (value) => formatConflictsList(value, { mode }),
|
|
44
90
|
});
|
|
45
91
|
}
|
|
46
92
|
const VERDICT_ALIASES = {
|
|
@@ -85,16 +131,93 @@ export async function runConflictsSummary(options) {
|
|
|
85
131
|
formatPretty: (value) => formatConflictsSummary(value),
|
|
86
132
|
});
|
|
87
133
|
}
|
|
134
|
+
const MAX_SNOOZE_DAYS = 14;
|
|
135
|
+
/** `pb conflicts snooze <id> --until <days> --reason "<why>"` — bounded, logged debt (Q6,
|
|
136
|
+
* DEC-1491). Never an ack: it does not touch humanVerdict/status. */
|
|
137
|
+
export async function runConflictsSnooze(issueId, options) {
|
|
138
|
+
const untilDays = Number(options.until);
|
|
139
|
+
if (!Number.isFinite(untilDays) || untilDays < 1 || untilDays > MAX_SNOOZE_DAYS) {
|
|
140
|
+
throw new CLIError(`--until must be a number of days between 1 and ${MAX_SNOOZE_DAYS} (got "${options.until}").`, {
|
|
141
|
+
code: ErrorCode.VALIDATION_FAILED,
|
|
142
|
+
category: 'validation',
|
|
143
|
+
guidance: `Snoozes are bounded to ${MAX_SNOOZE_DAYS} days — logged debt, never an ack.`,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
if (!options.reason?.trim()) {
|
|
147
|
+
throw new CLIError('--reason is required — a snooze is logged debt, not a silent dismissal.', {
|
|
148
|
+
code: ErrorCode.VALIDATION_FAILED,
|
|
149
|
+
category: 'validation',
|
|
150
|
+
guidance: 'Pass --reason "<why you are deferring this>".',
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
const config = await getConfigOrGuide(() => runConflictsSnooze(issueId, options));
|
|
154
|
+
if (!config)
|
|
155
|
+
return;
|
|
156
|
+
requireConflictsSession();
|
|
157
|
+
await runCliCommand({
|
|
158
|
+
fn: () => kernelCallWithSession('conflicts.snooze', {
|
|
159
|
+
issueId,
|
|
160
|
+
untilDays,
|
|
161
|
+
reason: options.reason,
|
|
162
|
+
}),
|
|
163
|
+
formatPretty: (value) => formatConflictSnooze(value),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/** `pb conflicts reverdict <id> --verdict real|noise --reason "<why>"` — a logged amendment
|
|
167
|
+
* to an already-verdicted row (point 3). The double-verdict guard on `resolve` still blocks
|
|
168
|
+
* a SILENT re-verdict; this is the explicit, reasoned exception. */
|
|
169
|
+
export async function runConflictsReverdict(issueId, options) {
|
|
170
|
+
const verdict = VERDICT_ALIASES[options.verdict];
|
|
171
|
+
if (!verdict) {
|
|
172
|
+
throw new CLIError(`--verdict must be "real" or "noise" (got "${options.verdict}").`, {
|
|
173
|
+
code: ErrorCode.VALIDATION_FAILED,
|
|
174
|
+
category: 'validation',
|
|
175
|
+
guidance: '"noise" is the CLI-level alias for the stored false_alarm verdict.',
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
if (!options.reason?.trim()) {
|
|
179
|
+
throw new CLIError('--reason is required — a reverdict is a logged amendment, not a silent overwrite.', {
|
|
180
|
+
code: ErrorCode.VALIDATION_FAILED,
|
|
181
|
+
category: 'validation',
|
|
182
|
+
guidance: 'Pass --reason "<why you are amending the prior verdict>".',
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
const config = await getConfigOrGuide(() => runConflictsReverdict(issueId, options));
|
|
186
|
+
if (!config)
|
|
187
|
+
return;
|
|
188
|
+
requireConflictsSession();
|
|
189
|
+
await runCliCommand({
|
|
190
|
+
fn: () => kernelCallWithSession('conflicts.reverdict', {
|
|
191
|
+
issueId,
|
|
192
|
+
verdict,
|
|
193
|
+
reason: options.reason,
|
|
194
|
+
}),
|
|
195
|
+
formatPretty: (value) => formatConflictReverdict(value, verdict),
|
|
196
|
+
});
|
|
197
|
+
}
|
|
88
198
|
export function createConflictsCommand() {
|
|
89
199
|
const command = new Command('conflicts').description('Review and verdict contradiction-detection advisories (TEN-2744)');
|
|
90
200
|
command.command('list')
|
|
91
|
-
.description('List
|
|
92
|
-
|
|
201
|
+
.description('List conflict advisories for this workspace (default: actionable — open, unverdicted, unsnoozed)')
|
|
202
|
+
// No default value: an OMITTED --status must read as undefined, distinct from an
|
|
203
|
+
// EXPLICITLY passed "--status open" (the legacy alias) — see runConflictsList's doc comment.
|
|
204
|
+
.option('--status <status>', 'Legacy flag: "open" shows every open row (verdicted + snoozed included), same as --all')
|
|
205
|
+
.option('--all', 'Show the full open debt pile: verdicted + snoozed rows, with guidance text — --status open is a back-compat alias for this')
|
|
93
206
|
.action(runConflictsList);
|
|
94
207
|
command.command('resolve <issue-id>')
|
|
95
|
-
.description('Record a human/agent verdict on a conflict advisory')
|
|
208
|
+
.description('Record a human/agent verdict on a conflict advisory (real keeps the row open+verdicted; noise resolves it)')
|
|
96
209
|
.requiredOption('--verdict <verdict>', 'real or noise (noise maps to the stored false_alarm verdict)')
|
|
97
210
|
.action(runConflictsResolve);
|
|
211
|
+
command.command('reverdict <issue-id>')
|
|
212
|
+
.description('Amend an already-verdicted conflict — a logged, reasoned exception to the double-verdict guard')
|
|
213
|
+
.requiredOption('--verdict <verdict>', 'real or noise (noise maps to the stored false_alarm verdict)')
|
|
214
|
+
.requiredOption('--reason <reason>', 'Why you are amending the prior verdict')
|
|
215
|
+
.action(runConflictsReverdict);
|
|
216
|
+
command.command('snooze <issue-id>')
|
|
217
|
+
.description('Bounded, logged debt (never an ack) — defer an unverdicted or verdicted-real conflict')
|
|
218
|
+
.requiredOption('--until <days>', `Days to snooze for (1-${MAX_SNOOZE_DAYS})`)
|
|
219
|
+
.requiredOption('--reason <reason>', 'Why you are deferring this')
|
|
220
|
+
.action(runConflictsSnooze);
|
|
98
221
|
command.command('summary')
|
|
99
222
|
.description('Read reviewed/real/falseAlarm counts and the human-verdict Wilson bar (humanBar)')
|
|
100
223
|
.action(runConflictsSummary);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../src/commands/conflicts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../src/commands/conflicts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,GAIxB,MAAM,4BAA4B,CAAC;AAEpC;;;;;;GAMG;AAEH,SAAS,uBAAuB;IAC9B,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE;YACvC,IAAI,EAAE,SAAS,CAAC,gBAAgB;YAChC,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,6DAA6D;SACxE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAErC;;+FAE+F;AAC/F,MAAM,UAAU,6BAA6B,CAAC,GAAY;IACxD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;WAC3B,2GAA2G,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjI,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAA2C;IAChF,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,EAAE,CAAC;QAC7E,MAAM,IAAI,QAAQ,CAAC,+CAA+C,OAAO,CAAC,MAAM,KAAK,EAAE;YACrF,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,iEAAiE;SAC5E,CAAC,CAAC;IACL,CAAC;IACD,oFAAoF;IACpF,mFAAmF;IACnF,0CAA0C;IAC1C,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACvE,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,6FAA6F;IAC7F,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;IAC5F,8FAA8F;IAC9F,8FAA8F;IAC9F,qFAAqF;IACrF,4FAA4F;IAC5F,4FAA4F;IAC5F,+FAA+F;IAC/F,2FAA2F;IAC3F,wFAAwF;IACxF,4FAA4F;IAC5F,8FAA8F;IAC9F,+FAA+F;IAC/F,qBAAqB;IACrB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,0EAA0E;IAChI,MAAM,OAAO,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;IACzD,MAAM,aAAa,CAAqB;QACtC,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,IAAI,CAAC;gBACH,OAAO,CAAC,MAAM,UAAU,CAA6C,gBAAgB,EAAE,OAAO,CAAC,CAAuB,CAAC;YACzH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,IAAI,KAAK,KAAK,IAAI,6BAA6B,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzD,8EAA8E;oBAC9E,OAAO,CAAC,MAAM,UAAU,CAA6C,gBAAgB,EAAE,EAAE,CAAC,CAAuB,CAAC;gBACpH,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QACD,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC;KAC9D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,eAAe,GAAoC;IACvD,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,aAAa;CACrB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAe,EAAE,OAA4B;IACrF,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,6CAA6C,OAAO,CAAC,OAAO,KAAK,EAAE;YACpF,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,oEAAoE;SAC/E,CAAC,CAAC;IACL,CAAC;IACD,sEAAsE;IACtE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACnF,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,uFAAuF;IACvF,oFAAoF;IACpF,uFAAuF;IACvF,qFAAqF;IACrF,mFAAmF;IACnF,gCAAgC;IAChC,uBAAuB,EAAE,CAAC;IAC1B,MAAM,aAAa,CAAC;QAClB,EAAE,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAgD,mBAAmB,EAAE;YAClG,OAAO;YACP,OAAO;SACR,CAAC;QACF,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC;KAC/D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAA8B;IACtE,sEAAsE;IACtE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1E,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,aAAa,CAAmB;QACpC,EAAE,EAAE,GAAG,EAAE,CAAC,UAAU,CAAgD,mBAAmB,EAAE,EAAE,CAA8B;QACzH,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC;KACvD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B;sEACsE;AACtE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAe,EACf,OAA0C;IAE1C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,eAAe,EAAE,CAAC;QAChF,MAAM,IAAI,QAAQ,CAAC,kDAAkD,eAAe,UAAU,OAAO,CAAC,KAAK,KAAK,EAAE;YAChH,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,0BAA0B,eAAe,oCAAoC;SACxF,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,QAAQ,CAAC,yEAAyE,EAAE;YAC5F,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,+CAA+C;SAC1D,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAClF,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,uBAAuB,EAAE,CAAC;IAC1B,MAAM,aAAa,CAAC;QAClB,EAAE,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAA+C,kBAAkB,EAAE;YAChG,OAAO;YACP,SAAS;YACT,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;QACF,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC;KACrD,CAAC,CAAC;AACL,CAAC;AAED;;qEAEqE;AACrE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAe,EACf,OAA4C;IAE5C,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,6CAA6C,OAAO,CAAC,OAAO,KAAK,EAAE;YACpF,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,oEAAoE;SAC/E,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,QAAQ,CAAC,mFAAmF,EAAE;YACtG,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,2DAA2D;SACtE,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACrF,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,uBAAuB,EAAE,CAAC;IAC1B,MAAM,aAAa,CAAC;QAClB,EAAE,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAkD,qBAAqB,EAAE;YACtG,OAAO;YACP,OAAO;YACP,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;QACF,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC;KACjE,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,kEAAkE,CAAC,CAAC;IAEzH,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;SACpB,WAAW,CAAC,kGAAkG,CAAC;QAChH,iFAAiF;QACjF,6FAA6F;SAC5F,MAAM,CAAC,mBAAmB,EAAE,wFAAwF,CAAC;SACrH,MAAM,CAAC,OAAO,EAAE,4HAA4H,CAAC;SAC7I,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE5B,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC;SAClC,WAAW,CAAC,4GAA4G,CAAC;SACzH,cAAc,CAAC,qBAAqB,EAAE,8DAA8D,CAAC;SACrG,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC;SACpC,WAAW,CAAC,gGAAgG,CAAC;SAC7G,cAAc,CAAC,qBAAqB,EAAE,8DAA8D,CAAC;SACrG,cAAc,CAAC,mBAAmB,EAAE,wCAAwC,CAAC;SAC7E,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAEjC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC;SACjC,WAAW,CAAC,uFAAuF,CAAC;SACpG,cAAc,CAAC,gBAAgB,EAAE,yBAAyB,eAAe,GAAG,CAAC;SAC7E,cAAc,CAAC,mBAAmB,EAAE,4BAA4B,CAAC;SACjE,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAE9B,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;SACvB,WAAW,CAAC,kFAAkF,CAAC;SAC/F,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -10,7 +10,7 @@ vi.mock('../lib/config.js', () => ({ getConfigOrGuide }));
|
|
|
10
10
|
vi.mock('../lib/client.js', () => ({ kernelCall, kernelCallWithSession }));
|
|
11
11
|
vi.mock('../lib/runner.js', () => ({ runCliCommand }));
|
|
12
12
|
vi.mock('../lib/session.js', () => ({ readSession }));
|
|
13
|
-
import { createConflictsCommand, runConflictsList, runConflictsResolve, runConflictsSummary } from './conflicts.js';
|
|
13
|
+
import { createConflictsCommand, runConflictsList, runConflictsResolve, runConflictsSummary, runConflictsSnooze, runConflictsReverdict, } from './conflicts.js';
|
|
14
14
|
describe('pb conflicts command surface (WP-499 Slice A, TEN-2744)', () => {
|
|
15
15
|
beforeEach(() => {
|
|
16
16
|
vi.clearAllMocks();
|
|
@@ -22,7 +22,7 @@ describe('pb conflicts command surface (WP-499 Slice A, TEN-2744)', () => {
|
|
|
22
22
|
it('routes list/resolve/summary through the guided config flow (Codex P2) — an unconfigured caller gets the guided setup, not a raw AUTH_MISSING', async () => {
|
|
23
23
|
readSession.mockReturnValue({ sessionId: 'session-1' });
|
|
24
24
|
getConfigOrGuide.mockResolvedValueOnce(null); // list: first-run, no config yet
|
|
25
|
-
await runConflictsList({
|
|
25
|
+
await runConflictsList({});
|
|
26
26
|
expect(kernelCall).not.toHaveBeenCalled();
|
|
27
27
|
getConfigOrGuide.mockResolvedValueOnce(null); // resolve: first-run, no config yet
|
|
28
28
|
await runConflictsResolve('issue-1', { verdict: 'real' });
|
|
@@ -35,19 +35,55 @@ describe('pb conflicts command surface (WP-499 Slice A, TEN-2744)', () => {
|
|
|
35
35
|
getConfigOrGuide
|
|
36
36
|
.mockImplementationOnce(async (retry) => { await retry(); return null; })
|
|
37
37
|
.mockResolvedValueOnce({ apiKey: 'pb_sk_test', siteUrl: 'https://example.test' });
|
|
38
|
-
await runConflictsList({
|
|
38
|
+
await runConflictsList({});
|
|
39
39
|
expect(kernelCall).toHaveBeenCalledOnce();
|
|
40
|
-
|
|
40
|
+
// Review fix (PR #528 round 2, P2): the default/actionable case now omits `mode` entirely
|
|
41
|
+
// (pre-C2 deployment compatibility — see runConflictsList's doc comment).
|
|
42
|
+
// PR #528 R3 P2: `now` is a live-computed, minute-bucketed cache-key freshness value.
|
|
43
|
+
expect(kernelCall).toHaveBeenCalledWith('conflicts.list', { now: expect.any(Number) });
|
|
41
44
|
});
|
|
42
|
-
it('exposes list, resolve, and summary in help metadata', () => {
|
|
45
|
+
it('exposes list, resolve, reverdict, snooze, and summary in help metadata', () => {
|
|
43
46
|
const command = createConflictsCommand();
|
|
44
|
-
expect(command.commands.map((item) => item.name())).toEqual(['list', 'resolve', 'summary']);
|
|
47
|
+
expect(command.commands.map((item) => item.name())).toEqual(['list', 'resolve', 'reverdict', 'snooze', 'summary']);
|
|
45
48
|
});
|
|
46
|
-
it('lists
|
|
47
|
-
await runConflictsList({
|
|
48
|
-
|
|
49
|
+
it('lists conflicts via a plain read, defaulting to the actionable mode (C2) — no session required, --status OMITTED', async () => {
|
|
50
|
+
await runConflictsList({});
|
|
51
|
+
// Review fix (PR #528 round 2, P2): `mode` is omitted on the wire for the default case — a
|
|
52
|
+
// pre-C2 backend's validator (which never declared `mode`) then runs its own legacy handler
|
|
53
|
+
// instead of rejecting the unexpected key; a post-C2 backend defaults to 'actionable' server-
|
|
54
|
+
// side (mode ?? 'actionable'), so the OBSERVED behavior is unchanged either way.
|
|
55
|
+
// PR #528 R3 P2: `now` is a live-computed, minute-bucketed cache-key freshness value.
|
|
56
|
+
expect(kernelCall).toHaveBeenCalledWith('conflicts.list', { now: expect.any(Number) });
|
|
49
57
|
expect(kernelCallWithSession).not.toHaveBeenCalled();
|
|
50
58
|
});
|
|
59
|
+
it('--all requests the full open debt pile (verdicted + snoozed rows)', async () => {
|
|
60
|
+
await runConflictsList({ all: true });
|
|
61
|
+
expect(kernelCall).toHaveBeenCalledWith('conflicts.list', { mode: 'all', now: expect.any(Number) });
|
|
62
|
+
});
|
|
63
|
+
// Review fix (PR #528 round 3, P2): --all's first attempt still sends {mode:'all'} (a post-C2
|
|
64
|
+
// backend needs it), which crashes a pre-C2 backend's exact-match validator on the unexpected
|
|
65
|
+
// key — retry with the bare legacy payload it actually understands instead of hard-failing.
|
|
66
|
+
it('--all retries with the bare legacy payload when a pre-C2 backend rejects the additive mode field', async () => {
|
|
67
|
+
kernelCall
|
|
68
|
+
.mockRejectedValueOnce(new Error("ArgumentValidationError: Object contains extra field 'mode' that is not in the validator."))
|
|
69
|
+
.mockResolvedValueOnce([]);
|
|
70
|
+
await runConflictsList({ all: true });
|
|
71
|
+
expect(kernelCall).toHaveBeenCalledTimes(2);
|
|
72
|
+
expect(kernelCall).toHaveBeenNthCalledWith(1, 'conflicts.list', { mode: 'all', now: expect.any(Number) });
|
|
73
|
+
expect(kernelCall).toHaveBeenNthCalledWith(2, 'conflicts.list', {});
|
|
74
|
+
});
|
|
75
|
+
it('--all does NOT retry (and propagates) an unrelated rejection', async () => {
|
|
76
|
+
kernelCall.mockRejectedValueOnce(new Error('Network error: fetch failed'));
|
|
77
|
+
await expect(runConflictsList({ all: true })).rejects.toThrow('Network error: fetch failed');
|
|
78
|
+
expect(kernelCall).toHaveBeenCalledTimes(1);
|
|
79
|
+
});
|
|
80
|
+
// Review fix (PR #528 P2): an OMITTED --status and an EXPLICITLY passed "--status open" must
|
|
81
|
+
// not collapse to the same value — the option no longer carries a Commander default, so
|
|
82
|
+
// `options.status` is `undefined` when omitted and 'open' only when the caller typed it.
|
|
83
|
+
it('an EXPLICIT --status open is the legacy alias for --all (the full debt pile), distinct from an omitted --status', async () => {
|
|
84
|
+
await runConflictsList({ status: 'open' });
|
|
85
|
+
expect(kernelCall).toHaveBeenCalledWith('conflicts.list', { mode: 'all', now: expect.any(Number) });
|
|
86
|
+
});
|
|
51
87
|
it('rejects an unsupported --status value client-side before calling the gateway', async () => {
|
|
52
88
|
await expect(runConflictsList({ status: 'resolved' })).rejects.toThrow(/open/);
|
|
53
89
|
expect(kernelCall).not.toHaveBeenCalled();
|
|
@@ -84,6 +120,25 @@ describe('pb conflicts command surface (WP-499 Slice A, TEN-2744)', () => {
|
|
|
84
120
|
expect(kernelCall).toHaveBeenCalledWith('conflicts.summary', {});
|
|
85
121
|
expect(kernelCallWithSession).not.toHaveBeenCalled();
|
|
86
122
|
});
|
|
123
|
+
// Review fix (PR #528 P2): this is the ACTUAL bug surface — Commander itself, not a
|
|
124
|
+
// hand-constructed options object. Before the fix, `.option('--status <status>', ..., 'open')`
|
|
125
|
+
// meant Commander supplied `status: 'open'` whether or not the user typed `--status open`,
|
|
126
|
+
// making the legacy alias unreachable.
|
|
127
|
+
it('parses the Commander list surface — an unadorned "list" defaults to actionable', async () => {
|
|
128
|
+
const command = createConflictsCommand();
|
|
129
|
+
command.exitOverride();
|
|
130
|
+
await command.parseAsync(['list'], { from: 'user' });
|
|
131
|
+
// Review fix (PR #528 round 2, P2): `mode` omitted for the default case — see
|
|
132
|
+
// runConflictsList's doc comment (pre-C2 deployment compatibility).
|
|
133
|
+
// PR #528 R3 P2: `now` is a live-computed, minute-bucketed cache-key freshness value.
|
|
134
|
+
expect(kernelCall).toHaveBeenCalledWith('conflicts.list', { now: expect.any(Number) });
|
|
135
|
+
});
|
|
136
|
+
it('parses the Commander list surface — an explicit "--status open" requests the legacy full debt pile', async () => {
|
|
137
|
+
const command = createConflictsCommand();
|
|
138
|
+
command.exitOverride();
|
|
139
|
+
await command.parseAsync(['list', '--status', 'open'], { from: 'user' });
|
|
140
|
+
expect(kernelCall).toHaveBeenCalledWith('conflicts.list', { mode: 'all', now: expect.any(Number) });
|
|
141
|
+
});
|
|
87
142
|
it('parses the Commander resolve surface and forwards the mapped verdict', async () => {
|
|
88
143
|
readSession.mockReturnValue({ sessionId: 'session-1' });
|
|
89
144
|
const command = createConflictsCommand();
|
|
@@ -93,5 +148,52 @@ describe('pb conflicts command surface (WP-499 Slice A, TEN-2744)', () => {
|
|
|
93
148
|
issueId: 'issue-42', verdict: 'false_alarm',
|
|
94
149
|
});
|
|
95
150
|
});
|
|
151
|
+
describe('pb conflicts snooze (C2, bounded logged debt — DEC-1491)', () => {
|
|
152
|
+
it('requires an active session before snoozing (workspace write, session-attributed)', async () => {
|
|
153
|
+
await expect(runConflictsSnooze('issue-1', { until: '7', reason: 'waiting on founder' }))
|
|
154
|
+
.rejects.toMatchObject({ code: 'SESSION_REQUIRED' });
|
|
155
|
+
expect(kernelCallWithSession).not.toHaveBeenCalled();
|
|
156
|
+
});
|
|
157
|
+
it('rejects a non-numeric or out-of-range --until client-side before calling the gateway', async () => {
|
|
158
|
+
readSession.mockReturnValue({ sessionId: 'session-1' });
|
|
159
|
+
await expect(runConflictsSnooze('issue-1', { until: 'abc', reason: 'x' })).rejects.toThrow(/1 and 14/);
|
|
160
|
+
await expect(runConflictsSnooze('issue-1', { until: '15', reason: 'x' })).rejects.toThrow(/1 and 14/);
|
|
161
|
+
await expect(runConflictsSnooze('issue-1', { until: '0', reason: 'x' })).rejects.toThrow(/1 and 14/);
|
|
162
|
+
expect(kernelCallWithSession).not.toHaveBeenCalled();
|
|
163
|
+
});
|
|
164
|
+
it('requires a non-empty --reason — a snooze is logged debt, never a silent dismissal', async () => {
|
|
165
|
+
readSession.mockReturnValue({ sessionId: 'session-1' });
|
|
166
|
+
await expect(runConflictsSnooze('issue-1', { until: '7', reason: ' ' })).rejects.toThrow(/reason/i);
|
|
167
|
+
expect(kernelCallWithSession).not.toHaveBeenCalled();
|
|
168
|
+
});
|
|
169
|
+
it('forwards untilDays (as a number) and reason to conflicts.snooze', async () => {
|
|
170
|
+
readSession.mockReturnValue({ sessionId: 'session-1' });
|
|
171
|
+
kernelCallWithSession.mockResolvedValue({ ok: true, snoozedUntil: Date.now() + 1000, snoozeCount: 1 });
|
|
172
|
+
await runConflictsSnooze('issue-1', { until: '7', reason: 'waiting on founder' });
|
|
173
|
+
expect(kernelCallWithSession).toHaveBeenCalledWith('conflicts.snooze', {
|
|
174
|
+
issueId: 'issue-1', untilDays: 7, reason: 'waiting on founder',
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
describe('pb conflicts reverdict (C2, logged amendment — point 3)', () => {
|
|
179
|
+
it('requires an active session before reverdicting', async () => {
|
|
180
|
+
await expect(runConflictsReverdict('issue-1', { verdict: 'real', reason: 'new evidence' }))
|
|
181
|
+
.rejects.toMatchObject({ code: 'SESSION_REQUIRED' });
|
|
182
|
+
expect(kernelCallWithSession).not.toHaveBeenCalled();
|
|
183
|
+
});
|
|
184
|
+
it('requires a non-empty --reason — a reverdict is a logged amendment, never a silent overwrite', async () => {
|
|
185
|
+
readSession.mockReturnValue({ sessionId: 'session-1' });
|
|
186
|
+
await expect(runConflictsReverdict('issue-1', { verdict: 'real', reason: '' })).rejects.toThrow(/reason/i);
|
|
187
|
+
expect(kernelCallWithSession).not.toHaveBeenCalled();
|
|
188
|
+
});
|
|
189
|
+
it('maps "noise" to false_alarm and forwards the reason to conflicts.reverdict', async () => {
|
|
190
|
+
readSession.mockReturnValue({ sessionId: 'session-1' });
|
|
191
|
+
kernelCallWithSession.mockResolvedValue({ ok: true, priorVerdict: 'real', verdict: 'false_alarm' });
|
|
192
|
+
await runConflictsReverdict('issue-1', { verdict: 'noise', reason: 'endpoint was edited, re-checked' });
|
|
193
|
+
expect(kernelCallWithSession).toHaveBeenCalledWith('conflicts.reverdict', {
|
|
194
|
+
issueId: 'issue-1', verdict: 'false_alarm', reason: 'endpoint was edited, re-checked',
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
});
|
|
96
198
|
});
|
|
97
199
|
//# sourceMappingURL=conflicts.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflicts.test.js","sourceRoot":"","sources":["../../src/commands/conflicts.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conflicts.test.js","sourceRoot":"","sources":["../../src/commands/conflicts.test.ts"],"names":[],"mappings":"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"}
|