@jacques-ai/cli 0.0.7-alpha.1

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 (508) hide show
  1. package/dist/assets/mascot-ansi.d.ts +8 -0
  2. package/dist/assets/mascot-ansi.d.ts.map +1 -0
  3. package/dist/assets/mascot-ansi.js +15 -0
  4. package/dist/assets/mascot-ansi.js.map +1 -0
  5. package/dist/cli.d.ts +15 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +53 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/commands/client-helper.d.ts +14 -0
  10. package/dist/commands/client-helper.d.ts.map +1 -0
  11. package/dist/commands/client-helper.js +38 -0
  12. package/dist/commands/client-helper.js.map +1 -0
  13. package/dist/commands/dashboard.d.ts +8 -0
  14. package/dist/commands/dashboard.d.ts.map +1 -0
  15. package/dist/commands/dashboard.js +159 -0
  16. package/dist/commands/dashboard.js.map +1 -0
  17. package/dist/commands/index.d.ts +6 -0
  18. package/dist/commands/index.d.ts.map +1 -0
  19. package/dist/commands/index.js +6 -0
  20. package/dist/commands/index.js.map +1 -0
  21. package/dist/commands/list.d.ts +5 -0
  22. package/dist/commands/list.d.ts.map +1 -0
  23. package/dist/commands/list.js +13 -0
  24. package/dist/commands/list.js.map +1 -0
  25. package/dist/commands/search.d.ts +13 -0
  26. package/dist/commands/search.d.ts.map +1 -0
  27. package/dist/commands/search.js +79 -0
  28. package/dist/commands/search.js.map +1 -0
  29. package/dist/commands/setup.d.ts +8 -0
  30. package/dist/commands/setup.d.ts.map +1 -0
  31. package/dist/commands/setup.js +32 -0
  32. package/dist/commands/setup.js.map +1 -0
  33. package/dist/commands/status.d.ts +5 -0
  34. package/dist/commands/status.d.ts.map +1 -0
  35. package/dist/commands/status.js +27 -0
  36. package/dist/commands/status.js.map +1 -0
  37. package/dist/components/ActiveSessionsView.d.ts +18 -0
  38. package/dist/components/ActiveSessionsView.d.ts.map +1 -0
  39. package/dist/components/ActiveSessionsView.js +68 -0
  40. package/dist/components/ActiveSessionsView.js.map +1 -0
  41. package/dist/components/AddContextConfirmView.d.ts +21 -0
  42. package/dist/components/AddContextConfirmView.d.ts.map +1 -0
  43. package/dist/components/AddContextConfirmView.js +44 -0
  44. package/dist/components/AddContextConfirmView.js.map +1 -0
  45. package/dist/components/App.d.ts +11 -0
  46. package/dist/components/App.d.ts.map +1 -0
  47. package/dist/components/App.js +292 -0
  48. package/dist/components/App.js.map +1 -0
  49. package/dist/components/ArchiveBrowserView.d.ts +40 -0
  50. package/dist/components/ArchiveBrowserView.d.ts.map +1 -0
  51. package/dist/components/ArchiveBrowserView.js +161 -0
  52. package/dist/components/ArchiveBrowserView.js.map +1 -0
  53. package/dist/components/ArchiveInitProgressView.d.ts +16 -0
  54. package/dist/components/ArchiveInitProgressView.d.ts.map +1 -0
  55. package/dist/components/ArchiveInitProgressView.js +72 -0
  56. package/dist/components/ArchiveInitProgressView.js.map +1 -0
  57. package/dist/components/AutoCompactToggle.d.ts +16 -0
  58. package/dist/components/AutoCompactToggle.d.ts.map +1 -0
  59. package/dist/components/AutoCompactToggle.js +12 -0
  60. package/dist/components/AutoCompactToggle.js.map +1 -0
  61. package/dist/components/BottomControls.d.ts +12 -0
  62. package/dist/components/BottomControls.d.ts.map +1 -0
  63. package/dist/components/BottomControls.js +11 -0
  64. package/dist/components/BottomControls.js.map +1 -0
  65. package/dist/components/CompactHeader.d.ts +21 -0
  66. package/dist/components/CompactHeader.d.ts.map +1 -0
  67. package/dist/components/CompactHeader.js +63 -0
  68. package/dist/components/CompactHeader.js.map +1 -0
  69. package/dist/components/CompactPanel.d.ts +22 -0
  70. package/dist/components/CompactPanel.d.ts.map +1 -0
  71. package/dist/components/CompactPanel.js +31 -0
  72. package/dist/components/CompactPanel.js.map +1 -0
  73. package/dist/components/ContentBox.d.ts +14 -0
  74. package/dist/components/ContentBox.d.ts.map +1 -0
  75. package/dist/components/ContentBox.js +24 -0
  76. package/dist/components/ContentBox.js.map +1 -0
  77. package/dist/components/ContextProgress.d.ts +14 -0
  78. package/dist/components/ContextProgress.d.ts.map +1 -0
  79. package/dist/components/ContextProgress.js +36 -0
  80. package/dist/components/ContextProgress.js.map +1 -0
  81. package/dist/components/Dashboard.d.ts +46 -0
  82. package/dist/components/Dashboard.d.ts.map +1 -0
  83. package/dist/components/Dashboard.js +67 -0
  84. package/dist/components/Dashboard.js.map +1 -0
  85. package/dist/components/FilterSelectionView.d.ts +15 -0
  86. package/dist/components/FilterSelectionView.d.ts.map +1 -0
  87. package/dist/components/FilterSelectionView.js +27 -0
  88. package/dist/components/FilterSelectionView.js.map +1 -0
  89. package/dist/components/GoogleDocsBrowserView.d.ts +20 -0
  90. package/dist/components/GoogleDocsBrowserView.d.ts.map +1 -0
  91. package/dist/components/GoogleDocsBrowserView.js +72 -0
  92. package/dist/components/GoogleDocsBrowserView.js.map +1 -0
  93. package/dist/components/HandoffBrowserView.d.ts +20 -0
  94. package/dist/components/HandoffBrowserView.d.ts.map +1 -0
  95. package/dist/components/HandoffBrowserView.js +66 -0
  96. package/dist/components/HandoffBrowserView.js.map +1 -0
  97. package/dist/components/Header.d.ts +14 -0
  98. package/dist/components/Header.d.ts.map +1 -0
  99. package/dist/components/Header.js +16 -0
  100. package/dist/components/Header.js.map +1 -0
  101. package/dist/components/HorizontalMenu.d.ts +24 -0
  102. package/dist/components/HorizontalMenu.d.ts.map +1 -0
  103. package/dist/components/HorizontalMenu.js +20 -0
  104. package/dist/components/HorizontalMenu.js.map +1 -0
  105. package/dist/components/ImageMascot.d.ts +8 -0
  106. package/dist/components/ImageMascot.d.ts.map +1 -0
  107. package/dist/components/ImageMascot.js +7 -0
  108. package/dist/components/ImageMascot.js.map +1 -0
  109. package/dist/components/LLMWorkingView.d.ts +19 -0
  110. package/dist/components/LLMWorkingView.d.ts.map +1 -0
  111. package/dist/components/LLMWorkingView.js +72 -0
  112. package/dist/components/LLMWorkingView.js.map +1 -0
  113. package/dist/components/LoadContextView.d.ts +22 -0
  114. package/dist/components/LoadContextView.d.ts.map +1 -0
  115. package/dist/components/LoadContextView.js +83 -0
  116. package/dist/components/LoadContextView.js.map +1 -0
  117. package/dist/components/MainMenuView.d.ts +20 -0
  118. package/dist/components/MainMenuView.d.ts.map +1 -0
  119. package/dist/components/MainMenuView.js +49 -0
  120. package/dist/components/MainMenuView.js.map +1 -0
  121. package/dist/components/Mascot.d.ts +24 -0
  122. package/dist/components/Mascot.d.ts.map +1 -0
  123. package/dist/components/Mascot.js +32 -0
  124. package/dist/components/Mascot.js.map +1 -0
  125. package/dist/components/Menu.d.ts +22 -0
  126. package/dist/components/Menu.d.ts.map +1 -0
  127. package/dist/components/Menu.js +28 -0
  128. package/dist/components/Menu.js.map +1 -0
  129. package/dist/components/NotionBrowserView.d.ts +21 -0
  130. package/dist/components/NotionBrowserView.d.ts.map +1 -0
  131. package/dist/components/NotionBrowserView.js +75 -0
  132. package/dist/components/NotionBrowserView.js.map +1 -0
  133. package/dist/components/ObsidianBrowserView.d.ts +21 -0
  134. package/dist/components/ObsidianBrowserView.d.ts.map +1 -0
  135. package/dist/components/ObsidianBrowserView.js +74 -0
  136. package/dist/components/ObsidianBrowserView.js.map +1 -0
  137. package/dist/components/ObsidianConfigView.d.ts +19 -0
  138. package/dist/components/ObsidianConfigView.d.ts.map +1 -0
  139. package/dist/components/ObsidianConfigView.js +45 -0
  140. package/dist/components/ObsidianConfigView.js.map +1 -0
  141. package/dist/components/PlaceholderView.d.ts +15 -0
  142. package/dist/components/PlaceholderView.d.ts.map +1 -0
  143. package/dist/components/PlaceholderView.js +20 -0
  144. package/dist/components/PlaceholderView.js.map +1 -0
  145. package/dist/components/PlanViewerView.d.ts +26 -0
  146. package/dist/components/PlanViewerView.d.ts.map +1 -0
  147. package/dist/components/PlanViewerView.js +170 -0
  148. package/dist/components/PlanViewerView.js.map +1 -0
  149. package/dist/components/ProgressBar.d.ts +24 -0
  150. package/dist/components/ProgressBar.d.ts.map +1 -0
  151. package/dist/components/ProgressBar.js +23 -0
  152. package/dist/components/ProgressBar.js.map +1 -0
  153. package/dist/components/ProjectDashboardView.d.ts +38 -0
  154. package/dist/components/ProjectDashboardView.d.ts.map +1 -0
  155. package/dist/components/ProjectDashboardView.js +129 -0
  156. package/dist/components/ProjectDashboardView.js.map +1 -0
  157. package/dist/components/SaveContextView.d.ts +32 -0
  158. package/dist/components/SaveContextView.d.ts.map +1 -0
  159. package/dist/components/SaveContextView.js +41 -0
  160. package/dist/components/SaveContextView.js.map +1 -0
  161. package/dist/components/SessionDetails.d.ts +14 -0
  162. package/dist/components/SessionDetails.d.ts.map +1 -0
  163. package/dist/components/SessionDetails.js +87 -0
  164. package/dist/components/SessionDetails.js.map +1 -0
  165. package/dist/components/SessionsExperimentView.d.ts +35 -0
  166. package/dist/components/SessionsExperimentView.d.ts.map +1 -0
  167. package/dist/components/SessionsExperimentView.js +347 -0
  168. package/dist/components/SessionsExperimentView.js.map +1 -0
  169. package/dist/components/SessionsList.d.ts +20 -0
  170. package/dist/components/SessionsList.d.ts.map +1 -0
  171. package/dist/components/SessionsList.js +75 -0
  172. package/dist/components/SessionsList.js.map +1 -0
  173. package/dist/components/SettingsView.d.ts +48 -0
  174. package/dist/components/SettingsView.d.ts.map +1 -0
  175. package/dist/components/SettingsView.js +156 -0
  176. package/dist/components/SettingsView.js.map +1 -0
  177. package/dist/components/SourceSelectionView.d.ts +26 -0
  178. package/dist/components/SourceSelectionView.d.ts.map +1 -0
  179. package/dist/components/SourceSelectionView.js +109 -0
  180. package/dist/components/SourceSelectionView.js.map +1 -0
  181. package/dist/components/VerticalMenu.d.ts +18 -0
  182. package/dist/components/VerticalMenu.d.ts.map +1 -0
  183. package/dist/components/VerticalMenu.js +15 -0
  184. package/dist/components/VerticalMenu.js.map +1 -0
  185. package/dist/components/ascii-art/index.d.ts +6 -0
  186. package/dist/components/ascii-art/index.d.ts.map +1 -0
  187. package/dist/components/ascii-art/index.js +6 -0
  188. package/dist/components/ascii-art/index.js.map +1 -0
  189. package/dist/components/ascii-art/progress.d.ts +53 -0
  190. package/dist/components/ascii-art/progress.d.ts.map +1 -0
  191. package/dist/components/ascii-art/progress.js +102 -0
  192. package/dist/components/ascii-art/progress.js.map +1 -0
  193. package/dist/components/ascii-art/scene.d.ts +34 -0
  194. package/dist/components/ascii-art/scene.d.ts.map +1 -0
  195. package/dist/components/ascii-art/scene.js +72 -0
  196. package/dist/components/ascii-art/scene.js.map +1 -0
  197. package/dist/components/index.d.ts +27 -0
  198. package/dist/components/index.d.ts.map +1 -0
  199. package/dist/components/index.js +25 -0
  200. package/dist/components/index.js.map +1 -0
  201. package/dist/components/layout/HorizontalLayout.d.ts +19 -0
  202. package/dist/components/layout/HorizontalLayout.d.ts.map +1 -0
  203. package/dist/components/layout/HorizontalLayout.js +62 -0
  204. package/dist/components/layout/HorizontalLayout.js.map +1 -0
  205. package/dist/components/layout/VerticalLayout.d.ts +16 -0
  206. package/dist/components/layout/VerticalLayout.d.ts.map +1 -0
  207. package/dist/components/layout/VerticalLayout.js +32 -0
  208. package/dist/components/layout/VerticalLayout.js.map +1 -0
  209. package/dist/components/layout/index.d.ts +6 -0
  210. package/dist/components/layout/index.d.ts.map +1 -0
  211. package/dist/components/layout/index.js +4 -0
  212. package/dist/components/layout/index.js.map +1 -0
  213. package/dist/components/layout/theme.d.ts +20 -0
  214. package/dist/components/layout/theme.d.ts.map +1 -0
  215. package/dist/components/layout/theme.js +23 -0
  216. package/dist/components/layout/theme.js.map +1 -0
  217. package/dist/components/setup/DoneStep.d.ts +7 -0
  218. package/dist/components/setup/DoneStep.d.ts.map +1 -0
  219. package/dist/components/setup/DoneStep.js +31 -0
  220. package/dist/components/setup/DoneStep.js.map +1 -0
  221. package/dist/components/setup/InstallingStep.d.ts +11 -0
  222. package/dist/components/setup/InstallingStep.d.ts.map +1 -0
  223. package/dist/components/setup/InstallingStep.js +27 -0
  224. package/dist/components/setup/InstallingStep.js.map +1 -0
  225. package/dist/components/setup/OptionsStep.d.ts +9 -0
  226. package/dist/components/setup/OptionsStep.d.ts.map +1 -0
  227. package/dist/components/setup/OptionsStep.js +39 -0
  228. package/dist/components/setup/OptionsStep.js.map +1 -0
  229. package/dist/components/setup/PrerequisitesStep.d.ts +7 -0
  230. package/dist/components/setup/PrerequisitesStep.d.ts.map +1 -0
  231. package/dist/components/setup/PrerequisitesStep.js +31 -0
  232. package/dist/components/setup/PrerequisitesStep.js.map +1 -0
  233. package/dist/components/setup/SetupFrame.d.ts +17 -0
  234. package/dist/components/setup/SetupFrame.d.ts.map +1 -0
  235. package/dist/components/setup/SetupFrame.js +33 -0
  236. package/dist/components/setup/SetupFrame.js.map +1 -0
  237. package/dist/components/setup/SetupWizard.d.ts +9 -0
  238. package/dist/components/setup/SetupWizard.d.ts.map +1 -0
  239. package/dist/components/setup/SetupWizard.js +149 -0
  240. package/dist/components/setup/SetupWizard.js.map +1 -0
  241. package/dist/components/setup/Spinner.d.ts +10 -0
  242. package/dist/components/setup/Spinner.d.ts.map +1 -0
  243. package/dist/components/setup/Spinner.js +20 -0
  244. package/dist/components/setup/Spinner.js.map +1 -0
  245. package/dist/components/setup/SyncStep.d.ts +11 -0
  246. package/dist/components/setup/SyncStep.d.ts.map +1 -0
  247. package/dist/components/setup/SyncStep.js +47 -0
  248. package/dist/components/setup/SyncStep.js.map +1 -0
  249. package/dist/components/setup/VerificationStep.d.ts +7 -0
  250. package/dist/components/setup/VerificationStep.d.ts.map +1 -0
  251. package/dist/components/setup/VerificationStep.js +27 -0
  252. package/dist/components/setup/VerificationStep.js.map +1 -0
  253. package/dist/components/setup/WelcomeStep.d.ts +6 -0
  254. package/dist/components/setup/WelcomeStep.d.ts.map +1 -0
  255. package/dist/components/setup/WelcomeStep.js +17 -0
  256. package/dist/components/setup/WelcomeStep.js.map +1 -0
  257. package/dist/components/shared/ProgressLine.d.ts +10 -0
  258. package/dist/components/shared/ProgressLine.d.ts.map +1 -0
  259. package/dist/components/shared/ProgressLine.js +18 -0
  260. package/dist/components/shared/ProgressLine.js.map +1 -0
  261. package/dist/components/shared/ProjectLine.d.ts +10 -0
  262. package/dist/components/shared/ProjectLine.d.ts.map +1 -0
  263. package/dist/components/shared/ProjectLine.js +19 -0
  264. package/dist/components/shared/ProjectLine.js.map +1 -0
  265. package/dist/components/shared/ScanningIndicator.d.ts +9 -0
  266. package/dist/components/shared/ScanningIndicator.d.ts.map +1 -0
  267. package/dist/components/shared/ScanningIndicator.js +22 -0
  268. package/dist/components/shared/ScanningIndicator.js.map +1 -0
  269. package/dist/components/shared/StatusLine.d.ts +13 -0
  270. package/dist/components/shared/StatusLine.d.ts.map +1 -0
  271. package/dist/components/shared/StatusLine.js +24 -0
  272. package/dist/components/shared/StatusLine.js.map +1 -0
  273. package/dist/components/shared/StatusLine.test.d.ts +8 -0
  274. package/dist/components/shared/StatusLine.test.d.ts.map +1 -0
  275. package/dist/components/shared/StatusLine.test.js +50 -0
  276. package/dist/components/shared/StatusLine.test.js.map +1 -0
  277. package/dist/components/shared/index.d.ts +4 -0
  278. package/dist/components/shared/index.d.ts.map +1 -0
  279. package/dist/components/shared/index.js +4 -0
  280. package/dist/components/shared/index.js.map +1 -0
  281. package/dist/handoff/catalog.test.d.ts +5 -0
  282. package/dist/handoff/catalog.test.d.ts.map +1 -0
  283. package/dist/handoff/catalog.test.js +172 -0
  284. package/dist/handoff/catalog.test.js.map +1 -0
  285. package/dist/handoff/subagents.test.d.ts +8 -0
  286. package/dist/handoff/subagents.test.d.ts.map +1 -0
  287. package/dist/handoff/subagents.test.js +139 -0
  288. package/dist/handoff/subagents.test.js.map +1 -0
  289. package/dist/hooks/useAddContextFlow.d.ts +29 -0
  290. package/dist/hooks/useAddContextFlow.d.ts.map +1 -0
  291. package/dist/hooks/useAddContextFlow.js +83 -0
  292. package/dist/hooks/useAddContextFlow.js.map +1 -0
  293. package/dist/hooks/useArchiveBrowser.d.ts +37 -0
  294. package/dist/hooks/useArchiveBrowser.d.ts.map +1 -0
  295. package/dist/hooks/useArchiveBrowser.js +175 -0
  296. package/dist/hooks/useArchiveBrowser.js.map +1 -0
  297. package/dist/hooks/useClaudeToken.d.ts +29 -0
  298. package/dist/hooks/useClaudeToken.d.ts.map +1 -0
  299. package/dist/hooks/useClaudeToken.js +166 -0
  300. package/dist/hooks/useClaudeToken.js.map +1 -0
  301. package/dist/hooks/useGoogleDocsBrowser.d.ts +29 -0
  302. package/dist/hooks/useGoogleDocsBrowser.d.ts.map +1 -0
  303. package/dist/hooks/useGoogleDocsBrowser.js +146 -0
  304. package/dist/hooks/useGoogleDocsBrowser.js.map +1 -0
  305. package/dist/hooks/useHandoffBrowser.d.ts +27 -0
  306. package/dist/hooks/useHandoffBrowser.d.ts.map +1 -0
  307. package/dist/hooks/useHandoffBrowser.js +92 -0
  308. package/dist/hooks/useHandoffBrowser.js.map +1 -0
  309. package/dist/hooks/useJacquesClient.d.ts +69 -0
  310. package/dist/hooks/useJacquesClient.d.ts.map +1 -0
  311. package/dist/hooks/useJacquesClient.js +248 -0
  312. package/dist/hooks/useJacquesClient.js.map +1 -0
  313. package/dist/hooks/useLlmWorking.d.ts +30 -0
  314. package/dist/hooks/useLlmWorking.d.ts.map +1 -0
  315. package/dist/hooks/useLlmWorking.js +127 -0
  316. package/dist/hooks/useLlmWorking.js.map +1 -0
  317. package/dist/hooks/useLoadContext.d.ts +27 -0
  318. package/dist/hooks/useLoadContext.d.ts.map +1 -0
  319. package/dist/hooks/useLoadContext.js +102 -0
  320. package/dist/hooks/useLoadContext.js.map +1 -0
  321. package/dist/hooks/useNotification.d.ts +36 -0
  322. package/dist/hooks/useNotification.d.ts.map +1 -0
  323. package/dist/hooks/useNotification.js +89 -0
  324. package/dist/hooks/useNotification.js.map +1 -0
  325. package/dist/hooks/useNotification.test.d.ts +9 -0
  326. package/dist/hooks/useNotification.test.d.ts.map +1 -0
  327. package/dist/hooks/useNotification.test.js +144 -0
  328. package/dist/hooks/useNotification.test.js.map +1 -0
  329. package/dist/hooks/useNotionBrowser.d.ts +30 -0
  330. package/dist/hooks/useNotionBrowser.d.ts.map +1 -0
  331. package/dist/hooks/useNotionBrowser.js +154 -0
  332. package/dist/hooks/useNotionBrowser.js.map +1 -0
  333. package/dist/hooks/useObsidianBrowser.d.ts +42 -0
  334. package/dist/hooks/useObsidianBrowser.d.ts.map +1 -0
  335. package/dist/hooks/useObsidianBrowser.js +63 -0
  336. package/dist/hooks/useObsidianBrowser.js.map +1 -0
  337. package/dist/hooks/useObsidianConfig.d.ts +28 -0
  338. package/dist/hooks/useObsidianConfig.d.ts.map +1 -0
  339. package/dist/hooks/useObsidianConfig.js +119 -0
  340. package/dist/hooks/useObsidianConfig.js.map +1 -0
  341. package/dist/hooks/useObsidianFileBrowser.d.ts +29 -0
  342. package/dist/hooks/useObsidianFileBrowser.d.ts.map +1 -0
  343. package/dist/hooks/useObsidianFileBrowser.js +114 -0
  344. package/dist/hooks/useObsidianFileBrowser.js.map +1 -0
  345. package/dist/hooks/useProjectDashboard.d.ts +38 -0
  346. package/dist/hooks/useProjectDashboard.d.ts.map +1 -0
  347. package/dist/hooks/useProjectDashboard.js +224 -0
  348. package/dist/hooks/useProjectDashboard.js.map +1 -0
  349. package/dist/hooks/useProjectSelector.d.ts +17 -0
  350. package/dist/hooks/useProjectSelector.d.ts.map +1 -0
  351. package/dist/hooks/useProjectSelector.js +43 -0
  352. package/dist/hooks/useProjectSelector.js.map +1 -0
  353. package/dist/hooks/useProjectSelector.test.d.ts +7 -0
  354. package/dist/hooks/useProjectSelector.test.d.ts.map +1 -0
  355. package/dist/hooks/useProjectSelector.test.js +117 -0
  356. package/dist/hooks/useProjectSelector.test.js.map +1 -0
  357. package/dist/hooks/useSaveFlow.d.ts +30 -0
  358. package/dist/hooks/useSaveFlow.d.ts.map +1 -0
  359. package/dist/hooks/useSaveFlow.js +195 -0
  360. package/dist/hooks/useSaveFlow.js.map +1 -0
  361. package/dist/hooks/useSessions.test.d.ts +7 -0
  362. package/dist/hooks/useSessions.test.d.ts.map +1 -0
  363. package/dist/hooks/useSessions.test.js +153 -0
  364. package/dist/hooks/useSessions.test.js.map +1 -0
  365. package/dist/hooks/useSessionsExperiment.d.ts +97 -0
  366. package/dist/hooks/useSessionsExperiment.d.ts.map +1 -0
  367. package/dist/hooks/useSessionsExperiment.js +321 -0
  368. package/dist/hooks/useSessionsExperiment.js.map +1 -0
  369. package/dist/hooks/useSettings.d.ts +47 -0
  370. package/dist/hooks/useSettings.d.ts.map +1 -0
  371. package/dist/hooks/useSettings.js +245 -0
  372. package/dist/hooks/useSettings.js.map +1 -0
  373. package/dist/hooks/useSetupWizard.d.ts +35 -0
  374. package/dist/hooks/useSetupWizard.d.ts.map +1 -0
  375. package/dist/hooks/useSetupWizard.js +438 -0
  376. package/dist/hooks/useSetupWizard.js.map +1 -0
  377. package/dist/hooks/useUsageLimits.d.ts +24 -0
  378. package/dist/hooks/useUsageLimits.d.ts.map +1 -0
  379. package/dist/hooks/useUsageLimits.js +58 -0
  380. package/dist/hooks/useUsageLimits.js.map +1 -0
  381. package/dist/hooks/useUsageLimits.test.d.ts +7 -0
  382. package/dist/hooks/useUsageLimits.test.d.ts.map +1 -0
  383. package/dist/hooks/useUsageLimits.test.js +136 -0
  384. package/dist/hooks/useUsageLimits.test.js.map +1 -0
  385. package/dist/hooks/useWorktrees.d.ts +28 -0
  386. package/dist/hooks/useWorktrees.d.ts.map +1 -0
  387. package/dist/hooks/useWorktrees.js +57 -0
  388. package/dist/hooks/useWorktrees.js.map +1 -0
  389. package/dist/hooks/useWorktrees.test.d.ts +7 -0
  390. package/dist/hooks/useWorktrees.test.d.ts.map +1 -0
  391. package/dist/hooks/useWorktrees.test.js +119 -0
  392. package/dist/hooks/useWorktrees.test.js.map +1 -0
  393. package/dist/templates/compact-prompt.d.ts +16 -0
  394. package/dist/templates/compact-prompt.d.ts.map +1 -0
  395. package/dist/templates/compact-prompt.js +47 -0
  396. package/dist/templates/compact-prompt.js.map +1 -0
  397. package/dist/templates/context-skill.d.ts +8 -0
  398. package/dist/templates/context-skill.d.ts.map +1 -0
  399. package/dist/templates/context-skill.js +42 -0
  400. package/dist/templates/context-skill.js.map +1 -0
  401. package/dist/types.d.ts +127 -0
  402. package/dist/types.d.ts.map +1 -0
  403. package/dist/types.js +8 -0
  404. package/dist/types.js.map +1 -0
  405. package/dist/utils/activity.d.ts +17 -0
  406. package/dist/utils/activity.d.ts.map +1 -0
  407. package/dist/utils/activity.js +78 -0
  408. package/dist/utils/activity.js.map +1 -0
  409. package/dist/utils/bottom-controls.d.ts +24 -0
  410. package/dist/utils/bottom-controls.d.ts.map +1 -0
  411. package/dist/utils/bottom-controls.js +29 -0
  412. package/dist/utils/bottom-controls.js.map +1 -0
  413. package/dist/utils/clipboard.d.ts +2 -0
  414. package/dist/utils/clipboard.d.ts.map +1 -0
  415. package/dist/utils/clipboard.js +20 -0
  416. package/dist/utils/clipboard.js.map +1 -0
  417. package/dist/utils/constants.d.ts +6 -0
  418. package/dist/utils/constants.d.ts.map +1 -0
  419. package/dist/utils/constants.js +6 -0
  420. package/dist/utils/constants.js.map +1 -0
  421. package/dist/utils/format.d.ts +17 -0
  422. package/dist/utils/format.d.ts.map +1 -0
  423. package/dist/utils/format.js +31 -0
  424. package/dist/utils/format.js.map +1 -0
  425. package/dist/utils/session-mode.d.ts +14 -0
  426. package/dist/utils/session-mode.d.ts.map +1 -0
  427. package/dist/utils/session-mode.js +29 -0
  428. package/dist/utils/session-mode.js.map +1 -0
  429. package/dist/utils/session-mode.test.d.ts +7 -0
  430. package/dist/utils/session-mode.test.d.ts.map +1 -0
  431. package/dist/utils/session-mode.test.js +102 -0
  432. package/dist/utils/session-mode.test.js.map +1 -0
  433. package/dist/utils/sessions-items-builder.d.ts +29 -0
  434. package/dist/utils/sessions-items-builder.d.ts.map +1 -0
  435. package/dist/utils/sessions-items-builder.js +394 -0
  436. package/dist/utils/sessions-items-builder.js.map +1 -0
  437. package/dist/utils/settings.d.ts +100 -0
  438. package/dist/utils/settings.d.ts.map +1 -0
  439. package/dist/utils/settings.js +206 -0
  440. package/dist/utils/settings.js.map +1 -0
  441. package/dist/websocket-client.d.ts +70 -0
  442. package/dist/websocket-client.d.ts.map +1 -0
  443. package/dist/websocket-client.js +188 -0
  444. package/dist/websocket-client.js.map +1 -0
  445. package/hooks/adapters/__init__.py +17 -0
  446. package/hooks/adapters/__pycache__/__init__.cpython-311.pyc +0 -0
  447. package/hooks/adapters/__pycache__/__init__.cpython-313.pyc +0 -0
  448. package/hooks/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  449. package/hooks/adapters/__pycache__/base.cpython-311.pyc +0 -0
  450. package/hooks/adapters/__pycache__/base.cpython-313.pyc +0 -0
  451. package/hooks/adapters/__pycache__/base.cpython-314.pyc +0 -0
  452. package/hooks/adapters/__pycache__/calibration.cpython-311.pyc +0 -0
  453. package/hooks/adapters/__pycache__/calibration.cpython-313.pyc +0 -0
  454. package/hooks/adapters/__pycache__/calibration.cpython-314.pyc +0 -0
  455. package/hooks/adapters/__pycache__/claude_code.cpython-311.pyc +0 -0
  456. package/hooks/adapters/__pycache__/claude_code.cpython-313.pyc +0 -0
  457. package/hooks/adapters/__pycache__/claude_code.cpython-314.pyc +0 -0
  458. package/hooks/adapters/__pycache__/cursor.cpython-311.pyc +0 -0
  459. package/hooks/adapters/__pycache__/cursor.cpython-313.pyc +0 -0
  460. package/hooks/adapters/__pycache__/cursor.cpython-314.pyc +0 -0
  461. package/hooks/adapters/__pycache__/skills.cpython-311.pyc +0 -0
  462. package/hooks/adapters/__pycache__/skills.cpython-313.pyc +0 -0
  463. package/hooks/adapters/__pycache__/skills.cpython-314.pyc +0 -0
  464. package/hooks/adapters/__pycache__/test_adapters.cpython-311-pytest-9.0.2.pyc +0 -0
  465. package/hooks/adapters/__pycache__/test_adapters.cpython-313.pyc +0 -0
  466. package/hooks/adapters/__pycache__/test_calibration.cpython-311-pytest-9.0.2.pyc +0 -0
  467. package/hooks/adapters/__pycache__/test_skills.cpython-311-pytest-9.0.2.pyc +0 -0
  468. package/hooks/adapters/__pycache__/test_tokenizer.cpython-311-pytest-9.0.2.pyc +0 -0
  469. package/hooks/adapters/__pycache__/tokenizer.cpython-311.pyc +0 -0
  470. package/hooks/adapters/__pycache__/tokenizer.cpython-313.pyc +0 -0
  471. package/hooks/adapters/__pycache__/tokenizer.cpython-314.pyc +0 -0
  472. package/hooks/adapters/base.py +459 -0
  473. package/hooks/adapters/calibration.py +236 -0
  474. package/hooks/adapters/claude_code.py +316 -0
  475. package/hooks/adapters/context_parser.py +288 -0
  476. package/hooks/adapters/cursor.py +258 -0
  477. package/hooks/adapters/skills.py +160 -0
  478. package/hooks/adapters/template.py +281 -0
  479. package/hooks/adapters/test_adapters.py +516 -0
  480. package/hooks/adapters/test_calibration.py +235 -0
  481. package/hooks/adapters/test_skills.py +162 -0
  482. package/hooks/adapters/test_tokenizer.py +158 -0
  483. package/hooks/adapters/tokenizer.py +192 -0
  484. package/hooks/claude-code/pre-tool-use.py +36 -0
  485. package/hooks/claude-code/register-session.py +35 -0
  486. package/hooks/claude-code/report-activity.py +32 -0
  487. package/hooks/claude-code/session-idle.py +32 -0
  488. package/hooks/claude-code/statusline.sh +91 -0
  489. package/hooks/claude-code/unregister-session.py +32 -0
  490. package/hooks/cursor/README.md +61 -0
  491. package/hooks/cursor/after-agent-response.py +97 -0
  492. package/hooks/cursor/hooks.json.template +30 -0
  493. package/hooks/cursor/post-tool-use.py +32 -0
  494. package/hooks/cursor/pre-compact.py +61 -0
  495. package/hooks/cursor/session-end.py +32 -0
  496. package/hooks/cursor/session-start.py +66 -0
  497. package/hooks/git-detect.sh +47 -0
  498. package/hooks/install.py +441 -0
  499. package/hooks/jacques-register-session.py +286 -0
  500. package/hooks/jacques-report-activity.py +145 -0
  501. package/hooks/jacques-session-idle.py +57 -0
  502. package/hooks/jacques-unregister-session.py +57 -0
  503. package/hooks/requirements.txt +9 -0
  504. package/hooks/statusline.py +457 -0
  505. package/hooks/statusline.sh +212 -0
  506. package/package.json +63 -0
  507. package/skills/jacques-continue/SKILL.md +87 -0
  508. package/skills/jacques-handoff/SKILL.md +147 -0
