@productbrain/cli 0.1.0-beta.7278 → 0.1.0-beta.7288

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.
Files changed (101) hide show
  1. package/dist/__tests__/onboarding.test.js +4 -1
  2. package/dist/__tests__/onboarding.test.js.map +1 -1
  3. package/dist/__tests__/session-close-loop.test.js +0 -2
  4. package/dist/__tests__/session-close-loop.test.js.map +1 -1
  5. package/dist/commands/handshake.js +2 -2
  6. package/dist/commands/handshake.js.map +1 -1
  7. package/dist/commands/init.d.ts.map +1 -1
  8. package/dist/commands/init.js +2 -4
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/commands/session.d.ts.map +1 -1
  11. package/dist/commands/session.js +0 -18
  12. package/dist/commands/session.js.map +1 -1
  13. package/dist/formatters/digest.d.ts.map +1 -1
  14. package/dist/formatters/digest.js +9 -5
  15. package/dist/formatters/digest.js.map +1 -1
  16. package/dist/index.js +1 -62
  17. package/dist/index.js.map +1 -1
  18. package/dist/lib/onboarding-shared.d.ts.map +1 -1
  19. package/dist/lib/onboarding-shared.js +8 -9
  20. package/dist/lib/onboarding-shared.js.map +1 -1
  21. package/dist/lib/onboarding-topics.js +1 -1
  22. package/dist/lib/onboarding.d.ts.map +1 -1
  23. package/dist/lib/onboarding.js +7 -13
  24. package/dist/lib/onboarding.js.map +1 -1
  25. package/package.json +1 -1
  26. package/dist/__tests__/migrate-setup-session-refusal.test.d.ts +0 -2
  27. package/dist/__tests__/migrate-setup-session-refusal.test.d.ts.map +0 -1
  28. package/dist/__tests__/migrate-setup-session-refusal.test.js +0 -65
  29. package/dist/__tests__/migrate-setup-session-refusal.test.js.map +0 -1
  30. package/dist/__tests__/setup-ingest.test.d.ts +0 -2
  31. package/dist/__tests__/setup-ingest.test.d.ts.map +0 -1
  32. package/dist/__tests__/setup-ingest.test.js +0 -71
  33. package/dist/__tests__/setup-ingest.test.js.map +0 -1
  34. package/dist/__tests__/setup-resolver.test.d.ts +0 -14
  35. package/dist/__tests__/setup-resolver.test.d.ts.map +0 -1
  36. package/dist/__tests__/setup-resolver.test.js +0 -228
  37. package/dist/__tests__/setup-resolver.test.js.map +0 -1
  38. package/dist/__tests__/setupShFallbackWarning.test.d.ts +0 -2
  39. package/dist/__tests__/setupShFallbackWarning.test.d.ts.map +0 -1
  40. package/dist/__tests__/setupShFallbackWarning.test.js +0 -15
  41. package/dist/__tests__/setupShFallbackWarning.test.js.map +0 -1
  42. package/dist/commands/__tests__/setup-detect-surfaces.test.d.ts +0 -15
  43. package/dist/commands/__tests__/setup-detect-surfaces.test.d.ts.map +0 -1
  44. package/dist/commands/__tests__/setup-detect-surfaces.test.js +0 -149
  45. package/dist/commands/__tests__/setup-detect-surfaces.test.js.map +0 -1
  46. package/dist/commands/__tests__/setup-state.test.d.ts +0 -2
  47. package/dist/commands/__tests__/setup-state.test.d.ts.map +0 -1
  48. package/dist/commands/__tests__/setup-state.test.js +0 -194
  49. package/dist/commands/__tests__/setup-state.test.js.map +0 -1
  50. package/dist/commands/migrate-setup.d.ts +0 -18
  51. package/dist/commands/migrate-setup.d.ts.map +0 -1
  52. package/dist/commands/migrate-setup.js +0 -162
  53. package/dist/commands/migrate-setup.js.map +0 -1
  54. package/dist/commands/setup-audit.d.ts +0 -59
  55. package/dist/commands/setup-audit.d.ts.map +0 -1
  56. package/dist/commands/setup-audit.js +0 -250
  57. package/dist/commands/setup-audit.js.map +0 -1
  58. package/dist/commands/setup-detect-surfaces.d.ts +0 -38
  59. package/dist/commands/setup-detect-surfaces.d.ts.map +0 -1
  60. package/dist/commands/setup-detect-surfaces.js +0 -76
  61. package/dist/commands/setup-detect-surfaces.js.map +0 -1
  62. package/dist/commands/setup-ingest.d.ts +0 -17
  63. package/dist/commands/setup-ingest.d.ts.map +0 -1
  64. package/dist/commands/setup-ingest.js +0 -179
  65. package/dist/commands/setup-ingest.js.map +0 -1
  66. package/dist/commands/setup-resolver.d.ts +0 -58
  67. package/dist/commands/setup-resolver.d.ts.map +0 -1
  68. package/dist/commands/setup-resolver.js +0 -150
  69. package/dist/commands/setup-resolver.js.map +0 -1
  70. package/dist/commands/setup-state.d.ts +0 -42
  71. package/dist/commands/setup-state.d.ts.map +0 -1
  72. package/dist/commands/setup-state.js +0 -93
  73. package/dist/commands/setup-state.js.map +0 -1
  74. package/dist/commands/setup.d.ts +0 -23
  75. package/dist/commands/setup.d.ts.map +0 -1
  76. package/dist/commands/setup.js +0 -69
  77. package/dist/commands/setup.js.map +0 -1
  78. package/dist/setup/__tests__/coach-traces.test.d.ts +0 -2
  79. package/dist/setup/__tests__/coach-traces.test.d.ts.map +0 -1
  80. package/dist/setup/__tests__/coach-traces.test.js +0 -189
  81. package/dist/setup/__tests__/coach-traces.test.js.map +0 -1
  82. package/dist/setup/__tests__/setup-commands.test.d.ts +0 -2
  83. package/dist/setup/__tests__/setup-commands.test.d.ts.map +0 -1
  84. package/dist/setup/__tests__/setup-commands.test.js +0 -177
  85. package/dist/setup/__tests__/setup-commands.test.js.map +0 -1
  86. package/dist/setup/__tests__/state-machine.test.d.ts +0 -2
  87. package/dist/setup/__tests__/state-machine.test.d.ts.map +0 -1
  88. package/dist/setup/__tests__/state-machine.test.js +0 -341
  89. package/dist/setup/__tests__/state-machine.test.js.map +0 -1
  90. package/dist/setup/detect-surfaces.d.ts +0 -21
  91. package/dist/setup/detect-surfaces.d.ts.map +0 -1
  92. package/dist/setup/detect-surfaces.js +0 -39
  93. package/dist/setup/detect-surfaces.js.map +0 -1
  94. package/dist/setup/manifest-writer.d.ts +0 -17
  95. package/dist/setup/manifest-writer.d.ts.map +0 -1
  96. package/dist/setup/manifest-writer.js +0 -153
  97. package/dist/setup/manifest-writer.js.map +0 -1
  98. package/dist/setup/state-machine.d.ts +0 -67
  99. package/dist/setup/state-machine.d.ts.map +0 -1
  100. package/dist/setup/state-machine.js +0 -124
  101. package/dist/setup/state-machine.js.map +0 -1
