chainlesschain 0.162.71 → 0.162.73

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 (176) hide show
  1. package/package.json +3 -2
  2. package/src/assets/web-panel/assets/{AIOps-pes7_jGr.js → AIOps-DTI_-iZ_.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-DiHWdeH1.js → ActionButton-CtpbGicW.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-C51UX-V_.js → Analytics-C1HwMd7E.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-BE6LJLw9.js → AppLayout-Db953rqB.js} +5 -5
  6. package/src/assets/web-panel/assets/{Audit-CtTkLTe2.js → Audit-CuIi9Vup.js} +1 -1
  7. package/src/assets/web-panel/assets/{Backup-lmpVwPxc.js → Backup-DwR7Wlve.js} +1 -1
  8. package/src/assets/web-panel/assets/{BaseInput-Dr7DR1E1.js → BaseInput-B5wNMp7S.js} +1 -1
  9. package/src/assets/web-panel/assets/{Chat-DXph6klA.js → Chat-DivalHgk.js} +6 -6
  10. package/src/assets/web-panel/assets/{ChatBubbleRenderer-RefrXxqp.js → ChatBubbleRenderer-BwPSr02C.js} +1 -1
  11. package/src/assets/web-panel/assets/{Checkbox-BF0aS5R9.js → Checkbox-CJrXPCJH.js} +1 -1
  12. package/src/assets/web-panel/assets/{Codegen-B-oHWNTV.js → Codegen-BieZvOkC.js} +1 -1
  13. package/src/assets/web-panel/assets/{Col-B6KdyRTE.js → Col-BzvPsQgb.js} +1 -1
  14. package/src/assets/web-panel/assets/{Community-D5ac0KyO.js → Community-CWcAMlpQ.js} +1 -1
  15. package/src/assets/web-panel/assets/{Compact-Dc61O2eQ.js → Compact-Bj_BLBpw.js} +1 -1
  16. package/src/assets/web-panel/assets/{Compliance-a48qvNmd.js → Compliance-DKvo0WAi.js} +1 -1
  17. package/src/assets/web-panel/assets/{Cowork-CIF9lSRj.js → Cowork-DRajk8JO.js} +3 -3
  18. package/src/assets/web-panel/assets/{Cron-C_gkf4xd.js → Cron-DPz9MoUo.js} +2 -2
  19. package/src/assets/web-panel/assets/{Crosschain-CJt15PzW.js → Crosschain-BpSuvmns.js} +1 -1
  20. package/src/assets/web-panel/assets/{DID-D8I_okEj.js → DID-Co98G00H.js} +2 -2
  21. package/src/assets/web-panel/assets/{Dashboard-O4q-qCF2.js → Dashboard-8TSG0W7f.js} +2 -2
  22. package/src/assets/web-panel/assets/{Dropdown-flRziiaw.js → Dropdown-CKViu7w3.js} +1 -1
  23. package/src/assets/web-panel/assets/{EmailListRenderer-CnnkfGPw.js → EmailListRenderer-BqfdADvJ.js} +1 -1
  24. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CYAJpGqd.js → FamilyGuardDashboard-aWu1imGZ.js} +1 -1
  25. package/src/assets/web-panel/assets/{Federation-Dm3WqzQ_.js → Federation-w4YpT8EN.js} +1 -1
  26. package/src/assets/web-panel/assets/{FormItemContext-CpAIter6.js → FormItemContext-CAk4CXid.js} +1 -1
  27. package/src/assets/web-panel/assets/{GenericCardRenderer-ChzXcyuN.js → GenericCardRenderer-MoJw4J2L.js} +1 -1
  28. package/src/assets/web-panel/assets/{Git-DElmMsL4.js → Git-HNU_a9Jz.js} +2 -2
  29. package/src/assets/web-panel/assets/{Governance-EWmgn9io.js → Governance-BkIXWYUS.js} +1 -1
  30. package/src/assets/web-panel/assets/{Inference-VtOR_sef.js → Inference-CnquB88h.js} +1 -1
  31. package/src/assets/web-panel/assets/{KnowledgeGraph-OMqlGkMR.js → KnowledgeGraph-PGSMF-uq.js} +1 -1
  32. package/src/assets/web-panel/assets/{Logs-CTgYDsTZ.js → Logs-DCc-nYzu.js} +2 -2
  33. package/src/assets/web-panel/assets/{Marketplace-DZIUTbn8.js → Marketplace-CyGX8XEt.js} +1 -1
  34. package/src/assets/web-panel/assets/{McpTools-DWeOErCA.js → McpTools-DBkZ5yUL.js} +4 -4
  35. package/src/assets/web-panel/assets/{Memory-DwFBp-ev.js → Memory-DmYLRCwo.js} +2 -2
  36. package/src/assets/web-panel/assets/{MobileBridge-D42xBfE3.js → MobileBridge-CszJjeNc.js} +2 -2
  37. package/src/assets/web-panel/assets/{MobileProjects-BHCHauUl.js → MobileProjects-DWgtDsta.js} +1 -1
  38. package/src/assets/web-panel/assets/{Mtc-CabnNsyS.js → Mtc-Bmt_Pmg4.js} +3 -3
  39. package/src/assets/web-panel/assets/{MtcAudit-Ddx9Awu5.js → MtcAudit-BmG0ys0l.js} +2 -2
  40. package/src/assets/web-panel/assets/{Multisig-CJpYBZ8f.js → Multisig-DNd5iMmD.js} +3 -3
  41. package/src/assets/web-panel/assets/{NLProgramming-BvPJskVG.js → NLProgramming-yxbNl09B.js} +1 -1
  42. package/src/assets/web-panel/assets/{Notes-92ELvJM2.js → Notes-CQ0qAzI4.js} +3 -3
  43. package/src/assets/web-panel/assets/{NotificationSettings-CXz0SUzP.js → NotificationSettings-CIzkE4ao.js} +1 -1
  44. package/src/assets/web-panel/assets/{OrderTableRenderer-4iWRkMr-.js → OrderTableRenderer-e1VMUxTi.js} +1 -1
  45. package/src/assets/web-panel/assets/{Organization-DblqJPeY.js → Organization-BNBIlf_R.js} +4 -4
  46. package/src/assets/web-panel/assets/{Overflow-CHfS3HwD.js → Overflow-C5GzzJTq.js} +1 -1
  47. package/src/assets/web-panel/assets/{P2P-DIg0pLIG.js → P2P-DjL2jIED.js} +2 -2
  48. package/src/assets/web-panel/assets/{PdhVaultBrowser-BhD3DGjk.js → PdhVaultBrowser-C2EYDmpW.js} +3 -3
  49. package/src/assets/web-panel/assets/{Permissions-Ct7bwrz8.js → Permissions-BVGCXxDp.js} +4 -4
  50. package/src/assets/web-panel/assets/{PersonalDataHub-DG9c1eas.js → PersonalDataHub-B1xBro16.js} +4 -4
  51. package/src/assets/web-panel/assets/{Pipeline-BwQnEqG0.js → Pipeline-DIYWiDnt.js} +1 -1
  52. package/src/assets/web-panel/assets/{Privacy-BvWaf-Ba.js → Privacy--Qx3QdO1.js} +1 -1
  53. package/src/assets/web-panel/assets/{ProjectInit-BFzMHtiW.js → ProjectInit-DYOEcV04.js} +2 -2
  54. package/src/assets/web-panel/assets/{ProjectSettings-DDpokSpH.js → ProjectSettings-BcOx5-KS.js} +2 -2
  55. package/src/assets/web-panel/assets/{Projects-3IL8lyPl.js → Projects-CO69txk4.js} +1 -1
  56. package/src/assets/web-panel/assets/{Providers-C6BsEzSR.js → Providers-Bj8pCgzo.js} +1 -1
  57. package/src/assets/web-panel/assets/{QuickAsk-Mh6690Ey.js → QuickAsk-Cukpq-4s.js} +1 -1
  58. package/src/assets/web-panel/assets/{Recommend-CJbZ6wgA.js → Recommend-DJB5wUfM.js} +1 -1
  59. package/src/assets/web-panel/assets/{Reputation-GDcyl6iQ.js → Reputation-B9t0-nT0.js} +1 -1
  60. package/src/assets/web-panel/assets/{Row-6p4DKFSi.js → Row-4cniRgxC.js} +1 -1
  61. package/src/assets/web-panel/assets/{RssFeed-BLhrkoDq.js → RssFeed-Y4db_T9t.js} +3 -3
  62. package/src/assets/web-panel/assets/{Search-Ckiyt35t.js → Search-DggZDzlc.js} +1 -1
  63. package/src/assets/web-panel/assets/{Security-qhh-B5Qt.js → Security-C67A6kED.js} +4 -4
  64. package/src/assets/web-panel/assets/{Services-D7a2OwKm.js → Services-BocBjvaa.js} +2 -2
  65. package/src/assets/web-panel/assets/{Skeleton-CSMxupKd.js → Skeleton-C9jI-iOy.js} +1 -1
  66. package/src/assets/web-panel/assets/{Skills-CGpMng8w.js → Skills-2baFHKOW.js} +1 -1
  67. package/src/assets/web-panel/assets/{Sla-CYtaU3Ar.js → Sla-CnowXeRb.js} +1 -1
  68. package/src/assets/web-panel/assets/{SpeechSettings-BTCsu1uM.js → SpeechSettings-DWGBkmUt.js} +1 -1
  69. package/src/assets/web-panel/assets/{SyncSettings-Cnzx2L5I.js → SyncSettings-B89qwCgX.js} +2 -2
  70. package/src/assets/web-panel/assets/Tasks-C1_WvNc0.js +1 -0
  71. package/src/assets/web-panel/assets/{Templates-Ccdx_C3w.js → Templates-P8dBhbxa.js} +1 -1
  72. package/src/assets/web-panel/assets/{Tenant-ZN8c86j3.js → Tenant-DHo0pxrm.js} +1 -1
  73. package/src/assets/web-panel/assets/Terminal-Dr-HvjH-.js +3 -0
  74. package/src/assets/web-panel/assets/{TimelineRenderer-CjgirE9d.js → TimelineRenderer-DM7dOaUR.js} +1 -1
  75. package/src/assets/web-panel/assets/{Tokens-QoRpi6Wf.js → Tokens-DnJxqOPM.js} +1 -1
  76. package/src/assets/web-panel/assets/{Trigger-CEQKJkhs.js → Trigger-C-FLgMzr.js} +1 -1
  77. package/src/assets/web-panel/assets/{Trust-UTuAzV1q.js → Trust-CIT_RVqA.js} +1 -1
  78. package/src/assets/web-panel/assets/{UkeySign-JDs9I7fl.js → UkeySign-Cg9VS6y6.js} +1 -1
  79. package/src/assets/web-panel/assets/{VideoEditing-BACYQQSd.js → VideoEditing-BzoxE8mA.js} +1 -1
  80. package/src/assets/web-panel/assets/{Wallet-C-SKluhH.js → Wallet-ZkmCII8R.js} +3 -3
  81. package/src/assets/web-panel/assets/{WebAuthn-9chizTFy.js → WebAuthn-CptQdp3u.js} +5 -5
  82. package/src/assets/web-panel/assets/{WorkflowEditor-0mF-LAUo.js → WorkflowEditor-Vkz28khO.js} +1 -1
  83. package/src/assets/web-panel/assets/{chat-Di7QINiP.js → chat-DXdmvvEA.js} +1 -1
  84. package/src/assets/web-panel/assets/{colors-SBmhHMM9.js → colors-De7FCj5l.js} +1 -1
  85. package/src/assets/web-panel/assets/{compact-item-BmbETbNj.js → compact-item-DnT3XzME.js} +1 -1
  86. package/src/assets/web-panel/assets/{createContext-C7hFnsJ7.js → createContext-ECZfCCqd.js} +1 -1
  87. package/src/assets/web-panel/assets/devWarning-gaA8VqZf.js +1 -0
  88. package/src/assets/web-panel/assets/{hasIn-CFtthKDD.js → hasIn-Uodg6pAt.js} +1 -1
  89. package/src/assets/web-panel/assets/{index-DRBc1Ewn.js → index-1dWvOqru.js} +1 -1
  90. package/src/assets/web-panel/assets/{index-WjZVyLn7.js → index-BC8SOuGi.js} +1 -1
  91. package/src/assets/web-panel/assets/{index-CovTrPpI.js → index-BUMNJRCl.js} +1 -1
  92. package/src/assets/web-panel/assets/{index-CSnTUPQx.js → index-Bg1RsfAJ.js} +3 -3
  93. package/src/assets/web-panel/assets/{index-NxxQTlPJ.js → index-Blo85ZKd.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-ClIp4Vin.js → index-BtJ8BHU0.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-B4etIqbf.js → index-C01WM7Pk.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DWfObC0n.js → index-C4KhsGXo.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-sz0w-D-C.js → index-C6JgjkY7.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-lRVjtXeH.js → index-C9_Cnvha.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BCcCs7LJ.js → index-CCguvASR.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-C6tZzsb9.js → index-CLzPxAp4.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-D0yO3vWh.js → index-CMuqxCVw.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BcawAm_i.js → index-COTabJQd.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Cib-RTws.js → index-CPjI3AGE.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-C07kpleB.js → index-CaDZ-LMg.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DEYnWiq1.js → index-CbbfcGeJ.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CgXQwqXr.js → index-CcLDjTgI.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-C2CN7coN.js → index-CffZBdA1.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-PN02VlUB.js → index-CwXP0KcT.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-_hO8-EnW.js → index-D2YOclGO.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Dk4ez5rf.js → index-DBsl2SuZ.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-D6vNUp6c.js → index-DCvmjxu9.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-sA4vr5WV.js → index-DGwgEqwl.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DI2xH1fU.js → index-DOIeo8Qs.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-_a2NG3iP.js → index-DPcpxSQt.js} +1 -1
  115. package/src/assets/web-panel/assets/index-DTpmiTGK.js +1 -0
  116. package/src/assets/web-panel/assets/{index-CWDk3nDZ.js → index-Db33l8Ix.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CNpb8m5a.js → index-Dbfj4QL5.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Dww6gCzI.js → index-Dd9Bx3tJ.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Bpo7UVJe.js → index-Dkvf5upf.js} +1 -1
  120. package/src/assets/web-panel/assets/index-DwpvMYUU.js +1 -0
  121. package/src/assets/web-panel/assets/{index-BT2uOwmA.js → index-Dy0AT-uc.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-C2fhXmhW.js → index-FU8Zo5cp.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BcRTX_WO.js → index-JVwNC4yP.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Dps9xdE8.js → index-JqSxr1A7.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-D134XFWR.js → index-KV6dXwKC.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D8CeUlN0.js → index-LwNszM-5.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CcBhsVYn.js → index-cHnmjGqB.js} +1 -1
  128. package/src/assets/web-panel/assets/{initDefaultProps-B1zCwkvT.js → initDefaultProps-B3H1sf95.js} +1 -1
  129. package/src/assets/web-panel/assets/{motion-BDGIV9KA.js → motion-DreYO5eb.js} +1 -1
  130. package/src/assets/web-panel/assets/{move-BITqgluK.js → move-B0OVU04M.js} +1 -1
  131. package/src/assets/web-panel/assets/{omit-uD97QKBF.js → omit-PcEEXHLZ.js} +1 -1
  132. package/src/assets/web-panel/assets/{pickAttrs-CZpXhSIE.js → pickAttrs-DH6-hDkF.js} +1 -1
  133. package/src/assets/web-panel/assets/{placementArrow-ByUvT_08.js → placementArrow-DFamUSEw.js} +1 -1
  134. package/src/assets/web-panel/assets/{responsiveObserve-BQG9LlBs.js → responsiveObserve-DT1grAyh.js} +1 -1
  135. package/src/assets/web-panel/assets/{slide-Bx9TyeEE.js → slide-41lCsY6d.js} +1 -1
  136. package/src/assets/web-panel/assets/{statusUtils-XWaMqYM8.js → statusUtils-FzJ7j2T7.js} +1 -1
  137. package/src/assets/web-panel/assets/{styleChecker-BZ-nMyDB.js → styleChecker-D0Zvn50h.js} +1 -1
  138. package/src/assets/web-panel/assets/{useFlexGapSupport-D_iwA3vx.js → useFlexGapSupport-BTxsJE5n.js} +1 -1
  139. package/src/assets/web-panel/assets/{useFs-DuvW_aRX.js → useFs-DRVttEr3.js} +1 -1
  140. package/src/assets/web-panel/assets/{usePersonalDataHub-BO7orS0d.js → usePersonalDataHub-BSe7NVv0.js} +1 -1
  141. package/src/assets/web-panel/assets/{vnode-Cc_fqAL4.js → vnode-D8O7tUXh.js} +1 -1
  142. package/src/assets/web-panel/assets/{zoom-BGkBp90M.js → zoom-CMQc1RZ4.js} +1 -1
  143. package/src/assets/web-panel/index.html +1 -1
  144. package/src/commands/agent.js +12 -0
  145. package/src/commands/cowork.js +8 -0
  146. package/src/commands/crosschain.js +32 -4
  147. package/src/commands/init.js +10 -10
  148. package/src/commands/loop.js +9 -3
  149. package/src/commands/memory.js +6 -4
  150. package/src/commands/orchestrate.js +5 -2
  151. package/src/commands/video.js +5 -1
  152. package/src/lib/agents.js +16 -5
  153. package/src/lib/cowork-workflow.js +357 -136
  154. package/src/lib/micro-compact.js +52 -0
  155. package/src/lib/output-styles.js +41 -7
  156. package/src/lib/permission-rules.cjs +39 -0
  157. package/src/lib/project-root.cjs +87 -0
  158. package/src/lib/settings-hooks.cjs +18 -6
  159. package/src/lib/settings-loader.cjs +12 -5
  160. package/src/lib/skill-loader.js +62 -43
  161. package/src/lib/slash-commands.js +18 -2
  162. package/src/repl/agent-repl.js +228 -20
  163. package/src/repl/chat-repl.js +4 -2
  164. package/src/repl/permission-tier.js +60 -0
  165. package/src/repl/stream-decision.js +16 -0
  166. package/src/repl/think-command.js +36 -0
  167. package/src/runtime/agent-core.js +67 -10
  168. package/src/runtime/file-ref-expander.js +209 -18
  169. package/src/runtime/headless-runner.js +3 -3
  170. package/src/runtime/headless-stream.js +16 -3
  171. package/src/runtime/mcp-config.js +78 -1
  172. package/src/assets/web-panel/assets/Tasks-BhnGtqaZ.js +0 -1
  173. package/src/assets/web-panel/assets/Terminal-BfgM0oyN.js +0 -3
  174. package/src/assets/web-panel/assets/devWarning-gNvbyy4j.js +0 -1
  175. package/src/assets/web-panel/assets/index-BNXpMnIY.js +0 -1
  176. package/src/assets/web-panel/assets/index-gfHxqT1Q.js +0 -1
