feat: add local workspace review slash command

Add /review command with high-signal diff review instructions
Expose workspace review prompts in Magic Prompts settings
Show /review in command autocomplete with OpenChamber command metadata
This commit is contained in:
Bohdan Triapitsyn
2026-04-23 10:45:41 +03:00
parent 480944b14b
commit cb6ba34811
5 changed files with 95 additions and 2 deletions
@@ -1563,6 +1563,28 @@ const ChatInputComponent: React.FC<ChatInputProps> = ({ onOpenSettings, scrollTo
}
return;
}
else if (commandName === 'review' && currentSessionId) {
try {
await sessionActions.waitForConnectionOrThrow();
const visibleText = await renderMagicPrompt('session.review.visible');
const instructionsText = await renderMagicPrompt('session.review.instructions');
await sendMessage(
visibleText,
currentProviderId,
currentModelId,
currentAgentName,
[],
agentMentionName,
[{ text: instructionsText, synthetic: true }],
currentVariant,
inputMode,
);
scrollToBottom?.({ instant: true, force: true });
} catch (error) {
toast.error(error instanceof Error ? error.message : 'Failed to review changes');
}
return;
}
}
// Collect all attachments for error recovery
@@ -1,5 +1,5 @@
import React from 'react';
import { RiCommandLine, RiFileLine, RiFlashlightLine, RiRefreshLine, RiScissorsLine, RiTerminalBoxLine, RiArrowGoBackLine, RiArrowGoForwardLine } from '@remixicon/react';
import { RiCommandLine, RiFileLine, RiFlashlightLine, RiRefreshLine, RiScissorsLine, RiTerminalBoxLine, RiArrowGoBackLine, RiArrowGoForwardLine, RiSearchEyeLine } from '@remixicon/react';
import { cn, fuzzyMatch } from '@/lib/utils';
import { useSessionUIStore } from '@/sync/session-ui-store';
import { useSessionMessages } from '@/sync/sync-context';
@@ -122,6 +122,10 @@ export const CommandAutocomplete = React.forwardRef<CommandAutocompleteHandle, C
? [{ id: 'openchamber:summary', name: 'summary', source: 'openchamber' as const, description: 'Non-destructive session summary. Optional topic hint after the command.', isOpenChamber: true }]
: []
),
...(hasSession
? [{ id: 'openchamber:review', name: 'review', source: 'openchamber' as const, description: 'Review current workspace changes for high-signal issues only.', isOpenChamber: true }]
: []
),
];
const allCommands = [...builtInCommands, ...customCommands];
@@ -162,6 +166,10 @@ export const CommandAutocomplete = React.forwardRef<CommandAutocompleteHandle, C
? [{ id: 'openchamber:summary', name: 'summary', source: 'openchamber' as const, description: 'Non-destructive session summary. Optional topic hint after the command.', isOpenChamber: true }]
: []
),
...(hasSession
? [{ id: 'openchamber:review', name: 'review', source: 'openchamber' as const, description: 'Review current workspace changes for high-signal issues only.', isOpenChamber: true }]
: []
),
];
const filtered = (searchQuery
@@ -234,6 +242,8 @@ export const CommandAutocomplete = React.forwardRef<CommandAutocompleteHandle, C
return <RiArrowGoForwardLine className="h-3.5 w-3.5 text-orange-500" />;
case 'compact':
return <RiScissorsLine className="h-3.5 w-3.5 text-purple-500" />;
case 'review':
return <RiSearchEyeLine className="h-3.5 w-3.5 text-blue-500" />;
case 'test':
case 'build':
case 'run':