@piecemaker-legal/piecemaker 2.0.7 → 2.0.8

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 (73) hide show
  1. package/dist/assets/{abnfDiagram-VCTEODGH-D7dCOIXi.js → abnfDiagram-VCTEODGH-XuFdW3jA.js} +1 -1
  2. package/dist/assets/{arc-DhAWLNVu.js → arc-CsCtfL20.js} +1 -1
  3. package/dist/assets/{architectureDiagram-5GKGNRK7-BzE_kJOM.js → architectureDiagram-5GKGNRK7-DGxozBGS.js} +1 -1
  4. package/dist/assets/{blockDiagram-I7D4REHJ-CCvTgFRD.js → blockDiagram-I7D4REHJ-CsgOSDLB.js} +1 -1
  5. package/dist/assets/{c4Diagram-7LVT6UL2-CdbOnorn.js → c4Diagram-7LVT6UL2-awKtsGCB.js} +1 -1
  6. package/dist/assets/channel-DnynWwYa.js +1 -0
  7. package/dist/assets/{chunk-2Q5K7J3B-D8cmt0Sa.js → chunk-2Q5K7J3B-DA5F8ig-.js} +1 -1
  8. package/dist/assets/{chunk-5VM5RSS4-CnDRnclp.js → chunk-5VM5RSS4-DawRFEGW.js} +1 -1
  9. package/dist/assets/{chunk-F27PBJKO-vgneLl23.js → chunk-F27PBJKO-BO6B_U1p.js} +1 -1
  10. package/dist/assets/{chunk-IMKFNOWR-DMPUusko.js → chunk-IMKFNOWR-Dhrf_k6W.js} +1 -1
  11. package/dist/assets/{chunk-JWPE2WC7-bRfTSGMj.js → chunk-JWPE2WC7-BTGX4CJ7.js} +1 -1
  12. package/dist/assets/{chunk-POPQ4Y6H-C2tl1RjW.js → chunk-POPQ4Y6H-ByKLZ0wa.js} +1 -1
  13. package/dist/assets/{chunk-SVP7TREG-ClClzI9j.js → chunk-SVP7TREG-DNCtUeow.js} +1 -1
  14. package/dist/assets/{chunk-TICWLB2K-DIabeuUc.js → chunk-TICWLB2K-bgcAtBKw.js} +1 -1
  15. package/dist/assets/{chunk-XXDRQBXY-D9_LHetz.js → chunk-XXDRQBXY-AD-pwqOj.js} +1 -1
  16. package/dist/assets/classDiagram-ZZMXUADV-CHIsGj2B.js +1 -0
  17. package/dist/assets/classDiagram-v2-VYDZK3BY-CHIsGj2B.js +1 -0
  18. package/dist/assets/{cose-bilkent-JH36ORCC-Bm_mspWw.js → cose-bilkent-JH36ORCC-D23VMTjy.js} +1 -1
  19. package/dist/assets/{cynefin-OW5HDTMX-CiByP-TO.js → cynefin-OW5HDTMX-thDLtHBg.js} +1 -1
  20. package/dist/assets/{cynefinDiagram-5FMLGOSQ-BAsBRS4i.js → cynefinDiagram-5FMLGOSQ-BTG5qDGi.js} +1 -1
  21. package/dist/assets/{dagre-GXQ25YYZ-p85Sd22I.js → dagre-GXQ25YYZ-yXAeLV32.js} +1 -1
  22. package/dist/assets/{diagram-S7CK7UJ4-D17byk8T.js → diagram-S7CK7UJ4-v1-YDY3c.js} +1 -1
  23. package/dist/assets/{diagram-UQ7AKVKN-CROIyAdR.js → diagram-UQ7AKVKN-DlO9hQ63.js} +1 -1
  24. package/dist/assets/{diagram-VSXAHHWV-DZazZGn6.js → diagram-VSXAHHWV-B3Bz2C6Y.js} +1 -1
  25. package/dist/assets/{diagram-VX7I27RA-Dnrg0GMg.js → diagram-VX7I27RA-BosIgZRa.js} +1 -1
  26. package/dist/assets/{diagram-Z3DM3KII-DaVdLJt4.js → diagram-Z3DM3KII-C1MFbIji.js} +1 -1
  27. package/dist/assets/{ebnfDiagram-PWID7BFC-DdA7pXO0.js → ebnfDiagram-PWID7BFC-B6g9aRAb.js} +1 -1
  28. package/dist/assets/{erDiagram-RLTQ6QDP-X_hPKNl0.js → erDiagram-RLTQ6QDP-BuV5RUQ-.js} +1 -1
  29. package/dist/assets/{flowDiagram-HODETNUW-C87EKwuJ.js → flowDiagram-HODETNUW-OFcS8Psg.js} +1 -1
  30. package/dist/assets/{ganttDiagram-EL5Y4UJY-DKGVh_bq.js → ganttDiagram-EL5Y4UJY-CxCIs-y4.js} +1 -1
  31. package/dist/assets/{gitGraphDiagram-WWUBYQGX-DwSS0so-.js → gitGraphDiagram-WWUBYQGX-DQHfgTRq.js} +1 -1
  32. package/dist/assets/{index-Dhev0IBD.js → index-BPmxqMd5.js} +82 -82
  33. package/dist/assets/{index-DcfdIMj-.css → index-WwknP0l4.css} +1 -1
  34. package/dist/assets/{infoDiagram-27XIBGKW-9M2GYFX-.js → infoDiagram-27XIBGKW-UvDaFHGE.js} +1 -1
  35. package/dist/assets/{ishikawaDiagram-5VMMS53U-DcyPsfdd.js → ishikawaDiagram-5VMMS53U-B04u_588.js} +1 -1
  36. package/dist/assets/{journeyDiagram-3NMN7TZE-uCFTtIkL.js → journeyDiagram-3NMN7TZE-BYvBbjXl.js} +1 -1
  37. package/dist/assets/{kanban-definition-UXKFOSKX-fmP02Y_m.js → kanban-definition-UXKFOSKX-DxAJd2LW.js} +1 -1
  38. package/dist/assets/{layout-CgzYIBR9.js → layout-R7w2kLxO.js} +1 -1
  39. package/dist/assets/{linear-R2LO12tF.js → linear-CmWY0F-m.js} +1 -1
  40. package/dist/assets/{mermaid.core-CcFr1kIk.js → mermaid.core-ClUcKNvb.js} +6 -6
  41. package/dist/assets/{mindmap-definition-YA3MSWOX-DIODLsip.js → mindmap-definition-YA3MSWOX-DZ2GO-J-.js} +1 -1
  42. package/dist/assets/{pegDiagram-XKGWAZYB-FUv_9PC6.js → pegDiagram-XKGWAZYB-DF4i_o7r.js} +1 -1
  43. package/dist/assets/{pieDiagram-E7YTZNPT-CAwW7jyM.js → pieDiagram-E7YTZNPT-G20Z0KTO.js} +1 -1
  44. package/dist/assets/{quadrantDiagram-AXDQQJYC-9h98Z_Df.js → quadrantDiagram-AXDQQJYC-5MRlN0BO.js} +1 -1
  45. package/dist/assets/{railroadDiagram-O6MQD6OU-DkH3Fnef.js → railroadDiagram-O6MQD6OU-B4Fp-guo.js} +1 -1
  46. package/dist/assets/{requirementDiagram-BXWQKSXE-BQs2338b.js → requirementDiagram-BXWQKSXE-DFL0eww_.js} +1 -1
  47. package/dist/assets/{sankeyDiagram-P5KCCOFB-Cx6CaW2J.js → sankeyDiagram-P5KCCOFB-CpOdmqdy.js} +1 -1
  48. package/dist/assets/{sequenceDiagram-WJ2MYXX4-D9bqqWJX.js → sequenceDiagram-WJ2MYXX4-iP9OUxwi.js} +1 -1
  49. package/dist/assets/{sizeCapture-INFHLROL-BaqLD8lN.js → sizeCapture-INFHLROL-C95kgcA-.js} +1 -1
  50. package/dist/assets/{stateDiagram-D77RDMKH-p7iECK7R.js → stateDiagram-D77RDMKH-D9WHRvlY.js} +1 -1
  51. package/dist/assets/{stateDiagram-v2-MP3YSRHH-B2OWsW7s.js → stateDiagram-v2-MP3YSRHH-D9Qlflkb.js} +1 -1
  52. package/dist/assets/{swimlanes-42K2YHIH-DnMxbe0k.js → swimlanes-42K2YHIH-BbMY7ECY.js} +1 -1
  53. package/dist/assets/swimlanesDiagram-VR7AAH4N-CA64dwpM.js +8 -0
  54. package/dist/assets/{timeline-definition-24CTP7MA-Bbrf_JBy.js → timeline-definition-24CTP7MA-BQs8wPer.js} +1 -1
  55. package/dist/assets/{vennDiagram-4TSXK5OY-DgBPpdsN.js → vennDiagram-4TSXK5OY-Imm0EPbt.js} +1 -1
  56. package/dist/assets/{wardleyDiagram-VM6X3IG4-BDQNH02n.js → wardleyDiagram-VM6X3IG4-DpMMDayn.js} +1 -1
  57. package/dist/assets/{xychartDiagram-S5SC5T6Z-DvZhpZ3Y.js → xychartDiagram-S5SC5T6Z-DdLp1sYL.js} +1 -1
  58. package/dist/index.html +2 -2
  59. package/dist/sw.js +1 -1
  60. package/dist-server/server/piecemaker/index.js +3 -2
  61. package/dist-server/server/piecemaker/index.js.map +1 -1
  62. package/dist-server/server/piecemaker/shell-environment.js +102 -0
  63. package/dist-server/server/piecemaker/shell-environment.js.map +1 -0
  64. package/package.json +1 -1
  65. package/server/piecemaker/index.ts +3 -2
  66. package/server/piecemaker/shell-environment.ts +111 -0
  67. package/dist/assets/channel-CVQE_nrA.js +0 -1
  68. package/dist/assets/classDiagram-ZZMXUADV-BNp5yxXb.js +0 -1
  69. package/dist/assets/classDiagram-v2-VYDZK3BY-BNp5yxXb.js +0 -1
  70. package/dist/assets/swimlanesDiagram-VR7AAH4N-CzQACmEN.js +0 -8
  71. package/dist-server/server/piecemaker/claude-executable.js +0 -41
  72. package/dist-server/server/piecemaker/claude-executable.js.map +0 -1
  73. package/server/piecemaker/claude-executable.ts +0 -46