@@ -73,20 +73,26 @@ function spawnIteration(cmd, args, { shell, onChild, capture }) {
73
73
  });
74
74
  if (onChild) onChild(child);
75
75
 
76
- let output = "";
76
+ const outChunks = [];
77
77
  if (capture) {
78
78
  child.stdout?.on("data", (d) => {
79
- output += d;
79
+ outChunks.push(d);
80
80
  process.stdout.write(d);
81
81
  });
82
82
  child.stderr?.on("data", (d) => {
83
- output += d;
83
+ outChunks.push(d);
84
84
  process.stderr.write(d);
85
85
  });
86
86
  }
87
87
 
88
88
  // `close` (not `exit`) so piped stdio is fully drained before we resolve.
89
89
  child.on("close", (code, signal) => {
90
+ // Decode the captured bytes once, at the end. Accumulating with
91
+ // `output += chunk` would decode each stdout chunk independently, so a
92
+ // multi-byte UTF-8 character split across a chunk boundary corrupts the
93
+ // captured string that `--until <regex>` / `--dynamic` directive parsing
94
+ // reads. (The raw passthrough writes above are unaffected.)
95
+ const output = Buffer.concat(outChunks).toString("utf-8");
90
96
  resolve({ exitCode: code == null ? null : code, output, signal });
91
97
  });
