refactor(sisyphus): extract prompt builders into subdirectory with GPT-5.4 variant

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
YeonGyu-Kim
2026-03-06 17:35:24 +09:00
parent 33f8205f97
commit c636b69b7b
5 changed files with 948 additions and 123 deletions
+39 -122
View File
@@ -1,6 +1,6 @@
import type { AgentConfig } from "@opencode-ai/sdk";
import type { AgentMode, AgentPromptMetadata } from "./types";
import { isGptModel, isGeminiModel } from "./types";
import { isGptModel, isGeminiModel, isGpt5_4Model } from "./types";
import {
buildGeminiToolMandate,
buildGeminiDelegationOverride,
@@ -8,7 +8,9 @@ import {
buildGeminiIntentGateEnforcement,
buildGeminiToolGuide,
buildGeminiToolCallExamples,
} from "./sisyphus-gemini-overlays";
} from "./sisyphus/gemini";
import { buildGpt54SisyphusPrompt } from "./sisyphus/gpt-5-4";
import { buildTaskManagementSection } from "./sisyphus/default";
const MODE: AgentMode = "all";
export const SISYPHUS_PROMPT_METADATA: AgentPromptMetadata = {
@@ -38,116 +40,6 @@ import {
categorizeTools,
} from "./dynamic-agent-prompt-builder";
function buildTaskManagementSection(useTaskSystem: boolean): string {
if (useTaskSystem) {
return `<Task_Management>
## Task Management (CRITICAL)
**DEFAULT BEHAVIOR**: Create tasks BEFORE starting any non-trivial task. This is your PRIMARY coordination mechanism.
### When to Create Tasks (MANDATORY)
- Multi-step task (2+ steps) → ALWAYS \`TaskCreate\` first
- Uncertain scope → ALWAYS (tasks clarify thinking)
- User request with multiple items → ALWAYS
- Complex single task → \`TaskCreate\` to break down
### Workflow (NON-NEGOTIABLE)
1. **IMMEDIATELY on receiving request**: \`TaskCreate\` to plan atomic steps.
- ONLY ADD TASKS TO IMPLEMENT SOMETHING, ONLY WHEN USER WANTS YOU TO IMPLEMENT SOMETHING.
2. **Before starting each step**: \`TaskUpdate(status="in_progress")\` (only ONE at a time)
3. **After completing each step**: \`TaskUpdate(status="completed")\` IMMEDIATELY (NEVER batch)
4. **If scope changes**: Update tasks before proceeding
### Why This Is Non-Negotiable
- **User visibility**: User sees real-time progress, not a black box
- **Prevents drift**: Tasks anchor you to the actual request
- **Recovery**: If interrupted, tasks enable seamless continuation
- **Accountability**: Each task = explicit commitment
### Anti-Patterns (BLOCKING)
- Skipping tasks on multi-step tasks — user has no visibility, steps get forgotten
- Batch-completing multiple tasks — defeats real-time tracking purpose
- Proceeding without marking in_progress — no indication of what you're working on
- Finishing without completing tasks — task appears incomplete to user
**FAILURE TO USE TASKS ON NON-TRIVIAL TASKS = INCOMPLETE WORK.**
### Clarification Protocol (when asking):
\`\`\`
I want to make sure I understand correctly.
**What I understood**: [Your interpretation]
**What I'm unsure about**: [Specific ambiguity]
**Options I see**:
1. [Option A] - [effort/implications]
2. [Option B] - [effort/implications]
**My recommendation**: [suggestion with reasoning]
Should I proceed with [recommendation], or would you prefer differently?
\`\`\`
</Task_Management>`;
}
return `<Task_Management>
## Todo Management (CRITICAL)
**DEFAULT BEHAVIOR**: Create todos BEFORE starting any non-trivial task. This is your PRIMARY coordination mechanism.
### When to Create Todos (MANDATORY)
- Multi-step task (2+ steps) → ALWAYS create todos first
- Uncertain scope → ALWAYS (todos clarify thinking)
- User request with multiple items → ALWAYS
- Complex single task → Create todos to break down
### Workflow (NON-NEGOTIABLE)
1. **IMMEDIATELY on receiving request**: \`todowrite\` to plan atomic steps.
- ONLY ADD TODOS TO IMPLEMENT SOMETHING, ONLY WHEN USER WANTS YOU TO IMPLEMENT SOMETHING.
2. **Before starting each step**: Mark \`in_progress\` (only ONE at a time)
3. **After completing each step**: Mark \`completed\` IMMEDIATELY (NEVER batch)
4. **If scope changes**: Update todos before proceeding
### Why This Is Non-Negotiable
- **User visibility**: User sees real-time progress, not a black box
- **Prevents drift**: Todos anchor you to the actual request
- **Recovery**: If interrupted, todos enable seamless continuation
- **Accountability**: Each todo = explicit commitment
### Anti-Patterns (BLOCKING)
- Skipping todos on multi-step tasks — user has no visibility, steps get forgotten
- Batch-completing multiple todos — defeats real-time tracking purpose
- Proceeding without marking in_progress — no indication of what you're working on
- Finishing without completing todos — task appears incomplete to user
**FAILURE TO USE TODOS ON NON-TRIVIAL TASKS = INCOMPLETE WORK.**
### Clarification Protocol (when asking):
\`\`\`
I want to make sure I understand correctly.
**What I understood**: [Your interpretation]
**What I'm unsure about**: [Specific ambiguity]
**Options I see**:
1. [Option A] - [effort/implications]
2. [Option B] - [effort/implications]
**My recommendation**: [suggestion with reasoning]
Should I proceed with [recommendation], or would you prefer differently?
\`\`\`
</Task_Management>`;
}
function buildDynamicSisyphusPrompt(
model: string,
availableAgents: AvailableAgent[],
@@ -558,16 +450,41 @@ export function createSisyphusAgent(
const tools = availableToolNames ? categorizeTools(availableToolNames) : [];
const skills = availableSkills ?? [];
const categories = availableCategories ?? [];
let prompt = availableAgents
? buildDynamicSisyphusPrompt(
model,
availableAgents,
tools,
skills,
categories,
useTaskSystem,
)
: buildDynamicSisyphusPrompt(model, [], tools, skills, categories, useTaskSystem);
const agents = availableAgents ?? [];
if (isGpt5_4Model(model)) {
const prompt = buildGpt54SisyphusPrompt(
model,
agents,
tools,
skills,
categories,
useTaskSystem,
);
return {
description:
"Powerful AI orchestrator. Plans obsessively with todos, assesses search complexity before exploration, delegates strategically via category+skills combinations. Uses explore for internal code (parallel-friendly), librarian for external docs. (Sisyphus - OhMyOpenCode)",
mode: MODE,
model,
maxTokens: 64000,
prompt,
color: "#00CED1",
permission: {
question: "allow",
call_omo_agent: "deny",
} as AgentConfig["permission"],
reasoningEffort: "medium",
};
}
let prompt = buildDynamicSisyphusPrompt(
model,
agents,
tools,
skills,
categories,
useTaskSystem,
);
if (isGeminiModel(model)) {
// 1. Intent gate + tool mandate — early in prompt (after intent verbalization)