oh-my-opencode 3.2.2 → 3.2.4

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 (42) hide show
  1. package/README.ja.md +0 -10
  2. package/README.ko.md +0 -14
  3. package/README.md +1 -15
  4. package/README.zh-cn.md +0 -14
  5. package/bin/oh-my-opencode.js +0 -0
  6. package/dist/agents/atlas/utils.d.ts +1 -1
  7. package/dist/agents/dynamic-agent-prompt-builder.d.ts +6 -0
  8. package/dist/agents/utils.d.ts +2 -2
  9. package/dist/cli/doctor/checks/model-resolution.d.ts +5 -0
  10. package/dist/cli/index.js +2423 -3508
  11. package/dist/config/schema.d.ts +98 -55
  12. package/dist/features/background-agent/manager.d.ts +2 -0
  13. package/dist/features/boulder-state/storage.d.ts +1 -1
  14. package/dist/features/boulder-state/types.d.ts +2 -0
  15. package/dist/features/builtin-skills/skills.d.ts +1 -0
  16. package/dist/features/claude-tasks/storage.d.ts +2 -0
  17. package/dist/features/opencode-skill-loader/skill-content.d.ts +1 -0
  18. package/dist/hooks/auto-update-checker/constants.d.ts +1 -1
  19. package/dist/hooks/category-skill-reminder/index.d.ts +2 -1
  20. package/dist/hooks/compaction-context-injector/index.d.ts +1 -8
  21. package/dist/hooks/index.d.ts +2 -1
  22. package/dist/hooks/write-existing-file-guard/index.d.ts +2 -0
  23. package/dist/index.js +2916 -15810
  24. package/dist/mcp/index.d.ts +2 -1
  25. package/dist/mcp/websearch.d.ts +7 -5
  26. package/dist/plugin-state.d.ts +0 -1
  27. package/dist/shared/connected-providers-cache.d.ts +8 -1
  28. package/dist/shared/disabled-tools.d.ts +2 -0
  29. package/dist/shared/index.d.ts +2 -0
  30. package/dist/shared/migration.d.ts +12 -0
  31. package/dist/shared/model-availability.d.ts +2 -1
  32. package/dist/shared/model-requirements.d.ts +1 -0
  33. package/dist/shared/opencode-server-auth.d.ts +19 -0
  34. package/dist/shared/port-utils.d.ts +9 -0
  35. package/dist/tools/delegate-task/constants.d.ts +5 -1
  36. package/dist/tools/delegate-task/executor.d.ts +1 -0
  37. package/dist/tools/delegate-task/types.d.ts +6 -0
  38. package/dist/tools/look-at/types.d.ts +2 -1
  39. package/dist/tools/lsp/client.d.ts +6 -0
  40. package/dist/tools/skill/types.d.ts +1 -0
  41. package/package.json +8 -8
  42. package/dist/shared/ollama-ndjson-parser.d.ts +0 -108
@@ -1,3 +1,4 @@
1
+ import type { OhMyOpenCodeConfig } from "../config/schema";
1
2
  export { McpNameSchema, type McpName } from "./types";