92
98
  child.on("error", (err) => {
@@ -63,9 +63,8 @@ export function registerMemoryCommand(program) {
63
63
  .option("--json", "Output as JSON")
64
64
  .action(async (options) => {
65
65
  try {
66
- const { loadProjectInstructions } = await import(
67
- "../lib/project-instructions.js"
68
- );
66
+ const { loadProjectInstructions } =
67
+ await import("../lib/project-instructions.js");
69
68
  const cwd = options.cwd || process.cwd();
70
69
  const loaded = loadProjectInstructions({ cwd });
71
70
  if (options.json) {
@@ -519,7 +518,10 @@ export function registerMemoryCommand(program) {
519
518
 
520
519
  if (options.edit) {
521
520
  const { execSync } = await import("child_process");
522
- const editor = process.env.EDITOR || process.env.VISUAL || "nano";
521
+ const editor =
522
+ process.env.EDITOR ||
523
+ process.env.VISUAL ||
524
+ (process.platform === "win32" ? "notepad" : "nano");
523
525
  const filePath = `${memoryDir}/MEMORY.md`;
524
526
  try {
525
527
  execSync(`${editor} "${filePath}"`, { stdio: "inherit" });
@@ -521,9 +521,12 @@ async function _webhookMode(cwd, options) {
521
521
  return;
522
522
  }
523
523
 
524
- let body = "";
525
- req.on("data", (chunk) => (body += chunk.toString("utf8")));
524
+ const bodyChunks = [];
525
+ req.on("data", (chunk) => bodyChunks.push(chunk));
526
526
  req.on("end", async () => {
527
+ // Decode once: per-chunk toString() would corrupt a multi-byte UTF-8
528
+ // char (e.g. Chinese IM webhook text) split across a chunk boundary.
529
+ const body = Buffer.concat(bodyChunks).toString("utf-8");
527
530
  let taskText = null;
528
531
  let source = TASK_SOURCE.CLI;
529
532
 
@@ -281,6 +281,7 @@ export function registerVideoCommand(program) {
281
281
  .action(async (action, options) => {
282
282
  const { promises: fs } = await import("fs");
283
283
  const pathMod = await import("path");
284
+ const osMod = await import("os");
284
285
 
285
286
  const base = process.env.APPDATA
286
287
  ? pathMod.join(
@@ -290,7 +291,10 @@ export function registerVideoCommand(program) {
290
291
  "video-editing",
291
292
  )
292
293
  : pathMod.join(
293
- process.env.HOME || "~",
294
+ // os.homedir() resolves the real home on every platform; the old
295
+ // `process.env.HOME || "~"` left a literal "~" on Windows (HOME
296
+ // often unset there) which fs can't resolve.
297
+ osMod.homedir(),
294
298
  ".chainlesschain",
295
299
  "video-editing",
296
300
  );
package/src/lib/agents.js CHANGED
@@ -21,6 +21,7 @@ import fsDefault from "node:fs";
21
21
  import pathDefault from "node:path";
22
22
  import { homedir } from "node:os";
23
23
  import yaml from "js-yaml";
24
+ import { projectRootBase } from "./project-root.cjs";
24
25
 
25
26
  const _deps = { fs: fsDefault, path: pathDefault };
26
27
 
@@ -46,26 +47,36 @@ function parseFrontmatter(content) {
46
47
  /** Normalize `tools` (comma string | array | null) into a string[] or null. */
47
48
  export function normalizeTools(tools) {
48
49
  if (tools == null) return null;
49
- const list = Array.isArray(tools)
50
- ? tools
51
- : String(tools).split(/[,\s]+/);
50
+ const list = Array.isArray(tools) ? tools : String(tools).split(/[,\s]+/);
52
51
  const out = list.map((t) => String(t).trim()).filter(Boolean);
53
52
  return out.length > 0 ? out : null;
54
53
  }
55
54
 
56
55
  /** Directories scanned for agent files — project first (shadows personal). */
57
56
  export function agentDirs(cwd = process.cwd(), opts = {}) {
57
+ const fs = opts.deps?.fs || _deps.fs;
58
58
  const path = opts.deps?.path || _deps.path;
59
59
  const home = opts.home || homedir();
60
60
  // Project-native first (highest precedence), then the Claude-Code-portable
61
61
  // location (so existing `.claude/agents/*.md` work unchanged), then personal.
62
62
  // discoverAgents reverses + last-write-wins, so `.chainlesschain/agents/`
63
63
  // shadows `.claude/agents/` shadows `~/.claude/agents/` on a name clash.
64
- return [
64
+ const dirs = [
65
65
  { dir: path.join(cwd, ".chainlesschain", "agents"), scope: "project" },
66
66
  { dir: path.join(cwd, ".claude", "agents"), scope: "project" },
67
- { dir: path.join(home, ".claude", "agents"), scope: "personal" },
68
67
  ];
68
+ // Subdirectory run: also scan the project-root `.claude` (cwd stays closest
69
+ // and wins on a name clash through the reverse + last-write-wins below).
70
+ const root = projectRootBase(cwd, { fs, path });
71
+ if (root) {
72
+ dirs.push({
73
+ dir: path.join(root, ".chainlesschain", "agents"),
74
+ scope: "project",
75
+ });
76
+ dirs.push({ dir: path.join(root, ".claude", "agents"), scope: "project" });
77
+ }
78
+ dirs.push({ dir: path.join(home, ".claude", "agents"), scope: "personal" });
79
+ return dirs;
69
80
  }
70
81
 
71
82
  /** Recursively collect `*.md` files under `dir` as `{file, rel}` (rel uses /). */