@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.
- package/dist/__tests__/onboarding.test.js +4 -1
- package/dist/__tests__/onboarding.test.js.map +1 -1
- package/dist/__tests__/session-close-loop.test.js +0 -2
- package/dist/__tests__/session-close-loop.test.js.map +1 -1
- package/dist/commands/handshake.js +2 -2
- package/dist/commands/handshake.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +2 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +0 -18
- package/dist/commands/session.js.map +1 -1
- package/dist/formatters/digest.d.ts.map +1 -1
- package/dist/formatters/digest.js +9 -5
- package/dist/formatters/digest.js.map +1 -1
- package/dist/index.js +1 -62
- package/dist/index.js.map +1 -1
- package/dist/lib/onboarding-shared.d.ts.map +1 -1
- package/dist/lib/onboarding-shared.js +8 -9
- package/dist/lib/onboarding-shared.js.map +1 -1
- package/dist/lib/onboarding-topics.js +1 -1
- package/dist/lib/onboarding.d.ts.map +1 -1
- package/dist/lib/onboarding.js +7 -13
- package/dist/lib/onboarding.js.map +1 -1
- package/package.json +1 -1
- package/dist/__tests__/migrate-setup-session-refusal.test.d.ts +0 -2
- package/dist/__tests__/migrate-setup-session-refusal.test.d.ts.map +0 -1
- package/dist/__tests__/migrate-setup-session-refusal.test.js +0 -65
- package/dist/__tests__/migrate-setup-session-refusal.test.js.map +0 -1
- package/dist/__tests__/setup-ingest.test.d.ts +0 -2
- package/dist/__tests__/setup-ingest.test.d.ts.map +0 -1
- package/dist/__tests__/setup-ingest.test.js +0 -71
- package/dist/__tests__/setup-ingest.test.js.map +0 -1
- package/dist/__tests__/setup-resolver.test.d.ts +0 -14
- package/dist/__tests__/setup-resolver.test.d.ts.map +0 -1
- package/dist/__tests__/setup-resolver.test.js +0 -228
- package/dist/__tests__/setup-resolver.test.js.map +0 -1
- package/dist/__tests__/setupShFallbackWarning.test.d.ts +0 -2
- package/dist/__tests__/setupShFallbackWarning.test.d.ts.map +0 -1
- package/dist/__tests__/setupShFallbackWarning.test.js +0 -15
- package/dist/__tests__/setupShFallbackWarning.test.js.map +0 -1
- package/dist/commands/__tests__/setup-detect-surfaces.test.d.ts +0 -15
- package/dist/commands/__tests__/setup-detect-surfaces.test.d.ts.map +0 -1
- package/dist/commands/__tests__/setup-detect-surfaces.test.js +0 -149
- package/dist/commands/__tests__/setup-detect-surfaces.test.js.map +0 -1
- package/dist/commands/__tests__/setup-state.test.d.ts +0 -2
- package/dist/commands/__tests__/setup-state.test.d.ts.map +0 -1
- package/dist/commands/__tests__/setup-state.test.js +0 -194
- package/dist/commands/__tests__/setup-state.test.js.map +0 -1
- package/dist/commands/migrate-setup.d.ts +0 -18
- package/dist/commands/migrate-setup.d.ts.map +0 -1
- package/dist/commands/migrate-setup.js +0 -162
- package/dist/commands/migrate-setup.js.map +0 -1
- package/dist/commands/setup-audit.d.ts +0 -59
- package/dist/commands/setup-audit.d.ts.map +0 -1
- package/dist/commands/setup-audit.js +0 -250
- package/dist/commands/setup-audit.js.map +0 -1
- package/dist/commands/setup-detect-surfaces.d.ts +0 -38
- package/dist/commands/setup-detect-surfaces.d.ts.map +0 -1
- package/dist/commands/setup-detect-surfaces.js +0 -76
- package/dist/commands/setup-detect-surfaces.js.map +0 -1
- package/dist/commands/setup-ingest.d.ts +0 -17
- package/dist/commands/setup-ingest.d.ts.map +0 -1
- package/dist/commands/setup-ingest.js +0 -179
- package/dist/commands/setup-ingest.js.map +0 -1
- package/dist/commands/setup-resolver.d.ts +0 -58
- package/dist/commands/setup-resolver.d.ts.map +0 -1
- package/dist/commands/setup-resolver.js +0 -150
- package/dist/commands/setup-resolver.js.map +0 -1
- package/dist/commands/setup-state.d.ts +0 -42
- package/dist/commands/setup-state.d.ts.map +0 -1
- package/dist/commands/setup-state.js +0 -93
- package/dist/commands/setup-state.js.map +0 -1
- package/dist/commands/setup.d.ts +0 -23
- package/dist/commands/setup.d.ts.map +0 -1
- package/dist/commands/setup.js +0 -69
- package/dist/commands/setup.js.map +0 -1
- package/dist/setup/__tests__/coach-traces.test.d.ts +0 -2
- package/dist/setup/__tests__/coach-traces.test.d.ts.map +0 -1
- package/dist/setup/__tests__/coach-traces.test.js +0 -189
- package/dist/setup/__tests__/coach-traces.test.js.map +0 -1
- package/dist/setup/__tests__/setup-commands.test.d.ts +0 -2
- package/dist/setup/__tests__/setup-commands.test.d.ts.map +0 -1
- package/dist/setup/__tests__/setup-commands.test.js +0 -177
- package/dist/setup/__tests__/setup-commands.test.js.map +0 -1
- package/dist/setup/__tests__/state-machine.test.d.ts +0 -2
- package/dist/setup/__tests__/state-machine.test.d.ts.map +0 -1
- package/dist/setup/__tests__/state-machine.test.js +0 -341
- package/dist/setup/__tests__/state-machine.test.js.map +0 -1
- package/dist/setup/detect-surfaces.d.ts +0 -21
- package/dist/setup/detect-surfaces.d.ts.map +0 -1
- package/dist/setup/detect-surfaces.js +0 -39
- package/dist/setup/detect-surfaces.js.map +0 -1
- package/dist/setup/manifest-writer.d.ts +0 -17
- package/dist/setup/manifest-writer.d.ts.map +0 -1
- package/dist/setup/manifest-writer.js +0 -153
- package/dist/setup/manifest-writer.js.map +0 -1
- package/dist/setup/state-machine.d.ts +0 -67
- package/dist/setup/state-machine.d.ts.map +0 -1
- package/dist/setup/state-machine.js +0 -124
- 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"}
|