markupr 2.1.8
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/.claude/commands/review-feedback.md +47 -0
- package/.eslintrc.json +35 -0
- package/.github/CODEOWNERS +16 -0
- package/.github/FUNDING.yml +1 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +56 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +54 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +89 -0
- package/.github/dependabot.yml +70 -0
- package/.github/workflows/ci.yml +184 -0
- package/.github/workflows/deploy-landing.yml +134 -0
- package/.github/workflows/nightly.yml +288 -0
- package/.github/workflows/release.yml +318 -0
- package/CHANGELOG.md +127 -0
- package/CLAUDE.md +137 -0
- package/CODE_OF_CONDUCT.md +9 -0
- package/CONTRIBUTING.md +390 -0
- package/LICENSE +21 -0
- package/PRODUCT_VISION.md +277 -0
- package/README.md +517 -0
- package/SECURITY.md +51 -0
- package/SIGNING_INSTRUCTIONS.md +284 -0
- package/assets/DMG_BACKGROUND_INSTRUCTIONS.md +130 -0
- package/assets/svg-source/dmg-background.svg +70 -0
- package/assets/svg-source/icon.svg +20 -0
- package/assets/svg-source/tray-icon-processing.svg +7 -0
- package/assets/svg-source/tray-icon-recording.svg +7 -0
- package/assets/svg-source/tray-icon.svg +6 -0
- package/assets/tray-complete.png +0 -0
- package/assets/tray-complete@2x.png +0 -0
- package/assets/tray-completeTemplate.png +0 -0
- package/assets/tray-completeTemplate@2x.png +0 -0
- package/assets/tray-error.png +0 -0
- package/assets/tray-error@2x.png +0 -0
- package/assets/tray-errorTemplate.png +0 -0
- package/assets/tray-errorTemplate@2x.png +0 -0
- package/assets/tray-icon-processing.png +0 -0
- package/assets/tray-icon-processing@2x.png +0 -0
- package/assets/tray-icon-processingTemplate.png +0 -0
- package/assets/tray-icon-processingTemplate@2x.png +0 -0
- package/assets/tray-icon-recording.png +0 -0
- package/assets/tray-icon-recording@2x.png +0 -0
- package/assets/tray-icon-recordingTemplate.png +0 -0
- package/assets/tray-icon-recordingTemplate@2x.png +0 -0
- package/assets/tray-icon.png +0 -0
- package/assets/tray-icon@2x.png +0 -0
- package/assets/tray-iconTemplate.png +0 -0
- package/assets/tray-iconTemplate@2x.png +0 -0
- package/assets/tray-idle.png +0 -0
- package/assets/tray-idle@2x.png +0 -0
- package/assets/tray-idleTemplate.png +0 -0
- package/assets/tray-idleTemplate@2x.png +0 -0
- package/assets/tray-processing-0.png +0 -0
- package/assets/tray-processing-0@2x.png +0 -0
- package/assets/tray-processing-0Template.png +0 -0
- package/assets/tray-processing-0Template@2x.png +0 -0
- package/assets/tray-processing-1.png +0 -0
- package/assets/tray-processing-1@2x.png +0 -0
- package/assets/tray-processing-1Template.png +0 -0
- package/assets/tray-processing-1Template@2x.png +0 -0
- package/assets/tray-processing-2.png +0 -0
- package/assets/tray-processing-2@2x.png +0 -0
- package/assets/tray-processing-2Template.png +0 -0
- package/assets/tray-processing-2Template@2x.png +0 -0
- package/assets/tray-processing-3.png +0 -0
- package/assets/tray-processing-3@2x.png +0 -0
- package/assets/tray-processing-3Template.png +0 -0
- package/assets/tray-processing-3Template@2x.png +0 -0
- package/assets/tray-processing.png +0 -0
- package/assets/tray-processing@2x.png +0 -0
- package/assets/tray-processingTemplate.png +0 -0
- package/assets/tray-processingTemplate@2x.png +0 -0
- package/assets/tray-recording.png +0 -0
- package/assets/tray-recording@2x.png +0 -0
- package/assets/tray-recordingTemplate.png +0 -0
- package/assets/tray-recordingTemplate@2x.png +0 -0
- package/build/DMG_BACKGROUND_SPEC.md +50 -0
- package/build/dmg-background.png +0 -0
- package/build/dmg-background@2x.png +0 -0
- package/build/entitlements.mac.inherit.plist +27 -0
- package/build/entitlements.mac.plist +41 -0
- package/build/favicon-16.png +0 -0
- package/build/favicon-180.png +0 -0
- package/build/favicon-192.png +0 -0
- package/build/favicon-32.png +0 -0
- package/build/favicon-48.png +0 -0
- package/build/favicon-512.png +0 -0
- package/build/favicon-64.png +0 -0
- package/build/icon-128.png +0 -0
- package/build/icon-16.png +0 -0
- package/build/icon-24.png +0 -0
- package/build/icon-256.png +0 -0
- package/build/icon-32.png +0 -0
- package/build/icon-48.png +0 -0
- package/build/icon-64.png +0 -0
- package/build/icon.icns +0 -0
- package/build/icon.ico +0 -0
- package/build/icon.iconset/icon_128x128.png +0 -0
- package/build/icon.iconset/icon_128x128@2x.png +0 -0
- package/build/icon.iconset/icon_16x16.png +0 -0
- package/build/icon.iconset/icon_16x16@2x.png +0 -0
- package/build/icon.iconset/icon_256x256.png +0 -0
- package/build/icon.iconset/icon_256x256@2x.png +0 -0
- package/build/icon.iconset/icon_32x32.png +0 -0
- package/build/icon.iconset/icon_32x32@2x.png +0 -0
- package/build/icon.iconset/icon_512x512.png +0 -0
- package/build/icon.iconset/icon_512x512@2x.png +0 -0
- package/build/icon.png +0 -0
- package/build/installer-header.bmp +0 -0
- package/build/installer-header.png +0 -0
- package/build/installer-sidebar.bmp +0 -0
- package/build/installer-sidebar.png +0 -0
- package/build/installer.nsh +45 -0
- package/build/overlay-processing.png +0 -0
- package/build/overlay-recording.png +0 -0
- package/build/toolbar-record.png +0 -0
- package/build/toolbar-screenshot.png +0 -0
- package/build/toolbar-settings.png +0 -0
- package/build/toolbar-stop.png +0 -0
- package/dist/main/index.mjs +12612 -0
- package/dist/preload/index.mjs +907 -0
- package/dist/renderer/assets/index-CCmUjl9K.js +19495 -0
- package/dist/renderer/assets/index-CUqz_Gs6.css +2270 -0
- package/dist/renderer/index.html +27 -0
- package/docs/AI_AGENT_QUICKSTART.md +42 -0
- package/docs/AI_PIPELINE_DESIGN.md +595 -0
- package/docs/API.md +514 -0
- package/docs/ARCHITECTURE.md +460 -0
- package/docs/CONFIGURATION.md +336 -0
- package/docs/DEVELOPMENT.md +508 -0
- package/docs/EXPORT_FORMATS.md +451 -0
- package/docs/GETTING_STARTED.md +236 -0
- package/docs/KEYBOARD_SHORTCUTS.md +334 -0
- package/docs/TROUBLESHOOTING.md +418 -0
- package/docs/landing/index.html +672 -0
- package/docs/landing/script.js +342 -0
- package/docs/landing/styles.css +1543 -0
- package/electron-builder.yml +140 -0
- package/electron.vite.config.ts +63 -0
- package/package.json +108 -0
- package/railway.json +12 -0
- package/scripts/build.mjs +51 -0
- package/scripts/generate-icons.mjs +314 -0
- package/scripts/generate-installer-images.cjs +253 -0
- package/scripts/generate-tray-icons.mjs +258 -0
- package/scripts/notarize.cjs +180 -0
- package/scripts/one-click-clean-test.sh +147 -0
- package/scripts/postinstall.mjs +36 -0
- package/scripts/setup-markupr.sh +55 -0
- package/setup +17 -0
- package/site/index.html +1835 -0
- package/site/package.json +11 -0
- package/site/railway.json +12 -0
- package/site/server.js +31 -0
- package/src/main/AutoUpdater.ts +392 -0
- package/src/main/CrashRecovery.ts +655 -0
- package/src/main/ErrorHandler.ts +703 -0
- package/src/main/HotkeyManager.ts +399 -0
- package/src/main/MenuManager.ts +529 -0
- package/src/main/PermissionManager.ts +420 -0
- package/src/main/SessionController.ts +1465 -0
- package/src/main/TrayManager.ts +540 -0
- package/src/main/ai/AIPipelineManager.ts +199 -0
- package/src/main/ai/ClaudeAnalyzer.ts +339 -0
- package/src/main/ai/ImageOptimizer.ts +176 -0
- package/src/main/ai/StructuredMarkdownBuilder.ts +379 -0
- package/src/main/ai/index.ts +16 -0
- package/src/main/ai/types.ts +258 -0
- package/src/main/analysis/ClarificationGenerator.ts +385 -0
- package/src/main/analysis/FeedbackAnalyzer.ts +531 -0
- package/src/main/analysis/index.ts +19 -0
- package/src/main/audio/AudioCapture.ts +978 -0
- package/src/main/audio/audioUtils.ts +100 -0
- package/src/main/audio/index.ts +20 -0
- package/src/main/capture/index.ts +1 -0
- package/src/main/index.ts +1693 -0
- package/src/main/ipc/captureHandlers.ts +272 -0
- package/src/main/ipc/index.ts +45 -0
- package/src/main/ipc/outputHandlers.ts +302 -0
- package/src/main/ipc/sessionHandlers.ts +56 -0
- package/src/main/ipc/settingsHandlers.ts +471 -0
- package/src/main/ipc/types.ts +56 -0
- package/src/main/ipc/windowHandlers.ts +277 -0
- package/src/main/output/ClipboardService.ts +369 -0
- package/src/main/output/ExportService.ts +539 -0
- package/src/main/output/FileManager.ts +416 -0
- package/src/main/output/MarkdownGenerator.ts +791 -0
- package/src/main/output/MarkdownPatcher.ts +299 -0
- package/src/main/output/index.ts +186 -0
- package/src/main/output/sessionAdapter.ts +207 -0
- package/src/main/output/templates/html-template.ts +553 -0
- package/src/main/pipeline/FrameExtractor.ts +330 -0
- package/src/main/pipeline/PostProcessor.ts +399 -0
- package/src/main/pipeline/TranscriptAnalyzer.ts +226 -0
- package/src/main/pipeline/index.ts +36 -0
- package/src/main/platform/WindowsTaskbar.ts +600 -0
- package/src/main/platform/index.ts +16 -0
- package/src/main/settings/SettingsManager.ts +730 -0
- package/src/main/settings/index.ts +19 -0
- package/src/main/transcription/ModelDownloadManager.ts +494 -0
- package/src/main/transcription/TierManager.ts +219 -0
- package/src/main/transcription/TranscriptionRecoveryService.ts +340 -0
- package/src/main/transcription/WhisperService.ts +748 -0
- package/src/main/transcription/index.ts +56 -0
- package/src/main/transcription/types.ts +135 -0
- package/src/main/windows/PopoverManager.ts +284 -0
- package/src/main/windows/TaskbarIntegration.ts +452 -0
- package/src/main/windows/index.ts +23 -0
- package/src/preload/index.ts +1047 -0
- package/src/renderer/App.tsx +515 -0
- package/src/renderer/AppWrapper.tsx +28 -0
- package/src/renderer/assets/logo-dark.svg +7 -0
- package/src/renderer/assets/logo.svg +7 -0
- package/src/renderer/audio/AudioCaptureRenderer.ts +454 -0
- package/src/renderer/capture/ScreenRecordingRenderer.ts +492 -0
- package/src/renderer/components/AnnotationOverlay.tsx +836 -0
- package/src/renderer/components/AudioWaveform.tsx +811 -0
- package/src/renderer/components/ClarificationQuestions.tsx +656 -0
- package/src/renderer/components/CountdownTimer.tsx +495 -0
- package/src/renderer/components/CrashRecoveryDialog.tsx +632 -0
- package/src/renderer/components/DonateButton.tsx +127 -0
- package/src/renderer/components/ErrorBoundary.tsx +308 -0
- package/src/renderer/components/ExportDialog.tsx +872 -0
- package/src/renderer/components/HotkeyHint.tsx +261 -0
- package/src/renderer/components/KeyboardShortcuts.tsx +787 -0
- package/src/renderer/components/ModelDownloadDialog.tsx +844 -0
- package/src/renderer/components/Onboarding.tsx +1830 -0
- package/src/renderer/components/ProcessingOverlay.tsx +157 -0
- package/src/renderer/components/RecordingOverlay.tsx +423 -0
- package/src/renderer/components/SessionHistory.tsx +1746 -0
- package/src/renderer/components/SessionReview.tsx +1321 -0
- package/src/renderer/components/SettingsPanel.tsx +217 -0
- package/src/renderer/components/Skeleton.tsx +347 -0
- package/src/renderer/components/StatusIndicator.tsx +86 -0
- package/src/renderer/components/ThemeProvider.tsx +429 -0
- package/src/renderer/components/Tooltip.tsx +370 -0
- package/src/renderer/components/TranscriptionPreview.tsx +183 -0
- package/src/renderer/components/TranscriptionTierSelector.tsx +640 -0
- package/src/renderer/components/UpdateNotification.tsx +377 -0
- package/src/renderer/components/WindowSelector.tsx +947 -0
- package/src/renderer/components/index.ts +99 -0
- package/src/renderer/components/primitives/ApiKeyInput.tsx +98 -0
- package/src/renderer/components/primitives/ColorPicker.tsx +65 -0
- package/src/renderer/components/primitives/DangerButton.tsx +45 -0
- package/src/renderer/components/primitives/DirectoryPicker.tsx +41 -0
- package/src/renderer/components/primitives/Dropdown.tsx +34 -0
- package/src/renderer/components/primitives/KeyRecorder.tsx +117 -0
- package/src/renderer/components/primitives/SettingsSection.tsx +32 -0
- package/src/renderer/components/primitives/Slider.tsx +43 -0
- package/src/renderer/components/primitives/Toggle.tsx +36 -0
- package/src/renderer/components/primitives/index.ts +10 -0
- package/src/renderer/components/settings/AdvancedTab.tsx +174 -0
- package/src/renderer/components/settings/AppearanceTab.tsx +77 -0
- package/src/renderer/components/settings/GeneralTab.tsx +40 -0
- package/src/renderer/components/settings/HotkeysTab.tsx +79 -0
- package/src/renderer/components/settings/RecordingTab.tsx +84 -0
- package/src/renderer/components/settings/index.ts +9 -0
- package/src/renderer/components/settings/settingsStyles.ts +673 -0
- package/src/renderer/components/settings/tabConfig.tsx +85 -0
- package/src/renderer/components/settings/useSettingsPanel.ts +447 -0
- package/src/renderer/contexts/ProcessingContext.tsx +227 -0
- package/src/renderer/contexts/RecordingContext.tsx +683 -0
- package/src/renderer/contexts/UIContext.tsx +326 -0
- package/src/renderer/contexts/index.ts +24 -0
- package/src/renderer/donateMessages.ts +69 -0
- package/src/renderer/hooks/index.ts +75 -0
- package/src/renderer/hooks/useAnimation.tsx +544 -0
- package/src/renderer/hooks/useTheme.ts +313 -0
- package/src/renderer/index.html +26 -0
- package/src/renderer/main.tsx +52 -0
- package/src/renderer/styles/animations.css +1093 -0
- package/src/renderer/styles/app-shell.css +662 -0
- package/src/renderer/styles/globals.css +515 -0
- package/src/renderer/styles/theme.ts +578 -0
- package/src/renderer/types/electron.d.ts +385 -0
- package/src/shared/hotkeys.ts +283 -0
- package/src/shared/types.ts +809 -0
- package/tests/clipboard.test.ts +228 -0
- package/tests/e2e/criticalPaths.test.ts +594 -0
- package/tests/feedbackAnalyzer.test.ts +303 -0
- package/tests/integration/sessionFlow.test.ts +583 -0
- package/tests/markdownGenerator.test.ts +418 -0
- package/tests/output.test.ts +96 -0
- package/tests/setup.ts +486 -0
- package/tests/unit/appIntegration.test.ts +676 -0
- package/tests/unit/appViewState.test.ts +281 -0
- package/tests/unit/audioIpcChannels.test.ts +17 -0
- package/tests/unit/exportService.test.ts +492 -0
- package/tests/unit/hotkeys.test.ts +92 -0
- package/tests/unit/navigationPreload.test.ts +94 -0
- package/tests/unit/onboardingFlow.test.ts +345 -0
- package/tests/unit/permissionManager.test.ts +175 -0
- package/tests/unit/permissionManagerExpanded.test.ts +296 -0
- package/tests/unit/screenRecordingRenderer.test.ts +368 -0
- package/tests/unit/sessionController.test.ts +515 -0
- package/tests/unit/tierManager.test.ts +61 -0
- package/tests/unit/tierManagerExpanded.test.ts +142 -0
- package/tests/unit/transcriptAnalyzer.test.ts +64 -0
- package/tsconfig.json +25 -0
- package/vitest.config.ts +46 -0
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
# Development Guide
|
|
2
|
+
|
|
3
|
+
This guide covers everything you need to know to develop markupr.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Prerequisites](#prerequisites)
|
|
8
|
+
- [Development Setup](#development-setup)
|
|
9
|
+
- [Project Structure](#project-structure)
|
|
10
|
+
- [Build System](#build-system)
|
|
11
|
+
- [Testing](#testing)
|
|
12
|
+
- [Debug Mode](#debug-mode)
|
|
13
|
+
- [Code Style](#code-style)
|
|
14
|
+
- [Making Changes](#making-changes)
|
|
15
|
+
|
|
16
|
+
## Prerequisites
|
|
17
|
+
|
|
18
|
+
### Required Software
|
|
19
|
+
|
|
20
|
+
- **Node.js**: 18.x or later
|
|
21
|
+
- **npm**: 9.x or later (comes with Node.js)
|
|
22
|
+
- **Git**: For version control
|
|
23
|
+
|
|
24
|
+
### Recommended
|
|
25
|
+
|
|
26
|
+
- **VS Code**: With recommended extensions
|
|
27
|
+
- **macOS**: For testing macOS-specific features
|
|
28
|
+
- **Windows (VM or machine)**: For testing Windows builds
|
|
29
|
+
|
|
30
|
+
### VS Code Extensions
|
|
31
|
+
|
|
32
|
+
Create `.vscode/extensions.json`:
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"recommendations": [
|
|
37
|
+
"dbaeumer.vscode-eslint",
|
|
38
|
+
"esbenp.prettier-vscode",
|
|
39
|
+
"bradlc.vscode-tailwindcss",
|
|
40
|
+
"ms-vscode.vscode-typescript-next"
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Development Setup
|
|
46
|
+
|
|
47
|
+
### 1. Clone the Repository
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
git clone https://github.com/eddiesanjuan/markupr.git
|
|
51
|
+
cd markupr
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 2. Install Dependencies
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# npm
|
|
58
|
+
npm install
|
|
59
|
+
|
|
60
|
+
# bun
|
|
61
|
+
bun install
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
This installs:
|
|
65
|
+
- Electron and electron-vite
|
|
66
|
+
- React and React DOM
|
|
67
|
+
- TypeScript
|
|
68
|
+
- OpenAI SDK
|
|
69
|
+
- All other dependencies
|
|
70
|
+
|
|
71
|
+
### 3. Configure Environment
|
|
72
|
+
|
|
73
|
+
Create a `.env.local` file (optional, for development):
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# Development API key (optional)
|
|
77
|
+
DEEPGRAM_API_KEY=your_dev_api_key
|
|
78
|
+
|
|
79
|
+
# Enable additional logging
|
|
80
|
+
DEBUG=markupr:*
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 4. Start Development Server
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# npm
|
|
87
|
+
npm run dev
|
|
88
|
+
|
|
89
|
+
# bun
|
|
90
|
+
bun run dev
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
This starts:
|
|
94
|
+
- Vite dev server for the renderer (hot reload)
|
|
95
|
+
- Electron in development mode
|
|
96
|
+
- DevTools automatically opens
|
|
97
|
+
|
|
98
|
+
### 5. Verify Setup
|
|
99
|
+
|
|
100
|
+
1. The markupr window should open
|
|
101
|
+
2. Tray icon should appear
|
|
102
|
+
3. Press `Cmd+Shift+F` (or `Ctrl+Shift+F`)
|
|
103
|
+
4. If you see the window selector, setup is complete!
|
|
104
|
+
|
|
105
|
+
## Project Structure
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
markupr/
|
|
109
|
+
├── src/
|
|
110
|
+
│ ├── main/ # Electron main process
|
|
111
|
+
│ │ ├── index.ts # Entry point, orchestration
|
|
112
|
+
│ │ ├── SessionController.ts # Session state machine
|
|
113
|
+
│ │ ├── HotkeyManager.ts # Global hotkey registration
|
|
114
|
+
│ │ ├── TrayManager.ts # System tray management
|
|
115
|
+
│ │ ├── MenuManager.ts # Native menu bar
|
|
116
|
+
│ │ ├── AutoUpdater.ts # Auto-update functionality
|
|
117
|
+
│ │ ├── CrashRecovery.ts # Session recovery
|
|
118
|
+
│ │ ├── ErrorHandler.ts # Error handling
|
|
119
|
+
│ │ ├── capture/ # Screen capture
|
|
120
|
+
│ │ │ ├── ScreenCapture.ts
|
|
121
|
+
│ │ │ └── IntelligentCapture.ts
|
|
122
|
+
│ │ ├── audio/ # Audio capture
|
|
123
|
+
│ │ │ └── AudioCapture.ts
|
|
124
|
+
│ │ ├── transcription/ # OpenAI integration
|
|
125
|
+
│ │ │ └── TranscriptionService.ts
|
|
126
|
+
│ │ ├── output/ # Document generation
|
|
127
|
+
│ │ │ ├── MarkdownGenerator.ts
|
|
128
|
+
│ │ │ ├── ExportService.ts
|
|
129
|
+
│ │ │ ├── FileManager.ts
|
|
130
|
+
│ │ │ └── ClipboardService.ts
|
|
131
|
+
│ │ ├── analysis/ # AI categorization
|
|
132
|
+
│ │ │ ├── FeedbackAnalyzer.ts
|
|
133
|
+
│ │ │ └── ClarificationGenerator.ts
|
|
134
|
+
│ │ └── settings/ # Settings management
|
|
135
|
+
│ │ └── SettingsManager.ts
|
|
136
|
+
│ │
|
|
137
|
+
│ ├── renderer/ # React UI
|
|
138
|
+
│ │ ├── main.tsx # React entry point
|
|
139
|
+
│ │ ├── App.tsx # Main component
|
|
140
|
+
│ │ ├── components/ # UI components
|
|
141
|
+
│ │ │ ├── RecordingOverlay.tsx
|
|
142
|
+
│ │ │ ├── SettingsPanel.tsx
|
|
143
|
+
│ │ │ ├── SessionReview.tsx
|
|
144
|
+
│ │ │ ├── WindowSelector.tsx
|
|
145
|
+
│ │ │ ├── KeyboardShortcuts.tsx
|
|
146
|
+
│ │ │ ├── ExportDialog.tsx
|
|
147
|
+
│ │ │ └── ...
|
|
148
|
+
│ │ ├── hooks/ # React hooks
|
|
149
|
+
│ │ │ ├── useAnimation.tsx
|
|
150
|
+
│ │ │ └── useTheme.ts
|
|
151
|
+
│ │ ├── styles/ # CSS and themes
|
|
152
|
+
│ │ │ ├── globals.css
|
|
153
|
+
│ │ │ ├── animations.css
|
|
154
|
+
│ │ │ └── theme.ts
|
|
155
|
+
│ │ └── audio/ # Renderer audio capture
|
|
156
|
+
│ │ └── AudioCaptureRenderer.ts
|
|
157
|
+
│ │
|
|
158
|
+
│ ├── preload/ # Context bridge
|
|
159
|
+
│ │ └── index.ts # Exposes API to renderer
|
|
160
|
+
│ │
|
|
161
|
+
│ └── shared/ # Shared types
|
|
162
|
+
│ └── types.ts # All TypeScript interfaces
|
|
163
|
+
│
|
|
164
|
+
├── tests/ # Test files
|
|
165
|
+
│ └── output.test.ts
|
|
166
|
+
│
|
|
167
|
+
├── docs/ # Documentation
|
|
168
|
+
│
|
|
169
|
+
├── electron-builder.yml # Build configuration
|
|
170
|
+
├── tsconfig.json # TypeScript config
|
|
171
|
+
├── vite.config.ts # Vite configuration
|
|
172
|
+
├── tailwind.config.js # Tailwind CSS config
|
|
173
|
+
└── package.json
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Key Files
|
|
177
|
+
|
|
178
|
+
| File | Purpose |
|
|
179
|
+
|------|---------|
|
|
180
|
+
| `src/main/index.ts` | Main process entry, orchestrates all services |
|
|
181
|
+
| `src/preload/index.ts` | Context bridge, defines renderer API |
|
|
182
|
+
| `src/shared/types.ts` | All TypeScript types and IPC channels |
|
|
183
|
+
| `src/renderer/App.tsx` | Main React component |
|
|
184
|
+
|
|
185
|
+
## Build System
|
|
186
|
+
|
|
187
|
+
markupr uses [electron-vite](https://electron-vite.org/) for building.
|
|
188
|
+
|
|
189
|
+
### Configuration Files
|
|
190
|
+
|
|
191
|
+
- `electron.vite.config.ts`: Build configuration for main, preload, renderer
|
|
192
|
+
- `electron-builder.yml`: Packaging configuration
|
|
193
|
+
|
|
194
|
+
### Build Commands
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
# Development build
|
|
198
|
+
npm run build
|
|
199
|
+
|
|
200
|
+
# Production build
|
|
201
|
+
npm run build -- --mode production
|
|
202
|
+
|
|
203
|
+
# Package for current platform
|
|
204
|
+
npm run package
|
|
205
|
+
|
|
206
|
+
# Package for specific platforms
|
|
207
|
+
npm run package:mac
|
|
208
|
+
npm run package:win
|
|
209
|
+
npm run package:linux
|
|
210
|
+
|
|
211
|
+
# Package macOS without code signing (development)
|
|
212
|
+
npm run package:mac:unsigned
|
|
213
|
+
|
|
214
|
+
# Build and release
|
|
215
|
+
npm run release
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Build Output
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
dist/
|
|
222
|
+
├── main/ # Compiled main process
|
|
223
|
+
├── preload/ # Compiled preload script
|
|
224
|
+
└── renderer/ # Compiled React app
|
|
225
|
+
|
|
226
|
+
release/ # Packaged applications
|
|
227
|
+
├── markupr-0.4.0.dmg
|
|
228
|
+
├── markupr-0.4.0-arm64.dmg
|
|
229
|
+
├── markupr Setup 0.4.0.exe
|
|
230
|
+
└── markupr_0.4.0_amd64.deb
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## Testing
|
|
234
|
+
|
|
235
|
+
markupr uses [Vitest](https://vitest.dev/) for testing.
|
|
236
|
+
|
|
237
|
+
### Running Tests
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
# Run all tests
|
|
241
|
+
npm test
|
|
242
|
+
|
|
243
|
+
# Run tests in watch mode
|
|
244
|
+
npm run test:watch
|
|
245
|
+
|
|
246
|
+
# Run tests with UI
|
|
247
|
+
npm run test:ui
|
|
248
|
+
|
|
249
|
+
# Run tests with coverage
|
|
250
|
+
npm run test:coverage
|
|
251
|
+
|
|
252
|
+
# Run specific test file
|
|
253
|
+
npm test -- tests/output.test.ts
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Test Structure
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
tests/
|
|
260
|
+
├── unit/ # Unit tests for individual modules
|
|
261
|
+
├── integration/ # Integration tests
|
|
262
|
+
└── e2e/ # End-to-end tests
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Writing Tests
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
// tests/output.test.ts
|
|
269
|
+
import { describe, it, expect } from 'vitest';
|
|
270
|
+
|
|
271
|
+
describe('OutputManager', () => {
|
|
272
|
+
it('should generate markdown from a session', () => {
|
|
273
|
+
const session = createMockSession();
|
|
274
|
+
const output = outputManager.generateMarkdown(session);
|
|
275
|
+
|
|
276
|
+
expect(output.markdown).toContain('# Feedback Session');
|
|
277
|
+
expect(output.screenshots).toHaveLength(1);
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### Mocking Electron APIs
|
|
283
|
+
|
|
284
|
+
Since many features rely on Electron APIs, use mocks:
|
|
285
|
+
|
|
286
|
+
```typescript
|
|
287
|
+
import { vi } from 'vitest';
|
|
288
|
+
|
|
289
|
+
// Mock clipboard
|
|
290
|
+
vi.mock('electron', () => ({
|
|
291
|
+
clipboard: {
|
|
292
|
+
writeText: vi.fn(),
|
|
293
|
+
},
|
|
294
|
+
}));
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## Debug Mode
|
|
298
|
+
|
|
299
|
+
### Enabling Debug Mode
|
|
300
|
+
|
|
301
|
+
1. Open Settings (`Cmd+,` or `Ctrl+,`)
|
|
302
|
+
2. Go to Advanced > Debug Mode
|
|
303
|
+
3. Enable the toggle
|
|
304
|
+
|
|
305
|
+
Or set in environment:
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
DEBUG=markupr:* npm run dev
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### DevTools
|
|
312
|
+
|
|
313
|
+
In development mode, DevTools opens automatically. In production:
|
|
314
|
+
|
|
315
|
+
1. Open from View menu (if enabled)
|
|
316
|
+
2. Or use `Cmd+Option+I` (macOS) / `Ctrl+Shift+I` (Windows)
|
|
317
|
+
|
|
318
|
+
### Logging
|
|
319
|
+
|
|
320
|
+
Main process logs appear in the terminal:
|
|
321
|
+
|
|
322
|
+
```
|
|
323
|
+
[Main] App ready, starting initialization...
|
|
324
|
+
[Main] Settings loaded
|
|
325
|
+
[Main] Session controller initialized
|
|
326
|
+
[Main] Transcription service configured
|
|
327
|
+
[Main] markupr initialization complete
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
Renderer logs appear in DevTools console.
|
|
331
|
+
|
|
332
|
+
### Debug Environment Variables
|
|
333
|
+
|
|
334
|
+
```bash
|
|
335
|
+
# Enable all debug output
|
|
336
|
+
DEBUG=markupr:*
|
|
337
|
+
|
|
338
|
+
# Enable specific modules
|
|
339
|
+
DEBUG=markupr:transcription,markupr:capture
|
|
340
|
+
|
|
341
|
+
# Verbose Electron logs
|
|
342
|
+
ELECTRON_ENABLE_LOGGING=1
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
## Code Style
|
|
346
|
+
|
|
347
|
+
### TypeScript
|
|
348
|
+
|
|
349
|
+
- Use explicit types for function parameters and returns
|
|
350
|
+
- Prefer interfaces over types for objects
|
|
351
|
+
- Use `const assertions` for literal types
|
|
352
|
+
|
|
353
|
+
```typescript
|
|
354
|
+
// Good
|
|
355
|
+
function createSession(sourceId: string): Session {
|
|
356
|
+
return { id: generateId(), sourceId };
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Avoid
|
|
360
|
+
function createSession(sourceId) {
|
|
361
|
+
return { id: generateId(), sourceId };
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### React
|
|
366
|
+
|
|
367
|
+
- Use functional components with hooks
|
|
368
|
+
- Prefer named exports
|
|
369
|
+
- Keep components focused and small
|
|
370
|
+
|
|
371
|
+
```tsx
|
|
372
|
+
// Good
|
|
373
|
+
export function SessionStatus({ state }: SessionStatusProps) {
|
|
374
|
+
return <div className="status">{state}</div>;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// Avoid
|
|
378
|
+
export default class SessionStatus extends Component {
|
|
379
|
+
render() {
|
|
380
|
+
return <div className="status">{this.props.state}</div>;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
### CSS
|
|
386
|
+
|
|
387
|
+
- Use Tailwind CSS utilities
|
|
388
|
+
- Avoid custom CSS when Tailwind suffices
|
|
389
|
+
- Use CSS variables for theming
|
|
390
|
+
|
|
391
|
+
```tsx
|
|
392
|
+
// Good
|
|
393
|
+
<div className="bg-gray-900 text-white p-4 rounded-lg">
|
|
394
|
+
|
|
395
|
+
// Avoid
|
|
396
|
+
<div style={{ backgroundColor: '#111827', color: 'white', padding: 16 }}>
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
### Linting
|
|
400
|
+
|
|
401
|
+
```bash
|
|
402
|
+
# Check for issues
|
|
403
|
+
npm run lint
|
|
404
|
+
|
|
405
|
+
# Auto-fix issues
|
|
406
|
+
npm run lint:fix
|
|
407
|
+
|
|
408
|
+
# Type checking
|
|
409
|
+
npm run typecheck
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### ESLint Configuration
|
|
413
|
+
|
|
414
|
+
The project uses:
|
|
415
|
+
- `@typescript-eslint/eslint-plugin`
|
|
416
|
+
- `eslint-plugin-react`
|
|
417
|
+
- `eslint-plugin-react-hooks`
|
|
418
|
+
|
|
419
|
+
## Making Changes
|
|
420
|
+
|
|
421
|
+
### 1. Create a Branch
|
|
422
|
+
|
|
423
|
+
```bash
|
|
424
|
+
git checkout -b feature/my-feature
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### 2. Make Changes
|
|
428
|
+
|
|
429
|
+
Follow the code style guidelines.
|
|
430
|
+
|
|
431
|
+
### 3. Test Locally
|
|
432
|
+
|
|
433
|
+
```bash
|
|
434
|
+
npm test
|
|
435
|
+
npm run lint
|
|
436
|
+
npm run typecheck
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
### 4. Test the Build
|
|
440
|
+
|
|
441
|
+
```bash
|
|
442
|
+
npm run build
|
|
443
|
+
npm run package
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
### 5. Commit
|
|
447
|
+
|
|
448
|
+
Follow conventional commits:
|
|
449
|
+
|
|
450
|
+
```bash
|
|
451
|
+
git commit -m "feat: add new export format"
|
|
452
|
+
git commit -m "fix: resolve screenshot timing issue"
|
|
453
|
+
git commit -m "docs: update API documentation"
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
### 6. Push and Create PR
|
|
457
|
+
|
|
458
|
+
```bash
|
|
459
|
+
git push origin feature/my-feature
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
Then create a Pull Request on GitHub.
|
|
463
|
+
|
|
464
|
+
### Common Changes
|
|
465
|
+
|
|
466
|
+
#### Adding a New Setting
|
|
467
|
+
|
|
468
|
+
1. Add to `AppSettings` in `src/shared/types.ts`
|
|
469
|
+
2. Add default in `DEFAULT_SETTINGS`
|
|
470
|
+
3. Add UI in `src/renderer/components/SettingsPanel.tsx`
|
|
471
|
+
4. Handle in `SettingsManager` if special logic needed
|
|
472
|
+
|
|
473
|
+
#### Adding a New IPC Channel
|
|
474
|
+
|
|
475
|
+
1. Add channel name to `IPC_CHANNELS` in `src/shared/types.ts`
|
|
476
|
+
2. Add handler in `src/main/index.ts`
|
|
477
|
+
3. Add API method in `src/preload/index.ts`
|
|
478
|
+
4. Add types for payloads
|
|
479
|
+
|
|
480
|
+
#### Adding a New Component
|
|
481
|
+
|
|
482
|
+
1. Create file in `src/renderer/components/`
|
|
483
|
+
2. Export from `src/renderer/components/index.ts`
|
|
484
|
+
3. Import where needed
|
|
485
|
+
4. Add any new hooks to `src/renderer/hooks/`
|
|
486
|
+
|
|
487
|
+
### Troubleshooting Development
|
|
488
|
+
|
|
489
|
+
**Hot reload not working**:
|
|
490
|
+
- Check if Vite server is running
|
|
491
|
+
- Clear `.vite` cache folder
|
|
492
|
+
- Restart `npm run dev`
|
|
493
|
+
|
|
494
|
+
**TypeScript errors**:
|
|
495
|
+
- Run `npm run typecheck`
|
|
496
|
+
- Ensure types are exported from shared
|
|
497
|
+
- Check for circular dependencies
|
|
498
|
+
|
|
499
|
+
**Electron errors**:
|
|
500
|
+
- Check main process terminal output
|
|
501
|
+
- Look for native module issues
|
|
502
|
+
- Rebuild native modules: `npm run postinstall`
|
|
503
|
+
|
|
504
|
+
**Native modules failing**:
|
|
505
|
+
```bash
|
|
506
|
+
# Rebuild for Electron
|
|
507
|
+
npx electron-rebuild
|
|
508
|
+
```
|