oh-my-opencode-slim 1.1.1 โ†’ 2.0.0-beta.0

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.md CHANGED
@@ -41,12 +41,18 @@ Install and configure oh-my-opencode-slim: https://raw.githubusercontent.com/alv
41
41
  bunx oh-my-opencode-slim@latest install
42
42
  ```
43
43
 
44
- The installer also registers the companion TUI plugin in OpenCode's
45
- `tui.json`, which adds a small sidebar showing specialist-agent status plus
46
- active/reusable task sessions. It also warms OpenCode's plugin cache so bunx
47
- installs keep loading even after temporary directories are cleaned up. For
48
- manual setups, add `oh-my-opencode-slim` to the `plugin` array in both
49
- `opencode.json` and `tui.json`.
44
+ ### V2 Background-Orchestration Beta
45
+
46
+ V2 changes the orchestrator from the default execution worker into a scheduler:
47
+ it plans work, dispatches specialists as background tasks, polls their status,
48
+ then reconciles results before continuing. This requires OpenCode's native
49
+ background subagent support, so beta users must start OpenCode with the
50
+ experimental flag enabled.
51
+
52
+ ```bash
53
+ bunx oh-my-opencode-slim@beta install
54
+ OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS=1 opencode
55
+ ```
50
56
 
51
57
  ### Getting Started
52
58
 
@@ -83,7 +89,7 @@ The default generated configuration includes both `openai` and `opencode-go` pre
83
89
  "oracle": { "model": "openai/gpt-5.5", "variant": "high", "skills": ["simplify"], "mcps": [] },
84
90
  "librarian": { "model": "openai/gpt-5.4-mini", "variant": "low", "skills": [], "mcps": ["websearch", "context7", "grep_app"] },
85
91
  "explorer": { "model": "openai/gpt-5.4-mini", "variant": "low", "skills": [], "mcps": [] },
86
- "designer": { "model": "openai/gpt-5.4-mini", "variant": "medium", "skills": ["agent-browser"], "mcps": [] },
92
+ "designer": { "model": "openai/gpt-5.4-mini", "variant": "medium", "skills": [], "mcps": [] },
87
93
  "fixer": { "model": "openai/gpt-5.4-mini", "variant": "low", "skills": [], "mcps": [] }
88
94
  },
89
95
  "opencode-go": {
@@ -92,7 +98,7 @@ The default generated configuration includes both `openai` and `opencode-go` pre
92
98
  "council": { "model": "opencode-go/deepseek-v4-pro", "variant": "high", "skills": [], "mcps": [] },
93
99
  "librarian": { "model": "opencode-go/minimax-m2.7", "skills": [], "mcps": [ "websearch", "context7", "grep_app" ] },
94
100
  "explorer": { "model": "opencode-go/minimax-m2.7", "skills": [], "mcps": [] },
95
- "designer": { "model": "opencode-go/kimi-k2.6", "variant": "medium", "skills": [ "agent-browser" ], "mcps": [] },
101
+ "designer": { "model": "opencode-go/kimi-k2.6", "variant": "medium", "skills": [], "mcps": [] },
96
102
  "fixer": { "model": "opencode-go/deepseek-v4-flash", "variant": "high", "skills": [], "mcps": [] }
97
103
  }
98
104
  }
@@ -490,6 +496,7 @@ Use this section as a map: start with installation, then jump to features, confi
490
496
  | Doc | What it covers |
491
497
  |-----|----------------|
492
498
  | **[Council](docs/council.md)** | Run multiple models in parallel and synthesize a single answer with `@council` |
499
+ | **[V2 Background Orchestration](docs/v2-background-orchestration.md)** | Scheduler-first orchestrator model built around native background subagents |
493
500
  | **[Multiplexer Integration](docs/multiplexer-integration.md)** | Watch agents work live in Tmux or Zellij panes |
494
501
  | **[Session Management](docs/session-management.md)** | Reuse recent child-agent sessions with short aliases instead of starting over |
495
502
  | **[Session Goal](docs/session-goal.md)** | Pin a session objective with `/goal` so todos, delegation, and verification stay aligned |
@@ -507,7 +514,7 @@ Use this section as a map: start with installation, then jump to features, confi
507
514
  |-----|----------------|
508
515
  | **[Configuration](docs/configuration.md)** | Config file locations, JSONC support, prompt overrides, and full option reference |
509
516
  | **[Maintainer Guide](docs/maintainers.md)** | Issue triage rules, label meanings, support routing, and repo maintenance workflow |
510
- | **[Skills](docs/skills.md)** | Built-in and recommended skills such as `simplify`, `agent-browser`, `codemap`, and `clonedeps` |
517
+ | **[Skills](docs/skills.md)** | Bundled skills such as `simplify`, `codemap`, and `clonedeps` |
511
518
  | **[MCPs](docs/mcps.md)** | `websearch`, `context7`, `grep_app`, and how MCP permissions work per agent |
512
519
  | **[Tools](docs/tools.md)** | Built-in tool capabilities like `webfetch`, LSP tools, code search, and formatters |
513
520
 
@@ -528,7 +535,7 @@ Use this section as a map: start with installation, then jump to features, confi
528
535
  <p><sub>Every merged contribution leaves a mark on the realm.</sub></p>
529
536
 
530
537
  <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
531
- [![All Contributors](https://img.shields.io/badge/all_contributors-46-orange.svg?style=flat-square)](#contributors-)
538
+ [![All Contributors](https://img.shields.io/badge/all_contributors-48-orange.svg?style=flat-square)](#contributors-)
532
539
  <!-- ALL-CONTRIBUTORS-BADGE:END -->
533
540
  </div>
534
541
 
@@ -600,6 +607,8 @@ Use this section as a map: start with installation, then jump to features, confi
600
607
  <td align="center" valign="top" width="16.66%"><a href="https://github.com/ThomasMldr"><img src="https://avatars.githubusercontent.com/u/6631765?v=4?s=100" width="100px;" alt="Thomas Mulder"/><br /><sub><b>Thomas Mulder</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=ThomasMldr" title="Code">๐Ÿ’ป</a></td>
601
608
  <td align="center" valign="top" width="16.66%"><a href="https://github.com/maou-shonen"><img src="https://avatars.githubusercontent.com/u/22576780?v=4?s=100" width="100px;" alt="้ญ”็Ž‹ๅฐ‘ๅนด(maou shonen)"/><br /><sub><b>้ญ”็Ž‹ๅฐ‘ๅนด(maou shonen)</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=maou-shonen" title="Code">๐Ÿ’ป</a></td>
602
609
  <td align="center" valign="top" width="16.66%"><a href="https://github.com/jelasin"><img src="https://avatars.githubusercontent.com/u/97788570?v=4?s=100" width="100px;" alt=" Jelasin"/><br /><sub><b> Jelasin</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=jelasin" title="Code">๐Ÿ’ป</a></td>
610
+ <td align="center" valign="top" width="16.66%"><a href="https://github.com/hannespr"><img src="https://avatars.githubusercontent.com/u/40021505?v=4?s=100" width="100px;" alt="Hannes"/><br /><sub><b>Hannes</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=hannespr" title="Code">๐Ÿ’ป</a></td>
611
+ <td align="center" valign="top" width="16.66%"><a href="https://qwtoe.github.io/"><img src="https://avatars.githubusercontent.com/u/36733893?v=4?s=100" width="100px;" alt="mooozfxs"/><br /><sub><b>mooozfxs</b></sub></a><br /><a href="https://github.com/alvinunreal/oh-my-opencode-slim/commits?author=qwtoe" title="Code">๐Ÿ’ป</a></td>
603
612
  </tr>
604
613
  </tbody>
605
614
  </table>
package/dist/cli/index.js CHANGED
@@ -515,56 +515,6 @@ function installCustomSkill(skill) {
515
515
  }
516
516
  }
517
517
 
518
- // src/cli/skills.ts
519
- import { spawnSync } from "node:child_process";
520
- var RECOMMENDED_SKILLS = [
521
- {
522
- name: "agent-browser",
523
- repo: "https://github.com/vercel-labs/agent-browser",
524
- skillName: "agent-browser",
525
- allowedAgents: ["designer"],
526
- description: "High-performance browser automation",
527
- postInstallCommands: [
528
- "npm install -g agent-browser",
529
- "agent-browser install"
530
- ]
531
- }
532
- ];
533
- function installSkill(skill) {
534
- const args = [
535
- "skills",
536
- "add",
537
- skill.repo,
538
- "--skill",
539
- skill.skillName,
540
- "-a",
541
- "opencode",
542
- "-y",
543
- "--global"
544
- ];
545
- try {
546
- const result = spawnSync("npx", args, { stdio: "inherit" });
547
- if (result.status !== 0) {
548
- return false;
549
- }
550
- if (skill.postInstallCommands && skill.postInstallCommands.length > 0) {
551
- console.log(`Running post-install commands for ${skill.name}...`);
552
- for (const cmd of skill.postInstallCommands) {
553
- console.log(`> ${cmd}`);
554
- const [command, ...cmdArgs] = cmd.split(" ");
555
- const cmdResult = spawnSync(command, cmdArgs, { stdio: "inherit" });
556
- if (cmdResult.status !== 0) {
557
- console.warn(`Post-install command failed: ${cmd}`);
558
- }
559
- }
560
- }
561
- return true;
562
- } catch (error) {
563
- console.error(`Failed to install skill: ${skill.name}`, error);
564
- return false;
565
- }
566
- }
567
-
568
518
  // src/cli/providers.ts
569
519
  var SCHEMA_URL = "https://unpkg.com/oh-my-opencode-slim@latest/oh-my-opencode-slim.schema.json";
570
520
  var GENERATED_PRESETS = ["openai", "opencode-go"];
@@ -637,12 +587,8 @@ function generateLiteConfig(installConfig) {
637
587
  const createAgentConfig = (agentName, modelInfo) => {
638
588
  const isOrchestrator = agentName === "orchestrator";
639
589
  const skills = isOrchestrator ? ["*"] : [
640
- ...RECOMMENDED_SKILLS.filter((s) => s.allowedAgents.includes("*") || s.allowedAgents.includes(agentName)).map((s) => s.skillName),
641
590
  ...CUSTOM_SKILLS.filter((s) => s.allowedAgents.includes("*") || s.allowedAgents.includes(agentName)).map((s) => s.name)
642
591
  ];
643
- if (agentName === "designer" && !skills.includes("agent-browser")) {
644
- skills.push("agent-browser");
645
- }
646
592
  return {
647
593
  model: modelInfo.model,
648
594
  variant: modelInfo.variant,
@@ -1355,13 +1301,13 @@ Options:
1355
1301
  import { existsSync as existsSync5 } from "node:fs";
1356
1302
  import { createInterface } from "node:readline/promises";
1357
1303
  // src/cli/system.ts
1358
- import { spawnSync as spawnSync2 } from "node:child_process";
1304
+ import { spawnSync } from "node:child_process";
1359
1305
  import { statSync as statSync4 } from "node:fs";
1360
1306
  var cachedOpenCodePath = null;
1361
1307
  function resolvePathCommand(command) {
1362
1308
  try {
1363
1309
  const resolver = process.platform === "win32" ? "where" : "which";
1364
- const result = spawnSync2(resolver, [command], {
1310
+ const result = spawnSync(resolver, [command], {
1365
1311
  encoding: "utf-8",
1366
1312
  stdio: ["ignore", "pipe", "ignore"]
1367
1313
  });
@@ -1376,7 +1322,7 @@ function resolvePathCommand(command) {
1376
1322
  }
1377
1323
  function canExecute(command, args) {
1378
1324
  try {
1379
- const result = spawnSync2(command, args, {
1325
+ const result = spawnSync(command, args, {
1380
1326
  stdio: "ignore"
1381
1327
  });
1382
1328
  return result.status === 0;
@@ -1578,8 +1524,6 @@ async function runInstall(config) {
1578
1524
  const isUpdate = detected.isInstalled;
1579
1525
  printHeader(isUpdate);
1580
1526
  let totalSteps = 6;
1581
- if (config.installSkills)
1582
- totalSteps += 1;
1583
1527
  if (config.installCustomSkills)
1584
1528
  totalSteps += 1;
1585
1529
  totalSteps += 1;
@@ -1658,27 +1602,6 @@ ${JSON.stringify(liteConfig, null, 2)}
1658
1602
  return 1;
1659
1603
  }
1660
1604
  }
1661
- if (config.installSkills) {
1662
- printStep(step++, totalSteps, "Installing recommended skills...");
1663
- if (config.dryRun) {
1664
- printInfo("Dry run mode - would install skills:");
1665
- for (const skill of RECOMMENDED_SKILLS) {
1666
- printInfo(` - ${skill.name}`);
1667
- }
1668
- } else {
1669
- let skillsInstalled = 0;
1670
- for (const skill of RECOMMENDED_SKILLS) {
1671
- printInfo(`Installing ${skill.name}...`);
1672
- if (installSkill(skill)) {
1673
- printSuccess(`Installed: ${skill.name}`);
1674
- skillsInstalled++;
1675
- } else {
1676
- printInfo(`Skipped: ${skill.name} (already installed)`);
1677
- }
1678
- }
1679
- printSuccess(`${skillsInstalled}/${RECOMMENDED_SKILLS.length} skills processed`);
1680
- }
1681
- }
1682
1605
  if (config.installCustomSkills) {
1683
1606
  printStep(step++, totalSteps, "Installing custom skills...");
1684
1607
  if (config.dryRun) {
@@ -1735,7 +1658,6 @@ ${JSON.stringify(liteConfig, null, 2)}
1735
1658
  async function install(args) {
1736
1659
  const config = {
1737
1660
  hasTmux: false,
1738
- installSkills: args.skills === "yes",
1739
1661
  installCustomSkills: args.skills === "yes",
1740
1662
  preset: args.preset,
1741
1663
  promptForStar: args.tui,
@@ -1792,7 +1714,7 @@ Usage:
1792
1714
  bunx oh-my-opencode-slim doctor [OPTIONS]
1793
1715
 
1794
1716
  Options:
1795
- --skills=yes|no Install recommended and bundled skills (default: yes)
1717
+ --skills=yes|no Install bundled skills (default: yes)
1796
1718
  --preset=<name> Active generated config preset (default: openai)
1797
1719
  --no-tui Non-interactive mode
1798
1720
  --dry-run Simulate install without writing files
@@ -1,20 +1,3 @@
1
- /**
2
- * A recommended skill to install via `npx skills add`.
3
- */
4
- export interface RecommendedSkill {
5
- /** Human-readable name for prompts */
6
- name: string;
7
- /** GitHub repo URL for `npx skills add` */
8
- repo: string;
9
- /** Skill name within the repo (--skill flag) */
10
- skillName: string;
11
- /** List of agents that should auto-allow this skill */
12
- allowedAgents: string[];
13
- /** Description shown to user during install */
14
- description: string;
15
- /** Optional commands to run after the skill is added */
16
- postInstallCommands?: string[];
17
- }
18
1
  /**
19
2
  * A skill that is managed externally (e.g. user-installed) and needs
20
3
  * permission grants but is NOT installed by this plugin's CLI.
@@ -27,26 +10,15 @@ export interface PermissionOnlySkill {
27
10
  /** Human-readable description (for documentation only) */
28
11
  description: string;
29
12
  }
30
- /**
31
- * List of recommended skills.
32
- * Add new skills here to include them in the installation flow.
33
- */
34
- export declare const RECOMMENDED_SKILLS: RecommendedSkill[];
35
13
  /**
36
14
  * Skills managed externally (not installed by this plugin's CLI).
37
15
  * Entries here only affect agent permission grants โ€” nothing is installed.
38
16
  */
39
17
  export declare const PERMISSION_ONLY_SKILLS: PermissionOnlySkill[];
40
18
  /**
41
- * Install a skill using `npx skills add`.
42
- * @param skill - The skill to install
43
- * @returns True if installation succeeded, false otherwise
44
- */
45
- export declare function installSkill(skill: RecommendedSkill): boolean;
46
- /**
47
- * Get permission presets for a specific agent based on recommended skills.
19
+ * Get permission presets for a specific agent based on bundled skills.
48
20
  * @param agentName - The name of the agent
49
- * @param skillList - Optional explicit list of skills to allow (overrides recommendations)
21
+ * @param skillList - Optional explicit list of skills to allow (overrides defaults)
50
22
  * @returns Permission rules for the skill permission type
51
23
  */
52
24
  export declare function getSkillPermissionsForAgent(agentName: string, skillList?: string[]): Record<string, 'allow' | 'ask' | 'deny'>;
@@ -14,7 +14,6 @@ export interface OpenCodeConfig {
14
14
  }
15
15
  export interface InstallConfig {
16
16
  hasTmux: boolean;
17
- installSkills: boolean;
18
17
  installCustomSkills: boolean;
19
18
  preset?: string;
20
19
  promptForStar?: boolean;
@@ -20,7 +20,7 @@ export declare const DEFAULT_TIMEOUT_MS: number;
20
20
  export declare const MAX_POLL_TIME_MS: number;
21
21
  export declare const FALLBACK_FAILOVER_TIMEOUT_MS = 15000;
22
22
  export declare const DEFAULT_MAX_SUBAGENT_DEPTH = 3;
23
- export declare const PHASE_REMINDER_TEXT = "!IMPORTANT! Recall the workflow rules:\nUnderstand \u2192 choose the best parallelized path based on your capabilities and agents delegation rules \u2192 recall session reuse rules \u2192 execute \u2192 verify.\nIf delegating, launch the specialist in the same turn you mention it !END!";
23
+ export declare const PHASE_REMINDER_TEXT = "!IMPORTANT! Recall the workflow rules:\nUnderstand \u2192 build a short work graph with independent lanes, dependencies, and advisory ownership \u2192 dispatch independent specialists as background tasks \u2192 record task/session IDs \u2192 continue orchestration \u2192 poll task_status for terminal results \u2192 reconcile \u2192 verify.\nOnly consume outputs or advance dependent work when background results are terminal. !END!";
24
24
  export declare const TMUX_SPAWN_DELAY_MS = 500;
25
25
  export declare const COUNCILLOR_STAGGER_MS = 250;
26
26
  export declare const STABLE_POLLS_THRESHOLD = 3;
@@ -1,4 +1,4 @@
1
- export declare const PHASE_REMINDER = "<internal_reminder>!IMPORTANT! Recall the workflow rules:\nUnderstand \u2192 choose the best parallelized path based on your capabilities and agents delegation rules \u2192 recall session reuse rules \u2192 execute \u2192 verify.\nIf delegating, launch the specialist in the same turn you mention it !END!</internal_reminder>";
1
+ export declare const PHASE_REMINDER = "<internal_reminder>!IMPORTANT! Recall the workflow rules:\nUnderstand \u2192 build a short work graph with independent lanes, dependencies, and advisory ownership \u2192 dispatch independent specialists as background tasks \u2192 record task/session IDs \u2192 continue orchestration \u2192 poll task_status for terminal results \u2192 reconcile \u2192 verify.\nOnly consume outputs or advance dependent work when background results are terminal. !END!</internal_reminder>";
2
2
  interface MessageInfo {
3
3
  role: string;
4
4
  agent?: string;
@@ -1,4 +1,5 @@
1
1
  import type { PluginInput } from '@opencode-ai/plugin';
2
+ import { BackgroundJobBoard } from '../../utils';
2
3
  interface ChatMessagePart {
3
4
  type: string;
4
5
  text?: string;
@@ -9,6 +10,7 @@ interface ChatMessage {
9
10
  role: string;
10
11
  agent?: string;
11
12
  sessionID?: string;
13
+ id?: string;
12
14
  };
13
15
  parts: ChatMessagePart[];
14
16
  }
@@ -16,6 +18,7 @@ export declare function createTaskSessionManagerHook(_ctx: PluginInput, options:
16
18
  maxSessionsPerAgent: number;
17
19
  readContextMinLines?: number;
18
20
  readContextMaxFiles?: number;
21
+ backgroundJobBoard?: BackgroundJobBoard;
19
22
  shouldManageSession: (sessionID: string) => boolean;
20
23
  }): {
21
24
  'tool.execute.before': (input: {
@@ -45,6 +48,12 @@ export declare function createTaskSessionManagerHook(_ctx: PluginInput, options:
45
48
  parentID?: string;
46
49
  };
47
50
  sessionID?: string;
51
+ status?: {
52
+ type?: string;
53
+ };
54
+ error?: {
55
+ name?: string;
56
+ };
48
57
  };
49
58
  };
50
59
  }) => Promise<void>;
@@ -1,4 +1,5 @@
1
1
  import type { PluginInput } from '@opencode-ai/plugin';
2
+ import { type BackgroundJobBoard } from '../../utils';
2
3
  interface MessagePart {
3
4
  type?: string;
4
5
  text?: string;
@@ -18,6 +19,7 @@ export declare function createTodoContinuationHook(ctx: PluginInput, config?: {
18
19
  cooldownMs?: number;
19
20
  autoEnable?: boolean;
20
21
  autoEnableThreshold?: number;
22
+ backgroundJobBoard?: BackgroundJobBoard;
21
23
  }): {
22
24
  tool: Record<string, unknown>;
23
25
  handleToolExecuteAfter: (input: {