@hongmaple0820/scale-engine 0.11.2 → 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.
- package/README.en.md +3 -3
- package/README.md +229 -229
- package/dist/adapters/DeepSeekTuiAdapter.d.ts +19 -0
- package/dist/adapters/DeepSeekTuiAdapter.js +261 -0
- package/dist/adapters/DeepSeekTuiAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts +1 -0
- package/dist/adapters/index.js +3 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/agents/AgentSourceLoader.js +4 -2
- package/dist/agents/AgentSourceLoader.js.map +1 -1
- package/dist/api/cli.js +115 -2
- package/dist/api/cli.js.map +1 -1
- package/dist/api/quickstart.js +1 -0
- package/dist/api/quickstart.js.map +1 -1
- package/dist/artifact/types.d.ts +23 -1
- package/dist/artifact/types.js.map +1 -1
- package/dist/cli/phaseCommands.js +57 -46
- package/dist/cli/phaseCommands.js.map +1 -1
- package/dist/dashboard/server.js +2 -1
- package/dist/dashboard/server.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/skills/SkillDiscovery.js +10 -3
- package/dist/skills/SkillDiscovery.js.map +1 -1
- package/dist/workflow/OutOfScopeStore.d.ts +37 -0
- package/dist/workflow/OutOfScopeStore.js +164 -0
- package/dist/workflow/OutOfScopeStore.js.map +1 -0
- package/dist/workflow/ReviewAnalyzer.d.ts +32 -0
- package/dist/workflow/ReviewAnalyzer.js +87 -0
- package/dist/workflow/ReviewAnalyzer.js.map +1 -1
- package/dist/workflow/ReviewStore.d.ts +4 -0
- package/dist/workflow/ReviewStore.js.map +1 -1
- package/package.json +2 -2
|
@@ -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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"}
|
package/dist/adapters/index.d.ts
CHANGED
|
@@ -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
|
/**
|
package/dist/adapters/index.js
CHANGED
|
@@ -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;
|
|
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;
|
|
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);
|