Multi-run with configurable prompt templates (#1111)

* Multi-run with configurable prompt templates

* Fixes

* Fix handleDuplicate fire-and-forget: await createTemplate and handle failure

* Add Polish translations for prompt template and multirun group keys

* fix: migrate remaining Remix icons to Icon component in MultiRunLauncher

---------

Signed-off-by: Tom Rochette <roctom@gmail.com>
This commit is contained in:
Tom Rochette
2026-05-21 16:35:42 +03:00
committed by GitHub
parent 8dac0f73c0
commit 6cc1afc963
29 changed files with 1590 additions and 564 deletions
@@ -5,6 +5,7 @@ import { useProjectsStore } from '@/stores/useProjectsStore';
import { useAgentsStore } from '@/stores/useAgentsStore';
import { useCommandsStore } from '@/stores/useCommandsStore';
import { useMcpConfigStore } from '@/stores/useMcpConfigStore';
import { usePromptTemplatesStore } from '@/stores/usePromptTemplatesStore';
import { useSkillsStore } from '@/stores/useSkillsStore';
import { useSkillsCatalogStore } from '@/stores/useSkillsCatalogStore';
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
@@ -28,6 +29,8 @@ import { UsageSidebar } from '@/components/sections/usage/UsageSidebar';
import { UsagePage } from '@/components/sections/usage/UsagePage';
import { MagicPromptsSidebar } from '@/components/sections/magic-prompts/MagicPromptsSidebar';
import { MagicPromptsPage } from '@/components/sections/magic-prompts/MagicPromptsPage';
import { PromptTemplatesSidebar } from '@/components/sections/prompt-templates/PromptTemplatesSidebar';
import { PromptTemplatesPage } from '@/components/sections/prompt-templates/PromptTemplatesPage';
import { GitPage } from '@/components/sections/git-identities/GitPage';
import type { OpenChamberSection } from '@/components/sections/openchamber/types';
import { OpenChamberPage } from '@/components/sections/openchamber/OpenChamberPage';
@@ -73,6 +76,7 @@ const pageOrder: SettingsPageSlug[] = [
'shortcuts',
'git',
'magic-prompts',
'prompt-templates',
'projects',
'remote-instances',
'agents',
@@ -113,6 +117,8 @@ export function getSettingsNavIcon(slug: SettingsPageSlug): IconName | null {
return 'chat-ai-3';
case 'magic-prompts':
return 'ai-generate-2';
case 'prompt-templates':
return 'file-text';
case 'notifications':
return 'notification-3';
case 'shortcuts':
@@ -357,6 +363,9 @@ export const SettingsView: React.FC<SettingsViewProps> = ({ onClose, forceMobile
void useSkillsStore.getState().loadSkills();
void useSkillsCatalogStore.getState().loadCatalog();
}
if (settingsSlug === 'prompt-templates') {
void usePromptTemplatesStore.getState().loadTemplates();
}
}, [activeProjectId, isSettingsDialogOpen, isWindowed, runtimeCtx.isVSCode, settingsSlug]);
const openPage = React.useCallback((slug: SettingsPageSlug) => {
@@ -423,6 +432,8 @@ export const SettingsView: React.FC<SettingsViewProps> = ({ onClose, forceMobile
return t('settings.page.sessions.title');
case 'magic-prompts':
return t('settings.page.magicPrompts.title');
case 'prompt-templates':
return t('settings.page.promptTemplates.title');
case 'notifications':
return t('settings.page.notifications.title');
case 'voice':
@@ -466,6 +477,8 @@ export const SettingsView: React.FC<SettingsViewProps> = ({ onClose, forceMobile
return <UsageSidebar onItemSelect={opts.onItemSelect} />;
case 'magic-prompts':
return <MagicPromptsSidebar onItemSelect={opts.onItemSelect} />;
case 'prompt-templates':
return <PromptTemplatesSidebar onItemSelect={opts.onItemSelect} />;
default:
return null;
}
@@ -502,6 +515,8 @@ export const SettingsView: React.FC<SettingsViewProps> = ({ onClose, forceMobile
return <UsagePage />;
case 'magic-prompts':
return <MagicPromptsPage />;
case 'prompt-templates':
return <PromptTemplatesPage />;
case 'git':
return <GitPage />;
case 'appearance':