opencode-agent-kit 1.0.6 → 1.0.8

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.
@@ -5,6 +5,7 @@ import {
5
5
  mkdirSync,
6
6
  writeFileSync,
7
7
  readdirSync,
8
+ appendFileSync,
8
9
  } from "fs";
9
10
  import { join, dirname } from "path";
10
11
  import { fileURLToPath } from "url";
@@ -201,7 +202,15 @@ export async function init(options) {
201
202
  );
202
203
  }
203
204
 
204
- // 6. Install dependencies
205
+ // 6. Copy opencode.example.json
206
+ const exampleSrc = join(TEMPLATE_DIR, "opencode.example.json");
207
+ const exampleDest = join(targetDir, "opencode.example.json");
208
+ if (existsSync(exampleSrc)) {
209
+ console.log(` 📄 Copying opencode.example.json...`);
210
+ copyFileSync(exampleSrc, exampleDest);
211
+ }
212
+
213
+ // 7. Install dependencies
205
214
  if (!skipInstall) {
206
215
  const pm = detectPackageManager(opencodeDir);
207
216
  console.log(` 📦 Installing .opencode/ dependencies with ${pm}...`);
@@ -213,13 +222,36 @@ export async function init(options) {
213
222
  }
214
223
  }
215
224
 
216
- // 7. Done
225
+ // 8. Update .gitignore
226
+ const gitignorePath = join(targetDir, ".gitignore");
227
+ const gitignoreEntries = [
228
+ ".opencode/*",
229
+ "opencode.json",
230
+ "opencode.example.json",
231
+ ];
232
+ if (!existsSync(gitignorePath)) {
233
+ writeFileSync(gitignorePath, gitignoreEntries.join("\n") + "\n", "utf-8");
234
+ console.log(` 📄 Created .gitignore...`);
235
+ } else {
236
+ const gitignoreContent = readFileSync(gitignorePath, "utf-8");
237
+ let appended = false;
238
+ for (const entry of gitignoreEntries) {
239
+ if (!gitignoreContent.includes(entry)) {
240
+ appendFileSync(gitignorePath, entry + "\n", "utf-8");
241
+ appended = true;
242
+ }
243
+ }
244
+ if (appended) {
245
+ console.log(` 📄 Updated .gitignore...`);
246
+ }
247
+ }
248
+
249
+ // 9. Done
217
250
  console.log(`\n ✅ opencode-agent-kit installed!\n`);
218
251
  console.log(` Location: ${targetDir}`);
219
252
  console.log(` What you got:`);
220
- console.log(
221
- ` • opencode.json 13 agents config with MCP servers`,
222
- );
253
+ console.log(` • opencode.json — 13 agents config with MCP servers`);
254
+ console.log(` • opencode.example.json Example config for reference`);
223
255
  console.log(` • .opencode/agents — 14 agent prompt files`);
224
256
  console.log(` • .opencode/skills/ — 60+ skill playbooks`);
