@tudeorangbiasa/sdd-multiagent-opencode 0.1.0 → 0.1.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.
- package/.opencode/agents/sdd-orchestrator.md +2 -2
- package/.opencode/agents/sdd-planner.md +1 -1
- package/.opencode/commands/execute-parallel.md +1 -1
- package/.opencode/plugins/sdd-model-router.js +41 -0
- package/.sdd/templates/model-profile-template.json +12 -0
- package/README.md +31 -8
- package/bin/sdd-opencode.js +40 -8
- package/opencode.json +4 -2
- package/package.json +2 -2
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: sdd-orchestrator
|
|
3
3
|
description: Parallel task coordination and DAG-based execution for SDD workflows. Use for /execute-parallel, --until-finish automation, and coordinating multiple subagents across complex projects.
|
|
4
4
|
mode: subagent
|
|
5
|
-
model: opencode/
|
|
5
|
+
model: opencode/minimax-m2.5-free
|
|
6
6
|
temperature: 0.3
|
|
7
7
|
permission:
|
|
8
8
|
edit: allow
|
|
@@ -63,7 +63,7 @@ Map tasks to subagents and spawn them in parallel:
|
|
|
63
63
|
| Phase | Subagent | Model |
|
|
64
64
|
|-------|----------|-------|
|
|
65
65
|
| research | sdd-explorer | opencode/deepseek-v4-flash-free |
|
|
66
|
-
| specify/plan/tasks | sdd-planner | opencode/
|
|
66
|
+
| specify/plan/tasks | sdd-planner | opencode/qwen3.6-plus-free |
|
|
67
67
|
| implement | sdd-implementer | opencode/deepseek-v4-flash-free |
|
|
68
68
|
| review | sdd-reviewer | opencode/minimax-m2.5-free |
|
|
69
69
|
| verify | sdd-verifier | opencode/qwen3.6-plus-free |
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: sdd-planner
|
|
3
3
|
description: Architecture design and technical planning for SDD workflows. Use when generating plans from specifications, designing system architecture, or breaking down features into tasks.
|
|
4
4
|
mode: subagent
|
|
5
|
-
model: opencode/
|
|
5
|
+
model: opencode/qwen3.6-plus-free
|
|
6
6
|
temperature: 0.3
|
|
7
7
|
permission:
|
|
8
8
|
edit: allow
|
|
@@ -67,7 +67,7 @@ Group tasks based on: Dependency satisfaction, **File conflict detection** (chec
|
|
|
67
67
|
| Task Phase | Subagent | Model |
|
|
68
68
|
|------------|----------|-------|
|
|
69
69
|
| research | sdd-explorer | opencode/deepseek-v4-flash-free |
|
|
70
|
-
| brief/specify/plan/tasks | sdd-planner | opencode/
|
|
70
|
+
| brief/specify/plan/tasks | sdd-planner | opencode/qwen3.6-plus-free |
|
|
71
71
|
| implement | sdd-implementer | opencode/deepseek-v4-flash-free |
|
|
72
72
|
| review | sdd-reviewer | opencode/minimax-m2.5-free |
|
|
73
73
|
| verify | sdd-verifier | opencode/qwen3.6-plus-free |
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
|
|
4
|
+
export default async () => {
|
|
5
|
+
return {
|
|
6
|
+
config: (cfg) => {
|
|
7
|
+
const profilePath = path.join(process.cwd(), ".sdd", "model-profile.json");
|
|
8
|
+
|
|
9
|
+
if (!fs.existsSync(profilePath)) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let profile;
|
|
14
|
+
try {
|
|
15
|
+
profile = JSON.parse(fs.readFileSync(profilePath, "utf-8"));
|
|
16
|
+
} catch {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (profile.defaultPrimary) {
|
|
21
|
+
cfg.model = profile.defaultPrimary;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (profile.small) {
|
|
25
|
+
cfg.small_model = profile.small;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (!cfg.agent) {
|
|
29
|
+
cfg.agent = {};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
for (const [agentName, model] of Object.entries(profile.agents ?? {})) {
|
|
33
|
+
if (!cfg.agent[agentName]) {
|
|
34
|
+
cfg.agent[agentName] = {};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
cfg.agent[agentName].model = model;
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"defaultPrimary": "opencode/minimax-m2.5-free",
|
|
3
|
+
"small": "opencode/deepseek-v4-flash-free",
|
|
4
|
+
"agents": {
|
|
5
|
+
"sdd-orchestrator": "opencode/minimax-m2.5-free",
|
|
6
|
+
"sdd-planner": "opencode/qwen3.6-plus-free",
|
|
7
|
+
"sdd-explorer": "opencode/deepseek-v4-flash-free",
|
|
8
|
+
"sdd-implementer": "opencode/deepseek-v4-flash-free",
|
|
9
|
+
"sdd-verifier": "opencode/qwen3.6-plus-free",
|
|
10
|
+
"sdd-reviewer": "opencode/minimax-m2.5-free"
|
|
11
|
+
}
|
|
12
|
+
}
|
package/README.md
CHANGED
|
@@ -32,8 +32,8 @@ external UI skills # impeccable, taste, nothing-design, etc.
|
|
|
32
32
|
|
|
33
33
|
| Agent | Model | Role |
|
|
34
34
|
|-------|-------|------|
|
|
35
|
-
| **sdd-orchestrator** | `opencode/
|
|
36
|
-
| **sdd-planner** | `opencode/
|
|
35
|
+
| **sdd-orchestrator** | `opencode/minimax-m2.5-free` | DAG scheduling, conflict detection, deadlock handling |
|
|
36
|
+
| **sdd-planner** | `opencode/qwen3.6-plus-free` | Architecture design, technical planning |
|
|
37
37
|
| **sdd-explorer** | `opencode/deepseek-v4-flash-free` | Codebase discovery (readonly) |
|
|
38
38
|
| **sdd-implementer** | `opencode/deepseek-v4-flash-free` | Code generation (high token usage) |
|
|
39
39
|
| **sdd-verifier** | `opencode/qwen3.6-plus-free` | Completeness check + visual/UI verification (Chrome DevTools) |
|
|
@@ -45,7 +45,7 @@ external UI skills # impeccable, taste, nothing-design, etc.
|
|
|
45
45
|
|
|
46
46
|
```bash
|
|
47
47
|
cd your-project
|
|
48
|
-
npx sdd-multiagent-opencode init
|
|
48
|
+
npx -y -p @tudeorangbiasa/sdd-multiagent-opencode sdd-opencode init
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
This installs both:
|
|
@@ -54,13 +54,36 @@ This installs both:
|
|
|
54
54
|
|
|
55
55
|
**Flags:**
|
|
56
56
|
```bash
|
|
57
|
-
npx sdd-multiagent-opencode init
|
|
58
|
-
npx sdd-multiagent-opencode init --sdd-only
|
|
59
|
-
npx sdd-multiagent-opencode init --rules-only
|
|
60
|
-
npx sdd-multiagent-opencode init --force
|
|
61
|
-
npx sdd-multiagent-opencode init --dry-run
|
|
57
|
+
npx -y -p @tudeorangbiasa/sdd-multiagent-opencode sdd-opencode init # Install everything
|
|
58
|
+
npx -y -p @tudeorangbiasa/sdd-multiagent-opencode sdd-opencode init --sdd-only # SDD workflow only
|
|
59
|
+
npx -y -p @tudeorangbiasa/sdd-multiagent-opencode sdd-opencode init --rules-only # Base rules only
|
|
60
|
+
npx -y -p @tudeorangbiasa/sdd-multiagent-opencode sdd-opencode init --force # Overwrite existing
|
|
61
|
+
npx -y -p @tudeorangbiasa/sdd-multiagent-opencode sdd-opencode init --dry-run # Preview only
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
+
### Model Settings
|
|
65
|
+
|
|
66
|
+
The installer creates `.sdd/model-profile.json`. Edit this file to change which model each OpenCode agent uses.
|
|
67
|
+
|
|
68
|
+
Default profile avoids paid GPT models:
|
|
69
|
+
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"defaultPrimary": "opencode/minimax-m2.5-free",
|
|
73
|
+
"small": "opencode/deepseek-v4-flash-free",
|
|
74
|
+
"agents": {
|
|
75
|
+
"sdd-orchestrator": "opencode/minimax-m2.5-free",
|
|
76
|
+
"sdd-planner": "opencode/qwen3.6-plus-free",
|
|
77
|
+
"sdd-explorer": "opencode/deepseek-v4-flash-free",
|
|
78
|
+
"sdd-implementer": "opencode/deepseek-v4-flash-free",
|
|
79
|
+
"sdd-verifier": "opencode/qwen3.6-plus-free",
|
|
80
|
+
"sdd-reviewer": "opencode/minimax-m2.5-free"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
`.opencode/plugins/sdd-model-router.js` reads this file at OpenCode startup and applies the model settings. Restart OpenCode after editing it.
|
|
86
|
+
|
|
64
87
|
### 1. Install (Manual)
|
|
65
88
|
|
|
66
89
|
#### Option A: Using Commands (Recommended)
|
package/bin/sdd-opencode.js
CHANGED
|
@@ -92,22 +92,27 @@ function copyFileSafe(src, dest, ctx, options = {}) {
|
|
|
92
92
|
|
|
93
93
|
function copyDirFlat(srcDir, destDir, ctx) {
|
|
94
94
|
if (!fs.existsSync(srcDir)) {
|
|
95
|
-
return;
|
|
95
|
+
return 0;
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
ensureDir(destDir);
|
|
99
99
|
|
|
100
|
+
let count = 0;
|
|
100
101
|
const files = fs.readdirSync(srcDir);
|
|
101
102
|
for (const file of files) {
|
|
102
103
|
const srcPath = path.join(srcDir, file);
|
|
103
104
|
const destPath = path.join(destDir, file);
|
|
104
105
|
|
|
105
106
|
if (fs.statSync(srcPath).isDirectory()) {
|
|
106
|
-
copyDirFlat(srcPath, destPath, ctx);
|
|
107
|
+
count += copyDirFlat(srcPath, destPath, ctx);
|
|
107
108
|
} else {
|
|
108
|
-
copyFileSafe(srcPath, destPath, ctx)
|
|
109
|
+
if (copyFileSafe(srcPath, destPath, ctx)) {
|
|
110
|
+
count++;
|
|
111
|
+
}
|
|
109
112
|
}
|
|
110
113
|
}
|
|
114
|
+
|
|
115
|
+
return count;
|
|
111
116
|
}
|
|
112
117
|
|
|
113
118
|
function copyOpencodeDir(srcRelative, destRelative, ctx) {
|
|
@@ -161,17 +166,18 @@ function installRules(ctx) {
|
|
|
161
166
|
const agentsDest = path.join(ctx.targetRoot, "AGENTS.md");
|
|
162
167
|
|
|
163
168
|
if (fs.existsSync(agentsSrc)) {
|
|
164
|
-
copyFileSafe(agentsSrc, agentsDest, ctx)
|
|
165
|
-
|
|
169
|
+
if (copyFileSafe(agentsSrc, agentsDest, ctx)) {
|
|
170
|
+
count++;
|
|
171
|
+
}
|
|
166
172
|
}
|
|
167
173
|
|
|
168
174
|
const rulesSrc = path.join(vendorRules, ".opencode/rules");
|
|
169
175
|
const rulesDest = path.join(targetOpencode, "rules");
|
|
170
|
-
count +=
|
|
176
|
+
count += copyDirFlat(rulesSrc, rulesDest, ctx);
|
|
171
177
|
|
|
172
178
|
const pluginsSrc = path.join(vendorRules, ".opencode/plugins");
|
|
173
179
|
if (fs.existsSync(pluginsSrc)) {
|
|
174
|
-
count +=
|
|
180
|
+
count += copyDirFlat(pluginsSrc, path.join(targetOpencode, "plugins"), ctx);
|
|
175
181
|
}
|
|
176
182
|
|
|
177
183
|
return count;
|
|
@@ -184,10 +190,12 @@ function installSdd(ctx) {
|
|
|
184
190
|
|
|
185
191
|
ensureDir(path.join(targetOpencode, "agents"));
|
|
186
192
|
ensureDir(path.join(targetOpencode, "commands"));
|
|
193
|
+
ensureDir(path.join(targetOpencode, "plugins"));
|
|
187
194
|
ensureDir(path.join(targetOpencode, "skills"));
|
|
188
195
|
|
|
189
196
|
count += copyOpencodeDir(".opencode/agents", ".opencode/agents", ctx);
|
|
190
197
|
count += copyOpencodeDir(".opencode/commands", ".opencode/commands", ctx);
|
|
198
|
+
count += copyOpencodeDir(".opencode/plugins", ".opencode/plugins", ctx);
|
|
191
199
|
count += copyOpencodeDir(".opencode/skills", ".opencode/skills", ctx);
|
|
192
200
|
|
|
193
201
|
const sddDir = path.join(ctx.targetRoot, ".sdd");
|
|
@@ -238,6 +246,20 @@ function installSdd(ctx) {
|
|
|
238
246
|
count++;
|
|
239
247
|
}
|
|
240
248
|
|
|
249
|
+
const modelProfileDest = path.join(sddDir, "model-profile.json");
|
|
250
|
+
const modelProfileTemplateSrc = path.join(
|
|
251
|
+
sddDir,
|
|
252
|
+
"templates",
|
|
253
|
+
"model-profile-template.json"
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
if (fs.existsSync(modelProfileDest) && !ctx.force) {
|
|
257
|
+
ctx.skipped.push(".sdd/model-profile.json (exists)");
|
|
258
|
+
} else if (fs.existsSync(modelProfileTemplateSrc)) {
|
|
259
|
+
copyFileSafe(modelProfileTemplateSrc, modelProfileDest, ctx);
|
|
260
|
+
count++;
|
|
261
|
+
}
|
|
262
|
+
|
|
241
263
|
const specsDir = path.join(ctx.targetRoot, "specs");
|
|
242
264
|
ensureDir(path.join(specsDir, "active"));
|
|
243
265
|
ensureDir(path.join(specsDir, "backlog"));
|
|
@@ -281,6 +303,16 @@ function patchOpencodeJson(ctx) {
|
|
|
281
303
|
if (fs.existsSync(pkgJsonPath)) {
|
|
282
304
|
const pkgConfig = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8"));
|
|
283
305
|
|
|
306
|
+
if (pkgConfig.model) {
|
|
307
|
+
targetConfig.model = pkgConfig.model;
|
|
308
|
+
ctx.installed.push("opencode.json (model patch)");
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (pkgConfig.small_model) {
|
|
312
|
+
targetConfig.small_model = pkgConfig.small_model;
|
|
313
|
+
ctx.installed.push("opencode.json (small_model patch)");
|
|
314
|
+
}
|
|
315
|
+
|
|
284
316
|
if (pkgConfig.agents && !targetConfig.agents) {
|
|
285
317
|
targetConfig.agents = pkgConfig.agents;
|
|
286
318
|
ctx.installed.push("opencode.json (agents patch)");
|
|
@@ -384,4 +416,4 @@ if (args.command === "help") {
|
|
|
384
416
|
console.error(`Unknown command: ${args.command}`);
|
|
385
417
|
usage();
|
|
386
418
|
process.exit(1);
|
|
387
|
-
}
|
|
419
|
+
}
|
package/opencode.json
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://opencode.ai/config.json",
|
|
3
|
+
"model": "opencode/minimax-m2.5-free",
|
|
4
|
+
"small_model": "opencode/deepseek-v4-flash-free",
|
|
3
5
|
"agent": {
|
|
4
6
|
"sdd-orchestrator": {
|
|
5
7
|
"description": "Parallel task coordination and DAG-based execution for SDD workflows. Use for /execute-parallel, --until-finish automation, and coordinating multiple subagents across complex projects.",
|
|
6
8
|
"mode": "subagent",
|
|
7
|
-
"model": "opencode/
|
|
9
|
+
"model": "opencode/minimax-m2.5-free",
|
|
8
10
|
"temperature": 0.3,
|
|
9
11
|
"permission": {
|
|
10
12
|
"edit": "allow",
|
|
@@ -18,7 +20,7 @@
|
|
|
18
20
|
"sdd-planner": {
|
|
19
21
|
"description": "Architecture design and technical planning for SDD workflows. Use when generating plans from specifications, designing system architecture, or breaking down features into tasks.",
|
|
20
22
|
"mode": "subagent",
|
|
21
|
-
"model": "opencode/
|
|
23
|
+
"model": "opencode/qwen3.6-plus-free",
|
|
22
24
|
"temperature": 0.3,
|
|
23
25
|
"permission": {
|
|
24
26
|
"edit": "allow",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tudeorangbiasa/sdd-multiagent-opencode",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Spec-Driven Development multi-agent workflow for OpenCode",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -25,4 +25,4 @@
|
|
|
25
25
|
"multi-agent"
|
|
26
26
|
],
|
|
27
27
|
"license": "MIT"
|
|
28
|
-
}
|
|
28
|
+
}
|