- Add "Requires Session" column to Tab Menu table with availability conditions
- Add missing tab menu actions: Export as HTML, Publish as GitHub Gist, Move to First/Last Position
- Fix Tab Export section to reference "Export as HTML" instead of "Context: Copy to Clipboard"
- Change "Right-click" to "Hover over" in three sections (hover overlay, not right-click menu)
- Correct Command Palette labels to match actual QuickActionsModal implementation
- Document alternative sharing options (Copy to Clipboard, Publish as GitHub Gist)
- Changed "Appearance: Font size, UI density" to "Themes" (there is no
Appearance tab - themes have their own tab, fonts are in General)
- Changed "SSH Remotes" to "SSH Hosts" to match actual tab name
- Updated General tab description to include all settings (font family,
terminal width, log buffer, shell config, stats, document graph, etc.)
Verified accurate: storage paths, cross-device sync, sleep prevention,
notifications, and pre-release channel sections.
- Added short flags -g (list agents) and -a (list playbooks) that were
missing from documentation but exist in implementation
- Documented the clean playbooks command with --dry-run option (was
completely undocumented)
- Clarified that list agents --json outputs a JSON array, not JSONL
(different from other list commands)
- Updated JSON event examples to include missing fields: collapsed in
group events, document in document_complete events
- Added loop_complete event type in JSON output examples
- Added success, usageStats, and totalCost fields to JSON examples
- Changed "Auto-Save" section to "Saving Documents" since documents do NOT
auto-save after inactivity - manual save via Cmd+S or Save button is required
- Corrected claim that documents "auto-save immediately when switching" -
switching actually discards unsaved changes
- Added note warning users to save before switching documents
- Added keyboard shortcut Cmd+Shift+E / Ctrl+Shift+E for toggling Expanded Editor
(was only documenting the click method)
All other content verified as accurate against source code:
- Cmd+Shift+1 opens Auto Run tab (shortcuts.ts:21)
- Reset on Completion format: {TASK}-{timestamp}-loop-{N}.md (autorun.ts:864)
- Session isolation, environment variables, wizard features all accurate
Added security validation to reject external document URLs from non-GitHub
domains. This prevents SSRF attacks and data exfiltration by ensuring
external document URLs only come from trusted GitHub domains:
- github.com, www.github.com
- raw.githubusercontent.com (raw file content)
- user-images.githubusercontent.com (user uploads)
- camo.githubusercontent.com (image proxy)
The validation is applied in both validateContributionParams() and the
symphony:startContribution handler to ensure complete coverage.
Added integration test to verify non-GitHub domain URLs are rejected.
Added test case to verify that document paths containing embedded traversal
sequences like `foo/../../../etc/passwd` are properly rejected, complementing
the existing path traversal tests for direct `../` and absolute paths.
Add 4 new integration tests covering PR status checking edge cases:
- Test checking status of PR that was force-merged
- Test checking status of PR that was reverted
- Test checking status of deleted repository
- Test checking status when GitHub API is down
All tests verify the symphony:checkPRStatuses handler correctly handles
GitHub API responses for merged PRs, API errors (404, 503), and properly
updates state with merge status information.
Added 5 integration tests for state edge cases:
- Maximum contributions (100+) handling and pagination
- Stats overflow handling for large token counts
- Streak calculation across year boundary (Dec 31 -> Jan 1)
- Streak calculation with timezone edge cases
- Concurrent state updates without file corruption
Added two new test cases covering git hooks that can modify commits:
1. 'should handle git hooks that modify commits':
- Pre-push hook rejection with custom message
- Hook that successfully modifies commits (e.g., auto-signing)
- Verifies both failure and success scenarios
2. 'should handle pre-receive hook that rejects based on commit content':
- Simulates GitGuardian-style secret scanning rejection
- Verifies proper error handling for content-based rejections
Tests cover common scenarios where server-side hooks reject pushes due to:
- Commit message format requirements
- Secret detection
- Content policy violations
Add two tests covering scenarios where git push fails due to remote branch conflicts:
1. Test "should handle push when remote branch exists with different content"
- Tests non-fast-forward rejection when local branch is behind remote
- Simulates the common scenario where someone else pushed to the same branch
2. Test "should handle push failure due to remote branch force-push (fetch-first)"
- Tests the scenario when remote history has been rewritten
- Ensures proper error handling when remote contains work not present locally
Both tests verify that createDraftPR fails gracefully with appropriate error messages
when push operations encounter branch divergence.
Add two integration tests to verify correct handling of issue bodies at
and above the MAX_BODY_SIZE limit (1MB):
1. Test issue body at exactly MAX_BODY_SIZE - Verifies document paths at
the start are parsed correctly when body is exactly 1,048,576 bytes
2. Test issue body slightly over MAX_BODY_SIZE - Verifies document paths
at start are found while paths past the truncation point are dropped,
and parsing completes without error or hanging
Create comprehensive integration tests for Symphony IPC handlers that:
- Mock only external services (GitHub API via fetch, git/gh CLI via execFileNoThrow)
- Use real file system operations with temporary directories for test isolation
- Test full contribution workflow: start → update status → complete
- Verify state persistence across handler registrations
- Test cache behavior and expiration (registry and issues cache)
- Cover edge cases: unicode repo names, encoded paths, concurrent contributions
- Validate network error handling (timeouts, rate limits, 404s)
- Test git operation failures (clone to existing dir, branch exists, PR exists)
- Verify security: path traversal prevention, URL validation (HTTPS only, GitHub only)
- Include performance tests for pathological regex input
Each test runs in an isolated temp directory to prevent cross-test contamination.
All 22 integration tests pass alongside the existing 188 unit tests.
- Create test file with proper mocks for fs/promises, execFileNoThrow, logger, and fetch
- Add 62 tests covering all Symphony Runner service functions:
- cloneRepo: shallow clone with --depth=1
- createBranch: checkout -b with correct working directory
- configureGitUser: user.name and user.email configuration
- createEmptyCommit: --allow-empty flag with custom message
- pushBranch: push with -u origin
- createDraftPR: gh pr create --draft with issue reference
- downloadFile: fetch and write buffer for external documents
- setupAutoRunDocs: directory creation, external/internal docs handling
- startContribution: full workflow integration with cleanup on failure
- finalizeContribution: commit, push, mark PR ready, update body
- cancelContribution: close PR with --delete-branch, cleanup options
- All 62 tests passing
- Add 8 tests for symphony:fetchDocumentContent handler
- URL validation tests for github.com, raw.githubusercontent.com, objects.githubusercontent.com
- Tests for rejecting non-GitHub domains, HTTP protocol, and invalid URLs
- Tests for fetch behavior including document content retrieval and error handling
- Add 3 tests for checkGhAuthentication via symphony:startContribution
- Test successful auth status
- Test not logged in scenario
- Test gh CLI not installed scenario
- Add 4 tests for getDefaultBranch via symphony:createDraftPR
- Test symbolic-ref branch detection
- Test fallback to main branch
- Test fallback to master branch
- Test default to main when detection fails
Implemented 10 comprehensive test cases for the symphony:createDraftPR handler:
- Metadata reading from disk and error handling when metadata not found
- Existing PR handling (returns existing PR info if already created)
- gh CLI authentication check
- Commit counting on branch vs base branch
- No-commit scenarios (returns success without PR when no commits exist)
- PR creation workflow (push branch, create draft PR)
- Metadata updates (prCreated, draftPrNumber, draftPrUrl)
- Event broadcasting (symphony:prCreated)
- Return value verification
Tests are organized into 7 describe blocks covering all aspects of the
deferred PR creation workflow.
Added comprehensive tests for the symphony:checkPRStatuses handler:
- History entry checking: tests for filtering entries without wasMerged flag,
GitHub API calls, merge detection, timestamp setting, and stat updates
- Active contribution checking: tests for ready_for_review status filtering,
moving merged contributions to history
- Error handling: graceful handling of GitHub API errors
- Broadcast behavior: symphony:updated event broadcasting
- Summary return values: checked, merged, closed counts
All 129 tests pass.
Add comprehensive test coverage for symphony:complete and symphony:cancel IPC handlers:
symphony:complete tests:
- Contribution lookup validation (not found, ID mismatch)
- Draft PR validation (missing PR number or URL)
- PR operations via gh CLI (marking as ready, handling failures)
- PR comment posting with contribution stats
- Using provided stats over stored values
- State transitions (moving from active to history)
- Contributor stats updates (totals, documents, tasks, tokens, time, cost)
- Repository tracking (adding new repos, deduplication)
- Streak calculations (same day, consecutive day, gap reset, longestStreak)
- Return value verification (prUrl, prNumber on success)
- Broadcast verification
symphony:cancel tests:
- Contribution removal from active list
- Local directory cleanup behavior (cleanup=true/false)
- Graceful handling of cleanup errors
- Return value verification (cancelled:false when not found)
- Broadcast verification after cancellation
Total: 20 new tests (118 tests in symphony.test.ts)
Adds comprehensive test coverage for the symphony:updateStatus IPC handler:
- Status field updates (changing to paused, completing)
- Partial progress updates (preserving unchanged fields)
- Partial token usage updates (preserving unchanged fields)
- timeSpent updates
- draftPrNumber and draftPrUrl updates
- Error field updates
- Proper handling when contribution not found (returns updated:false)
- Broadcast verification after successful updates
Add comprehensive test coverage for the symphony:registerActive IPC handler:
- Test new active contribution entry creation with all fields
- Test duplicate contribution detection and skipping
- Test initialization of progress and token usage to zero
- Test broadcast update after successful registration
- Issue cards display clickable PR links, authors, and draft badges 🔗
- Added persistent “active contribution” registration when sessions start 🧾
- Active contributions store PR number/URL once first commit creates PR 🧩
- “Complete contribution” now blocked until a draft PR exists 🛑
- New PR status checker marks merged/closed work and updates history 🔄
- Active tab adds “Check PR Status” refresh with status feedback 🧭
- Stats now include live in-progress contribution tokens, time, cost totals 📈
- Contributor stats auto-poll every five seconds for real-time updates ⏱️
- Auto-run documents sorted using natural numeric ordering for sanity 🧮
- Introduced `DocumentReference` objects with name, path, and external flag 🧩
- Smarter issue parsing extracts markdown `.md` links into downloadable docs 🔍
- Dedupes documents by filename, preferring external attachments when present 🧠
- Added 1MB issue-body parsing cap to prevent performance blowups 🚧
- Path traversal checks now apply only to repo-relative document references 🛡️
- Auto Run Docs setup can download external files directly via `fetch` 🌐
- Switched runner file ops to Node `fs`, replacing shell `cp/rm` usage 🧰
- Runner now configures git user.name/email to ensure commits always work 🪪
- Failure paths now clean up local repos automatically to reduce clutter 🧹
- History virtualization now measures elements directly for more accurate sizing 📏
- Marketplace and Symphony modals widened for a roomier workflow view 🖥️
Add Symphony registry documentation and contribution runner service:
- docs/SYMPHONY_REGISTRY.md: Registry documentation explaining how maintainers register repos
- docs/SYMPHONY_ISSUES.md: Guide for creating Symphony issues with Auto Run documents
- src/main/services/symphony-runner.ts: Service orchestrating contributions with draft PR claiming
- symphony-registry.json: Sample registry with Maestro as the first registered project
The runner service handles the full contribution flow: clone, branch, push, draft PR creation, Auto Run setup, finalization, and cancellation.
Implements all Symphony modal entry points and app integration:
- Add keyboard shortcut ⌘⇧Y to open Symphony modal (shortcuts.ts)
- Add handler in useMainKeyboardHandler.ts using ModalContext pattern
- Integrate SymphonyModal into App.tsx with contribution started handler
- Add Symphony to Cmd+K command palette (QuickActionsModal.tsx)
- Add Symphony to hamburger menu (SessionList.tsx)
- Add symphonyMetadata to Session type for contribution tracking
- Add IPC handlers: symphony:cloneRepo and symphony:startContribution
- Add preload bindings and TypeScript types for Symphony session API
- Wire up contribution event listener to update session state with PR info
The optional Symphony session group feature was skipped - sessions work
without a dedicated group and can be organized manually if needed.
- useSymphony: Primary hook for registry, issues, and contribution management
- useContribution: Single contribution state and action management
- useContributorStats: Stats and achievements tracking with formatted display
- index.ts: Central exports for all Symphony hooks
Hooks follow established patterns from useMarketplace and Usage Dashboard,
including debounced real-time updates, proper undefined handling for IPC
responses, and type-safe integration with the symphony IPC handlers.
* docs: add git hash display and configurable dev server port
## CHANGES
- Add `VITE_PORT` env variable to configure dev server port
- Display git commit hash in About modal next to version
- Add `__GIT_HASH__` build-time constant to both Vite configs
- Document running multiple Maestro instances with git worktrees
- Update CONTRIBUTING.md with parallel development instructions
* feat: add configurable ports for dev servers
- Allow VITE_PORT to configure main dev server port
- Update main window to load from configurable port
- Enable VITE_WEB_PORT for web interface dev server
- Add note in CONTRIBUTING.md about port configuration
- Log port usage in development mode
* docs: update CONTRIBUTING.md section and fix React DevTools script initialization
## CHANGES
- Rename "Linting" section to "Linting & Pre-commit Hooks" in table of contents
- Move script variable declaration outside conditional block
- Fix React DevTools script initialization order in index.html
* chore: update `.vscode/settings.json` with new markdownlint config
* fix: disable biome linting. Project uses ESLint
* chore: Update baseline-browser-mapping (>2 months old, warning message on "npm run build:web")
* chore: add .vscode/ to gitignore
* chore: fix gitignore to ignore .cscode/* files properly
* fix
* chore: stop tracking .vscode/ files, respect gitignore
Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
- Add merged manifest lookup for local playbook imports
- Read local manifest and merge with official during import
- Display "Local" badge for custom playbooks in marketplace UI
- Add source badge in playbook detail view sidebar
- Support filesystem paths (absolute and tilde) for local playbooks
- Add comprehensive tests for local playbook import scenarios
- Add tests for merged manifest lookup and source tagging
- Fix mock file reads to handle local manifest ENOENT cases
- Agent Usage chart now tracks Maestro sessions, not providers 🎯
- Map session IDs to friendly names in charts and legends 🏷️
- Limit Agent Usage chart to top 10 sessions by queries 🔟
- Toggle Agent Usage chart between query counts and time metrics ⏱️
- Auto Run queries now record stats with accurate `source: auto` 🤖
- Interactive queries detect Auto Run state to tag stats correctly 🧠
- Smarter cumulative token normalization avoids inflated first-event context % 🛡️
- About modal shows dev commit hash alongside app version 🔍
- Group chat history summaries now strip markdown for cleaner reading 🧹
- Replace any[] with proper types in settings.ts (StoredSession, Group).
- Replace console.log with logger service in process.ts.
- Add consistent debug logging across remote IPC handlers.
- Remove all console.log/console.error statements in favor of logger
- Fix potential race condition in TTS queue by setting isTtsProcessing
flag before checking queue length
- Add comprehensive JSDoc comment explaining TTS_MIN_DELAY_MS (15s) rationale
- Fix type guard for stdin error handling with proper type checks