oh-my-opencode-slim 2.0.0 → 2.0.2

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.
Files changed (39) hide show
  1. package/README.ja-JP.md +69 -20
  2. package/README.ko-KR.md +66 -19
  3. package/README.md +72 -19
  4. package/README.zh-CN.md +78 -31
  5. package/dist/agents/orchestrator.d.ts +0 -2
  6. package/dist/cli/index.js +50 -37
  7. package/dist/config/agent-mcps.d.ts +0 -4
  8. package/dist/config/constants.d.ts +1 -7
  9. package/dist/config/council-schema.d.ts +0 -15
  10. package/dist/config/runtime-preset.d.ts +0 -1
  11. package/dist/config/schema.d.ts +2 -68
  12. package/dist/hooks/auto-update-checker/skill-sync.d.ts +9 -0
  13. package/dist/hooks/filter-available-skills/index.d.ts +1 -13
  14. package/dist/hooks/foreground-fallback/index.d.ts +1 -1
  15. package/dist/hooks/image-hook.d.ts +1 -13
  16. package/dist/hooks/index.d.ts +3 -2
  17. package/dist/hooks/phase-reminder/index.d.ts +10 -16
  18. package/dist/hooks/reflect/index.d.ts +13 -0
  19. package/dist/hooks/task-session-manager/index.d.ts +2 -16
  20. package/dist/hooks/types.d.ts +23 -0
  21. package/dist/index.js +391 -289
  22. package/dist/tui.js +16 -25
  23. package/dist/utils/agent-variant.d.ts +0 -40
  24. package/dist/utils/compat.d.ts +0 -1
  25. package/dist/utils/guards.d.ts +4 -0
  26. package/dist/utils/index.d.ts +1 -2
  27. package/dist/utils/logger.d.ts +1 -1
  28. package/dist/utils/task.d.ts +0 -2
  29. package/oh-my-opencode-slim.schema.json +2 -249
  30. package/package.json +1 -1
  31. package/src/skills/codemap.md +4 -1
  32. package/src/skills/reflect/SKILL.md +193 -0
  33. package/src/skills/worktrees/SKILL.md +164 -0
  34. package/dist/config/fallback-chains.d.ts +0 -1
  35. package/dist/hooks/apply-patch/patch.d.ts +0 -2
  36. package/dist/hooks/delegate-task-retry/guidance.d.ts +0 -2
  37. package/dist/hooks/delegate-task-retry/index.d.ts +0 -4
  38. package/dist/hooks/json-error-recovery/index.d.ts +0 -1
  39. package/dist/utils/env.d.ts +0 -1
package/dist/tui.js CHANGED
@@ -50,8 +50,7 @@ var SUBAGENT_NAMES = [
50
50
  "council",
51
51
  "councillor"
52
52
  ];
53
- var ORCHESTRATOR_NAME = "orchestrator";
54
- var ALL_AGENT_NAMES = [ORCHESTRATOR_NAME, ...SUBAGENT_NAMES];
53
+ var ALL_AGENT_NAMES = ["orchestrator", ...SUBAGENT_NAMES];
55
54
  var PROTECTED_AGENTS = new Set(["orchestrator", "councillor"]);