@@ -1,194 +0,0 @@
1
- /**
2
- * WP-431 S3 — `pb setup-state` and `pb setup` alias tests.
3
- *
4
- * Mocks kernelCall (gateway boundary) so error/auth/network paths and the
5
- * recordInvocation idempotence behaviour are exercised without a real Convex
6
- * deployment.
7
- */
8
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
9
- import { mkdirSync, mkdtempSync, rmSync } from 'fs';
10
- import { dirname, join } from 'path';
11
- import { fileURLToPath } from 'url';
12
- import { tmpdir } from 'os';
13
- const __filename = fileURLToPath(import.meta.url);
14
- const __dirname = dirname(__filename);
15
- vi.mock('../../lib/client.js', async () => {
16
- class FakeMcpError extends Error {
17
- code;
18
- constructor(message, code) {
19
- super(message);
20
- this.name = 'McpError';
21
- this.code = code;
22
- }
23
- }
24
- return {
25
- kernelCall: vi.fn(),
26
- McpError: FakeMcpError,
27
- };
28
- });
29
- import { runSetupState, fetchSetupState } from '../setup-state.js';
30
- import { runSetup } from '../setup.js';
31
- import { kernelCall, McpError } from '../../lib/client.js';
32
- const mockedKernelCall = vi.mocked(kernelCall);
33
- let scratch;
34
- let originalCwd;
35
- let exitSpy;
36
- let stdoutSpy;
37
- let stderrSpy;
38
- beforeEach(() => {
39
- originalCwd = process.cwd();
40
- scratch = mkdtempSync(join(tmpdir(), 'pb-setup-state-'));
41
- process.chdir(scratch);
42
- mockedKernelCall.mockReset();
43
- exitSpy = vi.spyOn(process, 'exit').mockImplementation(((_code) => {
44
- throw new Error(`__exit:${_code ?? 0}`);
45
- }));
46
- stdoutSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
47
- stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
48
- });
49
- afterEach(() => {
50
- process.chdir(originalCwd);
51
- rmSync(scratch, { recursive: true, force: true });
52
- exitSpy.mockRestore();
53
- stdoutSpy.mockRestore();
54
- stderrSpy.mockRestore();
55
- });
56
- const SAMPLE = {
57
- phase: 1,
58
- role: 'creator',
59
- expectedAction: 'declare a surface',
60
- reasonForPhase: 'manifest.surfaces empty',
61
- isComplete: false,
62
- surfaceCapability: 'cli',
63
- };
64
- describe('fetchSetupState()', () => {
65
- it('returns the typed result from setup.getPbSetupState', async () => {
66
- mockedKernelCall.mockResolvedValueOnce(SAMPLE);
67
- const result = await fetchSetupState();
68
- expect(result).toEqual(SAMPLE);
69
- expect(mockedKernelCall).toHaveBeenCalledWith('setup.getPbSetupState', {});
70
- });
71
- });
72
- describe('runSetupState()', () => {
73
- it('writes compact JSON to stdout on success', async () => {
74
- mockedKernelCall.mockResolvedValueOnce(SAMPLE);
75
- await runSetupState();
76
- const written = stdoutSpy.mock.calls.map((c) => String(c[0])).join('');
77
- const parsed = JSON.parse(written.trim());
78
- expect(parsed).toEqual(SAMPLE);
79
- });
80
- it('exits 2 on AUTH_REQUIRED', async () => {
81
- mockedKernelCall.mockRejectedValueOnce(new McpError('not member', 'AUTHZ_NOT_MEMBER'));
82
- await expect(runSetupState()).rejects.toThrow('__exit:2');
83
- const stderr = stderrSpy.mock.calls.map((c) => String(c[0])).join('');
84
- expect(stderr).toContain('AUTH_DENIED');
85
- });
86
- it('exits 3 on network error (CLIError category=network)', async () => {
87
- const { CLIError, ErrorCode } = await import('../../lib/errors.js');
88
- mockedKernelCall.mockRejectedValueOnce(new CLIError('Could not reach host.', {
89
- code: ErrorCode.NETWORK_UNREACHABLE,
90
- category: 'network',
91
- }));
92
- await expect(runSetupState()).rejects.toThrow('__exit:3');
93
- });
94
- it('emits JSON to stdout regardless of tty (non-tty path)', async () => {
95
- Object.defineProperty(process.stdout, 'isTTY', { value: false, configurable: true });
96
- mockedKernelCall.mockResolvedValueOnce(SAMPLE);
97
- await runSetupState();
98
- const written = stdoutSpy.mock.calls.map((c) => String(c[0])).join('');
99
- expect(written.trim().startsWith('{')).toBe(true);
100
- });
101
- });
102
- describe('pb start ≠ pb setup (DEC-995 invariant)', () => {
103
- it('runSessionStart is the binding for `pb start`, not runSetup', async () => {
104
- const fs = await import('fs');
105
- const indexSrc = fs.readFileSync(join(__dirname, '..', 'status.ts'), 'utf8');
106
- // pb start dispatches to runSessionStart
107
- expect(indexSrc).toContain("args[0] === 'start'");
108
- const startSection = indexSrc.split("args[0] === 'start'")[1] ?? '';
109
- const closeSection = startSection.split("args[0] === 'close'")[0] ?? '';
110
- expect(closeSection).toContain('runSessionStart');
111
- expect(closeSection).not.toContain('runSetup(');
112
- });
113
- });
114
- describe('runSetup() (pb setup alias)', () => {
115
- beforeEach(() => {
116
- // Default to TTY=true so the human summary is exercised
117
- Object.defineProperty(process.stdout, 'isTTY', { value: true, configurable: true });
118
- });
119
- it('Phase 1 → triggers detect-surfaces, re-reads state, prints final state', async () => {
120
- // WP-433 S2: .claude dir triggers Claude surface detection → stampDetectedSurfaces
121
- // is called as a 3rd kernelCall (between recordSetupInvocation and the re-read).
122
- mkdirSync(join(scratch, '.claude'));
123
- mockedKernelCall
124
- .mockResolvedValueOnce({ ...SAMPLE, phase: 1 }) // initial getPbSetupState
125
- .mockResolvedValueOnce({ firstSetupInvocationAt: 1, alreadyRecorded: false }) // recordSetupInvocation
126
- .mockResolvedValueOnce({ stamped: true, surfaces: ['claude'] }) // stampDetectedSurfaces (WP-433 S2)
127
- .mockResolvedValueOnce({ ...SAMPLE, phase: 2 }); // re-read after detect
128
- await runSetup({ cwd: scratch });
129
- const stdout = stdoutSpy.mock.calls.map((c) => String(c[0])).join('');
130
- expect(stdout).toContain('"phase":2');
131
- });
132
- it('Phase 2+ → no auto-detect, prints initial state', async () => {
133
- const phase2 = { ...SAMPLE, phase: 2 };
134
- mockedKernelCall
135
- .mockResolvedValueOnce(phase2)
136
- .mockResolvedValueOnce({ firstSetupInvocationAt: 1, alreadyRecorded: true });
137
- await runSetup({ cwd: scratch });
138
- const calls = mockedKernelCall.mock.calls.map((c) => c[0]);
139
- expect(calls.filter((c) => c === 'setup.getPbSetupState')).toHaveLength(1);
140
- });
141
- it('records invocation exactly once per pb-setup invocation', async () => {
142
- const phase2 = { ...SAMPLE, phase: 2 };
143
- mockedKernelCall
144
- .mockResolvedValueOnce(phase2)
145
- .mockResolvedValueOnce({ firstSetupInvocationAt: 1, alreadyRecorded: false });
146
- await runSetup({ cwd: scratch });
147
- const invocationCalls = mockedKernelCall.mock.calls.filter((c) => c[0] === 'setup.recordSetupInvocation');
148
- expect(invocationCalls).toHaveLength(1);
149
- expect(invocationCalls[0][1]).toMatchObject({ surfaceCapability: 'cli' });
150
- });
151
- it('records invocation with chat-only when state.surfaceCapability=chat-only (WP-431 S3 review fix #1)', async () => {
152
- // Pre-revision: this test fabricated a `reasonForPhase` string the producer
153
- // never emits and asserted that the (now-deleted) `inferSurfaceCapability`
154
- // string-greppy heuristic returned 'chat-only'. The heuristic was broken
155
- // (producer never emits 'chat-only' in reasonForPhase), so every chat-only
156
- // user was silently tagged 'cli'. Post-revision, the resolver surfaces
157
- // `surfaceCapability` as a structural field — the CLI reads it directly.
158
- const chatOnly = {
159
- ...SAMPLE,
160
- phase: 3,
161
- role: 'creator',
162
- reasonForPhase: 'Phase 2 done (surface-skipped per DEC-993); catalogAdoptionCount=0 → Phase 3.',
163
- surfaceCapability: 'chat-only',
164
- };
165
- mockedKernelCall
166
- .mockResolvedValueOnce(chatOnly)
167
- .mockResolvedValueOnce({ firstSetupInvocationAt: 1, alreadyRecorded: false });
168
- await runSetup({ cwd: scratch });
169
- const invocationCalls = mockedKernelCall.mock.calls.filter((c) => c[0] === 'setup.recordSetupInvocation');
170
- expect(invocationCalls[0][1]).toMatchObject({ surfaceCapability: 'chat-only' });
171
- });
172
- it('chat-only resolver path: empty manifest + chat-only state → state.surfaceCapability="chat-only" (live resolver)', async () => {
173
- // WP-431 S3 review fix #1: assert the actual resolver emits surfaceCapability
174
- // structurally. This is a unit-level pin against the *resolver* (not the
175
- // CLI handler), so we exercise resolveSetupState directly with a
176
- // chat-only input shape that DOES occur in production
177
- // (manifest.surfaces=['mcp-only'] is the upstream stamp for chat-only
178
- // surfaces per DEC-993).
179
- const { resolveSetupState } = await import('../../setup/state-machine.js');
180
- const out = resolveSetupState({
181
- manifest: { surfaces: ['mcp-only'] },
182
- assetCounts: { totalAssets: 0, totalUnimported: 0, hasMore: false },
183
- catalogAdoptionCount: 0,
184
- confirmedEntryCount: 0,
185
- entriesAcrossCollections: 0,
186
- retrievalDemoConfirmed: false,
187
- workspaceMaterialized: false,
188
- userActivated: false,
189
- surfaceCapability: 'chat-only',
190
- });
191
- expect(out.surfaceCapability).toBe('chat-only');
192
- });
193
- });
194
- //# sourceMappingURL=setup-state.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup-state.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/setup-state.test.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- /**
2
- * pb migrate:setup — Migrate .productbrain/skills|rules|hooks/*.md into the DB as SSOT.
3
- *
4
- * WP-345 S0b: FS→DB migration command. Reads frontmatter from each .md file under
5
- * .productbrain/skills/, .productbrain/rules/, and .productbrain/hooks/, then upserts
6
- * each asset into the workspace's setup-assets collection via setup.ingestSetupAsset.
7
- *
8
- * Idempotent: re-running produces created/updated/unchanged counts, never duplicates.
9
- * The stable entryId per file: SETUP-{KIND}-{SCREAMING_SNAKE_CASE_FILENAME}
10
- *
11
- * Chain: WP-345, TEN-1459 (handshake reads FS — this fixes it).
12
- */
13
- export interface MigrateSetupOptions {
14
- cwd?: string;
15
- dryRun?: boolean;
16
- }
17
- export declare function runMigrateSetup(opts?: MigrateSetupOptions): Promise<void>;
18
- //# sourceMappingURL=migrate-setup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate-setup.d.ts","sourceRoot":"","sources":["../../src/commands/migrate-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAYH,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAmBD,wBAAsB,eAAe,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0JnF"}
@@ -1,162 +0,0 @@
1
- /**
2
- * pb migrate:setup — Migrate .productbrain/skills|rules|hooks/*.md into the DB as SSOT.
3
- *
4
- * WP-345 S0b: FS→DB migration command. Reads frontmatter from each .md file under
5
- * .productbrain/skills/, .productbrain/rules/, and .productbrain/hooks/, then upserts
6
- * each asset into the workspace's setup-assets collection via setup.ingestSetupAsset.
7
- *
8
- * Idempotent: re-running produces created/updated/unchanged counts, never duplicates.
9
- * The stable entryId per file: SETUP-{KIND}-{SCREAMING_SNAKE_CASE_FILENAME}
10
- *
11
- * Chain: WP-345, TEN-1459 (handshake reads FS — this fixes it).
12
- */
13
- import { existsSync, readdirSync, readFileSync } from 'node:fs';
14
- import { join, basename } from 'node:path';
15
- import { kernelCall } from '../lib/client.js';
16
- import { readSession } from '../lib/session.js';
17
- import { isJsonMode } from '../lib/runner.js';
18
- import { CLIError, ErrorCode } from '../lib/errors.js';
19
- import { trackEvent } from '../lib/telemetry.js';
20
- import { parseSetupFrontmatter } from '../lib/frontmatter.js';
21
- /**
22
- * Derive a stable entryId from the filename and assetKind.
23
- * Example: skills/triage.md, kind=skill → SETUP-SKILL-TRIAGE
24
- */
25
- function deriveEntryId(filename, kind) {
26
- const base = basename(filename, '.md');
27
- const snakeCase = base.toUpperCase().replace(/[^A-Z0-9]+/g, '_');
28
- return `SETUP-${kind.toUpperCase()}-${snakeCase}`;
29
- }
30
- export async function runMigrateSetup(opts = {}) {
31
- const cwd = opts.cwd ?? process.cwd();
32
- const dryRun = opts.dryRun ?? false;
33
- const json = isJsonMode();
34
- const session = readSession();
35
- if (!session?.workspaceId) {
36
- throw new CLIError('No active session found. Run `pb session start` first.', { code: ErrorCode.SESSION_REQUIRED, category: 'session' });
37
- }
38
- // The workspaceId below comes FROM the marker, so a marker left over from a different binding
39
- // writes to the OLD workspace while the gateway derives the new one from the key (BR-18). This
40
- // used to need a hand-duplicated guard call here because kernelCall's write below carried no
41
- // binding check of its own — WP-711/712 moved that guard into kernelCall itself, so the write
42
- // below now refuses on a moved pin without this file doing anything extra.
43
- const workspaceId = session.workspaceId;
44
- const pbDir = join(cwd, '.productbrain');
45
- if (!existsSync(pbDir)) {
46
- throw new CLIError('.productbrain directory not found. Run from a repo root containing a .productbrain directory.', { code: ErrorCode.VALIDATION_FAILED, category: 'validation' });
47
- }
48
- // Collect all .md files per kind
49
- const kinds = [
50
- { dir: join(pbDir, 'skills'), kind: 'skill' },
51
- { dir: join(pbDir, 'rules'), kind: 'rule' },
52
- { dir: join(pbDir, 'hooks'), kind: 'hook' },
53
- ];
54
- const assets = [];
55
- for (const { dir, kind } of kinds) {
56
- if (!existsSync(dir))
57
- continue;
58
- const files = readdirSync(dir).filter((f) => f.endsWith('.md'));
59
- for (const file of files) {
60
- const filePath = join(dir, file);
61
- const raw = readFileSync(filePath, 'utf-8');
62
- const { name, description, body, triggers, semanticRefs } = parseSetupFrontmatter(raw);
63
- const entryId = deriveEntryId(file, kind);
64
- assets.push({
65
- entryId,
66
- name: name || basename(file, '.md'),
67
- description,
68
- body,
69
- assetKind: kind,
70
- triggers,
71
- semanticRefs,
72
- filename: file,
73
- });
74
- }
75
- }
76
- if (assets.length === 0) {
77
- const msg = 'No .md files found in .productbrain/skills/, rules/, or hooks/. Nothing to migrate.';
78
- if (json) {
79
- process.stdout.write(JSON.stringify({ ok: true, message: msg, created: 0, updated: 0, unchanged: 0 }) + '\n');
80
- }
81
- else {
82
- process.stdout.write(msg + '\n');
83
- }
84
- return;
85
- }
86
- if (dryRun) {
87
- const msg = `[dry-run] Would migrate ${assets.length} assets. Use without --dry-run to apply.`;
88
- if (json) {
89
- process.stdout.write(JSON.stringify({ ok: true, dryRun: true, total: assets.length, assets: assets.map((a) => ({ entryId: a.entryId, name: a.name, assetKind: a.assetKind })) }) + '\n');
90
- }
91
- else {
92
- process.stdout.write(msg + '\n');
93
- for (const a of assets) {
94
- process.stdout.write(` ${a.entryId} ${a.name} (${a.assetKind})\n`);
95
- }
96
- }
97
- return;
98
- }
99
- // Upsert each asset via setup.ingestSetupAsset
100
- let created = 0;
101
- let updated = 0;
102
- let unchanged = 0;
103
- const errors = [];
104
- for (const asset of assets) {
105
- try {
106
- const result = await kernelCall('setup.ingestSetupAsset', {
107
- workspaceId,
108
- entryId: asset.entryId,
109
- name: asset.name,
110
- description: asset.description,
111
- body: asset.body,
112
- assetKind: asset.assetKind,
113
- triggers: asset.triggers,
114
- semanticRefs: asset.semanticRefs,
115
- });
116
- if (result.action === 'created')
117
- created++;
118
- else if (result.action === 'updated')
119
- updated++;
120
- else
121
- unchanged++;
122
- if (!json) {
123
- const icon = result.action === 'created' ? '+' : result.action === 'updated' ? '~' : '=';
124
- process.stdout.write(` [${icon}] ${asset.entryId} (${result.action})\n`);
125
- }
126
- }
127
- catch (err) {
128
- // WP-712 review fix (Cursor Bugbot, PR #810): a moved-pin refusal fires identically on
129
- // EVERY remaining asset in this loop — the binding condition doesn't change per-item.
130
- // Swallowing it into the per-asset error list turned one clear SESSION_REQUIRED refusal
131
- // (with `pb session start` guidance) into N generic INTERNAL "completed with N error(s)"
132
- // entries, burying the one thing the caller actually needs to do. A session/binding
133
- // refusal escapes the loop immediately instead of being treated as a per-item ingest
134
- // failure — mirrors how setup-ingest.ts's single-file path already rethrows unchanged.
135
- if (err instanceof CLIError && err.code === ErrorCode.SESSION_REQUIRED)
136
- throw err;
137
- const msg = err instanceof Error ? err.message : String(err);
138
- errors.push({ entryId: asset.entryId, error: msg });
139
- if (!json) {
140
- process.stderr.write(` [!] ${asset.entryId} ERROR: ${msg}\n`);
141
- }
142
- }
143
- }
144
- if (json) {
145
- process.stdout.write(JSON.stringify({ ok: errors.length === 0, created, updated, unchanged, errors }) + '\n');
146
- }
147
- else {
148
- process.stdout.write(`\nMigration complete: ${created} created, ${updated} updated, ${unchanged} unchanged.\n`);
149
- if (errors.length > 0) {
150
- process.stderr.write(`${errors.length} error(s) — check output above.\n`);
151
- }
152
- }
153
- // NG11: emit observability event caller-side (WP-345)
154
- trackEvent('setup.migration.completed', { created, updated, unchanged, errorCount: errors.length });
155
- if (errors.length > 0) {
156
- throw new CLIError(`migrate:setup completed with ${errors.length} error(s).`, {
157
- code: ErrorCode.INTERNAL,
158
- category: 'internal',
159
- });
160
- }
161
- }
162
- //# sourceMappingURL=migrate-setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate-setup.js","sourceRoot":"","sources":["../../src/commands/migrate-setup.ts"],"names":[],"mappings":"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"}
@@ -1,59 +0,0 @@
1
- /**
2
- * `pb setup-audit` — WP-439 S2 (audit) + S3 (--repair).
3
- *
4
- * Operator preflight for handshake: classifies every setup_asset row in the
5
- * caller's active workspace and surfaces orphaned bodies BEFORE handshake
6
- * runs. With --repair, attempts a transactional fix for each orphan that has
7
- * a canonical body in STARTER_* (class III and class II rows).
8
- *
9
- * Modes:
10
- * pb setup-audit — human table; exit 1 if orphans > 0.
11
- * pb setup-audit --json — machine-readable JSON; exit 1 if orphans > 0.
12
- * pb setup-audit --repair — audit + attempt repair on III/II rows.
13
- * Exit 1 if any repair genuinely fails (not
14
- * counted: 'unrecoverable' — those are
15
- * expected when no STARTER_* match exists).
16
- *
17
- * Server contract (see convex/setup.ts:auditAssetBodies, repairAssetBody):
18
- * - Gateway derives workspaceId from the API key / JWT (injectSessionAuth).
19
- * - Audit returns { summary, rows[] }. See `AuditResult` below.
20
- * - Repair returns { status, newBodyStorageId, error, receiptId }.
21
- *
22
- * Notes:
23
- * - Class 'i_inline_only' rows are NOT repaired by this slice (their body
24
- * recovery comes from the inline `data.body` via a future bet, not from
25
- * STARTER_*).
26
- * - Class 'iv_hash_drift' rows are NOT repaired by this slice (out of scope
27
- * for S3; resolution is per-row operator review).
28
- *
29
- * Auth: requires `pb login` / API key. No active write session needed.
30
- */
31
- export interface AuditRow {
32
- entryId: string;
33
- entryDocId: string;
34
- assetKind: 'skill' | 'rule' | 'hook' | 'bundle';
35
- name: string;
36
- class: 'ok' | 'i_inline_only' | 'ii_unrecoverable' | 'iii_blob_missing' | 'iv_hash_drift';
37
- bodyStorageId: string | null;
38
- inlineBytes: number;
39
- }
40
- export interface AuditResult {
41
- summary: {
42
- total: number;
43
- ok: number;
44
- orphans: number;
45
- byClass: {
46
- i: number;
47
- ii: number;
48
- iii: number;
49
- iv: number;
50
- };
51
- };
52
- rows: AuditRow[];
53
- }
54
- export interface RunSetupAuditOptions {
55
- json?: boolean;
56
- repair?: boolean;
57
- }
58
- export declare function runSetupAudit(opts?: RunSetupAuditOptions): Promise<void>;
59
- //# sourceMappingURL=setup-audit.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup-audit.d.ts","sourceRoot":"","sources":["../../src/commands/setup-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAmBH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,IAAI,GAAG,eAAe,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,eAAe,CAAC;IAC1F,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC;KAC7D,CAAC;IACF,IAAI,EAAE,QAAQ,EAAE,CAAC;CAClB;AAsKD,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAcD,wBAAsB,aAAa,CAAC,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8FlF"}