amazingteam 3.0.0 → 3.0.1

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/CHANGELOG.md CHANGED
@@ -5,6 +5,30 @@ All notable changes to the AmazingTeam will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [3.0.1] - 2026-03-17
9
+
10
+ ### Added
11
+
12
+ #### Custom LLM Provider Support
13
+ - `llm` configuration section in `amazingteam.config.yaml`
14
+ - Support for custom providers: OpenAI, Anthropic, Bailian, DeepSeek, Moonshot, Zhipu
15
+ - Custom `base_url` for private endpoints
16
+ - `api_key_env` for secure API key management via environment variables
17
+ - Interactive LLM configuration during `amazingteam init`
18
+
19
+ ### Changed
20
+
21
+ #### Renaming
22
+ - Package renamed from `ai-team-foundation` to `amazingteam`
23
+ - CLI command: `ai-team` → `amazingteam`
24
+ - Config file: `ai-team.config.yaml` → `amazingteam.config.yaml`
25
+ - Workflow template: `ai-team.yml` → `amazingteam.yml`
26
+ - Repository: `your-org/ai-team-foundation` → `Burburton/amazingteam`
27
+
28
+ All references updated across codebase.
29
+
30
+ ---
31
+
8
32
  ## [3.0.0] - 2026-03-17
9
33
 
10
34
  ### Added
