@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.
- package/dist/assets/mascot-ansi.d.ts +8 -0
- package/dist/assets/mascot-ansi.d.ts.map +1 -0
- package/dist/assets/mascot-ansi.js +15 -0
- package/dist/assets/mascot-ansi.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +53 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/client-helper.d.ts +14 -0
- package/dist/commands/client-helper.d.ts.map +1 -0
- package/dist/commands/client-helper.js +38 -0
- package/dist/commands/client-helper.js.map +1 -0
- package/dist/commands/dashboard.d.ts +8 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +159 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/index.d.ts +6 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +6 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +13 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/search.d.ts +13 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +79 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/setup.d.ts +8 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +32 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +27 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/components/ActiveSessionsView.d.ts +18 -0
- package/dist/components/ActiveSessionsView.d.ts.map +1 -0
- package/dist/components/ActiveSessionsView.js +68 -0
- package/dist/components/ActiveSessionsView.js.map +1 -0
- package/dist/components/AddContextConfirmView.d.ts +21 -0
- package/dist/components/AddContextConfirmView.d.ts.map +1 -0
- package/dist/components/AddContextConfirmView.js +44 -0
- package/dist/components/AddContextConfirmView.js.map +1 -0
- package/dist/components/App.d.ts +11 -0
- package/dist/components/App.d.ts.map +1 -0
- package/dist/components/App.js +292 -0
- package/dist/components/App.js.map +1 -0
- package/dist/components/ArchiveBrowserView.d.ts +40 -0
- package/dist/components/ArchiveBrowserView.d.ts.map +1 -0
- package/dist/components/ArchiveBrowserView.js +161 -0
- package/dist/components/ArchiveBrowserView.js.map +1 -0
- package/dist/components/ArchiveInitProgressView.d.ts +16 -0
- package/dist/components/ArchiveInitProgressView.d.ts.map +1 -0
- package/dist/components/ArchiveInitProgressView.js +72 -0
- package/dist/components/ArchiveInitProgressView.js.map +1 -0
- package/dist/components/AutoCompactToggle.d.ts +16 -0
- package/dist/components/AutoCompactToggle.d.ts.map +1 -0
- package/dist/components/AutoCompactToggle.js +12 -0
- package/dist/components/AutoCompactToggle.js.map +1 -0
- package/dist/components/BottomControls.d.ts +12 -0
- package/dist/components/BottomControls.d.ts.map +1 -0
- package/dist/components/BottomControls.js +11 -0
- package/dist/components/BottomControls.js.map +1 -0
- package/dist/components/CompactHeader.d.ts +21 -0
- package/dist/components/CompactHeader.d.ts.map +1 -0
- package/dist/components/CompactHeader.js +63 -0
- package/dist/components/CompactHeader.js.map +1 -0
- package/dist/components/CompactPanel.d.ts +22 -0
- package/dist/components/CompactPanel.d.ts.map +1 -0
- package/dist/components/CompactPanel.js +31 -0
- package/dist/components/CompactPanel.js.map +1 -0
- package/dist/components/ContentBox.d.ts +14 -0
- package/dist/components/ContentBox.d.ts.map +1 -0
- package/dist/components/ContentBox.js +24 -0
- package/dist/components/ContentBox.js.map +1 -0
- package/dist/components/ContextProgress.d.ts +14 -0
- package/dist/components/ContextProgress.d.ts.map +1 -0
- package/dist/components/ContextProgress.js +36 -0
- package/dist/components/ContextProgress.js.map +1 -0
- package/dist/components/Dashboard.d.ts +46 -0
- package/dist/components/Dashboard.d.ts.map +1 -0
- package/dist/components/Dashboard.js +67 -0
- package/dist/components/Dashboard.js.map +1 -0
- package/dist/components/FilterSelectionView.d.ts +15 -0
- package/dist/components/FilterSelectionView.d.ts.map +1 -0
- package/dist/components/FilterSelectionView.js +27 -0
- package/dist/components/FilterSelectionView.js.map +1 -0
- package/dist/components/GoogleDocsBrowserView.d.ts +20 -0
- package/dist/components/GoogleDocsBrowserView.d.ts.map +1 -0
- package/dist/components/GoogleDocsBrowserView.js +72 -0
- package/dist/components/GoogleDocsBrowserView.js.map +1 -0
- package/dist/components/HandoffBrowserView.d.ts +20 -0
- package/dist/components/HandoffBrowserView.d.ts.map +1 -0
- package/dist/components/HandoffBrowserView.js +66 -0
- package/dist/components/HandoffBrowserView.js.map +1 -0
- package/dist/components/Header.d.ts +14 -0
- package/dist/components/Header.d.ts.map +1 -0
- package/dist/components/Header.js +16 -0
- package/dist/components/Header.js.map +1 -0
- package/dist/components/HorizontalMenu.d.ts +24 -0
- package/dist/components/HorizontalMenu.d.ts.map +1 -0
- package/dist/components/HorizontalMenu.js +20 -0
- package/dist/components/HorizontalMenu.js.map +1 -0
- package/dist/components/ImageMascot.d.ts +8 -0
- package/dist/components/ImageMascot.d.ts.map +1 -0
- package/dist/components/ImageMascot.js +7 -0
- package/dist/components/ImageMascot.js.map +1 -0
- package/dist/components/LLMWorkingView.d.ts +19 -0
- package/dist/components/LLMWorkingView.d.ts.map +1 -0
- package/dist/components/LLMWorkingView.js +72 -0
- package/dist/components/LLMWorkingView.js.map +1 -0
- package/dist/components/LoadContextView.d.ts +22 -0
- package/dist/components/LoadContextView.d.ts.map +1 -0
- package/dist/components/LoadContextView.js +83 -0
- package/dist/components/LoadContextView.js.map +1 -0
- package/dist/components/MainMenuView.d.ts +20 -0
- package/dist/components/MainMenuView.d.ts.map +1 -0
- package/dist/components/MainMenuView.js +49 -0
- package/dist/components/MainMenuView.js.map +1 -0
- package/dist/components/Mascot.d.ts +24 -0
- package/dist/components/Mascot.d.ts.map +1 -0
- package/dist/components/Mascot.js +32 -0
- package/dist/components/Mascot.js.map +1 -0
- package/dist/components/Menu.d.ts +22 -0
- package/dist/components/Menu.d.ts.map +1 -0
- package/dist/components/Menu.js +28 -0
- package/dist/components/Menu.js.map +1 -0
- package/dist/components/NotionBrowserView.d.ts +21 -0
- package/dist/components/NotionBrowserView.d.ts.map +1 -0
- package/dist/components/NotionBrowserView.js +75 -0
- package/dist/components/NotionBrowserView.js.map +1 -0
- package/dist/components/ObsidianBrowserView.d.ts +21 -0
- package/dist/components/ObsidianBrowserView.d.ts.map +1 -0
- package/dist/components/ObsidianBrowserView.js +74 -0
- package/dist/components/ObsidianBrowserView.js.map +1 -0
- package/dist/components/ObsidianConfigView.d.ts +19 -0
- package/dist/components/ObsidianConfigView.d.ts.map +1 -0
- package/dist/components/ObsidianConfigView.js +45 -0
- package/dist/components/ObsidianConfigView.js.map +1 -0
- package/dist/components/PlaceholderView.d.ts +15 -0
- package/dist/components/PlaceholderView.d.ts.map +1 -0
- package/dist/components/PlaceholderView.js +20 -0
- package/dist/components/PlaceholderView.js.map +1 -0
- package/dist/components/PlanViewerView.d.ts +26 -0
- package/dist/components/PlanViewerView.d.ts.map +1 -0
- package/dist/components/PlanViewerView.js +170 -0
- package/dist/components/PlanViewerView.js.map +1 -0
- package/dist/components/ProgressBar.d.ts +24 -0
- package/dist/components/ProgressBar.d.ts.map +1 -0
- package/dist/components/ProgressBar.js +23 -0
- package/dist/components/ProgressBar.js.map +1 -0
- package/dist/components/ProjectDashboardView.d.ts +38 -0
- package/dist/components/ProjectDashboardView.d.ts.map +1 -0
- package/dist/components/ProjectDashboardView.js +129 -0
- package/dist/components/ProjectDashboardView.js.map +1 -0
- package/dist/components/SaveContextView.d.ts +32 -0
- package/dist/components/SaveContextView.d.ts.map +1 -0
- package/dist/components/SaveContextView.js +41 -0
- package/dist/components/SaveContextView.js.map +1 -0
- package/dist/components/SessionDetails.d.ts +14 -0
- package/dist/components/SessionDetails.d.ts.map +1 -0
- package/dist/components/SessionDetails.js +87 -0
- package/dist/components/SessionDetails.js.map +1 -0
- package/dist/components/SessionsExperimentView.d.ts +35 -0
- package/dist/components/SessionsExperimentView.d.ts.map +1 -0
- package/dist/components/SessionsExperimentView.js +347 -0
- package/dist/components/SessionsExperimentView.js.map +1 -0
- package/dist/components/SessionsList.d.ts +20 -0
- package/dist/components/SessionsList.d.ts.map +1 -0
- package/dist/components/SessionsList.js +75 -0
- package/dist/components/SessionsList.js.map +1 -0
- package/dist/components/SettingsView.d.ts +48 -0
- package/dist/components/SettingsView.d.ts.map +1 -0
- package/dist/components/SettingsView.js +156 -0
- package/dist/components/SettingsView.js.map +1 -0
- package/dist/components/SourceSelectionView.d.ts +26 -0
- package/dist/components/SourceSelectionView.d.ts.map +1 -0
- package/dist/components/SourceSelectionView.js +109 -0
- package/dist/components/SourceSelectionView.js.map +1 -0
- package/dist/components/VerticalMenu.d.ts +18 -0
- package/dist/components/VerticalMenu.d.ts.map +1 -0
- package/dist/components/VerticalMenu.js +15 -0
- package/dist/components/VerticalMenu.js.map +1 -0
- package/dist/components/ascii-art/index.d.ts +6 -0
- package/dist/components/ascii-art/index.d.ts.map +1 -0
- package/dist/components/ascii-art/index.js +6 -0
- package/dist/components/ascii-art/index.js.map +1 -0
- package/dist/components/ascii-art/progress.d.ts +53 -0
- package/dist/components/ascii-art/progress.d.ts.map +1 -0
- package/dist/components/ascii-art/progress.js +102 -0
- package/dist/components/ascii-art/progress.js.map +1 -0
- package/dist/components/ascii-art/scene.d.ts +34 -0
- package/dist/components/ascii-art/scene.d.ts.map +1 -0
- package/dist/components/ascii-art/scene.js +72 -0
- package/dist/components/ascii-art/scene.js.map +1 -0
- package/dist/components/index.d.ts +27 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +25 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/layout/HorizontalLayout.d.ts +19 -0
- package/dist/components/layout/HorizontalLayout.d.ts.map +1 -0
- package/dist/components/layout/HorizontalLayout.js +62 -0
- package/dist/components/layout/HorizontalLayout.js.map +1 -0
- package/dist/components/layout/VerticalLayout.d.ts +16 -0
- package/dist/components/layout/VerticalLayout.d.ts.map +1 -0
- package/dist/components/layout/VerticalLayout.js +32 -0
- package/dist/components/layout/VerticalLayout.js.map +1 -0
- package/dist/components/layout/index.d.ts +6 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/layout/index.js +4 -0
- package/dist/components/layout/index.js.map +1 -0
- package/dist/components/layout/theme.d.ts +20 -0
- package/dist/components/layout/theme.d.ts.map +1 -0
- package/dist/components/layout/theme.js +23 -0
- package/dist/components/layout/theme.js.map +1 -0
- package/dist/components/setup/DoneStep.d.ts +7 -0
- package/dist/components/setup/DoneStep.d.ts.map +1 -0
- package/dist/components/setup/DoneStep.js +31 -0
- package/dist/components/setup/DoneStep.js.map +1 -0
- package/dist/components/setup/InstallingStep.d.ts +11 -0
- package/dist/components/setup/InstallingStep.d.ts.map +1 -0
- package/dist/components/setup/InstallingStep.js +27 -0
- package/dist/components/setup/InstallingStep.js.map +1 -0
- package/dist/components/setup/OptionsStep.d.ts +9 -0
- package/dist/components/setup/OptionsStep.d.ts.map +1 -0
- package/dist/components/setup/OptionsStep.js +39 -0
- package/dist/components/setup/OptionsStep.js.map +1 -0
- package/dist/components/setup/PrerequisitesStep.d.ts +7 -0
- package/dist/components/setup/PrerequisitesStep.d.ts.map +1 -0
- package/dist/components/setup/PrerequisitesStep.js +31 -0
- package/dist/components/setup/PrerequisitesStep.js.map +1 -0
- package/dist/components/setup/SetupFrame.d.ts +17 -0
- package/dist/components/setup/SetupFrame.d.ts.map +1 -0
- package/dist/components/setup/SetupFrame.js +33 -0
- package/dist/components/setup/SetupFrame.js.map +1 -0
- package/dist/components/setup/SetupWizard.d.ts +9 -0
- package/dist/components/setup/SetupWizard.d.ts.map +1 -0
- package/dist/components/setup/SetupWizard.js +149 -0
- package/dist/components/setup/SetupWizard.js.map +1 -0
- package/dist/components/setup/Spinner.d.ts +10 -0
- package/dist/components/setup/Spinner.d.ts.map +1 -0
- package/dist/components/setup/Spinner.js +20 -0
- package/dist/components/setup/Spinner.js.map +1 -0
- package/dist/components/setup/SyncStep.d.ts +11 -0
- package/dist/components/setup/SyncStep.d.ts.map +1 -0
- package/dist/components/setup/SyncStep.js +47 -0
- package/dist/components/setup/SyncStep.js.map +1 -0
- package/dist/components/setup/VerificationStep.d.ts +7 -0
- package/dist/components/setup/VerificationStep.d.ts.map +1 -0
- package/dist/components/setup/VerificationStep.js +27 -0
- package/dist/components/setup/VerificationStep.js.map +1 -0
- package/dist/components/setup/WelcomeStep.d.ts +6 -0
- package/dist/components/setup/WelcomeStep.d.ts.map +1 -0
- package/dist/components/setup/WelcomeStep.js +17 -0
- package/dist/components/setup/WelcomeStep.js.map +1 -0
- package/dist/components/shared/ProgressLine.d.ts +10 -0
- package/dist/components/shared/ProgressLine.d.ts.map +1 -0
- package/dist/components/shared/ProgressLine.js +18 -0
- package/dist/components/shared/ProgressLine.js.map +1 -0
- package/dist/components/shared/ProjectLine.d.ts +10 -0
- package/dist/components/shared/ProjectLine.d.ts.map +1 -0
- package/dist/components/shared/ProjectLine.js +19 -0
- package/dist/components/shared/ProjectLine.js.map +1 -0
- package/dist/components/shared/ScanningIndicator.d.ts +9 -0
- package/dist/components/shared/ScanningIndicator.d.ts.map +1 -0
- package/dist/components/shared/ScanningIndicator.js +22 -0
- package/dist/components/shared/ScanningIndicator.js.map +1 -0
- package/dist/components/shared/StatusLine.d.ts +13 -0
- package/dist/components/shared/StatusLine.d.ts.map +1 -0
- package/dist/components/shared/StatusLine.js +24 -0
- package/dist/components/shared/StatusLine.js.map +1 -0
- package/dist/components/shared/StatusLine.test.d.ts +8 -0
- package/dist/components/shared/StatusLine.test.d.ts.map +1 -0
- package/dist/components/shared/StatusLine.test.js +50 -0
- package/dist/components/shared/StatusLine.test.js.map +1 -0
- package/dist/components/shared/index.d.ts +4 -0
- package/dist/components/shared/index.d.ts.map +1 -0
- package/dist/components/shared/index.js +4 -0
- package/dist/components/shared/index.js.map +1 -0
- package/dist/handoff/catalog.test.d.ts +5 -0
- package/dist/handoff/catalog.test.d.ts.map +1 -0
- package/dist/handoff/catalog.test.js +172 -0
- package/dist/handoff/catalog.test.js.map +1 -0
- package/dist/handoff/subagents.test.d.ts +8 -0
- package/dist/handoff/subagents.test.d.ts.map +1 -0
- package/dist/handoff/subagents.test.js +139 -0
- package/dist/handoff/subagents.test.js.map +1 -0
- package/dist/hooks/useAddContextFlow.d.ts +29 -0
- package/dist/hooks/useAddContextFlow.d.ts.map +1 -0
- package/dist/hooks/useAddContextFlow.js +83 -0
- package/dist/hooks/useAddContextFlow.js.map +1 -0
- package/dist/hooks/useArchiveBrowser.d.ts +37 -0
- package/dist/hooks/useArchiveBrowser.d.ts.map +1 -0
- package/dist/hooks/useArchiveBrowser.js +175 -0
- package/dist/hooks/useArchiveBrowser.js.map +1 -0
- package/dist/hooks/useClaudeToken.d.ts +29 -0
- package/dist/hooks/useClaudeToken.d.ts.map +1 -0
- package/dist/hooks/useClaudeToken.js +166 -0
- package/dist/hooks/useClaudeToken.js.map +1 -0
- package/dist/hooks/useGoogleDocsBrowser.d.ts +29 -0
- package/dist/hooks/useGoogleDocsBrowser.d.ts.map +1 -0
- package/dist/hooks/useGoogleDocsBrowser.js +146 -0
- package/dist/hooks/useGoogleDocsBrowser.js.map +1 -0
- package/dist/hooks/useHandoffBrowser.d.ts +27 -0
- package/dist/hooks/useHandoffBrowser.d.ts.map +1 -0
- package/dist/hooks/useHandoffBrowser.js +92 -0
- package/dist/hooks/useHandoffBrowser.js.map +1 -0
- package/dist/hooks/useJacquesClient.d.ts +69 -0
- package/dist/hooks/useJacquesClient.d.ts.map +1 -0
- package/dist/hooks/useJacquesClient.js +248 -0
- package/dist/hooks/useJacquesClient.js.map +1 -0
- package/dist/hooks/useLlmWorking.d.ts +30 -0
- package/dist/hooks/useLlmWorking.d.ts.map +1 -0
- package/dist/hooks/useLlmWorking.js +127 -0
- package/dist/hooks/useLlmWorking.js.map +1 -0
- package/dist/hooks/useLoadContext.d.ts +27 -0
- package/dist/hooks/useLoadContext.d.ts.map +1 -0
- package/dist/hooks/useLoadContext.js +102 -0
- package/dist/hooks/useLoadContext.js.map +1 -0
- package/dist/hooks/useNotification.d.ts +36 -0
- package/dist/hooks/useNotification.d.ts.map +1 -0
- package/dist/hooks/useNotification.js +89 -0
- package/dist/hooks/useNotification.js.map +1 -0
- package/dist/hooks/useNotification.test.d.ts +9 -0
- package/dist/hooks/useNotification.test.d.ts.map +1 -0
- package/dist/hooks/useNotification.test.js +144 -0
- package/dist/hooks/useNotification.test.js.map +1 -0
- package/dist/hooks/useNotionBrowser.d.ts +30 -0
- package/dist/hooks/useNotionBrowser.d.ts.map +1 -0
- package/dist/hooks/useNotionBrowser.js +154 -0
- package/dist/hooks/useNotionBrowser.js.map +1 -0
- package/dist/hooks/useObsidianBrowser.d.ts +42 -0
- package/dist/hooks/useObsidianBrowser.d.ts.map +1 -0
- package/dist/hooks/useObsidianBrowser.js +63 -0
- package/dist/hooks/useObsidianBrowser.js.map +1 -0
- package/dist/hooks/useObsidianConfig.d.ts +28 -0
- package/dist/hooks/useObsidianConfig.d.ts.map +1 -0
- package/dist/hooks/useObsidianConfig.js +119 -0
- package/dist/hooks/useObsidianConfig.js.map +1 -0
- package/dist/hooks/useObsidianFileBrowser.d.ts +29 -0
- package/dist/hooks/useObsidianFileBrowser.d.ts.map +1 -0
- package/dist/hooks/useObsidianFileBrowser.js +114 -0
- package/dist/hooks/useObsidianFileBrowser.js.map +1 -0
- package/dist/hooks/useProjectDashboard.d.ts +38 -0
- package/dist/hooks/useProjectDashboard.d.ts.map +1 -0
- package/dist/hooks/useProjectDashboard.js +224 -0
- package/dist/hooks/useProjectDashboard.js.map +1 -0
- package/dist/hooks/useProjectSelector.d.ts +17 -0
- package/dist/hooks/useProjectSelector.d.ts.map +1 -0
- package/dist/hooks/useProjectSelector.js +43 -0
- package/dist/hooks/useProjectSelector.js.map +1 -0
- package/dist/hooks/useProjectSelector.test.d.ts +7 -0
- package/dist/hooks/useProjectSelector.test.d.ts.map +1 -0
- package/dist/hooks/useProjectSelector.test.js +117 -0
- package/dist/hooks/useProjectSelector.test.js.map +1 -0
- package/dist/hooks/useSaveFlow.d.ts +30 -0
- package/dist/hooks/useSaveFlow.d.ts.map +1 -0
- package/dist/hooks/useSaveFlow.js +195 -0
- package/dist/hooks/useSaveFlow.js.map +1 -0
- package/dist/hooks/useSessions.test.d.ts +7 -0
- package/dist/hooks/useSessions.test.d.ts.map +1 -0
- package/dist/hooks/useSessions.test.js +153 -0
- package/dist/hooks/useSessions.test.js.map +1 -0
- package/dist/hooks/useSessionsExperiment.d.ts +97 -0
- package/dist/hooks/useSessionsExperiment.d.ts.map +1 -0
- package/dist/hooks/useSessionsExperiment.js +321 -0
- package/dist/hooks/useSessionsExperiment.js.map +1 -0
- package/dist/hooks/useSettings.d.ts +47 -0
- package/dist/hooks/useSettings.d.ts.map +1 -0
- package/dist/hooks/useSettings.js +245 -0
- package/dist/hooks/useSettings.js.map +1 -0
- package/dist/hooks/useSetupWizard.d.ts +35 -0
- package/dist/hooks/useSetupWizard.d.ts.map +1 -0
- package/dist/hooks/useSetupWizard.js +438 -0
- package/dist/hooks/useSetupWizard.js.map +1 -0
- package/dist/hooks/useUsageLimits.d.ts +24 -0
- package/dist/hooks/useUsageLimits.d.ts.map +1 -0
- package/dist/hooks/useUsageLimits.js +58 -0
- package/dist/hooks/useUsageLimits.js.map +1 -0
- package/dist/hooks/useUsageLimits.test.d.ts +7 -0
- package/dist/hooks/useUsageLimits.test.d.ts.map +1 -0
- package/dist/hooks/useUsageLimits.test.js +136 -0
- package/dist/hooks/useUsageLimits.test.js.map +1 -0
- package/dist/hooks/useWorktrees.d.ts +28 -0
- package/dist/hooks/useWorktrees.d.ts.map +1 -0
- package/dist/hooks/useWorktrees.js +57 -0
- package/dist/hooks/useWorktrees.js.map +1 -0
- package/dist/hooks/useWorktrees.test.d.ts +7 -0
- package/dist/hooks/useWorktrees.test.d.ts.map +1 -0
- package/dist/hooks/useWorktrees.test.js +119 -0
- package/dist/hooks/useWorktrees.test.js.map +1 -0
- package/dist/templates/compact-prompt.d.ts +16 -0
- package/dist/templates/compact-prompt.d.ts.map +1 -0
- package/dist/templates/compact-prompt.js +47 -0
- package/dist/templates/compact-prompt.js.map +1 -0
- package/dist/templates/context-skill.d.ts +8 -0
- package/dist/templates/context-skill.d.ts.map +1 -0
- package/dist/templates/context-skill.js +42 -0
- package/dist/templates/context-skill.js.map +1 -0
- package/dist/types.d.ts +127 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/activity.d.ts +17 -0
- package/dist/utils/activity.d.ts.map +1 -0
- package/dist/utils/activity.js +78 -0
- package/dist/utils/activity.js.map +1 -0
- package/dist/utils/bottom-controls.d.ts +24 -0
- package/dist/utils/bottom-controls.d.ts.map +1 -0
- package/dist/utils/bottom-controls.js +29 -0
- package/dist/utils/bottom-controls.js.map +1 -0
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +20 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/constants.d.ts +6 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +6 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/format.d.ts +17 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +31 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/session-mode.d.ts +14 -0
- package/dist/utils/session-mode.d.ts.map +1 -0
- package/dist/utils/session-mode.js +29 -0
- package/dist/utils/session-mode.js.map +1 -0
- package/dist/utils/session-mode.test.d.ts +7 -0
- package/dist/utils/session-mode.test.d.ts.map +1 -0
- package/dist/utils/session-mode.test.js +102 -0
- package/dist/utils/session-mode.test.js.map +1 -0
- package/dist/utils/sessions-items-builder.d.ts +29 -0
- package/dist/utils/sessions-items-builder.d.ts.map +1 -0
- package/dist/utils/sessions-items-builder.js +394 -0
- package/dist/utils/sessions-items-builder.js.map +1 -0
- package/dist/utils/settings.d.ts +100 -0
- package/dist/utils/settings.d.ts.map +1 -0
- package/dist/utils/settings.js +206 -0
- package/dist/utils/settings.js.map +1 -0
- package/dist/websocket-client.d.ts +70 -0
- package/dist/websocket-client.d.ts.map +1 -0
- package/dist/websocket-client.js +188 -0
- package/dist/websocket-client.js.map +1 -0
- package/hooks/adapters/__init__.py +17 -0
- package/hooks/adapters/__pycache__/__init__.cpython-311.pyc +0 -0
- package/hooks/adapters/__pycache__/__init__.cpython-313.pyc +0 -0
- package/hooks/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
- package/hooks/adapters/__pycache__/base.cpython-311.pyc +0 -0
- package/hooks/adapters/__pycache__/base.cpython-313.pyc +0 -0
- package/hooks/adapters/__pycache__/base.cpython-314.pyc +0 -0
- package/hooks/adapters/__pycache__/calibration.cpython-311.pyc +0 -0
- package/hooks/adapters/__pycache__/calibration.cpython-313.pyc +0 -0
- package/hooks/adapters/__pycache__/calibration.cpython-314.pyc +0 -0
- package/hooks/adapters/__pycache__/claude_code.cpython-311.pyc +0 -0
- package/hooks/adapters/__pycache__/claude_code.cpython-313.pyc +0 -0
- package/hooks/adapters/__pycache__/claude_code.cpython-314.pyc +0 -0
- package/hooks/adapters/__pycache__/cursor.cpython-311.pyc +0 -0
- package/hooks/adapters/__pycache__/cursor.cpython-313.pyc +0 -0
- package/hooks/adapters/__pycache__/cursor.cpython-314.pyc +0 -0
- package/hooks/adapters/__pycache__/skills.cpython-311.pyc +0 -0
- package/hooks/adapters/__pycache__/skills.cpython-313.pyc +0 -0
- package/hooks/adapters/__pycache__/skills.cpython-314.pyc +0 -0
- package/hooks/adapters/__pycache__/test_adapters.cpython-311-pytest-9.0.2.pyc +0 -0
- package/hooks/adapters/__pycache__/test_adapters.cpython-313.pyc +0 -0
- package/hooks/adapters/__pycache__/test_calibration.cpython-311-pytest-9.0.2.pyc +0 -0
- package/hooks/adapters/__pycache__/test_skills.cpython-311-pytest-9.0.2.pyc +0 -0
- package/hooks/adapters/__pycache__/test_tokenizer.cpython-311-pytest-9.0.2.pyc +0 -0
- package/hooks/adapters/__pycache__/tokenizer.cpython-311.pyc +0 -0
- package/hooks/adapters/__pycache__/tokenizer.cpython-313.pyc +0 -0
- package/hooks/adapters/__pycache__/tokenizer.cpython-314.pyc +0 -0
- package/hooks/adapters/base.py +459 -0
- package/hooks/adapters/calibration.py +236 -0
- package/hooks/adapters/claude_code.py +316 -0
- package/hooks/adapters/context_parser.py +288 -0
- package/hooks/adapters/cursor.py +258 -0
- package/hooks/adapters/skills.py +160 -0
- package/hooks/adapters/template.py +281 -0
- package/hooks/adapters/test_adapters.py +516 -0
- package/hooks/adapters/test_calibration.py +235 -0
- package/hooks/adapters/test_skills.py +162 -0
- package/hooks/adapters/test_tokenizer.py +158 -0
- package/hooks/adapters/tokenizer.py +192 -0
- package/hooks/claude-code/pre-tool-use.py +36 -0
- package/hooks/claude-code/register-session.py +35 -0
- package/hooks/claude-code/report-activity.py +32 -0
- package/hooks/claude-code/session-idle.py +32 -0
- package/hooks/claude-code/statusline.sh +91 -0
- package/hooks/claude-code/unregister-session.py +32 -0
- package/hooks/cursor/README.md +61 -0
- package/hooks/cursor/after-agent-response.py +97 -0
- package/hooks/cursor/hooks.json.template +30 -0
- package/hooks/cursor/post-tool-use.py +32 -0
- package/hooks/cursor/pre-compact.py +61 -0
- package/hooks/cursor/session-end.py +32 -0
- package/hooks/cursor/session-start.py +66 -0
- package/hooks/git-detect.sh +47 -0
- package/hooks/install.py +441 -0
- package/hooks/jacques-register-session.py +286 -0
- package/hooks/jacques-report-activity.py +145 -0
- package/hooks/jacques-session-idle.py +57 -0
- package/hooks/jacques-unregister-session.py +57 -0
- package/hooks/requirements.txt +9 -0
- package/hooks/statusline.py +457 -0
- package/hooks/statusline.sh +212 -0
- package/package.json +63 -0
- package/skills/jacques-continue/SKILL.md +87 -0
- 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()
|