@productbrain/cli 0.1.0-beta.11381 → 0.1.0-beta.11395

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.
Files changed (104) hide show
  1. package/dist/__tests__/adminConfig.test.js +3 -3
  2. package/dist/__tests__/adminConfig.test.js.map +1 -1
  3. package/dist/__tests__/config.test.js +24 -0
  4. package/dist/__tests__/config.test.js.map +1 -1
  5. package/dist/__tests__/constants.test.js +13 -4
  6. package/dist/__tests__/constants.test.js.map +1 -1
  7. package/dist/__tests__/init.test.js +77 -13
  8. package/dist/__tests__/init.test.js.map +1 -1
  9. package/dist/__tests__/session-hook-conversation.test.d.ts +2 -0
  10. package/dist/__tests__/session-hook-conversation.test.d.ts.map +1 -0
  11. package/dist/__tests__/session-hook-conversation.test.js +87 -0
  12. package/dist/__tests__/session-hook-conversation.test.js.map +1 -0
  13. package/dist/__tests__/upgrade-runner.test.js +44 -18
  14. package/dist/__tests__/upgrade-runner.test.js.map +1 -1
  15. package/dist/commands/connect-config.test.js +1 -6
  16. package/dist/commands/connect-config.test.js.map +1 -1
  17. package/dist/commands/connect-integration.test.js +4 -3
  18. package/dist/commands/connect-integration.test.js.map +1 -1
  19. package/dist/commands/connect-redeem-failure.test.js +0 -1
  20. package/dist/commands/connect-redeem-failure.test.js.map +1 -1
  21. package/dist/commands/connect-screens.d.ts +9 -22
  22. package/dist/commands/connect-screens.d.ts.map +1 -1
  23. package/dist/commands/connect-screens.js +17 -70
  24. package/dist/commands/connect-screens.js.map +1 -1
  25. package/dist/commands/connect-screens.test.js +6 -5
  26. package/dist/commands/connect-screens.test.js.map +1 -1
  27. package/dist/commands/connect-seal.test.js +0 -1
  28. package/dist/commands/connect-seal.test.js.map +1 -1
  29. package/dist/commands/connect.d.ts +2 -3
  30. package/dist/commands/connect.d.ts.map +1 -1
  31. package/dist/commands/connect.js +18 -25
  32. package/dist/commands/connect.js.map +1 -1
  33. package/dist/commands/connect.test.js +21 -2
  34. package/dist/commands/connect.test.js.map +1 -1
  35. package/dist/commands/doctor.d.ts.map +1 -1
  36. package/dist/commands/doctor.js +7 -4
  37. package/dist/commands/doctor.js.map +1 -1
  38. package/dist/commands/doctor.test.js +21 -17
  39. package/dist/commands/doctor.test.js.map +1 -1
  40. package/dist/commands/init.d.ts +8 -2
  41. package/dist/commands/init.d.ts.map +1 -1
  42. package/dist/commands/init.js +105 -61
  43. package/dist/commands/init.js.map +1 -1
  44. package/dist/commands/session-hook.d.ts +38 -0
  45. package/dist/commands/session-hook.d.ts.map +1 -0
  46. package/dist/commands/session-hook.js +94 -0
  47. package/dist/commands/session-hook.js.map +1 -0
  48. package/dist/commands/session-hook.test.d.ts +2 -0
  49. package/dist/commands/session-hook.test.d.ts.map +1 -0
  50. package/dist/commands/session-hook.test.js +89 -0
  51. package/dist/commands/session-hook.test.js.map +1 -0
  52. package/dist/commands/status.d.ts.map +1 -1
  53. package/dist/commands/status.js +6 -6
  54. package/dist/commands/status.js.map +1 -1
  55. package/dist/commands/upgrade.js +9 -9
  56. package/dist/commands/upgrade.js.map +1 -1
  57. package/dist/commands/welcome.d.ts.map +1 -1
  58. package/dist/commands/welcome.js +2 -1
  59. package/dist/commands/welcome.js.map +1 -1
  60. package/dist/commands/whoami.d.ts.map +1 -1
  61. package/dist/commands/whoami.js +2 -1
  62. package/dist/commands/whoami.js.map +1 -1
  63. package/dist/index.js +8 -18
  64. package/dist/index.js.map +1 -1
  65. package/dist/lib/adminConfig.d.ts.map +1 -1
  66. package/dist/lib/adminConfig.js +3 -7
  67. package/dist/lib/adminConfig.js.map +1 -1
  68. package/dist/lib/cliFirstRun.d.ts +16 -0
  69. package/dist/lib/cliFirstRun.d.ts.map +1 -0
  70. package/dist/lib/cliFirstRun.js +19 -0
  71. package/dist/lib/cliFirstRun.js.map +1 -0
  72. package/dist/lib/config.d.ts +4 -4
  73. package/dist/lib/config.d.ts.map +1 -1
  74. package/dist/lib/config.js +12 -77
  75. package/dist/lib/config.js.map +1 -1
  76. package/dist/lib/configResult.d.ts +8 -0
  77. package/dist/lib/configResult.d.ts.map +1 -1
  78. package/dist/lib/configResult.js +21 -11
  79. package/dist/lib/configResult.js.map +1 -1
  80. package/dist/lib/constants.d.ts +4 -2
  81. package/dist/lib/constants.d.ts.map +1 -1
  82. package/dist/lib/constants.js +6 -2
  83. package/dist/lib/constants.js.map +1 -1
  84. package/dist/lib/conversation.d.ts +10 -0
  85. package/dist/lib/conversation.d.ts.map +1 -1
  86. package/dist/lib/conversation.js +66 -0
  87. package/dist/lib/conversation.js.map +1 -1
  88. package/dist/lib/projectConfig.d.ts +9 -0
  89. package/dist/lib/projectConfig.d.ts.map +1 -1
  90. package/dist/lib/projectConfig.js +27 -1
  91. package/dist/lib/projectConfig.js.map +1 -1
  92. package/dist/lib/upgrade-runner.d.ts +20 -4
  93. package/dist/lib/upgrade-runner.d.ts.map +1 -1
  94. package/dist/lib/upgrade-runner.js +67 -32
  95. package/dist/lib/upgrade-runner.js.map +1 -1
  96. package/package.json +1 -1
  97. package/dist/commands/__tests__/connect-handoff.test.d.ts +0 -11
  98. package/dist/commands/__tests__/connect-handoff.test.d.ts.map +0 -1
  99. package/dist/commands/__tests__/connect-handoff.test.js +0 -111
  100. package/dist/commands/__tests__/connect-handoff.test.js.map +0 -1
  101. package/dist/commands/connect-handoff.d.ts +0 -51
  102. package/dist/commands/connect-handoff.d.ts.map +0 -1
  103. package/dist/commands/connect-handoff.js +0 -70
  104. package/dist/commands/connect-handoff.js.map +0 -1
