@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,192 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ tokenizer.py - Token Estimation Module for Jacques
4
+
5
+ Uses tiktoken's cl100k_base encoding to estimate token counts.
6
+ This encoding is used by OpenAI models and is reasonably close (~90%)
7
+ to Claude's actual tokenizer.
8
+
9
+ Provides:
10
+ - Token count estimation from text
11
+ - Model context window lookup
12
+ - Context percentage calculation
13
+ """
14
+ import sys
15
+
16
+ # Cache encoder instance for performance
17
+ _encoder = None
18
+
19
+
20
+ def get_encoder():
21
+ """
22
+ Get cached tiktoken encoder.
23
+
24
+ Uses cl100k_base encoding which is closest to Claude's tokenizer.
25
+ Encoder is cached for performance (~150k tokens/sec).
26
+
27
+ Returns:
28
+ tiktoken.Encoding instance, or None if tiktoken not installed.
29
+ """
30
+ global _encoder
31
+ if _encoder is None:
32
+ try:
33
+ import tiktoken
34
+ _encoder = tiktoken.get_encoding("cl100k_base")
35
+ except ImportError:
36
+ print("[jacques:tokenizer] tiktoken not installed. Run: pip install tiktoken", file=sys.stderr)
37
+ return None
38
+ return _encoder
39
+
40
+
41
+ def estimate_tokens(text: str) -> int:
42
+ """
43
+ Estimate token count for given text.
44
+
45
+ Args:
46
+ text: Text to tokenize
47
+
48
+ Returns:
49
+ Estimated token count, or character-based fallback if tiktoken unavailable.
50
+ """
51
+ if not text:
52
+ return 0
53
+
54
+ encoder = get_encoder()
55
+ if encoder:
56
+ return len(encoder.encode(text))
57
+
58
+ # Fallback: rough estimate of ~4 characters per token
59
+ return len(text) // 4
60
+
61
+
62
+ # Model context windows (in tokens)
63
+ # Source: Official documentation + Cursor UI observations
64
+ MODEL_CONTEXT_WINDOWS = {
65
+ # Claude models (Cursor uses 176k for Claude in agent mode)
66
+ "claude-4.5-opus": 176_000, # Cursor-specific limit
67
+ "claude-4.5-sonnet": 176_000,
68
+ "claude-4-opus": 176_000,
69
+ "claude-4-sonnet": 176_000,
70
+ "claude-3.5-sonnet": 176_000,
71
+ "claude-3-opus": 176_000,
72
+ "claude-3-sonnet": 176_000,
73
+ "claude-3-haiku": 176_000,
74
+
75
+ # OpenAI models
76
+ "gpt-4o": 128_000,
77
+ "gpt-4-turbo": 128_000,
78
+ "gpt-4": 8_192,
79
+ "gpt-3.5-turbo": 16_385,
80
+
81
+ # Google models
82
+ "gemini-2.5-pro": 1_000_000,
83
+ "gemini-2.5-flash": 1_000_000,
84
+ "gemini-1.5-pro": 2_000_000,
85
+ "gemini-1.5-flash": 1_000_000,
86
+
87
+ # Default for unknown models (use Cursor's typical limit)
88
+ "default": 176_000,
89
+ }
90
+
91
+
92
+ def get_context_window(model: str) -> int:
93
+ """
94
+ Get context window size for a model.
95
+
96
+ Args:
97
+ model: Model name/identifier
98
+
99
+ Returns:
100
+ Context window size in tokens.
101
+ """
102
+ if not model:
103
+ return MODEL_CONTEXT_WINDOWS["default"]
104
+
105
+ model_lower = model.lower()
106
+
107
+ # Try exact match first
108
+ if model_lower in MODEL_CONTEXT_WINDOWS:
109
+ return MODEL_CONTEXT_WINDOWS[model_lower]
110
+
111
+ # Try partial match
112
+ for key, window in MODEL_CONTEXT_WINDOWS.items():
113
+ if key != "default" and key in model_lower:
114
+ return window
115
+
116
+ return MODEL_CONTEXT_WINDOWS["default"]
117
+
118
+
119
+ def calculate_context_percentage(tokens: int, context_window: int) -> float:
120
+ """
121
+ Calculate context usage percentage.
122
+
123
+ Args:
124
+ tokens: Current token count
125
+ context_window: Maximum context window size
126
+
127
+ Returns:
128
+ Percentage of context used (0.0 to 100.0).
129
+ """
130
+ if context_window <= 0:
131
+ return 0.0
132
+
133
+ percentage = (tokens / context_window) * 100
134
+ return min(percentage, 100.0) # Cap at 100%
135
+
136
+
137
+ def calculate_context_metrics(tokens: int, model: str) -> dict:
138
+ """
139
+ Calculate full context metrics for a given token count.
140
+
141
+ Args:
142
+ tokens: Estimated token count
143
+ model: Model name for context window lookup
144
+
145
+ Returns:
146
+ Dict with used_percentage, remaining_percentage, context_window_size.
147
+ """
148
+ context_window = get_context_window(model)
149
+ used_percentage = calculate_context_percentage(tokens, context_window)
150
+
151
+ return {
152
+ "used_percentage": round(used_percentage, 1),
153
+ "remaining_percentage": round(100 - used_percentage, 1),
154
+ "context_window_size": context_window,
155
+ "estimated_tokens": tokens,
156
+ }
157
+
158
+
159
+ # Thinking multipliers for extended thinking models
160
+ # These models have internal "thinking" that's NOT in the transcript
161
+ # but IS counted in the context. Empirically observed: ~4-6x for high-thinking.
162
+ THINKING_MULTIPLIERS = {
163
+ "high-thinking": 5.0, # Based on observed calibration factor of 5.68
164
+ "thinking": 3.0, # Regular thinking models
165
+ "max": 2.0, # Max mode may include more reasoning
166
+ }
167
+
168
+
169
+ def get_thinking_multiplier(model: str) -> float:
170
+ """
171
+ Get thinking multiplier for models with extended thinking.
172
+
173
+ Extended thinking models have internal reasoning that doesn't
174
+ appear in the transcript but IS counted in Cursor's context.
175
+
176
+ Args:
177
+ model: Model name/identifier
178
+
179
+ Returns:
180
+ Multiplier to apply to transcript tokens (1.0 for non-thinking models).
181
+ """
182
+ if not model:
183
+ return 1.0
184
+
185
+ model_lower = model.lower()
186
+
187
+ # Check for thinking mode indicators
188
+ for mode, multiplier in THINKING_MULTIPLIERS.items():
189
+ if mode in model_lower:
190
+ return multiplier
191
+
192
+ return 1.0
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ pre-tool-use.py - Report pre-tool-use to Jacques
4
+
5
+ Called on PreToolUse hook.
6
+ Sends tool name to server so it can detect when Claude is waiting
7
+ for user approval (edit acceptance, command approval, etc.).
8
+ """
9
+ import sys
10
+ from pathlib import Path
11
+
12
+ # Add parent directory to path for adapter imports
13
+ sys.path.insert(0, str(Path(__file__).parent.parent))
14
+
15
+ from adapters.claude_code import ClaudeCodeAdapter
16
+
17
+
18
+ def main():
19
+ adapter = ClaudeCodeAdapter()
20
+
21
+ # Parse input from stdin
22
+ input_data = adapter.parse_input()
23
+ if not input_data:
24
+ sys.exit(0)
25
+
26
+ # Log for debugging (verify permission_mode presence)
27
+ adapter.log_debug(input_data, 'PreToolUse')
28
+
29
+ # Build and send pre_tool_use payload (no fallback - transient event)
30
+ payload = adapter.build_pre_tool_use_payload(input_data)
31
+ if payload:
32
+ adapter.send_event(payload, use_fallback=False)
33
+
34
+
35
+ if __name__ == '__main__':
36
+ main()
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ register-session.py - Register Claude Code session with Jacques
4
+
5
+ Called on SessionStart hook.
6
+ Registers new Claude Code session with the Jacques server.
7
+ """
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ # Add parent directory to path for adapter imports
12
+ sys.path.insert(0, str(Path(__file__).parent.parent))
13
+
14
+ from adapters.claude_code import ClaudeCodeAdapter
15
+
16
+
17
+ def main():
18
+ adapter = ClaudeCodeAdapter()
19
+
20
+ # Parse input from stdin
21
+ input_data = adapter.parse_input()
22
+ if not input_data:
23
+ sys.exit(0)
24
+
25
+ # Debug logging (remove after debugging complete)
26
+ adapter.log_debug(input_data, 'SessionStart')
27
+
28
+ # Build and send session_start payload
29
+ payload = adapter.build_session_start_payload(input_data)
30
+ if payload:
31
+ adapter.send_event(payload, use_fallback=True)
32
+
33
+
34
+ if __name__ == '__main__':
35
+ main()
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ report-activity.py - Report Claude Code activity to Jacques
4
+
5
+ Called on PostToolUse hook.
6
+ Updates session activity timestamp and refreshes session title.
7
+ """
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ # Add parent directory to path for adapter imports
12
+ sys.path.insert(0, str(Path(__file__).parent.parent))
13
+
14
+ from adapters.claude_code import ClaudeCodeAdapter
15
+
16
+
17
+ def main():
18
+ adapter = ClaudeCodeAdapter()
19
+
20
+ # Parse input from stdin
21
+ input_data = adapter.parse_input()
22
+ if not input_data:
23
+ sys.exit(0)
24
+
25
+ # Build and send activity payload (no fallback for activity events)
26
+ payload = adapter.build_activity_payload(input_data)
27
+ if payload:
28
+ adapter.send_event(payload, use_fallback=False)
29
+
30
+
31
+ if __name__ == '__main__':
32
+ main()
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ session-idle.py - Mark Claude Code session as idle
4
+
5
+ Called on Stop hook.
6
+ Marks session as idle (waiting for user input).
7
+ """
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ # Add parent directory to path for adapter imports
12
+ sys.path.insert(0, str(Path(__file__).parent.parent))
13
+
14
+ from adapters.claude_code import ClaudeCodeAdapter
15
+
16
+
17
+ def main():
18
+ adapter = ClaudeCodeAdapter()
19
+
20
+ # Parse input from stdin
21
+ input_data = adapter.parse_input()
22
+ if not input_data:
23
+ sys.exit(0)
24
+
25
+ # Build and send idle payload
26
+ payload = adapter.build_idle_payload(input_data)
27
+ if payload:
28
+ adapter.send_event(payload, use_fallback=False)
29
+
30
+
31
+ if __name__ == '__main__':
32
+ main()
@@ -0,0 +1,91 @@
1
+ #!/bin/bash
2
+ #
3
+ # Jacques statusLine Script
4
+ #
5
+ # Receives JSON from Claude Code's statusLine feature via stdin.
6
+ # Extracts session_id and context_window data.
7
+ # Sends context update to Jacques server via Unix socket.
8
+ # Displays abbreviated status for Claude Code's status bar.
9
+ #
10
+
11
+ # DEBUG: Log that the script started (helps debug Cursor issues)
12
+ echo "$(date '+%Y-%m-%d %H:%M:%S') SCRIPT_START" >> /tmp/jacques-statusline-debug.log
13
+
14
+ # Read all input from stdin
15
+ input=$(cat)
16
+
17
+ # Exit if no input
18
+ if [ -z "$input" ]; then
19
+ exit 0
20
+ fi
21
+
22
+ # DEBUG: Log the raw JSON input to help diagnose field path issues
23
+ # Remove this line after debugging is complete
24
+ echo "$(date '+%Y-%m-%d %H:%M:%S') $input" >> /tmp/jacques-statusline-debug.log
25
+
26
+ # Extract key fields using jq
27
+ # Note: Claude Code sends null for percentages at session start, we need to handle this
28
+ session_id=$(echo "$input" | jq -r '.session_id // empty')
29
+
30
+ # Handle null values explicitly - jq outputs "null" string for null values even with // fallback in some cases
31
+ used_pct_raw=$(echo "$input" | jq -r '.context_window.used_percentage')
32
+ remaining_pct_raw=$(echo "$input" | jq -r '.context_window.remaining_percentage')
33
+
34
+ # Convert null/empty to 0 for used_percentage
35
+ if [ "$used_pct_raw" = "null" ] || [ -z "$used_pct_raw" ]; then
36
+ used_pct=0
37
+ else
38
+ used_pct=$used_pct_raw
39
+ fi
40
+
41
+ # Convert null/empty to 100 for remaining_percentage
42
+ if [ "$remaining_pct_raw" = "null" ] || [ -z "$remaining_pct_raw" ]; then
43
+ remaining_pct=100
44
+ else
45
+ remaining_pct=$remaining_pct_raw
46
+ fi
47
+
48
+ ctx_size=$(echo "$input" | jq -r '.context_window.context_window_size // 0')
49
+ total_input=$(echo "$input" | jq -r '.context_window.total_input_tokens // 0')
50
+ total_output=$(echo "$input" | jq -r '.context_window.total_output_tokens // 0')
51
+ model=$(echo "$input" | jq -r '.model.id // "unknown"')
52
+ model_display=$(echo "$input" | jq -r '.model.display_name // "Unknown"')
53
+ cwd=$(echo "$input" | jq -r '.workspace.current_dir // .cwd // ""')
54
+ project_dir=$(echo "$input" | jq -r '.workspace.project_dir // ""')
55
+
56
+ # Only proceed if we have a session_id
57
+ if [ -z "$session_id" ]; then
58
+ # No session_id, just show basic status
59
+ printf "ctx:?%%"
60
+ exit 0
61
+ fi
62
+
63
+ # Send to Jacques server (if socket exists and server is running)
64
+ if [ -S /tmp/jacques.sock ]; then
65
+ # Build JSON payload
66
+ timestamp=$(( $(date +%s) * 1000 ))
67
+ payload=$(cat <<EOF
68
+ {"event":"context_update","session_id":"$session_id","used_percentage":$used_pct,"remaining_percentage":$remaining_pct,"context_window_size":$ctx_size,"total_input_tokens":$total_input,"total_output_tokens":$total_output,"model":"$model","model_display_name":"$model_display","cwd":"$cwd","project_dir":"$project_dir","timestamp":$timestamp}
69
+ EOF
70
+ )
71
+
72
+ # Send to socket (non-blocking, ignore errors)
73
+ echo "$payload" | nc -U /tmp/jacques.sock 2>/dev/null &
74
+ fi
75
+
76
+ # Display abbreviated status in Claude Code status bar
77
+ # Format: [Model] ctx:XX%
78
+ # Round percentage for display
79
+ used_int=${used_pct%.*}
80
+ if [ -z "$used_int" ]; then
81
+ used_int="0"
82
+ fi
83
+
84
+ # Add warning indicator if context is high
85
+ if [ "$used_int" -ge 80 ]; then
86
+ printf "[%s] ctx:%s%% ⚠️" "$model_display" "$used_int"
87
+ elif [ "$used_int" -ge 60 ]; then
88
+ printf "[%s] ctx:%s%%" "$model_display" "$used_int"
89
+ else
90
+ printf "[%s] ctx:%s%%" "$model_display" "$used_int"
91
+ fi
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ unregister-session.py - Unregister Claude Code session from Jacques
4
+
5
+ Called on SessionEnd hook.
6
+ Removes session from Jacques server.
7
+ """
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ # Add parent directory to path for adapter imports
12
+ sys.path.insert(0, str(Path(__file__).parent.parent))
13
+
14
+ from adapters.claude_code import ClaudeCodeAdapter
15
+
16
+
17
+ def main():
18
+ adapter = ClaudeCodeAdapter()
19
+
20
+ # Parse input from stdin
21
+ input_data = adapter.parse_input()
22
+ if not input_data:
23
+ sys.exit(0)
24
+
25
+ # Build and send session_end payload
26
+ payload = adapter.build_session_end_payload(input_data)
27
+ if payload:
28
+ adapter.send_event(payload, use_fallback=False)
29
+
30
+
31
+ if __name__ == '__main__':
32
+ main()
@@ -0,0 +1,61 @@
1
+ # Cursor Hooks for Jacques
2
+
3
+ This directory contains hooks for integrating Cursor Native AI with Jacques.
4
+
5
+ ## Installation
6
+
7
+ ### Option 1: Automatic (Recommended)
8
+
9
+ ```bash
10
+ cd /path/to/jacques-context-manager
11
+ python3 hooks/install.py --source cursor
12
+ ```
13
+
14
+ ### Option 2: Manual
15
+
16
+ 1. Copy the hooks to `~/.jacques/hooks/cursor/`:
17
+
18
+ ```bash
19
+ mkdir -p ~/.jacques/hooks/cursor
20
+ cp hooks/cursor/*.py ~/.jacques/hooks/cursor/
21
+ cp -r hooks/adapters ~/.jacques/hooks/
22
+ ```
23
+
24
+ 2. Copy `hooks.json.template` to your project's `.cursor/hooks.json`:
25
+
26
+ ```bash
27
+ cp hooks/cursor/hooks.json.template /path/to/your/project/.cursor/hooks.json
28
+ ```
29
+
30
+ Or for global configuration, copy to Cursor's config directory.
31
+
32
+ ## Hooks
33
+
34
+ | Hook | Event | Description |
35
+ | ------------ | ---------------- | ----------------------------------------- |
36
+ | sessionStart | `session_start` | Registers new Cursor session with Jacques |
37
+ | sessionEnd | `session_end` | Unregisters Cursor session from Jacques |
38
+ | postToolUse | `activity` | Reports tool usage activity |
39
+ | preCompact | `context_update` | **Key hook!** Provides context metrics |
40
+
41
+ ## Context Metrics
42
+
43
+ The `preCompact` hook is special - it provides context window usage metrics,
44
+ allowing Jacques to display context percentage for Cursor sessions just like
45
+ Claude Code CLI sessions.
46
+
47
+ Expected fields from Cursor's preCompact event:
48
+
49
+ - `context_usage_percent`: Percentage of context used (0-100)
50
+ - `context_tokens`: Current token count
51
+ - `context_window_size`: Maximum context window size
52
+
53
+ ## Debugging
54
+
55
+ Check the debug log for hook input data:
56
+
57
+ ```bash
58
+ tail -f /tmp/jacques-hook-debug.log
59
+ ```
60
+
61
+ This helps understand what data Cursor is sending to hooks.
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ after-agent-response.py - Estimate context usage after each AI response
4
+
5
+ Called on Cursor's afterAgentResponse hook.
6
+ Reads the transcript file to estimate current token usage.
7
+
8
+ This hook fires after EVERY AI response, allowing us to show
9
+ real-time context estimates instead of waiting for preCompact.
10
+
11
+ Flow:
12
+ 1. Parse input (contains transcript_path)
13
+ 2. Read transcript file content
14
+ 3. Estimate tokens using tiktoken
15
+ 4. Add skill overhead (not in transcript but always in context)
16
+ 5. Apply calibration factor if available
17
+ 6. Send context_update with estimated percentage
18
+ """
19
+ import sys
20
+ from pathlib import Path
21
+
22
+ # Add parent directory to path for adapter imports
23
+ sys.path.insert(0, str(Path(__file__).parent.parent))
24
+
25
+ from adapters.cursor import CursorAdapter
26
+ from adapters import tokenizer, calibration, skills
27
+
28
+
29
+ def main():
30
+ adapter = CursorAdapter()
31
+
32
+ # Parse input from stdin
33
+ input_data = adapter.parse_input()
34
+ if not input_data:
35
+ sys.exit(0)
36
+
37
+ # Debug logging
38
+ adapter.log_debug(input_data, 'afterAgentResponse')
39
+
40
+ # Get transcript path
41
+ transcript_path = input_data.get('transcript_path')
42
+ if not transcript_path:
43
+ # No transcript available - can't estimate
44
+ # Stay silent rather than guessing
45
+ sys.exit(0)
46
+
47
+ transcript_file = Path(transcript_path)
48
+ if not transcript_file.exists():
49
+ sys.exit(0)
50
+
51
+ # Read transcript content
52
+ try:
53
+ content = transcript_file.read_text(encoding='utf-8')
54
+ except Exception as e:
55
+ print(f"[jacques:after-agent-response] Error reading transcript: {e}", file=sys.stderr)
56
+ sys.exit(0)
57
+
58
+ if not content:
59
+ sys.exit(0)
60
+
61
+ # Estimate tokens from transcript
62
+ transcript_tokens = tokenizer.estimate_tokens(content)
63
+
64
+ # Get model info
65
+ model = adapter.get_model(input_data)
66
+
67
+ # Apply thinking multiplier for extended thinking models
68
+ # Thinking blocks are NOT in transcript but ARE in context
69
+ thinking_multiplier = tokenizer.get_thinking_multiplier(model)
70
+ adjusted_transcript_tokens = int(transcript_tokens * thinking_multiplier)
71
+
72
+ # Add skill overhead (always in context but not in transcript)
73
+ initial_estimate = skills.get_initial_context_estimate(model)
74
+ skill_overhead = initial_estimate['total_initial_tokens']
75
+
76
+ # Total = adjusted transcript + skills + system prompts
77
+ total_tokens = adjusted_transcript_tokens + skill_overhead
78
+
79
+ # Get session ID for calibration
80
+ session_id = input_data.get('conversation_id')
81
+
82
+ if session_id:
83
+ # Apply calibration factor if available (further refinement)
84
+ factor = calibration.get_factor(session_id)
85
+ total_tokens = int(total_tokens * factor)
86
+
87
+ # Store this estimate for future calibration
88
+ calibration.set_last_estimate(session_id, total_tokens)
89
+
90
+ # Build and send context estimate payload
91
+ payload = adapter.build_context_estimate_payload(input_data, total_tokens, model)
92
+ if payload:
93
+ adapter.send_event(payload, use_fallback=False)
94
+
95
+
96
+ if __name__ == '__main__':
97
+ main()
@@ -0,0 +1,30 @@
1
+ {
2
+ "version": 1,
3
+ "hooks": {
4
+ "sessionStart": [
5
+ {
6
+ "command": "python3 ~/.jacques/hooks/cursor/session-start.py"
7
+ }
8
+ ],
9
+ "sessionEnd": [
10
+ {
11
+ "command": "python3 ~/.jacques/hooks/cursor/session-end.py"
12
+ }
13
+ ],
14
+ "postToolUse": [
15
+ {
16
+ "command": "python3 ~/.jacques/hooks/cursor/post-tool-use.py"
17
+ }
18
+ ],
19
+ "preCompact": [
20
+ {
21
+ "command": "python3 ~/.jacques/hooks/cursor/pre-compact.py"
22
+ }
23
+ ],
24
+ "afterAgentResponse": [
25
+ {
26
+ "command": "python3 ~/.jacques/hooks/cursor/after-agent-response.py"
27
+ }
28
+ ]
29
+ }
30
+ }
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ post-tool-use.py - Report Cursor activity to Jacques
4
+
5
+ Called on Cursor's postToolUse hook.
6
+ Updates session activity timestamp.
7
+ """
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ # Add parent directory to path for adapter imports
12
+ sys.path.insert(0, str(Path(__file__).parent.parent))
13
+
14
+ from adapters.cursor import CursorAdapter
15
+
16
+
17
+ def main():
18
+ adapter = CursorAdapter()
19
+
20
+ # Parse input from stdin
21
+ input_data = adapter.parse_input()
22
+ if not input_data:
23
+ sys.exit(0)
24
+
25
+ # Build and send activity payload (no fallback for activity events)
26
+ payload = adapter.build_activity_payload(input_data)
27
+ if payload:
28
+ adapter.send_event(payload, use_fallback=False)
29
+
30
+
31
+ if __name__ == '__main__':
32
+ main()