fabbcaa4b7
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
141 lines
4.7 KiB
TypeScript
141 lines
4.7 KiB
TypeScript
import type {
|
|
AvailableCategory,
|
|
AvailableSkill,
|
|
} from "./dynamic-agent-prompt-types"
|
|
|
|
function buildSkillsSection(skills: AvailableSkill[]): string {
|
|
const builtinSkills = skills.filter((skill) => skill.location === "plugin")
|
|
const customSkills = skills.filter((skill) => skill.location !== "plugin")
|
|
|
|
const builtinNames = builtinSkills.map((skill) => skill.name).join(", ")
|
|
const customNames = customSkills
|
|
.map((skill) => {
|
|
const source = skill.location === "project" ? "project" : "user"
|
|
return `${skill.name} (${source})`
|
|
})
|
|
.join(", ")
|
|
|
|
if (customSkills.length > 0 && builtinSkills.length > 0) {
|
|
return `#### Available Skills (via \`skill\` tool)
|
|
|
|
**Built-in**: ${builtinNames}
|
|
**⚡ YOUR SKILLS (PRIORITY)**: ${customNames}
|
|
|
|
> User-installed skills OVERRIDE built-in defaults. ALWAYS prefer YOUR SKILLS when domain matches.
|
|
> Full skill descriptions → use the \`skill\` tool to check before EVERY delegation.`
|
|
}
|
|
|
|
if (customSkills.length > 0) {
|
|
return `#### Available Skills (via \`skill\` tool)
|
|
|
|
**⚡ YOUR SKILLS (PRIORITY)**: ${customNames}
|
|
|
|
> User-installed skills OVERRIDE built-in defaults. ALWAYS prefer YOUR SKILLS when domain matches.
|
|
> Full skill descriptions → use the \`skill\` tool to check before EVERY delegation.`
|
|
}
|
|
|
|
if (builtinSkills.length > 0) {
|
|
return `#### Available Skills (via \`skill\` tool)
|
|
|
|
**Built-in**: ${builtinNames}
|
|
|
|
> Full skill descriptions → use the \`skill\` tool to check before EVERY delegation.`
|
|
}
|
|
|
|
return ""
|
|
}
|
|
|
|
export function buildCategorySkillsDelegationGuide(
|
|
categories: AvailableCategory[],
|
|
skills: AvailableSkill[],
|
|
): string {
|
|
if (categories.length === 0 && skills.length === 0) {
|
|
return ""
|
|
}
|
|
|
|
const categoryRows = categories.map((category) => {
|
|
const description = category.description || category.name
|
|
return `- \`${category.name}\` - ${description}`
|
|
})
|
|
|
|
const customSkills = skills.filter((skill) => skill.location !== "plugin")
|
|
const skillsSection = buildSkillsSection(skills)
|
|
const customPriorityNote =
|
|
customSkills.length > 0
|
|
? `
|
|
> **User-installed skills get PRIORITY.** When in doubt, INCLUDE rather than omit.`
|
|
: ""
|
|
|
|
return `### Category + Skills Delegation System
|
|
|
|
**task() combines categories and skills for optimal task execution.**
|
|
|
|
#### Available Categories (Domain-Optimized Models)
|
|
|
|
Each category is configured with a model optimized for that domain. Read the description to understand when to use it.
|
|
|
|
${categoryRows.join("\n")}
|
|
|
|
${skillsSection}
|
|
|
|
---
|
|
|
|
### MANDATORY: Category + Skill Selection Protocol
|
|
|
|
**STEP 1: Select Category**
|
|
- Read each category's description
|
|
- Match task requirements to category domain
|
|
- Select the category whose domain BEST fits the task
|
|
|
|
**STEP 2: Evaluate ALL Skills**
|
|
Check the \`skill\` tool for available skills and their descriptions. For EVERY skill, ask:
|
|
> "Does this skill's expertise domain overlap with my task?"
|
|
|
|
- If YES → INCLUDE in \`load_skills=[...]\`
|
|
- If NO → OMIT (no justification needed)${customPriorityNote}
|
|
|
|
---
|
|
|
|
### Delegation Pattern
|
|
|
|
\`\`\`typescript
|
|
task(
|
|
category="[selected-category]",
|
|
load_skills=["skill-1", "skill-2"], // Include ALL relevant skills - ESPECIALLY user-installed ones
|
|
prompt="..."
|
|
)
|
|
\`\`\`
|
|
|
|
**ANTI-PATTERN (will produce poor results):**
|
|
\`\`\`typescript
|
|
task(category="...", load_skills=[], run_in_background=false, prompt="...") // Empty load_skills without justification
|
|
\`\`\`
|
|
|
|
---
|
|
|
|
### Category Domain Matching (ZERO TOLERANCE)
|
|
|
|
Every delegation MUST use the category that matches the task's domain. Mismatched categories produce measurably worse output because each category runs on a model optimized for that specific domain.
|
|
|
|
**VISUAL WORK = ALWAYS \`visual-engineering\`. NO EXCEPTIONS.**
|
|
|
|
Any task involving UI, UX, CSS, styling, layout, animation, design, or frontend components MUST go to \`visual-engineering\`. Never delegate visual work to \`quick\`, \`unspecified-*\`, or any other category.
|
|
|
|
\`\`\`typescript
|
|
// CORRECT: Visual work → visual-engineering category
|
|
task(category="visual-engineering", load_skills=["frontend-ui-ux"], prompt="Redesign the sidebar layout with new spacing...")
|
|
|
|
// WRONG: Visual work in wrong category - WILL PRODUCE INFERIOR RESULTS
|
|
task(category="quick", load_skills=[], prompt="Redesign the sidebar layout with new spacing...")
|
|
\`\`\`
|
|
|
|
| Task Domain | MUST Use Category |
|
|
|---|---|
|
|
| UI, styling, animations, layout, design | \`visual-engineering\` |
|
|
| Hard logic, architecture decisions, algorithms | \`ultrabrain\` |
|
|
| Autonomous research + end-to-end implementation | \`deep\` |
|
|
| Single-file typo, trivial config change | \`quick\` |
|
|
|
|
**When in doubt about category, it is almost never \`quick\` or \`unspecified-*\`. Match the domain.**`
|
|
}
|