@hongmaple0820/scale-engine 0.12.0 → 0.12.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/README.en.md +6 -6
- package/README.md +6 -6
- package/dist/adapters/AiderAdapter.d.ts +22 -0
- package/dist/adapters/AiderAdapter.js +262 -0
- package/dist/adapters/AiderAdapter.js.map +1 -0
- package/dist/adapters/DoubaoAdapter.d.ts +14 -0
- package/dist/adapters/DoubaoAdapter.js +184 -0
- package/dist/adapters/DoubaoAdapter.js.map +1 -0
- package/dist/adapters/KimiAdapter.d.ts +14 -0
- package/dist/adapters/KimiAdapter.js +183 -0
- package/dist/adapters/KimiAdapter.js.map +1 -0
- package/dist/adapters/WindsurfAdapter.d.ts +14 -0
- package/dist/adapters/WindsurfAdapter.js +185 -0
- package/dist/adapters/WindsurfAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts +4 -0
- package/dist/adapters/index.js +12 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/api/quickstart.js +5 -1
- package/dist/api/quickstart.js.map +1 -1
- package/dist/artifact/types.d.ts +1 -1
- package/dist/context/ContextBuilder.js +27 -0
- package/dist/context/ContextBuilder.js.map +1 -1
- package/dist/skills/SkillDiscovery.js +9 -1
- package/dist/skills/SkillDiscovery.js.map +1 -1
- package/package.json +2 -2
package/README.en.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://img.shields.io/badge/version-0.
|
|
3
|
-
<img src="https://img.shields.io/badge/platforms-
|
|
2
|
+
<img src="https://img.shields.io/badge/version-0.12.2-orange?style=flat-square" alt="version" />
|
|
3
|
+
<img src="https://img.shields.io/badge/platforms-16-blue?style=flat-square" alt="platforms" />
|
|
4
4
|
<img src="https://img.shields.io/badge/agents-12-blue?style=flat-square" alt="agents" />
|
|
5
5
|
<img src="https://img.shields.io/badge/workflows-10-green?style=flat-square" alt="workflows" />
|
|
6
6
|
<img src="https://img.shields.io/badge/detectors-19-red?style=flat-square" alt="detectors" />
|
|
7
|
-
<img src="https://img.shields.io/badge/tests-
|
|
8
|
-
<img src="https://img.shields.io/badge/npm-0.
|
|
7
|
+
<img src="https://img.shields.io/badge/tests-560-passing-brightgreen?style=flat-square" alt="tests" />
|
|
8
|
+
<img src="https://img.shields.io/badge/npm-0.12.2-cb3837?style=flat-square&logo=npm" alt="npm" />
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
# SCALE Engine v0.11.2
|
|
@@ -60,7 +60,7 @@ v0.11.1 introduces four priority improvements:
|
|
|
60
60
|
- Optional strict TDD evidence gate with `--tdd-evidence` and `--tdd-strict`
|
|
61
61
|
- `ship --no-commit` delivery reports
|
|
62
62
|
- Review-gated release commits
|
|
63
|
-
-
|
|
63
|
+
- 16 platform adapters, 12 professional agent profiles
|
|
64
64
|
- Browser QA Capability (Playwright MCP)
|
|
65
65
|
- Evolution self-improve loop
|
|
66
66
|
- 499 Vitest tests passing
|
|
@@ -141,7 +141,7 @@ G7 `SecurityGate` includes a lightweight built-in scan for hardcoded secrets, pr
|
|
|
141
141
|
|
|
142
142
|
## Supported Platforms
|
|
143
143
|
|
|
144
|
-
SCALE Engine includes adapters for
|
|
144
|
+
SCALE Engine includes adapters for 16 agent platforms, including Claude Code, Codex CLI, OpenCode, Cursor, Gemini CLI, OpenClaw, Hermes, Trae, WorkBuddy, VS Code Copilot CLI, QCoder, DeepSeek-TUI, Aider, Windsurf, Kimi, and Doubao.
|
|
145
145
|
|
|
146
146
|
It also includes 12 professional agent profiles:
|
|
147
147
|
|
package/README.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="https://img.shields.io/badge/version-0.12.
|
|
3
|
-
<img src="https://img.shields.io/badge/platforms-
|
|
2
|
+
<img src="https://img.shields.io/badge/version-0.12.2-orange?style=flat-square" alt="version" />
|
|
3
|
+
<img src="https://img.shields.io/badge/platforms-16-blue?style=flat-square" alt="platforms" />
|
|
4
4
|
<img src="https://img.shields.io/badge/agents-12-blue?style=flat-square" alt="agents" />
|
|
5
5
|
<img src="https://img.shields.io/badge/workflows-10-green?style=flat-square" alt="workflows" />
|
|
6
6
|
<img src="https://img.shields.io/badge/detectors-19-red?style=flat-square" alt="detectors" />
|
|
7
7
|
<img src="https://img.shields.io/badge/tests-562-passing-brightgreen?style=flat-square" alt="tests" />
|
|
8
|
-
<img src="https://img.shields.io/badge/npm-0.12.
|
|
8
|
+
<img src="https://img.shields.io/badge/npm-0.12.2-cb3837?style=flat-square&logo=npm" alt="npm" />
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
|
-
# SCALE Engine v0.12.
|
|
11
|
+
# SCALE Engine v0.12.2
|
|
12
12
|
|
|
13
13
|
SCALE Engine 是一个面向 AI 编码 Agent 的工程化工作流运行时。它把提示词里的工程纪律,下沉为状态机、质量门禁、持久化证据、确定性 review 记录和发布检查。
|
|
14
14
|
|
|
@@ -61,7 +61,7 @@ v0.11.1 新增四大优先级改进:
|
|
|
61
61
|
- 可选严格 TDD evidence 门禁:`--tdd-evidence` 和 `--tdd-strict`
|
|
62
62
|
- `ship --no-commit` 交付报告
|
|
63
63
|
- `ship` 发布前强制验证 review evidence
|
|
64
|
-
-
|
|
64
|
+
- 16 个平台适配器,12 个专业 Agent Profile
|
|
65
65
|
- Browser QA Capability (Playwright MCP)
|
|
66
66
|
- Evolution 自改进闭环
|
|
67
67
|
- 本轮加固后,499 个 Vitest 测试通过
|
|
@@ -144,7 +144,7 @@ G7 `SecurityGate` 内置轻量安全扫描,覆盖硬编码密钥、私钥、TL
|
|
|
144
144
|
|
|
145
145
|
## 支持的平台与角色
|
|
146
146
|
|
|
147
|
-
SCALE Engine 内置
|
|
147
|
+
SCALE Engine 内置 16 个平台适配器,包括 Claude Code、Codex CLI、OpenCode、Cursor、Gemini CLI、OpenClaw、Hermes、Trae、WorkBuddy、VS Code Copilot CLI、QCoder、DeepSeek-TUI、Aider、Windsurf、Kimi、Doubao。
|
|
148
148
|
|
|
149
149
|
内置 12 个专业 Agent Profile:
|
|
150
150
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { IAgentAdapter, AdapterConfig, InitResult, SettingsJson } from './ClaudeCodeAdapter.js';
|
|
2
|
+
export declare class AiderAdapter implements IAgentAdapter {
|
|
3
|
+
readonly agentType = "aider";
|
|
4
|
+
private projectDir;
|
|
5
|
+
private scaleDir;
|
|
6
|
+
getSettingsPath(): string;
|
|
7
|
+
getKnowledgeDocPath(): string;
|
|
8
|
+
getSkillsDir(): string;
|
|
9
|
+
isInstalled(): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Generate settings as JSON (interface requirement)
|
|
12
|
+
* Aider uses YAML, so init() will convert this to YAML format
|
|
13
|
+
*/
|
|
14
|
+
generateSettings(): SettingsJson;
|
|
15
|
+
mergeSettings(existing: SettingsJson): SettingsJson;
|
|
16
|
+
/**
|
|
17
|
+
* Convert SettingsJson to YAML format for Aider
|
|
18
|
+
*/
|
|
19
|
+
private settingsToYaml;
|
|
20
|
+
generateKnowledgeDoc(projectName: string, techStack?: string[]): string;
|
|
21
|
+
init(config: AdapterConfig): Promise<InitResult>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
// SCALE Engine — Aider Adapter
|
|
2
|
+
// 生成 .aider.conf.yml + AIDER.md
|
|
3
|
+
// Aider: 开源 AI 编码 CLI (https://github.com/Aider-AI/aider)
|
|
4
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { logger } from '../core/logger.js';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Aider Adapter
|
|
9
|
+
// ============================================================================
|
|
10
|
+
export class AiderAdapter {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.agentType = 'aider';
|
|
13
|
+
this.projectDir = '.';
|
|
14
|
+
this.scaleDir = '.scale';
|
|
15
|
+
}
|
|
16
|
+
getSettingsPath() {
|
|
17
|
+
return join(this.projectDir, '.aider.conf.yml');
|
|
18
|
+
}
|
|
19
|
+
getKnowledgeDocPath() {
|
|
20
|
+
return join(this.projectDir, 'AIDER.md');
|
|
21
|
+
}
|
|
22
|
+
getSkillsDir() {
|
|
23
|
+
// Aider uses .aider/commands/ for custom commands
|
|
24
|
+
return join(this.projectDir, '.aider', 'commands');
|
|
25
|
+
}
|
|
26
|
+
isInstalled() {
|
|
27
|
+
return existsSync(join(this.projectDir, '.aider')) ||
|
|
28
|
+
existsSync(this.getSettingsPath());
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate settings as JSON (interface requirement)
|
|
32
|
+
* Aider uses YAML, so init() will convert this to YAML format
|
|
33
|
+
*/
|
|
34
|
+
generateSettings() {
|
|
35
|
+
return {
|
|
36
|
+
hooks: {
|
|
37
|
+
'pre-tool-use': [
|
|
38
|
+
{ matcher: 'Bash', command: 'scale gate pre-tool Bash --args-json "$ARGS" --session-id "$SESSION_ID"' },
|
|
39
|
+
{ matcher: 'Editor|ApplyFix', command: 'scale gate pre-tool Edit --args-json "$ARGS" --session-id "$SESSION_ID"' },
|
|
40
|
+
{ matcher: 'Create', command: 'scale gate pre-tool Write --args-json "$ARGS" --session-id "$SESSION_ID"' },
|
|
41
|
+
],
|
|
42
|
+
'post-tool-use': [
|
|
43
|
+
{ matcher: 'Editor|ApplyFix', command: 'scale gate post-tool Edit --args-json "$ARGS" --exit-code "$EXIT_CODE" --session-id "$SESSION_ID"' },
|
|
44
|
+
{ matcher: 'Bash', command: 'scale gate post-tool Bash --args-json "$ARGS" --exit-code "$EXIT_CODE" --session-id "$SESSION_ID"' },
|
|
45
|
+
{ matcher: 'Create', command: 'scale gate post-tool Write --args-json "$ARGS" --exit-code "$EXIT_CODE" --session-id "$SESSION_ID"' },
|
|
46
|
+
],
|
|
47
|
+
'exit': [
|
|
48
|
+
{ matcher: '', command: 'scale gate before-stop --session-id "$SESSION_ID"' },
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
permissions: {
|
|
52
|
+
allow: ['scale:*'],
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
mergeSettings(existing) {
|
|
57
|
+
const generated = this.generateSettings();
|
|
58
|
+
const merged = { ...existing };
|
|
59
|
+
if (!merged.hooks)
|
|
60
|
+
merged.hooks = {};
|
|
61
|
+
for (const [hookType, entries] of Object.entries(generated.hooks)) {
|
|
62
|
+
if (!merged.hooks[hookType])
|
|
63
|
+
merged.hooks[hookType] = [];
|
|
64
|
+
for (const entry of entries) {
|
|
65
|
+
const alreadyExists = merged.hooks[hookType].some((e) => e.command.includes('scale '));
|
|
66
|
+
if (!alreadyExists) {
|
|
67
|
+
merged.hooks[hookType].push(entry);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (!merged.permissions)
|
|
72
|
+
merged.permissions = {};
|
|
73
|
+
if (!merged.permissions.allow)
|
|
74
|
+
merged.permissions.allow = [];
|
|
75
|
+
for (const perm of generated.permissions.allow) {
|
|
76
|
+
if (!merged.permissions.allow.includes(perm)) {
|
|
77
|
+
merged.permissions.allow.push(perm);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return merged;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Convert SettingsJson to YAML format for Aider
|
|
84
|
+
*/
|
|
85
|
+
settingsToYaml(settings) {
|
|
86
|
+
const lines = [
|
|
87
|
+
'# Aider Configuration with SCALE Engine Integration',
|
|
88
|
+
'# https://github.com/Aider-AI/aider',
|
|
89
|
+
'',
|
|
90
|
+
];
|
|
91
|
+
// Write hooks section
|
|
92
|
+
if (settings.hooks) {
|
|
93
|
+
for (const [hookType, entries] of Object.entries(settings.hooks)) {
|
|
94
|
+
lines.push(`${hookType}:`);
|
|
95
|
+
for (const entry of entries) {
|
|
96
|
+
lines.push(` - command: ${entry.command}`);
|
|
97
|
+
if (entry.matcher) {
|
|
98
|
+
lines.push(` tools: ["${entry.matcher.replace(/\|/g, '", "')}"]`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
lines.push('');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Write permissions section
|
|
105
|
+
if (settings.permissions?.allow) {
|
|
106
|
+
lines.push('# Allow SCALE commands without confirmation');
|
|
107
|
+
lines.push('auto-commits: false');
|
|
108
|
+
lines.push('dirty-commits: true');
|
|
109
|
+
lines.push('');
|
|
110
|
+
}
|
|
111
|
+
// Write additional Aider-specific settings
|
|
112
|
+
lines.push('# Model settings (can be overridden)');
|
|
113
|
+
lines.push('model: auto');
|
|
114
|
+
lines.push('');
|
|
115
|
+
lines.push('# Read AIDER.md for project context');
|
|
116
|
+
lines.push('read: AIDER.md');
|
|
117
|
+
return lines.join('\n');
|
|
118
|
+
}
|
|
119
|
+
generateKnowledgeDoc(projectName, techStack = []) {
|
|
120
|
+
const stackLine = techStack.length > 0
|
|
121
|
+
? `\n## Tech Stack\n${techStack.map((t) => `- ${t}`).join('\n')}\n`
|
|
122
|
+
: '';
|
|
123
|
+
return `# ${projectName}
|
|
124
|
+
${stackLine}
|
|
125
|
+
## SCALE Engine Integration (Aider)
|
|
126
|
+
|
|
127
|
+
This project uses SCALE Engine for AI engineering governance via Aider CLI.
|
|
128
|
+
|
|
129
|
+
### Commands
|
|
130
|
+
- \`scale create <type> <title>\` — Create artifact
|
|
131
|
+
- \`scale transition <id> <action>\` — Transition artifact state
|
|
132
|
+
- \`scale list --type Spec\` — List artifacts
|
|
133
|
+
- \`scale role activate <role>\` — Switch role
|
|
134
|
+
- \`scale doctor\` — Health check
|
|
135
|
+
|
|
136
|
+
### Workflow
|
|
137
|
+
1. **Explore** → Role: explorer (Read/Grep only)
|
|
138
|
+
2. **Plan** → Create Spec → refine → approve (guard: ambiguity ≤ 0.2)
|
|
139
|
+
3. **Implement** → Role: implementer (Edit/Write/Bash unlocked)
|
|
140
|
+
4. **Verify** → Must run tests before claiming done
|
|
141
|
+
5. **Learn** → Defects → Lessons → Rules → Hooks
|
|
142
|
+
|
|
143
|
+
### Rules
|
|
144
|
+
- 🔴 Dangerous commands are physically blocked
|
|
145
|
+
- 🔴 Hardcoded secrets are blocked on Edit/Write
|
|
146
|
+
- 🟡 3 identical retries triggers brute-retry detection
|
|
147
|
+
- 🟡 Claiming done without running tests is blocked
|
|
148
|
+
- 🟢 All tool calls are tracked in .scale/events/
|
|
149
|
+
|
|
150
|
+
### Aider-Specific Notes
|
|
151
|
+
- Aider uses \`/add\` and \`/drop\` to manage context files
|
|
152
|
+
- Use \`/run\` for shell commands (SCALE hooks apply)
|
|
153
|
+
- Use \`/clear\` to reset context between phases
|
|
154
|
+
- SCALE hooks are defined in \`.aider.conf.yml\`
|
|
155
|
+
|
|
156
|
+
### Quick Reference
|
|
157
|
+
\`\`\`
|
|
158
|
+
# Start with exploration
|
|
159
|
+
> /add src/
|
|
160
|
+
> /read AIDER.md
|
|
161
|
+
|
|
162
|
+
# Plan phase
|
|
163
|
+
> scale create Spec "Feature name"
|
|
164
|
+
|
|
165
|
+
# Implement
|
|
166
|
+
> scale role activate implementer
|
|
167
|
+
> (make changes)
|
|
168
|
+
|
|
169
|
+
# Verify
|
|
170
|
+
> /run npm test
|
|
171
|
+
|
|
172
|
+
# Complete
|
|
173
|
+
> scale transition <id> approve
|
|
174
|
+
\`\`\`
|
|
175
|
+
`;
|
|
176
|
+
}
|
|
177
|
+
async init(config) {
|
|
178
|
+
this.projectDir = config.projectDir;
|
|
179
|
+
this.scaleDir = config.scaleDir ?? join(config.projectDir, '.scale');
|
|
180
|
+
const created = [];
|
|
181
|
+
const skipped = [];
|
|
182
|
+
// Create .scale subdirectories
|
|
183
|
+
for (const dir of ['events', 'artifacts', 'rules', 'hooks', 'checkpoints']) {
|
|
184
|
+
const fullDir = join(this.scaleDir, dir);
|
|
185
|
+
if (!existsSync(fullDir)) {
|
|
186
|
+
mkdirSync(fullDir, { recursive: true });
|
|
187
|
+
created.push(fullDir);
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
skipped.push(fullDir);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Create .aider directory for commands
|
|
194
|
+
const aiderDir = join(this.projectDir, '.aider', 'commands');
|
|
195
|
+
if (!existsSync(aiderDir)) {
|
|
196
|
+
mkdirSync(aiderDir, { recursive: true });
|
|
197
|
+
created.push(aiderDir);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
skipped.push(aiderDir);
|
|
201
|
+
}
|
|
202
|
+
// Create/merge .aider.conf.yml
|
|
203
|
+
const settingsPath = this.getSettingsPath();
|
|
204
|
+
if (existsSync(settingsPath)) {
|
|
205
|
+
// Parse existing YAML (simple approach: check for SCALE hooks)
|
|
206
|
+
const existingYaml = readFileSync(settingsPath, 'utf-8');
|
|
207
|
+
if (existingYaml.includes('scale gate')) {
|
|
208
|
+
skipped.push(settingsPath + ' (already integrated)');
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
// Merge: prepend SCALE hooks
|
|
212
|
+
const generated = this.generateSettings();
|
|
213
|
+
const yamlContent = this.settingsToYaml(generated);
|
|
214
|
+
// Insert after header comments
|
|
215
|
+
const existingLines = existingYaml.split('\n');
|
|
216
|
+
let insertIndex = 0;
|
|
217
|
+
for (let i = 0; i < existingLines.length; i++) {
|
|
218
|
+
if (existingLines[i].startsWith('#') || existingLines[i].trim() === '') {
|
|
219
|
+
insertIndex = i + 1;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const merged = existingLines.slice(0, insertIndex).join('\n') + '\n' + yamlContent + '\n' + existingLines.slice(insertIndex).join('\n');
|
|
226
|
+
writeFileSync(settingsPath, merged.trimStart(), 'utf-8');
|
|
227
|
+
skipped.push(settingsPath + ' (merged)');
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
const generated = this.generateSettings();
|
|
232
|
+
const yamlContent = this.settingsToYaml(generated);
|
|
233
|
+
writeFileSync(settingsPath, yamlContent, 'utf-8');
|
|
234
|
+
created.push(settingsPath);
|
|
235
|
+
}
|
|
236
|
+
// Create AIDER.md knowledge doc
|
|
237
|
+
const knowledgeDocPath = this.getKnowledgeDocPath();
|
|
238
|
+
if (!existsSync(knowledgeDocPath)) {
|
|
239
|
+
const projectName = config.projectDir.split(/[/\\]/).pop() ?? 'Project';
|
|
240
|
+
writeFileSync(knowledgeDocPath, this.generateKnowledgeDoc(projectName), 'utf-8');
|
|
241
|
+
created.push(knowledgeDocPath);
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
skipped.push(knowledgeDocPath);
|
|
245
|
+
}
|
|
246
|
+
// Create .scale/.gitignore
|
|
247
|
+
const gitignorePath = join(this.scaleDir, '.gitignore');
|
|
248
|
+
if (!existsSync(gitignorePath)) {
|
|
249
|
+
writeFileSync(gitignorePath, `*.db\n*.db-journal\nevents/\ncheckpoints/\nhooks/*.sh\n`, 'utf-8');
|
|
250
|
+
created.push(gitignorePath);
|
|
251
|
+
}
|
|
252
|
+
logger.info({ created: created.length, skipped: skipped.length }, 'SCALE init (aider) completed');
|
|
253
|
+
return {
|
|
254
|
+
settingsPath,
|
|
255
|
+
knowledgeDocPath,
|
|
256
|
+
scaleDir: this.scaleDir,
|
|
257
|
+
created,
|
|
258
|
+
skipped,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=AiderAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AiderAdapter.js","sourceRoot":"","sources":["../../src/adapters/AiderAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { IAgentAdapter, AdapterConfig, InitResult, SettingsJson } from './ClaudeCodeAdapter.js';
|
|
2
|
+
export declare class DoubaoAdapter implements IAgentAdapter {
|
|
3
|
+
readonly agentType = "doubao";
|
|
4
|
+
private projectDir;
|
|
5
|
+
private scaleDir;
|
|
6
|
+
getSettingsPath(): string;
|
|
7
|
+
getKnowledgeDocPath(): string;
|
|
8
|
+
getSkillsDir(): string;
|
|
9
|
+
isInstalled(): boolean;
|
|
10
|
+
generateSettings(): SettingsJson;
|
|
11
|
+
mergeSettings(existing: SettingsJson): SettingsJson;
|
|
12
|
+
generateKnowledgeDoc(projectName: string, techStack?: string[]): string;
|
|
13
|
+
init(config: AdapterConfig): Promise<InitResult>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
// SCALE Engine — Doubao Adapter
|
|
2
|
+
// 生成 .doubao/settings.json + .doubao/rules.md + .doubao/skills/
|
|
3
|
+
// Doubao: ByteDance AI assistant (https://www.doubao.com)
|
|
4
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { logger } from '../core/logger.js';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Doubao Adapter
|
|
9
|
+
// ============================================================================
|
|
10
|
+
export class DoubaoAdapter {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.agentType = 'doubao';
|
|
13
|
+
this.projectDir = '.';
|
|
14
|
+
this.scaleDir = '.scale';
|
|
15
|
+
}
|
|
16
|
+
getSettingsPath() {
|
|
17
|
+
return join(this.projectDir, '.doubao', 'settings.json');
|
|
18
|
+
}
|
|
19
|
+
getKnowledgeDocPath() {
|
|
20
|
+
return join(this.projectDir, '.doubao', 'rules.md');
|
|
21
|
+
}
|
|
22
|
+
getSkillsDir() {
|
|
23
|
+
return join(this.projectDir, '.doubao', 'skills');
|
|
24
|
+
}
|
|
25
|
+
isInstalled() {
|
|
26
|
+
return existsSync(join(this.projectDir, '.doubao'));
|
|
27
|
+
}
|
|
28
|
+
generateSettings() {
|
|
29
|
+
return {
|
|
30
|
+
hooks: {
|
|
31
|
+
'pre-tool-use': [
|
|
32
|
+
{ matcher: 'Bash', command: 'scale gate pre-tool Bash --args-json "$ARGS" --session-id "$SESSION_ID"' },
|
|
33
|
+
{ matcher: 'Edit|Write', command: 'scale gate pre-tool Edit --args-json "$ARGS" --session-id "$SESSION_ID"' },
|
|
34
|
+
],
|
|
35
|
+
'post-tool-use': [
|
|
36
|
+
{ matcher: 'Edit|Write', command: 'scale gate post-tool Edit --args-json "$ARGS" --exit-code "$EXIT_CODE" --session-id "$SESSION_ID"' },
|
|
37
|
+
{ matcher: 'Bash', command: 'scale gate post-tool Bash --args-json "$ARGS" --exit-code "$EXIT_CODE" --session-id "$SESSION_ID"' },
|
|
38
|
+
],
|
|
39
|
+
'stop': [
|
|
40
|
+
{ matcher: '', command: 'scale gate before-stop --session-id "$SESSION_ID"' },
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
permissions: {
|
|
44
|
+
allow: ['scale:*'],
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
mergeSettings(existing) {
|
|
49
|
+
const generated = this.generateSettings();
|
|
50
|
+
const merged = { ...existing };
|
|
51
|
+
if (!merged.hooks)
|
|
52
|
+
merged.hooks = {};
|
|
53
|
+
for (const [hookType, entries] of Object.entries(generated.hooks)) {
|
|
54
|
+
if (!merged.hooks[hookType])
|
|
55
|
+
merged.hooks[hookType] = [];
|
|
56
|
+
for (const entry of entries) {
|
|
57
|
+
const alreadyExists = merged.hooks[hookType].some((e) => e.command.includes('scale '));
|
|
58
|
+
if (!alreadyExists) {
|
|
59
|
+
merged.hooks[hookType].push(entry);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (!merged.permissions)
|
|
64
|
+
merged.permissions = {};
|
|
65
|
+
if (!merged.permissions.allow)
|
|
66
|
+
merged.permissions.allow = [];
|
|
67
|
+
for (const perm of generated.permissions.allow) {
|
|
68
|
+
if (!merged.permissions.allow.includes(perm)) {
|
|
69
|
+
merged.permissions.allow.push(perm);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return merged;
|
|
73
|
+
}
|
|
74
|
+
generateKnowledgeDoc(projectName, techStack = []) {
|
|
75
|
+
const stackLine = techStack.length > 0
|
|
76
|
+
? `\n## Tech Stack\n${techStack.map((t) => `- ${t}`).join('\n')}\n`
|
|
77
|
+
: '';
|
|
78
|
+
return `# ${projectName}
|
|
79
|
+
${stackLine}
|
|
80
|
+
## SCALE Engine Integration (Doubao)
|
|
81
|
+
|
|
82
|
+
This project uses SCALE Engine for AI engineering governance via Doubao (ByteDance AI).
|
|
83
|
+
|
|
84
|
+
### Commands
|
|
85
|
+
- \`scale create <type> <title>\` — Create artifact
|
|
86
|
+
- \`scale transition <id> <action>\` — Transition artifact state
|
|
87
|
+
- \`scale list --type Spec\` — List artifacts
|
|
88
|
+
- \`scale role activate <role>\` — Switch role
|
|
89
|
+
- \`scale doctor\` — Health check
|
|
90
|
+
|
|
91
|
+
### Workflow
|
|
92
|
+
1. **Explore** → Role: explorer (Read/Grep only)
|
|
93
|
+
2. **Plan** → Create Spec → refine → approve (guard: ambiguity ≤ 0.2)
|
|
94
|
+
3. **Implement** → Role: implementer (Edit/Write/Bash unlocked)
|
|
95
|
+
4. **Verify** → Must run tests before claiming done
|
|
96
|
+
5. **Learn** → Defects → Lessons → Rules → Hooks
|
|
97
|
+
|
|
98
|
+
### Rules
|
|
99
|
+
- 🔴 Dangerous commands are physically blocked
|
|
100
|
+
- 🔴 Hardcoded secrets are blocked on Edit/Write
|
|
101
|
+
- 🟡 3 identical retries triggers brute-retry detection
|
|
102
|
+
- 🟡 Claiming done without running tests is blocked
|
|
103
|
+
- 🟢 All tool calls are tracked in .scale/events/
|
|
104
|
+
|
|
105
|
+
### Doubao-Specific Notes
|
|
106
|
+
- Doubao supports Chinese-optimized reasoning
|
|
107
|
+
- Use Doubao for Chinese documentation and analysis
|
|
108
|
+
- This rules.md file provides AI assistant context
|
|
109
|
+
- SCALE hooks are defined in \`.doubao/settings.json\`
|
|
110
|
+
- ByteDance Trae IDE users may also use \`scale init --agent trae\`
|
|
111
|
+
`;
|
|
112
|
+
}
|
|
113
|
+
async init(config) {
|
|
114
|
+
this.projectDir = config.projectDir;
|
|
115
|
+
this.scaleDir = config.scaleDir ?? join(config.projectDir, '.scale');
|
|
116
|
+
const created = [];
|
|
117
|
+
const skipped = [];
|
|
118
|
+
// 1. Create .scale/ directory structure
|
|
119
|
+
for (const dir of ['events', 'artifacts', 'rules', 'hooks', 'checkpoints']) {
|
|
120
|
+
const fullDir = join(this.scaleDir, dir);
|
|
121
|
+
if (!existsSync(fullDir)) {
|
|
122
|
+
mkdirSync(fullDir, { recursive: true });
|
|
123
|
+
created.push(fullDir);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
skipped.push(fullDir);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// 2. Create .doubao/ directory + settings.json
|
|
130
|
+
const doubaoDir = join(this.projectDir, '.doubao');
|
|
131
|
+
if (!existsSync(doubaoDir)) {
|
|
132
|
+
mkdirSync(doubaoDir, { recursive: true });
|
|
133
|
+
created.push(doubaoDir);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
skipped.push(doubaoDir);
|
|
137
|
+
}
|
|
138
|
+
const settingsPath = this.getSettingsPath();
|
|
139
|
+
if (existsSync(settingsPath)) {
|
|
140
|
+
const existing = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
141
|
+
const merged = this.mergeSettings(existing);
|
|
142
|
+
writeFileSync(settingsPath, JSON.stringify(merged, null, 2), 'utf-8');
|
|
143
|
+
skipped.push(settingsPath + ' (merged)');
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
writeFileSync(settingsPath, JSON.stringify(this.generateSettings(), null, 2), 'utf-8');
|
|
147
|
+
created.push(settingsPath);
|
|
148
|
+
}
|
|
149
|
+
// 3. Create skills directory
|
|
150
|
+
const skillsDir = this.getSkillsDir();
|
|
151
|
+
if (!existsSync(skillsDir)) {
|
|
152
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
153
|
+
created.push(skillsDir);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
skipped.push(skillsDir);
|
|
157
|
+
}
|
|
158
|
+
// 4. Create .doubao/rules.md (knowledge document)
|
|
159
|
+
const knowledgeDocPath = this.getKnowledgeDocPath();
|
|
160
|
+
if (!existsSync(knowledgeDocPath)) {
|
|
161
|
+
const projectName = config.projectDir.split(/[/\\]/).pop() ?? 'Project';
|
|
162
|
+
writeFileSync(knowledgeDocPath, this.generateKnowledgeDoc(projectName), 'utf-8');
|
|
163
|
+
created.push(knowledgeDocPath);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
skipped.push(knowledgeDocPath);
|
|
167
|
+
}
|
|
168
|
+
// 5. .gitignore
|
|
169
|
+
const gitignorePath = join(this.scaleDir, '.gitignore');
|
|
170
|
+
if (!existsSync(gitignorePath)) {
|
|
171
|
+
writeFileSync(gitignorePath, `*.db\n*.db-journal\nevents/\ncheckpoints/\nhooks/*.sh\n`, 'utf-8');
|
|
172
|
+
created.push(gitignorePath);
|
|
173
|
+
}
|
|
174
|
+
logger.info({ created: created.length, skipped: skipped.length }, 'SCALE init (doubao) completed');
|
|
175
|
+
return {
|
|
176
|
+
settingsPath,
|
|
177
|
+
knowledgeDocPath,
|
|
178
|
+
scaleDir: this.scaleDir,
|
|
179
|
+
created,
|
|
180
|
+
skipped,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=DoubaoAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DoubaoAdapter.js","sourceRoot":"","sources":["../../src/adapters/DoubaoAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { IAgentAdapter, AdapterConfig, InitResult, SettingsJson } from './ClaudeCodeAdapter.js';
|
|
2
|
+
export declare class KimiAdapter implements IAgentAdapter {
|
|
3
|
+
readonly agentType = "kimi";
|
|
4
|
+
private projectDir;
|
|
5
|
+
private scaleDir;
|
|
6
|
+
getSettingsPath(): string;
|
|
7
|
+
getKnowledgeDocPath(): string;
|
|
8
|
+
getSkillsDir(): string;
|
|
9
|
+
isInstalled(): boolean;
|
|
10
|
+
generateSettings(): SettingsJson;
|
|
11
|
+
mergeSettings(existing: SettingsJson): SettingsJson;
|
|
12
|
+
generateKnowledgeDoc(projectName: string, techStack?: string[]): string;
|
|
13
|
+
init(config: AdapterConfig): Promise<InitResult>;
|
|
14
|
+
}
|