oh-my-opencode 2.9.0 → 2.9.1

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.
package/README.ja.md CHANGED
@@ -759,7 +759,19 @@ Oh My OpenCode は以下の場所からフックを読み込んで実行しま
759
759
  }
760
760
  ```
761
761
 
762
- 各エージェントでサポートされるオプション:`model`, `temperature`, `top_p`, `prompt`, `tools`, `disable`, `description`, `mode`, `color`, `permission`。
762
+ 各エージェントでサポートされるオプション:`model`, `temperature`, `top_p`, `prompt`, `prompt_append`, `tools`, `disable`, `description`, `mode`, `color`, `permission`。
763
+
764
+ `prompt_append` を使用すると、デフォルトのシステムプロンプトを置き換えずに追加の指示を付け加えられます:
765
+
766
+ ```json
767
+ {
768
+ "agents": {
769
+ "librarian": {
770
+ "prompt_append": "Emacs Lisp のドキュメント検索には常に elisp-dev-mcp を使用してください。"
771
+ }
772
+ }
773
+ }
774
+ ```
763
775
 
764
776
  `Sisyphus` (メインオーケストレーター) と `build` (デフォルトエージェント) も同じオプションで設定をオーバーライドできます。
765
777
 
package/README.ko.md CHANGED
@@ -752,7 +752,19 @@ Schema 자동 완성이 지원됩니다:
752
752
  }
753
753
  ```
754
754
 
755
- 각 에이전트에서 지원하는 옵션: `model`, `temperature`, `top_p`, `prompt`, `tools`, `disable`, `description`, `mode`, `color`, `permission`.
755
+ 각 에이전트에서 지원하는 옵션: `model`, `temperature`, `top_p`, `prompt`, `prompt_append`, `tools`, `disable`, `description`, `mode`, `color`, `permission`.
756
+
757
+ `prompt_append`를 사용하면 기본 시스템 프롬프트를 대체하지 않고 추가 지시사항을 덧붙일 수 있습니다:
758
+
759
+ ```json
760
+ {
761
+ "agents": {
762
+ "librarian": {
763
+ "prompt_append": "Emacs Lisp 문서 조회 시 항상 elisp-dev-mcp를 사용하세요."
764
+ }
765
+ }
766
+ }
767
+ ```
756
768
 
757
769
  `Sisyphus` (메인 오케스트레이터)와 `build` (기본 에이전트)도 동일한 옵션으로 설정을 오버라이드할 수 있습니다.
758
770
 
package/README.md CHANGED
@@ -2,6 +2,9 @@
2
2
  >
3
3
  > *"I aim to spark a software revolution by creating a world where agent-generated code is indistinguishable from human code, yet capable of achieving vastly more. I have poured my personal time, passion, and funds into this journey, and I will continue to do so."*
4
4
  >
