@productbrain/cli 0.1.0-beta.109 → 0.1.0-beta.1096
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__/audit.test.js +5 -0
- package/dist/__tests__/audit.test.js.map +1 -1
- package/dist/__tests__/config.test.js +272 -2
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/handshake-augment.test.d.ts +2 -0
- package/dist/__tests__/handshake-augment.test.d.ts.map +1 -0
- package/dist/__tests__/handshake-augment.test.js +423 -0
- package/dist/__tests__/handshake-augment.test.js.map +1 -0
- package/dist/__tests__/handshake-dormancy.test.d.ts +2 -0
- package/dist/__tests__/handshake-dormancy.test.d.ts.map +1 -0
- package/dist/__tests__/handshake-dormancy.test.js +207 -0
- package/dist/__tests__/handshake-dormancy.test.js.map +1 -0
- package/dist/__tests__/handshake-formatter.test.d.ts +2 -0
- package/dist/__tests__/handshake-formatter.test.d.ts.map +1 -0
- package/dist/__tests__/handshake-formatter.test.js +67 -0
- package/dist/__tests__/handshake-formatter.test.js.map +1 -0
- package/dist/__tests__/handshake-preview.test.js +65 -3
- package/dist/__tests__/handshake-preview.test.js.map +1 -1
- package/dist/__tests__/handshake.e2e.test.js +998 -3
- package/dist/__tests__/handshake.e2e.test.js.map +1 -1
- package/dist/__tests__/handshake.test.js +4 -4
- package/dist/__tests__/handshake.test.js.map +1 -1
- package/dist/__tests__/notice-marker.test.d.ts +2 -0
- package/dist/__tests__/notice-marker.test.d.ts.map +1 -0
- package/dist/__tests__/notice-marker.test.js +41 -0
- package/dist/__tests__/notice-marker.test.js.map +1 -0
- package/dist/__tests__/onboarding-path-b.test.js +4 -4
- package/dist/__tests__/onboarding-path-b.test.js.map +1 -1
- package/dist/__tests__/orient.test.js +52 -2
- package/dist/__tests__/orient.test.js.map +1 -1
- package/dist/__tests__/perimeter.test.js +23 -1
- package/dist/__tests__/perimeter.test.js.map +1 -1
- package/dist/__tests__/preview-key-refresh.test.d.ts +2 -0
- package/dist/__tests__/preview-key-refresh.test.d.ts.map +1 -0
- package/dist/__tests__/preview-key-refresh.test.js +126 -0
- package/dist/__tests__/preview-key-refresh.test.js.map +1 -0
- package/dist/__tests__/profiles.test.js +106 -2
- package/dist/__tests__/profiles.test.js.map +1 -1
- package/dist/__tests__/proof-run.test.d.ts +2 -0
- package/dist/__tests__/proof-run.test.d.ts.map +1 -0
- package/dist/__tests__/proof-run.test.js +255 -0
- package/dist/__tests__/proof-run.test.js.map +1 -0
- package/dist/__tests__/session-reset.test.d.ts +2 -0
- package/dist/__tests__/session-reset.test.d.ts.map +1 -0
- package/dist/__tests__/session-reset.test.js +122 -0
- package/dist/__tests__/session-reset.test.js.map +1 -0
- package/dist/__tests__/session-resume-backstop.test.d.ts +2 -0
- package/dist/__tests__/session-resume-backstop.test.d.ts.map +1 -0
- package/dist/__tests__/session-resume-backstop.test.js +97 -0
- package/dist/__tests__/session-resume-backstop.test.js.map +1 -0
- package/dist/__tests__/session-start-key-refresh.test.d.ts +2 -0
- package/dist/__tests__/session-start-key-refresh.test.d.ts.map +1 -0
- package/dist/__tests__/session-start-key-refresh.test.js +178 -0
- package/dist/__tests__/session-start-key-refresh.test.js.map +1 -0
- package/dist/__tests__/session-state-machine.test.js +45 -1
- package/dist/__tests__/session-state-machine.test.js.map +1 -1
- package/dist/__tests__/session-switch.test.d.ts +2 -0
- package/dist/__tests__/session-switch.test.d.ts.map +1 -0
- package/dist/__tests__/session-switch.test.js +130 -0
- package/dist/__tests__/session-switch.test.js.map +1 -0
- package/dist/__tests__/update-check.test.js +160 -1
- package/dist/__tests__/update-check.test.js.map +1 -1
- package/dist/__tests__/upgrade-runner.test.js +12 -0
- package/dist/__tests__/upgrade-runner.test.js.map +1 -1
- package/dist/__tests__/upgrade.test.d.ts +2 -0
- package/dist/__tests__/upgrade.test.d.ts.map +1 -0
- package/dist/__tests__/upgrade.test.js +56 -0
- package/dist/__tests__/upgrade.test.js.map +1 -0
- package/dist/__tests__/vocabulary-leak.test.d.ts +27 -13
- package/dist/__tests__/vocabulary-leak.test.d.ts.map +1 -1
- package/dist/__tests__/vocabulary-leak.test.js +169 -14
- package/dist/__tests__/vocabulary-leak.test.js.map +1 -1
- package/dist/commands/__tests__/setup-detect-surfaces.test.d.ts +15 -0
- package/dist/commands/__tests__/setup-detect-surfaces.test.d.ts.map +1 -0
- package/dist/commands/__tests__/setup-detect-surfaces.test.js +149 -0
- package/dist/commands/__tests__/setup-detect-surfaces.test.js.map +1 -0
- package/dist/commands/admin/seedRegistryEntries.generated.js +2 -2
- package/dist/commands/admin/seedRegistryEntries.generated.js.map +1 -1
- package/dist/commands/admin/seedRegistryEntries.test.js +1 -1
- package/dist/commands/admin/seedRegistryEntries.test.js.map +1 -1
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +30 -3
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/authority-domains.d.ts.map +1 -1
- package/dist/commands/authority-domains.js +2 -1
- package/dist/commands/authority-domains.js.map +1 -1
- package/dist/commands/capture.d.ts +2 -0
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +5 -1
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/connect-config.test.d.ts +2 -0
- package/dist/commands/connect-config.test.d.ts.map +1 -0
- package/dist/commands/connect-config.test.js +44 -0
- package/dist/commands/connect-config.test.js.map +1 -0
- package/dist/commands/connect-context.d.ts +45 -0
- package/dist/commands/connect-context.d.ts.map +1 -0
- package/dist/commands/connect-context.js +64 -0
- package/dist/commands/connect-context.js.map +1 -0
- package/dist/commands/connect-context.test.d.ts +2 -0
- package/dist/commands/connect-context.test.d.ts.map +1 -0
- package/dist/commands/connect-context.test.js +110 -0
- package/dist/commands/connect-context.test.js.map +1 -0
- package/dist/commands/connect-screens.d.ts +5 -6
- package/dist/commands/connect-screens.d.ts.map +1 -1
- package/dist/commands/connect-screens.js +28 -35
- package/dist/commands/connect-screens.js.map +1 -1
- package/dist/commands/connect.d.ts +16 -0
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +21 -20
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/doctor.js +2 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctor.test.js +19 -0
- package/dist/commands/doctor.test.js.map +1 -1
- package/dist/commands/handshake.d.ts +59 -4
- package/dist/commands/handshake.d.ts.map +1 -1
- package/dist/commands/handshake.js +392 -97
- package/dist/commands/handshake.js.map +1 -1
- package/dist/commands/method.d.ts.map +1 -1
- package/dist/commands/method.js +2 -1
- package/dist/commands/method.js.map +1 -1
- package/dist/commands/orient.d.ts +48 -0
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +25 -5
- package/dist/commands/orient.js.map +1 -1
- package/dist/commands/profile.d.ts +1 -14
- package/dist/commands/profile.d.ts.map +1 -1
- package/dist/commands/profile.js +89 -72
- package/dist/commands/profile.js.map +1 -1
- package/dist/commands/proof-run.d.ts +51 -0
- package/dist/commands/proof-run.d.ts.map +1 -0
- package/dist/commands/proof-run.js +209 -0
- package/dist/commands/proof-run.js.map +1 -0
- package/dist/commands/reject.d.ts.map +1 -1
- package/dist/commands/reject.js +2 -1
- package/dist/commands/reject.js.map +1 -1
- package/dist/commands/relate.d.ts.map +1 -1
- package/dist/commands/relate.js +4 -2
- package/dist/commands/relate.js.map +1 -1
- package/dist/commands/session.d.ts +26 -2
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +216 -31
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/setup-audit.d.ts +59 -0
- package/dist/commands/setup-audit.d.ts.map +1 -0
- package/dist/commands/setup-audit.js +250 -0
- package/dist/commands/setup-audit.js.map +1 -0
- package/dist/commands/setup-detect-surfaces.d.ts.map +1 -1
- package/dist/commands/setup-detect-surfaces.js +10 -1
- package/dist/commands/setup-detect-surfaces.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +2 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +31 -10
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +2 -1
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/whoami.d.ts +12 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +70 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/commands/whoami.test.d.ts +2 -0
- package/dist/commands/whoami.test.d.ts.map +1 -0
- package/dist/commands/whoami.test.js +50 -0
- package/dist/commands/whoami.test.js.map +1 -0
- package/dist/formatters/__tests__/orient-provenance.test.d.ts +7 -0
- package/dist/formatters/__tests__/orient-provenance.test.d.ts.map +1 -0
- package/dist/formatters/__tests__/orient-provenance.test.js +454 -0
- package/dist/formatters/__tests__/orient-provenance.test.js.map +1 -0
- package/dist/formatters/audit.d.ts +6 -0
- package/dist/formatters/audit.d.ts.map +1 -1
- package/dist/formatters/audit.js.map +1 -1
- package/dist/formatters/entry.d.ts +21 -0
- package/dist/formatters/entry.d.ts.map +1 -1
- package/dist/formatters/entry.js +46 -5
- package/dist/formatters/entry.js.map +1 -1
- package/dist/formatters/handshake.d.ts +7 -3
- package/dist/formatters/handshake.d.ts.map +1 -1
- package/dist/formatters/handshake.js +26 -23
- package/dist/formatters/handshake.js.map +1 -1
- package/dist/formatters/orient.d.ts +54 -0
- package/dist/formatters/orient.d.ts.map +1 -1
- package/dist/formatters/orient.js +71 -2
- package/dist/formatters/orient.js.map +1 -1
- package/dist/generators/adapters.js +4 -4
- package/dist/generators/region-projections.d.ts +18 -0
- package/dist/generators/region-projections.d.ts.map +1 -0
- package/dist/generators/region-projections.js +49 -0
- package/dist/generators/region-projections.js.map +1 -0
- package/dist/generators/region-projections.test.d.ts +2 -0
- package/dist/generators/region-projections.test.d.ts.map +1 -0
- package/dist/generators/region-projections.test.js +63 -0
- package/dist/generators/region-projections.test.js.map +1 -0
- package/dist/generators/region.d.ts +24 -0
- package/dist/generators/region.d.ts.map +1 -0
- package/dist/generators/region.js +87 -0
- package/dist/generators/region.js.map +1 -0
- package/dist/generators/region.test.d.ts +2 -0
- package/dist/generators/region.test.d.ts.map +1 -0
- package/dist/generators/region.test.js +126 -0
- package/dist/generators/region.test.js.map +1 -0
- package/dist/index.js +111 -9
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +101 -4
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +225 -11
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/notice-marker.d.ts +3 -0
- package/dist/lib/notice-marker.d.ts.map +1 -0
- package/dist/lib/notice-marker.js +53 -0
- package/dist/lib/notice-marker.js.map +1 -0
- package/dist/lib/onboarding-path-b.d.ts.map +1 -1
- package/dist/lib/onboarding-path-b.js +0 -1
- package/dist/lib/onboarding-path-b.js.map +1 -1
- package/dist/lib/onboarding-shared.d.ts +0 -1
- package/dist/lib/onboarding-shared.d.ts.map +1 -1
- package/dist/lib/onboarding-shared.js +0 -16
- package/dist/lib/onboarding-shared.js.map +1 -1
- package/dist/lib/profiles.d.ts +3 -1
- package/dist/lib/profiles.d.ts.map +1 -1
- package/dist/lib/profiles.js +9 -6
- package/dist/lib/profiles.js.map +1 -1
- package/dist/lib/session.d.ts +10 -0
- package/dist/lib/session.d.ts.map +1 -1
- package/dist/lib/session.js +26 -1
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/tokenConstants.d.ts +2 -0
- package/dist/lib/tokenConstants.d.ts.map +1 -1
- package/dist/lib/tokenConstants.js +2 -0
- package/dist/lib/tokenConstants.js.map +1 -1
- package/dist/lib/update-check.d.ts +26 -11
- package/dist/lib/update-check.d.ts.map +1 -1
- package/dist/lib/update-check.js +123 -73
- package/dist/lib/update-check.js.map +1 -1
- package/dist/lib/upgrade-runner.d.ts +2 -1
- package/dist/lib/upgrade-runner.d.ts.map +1 -1
- package/dist/lib/upgrade-runner.js +8 -7
- package/dist/lib/upgrade-runner.js.map +1 -1
- package/dist/setup/perimeter.d.ts +10 -0
- package/dist/setup/perimeter.d.ts.map +1 -1
- package/dist/setup/perimeter.js +21 -6
- package/dist/setup/perimeter.js.map +1 -1
- package/package.json +2 -1
- package/dist/__tests__/setup.test.d.ts +0 -2
- package/dist/__tests__/setup.test.d.ts.map +0 -1
- package/dist/__tests__/setup.test.js +0 -141
- package/dist/__tests__/setup.test.js.map +0 -1
- package/dist/generators/__tests__/surface-profiles.test.d.ts +0 -2
- package/dist/generators/__tests__/surface-profiles.test.d.ts.map +0 -1
- package/dist/generators/__tests__/surface-profiles.test.js +0 -89
- package/dist/generators/__tests__/surface-profiles.test.js.map +0 -1
- package/dist/lib/onboarding-phases.d.ts +0 -9
- package/dist/lib/onboarding-phases.d.ts.map +0 -1
- package/dist/lib/onboarding-phases.js +0 -120
- package/dist/lib/onboarding-phases.js.map +0 -1
|
@@ -36,19 +36,20 @@ export function detectInstallChannel(execPath = process.execPath, env = process.
|
|
|
36
36
|
return 'npm';
|
|
37
37
|
return 'unknown';
|
|
38
38
|
}
|
|
39
|
-
export function buildUpgradeCommand(channel) {
|
|
39
|
+
export function buildUpgradeCommand(channel, version) {
|
|
40
|
+
const spec = version ? `@productbrain/cli@${version}` : '@productbrain/cli@beta';
|
|
40
41
|
switch (channel) {
|
|
41
42
|
case 'pnpm':
|
|
42
|
-
return { channel, command: 'pnpm', args: ['add', '-g',
|
|
43
|
+
return { channel, command: 'pnpm', args: ['add', '-g', spec], display: `pnpm add -g ${spec}` };
|
|
43
44
|
case 'yarn':
|
|
44
|
-
return { channel, command: 'yarn', args: ['global', 'add',
|
|
45
|
+
return { channel, command: 'yarn', args: ['global', 'add', spec], display: `yarn global add ${spec}` };
|
|
45
46
|
case 'bun':
|
|
46
|
-
return { channel, command: 'bun', args: ['add', '-g',
|
|
47
|
+
return { channel, command: 'bun', args: ['add', '-g', spec], display: `bun add -g ${spec}` };
|
|
47
48
|
case 'brew':
|
|
48
49
|
return { channel, command: 'brew', args: ['upgrade', 'productbrain'], display: 'brew upgrade productbrain' };
|
|
49
50
|
case 'npm':
|
|
50
51
|
case 'unknown':
|
|
51
|
-
return { channel, command: 'npm', args: ['install', '-g',
|
|
52
|
+
return { channel, command: 'npm', args: ['install', '-g', spec], display: version ? `npm install -g ${spec}` : UPGRADE_COMMAND };
|
|
52
53
|
}
|
|
53
54
|
}
|
|
54
55
|
function failureGuidance(message) {
|
|
@@ -62,7 +63,7 @@ function failureGuidance(message) {
|
|
|
62
63
|
return 'Run the displayed upgrade command manually, then retry pb doctor.';
|
|
63
64
|
}
|
|
64
65
|
export function spawnUpgrade(channel = detectInstallChannel(), options = {}) {
|
|
65
|
-
const spec = buildUpgradeCommand(channel);
|
|
66
|
+
const spec = buildUpgradeCommand(channel, options.version);
|
|
66
67
|
const output = [];
|
|
67
68
|
trackEvent('cli.upgrade.initiated', { channel: spec.channel });
|
|
68
69
|
return new Promise((resolve, reject) => {
|
|
@@ -100,7 +101,7 @@ export function spawnUpgrade(channel = detectInstallChannel(), options = {}) {
|
|
|
100
101
|
}));
|
|
101
102
|
return;
|
|
102
103
|
}
|
|
103
|
-
writeUpgradePendingSentinel();
|
|
104
|
+
writeUpgradePendingSentinel(options.version);
|
|
104
105
|
trackEvent('cli.upgrade.succeeded', { channel: spec.channel });
|
|
105
106
|
resolve({ channel: spec.channel, command: spec.display, exitCode, output });
|
|
106
107
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade-runner.js","sourceRoot":"","sources":["../../src/lib/upgrade-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"upgrade-runner.js","sourceRoot":"","sources":["../../src/lib/upgrade-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,4 +59,14 @@ export interface PerimeterOptions {
|
|
|
59
59
|
* repo but accidentally produced an absolute path elsewhere.)
|
|
60
60
|
*/
|
|
61
61
|
export declare function assertSetupWritePath(absPath: string, manifest: PerimeterManifest, options?: PerimeterOptions): void;
|
|
62
|
+
/**
|
|
63
|
+
* isSetupWritePathAllowed — non-throwing companion to assertSetupWritePath.
|
|
64
|
+
*
|
|
65
|
+
* Returns true iff `absPath` resolves inside the perimeter (.productbrain/ plus the
|
|
66
|
+
* manifest's declared surfaces). Use it to filter candidate paths BEFORE asserting —
|
|
67
|
+
* e.g. surface paths a workspace hasn't enabled — so excluded surfaces are skipped
|
|
68
|
+
* silently instead of throwing and being logged as a false warning on every run.
|
|
69
|
+
* Empty/non-string/NUL paths return false (the assert variant throws on those).
|
|
70
|
+
*/
|
|
71
|
+
export declare function isSetupWritePathAllowed(absPath: string, manifest: PerimeterManifest, options?: PerimeterOptions): boolean;
|
|
62
72
|
//# sourceMappingURL=perimeter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"perimeter.d.ts","sourceRoot":"","sources":["../../src/setup/perimeter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,2EAA2E;AAC3E,eAAO,MAAM,yBAAyB,EAAG,2BAAoC,CAAC;AA8B9E;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,GAAE,gBAAqB,GAC7B,IAAI,
|
|
1
|
+
{"version":3,"file":"perimeter.d.ts","sourceRoot":"","sources":["../../src/setup/perimeter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,2EAA2E;AAC3E,eAAO,MAAM,yBAAyB,EAAG,2BAAoC,CAAC;AA8B9E;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,GAAE,gBAAqB,GAC7B,IAAI,CAuBN;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAmBT"}
|
package/dist/setup/perimeter.js
CHANGED
|
@@ -81,6 +81,26 @@ export function assertSetupWritePath(absPath, manifest, options = {}) {
|
|
|
81
81
|
if (absPath.includes('\0')) {
|
|
82
82
|
throw createPerimeterError('Path contains NUL byte.', absPath);
|
|
83
83
|
}
|
|
84
|
+
if (isSetupWritePathAllowed(absPath, manifest, options))
|
|
85
|
+
return;
|
|
86
|
+
const surfaces = manifest.surfaces ?? [];
|
|
87
|
+
throw createPerimeterError(`Setup write refused: path is outside the declared perimeter ` +
|
|
88
|
+
`(.productbrain/ + manifest.surfaces[${surfaces.join(', ')}]).`, resolve(absPath));
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* isSetupWritePathAllowed — non-throwing companion to assertSetupWritePath.
|
|
92
|
+
*
|
|
93
|
+
* Returns true iff `absPath` resolves inside the perimeter (.productbrain/ plus the
|
|
94
|
+
* manifest's declared surfaces). Use it to filter candidate paths BEFORE asserting —
|
|
95
|
+
* e.g. surface paths a workspace hasn't enabled — so excluded surfaces are skipped
|
|
96
|
+
* silently instead of throwing and being logged as a false warning on every run.
|
|
97
|
+
* Empty/non-string/NUL paths return false (the assert variant throws on those).
|
|
98
|
+
*/
|
|
99
|
+
export function isSetupWritePathAllowed(absPath, manifest, options = {}) {
|
|
100
|
+
if (!absPath || typeof absPath !== 'string')
|
|
101
|
+
return false;
|
|
102
|
+
if (absPath.includes('\0'))
|
|
103
|
+
return false;
|
|
84
104
|
const resolvedTarget = resolve(absPath);
|
|
85
105
|
// WP-431 S3 review fix #5: prefer the explicit cwd argument so callers can
|
|
86
106
|
// validate against an absolute repo root without mutating global state via
|
|
@@ -93,12 +113,7 @@ export function assertSetupWritePath(absPath, manifest, options = {}) {
|
|
|
93
113
|
continue;
|
|
94
114
|
allowedRoots.push(resolveUnder(cwd, surface));
|
|
95
115
|
}
|
|
96
|
-
|
|
97
|
-
if (isWithin(root, resolvedTarget))
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
throw createPerimeterError(`Setup write refused: path is outside the declared perimeter ` +
|
|
101
|
-
`(.productbrain/ + manifest.surfaces[${surfaces.join(', ')}]).`, resolvedTarget);
|
|
116
|
+
return allowedRoots.some((root) => isWithin(root, resolvedTarget));
|
|
102
117
|
}
|
|
103
118
|
/**
|
|
104
119
|
* Build a tagged Error for a perimeter violation. The `code` field is the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"perimeter.js","sourceRoot":"","sources":["../../src/setup/perimeter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAWpC,2EAA2E;AAC3E,MAAM,CAAC,MAAM,yBAAyB,GAAG,2BAAoC,CAAC;AAE9E;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAE3C;;;;GAIG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,QAAgB;IAClD,OAAO,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,IAAY,EAAE,SAAiB;IAC/C,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;IAC3D,OAAO,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAC3C,CAAC;AAYD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,QAA2B,EAC3B,UAA4B,EAAE;IAE9B,sEAAsE;IACtE,qEAAqE;IACrE,oEAAoE;IACpE,qDAAqD;IACrD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,oBAAoB,CAAC,4DAA4D,EAAE,OAAO,CAAC,CAAC;IACpG,CAAC;IAED,sEAAsE;IACtE,wDAAwD;IACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,oBAAoB,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAExC,2EAA2E;IAC3E,2EAA2E;IAC3E,6EAA6E;IAC7E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,YAAY,GAAa,CAAC,YAAY,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEvE,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;IACzC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAClE,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"perimeter.js","sourceRoot":"","sources":["../../src/setup/perimeter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@productbrain/cli",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.1096",
|
|
4
4
|
"description": "Product Brain — Chain knowledge and write-back CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
},
|
|
12
12
|
"scripts": {
|
|
13
13
|
"build": "tsc",
|
|
14
|
+
"prepare": "tsc",
|
|
14
15
|
"dev": "tsc --watch",
|
|
15
16
|
"typecheck": "tsc --noEmit",
|
|
16
17
|
"lint": "tsc --noEmit",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* pb setup — guided onboarding tests.
|
|
3
|
-
* WP-301 Slice 3, WP-304 (LLM onboarding). Verifies:
|
|
4
|
-
* - setup with valid existing config goes to onboarding conversation
|
|
5
|
-
* - setup with no config triggers login prompt
|
|
6
|
-
* - setup tracks telemetry events
|
|
7
|
-
*/
|
|
8
|
-
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
9
|
-
// Track telemetry calls in order
|
|
10
|
-
const telemetryEvents = [];
|
|
11
|
-
vi.mock('../lib/telemetry.js', () => ({
|
|
12
|
-
trackEvent: (event) => {
|
|
13
|
-
telemetryEvents.push(event);
|
|
14
|
-
},
|
|
15
|
-
initTelemetry: vi.fn(),
|
|
16
|
-
}));
|
|
17
|
-
const kernelCallMock = vi.fn();
|
|
18
|
-
const kernelCallWithSessionMock = vi.fn();
|
|
19
|
-
vi.mock('../lib/client.js', () => ({
|
|
20
|
-
kernelCall: (...args) => kernelCallMock(...args),
|
|
21
|
-
kernelCallWithSession: (...args) => kernelCallWithSessionMock(...args),
|
|
22
|
-
}));
|
|
23
|
-
let mockConfig = {
|
|
24
|
-
apiKey: 'pb_sk_test_key_1234',
|
|
25
|
-
siteUrl: 'https://test.convex.site',
|
|
26
|
-
};
|
|
27
|
-
vi.mock('../lib/config.js', () => ({
|
|
28
|
-
getConfig: () => {
|
|
29
|
-
if (!mockConfig)
|
|
30
|
-
throw new Error('No API key.');
|
|
31
|
-
return mockConfig;
|
|
32
|
-
},
|
|
33
|
-
getConfigOrGuide: vi.fn(() => mockConfig
|
|
34
|
-
? Promise.resolve(mockConfig)
|
|
35
|
-
: Promise.reject(new Error('No API key.'))),
|
|
36
|
-
HOME_CONFIG_DIR: '/tmp/test-config',
|
|
37
|
-
HOME_ENV_PATH: '/tmp/test-config/.env',
|
|
38
|
-
}));
|
|
39
|
-
let mockSession = null;
|
|
40
|
-
vi.mock('../lib/session.js', () => ({
|
|
41
|
-
readSession: () => mockSession,
|
|
42
|
-
writeSession: vi.fn(),
|
|
43
|
-
clearSession: vi.fn(),
|
|
44
|
-
addCapturedEntry: vi.fn(),
|
|
45
|
-
}));
|
|
46
|
-
const runLoginMock = vi.fn();
|
|
47
|
-
vi.mock('../commands/login.js', () => ({
|
|
48
|
-
runLogin: () => runLoginMock(),
|
|
49
|
-
}));
|
|
50
|
-
// Mock both onboarding paths — they have their own test files
|
|
51
|
-
const runOnboardingMock = vi.fn();
|
|
52
|
-
vi.mock('../lib/onboarding.js', () => ({
|
|
53
|
-
runOnboardingConversation: (...args) => runOnboardingMock(...args),
|
|
54
|
-
}));
|
|
55
|
-
const runOnboardingPathBMock = vi.fn();
|
|
56
|
-
vi.mock('../lib/onboarding-path-b.js', () => ({
|
|
57
|
-
runOnboardingPathB: (...args) => runOnboardingPathBMock(...args),
|
|
58
|
-
}));
|
|
59
|
-
vi.mock('../lib/experiment.js', () => ({
|
|
60
|
-
isExperimentActive: () => false,
|
|
61
|
-
assignOnboardingPath: () => 'B',
|
|
62
|
-
}));
|
|
63
|
-
let confirmAnswers = [];
|
|
64
|
-
let confirmIndex = 0;
|
|
65
|
-
vi.mock('../lib/prompts.js', () => ({
|
|
66
|
-
confirm: () => {
|
|
67
|
-
const answer = confirmAnswers[confirmIndex] ?? false;
|
|
68
|
-
confirmIndex++;
|
|
69
|
-
return Promise.resolve(answer);
|
|
70
|
-
},
|
|
71
|
-
ask: () => Promise.resolve(''),
|
|
72
|
-
password: () => Promise.resolve(''),
|
|
73
|
-
select: () => Promise.resolve(''),
|
|
74
|
-
isInteractive: () => true,
|
|
75
|
-
}));
|
|
76
|
-
import { runSetup } from '../commands/setup.js';
|
|
77
|
-
describe('runSetup', () => {
|
|
78
|
-
beforeEach(() => {
|
|
79
|
-
vi.clearAllMocks();
|
|
80
|
-
runOnboardingPathBMock.mockReset();
|
|
81
|
-
telemetryEvents.length = 0;
|
|
82
|
-
confirmAnswers = [];
|
|
83
|
-
confirmIndex = 0;
|
|
84
|
-
mockConfig = { apiKey: 'pb_sk_test_key_1234', siteUrl: 'https://test.convex.site' };
|
|
85
|
-
mockSession = null;
|
|
86
|
-
});
|
|
87
|
-
it('skips login when valid config exists and runs onboarding', async () => {
|
|
88
|
-
kernelCallMock.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }); // resolveWorkspace
|
|
89
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
90
|
-
await runSetup();
|
|
91
|
-
// Should NOT call runLogin
|
|
92
|
-
expect(runLoginMock).not.toHaveBeenCalled();
|
|
93
|
-
// Should show masked key
|
|
94
|
-
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('pb_sk_'));
|
|
95
|
-
// Should show workspace name
|
|
96
|
-
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Test Workspace'));
|
|
97
|
-
// Should NOT call onboarding (WP-325 S0 — onboarding superseded by MCP-first flow)
|
|
98
|
-
expect(runOnboardingPathBMock).not.toHaveBeenCalled();
|
|
99
|
-
logSpy.mockRestore();
|
|
100
|
-
});
|
|
101
|
-
it('triggers login prompt when no valid config exists', async () => {
|
|
102
|
-
mockConfig = null;
|
|
103
|
-
// User answers: false to "Do you have an account?"
|
|
104
|
-
confirmAnswers = [false];
|
|
105
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
106
|
-
await runSetup();
|
|
107
|
-
// Should show signup guidance
|
|
108
|
-
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('productbrain.io'));
|
|
109
|
-
// Should NOT call runLogin since user said no account
|
|
110
|
-
expect(runLoginMock).not.toHaveBeenCalled();
|
|
111
|
-
logSpy.mockRestore();
|
|
112
|
-
});
|
|
113
|
-
it('calls runLogin when user has account but no config', async () => {
|
|
114
|
-
mockConfig = null;
|
|
115
|
-
// User answers: true to "have account?"
|
|
116
|
-
confirmAnswers = [true];
|
|
117
|
-
// After login, config becomes valid
|
|
118
|
-
runLoginMock.mockImplementation(() => {
|
|
119
|
-
mockConfig = { apiKey: 'pb_sk_new_key', siteUrl: 'https://test.convex.site' };
|
|
120
|
-
});
|
|
121
|
-
kernelCallMock.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }); // resolveWorkspace
|
|
122
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
123
|
-
await runSetup();
|
|
124
|
-
expect(runLoginMock).toHaveBeenCalledOnce();
|
|
125
|
-
expect(telemetryEvents).toContain('key_validated');
|
|
126
|
-
// Should NOT call onboarding (WP-325 S0 — onboarding superseded by MCP-first flow)
|
|
127
|
-
expect(runOnboardingPathBMock).not.toHaveBeenCalled();
|
|
128
|
-
logSpy.mockRestore();
|
|
129
|
-
});
|
|
130
|
-
it('handles workspace verification failure gracefully', async () => {
|
|
131
|
-
kernelCallMock.mockRejectedValueOnce(new Error('Network error')); // resolveWorkspace fails
|
|
132
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
133
|
-
await runSetup();
|
|
134
|
-
// Should warn about connection
|
|
135
|
-
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Could not verify'));
|
|
136
|
-
// Should NOT call onboarding
|
|
137
|
-
expect(runOnboardingMock).not.toHaveBeenCalled();
|
|
138
|
-
logSpy.mockRestore();
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
//# sourceMappingURL=setup.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup.test.js","sourceRoot":"","sources":["../../src/__tests__/setup.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"surface-profiles.test.d.ts","sourceRoot":"","sources":["../../../src/generators/__tests__/surface-profiles.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* surface-profiles — unit tests.
|
|
3
|
-
* BET-270 Slice 0: type system + registry.
|
|
4
|
-
*/
|
|
5
|
-
import { describe, expect, it } from 'vitest';
|
|
6
|
-
import { SURFACE_PROFILES, resolveSurfaceProfile } from '../surface-profiles.js';
|
|
7
|
-
// ── Helper ─────────────────────────────────────────────────────────────
|
|
8
|
-
function isValidProfile(profile) {
|
|
9
|
-
if (!profile || typeof profile !== 'object')
|
|
10
|
-
return false;
|
|
11
|
-
const p = profile;
|
|
12
|
-
return (['batch', 'interactive', 'passive'].includes(p.executionModel) &&
|
|
13
|
-
['multi-file', 'single-file'].includes(p.format) &&
|
|
14
|
-
['stateless', 'conversational', 'autonomous'].includes(p.sessionModel) &&
|
|
15
|
-
typeof p.tokenBudget === 'number' &&
|
|
16
|
-
p.tokenBudget > 0 &&
|
|
17
|
-
['orchestrated', 'direct', 'guided'].includes(p.workflowStyle));
|
|
18
|
-
}
|
|
19
|
-
// ── Registry ───────────────────────────────────────────────────────────
|
|
20
|
-
describe('SURFACE_PROFILES registry', () => {
|
|
21
|
-
it('defines all 4 known targets', () => {
|
|
22
|
-
expect(Object.keys(SURFACE_PROFILES).sort()).toEqual(['claude', 'codex', 'copilot', 'cursor']);
|
|
23
|
-
});
|
|
24
|
-
it.each(['claude', 'cursor', 'codex', 'copilot'])('%s profile has all required fields with correct types', (target) => {
|
|
25
|
-
expect(isValidProfile(SURFACE_PROFILES[target])).toBe(true);
|
|
26
|
-
});
|
|
27
|
-
it('claude profile has correct values', () => {
|
|
28
|
-
const p = SURFACE_PROFILES.claude;
|
|
29
|
-
expect(p.executionModel).toBe('interactive');
|
|
30
|
-
expect(p.format).toBe('multi-file');
|
|
31
|
-
expect(p.sessionModel).toBe('conversational');
|
|
32
|
-
expect(p.tokenBudget).toBe(50000);
|
|
33
|
-
expect(p.workflowStyle).toBe('orchestrated');
|
|
34
|
-
});
|
|
35
|
-
it('cursor profile has correct values', () => {
|
|
36
|
-
const p = SURFACE_PROFILES.cursor;
|
|
37
|
-
expect(p.executionModel).toBe('interactive');
|
|
38
|
-
expect(p.format).toBe('multi-file');
|
|
39
|
-
expect(p.sessionModel).toBe('conversational');
|
|
40
|
-
expect(p.tokenBudget).toBe(50000);
|
|
41
|
-
expect(p.workflowStyle).toBe('orchestrated');
|
|
42
|
-
});
|
|
43
|
-
it('codex profile has correct values', () => {
|
|
44
|
-
const p = SURFACE_PROFILES.codex;
|
|
45
|
-
expect(p.executionModel).toBe('batch');
|
|
46
|
-
expect(p.format).toBe('multi-file');
|
|
47
|
-
expect(p.sessionModel).toBe('autonomous');
|
|
48
|
-
expect(p.tokenBudget).toBe(100000);
|
|
49
|
-
expect(p.workflowStyle).toBe('direct');
|
|
50
|
-
});
|
|
51
|
-
it('copilot profile has correct values', () => {
|
|
52
|
-
const p = SURFACE_PROFILES.copilot;
|
|
53
|
-
expect(p.executionModel).toBe('passive');
|
|
54
|
-
expect(p.format).toBe('single-file');
|
|
55
|
-
expect(p.sessionModel).toBe('stateless');
|
|
56
|
-
expect(p.tokenBudget).toBe(30000);
|
|
57
|
-
expect(p.workflowStyle).toBe('guided');
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
// ── Resolver ──────────────────────────────────────────────────────────
|
|
61
|
-
describe('resolveSurfaceProfile', () => {
|
|
62
|
-
it.each(['claude', 'cursor', 'codex', 'copilot'])('resolves known target "%s" to a valid profile', (target) => {
|
|
63
|
-
const profile = resolveSurfaceProfile(target);
|
|
64
|
-
expect(isValidProfile(profile)).toBe(true);
|
|
65
|
-
});
|
|
66
|
-
it('resolves "claude" to the claude profile', () => {
|
|
67
|
-
expect(resolveSurfaceProfile('claude')).toBe(SURFACE_PROFILES.claude);
|
|
68
|
-
});
|
|
69
|
-
it('resolves "cursor" to the cursor profile', () => {
|
|
70
|
-
expect(resolveSurfaceProfile('cursor')).toBe(SURFACE_PROFILES.cursor);
|
|
71
|
-
});
|
|
72
|
-
it('resolves "codex" to the codex profile', () => {
|
|
73
|
-
expect(resolveSurfaceProfile('codex')).toBe(SURFACE_PROFILES.codex);
|
|
74
|
-
});
|
|
75
|
-
it('resolves "copilot" to the copilot profile', () => {
|
|
76
|
-
expect(resolveSurfaceProfile('copilot')).toBe(SURFACE_PROFILES.copilot);
|
|
77
|
-
});
|
|
78
|
-
it('returns codex profile as fallback for unknown targets', () => {
|
|
79
|
-
expect(resolveSurfaceProfile('unknown-tool')).toBe(SURFACE_PROFILES.codex);
|
|
80
|
-
});
|
|
81
|
-
it('returns codex profile for empty string', () => {
|
|
82
|
-
expect(resolveSurfaceProfile('')).toBe(SURFACE_PROFILES.codex);
|
|
83
|
-
});
|
|
84
|
-
it('fallback profile is a valid profile', () => {
|
|
85
|
-
const fallback = resolveSurfaceProfile('completely-unknown-surface');
|
|
86
|
-
expect(isValidProfile(fallback)).toBe(true);
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
//# sourceMappingURL=surface-profiles.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"surface-profiles.test.js","sourceRoot":"","sources":["../../../src/generators/__tests__/surface-profiles.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Onboarding conversation phases — the 5-phase arc for first-time setup.
|
|
3
|
-
* WP-304: Each phase has a directive (what the LLM should do) and exit criteria (what the CLI checks).
|
|
4
|
-
*/
|
|
5
|
-
import type { ConversationPhase } from './conversation-phases.js';
|
|
6
|
-
export declare const ONBOARDING_PHASES: ConversationPhase[];
|
|
7
|
-
/** Check if user wants to skip the conversation. */
|
|
8
|
-
export declare function userWantsToSkip(text: string): boolean;
|
|
9
|
-
//# sourceMappingURL=onboarding-phases.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding-phases.d.ts","sourceRoot":"","sources":["../../src/lib/onboarding-phases.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,eAAO,MAAM,iBAAiB,EAAE,iBAAiB,EA4GhD,CAAC;AAKF,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD"}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Onboarding conversation phases — the 5-phase arc for first-time setup.
|
|
3
|
-
* WP-304: Each phase has a directive (what the LLM should do) and exit criteria (what the CLI checks).
|
|
4
|
-
*/
|
|
5
|
-
export const ONBOARDING_PHASES = [
|
|
6
|
-
{
|
|
7
|
-
id: 'greet',
|
|
8
|
-
directive: `Your job: Say hello and ask what they're building. One sentence. No fluff.
|
|
9
|
-
Example: "Hey! What are you building?"
|
|
10
|
-
Do NOT ask multiple questions. Do NOT explain Product Brain yet.`,
|
|
11
|
-
exitCriteria: [
|
|
12
|
-
{
|
|
13
|
-
name: 'greeting_sent',
|
|
14
|
-
check: (s) => s.phaseExchanges['greet'] !== undefined && (s.phaseExchanges['greet'] ?? 0) >= 0,
|
|
15
|
-
required: true,
|
|
16
|
-
},
|
|
17
|
-
],
|
|
18
|
-
maxExchanges: 1,
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
id: 'explore',
|
|
22
|
-
directive: `Your job: Learn what they're building. Get specific.
|
|
23
|
-
If they gave a vague answer ("something big", "a tool", "an app"), pick one concrete detail and dig in.
|
|
24
|
-
Ask who uses it, what it actually does, or how it works today.
|
|
25
|
-
Good questions: "Who's using it?" / "What does it replace?" / "How does that work today?"
|
|
26
|
-
Bad questions: "What domain are you operating in?" / "Can you elaborate on that?"
|
|
27
|
-
Do NOT ask why they're trying Product Brain yet.
|
|
28
|
-
One question only.`,
|
|
29
|
-
exitCriteria: [
|
|
30
|
-
{
|
|
31
|
-
name: 'user_mentioned_product',
|
|
32
|
-
check: (s) => s.signals.mentionedProduct,
|
|
33
|
-
required: true,
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
name: 'has_substantive_answer',
|
|
37
|
-
check: (s) => s.signals.hasSubstantiveAnswer,
|
|
38
|
-
required: true,
|
|
39
|
-
},
|
|
40
|
-
],
|
|
41
|
-
maxExchanges: 3,
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
id: 'deepen',
|
|
45
|
-
directive: `Your job: Understand what's hard about what they're building.
|
|
46
|
-
Pick ONE specific thing they mentioned and ask what breaks or why it's hard. Be direct and short.
|
|
47
|
-
Good: "What breaks when the agent doesn't have that context?" / "Where does the rework hit hardest?"
|
|
48
|
-
Bad: "What makes it hard to ensure X?" / "Can you tell me more about the challenges?"
|
|
49
|
-
Do NOT ask why they're trying Product Brain yet.
|
|
50
|
-
One question only.`,
|
|
51
|
-
exitCriteria: [
|
|
52
|
-
{
|
|
53
|
-
name: 'user_mentioned_challenge',
|
|
54
|
-
check: (s) => s.signals.mentionedChallenge,
|
|
55
|
-
required: false,
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
name: 'min_2_substantive_messages',
|
|
59
|
-
check: (s) => s.signals.substantiveMessageCount >= 2,
|
|
60
|
-
required: true,
|
|
61
|
-
},
|
|
62
|
-
],
|
|
63
|
-
maxExchanges: 2,
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
id: 'why_pb',
|
|
67
|
-
directive: `Your job: Ask what made them try Product Brain. Be direct.
|
|
68
|
-
Examples: "What made you try Product Brain?" or "What problem are you hoping Product Brain solves?"
|
|
69
|
-
Do NOT summarize or synthesize yet.
|
|
70
|
-
One question only.`,
|
|
71
|
-
exitCriteria: [
|
|
72
|
-
{
|
|
73
|
-
name: 'user_answered_why_pb',
|
|
74
|
-
check: (s) => s.signals.mentionedWhyPB,
|
|
75
|
-
required: false,
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
name: 'min_total_words_25',
|
|
79
|
-
check: (s) => s.totalUserWords >= 25,
|
|
80
|
-
required: true,
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
name: 'min_3_substantive_messages',
|
|
84
|
-
check: (s) => s.signals.substantiveMessageCount >= 3,
|
|
85
|
-
required: true,
|
|
86
|
-
},
|
|
87
|
-
],
|
|
88
|
-
maxExchanges: 2,
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
id: 'bridge',
|
|
92
|
-
directive: `Your job: Bridge the conversation to Product Brain's value. Speak as Product Brain (first person "I").
|
|
93
|
-
Keep it SHORT — 2-3 sentences max. Do NOT list bullet items. The CLI will handle showing examples.
|
|
94
|
-
|
|
95
|
-
Structure:
|
|
96
|
-
1. One sentence connecting their problem to what you (PB) do. Use first person.
|
|
97
|
-
2. One sentence showing you understood something specific they said.
|
|
98
|
-
|
|
99
|
-
Good example: "I can remember all of that across your AI sessions — so next time you open your AI tools, they already know about the decision rot problem and your cashflow automation. No more re-explaining."
|
|
100
|
-
Bad example: "Product Brain can help — it remembers context. Here's what I'd save: * item 1 * item 2 * item 3"
|
|
101
|
-
|
|
102
|
-
Do NOT list items. Do NOT use bullet points or asterisks. The CLI shows examples separately.
|
|
103
|
-
This is a STATEMENT. Do NOT ask a question. Do NOT end with a question mark.`,
|
|
104
|
-
exitCriteria: [
|
|
105
|
-
{
|
|
106
|
-
name: 'bridge_delivered',
|
|
107
|
-
check: (s) => (s.phaseExchanges['bridge'] ?? 0) >= 1,
|
|
108
|
-
required: true,
|
|
109
|
-
},
|
|
110
|
-
],
|
|
111
|
-
maxExchanges: 1,
|
|
112
|
-
},
|
|
113
|
-
];
|
|
114
|
-
/** User wants to skip — detected by regex on user input. */
|
|
115
|
-
const SKIP_PATTERNS = [/\b(?:skip|done|that'?s it|wrap up|let'?s go|finish|end)\b/i];
|
|
116
|
-
/** Check if user wants to skip the conversation. */
|
|
117
|
-
export function userWantsToSkip(text) {
|
|
118
|
-
return SKIP_PATTERNS.some((p) => p.test(text));
|
|
119
|
-
}
|
|
120
|
-
//# sourceMappingURL=onboarding-phases.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding-phases.js","sourceRoot":"","sources":["../../src/lib/onboarding-phases.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,iBAAiB,GAAwB;IACpD;QACE,EAAE,EAAE,OAAO;QACX,SAAS,EAAE;;iEAEkD;QAC7D,YAAY,EAAE;YACZ;gBACE,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;gBAC9F,QAAQ,EAAE,IAAI;aACf;SACF;QACD,YAAY,EAAE,CAAC;KAChB;IACD;QACE,EAAE,EAAE,SAAS;QACb,SAAS,EAAE;;;;;;mBAMI;QACf,YAAY,EAAE;YACZ;gBACE,IAAI,EAAE,wBAAwB;gBAC9B,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB;gBACxC,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,IAAI,EAAE,wBAAwB;gBAC9B,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB;gBAC5C,QAAQ,EAAE,IAAI;aACf;SACF;QACD,YAAY,EAAE,CAAC;KAChB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,SAAS,EAAE;;;;;mBAKI;QACf,YAAY,EAAE;YACZ;gBACE,IAAI,EAAE,0BAA0B;gBAChC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB;gBAC1C,QAAQ,EAAE,KAAK;aAChB;YACD;gBACE,IAAI,EAAE,4BAA4B;gBAClC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,IAAI,CAAC;gBACpD,QAAQ,EAAE,IAAI;aACf;SACF;QACD,YAAY,EAAE,CAAC;KAChB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,SAAS,EAAE;;;mBAGI;QACf,YAAY,EAAE;YACZ;gBACE,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc;gBACtC,QAAQ,EAAE,KAAK;aAChB;YACD;gBACE,IAAI,EAAE,oBAAoB;gBAC1B,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,IAAI,EAAE;gBACpC,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,IAAI,EAAE,4BAA4B;gBAClC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,IAAI,CAAC;gBACpD,QAAQ,EAAE,IAAI;aACf;SACF;QACD,YAAY,EAAE,CAAC;KAChB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,SAAS,EAAE;;;;;;;;;;;6EAW8D;QACzE,YAAY,EAAE;YACZ;gBACE,IAAI,EAAE,kBAAkB;gBACxB,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;gBACpD,QAAQ,EAAE,IAAI;aACf;SACF;QACD,YAAY,EAAE,CAAC;KAChB;CACF,CAAC;AAEF,4DAA4D;AAC5D,MAAM,aAAa,GAAG,CAAC,4DAA4D,CAAC,CAAC;AAErF,oDAAoD;AACpD,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,CAAC"}
|