@@ -0,0 +1,516 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ test_adapters.py - Unit tests for Jacques Source Adapters
4
+
5
+ Run with:
6
+ python3 -m pytest hooks/adapters/test_adapters.py -v
7
+
8
+ Or simply:
9
+ python3 hooks/adapters/test_adapters.py
10
+ """
11
+ import json
12
+ import os
13
+ import sys
14
+ import tempfile
15
+ import socket
16
+ import threading
17
+ import time
18
+ from pathlib import Path
19
+ from io import StringIO
20
+ from unittest.mock import patch, MagicMock
21
+
22
+ # Add parent directory to path for imports
23
+ sys.path.insert(0, str(Path(__file__).parent.parent))
24
+
25
+ from adapters.base import BaseAdapter
26
+ from adapters.claude_code import ClaudeCodeAdapter
27
+ from adapters.cursor import CursorAdapter
28
+
29
+
30
+ # ============================================================================
31
+ # Test Base Adapter
32
+ # ============================================================================
33
+
34
+ class TestBaseAdapter:
35
+ """Tests for BaseAdapter base class."""
36
+
37
+ def test_build_base_payload(self):
38
+ """Test that build_base_payload creates correct structure."""
39
+ adapter = ClaudeCodeAdapter() # Use concrete class
40
+
41
+ payload = adapter.build_base_payload(
42
+ event='test_event',
43
+ session_id='test-123',
44
+ extra_field='extra_value'
45
+ )
46
+
47
+ assert payload['event'] == 'test_event'
48
+ assert payload['session_id'] == 'test-123'
49
+ assert payload['source'] == 'claude_code'
50
+ assert payload['extra_field'] == 'extra_value'
51
+ assert 'timestamp' in payload
52
+ assert isinstance(payload['timestamp'], (int, float))
53
+
54
+ def test_extract_project_info_with_project_path(self):
55
+ """Test project info extraction when project path is available."""
56
+ adapter = ClaudeCodeAdapter()
57
+
58
+ input_data = {
59
+ 'workspace': {'project_dir': '/Users/test/my-project'},
60
+ 'cwd': '/Users/test/my-project/src'
61
+ }
62
+
63
+ info = adapter.extract_project_info(input_data)
64
+
65
+ assert info['project'] == 'my-project'
66
+ assert info['project_path'] == '/Users/test/my-project'
67
+ assert info['cwd'] == '/Users/test/my-project/src'
68
+
69
+ def test_extract_project_info_fallback_to_cwd(self):
70
+ """Test project info falls back to cwd when project_dir not available."""
71
+ adapter = ClaudeCodeAdapter()
72
+
73
+ input_data = {
74
+ 'cwd': '/Users/test/another-project'
75
+ }
76
+
77
+ info = adapter.extract_project_info(input_data)
78
+
79
+ assert info['project'] == 'another-project'
80
+ assert info['cwd'] == '/Users/test/another-project'
81
+
82
+ def test_generate_fallback_title(self):
83
+ """Test fallback title generation."""
84
+ adapter = ClaudeCodeAdapter()
85
+
86
+ title = adapter.generate_fallback_title('my-project')
87
+
88
+ assert title == 'Session in my-project'
89
+
90
+ def test_extract_session_title_empty_path(self):
91
+ """Test that extract_session_title returns None for empty path."""
92
+ adapter = ClaudeCodeAdapter()
93
+
94
+ assert adapter.extract_session_title(None) is None
95
+ assert adapter.extract_session_title('') is None
96
+
97
+ def test_extract_session_title_from_transcript(self):
98
+ """Test extracting session title from transcript file."""
99
+ adapter = ClaudeCodeAdapter()
100
+
101
+ # Create a temporary transcript file
102
+ with tempfile.NamedTemporaryFile(mode='w', suffix='.jsonl', delete=False) as f:
103
+ f.write('{"type": "human", "message": {"content": "Help me build a web app"}}\n')
104
+ f.write('{"type": "assistant", "message": {"content": "Sure!"}}\n')
105
+ transcript_path = f.name
106
+
107
+ try:
108
+ title = adapter.extract_session_title(transcript_path)
109
+ assert title == 'Help me build a web app'
110
+ finally:
111
+ os.unlink(transcript_path)
112
+
113
+ def test_extract_session_title_with_summary(self):
114
+ """Test extracting session title from summary entry."""
115
+ adapter = ClaudeCodeAdapter()
116
+
117
+ with tempfile.NamedTemporaryFile(mode='w', suffix='.jsonl', delete=False) as f:
118
+ f.write('{"type": "human", "message": {"content": "Original message"}}\n')
119
+ f.write('{"type": "summary", "summary": "Building a React dashboard. With charts."}\n')
120
+ transcript_path = f.name
121
+
122
+ try:
123
+ title = adapter.extract_session_title(transcript_path)
124
+ assert title == 'Building a React dashboard' # Truncated at first period
125
+ finally:
126
+ os.unlink(transcript_path)
127
+
128
+ def test_build_terminal_key_iterm(self):
129
+ """Test terminal key generation for iTerm."""
130
+ adapter = ClaudeCodeAdapter()
131
+
132
+ terminal = {'iterm_session_id': 'abc123', 'tty': '/dev/ttys001'}
133
+ key = adapter.build_terminal_key(terminal)
134
+
135
+ assert key == 'ITERM:abc123'
136
+
137
+ def test_build_terminal_key_tty(self):
138
+ """Test terminal key generation fallback to TTY."""
139
+ adapter = ClaudeCodeAdapter()
140
+
141
+ terminal = {'tty': '/dev/ttys001', 'terminal_pid': 12345}
142
+ key = adapter.build_terminal_key(terminal)
143
+
144
+ assert key == 'TTY:/dev/ttys001'
145
+
146
+ def test_send_to_server_connection_refused(self):
147
+ """Test send_to_server returns False when connection refused."""
148
+ adapter = ClaudeCodeAdapter()
149
+
150
+ # Use a path that doesn't exist
151
+ result = adapter.send_to_server(
152
+ {'test': 'data'},
153
+ socket_path='/tmp/nonexistent_socket.sock',
154
+ timeout=0.1
155
+ )
156
+
157
+ assert result is False
158
+
159
+
160
+ # ============================================================================
161
+ # Test Claude Code Adapter
162
+ # ============================================================================
163
+
164
+ class TestClaudeCodeAdapter:
165
+ """Tests for ClaudeCodeAdapter."""
166
+
167
+ def test_source_is_claude_code(self):
168
+ """Test that source property returns 'claude_code'."""
169
+ adapter = ClaudeCodeAdapter()
170
+ assert adapter.source == 'claude_code'
171
+
172
+ def test_get_session_id(self):
173
+ """Test session ID extraction from Claude Code input."""
174
+ adapter = ClaudeCodeAdapter()
175
+
176
+ input_data = {'session_id': 'claude-session-123'}
177
+ session_id = adapter.get_session_id(input_data)
178
+
179
+ assert session_id == 'claude-session-123'
180
+
181
+ def test_get_session_id_missing(self):
182
+ """Test get_session_id returns None when missing."""
183
+ adapter = ClaudeCodeAdapter()
184
+
185
+ session_id = adapter.get_session_id({})
186
+
187
+ assert session_id is None
188
+
189
+ def test_get_project_path(self):
190
+ """Test project path extraction from Claude Code input."""
191
+ adapter = ClaudeCodeAdapter()
192
+
193
+ input_data = {
194
+ 'workspace': {
195
+ 'project_dir': '/Users/test/my-project',
196
+ 'current_dir': '/Users/test/my-project/src'
197
+ }
198
+ }
199
+
200
+ project_path = adapter.get_project_path(input_data)
201
+
202
+ assert project_path == '/Users/test/my-project'
203
+
204
+ def test_build_session_start_payload(self):
205
+ """Test building session_start payload."""
206
+ adapter = ClaudeCodeAdapter()
207
+
208
+ input_data = {
209
+ 'session_id': 'claude-123',
210
+ 'workspace': {'project_dir': '/Users/test/my-project'},
211
+ 'cwd': '/Users/test/my-project',
212
+ 'model': 'claude-3-5-sonnet',
213
+ 'source': 'startup',
214
+ }
215
+
216
+ payload = adapter.build_session_start_payload(input_data)
217
+
218
+ assert payload['event'] == 'session_start'
219
+ assert payload['session_id'] == 'claude-123'
220
+ assert payload['source'] == 'claude_code'
221
+ assert payload['project'] == 'my-project'
222
+ assert payload['model'] == 'claude-3-5-sonnet'
223
+ assert 'terminal' in payload
224
+ assert 'terminal_key' in payload
225
+
226
+ def test_build_session_start_payload_missing_session_id(self):
227
+ """Test that build_session_start_payload returns None without session_id."""
228
+ adapter = ClaudeCodeAdapter()
229
+
230
+ payload = adapter.build_session_start_payload({})
231
+
232
+ assert payload is None
233
+
234
+ def test_build_activity_payload(self):
235
+ """Test building activity payload."""
236
+ adapter = ClaudeCodeAdapter()
237
+
238
+ input_data = {
239
+ 'session_id': 'claude-123',
240
+ 'tool_name': 'write_file',
241
+ 'workspace': {'project_dir': '/Users/test/my-project'},
242
+ }
243
+
244
+ payload = adapter.build_activity_payload(input_data)
245
+
246
+ assert payload['event'] == 'activity'
247
+ assert payload['session_id'] == 'claude-123'
248
+ assert payload['tool_name'] == 'write_file'
249
+ assert payload['source'] == 'claude_code'
250
+
251
+ def test_build_idle_payload(self):
252
+ """Test building idle payload."""
253
+ adapter = ClaudeCodeAdapter()
254
+
255
+ input_data = {'session_id': 'claude-123'}
256
+ payload = adapter.build_idle_payload(input_data)
257
+
258
+ assert payload['event'] == 'idle'
259
+ assert payload['session_id'] == 'claude-123'
260
+ assert payload['source'] == 'claude_code'
261
+
262
+ def test_build_session_end_payload(self):
263
+ """Test building session_end payload."""
264
+ adapter = ClaudeCodeAdapter()
265
+
266
+ input_data = {'session_id': 'claude-123'}
267
+ payload = adapter.build_session_end_payload(input_data)
268
+
269
+ assert payload['event'] == 'session_end'
270
+ assert payload['session_id'] == 'claude-123'
271
+ assert payload['source'] == 'claude_code'
272
+
273
+
274
+ # ============================================================================
275
+ # Test Cursor Adapter
276
+ # ============================================================================
277
+
278
+ class TestCursorAdapter:
279
+ """Tests for CursorAdapter."""
280
+
281
+ def test_source_is_cursor(self):
282
+ """Test that source property returns 'cursor'."""
283
+ adapter = CursorAdapter()
284
+ assert adapter.source == 'cursor'
285
+
286
+ def test_get_session_id(self):
287
+ """Test session ID extraction from Cursor input (conversation_id)."""
288
+ adapter = CursorAdapter()
289
+
290
+ input_data = {'conversation_id': 'cursor-conv-456'}
291
+ session_id = adapter.get_session_id(input_data)
292
+
293
+ assert session_id == 'cursor-conv-456'
294
+
295
+ def test_get_session_id_missing(self):
296
+ """Test get_session_id returns None when conversation_id missing."""
297
+ adapter = CursorAdapter()
298
+
299
+ session_id = adapter.get_session_id({'session_id': 'wrong-field'})
300
+
301
+ assert session_id is None
302
+
303
+ def test_get_project_path(self):
304
+ """Test project path extraction from Cursor input (workspace_roots)."""
305
+ adapter = CursorAdapter()
306
+
307
+ input_data = {
308
+ 'workspace_roots': ['/Users/test/cursor-project', '/Users/test/other']
309
+ }
310
+
311
+ project_path = adapter.get_project_path(input_data)
312
+
313
+ assert project_path == '/Users/test/cursor-project'
314
+
315
+ def test_get_project_path_empty_roots(self):
316
+ """Test get_project_path returns empty string for empty workspace_roots."""
317
+ adapter = CursorAdapter()
318
+
319
+ project_path = adapter.get_project_path({'workspace_roots': []})
320
+
321
+ assert project_path == ''
322
+
323
+ def test_build_session_start_payload(self):
324
+ """Test building session_start payload for Cursor."""
325
+ adapter = CursorAdapter()
326
+
327
+ input_data = {
328
+ 'conversation_id': 'cursor-456',
329
+ 'workspace_roots': ['/Users/test/cursor-project'],
330
+ 'model_name': 'gpt-4',
331
+ }
332
+
333
+ payload = adapter.build_session_start_payload(input_data)
334
+
335
+ assert payload['event'] == 'session_start'
336
+ assert payload['session_id'] == 'cursor-456'
337
+ assert payload['source'] == 'cursor'
338
+ assert payload['project'] == 'cursor-project'
339
+ assert payload['workspace_roots'] == ['/Users/test/cursor-project']
340
+
341
+ def test_build_pre_compact_payload(self):
342
+ """Test building context_update payload from preCompact event."""
343
+ adapter = CursorAdapter()
344
+
345
+ input_data = {
346
+ 'conversation_id': 'cursor-456',
347
+ 'context_usage_percent': 75.5,
348
+ 'context_tokens': 96000,
349
+ 'context_window_size': 128000,
350
+ 'workspace_roots': ['/Users/test/cursor-project'],
351
+ }
352
+
353
+ payload = adapter.build_pre_compact_payload(input_data)
354
+
355
+ assert payload['event'] == 'context_update'
356
+ assert payload['session_id'] == 'cursor-456'
357
+ assert payload['source'] == 'cursor'
358
+ assert payload['used_percentage'] == 75.5
359
+ assert payload['remaining_percentage'] == 24.5
360
+ assert payload['context_window_size'] == 128000
361
+ assert payload['total_input_tokens'] == 96000
362
+
363
+ def test_build_pre_compact_payload_missing_metrics(self):
364
+ """Test preCompact payload with missing metrics uses defaults."""
365
+ adapter = CursorAdapter()
366
+
367
+ input_data = {'conversation_id': 'cursor-456'}
368
+ payload = adapter.build_pre_compact_payload(input_data)
369
+
370
+ assert payload['used_percentage'] == 0
371
+ assert payload['remaining_percentage'] == 100
372
+ assert payload['context_window_size'] == 0
373
+
374
+ def test_build_activity_payload(self):
375
+ """Test building activity payload for Cursor."""
376
+ adapter = CursorAdapter()
377
+
378
+ input_data = {
379
+ 'conversation_id': 'cursor-456',
380
+ 'tool_name': 'read_file',
381
+ 'workspace_roots': ['/Users/test/cursor-project'],
382
+ }
383
+
384
+ payload = adapter.build_activity_payload(input_data)
385
+
386
+ assert payload['event'] == 'activity'
387
+ assert payload['session_id'] == 'cursor-456'
388
+ assert payload['tool_name'] == 'read_file'
389
+ assert payload['source'] == 'cursor'
390
+
391
+ def test_build_session_end_payload(self):
392
+ """Test building session_end payload for Cursor."""
393
+ adapter = CursorAdapter()
394
+
395
+ input_data = {'conversation_id': 'cursor-456'}
396
+ payload = adapter.build_session_end_payload(input_data)
397
+
398
+ assert payload['event'] == 'session_end'
399
+ assert payload['session_id'] == 'cursor-456'
400
+ assert payload['source'] == 'cursor'
401
+
402
+
403
+ # ============================================================================
404
+ # Integration Tests
405
+ # ============================================================================
406
+
407
+ class TestIntegration:
408
+ """Integration tests for adapter → server communication."""
409
+
410
+ def test_send_to_mock_server(self):
411
+ """Test sending payload to a mock Unix socket server."""
412
+ adapter = ClaudeCodeAdapter()
413
+ received_data = []
414
+
415
+ # Create a temporary socket
416
+ socket_path = f'/tmp/jacques_test_{os.getpid()}.sock'
417
+
418
+ # Clean up any existing socket
419
+ if os.path.exists(socket_path):
420
+ os.unlink(socket_path)
421
+
422
+ # Create server socket
423
+ server_sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
424
+ server_sock.bind(socket_path)
425
+ server_sock.listen(1)
426
+ server_sock.settimeout(2.0)
427
+
428
+ def accept_connection():
429
+ try:
430
+ conn, _ = server_sock.accept()
431
+ data = conn.recv(4096)
432
+ received_data.append(json.loads(data.decode().strip()))
433
+ conn.close()
434
+ except:
435
+ pass
436
+
437
+ # Start accepting thread
438
+ accept_thread = threading.Thread(target=accept_connection)
439
+ accept_thread.start()
440
+
441
+ try:
442
+ # Send payload
443
+ payload = {'event': 'test', 'session_id': 'test-123'}
444
+ result = adapter.send_to_server(payload, socket_path=socket_path)
445
+
446
+ # Wait for server to receive
447
+ accept_thread.join(timeout=2.0)
448
+
449
+ assert result is True
450
+ assert len(received_data) == 1
451
+ assert received_data[0]['event'] == 'test'
452
+ assert received_data[0]['session_id'] == 'test-123'
453
+
454
+ finally:
455
+ server_sock.close()
456
+ if os.path.exists(socket_path):
457
+ os.unlink(socket_path)
458
+
459
+
460
+ # ============================================================================
461
+ # Run Tests
462
+ # ============================================================================
463
+
464
+ def run_tests():
465
+ """Run all tests without pytest."""
466
+ import traceback
467
+
468
+ test_classes = [
469
+ TestBaseAdapter,
470
+ TestClaudeCodeAdapter,
471
+ TestCursorAdapter,
472
+ TestIntegration,
473
+ ]
474
+
475
+ total = 0
476
+ passed = 0
477
+ failed = 0
478
+
479
+ for test_class in test_classes:
480
+ print(f"\n{'='*60}")
481
+ print(f"Running {test_class.__name__}")
482
+ print('='*60)
483
+
484
+ instance = test_class()
485
+ methods = [m for m in dir(instance) if m.startswith('test_')]
486
+
487
+ for method_name in methods:
488
+ total += 1
489
+ try:
490
+ getattr(instance, method_name)()
491
+ print(f" ✓ {method_name}")
492
+ passed += 1
493
+ except AssertionError as e:
494
+ print(f" ✗ {method_name}: {e}")
495
+ failed += 1
496
+ except Exception as e:
497
+ print(f" ✗ {method_name}: {type(e).__name__}: {e}")
498
+ traceback.print_exc()
499
+ failed += 1
500
+
501
+ print(f"\n{'='*60}")
502
+ print(f"Results: {passed}/{total} passed, {failed} failed")
503
+ print('='*60)
504
+
505
+ return failed == 0
506
+
507
+
508
+ if __name__ == '__main__':
509
+ # Try to use pytest if available
510
+ try:
511
+ import pytest
512
+ sys.exit(pytest.main([__file__, '-v']))
513
+ except ImportError:
514
+ # Fall back to basic test runner
515
+ success = run_tests()
516
+ sys.exit(0 if success else 1)