@hongmaple0820/scale-engine 0.3.0 → 0.6.0
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/LICENSE +15 -15
- package/README.md +1004 -64
- package/dist/adapters/ClaudeCodeAdapter.d.ts +2 -2
- package/dist/adapters/ClaudeCodeAdapter.js +33 -45
- package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
- package/dist/adapters/CodexAdapter.js +28 -28
- package/dist/adapters/CursorAdapter.d.ts +14 -0
- package/dist/adapters/CursorAdapter.js +169 -0
- package/dist/adapters/CursorAdapter.js.map +1 -0
- package/dist/adapters/GeminiAdapter.d.ts +13 -0
- package/dist/adapters/GeminiAdapter.js +157 -0
- package/dist/adapters/GeminiAdapter.js.map +1 -0
- package/dist/adapters/HermesAdapter.d.ts +13 -0
- package/dist/adapters/HermesAdapter.js +157 -0
- package/dist/adapters/HermesAdapter.js.map +1 -0
- package/dist/adapters/OpenClawAdapter.d.ts +13 -0
- package/dist/adapters/OpenClawAdapter.js +157 -0
- package/dist/adapters/OpenClawAdapter.js.map +1 -0
- package/dist/adapters/OpenCodeAdapter.d.ts +14 -0
- package/dist/adapters/OpenCodeAdapter.js +170 -0
- package/dist/adapters/OpenCodeAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts +17 -0
- package/dist/adapters/index.js +42 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/api/cli.js +227 -9
- package/dist/api/cli.js.map +1 -1
- package/dist/artifact/fsm.d.ts +5 -0
- package/dist/artifact/fsm.js +24 -0
- package/dist/artifact/fsm.js.map +1 -1
- package/dist/artifact/fsmDefinitions.js +41 -1
- package/dist/artifact/fsmDefinitions.js.map +1 -1
- package/dist/artifact/sqliteStore.js +89 -89
- package/dist/artifact/types.d.ts +62 -1
- package/dist/artifact/types.js +27 -0
- package/dist/artifact/types.js.map +1 -1
- package/dist/context/ContextBuilder.d.ts +5 -1
- package/dist/context/ContextBuilder.js +90 -5
- package/dist/context/ContextBuilder.js.map +1 -1
- package/dist/evolution/EvolutionEngine.js +31 -31
- package/dist/guardrails/advancedDetectors.d.ts +12 -0
- package/dist/guardrails/advancedDetectors.js +50 -2
- package/dist/guardrails/advancedDetectors.js.map +1 -1
- package/dist/index.d.ts +8 -3
- package/dist/index.js +23 -4
- package/dist/index.js.map +1 -1
- package/dist/knowledge/SQLiteKnowledgeBase.d.ts +28 -0
- package/dist/knowledge/SQLiteKnowledgeBase.js +177 -0
- package/dist/knowledge/SQLiteKnowledgeBase.js.map +1 -0
- package/dist/skills/SkillDiscovery.d.ts +28 -0
- package/dist/skills/SkillDiscovery.js +171 -0
- package/dist/skills/SkillDiscovery.js.map +1 -0
- package/dist/tasks/TaskEngine.js +24 -0
- package/dist/tasks/TaskEngine.js.map +1 -1
- package/dist/workflows/presets.d.ts +34 -0
- package/dist/workflows/presets.js +224 -0
- package/dist/workflows/presets.js.map +1 -0
- package/package.json +54 -48
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// SCALE Engine — Hermes Adapter
|
|
2
|
+
// 生成 .hermes/settings.json + .hermes.md
|
|
3
|
+
// Hermes: https://github.com/hermes-ai/hermes
|
|
4
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { logger } from '../core/logger.js';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Hermes Adapter
|
|
9
|
+
// ============================================================================
|
|
10
|
+
export class HermesAdapter {
|
|
11
|
+
agentType = 'hermes';
|
|
12
|
+
projectDir = '.';
|
|
13
|
+
scaleDir = '.scale';
|
|
14
|
+
getSettingsPath() {
|
|
15
|
+
return join(this.projectDir, '.hermes', 'settings.json');
|
|
16
|
+
}
|
|
17
|
+
getKnowledgeDocPath() {
|
|
18
|
+
return join(this.projectDir, '.hermes.md');
|
|
19
|
+
}
|
|
20
|
+
isInstalled() {
|
|
21
|
+
return existsSync(join(this.projectDir, '.hermes'));
|
|
22
|
+
}
|
|
23
|
+
generateSettings() {
|
|
24
|
+
return {
|
|
25
|
+
hooks: {
|
|
26
|
+
'pre-exec': [
|
|
27
|
+
{ matcher: '', command: 'scale gate pre-tool Bash --args-json "$ARGS" --session-id "$SESSION_ID"' },
|
|
28
|
+
{ matcher: 'edit|write', command: 'scale gate pre-tool Edit --args-json "$ARGS" --session-id "$SESSION_ID"' },
|
|
29
|
+
],
|
|
30
|
+
'post-exec': [
|
|
31
|
+
{ matcher: 'edit|write', command: 'scale gate post-tool Edit --args-json "$ARGS" --exit-code "$EXIT_CODE" --session-id "$SESSION_ID"' },
|
|
32
|
+
{ matcher: '', command: 'scale gate post-tool Bash --args-json "$ARGS" --exit-code "$EXIT_CODE" --session-id "$SESSION_ID"' },
|
|
33
|
+
],
|
|
34
|
+
'before-stop': [
|
|
35
|
+
{ matcher: '', command: 'scale gate before-stop --session-id "$SESSION_ID"' },
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
permissions: {
|
|
39
|
+
allow: ['scale:*'],
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
mergeSettings(existing) {
|
|
44
|
+
const generated = this.generateSettings();
|
|
45
|
+
const merged = { ...existing };
|
|
46
|
+
if (!merged.hooks)
|
|
47
|
+
merged.hooks = {};
|
|
48
|
+
for (const [hookType, entries] of Object.entries(generated.hooks)) {
|
|
49
|
+
if (!merged.hooks[hookType])
|
|
50
|
+
merged.hooks[hookType] = [];
|
|
51
|
+
for (const entry of entries) {
|
|
52
|
+
const alreadyExists = merged.hooks[hookType].some((e) => e.command.includes('scale '));
|
|
53
|
+
if (!alreadyExists) {
|
|
54
|
+
merged.hooks[hookType].push(entry);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (!merged.permissions)
|
|
59
|
+
merged.permissions = {};
|
|
60
|
+
if (!merged.permissions.allow)
|
|
61
|
+
merged.permissions.allow = [];
|
|
62
|
+
for (const perm of generated.permissions.allow) {
|
|
63
|
+
if (!merged.permissions.allow.includes(perm)) {
|
|
64
|
+
merged.permissions.allow.push(perm);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return merged;
|
|
68
|
+
}
|
|
69
|
+
generateKnowledgeDoc(projectName, techStack = []) {
|
|
70
|
+
const stackLine = techStack.length > 0
|
|
71
|
+
? `\n## Tech Stack\n${techStack.map((t) => `- ${t}`).join('\n')}\n`
|
|
72
|
+
: '';
|
|
73
|
+
return `# ${projectName}
|
|
74
|
+
${stackLine}
|
|
75
|
+
## SCALE Engine Integration (Hermes)
|
|
76
|
+
|
|
77
|
+
This project uses SCALE Engine for AI engineering governance via Hermes.
|
|
78
|
+
|
|
79
|
+
### Commands
|
|
80
|
+
- \`scale create <type> <title>\` — Create artifact
|
|
81
|
+
- \`scale transition <id> <action>\` — Transition artifact state
|
|
82
|
+
- \`scale list --type Spec\` — List artifacts
|
|
83
|
+
- \`scale role activate <role>\` — Switch role
|
|
84
|
+
- \`scale doctor\` — Health check
|
|
85
|
+
|
|
86
|
+
### Workflow
|
|
87
|
+
1. **Explore** → Role: explorer (Read/Grep only)
|
|
88
|
+
2. **Plan** → Create Spec → refine → approve (guard: ambiguity ≤ 0.2)
|
|
89
|
+
3. **Implement** → Role: implementer (Edit/Write/Bash unlocked)
|
|
90
|
+
4. **Verify** → Must run tests before claiming done
|
|
91
|
+
5. **Learn** → Defects → Lessons → Rules → Hooks
|
|
92
|
+
|
|
93
|
+
### Rules
|
|
94
|
+
- 🔴 Dangerous commands are physically blocked
|
|
95
|
+
- 🔴 Hardcoded secrets are blocked on Edit/Write
|
|
96
|
+
- 🟡 3 identical retries triggers brute-retry detection
|
|
97
|
+
- 🟡 Claiming done without running tests is blocked
|
|
98
|
+
- 🟢 All tool calls are tracked in .scale/events/
|
|
99
|
+
`;
|
|
100
|
+
}
|
|
101
|
+
async init(config) {
|
|
102
|
+
this.projectDir = config.projectDir;
|
|
103
|
+
this.scaleDir = config.scaleDir ?? join(config.projectDir, '.scale');
|
|
104
|
+
const created = [];
|
|
105
|
+
const skipped = [];
|
|
106
|
+
// 1. Create .scale/ directory structure
|
|
107
|
+
for (const dir of ['events', 'artifacts', 'rules', 'hooks', 'checkpoints']) {
|
|
108
|
+
const fullDir = join(this.scaleDir, dir);
|
|
109
|
+
if (!existsSync(fullDir)) {
|
|
110
|
+
mkdirSync(fullDir, { recursive: true });
|
|
111
|
+
created.push(fullDir);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
skipped.push(fullDir);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// 2. Create .hermes/ directory + settings.json
|
|
118
|
+
const hermesDir = join(this.projectDir, '.hermes');
|
|
119
|
+
mkdirSync(hermesDir, { recursive: true });
|
|
120
|
+
const settingsPath = this.getSettingsPath();
|
|
121
|
+
if (existsSync(settingsPath)) {
|
|
122
|
+
const existing = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
123
|
+
const merged = this.mergeSettings(existing);
|
|
124
|
+
writeFileSync(settingsPath, JSON.stringify(merged, null, 2), 'utf-8');
|
|
125
|
+
skipped.push(settingsPath + ' (merged)');
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
writeFileSync(settingsPath, JSON.stringify(this.generateSettings(), null, 2), 'utf-8');
|
|
129
|
+
created.push(settingsPath);
|
|
130
|
+
}
|
|
131
|
+
// 3. Create .hermes.md
|
|
132
|
+
const knowledgeDocPath = this.getKnowledgeDocPath();
|
|
133
|
+
if (!existsSync(knowledgeDocPath)) {
|
|
134
|
+
const projectName = config.projectDir.split(/[/\\]/).pop() ?? 'Project';
|
|
135
|
+
writeFileSync(knowledgeDocPath, this.generateKnowledgeDoc(projectName), 'utf-8');
|
|
136
|
+
created.push(knowledgeDocPath);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
skipped.push(knowledgeDocPath);
|
|
140
|
+
}
|
|
141
|
+
// 4. .gitignore
|
|
142
|
+
const gitignorePath = join(this.scaleDir, '.gitignore');
|
|
143
|
+
if (!existsSync(gitignorePath)) {
|
|
144
|
+
writeFileSync(gitignorePath, `*.db\n*.db-journal\nevents/\ncheckpoints/\nhooks/*.sh\n`, 'utf-8');
|
|
145
|
+
created.push(gitignorePath);
|
|
146
|
+
}
|
|
147
|
+
logger.info({ created: created.length, skipped: skipped.length }, 'SCALE init (hermes) completed');
|
|
148
|
+
return {
|
|
149
|
+
settingsPath,
|
|
150
|
+
knowledgeDocPath,
|
|
151
|
+
scaleDir: this.scaleDir,
|
|
152
|
+
created,
|
|
153
|
+
skipped,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=HermesAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HermesAdapter.js","sourceRoot":"","sources":["../../src/adapters/HermesAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { IAgentAdapter, AdapterConfig, InitResult, SettingsJson } from './ClaudeCodeAdapter.js';
|
|
2
|
+
export declare class OpenClawAdapter implements IAgentAdapter {
|
|
3
|
+
readonly agentType = "openclaw";
|
|
4
|
+
private projectDir;
|
|
5
|
+
private scaleDir;
|
|
6
|
+
getSettingsPath(): string;
|
|
7
|
+
getKnowledgeDocPath(): string;
|
|
8
|
+
isInstalled(): boolean;
|
|
9
|
+
generateSettings(): SettingsJson;
|
|
10
|
+
mergeSettings(existing: SettingsJson): SettingsJson;
|
|
11
|
+
generateKnowledgeDoc(projectName: string, techStack?: string[]): string;
|
|
12
|
+
init(config: AdapterConfig): Promise<InitResult>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// SCALE Engine — OpenClaw Adapter
|
|
2
|
+
// 生成 .openclaw/settings.json + AGENTS.md
|
|
3
|
+
// OpenClaw: https://github.com/openclaw-ai/openclaw
|
|
4
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { logger } from '../core/logger.js';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// OpenClaw Adapter
|
|
9
|
+
// ============================================================================
|
|
10
|
+
export class OpenClawAdapter {
|
|
11
|
+
agentType = 'openclaw';
|
|
12
|
+
projectDir = '.';
|
|
13
|
+
scaleDir = '.scale';
|
|
14
|
+
getSettingsPath() {
|
|
15
|
+
return join(this.projectDir, '.openclaw', 'settings.json');
|
|
16
|
+
}
|
|
17
|
+
getKnowledgeDocPath() {
|
|
18
|
+
return join(this.projectDir, 'AGENTS.md');
|
|
19
|
+
}
|
|
20
|
+
isInstalled() {
|
|
21
|
+
return existsSync(join(this.projectDir, '.openclaw'));
|
|
22
|
+
}
|
|
23
|
+
generateSettings() {
|
|
24
|
+
return {
|
|
25
|
+
hooks: {
|
|
26
|
+
'pre-exec': [
|
|
27
|
+
{ matcher: '', command: 'scale gate pre-tool Bash --args-json "$ARGS" --session-id "$SESSION_ID"' },
|
|
28
|
+
{ matcher: 'edit|write', command: 'scale gate pre-tool Edit --args-json "$ARGS" --session-id "$SESSION_ID"' },
|
|
29
|
+
],
|
|
30
|
+
'post-exec': [
|
|
31
|
+
{ matcher: 'edit|write', command: 'scale gate post-tool Edit --args-json "$ARGS" --exit-code "$EXIT_CODE" --session-id "$SESSION_ID"' },
|
|
32
|
+
{ matcher: '', command: 'scale gate post-tool Bash --args-json "$ARGS" --exit-code "$EXIT_CODE" --session-id "$SESSION_ID"' },
|
|
33
|
+
],
|
|
34
|
+
'before-stop': [
|
|
35
|
+
{ matcher: '', command: 'scale gate before-stop --session-id "$SESSION_ID"' },
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
permissions: {
|
|
39
|
+
allow: ['scale:*'],
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
mergeSettings(existing) {
|
|
44
|
+
const generated = this.generateSettings();
|
|
45
|
+
const merged = { ...existing };
|
|
46
|
+
if (!merged.hooks)
|
|
47
|
+
merged.hooks = {};
|
|
48
|
+
for (const [hookType, entries] of Object.entries(generated.hooks)) {
|
|
49
|
+
if (!merged.hooks[hookType])
|
|
50
|
+
merged.hooks[hookType] = [];
|
|
51
|
+
for (const entry of entries) {
|
|
52
|
+
const alreadyExists = merged.hooks[hookType].some((e) => e.command.includes('scale '));
|
|
53
|
+
if (!alreadyExists) {
|
|
54
|
+
merged.hooks[hookType].push(entry);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (!merged.permissions)
|
|
59
|
+
merged.permissions = {};
|
|
60
|
+
if (!merged.permissions.allow)
|
|
61
|
+
merged.permissions.allow = [];
|
|
62
|
+
for (const perm of generated.permissions.allow) {
|
|
63
|
+
if (!merged.permissions.allow.includes(perm)) {
|
|
64
|
+
merged.permissions.allow.push(perm);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return merged;
|
|
68
|
+
}
|
|
69
|
+
generateKnowledgeDoc(projectName, techStack = []) {
|
|
70
|
+
const stackLine = techStack.length > 0
|
|
71
|
+
? `\n## Tech Stack\n${techStack.map((t) => `- ${t}`).join('\n')}\n`
|
|
72
|
+
: '';
|
|
73
|
+
return `# ${projectName}
|
|
74
|
+
${stackLine}
|
|
75
|
+
## SCALE Engine Integration (OpenClaw)
|
|
76
|
+
|
|
77
|
+
This project uses SCALE Engine for AI engineering governance via OpenClaw.
|
|
78
|
+
|
|
79
|
+
### Commands
|
|
80
|
+
- \`scale create <type> <title>\` — Create artifact
|
|
81
|
+
- \`scale transition <id> <action>\` — Transition artifact state
|
|
82
|
+
- \`scale list --type Spec\` — List artifacts
|
|
83
|
+
- \`scale role activate <role>\` — Switch role
|
|
84
|
+
- \`scale doctor\` — Health check
|
|
85
|
+
|
|
86
|
+
### Workflow
|
|
87
|
+
1. **Explore** → Role: explorer (Read/Grep only)
|
|
88
|
+
2. **Plan** → Create Spec → refine → approve (guard: ambiguity ≤ 0.2)
|
|
89
|
+
3. **Implement** → Role: implementer (Edit/Write/Bash unlocked)
|
|
90
|
+
4. **Verify** → Must run tests before claiming done
|
|
91
|
+
5. **Learn** → Defects → Lessons → Rules → Hooks
|
|
92
|
+
|
|
93
|
+
### Rules
|
|
94
|
+
- 🔴 Dangerous commands are physically blocked
|
|
95
|
+
- 🔴 Hardcoded secrets are blocked on Edit/Write
|
|
96
|
+
- 🟡 3 identical retries triggers brute-retry detection
|
|
97
|
+
- 🟡 Claiming done without running tests is blocked
|
|
98
|
+
- 🟢 All tool calls are tracked in .scale/events/
|
|
99
|
+
`;
|
|
100
|
+
}
|
|
101
|
+
async init(config) {
|
|
102
|
+
this.projectDir = config.projectDir;
|
|
103
|
+
this.scaleDir = config.scaleDir ?? join(config.projectDir, '.scale');
|
|
104
|
+
const created = [];
|
|
105
|
+
const skipped = [];
|
|
106
|
+
// 1. Create .scale/ directory structure
|
|
107
|
+
for (const dir of ['events', 'artifacts', 'rules', 'hooks', 'checkpoints']) {
|
|
108
|
+
const fullDir = join(this.scaleDir, dir);
|
|
109
|
+
if (!existsSync(fullDir)) {
|
|
110
|
+
mkdirSync(fullDir, { recursive: true });
|
|
111
|
+
created.push(fullDir);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
skipped.push(fullDir);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// 2. Create .openclaw/ directory + settings.json
|
|
118
|
+
const openclawDir = join(this.projectDir, '.openclaw');
|
|
119
|
+
mkdirSync(openclawDir, { recursive: true });
|
|
120
|
+
const settingsPath = this.getSettingsPath();
|
|
121
|
+
if (existsSync(settingsPath)) {
|
|
122
|
+
const existing = JSON.parse(readFileSync(settingsPath, 'utf-8'));
|
|
123
|
+
const merged = this.mergeSettings(existing);
|
|
124
|
+
writeFileSync(settingsPath, JSON.stringify(merged, null, 2), 'utf-8');
|
|
125
|
+
skipped.push(settingsPath + ' (merged)');
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
writeFileSync(settingsPath, JSON.stringify(this.generateSettings(), null, 2), 'utf-8');
|
|
129
|
+
created.push(settingsPath);
|
|
130
|
+
}
|
|
131
|
+
// 3. Create AGENTS.md
|
|
132
|
+
const knowledgeDocPath = this.getKnowledgeDocPath();
|
|
133
|
+
if (!existsSync(knowledgeDocPath)) {
|
|
134
|
+
const projectName = config.projectDir.split(/[/\\]/).pop() ?? 'Project';
|
|
135
|
+
writeFileSync(knowledgeDocPath, this.generateKnowledgeDoc(projectName), 'utf-8');
|
|
136
|
+
created.push(knowledgeDocPath);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
skipped.push(knowledgeDocPath);
|
|
140
|
+
}
|
|
141
|
+
// 4. .gitignore
|
|
142
|
+
const gitignorePath = join(this.scaleDir, '.gitignore');
|
|
143
|
+
if (!existsSync(gitignorePath)) {
|
|
144
|
+
writeFileSync(gitignorePath, `*.db\n*.db-journal\nevents/\ncheckpoints/\nhooks/*.sh\n`, 'utf-8');
|
|
145
|
+
created.push(gitignorePath);
|
|
146
|
+
}
|
|
147
|
+
logger.info({ created: created.length, skipped: skipped.length }, 'SCALE init (openclaw) completed');
|
|
148
|
+
return {
|
|
149
|
+
settingsPath,
|
|
150
|
+
knowledgeDocPath,
|
|
151
|
+
scaleDir: this.scaleDir,
|
|
152
|
+
created,
|
|
153
|
+
skipped,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=OpenClawAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenClawAdapter.js","sourceRoot":"","sources":["../../src/adapters/OpenClawAdapter.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 OpenCodeAdapter implements IAgentAdapter {
|
|
3
|
+
readonly agentType = "opencode";
|
|
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,170 @@
|
|
|
1
|
+
// SCALE Engine — OpenCode Adapter
|
|
2
|
+
// 生成 ~/.config/opencode/hooks.json + AGENTS.md + skills/
|
|
3
|
+
// OpenCode: https://github.com/opencode-ai/opencode
|
|
4
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { homedir } from 'node:os';
|
|
7
|
+
import { logger } from '../core/logger.js';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// OpenCode Adapter
|
|
10
|
+
// ============================================================================
|
|
11
|
+
export class OpenCodeAdapter {
|
|
12
|
+
agentType = 'opencode';
|
|
13
|
+
projectDir = '.';
|
|
14
|
+
scaleDir = '.scale';
|
|
15
|
+
getSettingsPath() {
|
|
16
|
+
return join(homedir(), '.config', 'opencode', 'hooks.json');
|
|
17
|
+
}
|
|
18
|
+
getKnowledgeDocPath() {
|
|
19
|
+
return join(this.projectDir, 'AGENTS.md');
|
|
20
|
+
}
|
|
21
|
+
getSkillsDir() {
|
|
22
|
+
return join(homedir(), '.config', 'opencode', 'skills');
|
|
23
|
+
}
|
|
24
|
+
isInstalled() {
|
|
25
|
+
return existsSync(join(homedir(), '.config', 'opencode'));
|
|
26
|
+
}
|
|
27
|
+
generateSettings() {
|
|
28
|
+
return {
|
|
29
|
+
hooks: {
|
|
30
|
+
'pre-exec': [
|
|
31
|
+
{ matcher: '', command: 'scale gate pre-tool Bash --args-json "$ARGS" --session-id "$SESSION_ID"' },
|
|
32
|
+
{ matcher: 'edit|write', command: 'scale gate pre-tool Edit --args-json "$ARGS" --session-id "$SESSION_ID"' },
|
|
33
|
+
],
|
|
34
|
+
'post-exec': [
|
|
35
|
+
{ matcher: 'edit|write', command: 'scale gate post-tool Edit --args-json "$ARGS" --exit-code "$EXIT_CODE" --session-id "$SESSION_ID"' },
|
|
36
|
+
{ matcher: '', command: 'scale gate post-tool Bash --args-json "$ARGS" --exit-code "$EXIT_CODE" --session-id "$SESSION_ID"' },
|
|
37
|
+
],
|
|
38
|
+
'before-stop': [
|
|
39
|
+
{ matcher: '', command: 'scale gate before-stop --session-id "$SESSION_ID"' },
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
permissions: {
|
|
43
|
+
allow: ['scale:*'],
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
mergeSettings(existing) {
|
|
48
|
+
const generated = this.generateSettings();
|
|
49
|
+
const merged = { ...existing };
|
|
50
|
+
if (!merged.hooks)
|
|
51
|
+
merged.hooks = {};
|
|
52
|
+
for (const [hookType, entries] of Object.entries(generated.hooks)) {
|
|
53
|
+
if (!merged.hooks[hookType])
|
|
54
|
+
merged.hooks[hookType] = [];
|
|
55
|
+
for (const entry of entries) {
|
|
56
|
+
const alreadyExists = merged.hooks[hookType].some((e) => e.command.includes('scale '));
|
|
57
|
+
if (!alreadyExists) {
|
|
58
|
+
merged.hooks[hookType].push(entry);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!merged.permissions)
|
|
63
|
+
merged.permissions = {};
|
|
64
|
+
if (!merged.permissions.allow)
|
|
65
|
+
merged.permissions.allow = [];
|
|
66
|
+
for (const perm of generated.permissions.allow) {
|
|
67
|
+
if (!merged.permissions.allow.includes(perm)) {
|
|
68
|
+
merged.permissions.allow.push(perm);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return merged;
|
|
72
|
+
}
|
|
73
|
+
generateKnowledgeDoc(projectName, techStack = []) {
|
|
74
|
+
const stackLine = techStack.length > 0
|
|
75
|
+
? `\n## Tech Stack\n${techStack.map((t) => `- ${t}`).join('\n')}\n`
|
|
76
|
+
: '';
|
|
77
|
+
return `# ${projectName}
|
|
78
|
+
${stackLine}
|
|
79
|
+
## SCALE Engine Integration (OpenCode)
|
|
80
|
+
|
|
81
|
+
This project uses SCALE Engine for AI engineering governance via OpenCode.
|
|
82
|
+
|
|
83
|
+
### Commands
|
|
84
|
+
- \`scale create <type> <title>\` — Create artifact
|
|
85
|
+
- \`scale transition <id> <action>\` — Transition artifact state
|
|
86
|
+
- \`scale list --type Spec\` — List artifacts
|
|
87
|
+
- \`scale role activate <role>\` — Switch role
|
|
88
|
+
- \`scale doctor\` — Health check
|
|
89
|
+
|
|
90
|
+
### Workflow
|
|
91
|
+
1. **Explore** → Role: explorer (Read/Grep only)
|
|
92
|
+
2. **Plan** → Create Spec → refine → approve (guard: ambiguity ≤ 0.2)
|
|
93
|
+
3. **Implement** → Role: implementer (Edit/Write/Bash unlocked)
|
|
94
|
+
4. **Verify** → Must run tests before claiming done
|
|
95
|
+
5. **Learn** → Defects → Lessons → Rules → Hooks
|
|
96
|
+
|
|
97
|
+
### Rules
|
|
98
|
+
- 🔴 Dangerous commands are physically blocked
|
|
99
|
+
- 🔴 Hardcoded secrets are blocked on Edit/Write
|
|
100
|
+
- 🟡 3 identical retries triggers brute-retry detection
|
|
101
|
+
- 🟡 Claiming done without running tests is blocked
|
|
102
|
+
- 🟢 All tool calls are tracked in .scale/events/
|
|
103
|
+
`;
|
|
104
|
+
}
|
|
105
|
+
async init(config) {
|
|
106
|
+
this.projectDir = config.projectDir;
|
|
107
|
+
this.scaleDir = config.scaleDir ?? join(config.projectDir, '.scale');
|
|
108
|
+
const created = [];
|
|
109
|
+
const skipped = [];
|
|
110
|
+
// 1. Create .scale/ directory structure
|
|
111
|
+
for (const dir of ['events', 'artifacts', 'rules', 'hooks', 'checkpoints']) {
|
|
112
|
+
const fullDir = join(this.scaleDir, dir);
|
|
113
|
+
if (!existsSync(fullDir)) {
|
|
114
|
+
mkdirSync(fullDir, { recursive: true });
|
|
115
|
+
created.push(fullDir);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
skipped.push(fullDir);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// 2. Create ~/.config/opencode/ directory + hooks.json
|
|
122
|
+
const opencodeDir = join(homedir(), '.config', 'opencode');
|
|
123
|
+
mkdirSync(opencodeDir, { recursive: true });
|
|
124
|
+
const hooksPath = this.getSettingsPath();
|
|
125
|
+
if (existsSync(hooksPath)) {
|
|
126
|
+
const existing = JSON.parse(readFileSync(hooksPath, 'utf-8'));
|
|
127
|
+
const merged = this.mergeSettings(existing);
|
|
128
|
+
writeFileSync(hooksPath, JSON.stringify(merged, null, 2), 'utf-8');
|
|
129
|
+
skipped.push(hooksPath + ' (merged)');
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
writeFileSync(hooksPath, JSON.stringify(this.generateSettings(), null, 2), 'utf-8');
|
|
133
|
+
created.push(hooksPath);
|
|
134
|
+
}
|
|
135
|
+
// 3. Create skills directory
|
|
136
|
+
const skillsDir = this.getSkillsDir();
|
|
137
|
+
if (!existsSync(skillsDir)) {
|
|
138
|
+
mkdirSync(skillsDir, { recursive: true });
|
|
139
|
+
created.push(skillsDir);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
skipped.push(skillsDir);
|
|
143
|
+
}
|
|
144
|
+
// 4. Create AGENTS.md
|
|
145
|
+
const agentsPath = this.getKnowledgeDocPath();
|
|
146
|
+
if (!existsSync(agentsPath)) {
|
|
147
|
+
const projectName = config.projectDir.split(/[/\\]/).pop() ?? 'Project';
|
|
148
|
+
writeFileSync(agentsPath, this.generateKnowledgeDoc(projectName), 'utf-8');
|
|
149
|
+
created.push(agentsPath);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
skipped.push(agentsPath);
|
|
153
|
+
}
|
|
154
|
+
// 5. .gitignore
|
|
155
|
+
const gitignorePath = join(this.scaleDir, '.gitignore');
|
|
156
|
+
if (!existsSync(gitignorePath)) {
|
|
157
|
+
writeFileSync(gitignorePath, `*.db\n*.db-journal\nevents/\ncheckpoints/\nhooks/*.sh\n`, 'utf-8');
|
|
158
|
+
created.push(gitignorePath);
|
|
159
|
+
}
|
|
160
|
+
logger.info({ created: created.length, skipped: skipped.length }, 'SCALE init (opencode) completed');
|
|
161
|
+
return {
|
|
162
|
+
settingsPath: hooksPath,
|
|
163
|
+
knowledgeDocPath: agentsPath,
|
|
164
|
+
scaleDir: this.scaleDir,
|
|
165
|
+
created,
|
|
166
|
+
skipped,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=OpenCodeAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenCodeAdapter.js","sourceRoot":"","sources":["../../src/adapters/OpenCodeAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IAgentAdapter } from './ClaudeCodeAdapter.js';
|
|
2
|
+
import type { AgentPlatform } from '../artifact/types.js';
|
|
3
|
+
export type { IAgentAdapter, AdapterConfig, InitResult, SettingsJson, HookEntry } from './ClaudeCodeAdapter.js';
|
|
4
|
+
export { ClaudeCodeAdapter } from './ClaudeCodeAdapter.js';
|
|
5
|
+
export { CodexAdapter } from './CodexAdapter.js';
|
|
6
|
+
export { OpenCodeAdapter } from './OpenCodeAdapter.js';
|
|
7
|
+
export { CursorAdapter } from './CursorAdapter.js';
|
|
8
|
+
export { GeminiAdapter } from './GeminiAdapter.js';
|
|
9
|
+
export { OpenClawAdapter } from './OpenClawAdapter.js';
|
|
10
|
+
export { HermesAdapter } from './HermesAdapter.js';
|
|
11
|
+
/** All supported agent type identifiers */
|
|
12
|
+
export declare const SUPPORTED_AGENTS: AgentPlatform[];
|
|
13
|
+
/**
|
|
14
|
+
* Create an adapter instance for the given agent type.
|
|
15
|
+
* Throws if agent type is not supported.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createAdapter(agentType: string): IAgentAdapter;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// SCALE Engine — Unified Adapter Factory
|
|
2
|
+
// 统一导出所有 7 种 Agent Adapter + createAdapter 工厂函数
|
|
3
|
+
import { ClaudeCodeAdapter } from './ClaudeCodeAdapter.js';
|
|
4
|
+
import { CodexAdapter } from './CodexAdapter.js';
|
|
5
|
+
import { OpenCodeAdapter } from './OpenCodeAdapter.js';
|
|
6
|
+
import { CursorAdapter } from './CursorAdapter.js';
|
|
7
|
+
import { GeminiAdapter } from './GeminiAdapter.js';
|
|
8
|
+
import { OpenClawAdapter } from './OpenClawAdapter.js';
|
|
9
|
+
import { HermesAdapter } from './HermesAdapter.js';
|
|
10
|
+
export { ClaudeCodeAdapter } from './ClaudeCodeAdapter.js';
|
|
11
|
+
export { CodexAdapter } from './CodexAdapter.js';
|
|
12
|
+
export { OpenCodeAdapter } from './OpenCodeAdapter.js';
|
|
13
|
+
export { CursorAdapter } from './CursorAdapter.js';
|
|
14
|
+
export { GeminiAdapter } from './GeminiAdapter.js';
|
|
15
|
+
export { OpenClawAdapter } from './OpenClawAdapter.js';
|
|
16
|
+
export { HermesAdapter } from './HermesAdapter.js';
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Adapter Registry
|
|
19
|
+
// ============================================================================
|
|
20
|
+
const ADAPTER_MAP = {
|
|
21
|
+
'claude-code': ClaudeCodeAdapter,
|
|
22
|
+
'codex': CodexAdapter,
|
|
23
|
+
'opencode': OpenCodeAdapter,
|
|
24
|
+
'cursor': CursorAdapter,
|
|
25
|
+
'gemini': GeminiAdapter,
|
|
26
|
+
'openclaw': OpenClawAdapter,
|
|
27
|
+
'hermes': HermesAdapter,
|
|
28
|
+
};
|
|
29
|
+
/** All supported agent type identifiers */
|
|
30
|
+
export const SUPPORTED_AGENTS = Object.keys(ADAPTER_MAP);
|
|
31
|
+
/**
|
|
32
|
+
* Create an adapter instance for the given agent type.
|
|
33
|
+
* Throws if agent type is not supported.
|
|
34
|
+
*/
|
|
35
|
+
export function createAdapter(agentType) {
|
|
36
|
+
const AdapterClass = ADAPTER_MAP[agentType];
|
|
37
|
+
if (!AdapterClass) {
|
|
38
|
+
throw new Error(`Unsupported agent type: "${agentType}". Supported: ${SUPPORTED_AGENTS.join(', ')}`);
|
|
39
|
+
}
|
|
40
|
+
return new AdapterClass();
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,gDAAgD;AAGhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAKlD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,MAAM,WAAW,GAAmD;IAClE,aAAa,EAAE,iBAAiB;IAChC,OAAO,EAAE,YAAY;IACrB,UAAU,EAAE,eAAe;IAC3B,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,aAAa;IACvB,UAAU,EAAE,eAAe;IAC3B,QAAQ,EAAE,aAAa;CACxB,CAAA;AAED,2CAA2C;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAoB,CAAA;AAE3E;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,MAAM,YAAY,GAAG,WAAW,CAAC,SAA0B,CAAC,CAAA;IAC5D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,4BAA4B,SAAS,iBAAiB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpF,CAAA;IACH,CAAC;IACD,OAAO,IAAI,YAAY,EAAE,CAAA;AAC3B,CAAC"}
|