@productbrain/cli 0.1.0-beta.8509 → 0.1.0-beta.8518

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.
@@ -1,234 +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
- import { getConfigOrGuide } from '../lib/config.js';
18
- import { kernelCall, kernelCallWithSession } from '../lib/client.js';
19
- import { isJsonMode } from '../lib/runner.js';
20
- import { readSession } from '../lib/session.js';
21
- import { stripConvexInternals } from '../lib/strip.js';
22
- import { formatAudit, formatBatchSummary } from '../formatters/audit.js';
23
- import { getOrFetchVocabCtx } from '../lib/workspaceVocabCache.js';
24
- import { replaceVocabTokens } from '../lib/canonicalRefs.js';
25
- // Exit codes
26
- const EXIT_PASS = 0;
27
- const EXIT_FAIL = 1;
28
- const EXIT_WARN = 2;
29
- const EXIT_ERROR = 3;
30
- function parseExactFixes(entryId, gates) {
31
- const actions = [];
32
- for (const gate of gates) {
33
- if (gate.status !== 'fail' && gate.status !== 'warn')
34
- continue;
35
- if (gate.fixType !== 'exact' || !gate.fix)
36
- continue;
37
- // Parse "Set field '<key>' to '<value>'" pattern
38
- const fieldMatch = gate.fix.match(/^Set field '([^']+)' to '([^']+)'$/);
39
- if (fieldMatch) {
40
- actions.push({
41
- type: 'field',
42
- entryId,
43
- fieldKey: fieldMatch[1],
44
- fieldValue: fieldMatch[2],
45
- });
46
- }
47
- }
48
- return actions;
49
- }
50
- async function executeFixActions(actions, json) {
51
- let applied = 0;
52
- for (const action of actions) {
53
- if (action.type === 'field') {
54
- try {
55
- const result = await kernelCallWithSession('chain.updateEntry', {
56
- entryId: action.entryId,
57
- data: { [action.fieldKey]: action.fieldValue },
58
- changeNote: `Auto-fix via pb audit: set ${action.fieldKey}`,
59
- });
60
- // WP-465 slice ⑤ (Option B): a coherency refusal RETURNS a structured payload — the
61
- // field stays unchanged, so never count it as an applied fix.
62
- if (result?.outcome === 'refused') {
63
- if (!json) {
64
- process.stderr.write(` Fix refused (${action.fieldKey}): ${result.refusal?.reason ?? 'coherency gate refused this update'}\n`);
65
- }
66
- continue;
67
- }
68
- // PR B (WP-757): the field can ALSO be silently stripped by server-side normalization
69
- // (unknown field, bad shape) with no refusal and no throw — same defect class the
70
- // CLI/MCP update receipts had (echoing the caller's requested key instead of the
71
- // server's applied set). Check normalization.rejected before claiming a fix landed.
72
- const rejectedFields = result?.normalization?.rejected ?? [];
73
- if (rejectedFields.includes(action.fieldKey)) {
74
- if (!json) {
75
- process.stderr.write(` Fix rejected (${action.fieldKey}): not a recognized field on this entry's collection.\n`);
76
- }
77
- continue;
78
- }
79
- applied++;
80
- if (!json) {
81
- process.stderr.write(` Fixed: ${action.fieldKey} = ${action.fieldValue}\n`);
82
- }
83
- }
84
- catch (err) {
85
- const msg = err instanceof Error ? err.message : String(err);
86
- if (!json) {
87
- process.stderr.write(` Fix failed (${action.fieldKey}): ${msg}\n`);
88
- }
89
- }
90
- }
91
- }
92
- return applied;
93
- }
94
- // ─── Single audit ───────────────────────────────────────────────────────────
95
- async function auditOne(entryId, options) {
96
- const { phase, gate: gateFilter, fix, verbose, vocabCtx } = options;
97
- const json = isJsonMode();
98
- // Build MCP args
99
- const args = { entryId };
100
- if (phase)
101
- args.phase = phase;
102
- let result;
103
- try {
104
- result = await kernelCall('chain.auditBet', args);
105
- }
106
- catch (err) {
107
- const msg = err instanceof Error ? err.message : String(err);
108
- if (json) {
109
- process.stderr.write(JSON.stringify({ error: msg, entryId }) + '\n');
110
- }
111
- else {
112
- process.stderr.write(`Error auditing ${entryId}: ${msg}\n`);
113
- }
114
- return { result: null, exitCode: EXIT_ERROR };
115
- }
116
- // --fix: auto-execute exact fixes, then rerun once
117
- if (fix) {
118
- const session = readSession();
119
- if (!session) {
120
- if (!json) {
121
- process.stderr.write('--fix requires an active session. Run `pb session start` first.\n');
122
- }
123
- // Still show the result, just skip fixing
124
- }
125
- else {
126
- const exactFixes = parseExactFixes(entryId, result.gates);
127
- if (exactFixes.length > 0) {
128
- if (!json)
129
- process.stderr.write(`\nAuto-fixing ${exactFixes.length} issue(s) on ${entryId}...\n`);
130
- const applied = await executeFixActions(exactFixes, json);
131
- if (applied > 0) {
132
- // Rerun audit once after fixes
133
- if (!json)
134
- process.stderr.write(`\nRe-auditing ${entryId} after ${applied} fix(es)...\n`);
135
- try {
136
- result = await kernelCall('chain.auditBet', args);
137
- }
138
- catch (err) {
139
- const msg = err instanceof Error ? err.message : String(err);
140
- if (!json)
141
- process.stderr.write(`Re-audit failed: ${msg}\n`);
142
- // Use original result
143
- }
144
- }
145
- }
146
- }
147
- }
148
- // WP-438 S1: resolve {{vocab:...}} tokens on each gate field flagged with
149
- // tokens.* === true. Workspace vocab is fetched once per CLI invocation and
150
- // passed through `options.vocabCtx`. Fail-open: when ctx is undefined the
151
- // resolver falls back to the canonicalKey literal.
152
- for (const gate of result.gates) {
153
- if (gate.tokens?.detail)
154
- gate.detail = replaceVocabTokens(gate.detail, vocabCtx);
155
- if (gate.tokens?.fix && gate.fix)
156
- gate.fix = replaceVocabTokens(gate.fix, vocabCtx);
157
- if (gate.tokens?.hint && gate.hint)
158
- gate.hint = replaceVocabTokens(gate.hint, vocabCtx);
159
- }
160
- // Output
161
- if (json) {
162
- // Apply gate filter for JSON output too
163
- const output = { ...stripConvexInternals(result) };
164
- if (gateFilter && gateFilter.length > 0) {
165
- output.gates = result.gates.filter((g) => gateFilter.includes(g.gate));
166
- }
167
- process.stdout.write(JSON.stringify(output) + '\n');
168
- }
169
- else {
170
- process.stdout.write(formatAudit(result, { verbose, gateFilter }) + '\n');
171
- }
172
- // Map verdict to exit code
173
- const exitCode = result.verdict === 'pass' ? EXIT_PASS
174
- : result.verdict === 'fail' ? EXIT_FAIL
175
- : EXIT_WARN;
176
- return { result, exitCode };
177
- }
178
- // ─── Entry point ────────────────────────────────────────────────────────────
179
- export async function runAudit(options) {
180
- const config = await getConfigOrGuide(() => runAudit(options));
181
- if (!config)
182
- return;
183
- const { entryIds, ...rest } = options;
184
- // WP-438 S1: load workspace vocabulary once for the whole batch (PAT-230,
185
- // DEC-1021). Cached for 5 min via the shared workspaceVocabCache. Fail-open.
186
- const vocabCtx = await getOrFetchVocabCtx(config.apiKey, async () => {
187
- const vocab = await kernelCall('chain.getVocabulary', {});
188
- if (vocab?.collectionLabels || vocab?.collectionDefaults) {
189
- return {
190
- ...(vocab.collectionLabels ? { collectionLabels: vocab.collectionLabels } : {}),
191
- ...(vocab.collectionDefaults ? { collectionDefaults: vocab.collectionDefaults } : {}),
192
- };
193
- }
194
- return null;
195
- });
196
- const restWithVocab = { ...rest, vocabCtx };
197
- if (entryIds.length === 1) {
198
- // Single audit
199
- const { exitCode } = await auditOne(entryIds[0], restWithVocab);
200
- process.exit(exitCode);
201
- }
202
- // Batch mode: audit multiple bets sequentially
203
- const json = isJsonMode();
204
- const results = [];
205
- let worstExit = EXIT_PASS;
206
- for (const entryId of entryIds) {
207
- const { result, exitCode } = await auditOne(entryId, restWithVocab);
208
- if (result)
209
- results.push(result);
210
- if (exitCode > worstExit)
211
- worstExit = exitCode;
212
- // Separator between entries in TTY mode
213
- if (!json && entryIds.indexOf(entryId) < entryIds.length - 1) {
214
- process.stdout.write('\n---\n\n');
215
- }
216
- }
217
- // Batch summary
218
- if (results.length > 1) {
219
- if (json) {
220
- process.stdout.write(JSON.stringify({
221
- batch: true,
222
- count: results.length,
223
- passed: results.filter((r) => r.verdict === 'pass').length,
224
- failed: results.filter((r) => r.verdict === 'fail').length,
225
- warned: results.filter((r) => r.verdict === 'warn').length,
226
- }) + '\n');
227
- }
228
- else {
229
- process.stdout.write(formatBatchSummary(results) + '\n');
230
- }
231
- }
232
- process.exit(worstExit);
233
- }
234
- //# sourceMappingURL=audit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -1,52 +0,0 @@
1
- /**
2
- * Audit formatter — human-readable TTY output for pb audit.
3
- * BET-182 Slice 2: CLI Command + Auto-Fix.
4
- *
5
- * TTY behavior:
6
- * - PASS gates are collapsed by default (shown as count summary)
7
- * - FAIL/WARN gates are expanded with detail + fix suggestions
8
- * - --verbose shows all gates including PASS detail
9
- *
10
- * Chain: BET-182, STD-65 (structured, parseable, minimal), RULE-384
11
- */
12
- export interface GateResult {
13
- gate: string;
14
- status: 'pass' | 'fail' | 'warn';
15
- blocking: boolean;
16
- detail: string;
17
- fix?: string;
18
- fixType?: 'exact' | 'template' | 'manual';
19
- hint?: string;
20
- /** WP-438 S1: per-field flags indicating unresolved {{vocab:...}} tokens. */
21
- tokens?: {
22
- detail: boolean;
23
- fix: boolean;
24
- hint: boolean;
25
- };
26
- }
27
- export interface AuditResult {
28
- entryId: string;
29
- entryName: string;
30
- phase: string;
31
- clean: boolean;
32
- verdict: 'pass' | 'fail' | 'warn';
33
- gates: GateResult[];
34
- summary: {
35
- total: number;
36
- passed: number;
37
- failed: number;
38
- warned: number;
39
- };
40
- elapsed_ms: number;
41
- }
42
- export interface FormatAuditOptions {
43
- verbose?: boolean;
44
- /** When set, only show these gate names. */
45
- gateFilter?: string[];
46
- }
47
- export declare function formatAudit(result: AuditResult, options?: FormatAuditOptions): string;
48
- /**
49
- * Format a batch audit summary line for multiple results.
50
- */
51
- export declare function formatBatchSummary(results: AuditResult[]): string;
52
- //# sourceMappingURL=audit.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/formatters/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,OAAO,CAAC;QAChB,GAAG,EAAE,OAAO,CAAC;QACb,IAAI,EAAE,OAAO,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,kBAAuB,GAAG,MAAM,CAiEzF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAMjE"}
@@ -1,81 +0,0 @@
1
- /**
2
- * Audit formatter — human-readable TTY output for pb audit.
3
- * BET-182 Slice 2: CLI Command + Auto-Fix.
4
- *
5
- * TTY behavior:
6
- * - PASS gates are collapsed by default (shown as count summary)
7
- * - FAIL/WARN gates are expanded with detail + fix suggestions
8
- * - --verbose shows all gates including PASS detail
9
- *
10
- * Chain: BET-182, STD-65 (structured, parseable, minimal), RULE-384
11
- */
12
- export function formatAudit(result, options = {}) {
13
- const { verbose = false, gateFilter } = options;
14
- const lines = [];
15
- const { entryId, entryName, phase, verdict, gates, summary, elapsed_ms } = result;
16
- // Apply gate filter if specified
17
- const displayGates = gateFilter && gateFilter.length > 0
18
- ? gates.filter((g) => gateFilter.includes(g.gate))
19
- : gates;
20
- const verdictIcon = verdict === 'pass' ? '\u2713' : verdict === 'fail' ? '\u2717' : '\u26A0';
21
- const verdictLabel = verdict.toUpperCase();
22
- lines.push(`${verdictIcon} ${entryId} — ${entryName}`);
23
- lines.push(` Phase: ${phase} | Verdict: ${verdictLabel} | ${elapsed_ms}ms`);
24
- lines.push(` Gates: ${summary.passed}/${summary.total} passed, ${summary.failed} failed, ${summary.warned} warned`);
25
- lines.push('');
26
- // Group by status
27
- const failed = displayGates.filter((g) => g.status === 'fail');
28
- const warned = displayGates.filter((g) => g.status === 'warn');
29
- const passed = displayGates.filter((g) => g.status === 'pass');
30
- // Always expand FAIL gates
31
- if (failed.length > 0) {
32
- lines.push('FAIL:');
33
- for (const gate of failed) {
34
- lines.push(` \u2717 ${gate.gate}: ${gate.detail}`);
35
- if (gate.fix) {
36
- const fixLabel = gate.fixType === 'exact' ? '[auto-fixable]' : gate.fixType === 'template' ? '[template]' : '';
37
- lines.push(` Fix${fixLabel ? ' ' + fixLabel : ''}: ${gate.fix}`);
38
- }
39
- if (gate.hint)
40
- lines.push(` Note: ${gate.hint}`);
41
- }
42
- lines.push('');
43
- }
44
- // Always expand WARN gates
45
- if (warned.length > 0) {
46
- lines.push('WARN:');
47
- for (const gate of warned) {
48
- lines.push(` \u26A0 ${gate.gate}: ${gate.detail}`);
49
- if (gate.fix) {
50
- const fixLabel = gate.fixType === 'exact' ? '[auto-fixable]' : gate.fixType === 'template' ? '[template]' : '';
51
- lines.push(` Fix${fixLabel ? ' ' + fixLabel : ''}: ${gate.fix}`);
52
- }
53
- if (gate.hint)
54
- lines.push(` Note: ${gate.hint}`);
55
- }
56
- lines.push('');
57
- }
58
- // PASS gates: collapsed by default, expanded with --verbose
59
- if (passed.length > 0) {
60
- if (verbose) {
61
- lines.push('PASS:');
62
- for (const gate of passed) {
63
- lines.push(` \u2713 ${gate.gate}: ${gate.detail}`);
64
- }
65
- }
66
- else {
67
- lines.push(`PASS: ${passed.length} gate(s) — ${passed.map((g) => g.gate).join(', ')}`);
68
- }
69
- }
70
- return lines.join('\n').trimEnd();
71
- }
72
- /**
73
- * Format a batch audit summary line for multiple results.
74
- */
75
- export function formatBatchSummary(results) {
76
- const passed = results.filter((r) => r.verdict === 'pass').length;
77
- const failed = results.filter((r) => r.verdict === 'fail').length;
78
- const warned = results.filter((r) => r.verdict === 'warn').length;
79
- return `\nBatch: ${results.length} work package(s) audited — ${passed} passed, ${failed} failed, ${warned} warned`;
80
- }
81
- //# sourceMappingURL=audit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/formatters/audit.ts"],"names":[],"mappings":"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"}