@hongmaple0820/scale-engine 0.11.1 → 0.12.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.
@@ -0,0 +1,261 @@
1
+ // SCALE Engine — DeepSeek TUI Adapter
2
+ // 生成 .deepseek/config.toml (project overlay) + .deepseek/instructions.md
3
+ // DeepSeek TUI: https://github.com/Hmbown/deepseek-tui
4
+ //
5
+ // deepseek-tui 配置分层:
6
+ // 全局: ~/.deepseek/config.toml (支持 hooks)
7
+ // 项目覆盖: .deepseek/config.toml (#485, 仅顶层字段: provider/model/sandbox/approval 等)
8
+ // hooks 不支持项目级覆盖,需用户手动加到全局配置
9
+ //
10
+ // 参考: docs/CONFIGURATION.md, config.example.toml
11
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ import { homedir } from 'node:os';
14
+ import { logger } from '../core/logger.js';
15
+ // ============================================================================
16
+ // DeepSeek TUI Adapter
17
+ // ============================================================================
18
+ export class DeepSeekTuiAdapter {
19
+ constructor() {
20
+ this.agentType = 'deepseek-tui';
21
+ this.projectDir = '.';
22
+ this.scaleDir = '.scale';
23
+ }
24
+ getSettingsPath() {
25
+ return join(this.projectDir, '.deepseek', 'config.toml');
26
+ }
27
+ getKnowledgeDocPath() {
28
+ return join(this.projectDir, '.deepseek', 'instructions.md');
29
+ }
30
+ getSkillsDir() {
31
+ // deepseek-tui skills are global (same location as Claude Code compatible)
32
+ return join(homedir(), '.deepseek', 'skills');
33
+ }
34
+ isInstalled() {
35
+ return existsSync(join(this.projectDir, '.deepseek', 'instructions.md'));
36
+ }
37
+ generateSettings() {
38
+ // deepseek-tui 使用 TOML 格式,SettingsJson 仅用于接口兼容
39
+ // 实际 TOML 生成在 generateConfigToml() 中
40
+ return {
41
+ permissions: {
42
+ allow: ['scale:*'],
43
+ },
44
+ };
45
+ }
46
+ /**
47
+ * 生成 .deepseek/config.toml 项目覆盖配置
48
+ * 仅包含 #485 项目 overlay 支持的顶层字段
49
+ */
50
+ generateConfigToml(scenarioMode = 'standard') {
51
+ const sandboxMode = scenarioMode === 'sandbox' ? 'read-only' : 'workspace-write';
52
+ const approvalPolicy = scenarioMode === 'critical' ? 'on-request' : 'on-request';
53
+ let config = `# SCALE Engine — DeepSeek TUI Project Overlay (#485)
54
+ # 此文件仅覆盖全局 ~/.deepseek/config.toml 中的指定顶层字段。
55
+ # 完整配置参考: https://github.com/Hmbown/deepseek-tui/blob/main/config.example.toml
56
+
57
+ # ── SCALE 项目约束 ──
58
+ sandbox_mode = "${sandboxMode}"
59
+ approval_policy = "${approvalPolicy}"
60
+ `;
61
+ if (scenarioMode === 'critical') {
62
+ config += `
63
+ # 严格模式:禁用 shell 工具,强制通过 scale gate 命令执行
64
+ allow_shell = false
65
+ max_subagents = 5
66
+ `;
67
+ }
68
+ config += `
69
+ # ── SCALE Hooks 说明 ──
70
+ # deepseek-tui 的 hooks 不支持项目级覆盖,请将以下配置添加到
71
+ # 全局 ~/.deepseek/config.toml 的 [hooks] 段中:
72
+ #
73
+ # [hooks]
74
+ # enabled = true
75
+ # default_timeout_secs = 30
76
+ #
77
+ # [[hooks.hooks]]
78
+ # event = "session_start"
79
+ # command = "scale context inject --session-id $DEEPSEEK_SESSION_ID"
80
+ #
81
+ # [[hooks.hooks]]
82
+ # event = "tool_call_before"
83
+ # command = "scale gate pre-tool Bash --args-json '$TOOL_INPUT_JSON' --session-id $DEEPSEEK_SESSION_ID"
84
+ #
85
+ # [[hooks.hooks]]
86
+ # event = "tool_call_after"
87
+ # command = "scale gate post-tool Bash --exit-code '$TOOL_EXIT_CODE' --session-id $DEEPSEEK_SESSION_ID"
88
+ #
89
+ # [[hooks.hooks]]
90
+ # event = "session_end"
91
+ # command = "scale session end --session-id $DEEPSEEK_SESSION_ID"
92
+ `;
93
+ return config;
94
+ }
95
+ mergeSettings(existing) {
96
+ const generated = this.generateSettings();
97
+ const merged = { ...existing };
98
+ if (!merged.permissions)
99
+ merged.permissions = {};
100
+ if (!merged.permissions.allow)
101
+ merged.permissions.allow = [];
102
+ for (const perm of generated.permissions.allow) {
103
+ if (!merged.permissions.allow.includes(perm)) {
104
+ merged.permissions.allow.push(perm);
105
+ }
106
+ }
107
+ return merged;
108
+ }
109
+ generateKnowledgeDoc(projectName, techStack = []) {
110
+ const stackLine = techStack.length > 0
111
+ ? `\n## Tech Stack\n${techStack.map((t) => `- ${t}`).join('\n')}\n`
112
+ : '';
113
+ return `# ${projectName}
114
+ ${stackLine}
115
+ ## SCALE Engine Integration (DeepSeek TUI)
116
+
117
+ This project uses SCALE Engine for AI engineering governance via DeepSeek TUI.
118
+
119
+ ### Phase Workflow (六阶段交付链路)
120
+
121
+ \`\`\`
122
+ define → plan → build → verify → review → ship
123
+ \`\`\`
124
+
125
+ 每个阶段有明确的质量门禁,guard 失败时阻断流程而非继续。
126
+
127
+ ### Commands
128
+
129
+ - \`scale define "<description>" --success-criteria "..." \` — 创建 Spec artifact
130
+ - \`scale plan <spec-id> --rollback "..."\` — 创建 Plan artifact
131
+ - \`scale build <plan-id> --description "..."\` — 创建 Task artifact
132
+ - \`scale verify <task-id>\` — 运行验证门禁 (build/lint/test/coverage)
133
+ - \`scale review <task-id>\` — 代码 review,生成持久化 review 证据
134
+ - \`scale ship <task-id> --message "feat: ..."\` — 发布(强制校验 verify + review 证据)
135
+ - \`scale ship <task-id> --no-commit\` — 仅生成交付报告,不创建 commit
136
+ - \`scale status --json\` — 查看当前 artifact 状态和 blocker
137
+ - \`scale doctor\` — 健康检查
138
+
139
+ ### Workflow
140
+
141
+ 1. **DEFINE** → 创建 Spec,明确成功标准和边界
142
+ 2. **PLAN** → 技术方案设计,评估风险和复杂度
143
+ 3. **BUILD** → 实现阶段,Task FSM 追踪状态
144
+ 4. **VERIFY** → 运行测试/构建/lint,证据持久化到 .scale/
145
+ 5. **REVIEW** → 确定性 review scanner 检查代码质量
146
+ 6. **SHIP** → 强制校验 verify + review 证据后交付
147
+
148
+ ### Safety Model
149
+
150
+ | 层级 | 作用 |
151
+ |------|------|
152
+ | FSM | 阻止非法 artifact 状态流转 |
153
+ | GateSystem | 执行 build/lint/test/coverage/security 门禁 |
154
+ | EvidenceStore | 持久化验证证据 (.scale/evidence/) |
155
+ | ReviewStore | 持久化 review 记录 (.scale/reviews/) |
156
+ | ReviewAnalyzer | 扫描 diff 中的高风险代码 |
157
+ | Detectors | OWASP Top 10 + 行为检测 (19 类) |
158
+
159
+ ### Rules
160
+
161
+ - 🔴 Dangerous commands (rm -rf, DROP TABLE) are physically blocked
162
+ - 🔴 Hardcoded secrets are blocked on Edit/Write
163
+ - 🟡 3 identical retries triggers brute-retry detection
164
+ - 🟡 Claiming done without running tests is blocked (PrematureDoneDetector)
165
+ - 🟢 All tool calls are tracked in .scale/events/
166
+ `;
167
+ }
168
+ async init(config) {
169
+ this.projectDir = config.projectDir;
170
+ this.scaleDir = config.scaleDir ?? join(config.projectDir, '.scale');
171
+ const scenarioMode = config.scenarioMode ?? 'standard';
172
+ const created = [];
173
+ const skipped = [];
174
+ // 1. Create .scale/ directory structure
175
+ for (const dir of ['events', 'artifacts', 'rules', 'hooks', 'checkpoints', 'reviews', 'evidence']) {
176
+ const fullDir = join(this.scaleDir, dir);
177
+ if (!existsSync(fullDir)) {
178
+ mkdirSync(fullDir, { recursive: true });
179
+ created.push(fullDir);
180
+ }
181
+ else {
182
+ skipped.push(fullDir);
183
+ }
184
+ }
185
+ // 2. Create .deepseek/ directory
186
+ const deepseekDir = join(this.projectDir, '.deepseek');
187
+ mkdirSync(deepseekDir, { recursive: true });
188
+ // 3. Create/overwrite .deepseek/config.toml (project overlay)
189
+ const settingsPath = this.getSettingsPath();
190
+ if (existsSync(settingsPath)) {
191
+ // For TOML project overlay, we write a SCALE section comment
192
+ // but don't overwrite existing settings — append SCALE guidance
193
+ const existing = readFileSync(settingsPath, 'utf-8');
194
+ if (!existing.includes('SCALE Engine')) {
195
+ const tomlConfig = this.generateConfigToml(scenarioMode);
196
+ writeFileSync(settingsPath, existing.trimEnd() + '\n\n' + tomlConfig, 'utf-8');
197
+ skipped.push(settingsPath + ' (SCALE section appended)');
198
+ }
199
+ else {
200
+ skipped.push(settingsPath + ' (already configured)');
201
+ }
202
+ }
203
+ else {
204
+ const tomlConfig = this.generateConfigToml(scenarioMode);
205
+ writeFileSync(settingsPath, tomlConfig, 'utf-8');
206
+ created.push(settingsPath);
207
+ }
208
+ // 4. Update .deepseek/instructions.md
209
+ const knowledgeDocPath = this.getKnowledgeDocPath();
210
+ const projectName = config.projectDir.split(/[/\\]/).pop() ?? 'Project';
211
+ if (existsSync(knowledgeDocPath)) {
212
+ const existing = readFileSync(knowledgeDocPath, 'utf-8');
213
+ // Only append SCALE section if not already present
214
+ if (!existing.includes('SCALE Engine Integration')) {
215
+ const scaleSection = this.generateKnowledgeDoc(projectName);
216
+ // Extract only the SCALE section (skip the project name header)
217
+ const scaleBody = scaleSection.split('\n').slice(existing.startsWith('# ') ? 2 : 1).join('\n');
218
+ writeFileSync(knowledgeDocPath, existing.trimEnd() + '\n\n' + scaleBody, 'utf-8');
219
+ skipped.push(knowledgeDocPath + ' (SCALE section appended)');
220
+ }
221
+ else {
222
+ skipped.push(knowledgeDocPath + ' (already configured)');
223
+ }
224
+ }
225
+ else {
226
+ writeFileSync(knowledgeDocPath, this.generateKnowledgeDoc(projectName), 'utf-8');
227
+ created.push(knowledgeDocPath);
228
+ }
229
+ // 5. Create skills directory (global)
230
+ const skillsDir = this.getSkillsDir();
231
+ if (!existsSync(skillsDir)) {
232
+ mkdirSync(skillsDir, { recursive: true });
233
+ created.push(skillsDir);
234
+ }
235
+ else {
236
+ skipped.push(skillsDir);
237
+ }
238
+ // 6. .gitignore for .scale/
239
+ const gitignorePath = join(this.scaleDir, '.gitignore');
240
+ if (!existsSync(gitignorePath)) {
241
+ writeFileSync(gitignorePath, `# SCALE Engine runtime data
242
+ *.db
243
+ *.db-shm
244
+ *.db-wal
245
+ events/
246
+ checkpoints/
247
+ hooks/*.sh
248
+ `, 'utf-8');
249
+ created.push(gitignorePath);
250
+ }
251
+ logger.info({ created: created.length, skipped: skipped.length }, 'SCALE init (deepseek-tui) completed');
252
+ return {
253
+ settingsPath,
254
+ knowledgeDocPath,
255
+ scaleDir: this.scaleDir,
256
+ created,
257
+ skipped,
258
+ };
259
+ }
260
+ }
261
+ //# sourceMappingURL=DeepSeekTuiAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeepSeekTuiAdapter.js","sourceRoot":"","sources":["../../src/adapters/DeepSeekTuiAdapter.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ export { TraeAdapter } from './TraeAdapter.js';
12
12
  export { WorkBuddyAdapter } from './WorkBuddyAdapter.js';
