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:
john kevin asprec
2026-08-08 16:49:07 +08:00
parent 6aee260533
commit 444060c3eb
85 changed files with 2717 additions and 171 deletions

View File

@@ -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>