@@ -0,0 +1,111 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { randomUUID } from 'node:crypto';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+
6
+ import express from 'express';
7
+
8
+ export type ShellEnvironmentState =
9
+ | { status: 'inherited' }
10
+ | { status: 'resolved'; shell: string }
11
+ | { status: 'failed'; shell: string; reason: string };
12
+
13
+ const RESOLUTION_TIMEOUT_MS = 10_000;
14
+
15
+ const RESOLUTION_VARIABLES: Record<string, string> = {
16
+ ELECTRON_RUN_AS_NODE: '1',
17
+ ELECTRON_NO_ATTACH_CONSOLE: '1',
18
+ PIECEMAKER_RESOLVING_ENVIRONMENT: '1',
19
+ DISABLE_AUTO_UPDATE: 'true',
20
+ ZSH_TMUX_AUTOSTARTED: 'true',
21
+ ZSH_TMUX_AUTOSTART: 'false',
22
+ };
23
+
24
+ const SHELL_SESSION_VARIABLES = new Set(['_', 'PWD', 'OLDPWD', 'SHLVL', ...Object.keys(RESOLUTION_VARIABLES)]);
25
+
26
+ function quoteForShell(value: string): string {
27
+ return `'${value.replace(/'/g, `'\\''`)}'`;
28
+ }
29
+
30
+ function userShell(environment: NodeJS.ProcessEnv): string {
31
+ return environment.SHELL || os.userInfo().shell || '/bin/zsh';
32
+ }
33
+
34
+ export function extractMarkedEnvironment(output: string, mark: string): Record<string, string> | null {
35
+ const start = output.indexOf(mark);
36
+ const end = output.lastIndexOf(mark);
37
+ if (start === -1 || end <= start) return null;
38
+ try {
39
+ return JSON.parse(output.slice(start + mark.length, end));
40
+ } catch {
41
+ return null;
42
+ }
43
+ }
44
+
45
+ export function adoptShellEnvironment(target: NodeJS.ProcessEnv, shellEnvironment: Record<string, string>) {
46
+ for (const [key, value] of Object.entries(shellEnvironment)) {
47
+ if (key === 'PATH' || SHELL_SESSION_VARIABLES.has(key) || target[key] !== undefined) continue;
48
+ target[key] = value;
49
+ }
50
+ const entries = [...(shellEnvironment.PATH ?? '').split(path.delimiter), ...(target.PATH ?? '').split(path.delimiter)];
51
+ target.PATH = [...new Set(entries.filter(Boolean))].join(path.delimiter);
52
+ }
53
+
54
+ function readShellEnvironment(shell: string): Promise<Record<string, string>> {
55
+ const mark = randomUUID().replace(/-/g, '').slice(0, 12);
56
+ const printEnvironment = `${quoteForShell(process.execPath)} -p '"${mark}" + JSON.stringify(process.env) + "${mark}"'`;
57
+ return new Promise((resolve, reject) => {
58
+ const child = spawn(shell, ['-i', '-l', '-c', printEnvironment], {
59
+ detached: true,
60
+ stdio: ['ignore', 'pipe', 'pipe'],
61
+ env: { ...process.env, ...RESOLUTION_VARIABLES },
62
+ });
63
+ let output = '';
64
+ let errorOutput = '';
65
+ const timer = setTimeout(() => {
66
+ try {
67
+ process.kill(-child.pid!, 'SIGKILL');
68
+ } catch {
69
+ child.kill('SIGKILL');
70
+ }
71
+ reject(new Error(`le shell ${shell} n'a pas répondu en ${RESOLUTION_TIMEOUT_MS / 1000} s`));
72
+ }, RESOLUTION_TIMEOUT_MS);
73
+ child.stdout.on('data', (chunk: Buffer) => { output += chunk.toString(); });
74
+ child.stderr.on('data', (chunk: Buffer) => { errorOutput += chunk.toString(); });
75
+ child.once('error', (error) => {
76
+ clearTimeout(timer);
77
+ reject(new Error(`impossible de lancer ${shell} : ${error.message}`));
78
+ });
79
+ child.once('close', (code) => {
80
+ clearTimeout(timer);
81
+ const environment = extractMarkedEnvironment(output, mark);
82
+ if (environment) {
83
+ resolve(environment);
84
+ return;
85
+ }
86
+ const detail = errorOutput.trim().split('\n').slice(-3).join(' ').slice(0, 300);
87
+ reject(new Error(`le shell ${shell} s'est arrêté (code ${code}) sans fournir son environnement${detail ? ` : ${detail}` : ''}`));
88
+ });
89
+ });
90
+ }
91
+
92
+ export async function resolveDesktopShellEnvironment(): Promise<ShellEnvironmentState> {
93
+ if (process.platform === 'win32' || process.env.ELECTRON_RUN_AS_NODE !== '1') return { status: 'inherited' };
94
+ const shell = userShell(process.env);
95
+ try {
96
+ adoptShellEnvironment(process.env, await readShellEnvironment(shell));
97
+ return { status: 'resolved', shell };
98
+ } catch (error) {
99
+ const reason = error instanceof Error ? error.message : String(error);
100
+ console.warn(`[piecemaker] environnement du shell non résolu, PATH de base conservé : ${reason}`);
101
+ return { status: 'failed', shell, reason };
102
+ }
103
+ }
104
+
105
+ export function createShellEnvironmentRouter(state: ShellEnvironmentState) {
106
+ const router = express.Router();
107
+ router.get('/shell-environment', (_request, response) => {
108
+ response.json(state);
109
+ });
110
+ return router;
111
+ }
@@ -1 +0,0 @@
1
- import{ah as o,ai as n}from"./mermaid.core-CcFr1kIk.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-TICWLB2K-DIabeuUc.js";import{_ as i}from"./mermaid.core-CcFr1kIk.js";import"./chunk-5VM5RSS4-CnDRnclp.js";import"./chunk-XXDRQBXY-D9_LHetz.js";import"./chunk-POPQ4Y6H-C2tl1RjW.js";import"./chunk-F27PBJKO-vgneLl23.js";import"./index-Dhev0IBD.js";import"./vendor-codemirror-CjW0lHR5.js";import"./vendor-react-D809iwXR.js";import"./vendor-xterm-BWUgpGtR.js";var c={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{c as diagram};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-TICWLB2K-DIabeuUc.js";import{_ as i}from"./mermaid.core-CcFr1kIk.js";import"./chunk-5VM5RSS4-CnDRnclp.js";import"./chunk-XXDRQBXY-D9_LHetz.js";import"./chunk-POPQ4Y6H-C2tl1RjW.js";import"./chunk-F27PBJKO-vgneLl23.js";import"./index-Dhev0IBD.js";import"./vendor-codemirror-CjW0lHR5.js";import"./vendor-react-D809iwXR.js";import"./vendor-xterm-BWUgpGtR.js";var c={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{c as diagram};
@@ -1,8 +0,0 @@
1
- import{c as r,s as e}from"./flowDiagram-HODETNUW-C87EKwuJ.js";import{_ as a}from"./mermaid.core-CcFr1kIk.js";import"./chunk-5VM5RSS4-CnDRnclp.js";import"./chunk-XXDRQBXY-D9_LHetz.js";import"./chunk-POPQ4Y6H-C2tl1RjW.js";import"./chunk-F27PBJKO-vgneLl23.js";import"./index-Dhev0IBD.js";import"./vendor-codemirror-CjW0lHR5.js";import"./vendor-react-D809iwXR.js";import"./vendor-xterm-BWUgpGtR.js";import"./channel-CVQE_nrA.js";var o=a(t=>`${e(t)}
2
- .swimlane.cluster rect {
3
- stroke: ${t.clusterBorder} !important;
4
- }
5
- [data-look="neo"].cluster rect {
6
- filter: none;
7
- }
8
- `,"getStyles"),m=o,g=r({defaultLayout:"swimlane",styles:m});export{g as diagram};
@@ -1,41 +0,0 @@
1
- import fs from 'node:fs';
2
- import { createRequire } from 'node:module';
3
- import path from 'node:path';
4
- function isExecutableFile(candidate) {
5
- try {
6
- fs.accessSync(candidate, fs.constants.X_OK);
7
- return fs.statSync(candidate).isFile();
8
- }
9
- catch {
10
- return false;
11
- }
12
- }
13
- function bundledSdkExecutable() {
14
- try {
15
- const packageName = `@anthropic-ai/claude-agent-sdk-${process.platform}-${process.arch}`;
16
- return createRequire(import.meta.url).resolve(`${packageName}/claude`);
17
- }
18
- catch {
19
- return null;
20
- }
21
- }
22
- export function claudeExecutableFallback(context) {
23
- if (context.platform === 'win32' || context.environment.CLAUDE_CLI_PATH)
24
- return null;
25
- const searchPath = (context.environment.PATH || '').split(path.delimiter).filter(Boolean);
26
- if (searchPath.some((directory) => context.isExecutable(path.join(directory, 'claude'))))
27
- return null;
28
- const bundled = context.bundledExecutable();
29
- return bundled && context.isExecutable(bundled) ? bundled : null;
30
- }
31
- export function useBundledClaudeWhenMissingFromPath() {
32
- const fallback = claudeExecutableFallback({
33
- environment: process.env,
34
- platform: process.platform,
35
- isExecutable: isExecutableFile,
36
- bundledExecutable: bundledSdkExecutable,
37
- });
38
- if (fallback)
39
- process.env.CLAUDE_CLI_PATH = fallback;
40
- }
41
- //# sourceMappingURL=claude-executable.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-executable.js","sourceRoot":"","sources":["../../../server/piecemaker/claude-executable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B,SAAS,gBAAgB,CAAC,SAAiB;IACzC,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5C,OAAO,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,kCAAkC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACzF,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,WAAW,SAAS,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAgC;IACvE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IACrF,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1F,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACtG,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAC5C,OAAO,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,mCAAmC;IACjD,MAAM,QAAQ,GAAG,wBAAwB,CAAC;QACxC,WAAW,EAAE,OAAO,CAAC,GAAG;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,gBAAgB;QAC9B,iBAAiB,EAAE,oBAAoB;KACxC,CAAC,CAAC;IACH,IAAI,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,QAAQ,CAAC;AACvD,CAAC"}
@@ -1,46 +0,0 @@
1
- import fs from 'node:fs';
2
- import { createRequire } from 'node:module';
3
- import path from 'node:path';
4
-
5
- type ClaudeExecutableContext = {
6
- environment: NodeJS.ProcessEnv;
7
- platform: NodeJS.Platform;
8
- isExecutable(candidate: string): boolean;
9
- bundledExecutable(): string | null;
10
- };
11
-
12
- function isExecutableFile(candidate: string): boolean {
13
- try {
14
- fs.accessSync(candidate, fs.constants.X_OK);
15
- return fs.statSync(candidate).isFile();
16
- } catch {
17
- return false;
18
- }
19
- }
20
-
21
- function bundledSdkExecutable(): string | null {
22
- try {
23
- const packageName = `@anthropic-ai/claude-agent-sdk-${process.platform}-${process.arch}`;
24
- return createRequire(import.meta.url).resolve(`${packageName}/claude`);
25
- } catch {
26
- return null;
27
- }
28
- }
29
-
30
- export function claudeExecutableFallback(context: ClaudeExecutableContext): string | null {
31
- if (context.platform === 'win32' || context.environment.CLAUDE_CLI_PATH) return null;
32
- const searchPath = (context.environment.PATH || '').split(path.delimiter).filter(Boolean);
33
- if (searchPath.some((directory) => context.isExecutable(path.join(directory, 'claude')))) return null;
34
- const bundled = context.bundledExecutable();
35
- return bundled && context.isExecutable(bundled) ? bundled : null;
36
- }
37
-
38
- export function useBundledClaudeWhenMissingFromPath() {
39
- const fallback = claudeExecutableFallback({
40
- environment: process.env,
41
- platform: process.platform,
42
- isExecutable: isExecutableFile,
43
- bundledExecutable: bundledSdkExecutable,
44
- });
45
- if (fallback) process.env.CLAUDE_CLI_PATH = fallback;
46
- }