13
13
  export { VSCAdapter } from './VSCAdapter.js';
14
14
  export { QCoderAdapter } from './QCoderAdapter.js';
15
+ export { DeepSeekTuiAdapter } from './DeepSeekTuiAdapter.js';
15
16
  /** All supported agent type identifiers */
16
17
  export declare const SUPPORTED_AGENTS: AgentPlatform[];
17
18
  /**
@@ -11,6 +11,7 @@ import { TraeAdapter } from './TraeAdapter.js';
11
11
  import { WorkBuddyAdapter } from './WorkBuddyAdapter.js';
12
12
  import { VSCAdapter } from './VSCAdapter.js';
13
13
  import { QCoderAdapter } from './QCoderAdapter.js';
14
+ import { DeepSeekTuiAdapter } from './DeepSeekTuiAdapter.js';
14
15
  export { ClaudeCodeAdapter } from './ClaudeCodeAdapter.js';
15
16
  export { CodexAdapter } from './CodexAdapter.js';
16
17
  export { OpenCodeAdapter } from './OpenCodeAdapter.js';
@@ -22,6 +23,7 @@ export { TraeAdapter } from './TraeAdapter.js';
22
23
  export { WorkBuddyAdapter } from './WorkBuddyAdapter.js';
23
24
  export { VSCAdapter } from './VSCAdapter.js';
24
25
  export { QCoderAdapter } from './QCoderAdapter.js';
26
+ export { DeepSeekTuiAdapter } from './DeepSeekTuiAdapter.js';
25
27
  // ============================================================================
26
28
  // Adapter Registry
27
29
  // ============================================================================
@@ -37,6 +39,7 @@ const ADAPTER_MAP = {
37
39
  'workbuddy': WorkBuddyAdapter,
38
40
  'vsc': VSCAdapter,
39
41
  'qcoder': QCoderAdapter,
42
+ 'deepseek-tui': DeepSeekTuiAdapter,
40
43
  };
41
44
  /** All supported agent type identifiers */
