Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
56c84cb
[Symphony] Start contribution for #197
peterjmorgan Mar 9, 2026
6fcc0c4
MAESTRO: Add prompt-manager.ts for disk-based prompt loading
peterjmorgan Mar 9, 2026
fc18608
MAESTRO: Add extraResources config to bundle core prompts for all pla…
peterjmorgan Mar 9, 2026
675c246
MAESTRO: Add IPC handlers and preload bridge for core prompts API
peterjmorgan Mar 9, 2026
51152bc
MAESTRO: Initialize core prompts at app startup before IPC handlers
peterjmorgan Mar 9, 2026
53ee6d7
MAESTRO: Migrate main process and CLI imports to disk-based prompts
peterjmorgan Mar 9, 2026
645022d
MAESTRO: Migrate renderer prompt imports to disk-based IPC loading
peterjmorgan Mar 9, 2026
182aa5b
MAESTRO: Migrate renderer Part 2 prompt imports to disk-based IPC loa…
peterjmorgan Mar 9, 2026
38b46af
MAESTRO: Add centralized renderer prompt initialization
peterjmorgan Mar 9, 2026
15cb9fb
MAESTRO: Remove legacy build:prompts script and generate-prompts.mjs
peterjmorgan Mar 9, 2026
b780648
MAESTRO: Replace prompts re-exports with PROMPT_IDS constants and mig…
peterjmorgan Mar 9, 2026
9407fae
MAESTRO: Remove src/generated/ from .gitignore after disk-based promp…
peterjmorgan Mar 9, 2026
fdead52
MAESTRO: Add Maestro Prompts tab to Right Bar for browsing and editin…
peterjmorgan Mar 9, 2026
18836c3
MAESTRO: Add Cmd+Shift+2 keyboard shortcut for Maestro Prompts tab
peterjmorgan Mar 9, 2026
6978503
MAESTRO: Add prompt-manager unit tests for disk-based prompts
peterjmorgan Mar 9, 2026
6ca186f
MAESTRO: Add prompt customization documentation to CLAUDE.md and user…
peterjmorgan Mar 9, 2026
b38d4f0
MAESTRO: Clean up outdated migration comment in CLI index
peterjmorgan Mar 9, 2026
8ad893b
MAESTRO: address PR 541 review gaps and harden prompt loading
peterjmorgan Mar 9, 2026
03c3b98
Fix prompt initialization and reset flow regressions
peterjmorgan Mar 9, 2026
63ec177
Fix latest PR review findings on prompt and batch flows
peterjmorgan Mar 9, 2026
3cbe7ff
Address latest PR review feedback for Symphony auto-run
peterjmorgan Mar 9, 2026
090295e
Address latest CodeRabbit nits for Symphony contribution flow
peterjmorgan Mar 9, 2026
5c566ea
Fix missing registerPromptsHandlers() call in main process startup
peterjmorgan Mar 10, 2026
711db58
Merge branch 'main' into symphony/issue-197-mmifmr74
peterjmorgan Mar 10, 2026
3f026dd
Merge branch 'main' into symphony/issue-197-mmifmr74
peterjmorgan Mar 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ jobs:
node-version: '22'
cache: 'npm'
- run: npm ci
- run: npm run build:prompts
- run: npx prettier --check .
- run: npx eslint src/
- run: npm run lint # TypeScript type checking
Expand All @@ -30,5 +29,4 @@ jobs:
node-version: '22'
cache: 'npm'
- run: npm ci
- run: npm run build:prompts
- run: npm run test
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ node_modules/
# Build outputs
dist/
release/
src/generated/
*.log
tmp/
scratch/
Expand Down
2 changes: 1 addition & 1 deletion BUILDING_WINDOWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ If you encounter issues with the `dev:win` script or prefer to run the steps man
3. **Start the Electron main process:**
Open a **new** PowerShell terminal and run the following command:
```powershell
npm run build:prompts; npx tsc -p tsconfig.main.json; $env:NODE_ENV='development'; npx electron .
npx tsc -p tsconfig.main.json; $env:NODE_ENV='development'; npx electron .
```

