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
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to markupr will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [1.0.0] - 2026-02-04
|
|
11
|
+
|
|
12
|
+
### Highlights
|
|
13
|
+
**markupr Initial Public Release** - Voice-to-AI feedback for developers. Free and open source.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- **Bulletproof State Machine**: 7-state finite state machine with watchdog timer - can never get stuck
|
|
17
|
+
- **Menu Bar Native**: Runs entirely from the menu bar (no dock icon)
|
|
18
|
+
- **Three-Tier Transcription**: OpenAI (premium) -> Whisper (default) -> Timer fallback
|
|
19
|
+
- **Crash Recovery**: 5-second auto-save ensures no work is lost
|
|
20
|
+
- **Offline Mode**: Local Whisper transcription works without internet
|
|
21
|
+
- **Platform-Aware Hotkeys**: Cmd on Mac, Ctrl on Windows - just works
|
|
22
|
+
- **Donate Button**: Rotating messages for supporting the developer
|
|
23
|
+
- **Windows Taskbar Integration**: Overlay icons and toolbar buttons
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
- Default transcription now uses local Whisper (no API key required)
|
|
27
|
+
- Improved documentation with comprehensive guides
|
|
28
|
+
- Enhanced stability across all platforms
|
|
29
|
+
|
|
30
|
+
### Technical
|
|
31
|
+
- State machine: IDLE -> STARTING -> RECORDING -> STOPPING -> PROCESSING -> REVIEWING -> EXPORTING
|
|
32
|
+
- Watchdog monitors state transitions with configurable timeouts
|
|
33
|
+
- Recovery manager handles unexpected exits gracefully
|
|
34
|
+
|
|
35
|
+
## [0.4.0] - 2026-02-02
|
|
36
|
+
|
|
37
|
+
### Added
|
|
38
|
+
- **Export Options**: PDF, HTML, and JSON export formats
|
|
39
|
+
- **AI-Powered Categorization**: Automatic feedback categorization (Bug, Feature, UX)
|
|
40
|
+
- **Crash Recovery**: Automatic session recovery after unexpected crashes
|
|
41
|
+
- **Auto-Updater**: Seamless application updates with release notes
|
|
42
|
+
- **Keyboard Shortcuts Panel**: In-app cheatsheet with customization
|
|
43
|
+
- **Session History Browser**: View and manage past recording sessions
|
|
44
|
+
- **Multi-Monitor Support**: Full support for multiple displays with source preview
|
|
45
|
+
- **Screenshot Annotations**: Arrow, circle, rectangle, freehand, and text tools
|
|
46
|
+
- **Audio Waveform Visualization**: Real-time audio level display
|
|
47
|
+
- **Countdown Timer**: Optional countdown before recording starts
|
|
48
|
+
- **Clarification Questions**: AI-generated follow-up questions for unclear feedback
|
|
49
|
+
- **Native macOS Menu Bar**: Full menu bar integration
|
|
50
|
+
|
|
51
|
+
### Changed
|
|
52
|
+
- Improved Settings panel with live preview
|
|
53
|
+
- Enhanced onboarding wizard with better guidance
|
|
54
|
+
- Better error messages and user feedback
|
|
55
|
+
- Upgraded to Electron 28
|
|
56
|
+
|
|
57
|
+
### Fixed
|
|
58
|
+
- Fixed screenshot timing during rapid speech
|
|
59
|
+
- Fixed hotkey registration on Windows
|
|
60
|
+
- Fixed memory leak during long sessions
|
|
61
|
+
- Fixed clipboard copy on some macOS versions
|
|
62
|
+
|
|
63
|
+
## [0.3.0] - 2026-01-15
|
|
64
|
+
|
|
65
|
+
### Added
|
|
66
|
+
- **Real-time Transcription Preview**: See transcription as you speak
|
|
67
|
+
- **Intelligent Screenshot Timing**: Voice activity detection triggers captures
|
|
68
|
+
- **Tray Icon States**: Visual feedback for idle/recording/processing/error
|
|
69
|
+
- **Settings Panel**: Comprehensive configuration UI
|
|
70
|
+
- **Session Review**: Edit, reorder, and delete feedback items before export
|
|
71
|
+
- **Theme System**: Dark, light, and system theme options
|
|
72
|
+
|
|
73
|
+
### Changed
|
|
74
|
+
- Improved OpenAI integration with better error handling
|
|
75
|
+
- Enhanced Markdown output format for AI consumption
|
|
76
|
+
- Better screenshot compression
|
|
77
|
+
|
|
78
|
+
### Fixed
|
|
79
|
+
- Fixed audio capture on Windows
|
|
80
|
+
- Fixed window selector thumbnail generation
|
|
81
|
+
- Fixed crash when OpenAI connection drops
|
|
82
|
+
|
|
83
|
+
## [0.2.0] - 2026-01-01
|
|
84
|
+
|
|
85
|
+
### Added
|
|
86
|
+
- **Window Selector**: Choose specific windows or screens to capture
|
|
87
|
+
- **Manual Screenshot**: Hotkey to capture screenshots on demand
|
|
88
|
+
- **Output Directory Setting**: Choose where sessions are saved
|
|
89
|
+
- **Clipboard Integration**: Auto-copy summary to clipboard
|
|
90
|
+
|
|
91
|
+
### Changed
|
|
92
|
+
- Improved UI responsiveness
|
|
93
|
+
- Better error messages
|
|
94
|
+
|
|
95
|
+
### Fixed
|
|
96
|
+
- Fixed hotkey conflicts with system shortcuts
|
|
97
|
+
- Fixed screenshot resolution on Retina displays
|
|
98
|
+
|
|
99
|
+
## [0.1.0] - 2025-12-15
|
|
100
|
+
|
|
101
|
+
### Added
|
|
102
|
+
- Initial release
|
|
103
|
+
- Voice narration capture with OpenAI transcription
|
|
104
|
+
- Automatic screenshot capture on voice pauses
|
|
105
|
+
- Markdown document generation
|
|
106
|
+
- Global hotkey to start/stop recording (`Cmd+Shift+F`)
|
|
107
|
+
- System tray icon
|
|
108
|
+
- Basic settings (API key configuration)
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Version History Summary
|
|
113
|
+
|
|
114
|
+
| Version | Date | Highlights |
|
|
115
|
+
|---------|------|------------|
|
|
116
|
+
| 1.0.0 | 2026-02-04 | **Initial Public Release** - Bulletproof state machine, offline Whisper |
|
|
117
|
+
| 0.4.0 | 2026-02-02 | Export formats, crash recovery, auto-updater |
|
|
118
|
+
| 0.3.0 | 2026-01-15 | Transcription preview, intelligent capture, settings |
|
|
119
|
+
| 0.2.0 | 2026-01-01 | Window selector, manual screenshots |
|
|
120
|
+
| 0.1.0 | 2025-12-15 | Initial scaffold |
|
|
121
|
+
|
|
122
|
+
[Unreleased]: https://github.com/eddiesanjuan/markupr/compare/v1.0.0...HEAD
|
|
123
|
+
[1.0.0]: https://github.com/eddiesanjuan/markupr/compare/v0.4.0...v1.0.0
|
|
124
|
+
[0.4.0]: https://github.com/eddiesanjuan/markupr/compare/v0.3.0...v0.4.0
|
|
125
|
+
[0.3.0]: https://github.com/eddiesanjuan/markupr/compare/v0.2.0...v0.3.0
|
|
126
|
+
[0.2.0]: https://github.com/eddiesanjuan/markupr/compare/v0.1.0...v0.2.0
|
|
127
|
+
[0.1.0]: https://github.com/eddiesanjuan/markupr/releases/tag/v0.1.0
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# CLAUDE.md - markupr
|
|
2
|
+
|
|
3
|
+
## Project Overview
|
|
4
|
+
|
|
5
|
+
markupr is a macOS menu bar app that intelligently captures developer feedback. It records your screen and voice simultaneously, then uses an intelligent post-processing pipeline to correlate transcript timestamps with the screen recording — extracting the right frames at the right moments and stitching everything into a structured, AI-ready Markdown document. The output is purpose-built for AI coding agents: every screenshot placed exactly where it belongs, every issue clearly documented.
|
|
6
|
+
|
|
7
|
+
**Version:** 1.2.0
|
|
8
|
+
**License:** MIT (Open Source)
|
|
9
|
+
|
|
10
|
+
## Tech Stack
|
|
11
|
+
|
|
12
|
+
- **Framework:** Electron + React + TypeScript
|
|
13
|
+
- **Build:** electron-vite + Vite
|
|
14
|
+
- **Transcription:** Local Whisper (default), OpenAI Whisper-1 API (optional cloud)
|
|
15
|
+
- **AI Analysis:** Anthropic Claude API (BYOK or premium tier)
|
|
16
|
+
- **Testing:** Vitest (356 tests)
|
|
17
|
+
- **Package:** electron-builder
|
|
18
|
+
- **Styling:** Tailwind CSS
|
|
19
|
+
|
|
20
|
+
## Architecture
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
src/
|
|
24
|
+
├── main/ # Electron main process
|
|
25
|
+
│ ├── index.ts # Entry point, window management, IPC orchestration
|
|
26
|
+
│ ├── SessionController.ts # 7-state FSM with watchdog timer
|
|
27
|
+
│ ├── CrashRecovery.ts # Auto-save every 5s, crash detection, recovery dialog
|
|
28
|
+
│ ├── ErrorHandler.ts # Centralized error handling
|
|
29
|
+
│ ├── HotkeyManager.ts # Global hotkey registration
|
|
30
|
+
│ ├── MenuManager.ts # Application menu
|
|
31
|
+
│ ├── TrayManager.ts # Menu bar tray icon and status
|
|
32
|
+
│ ├── PermissionManager.ts # macOS permission checks
|
|
33
|
+
│ ├── AutoUpdater.ts # Auto-update via electron-updater
|
|
34
|
+
│ ├── ai/ # AI analysis pipeline (Claude)
|
|
35
|
+
│ │ ├── AIPipelineManager.ts # Orchestrates AI analysis (free/byok/premium tiers)
|
|
36
|
+
│ │ ├── ClaudeAnalyzer.ts # Claude API integration
|
|
37
|
+
│ │ ├── ImageOptimizer.ts # Screenshot optimization for API
|
|
38
|
+
│ │ ├── StructuredMarkdownBuilder.ts # AI-enhanced markdown output
|
|
39
|
+
│ │ └── types.ts # AI pipeline types
|
|
40
|
+
│ ├── analysis/ # Feedback analysis and categorization
|
|
41
|
+
│ ├── audio/ # Microphone capture, VAD
|
|
42
|
+
│ ├── capture/ # Screen capture via desktopCapturer
|
|
43
|
+
│ ├── output/ # Document generation and export
|
|
44
|
+
│ │ ├── MarkdownGenerator.ts # llms.txt-inspired markdown output
|
|
45
|
+
│ │ ├── ExportService.ts # Multi-format export (MD, PDF, HTML, JSON)
|
|
46
|
+
│ │ ├── ClipboardService.ts # Clipboard bridge (copies file path)
|
|
47
|
+
│ │ ├── FileManager.ts # Session file management
|
|
48
|
+
│ │ └── sessionAdapter.ts # Type conversion utilities
|
|
49
|
+
│ ├── pipeline/ # Post-processing pipeline
|
|
50
|
+
│ │ ├── PostProcessor.ts # Pipeline orchestrator (transcribe → analyze → extract → generate)
|
|
51
|
+
│ │ ├── TranscriptAnalyzer.ts # Heuristic key-moment detection
|
|
52
|
+
│ │ └── FrameExtractor.ts # ffmpeg-based video frame extraction
|
|
53
|
+
│ ├── platform/ # Platform-specific code (Windows taskbar)
|
|
54
|
+
│ ├── settings/ # Persistent settings with secure API key storage
|
|
55
|
+
│ ├── transcription/ # Transcription tier management
|
|
56
|
+
│ │ ├── TierManager.ts # Tier selection (Whisper, timer-only)
|
|
57
|
+
│ │ ├── WhisperService.ts # Local Whisper integration
|
|
58
|
+
│ │ └── ModelDownloadManager.ts # Whisper model download from HuggingFace
|
|
59
|
+
│ └── windows/ # Window management (popover, taskbar)
|
|
60
|
+
├── renderer/ # React UI
|
|
61
|
+
│ ├── App.tsx # Main component with state machine UI
|
|
62
|
+
│ ├── AppWrapper.tsx # Root wrapper with providers
|
|
63
|
+
│ ├── components/ # UI components
|
|
64
|
+
│ │ ├── AnnotationOverlay.tsx # Drawing tools (arrow, circle, rect, freehand, text)
|
|
65
|
+
│ │ ├── AudioWaveform.tsx # Real-time audio level visualization
|
|
66
|
+
│ │ ├── CrashRecoveryDialog.tsx # Crash recovery UI
|
|
67
|
+
│ │ ├── DonateButton.tsx # Rotating donate messages
|
|
68
|
+
│ │ ├── ModelDownloadDialog.tsx # Whisper model download UI
|
|
69
|
+
│ │ ├── Onboarding.tsx # First-run experience
|
|
70
|
+
│ │ ├── SessionHistory.tsx # Session browser
|
|
71
|
+
│ │ ├── SessionReview.tsx # Post-recording review/edit
|
|
72
|
+
│ │ ├── SettingsPanel.tsx # Settings configuration
|
|
73
|
+
│ │ └── ... # Other UI components
|
|
74
|
+
│ ├── audio/ # Renderer-side audio capture bridge
|
|
75
|
+
│ ├── capture/ # Renderer-side screen recording (MediaRecorder)
|
|
76
|
+
│ └── hooks/ # React hooks (theme, animation)
|
|
77
|
+
├── preload/ # Context bridge (secure IPC)
|
|
78
|
+
└── shared/ # Types shared between processes
|
|
79
|
+
├── types.ts # IPC channels, payload types, state types
|
|
80
|
+
└── hotkeys.ts # Hotkey configuration types
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Commands
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
npm run dev # Development mode with hot reload
|
|
87
|
+
npm run build # Build for production
|
|
88
|
+
npm run build:desktop # Build desktop app only
|
|
89
|
+
npm test # Run all tests (356 tests)
|
|
90
|
+
npm run test:unit # Run unit tests only
|
|
91
|
+
npm run test:watch # Run tests in watch mode
|
|
92
|
+
npm run lint # Lint code
|
|
93
|
+
npm run lint:fix # Auto-fix lint issues
|
|
94
|
+
npm run typecheck # TypeScript check
|
|
95
|
+
npm run package # Package for current platform
|
|
96
|
+
npm run package:mac # Package for macOS
|
|
97
|
+
npm run package:win # Package for Windows
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Key Architecture Decisions
|
|
101
|
+
|
|
102
|
+
### State Machine
|
|
103
|
+
The recording session is governed by a 7-state FSM: `idle → starting → recording → stopping → processing → complete → error`. Every state has a maximum duration enforced by a watchdog timer that forces recovery if anything gets stuck.
|
|
104
|
+
|
|
105
|
+
### Post-Processing Pipeline
|
|
106
|
+
When recording stops, the pipeline runs: audio transcription (Whisper) → transcript analysis (key-moment detection) → video frame extraction (ffmpeg) → markdown generation. Each step degrades gracefully if a dependency is missing.
|
|
107
|
+
|
|
108
|
+
### Three-Tier Transcription
|
|
109
|
+
1. **OpenAI Whisper-1 API** (optional, best quality) — cloud-based, requires API key
|
|
110
|
+
2. **Local Whisper** (default) — runs on device, no API key needed
|
|
111
|
+
3. **Timer-only** (fallback) — captures screenshots on a timer when no transcription is available
|
|
112
|
+
|
|
113
|
+
### Crash Recovery
|
|
114
|
+
Session state auto-saves to disk every 5 seconds. On restart after a crash, the app detects the incomplete session and offers recovery.
|
|
115
|
+
|
|
116
|
+
### Clipboard Bridge
|
|
117
|
+
When a session completes, the **file path** to the markdown document is copied to clipboard — not the content. This is deliberate: the file persists on disk, and AI tools can read the full document including screenshots.
|
|
118
|
+
|
|
119
|
+
## IPC Communication
|
|
120
|
+
|
|
121
|
+
All main/renderer communication goes through the preload script. See `src/shared/types.ts` for IPC channel names.
|
|
122
|
+
|
|
123
|
+
## Configuration
|
|
124
|
+
|
|
125
|
+
No configuration required for first run. Local Whisper transcription works out of the box after downloading a model (~75MB for tiny, ~500MB for base).
|
|
126
|
+
|
|
127
|
+
Optional API keys (stored securely in OS keychain):
|
|
128
|
+
- **OpenAI** — for cloud post-session transcription
|
|
129
|
+
- **Anthropic** — for AI-enhanced document analysis (BYOK mode)
|
|
130
|
+
|
|
131
|
+
## Development Notes
|
|
132
|
+
|
|
133
|
+
- Menu bar popover window, frameless, always-on-top
|
|
134
|
+
- Screenshots saved as PNG files in session directories
|
|
135
|
+
- Voice activity detection uses RMS amplitude analysis
|
|
136
|
+
- All settings validated against JSON schema
|
|
137
|
+
- Secure API key storage via keytar (macOS Keychain, Windows Credential Manager) with encrypted fallback
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
This project follows the [Contributor Covenant v2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/).
|
|
4
|
+
|
|
5
|
+
## Enforcement
|
|
6
|
+
|
|
7
|
+
Report violations to: **conduct@markupr.app**
|
|
8
|
+
|
|
9
|
+
All reports will be reviewed and investigated promptly.
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
# Contributing to markupr
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing to markupr! This document provides guidelines and information about contributing.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Code of Conduct](#code-of-conduct)
|
|
8
|
+
- [Getting Started](#getting-started)
|
|
9
|
+
- [How to Contribute](#how-to-contribute)
|
|
10
|
+
- [Development Workflow](#development-workflow)
|
|
11
|
+
- [Pull Request Process](#pull-request-process)
|
|
12
|
+
- [Style Guide](#style-guide)
|
|
13
|
+
- [Reporting Issues](#reporting-issues)
|
|
14
|
+
|
|
15
|
+
## Code of Conduct
|
|
16
|
+
|
|
17
|
+
By participating in this project, you agree to maintain a respectful and inclusive environment. Please:
|
|
18
|
+
|
|
19
|
+
- Be respectful and considerate in all interactions
|
|
20
|
+
- Welcome newcomers and help them learn
|
|
21
|
+
- Focus on constructive feedback
|
|
22
|
+
- Accept responsibility for mistakes and learn from them
|
|
23
|
+
|
|
24
|
+
## Getting Started
|
|
25
|
+
|
|
26
|
+
### Prerequisites
|
|
27
|
+
|
|
28
|
+
- Node.js 18+
|
|
29
|
+
- npm 9+
|
|
30
|
+
- Git
|
|
31
|
+
- A code editor (VS Code recommended)
|
|
32
|
+
|
|
33
|
+
### Setup
|
|
34
|
+
|
|
35
|
+
1. **Fork the repository** on GitHub
|
|
36
|
+
|
|
37
|
+
2. **Clone your fork**:
|
|
38
|
+
```bash
|
|
39
|
+
git clone https://github.com/YOUR_USERNAME/markupr.git
|
|
40
|
+
cd markupr
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
3. **Add upstream remote**:
|
|
44
|
+
```bash
|
|
45
|
+
git remote add upstream https://github.com/eddiesanjuan/markupr.git
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
4. **Install dependencies**:
|
|
49
|
+
```bash
|
|
50
|
+
npm install
|
|
51
|
+
# or
|
|
52
|
+
bun install
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
5. **Start development**:
|
|
56
|
+
```bash
|
|
57
|
+
npm run dev
|
|
58
|
+
# or
|
|
59
|
+
bun run dev
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
See [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md) for detailed development instructions.
|
|
63
|
+
|
|
64
|
+
## How to Contribute
|
|
65
|
+
|
|
66
|
+
### Types of Contributions
|
|
67
|
+
|
|
68
|
+
We welcome many types of contributions:
|
|
69
|
+
|
|
70
|
+
- **Bug fixes**: Fix issues in existing code
|
|
71
|
+
- **Features**: Add new functionality
|
|
72
|
+
- **Documentation**: Improve or add documentation
|
|
73
|
+
- **Tests**: Add or improve test coverage
|
|
74
|
+
- **Performance**: Optimize existing code
|
|
75
|
+
- **Accessibility**: Improve accessibility
|
|
76
|
+
- **Translations**: Help translate the UI
|
|
77
|
+
|
|
78
|
+
### Finding Issues to Work On
|
|
79
|
+
|
|
80
|
+
- Check [issues labeled "good first issue"](https://github.com/eddiesanjuan/markupr/labels/good%20first%20issue) for beginner-friendly tasks
|
|
81
|
+
- Check [issues labeled "help wanted"](https://github.com/eddiesanjuan/markupr/labels/help%20wanted) for tasks where we need help
|
|
82
|
+
- Feel free to propose your own ideas by opening an issue first
|
|
83
|
+
|
|
84
|
+
### Before Starting Work
|
|
85
|
+
|
|
86
|
+
1. **Check existing issues** to avoid duplicate work
|
|
87
|
+
2. **Comment on the issue** to let others know you're working on it
|
|
88
|
+
3. **For significant changes**, open an issue first to discuss the approach
|
|
89
|
+
4. **For new features**, wait for approval before starting implementation
|
|
90
|
+
|
|
91
|
+
## Development Workflow
|
|
92
|
+
|
|
93
|
+
### Branch Naming
|
|
94
|
+
|
|
95
|
+
Use descriptive branch names:
|
|
96
|
+
|
|
97
|
+
- `feature/add-pdf-export`
|
|
98
|
+
- `fix/hotkey-conflict`
|
|
99
|
+
- `docs/update-readme`
|
|
100
|
+
- `refactor/settings-panel`
|
|
101
|
+
|
|
102
|
+
### Making Changes
|
|
103
|
+
|
|
104
|
+
1. **Create a branch**:
|
|
105
|
+
```bash
|
|
106
|
+
git checkout -b feature/my-feature
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
2. **Make your changes**:
|
|
110
|
+
- Follow the [style guide](#style-guide)
|
|
111
|
+
- Keep commits focused and atomic
|
|
112
|
+
- Write clear commit messages
|
|
113
|
+
|
|
114
|
+
3. **Test your changes**:
|
|
115
|
+
```bash
|
|
116
|
+
npm test
|
|
117
|
+
npm run lint
|
|
118
|
+
npm run typecheck
|
|
119
|
+
# bun equivalents:
|
|
120
|
+
# bun run test
|
|
121
|
+
# bun run lint
|
|
122
|
+
# bun run typecheck
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
4. **Update documentation** if needed
|
|
126
|
+
|
|
127
|
+
5. **Commit your changes**:
|
|
128
|
+
```bash
|
|
129
|
+
git commit -m "feat: add new export format"
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Commit Message Format
|
|
133
|
+
|
|
134
|
+
We use [Conventional Commits](https://www.conventionalcommits.org/):
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
<type>(<scope>): <description>
|
|
138
|
+
|
|
139
|
+
[optional body]
|
|
140
|
+
|
|
141
|
+
[optional footer]
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Types**:
|
|
145
|
+
- `feat`: New feature
|
|
146
|
+
- `fix`: Bug fix
|
|
147
|
+
- `docs`: Documentation only
|
|
148
|
+
- `style`: Code style (formatting, etc.)
|
|
149
|
+
- `refactor`: Code change that neither fixes nor adds
|
|
150
|
+
- `perf`: Performance improvement
|
|
151
|
+
- `test`: Adding or updating tests
|
|
152
|
+
- `chore`: Maintenance tasks
|
|
153
|
+
|
|
154
|
+
**Examples**:
|
|
155
|
+
```
|
|
156
|
+
feat(export): add PDF export format
|
|
157
|
+
fix(hotkey): resolve conflict with system shortcuts
|
|
158
|
+
docs(readme): update installation instructions
|
|
159
|
+
refactor(settings): simplify settings manager
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Keeping Your Fork Updated
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
git fetch upstream
|
|
166
|
+
git checkout main
|
|
167
|
+
git merge upstream/main
|
|
168
|
+
git push origin main
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Pull Request Process
|
|
172
|
+
|
|
173
|
+
### Before Submitting
|
|
174
|
+
|
|
175
|
+
Ensure your PR:
|
|
176
|
+
|
|
177
|
+
1. **Follows the style guide**
|
|
178
|
+
2. **Passes all tests**: `npm test`
|
|
179
|
+
3. **Passes linting**: `npm run lint`
|
|
180
|
+
4. **Passes type checking**: `npm run typecheck`
|
|
181
|
+
5. **Has been tested manually**
|
|
182
|
+
6. **Includes documentation updates** (if applicable)
|
|
183
|
+
7. **Has a clear description**
|
|
184
|
+
|
|
185
|
+
### Submitting a PR
|
|
186
|
+
|
|
187
|
+
1. **Push your branch**:
|
|
188
|
+
```bash
|
|
189
|
+
git push origin feature/my-feature
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
2. **Open a Pull Request** on GitHub
|
|
193
|
+
|
|
194
|
+
3. **Fill out the PR template**:
|
|
195
|
+
- Describe what the PR does
|
|
196
|
+
- Link related issues
|
|
197
|
+
- List any breaking changes
|
|
198
|
+
- Include screenshots for UI changes
|
|
199
|
+
|
|
200
|
+
4. **Request review** if not automatically assigned
|
|
201
|
+
|
|
202
|
+
### PR Template
|
|
203
|
+
|
|
204
|
+
```markdown
|
|
205
|
+
## Description
|
|
206
|
+
Brief description of changes.
|
|
207
|
+
|
|
208
|
+
## Related Issues
|
|
209
|
+
Fixes #123
|
|
210
|
+
|
|
211
|
+
## Type of Change
|
|
212
|
+
- [ ] Bug fix
|
|
213
|
+
- [ ] New feature
|
|
214
|
+
- [ ] Documentation
|
|
215
|
+
- [ ] Refactoring
|
|
216
|
+
- [ ] Other (describe)
|
|
217
|
+
|
|
218
|
+
## Testing
|
|
219
|
+
Describe how you tested the changes.
|
|
220
|
+
|
|
221
|
+
## Screenshots
|
|
222
|
+
(If applicable)
|
|
223
|
+
|
|
224
|
+
## Checklist
|
|
225
|
+
- [ ] Tests pass (`npm test`)
|
|
226
|
+
- [ ] Lint passes (`npm run lint`)
|
|
227
|
+
- [ ] Types check (`npm run typecheck`)
|
|
228
|
+
- [ ] Documentation updated
|
|
229
|
+
- [ ] Manually tested
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Review Process
|
|
233
|
+
|
|
234
|
+
1. **Automated checks** must pass
|
|
235
|
+
2. **At least one maintainer** must approve
|
|
236
|
+
3. **All comments** must be resolved
|
|
237
|
+
4. **No merge conflicts** with main
|
|
238
|
+
|
|
239
|
+
### After Merging
|
|
240
|
+
|
|
241
|
+
- Delete your branch
|
|
242
|
+
- Pull changes to your local main
|
|
243
|
+
- Celebrate your contribution! 🎉
|
|
244
|
+
|
|
245
|
+
## Style Guide
|
|
246
|
+
|
|
247
|
+
### TypeScript
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
// Use explicit types
|
|
251
|
+
function createSession(sourceId: string): Session {
|
|
252
|
+
// ...
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Use interfaces for objects
|
|
256
|
+
interface SessionOptions {
|
|
257
|
+
sourceId: string;
|
|
258
|
+
sourceName?: string;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Use const assertions for literals
|
|
262
|
+
const STATUS = {
|
|
263
|
+
IDLE: 'idle',
|
|
264
|
+
RECORDING: 'recording',
|
|
265
|
+
} as const;
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### React
|
|
269
|
+
|
|
270
|
+
```tsx
|
|
271
|
+
// Use functional components
|
|
272
|
+
export function SessionStatus({ state }: SessionStatusProps) {
|
|
273
|
+
const [isActive, setIsActive] = useState(false);
|
|
274
|
+
|
|
275
|
+
useEffect(() => {
|
|
276
|
+
// Cleanup subscriptions
|
|
277
|
+
return () => cleanup();
|
|
278
|
+
}, []);
|
|
279
|
+
|
|
280
|
+
return <div className="status">{state}</div>;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Prefer named exports
|
|
284
|
+
export { SessionStatus };
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### CSS / Tailwind
|
|
288
|
+
|
|
289
|
+
```tsx
|
|
290
|
+
// Use Tailwind utilities
|
|
291
|
+
<div className="bg-gray-900 text-white p-4 rounded-lg shadow-md">
|
|
292
|
+
|
|
293
|
+
// For complex styles, use cn() helper
|
|
294
|
+
<div className={cn(
|
|
295
|
+
"base-styles",
|
|
296
|
+
isActive && "active-styles",
|
|
297
|
+
className
|
|
298
|
+
)}>
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### File Organization
|
|
302
|
+
|
|
303
|
+
```
|
|
304
|
+
src/
|
|
305
|
+
├── main/
|
|
306
|
+
│ ├── services/ # Service classes
|
|
307
|
+
│ ├── utils/ # Utility functions
|
|
308
|
+
│ └── types/ # Main-specific types
|
|
309
|
+
├── renderer/
|
|
310
|
+
│ ├── components/ # React components
|
|
311
|
+
│ ├── hooks/ # Custom hooks
|
|
312
|
+
│ └── utils/ # Utility functions
|
|
313
|
+
└── shared/
|
|
314
|
+
└── types.ts # Shared types
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Naming Conventions
|
|
318
|
+
|
|
319
|
+
| Type | Convention | Example |
|
|
320
|
+
|------|------------|---------|
|
|
321
|
+
| Components | PascalCase | `SessionReview.tsx` |
|
|
322
|
+
| Hooks | camelCase, `use` prefix | `useSessionState.ts` |
|
|
323
|
+
| Utilities | camelCase | `formatTime.ts` |
|
|
324
|
+
| Types | PascalCase | `SessionState` |
|
|
325
|
+
| Constants | UPPER_SNAKE_CASE | `MAX_RETRIES` |
|
|
326
|
+
|
|
327
|
+
## Reporting Issues
|
|
328
|
+
|
|
329
|
+
### Before Reporting
|
|
330
|
+
|
|
331
|
+
1. **Check existing issues** for duplicates
|
|
332
|
+
2. **Try latest version** - issue may be fixed
|
|
333
|
+
3. **Collect information**:
|
|
334
|
+
- OS and version
|
|
335
|
+
- markupr version
|
|
336
|
+
- Steps to reproduce
|
|
337
|
+
- Error messages/logs
|
|
338
|
+
|
|
339
|
+
### Bug Report Template
|
|
340
|
+
|
|
341
|
+
```markdown
|
|
342
|
+
## Description
|
|
343
|
+
Clear description of the bug.
|
|
344
|
+
|
|
345
|
+
## Steps to Reproduce
|
|
346
|
+
1. Go to '...'
|
|
347
|
+
2. Click on '...'
|
|
348
|
+
3. See error
|
|
349
|
+
|
|
350
|
+
## Expected Behavior
|
|
351
|
+
What should happen.
|
|
352
|
+
|
|
353
|
+
## Actual Behavior
|
|
354
|
+
What actually happens.
|
|
355
|
+
|
|
356
|
+
## Environment
|
|
357
|
+
- OS: macOS 14.0
|
|
358
|
+
- markupr: 0.4.0
|
|
359
|
+
- Node: 18.19.0
|
|
360
|
+
|
|
361
|
+
## Screenshots/Logs
|
|
362
|
+
(If applicable)
|
|
363
|
+
|
|
364
|
+
## Additional Context
|
|
365
|
+
Any other relevant information.
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### Feature Request Template
|
|
369
|
+
|
|
370
|
+
```markdown
|
|
371
|
+
## Problem
|
|
372
|
+
Describe the problem this feature would solve.
|
|
373
|
+
|
|
374
|
+
## Proposed Solution
|
|
375
|
+
How you envision the feature working.
|
|
376
|
+
|
|
377
|
+
## Alternatives Considered
|
|
378
|
+
Other approaches you've thought about.
|
|
379
|
+
|
|
380
|
+
## Additional Context
|
|
381
|
+
Mockups, examples, or references.
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
## Questions?
|
|
385
|
+
|
|
386
|
+
- Open a [discussion](https://github.com/eddiesanjuan/markupr/discussions)
|
|
387
|
+
- Check [documentation](docs/)
|
|
388
|
+
- Review existing [issues](https://github.com/eddiesanjuan/markupr/issues)
|
|
389
|
+
|
|
390
|
+
Thank you for contributing to markupr!
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Eddie San Juan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|