42
45
  export const SUPPORTED_AGENTS = Object.keys(ADAPTER_MAP);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,4CAA4C;AAG5C,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;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,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;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,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;IACvB,MAAM,EAAE,WAAW;IACnB,WAAW,EAAE,gBAAgB;IAC7B,KAAK,EAAE,UAAU;IACjB,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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,4CAA4C;AAG5C,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;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAK5D,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;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAE5D,+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;IACvB,MAAM,EAAE,WAAW;IACnB,WAAW,EAAE,gBAAgB;IAC7B,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,aAAa;IACvB,cAAc,EAAE,kBAAkB;CACnC,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"}
@@ -37,7 +37,8 @@ export class AgentSourceLoader {
37
37
  try {
38
38
  return this.loadFromYAML(readFileSync(filePath, 'utf-8'));
39
39
  }
40
- catch {
40
+ catch (error) {
41
+ logger.error({ error }, "Failed to parse YAML agent definition");
41
42
  return null;
42
43
  }
43
44
  }
@@ -48,7 +49,8 @@ export class AgentSourceLoader {
48
49
  return null;
49
50
  return this.convertDefinition(def);
50
51
  }
51
- catch {
52
+ catch (error) {
53
+ logger.error({ error }, "Failed to parse YAML agent definition");
52
54
  return null;
53
55
  }
54
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AgentSourceLoader.js","sourceRoot":"","sources":["../../src/agents/AgentSourceLoader.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,iCAAiC;AAEjC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAC/D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,KAAK,IAAI,MAAM,SAAS,CAAA;AAE/B,OAAO,EAAwB,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AA6B1C,MAAM,OAAO,iBAAiB;IAE5B,YAAY,WAAiC,sBAAsB,IAAI,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA,CAAC,CAAC;IAEjG,iBAAiB,CAAC,GAAW;QAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,kCAAkC,CAAC,CAAC;YAAC,OAAO,EAAE,CAAA;QAAC,CAAC;QAC7F,MAAM,QAAQ,GAAmB,EAAE,CAAA;QACnC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QACzD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAAC,CAAC;iBACvF,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC;gBAC/F,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;gBACxD,IAAI,OAAO,EAAE,CAAC;oBAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAAC,IAAI,CAAC;wBAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,YAAY,CAAC,QAAgB;QAC3B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAA;QACtC,IAAI,CAAC;YAAC,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAA;QAAC,CAAC;IACzF,CAAC;IAED,YAAY,CAAC,OAAe;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAwB,CAAA;YACrD,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAA;YAC9C,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAA;QACpC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAA;QAAC,CAAC;IACzB,CAAC;IAED,kBAAkB,CAAC,GAAwB;QACzC,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC,CAAA;QACzE,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,IAAI,CAAC,GAAG,CAAC,CAA8B,CAAC;gBAAE,OAAO,KAAK,CAAA;QAChF,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,CAAC,CAAA;QAC/M,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAA;QACpD,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,iBAAiB,CAAC,GAAwB;QAChD,MAAM,OAAO,GAAiB;YAC5B,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;YAC9D,MAAM,EAAE,GAAG,CAAC,MAAqB,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY;YACjE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,cAAc,EAAG,GAAG,CAAC,cAA4B,IAAI,UAAU;SAChG,CAAA;QACD,IAAI,GAAG,CAAC,KAAK;YAAE,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAA;QACxC,IAAI,GAAG,CAAC,KAAK;YAAE,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAA;QACxC,IAAI,GAAG,CAAC,QAAQ;YAAE,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAA;QACjD,IAAI,GAAG,CAAC,QAAQ;YAAE,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAA;QACjD,IAAI,GAAG,CAAC,KAAK;YAAE,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAA;QACxC,IAAI,GAAG,CAAC,YAAY;YAAE,OAAO,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAA;QAC7D,IAAI,GAAG,CAAC,YAAY;YAAE,OAAO,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAA;QAC7D,IAAI,GAAG,CAAC,QAAQ;YAAE,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAA;QACjD,IAAI,GAAG,CAAC,cAAc;YAAE,OAAO,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAA;QACnE,IAAI,GAAG,CAAC,aAAa;YAAE,OAAO,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,CAAA;QAChE,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,YAAY,CAAC,OAAqB;QAChC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,iBAAiB,EAAE,CAAA;AAC/D,MAAM,UAAU,uBAAuB,CAAC,GAAW,IAAoB,OAAO,wBAAwB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAA,CAAC,CAAC;AAC/H,MAAM,UAAU,iBAAiB,CAAC,QAAgB,IAAyB,OAAO,wBAAwB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA,CAAC,CAAC;AACnI,MAAM,UAAU,mBAAmB,CAAC,OAAqB,IAAY,OAAO,wBAAwB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA,CAAC,CAAC"}
1
+ {"version":3,"file":"AgentSourceLoader.js","sourceRoot":"","sources":["../../src/agents/AgentSourceLoader.ts"],"names":[],"mappings":"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"}
package/dist/api/cli.js CHANGED
@@ -19,8 +19,9 @@ import { quickStart, detectPlatform } from './quickstart.js';
19
19
  import { SkillDiscovery } from '../skills/SkillDiscovery.js';
20
20
  import { listWorkflowPresets, getPresetsByScenario } from '../workflows/presets.js';
21
21
  import { EvidenceStore } from '../workflow/EvidenceStore.js';
22
+ import { OutOfScopeStore } from '../workflow/OutOfScopeStore.js';
22
23
  import { ReviewStore } from '../workflow/ReviewStore.js';
23
- import { existsSync, mkdirSync } from 'node:fs';
24
+ import { existsSync, mkdirSync, readFileSync } from 'node:fs';
24
25
  import { join } from 'node:path';
25
26
  // ============================================================================
26
27
  // Engine bootstrap (单例 + lazy init)
@@ -638,9 +639,52 @@ function formatContextSummary(ctx) {
638
639
  }
639
640
  return lines.join('\n');
640
641
  }
642
+ const contextGlossary = defineCommand({
643
+ meta: { name: 'glossary', description: 'Show project domain glossary (借鉴 mattpocock/skills CONTEXT.md)' },
644
+ args: {
645
+ json: { type: 'boolean', default: false, description: 'JSON output' },
646
+ },
647
+ run({ args }) {
648
+ const glossaryPath = join(SCALE_DIR, 'GLOSSARY.md');
649
+ if (!existsSync(glossaryPath)) {
650
+ if (args.json)
651
+ console.log(JSON.stringify({ ok: false, message: 'GLOSSARY.md not found in SCALE_DIR. Run scale init to generate it.' }));
652
+ else
653
+ console.log('GLOSSARY.md not found. Run scale init to generate it.');
654
+ return;
655
+ }
656
+ const content = readFileSync(glossaryPath, 'utf-8');
657
+ // Parse terms: **Term**: definition
658
+ const termMatch = /\*\*(\w[^*]+)\*\*\s*:\s*(.+)/g;
659
+ const terms = {};
660
+ let m;
661
+ while ((m = termMatch.exec(content)) !== null) {
662
+ terms[m[1].trim()] = m[2].trim().replace(/_Avoid_/, 'Avoid:');
663
+ }
664
+ // Parse relationships
665
+ const relSection = content.split('## Relationships')[1]?.split('## ')[0] ?? '';
666
+ const relationships = relSection.split('\n').filter((l) => l.trim().startsWith('- ')).map((l) => l.replace(/^- /, '').trim());
667
+ if (args.json) {
668
+ console.log(JSON.stringify({ ok: true, terms, relationships, count: Object.keys(terms).length }));
669
+ }
670
+ else {
671
+ console.log('=== SCALE Engine Domain Glossary ===\n');
672
+ console.log(`Terms (${Object.keys(terms).length}):\n`);
673
+ for (const [term, def] of Object.entries(terms)) {
674
+ console.log(` **${term}**: ${def}`);
675
+ }
676
+ if (relationships.length > 0) {
677
+ console.log(`\nRelationships (${relationships.length}):`);
678
+ for (const rel of relationships) {
679
+ console.log(` - ${rel}`);
680
+ }
681
+ }
682
+ }
683
+ },
684
+ });
641
685
  const context = defineCommand({
642
686
  meta: { name: 'context', description: 'Context assembly' },
643
- subCommands: { build: contextBuild, status: contextStatus, inject: contextInject },
687
+ subCommands: { build: contextBuild, status: contextStatus, inject: contextInject, glossary: contextGlossary },
644
688
  });
645
689
  // ============================================================================
646
690
  // stats
@@ -974,6 +1018,74 @@ const evidence = defineCommand({
974
1018
  subCommands: { list: evidenceList, show: evidenceShow },
975
1019
  });
976
1020
  // ============================================================================
1021
+ // out-of-scope command — 借鉴 mattpocock/skills 的 .out-of-scope/ 设计
1022
+ // ============================================================================
1023
+ const outOfScopeAdd = defineCommand({
1024
+ meta: { name: 'add', description: 'Record a rejected concept to the out-of-scope knowledge base' },
1025
+ args: {
1026
+ concept: { type: 'positional', required: true, description: 'kebab-case concept name' },
1027
+ title: { type: 'string', required: true, description: 'Human-readable title' },
1028
+ reason: { type: 'string', required: true, description: 'Why this was rejected' },
1029
+ 'tech-context': { type: 'string', description: 'Technical constraints that led to rejection' },
1030
+ 'prior-requests': { type: 'string', description: 'Comma-separated issue IDs or URLs' },
1031
+ },
1032
+ run({ args }) {
1033
+ ensureDir(SCALE_DIR);
1034
+ const store = new OutOfScopeStore(SCALE_DIR);
1035
+ const entry = store.add({
1036
+ concept: args.concept,
1037
+ title: args.title,
1038
+ reason: args.reason,
1039
+ technicalContext: args['tech-context'],
1040
+ priorRequests: args['prior-requests']?.split(',').map(s => s.trim()) ?? [],
1041
+ });
1042
+ console.log(JSON.stringify({ ok: true, concept: entry.concept, title: entry.title, priorRequests: entry.priorRequests.length }, null, 2));
1043
+ },
1044
+ });
1045
+ const outOfScopeCheck = defineCommand({
1046
+ meta: { name: 'check', description: 'Check if a concept matches any existing out-of-scope entry' },
1047
+ args: {
1048
+ concept: { type: 'positional', required: true, description: 'Concept name to check' },
1049
+ description: { type: 'string', description: 'Optional description for fuzzy matching' },
1050
+ },
1051
+ run({ args }) {
1052
+ ensureDir(SCALE_DIR);
1053
+ const store = new OutOfScopeStore(SCALE_DIR);
1054
+ const match = store.check(args.concept, args.description);
1055
+ if (match) {
1056
+ console.log(JSON.stringify({ ok: true, matched: true, concept: match.concept, title: match.title, reason: match.reason, priorRequests: match.priorRequests }, null, 2));
1057
+ }
1058
+ else {
1059
+ console.log(JSON.stringify({ ok: true, matched: false }, null, 2));
1060
+ }
1061
+ },
1062
+ });
1063
+ const outOfScopeList = defineCommand({
1064
+ meta: { name: 'list', description: 'List all out-of-scope entries' },
1065
+ run() {
1066
+ ensureDir(SCALE_DIR);
1067
+ const store = new OutOfScopeStore(SCALE_DIR);
1068
+ const entries = store.list();
1069
+ console.log(JSON.stringify({ ok: true, total: entries.length, entries: entries.map(e => ({ concept: e.concept, title: e.title, priorRequests: e.priorRequests.length, updatedAt: new Date(e.updatedAt).toISOString() })) }, null, 2));
1070
+ },
1071
+ });
1072
+ const outOfScopeRemove = defineCommand({
1073
+ meta: { name: 'remove', description: 'Remove an out-of-scope entry (concept reconsidered)' },
1074
+ args: {
1075
+ concept: { type: 'positional', required: true, description: 'Concept name to remove' },
1076
+ },
1077
+ run({ args }) {
1078
+ ensureDir(SCALE_DIR);
1079
+ const store = new OutOfScopeStore(SCALE_DIR);
1080
+ const removed = store.remove(args.concept);
1081
+ console.log(JSON.stringify({ ok: removed, concept: args.concept }, null, 2));
1082
+ },
1083
+ });
1084
+ const outOfScope = defineCommand({
1085
+ meta: { name: 'out-of-scope', description: 'Manage out-of-scope knowledge base (rejected concepts with institutional memory)' },
1086
+ subCommands: { add: outOfScopeAdd, check: outOfScopeCheck, list: outOfScopeList, remove: outOfScopeRemove },
1087
+ });
1088
+ // ============================================================================
977
1089
  // skill command — 技能发现
978
1090
  // ============================================================================
979
1091
  const skillScan = defineCommand({
@@ -1164,6 +1276,7 @@ const main = defineCommand({
1164
1276
  agent,
1165
1277
  team,
1166
1278
  'create-prd': createPRD,
1279
+ 'out-of-scope': outOfScope,
1167
1280
  },
1168
1281
  });
1169
1282
  runMain(main);