@hongmaple0820/scale-engine 0.2.0 → 0.5.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.
Files changed (42) hide show
  1. package/README.md +976 -64
  2. package/dist/adapters/ClaudeCodeAdapter.d.ts +2 -2
  3. package/dist/adapters/ClaudeCodeAdapter.js +33 -45
  4. package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
  5. package/dist/adapters/CursorAdapter.d.ts +14 -0
  6. package/dist/adapters/CursorAdapter.js +169 -0
  7. package/dist/adapters/CursorAdapter.js.map +1 -0
  8. package/dist/adapters/GeminiAdapter.d.ts +13 -0
  9. package/dist/adapters/GeminiAdapter.js +157 -0
  10. package/dist/adapters/GeminiAdapter.js.map +1 -0
  11. package/dist/adapters/HermesAdapter.d.ts +13 -0
  12. package/dist/adapters/HermesAdapter.js +157 -0
  13. package/dist/adapters/HermesAdapter.js.map +1 -0
  14. package/dist/adapters/OpenClawAdapter.d.ts +13 -0
  15. package/dist/adapters/OpenClawAdapter.js +157 -0
  16. package/dist/adapters/OpenClawAdapter.js.map +1 -0
  17. package/dist/adapters/OpenCodeAdapter.d.ts +14 -0
  18. package/dist/adapters/OpenCodeAdapter.js +170 -0
  19. package/dist/adapters/OpenCodeAdapter.js.map +1 -0
  20. package/dist/adapters/index.d.ts +17 -0
  21. package/dist/adapters/index.js +42 -0
  22. package/dist/adapters/index.js.map +1 -0
  23. package/dist/api/cli.js +295 -6
  24. package/dist/api/cli.js.map +1 -1
  25. package/dist/artifact/fsmDefinitions.js +41 -1
  26. package/dist/artifact/fsmDefinitions.js.map +1 -1
  27. package/dist/artifact/types.d.ts +62 -1
  28. package/dist/artifact/types.js +27 -0
  29. package/dist/artifact/types.js.map +1 -1
  30. package/dist/context/ContextBuilder.d.ts +32 -1
  31. package/dist/context/ContextBuilder.js +135 -5
  32. package/dist/context/ContextBuilder.js.map +1 -1
  33. package/dist/index.d.ts +5 -3
  34. package/dist/index.js +21 -4
  35. package/dist/index.js.map +1 -1
  36. package/dist/skills/SkillDiscovery.d.ts +28 -0
  37. package/dist/skills/SkillDiscovery.js +171 -0
  38. package/dist/skills/SkillDiscovery.js.map +1 -0
  39. package/dist/workflows/presets.d.ts +34 -0
  40. package/dist/workflows/presets.js +224 -0
  41. package/dist/workflows/presets.js.map +1 -0
  42. package/package.json +48 -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"}