@@ -1,4 +1,9 @@
1
- export type InstallChannel = 'npm' | 'pnpm' | 'yarn' | 'bun' | 'brew' | 'unknown';
1
+ export type InstallChannel = 'npm' | 'pnpm' | 'yarn' | 'bun' | 'unknown';
2
+ /** Which package manager installed this pb, and for npm the global prefix it lives under. */
3
+ export type PbInstall = {
4
+ channel: InstallChannel;
5
+ prefix?: string;
6
+ };
2
7
  export type UpgradeCommand = {
3
8
  channel: InstallChannel;
4
9
  command: string;
@@ -16,7 +21,18 @@ export type SpawnUpgradeOptions = {
16
21
  env?: NodeJS.ProcessEnv;
17
22
  version?: string;
18
23
  };
19
- export declare function detectInstallChannel(execPath?: string, env?: NodeJS.ProcessEnv): InstallChannel;
20
- export declare function buildUpgradeCommand(channel: InstallChannel, version?: string): UpgradeCommand;
21
- export declare function spawnUpgrade(channel?: InstallChannel, options?: SpawnUpgradeOptions): Promise<UpgradeResult>;
24
+ /**
25
+ * TEN-3308: the installer is read from where pb itself lives, never from the node binary running it.
26
+ * A pb under Homebrew's prefix run by a proto or nvm node was upgraded into that node's prefix, so the
27
+ * old pb stayed first on PATH. An npm install also names its prefix, so the new pb replaces this one.
28
+ */
29
+ export declare function detectPbInstall(pbPath?: string, separator?: "/" | "\\", npmGlobalPrefix?: () => string | null): PbInstall;
30
+ /**
31
+ * One shell word for the printed command (Codex P2 on #1937). The spawn passes an argv array and
32
+ * needs no quoting; the line a person or agent pastes does, or a prefix such as
33
+ * `C:\Users\Jane Doe\…` splits in two. Windows shells take double quotes, POSIX shells single quotes.
34
+ */
35
+ export declare function shellWord(arg: string, platform?: NodeJS.Platform): string;
36
+ export declare function buildUpgradeCommand({ channel, prefix }: PbInstall, version?: string, platform?: NodeJS.Platform): UpgradeCommand;
37
+ export declare function spawnUpgrade(install?: PbInstall, options?: SpawnUpgradeOptions): Promise<UpgradeResult>;
22
38
  //# sourceMappingURL=upgrade-runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade-runner.d.ts","sourceRoot":"","sources":["../../src/lib/upgrade-runner.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAElF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAYF,wBAAgB,oBAAoB,CAAC,QAAQ,SAAmB,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,cAAc,CActH;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,CAe7F;AAaD,wBAAgB,YAAY,CAC1B,OAAO,GAAE,cAAuC,EAChD,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,aAAa,CAAC,CA6CxB"}
1
+ {"version":3,"file":"upgrade-runner.d.ts","sourceRoot":"","sources":["../../src/lib/upgrade-runner.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;AAEzE,6FAA6F;AAC7F,MAAM,MAAM,SAAS,GAAG;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAkBF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,SAAkB,EAAE,SAAS,aAAM,EAAE,eAAe,GAAE,MAAM,MAAM,GAAG,IAA0B,GAAG,SAAS,CAgBhJ;AAWD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,MAAM,CAG3F;AAOD,wBAAgB,mBAAmB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,cAAc,CAalJ;AAaD,wBAAgB,YAAY,CAC1B,OAAO,GAAE,SAA6B,EACtC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,aAAa,CAAC,CA6CxB"}
@@ -1,7 +1,7 @@
1
- import { spawn } from 'node:child_process';
2
- import { basename, dirname } from 'node:path';
1
+ import { execFileSync, spawn } from 'node:child_process';
2
+ import { realpathSync } from 'node:fs';
3
+ import { basename, dirname, sep } from 'node:path';
3
4
  import { CLIError, ErrorCode } from './errors.js';
4
- import { UPGRADE_COMMAND } from './constants.js';
5
5
  import { writeUpgradePendingSentinel } from './update-check.js';
6
6
  function pathSegments(path) {
7
7
  const segments = [];
@@ -12,43 +12,78 @@ function pathSegments(path) {
12
12
  }
13
13
  return segments;
14
14
  }
15
- export function detectInstallChannel(execPath = process.execPath, env = process.env) {
16
- const ua = env.npm_config_user_agent?.toLowerCase() ?? '';
17
- if (ua.startsWith('pnpm'))
18
- return 'pnpm';
19
- if (ua.startsWith('yarn'))
20
- return 'yarn';
21
- if (ua.startsWith('bun'))
22
- return 'bun';
23
- if (ua.startsWith('npm'))
24
- return 'npm';
25
- const segments = pathSegments(execPath);
15
+ /** The real path of the running pb script; a symlinked bin resolves to the package that holds it. */
16
+ function runningPbPath() {
17
+ const script = process.argv[1] ?? '';
18
+ try {
19
+ return realpathSync(script);
20
+ }
21
+ catch {
22
+ return script;
23
+ }
24
+ }
25
+ /**
26
+ * TEN-3308: the installer is read from where pb itself lives, never from the node binary running it.
27
+ * A pb under Homebrew's prefix run by a proto or nvm node was upgraded into that node's prefix, so the
28
+ * old pb stayed first on PATH. An npm install also names its prefix, so the new pb replaces this one.
29
+ */
30
+ export function detectPbInstall(pbPath = runningPbPath(), separator = sep, npmGlobalPrefix = readNpmGlobalPrefix) {
31
+ const segments = pathSegments(pbPath);
26
32
  if (segments.some((s) => s.includes('pnpm')))
27
- return 'pnpm';
33
+ return { channel: 'pnpm' };
28
34
  if (segments.some((s) => s.includes('yarn')))
29
- return 'yarn';
30
- if (segments.some((s) => s.includes('bun')))
31
- return 'bun';
32
- if (segments.some((s) => s.includes('homebrew') || s === 'brew' || s === 'cellar'))
33
- return 'brew';
34
- if (segments.some((s) => s.includes('npm') || s === 'node_modules'))
35
- return 'npm';
36
- return 'unknown';
35
+ return { channel: 'yarn' };
36
+ if (segments.some((s) => s === '.bun' || s === 'bun'))
37
+ return { channel: 'bun' };
38
+ const marker = ['', 'node_modules', '@productbrain', 'cli', ''].join(separator);
39
+ const at = pbPath.indexOf(marker);
40
+ if (at < 0)
41
+ return { channel: 'unknown' };
42
+ // Only a global install gets --prefix (Reviewer F1 on #1937): a project-local pb or an npx cache
43
+ // also sits under node_modules, and `npm install -g --prefix <it>` would write bin/ and lib/ there.
44
+ // POSIX global installs live in <prefix>/lib/node_modules; on Windows <prefix>\node_modules, and
45
+ // that root counts only when it is npm's own global prefix. Anything else is the plain -g line.
46
+ const root = pbPath.slice(0, at);
47
+ if (separator === '/')
48
+ return root.endsWith('/lib') ? { channel: 'npm', prefix: root.slice(0, -'/lib'.length) } : { channel: 'unknown' };
49
+ const global = npmGlobalPrefix();
50
+ return global && global.toLowerCase() === root.toLowerCase() ? { channel: 'npm', prefix: root } : { channel: 'unknown' };
51
+ }
52
+ /** npm's global prefix, asked only on Windows where the path alone cannot tell a global install from a local one. */
53
+ function readNpmGlobalPrefix() {
54
+ try {
55
+ return execFileSync('npm', ['prefix', '-g'], { encoding: 'utf8', shell: true, timeout: 10_000 }).trim() || null;
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ /**
62
+ * One shell word for the printed command (Codex P2 on #1937). The spawn passes an argv array and
63
+ * needs no quoting; the line a person or agent pastes does, or a prefix such as
64
+ * `C:\Users\Jane Doe\…` splits in two. Windows shells take double quotes, POSIX shells single quotes.
65
+ */
66
+ export function shellWord(arg, platform = process.platform) {
67
+ if (/^[A-Za-z0-9_@%+=:,./-]+$/.test(arg))
68
+ return arg;
69
+ return platform === 'win32' ? `"${arg.replace(/"/g, '""')}"` : `'${arg.replace(/'/g, `'\\''`)}'`;
70
+ }
71
+ /** The only builder of the display line: the same argv the spawn runs, each word quoted for a shell. */
72
+ function upgradeCommand(channel, command, args, platform) {
73
+ return { channel, command, args, display: [command, ...args].map((a) => shellWord(a, platform)).join(' ') };
37
74
  }
38
- export function buildUpgradeCommand(channel, version) {
75
+ export function buildUpgradeCommand({ channel, prefix }, version, platform = process.platform) {
39
76
  const spec = version ? `@productbrain/cli@${version}` : '@productbrain/cli@beta';
40
77
  switch (channel) {
41
78
  case 'pnpm':
42
- return { channel, command: 'pnpm', args: ['add', '-g', spec], display: `pnpm add -g ${spec}` };
79
+ return upgradeCommand(channel, 'pnpm', ['add', '-g', spec], platform);
43
80
  case 'yarn':
44
- return { channel, command: 'yarn', args: ['global', 'add', spec], display: `yarn global add ${spec}` };
81
+ return upgradeCommand(channel, 'yarn', ['global', 'add', spec], platform);
45
82
  case 'bun':
46
- return { channel, command: 'bun', args: ['add', '-g', spec], display: `bun add -g ${spec}` };
47
- case 'brew':
48
- return { channel, command: 'brew', args: ['upgrade', 'productbrain'], display: 'brew upgrade productbrain' };
83
+ return upgradeCommand(channel, 'bun', ['add', '-g', spec], platform);
49
84
  case 'npm':
50
85
  case 'unknown':
51
- return { channel, command: 'npm', args: ['install', '-g', spec], display: version ? `npm install -g ${spec}` : UPGRADE_COMMAND };
86
+ return upgradeCommand(channel, 'npm', ['install', '-g', ...(prefix ? ['--prefix', prefix] : []), spec], platform);
52
87
  }
53
88
  }
54
89
  function failureGuidance(message) {
@@ -61,8 +96,8 @@ function failureGuidance(message) {
61
96
  }
62
97
  return 'Run the displayed upgrade command manually, then retry pb doctor.';
63
98
  }
64
- export function spawnUpgrade(channel = detectInstallChannel(), options = {}) {
65
- const spec = buildUpgradeCommand(channel, options.version);
99
+ export function spawnUpgrade(install = detectPbInstall(), options = {}) {
100
+ const spec = buildUpgradeCommand(install, options.version);
66
101
  const output = [];
67
102
  return new Promise((resolve, reject) => {
68
103
  const child = spawn(spec.command, spec.args, {
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade-runner.js","sourceRoot":"","sources":["../../src/lib/upgrade-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upgrade-runner.js","sourceRoot":"","sources":["../../src/lib/upgrade-runner.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.11381",
3
+ "version": "0.1.0-beta.11395",
4
4
  "description": "Product Brain — Chain knowledge and write-back CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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":"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"}
@@ -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"}