#!/usr/bin/env bun /** * Generate the full Sisyphus system prompt and output to sisyphus-prompt.md * * Usage: * bun run script/generate-sisyphus-prompt.ts */ import { createSisyphusAgent } from "../src/agents/sisyphus" import { ORACLE_PROMPT_METADATA } from "../src/agents/oracle" import { LIBRARIAN_PROMPT_METADATA } from "../src/agents/librarian" import { EXPLORE_PROMPT_METADATA } from "../src/agents/explore" import { MULTIMODAL_LOOKER_PROMPT_METADATA } from "../src/agents/multimodal-looker" import { createBuiltinSkills } from "../src/features/builtin-skills" import { DEFAULT_CATEGORIES, CATEGORY_DESCRIPTIONS } from "../src/tools/delegate-task/constants" import type { AvailableAgent, AvailableCategory, AvailableSkill } from "../src/agents/dynamic-agent-prompt-builder" import type { BuiltinAgentName, AgentPromptMetadata } from "../src/agents/types" import { writeFileSync } from "node:fs" import { join } from "node:path" // Build available agents (same logic as utils.ts) const agentMetadata: Record = { oracle: ORACLE_PROMPT_METADATA, librarian: LIBRARIAN_PROMPT_METADATA, explore: EXPLORE_PROMPT_METADATA, "multimodal-looker": MULTIMODAL_LOOKER_PROMPT_METADATA, } const agentDescriptions: Record = { oracle: "Read-only consultation agent. High-IQ reasoning specialist for debugging hard problems and high-difficulty architecture design.", librarian: "Specialized codebase understanding agent for multi-repository analysis, searching remote codebases, retrieving official documentation, and finding implementation examples using GitHub CLI, Context7, and Web Search. MUST BE USED when users ask to look up code in remote repositories, explain library internals, or find usage examples in open source.", explore: 'Contextual grep for codebases. Answers "Where is X?", "Which file has Y?", "Find the code that does Z". Fire multiple in parallel for broad searches. Specify thoroughness: "quick" for basic, "medium" for moderate, "very thorough" for comprehensive analysis.', "multimodal-looker": "Analyze media files (PDFs, images, diagrams) that require interpretation beyond raw text. Extracts specific information or summaries from documents, describes visual content. Use when you need analyzed/extracted data rather than literal file contents.", } const availableAgents: AvailableAgent[] = Object.entries(agentMetadata).map(([name, metadata]) => ({ name: name as BuiltinAgentName, description: agentDescriptions[name] ?? "", metadata, })) // Build available categories const availableCategories: AvailableCategory[] = Object.entries(DEFAULT_CATEGORIES).map(([name]) => ({ name, description: CATEGORY_DESCRIPTIONS[name] ?? "General tasks", })) // Build available skills const builtinSkills = createBuiltinSkills() const availableSkills: AvailableSkill[] = builtinSkills.map((skill) => ({ name: skill.name, description: skill.description, location: "plugin" as const, })) // Generate the agent config const model = "anthropic/claude-opus-4-5" const sisyphusConfig = createSisyphusAgent( model, availableAgents, undefined, // no tool names availableSkills, availableCategories ) // Output to file const outputPath = join(import.meta.dirname, "..", "sisyphus-prompt.md") const content = `# Sisyphus System Prompt > Auto-generated by \`script/generate-sisyphus-prompt.ts\` > Generated at: ${new Date().toISOString()} ## Configuration | Field | Value | |-------|-------| | Model | \`${model}\` | | Max Tokens | \`${sisyphusConfig.maxTokens}\` | | Mode | \`${sisyphusConfig.mode}\` | | Thinking | ${sisyphusConfig.thinking ? `Budget: ${sisyphusConfig.thinking.budgetTokens}` : "N/A"} | ## Available Agents ${availableAgents.map((a) => `- **${a.name}**: ${a.description.split(".")[0]}`).join("\n")} ## Available Categories ${availableCategories.map((c) => `- **${c.name}**: ${c.description}`).join("\n")} ## Available Skills ${availableSkills.map((s) => `- **${s.name}**: ${s.description.split(".")[0]}`).join("\n")} --- ## Full System Prompt \`\`\`markdown ${sisyphusConfig.prompt} \`\`\` ` writeFileSync(outputPath, content) console.log(`Generated: ${outputPath}`) console.log(`Prompt length: ${sisyphusConfig.prompt?.length ?? 0} characters`)