package/VERSION CHANGED
@@ -1 +1 @@
1
- 3.0.0
1
+ 3.0.1
@@ -14,9 +14,22 @@ const TEMP_DIR = path.join(os.tmpdir(), 'amazingteam-cli-test');
14
14
  function setup() {
15
15
  console.log('Setting up test environment...');
16
16
 
17
- if (fs.existsSync(TEMP_DIR)) {
18
- fs.rmSync(TEMP_DIR, { recursive: true, force: true });
17
+ try {
18
+ if (fs.existsSync(TEMP_DIR)) {
19
+ fs.rmSync(TEMP_DIR, { recursive: true, force: true });
20
+ }
21
+ } catch (err) {
22
+ if (err.code === 'EBUSY') {
23
+ console.log(' Note: Temp directory locked, using alternative path');
24
+ const altDir = path.join(os.tmpdir(), `amazingteam-cli-test-${Date.now()}`);
25
+ fs.mkdirSync(altDir, { recursive: true });
26
+ process.chdir(altDir);
27
+ console.log(` Working directory: ${altDir}`);
28
+ return;
29
+ }
30
+ throw err;
19
31
  }
32
+
20
33
  fs.mkdirSync(TEMP_DIR, { recursive: true });
21
34
 
22
35
  process.chdir(TEMP_DIR);
@@ -57,8 +57,18 @@ project:
57
57
  language: "{{LANGUAGE}}"
58
58
  framework: "{{FRAMEWORK}}"
59
59
 
60
- ai_team:
61
- version: "{{AI_TEAM_VERSION}}"
60
+ llm:
61
+ # Provider: default, openai, anthropic, bailian, deepseek, etc.
62
+ provider: "{{LLM_PROVIDER}}"
63
+ model: "{{LLM_MODEL}}"
64
+ small_model: "{{LLM_SMALL_MODEL}}"
65
+ # Uncomment for custom endpoint:
66
+ # base_url: "https://your-api-endpoint.com/v1"
67
+ # API key from environment variable:
68
+ # api_key_env: "YOUR_API_KEY_ENV_NAME"
69
+
70
+ amazingteam:
71
+ version: "{{AMAZINGTEAM_VERSION}}"
62
72
 
63
73
  build:
64
74
  command: "{{BUILD_COMMAND}}"
@@ -76,8 +86,8 @@ rules:
76
86
 
77
87
  'opencode.jsonc': `{
78
88
  "$schema": "https://opencode.ai/config.json",
79
- "model": "default",
80
- "small_model": "default",
89
+ "model": "{{LLM_MODEL}}",
90
+ "small_model": "{{LLM_SMALL_MODEL}}",
81
91
  "default_agent": "build",
82
92
  "instructions": ["AGENTS.md"],
83
93
  "autoupdate": true,
@@ -89,7 +99,7 @@ rules:
89
99
  "write": true,
90
100
  "edit": true,
91
101
  "bash": true
92
- }
102
+ }{{LLM_PROVIDER_CONFIG}}
93
103
  }
94
104
  `,
95
105
 
@@ -232,6 +242,10 @@ async function run(options, positional) {
232
242
  let framework = options.framework;
233
243
  let description = options.description;
234
244
  let overlay = options.overlay;
245
+ let llmProvider = options.llmProvider;
246
+ let llmModel = options.llmModel;
247
+ let llmSmallModel = options.llmSmallModel;
248
+ let llmBaseUrl = options.llmBaseUrl;
235
249
 
236
250
  if (!options.language) {
237
251
  language = await question(rl, 'Language', 'typescript');
@@ -251,6 +265,31 @@ async function run(options, positional) {
251
265
  overlay = overlayAnswer || null;
252
266
  }
253
267
 
268
+ // LLM Configuration
269
+ log('\n🤖 LLM Configuration\n', 'cyan');
270
+
271
+ if (!options.llmProvider) {
272
+ console.log(' Common providers: default, openai, anthropic, bailian, deepseek');
273
+ llmProvider = await question(rl, 'LLM Provider', 'default');
274
+ }
275
+
276
+ if (llmProvider === 'default') {
277
+ llmModel = 'default';
278
+ llmSmallModel = 'default';
279
+ } else {
280
+ if (!options.llmModel) {
281
+ llmModel = await question(rl, 'Model name', 'gpt-4');
282
+ }
283
+ if (!options.llmSmallModel) {
284
+ llmSmallModel = await question(rl, 'Small model (for simple tasks)', llmModel);
285
+ }
286
+ }
287
+
288
+ if (!options.llmBaseUrl && llmProvider !== 'default') {
289
+ const baseUrlAnswer = await question(rl, 'Custom base URL (leave empty for default)', '');
290
+ llmBaseUrl = baseUrlAnswer || null;
291
+ }
292
+
254
293
  const langDefaults = getLanguageDefaults(language);
255
294
 
256
295
  log('\n📦 Creating project structure...', 'blue');
@@ -279,6 +318,18 @@ async function run(options, positional) {
279
318
 
280
319
  log('📝 Creating configuration files...', 'blue');
281
320
 
321
+ // Generate LLM provider config for opencode.jsonc
322
+ let llmProviderConfig = '';
323
+ if (llmProvider !== 'default' && llmBaseUrl) {
324
+ llmProviderConfig = `,
325
+ "providers": {
326
+ "${llmProvider}": {
327
+ "base_url": "${llmBaseUrl}",
328
+ "api_key": "\${${llmProvider.toUpperCase()}_API_KEY}"
329
+ }
330
+ }`;
331
+ }
332
+
282
333
  // Generate amazingteam.config.yaml
283
334
  let configContent = getTemplate('amazingteam.config.yaml');
284
335
  configContent = configContent
@@ -286,7 +337,10 @@ async function run(options, positional) {
286
337
  .replace(/\{\{PROJECT_DESCRIPTION\}\}/g, description)
287
338
  .replace(/\{\{LANGUAGE\}\}/g, language)
288
339
  .replace(/\{\{FRAMEWORK\}\}/g, framework)
289
- .replace(/\{\{AI_TEAM_VERSION\}\}/g, VERSION)
340
+ .replace(/\{\{AMAZINGTEAM_VERSION\}\}/g, VERSION)
341
+ .replace(/\{\{LLM_PROVIDER\}\}/g, llmProvider)
342
+ .replace(/\{\{LLM_MODEL\}\}/g, llmModel)
343
+ .replace(/\{\{LLM_SMALL_MODEL\}\}/g, llmSmallModel)
290
344
  .replace(/\{\{BUILD_COMMAND\}\}/g, langDefaults.buildCommand)
291
345
  .replace(/\{\{TEST_COMMAND\}\}/g, langDefaults.testCommand)
292
346
  .replace(/\{\{LINT_COMMAND\}\}/g, langDefaults.lintCommand)
@@ -295,8 +349,14 @@ async function run(options, positional) {
295
349
  fs.writeFileSync(configPath, configContent);
296
350
 
297
351
  // Generate opencode.jsonc
352
+ let opencodeContent = getTemplate('opencode.jsonc');
353
+ opencodeContent = opencodeContent
354
+ .replace(/\{\{LLM_MODEL\}\}/g, llmProvider === 'default' ? 'default' : `${llmProvider}/${llmModel}`)
355
+ .replace(/\{\{LLM_SMALL_MODEL\}\}/g, llmProvider === 'default' ? 'default' : `${llmProvider}/${llmSmallModel}`)
356
+ .replace(/\{\{LLM_PROVIDER_CONFIG\}\}/g, llmProviderConfig);
357
+
298
358
  const opencodePath = path.join(projectPath, 'opencode.jsonc');
299
- fs.writeFileSync(opencodePath, getTemplate('opencode.jsonc'));
359
+ fs.writeFileSync(opencodePath, opencodeContent);
300
360
 
301
361
  // Generate workflow
302
362
  const workflowPath = path.join(projectPath, '.github', 'workflows', 'amazingteam.yml');
@@ -90,6 +90,7 @@ overlay:
90
90
  | `version` | string | No | `"1.0"` | Config file schema version |
91
91
  | `preset` | string | No | `"default"` | Preset name (default, typescript, python, go) |
92
92
  | `project` | object | **Yes** | - | Project information |
93
+ | `llm` | object | No | Default | LLM provider configuration |
93
94
  | `build` | object | No | Preset default | Build commands |
94
95
  | `rules` | object | No | Preset default | Coding rules |
95
96
  | `agents` | object | No | All enabled | Agent configuration |
@@ -131,6 +132,87 @@ project:
131
132
 
132
133
  ---
133
134
 
135
+ ### llm
136
+
137
+ LLM provider configuration for custom AI backends.
138
+
139
+ | Field | Type | Required | Default | Description |
140
+ |-------|------|----------|---------|-------------|
141
+ | `provider` | string | No | `"default"` | Provider name (default, openai, anthropic, bailian, deepseek, etc.) |
142
+ | `model` | string | No | `"default"` | Model name for main tasks |
143
+ | `small_model` | string | No | Same as model | Model for simple tasks |
144
+ | `base_url` | string | No | Provider default | Custom API endpoint |
145
+ | `api_key_env` | string | No | - | Environment variable name for API key |
146
+
147
+ **Supported Providers:**
148
+
149
+ | Provider | base_url | Notes |
150
+ |----------|----------|-------|
151
+ | `default` | - | Uses OpenCode's default configuration |
152
+ | `openai` | `https://api.openai.com/v1` | OpenAI GPT models |
153
+ | `anthropic` | `https://api.anthropic.com` | Claude models |
154
+ | `bailian` | `https://bailian.aliyuncs.com/v1` | Alibaba Bailian (百炼) |
155
+ | `deepseek` | `https://api.deepseek.com` | DeepSeek models |
156
+ | `moonshot` | `https://api.moonshot.cn/v1` | Moonshot (月之暗面) |
157
+ | `zhipu` | `https://open.bigmodel.cn/api/paas/v4` | Zhipu AI (智谱) |
158
+
159
+ **Examples:**
160
+
161
+ ```yaml
162
+ # Use default (OpenCode handles configuration)
163
+ llm:
164
+ provider: "default"
165
+
166
+ # Use Alibaba Bailian (百炼)
167
+ llm:
168
+ provider: "bailian"
169
+ model: "qwen-max"
170
+ small_model: "qwen-turbo"
171
+ base_url: "https://bailian.aliyuncs.com/v1"
172
+ api_key_env: "BAILIAN_API_KEY"
173
+
174
+ # Use OpenAI
175
+ llm:
176
+ provider: "openai"
177
+ model: "gpt-4"
178
+ small_model: "gpt-3.5-turbo"
179
+
180
+ # Use DeepSeek
181
+ llm:
182
+ provider: "deepseek"
183
+ model: "deepseek-chat"
184
+ small_model: "deepseek-chat"
185
+
186
+ # Custom endpoint
187
+ llm:
188
+ provider: "custom"
189
+ model: "my-model"
190
+ base_url: "https://my-api.example.com/v1"
191
+ api_key_env: "CUSTOM_API_KEY"
192
+ ```
193
+
194
+ **Environment Variables:**
195
+
196
+ Set your API key in environment:
197
+ ```bash
198
+ # For Bailian
199
+ export BAILIAN_API_KEY="your-api-key"
200
+
201
+ # For OpenAI
202
+ export OPENAI_API_KEY="your-api-key"
203
+
204
+ # For DeepSeek
205
+ export DEEPSEEK_API_KEY="your-api-key"
206
+ ```
207
+
208
+ In GitHub Actions, add to your workflow:
209
+ ```yaml
210
+ env:
211
+ BAILIAN_API_KEY: ${{ secrets.BAILIAN_API_KEY }}
212
+ ```
213
+
214
+ ---
215
+
134
216
  ### build
135
217
 
136
218
  Build and test commands.
@@ -52,6 +52,10 @@ my-project/
52
52
  project:
53
53
  name: "my-project"
54
54
  language: "typescript"
55
+
56
+ # LLM Configuration (optional)
57
+ llm:
58
+ provider: "default" # Use OpenCode default
55
59
  ```
56
60
 
57
61
  ### Full Configuration
@@ -66,6 +70,14 @@ project:
66
70
  language: "typescript"
67
71
  framework: "react"
68
72
 
73
+ # LLM Configuration - Use your own AI provider
74
+ llm:
75
+ provider: "bailian" # or: openai, anthropic, deepseek, etc.
76
+ model: "qwen-max" # Main model for complex tasks
77
+ small_model: "qwen-turbo" # Faster model for simple tasks
78
+ base_url: "https://bailian.aliyuncs.com/v1"
79
+ api_key_env: "BAILIAN_API_KEY" # Env var name (not the actual key!)
80
+
69
81
  # Build commands (override defaults)
70
82
  build:
71
83
  command: "npm run build"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "amazingteam",
3
- "version": "3.0.0",
3
+ "version": "3.0.1",
4
4
  "description": "AI-powered autonomous development team foundation - Reusable development scaffolding with controlled self-bootstrap capability",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -9,7 +9,14 @@ project:
9
9
  language: "typescript"
10
10
  framework: "node"
11
11
 
12
- ai_team:
12
+ llm:
13
+ provider: "default"
14
+ model: "default"
15
+ small_model: "default"
16
+ base_url: ""
17
+ api_key_env: ""
18
+
19
+ amazingteam:
13
20
  version: "3.0.0"
14
21
 
15
22
  agents:
@@ -1,216 +1,17 @@
1
1
  {
2
2
  "$schema": "https://opencode.ai/schema.json",
3
- "version": "{{AI_TEAM_VERSION}}",
4
- "project": {
5
- "name": "{{PROJECT_NAME}}",
6
- "description": "{{PROJECT_DESCRIPTION}}",
7
- "language": "{{LANGUAGE}}",
8
- "framework": "{{FRAMEWORK}}"
3
+ "model": "{{LLM_MODEL}}",
4
+ "small_model": "{{LLM_SMALL_MODEL}}",
5
+ "default_agent": "build",
6
+ "instructions": ["AGENTS.md"],
7
+ "autoupdate": true,
8
+ "permission": {
9
+ "edit": "ask",
10
+ "bash": "ask"
9
11
  },
10
- "agents": {
11
- "planner": {
12
- "description": "Decomposes tasks and coordinates workflow progression",
13
- "model": "default",
14
- "skills": ["task-breakdown-and-dispatch"],
15
- "commands": [],
16
- "memory": {
17
- "read": ["docs/", "AGENTS.md", ".ai-team/memory/planner/", ".ai-team/memory/architect/", ".ai-team/memory/triage/", ".ai-team/memory/failures/", "tasks/"],
18
- "write": [".ai-team/memory/planner/", "tasks/{task_id}/task.yaml"]
19
- }
20
- },
21
- "architect": {
22
- "description": "Analyzes requirements and designs solutions",
23
- "model": "default",
24
- "skills": ["repo-architecture-reader"],
25
- "commands": ["/design"],
26
- "memory": {
27
- "read": ["docs/", "AGENTS.md", ".ai-team/memory/planner/", ".ai-team/memory/architect/", ".ai-team/memory/developer/", ".ai-team/memory/failures/", "tasks/"],
28
- "write": [".ai-team/memory/architect/", "tasks/{task_id}/analysis.md", "tasks/{task_id}/design.md"]
29
- }
30
- },
31
- "developer": {
32
- "description": "Implements features and fixes bugs",
33
- "model": "default",
34
- "skills": ["test-first-feature-dev", "bugfix-playbook"],
35
- "commands": ["/implement"],
36
- "memory": {
37
- "read": ["docs/", "AGENTS.md", ".ai-team/memory/planner/", ".ai-team/memory/architect/", ".ai-team/memory/developer/", ".ai-team/memory/failures/", "tasks/{task_id}/"],
38
- "write": [".ai-team/memory/developer/", "tasks/{task_id}/implementation.md", "src/", "tests/"]
39
- }
40
- },
41
- "qa": {
42
- "description": "Validates implementations and ensures quality",
43
- "model": "default",
44
- "skills": ["test-first-feature-dev", "regression-checklist"],
45
- "commands": ["/test"],
46
- "memory": {
47
- "read": ["docs/", "AGENTS.md", ".ai-team/memory/planner/", ".ai-team/memory/architect/", ".ai-team/memory/qa/", ".ai-team/memory/failures/", "tasks/{task_id}/"],
48
- "write": [".ai-team/memory/qa/", "tasks/{task_id}/validation.md", "tests/"]
49
- }
50
- },
51
- "reviewer": {
52
- "description": "Reviews code for quality and correctness",
53
- "model": "default",
54
- "skills": ["safe-refactor-checklist", "regression-checklist", "release-readiness-check"],
55
- "commands": ["/review", "/release-check"],
56
- "memory": {
57
- "read": ["docs/", "AGENTS.md", ".ai-team/memory/", ".ai-team/memory/failures/", "tasks/{task_id}/"],
58
- "write": [".ai-team/memory/reviewer/", "tasks/{task_id}/review.md", "tasks/{task_id}/release.md"]
59
- }
60
- },
61
- "triage": {
62
- "description": "Classifies issues and performs first-pass debug analysis",
63
- "model": "default",
64
- "skills": ["issue-triage", "bugfix-playbook"],
65
- "commands": ["/triage"],
66
- "memory": {
67
- "read": ["docs/", "AGENTS.md", ".ai-team/memory/triage/", ".ai-team/memory/failures/", "tasks/{task_id}/"],
68
- "write": [".ai-team/memory/triage/", "tasks/{task_id}/"]
69
- }
70
- },
71
- "ci-analyst": {
72
- "description": "Investigates CI failures and documents patterns",
73
- "model": "default",
74
- "skills": ["ci-failure-analysis", "bugfix-playbook"],
75
- "commands": ["/ci-analyze"],
76
- "memory": {
77
- "read": ["docs/", "AGENTS.md", ".ai-team/memory/ci-analyst/", ".ai-team/memory/failures/", "tasks/{task_id}/", "docs/runbooks/ci/"],
78
- "write": [".ai-team/memory/ci-analyst/", ".ai-team/memory/failures/", "tasks/{task_id}/"]
79
- }
80
- }
81
- },
82
- "skills": {
83
- "repo-architecture-reader": {
84
- "path": "{{FOUNDATION_PATH}}/.opencode/skills/repo-architecture-reader/SKILL.md"
85
- },
86
- "bugfix-playbook": {
87
- "path": "{{FOUNDATION_PATH}}/.opencode/skills/bugfix-playbook/SKILL.md"
88
- },
89
- "test-first-feature-dev": {
90
- "path": "{{FOUNDATION_PATH}}/.opencode/skills/test-first-feature-dev/SKILL.md"
91
- },
92
- "safe-refactor-checklist": {
93
- "path": "{{FOUNDATION_PATH}}/.opencode/skills/safe-refactor-checklist/SKILL.md"
94
- },
95
- "task-breakdown-and-dispatch": {
96
- "path": "{{FOUNDATION_PATH}}/.opencode/skills/task-breakdown-and-dispatch/SKILL.md"
97
- },
98
- "issue-triage": {
99
- "path": "{{FOUNDATION_PATH}}/.opencode/skills/issue-triage/SKILL.md"
100
- },
101
- "ci-failure-analysis": {
102
- "path": "{{FOUNDATION_PATH}}/.opencode/skills/ci-failure-analysis/SKILL.md"
103
- },
104
- "regression-checklist": {
105
- "path": "{{FOUNDATION_PATH}}/.opencode/skills/regression-checklist/SKILL.md"
106
- },
107
- "release-readiness-check": {
108
- "path": "{{FOUNDATION_PATH}}/.opencode/skills/release-readiness-check/SKILL.md"
109
- }
110
- },
111
- "commands": {
112
- "/triage": {
113
- "path": "{{FOUNDATION_PATH}}/.ai-team/commands/triage.md",
114
- "agent": "triage"
115
- },
116
- "/design": {
117
- "path": "{{FOUNDATION_PATH}}/.ai-team/commands/design.md",
118
- "agent": "architect"
119
- },
120
- "/implement": {
121
- "path": "{{FOUNDATION_PATH}}/.ai-team/commands/implement.md",
122
- "agent": "developer"
123
- },
124
- "/test": {
125
- "path": "{{FOUNDATION_PATH}}/.ai-team/commands/test.md",
126
- "agent": "qa"
127
- },
128
- "/review": {
129
- "path": "{{FOUNDATION_PATH}}/.ai-team/commands/review.md",
130
- "agent": "reviewer"
131
- },
132
- "/ci-analyze": {
133
- "path": "{{FOUNDATION_PATH}}/.ai-team/commands/ci-analyze.md",
134
- "agent": "ci-analyst"
135
- },
136
- "/release-check": {
137
- "path": "{{FOUNDATION_PATH}}/.ai-team/commands/release-check.md",
138
- "agent": "reviewer"
139
- }
140
- },
141
- "workflows": {
142
- "feature": ["planner", "architect", "developer", "qa", "reviewer"],
143
- "bugfix": ["triage", "architect", "developer", "qa", "reviewer"],
144
- "refactor": ["architect", "developer", "reviewer"],
145
- "ci-failure": ["ci-analyst", "developer", "qa"],
146
- "release": ["reviewer"]
147
- },
148
- "memory": {
149
- "global": {
150
- "locations": ["docs/", "AGENTS.md"],
151
- "writeRequiresApproval": true
152
- },
153
- "role": {
154
- "base_path": ".ai-team/memory",
155
- "roles": {
156
- "planner": {
157
- "files": ["decomposition_notes.md", "flow_rules.md", "github_issue_patterns.md"]
158
- },
159
- "architect": {
160
- "files": ["architecture_notes.md", "module_map.md", "design_rationale.md"]
161
- },
162
- "developer": {
163
- "files": ["implementation_notes.md", "bug_investigation.md", "build_issues.md"]
164
- },
165
- "qa": {
166
- "files": ["test_strategy.md", "regression_cases.md", "validation_notes.md"]
167
- },
168
- "reviewer": {
169
- "files": ["review_notes.md", "quality_rules.md", "recurring_risks.md"]
170
- },
171
- "triage": {
172
- "files": ["classification_heuristics.md", "debug_notes.md"]
173
- },
174
- "ci-analyst": {
175
- "files": ["failure_patterns.md", "runbook_references.md"]
176
- }
177
- }
178
- },
179
- "failures": {
180
- "path": ".ai-team/memory/failures",
181
- "files": ["failure_library.md"],
182
- "writableBy": ["ci-analyst"]
183
- },
184
- "task": {
185
- "base_path": "tasks",
186
- "naming": "issue-{issue_id}",
187
- "files": ["task.yaml", "analysis.md", "design.md", "implementation.md", "validation.md", "review.md", "release.md"],
188
- "autoCreate": true,
189
- "preserveAfterCompletion": true
190
- }
191
- },
192
- "rules": {
193
- "maxChangesPerCommit": 10,
194
- "requireTests": true,
195
- "requireReview": true,
196
- "autoMerge": false,
197
- "memoryIsolation": true,
198
- "protectedPaths": ["docs/architecture/", "docs/decisions/"],
199
- "humanApprovalRequired": ["architecture changes", "release operations", "breaking changes"]
200
- },
201
- "integrations": {
202
- "github": {
203
- "enabled": true,
204
- "autoLabel": true,
205
- "autoAssign": true
206
- },
207
- "ci": {
208
- "enabled": true,
209
- "requirePassing": true,
210
- "failureAnalysis": {
211
- "enabled": true,
212
- "agent": "ci-analyst"
213
- }
214
- }
215
- }
12
+ "tools": {
13
+ "write": true,
14
+ "edit": true,
15
+ "bash": true
16
+ }{{LLM_PROVIDER_CONFIG}}
216
17
  }