@productbrain/cli 0.1.0-beta.11381 → 0.1.0-beta.11385
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__/config.test.js +24 -0
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/constants.test.js +13 -4
- package/dist/__tests__/constants.test.js.map +1 -1
- package/dist/__tests__/init.test.js +16 -11
- package/dist/__tests__/init.test.js.map +1 -1
- package/dist/commands/connect-config.test.js +1 -6
- package/dist/commands/connect-config.test.js.map +1 -1
- package/dist/commands/connect-integration.test.js +4 -3
- package/dist/commands/connect-integration.test.js.map +1 -1
- package/dist/commands/connect-redeem-failure.test.js +0 -1
- package/dist/commands/connect-redeem-failure.test.js.map +1 -1
- package/dist/commands/connect-screens.d.ts +9 -22
- package/dist/commands/connect-screens.d.ts.map +1 -1
- package/dist/commands/connect-screens.js +17 -70
- package/dist/commands/connect-screens.js.map +1 -1
- package/dist/commands/connect-screens.test.js +6 -5
- package/dist/commands/connect-screens.test.js.map +1 -1
- package/dist/commands/connect-seal.test.js +0 -1
- package/dist/commands/connect-seal.test.js.map +1 -1
- package/dist/commands/connect.d.ts +2 -3
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +18 -25
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connect.test.js +21 -2
- package/dist/commands/connect.test.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +7 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctor.test.js +21 -17
- package/dist/commands/doctor.test.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +12 -18
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +6 -6
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/upgrade.js +2 -2
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/commands/welcome.d.ts.map +1 -1
- package/dist/commands/welcome.js +2 -1
- package/dist/commands/welcome.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +2 -1
- package/dist/commands/whoami.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/cliFirstRun.d.ts +16 -0
- package/dist/lib/cliFirstRun.d.ts.map +1 -0
- package/dist/lib/cliFirstRun.js +19 -0
- package/dist/lib/cliFirstRun.js.map +1 -0
- package/dist/lib/config.d.ts +4 -4
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +12 -77
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/configResult.d.ts +8 -0
- package/dist/lib/configResult.d.ts.map +1 -1
- package/dist/lib/configResult.js +21 -11
- package/dist/lib/configResult.js.map +1 -1
- package/dist/lib/constants.d.ts +4 -2
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +6 -2
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/projectConfig.d.ts +9 -0
- package/dist/lib/projectConfig.d.ts.map +1 -1
- package/dist/lib/projectConfig.js +27 -1
- package/dist/lib/projectConfig.js.map +1 -1
- package/dist/lib/upgrade-runner.js +2 -2
- package/dist/lib/upgrade-runner.js.map +1 -1
- package/package.json +1 -1
- package/dist/commands/__tests__/connect-handoff.test.d.ts +0 -11
- package/dist/commands/__tests__/connect-handoff.test.d.ts.map +0 -1
- package/dist/commands/__tests__/connect-handoff.test.js +0 -111
- package/dist/commands/__tests__/connect-handoff.test.js.map +0 -1
- package/dist/commands/connect-handoff.d.ts +0 -51
- package/dist/commands/connect-handoff.d.ts.map +0 -1
- package/dist/commands/connect-handoff.js +0 -70
- package/dist/commands/connect-handoff.js.map +0 -1
|
@@ -108,6 +108,15 @@ export declare function readBoundPreviewKey(projectRoot: string, binding: Previe
|
|
|
108
108
|
* pb connect calls this before its redeem for the folder it is about to pin (WP-810).
|
|
109
109
|
*/
|
|
110
110
|
export declare function refuseTrackedPin(projectRoot: string): void;
|
|
111
|
+
/** The home folder is no project: a pin or hooks written there bind every folder under it (TASK-562). */
|
|
112
|
+
export declare function isHomeFolder(folder: string, home?: string): boolean;
|
|
113
|
+
/** The refusal pb connect gives in the home folder, pinned word for word by its test (RULE-662). */
|
|
114
|
+
export declare const HOME_FOLDER_REFUSAL = "Run pb connect in your project folder, not your home folder.";
|
|
115
|
+
/**
|
|
116
|
+
* TASK-562: a new terminal opens in the home folder, and a pin there binds every folder under it
|
|
117
|
+
* (findProjectRoot walks up to it). pb connect calls this before its redeem, so the token still works.
|
|
118
|
+
*/
|
|
119
|
+
export declare function refuseHomeFolder(folder: string): void;
|
|
111
120
|
/**
|
|
112
121
|
* Read .productbrain/config.local.json from the walked-up project root.
|
|
113
122
|
* Returns the machine-local pin (`profile`), the optional hand-added `role` (DEC-1961), and any
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectConfig.d.ts","sourceRoot":"","sources":["../../src/lib/projectConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH,+FAA+F;AAC/F,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wFAAwF;IACxF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB/D;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAI7C;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,CASnF;AAQD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAWD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAYnI;AAKD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAY1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,IAAI,kBAAkB,GAAG,IAAI,CA6DlE"}
|
|
1
|
+
{"version":3,"file":"projectConfig.d.ts","sourceRoot":"","sources":["../../src/lib/projectConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH,+FAA+F;AAC/F,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wFAAwF;IACxF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgB/D;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAI7C;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,CASnF;AAQD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAWD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAYnI;AAKD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAY1D;AAKD,yGAAyG;AACzG,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,OAAO,CAE9E;AAED,oGAAoG;AACpG,eAAO,MAAM,mBAAmB,iEAAiE,CAAC;AAElG;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAOrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,IAAI,kBAAkB,GAAG,IAAI,CA6DlE"}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* is gitignored, a fresh clone or worktree does NOT inherit it (INS-2462) — the caller must
|
|
16
16
|
* treat "no pin" as an explicit state, never as permission to guess a workspace.
|
|
17
17
|
*/
|
|
18
|
-
import { readFileSync, existsSync } from 'fs';
|
|
18
|
+
import { readFileSync, existsSync, realpathSync } from 'fs';
|
|
19
19
|
import { resolve } from 'path';
|
|
20
20
|
import { homedir } from 'os';
|
|
21
21
|
import { execFileSync } from 'child_process';
|
|
@@ -146,6 +146,32 @@ export function refuseTrackedPin(projectRoot) {
|
|
|
146
146
|
}
|
|
147
147
|
untrackedPinRoots.add(projectRoot);
|
|
148
148
|
}
|
|
149
|
+
/** A symlinked home (macOS /tmp → /private/tmp) must still compare equal to its target. */
|
|
150
|
+
const realPath = (p) => { try {
|
|
151
|
+
return realpathSync(p);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return resolve(p);
|
|
155
|
+
} };
|
|
156
|
+
/** The home folder is no project: a pin or hooks written there bind every folder under it (TASK-562). */
|
|
157
|
+
export function isHomeFolder(folder, home = homedir()) {
|
|
158
|
+
return realPath(folder) === realPath(home);
|
|
159
|
+
}
|
|
160
|
+
/** The refusal pb connect gives in the home folder, pinned word for word by its test (RULE-662). */
|
|
161
|
+
export const HOME_FOLDER_REFUSAL = 'Run pb connect in your project folder, not your home folder.';
|
|
162
|
+
/**
|
|
163
|
+
* TASK-562: a new terminal opens in the home folder, and a pin there binds every folder under it
|
|
164
|
+
* (findProjectRoot walks up to it). pb connect calls this before its redeem, so the token still works.
|
|
165
|
+
*/
|
|
166
|
+
export function refuseHomeFolder(folder) {
|
|
167
|
+
if (!isHomeFolder(folder))
|
|
168
|
+
return;
|
|
169
|
+
throw new CLIError(HOME_FOLDER_REFUSAL, {
|
|
170
|
+
code: ErrorCode.VALIDATION_FAILED,
|
|
171
|
+
category: 'validation',
|
|
172
|
+
guidance: 'cd into your project, then run the same command. Your token still works.',
|
|
173
|
+
});
|
|
174
|
+
}
|
|
149
175
|
/**
|
|
150
176
|
* Read .productbrain/config.local.json from the walked-up project root.
|
|
151
177
|
* Returns the machine-local pin (`profile`), the optional hand-added `role` (DEC-1961), and any
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectConfig.js","sourceRoot":"","sources":["../../src/lib/projectConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"projectConfig.js","sourceRoot":"","sources":["../../src/lib/projectConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAkClD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAC5C,IACE,UAAU,CAAC,KAAK,CAAC;YACjB,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;gBACxC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAClD,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,GAAG,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAChD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IAC/B,OAAO,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,CAAC,GAAW,EAAkB,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YAC3H,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,CAAC,0CAA0C;QACzD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,6GAA6G;AAC7G,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAErD,8EAA8E;AAC9E,MAAM,OAAO,GAAG,cAAc,CAAC;AAa/B,uFAAuF;AACvF,SAAS,sBAAsB,CAAC,MAA+B;IAC7D,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,oBAAoB,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IACvH,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1E,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAC9G,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,OAA0B;IACjF,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACxF,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QAC/C,IAAI,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,aAAa,KAAK,OAAO,CAAC,aAAa,IAAI,IAAI,KAAK,OAAO,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/G,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,+FAA+F;AAC/F,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,IAAI,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC;QAAE,OAAO;IAC/C,IAAI,qBAAqB,CAAC,WAAW,CAAC,CAAC,iCAAiC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnF,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,eAAe,EAAE,mBAAmB,CAAC,CAAC;QAC3E,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,qCAAqC,CAAC;QAChG,MAAM,IAAI,QAAQ,CAAC,GAAG,OAAO,IAAI,KAAK,qEAAqE,EAAE;YAC3G,IAAI,EAAE,SAAS,CAAC,cAAc;YAC9B,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,iHAAiH;SAC5H,CAAC,CAAC;IACL,CAAC;IACD,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACrC,CAAC;AAED,2FAA2F;AAC3F,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAU,EAAE,GAAG,IAAI,CAAC;IAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;AAAC,CAAC;AAAC,MAAM,CAAC;IAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AAAC,CAAC,CAAC,CAAC,CAAC;AAEzG,yGAAyG;AACzG,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,OAAe,OAAO,EAAE;IACnE,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,oGAAoG;AACpG,MAAM,CAAC,MAAM,mBAAmB,GAAG,8DAA8D,CAAC;AAElG;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAAE,OAAO;IAClC,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE;QACtC,IAAI,EAAE,SAAS,CAAC,iBAAiB;QACjC,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,0EAA0E;KACrF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,eAAe,EAAE,mBAAmB,CAAC,CAAC;IAC9E,iGAAiG;IACjG,8FAA8F;IAC9F,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;YACnG,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACzD,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAClC,CAAC;QACD,0FAA0F;QAC1F,EAAE;QACF,2FAA2F;QAC3F,6FAA6F;QAC7F,6FAA6F;QAC7F,0FAA0F;QAC1F,6FAA6F;QAC7F,sDAAsD;QACtD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC1D,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;gBAClF,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC;YAChC,CAAC;QACH,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACzD,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAClC,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC5B,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACrE,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;QAC9C,CAAC;QACD,0FAA0F;QAC1F,6FAA6F;QAC7F,MAAM,UAAU,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,UAAU;YAAE,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;QAC/C,+FAA+F;QAC/F,6FAA6F;QAC7F,yFAAyF;QACzF,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;;gBACtC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;QACnC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC;QACpG,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
import { basename, dirname } from 'node:path';
|
|
3
3
|
import { CLIError, ErrorCode } from './errors.js';
|
|
4
|
-
import {
|
|
4
|
+
import { CLI_INSTALL_COMMAND } from './cliFirstRun.js';
|
|
5
5
|
import { writeUpgradePendingSentinel } from './update-check.js';
|
|
6
6
|
function pathSegments(path) {
|
|
7
7
|
const segments = [];
|
|
@@ -48,7 +48,7 @@ export function buildUpgradeCommand(channel, version) {
|
|
|
48
48
|
return { channel, command: 'brew', args: ['upgrade', 'productbrain'], display: 'brew upgrade productbrain' };
|
|
49
49
|
case 'npm':
|
|
50
50
|
case 'unknown':
|
|
51
|
-
return { channel, command: 'npm', args: ['install', '-g', spec], display: version ? `npm install -g ${spec}` :
|
|
51
|
+
return { channel, command: 'npm', args: ['install', '-g', spec], display: version ? `npm install -g ${spec}` : CLI_INSTALL_COMMAND };
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
function failureGuidance(message) {
|
|
@@ -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,
|
|
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,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAwBhE,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,OAAO,OAAO,IAAI,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/C,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,MAAyB,OAAO,CAAC,GAAG;IACpG,MAAM,EAAE,GAAG,GAAG,CAAC,qBAAqB,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC5D,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC5D,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC;IAClG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,cAAc,CAAC;QAAE,OAAO,KAAK,CAAC;IAClF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAuB,EAAE,OAAgB;IAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC;IACjF,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,eAAe,IAAI,EAAE,EAAE,CAAC;QACjG,KAAK,MAAM;YACT,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,mBAAmB,IAAI,EAAE,EAAE,CAAC;QACzG,KAAK,KAAK;YACR,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,IAAI,EAAE,EAAE,CAAC;QAC/F,KAAK,MAAM;YACT,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC;QAC/G,KAAK,KAAK,CAAC;QACX,KAAK,SAAS;YACZ,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC;IACzI,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACpE,OAAO,yKAAyK,CAAC;IACnL,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACpH,OAAO,iHAAiH,CAAC;IAC3H,CAAC;IACD,OAAO,mEAAmE,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,UAA0B,oBAAoB,EAAE,EAChD,UAA+B,EAAE;IAEjC,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YAC3C,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;YAC/B,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClB,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC/B,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAE/B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAC/C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,mBAAmB,IAAI,CAAC,OAAO,EAAE,CAAC;YACjE,MAAM,CAAC,IAAI,QAAQ,CAAC,mBAAmB,OAAO,EAAE,EAAE;gBAChD,IAAI,EAAE,SAAS,CAAC,cAAc;gBAC9B,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC;aACnC,CAAC,CAAC,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC;YAC3B,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,qBAAqB,QAAQ,EAAE,CAAC;gBAC9F,MAAM,CAAC,IAAI,QAAQ,CAAC,mBAAmB,OAAO,EAAE,EAAE;oBAChD,IAAI,EAAE,SAAS,CAAC,cAAc;oBAC9B,QAAQ,EAAE,UAAU;oBACpB,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC;iBACnC,CAAC,CAAC,CAAC;gBACJ,OAAO;YACT,CAAC;YACD,2BAA2B,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7C,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WP-433 S4 — FEAT-1291: Tests for connect-handoff module.
|
|
3
|
-
*
|
|
4
|
-
* Contract:
|
|
5
|
-
* 1. Heuristic table: 5 cases, each asserts exact agent + message strings.
|
|
6
|
-
* 2. ≤200-char invariant: all 5 messages must be ≤200 characters.
|
|
7
|
-
* 3. No bare-repo undefined: bare-repo result is never undefined/empty.
|
|
8
|
-
* 4. detectHandoffMarkers integration: tmpdir with .claude/ → hasClaude=true.
|
|
9
|
-
*/
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=connect-handoff.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connect-handoff.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/connect-handoff.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WP-433 S4 — FEAT-1291: Tests for connect-handoff module.
|
|
3
|
-
*
|
|
4
|
-
* Contract:
|
|
5
|
-
* 1. Heuristic table: 5 cases, each asserts exact agent + message strings.
|
|
6
|
-
* 2. ≤200-char invariant: all 5 messages must be ≤200 characters.
|
|
7
|
-
* 3. No bare-repo undefined: bare-repo result is never undefined/empty.
|
|
8
|
-
* 4. detectHandoffMarkers integration: tmpdir with .claude/ → hasClaude=true.
|
|
9
|
-
*/
|
|
10
|
-
import { mkdirSync, rmSync, writeFileSync } from 'fs';
|
|
11
|
-
import { join } from 'path';
|
|
12
|
-
import { tmpdir } from 'os';
|
|
13
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
14
|
-
import { resolveHandoff, detectHandoffMarkers, HANDOFF_MESSAGE_CLAUDE_OR_CURSOR, HANDOFF_MESSAGE_CLAUDE, HANDOFF_MESSAGE_CURSOR, HANDOFF_MESSAGE_CODEX, HANDOFF_MESSAGE_BARE_REPO, } from '../connect-handoff.js';
|
|
15
|
-
// ── 1. Heuristic table (5 cases) ─────────────────────────────────────────────
|
|
16
|
-
describe('resolveHandoff — heuristic table', () => {
|
|
17
|
-
it('.claude=Y, .cursor=Y → claude-or-cursor', () => {
|
|
18
|
-
const result = resolveHandoff({ hasClaude: true, hasCursor: true, hasCodexFile: false });
|
|
19
|
-
expect(result.agent).toBe('claude-or-cursor');
|
|
20
|
-
expect(result.message).toBe('Open Claude Code or Cursor in this project and type in chat: Start Product Brain');
|
|
21
|
-
});
|
|
22
|
-
it('.claude=Y, .cursor=N → claude', () => {
|
|
23
|
-
const result = resolveHandoff({ hasClaude: true, hasCursor: false, hasCodexFile: false });
|
|
24
|
-
expect(result.agent).toBe('claude');
|
|
25
|
-
expect(result.message).toBe('Open Claude Code in this project and type in chat: Start Product Brain');
|
|
26
|
-
});
|
|
27
|
-
it('.claude=N, .cursor=Y → cursor', () => {
|
|
28
|
-
const result = resolveHandoff({ hasClaude: false, hasCursor: true, hasCodexFile: false });
|
|
29
|
-
expect(result.agent).toBe('cursor');
|
|
30
|
-
expect(result.message).toBe('Open Cursor in this project and type in chat: Start Product Brain');
|
|
31
|
-
});
|
|
32
|
-
it('.claude=N, .cursor=N, AGENTS.md=Y → codex', () => {
|
|
33
|
-
const result = resolveHandoff({ hasClaude: false, hasCursor: false, hasCodexFile: true });
|
|
34
|
-
expect(result.agent).toBe('codex');
|
|
35
|
-
expect(result.message).toBe('Open Codex CLI in this project and type in chat: Start Product Brain');
|
|
36
|
-
});
|
|
37
|
-
it('.claude=N, .cursor=N, AGENTS.md=N → bare-repo', () => {
|
|
38
|
-
const result = resolveHandoff({ hasClaude: false, hasCursor: false, hasCodexFile: false });
|
|
39
|
-
expect(result.agent).toBe('bare-repo');
|
|
40
|
-
expect(result.message).toBe('No AI tool detected in this project. Visit productbrain.io/docs to set one up.');
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
// ── 2. Exhaustiveness: every boolean combination returns a defined HandoffResult ──
|
|
44
|
-
describe('resolveHandoff — every boolean combination returns a defined HandoffResult', () => {
|
|
45
|
-
it('covers all 2^3 = 8 marker combinations', () => {
|
|
46
|
-
const bools = [false, true];
|
|
47
|
-
for (const hasClaude of bools) {
|
|
48
|
-
for (const hasCursor of bools) {
|
|
49
|
-
for (const hasCodexFile of bools) {
|
|
50
|
-
const result = resolveHandoff({ hasClaude, hasCursor, hasCodexFile });
|
|
51
|
-
expect(result.agent).toBeDefined();
|
|
52
|
-
expect(result.message.length).toBeGreaterThan(0);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
// ── 4. ≤200-char invariant ────────────────────────────────────────────────────
|
|
59
|
-
describe('handoff message ≤200-char invariant', () => {
|
|
60
|
-
const allMessages = [
|
|
61
|
-
HANDOFF_MESSAGE_CLAUDE_OR_CURSOR,
|
|
62
|
-
HANDOFF_MESSAGE_CLAUDE,
|
|
63
|
-
HANDOFF_MESSAGE_CURSOR,
|
|
64
|
-
HANDOFF_MESSAGE_CODEX,
|
|
65
|
-
HANDOFF_MESSAGE_BARE_REPO,
|
|
66
|
-
];
|
|
67
|
-
it.each(allMessages)('message is ≤200 chars: "%s"', (msg) => {
|
|
68
|
-
expect(msg.length).toBeLessThanOrEqual(200);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
// ── 5. No bare-repo undefined ─────────────────────────────────────────────────
|
|
72
|
-
describe('bare-repo result is never undefined or empty', () => {
|
|
73
|
-
it('resolveHandoff returns bare-repo with non-empty message when no markers', () => {
|
|
74
|
-
const result = resolveHandoff({ hasClaude: false, hasCursor: false, hasCodexFile: false });
|
|
75
|
-
expect(result.agent).toBe('bare-repo');
|
|
76
|
-
expect(result.message).toBeDefined();
|
|
77
|
-
expect(result.message.length).toBeGreaterThan(0);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
// ── 6. detectHandoffMarkers integration ──────────────────────────────────────
|
|
81
|
-
describe('detectHandoffMarkers integration', () => {
|
|
82
|
-
let tmp;
|
|
83
|
-
beforeEach(() => {
|
|
84
|
-
tmp = join(tmpdir(), `pb-handoff-test-${Date.now()}`);
|
|
85
|
-
mkdirSync(tmp, { recursive: true });
|
|
86
|
-
});
|
|
87
|
-
afterEach(() => {
|
|
88
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
89
|
-
});
|
|
90
|
-
it('returns hasClaude=true when .claude/ dir exists', () => {
|
|
91
|
-
mkdirSync(join(tmp, '.claude'));
|
|
92
|
-
const markers = detectHandoffMarkers(tmp);
|
|
93
|
-
expect(markers).toEqual({ hasClaude: true, hasCursor: false, hasCodexFile: false });
|
|
94
|
-
});
|
|
95
|
-
it('returns hasCursor=true when .cursor/ dir exists', () => {
|
|
96
|
-
mkdirSync(join(tmp, '.cursor'));
|
|
97
|
-
const markers = detectHandoffMarkers(tmp);
|
|
98
|
-
expect(markers).toEqual({ hasClaude: false, hasCursor: true, hasCodexFile: false });
|
|
99
|
-
});
|
|
100
|
-
it('returns hasCodexFile=true when AGENTS.md exists', () => {
|
|
101
|
-
// Write a minimal file so existsSync resolves it as a file (not dir)
|
|
102
|
-
writeFileSync(join(tmp, 'AGENTS.md'), '');
|
|
103
|
-
const markers = detectHandoffMarkers(tmp);
|
|
104
|
-
expect(markers).toEqual({ hasClaude: false, hasCursor: false, hasCodexFile: true });
|
|
105
|
-
});
|
|
106
|
-
it('returns all false when directory is empty', () => {
|
|
107
|
-
const markers = detectHandoffMarkers(tmp);
|
|
108
|
-
expect(markers).toEqual({ hasClaude: false, hasCursor: false, hasCodexFile: false });
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
//# sourceMappingURL=connect-handoff.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connect-handoff.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/connect-handoff.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,gCAAgC,EAChC,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,GAE1B,MAAM,uBAAuB,CAAC;AAE/B,gFAAgF;AAEhF,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QACzF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CACzB,kFAAkF,CACnF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1F,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CACzB,wEAAwE,CACzE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1F,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CACzB,mEAAmE,CACpE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1F,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CACzB,sEAAsE,CACvE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3F,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CACzB,gFAAgF,CACjF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,qFAAqF;AAErF,QAAQ,CAAC,4EAA4E,EAAE,GAAG,EAAE;IAC1F,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5B,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;YAC9B,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;gBAC9B,KAAK,MAAM,YAAY,IAAI,KAAK,EAAE,CAAC;oBACjC,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;oBACtE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;oBACnC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,MAAM,WAAW,GAAG;QAClB,gCAAgC;QAChC,sBAAsB;QACtB,sBAAsB;QACtB,qBAAqB;QACrB,yBAAyB;KAC1B,CAAC;IAEF,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,6BAA6B,EAAE,CAAC,GAAG,EAAE,EAAE;QAC1D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC5D,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3F,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,IAAI,GAAW,CAAC;IAEhB,UAAU,CAAC,GAAG,EAAE;QACd,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,qEAAqE;QACrE,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WP-433 S4 — FEAT-1291: pb connect chat handoff + locked agent-detection heuristic.
|
|
3
|
-
*
|
|
4
|
-
* Provides pure detection + resolution of the post-connect handoff message.
|
|
5
|
-
* No I/O side effects except `printHandoff` (which takes a stream).
|
|
6
|
-
*
|
|
7
|
-
* Locked detection heuristic (IMP-12 acceptance: ≤200 chars, user in chat ≤5 sec):
|
|
8
|
-
* .claude/=Y, .cursor/=Y → claude-or-cursor
|
|
9
|
-
* .claude/=Y, .cursor/=N → claude
|
|
10
|
-
* .claude/=N, .cursor/=Y → cursor
|
|
11
|
-
* .claude/=N, .cursor/=N, AGENTS.md=Y → codex
|
|
12
|
-
* .claude/=N, .cursor/=N, AGENTS.md=N → bare-repo (docs link)
|
|
13
|
-
*
|
|
14
|
-
*/
|
|
15
|
-
export type HandoffMarkers = {
|
|
16
|
-
hasClaude: boolean;
|
|
17
|
-
hasCursor: boolean;
|
|
18
|
-
hasCodexFile: boolean;
|
|
19
|
-
};
|
|
20
|
-
export type HandoffAgent = 'claude' | 'cursor' | 'claude-or-cursor' | 'codex' | 'bare-repo';
|
|
21
|
-
export type HandoffResult = {
|
|
22
|
-
agent: HandoffAgent;
|
|
23
|
-
message: string;
|
|
24
|
-
};
|
|
25
|
-
export declare const HANDOFF_MESSAGE_CLAUDE_OR_CURSOR = "Open Claude Code or Cursor in this project and type in chat: Start Product Brain";
|
|
26
|
-
export declare const HANDOFF_MESSAGE_CLAUDE = "Open Claude Code in this project and type in chat: Start Product Brain";
|
|
27
|
-
export declare const HANDOFF_MESSAGE_CURSOR = "Open Cursor in this project and type in chat: Start Product Brain";
|
|
28
|
-
export declare const HANDOFF_MESSAGE_CODEX = "Open Codex CLI in this project and type in chat: Start Product Brain";
|
|
29
|
-
export declare const HANDOFF_MESSAGE_BARE_REPO = "No AI tool detected in this project. Visit productbrain.io/docs to set one up.";
|
|
30
|
-
/**
|
|
31
|
-
* Resolve the handoff agent + message from the detected markers.
|
|
32
|
-
* Implements the locked heuristic table verbatim.
|
|
33
|
-
*/
|
|
34
|
-
export declare function resolveHandoff(markers: HandoffMarkers): HandoffResult;
|
|
35
|
-
/**
|
|
36
|
-
* Detect handoff markers by probing the filesystem at `cwd`.
|
|
37
|
-
* Thin adapter over the surface adapters' detect predicates — keeps this
|
|
38
|
-
* module decoupled from detectSurfaces() while staying grounded in the same
|
|
39
|
-
* filesystem facts.
|
|
40
|
-
*
|
|
41
|
-
* `.claude/` → hasClaude
|
|
42
|
-
* `.cursor/` → hasCursor
|
|
43
|
-
* `AGENTS.md` or `.codex/` → hasCodexFile (mirrors codexAdapter.detect)
|
|
44
|
-
*/
|
|
45
|
-
export declare function detectHandoffMarkers(cwd: string): HandoffMarkers;
|
|
46
|
-
/**
|
|
47
|
-
* Write the handoff message to `stdout` followed by a trailing newline.
|
|
48
|
-
* No extra prose, no boxes, no spinners.
|
|
49
|
-
*/
|
|
50
|
-
export declare function printHandoff(stdout: NodeJS.WritableStream, result: HandoffResult): void;
|
|
51
|
-
//# sourceMappingURL=connect-handoff.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connect-handoff.d.ts","sourceRoot":"","sources":["../../src/commands/connect-handoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,QAAQ,GACR,kBAAkB,GAClB,OAAO,GACP,WAAW,CAAC;AAEhB,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,eAAO,MAAM,gCAAgC,qFACuC,CAAC;AAErF,eAAO,MAAM,sBAAsB,2EACuC,CAAC;AAE3E,eAAO,MAAM,sBAAsB,sEACkC,CAAC;AAEtE,eAAO,MAAM,qBAAqB,yEACsC,CAAC;AAEzE,eAAO,MAAM,yBAAyB,mFAC4C,CAAC;AAInF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CAgBrE;AAID;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAMhE;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAEvF"}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WP-433 S4 — FEAT-1291: pb connect chat handoff + locked agent-detection heuristic.
|
|
3
|
-
*
|
|
4
|
-
* Provides pure detection + resolution of the post-connect handoff message.
|
|
5
|
-
* No I/O side effects except `printHandoff` (which takes a stream).
|
|
6
|
-
*
|
|
7
|
-
* Locked detection heuristic (IMP-12 acceptance: ≤200 chars, user in chat ≤5 sec):
|
|
8
|
-
* .claude/=Y, .cursor/=Y → claude-or-cursor
|
|
9
|
-
* .claude/=Y, .cursor/=N → claude
|
|
10
|
-
* .claude/=N, .cursor/=Y → cursor
|
|
11
|
-
* .claude/=N, .cursor/=N, AGENTS.md=Y → codex
|
|
12
|
-
* .claude/=N, .cursor/=N, AGENTS.md=N → bare-repo (docs link)
|
|
13
|
-
*
|
|
14
|
-
*/
|
|
15
|
-
import { existsSync } from 'fs';
|
|
16
|
-
import { join } from 'path';
|
|
17
|
-
// ── Locked message strings (IMP-12: ≤200 chars each) ─────────────────────────
|
|
18
|
-
export const HANDOFF_MESSAGE_CLAUDE_OR_CURSOR = 'Open Claude Code or Cursor in this project and type in chat: Start Product Brain';
|
|
19
|
-
export const HANDOFF_MESSAGE_CLAUDE = 'Open Claude Code in this project and type in chat: Start Product Brain';
|
|
20
|
-
export const HANDOFF_MESSAGE_CURSOR = 'Open Cursor in this project and type in chat: Start Product Brain';
|
|
21
|
-
export const HANDOFF_MESSAGE_CODEX = 'Open Codex CLI in this project and type in chat: Start Product Brain';
|
|
22
|
-
export const HANDOFF_MESSAGE_BARE_REPO = 'No AI tool detected in this project. Visit productbrain.io/docs to set one up.';
|
|
23
|
-
// ── Resolution ───────────────────────────────────────────────────────────────
|
|
24
|
-
/**
|
|
25
|
-
* Resolve the handoff agent + message from the detected markers.
|
|
26
|
-
* Implements the locked heuristic table verbatim.
|
|
27
|
-
*/
|
|
28
|
-
export function resolveHandoff(markers) {
|
|
29
|
-
const { hasClaude, hasCursor, hasCodexFile } = markers;
|
|
30
|
-
if (hasClaude && hasCursor) {
|
|
31
|
-
return { agent: 'claude-or-cursor', message: HANDOFF_MESSAGE_CLAUDE_OR_CURSOR };
|
|
32
|
-
}
|
|
33
|
-
if (hasClaude) {
|
|
34
|
-
return { agent: 'claude', message: HANDOFF_MESSAGE_CLAUDE };
|
|
35
|
-
}
|
|
36
|
-
if (hasCursor) {
|
|
37
|
-
return { agent: 'cursor', message: HANDOFF_MESSAGE_CURSOR };
|
|
38
|
-
}
|
|
39
|
-
if (hasCodexFile) {
|
|
40
|
-
return { agent: 'codex', message: HANDOFF_MESSAGE_CODEX };
|
|
41
|
-
}
|
|
42
|
-
return { agent: 'bare-repo', message: HANDOFF_MESSAGE_BARE_REPO };
|
|
43
|
-
}
|
|
44
|
-
// ── Detection ────────────────────────────────────────────────────────────────
|
|
45
|
-
/**
|
|
46
|
-
* Detect handoff markers by probing the filesystem at `cwd`.
|
|
47
|
-
* Thin adapter over the surface adapters' detect predicates — keeps this
|
|
48
|
-
* module decoupled from detectSurfaces() while staying grounded in the same
|
|
49
|
-
* filesystem facts.
|
|
50
|
-
*
|
|
51
|
-
* `.claude/` → hasClaude
|
|
52
|
-
* `.cursor/` → hasCursor
|
|
53
|
-
* `AGENTS.md` or `.codex/` → hasCodexFile (mirrors codexAdapter.detect)
|
|
54
|
-
*/
|
|
55
|
-
export function detectHandoffMarkers(cwd) {
|
|
56
|
-
return {
|
|
57
|
-
hasClaude: existsSync(join(cwd, '.claude')),
|
|
58
|
-
hasCursor: existsSync(join(cwd, '.cursor')),
|
|
59
|
-
hasCodexFile: existsSync(join(cwd, 'AGENTS.md')) || existsSync(join(cwd, '.codex')),
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
// ── Output ───────────────────────────────────────────────────────────────────
|
|
63
|
-
/**
|
|
64
|
-
* Write the handoff message to `stdout` followed by a trailing newline.
|
|
65
|
-
* No extra prose, no boxes, no spinners.
|
|
66
|
-
*/
|
|
67
|
-
export function printHandoff(stdout, result) {
|
|
68
|
-
stdout.write(result.message + '\n');
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=connect-handoff.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connect-handoff.js","sourceRoot":"","sources":["../../src/commands/connect-handoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAsB5B,gFAAgF;AAEhF,MAAM,CAAC,MAAM,gCAAgC,GAC3C,kFAAkF,CAAC;AAErF,MAAM,CAAC,MAAM,sBAAsB,GACjC,wEAAwE,CAAC;AAE3E,MAAM,CAAC,MAAM,sBAAsB,GACjC,mEAAmE,CAAC;AAEtE,MAAM,CAAC,MAAM,qBAAqB,GAChC,sEAAsE,CAAC;AAEzE,MAAM,CAAC,MAAM,yBAAyB,GACpC,gFAAgF,CAAC;AAEnF,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAuB;IACpD,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAEvD,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC;IAClF,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAC9D,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAC9D,CAAC;IACD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC;IAC5D,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;AACpE,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,OAAO;QACL,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC3C,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC3C,YAAY,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;KACpF,CAAC;AACJ,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAA6B,EAAE,MAAqB;IAC/E,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AACtC,CAAC"}
|