225
257
  console.log(` • .opencode/commands/ — 35+ slash commands`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-agent-kit",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "Multi-stack OpenCode agent toolkit — 13 specialized AI agents (Nuxt, React, Node.js, Laravel, CI3, Android, Flutter, DevOps, SEO) with 62 skills, 36 commands, and 6 MCP servers",
5
5
  "type": "module",
6
6
  "bin": {
@@ -9,13 +9,6 @@
9
9
  "*.env.example": "allow"
10
10
  },
11
11
  "edit": "allow",
12
- "bash": {
13
- "*": "ask",
14
- "git status": "allow",
15
- "git diff": "allow",
16
- "git log*": "allow",
17
- "grep *": "allow"
18
- },
19
12
  "webfetch": "allow",
20
13
  "skill": {
21
14
  "*": "allow"
@@ -0,0 +1,361 @@
1
+ {
2
+ "$schema": "https://opencode.ai/config.json",
3
+ "description": "IT Team Agent Configuration Example - Copy ke opencode.json dan sesuaikan model sesuai kebutuhan",
4
+ "note": "Opsional: Jika tidak set model per agent, subagent akan inherit dari primary (IT Leader). Untuk customize, uncomment model line per agent.",
5
+ "formatter": true,
6
+ "permission": {
7
+ "read": {
8
+ "*": "allow",
9
+ "*.env": "deny",
10
+ "*.env.*": "deny",
11
+ "*.env.example": "allow"
12
+ },
13
+ "edit": "allow",
14
+ "webfetch": "allow",
15
+ "skill": {
16
+ "*": "allow"
17
+ },
18
+ "todowrite": "allow",
19
+ "question": "allow",
20
+ "doom_loop": "ask",
21
+ "external_directory": "ask"
22
+ },
23
+ "instructions": [
24
+ ".opencode/instructions/INSTRUCTIONS.md",
25
+ ".opencode/skills/coding-standards/SKILL.md",
26
+ ".opencode/skills/security-review/SKILL.md",
27
+ ".opencode/skills/frontend-design/SKILL.md"
28
+ ],
29
+ "mcp": {
30
+ "nuxt": {
31
+ "type": "remote",
32
+ "url": "https://nuxt.com/mcp",
33
+ "enabled": true,
34
+ "description": "Nuxt documentation, blog posts, and deployment guides"
35
+ },
36
+ "nuxt-ui": {
37
+ "type": "remote",
38
+ "url": "https://ui.nuxt.com/mcp",
39
+ "enabled": true,
40
+ "description": "Nuxt UI component documentation and examples"
41
+ },
42
+ "figma": {
43
+ "type": "stdio",
44
+ "command": "npx",
45
+ "args": ["-y", "@modelcontextprotocol/server-figma"],
46
+ "env": {
47
+ "FIGMA_ACCESS_TOKEN": "${FIGMA_ACCESS_TOKEN}"
48
+ },
49
+ "enabled": false,
50
+ "description": "Figma design file access (requires FIGMA_ACCESS_TOKEN)"
51
+ },
52
+ "playwright": {
53
+ "type": "stdio",
54
+ "command": "npx",
55
+ "args": ["-y", "@modelcontextprotocol/server-playwright"],
56
+ "enabled": true,
57
+ "description": "Browser automation and E2E testing with Playwright"
58
+ },
59
+ "stitch": {
60
+ "type": "remote",
61
+ "url": "https://stitch.googleapis.com/mcp",
62
+ "headers": {
63
+ "X-Goog-Api-Key": "${STITCH_API_KEY}"
64
+ },
65
+ "enabled": false,
66
+ "description": "Google Stitch AI design generation (requires STITCH_API_KEY)"
67
+ },
68
+ "postman": {
69
+ "type": "remote",
70
+ "url": "https://mcp.postman.com/mcp",
71
+ "headers": {
72
+ "Authorization": "Bearer ${POSTMAN_API_KEY}"
73
+ },
74
+ "enabled": true,
75
+ "description": "Postman API management for collections, requests, and documentation"
76
+ }
77
+ },
78
+ "agent": {
79
+ "leader": {
80
+ "description": "IT Leader & Technical Project Manager — analyzes requirements, designs architecture, decomposes tasks, delegates to subagents, and unifies outputs",
81
+ "mode": "primary",
82
+ "prompt": "{file:.opencode/agents/it-leader.md}",
83
+ "model": "opencode/claude-opus-4.7",
84
+ "temperature": 0.4,
85
+ "color": "#8b5cf6",
86
+ "permission": {
87
+ "edit": "allow",
88
+ "webfetch": "allow",
89
+ "skill": { "*": "allow" },
90
+ "bash": {
91
+ "*": "ask",
92
+ "npm *": "allow",
93
+ "pnpm *": "allow",
94
+ "bun *": "allow",
95
+ "yarn *": "allow",
96
+ "npx playwright*": "allow"
97
+ },
98
+ "nuxt_*": "allow",
99
+ "nuxt-ui_*": "allow",
100
+ "figma_*": "ask",
101
+ "playwright_*": "allow",
102
+ "postman_*": "allow",
103
+ "task": { "*": "allow" }
104
+ }
105
+ },
106
+ "frontend-nuxt": {
107
+ "description": "Expert Vue/Nuxt frontend developer for Nuxt.js, Vue 3, Nuxt UI, and modern web technologies with MCP integration (subagent of IT Leader)",
108
+ "mode": "subagent",
109
+ "prompt": "{file:.opencode/agents/nuxt-frontend-developer.md}",
110
+ "model": "opencode/claude-sonnet-4.5",
111
+ "temperature": 0.4,
112
+ "color": "#3b82f6",
113
+ "permission": {
114
+ "edit": "allow",
115
+ "webfetch": "allow",
116
+ "skill": { "*": "allow" },
117
+ "bash": {
118
+ "*": "ask",
119
+ "npm *": "allow",
120
+ "pnpm *": "allow",
121
+ "bun *": "allow",
122
+ "yarn *": "allow",
123
+ "npx playwright*": "allow"
124
+ },
125
+ "nuxt_*": "allow",
126
+ "nuxt-ui_*": "allow",
127
+ "figma_*": "ask",
128
+ "playwright_*": "allow"
129
+ }
130
+ },
131
+ "frontend-react": {
132
+ "description": "Expert React/Next.js frontend developer for React 19, Next.js 15, Vite, shadcn/ui, and modern web technologies (subagent of IT Leader)",
133
+ "mode": "subagent",
134
+ "prompt": "{file:.opencode/agents/react-frontend-developer.md}",
135
+ "model": "opencode/claude-sonnet-4.5",
136
+ "temperature": 0.4,
137
+ "color": "#06b6d4",
138
+ "permission": {
139
+ "edit": "allow",
140
+ "webfetch": "allow",
141
+ "skill": { "*": "allow" },
142
+ "bash": {
143
+ "*": "ask",
144
+ "npm *": "allow",
145
+ "pnpm *": "allow",
146
+ "bun *": "allow",
147
+ "yarn *": "allow",
148
+ "npx playwright*": "allow"
149
+ },
150
+ "figma_*": "ask",
151
+ "playwright_*": "allow"
152
+ }
153
+ },
154
+ "backend": {
155
+ "description": "Expert backend developer for Node.js, Express, Prisma, and PostgreSQL (subagent of IT Leader)",
156
+ "mode": "subagent",
157
+ "prompt": "{file:.opencode/agents/node-backend-developer.md}",
158
+ "model": "opencode/claude-sonnet-4.5",
159
+ "temperature": 0.4,
160
+ "color": "#10b981",
161
+ "permission": {
162
+ "edit": "allow",
163
+ "webfetch": "allow",
164
+ "skill": { "*": "allow" },
165
+ "bash": {
166
+ "*": "ask",
167
+ "npm *": "allow",
168
+ "pnpm *": "allow",
169
+ "bun *": "allow",
170
+ "yarn *": "allow"
171
+ },
172
+ "postman_*": "allow"
173
+ }
174
+ },
175
+ "ci3": {
176
+ "description": "CodeIgniter 3 MVC fullstack developer for REST API, JWT, MySQL/PostgreSQL (subagent of IT Leader)",
177
+ "mode": "subagent",
178
+ "prompt": "{file:.opencode/agents/code-igniter-3-fullstack.md}",
179
+ "model": "opencode/claude-sonnet-4.5",
180
+ "temperature": 0.4,
181
+ "color": "#84cc16",
182
+ "permission": {
183
+ "edit": "allow",
184
+ "webfetch": "allow",
185
+ "skill": { "*": "allow" },
186
+ "bash": {
187
+ "*": "ask",
188
+ "git status": "allow",
189
+ "git diff": "allow",
190
+ "git log*": "allow"
191
+ },
192
+ "postman_*": "allow"
193
+ }
194
+ },
195
+ "laravel": {
196
+ "description": "Laravel backend engineer for REST API, Service/Repository, JWT, MySQL/PostgreSQL (subagent of IT Leader)",
197
+ "mode": "subagent",
198
+ "prompt": "{file:.opencode/agents/laravel-advanced.md}",
199
+ "model": "opencode/claude-sonnet-4.5",
200
+ "temperature": 0.4,
201
+ "color": "#f97316",
202
+ "permission": {
203
+ "edit": "allow",
204
+ "webfetch": "allow",
205
+ "skill": { "*": "allow" },
206
+ "bash": {
207
+ "*": "ask",
208
+ "git status": "allow",
209
+ "git diff": "allow",
210
+ "git log*": "allow"
211
+ },
212
+ "postman_*": "allow"
213
+ }
214
+ },
215
+ "designer": {
216
+ "description": "UI/UX Designer specializing in design systems, Google Stitch, Figma, accessibility, and design-to-code handoff (subagent of IT Leader)",
217
+ "mode": "subagent",
218
+ "prompt": "{file:.opencode/agents/ui-ux-designer.md}",
219
+ "model": "opencode/claude-sonnet-4.5",
220
+ "temperature": 0.5,
221
+ "color": "#f59e0b",
222
+ "permission": {
223
+ "edit": "allow",
224
+ "webfetch": "allow",
225
+ "skill": { "*": "allow" },
226
+ "bash": {
227
+ "*": "ask",
228
+ "git status": "allow",
229
+ "git diff": "allow",
230
+ "git log*": "allow"
231
+ },
232
+ "stitch_*": "allow",
233
+ "figma_*": "ask",
234
+ "nuxt-ui_*": "allow"
235
+ }
236
+ },
237
+ "reviewer": {
238
+ "description": "Code Reviewer & QA Engineer specializing in code quality, security audit, testing strategy, and verification (subagent of IT Leader)",
239
+ "mode": "subagent",
240
+ "prompt": "{file:.opencode/agents/code-reviewer.md}",
241
+ "model": "opencode/claude-sonnet-4.5",
242
+ "temperature": 0.4,
243
+ "color": "#ef4444",
244
+ "permission": {
245
+ "edit": "allow",
246
+ "webfetch": "allow",
247
+ "skill": { "*": "allow" },
248
+ "bash": {
249
+ "*": "ask",
250
+ "npm *": "allow",
251
+ "pnpm *": "allow",
252
+ "bun *": "allow",
253
+ "yarn *": "allow",
254
+ "npx playwright*": "allow"
255
+ },
256
+ "playwright_*": "allow"
257
+ }
258
+ },
259
+ "database": {
260
+ "description": "Database Specialist specializing in PostgreSQL schema design, query optimization, Prisma ORM, and migrations (subagent of IT Leader)",
261
+ "mode": "subagent",
262
+ "prompt": "{file:.opencode/agents/database-specialist.md}",
263
+ "model": "opencode/claude-sonnet-4.5",
264
+ "temperature": 0.4,
265
+ "color": "#06b6d4",
266
+ "permission": {
267
+ "edit": "allow",
268
+ "webfetch": "allow",
269
+ "skill": { "*": "allow" },
270
+ "bash": {
271
+ "*": "ask",
272
+ "npm *": "allow",
273
+ "pnpm *": "allow",
274
+ "bun *": "allow",
275
+ "yarn *": "allow"
276
+ }
277
+ }
278
+ },
279
+ "devops": {
280
+ "description": "DevOps Engineer specializing in CI/CD, deployment, Docker, monitoring, and infrastructure (subagent of IT Leader)",
281
+ "mode": "subagent",
282
+ "prompt": "{file:.opencode/agents/devops-specialist.md}",
283
+ "model": "opencode/claude-sonnet-4.5",
284
+ "temperature": 0.4,
285
+ "color": "#6366f1",
286
+ "permission": {
287
+ "edit": "allow",
288
+ "webfetch": "allow",
289
+ "skill": { "*": "allow" },
290
+ "bash": {
291
+ "*": "ask",
292
+ "npm *": "allow",
293
+ "pnpm *": "allow",
294
+ "bun *": "allow",
295
+ "yarn *": "allow",
296
+ "docker *": "allow"
297
+ }
298
+ }
299
+ },
300
+ "seo": {
301
+ "description": "SEO Specialist specializing in meta tags, structured data, Core Web Vitals, and content optimization (subagent of IT Leader)",
302
+ "mode": "subagent",
303
+ "prompt": "{file:.opencode/agents/seo-specialist.md}",
304
+ "model": "opencode/claude-sonnet-4.5",
305
+ "temperature": 0.4,
306
+ "color": "#84cc16",
307
+ "permission": {
308
+ "edit": "allow",
309
+ "webfetch": "allow",
310
+ "skill": { "*": "allow" },
311
+ "bash": {
312
+ "*": "ask",
313
+ "git status": "allow",
314
+ "git diff": "allow",
315
+ "git log*": "allow"
316
+ },
317
+ "nuxt_*": "allow"
318
+ }
319
+ },
320
+ "android": {
321
+ "description": "Expert Android developer for Kotlin, Jetpack Compose, XML, Material Design 3, and Google Play (subagent of IT Leader)",
322
+ "mode": "subagent",
323
+ "prompt": "{file:.opencode/agents/android-developer.md}",
324
+ "model": "opencode/claude-sonnet-4.5",
325
+ "temperature": 0.4,
326
+ "color": "#22c55e",
327
+ "permission": {
328
+ "edit": "allow",
329
+ "webfetch": "allow",
330
+ "skill": { "*": "allow" },
331
+ "bash": {
332
+ "*": "ask",
333
+ "./gradlew *": "allow",
334
+ "gradle *": "allow"
335
+ },
336
+ "figma_*": "ask",
337
+ "playwright_*": "allow"
338
+ }
339
+ },
340
+ "flutter": {
341
+ "description": "Expert Flutter developer for Dart, Flutter SDK, Material Design 3, Firebase, and cross-platform mobile apps (subagent of IT Leader)",
342
+ "mode": "subagent",
343
+ "prompt": "{file:.opencode/agents/flutter-developer.md}",
344
+ "model": "opencode/claude-sonnet-4.5",
345
+ "temperature": 0.4,
346
+ "color": "#0284c7",
347
+ "permission": {
348
+ "edit": "allow",
349
+ "webfetch": "allow",
350
+ "skill": { "*": "allow" },
351
+ "bash": {
352
+ "*": "ask",
353
+ "flutter *": "allow",
354
+ "dart *": "allow"
355
+ },
356
+ "figma_*": "ask",
357
+ "playwright_*": "allow"
358
+ }
359
+ }
360
+ }
361
+ }
@@ -77,7 +77,7 @@
77
77
  "webfetch": "allow",
78
78
  "skill": { "*": "allow" },
79
79
  "bash": {
80
- "*": "ask",
80
+ "*": "allow",
81
81
  "npm *": "allow",
82
82
  "pnpm *": "allow",
83
83
  "bun *": "allow",
@@ -102,7 +102,7 @@
102
102
  "webfetch": "allow",
103
103
  "skill": { "*": "allow" },
104
104
  "bash": {
105
- "*": "ask",
105
+ "*": "allow",
106
106
  "npm *": "allow",
107
107
  "pnpm *": "allow",
108
108
  "bun *": "allow",
@@ -125,7 +125,7 @@
125
125
  "webfetch": "allow",
126
126
  "skill": { "*": "allow" },
127
127
  "bash": {
128
- "*": "ask",
128
+ "*": "allow",
129
129
  "npm *": "allow",
130
130
  "pnpm *": "allow",
131
131
  "bun *": "allow",
@@ -146,7 +146,7 @@
146
146
  "webfetch": "allow",
147
147
  "skill": { "*": "allow" },
148
148
  "bash": {
149
- "*": "ask",
149
+ "*": "allow",
150
150
  "npm *": "allow",
151
151
  "pnpm *": "allow",
152
152
  "bun *": "allow",
@@ -165,7 +165,7 @@
165
165
  "webfetch": "allow",
166
166
  "skill": { "*": "allow" },
167
167
  "bash": {
168
- "*": "ask",
168
+ "*": "allow",
169
169
  "git status": "allow",
170
170
  "git diff": "allow",
171
171
  "git log*": "allow"
@@ -183,7 +183,7 @@
183
183
  "webfetch": "allow",
184
184
  "skill": { "*": "allow" },
185
185
  "bash": {
186
- "*": "ask",
186
+ "*": "allow",
187
187
  "git status": "allow",
188
188
  "git diff": "allow",
189
189
  "git log*": "allow"
@@ -201,7 +201,7 @@
201
201
  "webfetch": "allow",
202
202
  "skill": { "*": "allow" },
203
203
  "bash": {
204
- "*": "ask",
204
+ "*": "allow",
205
205
  "git status": "allow",
206
206
  "git diff": "allow",
207
207
  "git log*": "allow"
@@ -221,7 +221,7 @@
221
221
  "webfetch": "allow",
222
222
  "skill": { "*": "allow" },
223
223
  "bash": {
224
- "*": "ask",
224
+ "*": "allow",
225
225
  "npm *": "allow",
226
226
  "pnpm *": "allow",
227
227
  "bun *": "allow",
@@ -241,7 +241,7 @@
241
241
  "webfetch": "allow",
242
242
  "skill": { "*": "allow" },
243
243
  "bash": {
244
- "*": "ask",
244
+ "*": "allow",
245
245
  "npm *": "allow",
246
246
  "pnpm *": "allow",
247
247
  "bun *": "allow",
@@ -259,7 +259,7 @@
259
259
  "webfetch": "allow",
260
260
  "skill": { "*": "allow" },
261
261
  "bash": {
262
- "*": "ask",
262
+ "*": "allow",
263
263
  "npm *": "allow",
264
264
  "pnpm *": "allow",
265
265
  "bun *": "allow",
@@ -278,7 +278,7 @@
278
278
  "webfetch": "allow",
279
279
  "skill": { "*": "allow" },
280
280
  "bash": {
281
- "*": "ask",
281
+ "*": "allow",
282
282
  "git status": "allow",
283
283
  "git diff": "allow",
284
284
  "git log*": "allow"
@@ -296,7 +296,7 @@
296
296
  "webfetch": "allow",
297
297
  "skill": { "*": "allow" },
298
298
  "bash": {
299
- "*": "ask",
299
+ "*": "allow",
300
300
  "./gradlew *": "allow",
301
301
  "gradle *": "allow"
302
302
  },
@@ -314,7 +314,7 @@
314
314
  "webfetch": "allow",
315
315
  "skill": { "*": "allow" },
316
316
  "bash": {
317
- "*": "ask",
317
+ "*": "allow",
318
318
  "flutter *": "allow",
319
319
  "dart *": "allow"
320
320
  },