56
55
  var DEFAULT_MODELS = {
57
56
  orchestrator: undefined,
@@ -65,10 +64,10 @@ var DEFAULT_MODELS = {
65
64
  councillor: "openai/gpt-5.4-mini"
66
65
  };
67
66
  var POLL_INTERVAL_BACKGROUND_MS = 2000;
68
- var DEFAULT_TIMEOUT_MS = 2 * 60 * 1000;
69
67
  var MAX_POLL_TIME_MS = 5 * 60 * 1000;
70
68
  var DEFAULT_MAX_SUBAGENT_DEPTH = 3;
71
69
  var PHASE_REMINDER_TEXT = `!IMPORTANT! Scheduler workflow: plan lanes/dependencies → dispatch background specialists → track task IDs → wait for hook-driven completion → reconcile terminal results → verify. Do not poll running jobs, consume running-job output, or advance dependent work. !END!`;
70
+ var PHASE_REMINDER = `<internal_reminder>${PHASE_REMINDER_TEXT}</internal_reminder>`;
72
71
  var WRITABLE_FILE_OPERATIONS_RULES = `**File Operations Rules**:
73
72
  - Prefer dedicated file tools for normal code work: glob/grep/ast_grep_search for discovery, read for file contents, and edit/write/apply_patch for targeted source changes.
74
73
  - Use bash for execution and automation: git, package managers, tests, builds, scripts, diagnostics, and shell-native filesystem operations.
@@ -95,7 +94,6 @@ import * as path from "node:path";
95
94
  // src/utils/compat.ts
96
95
  import { spawn as nodeSpawn } from "node:child_process";
97
96
  import { writeFile as fsWriteFile } from "node:fs/promises";
98
- var isBun = typeof globalThis.Bun !== "undefined";
99
97
  function collectStream(stream) {
100
98
  if (!stream)
101
99
  return () => Promise.resolve("");
@@ -216,17 +214,11 @@ var CouncilConfigSchema = z.object({
216
214
  default_preset: z.string().default("default"),
217
215
  councillor_execution_mode: CouncillorExecutionModeSchema.describe('Execution mode for councillors. "serial" runs them one at a time (required for single-model systems). "parallel" runs them concurrently (default, faster for multi-model systems).'),
218
216
  councillor_retries: z.number().int().min(0).max(5).default(3).describe("Number of retry attempts for councillors that return empty responses " + "(e.g. due to provider rate limiting). Default: 3 retries."),
219
- master: z.unknown().optional().describe("DEPRECATED — ignored. Council agent synthesizes directly."),
220
- master_timeout: z.unknown().optional().describe('DEPRECATED — ignored. Use "timeout" instead.'),
221
- master_fallback: z.unknown().optional().describe("DEPRECATED — ignored. No separate master session.")
217
+ master: z.unknown().optional().describe("DEPRECATED — ignored. Council agent synthesizes directly.")
222
218
  }).transform((data) => {
223
219
  const deprecated = [];
224
220
  if (data.master !== undefined)
225
221
  deprecated.push("master");
226
- if (data.master_timeout !== undefined)
227
- deprecated.push("master_timeout");
228
- if (data.master_fallback !== undefined)
229
- deprecated.push("master_fallback");
230
222
  const legacyMasterModel = typeof data.master === "object" && data.master !== null && "model" in data.master && typeof data.master.model === "string" ? data.master.model : undefined;
231
223
  return {
232
224
  presets: data.presets,
@@ -268,15 +260,6 @@ var ManualPlanSchema = z2.object({
268
260
  librarian: ManualAgentPlanSchema,
269
261
  fixer: ManualAgentPlanSchema
270
262
  }).strict();
271
- var AgentModelChainSchema = z2.array(z2.string()).min(1);
272
- var FallbackChainsSchema = z2.object({
273
- orchestrator: AgentModelChainSchema.optional(),
274
- oracle: AgentModelChainSchema.optional(),
275
- designer: AgentModelChainSchema.optional(),
276
- explorer: AgentModelChainSchema.optional(),
277
- librarian: AgentModelChainSchema.optional(),
278
- fixer: AgentModelChainSchema.optional()
279
- }).catchall(AgentModelChainSchema);
280
263
  var AgentOverrideConfigSchema = z2.object({
281
264
  model: z2.union([
282
265
  z2.string(),
@@ -339,9 +322,8 @@ var FailoverConfigSchema = z2.object({
339
322
  enabled: z2.boolean().default(true),
340
323
  timeoutMs: z2.number().min(0).default(15000),
341
324
  retryDelayMs: z2.number().min(0).default(500),
342
- chains: FallbackChainsSchema.default({}),
343
325
  retry_on_empty: z2.boolean().default(true).describe("When true (default), empty provider responses are treated as failures, " + "triggering fallback/retry. Set to false to treat them as successes.")
344
- });
326
+ }).strict();
345
327
  var CompanionConfigSchema = z2.object({
346
328
  enabled: z2.boolean().optional(),
347
329
  position: z2.enum(["bottom-right", "bottom-left", "top-right", "top-left"]).optional(),
@@ -372,10 +354,7 @@ function validateCustomOnlyPromptFields(overrides, ctx, pathPrefix) {
372
354
  var PluginConfigSchema = z2.object({
373
355
  preset: z2.string().optional(),
374
356
  setDefaultAgent: z2.boolean().optional(),
375
- scoringEngineVersion: z2.enum(["v1", "v2-shadow", "v2"]).optional(),
376
- balanceProviderUsage: z2.boolean().optional(),
377
357
  autoUpdate: z2.boolean().optional().describe("Disable automatic installation of plugin updates when false. Defaults to true."),
378
- manualPlan: ManualPlanSchema.optional(),
379
358
  presets: z2.record(z2.string(), PresetSchema).optional(),
380
359
  agents: z2.record(z2.string(), AgentOverrideConfigSchema).optional(),
381
360
  disabled_agents: z2.array(z2.string()).optional().describe("Agent names to disable completely. " + "Disabled agents are not instantiated and cannot be delegated to. " + "Orchestrator and council internal agents (councillor) cannot be disabled. " + "By default, 'observer' is disabled. Remove it from this list and configure a vision-capable model to enable."),
@@ -473,11 +452,23 @@ var CUSTOM_SKILLS = [
473
452
  allowedAgents: ["orchestrator"],
474
453
  sourcePath: "src/skills/deepwork"
475
454
  },
455
+ {
456
+ name: "reflect",
457
+ description: "Review repeated work and suggest reusable workflow improvements",
458
+ allowedAgents: ["orchestrator"],
459
+ sourcePath: "src/skills/reflect"
460
+ },
476
461
  {
477
462
  name: "oh-my-opencode-slim",
478
463
  description: "Configure, customize, and safely improve oh-my-opencode-slim setups",
479
464
  allowedAgents: ["orchestrator"],
480
465
  sourcePath: "src/skills/oh-my-opencode-slim"
466
+ },
467
+ {
468
+ name: "worktrees",
469
+ description: "Manage Git worktrees as OMO safe isolated coding lanes for complex/risky/parallel work",
470
+ allowedAgents: ["orchestrator"],
471
+ sourcePath: "src/skills/worktrees"
481
472
  }
482
473
  ];
483
474
 
@@ -10,23 +10,6 @@ import { type PluginConfig } from '../config';
10
10
  * normalizeAgentName(" explore ") // returns "explore"
11
11
  */
12
12
  export declare function normalizeAgentName(agentName: string): string;
13
- /**
14
- * Resolves the variant configuration for a specific agent.
15
- *
16
- * Looks up the agent's variant in the plugin configuration. Returns undefined if:
17
- * - No config is provided
18
- * - The agent has no variant configured
19
- * - The variant is not a string
20
- * - The variant is empty or whitespace-only
21
- *
22
- * @param config - The plugin configuration object
23
- * @param agentName - The name of the agent (with or without @ prefix)
24
- * @returns The trimmed variant string, or undefined if no valid variant is found
25
- *
26
- * @example
27
- * resolveAgentVariant(config, "@oracle") // returns "high" if configured
28
- */
29
- export declare function resolveAgentVariant(config: PluginConfig | undefined, agentName: string): string | undefined;
30
13
  /**
31
14
  * Resolve a runtime-provided agent name to an internal agent name.
32
15
  *
@@ -38,26 +21,3 @@ export declare function resolveAgentVariant(config: PluginConfig | undefined, ag
38
21
  export declare function resolveRuntimeAgentName(config: PluginConfig | undefined, agentName: string): string;
39
22
  export type DisplayNameMentionRewriter = (text: string) => string;
40
23
  export declare function createDisplayNameMentionRewriter(config: PluginConfig | undefined): DisplayNameMentionRewriter;
41
- /**
42
- * Rewrites user-facing display-name mentions (e.g. @advisor) into internal
43
- * agent mentions (e.g. @oracle) for runtime routing.
44
- */
45
- export declare function rewriteDisplayNameMentions(config: PluginConfig | undefined, text: string): string;
46
- /**
47
- * Applies a variant to a request body if the body doesn't already have one.
48
- *
49
- * This function will NOT override an existing variant in the body. If no variant
50
- * is provided or the body already has a variant, the original body is returned.
51
- *
52
- * @template T - The type of the body object, must have an optional variant property
53
- * @param variant - The variant string to apply (or undefined)
54
- * @param body - The request body object
55
- * @returns The body with the variant applied (new object) or the original body unchanged
56
- *
57
- * @example
58
- * applyAgentVariant("high", { agent: "oracle" }) // returns { agent: "oracle", variant: "high" }
59
- * applyAgentVariant("high", { agent: "oracle", variant: "low" }) // returns original body with variant: "low"
60
- */
61
- export declare function applyAgentVariant<T extends {
62
- variant?: string;
63
- }>(variant: string | undefined, body: T): T;
@@ -1,5 +1,4 @@
1
1
  import type { ChildProcess } from 'node:child_process';
2
- export declare const isBun: boolean;
3
2
  export interface CrossSpawnResult {
4
3
  proc: ChildProcess;
5
4
  /** Collects all stdout into a string */
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Shared type guard: checks if a value is a non-null object.
3
+ */
4
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
@@ -1,8 +1,7 @@
1
1
  export * from './agent-variant';
2
2
  export * from './background-job-board';
3
- export * from './env';
4
3
  export * from './internal-initiator';
5
- export { getLogDir, initLogger, log, resetLogger } from './logger';
4
+ export { getLogDir, initLogger, log } from './logger';
6
5
  export * from './polling';
7
6
  export * from './session';
8
7
  export * from './task';
@@ -1,8 +1,8 @@
1
1
  declare function getLogDir(): string;
2
2
  export declare function initLogger(sessionId: string): void;
3
+ export { getLogDir };
3
4
  /** @internal Reset logger state for testing */
4
5
  export declare function resetLogger(): void;
5
6
  /** @internal Wait for queued log writes in tests. */
6
7
  export declare function flushLoggerForTesting(): Promise<void>;
7
- export { getLogDir };
8
8
  export declare function log(message: string, data?: unknown): void;
@@ -13,10 +13,8 @@ export interface TaskStatusOutput {
13
13
  timedOut: boolean;
14
14
  result?: string;
15
15
  }
16
- export type TaskStatusClassification = 'running' | 'terminal' | 'timeout' | 'transient_process_error' | 'unknown_error';
17
16
  export declare function parseTaskIdFromTaskOutput(output: string): string | undefined;
18
17
  export declare function parseTaskLaunchOutput(output: string): TaskLaunchOutput | undefined;
19
18
  export declare function parseTaskStatusOutput(output: string): TaskStatusOutput | undefined;
20
- export declare function classifyTaskStatusOutput(status: TaskStatusOutput): TaskStatusClassification;
21
19
  export declare function parseTaskStateFromOutput(output: string): TaskOutputState | undefined;
22
20
  export declare function parseTaskResultFromOutput(output: string): string | undefined;
@@ -8,197 +8,10 @@
8
8
  "setDefaultAgent": {
9
9
  "type": "boolean"
10
10
  },
11
- "scoringEngineVersion": {
12
- "type": "string",
13
- "enum": [
14
- "v1",
15
- "v2-shadow",
16
- "v2"
17
- ]
18
- },
19
- "balanceProviderUsage": {
20
- "type": "boolean"
21
- },
22
11
  "autoUpdate": {
23
12
  "description": "Disable automatic installation of plugin updates when false. Defaults to true.",
24
13
  "type": "boolean"
25
14
  },
26
- "manualPlan": {
27
- "type": "object",
28
- "properties": {
29
- "orchestrator": {
30
- "type": "object",
31
- "properties": {
32
- "primary": {
33
- "type": "string",
34
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
35
- },
36
- "fallback1": {
37
- "type": "string",
38
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
39
- },
40
- "fallback2": {
41
- "type": "string",
42
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
43
- },
44
- "fallback3": {
45
- "type": "string",
46
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
47
- }
48
- },
49
- "required": [
50
- "primary",
51
- "fallback1",
52
- "fallback2",
53
- "fallback3"
54
- ]
55
- },
56
- "oracle": {
57
- "type": "object",
58
- "properties": {
59
- "primary": {
60
- "type": "string",
61
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
62
- },
63
- "fallback1": {
64
- "type": "string",
65
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
66
- },
67
- "fallback2": {
68
- "type": "string",
69
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
70
- },
71
- "fallback3": {
72
- "type": "string",
73
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
74
- }
75
- },
76
- "required": [
77
- "primary",
78
- "fallback1",
79
- "fallback2",
80
- "fallback3"
81
- ]
82
- },
83
- "designer": {
84
- "type": "object",
85
- "properties": {
86
- "primary": {
87
- "type": "string",
88
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
89
- },
90
- "fallback1": {
91
- "type": "string",
92
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
93
- },
94
- "fallback2": {
95
- "type": "string",
96
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
97
- },
98
- "fallback3": {
99
- "type": "string",
100
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
101
- }
102
- },
103
- "required": [
104
- "primary",
105
- "fallback1",
106
- "fallback2",
107
- "fallback3"
108
- ]
109
- },
110
- "explorer": {
111
- "type": "object",
112
- "properties": {
113
- "primary": {
114
- "type": "string",
115
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
116
- },
117
- "fallback1": {
118
- "type": "string",
119
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
120
- },
121
- "fallback2": {
122
- "type": "string",
123
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
124
- },
125
- "fallback3": {
126
- "type": "string",
127
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
128
- }
129
- },
130
- "required": [
131
- "primary",
132
- "fallback1",
133
- "fallback2",
134
- "fallback3"
135
- ]
136
- },
137
- "librarian": {
138
- "type": "object",
139
- "properties": {
140
- "primary": {
141
- "type": "string",
142
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
143
- },
144
- "fallback1": {
145
- "type": "string",
146
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
147
- },
148
- "fallback2": {
149
- "type": "string",
150
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
151
- },
152
- "fallback3": {
153
- "type": "string",
154
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
155
- }
156
- },
157
- "required": [
158
- "primary",
159
- "fallback1",
160
- "fallback2",
161
- "fallback3"
162
- ]
163
- },
164
- "fixer": {
165
- "type": "object",
166
- "properties": {
167
- "primary": {
168
- "type": "string",
169
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
170
- },
171
- "fallback1": {
172
- "type": "string",
173
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
174
- },
175
- "fallback2": {
176
- "type": "string",
177
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
178
- },
179
- "fallback3": {
180
- "type": "string",
181
- "pattern": "^[^/\\s]+\\/[^\\s]+$"
182
- }
183
- },
184
- "required": [
185
- "primary",
186
- "fallback1",
187
- "fallback2",
188
- "fallback3"
189
- ]
190
- }
191
- },
192
- "required": [
193
- "orchestrator",
194
- "oracle",
195
- "designer",
196
- "explorer",
197
- "librarian",
198
- "fixer"
199
- ],
200
- "additionalProperties": false
201
- },
202
15
  "presets": {
203
16
  "type": "object",
204
17
  "propertyNames": {
@@ -534,67 +347,13 @@
534
347
  "type": "number",
535
348
  "minimum": 0
536
349
  },
537
- "chains": {
538
- "default": {},
539
- "type": "object",
540
- "properties": {
541
- "orchestrator": {
542
- "minItems": 1,
543
- "type": "array",
544
- "items": {
545
- "type": "string"
546
- }
547
- },
548
- "oracle": {
549
- "minItems": 1,
550
- "type": "array",
551
- "items": {
552
- "type": "string"
553
- }
554
- },
555
- "designer": {
556
- "minItems": 1,
557
- "type": "array",
558
- "items": {
559
- "type": "string"
560
- }
561
- },
562
- "explorer": {
563
- "minItems": 1,
564
- "type": "array",
565
- "items": {
566
- "type": "string"
567
- }
568
- },
569
- "librarian": {
570
- "minItems": 1,
571
- "type": "array",
572
- "items": {
573
- "type": "string"
574
- }
575
- },
576
- "fixer": {
577
- "minItems": 1,
578
- "type": "array",
579
- "items": {
580
- "type": "string"
581
- }
582
- }
583
- },
584
- "additionalProperties": {
585
- "minItems": 1,
586
- "type": "array",
587
- "items": {
588
- "type": "string"
589
- }
590
- }
591
- },
592
350
  "retry_on_empty": {
593
351
  "default": true,
594
352
  "description": "When true (default), empty provider responses are treated as failures, triggering fallback/retry. Set to false to treat them as successes.",
595
353
  "type": "boolean"
596
354
  }
597
- }
355
+ },
356
+ "additionalProperties": false
598
357
  },
599
358
  "council": {
600
359
  "type": "object",
@@ -645,12 +404,6 @@
645
404
  },
646
405
  "master": {
647
406
  "description": "DEPRECATED — ignored. Council agent synthesizes directly."
648
- },
649
- "master_timeout": {
650
- "description": "DEPRECATED — ignored. Use \"timeout\" instead."
651
- },
652
- "master_fallback": {
653
- "description": "DEPRECATED — ignored. No separate master session."
654
407
  }
655
408
  },
656
409
  "required": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode-slim",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "description": "Lightweight agent orchestration plugin for OpenCode - a slimmed-down fork of oh-my-opencode",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -19,6 +19,8 @@
19
19
  - `src/skills/clonedeps/` (workflow skill for dependency source mirroring)
20
20
  - `src/skills/simplify/` (readability/refactor guidance skill)
21
21
  - `src/skills/deepwork/` (orchestrator-only workflow for heavy coding sessions)
22
+ - `src/skills/reflect/` (orchestrator-only workflow for learning from repeated work and suggesting reusable improvements)
23
+ - `src/skills/worktrees/` (orchestrator-only workflow for safe Git worktree lanes)
22
24
  - `src/skills/oh-my-opencode-slim/` (orchestrator-only plugin configuration and self-improvement guidance)
23
25
  - Files are considered static runtime payload. No plugin TS module in `src/` imports these files directly; they
24
26
  are loaded by OpenCode via filesystem installation.
@@ -41,6 +43,7 @@
41
43
  - `verify-release-artifact.ts` enforces artifact completeness by asserting key
42
44
  bundled skill payloads such as `src/skills/simplify/SKILL.md`,
43
45
  `src/skills/codemap/SKILL.md`, `src/skills/clonedeps/SKILL.md`, and
44
- `src/skills/deepwork/SKILL.md`, plus `src/skills/oh-my-opencode-slim/SKILL.md`,
46
+ `src/skills/deepwork/SKILL.md`, `src/skills/reflect/SKILL.md`,
47
+ `src/skills/worktrees/SKILL.md`, plus `src/skills/oh-my-opencode-slim/SKILL.md`,
45
48
  are present in the tarball.
46
49
  - `package.json` scripts (`verify:release`, `build`) rely on these assets to ensure install-time skill availability.