@ebowwa/coder 0.2.1 → 0.7.64

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 (401) hide show
  1. package/README.md +31 -32
  2. package/dist/core/__tests__/permissions.test.d.ts +12 -0
  3. package/dist/core/__tests__/permissions.test.d.ts.map +1 -0
  4. package/dist/core/__tests__/permissions.test.js +851 -0
  5. package/dist/core/agent-loop/__tests__/compaction.test.d.ts +5 -0
  6. package/dist/core/agent-loop/__tests__/compaction.test.d.ts.map +1 -0
  7. package/dist/core/agent-loop/__tests__/compaction.test.js +209 -0
  8. package/dist/core/agent-loop/__tests__/formatters.test.d.ts +5 -0
  9. package/dist/core/agent-loop/__tests__/formatters.test.d.ts.map +1 -0
  10. package/dist/core/agent-loop/__tests__/formatters.test.js +195 -0
  11. package/dist/core/agent-loop/__tests__/index.test.d.ts +5 -0
  12. package/dist/core/agent-loop/__tests__/index.test.d.ts.map +1 -0
  13. package/dist/core/agent-loop/__tests__/index.test.js +121 -0
  14. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts +5 -0
  15. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts.map +1 -0
  16. package/dist/core/agent-loop/__tests__/loop-state.test.js +340 -0
  17. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts +5 -0
  18. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts.map +1 -0
  19. package/dist/core/agent-loop/__tests__/message-builder.test.js +178 -0
  20. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts +5 -0
  21. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts.map +1 -0
  22. package/dist/core/agent-loop/__tests__/tool-executor.test.js +331 -0
  23. package/dist/core/agent-loop/compaction.d.ts +39 -0
  24. package/dist/core/agent-loop/compaction.d.ts.map +1 -0
  25. package/dist/core/agent-loop/compaction.js +51 -0
  26. package/dist/core/agent-loop/formatters.d.ts +21 -0
  27. package/dist/core/agent-loop/formatters.d.ts.map +1 -0
  28. package/dist/core/agent-loop/formatters.js +42 -0
  29. package/dist/core/agent-loop/index.d.ts +25 -0
  30. package/dist/core/agent-loop/index.d.ts.map +1 -0
  31. package/dist/core/agent-loop/index.js +83 -0
  32. package/dist/core/agent-loop/loop-state.d.ts +74 -0
  33. package/dist/core/agent-loop/loop-state.d.ts.map +1 -0
  34. package/dist/core/agent-loop/loop-state.js +147 -0
  35. package/dist/core/agent-loop/message-builder.d.ts +13 -0
  36. package/dist/core/agent-loop/message-builder.d.ts.map +1 -0
  37. package/dist/core/agent-loop/message-builder.js +49 -0
  38. package/dist/core/agent-loop/tool-executor.d.ts +23 -0
  39. package/dist/core/agent-loop/tool-executor.d.ts.map +1 -0
  40. package/dist/core/agent-loop/tool-executor.js +152 -0
  41. package/dist/core/agent-loop/turn-executor.d.ts +57 -0
  42. package/dist/core/agent-loop/turn-executor.d.ts.map +1 -0
  43. package/dist/core/agent-loop/turn-executor.js +124 -0
  44. package/dist/core/agent-loop/types.d.ts +141 -0
  45. package/dist/core/agent-loop/types.d.ts.map +1 -0
  46. package/dist/core/agent-loop/types.js +4 -0
  47. package/dist/core/agent-loop.d.ts +17 -0
  48. package/dist/core/agent-loop.d.ts.map +1 -0
  49. package/dist/core/agent-loop.js +16 -0
  50. package/dist/core/api-client-impl.d.ts +62 -0
  51. package/dist/core/api-client-impl.d.ts.map +1 -0
  52. package/dist/core/api-client-impl.js +479 -0
  53. package/dist/core/api-client.d.ts +6 -0
  54. package/dist/core/api-client.d.ts.map +1 -0
  55. package/dist/core/api-client.js +5 -0
  56. package/dist/core/checkpoints.d.ts +128 -0
  57. package/dist/core/checkpoints.d.ts.map +1 -0
  58. package/dist/core/checkpoints.js +438 -0
  59. package/dist/core/claude-md.d.ts +71 -0
  60. package/dist/core/claude-md.d.ts.map +1 -0
  61. package/dist/core/claude-md.js +198 -0
  62. package/dist/core/cognitive-security/hooks.d.ts +138 -0
  63. package/dist/core/cognitive-security/hooks.d.ts.map +1 -0
  64. package/dist/core/cognitive-security/hooks.js +389 -0
  65. package/dist/core/cognitive-security/index.d.ts +751 -0
  66. package/dist/core/cognitive-security/index.d.ts.map +1 -0
  67. package/dist/core/cognitive-security/index.js +1123 -0
  68. package/dist/core/cognitive-security/middleware.d.ts +136 -0
  69. package/dist/core/cognitive-security/middleware.d.ts.map +1 -0
  70. package/dist/core/cognitive-security/middleware.js +376 -0
  71. package/dist/core/config-loader.d.ts +127 -0
  72. package/dist/core/config-loader.d.ts.map +1 -0
  73. package/dist/core/config-loader.js +219 -0
  74. package/dist/core/context-compaction.d.ts +87 -0
  75. package/dist/core/context-compaction.d.ts.map +1 -0
  76. package/dist/core/context-compaction.js +428 -0
  77. package/dist/core/git-status.d.ts +25 -0
  78. package/dist/core/git-status.d.ts.map +1 -0
  79. package/dist/core/git-status.js +204 -0
  80. package/dist/core/image.d.ts +69 -0
  81. package/dist/core/image.d.ts.map +1 -0
  82. package/dist/core/image.js +290 -0
  83. package/dist/core/image.test.d.ts +2 -0
  84. package/dist/core/image.test.d.ts.map +1 -0
  85. package/dist/core/image.test.js +149 -0
  86. package/dist/core/models.d.ts +123 -0
  87. package/dist/core/models.d.ts.map +1 -0
  88. package/dist/core/models.js +325 -0
  89. package/dist/core/permissions.d.ts +81 -0
  90. package/dist/core/permissions.d.ts.map +1 -0
  91. package/dist/core/permissions.js +327 -0
  92. package/dist/core/retry.d.ts +25 -0
  93. package/dist/core/retry.d.ts.map +1 -0
  94. package/dist/core/retry.js +121 -0
  95. package/dist/core/session-store.d.ts +9 -0
  96. package/dist/core/session-store.d.ts.map +1 -0
  97. package/dist/core/session-store.js +10 -0
  98. package/dist/core/sessions/export.d.ts +47 -0
  99. package/dist/core/sessions/export.d.ts.map +1 -0
  100. package/dist/core/sessions/export.js +256 -0
  101. package/dist/core/sessions/index.d.ts +132 -0
  102. package/dist/core/sessions/index.d.ts.map +1 -0
  103. package/dist/core/sessions/index.js +442 -0
  104. package/dist/core/sessions/metadata.d.ts +77 -0
  105. package/dist/core/sessions/metadata.d.ts.map +1 -0
  106. package/dist/core/sessions/metadata.js +233 -0
  107. package/dist/core/sessions/persistence.d.ts +72 -0
  108. package/dist/core/sessions/persistence.d.ts.map +1 -0
  109. package/dist/core/sessions/persistence.js +201 -0
  110. package/dist/core/sessions/types.d.ts +110 -0
  111. package/dist/core/sessions/types.d.ts.map +1 -0
  112. package/dist/core/sessions/types.js +4 -0
  113. package/dist/core/stream-highlighter.d.ts +18 -0
  114. package/dist/core/stream-highlighter.d.ts.map +1 -0
  115. package/dist/core/stream-highlighter.js +916 -0
  116. package/dist/core/system-reminders.d.ts +89 -0
  117. package/dist/core/system-reminders.d.ts.map +1 -0
  118. package/dist/core/system-reminders.js +285 -0
  119. package/dist/ecosystem/hooks/__tests__/index.test.d.ts +5 -0
  120. package/dist/ecosystem/hooks/__tests__/index.test.d.ts.map +1 -0
  121. package/dist/ecosystem/hooks/__tests__/index.test.js +458 -0
  122. package/dist/ecosystem/hooks/index.d.ts +59 -0
  123. package/dist/ecosystem/hooks/index.d.ts.map +1 -0
  124. package/dist/ecosystem/hooks/index.js +294 -0
  125. package/dist/ecosystem/hooks/prompt-evaluator.d.ts +32 -0
  126. package/dist/ecosystem/hooks/prompt-evaluator.d.ts.map +1 -0
  127. package/dist/ecosystem/hooks/prompt-evaluator.js +229 -0
  128. package/dist/ecosystem/skills/index.d.ts +55 -0
  129. package/dist/ecosystem/skills/index.d.ts.map +1 -0
  130. package/dist/ecosystem/skills/index.js +258 -0
  131. package/dist/ecosystem/tools/__tests__/index.test.d.ts +7 -0
  132. package/dist/ecosystem/tools/__tests__/index.test.d.ts.map +1 -0
  133. package/dist/ecosystem/tools/__tests__/index.test.js +856 -0
  134. package/dist/ecosystem/tools/index.d.ts +24 -0
  135. package/dist/ecosystem/tools/index.d.ts.map +1 -0
  136. package/dist/ecosystem/tools/index.js +1709 -0
  137. package/dist/index.d.ts +24 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +32 -2
  140. package/dist/interfaces/mcp/client.d.ts +40 -0
  141. package/dist/interfaces/mcp/client.d.ts.map +1 -0
  142. package/dist/interfaces/mcp/client.js +309 -0
  143. package/dist/interfaces/ui/index.d.ts +36 -0
  144. package/dist/interfaces/ui/index.d.ts.map +1 -0
  145. package/dist/interfaces/ui/index.js +61 -0
  146. package/dist/interfaces/ui/spinner.d.ts +140 -0
  147. package/dist/interfaces/ui/spinner.d.ts.map +1 -0
  148. package/dist/interfaces/ui/spinner.js +342 -0
  149. package/dist/interfaces/ui/terminal/cli/index.d.ts +12 -0
  150. package/dist/interfaces/ui/terminal/cli/index.d.ts.map +1 -0
  151. package/dist/interfaces/ui/terminal/cli/index.js +167 -0
  152. package/dist/interfaces/ui/terminal/shared/args.d.ts +39 -0
  153. package/dist/interfaces/ui/terminal/shared/args.d.ts.map +1 -0
  154. package/dist/interfaces/ui/terminal/shared/args.js +176 -0
  155. package/dist/interfaces/ui/terminal/shared/index.d.ts +11 -0
  156. package/dist/interfaces/ui/terminal/shared/index.d.ts.map +1 -0
  157. package/dist/interfaces/ui/terminal/shared/index.js +16 -0
  158. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts +124 -0
  159. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts.map +1 -0
  160. package/dist/interfaces/ui/terminal/shared/loading-state.js +246 -0
  161. package/dist/interfaces/ui/terminal/shared/query.d.ts +22 -0
  162. package/dist/interfaces/ui/terminal/shared/query.d.ts.map +1 -0
  163. package/dist/interfaces/ui/terminal/shared/query.js +100 -0
  164. package/dist/interfaces/ui/terminal/shared/setup.d.ts +33 -0
  165. package/dist/interfaces/ui/terminal/shared/setup.d.ts.map +1 -0
  166. package/dist/interfaces/ui/terminal/shared/setup.js +226 -0
  167. package/dist/interfaces/ui/terminal/shared/status-line.d.ts +117 -0
  168. package/dist/interfaces/ui/terminal/shared/status-line.d.ts.map +1 -0
  169. package/dist/interfaces/ui/terminal/shared/status-line.js +267 -0
  170. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts +38 -0
  171. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts.map +1 -0
  172. package/dist/interfaces/ui/terminal/shared/system-prompt.js +102 -0
  173. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts +39 -0
  174. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts.map +1 -0
  175. package/dist/interfaces/ui/terminal/tui/HelpPanel.js +215 -0
  176. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts +91 -0
  177. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts.map +1 -0
  178. package/dist/interfaces/ui/terminal/tui/InputContext.js +154 -0
  179. package/dist/interfaces/ui/terminal/tui/InputField.d.ts +18 -0
  180. package/dist/interfaces/ui/terminal/tui/InputField.d.ts.map +1 -0
  181. package/dist/interfaces/ui/terminal/tui/InputField.js +41 -0
  182. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts +16 -0
  183. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts.map +1 -0
  184. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.js +451 -0
  185. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts +10 -0
  186. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts.map +1 -0
  187. package/dist/interfaces/ui/terminal/tui/MessageArea.js +91 -0
  188. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts +48 -0
  189. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts.map +1 -0
  190. package/dist/interfaces/ui/terminal/tui/MessageStore.js +151 -0
  191. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts +9 -0
  192. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts.map +1 -0
  193. package/dist/interfaces/ui/terminal/tui/StatusBar.js +36 -0
  194. package/dist/interfaces/ui/terminal/tui/commands.d.ts +21 -0
  195. package/dist/interfaces/ui/terminal/tui/commands.d.ts.map +1 -0
  196. package/dist/interfaces/ui/terminal/tui/commands.js +359 -0
  197. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts +115 -0
  198. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts.map +1 -0
  199. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.js +306 -0
  200. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts +92 -0
  201. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts.map +1 -0
  202. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.js +399 -0
  203. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts +59 -0
  204. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts.map +1 -0
  205. package/dist/interfaces/ui/terminal/tui/components/PaneManager.js +139 -0
  206. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts +68 -0
  207. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts.map +1 -0
  208. package/dist/interfaces/ui/terminal/tui/components/Sidebar.js +340 -0
  209. package/dist/interfaces/ui/terminal/tui/components/index.d.ts +23 -0
  210. package/dist/interfaces/ui/terminal/tui/components/index.d.ts.map +1 -0
  211. package/dist/interfaces/ui/terminal/tui/components/index.js +51 -0
  212. package/dist/interfaces/ui/terminal/tui/console.d.ts +20 -0
  213. package/dist/interfaces/ui/terminal/tui/console.d.ts.map +1 -0
  214. package/dist/interfaces/ui/terminal/tui/console.js +46 -0
  215. package/dist/interfaces/ui/terminal/tui/index.d.ts +20 -0
  216. package/dist/interfaces/ui/terminal/tui/index.d.ts.map +1 -0
  217. package/dist/interfaces/ui/terminal/tui/index.js +28 -0
  218. package/dist/interfaces/ui/terminal/tui/run.d.ts +13 -0
  219. package/dist/interfaces/ui/terminal/tui/run.d.ts.map +1 -0
  220. package/dist/interfaces/ui/terminal/tui/run.js +31 -0
  221. package/dist/interfaces/ui/terminal/tui/spinner.d.ts +44 -0
  222. package/dist/interfaces/ui/terminal/tui/spinner.d.ts.map +1 -0
  223. package/dist/interfaces/ui/terminal/tui/spinner.js +59 -0
  224. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts +39 -0
  225. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts.map +1 -0
  226. package/dist/interfaces/ui/terminal/tui/tui-app.js +198 -0
  227. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts +167 -0
  228. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts.map +1 -0
  229. package/dist/interfaces/ui/terminal/tui/tui-footer.js +330 -0
  230. package/dist/interfaces/ui/terminal/tui/types.d.ts +165 -0
  231. package/dist/interfaces/ui/terminal/tui/types.d.ts.map +1 -0
  232. package/dist/interfaces/ui/terminal/tui/types.js +5 -0
  233. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts +23 -0
  234. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts.map +1 -0
  235. package/dist/interfaces/ui/terminal/tui/useInputHandler.js +72 -0
  236. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts +90 -0
  237. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts.map +1 -0
  238. package/dist/interfaces/ui/terminal/tui/useNativeInput.js +188 -0
  239. package/dist/native/index.d.ts +480 -0
  240. package/dist/native/index.d.ts.map +1 -0
  241. package/dist/native/index.js +1625 -0
  242. package/dist/teammates/index.d.ts +161 -0
  243. package/dist/teammates/index.d.ts.map +1 -0
  244. package/dist/teammates/index.js +827 -0
  245. package/dist/types/index.d.ts +482 -0
  246. package/dist/types/index.d.ts.map +1 -0
  247. package/dist/types/index.js +52 -0
  248. package/native/README.md +5 -5
  249. package/native/index.darwin-arm64.node +0 -0
  250. package/native/index.node +0 -0
  251. package/native/package.json +4 -4
  252. package/package.json +33 -16
  253. package/packages/src/core/__tests__/permissions.test.ts +1091 -0
  254. package/packages/src/core/agent-loop/__tests__/compaction.test.ts +280 -0
  255. package/packages/src/core/agent-loop/__tests__/formatters.test.ts +234 -0
  256. package/packages/src/core/agent-loop/__tests__/index.test.ts +162 -0
  257. package/packages/src/core/agent-loop/__tests__/loop-state.test.ts +413 -0
  258. package/packages/src/core/agent-loop/__tests__/message-builder.test.ts +229 -0
  259. package/packages/src/core/agent-loop/__tests__/tool-executor.test.ts +457 -0
  260. package/packages/src/core/agent-loop/compaction.ts +88 -0
  261. package/packages/src/core/agent-loop/formatters.ts +50 -0
  262. package/packages/src/core/agent-loop/index.ts +135 -0
  263. package/packages/src/core/agent-loop/loop-state.ts +187 -0
  264. package/packages/src/core/agent-loop/message-builder.ts +62 -0
  265. package/packages/src/core/agent-loop/tool-executor.ts +211 -0
  266. package/packages/src/core/agent-loop/turn-executor.ts +222 -0
  267. package/packages/src/core/agent-loop/types.ts +148 -0
  268. package/packages/src/core/agent-loop.ts +18 -0
  269. package/packages/src/core/api-client-impl.ts +619 -0
  270. package/packages/src/core/api-client.ts +6 -0
  271. package/packages/src/core/checkpoints.ts +606 -0
  272. package/packages/src/core/claude-md.ts +272 -0
  273. package/packages/src/core/cognitive-security/hooks.ts +590 -0
  274. package/packages/src/core/cognitive-security/index.ts +2041 -0
  275. package/packages/src/core/cognitive-security/middleware.ts +536 -0
  276. package/packages/src/core/config-loader.ts +324 -0
  277. package/packages/src/core/context-compaction.ts +578 -0
  278. package/packages/src/core/git-status.ts +262 -0
  279. package/packages/src/core/image.test.ts +180 -0
  280. package/packages/src/core/image.ts +350 -0
  281. package/packages/src/core/lmdb.db +0 -0
  282. package/packages/src/core/lmdb.db-lock +0 -0
  283. package/packages/src/core/models.ts +430 -0
  284. package/packages/src/core/normalizers/todo +4 -0
  285. package/packages/src/core/permissions.ts +431 -0
  286. package/packages/src/core/retry.ts +170 -0
  287. package/packages/src/core/session-store.ts +36 -0
  288. package/packages/src/core/sessions/export.ts +329 -0
  289. package/packages/src/core/sessions/index.ts +587 -0
  290. package/packages/src/core/sessions/metadata.ts +309 -0
  291. package/packages/src/core/sessions/persistence.ts +244 -0
  292. package/packages/src/core/sessions/types.ts +169 -0
  293. package/packages/src/core/stream-highlighter.ts +1123 -0
  294. package/packages/src/core/system-reminders.ts +402 -0
  295. package/packages/src/core/todo +8 -0
  296. package/packages/src/ecosystem/hooks/__tests__/index.test.ts +561 -0
  297. package/packages/src/ecosystem/hooks/index.ts +341 -0
  298. package/packages/src/ecosystem/hooks/prompt-evaluator.ts +300 -0
  299. package/packages/src/ecosystem/skills/index.ts +295 -0
  300. package/packages/src/ecosystem/tools/__tests__/index.test.ts +1335 -0
  301. package/packages/src/ecosystem/tools/index.ts +1877 -0
  302. package/packages/src/index.ts +120 -0
  303. package/packages/src/interfaces/mcp/client.ts +389 -0
  304. package/packages/src/interfaces/ui/Screenshot 2026-03-02 at 9.23.10/342/200/257PM.png +0 -0
  305. package/packages/src/interfaces/ui/Screenshot 2026-03-03 at 10.55.11/342/200/257AM.png +0 -0
  306. package/packages/src/interfaces/ui/index.ts +161 -0
  307. package/packages/src/interfaces/ui/lmdb.db +0 -0
  308. package/packages/src/interfaces/ui/lmdb.db-lock +0 -0
  309. package/packages/src/interfaces/ui/spinner.ts +451 -0
  310. package/packages/src/interfaces/ui/terminal/cli/index.ts +228 -0
  311. package/packages/src/interfaces/ui/terminal/lmdb.db +0 -0
  312. package/packages/src/interfaces/ui/terminal/lmdb.db-lock +0 -0
  313. package/packages/src/interfaces/ui/terminal/shared/args.ts +222 -0
  314. package/packages/src/interfaces/ui/terminal/shared/index.ts +71 -0
  315. package/packages/src/interfaces/ui/terminal/shared/loading-state.ts +322 -0
  316. package/packages/src/interfaces/ui/terminal/shared/query.ts +146 -0
  317. package/packages/src/interfaces/ui/terminal/shared/setup.ts +295 -0
  318. package/packages/src/interfaces/ui/terminal/shared/status-line.ts +358 -0
  319. package/packages/src/interfaces/ui/terminal/shared/system-prompt.ts +146 -0
  320. package/packages/src/interfaces/ui/terminal/tui/HelpPanel.tsx +262 -0
  321. package/packages/src/interfaces/ui/terminal/tui/InputContext.tsx +232 -0
  322. package/packages/src/interfaces/ui/terminal/tui/InputField.tsx +62 -0
  323. package/packages/src/interfaces/ui/terminal/tui/InteractiveTUI.tsx +537 -0
  324. package/packages/src/interfaces/ui/terminal/tui/MessageArea.tsx +107 -0
  325. package/packages/src/interfaces/ui/terminal/tui/MessageStore.tsx +240 -0
  326. package/packages/src/interfaces/ui/terminal/tui/StatusBar.tsx +54 -0
  327. package/packages/src/interfaces/ui/terminal/tui/commands.ts +438 -0
  328. package/packages/src/interfaces/ui/terminal/tui/components/InteractiveElements.tsx +584 -0
  329. package/packages/src/interfaces/ui/terminal/tui/components/MultilineInput.tsx +614 -0
  330. package/packages/src/interfaces/ui/terminal/tui/components/PaneManager.tsx +333 -0
  331. package/packages/src/interfaces/ui/terminal/tui/components/Sidebar.tsx +604 -0
  332. package/packages/src/interfaces/ui/terminal/tui/components/index.ts +118 -0
  333. package/packages/src/interfaces/ui/terminal/tui/console.ts +49 -0
  334. package/packages/src/interfaces/ui/terminal/tui/index.ts +90 -0
  335. package/packages/src/interfaces/ui/terminal/tui/run.tsx +42 -0
  336. package/packages/src/interfaces/ui/terminal/tui/spinner.ts +69 -0
  337. package/packages/src/interfaces/ui/terminal/tui/tui-app.tsx +390 -0
  338. package/packages/src/interfaces/ui/terminal/tui/tui-footer.ts +422 -0
  339. package/packages/src/interfaces/ui/terminal/tui/types.ts +186 -0
  340. package/packages/src/interfaces/ui/terminal/tui/useInputHandler.ts +104 -0
  341. package/packages/src/interfaces/ui/terminal/tui/useNativeInput.ts +239 -0
  342. package/packages/src/lmdb.db +0 -0
  343. package/packages/src/lmdb.db-lock +0 -0
  344. package/packages/src/native/index.ts +2345 -0
  345. package/packages/src/teammates/index.ts +982 -0
  346. package/packages/src/types/index.ts +722 -0
  347. package/dist/cli.js +0 -148
  348. package/dist/index-0pkak453.js +0 -136
  349. package/dist/index-0qd0x8b4.js +0 -110
  350. package/dist/index-0x3kprq6.js +0 -240
  351. package/dist/index-1eawy937.js +0 -308
  352. package/dist/index-24m2aygy.js +0 -240
  353. package/dist/index-29xcjnne.js +0 -280
  354. package/dist/index-2avyytn5.js +0 -349
  355. package/dist/index-4ms367ey.js +0 -136
  356. package/dist/index-4w2t3b0m.js +0 -240
  357. package/dist/index-4xfgd8nz.js +0 -261
  358. package/dist/index-5acjp9gc.js +0 -157
  359. package/dist/index-5s15hr56.js +0 -136
  360. package/dist/index-6e4wf341.js +0 -349
  361. package/dist/index-6fvnkedw.js +0 -240
  362. package/dist/index-6rqpmd4g.js +0 -128
  363. package/dist/index-77ckwnbm.js +0 -280
  364. package/dist/index-9knxy49k.js +0 -128
  365. package/dist/index-9zrnw4zx.js +0 -128
  366. package/dist/index-bk21w99v.js +0 -280
  367. package/dist/index-c41n76fv.js +0 -240
  368. package/dist/index-cb4ppjdt.js +0 -255
  369. package/dist/index-cfb2edt6.js +0 -240
  370. package/dist/index-cmfa38hh.js +0 -308
  371. package/dist/index-datjz8q1.js +0 -257
  372. package/dist/index-eadf4wvn.js +0 -240
  373. package/dist/index-em5k0m3z.js +0 -345
  374. package/dist/index-gh8r333a.js +0 -110
  375. package/dist/index-gkx6k2tr.js +0 -261
  376. package/dist/index-h5cabfks.js +0 -155
  377. package/dist/index-hcrpwyy3.js +0 -261
  378. package/dist/index-hk7fwwa8.js +0 -257
  379. package/dist/index-jb8cw7f8.js +0 -136
  380. package/dist/index-kbyw4th1.js +0 -347
  381. package/dist/index-kgj5gqnm.js +0 -345
  382. package/dist/index-mdf6xp1z.js +0 -255
  383. package/dist/index-mrhv8kvc.js +0 -280
  384. package/dist/index-mt4743dd.js +0 -161
  385. package/dist/index-qnwsg97q.js +0 -240
  386. package/dist/index-qwdy6x44.js +0 -261
  387. package/dist/index-rmj77261.js +0 -157
  388. package/dist/index-sbbw1a61.js +0 -349
  389. package/dist/index-svy5bcpn.js +0 -345
  390. package/dist/index-tvmy7tm9.js +0 -261
  391. package/dist/index-tzz4vzkj.js +0 -312
  392. package/dist/index-vz80zmhe.js +0 -110
  393. package/dist/index-wed2fk67.js +0 -240
  394. package/dist/index-wksgzz8e.js +0 -280
  395. package/dist/index-wn2m4wma.js +0 -240
  396. package/dist/index-xha05vjc.js +0 -257
  397. package/dist/index-yc6eh8p8.js +0 -136
  398. package/dist/index-ycjxx9ft.js +0 -240
  399. package/dist/index-z0gzd0fc.js +0 -110
  400. package/dist/index-z8cwtf8j.js +0 -240
  401. package/dist/index-zy5mtt00.js +0 -128
