@openspoon/subtask2 0.1.15 → 0.2.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
@@ -1,42 +1,37 @@
1
- # subtask2 - a stronger opencode /command handler
1
+ # A stronger opencode /command handler
2
2
 
3
- Give super powers to your slash commands with `@openspoon/subtask2`
3
+ ### TL:DR - More agency, control and capabilities for commands
4
4
 
5
- ## Installation
5
+ This plugin affects how opencode handles slash commands with additional frontmatter parameters and enables parallel command execution. It is a set of new command features designed to better orchestrate, steer and keep the agentic loop alive. Compose as simple or complex a workflow as you want.
6
6
 
7
- Add subtask2 to your opencode config plugin array
7
+ ### Key features
8
8
 
9
- ```json
10
- {
11
- "plugins": ["@openspoon/subtask2"]
12
- }
13
- ```
9
+ - `return` instruct the main session on **command** or **subtask(s)** results - _can be chained, supports `/command` syntax_
10
+ - `parallel` run subtasks concurrently - _only parent's `return` applies when all are done_
11
+ - `command` extra command to run along the main one - _forced into a subtask_
12
+ - `arguments` pass arguments with command frontmatter or `||` message pipe
13
+ - _nested parallels are automatically flattened_ (max depth: 5)
14
14
 
15
- ## TL:DR - Keep the agentic loop alive + parallel commands
15
+ #### ⚠️ Pending PR
16
16
 
