@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,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WP-712 review fix (Cursor Bugbot, PR #810) — a moved-pin refusal from the shared kernelCall
|
|
3
|
-
* guard fires identically on every remaining asset in `runMigrateSetup`'s per-asset loop. Before
|
|
4
|
-
* the fix, the per-item try/catch swallowed it N times into `errors[]` and the command exited
|
|
5
|
-
* with a generic INTERNAL "completed with N error(s)", burying the `pb session start` guidance.
|
|
6
|
-
* This proves a SESSION_REQUIRED refusal now escapes the loop as ONE clean CLIError instead.
|
|
7
|
-
*/
|
|
8
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
9
|
-
import { CLIError, ErrorCode } from '../lib/errors.js';
|
|
10
|
-
const kernelCallMock = vi.fn();
|
|
11
|
-
const trackEventMock = vi.fn();
|
|
12
|
-
const { fileContents } = vi.hoisted(() => ({
|
|
13
|
-
fileContents: {},
|
|
14
|
-
}));
|
|
15
|
-
vi.mock('node:fs', () => ({
|
|
16
|
-
existsSync: vi.fn((path) => path in fileContents || path === '/repo/.productbrain' || path === '/repo/.productbrain/skills'),
|
|
17
|
-
readdirSync: vi.fn((dir) => {
|
|
18
|
-
if (dir === '/repo/.productbrain/skills')
|
|
19
|
-
return ['one.md', 'two.md'];
|
|
20
|
-
return [];
|
|
21
|
-
}),
|
|
22
|
-
readFileSync: vi.fn((path) => fileContents[path] ?? '---\nname: Asset\n---\nBody'),
|
|
23
|
-
}));
|
|
24
|
-
vi.mock('../lib/client.js', () => ({
|
|
25
|
-
kernelCall: (...args) => kernelCallMock(...args),
|
|
26
|
-
}));
|
|
27
|
-
vi.mock('../lib/session.js', () => ({
|
|
28
|
-
readSession: vi.fn(() => ({
|
|
29
|
-
sessionId: 'sess-1',
|
|
30
|
-
workspaceId: 'workspace-1',
|
|
31
|
-
workspaceName: 'Test Workspace',
|
|
32
|
-
startedAt: new Date(0).toISOString(),
|
|
33
|
-
entriesCaptured: [],
|
|
34
|
-
})),
|
|
35
|
-
}));
|
|
36
|
-
vi.mock('../lib/runner.js', () => ({
|
|
37
|
-
isJsonMode: vi.fn(() => true),
|
|
38
|
-
}));
|
|
39
|
-
vi.mock('../lib/telemetry.js', () => ({
|
|
40
|
-
trackEvent: (...args) => trackEventMock(...args),
|
|
41
|
-
}));
|
|
42
|
-
import { runMigrateSetup } from '../commands/migrate-setup.js';
|
|
43
|
-
describe('runMigrateSetup — session refusal escapes the per-asset loop', () => {
|
|
44
|
-
let cwdSpy;
|
|
45
|
-
beforeEach(() => {
|
|
46
|
-
vi.clearAllMocks();
|
|
47
|
-
cwdSpy = vi.spyOn(process, 'cwd').mockReturnValue('/repo');
|
|
48
|
-
});
|
|
49
|
-
afterEach(() => {
|
|
50
|
-
cwdSpy.mockRestore();
|
|
51
|
-
});
|
|
52
|
-
it('rethrows a SESSION_REQUIRED refusal as ONE CLIError, not N accumulated per-asset errors', async () => {
|
|
53
|
-
const refusal = new CLIError('The workspace credential changed after this session started — expected "A", found "B" — so this call would land in a different workspace than the session belongs to.', { code: ErrorCode.SESSION_REQUIRED, category: 'session', guidance: 'Run `pb session start` to open a session against the current workspace.' });
|
|
54
|
-
kernelCallMock.mockRejectedValue(refusal);
|
|
55
|
-
await expect(runMigrateSetup({})).rejects.toBe(refusal);
|
|
56
|
-
// Escapes on the FIRST asset — it must not run through both assets accumulating errors.
|
|
57
|
-
expect(kernelCallMock).toHaveBeenCalledTimes(1);
|
|
58
|
-
});
|
|
59
|
-
it('still accumulates a genuine per-asset failure (not a session refusal) across every asset', async () => {
|
|
60
|
-
kernelCallMock.mockRejectedValue(new Error('server validation failed'));
|
|
61
|
-
await expect(runMigrateSetup({})).rejects.toThrow('migrate:setup completed with 2 error(s)');
|
|
62
|
-
expect(kernelCallMock).toHaveBeenCalledTimes(2);
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
//# sourceMappingURL=migrate-setup-session-refusal.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-setup-session-refusal.test.js","sourceRoot":"","sources":["../../src/__tests__/migrate-setup-session-refusal.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup-ingest.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup-ingest.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
const kernelCallMock = vi.fn();
|
|
3
|
-
const trackEventMock = vi.fn();
|
|
4
|
-
const { fileContents } = vi.hoisted(() => ({
|
|
5
|
-
fileContents: {},
|
|
6
|
-
}));
|
|
7
|
-
vi.mock('node:fs', () => ({
|
|
8
|
-
existsSync: vi.fn((path) => path in fileContents),
|
|
9
|
-
readFileSync: vi.fn((path) => fileContents[path]),
|
|
10
|
-
}));
|
|
11
|
-
vi.mock('../lib/client.js', () => ({
|
|
12
|
-
kernelCall: (...args) => kernelCallMock(...args),
|
|
13
|
-
}));
|
|
14
|
-
vi.mock('../lib/session.js', () => ({
|
|
15
|
-
readSession: vi.fn(() => ({
|
|
16
|
-
sessionId: 'sess-1',
|
|
17
|
-
workspaceId: 'workspace-1',
|
|
18
|
-
workspaceName: 'Test Workspace',
|
|
19
|
-
startedAt: new Date(0).toISOString(),
|
|
20
|
-
entriesCaptured: [],
|
|
21
|
-
})),
|
|
22
|
-
}));
|
|
23
|
-
vi.mock('../lib/runner.js', () => ({
|
|
24
|
-
isJsonMode: vi.fn(() => false),
|
|
25
|
-
}));
|
|
26
|
-
vi.mock('../lib/telemetry.js', () => ({
|
|
27
|
-
trackEvent: (...args) => trackEventMock(...args),
|
|
28
|
-
}));
|
|
29
|
-
import { runSetupIngest } from '../commands/setup-ingest.js';
|
|
30
|
-
describe('runSetupIngest', () => {
|
|
31
|
-
let cwdSpy;
|
|
32
|
-
beforeEach(() => {
|
|
33
|
-
vi.clearAllMocks();
|
|
34
|
-
Object.keys(fileContents).forEach((key) => delete fileContents[key]);
|
|
35
|
-
cwdSpy = vi.spyOn(process, 'cwd').mockReturnValue('/repo');
|
|
36
|
-
});
|
|
37
|
-
afterEach(() => {
|
|
38
|
-
cwdSpy.mockRestore();
|
|
39
|
-
});
|
|
40
|
-
it('rejects bundle assets before calling generic setup ingest even under a skills directory', async () => {
|
|
41
|
-
fileContents['/repo/skills/bundle.md'] = `---
|
|
42
|
-
name: Demo Bundle
|
|
43
|
-
assetKind: bundle
|
|
44
|
-
---
|
|
45
|
-
# Demo Bundle
|
|
46
|
-
`;
|
|
47
|
-
await expect(runSetupIngest('skills/bundle.md')).rejects.toThrow('Bundle assets must be committed via the UI');
|
|
48
|
-
expect(kernelCallMock).not.toHaveBeenCalled();
|
|
49
|
-
expect(trackEventMock).toHaveBeenCalledWith('setup.bundle.commit.failed', {
|
|
50
|
-
reason: 'bundle_cli_not_supported',
|
|
51
|
-
path: '/repo/skills/bundle.md',
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
it('forwards frontmatter id to setup.ingestSetupAsset', async () => {
|
|
55
|
-
kernelCallMock.mockResolvedValue({ action: 'created', entryId: 'SETUP-SKILL-FM' });
|
|
56
|
-
fileContents['/repo/.productbrain/skills/local.md'] = `---
|
|
57
|
-
id: SETUP-SKILL-FM
|
|
58
|
-
name: Local
|
|
59
|
-
---
|
|
60
|
-
# Local
|
|
61
|
-
`;
|
|
62
|
-
await runSetupIngest('.productbrain/skills/local.md');
|
|
63
|
-
expect(kernelCallMock).toHaveBeenCalledWith('setup.ingestSetupAsset', expect.objectContaining({
|
|
64
|
-
entryId: 'SETUP-SKILL-LOCAL',
|
|
65
|
-
frontmatterId: 'SETUP-SKILL-FM',
|
|
66
|
-
name: 'Local',
|
|
67
|
-
assetKind: 'skill',
|
|
68
|
-
}));
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
//# sourceMappingURL=setup-ingest.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup-ingest.test.js","sourceRoot":"","sources":["../../src/__tests__/setup-ingest.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WP-336 E2 — setup-resolver contract tests.
|
|
3
|
-
*
|
|
4
|
-
* Three test groups:
|
|
5
|
-
* 1. getSetupMode() — reads PB_SETUP_MODE env var correctly
|
|
6
|
-
* 2. local mode — resolveSetupAssets returns assets from .productbrain/
|
|
7
|
-
* 3. chain mode — resolveSetupAssets calls kernelCall with the right args
|
|
8
|
-
*
|
|
9
|
-
* Done-when coverage:
|
|
10
|
-
* - WP-336 #3: local mode returns same asset names as what's in .productbrain/
|
|
11
|
-
* - WP-336 #2: chain mode calls kernelCall('setup.getActiveSurface', {...})
|
|
12
|
-
*/
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=setup-resolver.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup-resolver.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup-resolver.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WP-336 E2 — setup-resolver contract tests.
|
|
3
|
-
*
|
|
4
|
-
* Three test groups:
|
|
5
|
-
* 1. getSetupMode() — reads PB_SETUP_MODE env var correctly
|
|
6
|
-
* 2. local mode — resolveSetupAssets returns assets from .productbrain/
|
|
7
|
-
* 3. chain mode — resolveSetupAssets calls kernelCall with the right args
|
|
8
|
-
*
|
|
9
|
-
* Done-when coverage:
|
|
10
|
-
* - WP-336 #3: local mode returns same asset names as what's in .productbrain/
|
|
11
|
-
* - WP-336 #2: chain mode calls kernelCall('setup.getActiveSurface', {...})
|
|
12
|
-
*/
|
|
13
|
-
import { beforeEach, afterEach, describe, expect, it, vi } from 'vitest';
|
|
14
|
-
import { join } from 'path';
|
|
15
|
-
// ── VFS (virtual filesystem) ──────────────────────────────────────────────────
|
|
16
|
-
// Declared with vi.hoisted so the mock factory can reference them.
|
|
17
|
-
const { vfs } = vi.hoisted(() => ({
|
|
18
|
-
vfs: {},
|
|
19
|
-
}));
|
|
20
|
-
vi.mock('fs', () => ({
|
|
21
|
-
existsSync: vi.fn((p) => {
|
|
22
|
-
// A path "exists" if it's directly in the VFS (file) or is a directory prefix of any VFS key.
|
|
23
|
-
if (p in vfs)
|
|
24
|
-
return true;
|
|
25
|
-
const prefix = p.endsWith('/') ? p : p + '/';
|
|
26
|
-
return Object.keys(vfs).some((k) => k.startsWith(prefix));
|
|
27
|
-
}),
|
|
28
|
-
readdirSync: vi.fn((p) => {
|
|
29
|
-
// Return the basenames of direct children under <p> (no sub-directories).
|
|
30
|
-
const prefix = p.endsWith('/') ? p : p + '/';
|
|
31
|
-
const keys = Object.keys(vfs).filter((k) => k.startsWith(prefix) && !k.slice(prefix.length).includes('/'));
|
|
32
|
-
return keys.map((k) => k.slice(prefix.length));
|
|
33
|
-
}),
|
|
34
|
-
readFileSync: vi.fn((p, _enc) => {
|
|
35
|
-
if (p in vfs)
|
|
36
|
-
return vfs[p];
|
|
37
|
-
throw Object.assign(new Error(`ENOENT: no such file '${p}'`), { code: 'ENOENT' });
|
|
38
|
-
}),
|
|
39
|
-
}));
|
|
40
|
-
// ── Module under test ─────────────────────────────────────────────────────────
|
|
41
|
-
import { getSetupMode, resolveSetupAssets } from '../commands/setup-resolver.js';
|
|
42
|
-
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
43
|
-
const MOCK_CWD = '/tmp/resolver-test';
|
|
44
|
-
const PB_DIR = join(MOCK_CWD, '.productbrain');
|
|
45
|
-
const SKILLS_DIR = join(PB_DIR, 'skills');
|
|
46
|
-
const RULES_DIR = join(PB_DIR, 'rules');
|
|
47
|
-
/** Populate VFS with a fake skill file. */
|
|
48
|
-
function seedSkill(name, body) {
|
|
49
|
-
vfs[join(SKILLS_DIR, `${name}.md`)] = body;
|
|
50
|
-
}
|
|
51
|
-
/** Populate VFS with a fake rule file. */
|
|
52
|
-
function seedRule(name, body) {
|
|
53
|
-
vfs[join(RULES_DIR, `${name}.md`)] = body;
|
|
54
|
-
}
|
|
55
|
-
/** No-op kernelCall stub (used when we don't expect it to be called). */
|
|
56
|
-
const noopKernel = vi.fn();
|
|
57
|
-
// ── Tests ─────────────────────────────────────────────────────────────────────
|
|
58
|
-
describe('getSetupMode()', () => {
|
|
59
|
-
const originalEnv = process.env.PB_SETUP_MODE;
|
|
60
|
-
afterEach(() => {
|
|
61
|
-
if (originalEnv === undefined) {
|
|
62
|
-
delete process.env.PB_SETUP_MODE;
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
process.env.PB_SETUP_MODE = originalEnv;
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
it('returns "local" when PB_SETUP_MODE is unset', () => {
|
|
69
|
-
delete process.env.PB_SETUP_MODE;
|
|
70
|
-
expect(getSetupMode()).toBe('local');
|
|
71
|
-
});
|
|
72
|
-
it('returns "local" when PB_SETUP_MODE=local', () => {
|
|
73
|
-
process.env.PB_SETUP_MODE = 'local';
|
|
74
|
-
expect(getSetupMode()).toBe('local');
|
|
75
|
-
});
|
|
76
|
-
it('returns "chain" when PB_SETUP_MODE=chain', () => {
|
|
77
|
-
process.env.PB_SETUP_MODE = 'chain';
|
|
78
|
-
expect(getSetupMode()).toBe('chain');
|
|
79
|
-
});
|
|
80
|
-
it('returns "local" for unknown values (fail-open)', () => {
|
|
81
|
-
process.env.PB_SETUP_MODE = 'unknown-value';
|
|
82
|
-
expect(getSetupMode()).toBe('local');
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
describe('resolveSetupAssets — local mode', () => {
|
|
86
|
-
beforeEach(() => {
|
|
87
|
-
Object.keys(vfs).forEach((k) => delete vfs[k]);
|
|
88
|
-
// Reset call counts only — do NOT clearAllMocks() as that wipes fs mock implementations
|
|
89
|
-
noopKernel.mockClear();
|
|
90
|
-
});
|
|
91
|
-
it('returns an empty array when .productbrain/ has no skills or rules', async () => {
|
|
92
|
-
// existsSync returns false for all paths (vfs is empty)
|
|
93
|
-
const assets = await resolveSetupAssets('local', noopKernel, MOCK_CWD);
|
|
94
|
-
expect(assets).toEqual([]);
|
|
95
|
-
expect(noopKernel).not.toHaveBeenCalled();
|
|
96
|
-
});
|
|
97
|
-
it('returns skill assets from .productbrain/skills/', async () => {
|
|
98
|
-
seedSkill('triage', '# Triage\nClassify and route work.');
|
|
99
|
-
seedSkill('review', '# Review\nFive-path trace.');
|
|
100
|
-
const assets = await resolveSetupAssets('local', noopKernel, MOCK_CWD);
|
|
101
|
-
const skillAssets = assets.filter((a) => a.assetKind === 'skill');
|
|
102
|
-
const skillNames = skillAssets.map((a) => a.displayName);
|
|
103
|
-
expect(skillNames).toContain('triage');
|
|
104
|
-
expect(skillNames).toContain('review');
|
|
105
|
-
expect(noopKernel).not.toHaveBeenCalled();
|
|
106
|
-
});
|
|
107
|
-
it('returns rule assets from .productbrain/rules/', async () => {
|
|
108
|
-
seedRule('git-workflow', '# Git Workflow\nTwo-track development.');
|
|
109
|
-
const assets = await resolveSetupAssets('local', noopKernel, MOCK_CWD);
|
|
110
|
-
const ruleAssets = assets.filter((a) => a.assetKind === 'rule');
|
|
111
|
-
expect(ruleAssets).toHaveLength(1);
|
|
112
|
-
expect(ruleAssets[0].displayName).toBe('git-workflow');
|
|
113
|
-
expect(ruleAssets[0].assetKind).toBe('rule');
|
|
114
|
-
expect(ruleAssets[0].source).toBe('authored');
|
|
115
|
-
});
|
|
116
|
-
it('strips frontmatter from skill body', async () => {
|
|
117
|
-
seedSkill('commit', '---\nname: commit\ndescription: Commit skill\n---\n# Commit\nVerify and push.');
|
|
118
|
-
const assets = await resolveSetupAssets('local', noopKernel, MOCK_CWD);
|
|
119
|
-
const commitSkill = assets.find((a) => a.displayName === 'commit');
|
|
120
|
-
expect(commitSkill).toBeDefined();
|
|
121
|
-
// Body should not include the frontmatter block
|
|
122
|
-
expect(commitSkill.body).not.toContain('description: Commit skill');
|
|
123
|
-
expect(commitSkill.body).toContain('# Commit');
|
|
124
|
-
});
|
|
125
|
-
it('returns skills + rules together', async () => {
|
|
126
|
-
seedSkill('triage', '# Triage');
|
|
127
|
-
seedRule('git-workflow', '# Git Workflow');
|
|
128
|
-
const assets = await resolveSetupAssets('local', noopKernel, MOCK_CWD);
|
|
129
|
-
const kinds = assets.map((a) => a.assetKind);
|
|
130
|
-
expect(kinds).toContain('skill');
|
|
131
|
-
expect(kinds).toContain('rule');
|
|
132
|
-
});
|
|
133
|
-
it('contract test — local asset displayNames match .productbrain/ file basenames', async () => {
|
|
134
|
-
// WP-336 done-when #3: local mode produces asset names identical to what's in .productbrain/
|
|
135
|
-
const expectedSkills = ['diagnostic-fix', 'handoff', 'preflight'];
|
|
136
|
-
const expectedRules = ['chain-policies', 'git-workflow', 'architecture-boundaries'];
|
|
137
|
-
for (const name of expectedSkills)
|
|
138
|
-
seedSkill(name, `# ${name}`);
|
|
139
|
-
for (const name of expectedRules)
|
|
140
|
-
seedRule(name, `# ${name}`);
|
|
141
|
-
const assets = await resolveSetupAssets('local', noopKernel, MOCK_CWD);
|
|
142
|
-
const assetSkillNames = assets
|
|
143
|
-
.filter((a) => a.assetKind === 'skill')
|
|
144
|
-
.map((a) => a.displayName);
|
|
145
|
-
const assetRuleNames = assets
|
|
146
|
-
.filter((a) => a.assetKind === 'rule')
|
|
147
|
-
.map((a) => a.displayName);
|
|
148
|
-
for (const name of expectedSkills)
|
|
149
|
-
expect(assetSkillNames).toContain(name);
|
|
150
|
-
for (const name of expectedRules)
|
|
151
|
-
expect(assetRuleNames).toContain(name);
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
describe('resolveSetupAssets — chain mode', () => {
|
|
155
|
-
beforeEach(() => {
|
|
156
|
-
Object.keys(vfs).forEach((k) => delete vfs[k]);
|
|
157
|
-
// Reset call counts only — do NOT clearAllMocks() as that wipes fs mock implementations
|
|
158
|
-
});
|
|
159
|
-
it('calls kernelCall with "setup.getActiveSurface" (WP-336 done-when #2)', async () => {
|
|
160
|
-
const mockKernel = vi.fn().mockResolvedValue([]);
|
|
161
|
-
await resolveSetupAssets('chain', mockKernel, MOCK_CWD);
|
|
162
|
-
expect(mockKernel).toHaveBeenCalledWith('setup.getActiveSurface', expect.any(Object));
|
|
163
|
-
});
|
|
164
|
-
it('does NOT read from .productbrain/ in chain mode', async () => {
|
|
165
|
-
seedSkill('triage', '# Triage');
|
|
166
|
-
const mockKernel = vi.fn().mockResolvedValue([]);
|
|
167
|
-
// Track readFileSync calls from this point forward
|
|
168
|
-
const { readFileSync } = await import('fs');
|
|
169
|
-
readFileSync.mockClear();
|
|
170
|
-
await resolveSetupAssets('chain', mockKernel, MOCK_CWD);
|
|
171
|
-
// readFileSync should not be called in chain mode (only kernelCall)
|
|
172
|
-
expect(readFileSync).not.toHaveBeenCalled();
|
|
173
|
-
});
|
|
174
|
-
it('maps chain results to SetupAsset shape', async () => {
|
|
175
|
-
const chainResult = [
|
|
176
|
-
{
|
|
177
|
-
assetId: 'SETUP-SKILL-TRIAGE',
|
|
178
|
-
assetKind: 'skill',
|
|
179
|
-
displayName: 'Triage',
|
|
180
|
-
shortDescription: 'Classify and route work.',
|
|
181
|
-
body: '# Triage\nClassify and route.',
|
|
182
|
-
version: 1,
|
|
183
|
-
source: 'seeded',
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
assetId: 'SETUP-RULE-GIT',
|
|
187
|
-
assetKind: 'rule',
|
|
188
|
-
displayName: 'Git Workflow',
|
|
189
|
-
shortDescription: 'Two-track development.',
|
|
190
|
-
body: '# Git Workflow',
|
|
191
|
-
version: 1,
|
|
192
|
-
source: 'seeded',
|
|
193
|
-
},
|
|
194
|
-
];
|
|
195
|
-
const mockKernel = vi.fn().mockResolvedValue(chainResult);
|
|
196
|
-
const assets = await resolveSetupAssets('chain', mockKernel, MOCK_CWD);
|
|
197
|
-
expect(assets).toHaveLength(2);
|
|
198
|
-
const [skill, rule] = assets;
|
|
199
|
-
expect(skill.assetKind).toBe('skill');
|
|
200
|
-
expect(skill.displayName).toBe('Triage');
|
|
201
|
-
expect(skill.body).toContain('# Triage');
|
|
202
|
-
expect(skill.source).toBe('seeded');
|
|
203
|
-
expect(rule.assetKind).toBe('rule');
|
|
204
|
-
expect(rule.displayName).toBe('Git Workflow');
|
|
205
|
-
});
|
|
206
|
-
it('defaults unknown assetKind to "skill"', async () => {
|
|
207
|
-
const chainResult = [
|
|
208
|
-
{
|
|
209
|
-
assetId: 'SETUP-X-UNKNOWN',
|
|
210
|
-
assetKind: 'unknown-future-type',
|
|
211
|
-
displayName: 'Mystery Asset',
|
|
212
|
-
shortDescription: '',
|
|
213
|
-
body: '# Mystery',
|
|
214
|
-
version: 1,
|
|
215
|
-
source: 'seeded',
|
|
216
|
-
},
|
|
217
|
-
];
|
|
218
|
-
const mockKernel = vi.fn().mockResolvedValue(chainResult);
|
|
219
|
-
const assets = await resolveSetupAssets('chain', mockKernel, MOCK_CWD);
|
|
220
|
-
expect(assets[0].assetKind).toBe('skill');
|
|
221
|
-
});
|
|
222
|
-
it('calls kernelCall with empty args object (gateway injects personId server-side)', async () => {
|
|
223
|
-
const mockKernel = vi.fn().mockResolvedValue([]);
|
|
224
|
-
await resolveSetupAssets('chain', mockKernel, MOCK_CWD);
|
|
225
|
-
expect(mockKernel).toHaveBeenCalledWith('setup.getActiveSurface', {});
|
|
226
|
-
});
|
|
227
|
-
});
|
|
228
|
-
//# sourceMappingURL=setup-resolver.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup-resolver.test.js","sourceRoot":"","sources":["../../src/__tests__/setup-resolver.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setupShFallbackWarning.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/setupShFallbackWarning.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { readFileSync } from 'fs';
|
|
3
|
-
import { resolve } from 'path';
|
|
4
|
-
describe('setup.sh pin-skip warning', () => {
|
|
5
|
-
const src = readFileSync(resolve(__dirname, '../../../../.superset/setup.sh'), 'utf8');
|
|
6
|
-
const match = src.match(/fallback_warning="([^"]+)"/);
|
|
7
|
-
it('tells the operator pb will refuse, and names the pin repair', () => {
|
|
8
|
-
expect(match).not.toBeNull();
|
|
9
|
-
const warning = match[1];
|
|
10
|
-
expect(warning).not.toMatch(/GLOBAL active profile/);
|
|
11
|
-
expect(warning).toMatch(/refus/i);
|
|
12
|
-
expect(warning).toContain('pb profile use --local');
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
//# sourceMappingURL=setupShFallbackWarning.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setupShFallbackWarning.test.js","sourceRoot":"","sources":["../../src/__tests__/setupShFallbackWarning.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,gCAAgC,CAAC,EAAE,MAAM,CAAC,CAAC;IACvF,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAEtD,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,KAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WP-433 S5 — `formatDetectSurfacesSummary` pure unit tests.
|
|
3
|
-
*
|
|
4
|
-
* Per INS-1420: runSetupDetectSurfaces makes live server calls via getConfigSafe()
|
|
5
|
-
* and kernelCall. These tests ONLY exercise the pure formatter on hand-crafted
|
|
6
|
-
* SetupDetectSurfacesResult objects — runSetupDetectSurfaces is never called.
|
|
7
|
-
*
|
|
8
|
-
* Test cases:
|
|
9
|
-
* 1. Bare-repo (zero detected, zero existing) → appends locked guidance question
|
|
10
|
-
* 2. Normal detect (new surfaces detected) → does NOT append
|
|
11
|
-
* 3. Idempotent re-run (existing surfaces, zero new) → does NOT append
|
|
12
|
-
* 4. Server-stamp-error case → surfaces error in summary, does NOT append extra question
|
|
13
|
-
*/
|
|
14
|
-
export {};
|
|
15
|
-
//# sourceMappingURL=setup-detect-surfaces.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup-detect-surfaces.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/setup-detect-surfaces.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WP-433 S5 — `formatDetectSurfacesSummary` pure unit tests.
|
|
3
|
-
*
|
|
4
|
-
* Per INS-1420: runSetupDetectSurfaces makes live server calls via getConfigSafe()
|
|
5
|
-
* and kernelCall. These tests ONLY exercise the pure formatter on hand-crafted
|
|
6
|
-
* SetupDetectSurfacesResult objects — runSetupDetectSurfaces is never called.
|
|
7
|
-
*
|
|
8
|
-
* Test cases:
|
|
9
|
-
* 1. Bare-repo (zero detected, zero existing) → appends locked guidance question
|
|
10
|
-
* 2. Normal detect (new surfaces detected) → does NOT append
|
|
11
|
-
* 3. Idempotent re-run (existing surfaces, zero new) → does NOT append
|
|
12
|
-
* 4. Server-stamp-error case → surfaces error in summary, does NOT append extra question
|
|
13
|
-
*/
|
|
14
|
-
import { describe, expect, it } from 'vitest';
|
|
15
|
-
import { formatDetectSurfacesSummary, } from '../setup-detect-surfaces.js';
|
|
16
|
-
const LOCKED_QUESTION = "I don't see Claude Code or Cursor — which AI tool do you use?";
|
|
17
|
-
/** Helper: build a minimal SetupDetectSurfacesResult */
|
|
18
|
-
function makeResult(overrides = {}) {
|
|
19
|
-
return {
|
|
20
|
-
detected: [],
|
|
21
|
-
existing: [],
|
|
22
|
-
newlyAdded: [],
|
|
23
|
-
union: [],
|
|
24
|
-
manifestUpdated: false,
|
|
25
|
-
manifestPath: '/repo/.productbrain/manifest.json',
|
|
26
|
-
serverStamp: null,
|
|
27
|
-
serverStampError: null,
|
|
28
|
-
...overrides,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
describe('formatDetectSurfacesSummary — WP-433 S5 bare-repo guidance', () => {
|
|
32
|
-
it('bare-repo (zero detected, zero existing) appends locked guidance question', () => {
|
|
33
|
-
const result = makeResult({
|
|
34
|
-
detected: [],
|
|
35
|
-
existing: [],
|
|
36
|
-
newlyAdded: [],
|
|
37
|
-
union: [],
|
|
38
|
-
manifestUpdated: false,
|
|
39
|
-
});
|
|
40
|
-
const summary = formatDetectSurfacesSummary(result);
|
|
41
|
-
expect(summary).toContain(LOCKED_QUESTION);
|
|
42
|
-
// Confirm the question is on a separate line
|
|
43
|
-
expect(summary).toContain('\n' + LOCKED_QUESTION);
|
|
44
|
-
});
|
|
45
|
-
it('normal detect (new surfaces detected) does NOT append locked question', () => {
|
|
46
|
-
const result = makeResult({
|
|
47
|
-
detected: ['claude'],
|
|
48
|
-
existing: [],
|
|
49
|
-
newlyAdded: ['claude'],
|
|
50
|
-
union: ['claude'],
|
|
51
|
-
manifestUpdated: true,
|
|
52
|
-
serverStamp: { stamped: true, surfaces: ['claude'] },
|
|
53
|
-
});
|
|
54
|
-
const summary = formatDetectSurfacesSummary(result);
|
|
55
|
-
expect(summary).not.toContain(LOCKED_QUESTION);
|
|
56
|
-
// Confirm surfaces are mentioned
|
|
57
|
-
expect(summary).toContain('claude');
|
|
58
|
-
});
|
|
59
|
-
it('STD-235 remnant (zero detected, existing surfaces remain in manifest) does NOT append locked question', () => {
|
|
60
|
-
// Marker dir deleted from disk; STD-235 forward-only keeps the surface in manifest.
|
|
61
|
-
// Detected is empty but existing is not — guard must NOT trigger bare-repo guidance.
|
|
62
|
-
const result = makeResult({
|
|
63
|
-
detected: [],
|
|
64
|
-
existing: ['claude'],
|
|
65
|
-
newlyAdded: [],
|
|
66
|
-
union: ['claude'],
|
|
67
|
-
manifestUpdated: false,
|
|
68
|
-
});
|
|
69
|
-
const summary = formatDetectSurfacesSummary(result);
|
|
70
|
-
expect(summary).not.toContain(LOCKED_QUESTION);
|
|
71
|
-
expect(summary).toContain('Detected: none');
|
|
72
|
-
expect(summary).toContain('Existing: claude');
|
|
73
|
-
});
|
|
74
|
-
it('idempotent re-run (existing surfaces, zero new detected) does NOT append locked question', () => {
|
|
75
|
-
const result = makeResult({
|
|
76
|
-
detected: ['claude'],
|
|
77
|
-
existing: ['claude'],
|
|
78
|
-
newlyAdded: [],
|
|
79
|
-
union: ['claude'],
|
|
80
|
-
manifestUpdated: false,
|
|
81
|
-
serverStamp: { stamped: false, surfaces: ['claude'] },
|
|
82
|
-
});
|
|
83
|
-
const summary = formatDetectSurfacesSummary(result);
|
|
84
|
-
expect(summary).not.toContain(LOCKED_QUESTION);
|
|
85
|
-
// Existing should appear in summary
|
|
86
|
-
expect(summary).toContain('claude');
|
|
87
|
-
});
|
|
88
|
-
it('server-stamp-error case surfaces the error and does NOT append the locked question', () => {
|
|
89
|
-
// If detect-surfaces fails at the server stamp but DID find surfaces locally,
|
|
90
|
-
// the error should appear but the bare-repo question should not.
|
|
91
|
-
const result = makeResult({
|
|
92
|
-
detected: ['cursor'],
|
|
93
|
-
existing: [],
|
|
94
|
-
newlyAdded: ['cursor'],
|
|
95
|
-
union: ['cursor'],
|
|
96
|
-
manifestUpdated: true,
|
|
97
|
-
serverStamp: null,
|
|
98
|
-
serverStampError: 'Network timeout connecting to workspace',
|
|
99
|
-
});
|
|
100
|
-
const summary = formatDetectSurfacesSummary(result);
|
|
101
|
-
// Error is surfaced
|
|
102
|
-
expect(summary).toContain('Server stamp failed: Network timeout connecting to workspace');
|
|
103
|
-
// Bare-repo question is NOT appended (surfaces were found)
|
|
104
|
-
expect(summary).not.toContain(LOCKED_QUESTION);
|
|
105
|
-
});
|
|
106
|
-
it('bare-repo with server-stamp-error (edge case: zero surfaces + server error) appends locked question', () => {
|
|
107
|
-
// Zero detected + zero existing → bare-repo. Server stamp would not have been
|
|
108
|
-
// called (union is empty), but if serverStampError somehow populated, the
|
|
109
|
-
// bare-repo signal still dominates and the question should appear.
|
|
110
|
-
const result = makeResult({
|
|
111
|
-
detected: [],
|
|
112
|
-
existing: [],
|
|
113
|
-
newlyAdded: [],
|
|
114
|
-
union: [],
|
|
115
|
-
manifestUpdated: false,
|
|
116
|
-
serverStamp: null,
|
|
117
|
-
serverStampError: 'Config missing',
|
|
118
|
-
});
|
|
119
|
-
const summary = formatDetectSurfacesSummary(result);
|
|
120
|
-
// Server stamp error is surfaced
|
|
121
|
-
expect(summary).toContain('Server stamp failed: Config missing');
|
|
122
|
-
// Bare-repo guidance still applies
|
|
123
|
-
expect(summary).toContain(LOCKED_QUESTION);
|
|
124
|
-
});
|
|
125
|
-
it('summary has correct shape for bare-repo result', () => {
|
|
126
|
-
const result = makeResult();
|
|
127
|
-
const summary = formatDetectSurfacesSummary(result);
|
|
128
|
-
// Base line before the question
|
|
129
|
-
expect(summary).toMatch(/^Detected: none \(new: none\)\. Existing: none\. Manifest unchanged\./);
|
|
130
|
-
});
|
|
131
|
-
it('summary has correct shape for normal detect', () => {
|
|
132
|
-
const result = makeResult({
|
|
133
|
-
detected: ['claude', 'cursor'],
|
|
134
|
-
existing: ['claude'],
|
|
135
|
-
newlyAdded: ['cursor'],
|
|
136
|
-
union: ['claude', 'cursor'],
|
|
137
|
-
manifestUpdated: true,
|
|
138
|
-
serverStamp: { stamped: true, surfaces: ['claude', 'cursor'] },
|
|
139
|
-
});
|
|
140
|
-
const summary = formatDetectSurfacesSummary(result);
|
|
141
|
-
expect(summary).toContain('Detected: claude, cursor');
|
|
142
|
-
expect(summary).toContain('new: cursor');
|
|
143
|
-
expect(summary).toContain('Existing: claude');
|
|
144
|
-
expect(summary).toContain('Manifest updated.');
|
|
145
|
-
expect(summary).toContain('Server stamped.');
|
|
146
|
-
expect(summary).not.toContain(LOCKED_QUESTION);
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
//# sourceMappingURL=setup-detect-surfaces.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup-detect-surfaces.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/setup-detect-surfaces.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup-state.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/setup-state.test.ts"],"names":[],"mappings":""}
|