2
3
  type RemoteMcpConfig = {
3
4
  type: "remote";
@@ -6,4 +7,4 @@ type RemoteMcpConfig = {
6
7
  headers?: Record<string, string>;
7
8
  oauth?: false;
8
9
  };
9
- export declare function createBuiltinMcps(disabledMcps?: string[]): Record<string, RemoteMcpConfig>;
10
+ export declare function createBuiltinMcps(disabledMcps?: string[], config?: OhMyOpenCodeConfig): Record<string, RemoteMcpConfig>;
@@ -1,9 +1,11 @@
1
- export declare const websearch: {
1
+ import type { WebsearchConfig } from "../config/schema";
2
+ type RemoteMcpConfig = {
2
3
  type: "remote";
3
4
  url: string;
4
5
  enabled: boolean;
5
- headers: {
6
- "x-api-key": string;
7
- } | undefined;
8
- oauth: false;
6
+ headers?: Record<string, string>;
7
+ oauth?: false;
9
8
  };
9
+ export declare function createWebsearchConfig(config?: WebsearchConfig): RemoteMcpConfig;
10
+ export declare const websearch: RemoteMcpConfig;
11
+ export {};
@@ -3,4 +3,3 @@ export interface ModelCacheState {
3
3
  anthropicContext1MEnabled: boolean;
4
4
  }
5
5
  export declare function createModelCacheState(): ModelCacheState;
6
- export declare function getModelLimit(state: ModelCacheState, providerID: string, modelID: string): number | undefined;
@@ -1,5 +1,12 @@
1
+ interface ModelMetadata {
2
+ id: string;
3
+ provider?: string;
4
+ context?: number;
5
+ output?: number;
6
+ name?: string;
7
+ }
1
8
  interface ProviderModelsCache {
2
- models: Record<string, string[]>;
9
+ models: Record<string, string[] | ModelMetadata[]>;
3
10
  connected: string[];
4
11
  updatedAt: string;
5
12
  }
@@ -0,0 +1,2 @@
1
+ import type { ToolDefinition } from "@opencode-ai/plugin";
2
+ export declare function filterDisabledTools(tools: Record<string, ToolDefinition>, disabledTools: readonly string[] | undefined): Record<string, ToolDefinition>;
@@ -34,3 +34,5 @@ export * from "./connected-providers-cache";
34
34
  export * from "./session-utils";
35
35
  export * from "./tmux";
36
36
  export * from "./model-suggestion-retry";
37
+ export * from "./opencode-server-auth";
38
+ export * from "./port-utils";
@@ -15,10 +15,22 @@ export declare const HOOK_NAME_MAP: Record<string, string | null>;
15
15
  * This map will be removed in a future major version once migration period ends.
16
16
  */
17
17
  export declare const MODEL_TO_CATEGORY_MAP: Record<string, string>;
18
+ /**
19
+ * Model version migration map: old full model strings → new full model strings.
20
+ * Used to auto-upgrade hardcoded model versions in user configs when the plugin
21
+ * bumps to newer model versions.
22
+ *
23
+ * Keys are full "provider/model" strings. Only openai and anthropic entries needed.
24
+ */
25
+ export declare const MODEL_VERSION_MAP: Record<string, string>;
18
26
  export declare function migrateAgentNames(agents: Record<string, unknown>): {
19
27
  migrated: Record<string, unknown>;
20
28
  changed: boolean;
21
29
  };
30
+ export declare function migrateModelVersions(configs: Record<string, unknown>): {
31
+ migrated: Record<string, unknown>;
32
+ changed: boolean;
33
+ };
22
34
  export declare function migrateHookNames(hooks: string[]): {
23
35
  migrated: string[];
24
36
  changed: boolean;
@@ -2,7 +2,7 @@ export declare function fuzzyMatchModel(target: string, available: Set<string>,
2
2
  /**
3
3
  * Check if a target model is available (fuzzy match by model name, no provider filtering)
4
4
  *
5
- * @param targetModel - Model name to check (e.g., "gpt-5.2-codex")
5
+ * @param targetModel - Model name to check (e.g., "gpt-5.3-codex")
6
6
  * @param availableModels - Set of available models in "provider/model" format
7
7
  * @returns true if model is available, false otherwise
8
8
  */
@@ -15,5 +15,6 @@ export declare function isAnyFallbackModelAvailable(fallbackChain: Array<{
15
15
  providers: string[];
16
16
  model: string;
17
17
  }>, availableModels: Set<string>): boolean;
18
+ export declare function isAnyProviderConnected(providers: string[], availableModels: Set<string>): boolean;
18
19
  export declare function __resetModelCache(): void;
19
20
  export declare function isModelCacheAvailable(): boolean;
@@ -8,6 +8,7 @@ export type ModelRequirement = {
8
8
  variant?: string;
9
9
  requiresModel?: string;
10
10
  requiresAnyModel?: boolean;
11
+ requiresProvider?: string[];
11
12
  };
12
13
  export declare const AGENT_MODEL_REQUIREMENTS: Record<string, ModelRequirement>;
13
14
  export declare const CATEGORY_MODEL_REQUIREMENTS: Record<string, ModelRequirement>;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Builds HTTP Basic Auth header from environment variables.
3
+ *
4
+ * @returns Basic Auth header string, or undefined if OPENCODE_SERVER_PASSWORD is not set
5
+ */
6
+ export declare function getServerBasicAuthHeader(): string | undefined;
7
+ /**
8
+ * Injects HTTP Basic Auth header into the OpenCode SDK client.
9
+ *
10
+ * This function accesses the SDK's internal `_client.setConfig()` method.
11
+ * While `_client` has an underscore prefix (suggesting internal use), this is actually
12
+ * a stable public API from `@hey-api/openapi-ts` generated client:
13
+ * - `setConfig()` MERGES headers (does not replace existing ones)
14
+ * - This is the documented way to update client config at runtime
15
+ *
16
+ * @see https://github.com/sst/opencode/blob/main/packages/sdk/js/src/gen/client/client.gen.ts
17
+ * @throws {Error} If OPENCODE_SERVER_PASSWORD is set but client structure is incompatible
18
+ */
19
+ export declare function injectServerAuthIntoClient(client: unknown): void;
@@ -0,0 +1,9 @@
1
+ declare const DEFAULT_SERVER_PORT = 4096;
2
+ export declare function isPortAvailable(port: number, hostname?: string): Promise<boolean>;
3
+ export declare function findAvailablePort(startPort?: number, hostname?: string): Promise<number>;
4
+ export interface AutoPortResult {
5
+ port: number;
6
+ wasAutoSelected: boolean;
7
+ }
8
+ export declare function getAvailableServerPort(preferredPort?: number, hostname?: string): Promise<AutoPortResult>;
9
+ export { DEFAULT_SERVER_PORT };
@@ -1,4 +1,5 @@
1
1
  import type { CategoryConfig } from "../../config/schema";
2
+ import type { AvailableCategory, AvailableSkill } from "../../agents/dynamic-agent-prompt-builder";
2
3
  export declare const VISUAL_CATEGORY_PROMPT_APPEND = "<Category_Context>\nYou are working on VISUAL/UI tasks.\n\nDesign-first mindset:\n- Bold aesthetic choices over safe defaults\n- Unexpected layouts, asymmetry, grid-breaking elements\n- Distinctive typography (avoid: Arial, Inter, Roboto, Space Grotesk)\n- Cohesive color palettes with sharp accents\n- High-impact animations with staggered reveals\n- Atmosphere: gradient meshes, noise textures, layered transparencies\n\nAVOID: Generic fonts, purple gradients on white, predictable layouts, cookie-cutter patterns.\n</Category_Context>";
3
4
  export declare const ULTRABRAIN_CATEGORY_PROMPT_APPEND = "<Category_Context>\nYou are working on DEEP LOGICAL REASONING / COMPLEX ARCHITECTURE tasks.\n\n**CRITICAL - CODE STYLE REQUIREMENTS (NON-NEGOTIABLE)**:\n1. BEFORE writing ANY code, SEARCH the existing codebase to find similar patterns/styles\n2. Your code MUST match the project's existing conventions - blend in seamlessly\n3. Write READABLE code that humans can easily understand - no clever tricks\n4. If unsure about style, explore more files until you find the pattern\n\nStrategic advisor mindset:\n- Bias toward simplicity: least complex solution that fulfills requirements\n- Leverage existing code/patterns over new components\n- Prioritize developer experience and maintainability\n- One clear recommendation with effort estimate (Quick/Short/Medium/Large)\n- Signal when advanced approach warranted\n\nResponse format:\n- Bottom line (2-3 sentences)\n- Action plan (numbered steps)\n- Risks and mitigations (if relevant)\n</Category_Context>";
4
5
  export declare const ARTISTRY_CATEGORY_PROMPT_APPEND = "<Category_Context>\nYou are working on HIGHLY CREATIVE / ARTISTIC tasks.\n\nArtistic genius mindset:\n- Push far beyond conventional boundaries\n- Explore radical, unconventional directions\n- Surprise and delight: unexpected twists, novel combinations\n- Rich detail and vivid expression\n- Break patterns deliberately when it serves the creative vision\n\nApproach:\n- Generate diverse, bold options first\n- Embrace ambiguity and wild experimentation\n- Balance novelty with coherence\n- This is for tasks requiring exceptional creativity\n</Category_Context>";
@@ -16,7 +17,10 @@ export declare const CATEGORY_DESCRIPTIONS: Record<string, string>;
16
17
  * then summarize user requirements and clarify uncertainties before proceeding.
17
18
  * Also MANDATES dependency graphs, parallel execution analysis, and category+skill recommendations.
18
19
  */
19
- export declare const PLAN_AGENT_SYSTEM_PREPEND = "<system>\nBEFORE you begin planning, you MUST first understand the user's request deeply.\n\nMANDATORY CONTEXT GATHERING PROTOCOL:\n1. Launch background agents to gather context:\n - call_omo_agent(description=\"Explore codebase patterns\", subagent_type=\"explore\", run_in_background=true, prompt=\"<search for relevant patterns, files, and implementations in the codebase related to user's request>\")\n - call_omo_agent(description=\"Research documentation\", subagent_type=\"librarian\", run_in_background=true, prompt=\"<search for external documentation, examples, and best practices related to user's request>\")\n\n2. After gathering context, ALWAYS present:\n - **User Request Summary**: Concise restatement of what the user is asking for\n - **Uncertainties**: List of unclear points, ambiguities, or assumptions you're making\n - **Clarifying Questions**: Specific questions to resolve the uncertainties\n\n3. ITERATE until ALL requirements are crystal clear:\n - Do NOT proceed to planning until you have 100% clarity\n - Ask the user to confirm your understanding\n - Resolve every ambiguity before generating the work plan\n\nREMEMBER: Vague requirements lead to failed implementations. Take the time to understand thoroughly.\n</system>\n\n<CRITICAL_REQUIREMENT_DEPENDENCY_PARALLEL_EXECUTION_CATEGORY_SKILLS>\n#####################################################################\n# #\n# \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 #\n# \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 #\n# \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 #\n# \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551 \u2588\u2588\u2551 #\n# \u2588\u2588\uFFFD\uFFFD \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D #\n# \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2580\u2580\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u255D #\n# #\n#####################################################################\n\nYOU MUST INCLUDE THE FOLLOWING SECTIONS IN YOUR PLAN OUTPUT.\nTHIS IS NON-NEGOTIABLE. FAILURE TO INCLUDE THESE SECTIONS = INCOMPLETE PLAN.\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\u2588 SECTION 1: TASK DEPENDENCY GRAPH (MANDATORY) \u2588\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nYOU MUST ANALYZE AND DOCUMENT TASK DEPENDENCIES.\n\nFor EVERY task in your plan, you MUST specify:\n- Which tasks it DEPENDS ON (blockers)\n- Which tasks DEPEND ON IT (dependents)\n- The REASON for each dependency\n\nExample format:\n```\n## Task Dependency Graph\n\n| Task | Depends On | Reason |\n|------|------------|--------|\n| Task 1 | None | Starting point, no prerequisites |\n| Task 2 | Task 1 | Requires output/artifact from Task 1 |\n| Task 3 | Task 1 | Uses same foundation established in Task 1 |\n| Task 4 | Task 2, Task 3 | Integrates results from both tasks |\n```\n\nWHY THIS MATTERS:\n- Executors need to know execution ORDER\n- Prevents blocked work from starting prematurely\n- Identifies critical path for project timeline\n\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\u2588 SECTION 2: PARALLEL EXECUTION GRAPH (MANDATORY) \u2588\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nYOU MUST IDENTIFY WHICH TASKS CAN RUN IN PARALLEL.\n\nAnalyze your dependency graph and group tasks into PARALLEL EXECUTION WAVES:\n\nExample format:\n```\n## Parallel Execution Graph\n\nWave 1 (Start immediately):\n\u251C\u2500\u2500 Task 1: [description] (no dependencies)\n\u2514\u2500\u2500 Task 5: [description] (no dependencies)\n\nWave 2 (After Wave 1 completes):\n\u251C\u2500\u2500 Task 2: [description] (depends: Task 1)\n\u251C\u2500\u2500 Task 3: [description] (depends: Task 1)\n\u2514\u2500\u2500 Task 6: [description] (depends: Task 5)\n\nWave 3 (After Wave 2 completes):\n\u2514\u2500\u2500 Task 4: [description] (depends: Task 2, Task 3)\n\nCritical Path: Task 1 \u2192 Task 2 \u2192 Task 4\nEstimated Parallel Speedup: 40% faster than sequential\n```\n\nWHY THIS MATTERS:\n- MASSIVE time savings through parallelization\n- Executors can dispatch multiple agents simultaneously\n- Identifies bottlenecks in the execution plan\n\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\u2588 SECTION 3: CATEGORY + SKILLS RECOMMENDATIONS (MANDATORY) \u2588\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nFOR EVERY TASK, YOU MUST RECOMMEND:\n1. Which CATEGORY to use for delegation\n2. Which SKILLS to load for the delegated agent\n\n### AVAILABLE CATEGORIES\n\n| Category | Best For | Model |\n|----------|----------|-------|\n| `visual-engineering` | Frontend, UI/UX, design, styling, animation | google/gemini-3-pro |\n| `ultrabrain` | Complex architecture, deep logical reasoning | openai/gpt-5.2-codex |\n| `artistry` | Highly creative/artistic tasks, novel ideas | google/gemini-3-pro |\n| `quick` | Trivial tasks - single file, typo fixes | anthropic/claude-haiku-4-5 |\n| `unspecified-low` | Moderate effort, doesn't fit other categories | anthropic/claude-sonnet-4-5 |\n| `unspecified-high` | High effort, doesn't fit other categories | anthropic/claude-opus-4-5 |\n| `writing` | Documentation, prose, technical writing | google/gemini-3-flash |\n\n### AVAILABLE SKILLS (ALWAYS EVALUATE ALL)\n\nSkills inject specialized expertise into the delegated agent.\nYOU MUST evaluate EVERY skill and justify inclusions/omissions.\n\n| Skill | Domain |\n|-------|--------|\n| `agent-browser` | Browser automation, web testing |\n| `frontend-ui-ux` | Stunning UI/UX design |\n| `git-master` | Atomic commits, git operations |\n| `dev-browser` | Persistent browser state automation |\n| `typescript-programmer` | Production TypeScript code |\n| `python-programmer` | Production Python code |\n| `svelte-programmer` | Svelte components |\n| `golang-tui-programmer` | Go TUI with Charmbracelet |\n| `python-debugger` | Interactive Python debugging |\n| `data-scientist` | DuckDB/Polars data processing |\n| `prompt-engineer` | AI prompt optimization |\n\n### REQUIRED OUTPUT FORMAT\n\nFor EACH task, include a recommendation block:\n\n```\n### Task N: [Task Title]\n\n**Delegation Recommendation:**\n- Category: `[category-name]` - [reason for choice]\n- Skills: [`skill-1`, `skill-2`] - [reason each skill is needed]\n\n**Skills Evaluation:**\n- INCLUDED `skill-name`: [reason]\n- OMITTED `other-skill`: [reason domain doesn't overlap]\n```\n\nWHY THIS MATTERS:\n- Category determines the MODEL used for execution\n- Skills inject SPECIALIZED KNOWLEDGE into the executor\n- Missing a relevant skill = suboptimal execution\n- Wrong category = wrong model = poor results\n\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\u2588 RESPONSE FORMAT SPECIFICATION (MANDATORY) \u2588\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nYOUR PLAN OUTPUT MUST FOLLOW THIS EXACT STRUCTURE:\n\n```markdown\n# [Plan Title]\n\n## Context\n[User request summary, interview findings, research results]\n\n## Task Dependency Graph\n[Dependency table - see Section 1]\n\n## Parallel Execution Graph \n[Wave structure - see Section 2]\n\n## Tasks\n\n### Task 1: [Title]\n**Description**: [What to do]\n**Delegation Recommendation**:\n- Category: `[category]` - [reason]\n- Skills: [`skill-1`] - [reason]\n**Skills Evaluation**: [\u2705 included / \u274C omitted with reasons]\n**Depends On**: [Task IDs or \"None\"]\n**Acceptance Criteria**: [Verifiable conditions]\n\n### Task 2: [Title]\n[Same structure...]\n\n## Commit Strategy\n[How to commit changes atomically]\n\n## Success Criteria\n[Final verification steps]\n```\n\n#####################################################################\n# #\n# FAILURE TO INCLUDE THESE SECTIONS = PLAN WILL BE REJECTED #\n# BY MOMUS REVIEW. DO NOT SKIP. DO NOT ABBREVIATE. #\n# #\n#####################################################################\n</CRITICAL_REQUIREMENT_DEPENDENCY_PARALLEL_EXECUTION_CATEGORY_SKILLS>\n\n<FINAL_OUTPUT_FOR_CALLER>\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\u2588 SECTION 4: ACTIONABLE TODO LIST FOR CALLER (MANDATORY) \u2588\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nYOU MUST END YOUR RESPONSE WITH THIS SECTION.\n\n```markdown\n## TODO List (ADD THESE)\n\n> CALLER: Add these TODOs using TodoWrite/TaskCreate and execute by wave.\n\n### Wave 1 (Start Immediately - No Dependencies)\n\n- [ ] **1. [Task Title]**\n - What: [Clear implementation steps]\n - Depends: None\n - Blocks: [Tasks that depend on this]\n - Category: `category-name`\n - Skills: [`skill-1`, `skill-2`]\n - QA: [How to verify completion - specific command or check]\n\n- [ ] **N. [Task Title]**\n - What: [Steps]\n - Depends: None\n - Blocks: [...]\n - Category: `category-name`\n - Skills: [`skill-1`]\n - QA: [Verification]\n\n### Wave 2 (After Wave 1 Completes)\n\n- [ ] **2. [Task Title]**\n - What: [Steps]\n - Depends: 1\n - Blocks: [4]\n - Category: `category-name`\n - Skills: [`skill-1`]\n - QA: [Verification]\n\n[Continue for all waves...]\n\n## Execution Instructions\n\n1. **Wave 1**: Fire these tasks IN PARALLEL (no dependencies)\n ```\n delegate_task(category=\"...\", load_skills=[...], run_in_background=false, prompt=\"Task 1: ...\")\n delegate_task(category=\"...\", load_skills=[...], run_in_background=false, prompt=\"Task N: ...\")\n ```\n\n2. **Wave 2**: After Wave 1 completes, fire next wave IN PARALLEL\n ```\n delegate_task(category=\"...\", load_skills=[...], run_in_background=false, prompt=\"Task 2: ...\")\n ```\n\n3. Continue until all waves complete\n\n4. Final QA: Verify all tasks pass their QA criteria\n```\n\nWHY THIS FORMAT IS MANDATORY:\n- Caller can directly copy TODO items\n- Wave grouping enables parallel execution\n- Each task has clear delegate_task parameters\n- QA criteria ensure verifiable completion\n</FINAL_OUTPUT_FOR_CALLER>\n\n";
20
+ export declare const PLAN_AGENT_SYSTEM_PREPEND_STATIC_BEFORE_SKILLS = "<system>\nBEFORE you begin planning, you MUST first understand the user's request deeply.\n\nMANDATORY CONTEXT GATHERING PROTOCOL:\n1. Launch background agents to gather context:\n - call_omo_agent(description=\"Explore codebase patterns\", subagent_type=\"explore\", run_in_background=true, prompt=\"<search for relevant patterns, files, and implementations in the codebase related to user's request>\")\n - call_omo_agent(description=\"Research documentation\", subagent_type=\"librarian\", run_in_background=true, prompt=\"<search for external documentation, examples, and best practices related to user's request>\")\n\n2. After gathering context, ALWAYS present:\n - **User Request Summary**: Concise restatement of what the user is asking for\n - **Uncertainties**: List of unclear points, ambiguities, or assumptions you're making\n - **Clarifying Questions**: Specific questions to resolve the uncertainties\n\n3. ITERATE until ALL requirements are crystal clear:\n - Do NOT proceed to planning until you have 100% clarity\n - Ask the user to confirm your understanding\n - Resolve every ambiguity before generating the work plan\n\nREMEMBER: Vague requirements lead to failed implementations. Take the time to understand thoroughly.\n</system>\n\n<CRITICAL_REQUIREMENT_DEPENDENCY_PARALLEL_EXECUTION_CATEGORY_SKILLS>\n#####################################################################\n# #\n# \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 #\n# \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 #\n# \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 #\n# \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551 \u2588\u2588\u2551 #\n# \u2588\u2588\uFFFD\uFFFD \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D #\n# \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2580\u2580\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u255D #\n# #\n#####################################################################\n\nYOU MUST INCLUDE THE FOLLOWING SECTIONS IN YOUR PLAN OUTPUT.\nTHIS IS NON-NEGOTIABLE. FAILURE TO INCLUDE THESE SECTIONS = INCOMPLETE PLAN.\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\u2588 SECTION 1: TASK DEPENDENCY GRAPH (MANDATORY) \u2588\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nYOU MUST ANALYZE AND DOCUMENT TASK DEPENDENCIES.\n\nFor EVERY task in your plan, you MUST specify:\n- Which tasks it DEPENDS ON (blockers)\n- Which tasks DEPEND ON IT (dependents)\n- The REASON for each dependency\n\nExample format:\n```\n## Task Dependency Graph\n\n| Task | Depends On | Reason |\n|------|------------|--------|\n| Task 1 | None | Starting point, no prerequisites |\n| Task 2 | Task 1 | Requires output/artifact from Task 1 |\n| Task 3 | Task 1 | Uses same foundation established in Task 1 |\n| Task 4 | Task 2, Task 3 | Integrates results from both tasks |\n```\n\nWHY THIS MATTERS:\n- Executors need to know execution ORDER\n- Prevents blocked work from starting prematurely\n- Identifies critical path for project timeline\n\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\u2588 SECTION 2: PARALLEL EXECUTION GRAPH (MANDATORY) \u2588\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nYOU MUST IDENTIFY WHICH TASKS CAN RUN IN PARALLEL.\n\nAnalyze your dependency graph and group tasks into PARALLEL EXECUTION WAVES:\n\nExample format:\n```\n## Parallel Execution Graph\n\nWave 1 (Start immediately):\n\u251C\u2500\u2500 Task 1: [description] (no dependencies)\n\u2514\u2500\u2500 Task 5: [description] (no dependencies)\n\nWave 2 (After Wave 1 completes):\n\u251C\u2500\u2500 Task 2: [description] (depends: Task 1)\n\u251C\u2500\u2500 Task 3: [description] (depends: Task 1)\n\u2514\u2500\u2500 Task 6: [description] (depends: Task 5)\n\nWave 3 (After Wave 2 completes):\n\u2514\u2500\u2500 Task 4: [description] (depends: Task 2, Task 3)\n\nCritical Path: Task 1 \u2192 Task 2 \u2192 Task 4\nEstimated Parallel Speedup: 40% faster than sequential\n```\n\nWHY THIS MATTERS:\n- MASSIVE time savings through parallelization\n- Executors can dispatch multiple agents simultaneously\n- Identifies bottlenecks in the execution plan\n\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\u2588 SECTION 3: CATEGORY + SKILLS RECOMMENDATIONS (MANDATORY) \u2588\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nFOR EVERY TASK, YOU MUST RECOMMEND:\n1. Which CATEGORY to use for delegation\n2. Which SKILLS to load for the delegated agent\n";
21
+ export declare const PLAN_AGENT_SYSTEM_PREPEND_STATIC_AFTER_SKILLS = "### REQUIRED OUTPUT FORMAT\n\nFor EACH task, include a recommendation block:\n\n```\n### Task N: [Task Title]\n\n**Delegation Recommendation:**\n- Category: `[category-name]` - [reason for choice]\n- Skills: [`skill-1`, `skill-2`] - [reason each skill is needed]\n\n**Skills Evaluation:**\n- INCLUDED `skill-name`: [reason]\n- OMITTED `other-skill`: [reason domain doesn't overlap]\n```\n\nWHY THIS MATTERS:\n- Category determines the MODEL used for execution\n- Skills inject SPECIALIZED KNOWLEDGE into the executor\n- Missing a relevant skill = suboptimal execution\n- Wrong category = wrong model = poor results\n\n\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\u2588 RESPONSE FORMAT SPECIFICATION (MANDATORY) \u2588\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nYOUR PLAN OUTPUT MUST FOLLOW THIS EXACT STRUCTURE:\n\n```markdown\n# [Plan Title]\n\n## Context\n[User request summary, interview findings, research results]\n\n## Task Dependency Graph\n[Dependency table - see Section 1]\n\n## Parallel Execution Graph \n[Wave structure - see Section 2]\n\n## Tasks\n\n### Task 1: [Title]\n**Description**: [What to do]\n**Delegation Recommendation**:\n- Category: `[category]` - [reason]\n- Skills: [`skill-1`] - [reason]\n**Skills Evaluation**: [\u2705 included / \u274C omitted with reasons]\n**Depends On**: [Task IDs or \"None\"]\n**Acceptance Criteria**: [Verifiable conditions]\n\n### Task 2: [Title]\n[Same structure...]\n\n## Commit Strategy\n[How to commit changes atomically]\n\n## Success Criteria\n[Final verification steps]\n```\n\n#####################################################################\n# #\n# FAILURE TO INCLUDE THESE SECTIONS = PLAN WILL BE REJECTED #\n# BY MOMUS REVIEW. DO NOT SKIP. DO NOT ABBREVIATE. #\n# #\n#####################################################################\n</CRITICAL_REQUIREMENT_DEPENDENCY_PARALLEL_EXECUTION_CATEGORY_SKILLS>\n\n<FINAL_OUTPUT_FOR_CALLER>\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\u2588 SECTION 4: ACTIONABLE TODO LIST FOR CALLER (MANDATORY) \u2588\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nYOU MUST END YOUR RESPONSE WITH THIS SECTION.\n\n```markdown\n## TODO List (ADD THESE)\n\n> CALLER: Add these TODOs using TodoWrite/TaskCreate and execute by wave.\n\n### Wave 1 (Start Immediately - No Dependencies)\n\n- [ ] **1. [Task Title]**\n - What: [Clear implementation steps]\n - Depends: None\n - Blocks: [Tasks that depend on this]\n - Category: `category-name`\n - Skills: [`skill-1`, `skill-2`]\n - QA: [How to verify completion - specific command or check]\n\n- [ ] **N. [Task Title]**\n - What: [Steps]\n - Depends: None\n - Blocks: [...]\n - Category: `category-name`\n - Skills: [`skill-1`]\n - QA: [Verification]\n\n### Wave 2 (After Wave 1 Completes)\n\n- [ ] **2. [Task Title]**\n - What: [Steps]\n - Depends: 1\n - Blocks: [4]\n - Category: `category-name`\n - Skills: [`skill-1`]\n - QA: [Verification]\n\n[Continue for all waves...]\n\n## Execution Instructions\n\n1. **Wave 1**: Fire these tasks IN PARALLEL (no dependencies)\n ```\n delegate_task(category=\"...\", load_skills=[...], run_in_background=false, prompt=\"Task 1: ...\")\n delegate_task(category=\"...\", load_skills=[...], run_in_background=false, prompt=\"Task N: ...\")\n ```\n\n2. **Wave 2**: After Wave 1 completes, fire next wave IN PARALLEL\n ```\n delegate_task(category=\"...\", load_skills=[...], run_in_background=false, prompt=\"Task 2: ...\")\n ```\n\n3. Continue until all waves complete\n\n4. Final QA: Verify all tasks pass their QA criteria\n```\n\nWHY THIS FORMAT IS MANDATORY:\n- Caller can directly copy TODO items\n- Wave grouping enables parallel execution\n- Each task has clear delegate_task parameters\n- QA criteria ensure verifiable completion\n</FINAL_OUTPUT_FOR_CALLER>\n\n";
22
+ export declare function buildPlanAgentSkillsSection(categories?: AvailableCategory[], skills?: AvailableSkill[]): string;
23
+ export declare function buildPlanAgentSystemPrepend(categories?: AvailableCategory[], skills?: AvailableSkill[]): string;
20
24
  /**
21
25
  * List of agent names that should be treated as plan agents.
22
26
  * Case-insensitive matching is used.
@@ -29,6 +29,7 @@ export interface ParentContext {
29
29
  export declare function resolveSkillContent(skills: string[], options: {
30
30
  gitMasterConfig?: GitMasterConfig;
31
31
  browserProvider?: BrowserAutomationProvider;
32
+ disabledSkills?: Set<string>;
32
33
  }): Promise<{
33
34
  content: string | undefined;
34
35
  error: string | null;
@@ -1,6 +1,7 @@
1
1
  import type { PluginInput } from "@opencode-ai/plugin";
2
2
  import type { BackgroundManager } from "../../features/background-agent";
3
3
  import type { CategoriesConfig, GitMasterConfig, BrowserAutomationProvider } from "../../config/schema";
4
+ import type { AvailableCategory, AvailableSkill } from "../../agents/dynamic-agent-prompt-builder";
4
5
  export type OpencodeClient = PluginInput["client"];
5
6
  export interface DelegateTaskArgs {
6
7
  description: string;
@@ -39,10 +40,15 @@ export interface DelegateTaskToolOptions {
39
40
  gitMasterConfig?: GitMasterConfig;
40
41
  sisyphusJuniorModel?: string;
41
42
  browserProvider?: BrowserAutomationProvider;
43
+ disabledSkills?: Set<string>;
44
+ availableCategories?: AvailableCategory[];
45
+ availableSkills?: AvailableSkill[];
42
46
  onSyncSessionCreated?: (event: SyncSessionCreatedEvent) => Promise<void>;
43
47
  }
44
48
  export interface BuildSystemContentInput {
45
49
  skillContent?: string;
46
50
  categoryPromptAppend?: string;
47
51
  agentName?: string;
52
+ availableCategories?: AvailableCategory[];
53
+ availableSkills?: AvailableSkill[];
48
54
  }
@@ -1,4 +1,5 @@
1
1
  export interface LookAtArgs {
2
- file_path: string;
2
+ file_path?: string;
3
+ image_data?: string;
3
4
  goal: string;
4
5
  }
@@ -1,4 +1,8 @@
1
1
  import type { Diagnostic, ResolvedServer } from "./types";
2
+ export declare function validateCwd(cwd: string): {
3
+ valid: boolean;
4
+ error?: string;
5
+ };
2
6
  declare class LSPServerManager {
3
7
  private static instance;
4
8
  private clients;
@@ -24,6 +28,8 @@ export declare class LSPClient {
24
28
  private proc;
25
29
  private connection;
26
30
  private openedFiles;
31
+ private documentVersions;
32
+ private lastSyncedText;
27
33
  private stderrBuffer;
28
34
  private processExited;
29
35
  private diagnosticsStore;
@@ -25,4 +25,5 @@ export interface SkillLoadOptions {
25
25
  getSessionID?: () => string;
26
26
  /** Git master configuration for watermark/co-author settings */
27
27
  gitMasterConfig?: GitMasterConfig;
28
+ disabledSkills?: Set<string>;
28
29
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "3.2.2",
3
+ "version": "3.2.4",
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",
@@ -74,13 +74,13 @@
74
74
  "typescript": "^5.7.3"
75
75
  },
76
76
  "optionalDependencies": {
77
- "oh-my-opencode-darwin-arm64": "3.2.2",
78
- "oh-my-opencode-darwin-x64": "3.2.2",
79
- "oh-my-opencode-linux-arm64": "3.2.2",
80
- "oh-my-opencode-linux-arm64-musl": "3.2.2",
81
- "oh-my-opencode-linux-x64": "3.2.2",
82
- "oh-my-opencode-linux-x64-musl": "3.2.2",
83
- "oh-my-opencode-windows-x64": "3.2.2"
77
+ "oh-my-opencode-darwin-arm64": "3.2.4",
78
+ "oh-my-opencode-darwin-x64": "3.2.4",
79
+ "oh-my-opencode-linux-arm64": "3.2.4",
80
+ "oh-my-opencode-linux-arm64-musl": "3.2.4",
81
+ "oh-my-opencode-linux-x64": "3.2.4",
82
+ "oh-my-opencode-linux-x64-musl": "3.2.4",
83
+ "oh-my-opencode-windows-x64": "3.2.4"
84
84
  },
85
85
  "trustedDependencies": [
86
86
  "@ast-grep/cli",
@@ -1,108 +0,0 @@
1
- /**
2
- * Ollama NDJSON Parser
3
- *
4
- * Parses newline-delimited JSON (NDJSON) responses from Ollama API.
5
- *
6
- * @module ollama-ndjson-parser
7
- * @see https://github.com/code-yeongyu/oh-my-opencode/issues/1124
8
- * @see https://github.com/ollama/ollama/blob/main/docs/api.md
9
- */
10
- /**
11
- * Ollama message structure
12
- */
13
- export interface OllamaMessage {
14
- tool_calls?: Array<{
15
- function: {
16
- name: string;
17
- arguments: Record<string, unknown>;
18
- };
19
- }>;
20
- content?: string;
21
- }
22
- /**
23
- * Ollama NDJSON line structure
24
- */
25
- export interface OllamaNDJSONLine {
26
- message?: OllamaMessage;
27
- done: boolean;
28
- total_duration?: number;
29
- load_duration?: number;
30
- prompt_eval_count?: number;
31
- prompt_eval_duration?: number;
32
- eval_count?: number;
33
- eval_duration?: number;
34
- }
35
- /**
36
- * Merged Ollama response
37
- */
38
- export interface OllamaMergedResponse {
39
- message: OllamaMessage;
40
- done: boolean;
41
- stats?: {
42
- total_duration?: number;
43
- load_duration?: number;
44
- prompt_eval_count?: number;
45
- prompt_eval_duration?: number;
46
- eval_count?: number;
47
- eval_duration?: number;
48
- };
49
- }
50
- /**
51
- * Parse Ollama streaming NDJSON response into a single merged object.
52
- *
53
- * Ollama returns streaming responses as newline-delimited JSON (NDJSON):
54
- * ```
55
- * {"message":{"tool_calls":[...]}, "done":false}
56
- * {"message":{"content":""}, "done":true}
57
- * ```
58
- *
59
- * This function:
60
- * 1. Splits the response by newlines
61
- * 2. Parses each line as JSON
62
- * 3. Merges tool_calls and content from all lines
63
- * 4. Returns a single merged response
64
- *
65
- * @param response - Raw NDJSON response string from Ollama API
66
- * @returns Merged response with all tool_calls and content combined
67
- * @throws {Error} If no valid JSON lines are found
68
- *
69
- * @example
70
- * ```typescript
71
- * const ndjsonResponse = `
72
- * {"message":{"tool_calls":[{"function":{"name":"read","arguments":{"filePath":"README.md"}}}]}, "done":false}
73
- * {"message":{"content":""}, "done":true}
74
- * `;
75
- *
76
- * const merged = parseOllamaStreamResponse(ndjsonResponse);
77
- * // Result:
78
- * // {
79
- * // message: {
80
- * // tool_calls: [{ function: { name: "read", arguments: { filePath: "README.md" } } }],
81
- * // content: ""
82
- * // },
83
- * // done: true
84
- * // }
85
- * ```
86
- */
87
- export declare function parseOllamaStreamResponse(response: string): OllamaMergedResponse;
88
- /**
89
- * Check if a response string is NDJSON format.
90
- *
91
- * NDJSON is identified by:
92
- * - Multiple lines
93
- * - Each line is valid JSON
94
- * - At least one line has "done" field
95
- *
96
- * @param response - Response string to check
97
- * @returns true if response appears to be NDJSON
98
- *
99
- * @example
100
- * ```typescript
101
- * const ndjson = '{"done":false}\n{"done":true}';
102
- * const singleJson = '{"done":true}';
103
- *
104
- * isNDJSONResponse(ndjson); // true
105
- * isNDJSONResponse(singleJson); // false
106
- * ```
107
- */
108
- export declare function isNDJSONResponse(response: string): boolean;