17
- This plugins affects how opencode handles commands with additional frontmatter parameters and enables parallel commands
18
-
19
- - `return` tell the main agent what to do with command or subtask(s) results. Supports multiple sequential prompts.
20
- - `parallel` run multiple subtasks concurrently (accepts arguments)
21
-
22
- ⚠️ Requires [this PR](https://github.com/sst/opencode/pull/6478) for `parallel` and non-subtask command features, as well as proper model inheritance (piping the right model and agent to the right subtask) to work.
17
+ Requires [this PR](https://github.com/sst/opencode/pull/6478) for `parallel` and `subtask:false` command features, as well as proper model inheritance (piping the right model and agent to the right subtask and back) to work.
23
18
 
24
19
  ---
25
20
 
26
21
  <details>
27
22
  <summary><strong>Some examples</strong> (click to expand)</summary>
28
23
 
29
- **Parallel subtask with different models (A/B plan comparison)**
24
+ **Parallel subtask with different models (A/B/C plan comparison)**
30
25
 
31
26
  ```yaml
32
27
  ---
33
28
  description: multi-model ensemble, 3 models plan in parallel, best ideas unified
34
29
  model: github-copilot/claude-opus-4.5
35
30
  subtask: true
36
- parallel: plan-gemini, plan-gpt
31
+ parallel: /plan-gemini, /plan-gpt
37
32
  return:
38
33
  - Compare all 3 plans and validate each directly against the codebase. Pick the best ideas from each and create a unified implementation plan.
39
- - Feed the implementation plan to a review subagent, let's poke holes.
34
+ - /review-plan focus on simplicity and correctness
40
35
  ---
41
36
  Plan the implementation for the following feature
42
37
  > $ARGUMENTS
@@ -90,9 +85,9 @@ Conceptually design a React modal component with the following requirements
90
85
  <details>
91
86
  <summary><strong>Feature documentation</strong> (click to expand)</summary>
92
87
 
93
- ### 1. `return` - Command return instructions (supports chaining)
88
+ ### 1. `return` - Command return instructions or the old 'look again' trick
94
89
 
95
- Tell the main agent exactly what to do after a command completes:
90
+ Tell the main agent exactly what to do after a command completes, supports chaining and triggering other commands.
96
91
 
97
92
  ```yaml
98
93
  ---
@@ -112,8 +107,22 @@ return: [Implement the fix, Run the tests]
112
107
  Find the bug in auth.ts
113
108
  ```
114
109
 
115
- - **First return** replaces opencode's "summarize" message (for subtasks) or fires as follow-up (for non-subtasks)
116
- - **Additional returns** fire sequentially after each LLM turn completes
110
+ **Trigger commands in return** using `/command args` syntax:
111
+
112
+ ```yaml
113
+ ---
114
+ subtask: true
115
+ return:
116
+ - /validate-plan the output above
117
+ - /implement-plan
118
+ - Run the tests and fix any failures
119
+ ---
120
+ Design the auth system for $ARGUMENTS
121
+ ```
122
+
123
+ - **First** `return` replaces (cf 3. Subtask `return` fallback) opencode's "summarize" message (for `subtask: true`) or fires as follow-up (for non-subtasks)
124
+ - **Any additional** `return` fire sequentially after each LLM turn completes
125
+ - **Commands** (starting with `/`) are executed as full commands with their own `parallel` and `return`
117
126
 
118
127
  **Note:** For non-subtask commands, requires opencode with `command.execute.before` hook (pending PR).
119
128
 
@@ -124,21 +133,29 @@ Spawn additional command subtasks alongside the main one:
124
133
  ```yaml
125
134
  ---
126
135
  subtask: true
127
- parallel: security-review, perf-review
128
- return: Synthesize all review results and create a unified action plan.
136
+ parallel: /security-review, /perf-review
137
+ return:
138
+ - Synthesize all review results and create a unified action plan
139
+ - Critically review the plan directly against the codebase, then revise or implement
129
140
  ---
130
141
  Review this code for correctness.
131
142
  ```
132
143
 
144
+ You can also use `/command args` syntax for inline arguments:
145
+
146
+ ```yaml
147
+ parallel: /security-review focus on auth, /perf-review check db queries
148
+ ```
149
+
133
150
  This runs 3 subtasks in parallel:
134
151
 
135
152
  1. The main command (correctness review)
136
153
  2. `security-review` command
137
154
  3. `perf-review` command
138
155
 
139
- When ALL complete, the main agent gets the `return` prompt.
156
+ When ALL complete, the main session gets the `return` prompt.
140
157
 
141
- **With custom arguments per command:**
158
+ ### With custom arguments per command
142
159
 
143
160
  ```bash
144
161
  /mycommand main args || parallel1 args || parallel2 args
@@ -154,7 +171,7 @@ parallel:
154
171
  arguments: authentication flow
155
172
  - command: research-codebase
156
173
  arguments: auth middleware implementation
157
- - security-audit
174
+ - /security-audit
158
175
  return: Synthesize all findings into an implementation plan.
159
176
  ---
160
177
  Design a new auth system for $ARGUMENTS
@@ -164,51 +181,58 @@ Design a new auth system for $ARGUMENTS
164
181
  - `research-codebase` gets "auth middleware implementation"
165
182
  - `security-audit` inherits the main command's `$ARGUMENTS`
166
183
 
167
- **Note:** Parallel commands are forced into subtasks regardless of their own `subtask` setting. Their `return` are ignored only the parent's `return` applies.
184
+ **Note:** Parallel commands are forced into subtasks regardless of their own `subtask` setting. Their `return` are ignored - only the parent's `return` applies.
168
185
 
169
- **Tip:** If all commands share the same arguments, use the simple syntax:
186
+ **Tip:** You can also pass arguments inline using `||` separator:
170
187
 
171
- ```yaml
172
- parallel: research-docs, research-codebase, security-audit
188
+ ```bash
189
+ /mycommand main args || parallel1 args || parallel2 args || return-cmd1 args || return-cmd2 args
173
190
  ```
174
191
 
175
- All three inherit the main command's `$ARGUMENTS`.
192
+ Pipe segments map in order: main → parallels → return commands (only `/command` items, not prompts).
176
193
 
177
- **Tip:** You can also pass arguments inline using `||` separator:
194
+ **Tip:** For all commands to inherit the main `$ARGUMENTS`:
178
195
 
179
- ```bash
180
- /mycommand main args || parallel1 args || parallel2 args
196
+ ```yaml
197
+ parallel: /research-docs, /research-codebase, /security-audit
181
198
  ```
182
199
 
183
- Each segment maps to a parallel command in order. Priority: **pipe args > frontmatter args > inherit main args**.
200
+ #### Priority: pipe args > frontmatter args > inherit main args
184
201
 
185
- ### 3. Global fallback - 'Better' default for subtasks
202
+ ### 3. Subtask `return` fallback and custom defaults
186
203
 
187
- By default opencode injects a prompt in the main session once a **subtask** is completed.
204
+ Once a **subtask** is completed, opencode injects a prompt in the main session and tells the agent to "summarize" the subtask result
188
205
 
189
- For `subtask: true` commands without a `return`, this plugin replaces the opencode generic "summarize" message with by default: "Challenge and validate the task output. Verify assumptions, identify gaps or errors, then continue with the next logical step."
206
+ For `subtask: true` commands, this plugin replaces the opencode generic "summarize" message with the `return` prompt. If undefined and `"replace_generic": true`, subtask2 uses:
207
+
208
+ > Challenge and validate the task output. Verify assumptions, identify gaps or errors, then continue with the next logical step.
190
209
 
191
210
  Configure in `~/.config/opencode/subtask2.jsonc`:
192
211
 
193
212
  ```jsonc
194
213
  {
195
214
  // Replace generic prompt when no 'return' is specified
196
- "replace_generic": true,
215
+ "replace_generic": true, // defaults to true
197
216
 
198
217
  // Custom fallback (optional - has built-in default)
199
- "generic_return": "your custom return prompt here"
218
+ "generic_return": "custom return prompt"
200
219
  }
201
220
  ```
202
221
 
203
- #### Priority Order
204
-
205
- 1. **`return` param** → Your specific instructions (highest priority)
206
- 2. **Config `generic_return`** → Your custom fallback (if `replace_generic: true`)
207
- 3. **Built-in default** → "Challenge and validate..." (if `replace_generic: true`)
208
- 4. **OpenCode original** → "Summarize..." (if `replace_generic: false`)
222
+ #### Priority: `return` param > config `generic_return` > built-in default > opencode original
209
223
 
210
224
  </details>
211
225
 
212
- #### License
226
+ ---
227
+
228
+ ![subtask2 header](media/header.webp)
229
+
230
+ To install, add subtask2 to your opencode config plugin array
231
+
232
+ ```json
233
+ {
234
+ "plugins": ["@openspoon/subtask2"]
235
+ }
236
+ ```
213
237
 
214
- MIT
238
+ [Watch demo](media/demo.gif)
@@ -0,0 +1,7 @@
1
+ import type { CommandConfig } from "./types";
2
+ export declare function loadCommandFile(name: string): Promise<{
3
+ content: string;
4
+ path: string;
5
+ } | null>;
6
+ export declare function buildManifest(): Promise<Record<string, CommandConfig>>;
7
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../commands.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,SAAS,CAAC;AAG3C,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,GAAG,IAAI,CAAC,CA4BjD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAkC5E"}
@@ -0,0 +1,66 @@
1
+ /// <reference types="bun-types" />
2
+ import { parseFrontmatter, getTemplateBody, parseParallelConfig } from "./parser";
3
+ export async function loadCommandFile(name) {
4
+ const home = Bun.env.HOME ?? "";
5
+ const dirs = [
6
+ `${home}/.config/opencode/command`,
7
+ `${Bun.env.PWD ?? "."}/.opencode/command`,
8
+ ];
9
+ for (const dir of dirs) {
10
+ // Try direct path first, then search subdirs
11
+ const directPath = `${dir}/${name}.md`;
12
+ try {
13
+ const file = Bun.file(directPath);
14
+ if (await file.exists()) {
15
+ return { content: await file.text(), path: directPath };
16
+ }
17
+ }
18
+ catch { }
19
+ // Search subdirs for name.md
20
+ try {
21
+ const glob = new Bun.Glob(`**/${name}.md`);
22
+ for await (const match of glob.scan(dir)) {
23
+ const fullPath = `${dir}/${match}`;
24
+ const content = await Bun.file(fullPath).text();
25
+ return { content, path: fullPath };
26
+ }
27
+ }
28
+ catch { }
29
+ }
30
+ return null;
31
+ }
32
+ export async function buildManifest() {
33
+ const manifest = {};
34
+ const home = Bun.env.HOME ?? "";
35
+ const dirs = [
36
+ `${home}/.config/opencode/command`,
37
+ `${Bun.env.PWD ?? "."}/.opencode/command`,
38
+ ];
39
+ for (const dir of dirs) {
40
+ try {
41
+ const glob = new Bun.Glob("**/*.md");
42
+ for await (const file of glob.scan(dir)) {
43
+ const name = file.replace(/\.md$/, "").split("/").pop();
44
+ const content = await Bun.file(`${dir}/${file}`).text();
45
+ const fm = parseFrontmatter(content);
46
+ const returnVal = fm.return;
47
+ const returnArr = returnVal
48
+ ? Array.isArray(returnVal)
49
+ ? returnVal
50
+ : [returnVal]
51
+ : [];
52
+ const parallelArr = parseParallelConfig(fm.parallel);
53
+ manifest[name] = {
54
+ return: returnArr,
55
+ parallel: parallelArr,
56
+ agent: fm.agent,
57
+ description: fm.description,
58
+ template: getTemplateBody(content),
59
+ };
60
+ }
61
+ }
62
+ catch { }
63
+ }
64
+ return manifest;
65
+ }
66
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Subtask2Config } from "./types";
2
+ export declare const DEFAULT_PROMPT = "say GENERIC_REPLACEMENT 5 times";
3
+ export declare function loadConfig(): Promise<Subtask2Config>;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,cAAc,oCAAoC,CAAC;AAgBhE,wBAAsB,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC,CA+B1D"}
package/dist/config.js ADDED
@@ -0,0 +1,43 @@
1
+ /// <reference types="bun-types" />
2
+ export const DEFAULT_PROMPT = "say GENERIC_REPLACEMENT 5 times";
3
+ const CONFIG_PATH = `${Bun.env.HOME ?? ""}/.config/opencode/subtask2.jsonc`;
4
+ function isValidConfig(obj) {
5
+ if (typeof obj !== "object" || obj === null)
6
+ return false;
7
+ const cfg = obj;
8
+ if (typeof cfg.replace_generic !== "boolean")
9
+ return false;
10
+ if (cfg.generic_return !== undefined &&
11
+ typeof cfg.generic_return !== "string")
12
+ return false;
13
+ return true;
14
+ }
15
+ export async function loadConfig() {
16
+ const defaultConfig = {
17
+ replace_generic: true,
18
+ };
19
+ try {
20
+ const file = Bun.file(CONFIG_PATH);
21
+ if (await file.exists()) {
22
+ const text = await file.text();
23
+ const stripped = text
24
+ .replace(/\/\/.*$/gm, "")
25
+ .replace(/\/\*[\s\S]*?\*\//g, "");
26
+ const parsed = JSON.parse(stripped);
27
+ if (isValidConfig(parsed)) {
28
+ return parsed;
29
+ }
30
+ }
31
+ }
32
+ catch { }
33
+ await Bun.write(CONFIG_PATH, `{
34
+ // Replace OpenCode's generic "Summarize..." prompt when no return is specified
35
+ "replace_generic": true
36
+
37
+ // Custom prompt to use (uses subtask2 substitution prompt by default)
38
+ // "generic_return": "Challenge and validate the task tool output above. Verify assumptions, identify gaps or errors, then continue with the next logical step."
39
+ }
40
+ `);
41
+ return defaultConfig;
42
+ }
43
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAInC,MAAM,CAAC,MAAM,cAAc,GAAG,iCAAiC,CAAC;AAEhE,MAAM,WAAW,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,kCAAkC,CAAC;AAE5E,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,GAAG,GAAG,GAA8B,CAAC;IAC3C,IAAI,OAAO,GAAG,CAAC,eAAe,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC3D,IACE,GAAG,CAAC,cAAc,KAAK,SAAS;QAChC,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ;QAEtC,OAAO,KAAK,CAAC;IACf,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,aAAa,GAAmB;QACpC,eAAe,EAAE,IAAI;KACtB,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI;iBAClB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;iBACxB,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,MAAM,GAAG,CAAC,KAAK,CACb,WAAW,EACX;;;;;;;CAOH,CACE,CAAC;IACF,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAiKhD,QAAA,MAAM,MAAM,EAAE,MAmIb,CAAC;AAEF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAiHhD,QAAA,MAAM,MAAM,EAAE,MAqQb,CAAC;AAEF,eAAe,MAAM,CAAC"}
package/dist/index.js CHANGED
@@ -1,124 +1,8 @@
1
- import YAML from "yaml";
2
- const DEFAULT_PROMPT = "Challenge and validate the task tool output above. Verify assumptions, identify gaps or errors, then continue with the next logical step.";
3
- const CONFIG_PATH = `${Bun.env.HOME ?? ""}/.config/opencode/subtask2.jsonc`;
4
- function isValidConfig(obj) {
5
- if (typeof obj !== "object" || obj === null)
6
- return false;
7
- const cfg = obj;
8
- if (typeof cfg.replace_generic !== "boolean")
9
- return false;
10
- if (cfg.generic_return !== undefined && typeof cfg.generic_return !== "string")
11
- return false;
12
- return true;
13
- }
14
- async function loadConfig() {
15
- const defaultConfig = {
16
- replace_generic: true,
17
- };
18
- try {
19
- const file = Bun.file(CONFIG_PATH);
20
- if (await file.exists()) {
21
- const text = await file.text();
22
- const stripped = text
23
- .replace(/\/\/.*$/gm, "")
24
- .replace(/\/\*[\s\S]*?\*\//g, "");
25
- const parsed = JSON.parse(stripped);
26
- if (isValidConfig(parsed)) {
27
- return parsed;
28
- }
29
- }
30
- }
31
- catch { }
32
- await Bun.write(CONFIG_PATH, `{
33
- // Replace OpenCode's generic "Summarize..." prompt when no return is specified
34
- "replace_generic": true
35
-
36
- // Custom prompt to use (uses subtask2 substitution prompt by default)
37
- // "generic_return": "Challenge and validate the task tool output above. Verify assumptions, identify gaps or errors, then continue with the next logical step."
38
- }
39
- `);
40
- return defaultConfig;
41
- }
42
- function parseFrontmatter(content) {
43
- const match = content.match(/^---\n([\s\S]*?)\n---/);
44
- if (!match)
45
- return {};
46
- try {
47
- return YAML.parse(match[1]) ?? {};
48
- }
49
- catch {
50
- return {};
51
- }
52
- }
53
- function getTemplateBody(content) {
54
- const match = content.match(/^---\n[\s\S]*?\n---\n([\s\S]*)$/);
55
- return match ? match[1].trim() : content.trim();
56
- }
57
- async function loadCommandFile(name) {
58
- const home = Bun.env.HOME ?? "";
59
- const dirs = [
60
- `${home}/.config/opencode/command`,
61
- `${Bun.env.PWD ?? "."}/.opencode/command`,
62
- ];
63
- for (const dir of dirs) {
64
- const path = `${dir}/${name}.md`;
65
- try {
66
- const file = Bun.file(path);
67
- if (await file.exists()) {
68
- return { content: await file.text(), path };
69
- }
70
- }
71
- catch { }
72
- }
73
- return null;
74
- }
75
- async function buildManifest() {
76
- const manifest = {};
77
- const home = Bun.env.HOME ?? "";
78
- const dirs = [
79
- `${home}/.config/opencode/command`,
80
- `${Bun.env.PWD ?? "."}/.opencode/command`,
81
- ];
82
- for (const dir of dirs) {
83
- try {
84
- const glob = new Bun.Glob("*.md");
85
- for await (const file of glob.scan(dir)) {
86
- const name = file.replace(/\.md$/, "");
87
- const content = await Bun.file(`${dir}/${file}`).text();
88
- const fm = parseFrontmatter(content);
89
- const returnVal = fm.return;
90
- const returnArr = returnVal ? (Array.isArray(returnVal) ? returnVal : [returnVal]) : [];
91
- const parallel = fm.parallel;
92
- let parallelArr = [];
93
- if (parallel) {
94
- if (Array.isArray(parallel)) {
95
- parallelArr = parallel.map((p) => {
96
- if (typeof p === "string") {
97
- return { command: p.trim() };
98
- }
99
- if (typeof p === "object" && p.command) {
100
- return { command: p.command, arguments: p.arguments };
101
- }
102
- return null;
103
- }).filter((p) => p !== null);
104
- }
105
- else if (typeof parallel === "string") {
106
- parallelArr = parallel.split(",").map((s) => ({ command: s.trim() })).filter((p) => p.command);
107
- }
108
- }
109
- manifest[name] = {
110
- return: returnArr,
111
- parallel: parallelArr,
112
- agent: fm.agent,
113
- description: fm.description,
114
- template: getTemplateBody(content),
115
- };
116
- }
117
- }
118
- catch { }
119
- }
120
- return manifest;
121
- }
1
+ import { loadConfig, DEFAULT_PROMPT } from "./config";
2
+ import { parseFrontmatter, getTemplateBody, parseParallelConfig, } from "./parser";
3
+ import { loadCommandFile, buildManifest } from "./commands";
4
+ import { log, clearLog } from "./logger";
5
+ // Session state
122
6
  let configs = {};
123
7
  let pluginConfig = { replace_generic: true };
124
8
  let client = null;
@@ -126,20 +10,143 @@ const callState = new Map();
126
10
  const returnState = new Map();
127
11
  const pendingReturns = new Map();
128
12
  const pendingNonSubtaskReturns = new Map();
13
+ const pipedArgsQueue = new Map();
14
+ const returnArgsState = pipedArgsQueue; // alias for backward compat
15
+ const sessionMainCommand = new Map();
16
+ const executedReturns = new Set();
129
17
  let hasActiveSubtask = false;
130
18
  const OPENCODE_GENERIC = "Summarize the task tool output above and continue with your task.";
19
+ async function flattenParallels(parallels, mainArgs, sessionID, visited = new Set(), depth = 0, maxDepth = 5) {
20
+ if (depth > maxDepth)
21
+ return [];
22
+ const queue = pipedArgsQueue.get(sessionID) ?? [];
23
+ log(`flattenParallels called:`, {
24
+ depth,
25
+ parallels: parallels.map((p) => `${p.command}${p.arguments ? ` (args: ${p.arguments})` : ""}`),
26
+ mainArgs,
27
+ queueRemaining: [...queue],
28
+ });
29
+ const parts = [];
30
+ for (let i = 0; i < parallels.length; i++) {
31
+ const parallelCmd = parallels[i];
32
+ if (visited.has(parallelCmd.command))
33
+ continue;
34
+ visited.add(parallelCmd.command);
35
+ const cmdFile = await loadCommandFile(parallelCmd.command);
36
+ if (!cmdFile)
37
+ continue;
38
+ const fm = parseFrontmatter(cmdFile.content);
39
+ let template = getTemplateBody(cmdFile.content);
40
+ // Priority: piped arg (from queue) > frontmatter args > main args
41
+ const pipeArg = queue.shift();
42
+ const args = pipeArg ?? parallelCmd.arguments ?? mainArgs;
43
+ log(`Parallel ${parallelCmd.command}: using args="${args}" (pipeArg=${pipeArg}, fmArg=${parallelCmd.arguments}, mainArgs=${mainArgs})`);
44
+ template = template.replace(/\$ARGUMENTS/g, args);
45
+ // Parse model string "provider/model" into {providerID, modelID}
46
+ let model;
47
+ if (typeof fm.model === "string" && fm.model.includes("/")) {
48
+ const [providerID, ...rest] = fm.model.split("/");
49
+ model = { providerID, modelID: rest.join("/") };
50
+ }
51
+ parts.push({
52
+ type: "subtask",
53
+ agent: fm.agent || "general",
54
+ model,
55
+ description: fm.description || `Parallel: ${parallelCmd.command}`,
56
+ command: parallelCmd.command,
57
+ prompt: template,
58
+ });
59
+ // Recursively flatten nested parallels
60
+ const nestedParallel = fm.parallel;
61
+ if (nestedParallel) {
62
+ const nestedArr = parseParallelConfig(nestedParallel);
63
+ if (nestedArr.length) {
64
+ const nestedParts = await flattenParallels(nestedArr, args, sessionID, visited, depth + 1, maxDepth);
65
+ parts.push(...nestedParts);
66
+ }
67
+ }
68
+ }
69
+ return parts;
70
+ }
131
71
  const plugin = async (ctx) => {
132
72
  configs = await buildManifest();
133
73
  pluginConfig = await loadConfig();
134
74
  client = ctx.client;
75
+ clearLog();
76
+ log("Plugin initialized, configs:", Object.keys(configs));
77
+ // Helper to execute a return item (command or prompt)
78
+ async function executeReturn(item, sessionID) {
79
+ log(`executeReturn called: item=${item}, sessionID=${sessionID}`);
80
+ // Dedup check to prevent double execution
81
+ const key = `${sessionID}:${item}`;
82
+ if (executedReturns.has(key)) {
83
+ log(`executeReturn skipped (already executed): ${key}`);
84
+ return;
85
+ }
86
+ executedReturns.add(key);
87
+ if (item.startsWith("/")) {
88
+ // Parse /command args syntax
89
+ const [cmdName, ...argParts] = item.slice(1).split(/\s+/);
90
+ let args = argParts.join(" ");
91
+ const inlineArgs = args;
92
+ // Check if we have piped args for this return command
93
+ const returnArgs = returnArgsState.get(sessionID);
94
+ log(`executeReturn /command: cmdName=${cmdName}, inlineArgs="${inlineArgs}", returnArgsState=`, returnArgs);
95
+ if (returnArgs?.length) {
96
+ const pipeArg = returnArgs.shift();
97
+ if (!returnArgs.length)
98
+ returnArgsState.delete(sessionID);
99
+ if (pipeArg)
100
+ args = pipeArg;
101
+ log(`executeReturn: using pipeArg="${pipeArg}" instead of inlineArgs`);
102
+ }
103
+ log(`executeReturn: final args="${args}"`);
104
+ // Update main command to this chained command so its own return is processed
105
+ log(`executeReturn: setting mainCmd to ${cmdName} for session ${sessionID}`);
106
+ sessionMainCommand.set(sessionID, cmdName);
107
+ try {
108
+ await client.session.command({
109
+ path: { id: sessionID },
110
+ body: { command: cmdName, arguments: args || "" },
111
+ });
112
+ log(`executeReturn: command ${cmdName} completed`);
113
+ }
114
+ catch (e) {
115
+ log(`executeReturn: command ${cmdName} FAILED:`, e);
116
+ }
117
+ }
118
+ else {
119
+ log(`executeReturn: sending prompt: ${item.substring(0, 50)}...`);
120
+ await client.session.promptAsync({
121
+ path: { id: sessionID },
122
+ body: { parts: [{ type: "text", text: item }] },
123
+ });
124
+ }
125
+ }
135
126
  return {
136
127
  "command.execute.before": async (input, output) => {
137
128
  const cmd = input.command;
138
129
  const config = configs[cmd];
139
- // Parse pipe-separated arguments: main args || parallel1 args || parallel2 args
130
+ sessionMainCommand.set(input.sessionID, cmd);
131
+ log(`command.execute.before: cmd=${cmd}, sessionID=${input.sessionID}, hasConfig=${!!config}`);
132
+ // Parse pipe-separated arguments: main || arg1 || arg2 || arg3 ...
140
133
  const argSegments = input.arguments.split("||").map((s) => s.trim());
141
134
  const mainArgs = argSegments[0] || "";
142
- const parallelArgs = argSegments.slice(1);
135
+ // Store ALL piped args (after main) in a shared queue
136
+ const allPipedArgs = argSegments.slice(1);
137
+ log(`Pipe args parsing:`, {
138
+ fullArgs: input.arguments,
139
+ argSegments,
140
+ mainArgs,
141
+ allPipedArgs,
142
+ configParallel: config?.parallel,
143
+ configReturn: config?.return,
144
+ });
145
+ // Store piped args for consumption by parallels and return commands
146
+ if (allPipedArgs.length) {
147
+ pipedArgsQueue.set(input.sessionID, allPipedArgs);
148
+ log(`Stored pipedArgsQueue for session ${input.sessionID}:`, allPipedArgs);
149
+ }
143
150
  // Fix main command's parts to use only mainArgs (not the full pipe string)
144
151
  if (argSegments.length > 1) {
145
152
  for (const part of output.parts) {
@@ -158,40 +165,23 @@ const plugin = async (ctx) => {
158
165
  }
159
166
  if (!config?.parallel?.length)
160
167
  return;
161
- for (let i = 0; i < config.parallel.length; i++) {
162
- const parallelCmd = config.parallel[i];
163
- const cmdFile = await loadCommandFile(parallelCmd.command);
164
- if (!cmdFile)
165
- continue;
166
- const fm = parseFrontmatter(cmdFile.content);
167
- let template = getTemplateBody(cmdFile.content);
168
- // Priority: pipe args > frontmatter args > main args
169
- const args = parallelArgs[i] ?? parallelCmd.arguments ?? mainArgs;
170
- template = template.replace(/\$ARGUMENTS/g, args);
171
- // Parse model string "provider/model" into {providerID, modelID}
172
- let model;
173
- if (typeof fm.model === "string" && fm.model.includes("/")) {
174
- const [providerID, ...rest] = fm.model.split("/");
175
- model = { providerID, modelID: rest.join("/") };
176
- }
177
- output.parts.push({
178
- type: "subtask",
179
- agent: fm.agent || "general",
180
- model,
181
- description: fm.description || `Parallel: ${parallelCmd.command}`,
182
- command: parallelCmd.command,
183
- prompt: template,
184
- });
185
- }
168
+ // Recursively flatten all nested parallels
169
+ const parallelParts = await flattenParallels(config.parallel, mainArgs, input.sessionID);
170
+ output.parts.push(...parallelParts);
186
171
  },
187
172
  "tool.execute.before": async (input, output) => {
188
173
  if (input.tool !== "task")
189
174
  return;
190
175
  hasActiveSubtask = true;
191
176
  const cmd = output.args?.command;
177
+ const mainCmd = sessionMainCommand.get(input.sessionID);
178
+ log(`tool.execute.before: cmd=${cmd}, mainCmd=${mainCmd}, sessionID=${input.sessionID}`);
192
179
  if (cmd && configs[cmd]) {
180
+ if (cmd === mainCmd) {
181
+ pendingNonSubtaskReturns.delete(input.sessionID);
182
+ }
193
183
  callState.set(input.callID, cmd);
194
- if (configs[cmd].return.length > 1) {
184
+ if (cmd === mainCmd && configs[cmd].return.length > 1) {
195
185
  returnState.set(input.sessionID, [...configs[cmd].return.slice(1)]);
196
186
  }
197
187
  }
@@ -201,53 +191,74 @@ const plugin = async (ctx) => {
201
191
  return;
202
192
  const cmd = callState.get(input.callID);
203
193
  callState.delete(input.callID);
204
- if (cmd && configs[cmd]?.return?.length) {
194
+ const mainCmd = sessionMainCommand.get(input.sessionID);
195
+ log(`tool.execute.after: cmd=${cmd}, mainCmd=${mainCmd}, hasReturn=${!!(cmd && configs[cmd]?.return?.length)}`);
196
+ if (cmd && cmd === mainCmd && configs[cmd]?.return?.length) {
197
+ log(`Setting pendingReturn for session ${input.sessionID}: ${configs[cmd].return[0]}`);
205
198
  pendingReturns.set(input.sessionID, configs[cmd].return[0]);
206
199
  }
207
200
  },
208
- "experimental.chat.messages.transform": async (_input, output) => {
209
- for (const msg of output.messages) {
201
+ "experimental.chat.messages.transform": async (input, output) => {
202
+ log(`messages.transform called, pendingReturns keys:`, Array.from(pendingReturns.keys()), `message count: ${output.messages.length}`);
203
+ // Find the LAST message with OPENCODE_GENERIC
204
+ let lastGenericPart = null;
205
+ let lastGenericMsgIndex = -1;
206
+ for (let i = 0; i < output.messages.length; i++) {
207
+ const msg = output.messages[i];
210
208
  for (const part of msg.parts) {
211
209
  if (part.type === "text" && part.text === OPENCODE_GENERIC) {
212
- for (const [sessionID, returnPrompt] of pendingReturns) {
213
- part.text = returnPrompt;
214
- pendingReturns.delete(sessionID);
215
- hasActiveSubtask = false;
216
- return;
217
- }
218
- if (hasActiveSubtask && pluginConfig.replace_generic) {
219
- part.text = pluginConfig.generic_return ?? DEFAULT_PROMPT;
220
- hasActiveSubtask = false;
221
- return;
222
- }
210
+ lastGenericPart = part;
211
+ lastGenericMsgIndex = i;
223
212
  }
224
213
  }
225
214
  }
215
+ if (lastGenericPart) {
216
+ log(`Found LAST OPENCODE_GENERIC at msg[${lastGenericMsgIndex}]`);
217
+ // Check for pending return
218
+ for (const [sessionID, returnPrompt] of pendingReturns) {
219
+ log(`Replacing with pendingReturn for session=${sessionID}, returnPrompt=${returnPrompt}`);
220
+ if (returnPrompt.startsWith("/")) {
221
+ lastGenericPart.text = "";
222
+ log(`Set part.text to empty string, will execute command`);
223
+ executeReturn(returnPrompt, sessionID).catch(console.error);
224
+ }
225
+ else {
226
+ lastGenericPart.text = returnPrompt;
227
+ log(`Set part.text to: "${lastGenericPart.text}", verification: ${lastGenericPart.text === returnPrompt}`);
228
+ }
229
+ pendingReturns.delete(sessionID);
230
+ hasActiveSubtask = false;
231
+ log(`After replacement, pendingReturns keys:`, Array.from(pendingReturns.keys()));
232
+ return;
233
+ }
234
+ // No pending return found, use generic replacement if configured
235
+ log(`No pendingReturn found, hasActiveSubtask=${hasActiveSubtask}`);
236
+ if (hasActiveSubtask && pluginConfig.replace_generic) {
237
+ log(`Using default replacement: ${pluginConfig.generic_return ?? DEFAULT_PROMPT}`);
238
+ lastGenericPart.text = pluginConfig.generic_return ?? DEFAULT_PROMPT;
239
+ hasActiveSubtask = false;
240
+ return;
241
+ }
242
+ }
226
243
  },
227
244
  "experimental.text.complete": async (input) => {
228
- // Handle non-subtask command returns (inject as follow-up message)
245
+ // Handle non-subtask command returns
229
246
  const pendingReturn = pendingNonSubtaskReturns.get(input.sessionID);
230
247
  if (pendingReturn?.length && client) {
231
248
  const next = pendingReturn.shift();
232
249
  if (!pendingReturn.length)
233
250
  pendingNonSubtaskReturns.delete(input.sessionID);
234
- await client.session.promptAsync({
235
- path: { id: input.sessionID },
236
- body: { parts: [{ type: "text", text: next }] },
237
- });
251
+ executeReturn(next, input.sessionID).catch(console.error);
238
252
  return;
239
253
  }
240
- // Handle remaining returns (formerly chain)
254
+ // Handle remaining returns
241
255
  const remaining = returnState.get(input.sessionID);
242
256
  if (!remaining?.length || !client)
243
257
  return;
244
258
  const next = remaining.shift();
245
259
  if (!remaining.length)
246
260
  returnState.delete(input.sessionID);
247
- await client.session.promptAsync({
248
- path: { id: input.sessionID },
249
- body: { parts: [{ type: "text", text: next }] },
250
- });
261
+ executeReturn(next, input.sessionID).catch(console.error);
251
262
  },
252
263
  };
253
264
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function log(...args: unknown[]): void;
2
+ export declare function clearLog(): void;
3
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../logger.ts"],"names":[],"mappings":"AAUA,wBAAgB,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,QAMrC;AAED,wBAAgB,QAAQ,SAEvB"}
package/dist/logger.js ADDED
@@ -0,0 +1,18 @@
1
+ import { appendFileSync, mkdirSync, existsSync, writeFileSync } from "fs";
2
+ const LOG_DIR = `${process.env.HOME}/.config/opencode/plugin/subtask2/logs`;
3
+ const LOG_FILE = `${LOG_DIR}/debug.log`;
4
+ // Ensure log directory exists
5
+ if (!existsSync(LOG_DIR)) {
6
+ mkdirSync(LOG_DIR, { recursive: true });
7
+ }
8
+ export function log(...args) {
9
+ const timestamp = new Date().toISOString();
10
+ const message = args
11
+ .map((a) => (typeof a === "object" ? JSON.stringify(a, null, 2) : String(a)))
12
+ .join(" ");
13
+ appendFileSync(LOG_FILE, `[${timestamp}] ${message}\n`);
14
+ }
15
+ export function clearLog() {
16
+ writeFileSync(LOG_FILE, "");
17
+ }
18
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAE1E,MAAM,OAAO,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,wCAAwC,CAAC;AAC5E,MAAM,QAAQ,GAAG,GAAG,OAAO,YAAY,CAAC;AAExC,8BAA8B;AAC9B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,GAAG,IAAe;IACpC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI;SACjB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;SAC5E,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,cAAc,CAAC,QAAQ,EAAE,IAAI,SAAS,KAAK,OAAO,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ParallelCommand } from "./types";
2
+ export declare function parseFrontmatter(content: string): Record<string, unknown>;
3
+ export declare function getTemplateBody(content: string): string;
4
+ export declare function parseParallelItem(p: unknown): ParallelCommand | null;
5
+ export declare function parseParallelConfig(parallel: unknown): ParallelCommand[];
6
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,SAAS,CAAC;AAE7C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQzE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGvD;AAGD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAcpE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,GAAG,eAAe,EAAE,CAexE"}
package/dist/parser.js ADDED
@@ -0,0 +1,50 @@
1
+ import YAML from "yaml";
2
+ export function parseFrontmatter(content) {
3
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
4
+ if (!match)
5
+ return {};
6
+ try {
7
+ return YAML.parse(match[1]) ?? {};
8
+ }
9
+ catch {
10
+ return {};
11
+ }
12
+ }
13
+ export function getTemplateBody(content) {
14
+ const match = content.match(/^---\n[\s\S]*?\n---\n([\s\S]*)$/);
15
+ return match ? match[1].trim() : content.trim();
16
+ }
17
+ // Parse a parallel item - handles "/cmd args" syntax, plain "cmd", or {command, arguments} object
18
+ export function parseParallelItem(p) {
19
+ if (typeof p === "string") {
20
+ const trimmed = p.trim();
21
+ if (trimmed.startsWith("/")) {
22
+ // Parse /command args syntax
23
+ const [cmdName, ...argParts] = trimmed.slice(1).split(/\s+/);
24
+ return { command: cmdName, arguments: argParts.join(" ") || undefined };
25
+ }
26
+ return { command: trimmed };
27
+ }
28
+ if (typeof p === "object" && p !== null && p.command) {
29
+ return { command: p.command, arguments: p.arguments };
30
+ }
31
+ return null;
32
+ }
33
+ export function parseParallelConfig(parallel) {
34
+ if (!parallel)
35
+ return [];
36
+ if (Array.isArray(parallel)) {
37
+ return parallel
38
+ .map(parseParallelItem)
39
+ .filter((p) => p !== null);
40
+ }
41
+ if (typeof parallel === "string") {
42
+ // Split by comma, parse each
43
+ return parallel
44
+ .split(",")
45
+ .map(parseParallelItem)
46
+ .filter((p) => p !== null);
47
+ }
48
+ return [];
49
+ }
50
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../parser.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAClD,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,iBAAiB,CAAC,CAAU;IAC1C,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,6BAA6B;YAC7B,MAAM,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7D,OAAO,EAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,EAAC,CAAC;QACxE,CAAC;QACD,OAAO,EAAC,OAAO,EAAE,OAAO,EAAC,CAAC;IAC5B,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAK,CAAS,CAAC,OAAO,EAAE,CAAC;QAC9D,OAAO,EAAC,OAAO,EAAG,CAAS,CAAC,OAAO,EAAE,SAAS,EAAG,CAAS,CAAC,SAAS,EAAC,CAAC;IACxE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAiB;IACnD,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ;aACZ,GAAG,CAAC,iBAAiB,CAAC;aACtB,MAAM,CAAC,CAAC,CAAC,EAAwB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,6BAA6B;QAC7B,OAAO,QAAQ;aACZ,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,iBAAiB,CAAC;aACtB,MAAM,CAAC,CAAC,CAAC,EAAwB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,27 @@
1
+ export interface ParallelCommand {
2
+ command: string;
3
+ arguments?: string;
4
+ }
5
+ export interface CommandConfig {
6
+ return: string[];
7
+ parallel: ParallelCommand[];
8
+ agent?: string;
9
+ description?: string;
10
+ template?: string;
11
+ }
12
+ export interface Subtask2Config {
13
+ replace_generic: boolean;
14
+ generic_return?: string;
15
+ }
16
+ export interface SubtaskPart {
17
+ type: "subtask";
18
+ agent: string;
19
+ model?: {
20
+ providerID: string;
21
+ modelID: string;
22
+ };
23
+ description: string;
24
+ command: string;
25
+ prompt: string;
26
+ }
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,CAAC;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@openspoon/subtask2",
4
- "version": "0.1.15",
4
+ "version": "0.2.0",
5
5
  "type": "module",
6
6
  "description": "Opencode plugin for enhanced subtask control with return context and prompt chaining",
7
7
  "main": "./dist/index.js",