@@ -0,0 +1,438 @@
1
+ /**
2
+ * Checkpoint Manager - Save and restore conversation states
3
+ * Captures both chat context AND code/file changes
4
+ */
5
+ import { randomUUID } from "crypto";
6
+ import { execSync } from "child_process";
7
+ const CHECKPOINTS_DIR = process.env.CLAUDE_CHECKPOINTS_DIR || `${process.env.HOME}/.claude/checkpoints`;
8
+ /**
9
+ * Generate a simple hash for file content
10
+ */
11
+ function hashContent(content) {
12
+ let hash = 0;
13
+ for (let i = 0; i < content.length; i++) {
14
+ const char = content.charCodeAt(i);
15
+ hash = ((hash << 5) - hash) + char;
16
+ hash = hash & hash;
17
+ }
18
+ return Math.abs(hash).toString(16);
19
+ }
20
+ /**
21
+ * Get current git state
22
+ */
23
+ function getGitState(workingDir) {
24
+ try {
25
+ // Check if we're in a git repo
26
+ execSync("git rev-parse --is-inside-work-tree", {
27
+ cwd: workingDir,
28
+ encoding: "utf-8",
29
+ stdio: ["pipe", "pipe", "pipe"]
30
+ });
31
+ const branch = execSync("git rev-parse --abbrev-ref HEAD", {
32
+ cwd: workingDir,
33
+ encoding: "utf-8",
34
+ stdio: ["pipe", "pipe", "pipe"]
35
+ }).trim();
36
+ // Get ahead/behind counts
37
+ let ahead = 0;
38
+ let behind = 0;
39
+ try {
40
+ const counts = execSync("git rev-list --left-right --count @{upstream}...HEAD 2>/dev/null || echo '0 0'", {
41
+ cwd: workingDir,
42
+ encoding: "utf-8",
43
+ stdio: ["pipe", "pipe", "pipe"]
44
+ }).trim().split(/\s+/);
45
+ behind = parseInt(counts[0] || "0", 10);
46
+ ahead = parseInt(counts[1] || "0", 10);
47
+ }
48
+ catch {
49
+ // No upstream
50
+ }
51
+ const status = execSync("git status --porcelain", {
52
+ cwd: workingDir,
53
+ encoding: "utf-8",
54
+ stdio: ["pipe", "pipe", "pipe"]
55
+ }).trim();
56
+ const staged = [];
57
+ const unstaged = [];
58
+ const untracked = [];
59
+ for (const line of status.split("\n")) {
60
+ if (!line.trim())
61
+ continue;
62
+ const indexStatus = line[0];
63
+ const workTreeStatus = line[1];
64
+ const filePath = line.slice(3);
65
+ if (indexStatus === "?" && workTreeStatus === "?") {
66
+ untracked.push(filePath);
67
+ }
68
+ else if (indexStatus !== " " && indexStatus !== "?") {
69
+ staged.push(filePath);
70
+ }
71
+ else if (workTreeStatus !== " ") {
72
+ unstaged.push(filePath);
73
+ }
74
+ }
75
+ return { branch, ahead, behind, staged, unstaged, untracked };
76
+ }
77
+ catch (error) {
78
+ // Not in a git repo or git not available
79
+ return undefined;
80
+ }
81
+ }
82
+ /**
83
+ * Create a git stash with checkpoint info
84
+ */
85
+ function createCheckpointStash(workingDir, checkpointId) {
86
+ try {
87
+ const stashName = `claude-checkpoint-${checkpointId}`;
88
+ execSync(`git stash push -m "${stashName}" --include-untracked 2>/dev/null || true`, {
89
+ cwd: workingDir,
90
+ encoding: "utf-8",
91
+ stdio: ["pipe", "pipe", "pipe"]
92
+ });
93
+ return stashName;
94
+ }
95
+ catch {
96
+ return undefined;
97
+ }
98
+ }
99
+ /**
100
+ * Capture file snapshots for modified files
101
+ */
102
+ async function captureFileSnapshots(workingDir, filePaths) {
103
+ const snapshots = [];
104
+ for (const filePath of filePaths) {
105
+ try {
106
+ const fullPath = `${workingDir}/${filePath}`;
107
+ const file = Bun.file(fullPath);
108
+ if (await file.exists()) {
109
+ const content = await file.text();
110
+ snapshots.push({
111
+ path: filePath,
112
+ content,
113
+ hash: hashContent(content),
114
+ });
115
+ }
116
+ }
117
+ catch {
118
+ // Skip files that can't be read
119
+ }
120
+ }
121
+ return snapshots;
122
+ }
123
+ /**
124
+ * Restore files from snapshots
125
+ */
126
+ async function restoreFileSnapshots(workingDir, snapshots) {
127
+ let restored = 0;
128
+ let failed = 0;
129
+ for (const snapshot of snapshots) {
130
+ try {
131
+ const fullPath = `${workingDir}/${snapshot.path}`;
132
+ await Bun.write(fullPath, snapshot.content);
133
+ restored++;
134
+ }
135
+ catch {
136
+ failed++;
137
+ }
138
+ }
139
+ return { restored, failed };
140
+ }
141
+ /**
142
+ * Ensure checkpoints directory exists
143
+ */
144
+ async function ensureCheckpointsDir() {
145
+ const dir = Bun.file(CHECKPOINTS_DIR);
146
+ if (!(await dir.exists())) {
147
+ await Bun.write(CHECKPOINTS_DIR + "/.gitkeep", "");
148
+ }
149
+ }
150
+ /**
151
+ * Get checkpoint file path for a session
152
+ */
153
+ function getCheckpointFilePath(sessionId) {
154
+ return `${CHECKPOINTS_DIR}/${sessionId}.json`;
155
+ }
156
+ /**
157
+ * Load checkpoints for a session
158
+ */
159
+ export async function loadCheckpoints(sessionId) {
160
+ const checkpoints = new Map();
161
+ try {
162
+ const filePath = getCheckpointFilePath(sessionId);
163
+ const file = Bun.file(filePath);
164
+ if (await file.exists()) {
165
+ const content = await file.text();
166
+ const data = JSON.parse(content);
167
+ for (const checkpoint of data) {
168
+ checkpoints.set(checkpoint.id, checkpoint);
169
+ }
170
+ }
171
+ }
172
+ catch (error) {
173
+ // Return empty map on error
174
+ }
175
+ return checkpoints;
176
+ }
177
+ /**
178
+ * Save checkpoints for a session
179
+ */
180
+ export async function saveCheckpoints(sessionId, checkpoints) {
181
+ await ensureCheckpointsDir();
182
+ const filePath = getCheckpointFilePath(sessionId);
183
+ const data = Array.from(checkpoints.values());
184
+ await Bun.write(filePath, JSON.stringify(data, null, 2));
185
+ }
186
+ /**
187
+ * Create a new checkpoint with file snapshots
188
+ */
189
+ export async function createCheckpoint(sessionId, messages, options = {}) {
190
+ const checkpoints = await loadCheckpoints(sessionId);
191
+ const workingDir = options.workingDirectory || process.cwd();
192
+ // Capture git state
193
+ const gitState = getGitState(workingDir);
194
+ // Capture file snapshots for all changed files
195
+ let fileSnapshots = [];
196
+ if (options.trackFiles !== false && gitState) {
197
+ const changedFiles = [
198
+ ...gitState.staged,
199
+ ...gitState.unstaged,
200
+ ...gitState.untracked,
201
+ ];
202
+ fileSnapshots = await captureFileSnapshots(workingDir, changedFiles);
203
+ }
204
+ const checkpoint = {
205
+ id: randomUUID().slice(0, 8),
206
+ sessionId,
207
+ timestamp: Date.now(),
208
+ label: options.label || `Checkpoint ${checkpoints.size + 1}`,
209
+ description: options.description,
210
+ messages: JSON.parse(JSON.stringify(messages)), // Deep copy
211
+ files: fileSnapshots,
212
+ gitState,
213
+ metadata: {
214
+ model: options.model,
215
+ workingDirectory: workingDir,
216
+ totalCost: options.totalCost || 0,
217
+ messageCount: messages.length,
218
+ fileCount: fileSnapshots.length,
219
+ },
220
+ };
221
+ checkpoints.set(checkpoint.id, checkpoint);
222
+ await saveCheckpoints(sessionId, checkpoints);
223
+ return checkpoint;
224
+ }
225
+ /**
226
+ * Restore a checkpoint (returns the checkpoint, doesn't apply it)
227
+ */
228
+ export async function restoreCheckpoint(sessionId, checkpointId) {
229
+ const checkpoints = await loadCheckpoints(sessionId);
230
+ return checkpoints.get(checkpointId) || null;
231
+ }
232
+ /**
233
+ * Apply a checkpoint - restore files and return messages
234
+ */
235
+ export async function applyCheckpoint(checkpoint, options = {}) {
236
+ const workingDir = options.workingDirectory || checkpoint.metadata.workingDirectory || process.cwd();
237
+ let filesRestored = 0;
238
+ let filesFailed = 0;
239
+ // Restore files if requested
240
+ if (options.restoreFiles !== false && checkpoint.files.length > 0) {
241
+ const result = await restoreFileSnapshots(workingDir, checkpoint.files);
242
+ filesRestored = result.restored;
243
+ filesFailed = result.failed;
244
+ }
245
+ return {
246
+ messages: options.restoreMessages !== false ? checkpoint.messages : [],
247
+ filesRestored,
248
+ filesFailed,
249
+ };
250
+ }
251
+ /**
252
+ * Delete a checkpoint
253
+ */
254
+ export async function deleteCheckpoint(sessionId, checkpointId) {
255
+ const checkpoints = await loadCheckpoints(sessionId);
256
+ if (checkpoints.has(checkpointId)) {
257
+ checkpoints.delete(checkpointId);
258
+ await saveCheckpoints(sessionId, checkpoints);
259
+ return true;
260
+ }
261
+ return false;
262
+ }
263
+ /**
264
+ * List all checkpoints for a session
265
+ */
266
+ export async function listCheckpoints(sessionId) {
267
+ const checkpoints = await loadCheckpoints(sessionId);
268
+ return Array.from(checkpoints.values()).sort((a, b) => b.timestamp - a.timestamp);
269
+ }
270
+ /**
271
+ * Format checkpoint for display
272
+ */
273
+ export function formatCheckpoint(checkpoint, verbose = false) {
274
+ const date = new Date(checkpoint.timestamp);
275
+ const timeStr = date.toLocaleTimeString();
276
+ const dateStr = date.toLocaleDateString();
277
+ let output = `\x1b[33m${checkpoint.id}\x1b[0m `;
278
+ output += `\x1b[1m${checkpoint.label}\x1b[0m `;
279
+ output += `\x1b[90m(${dateStr} ${timeStr})\x1b[0m`;
280
+ // Show file count if there are files
281
+ if (checkpoint.files.length > 0) {
282
+ output += ` \x1b[32m[${checkpoint.files.length} files]\x1b[0m`;
283
+ }
284
+ // Show git branch if available
285
+ if (checkpoint.gitState) {
286
+ output += ` \x1b[34m(${checkpoint.gitState.branch})\x1b[0m`;
287
+ }
288
+ if (verbose) {
289
+ output += `\n Messages: ${checkpoint.metadata.messageCount}`;
290
+ output += `\n Files: ${checkpoint.metadata.fileCount}`;
291
+ output += `\n Cost: $${checkpoint.metadata.totalCost.toFixed(4)}`;
292
+ if (checkpoint.gitState) {
293
+ const changes = checkpoint.gitState.staged.length +
294
+ checkpoint.gitState.unstaged.length +
295
+ checkpoint.gitState.untracked.length;
296
+ output += `\n Git changes: ${changes}`;
297
+ }
298
+ if (checkpoint.description) {
299
+ output += `\n ${checkpoint.description}`;
300
+ }
301
+ }
302
+ return output;
303
+ }
304
+ /**
305
+ * Print checkpoints list
306
+ */
307
+ export function printCheckpointsList(checkpoints) {
308
+ if (checkpoints.length === 0) {
309
+ console.log("\x1b[90mNo checkpoints saved.\x1b[0m");
310
+ console.log("\x1b[90mUse /checkpoint <label> to create one.\x1b[0m");
311
+ return;
312
+ }
313
+ console.log(`\n\x1b[1mCheckpoints (${checkpoints.length}):\x1b[0m`);
314
+ console.log("\x1b[90m─────────────────────────────────────────────────\x1b[0m");
315
+ for (const checkpoint of checkpoints) {
316
+ console.log(formatCheckpoint(checkpoint));
317
+ }
318
+ console.log("\x1b[90m─────────────────────────────────────────────────\x1b[0m");
319
+ console.log("\x1b[90m/restore <id> - Restore checkpoint (files + chat)\x1b[0m");
320
+ console.log("\x1b[90m/restore-chat <id> - Restore chat only (no files)\x1b[0m");
321
+ console.log("\x1b[90m/checkpoint <label> - Create new checkpoint\x1b[0m");
322
+ }
323
+ /**
324
+ * Clear all checkpoints for a session
325
+ */
326
+ export async function clearCheckpoints(sessionId) {
327
+ const checkpoints = await loadCheckpoints(sessionId);
328
+ const count = checkpoints.size;
329
+ checkpoints.clear();
330
+ await saveCheckpoints(sessionId, checkpoints);
331
+ return count;
332
+ }
333
+ /**
334
+ * Get checkpoint summary for status display
335
+ */
336
+ export function getCheckpointSummary(checkpoint) {
337
+ const parts = [];
338
+ if (checkpoint.files.length > 0) {
339
+ parts.push(`${checkpoint.files.length} files`);
340
+ }
341
+ parts.push(`${checkpoint.metadata.messageCount} msgs`);
342
+ if (checkpoint.gitState) {
343
+ const changes = checkpoint.gitState.staged.length +
344
+ checkpoint.gitState.unstaged.length +
345
+ checkpoint.gitState.untracked.length;
346
+ if (changes > 0) {
347
+ parts.push(`${changes} changes`);
348
+ }
349
+ }
350
+ return parts.join(" | ");
351
+ }
352
+ const NAVIGATION_FILE = (sessionId) => `${CHECKPOINTS_DIR}/${sessionId}-nav.json`;
353
+ /**
354
+ * Get checkpoint navigation state
355
+ */
356
+ async function getNavigation(sessionId) {
357
+ try {
358
+ const file = Bun.file(NAVIGATION_FILE(sessionId));
359
+ if (await file.exists()) {
360
+ return JSON.parse(await file.text());
361
+ }
362
+ }
363
+ catch {
364
+ // Return fresh navigation
365
+ }
366
+ return { sessionId, checkpointIds: [], currentIndex: -1, undoneIds: [] };
367
+ }
368
+ /**
369
+ * Save checkpoint navigation state
370
+ */
371
+ async function saveNavigation(nav) {
372
+ await ensureCheckpointsDir();
373
+ await Bun.write(NAVIGATION_FILE(nav.sessionId), JSON.stringify(nav, null, 2));
374
+ }
375
+ /**
376
+ * Register a new checkpoint (called after createCheckpoint)
377
+ */
378
+ export async function registerCheckpoint(sessionId, checkpointId) {
379
+ const nav = await getNavigation(sessionId);
380
+ // If we're not at the end, truncate the list (new checkpoint = no redo)
381
+ if (nav.currentIndex < nav.checkpointIds.length - 1) {
382
+ nav.checkpointIds = nav.checkpointIds.slice(0, nav.currentIndex + 1);
383
+ }
384
+ nav.checkpointIds.push(checkpointId);
385
+ nav.currentIndex = nav.checkpointIds.length - 1;
386
+ nav.undoneIds = []; // Clear redo stack
387
+ await saveNavigation(nav);
388
+ }
389
+ /**
390
+ * Undo - go back to previous checkpoint
391
+ */
392
+ export async function undoCheckpoint(sessionId) {
393
+ const nav = await getNavigation(sessionId);
394
+ const checkpoints = await loadCheckpoints(sessionId);
395
+ if (nav.currentIndex <= 0) {
396
+ return { checkpoint: null, canRedo: false };
397
+ }
398
+ // Save current to redo stack
399
+ const currentId = nav.checkpointIds[nav.currentIndex];
400
+ if (currentId) {
401
+ nav.undoneIds.push(currentId);
402
+ }
403
+ // Move back
404
+ nav.currentIndex--;
405
+ const prevId = nav.checkpointIds[nav.currentIndex];
406
+ await saveNavigation(nav);
407
+ const checkpoint = prevId ? checkpoints.get(prevId) || null : null;
408
+ return { checkpoint, canRedo: nav.undoneIds.length > 0 };
409
+ }
410
+ /**
411
+ * Redo - go forward to next checkpoint
412
+ */
413
+ export async function redoCheckpoint(sessionId) {
414
+ const nav = await getNavigation(sessionId);
415
+ const checkpoints = await loadCheckpoints(sessionId);
416
+ if (nav.undoneIds.length === 0) {
417
+ return { checkpoint: null, canRedo: false };
418
+ }
419
+ // Pop from redo stack
420
+ const nextId = nav.undoneIds.pop();
421
+ nav.currentIndex++;
422
+ await saveNavigation(nav);
423
+ const checkpoint = checkpoints.get(nextId) || null;
424
+ return { checkpoint, canRedo: nav.undoneIds.length > 0 };
425
+ }
426
+ /**
427
+ * Get navigation status
428
+ */
429
+ export async function getNavigationStatus(sessionId) {
430
+ const nav = await getNavigation(sessionId);
431
+ return {
432
+ total: nav.checkpointIds.length,
433
+ current: nav.currentIndex + 1, // 1-indexed for display
434
+ canUndo: nav.currentIndex > 0,
435
+ canRedo: nav.undoneIds.length > 0,
436
+ currentId: nav.checkpointIds[nav.currentIndex],
437
+ };
438
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * CLAUDE.md Support - Load project-specific instructions
3
+ *
4
+ * Loads CLAUDE.md files from:
5
+ * 1. ~/.claude/CLAUDE.md (global user preferences)
6
+ * 2. .claude/CLAUDE.md (project-specific, preferred)
7
+ * 3. CLAUDE.md (root level, fallback)
8
+ *
9
+ * Content is merged in order: global → project
10
+ */
11
+ export interface SystemSignature {
12
+ version: string;
13
+ projectId: string;
14
+ sessionId: string;
15
+ timestamp: number;
16
+ environment: EnvironmentInfo;
17
+ gitStatus: GitStatusInfo;
18
+ tools: ToolsInfo;
19
+ }
20
+ export interface EnvironmentInfo {
21
+ platform: string;
22
+ nodeVersion: string;
23
+ shell: string;
24
+ homeDir: string;
25
+ }
26
+ export interface GitStatusInfo {
27
+ branch: string;
28
+ hasChanges: boolean;
29
+ staged: number;
30
+ unstaged: number;
31
+ untracked: number;
32
+ }
33
+ export interface ToolsInfo {
34
+ available: string[];
35
+ mcpServers: string[];
36
+ }
37
+ export interface ClaudeMdConfig {
38
+ globalPath: string;
39
+ projectPath: string;
40
+ rootPath: string;
41
+ }
42
+ /**
43
+ * Load all CLAUDE.md files and merge them
44
+ *
45
+ * Priority (later overrides earlier):
46
+ * 1. Global (~/.claude/CLAUDE.md)
47
+ * 2. Project (.claude/CLAUDE.md or ./CLAUDE.md)
48
+ */
49
+ export declare function loadClaudeMd(workingDirectory?: string, config?: Partial<ClaudeMdConfig>): Promise<{
50
+ global: string | null;
51
+ project: string | null;
52
+ merged: string;
53
+ sources: string[];
54
+ }>;
55
+ /**
56
+ * Build system prompt section from CLAUDE.md
57
+ */
58
+ export declare function buildClaudeMdPrompt(workingDirectory?: string): Promise<string>;
59
+ /**
60
+ * Generate a system signature for the current environment
61
+ */
62
+ export declare function generateSystemSignature(workingDirectory?: string, gitStatus?: Partial<GitStatusInfo>, availableTools?: string[], mcpServers?: string[]): SystemSignature;
63
+ /**
64
+ * Format a system signature as a readable string
65
+ */
66
+ export declare function formatSystemSignature(signature: SystemSignature): string;
67
+ /**
68
+ * Watch for CLAUDE.md changes (returns cleanup function)
69
+ */
70
+ export declare function watchClaudeMd(workingDirectory: string, onChange: () => void): () => void;
71
+ //# sourceMappingURL=claude-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../packages/src/core/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,aAAa,CAAC;IACzB,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAmCD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,gBAAgB,GAAE,MAAsB,EACxC,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM,GACnC,OAAO,CAAC;IACT,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC,CA6CD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,gBAAgB,GAAE,MAAsB,GACvC,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,gBAAgB,GAAE,MAAsB,EACxC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,EAClC,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,eAAe,CAwBjB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM,CAyBxE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,gBAAgB,EAAE,MAAM,EACxB,QAAQ,EAAE,MAAM,IAAI,GACnB,MAAM,IAAI,CA4BZ"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * CLAUDE.md Support - Load project-specific instructions
3
+ *
4
+ * Loads CLAUDE.md files from:
5
+ * 1. ~/.claude/CLAUDE.md (global user preferences)
6
+ * 2. .claude/CLAUDE.md (project-specific, preferred)
7
+ * 3. CLAUDE.md (root level, fallback)
8
+ *
9
+ * Content is merged in order: global → project
10
+ */
11
+ import { readFile, access } from "fs/promises";
12
+ import { join } from "path";
13
+ import { randomUUID } from "crypto";
14
+ const DEFAULT_CONFIG = {
15
+ globalPath: `${process.env.HOME}/.claude/CLAUDE.md`,
16
+ projectPath: ".claude/CLAUDE.md",
17
+ rootPath: "CLAUDE.md",
18
+ };
19
+ /**
20
+ * Check if a file exists and is readable
21
+ */
22
+ async function fileExists(path) {
23
+ try {
24
+ await access(path);
25
+ return true;
26
+ }
27
+ catch {
28
+ return false;
29
+ }
30
+ }
31
+ /**
32
+ * Load CLAUDE.md content from a single file
33
+ */
34
+ async function loadClaudeMdFile(path) {
35
+ try {
36
+ if (await fileExists(path)) {
37
+ const content = await readFile(path, "utf-8");
38
+ return content.trim();
39
+ }
40
+ }
41
+ catch (error) {
42
+ // File not readable, skip
43
+ }
44
+ return null;
45
+ }
46
+ /**
47
+ * Load all CLAUDE.md files and merge them
48
+ *
49
+ * Priority (later overrides earlier):
50
+ * 1. Global (~/.claude/CLAUDE.md)
51
+ * 2. Project (.claude/CLAUDE.md or ./CLAUDE.md)
52
+ */
53
+ export async function loadClaudeMd(workingDirectory = process.cwd(), config = {}) {
54
+ const cfg = { ...DEFAULT_CONFIG, ...config };
55
+ const sources = [];
56
+ let globalContent = null;
57
+ let projectContent = null;
58
+ // Load global CLAUDE.md
59
+ const globalPath = cfg.globalPath;
60
+ globalContent = await loadClaudeMdFile(globalPath);
61
+ if (globalContent) {
62
+ sources.push(globalPath);
63
+ }
64
+ // Load project CLAUDE.md (prefer .claude/CLAUDE.md over root CLAUDE.md)
65
+ const projectPath = join(workingDirectory, cfg.projectPath);
66
+ const rootPath = join(workingDirectory, cfg.rootPath);
67
+ projectContent = await loadClaudeMdFile(projectPath);
68
+ if (projectContent) {
69
+ sources.push(projectPath);
70
+ }
71
+ else {
72
+ // Fallback to root CLAUDE.md
73
+ projectContent = await loadClaudeMdFile(rootPath);
74
+ if (projectContent) {
75
+ sources.push(rootPath);
76
+ }
77
+ }
78
+ // Merge content
79
+ const parts = [];
80
+ if (globalContent) {
81
+ parts.push(`# Global Instructions\n\n${globalContent}`);
82
+ }
83
+ if (projectContent) {
84
+ parts.push(`# Project Instructions\n\n${projectContent}`);
85
+ }
86
+ return {
87
+ global: globalContent,
88
+ project: projectContent,
89
+ merged: parts.join("\n\n---\n\n"),
90
+ sources,
91
+ };
92
+ }
93
+ /**
94
+ * Build system prompt section from CLAUDE.md
95
+ */
96
+ export async function buildClaudeMdPrompt(workingDirectory = process.cwd()) {
97
+ const { merged, sources } = await loadClaudeMd(workingDirectory);
98
+ if (!merged) {
99
+ return "";
100
+ }
101
+ const header = sources.length > 0
102
+ ? `Loaded from: ${sources.join(", ")}`
103
+ : "";
104
+ return `
105
+ ## Project Instructions
106
+
107
+ ${header}
108
+
109
+ ${merged}
110
+ `;
111
+ }
112
+ /**
113
+ * Generate a system signature for the current environment
114
+ */
115
+ export function generateSystemSignature(workingDirectory = process.cwd(), gitStatus, availableTools, mcpServers) {
116
+ return {
117
+ version: "1.0.0",
118
+ projectId: randomUUID(),
119
+ sessionId: randomUUID(),
120
+ timestamp: Date.now(),
121
+ environment: {
122
+ platform: process.platform,
123
+ nodeVersion: process.version,
124
+ shell: process.env.SHELL || "unknown",
125
+ homeDir: process.env.HOME || "",
126
+ },
127
+ gitStatus: {
128
+ branch: gitStatus?.branch || "unknown",
129
+ hasChanges: gitStatus?.hasChanges ?? false,
130
+ staged: gitStatus?.staged ?? 0,
131
+ unstaged: gitStatus?.unstaged ?? 0,
132
+ untracked: gitStatus?.untracked ?? 0,
133
+ },
134
+ tools: {
135
+ available: availableTools || [],
136
+ mcpServers: mcpServers || [],
137
+ },
138
+ };
139
+ }
140
+ /**
141
+ * Format a system signature as a readable string
142
+ */
143
+ export function formatSystemSignature(signature) {
144
+ return `
145
+ System Signature
146
+ ================
147
+ Version: ${signature.version}
148
+ Project ID: ${signature.projectId}
149
+ Session ID: ${signature.sessionId}
150
+ Timestamp: ${new Date(signature.timestamp).toISOString()}
151
+
152
+ Environment:
153
+ Platform: ${signature.environment.platform}
154
+ Node: ${signature.environment.nodeVersion}
155
+ Shell: ${signature.environment.shell}
156
+
157
+ Git Status:
158
+ Branch: ${signature.gitStatus.branch}
159
+ Changes: ${signature.gitStatus.hasChanges ? "Yes" : "No"}
160
+ Staged: ${signature.gitStatus.staged}
161
+ Unstaged: ${signature.gitStatus.unstaged}
162
+ Untracked: ${signature.gitStatus.untracked}
163
+
164
+ Tools:
165
+ Available: ${signature.tools.available.length}
166
+ MCP Servers: ${signature.tools.mcpServers.length}
167
+ `;
168
+ }
169
+ /**
170
+ * Watch for CLAUDE.md changes (returns cleanup function)
171
+ */
172
+ export function watchClaudeMd(workingDirectory, onChange) {
173
+ const { watch } = require("fs");
174
+ const watchers = [];
175
+ const paths = [
176
+ `${process.env.HOME}/.claude/CLAUDE.md`,
177
+ `${workingDirectory}/.claude/CLAUDE.md`,
178
+ `${workingDirectory}/CLAUDE.md`,
179
+ ];
180
+ for (const path of paths) {
181
+ try {
182
+ const watcher = watch(path, (eventType) => {
183
+ if (eventType === "change") {
184
+ onChange();
185
+ }
186
+ });
187
+ watchers.push(watcher);
188
+ }
189
+ catch {
190
+ // File doesn't exist, skip watching
191
+ }
192
+ }
193
+ return () => {
194
+ for (const watcher of watchers) {
195
+ watcher.close();
196
+ }
197
+ };
198
+ }