@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.
@@ -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/gpt-5.5
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/gpt-5.5 |
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/gpt-5.5
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/gpt-5.5 |
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/gpt-5.5` | DAG scheduling, conflict detection, deadlock handling |
36
- | **sdd-planner** | `opencode/gpt-5.5` | Architecture design, technical planning |
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 # Install everything
58
- npx sdd-multiagent-opencode init --sdd-only # SDD workflow only
59
- npx sdd-multiagent-opencode init --rules-only # Base rules only
60
- npx sdd-multiagent-opencode init --force # Overwrite existing
61
- npx sdd-multiagent-opencode init --dry-run # Preview only
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)
@@ -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
- count++;
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 += copyOpencodeDir(".opencode/rules", ".opencode/rules", ctx);
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 += copyOpencodeDir(".opencode/plugins", ".opencode/plugins", ctx);
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/gpt-5.5",
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/gpt-5.5",
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.0",
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
+ }