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