This will launch the application in development mode with hot-reloading for the renderer.
105 changes: 65 additions & 40 deletions CLAUDE.md

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion docs/docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@
"group-chat",
"remote-control",
"ssh-remote-execution",
"configuration"
"configuration",
"maestro-prompts"
]
},
{
Expand Down
51 changes: 51 additions & 0 deletions docs/maestro-prompts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
---
title: Maestro Prompts
description: Browse, edit, and customize the core system prompts that power Maestro's AI features.
icon: file-pen
---

The **Maestro Prompts** tab in the Right Bar lets you browse and customize the core system prompts that drive Maestro's AI-powered features — the Onboarding Wizard, Auto Run, Group Chat, and more.

## Opening Maestro Prompts

**Keyboard shortcut:**

- macOS: `Cmd+Shift+2`
- Windows/Linux: `Ctrl+Shift+2`

**From the Right Bar:**

- Open the Right Bar and select the "Maestro Prompts" tab

## Browsing Prompts

Prompts are organized by category:

- **Wizard** — Onboarding and setup prompts
- **Auto Run** — Prompts used during Auto Run sessions
- **Group Chat** — Multi-agent coordination prompts
- **Other** — Additional system prompts

Select a prompt from the list to view its content in the editor panel.

## Editing Prompts

1. Select a prompt from the list
2. Modify the content in the editor
3. Click **Save** to apply your changes

Changes take effect immediately — no restart required. Your edits are stored separately from the bundled defaults, so app updates won't overwrite your customizations.

## Resetting to Default

Click **Reset to Default** to restore any prompt to its original bundled version. The reset takes effect immediately.

## How It Works

- **Bundled prompts** ship with each release in the app's bundled resources prompts directory (example: `Resources/prompts/core/`; exact resource location can vary by platform)
- **User customizations** are stored in `userData/core-prompts-customizations.json`
- When loading a prompt, Maestro checks for a user customization first; if none exists, it falls back to the bundled default

<Note>
Unlike SpecKit and OpenSpec commands, core prompts do not have an "Update from GitHub" button — they ship with each Maestro release.
</Note>
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 18 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,12 @@
"dev": "concurrently \"npm run dev:main\" \"npm run dev:renderer\"",
"dev:prod-data": "USE_PROD_DATA=1 concurrently \"npm run dev:main:prod-data\" \"npm run dev:renderer\"",
"dev:demo": "MAESTRO_DEMO_DIR=/tmp/maestro-demo npm run dev",
"dev:main": "npm run build:prompts && tsc -p tsconfig.main.json && npm run build:preload && NODE_ENV=development electron .",
"dev:main:prod-data": "npm run build:prompts && tsc -p tsconfig.main.json && npm run build:preload && NODE_ENV=development USE_PROD_DATA=1 electron .",
"dev:main": "tsc -p tsconfig.main.json && npm run build:preload && NODE_ENV=development electron .",
"dev:main:prod-data": "tsc -p tsconfig.main.json && npm run build:preload && NODE_ENV=development USE_PROD_DATA=1 electron .",
"dev:renderer": "vite",
"dev:web": "vite --config vite.config.web.mts",
"dev:win": "powershell -NoProfile -ExecutionPolicy Bypass -File ./scripts/start-dev.ps1",
"build": "npm run build:prompts && npm run build:main && npm run build:preload && npm run build:renderer && npm run build:web && npm run build:cli",
"build:prompts": "node scripts/generate-prompts.mjs",
"build": "npm run build:main && npm run build:preload && npm run build:renderer && npm run build:web && npm run build:cli",
"build:main": "tsc -p tsconfig.main.json",
"build:preload": "node scripts/build-preload.mjs",
"build:cli": "node scripts/build-cli.mjs",
Expand Down Expand Up @@ -116,6 +115,11 @@
{
"from": "src/prompts/openspec",
"to": "prompts/openspec"
},
{
"from": "src/prompts",
"to": "prompts/core",
"filter": ["*.md"]
}
]
},
Expand Down Expand Up @@ -148,6 +152,11 @@
{
"from": "src/prompts/openspec",
"to": "prompts/openspec"
},
{
"from": "src/prompts",
"to": "prompts/core",
"filter": ["*.md"]
}
]
},
Expand All @@ -172,6 +181,11 @@
{
"from": "src/prompts/openspec",
"to": "prompts/openspec"
},
{
"from": "src/prompts",
"to": "prompts/core",
"filter": ["*.md"]
}
]
},
Expand Down
98 changes: 0 additions & 98 deletions scripts/generate-prompts.mjs

This file was deleted.

2 changes: 1 addition & 1 deletion scripts/start-dev.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Start-Process powershell -ArgumentList '-NoExit', '-Command', $cmdRenderer
Write-Host "Waiting for renderer dev server to start..." -ForegroundColor Yellow
Start-Sleep -Seconds 5

$cmdBuild = "Set-Location -LiteralPath '$repoRootEscaped'; npm run build:prompts; npx tsc -p tsconfig.main.json; npm run build:preload; `$env:NODE_ENV='development'; npx electron ."
$cmdBuild = "Set-Location -LiteralPath '$repoRootEscaped'; npx tsc -p tsconfig.main.json; npm run build:preload; `$env:NODE_ENV='development'; npx electron ."
Start-Process powershell -ArgumentList '-NoExit', '-Command', $cmdBuild

Write-Host "Launched renderer and main developer windows." -ForegroundColor Green
Expand Down
11 changes: 11 additions & 0 deletions src/__tests__/main/group-chat/group-chat-moderator.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,17 @@ vi.mock('electron-store', () => {
};
});

// Mock the prompt-manager
vi.mock('../../../main/prompt-manager', () => ({
getPrompt: vi.fn((id: string) => {
if (id === 'group-chat-moderator-system') return 'Coordinate the group chat between @agents. Review responses and decide next steps.';
if (id === 'group-chat-moderator-synthesis') return 'Synthesize the agents responses into a coherent answer.';
if (id === 'group-chat-participant') return 'You are {{PARTICIPANT_NAME}} in {{GROUP_CHAT_NAME}}. Log path: {{LOG_PATH}}';
if (id === 'group-chat-participant-request') return '{{PARTICIPANT_NAME}} in {{GROUP_CHAT_NAME}}: {{MESSAGE}}';
throw new Error(`Unexpected prompt ID in test: ${id}`);
}),
}));

import {
spawnModerator,
sendToModerator,
Expand Down
9 changes: 6 additions & 3 deletions src/__tests__/main/ipc/handlers/director-notes.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,12 @@ vi.mock('../../../../main/utils/context-groomer', () => ({
groomContext: vi.fn(),
}));

// Mock the prompts module
vi.mock('../../../../../prompts', () => ({
directorNotesPrompt: 'Mock director notes prompt',
// Mock the prompt-manager
vi.mock('../../../../main/prompt-manager', () => ({
getPrompt: vi.fn((id: string) => {
if (id === 'director-notes') return 'Mock director notes prompt';
throw new Error(`Unexpected prompt id: ${id}`);
}),
}));

describe('director-notes IPC handlers', () => {
Expand Down
Loading