@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,286 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ jacques-register-session.py
4
+
5
+ Register Claude Code session with Jacques server.
6
+ Called on SessionStart hook.
7
+
8
+ Extracts:
9
+ - Session metadata from stdin JSON
10
+ - Terminal identity from environment
11
+ - Session title from transcript (if available)
12
+
13
+ Skip: Set JACQUES_SKIP=1 or create ~/.jacques/skip
14
+ """
15
+ import json
16
+ import sys
17
+ import os
18
+ import socket
19
+ import subprocess
20
+ import time
21
+ from pathlib import Path
22
+
23
+ # Skip if running as subprocess, JACQUES_SKIP=1, or ~/.jacques/skip exists
24
+ if os.environ.get('JACQUES_SUBPROCESS') == '1' or os.environ.get('JACQUES_SKIP') == '1' or Path.home().joinpath('.jacques/skip').exists():
25
+ sys.exit(0)
26
+
27
+
28
+ def extract_session_title(transcript_path: str) -> str | None:
29
+ """
30
+ Extract a meaningful title from the Claude Code session transcript.
31
+
32
+ Priority:
33
+ 1. Explicit 'title' field (if Claude Code adds one)
34
+ 2. 'summary' type entries (auto-generated session summaries)
35
+ 3. First user message (truncated to 80 chars)
36
+ """
37
+ if not transcript_path:
38
+ return None
39
+
40
+ path = Path(transcript_path)
41
+ if not path.exists():
42
+ return None
43
+
44
+ title = None
45
+ first_user_message = None
46
+ summary_text = None
47
+
48
+ try:
49
+ with open(path, 'r') as f:
50
+ for line in f:
51
+ try:
52
+ entry = json.loads(line.strip())
53
+
54
+ # Check for explicit title
55
+ if 'title' in entry:
56
+ title = entry['title']
57
+ break
58
+
59
+ # Check for summary type
60
+ if entry.get('type') == 'summary':
61
+ summary_content = entry.get('summary', '')
62
+ if summary_content:
63
+ summary_text = summary_content.split('.')[0][:80]
64
+
65
+ # Track first REAL user message (skip internal Claude Code messages)
66
+ if entry.get('type') == 'user' and not first_user_message:
67
+ msg = entry.get('message', {})
68
+ content = msg.get('content', '') if isinstance(msg, dict) else ''
69
+ if isinstance(content, str) and content:
70
+ # Skip internal Claude Code XML tags
71
+ skip_prefixes = ('<local-command', '<command-name>', '<system-', '<user-prompt-')
72
+ if not any(content.startswith(p) for p in skip_prefixes) and not content.startswith('['):
73
+ first_user_message = content.strip()[:80]
74
+ if len(content) > 80:
75
+ first_user_message += '...'
76
+
77
+ except json.JSONDecodeError:
78
+ continue
79
+ except Exception as e:
80
+ # Log error for debugging
81
+ print(f"[jacques] Error reading transcript: {e}", file=sys.stderr)
82
+
83
+ return title or summary_text or first_user_message
84
+
85
+
86
+ def get_terminal_identity() -> dict:
87
+ """Get terminal-specific identifiers from environment and system."""
88
+ tty = None
89
+
90
+ # Try to get TTY
91
+ try:
92
+ if sys.stdin.isatty():
93
+ tty = os.ttyname(sys.stdin.fileno())
94
+ except:
95
+ pass
96
+
97
+ if not tty:
98
+ try:
99
+ result = os.popen("tty 2>/dev/null").read().strip()
100
+ if result and result != "not a tty":
101
+ tty = result
102
+ except:
103
+ pass
104
+
105
+ return {
106
+ "tty": tty,
107
+ "terminal_pid": os.getppid(),
108
+ "term_program": os.environ.get("TERM_PROGRAM"),
109
+ "iterm_session_id": os.environ.get("ITERM_SESSION_ID"),
110
+ "term_session_id": os.environ.get("TERM_SESSION_ID"),
111
+ "kitty_window_id": os.environ.get("KITTY_WINDOW_ID"),
112
+ "wezterm_pane": os.environ.get("WEZTERM_PANE"),
113
+ "vscode_injection": os.environ.get("VSCODE_INJECTION"),
114
+ "windowid": os.environ.get("WINDOWID"),
115
+ "term": os.environ.get("TERM"),
116
+ }
117
+
118
+
119
+ def build_terminal_key(terminal: dict) -> str:
120
+ """Build a unique key for this terminal instance."""
121
+ # Priority: iTerm session ID > Kitty > WezTerm > TTY > PID
122
+ if terminal.get("iterm_session_id"):
123
+ return f"ITERM:{terminal['iterm_session_id']}"
124
+ if terminal.get("kitty_window_id"):
125
+ return f"KITTY:{terminal['kitty_window_id']}"
126
+ if terminal.get("wezterm_pane"):
127
+ return f"WEZTERM:{terminal['wezterm_pane']}"
128
+ if terminal.get("tty"):
129
+ return f"TTY:{terminal['tty']}"
130
+ if terminal.get("terminal_pid"):
131
+ return f"PID:{terminal['terminal_pid']}"
132
+ return f"UNKNOWN:{time.time()}"
133
+
134
+
135
+ def detect_git_info(project_dir: str) -> dict:
136
+ """Detect git branch, worktree name, and repo root using git-detect.sh."""
137
+ result = {'git_branch': '', 'git_worktree': '', 'git_repo_root': ''}
138
+ if not project_dir or not os.path.isdir(project_dir):
139
+ return result
140
+
141
+ script_dir = os.path.dirname(os.path.abspath(__file__))
142
+ script_path = os.path.join(script_dir, 'git-detect.sh')
143
+
144
+ if os.path.isfile(script_path) and os.access(script_path, os.X_OK):
145
+ try:
146
+ proc = subprocess.run(
147
+ [script_path, project_dir],
148
+ capture_output=True, text=True, timeout=5
149
+ )
150
+ if proc.returncode == 0:
151
+ lines = proc.stdout.split('\n')
152
+ result['git_branch'] = lines[0] if len(lines) > 0 else ''
153
+ result['git_worktree'] = lines[1] if len(lines) > 1 else ''
154
+ result['git_repo_root'] = lines[2] if len(lines) > 2 else ''
155
+ return result
156
+ except Exception:
157
+ pass
158
+
159
+ # Fallback: inline git detection
160
+ try:
161
+ proc = subprocess.run(
162
+ ['git', '-C', project_dir, 'rev-parse', '--abbrev-ref', 'HEAD', '--git-common-dir'],
163
+ capture_output=True, text=True, timeout=5
164
+ )
165
+ if proc.returncode == 0 and proc.stdout.strip():
166
+ lines = proc.stdout.strip().split('\n')
167
+ result['git_branch'] = lines[0] if len(lines) > 0 else ''
168
+ if len(lines) > 1:
169
+ common = lines[1]
170
+ if common == '.git':
171
+ result['git_repo_root'] = os.path.abspath(project_dir)
172
+ else:
173
+ result['git_repo_root'] = os.path.dirname(common)
174
+ result['git_worktree'] = os.path.basename(project_dir)
175
+ except Exception:
176
+ pass
177
+
178
+ return result
179
+
180
+
181
+ def send_to_server(payload: dict, socket_path: str = '/tmp/jacques.sock') -> bool:
182
+ """Send payload to Jacques server via Unix socket."""
183
+ try:
184
+ sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
185
+ sock.settimeout(1.0)
186
+ sock.connect(socket_path)
187
+ sock.sendall(json.dumps(payload).encode() + b'\n')
188
+ sock.close()
189
+ return True
190
+ except Exception as e:
191
+ # Log for debugging
192
+ print(f"[jacques] Failed to send to server: {e}", file=sys.stderr)
193
+ return False
194
+
195
+
196
+ def write_fallback(payload: dict):
197
+ """Write to fallback file when server is unavailable."""
198
+ fallback_path = Path.home() / '.jacques' / 'pending-events.jsonl'
199
+ fallback_path.parent.mkdir(parents=True, exist_ok=True)
200
+
201
+ try:
202
+ with open(fallback_path, 'a') as f:
203
+ f.write(json.dumps(payload) + '\n')
204
+ except Exception as e:
205
+ print(f"[jacques] Failed to write fallback: {e}", file=sys.stderr)
206
+
207
+
208
+ def main():
209
+ try:
210
+ input_data = json.load(sys.stdin)
211
+ except json.JSONDecodeError as e:
212
+ print(f"[jacques] Invalid JSON input: {e}", file=sys.stderr)
213
+ sys.exit(0)
214
+ except Exception as e:
215
+ print(f"[jacques] Error reading input: {e}", file=sys.stderr)
216
+ sys.exit(0)
217
+
218
+ # DEBUG: Log the full input to help understand what Cursor sends vs CLI
219
+ try:
220
+ with open('/tmp/jacques-hook-debug.log', 'a') as f:
221
+ f.write(f"\n=== SessionStart {time.strftime('%Y-%m-%d %H:%M:%S')} ===\n")
222
+ f.write(json.dumps(input_data, indent=2))
223
+ f.write("\n")
224
+ except:
225
+ pass
226
+
227
+ session_id = input_data.get('session_id')
228
+ if not session_id:
229
+ print("[jacques] No session_id in input", file=sys.stderr)
230
+ sys.exit(0)
231
+
232
+ transcript_path = input_data.get('transcript_path')
233
+ cwd = input_data.get('cwd', os.getcwd())
234
+
235
+ # Get workspace info - prefer project_dir over cwd for project name
236
+ workspace = input_data.get('workspace', {})
237
+ project_dir = workspace.get('project_dir', '') if isinstance(workspace, dict) else ''
238
+ current_dir = workspace.get('current_dir', cwd) if isinstance(workspace, dict) else cwd
239
+
240
+ # Determine project name: prefer project_dir, fall back to cwd
241
+ if project_dir:
242
+ project_name = os.path.basename(project_dir)
243
+ else:
244
+ project_name = os.path.basename(cwd) if cwd else 'Unknown'
245
+
246
+ # Extract session title from transcript
247
+ session_title = extract_session_title(transcript_path)
248
+
249
+ # Fallback title if transcript is empty or doesn't exist yet
250
+ if not session_title:
251
+ session_title = f"Session in {project_name}"
252
+
253
+ # Get terminal identity
254
+ terminal = get_terminal_identity()
255
+ terminal_key = build_terminal_key(terminal)
256
+
257
+ # Detect git info from project directory
258
+ git_dir = project_dir or current_dir or cwd
259
+ git_info = detect_git_info(git_dir)
260
+
261
+ # Build registration payload
262
+ registration = {
263
+ "event": "session_start",
264
+ "timestamp": int(time.time() * 1000),
265
+ "session_id": session_id,
266
+ "session_title": session_title,
267
+ "transcript_path": transcript_path,
268
+ "cwd": current_dir or cwd,
269
+ "project": project_name,
270
+ "project_dir": project_dir,
271
+ "model": input_data.get('model'),
272
+ "source": input_data.get('source', 'startup'),
273
+ "terminal": terminal,
274
+ "terminal_key": terminal_key,
275
+ "git_branch": git_info.get('git_branch', ''),
276
+ "git_worktree": git_info.get('git_worktree', ''),
277
+ "git_repo_root": git_info.get('git_repo_root', ''),
278
+ }
279
+
280
+ # Send to server, fallback to file if unavailable
281
+ if not send_to_server(registration):
282
+ write_fallback(registration)
283
+
284
+
285
+ if __name__ == '__main__':
286
+ main()
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ jacques-report-activity.py
4
+
5
+ Report Claude Code activity to Jacques server.
6
+ Called on PostToolUse hook.
7
+
8
+ Updates session activity timestamp and optionally refreshes session title.
9
+
10
+ Skip: Set JACQUES_SKIP=1 or create ~/.jacques/skip
11
+ """
12
+ import json
13
+ import sys
14
+ import os
15
+ import socket
16
+ import time
17
+ from pathlib import Path
18
+
19
+ # Skip if running as subprocess, JACQUES_SKIP=1, or ~/.jacques/skip exists
20
+ if os.environ.get('JACQUES_SUBPROCESS') == '1' or os.environ.get('JACQUES_SKIP') == '1' or Path.home().joinpath('.jacques/skip').exists():
21
+ sys.exit(0)
22
+
23
+
24
+ def extract_session_title(transcript_path: str) -> str | None:
25
+ """
26
+ Extract session title from transcript (optimized for recent changes).
27
+ Checks recent lines first for updated title/summary.
28
+ """
29
+ if not transcript_path:
30
+ return None
31
+
32
+ path = Path(transcript_path)
33
+ if not path.exists():
34
+ return None
35
+
36
+ title = None
37
+ summary_text = None
38
+ first_user_message = None
39
+
40
+ try:
41
+ with open(path, 'r') as f:
42
+ lines = f.readlines()
43
+
44
+ # Check recent lines first for updated title/summary
45
+ recent_lines = lines[-100:] if len(lines) > 100 else lines
46
+
47
+ for line in recent_lines:
48
+ try:
49
+ entry = json.loads(line.strip())
50
+ if 'title' in entry:
51
+ title = entry['title']
52
+ if entry.get('type') == 'summary':
53
+ summary_content = entry.get('summary', '')
54
+ if summary_content:
55
+ summary_text = summary_content.split('.')[0][:80]
56
+ except json.JSONDecodeError:
57
+ continue
58
+
59
+ # Check first REAL user message if no title found (skip internal messages)
60
+ if not title and not summary_text:
61
+ for line in lines[:20]:
62
+ try:
63
+ entry = json.loads(line.strip())
64
+ if entry.get('type') == 'user':
65
+ msg = entry.get('message', {})
66
+ content = msg.get('content', '') if isinstance(msg, dict) else ''
67
+ if isinstance(content, str) and content:
68
+ # Skip internal Claude Code XML tags
69
+ skip_prefixes = ('<local-command', '<command-name>', '<system-', '<user-prompt-')
70
+ if not any(content.startswith(p) for p in skip_prefixes) and not content.startswith('['):
71
+ first_user_message = content.strip()[:80]
72
+ if len(content) > 80:
73
+ first_user_message += '...'
74
+ break
75
+ except:
76
+ continue
77
+
78
+ except Exception as e:
79
+ print(f"[jacques] Error reading transcript: {e}", file=sys.stderr)
80
+
81
+ return title or summary_text or first_user_message
82
+
83
+
84
+ def send_to_server(payload: dict, socket_path: str = '/tmp/jacques.sock') -> bool:
85
+ """Send payload to Jacques server via Unix socket."""
86
+ try:
87
+ sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
88
+ sock.settimeout(0.5) # Short timeout for activity updates
89
+ sock.connect(socket_path)
90
+ sock.sendall(json.dumps(payload).encode() + b'\n')
91
+ sock.close()
92
+ return True
93
+ except:
94
+ return False
95
+
96
+
97
+ def main():
98
+ try:
99
+ input_data = json.load(sys.stdin)
100
+ except:
101
+ sys.exit(0)
102
+
103
+ session_id = input_data.get('session_id')
104
+ if not session_id:
105
+ sys.exit(0)
106
+
107
+ transcript_path = input_data.get('transcript_path')
108
+ tool_name = input_data.get('tool_name', 'unknown')
109
+ cwd = input_data.get('cwd', '')
110
+
111
+ # Get workspace info for fallback title
112
+ workspace = input_data.get('workspace', {})
113
+ project_dir = workspace.get('project_dir', '') if isinstance(workspace, dict) else ''
114
+
115
+ # Determine project name for fallback
116
+ if project_dir:
117
+ project_name = os.path.basename(project_dir)
118
+ elif cwd:
119
+ project_name = os.path.basename(cwd)
120
+ else:
121
+ project_name = 'Unknown'
122
+
123
+ # Extract updated session title from transcript
124
+ session_title = extract_session_title(transcript_path)
125
+
126
+ # Fallback title if transcript has no extractable title
127
+ if not session_title:
128
+ session_title = f"Session in {project_name}"
129
+
130
+ # Build activity payload
131
+ activity = {
132
+ "event": "activity",
133
+ "timestamp": int(time.time() * 1000),
134
+ "session_id": session_id,
135
+ "session_title": session_title,
136
+ "tool_name": tool_name,
137
+ "terminal_pid": os.getppid(),
138
+ }
139
+
140
+ # Non-blocking send - don't write fallback for activity events
141
+ send_to_server(activity)
142
+
143
+
144
+ if __name__ == '__main__':
145
+ main()
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ jacques-session-idle.py
4
+
5
+ Mark Claude Code session as idle (waiting for user input).
6
+ Called on Stop hook.
7
+
8
+ Skip: Set JACQUES_SKIP=1 or create ~/.jacques/skip
9
+ """
10
+ import json
11
+ import sys
12
+ import os
13
+ import socket
14
+ import time
15
+ from pathlib import Path
16
+
17
+ # Skip if running as subprocess, JACQUES_SKIP=1, or ~/.jacques/skip exists
18
+ if os.environ.get('JACQUES_SUBPROCESS') == '1' or os.environ.get('JACQUES_SKIP') == '1' or Path.home().joinpath('.jacques/skip').exists():
19
+ sys.exit(0)
20
+
21
+
22
+ def send_to_server(payload: dict, socket_path: str = '/tmp/jacques.sock') -> bool:
23
+ """Send payload to Jacques server via Unix socket."""
24
+ try:
25
+ sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
26
+ sock.settimeout(1.0)
27
+ sock.connect(socket_path)
28
+ sock.sendall(json.dumps(payload).encode() + b'\n')
29
+ sock.close()
30
+ return True
31
+ except:
32
+ return False
33
+
34
+
35
+ def main():
36
+ try:
37
+ input_data = json.load(sys.stdin)
38
+ except:
39
+ sys.exit(0)
40
+
41
+ session_id = input_data.get('session_id')
42
+ if not session_id:
43
+ sys.exit(0)
44
+
45
+ # Build idle event payload
46
+ idle_event = {
47
+ "event": "idle",
48
+ "timestamp": int(time.time() * 1000),
49
+ "session_id": session_id,
50
+ "terminal_pid": os.getppid(),
51
+ }
52
+
53
+ send_to_server(idle_event)
54
+
55
+
56
+ if __name__ == '__main__':
57
+ main()
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ jacques-unregister-session.py
4
+
5
+ Unregister Claude Code session from Jacques server.
6
+ Called on SessionEnd hook.
7
+
8
+ Skip: Set JACQUES_SKIP=1 or create ~/.jacques/skip
9
+ """
10
+ import json
11
+ import sys
12
+ import os
13
+ import socket
14
+ import time
15
+ from pathlib import Path
16
+
17
+ # Skip if running as subprocess, JACQUES_SKIP=1, or ~/.jacques/skip exists
18
+ if os.environ.get('JACQUES_SUBPROCESS') == '1' or os.environ.get('JACQUES_SKIP') == '1' or Path.home().joinpath('.jacques/skip').exists():
19
+ sys.exit(0)
20
+
21
+
22
+ def send_to_server(payload: dict, socket_path: str = '/tmp/jacques.sock') -> bool:
23
+ """Send payload to Jacques server via Unix socket."""
24
+ try:
25
+ sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
26
+ sock.settimeout(1.0)
27
+ sock.connect(socket_path)
28
+ sock.sendall(json.dumps(payload).encode() + b'\n')
29
+ sock.close()
30
+ return True
31
+ except:
32
+ return False
33
+
34
+
35
+ def main():
36
+ try:
37
+ input_data = json.load(sys.stdin)
38
+ except:
39
+ sys.exit(0)
40
+
41
+ session_id = input_data.get('session_id')
42
+ if not session_id:
43
+ sys.exit(0)
44
+
45
+ # Build session end event payload
46
+ end_event = {
47
+ "event": "session_end",
48
+ "timestamp": int(time.time() * 1000),
49
+ "session_id": session_id,
50
+ "terminal_pid": os.getppid(),
51
+ }
52
+
53
+ send_to_server(end_event)
54
+
55
+
56
+ if __name__ == '__main__':
57
+ main()
@@ -0,0 +1,9 @@
1
+ # Jacques Hooks Dependencies
2
+ # Install with: pip install -r requirements.txt
3
+
4
+ # Token estimation for context tracking
5
+ # Size: ~1MB wheel + ~500KB encoding data
6
+ tiktoken>=0.5.0
7
+
8
+ # Testing
9
+ pytest>=7.0.0