5
+ > [![The Orchestrator is coming](./.github/assets/orchestrator-sisyphus.png)](https://x.com/justsisyphus/status/2006250634354548963)
6
+ > > **The Orchestrator is coming. This Week. [Get notified on X](https://x.com/justsisyphus/status/2006250634354548963)**
7
+ >
5
8
  > Be with us!
6
9
  >
7
10
  > | [<img alt="Discord link" src="https://img.shields.io/discord/1452487457085063218?color=5865F2&label=discord&labelColor=black&logo=discord&logoColor=white&style=flat-square" width="156px" />](https://discord.gg/PWpXmbhF) | Join our [Discord community](https://discord.gg/PWpXmbhF) to connect with contributors and fellow `oh-my-opencode` users. |
@@ -791,7 +794,19 @@ Override built-in agent settings:
791
794
  }
792
795
  ```
793
796
 
794
- Each agent supports: `model`, `temperature`, `top_p`, `prompt`, `tools`, `disable`, `description`, `mode`, `color`, `permission`.
797
+ Each agent supports: `model`, `temperature`, `top_p`, `prompt`, `prompt_append`, `tools`, `disable`, `description`, `mode`, `color`, `permission`.
798
+
799
+ Use `prompt_append` to add extra instructions without replacing the default system prompt:
800
+
801
+ ```json
802
+ {
803
+ "agents": {
804
+ "librarian": {
805
+ "prompt_append": "Always use the elisp-dev-mcp for Emacs Lisp documentation lookups."
806
+ }
807
+ }
808
+ }
809
+ ```
795
810
 
796
811
  You can also override settings for `Sisyphus` (the main orchestrator) and `build` (the default agent) using the same options.
797
812
 
package/README.zh-cn.md CHANGED
@@ -763,7 +763,19 @@ Agent 爽了,你自然也爽。但我还想直接让你爽。
763
763
  }
764
764
  ```
765
765
 
766
- 每个 Agent 能改这些:`model`、`temperature`、`top_p`、`prompt`、`tools`、`disable`、`description`、`mode`、`color`、`permission`。
766
+ 每个 Agent 能改这些:`model`、`temperature`、`top_p`、`prompt`、`prompt_append`、`tools`、`disable`、`description`、`mode`、`color`、`permission`。
767
+
768
+ 用 `prompt_append` 可以在默认系统提示后面追加额外指令,不用替换整个提示:
769
+
770
+ ```json
771
+ {
772
+ "agents": {
773
+ "librarian": {
774
+ "prompt_append": "查 Emacs Lisp 文档时用 elisp-dev-mcp。"
775
+ }
776
+ }
777
+ }
778
+ ```
767
779
 
768
780
  `Sisyphus`(主编排器)和 `build`(默认 Agent)也能改。
769
781
 
@@ -8,9 +8,14 @@ export interface AvailableTool {
8
8
  name: string;
9
9
  category: "lsp" | "ast" | "search" | "session" | "command" | "other";
10
10
  }
11
+ export interface AvailableSkill {
12
+ name: string;
13
+ description: string;
14
+ location: "user" | "project" | "plugin";
15
+ }
11
16
  export declare function categorizeTools(toolNames: string[]): AvailableTool[];
12
- export declare function buildKeyTriggersSection(agents: AvailableAgent[]): string;
13
- export declare function buildToolSelectionTable(agents: AvailableAgent[], tools?: AvailableTool[]): string;
17
+ export declare function buildKeyTriggersSection(agents: AvailableAgent[], skills?: AvailableSkill[]): string;
18
+ export declare function buildToolSelectionTable(agents: AvailableAgent[], tools?: AvailableTool[], skills?: AvailableSkill[]): string;
14
19
  export declare function buildExploreSection(agents: AvailableAgent[]): string;
15
20
  export declare function buildLibrarianSection(agents: AvailableAgent[]): string;
16
21
  export declare function buildDelegationTable(agents: AvailableAgent[]): string;
@@ -1,4 +1,4 @@
1
1
  import type { AgentConfig } from "@opencode-ai/sdk";
2
- import type { AvailableAgent } from "./sisyphus-prompt-builder";
3
- export declare function createSisyphusAgent(model?: string, availableAgents?: AvailableAgent[], availableToolNames?: string[]): AgentConfig;
2
+ import type { AvailableAgent, AvailableSkill } from "./sisyphus-prompt-builder";
3
+ export declare function createSisyphusAgent(model?: string, availableAgents?: AvailableAgent[], availableToolNames?: string[], availableSkills?: AvailableSkill[]): AgentConfig;
4
4
  export declare const sisyphusAgent: AgentConfig;
package/dist/cli/index.js CHANGED
@@ -2657,7 +2657,7 @@ var require_napi = __commonJS((exports, module) => {
2657
2657
  var require_package = __commonJS((exports, module) => {
2658
2658
  module.exports = {
2659
2659
  name: "oh-my-opencode",
2660
- version: "2.8.3",
2660
+ version: "2.9.0",
2661
2661
  description: "OpenCode plugin - custom agents (oracle, librarian) and enhanced features",
2662
2662
  main: "dist/index.js",
2663
2663
  types: "dist/index.d.ts",
package/dist/index.js CHANGED
@@ -1513,23 +1513,56 @@ function formatToolsForPrompt(tools) {
1513
1513
  }
1514
1514
  return parts.join(", ");
1515
1515
  }
1516
- function buildKeyTriggersSection(agents) {
1516
+ function buildKeyTriggersSection(agents, skills = []) {
1517
1517
  const keyTriggers = agents.filter((a) => a.metadata.keyTrigger).map((a) => `- ${a.metadata.keyTrigger}`);
1518
- if (keyTriggers.length === 0)
1518
+ const skillTriggers = skills.filter((s) => s.description).map((s) => `- **Skill \`${s.name}\`**: ${extractTriggerFromDescription(s.description)}`);
1519
+ const allTriggers = [...keyTriggers, ...skillTriggers];
1520
+ if (allTriggers.length === 0)
1519
1521
  return "";
1520
1522
  return `### Key Triggers (check BEFORE classification):
1521
- ${keyTriggers.join(`
1523
+
1524
+ **BLOCKING: Check skills FIRST before any action.**
1525
+ If a skill matches, invoke it IMMEDIATELY via \`skill\` tool.
1526
+
1527
+ ${allTriggers.join(`
1522
1528
  `)}
1523
1529
  - **GitHub mention (@mention in issue/PR)** \u2192 This is a WORK REQUEST. Plan full cycle: investigate \u2192 implement \u2192 create PR
1524
1530
  - **"Look into" + "create PR"** \u2192 Not just research. Full implementation cycle expected.`;
1525
1531
  }
1526
- function buildToolSelectionTable(agents, tools = []) {
1532
+ function extractTriggerFromDescription(description) {
1533
+ const triggerMatch = description.match(/Trigger[s]?[:\s]+([^.]+)/i);
1534
+ if (triggerMatch)
1535
+ return triggerMatch[1].trim();
1536
+ const activateMatch = description.match(/Activate when[:\s]+([^.]+)/i);
1537
+ if (activateMatch)
1538
+ return activateMatch[1].trim();
1539
+ const useWhenMatch = description.match(/Use (?:this )?when[:\s]+([^.]+)/i);
1540
+ if (useWhenMatch)
1541
+ return useWhenMatch[1].trim();
1542
+ return description.split(".")[0] || description;
1543
+ }
1544
+ function buildToolSelectionTable(agents, tools = [], skills = []) {
1527
1545
  const rows = [
1528
- "### Tool Selection:",
1546
+ "### Tool & Skill Selection:",
1529
1547
  "",
1530
- "| Tool | Cost | When to Use |",
1531
- "|------|------|-------------|"
1548
+ "**Priority Order**: Skills \u2192 Direct Tools \u2192 Agents",
1549
+ ""
1532
1550
  ];
1551
+ if (skills.length > 0) {
1552
+ rows.push("#### Skills (INVOKE FIRST if matching)");
1553
+ rows.push("");
1554
+ rows.push("| Skill | When to Use |");
1555
+ rows.push("|-------|-------------|");
1556
+ for (const skill of skills) {
1557
+ const shortDesc = extractTriggerFromDescription(skill.description);
1558
+ rows.push(`| \`${skill.name}\` | ${shortDesc} |`);
1559
+ }
1560
+ rows.push("");
1561
+ }
1562
+ rows.push("#### Tools & Agents");
1563
+ rows.push("");
1564
+ rows.push("| Resource | Cost | When to Use |");
1565
+ rows.push("|----------|------|-------------|");
1533
1566
  if (tools.length > 0) {
1534
1567
  const toolsDisplay = formatToolsForPrompt(tools);
1535
1568
  rows.push(`| ${toolsDisplay} | FREE | Not Complex, Scope Clear, No Implicit Assumptions |`);
@@ -1541,7 +1574,7 @@ function buildToolSelectionTable(agents, tools = []) {
1541
1574
  rows.push(`| \`${agent.name}\` agent | ${agent.metadata.cost} | ${shortDesc} |`);
1542
1575
  }
1543
1576
  rows.push("");
1544
- rows.push("**Default flow**: explore/librarian (background) + tools \u2192 oracle (if required)");
1577
+ rows.push("**Default flow**: skill (if match) \u2192 explore/librarian (background) + tools \u2192 oracle (if required)");
1545
1578
  return rows.join(`
1546
1579
  `);
1547
1580
  }
@@ -1714,10 +1747,25 @@ Named by [YeonGyu Kim](https://github.com/code-yeongyu).
1714
1747
  **Operating Mode**: You NEVER work alone when specialists are available. Frontend work \u2192 delegate. Deep research \u2192 parallel background agents (async subagents). Complex architecture \u2192 consult Oracle.
1715
1748
 
1716
1749
  </Role>`;
1717
- var SISYPHUS_PHASE0_STEP1_3 = `### Step 1: Classify Request Type
1750
+ var SISYPHUS_PHASE0_STEP1_3 = `### Step 0: Check Skills FIRST (BLOCKING)
1751
+
1752
+ **Before ANY classification or action, scan for matching skills.**
1753
+
1754
+ \`\`\`
1755
+ IF request matches a skill trigger:
1756
+ \u2192 INVOKE skill tool IMMEDIATELY
1757
+ \u2192 Do NOT proceed to Step 1 until skill is invoked
1758
+ \`\`\`
1759
+
1760
+ Skills are specialized workflows. When relevant, they handle the task better than manual orchestration.
1761
+
1762
+ ---
1763
+
1764
+ ### Step 1: Classify Request Type
1718
1765
 
1719
1766
  | Type | Signal | Action |
1720
1767
  |------|--------|--------|
1768
+ | **Skill Match** | Matches skill trigger phrase | **INVOKE skill FIRST** via \`skill\` tool |
1721
1769
  | **Trivial** | Single file, known location, direct answer | Direct tools only (UNLESS Key Trigger applies) |
1722
1770
  | **Explicit** | Specific file/line, clear command | Execute directly |
1723
1771
  | **Exploratory** | "How does X work?", "Find Y" | Fire explore (1-3) + tools in parallel |
@@ -2041,9 +2089,9 @@ var SISYPHUS_SOFT_GUIDELINES = `## Soft Guidelines
2041
2089
  </Constraints>
2042
2090
 
2043
2091
  `;
2044
- function buildDynamicSisyphusPrompt(availableAgents, availableTools = []) {
2045
- const keyTriggers = buildKeyTriggersSection(availableAgents);
2046
- const toolSelection = buildToolSelectionTable(availableAgents, availableTools);
2092
+ function buildDynamicSisyphusPrompt(availableAgents, availableTools = [], availableSkills = []) {
2093
+ const keyTriggers = buildKeyTriggersSection(availableAgents, availableSkills);
2094
+ const toolSelection = buildToolSelectionTable(availableAgents, availableTools, availableSkills);
2047
2095
  const exploreSection = buildExploreSection(availableAgents);
2048
2096
  const librarianSection = buildLibrarianSection(availableAgents);
2049
2097
  const frontendSection = buildFrontendSection(availableAgents);
@@ -2117,9 +2165,10 @@ function buildDynamicSisyphusPrompt(availableAgents, availableTools = []) {
2117
2165
  return sections.filter((s) => s !== "").join(`
2118
2166
  `);
2119
2167
  }
2120
- function createSisyphusAgent(model = DEFAULT_MODEL, availableAgents, availableToolNames) {
2168
+ function createSisyphusAgent(model = DEFAULT_MODEL, availableAgents, availableToolNames, availableSkills) {
2121
2169
  const tools = availableToolNames ? categorizeTools(availableToolNames) : [];
2122
- const prompt = availableAgents ? buildDynamicSisyphusPrompt(availableAgents, tools) : buildDynamicSisyphusPrompt([], tools);
2170
+ const skills = availableSkills ?? [];
2171
+ const prompt = availableAgents ? buildDynamicSisyphusPrompt(availableAgents, tools, skills) : buildDynamicSisyphusPrompt([], tools, skills);
2123
2172
  const base = {
2124
2173
  description: "Sisyphus - Powerful AI orchestrator from OhMyOpenCode. Plans obsessively with todos, assesses search complexity before exploration, delegates strategically to specialized agents. Uses explore for internal code (parallel-friendly), librarian only for external docs, and always delegates UI work to frontend engineer.",
2125
2174
  mode: "primary",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "2.9.0",
3
+ "version": "2.9.1",
4
4
  "description": "OpenCode plugin - custom agents (oracle, librarian) and enhanced features",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",