@skj1724/oh-my-opencode 3.18.25 → 3.18.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -23,11 +23,12 @@ export interface OrchestratorContext {
23
23
  availableAgents?: AvailableAgent[];
24
24
  availableSkills?: AvailableSkill[];
25
25
  userCategories?: Record<string, CategoryConfig>;
26
+ language?: string;
26
27
  }
27
28
  /**
28
- * Gets the appropriate Atlas prompt based on model.
29
+ * Gets the appropriate Atlas prompt based on model and language.
29
30
  */
30
- export declare function getAtlasPrompt(model?: string): string;
31
+ export declare function getAtlasPrompt(model?: string, language?: string): string;
31
32
  export declare function createAtlasAgent(ctx: OrchestratorContext): AgentConfig;
32
33
  export declare namespace createAtlasAgent {
33
34
  var mode: "primary";
@@ -1,2 +1,2 @@
1
1
  import type { AvailableCategory, AvailableSkill } from "./dynamic-agent-prompt-types";
2
- export declare function buildCategorySkillsDelegationGuide(categories: AvailableCategory[], skills: AvailableSkill[]): string;
2
+ export declare function buildCategorySkillsDelegationGuide(categories: AvailableCategory[], skills: AvailableSkill[], language?: string): string;
@@ -1,17 +1,11 @@
1
1
  import type { AvailableAgent, AvailableCategory, AvailableSkill } from "./dynamic-agent-prompt-types";
2
2
  import type { AvailableTool } from "./dynamic-agent-prompt-types";
3
- /**
4
- * Builds an explicit agent identity preamble that overrides any base system prompt identity.
5
- * This is critical for mode: "primary" agents where OpenCode prepends its own system prompt
6
- * containing a default identity (e.g., "You are Claude"). Without this override directive,
7
- * the LLM may default to the base identity instead of the agent's intended persona.
8
- */
9
- export declare function buildAgentIdentitySection(agentName: string, roleDescription: string): string;
10
- export declare function buildKeyTriggersSection(agents: AvailableAgent[], _skills?: AvailableSkill[]): string;
11
- export declare function buildToolSelectionTable(agents: AvailableAgent[], tools?: AvailableTool[], _skills?: AvailableSkill[]): string;
12
- export declare function buildExploreSection(agents: AvailableAgent[]): string;
13
- export declare function buildLibrarianSection(agents: AvailableAgent[]): string;
14
- export declare function buildDelegationTable(agents: AvailableAgent[]): string;
15
- export declare function buildOracleSection(agents: AvailableAgent[]): string;
16
- export declare function buildNonClaudePlannerSection(model: string): string;
17
- export declare function buildParallelDelegationSection(model: string, categories: AvailableCategory[]): string;
3
+ export declare function buildAgentIdentitySection(agentName: string, roleDescription: string, language?: string): string;
4
+ export declare function buildKeyTriggersSection(agents: AvailableAgent[], _skills?: AvailableSkill[], language?: string): string;
5
+ export declare function buildToolSelectionTable(agents: AvailableAgent[], tools?: AvailableTool[], _skills?: AvailableSkill[], language?: string): string;
6
+ export declare function buildExploreSection(agents: AvailableAgent[], language?: string): string;
7
+ export declare function buildLibrarianSection(agents: AvailableAgent[], language?: string): string;
8
+ export declare function buildDelegationTable(agents: AvailableAgent[], language?: string): string;
9
+ export declare function buildOracleSection(agents: AvailableAgent[], language?: string): string;
10
+ export declare function buildNonClaudePlannerSection(model: string, language?: string): string;
11
+ export declare function buildParallelDelegationSection(model: string, categories: AvailableCategory[], language?: string): string;
@@ -1,6 +1,6 @@
1
1
  import type { AvailableAgent, AvailableCategory, AvailableSkill } from "./dynamic-agent-prompt-types";
2
- export declare function buildHardBlocksSection(): string;
3
- export declare function buildAntiPatternsSection(): string;
4
- export declare function buildToolCallFormatSection(): string;
5
- export declare function buildUltraworkSection(agents: AvailableAgent[], categories: AvailableCategory[], skills: AvailableSkill[]): string;
6
- export declare function buildAntiDuplicationSection(): string;
2
+ export declare function buildHardBlocksSection(language?: string): string;
3
+ export declare function buildAntiPatternsSection(language?: string): string;
4
+ export declare function buildToolCallFormatSection(language?: string): string;
5
+ export declare function buildUltraworkSection(agents: AvailableAgent[], categories: AvailableCategory[], skills: AvailableSkill[], language?: string): string;
6
+ export declare function buildAntiDuplicationSection(language?: string): string;
@@ -1,3 +1,3 @@
1
1
  import type { AvailableTool } from "./dynamic-agent-prompt-types";
2
2
  export declare function categorizeTools(toolNames: string[]): AvailableTool[];
3
- export declare function getToolsPromptDisplay(tools: AvailableTool[]): string;
3
+ export declare function getToolsPromptDisplay(tools: AvailableTool[], language?: string): string;
@@ -4,6 +4,6 @@
4
4
  */
5
5
  import type { AvailableAgent, AvailableTool, AvailableSkill, AvailableCategory } from "../dynamic-agent-prompt-builder";
6
6
  import { categorizeTools } from "../dynamic-agent-prompt-builder";
7
- export declare function buildTaskManagementSection(useTaskSystem: boolean): string;
7
+ export declare function buildTaskManagementSection(useTaskSystem: boolean, language?: string): string;
8
8
  export declare function buildDefaultSisyphusPrompt(model: string, availableAgents: AvailableAgent[], availableTools?: AvailableTool[], availableSkills?: AvailableSkill[], availableCategories?: AvailableCategory[], useTaskSystem?: boolean): string;
9
9
  export { categorizeTools };
@@ -2,7 +2,7 @@ import type { AgentConfig } from "@opencode-ai/sdk";
2
2
  import type { AgentPromptMetadata } from "./types";
3
3
  export declare const SISYPHUS_PROMPT_METADATA: AgentPromptMetadata;
4
4
  import type { AvailableAgent, AvailableTool, AvailableSkill, AvailableCategory } from "./dynamic-agent-prompt-builder";
5
- export declare function buildDynamicSisyphusPromptZh(model: string, availableAgents: AvailableAgent[], availableTools?: AvailableTool[], availableSkills?: AvailableSkill[], availableCategories?: AvailableCategory[], useTaskSystem?: boolean): string;
5
+ export declare function buildDynamicSisyphusPromptZh(model: string, availableAgents: AvailableAgent[], availableTools?: AvailableTool[], availableSkills?: AvailableSkill[], availableCategories?: AvailableCategory[], useTaskSystem?: boolean, language?: string): string;
6
6
  export declare function createSisyphusAgent(model: string, availableAgents?: AvailableAgent[], availableToolNames?: string[], availableSkills?: AvailableSkill[], availableCategories?: AvailableCategory[], useTaskSystem?: boolean, language?: string): AgentConfig;
7
7
  export declare namespace createSisyphusAgent {
8
8
  var mode: "primary";
@@ -0,0 +1,3 @@
1
+ export type SupportedLanguage = "zh-CN" | "zh-TW" | "en-US" | "ja-JP" | "ko-KR" | "fr-FR" | "de-DE" | "es-ES" | "pt-BR" | "ru-RU" | "vi-VN" | "th-TH" | "id-ID" | "ms-MY" | "hi-IN" | "ar-SA" | "he-IL";
2
+ export declare function isZhLanguage(lang?: string): boolean;
3
+ export declare function isEnLanguage(lang?: string): boolean;
package/dist/cli/index.js CHANGED
@@ -54876,7 +54876,7 @@ var {
54876
54876
  // package.json
54877
54877
  var package_default = {
54878
54878
  name: "@skj1724/oh-my-opencode",
54879
- version: "3.18.25",
54879
+ version: "3.18.26",
54880
54880
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
54881
54881
  main: "./dist/index.js",
54882
54882
  types: "dist/index.d.ts",
package/dist/index.js CHANGED
@@ -115977,32 +115977,56 @@ function formatToolsForPrompt(tools) {
115977
115977
  }
115978
115978
  return parts.join(", ");
115979
115979
  }
115980
- function getToolsPromptDisplay(tools) {
115980
+ function getToolsPromptDisplay(tools, language) {
115981
115981
  return formatToolsForPrompt(tools);
115982
115982
  }
115983
+ // src/agents/types/language.ts
115984
+ function isZhLanguage(lang) {
115985
+ if (!lang || lang === "en" || lang === "en-US") {
115986
+ return false;
115987
+ }
115988
+ return lang.toLowerCase().startsWith("zh");
115989
+ }
115990
+
115983
115991
  // src/agents/dynamic-agent-core-sections.ts
115984
- function buildAgentIdentitySection(agentName, roleDescription) {
115992
+ function buildAgentIdentitySection(agentName, roleDescription, language) {
115993
+ if (isZhLanguage(language)) {
115994
+ return `<agent-identity>
115995
+ \u4F60\u7684\u6307\u5B9A\u8EAB\u4EFD\u662F "${agentName}"\u3002\u6B64\u8EAB\u4EFD\u4F18\u5148\u4E8E\u4EFB\u4F55\u5148\u524D\u8EAB\u4EFD\u58F0\u660E\u3002
115996
+ \u4F60\u662F "${agentName}" - ${roleDescription}\u3002
115997
+ \u5F53\u88AB\u95EE\u53CA\u4F60\u662F\u8C01\u65F6\uFF0C\u59CB\u7EC8\u8BC6\u522B\u4E3A ${agentName}\u3002\u4E0D\u8981\u8BC6\u522B\u4E3A\u4EFB\u4F55\u5176\u4ED6\u52A9\u624B\u6216 AI\u3002
115998
+ </agent-identity>`;
115999
+ }
115985
116000
  return `<agent-identity>
115986
116001
  Your designated identity for this session is "${agentName}". This identity supersedes any prior identity statements.
115987
116002
  You are "${agentName}" - ${roleDescription}.
115988
116003
  When asked who you are, always identify as ${agentName}. Do not identify as any other assistant or AI.
115989
116004
  </agent-identity>`;
115990
116005
  }
115991
- function buildKeyTriggersSection(agents, _skills = []) {
116006
+ function buildKeyTriggersSection(agents, _skills = [], language) {
115992
116007
  const keyTriggers = agents.filter((agent) => agent.metadata.keyTrigger).map((agent) => `- ${agent.metadata.keyTrigger}`);
115993
116008
  if (keyTriggers.length === 0) {
115994
116009
  return "";
115995
116010
  }
116011
+ if (isZhLanguage(language)) {
116012
+ return `### \u5173\u952E\u89E6\u53D1\u8BCD\uFF08\u5206\u7C7B\u524D\u68C0\u67E5\uFF09\uFF1A
116013
+
116014
+ ${keyTriggers.join(`
116015
+ `)}
116016
+ - **"Look into" + "create PR"** \u2192 \u4E0D\u4EC5\u4EC5\u662F\u7814\u7A76\u3002\u9700\u8981\u5B8C\u6574\u5B9E\u73B0\u5468\u671F\u3002`;
116017
+ }
115996
116018
  return `### Key Triggers (check BEFORE classification):
115997
116019
 
115998
116020
  ${keyTriggers.join(`
115999
116021
  `)}
116000
116022
  - **"Look into" + "create PR"** \u2192 Not just research. Full implementation cycle expected.`;
116001
116023
  }
116002
- function buildToolSelectionTable(agents, tools = [], _skills = []) {
116003
- const rows = ["### Tool & Agent Selection:", ""];
116024
+ function buildToolSelectionTable(agents, tools = [], _skills = [], language) {
116025
+ const rows = [];
116026
+ const isZh = isZhLanguage(language);
116027
+ rows.push(isZh ? "### \u5DE5\u5177\u4E0E Agent \u9009\u62E9\uFF1A" : "### Tool & Agent Selection:", "");
116004
116028
  if (tools.length > 0) {
116005
- rows.push(`- ${getToolsPromptDisplay(tools)} - **FREE** - Not Complex, Scope Clear, No Implicit Assumptions`);
116029
+ rows.push(`- ${getToolsPromptDisplay(tools, language)} - **FREE** - ${isZh ? "\u4E0D\u590D\u6742\u3001\u8303\u56F4\u6E05\u6670\u3001\u65E0\u9690\u542B\u5047\u8BBE" : "Not Complex, Scope Clear, No Implicit Assumptions"}`);
116006
116030
  }
116007
116031
  const costOrder = { FREE: 0, CHEAP: 1, EXPENSIVE: 2 };
116008
116032
  const sortedAgents = [...agents].filter((agent) => agent.metadata.category !== "utility").sort((left, right) => costOrder[left.metadata.cost] - costOrder[right.metadata.cost]);
@@ -116011,17 +116035,33 @@ function buildToolSelectionTable(agents, tools = [], _skills = []) {
116011
116035
  rows.push(`- \`${agent.name}\` agent - **${agent.metadata.cost}** - ${shortDescription}`);
116012
116036
  }
116013
116037
  rows.push("");
116014
- rows.push("**Default flow**: explore/librarian (background) + tools \u2192 oracle (if required)");
116038
+ rows.push(isZh ? "**\u9ED8\u8BA4\u6D41\u7A0B**\uFF1Aexplore/librarian\uFF08\u540E\u53F0\uFF09+ \u5DE5\u5177 \u2192 oracle\uFF08\u5982\u9700\u8981\uFF09" : "**Default flow**: explore/librarian (background) + tools \u2192 oracle (if required)");
116015
116039
  return rows.join(`
116016
116040
  `);
116017
116041
  }
116018
- function buildExploreSection(agents) {
116042
+ function buildExploreSection(agents, language) {
116019
116043
  const exploreAgent = agents.find((agent) => agent.name === "explore");
116020
116044
  if (!exploreAgent) {
116021
116045
  return "";
116022
116046
  }
116023
116047
  const useWhen = exploreAgent.metadata.useWhen || [];
116024
116048
  const avoidWhen = exploreAgent.metadata.avoidWhen || [];
116049
+ const isZh = isZhLanguage(language);
116050
+ if (isZh) {
116051
+ return `### Explore Agent = \u4E0A\u4E0B\u6587\u641C\u7D22
116052
+
116053
+ \u5C06\u5176\u7528\u4F5C**\u540C\u884C\u5DE5\u5177**\uFF0C\u800C\u4E0D\u662F\u540E\u5907\u3002\u5927\u91CF\u7528\u4E8E\u53D1\u73B0\uFF0C\u800C\u975E\u4F60\u5DF2\u7ECF\u77E5\u9053\u6587\u4EF6\u7684\u641C\u7D22\u3002
116054
+
116055
+ **\u59D4\u6258\u4FE1\u4EFB\u89C4\u5219**\uFF1A\u4E00\u65E6\u4F60\u89E6\u53D1 explore agent \u8FDB\u884C\u641C\u7D22\uFF0C**\u4E0D\u8981\u81EA\u5DF1\u624B\u52A8\u6267\u884C\u76F8\u540C\u7684\u641C\u7D22**\u3002\u4EC5\u5BF9\u975E\u91CD\u53E0\u5DE5\u4F5C\u4F7F\u7528\u76F4\u63A5\u5DE5\u5177\uFF0C\u6216\u8005\u5F53\u4F60\u6545\u610F\u8DF3\u8FC7\u59D4\u6258\u65F6\u3002
116056
+
116057
+ **\u4F7F\u7528\u76F4\u63A5\u5DE5\u5177\u7684\u573A\u666F\uFF1A**
116058
+ ${avoidWhen.map((entry) => `- ${entry}`).join(`
116059
+ `)}
116060
+
116061
+ **\u4F7F\u7528 Explore Agent \u7684\u573A\u666F\uFF1A**
116062
+ ${useWhen.map((entry) => `- ${entry}`).join(`
116063
+ `)}`;
116064
+ }
116025
116065
  return `### Explore Agent = Contextual Grep
116026
116066
 
116027
116067
  Use it as a **peer tool**, not a fallback. Fire liberally for discovery, not for files you already know.
@@ -116036,12 +116076,25 @@ ${avoidWhen.map((entry) => `- ${entry}`).join(`
116036
116076
  ${useWhen.map((entry) => `- ${entry}`).join(`
116037
116077
  `)}`;
116038
116078
  }
116039
- function buildLibrarianSection(agents) {
116079
+ function buildLibrarianSection(agents, language) {
116040
116080
  const librarianAgent = agents.find((agent) => agent.name === "librarian");
116041
116081
  if (!librarianAgent) {
116042
116082
  return "";
116043
116083
  }
116044
116084
  const useWhen = librarianAgent.metadata.useWhen || [];
116085
+ const isZh = isZhLanguage(language);
116086
+ if (isZh) {
116087
+ return `### Librarian Agent = \u53C2\u8003\u641C\u7D22
116088
+
116089
+ \u641C\u7D22**\u5916\u90E8\u53C2\u8003\u8D44\u6599**\uFF08\u6587\u6863\u3001\u5F00\u6E90\u5E93\u3001\u7F51\u7EDC\uFF09\u3002\u5F53\u6D89\u53CA\u4E0D\u719F\u6089\u7684\u5E93\u65F6\u4E3B\u52A8\u89E6\u53D1\u3002
116090
+
116091
+ **\u4E0A\u4E0B\u6587\u641C\u7D22\uFF08\u5185\u90E8\uFF09** - \u641C\u7D22\u6211\u4EEC\u7684\u4EE3\u7801\u5E93\uFF0C\u5728 THIS repo \u4E2D\u67E5\u627E\u6A21\u5F0F\uFF0C\u9879\u76EE\u7279\u5B9A\u903B\u8F91\u3002
116092
+ **\u53C2\u8003\u641C\u7D22\uFF08\u5916\u90E8\uFF09** - \u641C\u7D22\u5916\u90E8\u8D44\u6E90\u3001\u5B98\u65B9 API \u6587\u6863\u3001\u5E93\u6700\u4F73\u5B9E\u8DF5\u3001\u5F00\u6E90\u5B9E\u73B0\u793A\u4F8B\u3002
116093
+
116094
+ **\u89E6\u53D1\u77ED\u8BED**\uFF08\u7ACB\u5373\u89E6\u53D1 librarian\uFF09\uFF1A
116095
+ ${useWhen.map((entry) => `- "${entry}"`).join(`
116096
+ `)}`;
116097
+ }
116045
116098
  return `### Librarian Agent = Reference Grep
116046
116099
 
116047
116100
  Search **external references** (docs, OSS, web). Fire proactively when unfamiliar libraries are involved.
@@ -116053,8 +116106,10 @@ Search **external references** (docs, OSS, web). Fire proactively when unfamilia
116053
116106
  ${useWhen.map((entry) => `- "${entry}"`).join(`
116054
116107
  `)}`;
116055
116108
  }
116056
- function buildDelegationTable(agents) {
116057
- const rows = ["### Delegation Table:", ""];
116109
+ function buildDelegationTable(agents, language) {
116110
+ const rows = [];
116111
+ const isZh = isZhLanguage(language);
116112
+ rows.push(isZh ? "### \u59D4\u6258\u8868\uFF1A" : "### Delegation Table:", "");
116058
116113
  for (const agent of agents) {
116059
116114
  for (const trigger of agent.metadata.triggers) {
116060
116115
  rows.push(`- **${trigger.domain}** \u2192 \`${agent.name}\` - ${trigger.trigger}`);
@@ -116063,17 +116118,54 @@ function buildDelegationTable(agents) {
116063
116118
  return rows.join(`
116064
116119
  `);
116065
116120
  }
116066
- function buildOracleSection(agents) {
116121
+ function buildOracleSection(agents, language) {
116067
116122
  const oracleAgent = agents.find((agent) => agent.name === "oracle");
116068
116123
  if (!oracleAgent) {
116069
116124
  return "";
116070
116125
  }
116071
116126
  const useWhen = oracleAgent.metadata.useWhen || [];
116072
- const avoidWhen = oracleAgent.metadata.avoidWhen || [];
116127
+ const avoidWhen = oracleAgent.metadata.useWhen || [];
116128
+ const isZh = isZhLanguage(language);
116129
+ if (isZh) {
116130
+ return `<Oracle_Usage>
116131
+ ## Oracle - \u53EA\u8BFB\u9AD8\u667A\u5546\u987E\u95EE
116132
+
116133
+ Oracle \u662F\u4E00\u4E2A\u53EA\u8BFB\u7684\u3001\u6602\u8D35\u7684\u3001\u9AD8\u8D28\u91CF\u63A8\u7406\u6A21\u578B\uFF0C\u7528\u4E8E\u8C03\u8BD5\u548C\u67B6\u6784\u3002\u4EC5\u4F9B\u54A8\u8BE2\u3002
116134
+
116135
+ ### \u4F55\u65F6\u54A8\u8BE2\uFF08\u5148\u54A8\u8BE2 Oracle\uFF0C\u518D\u5B9E\u73B0\uFF09\uFF1A
116136
+
116137
+ ${useWhen.map((entry) => `- ${entry}`).join(`
116138
+ `)}
116139
+
116140
+ ### \u4F55\u65F6\u4E0D\u54A8\u8BE2\uFF1A
116141
+
116142
+ ${avoidWhen.map((entry) => `- ${entry}`).join(`
116143
+ `)}
116144
+
116145
+ ### \u4F7F\u7528\u6A21\u5F0F\uFF1A
116146
+ \u8C03\u7528\u524D\u7B80\u8981\u5BA3\u5E03"\u6B63\u5728\u54A8\u8BE2 Oracle [\u539F\u56E0]"\u3002
116147
+
116148
+ **\u4F8B\u5916**\uFF1A\u8FD9\u662F\u552F\u4E00\u5728\u884C\u52A8\u524D\u5BA3\u5E03\u7684\u60C5\u51B5\u3002\u5BF9\u4E8E\u6240\u6709\u5176\u4ED6\u5DE5\u4F5C\uFF0C\u7ACB\u5373\u5F00\u59CB\uFF0C\u4E0D\u505A\u72B6\u6001\u66F4\u65B0\u3002
116149
+
116150
+ ### Oracle \u540E\u53F0\u4EFB\u52A1\u7B56\u7565\uFF1A
116151
+
116152
+ **\u5728\u6700\u7EC8\u7B54\u6848\u524D\u6536\u96C6 Oracle \u7ED3\u679C\u3002\u65E0\u4E00\u4F8B\u5916\u3002**
116153
+
116154
+ **\u4F9D\u8D56 Oracle \u7684\u5B9E\u73B0\u88AB\u963B\u585E\uFF0C\u76F4\u5230 Oracle \u5B8C\u6210\u3002**
116155
+
116156
+ - \u5982\u679C\u4F60\u95EE Oracle \u6709\u5173\u5F71\u54CD\u4FEE\u590D\u7684\u67B6\u6784/\u8C03\u8BD5\u65B9\u5411\uFF0C\u5728 Oracle \u7ED3\u679C\u5230\u8FBE\u524D\u4E0D\u8981\u5B9E\u73B0\u3002
116157
+ - \u7B49\u5F85\u65F6\uFF0C\u4EC5\u505A\u975E\u91CD\u53E0\u7684\u51C6\u5907\u5DE5\u4F5C\u3002\u6C38\u4E0D\u53D1\u9001 Oracle \u88AB\u95EE\u53CA\u7684\u5B9E\u73B0\u51B3\u7B56\u3002
116158
+ - \u6C38\u4E0D"\u8D85\u65F6\u5E76\u7EE7\u7EED"Oracle \u76F8\u5173\u4EFB\u52A1\u3002
116159
+
116160
+ - Oracle \u9700\u8981\u65F6\u95F4\u3002\u5F53\u81EA\u5DF1\u7684\u5DE5\u4F5C\u65F6\u5B8C\u6210\uFF1A**\u7ED3\u675F\u4F60\u7684\u56DE\u590D** - \u7B49\u5F85 \`<system-reminder>\`\u3002
116161
+ - \u4E0D\u8981\u8F6E\u8BE2 \`background_output\` \u83B7\u53D6\u8FD0\u884C\u4E2D\u7684 Oracle\u3002\u901A\u77E5\u4F1A\u6765\u3002
116162
+ - \u6C38\u4E0D\u53D6\u6D88 Oracle\u3002
116163
+ </Oracle_Usage>`;
116164
+ }
116073
116165
  return `<Oracle_Usage>
116074
116166
  ## Oracle - Read-Only High-IQ Consultant
116075
116167
 
116076
- Oracle is a read-only, expensive, high-quality reasoning model for debugging and architecture. Consultation only.
116168
+ Oracle is a read-only, expensive, high quality reasoning model for debugging and architecture. Consultation only.
116077
116169
 
116078
116170
  ### WHEN to Consult (Oracle FIRST, then implement):
116079
116171
 
@@ -116105,11 +116197,24 @@ Briefly announce "Consulting Oracle for [reason]" before invocation.
116105
116197
  - Never cancel Oracle.
116106
116198
  </Oracle_Usage>`;
116107
116199
  }
116108
- function buildNonClaudePlannerSection(model) {
116200
+ function buildNonClaudePlannerSection(model, language) {
116109
116201
  const isNonClaude = !model.toLowerCase().includes("claude");
116110
116202
  if (!isNonClaude) {
116111
116203
  return "";
116112
116204
  }
116205
+ const isZh = isZhLanguage(language);
116206
+ if (isZh) {
116207
+ return `### \u8BA1\u5212 Agent \u4F9D\u8D56\uFF08\u975E Claude\uFF09
116208
+
116209
+ \u591A\u6B65\u9AA4\u4EFB\u52A1\uFF1F**\u59CB\u7EC8\u5148\u54A8\u8BE2\u8BA1\u5212 Agent**\u3002\u6CA1\u6709\u8BA1\u5212\u4E0D\u8981\u5F00\u59CB\u5B9E\u73B0\u3002
116210
+
116211
+ - \u5355\u6587\u4EF6\u4FEE\u590D\u6216\u7B80\u5355\u66F4\u6539 \u2192 \u76F4\u63A5\u7EE7\u7EED
116212
+ - \u5176\u4ED6\uFF082+ \u6B65\u9AA4\u3001\u8303\u56F4\u4E0D\u6E05\u3001\u67B6\u6784\uFF09\u2192 \u5148 \`task(subagent_type="plan", ...)\`
116213
+ - \u4F7F\u7528 \`task_id\` \u6062\u590D\u76F8\u540C\u7684\u8BA1\u5212 Agent - \u79EF\u6781\u63D0\u51FA\u540E\u7EED\u95EE\u9898
116214
+ - \u5982\u679C\u4EFB\u4F55\u90E8\u5206\u4E0D\u660E\u786E\uFF0C\u5728\u731C\u6D4B\u524D\u5148\u95EE\u8BA1\u5212 Agent
116215
+
116216
+ \u8BA1\u5212 Agent \u8FD4\u56DE\u7ED3\u6784\u5316\u7684\u5DE5\u4F5C\u5206\u89E3\u548C\u5E76\u884C\u6267\u884C\u673A\u4F1A\u3002\u9075\u5FAA\u5B83\u3002`;
116217
+ }
116113
116218
  return `### Plan Agent Dependency (Non-Claude)
116114
116219
 
116115
116220
  Multi-step task? **ALWAYS consult Plan Agent first.** Do NOT start implementation without a plan.
@@ -116121,12 +116226,41 @@ Multi-step task? **ALWAYS consult Plan Agent first.** Do NOT start implementatio
116121
116226
 
116122
116227
  Plan Agent returns a structured work breakdown with parallel execution opportunities. Follow it.`;
116123
116228
  }
116124
- function buildParallelDelegationSection(model, categories2) {
116229
+ function buildParallelDelegationSection(model, categories2, language) {
116125
116230
  const isNonClaude = !model.toLowerCase().includes("claude");
116126
116231
  const hasDelegationCategory = categories2.some((category) => category.name === "deep" || category.name === "unspecified-high");
116127
116232
  if (!isNonClaude || !hasDelegationCategory) {
116128
116233
  return "";
116129
116234
  }
116235
+ const isZh = isZhLanguage(language);
116236
+ if (isZh) {
116237
+ return `### \u5206\u89E3\u5E76\u59D4\u6258 - \u4F60\u4E0D\u662F\u5B9E\u73B0\u8005
116238
+
116239
+ **\u4F60\u7684\u5931\u8D25\u6A21\u5F0F\uFF1A\u4F60\u8BD5\u56FE\u81EA\u5DF1\u5B8C\u6210\u5DE5\u4F5C\u800C\u4E0D\u662F\u5206\u89E3\u548C\u59D4\u6258\u3002** \u5F53\u4F60\u76F4\u63A5\u5B9E\u73B0\u65F6\uFF0C\u7ED3\u679C\u6BD4\u4E13\u4E1A subagents \u5B9E\u73B0\u7684\u7ED3\u679C\u8981\u5DEE\u5F97\u591A\u3002Subagents \u6709\u9886\u57DF\u7279\u5B9A\u914D\u7F6E\u3001\u52A0\u8F7D\u7684\u6280\u80FD\u548C\u8C03\u4F18\u7684\u63D0\u793A\u8BCD\uFF0C\u800C\u4F60\u6CA1\u6709\u3002
116240
+
116241
+ **\u4EFB\u4F55\u5B9E\u73B0\u4EFB\u52A1\u7684\u5F3A\u5236\u8981\u6C42\uFF1A**
116242
+
116243
+ 1. **\u59CB\u7EC8\u5C06\u4EFB\u52A1\u5206\u89E3**\u4E3A\u72EC\u7ACB\u5DE5\u4F5C\u5355\u5143\u3002\u65E0\u4E00\u4F8B\u5916\u3002\u5373\u4F7F\u4EFB\u52A1"\u770B\u8D77\u6765\u5F88\u5C0F"\uFF0C\u4E5F\u8981\u5206\u89E3\u3002
116244
+ 2. **\u59CB\u7EC8\u5C06\u6BCF\u4E2A\u5355\u5143\u59D4\u6258**\u7ED9 \`deep\` \u6216 \`unspecified-high\` agent \u5E76\u884C\u6267\u884C\uFF08\`run_in_background=true\`\uFF09\u3002
116245
+ 3. **\u6C38\u8FDC\u4E0D\u8981\u987A\u5E8F\u5DE5\u4F5C\u3002** \u5982\u679C\u6709 4 \u4E2A\u72EC\u7ACB\u5355\u5143\uFF0C\u540C\u65F6\u751F\u6210 4 \u4E2A\u3002\u4E0D\u662F\u4E00\u6B21 1 \u4E2A\u3002\u4E0D\u662F 2 \u7136\u540E 2\u3002
116246
+ 4. **\u5F53\u53EF\u4EE5\u59D4\u6258\u65F6\uFF0C\u6C38\u8FDC\u4E0D\u8981\u76F4\u63A5\u5B9E\u73B0\u3002** \u4F60\u5199\u63D0\u793A\u8BCD\uFF0C\u4E0D\u662F\u4EE3\u7801\u3002
116247
+
116248
+ **\u4F60\u5BF9\u6BCF\u4E2A subagent \u7684\u63D0\u793A\u8BCD\u5FC5\u987B\u5305\u62EC\uFF1A**
116249
+ - GOAL \u5305\u542B\u660E\u786E\u6210\u529F\u6807\u51C6\uFF08"\u5B8C\u6210"\u662F\u4EC0\u4E48\u6837\uFF09
116250
+ - \u6587\u4EF6\u8DEF\u5F84\u548C\u7EA6\u675F\uFF08\u5728\u54EA\u91CC\u5DE5\u4F5C\uFF0C\u4E0D\u78B0\u4EC0\u4E48\uFF09
116251
+ - \u8981\u9075\u5FAA\u7684\u73B0\u6709\u6A21\u5F0F\uFF08\u5F15\u7528 subagent \u5E94\u8BE5\u8BFB\u53D6\u7684\u5177\u4F53\u6587\u4EF6\uFF09
116252
+ - \u6E05\u6670\u7684\u8303\u56F4\u8FB9\u754C\uFF08\u4EC0\u4E48\u662F\u8303\u56F4\u5185\uFF0C\u4EC0\u4E48\u662F\u8303\u56F4\u5916\uFF09
116253
+
116254
+ **\u6A21\u7CCA\u59D4\u6258 = \u5931\u8D25\u59D4\u6258\u3002** \u5982\u679C\u4F60\u5BF9 subagent \u7684\u63D0\u793A\u8BCD\u77ED\u4E8E 5 \u884C\uFF0C\u90A3\u5C31\u592A\u6A21\u7CCA\u4E86\u3002
116255
+
116256
+ | \u4F60\u60F3\u505A\u4EC0\u4E48 | \u4F60\u5FC5\u987B\u505A\u4EC0\u4E48 |
116257
+ |---|---|
116258
+ | \u81EA\u5DF1\u5199\u4EE3\u7801 | \u59D4\u6258\u7ED9 \`deep\` \u6216 \`unspecified-high\` agent |
116259
+ | \u987A\u5E8F\u5904\u7406 3 \u4E2A\u66F4\u6539 | \u5E76\u884C\u751F\u6210 3 \u4E2A agents |
116260
+ | "\u5FEB\u901F\u4FEE\u590D\u8FD9\u4E00\u4EF6\u4E8B" | \u4ECD\u7136\u59D4\u6258 - \u4F60\u7684"\u5FEB\u901F\u4FEE\u590D"\u6BD4 subagent \u66F4\u6162\u66F4\u5DEE |
116261
+
116262
+ **\u4F60\u7684\u4EF7\u503C\u662F\u7F16\u6392\u3001\u5206\u89E3\u548C\u8D28\u91CF\u63A7\u5236\u3002\u7528 crystal-clear \u63D0\u793A\u8BCD\u59D4\u6258\u624D\u662F\u4F60\u7684\u5DE5\u4F5C\u3002**`;
116263
+ }
116130
116264
  return `### DECOMPOSE AND DELEGATE - YOU ARE NOT AN IMPLEMENTER
116131
116265
 
116132
116266
  **YOUR FAILURE MODE: You attempt to do work yourself instead of decomposing and delegating.** When you implement directly, the result is measurably worse than when specialized subagents do it. Subagents have domain-specific configurations, loaded skills, and tuned prompts that you lack.
@@ -116155,59 +116289,62 @@ function buildParallelDelegationSection(model, categories2) {
116155
116289
  **Your value is orchestration, decomposition, and quality control. Delegating with crystal-clear prompts IS your work.**`;
116156
116290
  }
116157
116291
  // src/agents/dynamic-agent-category-skills-guide.ts
116158
- function buildSkillsSection(skills2) {
116292
+ function buildSkillsSection(skills2, language) {
116159
116293
  const builtinSkills = skills2.filter((skill2) => skill2.location === "plugin");
116160
116294
  const customSkills = skills2.filter((skill2) => skill2.location !== "plugin");
116295
+ const isZh = isZhLanguage(language);
116161
116296
  const builtinNames = builtinSkills.map((skill2) => skill2.name).join(", ");
116162
116297
  const customNames = customSkills.map((skill2) => {
116163
116298
  const source = skill2.location === "project" ? "project" : "user";
116164
116299
  return `${skill2.name} (${source})`;
116165
116300
  }).join(", ");
116166
116301
  if (customSkills.length > 0 && builtinSkills.length > 0) {
116167
- return `#### Available Skills (via \`skill\` tool)
116302
+ return `#### ${isZh ? "\u53EF\u7528\u6280\u80FD\uFF08\u901A\u8FC7 `skill` \u5DE5\u5177\uFF09" : "Available Skills (via `skill` tool)"}
116168
116303
 
116169
116304
  **Built-in**: ${builtinNames}
116170
116305
  **\u26A1 YOUR SKILLS (PRIORITY)**: ${customNames}
116171
116306
 
116172
- > User-installed skills OVERRIDE built-in defaults. ALWAYS prefer YOUR SKILLS when domain matches.
116173
- > Full skill descriptions \u2192 use the \`skill\` tool to check before EVERY delegation.`;
116307
+ > User-installed skills OVERRIDE built-in defaults. ${isZh ? "\u5F53\u9886\u57DF\u5339\u914D\u65F6\uFF0C\u59CB\u7EC8\u4F18\u5148\u4F7F\u7528\u4F60\u7684\u6280\u80FD\u3002" : "ALWAYS prefer YOUR SKILLS when domain matches."}
116308
+ > ${isZh ? "\u5B8C\u6574\u6280\u80FD\u63CF\u8FF0 \u2192 \u4F7F\u7528 `skill` \u5DE5\u5177\u5728\u6BCF\u6B21\u59D4\u6258\u524D\u68C0\u67E5\u3002" : "Full skill descriptions \u2192 use the `skill` tool to check before EVERY delegation."}`;
116174
116309
  }
116175
116310
  if (customSkills.length > 0) {
116176
- return `#### Available Skills (via \`skill\` tool)
116311
+ return `#### ${isZh ? "\u53EF\u7528\u6280\u80FD\uFF08\u901A\u8FC7 `skill` \u5DE5\u5177\uFF09" : "Available Skills (via `skill` tool)"}
116177
116312
 
116178
116313
  **\u26A1 YOUR SKILLS (PRIORITY)**: ${customNames}
116179
116314
 
116180
- > User-installed skills OVERRIDE built-in defaults. ALWAYS prefer YOUR SKILLS when domain matches.
116181
- > Full skill descriptions \u2192 use the \`skill\` tool to check before EVERY delegation.`;
116315
+ > User-installed skills OVERRIDE built-in defaults. ${isZh ? "\u5F53\u9886\u57DF\u5339\u914D\u65F6\uFF0C\u59CB\u7EC8\u4F18\u5148\u4F7F\u7528\u4F60\u7684\u6280\u80FD\u3002" : "ALWAYS prefer YOUR SKILLS when domain matches."}
116316
+ > ${isZh ? "\u5B8C\u6574\u6280\u80FD\u63CF\u8FF0 \u2192 \u4F7F\u7528 `skill` \u5DE5\u5177\u5728\u6BCF\u6B21\u59D4\u6258\u524D\u68C0\u67E5\u3002" : "Full skill descriptions \u2192 use the `skill` tool to check before EVERY delegation."}`;
116182
116317
  }
116183
116318
  if (builtinSkills.length > 0) {
116184
- return `#### Available Skills (via \`skill\` tool)
116319
+ return `#### ${isZh ? "\u53EF\u7528\u6280\u80FD\uFF08\u901A\u8FC7 `skill` \u5DE5\u5177\uFF09" : "Available Skills (via `skill` tool)"}
116185
116320
 
116186
116321
  **Built-in**: ${builtinNames}
116187
116322
 
116188
- > Full skill descriptions \u2192 use the \`skill\` tool to check before EVERY delegation.`;
116323
+ > ${isZh ? "\u5B8C\u6574\u6280\u80FD\u63CF\u8FF0 \u2192 \u4F7F\u7528 `skill` \u5DE5\u5177\u5728\u6BCF\u6B21\u59D4\u6258\u524D\u68C0\u67E5\u3002" : "Full skill descriptions \u2192 use the `skill` tool to check before EVERY delegation."}`;
116189
116324
  }
116190
116325
  return "";
116191
116326
  }
116192
- function buildCategorySkillsDelegationGuide(categories2, skills2) {
116327
+ function buildCategorySkillsDelegationGuide(categories2, skills2, language) {
116193
116328
  if (categories2.length === 0 && skills2.length === 0) {
116194
116329
  return "";
116195
116330
  }
116331
+ const isZh = isZhLanguage(language);
116196
116332
  const categoryRows = categories2.map((category) => {
116197
116333
  const description = category.description || category.name;
116198
- return `- \`${category.name}\` - ${description}`;
116334
+ return `- \`${category.name}\`: ${description}`;
116199
116335
  });
116200
116336
  const customSkills = skills2.filter((skill2) => skill2.location !== "plugin");
116201
- const skillsSection = buildSkillsSection(skills2);
116202
- const customPriorityNote = customSkills.length > 0 ? `
116337
+ const skillsSection = buildSkillsSection(skills2, language);
116338
+ const customPriorityNote = customSkills.length > 0 ? isZh ? `
116339
+ > **\u7528\u6237\u5B89\u88C5\u6280\u80FD\u4F18\u5148\u3002** \u6709\u7591\u95EE\u65F6\uFF0C\u5305\u542B\u800C\u4E0D\u662F\u7701\u7565\u3002` : `
116203
116340
  > **User-installed skills get PRIORITY.** When in doubt, INCLUDE rather than omit.` : "";
116204
- return `### Category + Skills Delegation System
116341
+ return `### ${isZh ? "\u7C7B\u522B + \u6280\u80FD\u59D4\u6258\u7CFB\u7EDF" : "Category + Skills Delegation System"}
116205
116342
 
116206
- **task() combines categories and skills for optimal task execution.**
116343
+ ${isZh ? "**task() \u7ED3\u5408\u7C7B\u522B\u548C\u6280\u80FD\u4EE5\u5B9E\u73B0\u6700\u4F73\u4EFB\u52A1\u6267\u884C\u3002**" : "**task() combines categories and skills for optimal task execution."}
116207
116344
 
116208
- #### Available Categories (Domain-Optimized Models)
116345
+ #### ${isZh ? "\u53EF\u7528\u7C7B\u522B\uFF08\u9886\u57DF\u4F18\u5316\u6A21\u578B\uFF09" : "Available Categories (Domain-Optimized Models)"}
116209
116346
 
116210
- Each category is configured with a model optimized for that domain. Read the description to understand when to use it.
116347
+ ${isZh ? "\u6BCF\u4E2A\u7C7B\u522B\u914D\u7F6E\u4E86\u9488\u5BF9\u8BE5\u9886\u57DF\u4F18\u5316\u7684\u6A21\u578B\u3002\u9605\u8BFB\u63CF\u8FF0\u4EE5\u4E86\u89E3\u4F55\u65F6\u4F7F\u7528\u3002" : "Each category is configured with a model optimized for that domain. Read the description to understand when to use it."}
116211
116348
 
116212
116349
  ${categoryRows.join(`
116213
116350
  `)}
@@ -116216,66 +116353,76 @@ ${skillsSection}
116216
116353
 
116217
116354
  ---
116218
116355
 
116219
- ### MANDATORY: Category + Skill Selection Protocol
116356
+ ### ${isZh ? "\u5F3A\u5236\uFF1A\u7C7B\u522B + \u6280\u80FD\u9009\u62E9\u534F\u8BAE" : "MANDATORY: Category + Skill Selection Protocol"}
116220
116357
 
116221
- **STEP 1: Select Category**
116222
- - Read each category's description
116223
- - Match task requirements to category domain
116224
- - Select the category whose domain BEST fits the task
116358
+ **STEP 1: ${isZh ? "\u9009\u62E9\u7C7B\u522B" : "Select Category"}**
116359
+ - ${isZh ? "\u9605\u8BFB\u6BCF\u4E2A\u7C7B\u522B\u7684\u63CF\u8FF0" : "Read each category's description"}
116360
+ - ${isZh ? "\u5C06\u4EFB\u52A1\u9700\u6C42\u4E0E\u7C7B\u522B\u9886\u57DF\u5339\u914D" : "Match task requirements to category domain"}
116361
+ - ${isZh ? "\u9009\u62E9\u4E0E\u4EFB\u52A1\u9886\u57DF\u6700\u5339\u914D\u7684\u7C7B\u522B" : "Select the category whose domain BEST fits the task"}
116225
116362
 
116226
- **STEP 2: Evaluate ALL Skills**
116227
- Check the \`skill\` tool for available skills and their descriptions. For EVERY skill, ask:
116228
- > "Does this skill's expertise domain overlap with my task?"
116363
+ **STEP 2: ${isZh ? "\u8BC4\u4F30\u6240\u6709\u6280\u80FD" : "Evaluate ALL Skills"}**
116364
+ ${isZh ? "\u68C0\u67E5 `skill` \u5DE5\u5177\u7684\u53EF\u7528\u6280\u80FD\u53CA\u5176\u63CF\u8FF0\u3002\u5BF9\u4E8E\u6BCF\u4E2A\u6280\u80FD\uFF0C\u95EE\uFF1A" : "Check the `skill` tool for available skills and their descriptions. For EVERY skill, ask:"}
116365
+ > ${isZh ? "\u300C\u8FD9\u4E2A\u6280\u80FD\u7684\u4E13\u4E1A\u9886\u57DF\u4E0E\u6211\u7684\u4EFB\u52A1\u6709\u91CD\u53E0\u5417\uFF1F\u300D" : "\u300CDoes this skill's expertise domain overlap with my task?\u300D"}
116229
116366
 
116230
- - If YES \u2192 INCLUDE in \`load_skills=[...]\`
116231
- - If NO \u2192 OMIT (no justification needed)${customPriorityNote}
116367
+ - ${isZh ? "\u662F \u2192 \u5728 `load_skills=[...]` \u4E2D\u5305\u542B" : "If YES \u2192 INCLUDE in `load_skills=[...]`"}
116368
+ - ${isZh ? "\u5426 \u2192 \u7701\u7565\uFF08\u65E0\u9700\u89E3\u91CA\uFF09" : "If NO \u2192 OMIT (no justification needed)"}${customPriorityNote}
116232
116369
 
116233
116370
  ---
116234
116371
 
116235
- ### Delegation Pattern
116372
+ ### ${isZh ? "\u59D4\u6258\u6A21\u5F0F" : "Delegation Pattern"}
116236
116373
 
116237
116374
  \`\`\`typescript
116238
116375
  task(
116239
116376
  category="[selected-category]",
116240
- load_skills=["skill-1", "skill-2"], // Include ALL relevant skills - ESPECIALLY user-installed ones
116377
+ load_skills=["skill-1", "skill-2"], // ${isZh ? "\u5305\u542B\u6240\u6709\u76F8\u5173\u6280\u80FD\u2014\u2014\u5C24\u5176\u662F\u7528\u6237\u5B89\u88C5\u7684" : "Include ALL relevant skills - ESPECIALLY user-installed ones"}
116241
116378
  prompt="..."
116242
116379
  )
116243
116380
  \`\`\`
116244
116381
 
116245
- **ANTI-PATTERN (will produce poor results):**
116382
+ **${isZh ? "\u53CD\u6A21\u5F0F\uFF08\u4F1A\u4EA7\u751F\u8F83\u5DEE\u7ED3\u679C\uFF09\uFF1A" : "ANTI-PATTERN (will produce poor results):"}**
116246
116383
  \`\`\`typescript
116247
- task(category="...", load_skills=[], run_in_background=false, prompt="...") // Empty load_skills without justification
116384
+ task(category="...", load_skills=[], run_in_background=false, prompt="...") // ${isZh ? "\u7A7A load_skills \u4E14\u65E0\u89E3\u91CA" : "Empty load_skills without justification"}
116248
116385
  \`\`\`
116249
116386
 
116250
116387
  ---
116251
116388
 
116252
- ### Category Domain Matching (ZERO TOLERANCE)
116389
+ ### ${isZh ? "\u7C7B\u522B\u9886\u57DF\u5339\u914D\uFF08\u96F6\u5BB9\u5FCD\uFF09" : "Category Domain Matching (ZERO TOLERANCE)"}
116253
116390
 
116254
- 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.
116391
+ ${isZh ? "\u6BCF\u6B21\u59D4\u6258\u5FC5\u987B\u4F7F\u7528\u4E0E\u4EFB\u52A1\u9886\u57DF\u5339\u914D\u7684\u7C7B\u522B\u3002\u9519\u8BEF\u7684\u7C7B\u522B\u5339\u914D\u4F1A\u4EA7\u751F\u660E\u663E\u66F4\u5DEE\u7684\u8F93\u51FA\uFF0C\u56E0\u4E3A\u6BCF\u4E2A\u7C7B\u522B\u8FD0\u884C\u5728\u9488\u5BF9\u7279\u5B9A\u9886\u57DF\u4F18\u5316\u7684\u6A21\u578B\u4E0A\u3002" : "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."}
116255
116392
 
116256
- **VISUAL WORK = ALWAYS \`visual-engineering\`. NO EXCEPTIONS.**
116393
+ **${isZh ? "\u89C6\u89C9\u5DE5\u4F5C = \u59CB\u7EC8\u4F7F\u7528 `visual-engineering`\u3002\u65E0\u4F8B\u5916\u3002" : "VISUAL WORK = ALWAYS `visual-engineering`. NO EXCEPTIONS."}**
116257
116394
 
116258
- 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.
116395
+ ${isZh ? "\u4EFB\u4F55\u6D89\u53CA UI\u3001UX\u3001CSS\u3001\u6837\u5F0F\u3001\u5E03\u5C40\u3001\u52A8\u753B\u3001\u8BBE\u8BA1\u6216\u524D\u7AEF\u7EC4\u4EF6\u7684\u4EFB\u52A1\u5FC5\u987B\u4F7F\u7528 `visual-engineering`\u3002\u6C38\u8FDC\u4E0D\u8981\u5C06\u89C6\u89C9\u5DE5\u4F5C\u59D4\u6258\u7ED9 `quick`\u3001`unspecified-*` \u6216\u5176\u4ED6\u7C7B\u522B\u3002" : "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."}
116259
116396
 
116260
116397
  \`\`\`typescript
116261
- // CORRECT: Visual work \u2192 visual-engineering category
116398
+ // ${isZh ? "\u6B63\u786E\uFF1A\u89C6\u89C9\u5DE5\u4F5C \u2192 visual-engineering \u7C7B\u522B" : "CORRECT: Visual work \u2192 visual-engineering category"}
116262
116399
  task(category="visual-engineering", load_skills=["frontend-ui-ux"], prompt="Redesign the sidebar layout with new spacing...")
116263
116400
 
116264
- // WRONG: Visual work in wrong category - WILL PRODUCE INFERIOR RESULTS
116401
+ // ${isZh ? "\u9519\u8BEF\uFF1A\u89C6\u89C9\u5DE5\u4F5C\u4F7F\u7528\u9519\u8BEF\u7C7B\u522B\u2014\u2014\u4F1A\u4EA7\u751F\u8F83\u5DEE\u7ED3\u679C" : "WRONG: Visual work in wrong category - WILL PRODUCE INFERIOR RESULTS"}
116265
116402
  task(category="quick", load_skills=[], prompt="Redesign the sidebar layout with new spacing...")
116266
116403
  \`\`\`
116267
116404
 
116268
- | Task Domain | MUST Use Category |
116405
+ | ${isZh ? "\u4EFB\u52A1\u9886\u57DF" : "Task Domain"} | ${isZh ? "\u5FC5\u987B\u4F7F\u7528\u7C7B\u522B" : "MUST Use Category"} |
116269
116406
  |---|---|
116270
- | UI, styling, animations, layout, design | \`visual-engineering\` |
116271
- | Hard logic, architecture decisions, algorithms | \`ultrabrain\` |
116272
- | Autonomous research + end-to-end implementation | \`deep\` |
116273
- | Single-file typo, trivial config change | \`quick\` |
116407
+ | ${isZh ? "UI\u3001\u6837\u5F0F\u3001\u52A8\u753B\u3001\u5E03\u5C40\u3001\u8BBE\u8BA1" : "UI, styling, animations, layout, design"} | \`visual-engineering\` |
116408
+ | ${isZh ? "\u786C\u903B\u8F91\u3001\u67B6\u6784\u51B3\u7B56\u3001\u7B97\u6CD5" : "Hard logic, architecture decisions, algorithms"} | \`ultrabrain\` |
116409
+ | ${isZh ? "\u81EA\u4E3B\u7814\u7A76 + \u7AEF\u5230\u7AEF\u5B9E\u73B0" : "Autonomous research + end-to-end implementation"} | \`deep\` |
116410
+ | ${isZh ? "\u5355\u6587\u4EF6\u62FC\u5199\u9519\u8BEF\u3001\u7B80\u5355\u914D\u7F6E\u66F4\u6539" : "Single-file typo, trivial config change"} | \`quick\` |
116274
116411
 
116275
- **When in doubt about category, it is almost never \`quick\` or \`unspecified-*\`. Match the domain.**`;
116412
+ **${isZh ? "\u5F53\u5BF9\u7C7B\u522B\u6709\u7591\u95EE\u65F6\uFF0C\u5B83\u51E0\u4E4E\u6C38\u8FDC\u4E0D\u662F `quick` \u6216 `unspecified-*`\u3002\u5339\u914D\u9886\u57DF\u3002" : "When in doubt about category, it is almost never `quick` or `unspecified-*`. Match the domain."}**`;
116276
116413
  }
116277
116414
  // src/agents/dynamic-agent-policy-sections.ts
116278
- function buildHardBlocksSection() {
116415
+ function buildHardBlocksSection(language) {
116416
+ if (isZhLanguage(language)) {
116417
+ return `## \u786C\u6027\u7981\u6B62\uFF08\u6C38\u4E0D\u8FDD\u53CD\uFF09
116418
+
116419
+ - \u7981\u6B62\u7C7B\u578B\u9519\u8BEF\u538B\u5236\uFF08\`as any\`\u3001\`@ts-ignore\`\uFF09\u2014\u2014\u6C38\u4E0D
116420
+ - \u672A\u7ECF\u660E\u786E\u8981\u6C42\u7981\u6B62\u63D0\u4EA4\u2014\u2014\u6C38\u4E0D
116421
+ - \u7981\u6B62\u63A8\u6D4B\u672A\u8BFB\u4EE3\u7801\u2014\u2014\u6C38\u4E0D
116422
+ - \u5931\u8D25\u540E\u7981\u6B62\u7559\u4E0B\u635F\u574F\u4EE3\u7801\u2014\u2014\u6C38\u4E0D
116423
+ - \`background_cancel(all=true)\`\u2014\u2014\u6C38\u4E0D\u3002\u59CB\u7EC8\u6309 taskId \u5355\u72EC\u53D6\u6D88\u3002
116424
+ - \u6536\u96C6 Oracle \u7ED3\u679C\u524D\u7981\u6B62\u4EA4\u4ED8\u6700\u7EC8\u7B54\u6848\u2014\u2014\u6C38\u4E0D\u3002`;
116425
+ }
116279
116426
  const blocks = [
116280
116427
  "- Type error suppression (`as any`, `@ts-ignore`) - **Never**",
116281
116428
  "- Commit without explicit request - **Never**",
@@ -116289,7 +116436,19 @@ function buildHardBlocksSection() {
116289
116436
  ${blocks.join(`
116290
116437
  `)}`;
116291
116438
  }
116292
- function buildAntiPatternsSection() {
116439
+ function buildAntiPatternsSection(language) {
116440
+ if (isZhLanguage(language)) {
116441
+ return `## \u53CD\u6A21\u5F0F\uFF08\u963B\u585E\u6027\u8FDD\u89C4\uFF09
116442
+
116443
+ - **\u7C7B\u578B\u5B89\u5168**\uFF1A\`as any\`\u3001\`@ts-ignore\`\u3001\`@ts-expect-error\`
116444
+ - **\u9519\u8BEF\u5904\u7406**\uFF1A\u7A7A catch \u5757 \`catch(e) {}\`
116445
+ - **\u6D4B\u8BD5**\uFF1A\u5220\u9664\u5931\u8D25\u7684\u6D4B\u8BD5\u4EE5"\u901A\u8FC7"
116446
+ - **\u641C\u7D22**\uFF1A\u4E3A\u5355\u884C\u62FC\u5199\u9519\u8BEF\u6216\u660E\u663E\u8BED\u6CD5\u9519\u8BEF\u89E6\u53D1 agents
116447
+ - **\u8C03\u8BD5**\uFF1A\u9730\u5F39\u5F0F\u8C03\u8BD5\uFF0C\u968F\u673A\u66F4\u6539
116448
+ - **\u540E\u53F0\u4EFB\u52A1**\uFF1A\u8F6E\u8BE2\u8FD0\u884C\u4E2D\u4EFB\u52A1\u7684 \`background_output\`\u2014\u2014\u7ED3\u675F\u56DE\u590D\u5E76\u7B49\u5F85\u901A\u77E5
116449
+ - **\u59D4\u6258\u91CD\u590D**\uFF1A\u59D4\u6258 explore/librarian \u540E\u81EA\u5DF1\u624B\u52A8\u505A\u76F8\u540C\u641C\u7D22
116450
+ - **Oracle**\uFF1A\u4E0D\u6536\u96C6 Oracle \u7ED3\u679C\u5C31\u4EA4\u4ED8\u7B54\u6848`;
116451
+ }
116293
116452
  const patterns = [
116294
116453
  "- **Type Safety**: `as any`, `@ts-ignore`, `@ts-expect-error`",
116295
116454
  "- **Error Handling**: Empty catch blocks `catch(e) {}`",
@@ -116305,7 +116464,24 @@ function buildAntiPatternsSection() {
116305
116464
  ${patterns.join(`
116306
116465
  `)}`;
116307
116466
  }
116308
- function buildToolCallFormatSection() {
116467
+ function buildToolCallFormatSection(language) {
116468
+ if (isZhLanguage(language)) {
116469
+ return `## \u5DE5\u5177\u8C03\u7528\u683C\u5F0F\uFF08\u5173\u952E\uFF09
116470
+
116471
+ **\u59CB\u7EC8\u4F7F\u7528\u539F\u751F\u5DE5\u5177\u8C03\u7528\u673A\u5236\u3002\u6C38\u4E0D\u5C06\u5DE5\u5177\u8C03\u7528\u8F93\u51FA\u4E3A\u6587\u672C\u3002**
116472
+
116473
+ \u5F53\u9700\u8981\u8C03\u7528\u5DE5\u5177\u65F6\uFF1A
116474
+ 1. \u4F7F\u7528\u7CFB\u7EDF\u63D0\u4F9B\u7684\u5DE5\u5177\u8C03\u7528\u63A5\u53E3
116475
+ 2. \u4E0D\u8981\u5C06\u5DE5\u5177\u8C03\u7528\u5199\u6210\u7EAF\u6587\u672C\uFF0C\u5982 \`assistant to=functions.XXX\`
116476
+ 3. \u4E0D\u8981\u5728\u6587\u672C\u56DE\u590D\u4E2D\u76F4\u63A5\u8F93\u51FA JSON
116477
+ 4. \u7CFB\u7EDF\u81EA\u52A8\u5904\u7406\u5DE5\u5177\u8C03\u7528\u683C\u5F0F
116478
+
116479
+ **\u6B63\u786E**\uFF1A\u901A\u8FC7\u5DE5\u5177\u8C03\u7528\u63A5\u53E3\u8C03\u7528
116480
+ **\u9519\u8BEF**\uFF1A\u5C06 \`assistant to=functions.todowrite\` \u6216 \`json
116481
+ {...}\` \u4F5C\u4E3A\u6587\u672C\u5199\u5165
116482
+
116483
+ \u4F60\u7684\u5DE5\u5177\u8C03\u7528\u81EA\u52A8\u5904\u7406\u3002\u4EC5\u8C03\u7528\u5DE5\u5177\u2014\u2014\u4E0D\u8981\u81EA\u5DF1\u683C\u5F0F\u5316\u8C03\u7528\u3002`;
116484
+ }
116309
116485
  return `## Tool Call Format (CRITICAL)
116310
116486
 
116311
116487
  **ALWAYS use the native tool calling mechanism. NEVER output tool calls as text.**
@@ -116322,7 +116498,54 @@ When you need to call a tool:
116322
116498
 
116323
116499
  Your tool calls are processed automatically. Just invoke the tool - do not format the call yourself.`;
116324
116500
  }
116325
- function buildAntiDuplicationSection() {
116501
+ function buildAntiDuplicationSection(language) {
116502
+ if (isZhLanguage(language)) {
116503
+ return `<Anti_Duplication>
116504
+ ## \u9632\u91CD\u590D\u89C4\u5219\uFF08\u5173\u952E\uFF09
116505
+
116506
+ \u4E00\u65E6\u5C06\u63A2\u7D22\u59D4\u6258\u7ED9 explore/librarian agents\uFF0C**\u4E0D\u8981\u81EA\u5DF1\u6267\u884C\u76F8\u540C\u7684\u641C\u7D22**\u3002
116507
+
116508
+ ### \u542B\u4E49
116509
+
116510
+ **\u7981\u6B62\uFF1A**
116511
+ - \u89E6\u53D1 explore/librarian \u540E\uFF0C\u624B\u52A8 grep/\u641C\u7D22\u76F8\u540C\u4FE1\u606F
116512
+ - \u91CD\u505A agents \u521A\u88AB\u59D4\u6258\u7684\u7814\u7A76
116513
+ - "\u5FEB\u901F\u68C0\u67E5"\u540E\u53F0 agents \u6B63\u5728\u68C0\u67E5\u7684\u76F8\u540C\u6587\u4EF6
116514
+
116515
+ **\u5141\u8BB8\uFF1A**
116516
+ - \u7EE7\u7EED**\u975E\u91CD\u53E0\u5DE5\u4F5C**\u2014\u2014\u4E0D\u4F9D\u8D56\u4E8E\u59D4\u6258\u7814\u7A76\u7684\u5DE5\u4F5C
116517
+ - \u5728\u4EE3\u7801\u5E93\u65E0\u5173\u90E8\u5206\u5DE5\u4F5C
116518
+ - \u51C6\u5907\u5DE5\u4F5C\uFF08\u5982\u8BBE\u7F6E\u6587\u4EF6\u3001\u914D\u7F6E\uFF09
116519
+
116520
+ ### \u6B63\u786E\u7B49\u5F85\u7ED3\u679C\uFF1A
116521
+
116522
+ \u5F53\u9700\u8981\u59D4\u6258\u7ED3\u679C\u4F46\u8FD8\u6CA1\u51C6\u5907\u597D\u65F6\uFF1A
116523
+
116524
+ 1. **\u7ED3\u675F\u56DE\u590D**\u2014\u2014\u4E0D\u8981\u7EE7\u7EED\u4F9D\u8D56\u90A3\u4E9B\u7ED3\u679C\u7684\u5DE5\u4F5C
116525
+ 2. **\u7B49\u5F85\u5B8C\u6210\u901A\u77E5**\u2014\u2014\u7CFB\u7EDF\u4F1A\u5728\u4E0B\u4E00\u8F6E\u89E6\u53D1\u4F60
116526
+ 3. \u7136\u540E\u901A\u8FC7 \`background_output(task_id="...")\` \u6536\u96C6\u7ED3\u679C
116527
+ 4. **\u4E0D\u8981**\u4E0D\u8010\u70E6\u5730\u91CD\u65B0\u641C\u7D22\u76F8\u540C\u4E3B\u9898
116528
+
116529
+ ### \u4E3A\u4EC0\u4E48\u8FD9\u5F88\u91CD\u8981\uFF1A
116530
+
116531
+ - **\u6D6A\u8D39 token**\uFF1A\u91CD\u590D\u63A2\u7D22\u6D6A\u8D39\u4F60\u7684\u4E0A\u4E0B\u6587\u9884\u7B97
116532
+ - **\u6DF7\u6DC6**\uFF1A\u4F60\u53EF\u80FD\u4E0E agents \u7684\u53D1\u73B0\u77DB\u76FE
116533
+ - **\u6548\u7387**\uFF1A\u59D4\u6258\u7684\u8981\u70B9\u662F\u5E76\u884C\u541E\u5410\u91CF
116534
+
116535
+ ### \u793A\u4F8B\uFF1A
116536
+
116537
+ \`\`\`typescript
116538
+ // \u9519\u8BEF\uFF1A\u59D4\u6258\u540E\u91CD\u505A\u641C\u7D22
116539
+ task(subagent_type="explore", run_in_background=true, ...)
116540
+ // \u7136\u540E\u7ACB\u5373\u81EA\u5DF1 grep \u76F8\u540C\u5185\u5BB9\u2014\u2014\u7981\u6B62
116541
+
116542
+ // \u6B63\u786E\uFF1A\u7EE7\u7EED\u975E\u91CD\u53E0\u5DE5\u4F5C
116543
+ task(subagent_type="explore", run_in_background=true, ...)
116544
+ // \u5728 agents \u641C\u7D22\u65F6\u5904\u7406\u5176\u4ED6\u65E0\u5173\u5DE5\u4F5C
116545
+ // \u7ED3\u675F\u56DE\u590D\u5E76\u7B49\u5F85\u901A\u77E5
116546
+ \`\`\`
116547
+ </Anti_Duplication>`;
116548
+ }
116326
116549
  return `<Anti_Duplication>
116327
116550
  ## Anti-Duplication Rule (CRITICAL)
116328
116551
 
@@ -116743,7 +116966,8 @@ ${styleBlock}`;
116743
116966
  }
116744
116967
 
116745
116968
  // src/agents/sisyphus/default.ts
116746
- function buildTaskManagementSection(useTaskSystem) {
116969
+ function buildTaskManagementSection(useTaskSystem, language) {
116970
+ const isZh = language?.startsWith("zh");
116747
116971
  if (useTaskSystem) {
116748
116972
  return `<Task_Management>
116749
116973
  ## Task Management (CRITICAL)
@@ -116877,7 +117101,7 @@ function loadPromptTemplate(language, agentName) {
116877
117101
  // src/agents/sisyphus.ts
116878
117102
  var MODE = "primary";
116879
117103
  var _zhTemplateCache = null;
116880
- function buildDynamicSisyphusPromptZh(model, availableAgents, availableTools = [], availableSkills = [], availableCategories = [], useTaskSystem = false) {
117104
+ function buildDynamicSisyphusPromptZh(model, availableAgents, availableTools = [], availableSkills = [], availableCategories = [], useTaskSystem = false, language = "zh-CN") {
116881
117105
  if (_zhTemplateCache === null) {
116882
117106
  _zhTemplateCache = loadPromptTemplate("zh", "sisyphus");
116883
117107
  }
@@ -116885,20 +117109,20 @@ function buildDynamicSisyphusPromptZh(model, availableAgents, availableTools = [
116885
117109
  if (!template) {
116886
117110
  return buildDynamicSisyphusPrompt(model, availableAgents, availableTools, availableSkills, availableCategories, useTaskSystem);
116887
117111
  }
116888
- const keyTriggers = buildKeyTriggersSection(availableAgents, availableSkills);
116889
- const toolSelection = buildToolSelectionTable(availableAgents, availableTools, availableSkills);
116890
- const exploreSection = buildExploreSection(availableAgents);
116891
- const librarianSection = buildLibrarianSection(availableAgents);
116892
- const categorySkillsGuide = buildCategorySkillsDelegationGuide(availableCategories, availableSkills);
116893
- const delegationTable = buildDelegationTable(availableAgents);
116894
- const oracleSection = buildOracleSection(availableAgents);
116895
- const hardBlocks = buildHardBlocksSection();
116896
- const antiPatterns = buildAntiPatternsSection();
116897
- const parallelDelegationSection = buildParallelDelegationSection(model, availableCategories);
116898
- const nonClaudePlannerSection = buildNonClaudePlannerSection(model);
116899
- const taskManagementSection = buildTaskManagementSection(useTaskSystem);
117112
+ const keyTriggers = buildKeyTriggersSection(availableAgents, availableSkills, language);
117113
+ const toolSelection = buildToolSelectionTable(availableAgents, availableTools, availableSkills, language);
117114
+ const exploreSection = buildExploreSection(availableAgents, language);
117115
+ const librarianSection = buildLibrarianSection(availableAgents, language);
117116
+ const categorySkillsGuide = buildCategorySkillsDelegationGuide(availableCategories, availableSkills, language);
117117
+ const delegationTable = buildDelegationTable(availableAgents, language);
117118
+ const oracleSection = buildOracleSection(availableAgents, language);
117119
+ const hardBlocks = buildHardBlocksSection(language);
117120
+ const antiPatterns = buildAntiPatternsSection(language);
117121
+ const parallelDelegationSection = buildParallelDelegationSection(model, availableCategories, language);
117122
+ const nonClaudePlannerSection = buildNonClaudePlannerSection(model, language);
117123
+ const taskManagementSection = buildTaskManagementSection(useTaskSystem, language);
116900
117124
  const todoHookNote = useTaskSystem ? "YOUR TASK CREATION WOULD BE TRACKED BY HOOK([SYSTEM REMINDER - TASK CONTINUATION])" : "YOUR TODO CREATION WOULD BE TRACKED BY HOOK([SYSTEM REMINDER - TODO CONTINUATION])";
116901
- const agentIdentity = buildAgentIdentitySection("Sisyphus", "Powerful AI Agent with orchestration capabilities from OhMyOpenCode");
117125
+ const agentIdentity = buildAgentIdentitySection("Sisyphus", "Powerful AI Agent with orchestration capabilities from OhMyOpenCode", language);
116902
117126
  return template.replace(/\$\{agentIdentity\}/g, agentIdentity).replace(/\$\{todoHookNote\}/g, todoHookNote).replace(/\$\{keyTriggers\}/g, keyTriggers).replace(/\$\{toolSelection\}/g, toolSelection).replace(/\$\{exploreSection\}/g, exploreSection).replace(/\$\{librarianSection\}/g, librarianSection).replace(/\$\{buildAntiDuplicationSection\(\)\}/g, buildAntiDuplicationSection()).replace(/\$\{categorySkillsGuide\}/g, categorySkillsGuide).replace(/\$\{nonClaudePlannerSection\}/g, nonClaudePlannerSection).replace(/\$\{parallelDelegationSection\}/g, parallelDelegationSection).replace(/\$\{delegationTable\}/g, delegationTable).replace(/\$\{oracleSection\}/g, oracleSection).replace(/\$\{taskManagementSection\}/g, taskManagementSection).replace(/\$\{hardBlocks\}/g, hardBlocks).replace(/\$\{antiPatterns\}/g, antiPatterns);
116903
117127
  }
116904
117128
  function buildDynamicSisyphusPrompt(model, availableAgents, availableTools = [], availableSkills = [], availableCategories = [], useTaskSystem = false) {
@@ -119562,7 +119786,13 @@ function getAtlasPromptSource(model) {
119562
119786
  }
119563
119787
  return "default";
119564
119788
  }
119565
- function getAtlasPrompt(model) {
119789
+ function getAtlasPrompt(model, language) {
119790
+ const isZh = language?.startsWith("zh");
119791
+ if (isZh) {
119792
+ const zhPrompt = loadPromptTemplate("zh", "atlas");
119793
+ if (zhPrompt)
119794
+ return zhPrompt;
119795
+ }
119566
119796
  const source = getAtlasPromptSource(model);
119567
119797
  switch (source) {
119568
119798
  case "gpt":
@@ -119588,9 +119818,9 @@ function buildDynamicOrchestratorPrompt(ctx) {
119588
119818
  const agentSection = buildAgentSelectionSection(agents);
119589
119819
  const decisionMatrix = buildDecisionMatrix(agents, userCategories);
119590
119820
  const skillsSection = buildSkillsSection2(skills2);
119591
- const categorySkillsGuide = buildCategorySkillsDelegationGuide(availableCategories, skills2);
119592
- const agentIdentity = buildAgentIdentitySection("Atlas", "Master Orchestrator agent from OhMyOpenCode that coordinates specialized agents to complete todo lists");
119593
- const basePrompt = getAtlasPrompt(model);
119821
+ const categorySkillsGuide = buildCategorySkillsDelegationGuide(availableCategories, skills2, ctx?.language);
119822
+ const agentIdentity = buildAgentIdentitySection("Atlas", "Master Orchestrator agent from OhMyOpenCode that coordinates specialized agents to complete todo lists", ctx?.language);
119823
+ const basePrompt = getAtlasPrompt(model, ctx?.language);
119594
119824
  return agentIdentity + `
119595
119825
  ` + basePrompt.replace("{CATEGORY_SECTION}", categorySection).replace("{AGENT_SECTION}", agentSection).replace("{DECISION_MATRIX}", decisionMatrix).replace("{SKILLS_SECTION}", skillsSection).replace("{{CATEGORY_SKILLS_DELEGATION_GUIDE}}", categorySkillsGuide);
119596
119826
  }
@@ -122280,7 +122510,8 @@ function maybeCreateAtlasConfig(input) {
122280
122510
  model: atlasModel,
122281
122511
  availableAgents,
122282
122512
  availableSkills,
122283
- userCategories
122513
+ userCategories,
122514
+ language: orchestratorOverride?.language ?? language
122284
122515
  });
122285
122516
  if (atlasResolvedVariant) {
122286
122517
  orchestratorConfig = { ...orchestratorConfig, variant: atlasResolvedVariant };
@@ -132237,7 +132468,7 @@ class PostHog extends PostHogBackendClient {
132237
132468
  // package.json
132238
132469
  var package_default = {
132239
132470
  name: "@skj1724/oh-my-opencode",
132240
- version: "3.18.25",
132471
+ version: "3.18.26",
132241
132472
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
132242
132473
  main: "./dist/index.js",
132243
132474
  types: "dist/index.d.ts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skj1724/oh-my-opencode",
3
- "version": "3.18.25",
3
+ "version": "3.18.26",
4
4
  "description": "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
5
5
  "main": "./dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -0,0 +1,29 @@
1
+ 用中文进行深度思考
2
+
3
+ ${agentIdentity}
4
+ <Role>
5
+ Sisyphus-Junior - 来自 OhMyOpenCode 的专注执行者。
6
+ 直接执行任务。
7
+ </Role>
8
+
9
+ ${buildAntiDuplicationSection()}
10
+
11
+ ${todoDiscipline}
12
+
13
+ <Verification>
14
+ 任务未完成除非:
15
+ - 更改文件的 lsp_diagnostics 为干净
16
+ - 构建通过(如果适用)
17
+ - ${verificationText}
18
+ </Verification>
19
+
20
+ <Termination>
21
+ 首次成功验证后停止。不要重新验证。
22
+ 最大状态检查次数:2。之后无论结果如何都停止。
23
+ </Termination>
24
+
25
+ <Style>
26
+ - 立即开始。不要确认。
27
+ - 匹配用户的沟通风格。
28
+ - 简洁 > 冗长。
29
+ </Style>