@productbrain/cli 0.1.0-beta.4809 → 0.1.0-beta.4826
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__/capture.test.js +97 -0
- package/dist/__tests__/capture.test.js.map +1 -1
- package/dist/__tests__/config-prod-fallthrough.test.js +23 -12
- package/dist/__tests__/config-prod-fallthrough.test.js.map +1 -1
- package/dist/__tests__/config.test.js +343 -11
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/init.test.js +51 -14
- package/dist/__tests__/init.test.js.map +1 -1
- package/dist/__tests__/state.test.js +21 -1
- package/dist/__tests__/state.test.js.map +1 -1
- package/dist/commands/__tests__/setup-state.test.js +1 -1
- package/dist/commands/__tests__/setup-state.test.js.map +1 -1
- package/dist/commands/capture.d.ts +4 -5
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +11 -10
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +101 -35
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctor.test.js +182 -6
- package/dist/commands/doctor.test.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +20 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +102 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/status.test.d.ts +2 -0
- package/dist/commands/status.test.d.ts.map +1 -0
- package/dist/commands/status.test.js +75 -0
- package/dist/commands/status.test.js.map +1 -0
- package/dist/commands/welcome.d.ts.map +1 -1
- package/dist/commands/welcome.js +5 -2
- package/dist/commands/welcome.js.map +1 -1
- package/dist/index.js +6 -115
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +9 -22
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +37 -99
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/configResult.d.ts +80 -0
- package/dist/lib/configResult.d.ts.map +1 -0
- package/dist/lib/configResult.js +176 -0
- package/dist/lib/configResult.js.map +1 -0
- package/dist/lib/localBinding.d.ts +51 -0
- package/dist/lib/localBinding.d.ts.map +1 -0
- package/dist/lib/localBinding.js +90 -0
- package/dist/lib/localBinding.js.map +1 -0
- package/dist/lib/projectConfig.d.ts +6 -0
- package/dist/lib/projectConfig.d.ts.map +1 -1
- package/dist/lib/projectConfig.js +14 -2
- package/dist/lib/projectConfig.js.map +1 -1
- package/dist/lib/state.d.ts +7 -0
- package/dist/lib/state.d.ts.map +1 -1
- package/dist/lib/state.js +7 -2
- package/dist/lib/state.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/init.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* pb init — intelligent entry point that detects setup state and guides the user.
|
|
3
3
|
*
|
|
4
4
|
* WP-303 Slice 4 (Keystone): 4-state machine (fresh → has-key → has-workspace → ready).
|
|
5
|
-
* Uses
|
|
5
|
+
* Uses getConfigSafe() for key diagnosis, then probes workspace connectivity.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import { getConfigSafe } from '../lib/config.js';
|
|
8
8
|
import { readSession } from '../lib/session.js';
|
|
9
9
|
import { isJsonMode } from '../lib/runner.js';
|
|
10
10
|
import { hint, heading, bold, dim, green, icons } from '../lib/style.js';
|
|
@@ -15,12 +15,11 @@ import { probeWorkspace } from '../lib/workspace-probe.js';
|
|
|
15
15
|
* Sync check only — does not hit the network.
|
|
16
16
|
*/
|
|
17
17
|
export function detectState() {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
return detectStateFromConfig(getConfigSafe());
|
|
19
|
+
}
|
|
20
|
+
function detectStateFromConfig(configResult) {
|
|
21
|
+
if (!configResult.ok)
|
|
22
22
|
return 'fresh';
|
|
23
|
-
}
|
|
24
23
|
// Key is valid. Check if we have a local session (proxy for workspace connectivity).
|
|
25
24
|
const session = readSession();
|
|
26
25
|
if (session?.workspaceId) {
|
|
@@ -31,14 +30,17 @@ export function detectState() {
|
|
|
31
30
|
}
|
|
32
31
|
export async function runInit() {
|
|
33
32
|
const json = isJsonMode();
|
|
34
|
-
const
|
|
33
|
+
const configResult = getConfigSafe();
|
|
34
|
+
const localState = detectStateFromConfig(configResult);
|
|
35
35
|
if (json) {
|
|
36
36
|
// For JSON mode, try to enrich with network probe if we have a key
|
|
37
37
|
if (localState === 'fresh') {
|
|
38
|
+
const failure = configResult.ok ? null : configResult;
|
|
38
39
|
process.stdout.write(JSON.stringify({
|
|
39
40
|
state: 'fresh',
|
|
40
41
|
configured: false,
|
|
41
|
-
|
|
42
|
+
...(failure && failure.kind !== 'missing-key' ? { reason: failure.reason } : {}),
|
|
43
|
+
next: failure?.nextCommand ?? 'pb login',
|
|
42
44
|
}) + '\n');
|
|
43
45
|
return;
|
|
44
46
|
}
|
|
@@ -57,6 +59,15 @@ export async function runInit() {
|
|
|
57
59
|
}
|
|
58
60
|
// Human mode
|
|
59
61
|
if (localState === 'fresh') {
|
|
62
|
+
if (!configResult.ok && configResult.kind !== 'missing-key') {
|
|
63
|
+
process.stdout.write('\n');
|
|
64
|
+
process.stdout.write(`${bold('Product Brain')} — configuration needs attention\n\n`);
|
|
65
|
+
process.stdout.write(` ${configResult.reason}\n\n`);
|
|
66
|
+
process.stdout.write(`${heading('Next step')}\n\n`);
|
|
67
|
+
hint(configResult.nextCommand);
|
|
68
|
+
process.stdout.write('\n');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
60
71
|
process.stdout.write('\n');
|
|
61
72
|
process.stdout.write(`${bold('Welcome to Product Brain!')}\n\n`);
|
|
62
73
|
process.stdout.write(` Let's get you connected.\n\n`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** No-argument CLI status surface, shared across JSON, plain, and Ink render tiers. */
|
|
2
|
+
export interface StatusOptions {
|
|
3
|
+
args: string[];
|
|
4
|
+
version: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function runStatus({ args, version }: StatusOptions): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAUvF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAiDD,wBAAsB,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD/E"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/** No-argument CLI status surface, shared across JSON, plain, and Ink render tiers. */
|
|
2
|
+
import { getConfigSafe } from '../lib/config.js';
|
|
3
|
+
import { detectRenderTier, resolveSetupState } from '../lib/state.js';
|
|
4
|
+
import { readSession } from '../lib/session.js';
|
|
5
|
+
import { probeWorkspace } from '../lib/workspace-probe.js';
|
|
6
|
+
import { setQuietMode } from '../lib/runner.js';
|
|
7
|
+
import { bold, dim, green, heading, hint, icons } from '../lib/style.js';
|
|
8
|
+
import { runSessionClose, runSessionStart } from './session.js';
|
|
9
|
+
function renderPlain(state) {
|
|
10
|
+
process.stdout.write('\n');
|
|
11
|
+
if (state.stage === 'unconfigured') {
|
|
12
|
+
if (state.configurationIssue?.kind !== 'missing-key') {
|
|
13
|
+
process.stdout.write(`${bold('Product Brain')} ${dim('— configuration needs attention')}\n\n`);
|
|
14
|
+
process.stdout.write(` ${state.configurationIssue?.reason ?? state.missingSteps[0]}\n\n`);
|
|
15
|
+
hint(state.nextAction);
|
|
16
|
+
hint('pb doctor Diagnose configuration');
|
|
17
|
+
process.stdout.write('\n');
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
process.stdout.write(`${bold('Product Brain')} ${dim('— not connected')}\n\n`);
|
|
21
|
+
process.stdout.write(`${heading('Get started')}\n\n`);
|
|
22
|
+
hint('1. pb login Save your API key');
|
|
23
|
+
hint('2. pb connect Connect a workspace');
|
|
24
|
+
hint('3. pb orient -b See what\'s happening');
|
|
25
|
+
process.stdout.write('\n');
|
|
26
|
+
hint('pb --help Show all commands');
|
|
27
|
+
process.stdout.write('\n');
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (state.stage === 'authenticated') {
|
|
31
|
+
process.stdout.write(`${bold('Product Brain')} ${dim('— server unreachable')}\n\n`);
|
|
32
|
+
process.stdout.write(` ${green(icons.pass)} Key: configured\n`);
|
|
33
|
+
process.stdout.write(' ! Server: unreachable — run pb doctor to diagnose\n\n');
|
|
34
|
+
hint('pb session start Start a write session');
|
|
35
|
+
hint('pb doctor Diagnose connection issues');
|
|
36
|
+
hint('pb --help Show all commands');
|
|
37
|
+
process.stdout.write('\n');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const workspaceName = state.workspaceName ?? 'unknown';
|
|
41
|
+
const entryCount = state.entryCount ?? 0;
|
|
42
|
+
process.stdout.write(`${bold('Product Brain')} ${dim('—')} ${bold(workspaceName)}\n\n`);
|
|
43
|
+
process.stdout.write(` ${green(icons.pass)} Key: configured\n`);
|
|
44
|
+
process.stdout.write(` ${green(icons.pass)} Workspace: ${workspaceName} (${entryCount} entries)\n`);
|
|
45
|
+
process.stdout.write(state.sessionActive
|
|
46
|
+
? ` ${green(icons.pass)} Session: active\n`
|
|
47
|
+
: ` ${dim('- Session: none')}\n`);
|
|
48
|
+
process.stdout.write('\n');
|
|
49
|
+
if (!state.sessionActive)
|
|
50
|
+
hint('pb session start Start a write session');
|
|
51
|
+
hint('pb orient -b Workspace overview');
|
|
52
|
+
hint('pb --help Show all commands');
|
|
53
|
+
process.stdout.write('\n');
|
|
54
|
+
}
|
|
55
|
+
export async function runStatus({ args, version }) {
|
|
56
|
+
if (args.length > 0) {
|
|
57
|
+
if (args[0] === 'start')
|
|
58
|
+
return runSessionStart();
|
|
59
|
+
if (args[0] === 'close')
|
|
60
|
+
return runSessionClose({});
|
|
61
|
+
process.stderr.write(`error: unknown command '${args[0]}'\n`);
|
|
62
|
+
process.stderr.write("Run 'pb --help' to see available commands.\n");
|
|
63
|
+
process.exit(1);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const tier = detectRenderTier();
|
|
67
|
+
if (tier === 'json') {
|
|
68
|
+
const config = getConfigSafe();
|
|
69
|
+
if (!config.ok) {
|
|
70
|
+
process.stdout.write(JSON.stringify({
|
|
71
|
+
configured: false,
|
|
72
|
+
hint: config.kind === 'missing-key'
|
|
73
|
+
? 'Run pb login to configure your API key.'
|
|
74
|
+
: `${config.reason} ${config.guidance}`,
|
|
75
|
+
}) + '\n');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const session = readSession();
|
|
79
|
+
const wsInfo = await probeWorkspace();
|
|
80
|
+
process.stdout.write(JSON.stringify({
|
|
81
|
+
configured: true,
|
|
82
|
+
workspace: wsInfo?.name ?? null,
|
|
83
|
+
session: session ? { id: session.sessionId, startedAt: session.startedAt } : null,
|
|
84
|
+
entryCount: wsInfo?.entryCount ?? null,
|
|
85
|
+
hint: 'Run pb --help for available commands.',
|
|
86
|
+
}) + '\n');
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (tier === 'ink')
|
|
90
|
+
setQuietMode(true);
|
|
91
|
+
const state = await resolveSetupState();
|
|
92
|
+
if (tier === 'plain') {
|
|
93
|
+
renderPlain(state);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const { render } = await import('ink');
|
|
97
|
+
const { WelcomeCockpit } = await import('./welcome.js');
|
|
98
|
+
const React = await import('react');
|
|
99
|
+
const { waitUntilExit, unmount } = render(React.default.createElement(WelcomeCockpit, { state, version, onExit: () => unmount() }));
|
|
100
|
+
await waitUntilExit();
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.test.d.ts","sourceRoot":"","sources":["../../src/commands/status.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
const mocks = vi.hoisted(() => ({
|
|
3
|
+
tier: 'json',
|
|
4
|
+
config: {
|
|
5
|
+
ok: false,
|
|
6
|
+
kind: 'profile-pin',
|
|
7
|
+
reason: 'This repo is pinned to profile "deleted-workspace".',
|
|
8
|
+
guidance: 'Run `pb profile use --local <profile>` to fix the repo pin.',
|
|
9
|
+
nextCommand: 'pb profile use --local <profile>',
|
|
10
|
+
},
|
|
11
|
+
render: vi.fn((_element) => ({ waitUntilExit: vi.fn(async () => { }), unmount: vi.fn() })),
|
|
12
|
+
quiet: vi.fn(),
|
|
13
|
+
}));
|
|
14
|
+
vi.mock('../lib/config.js', () => ({ getConfigSafe: () => mocks.config }));
|
|
15
|
+
vi.mock('../lib/state.js', () => ({
|
|
16
|
+
detectRenderTier: () => mocks.tier,
|
|
17
|
+
resolveSetupState: vi.fn(async () => ({
|
|
18
|
+
stage: 'unconfigured',
|
|
19
|
+
missingSteps: [mocks.config.reason],
|
|
20
|
+
nextAction: mocks.config.nextCommand,
|
|
21
|
+
configurationIssue: {
|
|
22
|
+
kind: mocks.config.kind,
|
|
23
|
+
reason: mocks.config.reason,
|
|
24
|
+
guidance: mocks.config.guidance,
|
|
25
|
+
},
|
|
26
|
+
})),
|
|
27
|
+
}));
|
|
28
|
+
vi.mock('../lib/session.js', () => ({ readSession: vi.fn(), runSessionStart: vi.fn(), runSessionClose: vi.fn() }));
|
|
29
|
+
vi.mock('../lib/workspace-probe.js', () => ({ probeWorkspace: vi.fn() }));
|
|
30
|
+
vi.mock('../lib/runner.js', () => ({
|
|
31
|
+
setQuietMode: (value) => mocks.quiet(value),
|
|
32
|
+
isQuietMode: () => false,
|
|
33
|
+
}));
|
|
34
|
+
vi.mock('ink', () => ({ render: (element) => mocks.render(element) }));
|
|
35
|
+
vi.mock('./welcome.js', () => ({ WelcomeCockpit: () => null }));
|
|
36
|
+
import { runStatus } from './status.js';
|
|
37
|
+
describe('runStatus S5 diagnostics', () => {
|
|
38
|
+
let stdout = '';
|
|
39
|
+
let stdoutSpy;
|
|
40
|
+
beforeEach(() => {
|
|
41
|
+
stdout = '';
|
|
42
|
+
mocks.render.mockClear();
|
|
43
|
+
mocks.quiet.mockClear();
|
|
44
|
+
stdoutSpy = vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
45
|
+
stdout += String(chunk);
|
|
46
|
+
return true;
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
afterEach(() => stdoutSpy.mockRestore());
|
|
50
|
+
it('preserves configured and hint JSON fields while naming the broken pin', async () => {
|
|
51
|
+
mocks.tier = 'json';
|
|
52
|
+
await runStatus({ args: [], version: 'test' });
|
|
53
|
+
expect(JSON.parse(stdout.trim())).toEqual({
|
|
54
|
+
configured: false,
|
|
55
|
+
hint: expect.stringContaining('deleted-workspace'),
|
|
56
|
+
});
|
|
57
|
+
expect(stdout).toContain('pb profile use --local <profile>');
|
|
58
|
+
expect(stdout).not.toContain('pb login');
|
|
59
|
+
});
|
|
60
|
+
it('names the pin and repair command in plain output', async () => {
|
|
61
|
+
mocks.tier = 'plain';
|
|
62
|
+
await runStatus({ args: [], version: 'test' });
|
|
63
|
+
expect(stdout).toContain('deleted-workspace');
|
|
64
|
+
expect(stdout).toContain('pb profile use --local <profile>');
|
|
65
|
+
expect(stdout).not.toContain('pb login');
|
|
66
|
+
});
|
|
67
|
+
it('hands the exact configuration issue to the Ink cockpit', async () => {
|
|
68
|
+
mocks.tier = 'ink';
|
|
69
|
+
await runStatus({ args: [], version: 'test' });
|
|
70
|
+
expect(mocks.quiet).toHaveBeenCalledWith(true);
|
|
71
|
+
const element = mocks.render.mock.calls[0][0];
|
|
72
|
+
expect(element.props.state.configurationIssue.reason).toContain('deleted-workspace');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=status.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.test.js","sourceRoot":"","sources":["../../src/commands/status.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAkC;IACxC,MAAM,EAAE;QACN,EAAE,EAAE,KAAc;QAClB,IAAI,EAAE,aAAsB;QAC5B,MAAM,EAAE,qDAAqD;QAC7D,QAAQ,EAAE,6DAA6D;QACvE,WAAW,EAAE,kCAAkC;KAChD;IACD,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,QAAiB,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAClG,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;CACf,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC3E,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,gBAAgB,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI;IAClC,iBAAiB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACpC,KAAK,EAAE,cAAc;QACrB,YAAY,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QACnC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW;QACpC,kBAAkB,EAAE;YAClB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;YACvB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;YAC3B,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;SAChC;KACF,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACnH,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1E,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,YAAY,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;IACpD,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;CACzB,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAChF,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,SAAsC,CAAC;IAE3C,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,EAAE,CAAC;QACZ,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACzB,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACxB,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,EAAE;YACzE,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;IAEzC,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC;QACpB,MAAM,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAE/C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACxC,UAAU,EAAE,KAAK;YACjB,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAAC,mBAAmB,CAAC;SACnD,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC;QACrB,MAAM,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAE/C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;QACnB,MAAM,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAE/C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAE3C,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/commands/welcome.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAMlD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/commands/welcome.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAMlD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AA+JD,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,mBAAmB,2CAuB7E"}
|
package/dist/commands/welcome.js
CHANGED
|
@@ -16,7 +16,10 @@ function HintLine({ text }) {
|
|
|
16
16
|
// ---------------------------------------------------------------------------
|
|
17
17
|
// Screen: unconfigured
|
|
18
18
|
// ---------------------------------------------------------------------------
|
|
19
|
-
function UnconfiguredScreen() {
|
|
19
|
+
function UnconfiguredScreen({ state }) {
|
|
20
|
+
if (state.configurationIssue?.kind !== 'missing-key') {
|
|
21
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Product Brain" }), _jsx(Text, { dimColor: true, children: " \u2014 configuration needs attention" })] }), _jsx(Box, { flexDirection: "column", marginBottom: 1, children: _jsx(Text, { color: "yellow", children: state.configurationIssue?.reason ?? state.missingSteps[0] }) }), _jsx(HintLine, { text: state.nextAction }), _jsx(HintLine, { text: "pb doctor Diagnose configuration" })] }));
|
|
22
|
+
}
|
|
20
23
|
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Product Brain" }), _jsx(Text, { dimColor: true, children: " \u2014 not connected" })] }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: "cyan", children: "Get started" }) }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(HintLine, { text: "1. pb login Save your API key" }), _jsx(HintLine, { text: "2. pb connect Connect a workspace" }), _jsx(HintLine, { text: "3. pb orient -b See what's happening" })] }), _jsx(HintLine, { text: "pb --help Show all commands" })] }));
|
|
21
24
|
}
|
|
22
25
|
// ---------------------------------------------------------------------------
|
|
@@ -45,6 +48,6 @@ export function WelcomeCockpit({ state, version, onExit }) {
|
|
|
45
48
|
exit();
|
|
46
49
|
}
|
|
47
50
|
});
|
|
48
|
-
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(BrandBanner, { version: version }), state.stage === 'unconfigured' && _jsx(UnconfiguredScreen, {}), state.stage === 'authenticated' && _jsx(AuthenticatedScreen, {}), (state.stage === 'workspace-bound' || state.stage === 'active') && (_jsx(ConnectedScreen, { state: state })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Press q to exit" }) })] }));
|
|
51
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(BrandBanner, { version: version }), state.stage === 'unconfigured' && _jsx(UnconfiguredScreen, { state: state }), state.stage === 'authenticated' && _jsx(AuthenticatedScreen, {}), (state.stage === 'workspace-bound' || state.stage === 'active') && (_jsx(ConnectedScreen, { state: state })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Press q to exit" }) })] }));
|
|
49
52
|
}
|
|
50
53
|
//# sourceMappingURL=welcome.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/commands/welcome.tsx"],"names":[],"mappings":";AAeA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAalD,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,SAAS,WAAW,CAAC,EAAE,OAAO,EAAuB;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAC3C,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,KAAC,IAAI,IAAC,IAAI,kBAAE,UAAU,GAAQ,EAC9B,KAAC,IAAI,IAAC,IAAI,kBAAE,UAAU,GAAQ,EAC9B,KAAC,IAAI,IAAC,IAAI,kBAAE,UAAU,GAAQ,EAC9B,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,IAAI,oCAAqB,EAC/B,KAAC,IAAI,cAAE,IAAI,GAAQ,EACnB,KAAC,IAAI,IAAC,QAAQ,kBAAE,IAAI,OAAO,EAAE,GAAQ,IACjC,IACF,CACP,CAAC;IACJ,CAAC;IACD,OAAO,CACL,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,KAAC,IAAI,IAAC,IAAI,kBAAE,kBAAkB,OAAO,EAAE,GAAQ,GAC3C,CACP,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,EAAE,IAAI,EAAoB;IAC1C,OAAO,CACL,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,QAAQ,kBAAE,KAAK,IAAI,EAAE,GAAQ,GAC/B,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,SAAS,kBAAkB;
|
|
1
|
+
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/commands/welcome.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -51,6 +51,7 @@ import { runFiles } from './commands/files.js';
|
|
|
51
51
|
import { runUpgrade } from './commands/upgrade.js';
|
|
52
52
|
import { runProfileList, runProfileCreate, runProfileUse, runProfileDelete } from './commands/profile.js';
|
|
53
53
|
import { runInit } from './commands/init.js';
|
|
54
|
+
import { runStatus } from './commands/status.js';
|
|
54
55
|
import { runMethodList, runMethodShow, runMethodDiff, runMethodPublish } from './commands/method.js';
|
|
55
56
|
import { createAdminCommand } from './commands/admin/index.js';
|
|
56
57
|
import { createFeedbackCommand } from './commands/feedback.js';
|
|
@@ -65,11 +66,10 @@ import { runProofRun } from './commands/proof-run.js';
|
|
|
65
66
|
import { runQualitySpineCheck } from './commands/quality.js';
|
|
66
67
|
import { GLOSSARY, formatGlossary } from './lib/glossary.js';
|
|
67
68
|
import { API_KEY_PREFIX } from './lib/tokenConstants.js';
|
|
68
|
-
import {
|
|
69
|
+
import { heading } from './lib/style.js';
|
|
69
70
|
import { printPreviewBanner } from './lib/previewBanner.js';
|
|
70
71
|
import { checkForUpdate } from './lib/update-check.js';
|
|
71
72
|
import { UPGRADE_COMMAND } from './lib/constants.js';
|
|
72
|
-
import { resolveSetupState, detectRenderTier } from './lib/state.js';
|
|
73
73
|
const program = new Command();
|
|
74
74
|
/**
|
|
75
75
|
* Global error handler — single exit point for all CLI errors. CLIError: format with code +
|
|
@@ -147,116 +147,7 @@ program.hook('preAction', (_hookedCommand, actionCommand) => {
|
|
|
147
147
|
});
|
|
148
148
|
// Default action — status dashboard when `pb` is invoked with no command. `pb --help` still works because Commander intercepts --help before the action runs.
|
|
149
149
|
program.action(async () => {
|
|
150
|
-
|
|
151
|
-
if (program.args.length > 0) {
|
|
152
|
-
const args = program.args;
|
|
153
|
-
// `pb start` / `pb start session` → `pb session start`
|
|
154
|
-
if (args[0] === 'start') {
|
|
155
|
-
await runSessionStart();
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
// `pb close` / `pb close session` → `pb session close`
|
|
159
|
-
if (args[0] === 'close') {
|
|
160
|
-
await runSessionClose({});
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
// Unknown command — show a helpful error instead of the welcome screen
|
|
164
|
-
const unknown = args[0];
|
|
165
|
-
process.stderr.write(`error: unknown command '${unknown}'\n`);
|
|
166
|
-
process.stderr.write(`Run 'pb --help' to see available commands.\n`);
|
|
167
|
-
process.exit(1);
|
|
168
|
-
}
|
|
169
|
-
const tier = detectRenderTier();
|
|
170
|
-
// JSON tier — structured status output
|
|
171
|
-
if (tier === 'json') {
|
|
172
|
-
// Check for API key first (sync, no network)
|
|
173
|
-
let hasKey = false;
|
|
174
|
-
try {
|
|
175
|
-
const { getConfig: gc } = await import('./lib/config.js');
|
|
176
|
-
gc();
|
|
177
|
-
hasKey = true;
|
|
178
|
-
}
|
|
179
|
-
catch {
|
|
180
|
-
// No valid key
|
|
181
|
-
}
|
|
182
|
-
if (!hasKey) {
|
|
183
|
-
process.stdout.write(JSON.stringify({
|
|
184
|
-
configured: false,
|
|
185
|
-
hint: 'Run pb login to configure your API key.',
|
|
186
|
-
}) + '\n');
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
const { readSession } = await import('./lib/session.js');
|
|
190
|
-
const { probeWorkspace } = await import('./lib/workspace-probe.js');
|
|
191
|
-
const session = readSession();
|
|
192
|
-
const wsInfo = await probeWorkspace();
|
|
193
|
-
process.stdout.write(JSON.stringify({
|
|
194
|
-
configured: true,
|
|
195
|
-
workspace: wsInfo?.name ?? null,
|
|
196
|
-
session: session ? { id: session.sessionId, startedAt: session.startedAt } : null,
|
|
197
|
-
entryCount: wsInfo?.entryCount ?? null,
|
|
198
|
-
hint: 'Run pb --help for available commands.',
|
|
199
|
-
}) + '\n');
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
// Ink tier: suppress withSpinner output before Ink mounts — spinner writes pollute the TUI canvas
|
|
203
|
-
if (tier === 'ink')
|
|
204
|
-
setQuietMode(true);
|
|
205
|
-
// Resolve state (plain and ink both need it)
|
|
206
|
-
const state = await resolveSetupState();
|
|
207
|
-
// Plain tier — console output driven by state
|
|
208
|
-
if (tier === 'plain') {
|
|
209
|
-
process.stdout.write('\n');
|
|
210
|
-
if (state.stage === 'unconfigured') {
|
|
211
|
-
process.stdout.write(`${bold('Product Brain')} ${dim('— not connected')}\n\n`);
|
|
212
|
-
process.stdout.write(`${heading('Get started')}\n\n`);
|
|
213
|
-
hint('1. pb login Save your API key');
|
|
214
|
-
hint('2. pb connect Connect a workspace');
|
|
215
|
-
hint('3. pb orient -b See what\'s happening');
|
|
216
|
-
process.stdout.write('\n');
|
|
217
|
-
hint('pb --help Show all commands');
|
|
218
|
-
process.stdout.write('\n');
|
|
219
|
-
}
|
|
220
|
-
else if (state.stage === 'authenticated') {
|
|
221
|
-
process.stdout.write(`${bold('Product Brain')} ${dim('— server unreachable')}\n\n`);
|
|
222
|
-
process.stdout.write(` ${green(icons.pass)} Key: configured\n`);
|
|
223
|
-
process.stdout.write(` ! Server: unreachable — run pb doctor to diagnose\n\n`);
|
|
224
|
-
hint('pb session start Start a write session');
|
|
225
|
-
hint('pb doctor Diagnose connection issues');
|
|
226
|
-
hint('pb --help Show all commands');
|
|
227
|
-
process.stdout.write('\n');
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
// workspace-bound or active
|
|
231
|
-
const workspaceName = state.workspaceName ?? 'unknown';
|
|
232
|
-
const entryCount = state.entryCount ?? 0;
|
|
233
|
-
const title = `${bold('Product Brain')} ${dim('—')} ${bold(workspaceName)}`;
|
|
234
|
-
process.stdout.write(`${title}\n\n`);
|
|
235
|
-
process.stdout.write(` ${green(icons.pass)} Key: configured\n`);
|
|
236
|
-
process.stdout.write(` ${green(icons.pass)} Workspace: ${workspaceName} (${entryCount} entries)\n`);
|
|
237
|
-
if (state.sessionActive) {
|
|
238
|
-
process.stdout.write(` ${green(icons.pass)} Session: active\n`);
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
process.stdout.write(` ${dim('- Session: none')}\n`);
|
|
242
|
-
}
|
|
243
|
-
process.stdout.write('\n');
|
|
244
|
-
if (!state.sessionActive) {
|
|
245
|
-
hint('pb session start Start a write session');
|
|
246
|
-
}
|
|
247
|
-
hint('pb orient -b Workspace overview');
|
|
248
|
-
hint('pb --help Show all commands');
|
|
249
|
-
process.stdout.write('\n');
|
|
250
|
-
}
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
// Ink tier — interactive TUI
|
|
254
|
-
const version = cliPackageVersion.version;
|
|
255
|
-
const { render } = await import('ink');
|
|
256
|
-
const { WelcomeCockpit } = await import('./commands/welcome.js');
|
|
257
|
-
const React = await import('react');
|
|
258
|
-
const { waitUntilExit, unmount } = render(React.default.createElement(WelcomeCockpit, { state, version, onExit: () => unmount() }));
|
|
259
|
-
await waitUntilExit();
|
|
150
|
+
await runStatus({ args: program.args, version: cliPackageVersion.version });
|
|
260
151
|
});
|
|
261
152
|
program
|
|
262
153
|
.command('get <entry-id>')
|
|
@@ -578,13 +469,13 @@ program
|
|
|
578
469
|
.option('-t, --type <relation-type>', 'Relation type for --link (default: surfaces_tension_in)')
|
|
579
470
|
.option('--source-ref <ref>', 'Source reference URI (BET-240 E2: e.g. "meeting-2026-03-28.md")')
|
|
580
471
|
.option('--source-excerpt <text>', 'Verbatim source excerpt (BET-240 E2)')
|
|
581
|
-
|
|
582
|
-
.option('--draft', 'Force the entry to draft regardless of workspace governance mode (TEN-2226)')
|
|
472
|
+
.option('--draft', 'Force the entry to draft regardless of workspace governance mode — opt-in override, keeps it draft even in Open mode (TEN-2226 / WP-456 E1)')
|
|
583
473
|
.option('--json', 'Output machine-readable JSON (deprecated: use global --json flag)')
|
|
584
474
|
.option('--suggest-only', 'Show grounding preview (possible duplicates, related entries) without creating entry (WP-319)')
|
|
585
475
|
.option('--strict', 'Prompt y/N before capturing when a possible duplicate is detected (WP-319)')
|
|
586
476
|
.option('--owner-team <entry-id>', 'Existing Team entry ID to create AS OWNER of (WP-513 rung 2; pair with --owner-role)')
|
|
587
477
|
.option('--owner-role <entry-id>', 'Existing Role entry ID to create AS OWNER of (WP-513 rung 2; pair with --owner-team)')
|
|
478
|
+
.option('--entry-type <canonical-key>', 'Explicit canonical type for the new entry (e.g. objective, key_result) — bypasses classification; -t/--type is the --link relation type (WP-684 TASK-77)')
|
|
588
479
|
.action(async (textParts = [], opts) => {
|
|
589
480
|
const text = textParts.join(' ').trim();
|
|
590
481
|
if (!text && !opts.name) {
|
|
@@ -595,7 +486,7 @@ program
|
|
|
595
486
|
text: text || opts.name || '', name: opts.name, description: opts.description, collection: opts.collection,
|
|
596
487
|
field: opts.field, link: opts.link, type: opts.type, sourceRef: opts.sourceRef, sourceExcerpt: opts.sourceExcerpt,
|
|
597
488
|
draft: opts.draft, json: opts.json, suggestOnly: opts.suggestOnly, strict: opts.strict,
|
|
598
|
-
ownerTeam: opts.ownerTeam, ownerRole: opts.ownerRole,
|
|
489
|
+
ownerTeam: opts.ownerTeam, ownerRole: opts.ownerRole, entryType: opts.entryType,
|
|
599
490
|
});
|
|
600
491
|
});
|
|
601
492
|
// --- Update command (TEN-703) ---
|