Add new agents and skills for enhanced project orchestration and review processes
- Introduced `critic`, an independent adversarial reviewer for security and correctness. - Added `fable-orchestrator` to manage task routing and verification. - Implemented `gauntlet-critic` for fresh-context evaluation of gauntlet rounds. - Created `planner` for generating executable implementation plans with dependencies. - Developed `security-auditor` for application security reviews and audits. - Established `system-steward` to improve agent prompts and skills based on verified failures. - Added `dev-loop` skill for autonomous development loops over repositories. - Implemented `gauntlet-loop` skill for iterative quality benchmarking against reference standards. - Updated project settings to utilize the new orchestrator agent. - Created documentation for `GAUNTLET.md`, `PROGRESS.md`, and `REFERENCE_BAR.md` to track project status and quality benchmarks. - Added detailed prompting style guide to enhance understanding of prompt patterns and agentic loops.
This commit is contained in:
@@ -2,7 +2,7 @@ import React, { useEffect, useRef, useState } from 'react';
|
||||
import { createRoot } from 'react-dom/client';
|
||||
import { safeSendMessage, safeStorageGet, safeStorageSet } from '@lib/messaging';
|
||||
|
||||
import { WRITING_STYLES, PROMPT_STYLES, PROMPT_PERSONAS, PROMPT_FORMATS, resolvePromptPersona } from '@lib/actions';
|
||||
import { WRITING_STYLES, PROMPT_PATTERNS, PROMPT_PERSONAS, PROMPT_FORMATS, resolvePromptPersona, resolvePromptPattern } from '@lib/actions';
|
||||
import type { PromptParams } from '@lib/types';
|
||||
|
||||
// ─── Types ───────────────────────────────────────────────────────────────────
|
||||
@@ -202,7 +202,7 @@ function Popup() {
|
||||
const [copied, setCopied] = useState(false);
|
||||
const [writingStyle, setWritingStyle] = useState('Default');
|
||||
// Prompt Builder parameters — persisted so they survive popup close/open.
|
||||
const [promptStyle, setPromptStyle] = useState('Auto');
|
||||
const [promptPattern, setPromptPattern] = useState('auto');
|
||||
const [promptPersona, setPromptPersona] = useState('Auto');
|
||||
const [customPersona, setCustomPersona] = useState('');
|
||||
const [promptFormat, setPromptFormat] = useState('Auto');
|
||||
@@ -217,7 +217,7 @@ function Popup() {
|
||||
// Load config + restore session input + load writing style
|
||||
useEffect(() => {
|
||||
safeStorageGet(
|
||||
['provider', 'apiKey', 'apiKeyEnc', 'model', 'writingStyle', 'promptStyle', 'promptPersona', 'customPersona', 'promptFormat', 'promptModel', 'popupTab'],
|
||||
['provider', 'apiKey', 'apiKeyEnc', 'model', 'writingStyle', 'promptPattern', 'promptStyle', 'promptPersona', 'customPersona', 'promptFormat', 'promptModel', 'popupTab'],
|
||||
(result) => {
|
||||
if (result.apiKey || result.apiKeyEnc) {
|
||||
setConfigured(true);
|
||||
@@ -227,7 +227,9 @@ function Popup() {
|
||||
if (result.writingStyle) {
|
||||
setWritingStyle(result.writingStyle);
|
||||
}
|
||||
if (result.promptStyle) setPromptStyle(result.promptStyle);
|
||||
if (result.promptPattern || result.promptStyle) {
|
||||
setPromptPattern(resolvePromptPattern(result.promptPattern, result.promptStyle));
|
||||
}
|
||||
if (result.promptPersona) setPromptPersona(result.promptPersona);
|
||||
if (result.customPersona) setCustomPersona(result.customPersona);
|
||||
if (result.promptFormat) setPromptFormat(result.promptFormat);
|
||||
@@ -273,7 +275,7 @@ function Popup() {
|
||||
// Resolve the Prompt Builder selections into message params. 'Custom…'
|
||||
// uses the free-text persona (falls back to Auto when left empty).
|
||||
const resolvePromptParams = (): PromptParams => ({
|
||||
promptStyle,
|
||||
pattern: promptPattern,
|
||||
persona: resolvePromptPersona(promptPersona, customPersona),
|
||||
format: promptFormat,
|
||||
});
|
||||
@@ -473,18 +475,28 @@ function Popup() {
|
||||
</div>
|
||||
|
||||
<div style={{ ...S.styleRow, marginTop: '6px' }}>
|
||||
<span style={{ ...S.styleLabel, width: '64px' }}>Style:</span>
|
||||
<span style={{ ...S.styleLabel, width: '64px' }}>Pattern:</span>
|
||||
<select
|
||||
style={S.styleSelect}
|
||||
value={promptStyle}
|
||||
onChange={(e) => setParam('promptStyle', e.target.value, setPromptStyle)}
|
||||
value={promptPattern}
|
||||
onChange={(e) => setParam('promptPattern', e.target.value, setPromptPattern)}
|
||||
disabled={processing}
|
||||
>
|
||||
{PROMPT_STYLES.map((s) => (
|
||||
<option key={s} value={s}>{s}</option>
|
||||
{PROMPT_PATTERNS.filter((p) => p.id === 'auto').map((p) => (
|
||||
<option key={p.id} value={p.id} title={p.hint}>{p.label}</option>
|
||||
))}
|
||||
{(['Direct', 'Reasoning', 'Agentic'] as const).map((group) => (
|
||||
<optgroup key={group} label={group}>
|
||||
{PROMPT_PATTERNS.filter((p) => p.id !== 'auto' && p.group === group).map((p) => (
|
||||
<option key={p.id} value={p.id} title={p.hint}>{p.label}</option>
|
||||
))}
|
||||
</optgroup>
|
||||
))}
|
||||
</select>
|
||||
</div>
|
||||
<div style={{ fontSize: '11px', color: '#6c7086', margin: '2px 0 0 72px' }}>
|
||||
{PROMPT_PATTERNS.find((p) => p.id === promptPattern)?.hint}
|
||||
</div>
|
||||
|
||||
<div style={{ ...S.styleRow, marginTop: '6px' }}>
|
||||
<span style={{ ...S.styleLabel, width: '64px' }}>Persona:</span>
|
||||
|
||||
Reference in New Issue
Block a user