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,47 @@
|
|
|
1
|
+
# Review markupr Session
|
|
2
|
+
|
|
3
|
+
You are reviewing a markupr session -- a structured feedback report with voice transcription and screenshots captured while a developer reviewed their application.
|
|
4
|
+
|
|
5
|
+
## Instructions
|
|
6
|
+
|
|
7
|
+
1. **Read the session directory** at: $ARGUMENTS
|
|
8
|
+
- Read `feedback-report.md` for the full structured feedback with FB-XXX items
|
|
9
|
+
- Read `metadata.json` for session context (source app, duration, environment)
|
|
10
|
+
- Read each screenshot in `screenshots/` that is referenced by feedback items -- these are PNG files showing exactly what the user was looking at when they spoke
|
|
11
|
+
- If `session-recording.webm` exists, note its path (video can't be played in CLI but the screenshots provide the visual context)
|
|
12
|
+
|
|
13
|
+
2. **Parse each feedback item** (FB-001, FB-002, etc.) and extract:
|
|
14
|
+
- The severity (Critical / High / Medium / Low) and category (Bug / UX Issue / Suggestion / Performance / Question / General)
|
|
15
|
+
- The transcribed observation (the blockquote under "What Happened")
|
|
16
|
+
- Associated screenshot(s) -- READ the image files to see what the user was looking at
|
|
17
|
+
- The suggested next step from the report
|
|
18
|
+
|
|
19
|
+
3. **Create an action plan** prioritized by severity:
|
|
20
|
+
- **Critical/High items first** -- bugs and broken functionality
|
|
21
|
+
- **Medium items next** -- UX issues and performance problems
|
|
22
|
+
- **Low items last** -- suggestions and enhancements
|
|
23
|
+
|
|
24
|
+
4. **For each item, determine the action type:**
|
|
25
|
+
- Code fix -- identify the file and make the change
|
|
26
|
+
- UI change -- adjust layout, styling, or component behavior
|
|
27
|
+
- Documentation -- update docs or add comments
|
|
28
|
+
- Investigation needed -- reproduce first, then fix
|
|
29
|
+
- Future enhancement -- note for backlog, no immediate action
|
|
30
|
+
|
|
31
|
+
5. **Work through items systematically:**
|
|
32
|
+
- State which FB-XXX item you're addressing
|
|
33
|
+
- Reference the screenshot to ground your understanding in what the user saw
|
|
34
|
+
- Make the code change or explain why it should be deferred
|
|
35
|
+
- After each fix, note: "FB-XXX addressed"
|
|
36
|
+
|
|
37
|
+
6. **After all items are processed**, provide a summary:
|
|
38
|
+
- Items addressed with code changes
|
|
39
|
+
- Items deferred with reasoning
|
|
40
|
+
- Patterns or architectural concerns noticed across multiple feedback items
|
|
41
|
+
|
|
42
|
+
## Important Notes
|
|
43
|
+
- Screenshots are visual evidence -- always read them to understand context before acting
|
|
44
|
+
- The user's spoken words (in blockquotes) capture intent and nuance that the severity/category labels alone may miss
|
|
45
|
+
- Treat "Suggested Next Step" as guidance, not a strict instruction -- use your judgment
|
|
46
|
+
- If the report has 0 feedback items, tell the user the session captured no actionable feedback
|
|
47
|
+
- The session directory path is typically copied to the clipboard by markupr when a session ends
|
package/.eslintrc.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"root": true,
|
|
3
|
+
"parser": "@typescript-eslint/parser",
|
|
4
|
+
"plugins": ["@typescript-eslint", "react", "react-hooks"],
|
|
5
|
+
"extends": [
|
|
6
|
+
"eslint:recommended",
|
|
7
|
+
"plugin:@typescript-eslint/recommended",
|
|
8
|
+
"plugin:react/recommended",
|
|
9
|
+
"plugin:react-hooks/recommended"
|
|
10
|
+
],
|
|
11
|
+
"parserOptions": {
|
|
12
|
+
"ecmaVersion": 2022,
|
|
13
|
+
"sourceType": "module",
|
|
14
|
+
"ecmaFeatures": {
|
|
15
|
+
"jsx": true
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"settings": {
|
|
19
|
+
"react": {
|
|
20
|
+
"version": "detect"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"env": {
|
|
24
|
+
"browser": true,
|
|
25
|
+
"node": true,
|
|
26
|
+
"es2022": true
|
|
27
|
+
},
|
|
28
|
+
"rules": {
|
|
29
|
+
"react/react-in-jsx-scope": "off",
|
|
30
|
+
"@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }],
|
|
31
|
+
"@typescript-eslint/explicit-function-return-type": "off",
|
|
32
|
+
"@typescript-eslint/no-explicit-any": "warn"
|
|
33
|
+
},
|
|
34
|
+
"ignorePatterns": ["dist", "node_modules", "release"]
|
|
35
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# CODEOWNERS for markupr (low-noise)
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# Intentionally scoped to runtime/security-critical areas.
|
|
5
|
+
# Dependency/workflow/docs-only PRs are not auto-assigned by CODEOWNERS.
|
|
6
|
+
|
|
7
|
+
# Core runtime
|
|
8
|
+
/src/main/ @eddiesanjuan
|
|
9
|
+
/src/renderer/ @eddiesanjuan
|
|
10
|
+
/src/preload/ @eddiesanjuan
|
|
11
|
+
/src/shared/ @eddiesanjuan
|
|
12
|
+
|
|
13
|
+
# Distribution and security-sensitive files
|
|
14
|
+
electron-builder.yml @eddiesanjuan
|
|
15
|
+
/build/entitlements*.plist @eddiesanjuan
|
|
16
|
+
/scripts/notarize.cjs @eddiesanjuan
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ko_fi: eddiesanjuan
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug Report
|
|
3
|
+
about: Report a bug to help us improve markupr
|
|
4
|
+
title: '[Bug] '
|
|
5
|
+
labels: bug
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Description
|
|
10
|
+
|
|
11
|
+
A clear and concise description of the bug.
|
|
12
|
+
|
|
13
|
+
## Steps to Reproduce
|
|
14
|
+
|
|
15
|
+
1. Go to '...'
|
|
16
|
+
2. Click on '...'
|
|
17
|
+
3. See error '...'
|
|
18
|
+
|
|
19
|
+
## Expected Behavior
|
|
20
|
+
|
|
21
|
+
What you expected to happen.
|
|
22
|
+
|
|
23
|
+
## Actual Behavior
|
|
24
|
+
|
|
25
|
+
What actually happened.
|
|
26
|
+
|
|
27
|
+
## Screenshots
|
|
28
|
+
|
|
29
|
+
If applicable, add screenshots to help explain the problem.
|
|
30
|
+
|
|
31
|
+
## Environment
|
|
32
|
+
|
|
33
|
+
- **OS**: [e.g., macOS 14.0, Windows 11]
|
|
34
|
+
- **markupr Version**: [e.g., 0.4.0]
|
|
35
|
+
- **Installation Method**: [e.g., DMG, installer, AppImage]
|
|
36
|
+
|
|
37
|
+
## Logs
|
|
38
|
+
|
|
39
|
+
<details>
|
|
40
|
+
<summary>Debug Logs</summary>
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
Paste logs here (Settings > Advanced > Debug Mode to enable)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
</details>
|
|
47
|
+
|
|
48
|
+
## Additional Context
|
|
49
|
+
|
|
50
|
+
Add any other context about the problem here.
|
|
51
|
+
|
|
52
|
+
## Checklist
|
|
53
|
+
|
|
54
|
+
- [ ] I have searched existing issues to ensure this is not a duplicate
|
|
55
|
+
- [ ] I have tried the latest version of markupr
|
|
56
|
+
- [ ] I have included all relevant information above
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature Request
|
|
3
|
+
about: Suggest a new feature or improvement for markupr
|
|
4
|
+
title: '[Feature] '
|
|
5
|
+
labels: enhancement
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Problem Statement
|
|
10
|
+
|
|
11
|
+
A clear description of the problem you're trying to solve.
|
|
12
|
+
|
|
13
|
+
**Example**: "I'm always frustrated when I have to manually take screenshots because..."
|
|
14
|
+
|
|
15
|
+
## Proposed Solution
|
|
16
|
+
|
|
17
|
+
Describe the feature you'd like to see implemented.
|
|
18
|
+
|
|
19
|
+
## Alternatives Considered
|
|
20
|
+
|
|
21
|
+
What other approaches have you thought about?
|
|
22
|
+
|
|
23
|
+
## Use Case
|
|
24
|
+
|
|
25
|
+
How would you use this feature in your workflow?
|
|
26
|
+
|
|
27
|
+
**Example workflow**:
|
|
28
|
+
1. Start recording feedback session
|
|
29
|
+
2. [Your feature would help here]
|
|
30
|
+
3. Export session
|
|
31
|
+
|
|
32
|
+
## Mockups / Examples
|
|
33
|
+
|
|
34
|
+
If applicable, add mockups, wireframes, or examples from other tools.
|
|
35
|
+
|
|
36
|
+
## Additional Context
|
|
37
|
+
|
|
38
|
+
- How often would you use this feature?
|
|
39
|
+
- Would this benefit other users?
|
|
40
|
+
- Are there any potential downsides?
|
|
41
|
+
|
|
42
|
+
## Priority
|
|
43
|
+
|
|
44
|
+
How important is this feature to you?
|
|
45
|
+
|
|
46
|
+
- [ ] Nice to have - Would improve my workflow
|
|
47
|
+
- [ ] Important - Significantly impacts my productivity
|
|
48
|
+
- [ ] Critical - Can't use markupr effectively without it
|
|
49
|
+
|
|
50
|
+
## Checklist
|
|
51
|
+
|
|
52
|
+
- [ ] I have searched existing issues to ensure this is not a duplicate
|
|
53
|
+
- [ ] I have checked the roadmap/documentation for planned features
|
|
54
|
+
- [ ] I am willing to help implement this feature (optional)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
## Description
|
|
2
|
+
|
|
3
|
+
Brief description of what this PR does.
|
|
4
|
+
|
|
5
|
+
## Related Issues
|
|
6
|
+
|
|
7
|
+
Fixes #(issue number)
|
|
8
|
+
|
|
9
|
+
<!-- Or use: Closes #, Relates to #, Part of # -->
|
|
10
|
+
|
|
11
|
+
## Type of Change
|
|
12
|
+
|
|
13
|
+
- [ ] Bug fix (non-breaking change that fixes an issue)
|
|
14
|
+
- [ ] New feature (non-breaking change that adds functionality)
|
|
15
|
+
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
|
|
16
|
+
- [ ] Documentation update
|
|
17
|
+
- [ ] Refactoring (no functional changes)
|
|
18
|
+
- [ ] Performance improvement
|
|
19
|
+
- [ ] Test coverage improvement
|
|
20
|
+
- [ ] Build/CI configuration change
|
|
21
|
+
|
|
22
|
+
## Changes Made
|
|
23
|
+
|
|
24
|
+
<!-- List the specific changes made in this PR -->
|
|
25
|
+
|
|
26
|
+
-
|
|
27
|
+
-
|
|
28
|
+
-
|
|
29
|
+
|
|
30
|
+
## Screenshots / Videos
|
|
31
|
+
|
|
32
|
+
<!-- If applicable, add screenshots or videos demonstrating the changes -->
|
|
33
|
+
|
|
34
|
+
| Before | After |
|
|
35
|
+
|--------|-------|
|
|
36
|
+
| | |
|
|
37
|
+
|
|
38
|
+
## Testing
|
|
39
|
+
|
|
40
|
+
### How to Test
|
|
41
|
+
|
|
42
|
+
1.
|
|
43
|
+
2.
|
|
44
|
+
3.
|
|
45
|
+
|
|
46
|
+
### Test Coverage
|
|
47
|
+
|
|
48
|
+
- [ ] Unit tests added/updated
|
|
49
|
+
- [ ] Integration tests added/updated
|
|
50
|
+
- [ ] Manual testing completed
|
|
51
|
+
|
|
52
|
+
### Platforms Tested
|
|
53
|
+
|
|
54
|
+
- [ ] macOS
|
|
55
|
+
- [ ] Windows
|
|
56
|
+
- [ ] Linux
|
|
57
|
+
|
|
58
|
+
## Checklist
|
|
59
|
+
|
|
60
|
+
### Code Quality
|
|
61
|
+
|
|
62
|
+
- [ ] My code follows the project's style guidelines
|
|
63
|
+
- [ ] I have performed a self-review of my code
|
|
64
|
+
- [ ] I have commented my code, particularly in hard-to-understand areas
|
|
65
|
+
- [ ] I have made corresponding changes to the documentation
|
|
66
|
+
|
|
67
|
+
### Testing
|
|
68
|
+
|
|
69
|
+
- [ ] All tests pass locally (`npm test`)
|
|
70
|
+
- [ ] Linting passes (`npm run lint`)
|
|
71
|
+
- [ ] Type checking passes (`npm run typecheck`)
|
|
72
|
+
- [ ] The app builds successfully (`npm run build`)
|
|
73
|
+
|
|
74
|
+
### Pre-merge
|
|
75
|
+
|
|
76
|
+
- [ ] My changes generate no new warnings
|
|
77
|
+
- [ ] Any dependent changes have been merged and published
|
|
78
|
+
- [ ] I have updated the CHANGELOG.md (if applicable)
|
|
79
|
+
|
|
80
|
+
## Breaking Changes
|
|
81
|
+
|
|
82
|
+
<!-- If this PR introduces breaking changes, describe them here and what users need to do -->
|
|
83
|
+
|
|
84
|
+
N/A
|
|
85
|
+
|
|
86
|
+
## Additional Notes
|
|
87
|
+
|
|
88
|
+
<!-- Any additional information that reviewers should know -->
|
|
89
|
+
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# Dependabot Configuration for markupr
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# Low-noise defaults:
|
|
5
|
+
# - Monthly cadence
|
|
6
|
+
# - Tight PR caps
|
|
7
|
+
# - Aggressive grouping (minor/patch + majors grouped)
|
|
8
|
+
# =============================================================================
|
|
9
|
+
|
|
10
|
+
version: 2
|
|
11
|
+
|
|
12
|
+
updates:
|
|
13
|
+
- package-ecosystem: "npm"
|
|
14
|
+
directory: "/"
|
|
15
|
+
schedule:
|
|
16
|
+
interval: "monthly"
|
|
17
|
+
day: "monday"
|
|
18
|
+
time: "06:00"
|
|
19
|
+
timezone: "America/Chicago"
|
|
20
|
+
open-pull-requests-limit: 2
|
|
21
|
+
commit-message:
|
|
22
|
+
prefix: "deps"
|
|
23
|
+
include: "scope"
|
|
24
|
+
labels:
|
|
25
|
+
- "dependencies"
|
|
26
|
+
- "npm"
|
|
27
|
+
allow:
|
|
28
|
+
- dependency-type: "direct"
|
|
29
|
+
groups:
|
|
30
|
+
npm-minor-patch:
|
|
31
|
+
patterns:
|
|
32
|
+
- "*"
|
|
33
|
+
update-types:
|
|
34
|
+
- "minor"
|
|
35
|
+
- "patch"
|
|
36
|
+
npm-major:
|
|
37
|
+
patterns:
|
|
38
|
+
- "*"
|
|
39
|
+
update-types:
|
|
40
|
+
- "major"
|
|
41
|
+
ignore:
|
|
42
|
+
- dependency-name: "electron"
|
|
43
|
+
update-types: ["version-update:semver-major"]
|
|
44
|
+
- dependency-name: "react"
|
|
45
|
+
update-types: ["version-update:semver-major"]
|
|
46
|
+
- dependency-name: "react-dom"
|
|
47
|
+
update-types: ["version-update:semver-major"]
|
|
48
|
+
|
|
49
|
+
- package-ecosystem: "github-actions"
|
|
50
|
+
directory: "/"
|
|
51
|
+
schedule:
|
|
52
|
+
interval: "monthly"
|
|
53
|
+
day: "monday"
|
|
54
|
+
time: "06:00"
|
|
55
|
+
timezone: "America/Chicago"
|
|
56
|
+
open-pull-requests-limit: 1
|
|
57
|
+
commit-message:
|
|
58
|
+
prefix: "ci"
|
|
59
|
+
include: "scope"
|
|
60
|
+
labels:
|
|
61
|
+
- "dependencies"
|
|
62
|
+
- "github-actions"
|
|
63
|
+
groups:
|
|
64
|
+
github-actions-all:
|
|
65
|
+
patterns:
|
|
66
|
+
- "*"
|
|
67
|
+
update-types:
|
|
68
|
+
- "major"
|
|
69
|
+
- "minor"
|
|
70
|
+
- "patch"
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# markupr CI Pipeline
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# Runs on every push to main and pull request
|
|
5
|
+
# Matrix build for macOS and Windows with comprehensive validation
|
|
6
|
+
# =============================================================================
|
|
7
|
+
|
|
8
|
+
name: CI
|
|
9
|
+
|
|
10
|
+
on:
|
|
11
|
+
push:
|
|
12
|
+
branches: [main]
|
|
13
|
+
pull_request:
|
|
14
|
+
branches: [main]
|
|
15
|
+
|
|
16
|
+
# Cancel in-progress runs for the same branch
|
|
17
|
+
concurrency:
|
|
18
|
+
group: ci-${{ github.ref }}
|
|
19
|
+
cancel-in-progress: true
|
|
20
|
+
|
|
21
|
+
env:
|
|
22
|
+
NODE_VERSION: '20'
|
|
23
|
+
|
|
24
|
+
jobs:
|
|
25
|
+
# ===========================================================================
|
|
26
|
+
# Lint & Type Check (fast feedback)
|
|
27
|
+
# ===========================================================================
|
|
28
|
+
validate:
|
|
29
|
+
name: Lint & Type Check
|
|
30
|
+
runs-on: ubuntu-latest
|
|
31
|
+
steps:
|
|
32
|
+
- name: Checkout repository
|
|
33
|
+
uses: actions/checkout@v6
|
|
34
|
+
|
|
35
|
+
- name: Setup Node.js
|
|
36
|
+
uses: actions/setup-node@v6
|
|
37
|
+
with:
|
|
38
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
39
|
+
cache: 'npm'
|
|
40
|
+
|
|
41
|
+
- name: Install dependencies
|
|
42
|
+
run: npm ci
|
|
43
|
+
|
|
44
|
+
- name: Run ESLint
|
|
45
|
+
run: npm run lint
|
|
46
|
+
|
|
47
|
+
- name: Run TypeScript type check
|
|
48
|
+
run: npm run typecheck
|
|
49
|
+
|
|
50
|
+
- name: Audit production dependencies
|
|
51
|
+
run: npm audit --omit=dev --audit-level=high
|
|
52
|
+
|
|
53
|
+
# ===========================================================================
|
|
54
|
+
# Test Suite
|
|
55
|
+
# ===========================================================================
|
|
56
|
+
test:
|
|
57
|
+
name: Test Suite
|
|
58
|
+
runs-on: ubuntu-latest
|
|
59
|
+
needs: validate
|
|
60
|
+
steps:
|
|
61
|
+
- name: Checkout repository
|
|
62
|
+
uses: actions/checkout@v6
|
|
63
|
+
|
|
64
|
+
- name: Setup Node.js
|
|
65
|
+
uses: actions/setup-node@v6
|
|
66
|
+
with:
|
|
67
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
68
|
+
cache: 'npm'
|
|
69
|
+
|
|
70
|
+
- name: Install dependencies
|
|
71
|
+
run: npm ci
|
|
72
|
+
|
|
73
|
+
- name: Run tests with coverage
|
|
74
|
+
run: npm run test:ci
|
|
75
|
+
|
|
76
|
+
- name: Upload coverage reports
|
|
77
|
+
uses: codecov/codecov-action@v5
|
|
78
|
+
with:
|
|
79
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
80
|
+
files: ./coverage/lcov.info
|
|
81
|
+
fail_ci_if_error: false
|
|
82
|
+
verbose: true
|
|
83
|
+
|
|
84
|
+
# ===========================================================================
|
|
85
|
+
# Build Matrix (macOS & Windows)
|
|
86
|
+
# ===========================================================================
|
|
87
|
+
build:
|
|
88
|
+
name: Build (${{ matrix.os }})
|
|
89
|
+
runs-on: ${{ matrix.os }}
|
|
90
|
+
needs: validate
|
|
91
|
+
strategy:
|
|
92
|
+
fail-fast: false
|
|
93
|
+
matrix:
|
|
94
|
+
os: [macos-latest, windows-latest]
|
|
95
|
+
include:
|
|
96
|
+
- os: macos-latest
|
|
97
|
+
artifact-name: markupr-macos
|
|
98
|
+
build-path: release/*.dmg
|
|
99
|
+
- os: windows-latest
|
|
100
|
+
artifact-name: markupr-windows
|
|
101
|
+
build-path: release/*.exe
|
|
102
|
+
|
|
103
|
+
steps:
|
|
104
|
+
- name: Checkout repository
|
|
105
|
+
uses: actions/checkout@v6
|
|
106
|
+
|
|
107
|
+
- name: Setup Node.js
|
|
108
|
+
uses: actions/setup-node@v6
|
|
109
|
+
with:
|
|
110
|
+
node-version: ${{ env.NODE_VERSION }}
|
|
111
|
+
cache: 'npm'
|
|
112
|
+
|
|
113
|
+
# Cache node_modules for faster builds
|
|
114
|
+
- name: Cache node_modules
|
|
115
|
+
uses: actions/cache@v5
|
|
116
|
+
id: cache-node-modules
|
|
117
|
+
with:
|
|
118
|
+
path: node_modules
|
|
119
|
+
key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
|
|
120
|
+
restore-keys: |
|
|
121
|
+
${{ runner.os }}-node-
|
|
122
|
+
|
|
123
|
+
- name: Install dependencies
|
|
124
|
+
if: steps.cache-node-modules.outputs.cache-hit != 'true'
|
|
125
|
+
run: npm ci
|
|
126
|
+
|
|
127
|
+
# Cache Electron binaries
|
|
128
|
+
- name: Cache Electron
|
|
129
|
+
uses: actions/cache@v5
|
|
130
|
+
with:
|
|
131
|
+
path: |
|
|
132
|
+
~/Library/Caches/electron
|
|
133
|
+
~/AppData/Local/electron/Cache
|
|
134
|
+
~/.cache/electron
|
|
135
|
+
key: ${{ runner.os }}-electron-${{ hashFiles('package-lock.json') }}
|
|
136
|
+
restore-keys: |
|
|
137
|
+
${{ runner.os }}-electron-
|
|
138
|
+
|
|
139
|
+
- name: Build application
|
|
140
|
+
run: npm run build
|
|
141
|
+
|
|
142
|
+
# Build unsigned packages for CI validation (--publish never to skip GH_TOKEN requirement)
|
|
143
|
+
- name: Package application (unsigned)
|
|
144
|
+
shell: bash
|
|
145
|
+
continue-on-error: ${{ matrix.os == 'windows-latest' }}
|
|
146
|
+
run: |
|
|
147
|
+
if [ "${{ matrix.os }}" = "macos-latest" ]; then
|
|
148
|
+
CSC_IDENTITY_AUTO_DISCOVERY=false npx electron-builder --mac --publish never --config electron-builder.yml
|
|
149
|
+
else
|
|
150
|
+
npx electron-builder --win --publish never --config electron-builder.yml
|
|
151
|
+
fi
|
|
152
|
+
env:
|
|
153
|
+
CSC_IDENTITY_AUTO_DISCOVERY: false
|
|
154
|
+
|
|
155
|
+
- name: Upload build artifacts
|
|
156
|
+
uses: actions/upload-artifact@v6
|
|
157
|
+
with:
|
|
158
|
+
name: ${{ matrix.artifact-name }}
|
|
159
|
+
path: |
|
|
160
|
+
release/*.dmg
|
|
161
|
+
release/*.zip
|
|
162
|
+
release/*.exe
|
|
163
|
+
release/*.msi
|
|
164
|
+
if-no-files-found: warn
|
|
165
|
+
retention-days: 7
|
|
166
|
+
|
|
167
|
+
# ===========================================================================
|
|
168
|
+
# Build Status Summary
|
|
169
|
+
# ===========================================================================
|
|
170
|
+
ci-success:
|
|
171
|
+
name: CI Success
|
|
172
|
+
runs-on: ubuntu-latest
|
|
173
|
+
needs: [validate, test, build]
|
|
174
|
+
if: always()
|
|
175
|
+
steps:
|
|
176
|
+
- name: Check all jobs passed
|
|
177
|
+
run: |
|
|
178
|
+
if [ "${{ needs.validate.result }}" != "success" ] || \
|
|
179
|
+
[ "${{ needs.test.result }}" != "success" ] || \
|
|
180
|
+
[ "${{ needs.build.result }}" != "success" ]; then
|
|
181
|
+
echo "One or more jobs failed"
|
|
182
|
+
exit 1
|
|
183
|
+
fi
|
|
184
|
+
echo "All CI jobs passed successfully!"
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# GitHub Pages deployment workflow for markupr landing page
|
|
2
|
+
# Automatically deploys site/ to GitHub Pages on push to main
|
|
3
|
+
|
|
4
|
+
name: Deploy Landing Page
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
branches:
|
|
9
|
+
- main
|
|
10
|
+
paths:
|
|
11
|
+
- 'site/**'
|
|
12
|
+
- '.github/workflows/deploy-landing.yml'
|
|
13
|
+
workflow_dispatch:
|
|
14
|
+
|
|
15
|
+
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
|
16
|
+
permissions:
|
|
17
|
+
contents: read
|
|
18
|
+
pages: write
|
|
19
|
+
id-token: write
|
|
20
|
+
|
|
21
|
+
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
|
|
22
|
+
concurrency:
|
|
23
|
+
group: "pages"
|
|
24
|
+
cancel-in-progress: false
|
|
25
|
+
|
|
26
|
+
jobs:
|
|
27
|
+
build:
|
|
28
|
+
runs-on: ubuntu-latest
|
|
29
|
+
steps:
|
|
30
|
+
- name: Checkout
|
|
31
|
+
uses: actions/checkout@v6
|
|
32
|
+
|
|
33
|
+
- name: Setup Pages
|
|
34
|
+
uses: actions/configure-pages@v5
|
|
35
|
+
|
|
36
|
+
- name: Build static site
|
|
37
|
+
run: |
|
|
38
|
+
mkdir -p _site
|
|
39
|
+
|
|
40
|
+
# Copy current landing page source
|
|
41
|
+
cp -r site/* _site/
|
|
42
|
+
|
|
43
|
+
# Generate sitemap
|
|
44
|
+
cat > _site/sitemap.xml << 'EOF'
|
|
45
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
46
|
+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
47
|
+
<url>
|
|
48
|
+
<loc>https://markupr.com/</loc>
|
|
49
|
+
<lastmod>$(date +%Y-%m-%d)</lastmod>
|
|
50
|
+
<changefreq>weekly</changefreq>
|
|
51
|
+
<priority>1.0</priority>
|
|
52
|
+
</url>
|
|
53
|
+
</urlset>
|
|
54
|
+
EOF
|
|
55
|
+
|
|
56
|
+
# Generate robots.txt
|
|
57
|
+
cat > _site/robots.txt << 'EOF'
|
|
58
|
+
User-agent: *
|
|
59
|
+
Allow: /
|
|
60
|
+
Sitemap: https://markupr.com/sitemap.xml
|
|
61
|
+
EOF
|
|
62
|
+
|
|
63
|
+
# Generate 404 page
|
|
64
|
+
cat > _site/404.html << 'EOF'
|
|
65
|
+
<!DOCTYPE html>
|
|
66
|
+
<html lang="en">
|
|
67
|
+
<head>
|
|
68
|
+
<meta charset="UTF-8">
|
|
69
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
70
|
+
<title>404 - Page Not Found | markupr</title>
|
|
71
|
+
<style>
|
|
72
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
73
|
+
body {
|
|
74
|
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
|
|
75
|
+
background: #0F0F1A;
|
|
76
|
+
color: #E2E8F0;
|
|
77
|
+
min-height: 100vh;
|
|
78
|
+
display: flex;
|
|
79
|
+
align-items: center;
|
|
80
|
+
justify-content: center;
|
|
81
|
+
text-align: center;
|
|
82
|
+
padding: 2rem;
|
|
83
|
+
}
|
|
84
|
+
.container { max-width: 500px; }
|
|
85
|
+
h1 { font-size: 6rem; font-weight: 800; color: #6366F1; margin-bottom: 1rem; }
|
|
86
|
+
h2 { font-size: 1.5rem; margin-bottom: 1rem; }
|
|
87
|
+
p { color: #94A3B8; margin-bottom: 2rem; }
|
|
88
|
+
a {
|
|
89
|
+
display: inline-block;
|
|
90
|
+
padding: 1rem 2rem;
|
|
91
|
+
background: linear-gradient(135deg, #6366F1 0%, #8B5CF6 100%);
|
|
92
|
+
color: white;
|
|
93
|
+
text-decoration: none;
|
|
94
|
+
border-radius: 0.5rem;
|
|
95
|
+
font-weight: 600;
|
|
96
|
+
}
|
|
97
|
+
a:hover { transform: translateY(-2px); box-shadow: 0 4px 14px rgba(99, 102, 241, 0.4); }
|
|
98
|
+
</style>
|
|
99
|
+
</head>
|
|
100
|
+
<body>
|
|
101
|
+
<div class="container">
|
|
102
|
+
<h1>404</h1>
|
|
103
|
+
<h2>Page Not Found</h2>
|
|
104
|
+
<p>The page you're looking for doesn't exist or has been moved.</p>
|
|
105
|
+
<a href="/">Back to Home</a>
|
|
106
|
+
</div>
|
|
107
|
+
</body>
|
|
108
|
+
</html>
|
|
109
|
+
EOF
|
|
110
|
+
|
|
111
|
+
echo "Build completed successfully"
|
|
112
|
+
ls -la _site/
|
|
113
|
+
|
|
114
|
+
- name: Upload artifact
|
|
115
|
+
uses: actions/upload-pages-artifact@v4
|
|
116
|
+
with:
|
|
117
|
+
path: '_site'
|
|
118
|
+
|
|
119
|
+
deploy:
|
|
120
|
+
environment:
|
|
121
|
+
name: github-pages
|
|
122
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
123
|
+
runs-on: ubuntu-latest
|
|
124
|
+
needs: build
|
|
125
|
+
steps:
|
|
126
|
+
- name: Deploy to GitHub Pages
|
|
127
|
+
id: deployment
|
|
128
|
+
uses: actions/deploy-pages@v4
|
|
129
|
+
|
|
130
|
+
- name: Output deployment URL
|
|
131
|
+
run: |
|
|
132
|
+
echo "## Deployment Successful! 🚀" >> $GITHUB_STEP_SUMMARY
|
|
133
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
134
|
+
echo "Landing page deployed to: ${{ steps.deployment.outputs.page_url }}" >> $GITHUB_STEP_SUMMARY
|