@geeseeker/easyai-dev 3.0.0-alpha.1 → 3.0.1
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.md +90 -88
- package/README_AI.md +143 -0
- package/bin/easyai-dev.js +127 -1
- package/lib/init.js +425 -0
- package/lib/server/index.d.ts +14 -0
- package/lib/server/index.d.ts.map +1 -0
- package/lib/server/index.js +126 -0
- package/lib/server/index.js.map +1 -0
- package/lib/server/resources/journal-resource.d.ts +8 -0
- package/lib/server/resources/journal-resource.d.ts.map +1 -0
- package/lib/server/resources/journal-resource.js +46 -0
- package/lib/server/resources/journal-resource.js.map +1 -0
- package/lib/server/resources/spec-resource.d.ts +11 -0
- package/lib/server/resources/spec-resource.d.ts.map +1 -0
- package/lib/server/resources/spec-resource.js +126 -0
- package/lib/server/resources/spec-resource.js.map +1 -0
- package/lib/server/resources/status-resource.d.ts +8 -0
- package/lib/server/resources/status-resource.d.ts.map +1 -0
- package/lib/server/resources/status-resource.js +36 -0
- package/lib/server/resources/status-resource.js.map +1 -0
- package/lib/server/resources/subtask-context-resource.d.ts +8 -0
- package/lib/server/resources/subtask-context-resource.d.ts.map +1 -0
- package/lib/server/resources/subtask-context-resource.js +93 -0
- package/lib/server/resources/subtask-context-resource.js.map +1 -0
- package/lib/server/resources/task-context-resource.d.ts +8 -0
- package/lib/server/resources/task-context-resource.d.ts.map +1 -0
- package/lib/server/resources/task-context-resource.js +76 -0
- package/lib/server/resources/task-context-resource.js.map +1 -0
- package/lib/server/tools/conflict-check.d.ts +7 -0
- package/lib/server/tools/conflict-check.d.ts.map +1 -0
- package/lib/server/tools/conflict-check.js +242 -0
- package/lib/server/tools/conflict-check.js.map +1 -0
- package/lib/server/tools/context-budget.d.ts +7 -0
- package/lib/server/tools/context-budget.d.ts.map +1 -0
- package/lib/server/tools/context-budget.js +178 -0
- package/lib/server/tools/context-budget.js.map +1 -0
- package/lib/server/tools/context-generate.d.ts +7 -0
- package/lib/server/tools/context-generate.d.ts.map +1 -0
- package/lib/server/tools/context-generate.js +208 -0
- package/lib/server/tools/context-generate.js.map +1 -0
- package/lib/server/tools/framework-tools.d.ts +20 -0
- package/lib/server/tools/framework-tools.d.ts.map +1 -0
- package/lib/server/tools/framework-tools.js +412 -0
- package/lib/server/tools/framework-tools.js.map +1 -0
- package/lib/server/tools/journal-append.d.ts +7 -0
- package/lib/server/tools/journal-append.d.ts.map +1 -0
- package/lib/server/tools/journal-append.js +55 -0
- package/lib/server/tools/journal-append.js.map +1 -0
- package/lib/server/tools/journal-search.d.ts +7 -0
- package/lib/server/tools/journal-search.d.ts.map +1 -0
- package/lib/server/tools/journal-search.js +63 -0
- package/lib/server/tools/journal-search.js.map +1 -0
- package/lib/server/tools/plan-validate.d.ts +7 -0
- package/lib/server/tools/plan-validate.d.ts.map +1 -0
- package/lib/server/tools/plan-validate.js +146 -0
- package/lib/server/tools/plan-validate.js.map +1 -0
- package/lib/server/tools/spec-validate.d.ts +7 -0
- package/lib/server/tools/spec-validate.d.ts.map +1 -0
- package/lib/server/tools/spec-validate.js +170 -0
- package/lib/server/tools/spec-validate.js.map +1 -0
- package/lib/server/tools/subtask-tools.d.ts +12 -0
- package/lib/server/tools/subtask-tools.d.ts.map +1 -0
- package/lib/server/tools/subtask-tools.js +383 -0
- package/lib/server/tools/subtask-tools.js.map +1 -0
- package/lib/server/tools/task-append-log.d.ts +7 -0
- package/lib/server/tools/task-append-log.d.ts.map +1 -0
- package/lib/server/tools/task-append-log.js +108 -0
- package/lib/server/tools/task-append-log.js.map +1 -0
- package/lib/server/tools/task-cancel.d.ts +7 -0
- package/lib/server/tools/task-cancel.d.ts.map +1 -0
- package/lib/server/tools/task-cancel.js +104 -0
- package/lib/server/tools/task-cancel.js.map +1 -0
- package/lib/server/tools/task-create.d.ts +7 -0
- package/lib/server/tools/task-create.d.ts.map +1 -0
- package/lib/server/tools/task-create.js +98 -0
- package/lib/server/tools/task-create.js.map +1 -0
- package/lib/server/tools/task-get.d.ts +7 -0
- package/lib/server/tools/task-get.d.ts.map +1 -0
- package/lib/server/tools/task-get.js +152 -0
- package/lib/server/tools/task-get.js.map +1 -0
- package/lib/server/tools/task-list.d.ts +7 -0
- package/lib/server/tools/task-list.d.ts.map +1 -0
- package/lib/server/tools/task-list.js +66 -0
- package/lib/server/tools/task-list.js.map +1 -0
- package/lib/server/tools/task-transition.d.ts +7 -0
- package/lib/server/tools/task-transition.d.ts.map +1 -0
- package/lib/server/tools/task-transition.js +259 -0
- package/lib/server/tools/task-transition.js.map +1 -0
- package/lib/server/tools/worktree-tools.d.ts +17 -0
- package/lib/server/tools/worktree-tools.d.ts.map +1 -0
- package/lib/server/tools/worktree-tools.js +336 -0
- package/lib/server/tools/worktree-tools.js.map +1 -0
- package/lib/server/utils/capability-gate.d.ts +50 -0
- package/lib/server/utils/capability-gate.d.ts.map +1 -0
- package/lib/server/utils/capability-gate.js +146 -0
- package/lib/server/utils/capability-gate.js.map +1 -0
- package/lib/server/utils/git-utils.d.ts +33 -0
- package/lib/server/utils/git-utils.d.ts.map +1 -0
- package/lib/server/utils/git-utils.js +84 -0
- package/lib/server/utils/git-utils.js.map +1 -0
- package/lib/server/utils/hash-utils.d.ts +78 -0
- package/lib/server/utils/hash-utils.d.ts.map +1 -0
- package/lib/server/utils/hash-utils.js +153 -0
- package/lib/server/utils/hash-utils.js.map +1 -0
- package/lib/server/utils/journal-utils.d.ts +69 -0
- package/lib/server/utils/journal-utils.d.ts.map +1 -0
- package/lib/server/utils/journal-utils.js +387 -0
- package/lib/server/utils/journal-utils.js.map +1 -0
- package/lib/server/utils/status-utils.d.ts +58 -0
- package/lib/server/utils/status-utils.d.ts.map +1 -0
- package/lib/server/utils/status-utils.js +70 -0
- package/lib/server/utils/status-utils.js.map +1 -0
- package/lib/server/utils/task-utils.d.ts +104 -0
- package/lib/server/utils/task-utils.d.ts.map +1 -0
- package/lib/server/utils/task-utils.js +396 -0
- package/lib/server/utils/task-utils.js.map +1 -0
- package/lib/server/utils/uri-utils.d.ts +9 -0
- package/lib/server/utils/uri-utils.d.ts.map +1 -0
- package/lib/server/utils/uri-utils.js +21 -0
- package/lib/server/utils/uri-utils.js.map +1 -0
- package/package.json +30 -21
- package/skeleton/.agents/rules/anti-hallucination.md +42 -0
- package/skeleton/.agents/rules/coding-standards.md +41 -0
- package/skeleton/.agents/rules/project-identity.md +71 -0
- package/skeleton/.agents/skills/common-framework-evolve/.gitkeep +0 -0
- package/skeleton/.agents/skills/common-framework-evolve/SKILL.md +105 -0
- package/skeleton/.agents/skills/common-session-close/.gitkeep +0 -0
- package/skeleton/.agents/skills/common-session-close/SKILL.md +83 -0
- package/skeleton/.agents/skills/common-spec-update/.gitkeep +0 -0
- package/skeleton/.agents/skills/common-spec-update/SKILL.md +87 -0
- package/skeleton/.agents/skills/pm-brainstorm/.gitkeep +0 -0
- package/skeleton/.agents/skills/pm-brainstorm/SKILL.md +114 -0
- package/skeleton/.agents/skills/pm-session-start/.gitkeep +0 -0
- package/skeleton/.agents/skills/pm-session-start/SKILL.md +73 -0
- package/skeleton/.agents/skills/pm-task-planning/SKILL.md +200 -0
- package/skeleton/.agents/skills/pm-task-review/.gitkeep +0 -0
- package/skeleton/.agents/skills/pm-task-review/SKILL.md +144 -0
- package/skeleton/.agents/skills/worker-check/.gitkeep +0 -0
- package/skeleton/.agents/skills/worker-check/SKILL.md +194 -0
- package/skeleton/.agents/skills/worker-debug/.gitkeep +0 -0
- package/skeleton/.agents/skills/worker-debug/SKILL.md +241 -0
- package/skeleton/.agents/skills/worker-implement/.gitkeep +0 -0
- package/skeleton/.agents/skills/worker-implement/SKILL.md +192 -0
- package/skeleton/.agents/workflows/pm.md +81 -0
- package/skeleton/.agents/workflows/worker.md +100 -0
- package/skeleton/.docs/README.md +25 -0
- package/skeleton/.docs/archive/.gitkeep +0 -0
- package/skeleton/.docs/design/.gitkeep +0 -0
- package/skeleton/.docs/guides/.gitkeep +0 -0
- package/skeleton/.docs/notes/.gitkeep +0 -0
- package/skeleton/.docs/requirements/.gitkeep +0 -0
- package/skeleton/.trellis/config/config.yaml +48 -0
- package/skeleton/.trellis/spec/backend/.gitkeep +0 -0
- package/skeleton/.trellis/spec/frontend/.gitkeep +0 -0
- package/skeleton/.trellis/spec/guides/.gitkeep +0 -0
- package/skeleton/.trellis/spec/guides/external-cli-guide.md +253 -0
- package/skeleton/.trellis/spec/guides/task-workflow.md +34 -0
- package/skeleton/.trellis/spec/guides/testing.md +32 -0
- package/skeleton/.trellis/spec/spec-schema.json +64 -0
- package/skeleton/.trellis/tasks/.gitkeep +0 -0
- package/skeleton/.trellis/workspace/.gitkeep +0 -0
- package/skeleton/README.md +25 -0
- package/LICENSE +0 -21
- package/src/cli/index.js +0 -40
- package/src/commands/init.js +0 -37
- package/src/commands/update.js +0 -33
- package/templates/README.md +0 -22
- package/templates/agents/README.md +0 -4
- package/templates/trellis/README.md +0 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-check.js","sourceRoot":"","sources":["../../src/tools/conflict-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-budget.d.ts","sourceRoot":"","sources":["../../src/tools/context-budget.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6BpE;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwIhD"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { getTaskDir } from "../utils/task-utils.js";
|
|
5
|
+
import { parseContextJsonl, resolveUriToPath, checkStale, } from "../utils/hash-utils.js";
|
|
6
|
+
// ============ 常量 ============
|
|
7
|
+
/**
|
|
8
|
+
* 上下文预算阈值(Token 数)
|
|
9
|
+
* 来源:.trellis/config/context-budget.md + 架构 §6.3
|
|
10
|
+
*/
|
|
11
|
+
const BUDGET_THRESHOLDS = {
|
|
12
|
+
WARNING: 0.6, // 60% — 自动降级 recommended → deferred
|
|
13
|
+
CRITICAL: 0.8, // 80% — 建议新开会话
|
|
14
|
+
};
|
|
15
|
+
const PHASE_BUDGET = {
|
|
16
|
+
plan: 40000,
|
|
17
|
+
implement: 60000,
|
|
18
|
+
check: 30000,
|
|
19
|
+
debug: 50000,
|
|
20
|
+
};
|
|
21
|
+
const DEFAULT_BUDGET = 60000;
|
|
22
|
+
/**
|
|
23
|
+
* 注册 context_budget 工具
|
|
24
|
+
* Token 估算 + 60%/80% 自动降级
|
|
25
|
+
*/
|
|
26
|
+
export function register(server) {
|
|
27
|
+
server.tool("context_budget", "估算当前任务的上下文 Token 消耗。超过 60% 时建议降级 recommended 上下文,超过 80% 时建议新开会话。可选传入 task_id 分析特定任务。", {
|
|
28
|
+
task_id: z.string().optional().describe("可选任务 ID,分析特定任务的上下文预算"),
|
|
29
|
+
phase: z.string().optional().describe("阶段标识,决定预算上限"),
|
|
30
|
+
}, async ({ task_id, phase }) => {
|
|
31
|
+
try {
|
|
32
|
+
const budget = PHASE_BUDGET[phase || "implement"] || DEFAULT_BUDGET;
|
|
33
|
+
let totalTokens = 0;
|
|
34
|
+
// 按 priority 分层统计
|
|
35
|
+
const breakdown = {
|
|
36
|
+
required: { count: 0, tokens: 0 },
|
|
37
|
+
recommended: { count: 0, tokens: 0 },
|
|
38
|
+
deferred: { count: 0, tokens: 0 },
|
|
39
|
+
};
|
|
40
|
+
// 如果指定了 task_id,读取对应的 context.jsonl
|
|
41
|
+
if (task_id) {
|
|
42
|
+
const taskDir = getTaskDir(task_id);
|
|
43
|
+
const contextPath = path.join(taskDir, "context.jsonl");
|
|
44
|
+
if (fs.existsSync(contextPath)) {
|
|
45
|
+
const entries = parseContextJsonl(contextPath);
|
|
46
|
+
for (const entry of entries) {
|
|
47
|
+
const filePath = resolveUriToPath(entry.uri);
|
|
48
|
+
let tokens = entry.token_estimate || 0;
|
|
49
|
+
if (filePath && fs.existsSync(filePath)) {
|
|
50
|
+
const stat = fs.statSync(filePath);
|
|
51
|
+
tokens = Math.round(stat.size / 3);
|
|
52
|
+
}
|
|
53
|
+
const priority = entry.priority || "deferred";
|
|
54
|
+
if (breakdown[priority]) {
|
|
55
|
+
breakdown[priority].count += 1;
|
|
56
|
+
breakdown[priority].tokens += tokens;
|
|
57
|
+
}
|
|
58
|
+
// deferred 仅保留 URI 引用,不计入实际预算消耗
|
|
59
|
+
if (priority !== "deferred") {
|
|
60
|
+
totalTokens += tokens;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// 检查快照 stale 状态(优先本阶段快照,回退到 implement 快照)
|
|
64
|
+
const targetPhase = phase || "implement";
|
|
65
|
+
let snapshotPath = path.join(taskDir, `context-snapshot-${targetPhase}.jsonl`);
|
|
66
|
+
if (!fs.existsSync(snapshotPath) && targetPhase !== "implement") {
|
|
67
|
+
snapshotPath = path.join(taskDir, "context-snapshot-implement.jsonl");
|
|
68
|
+
}
|
|
69
|
+
if (fs.existsSync(snapshotPath)) {
|
|
70
|
+
const staleResult = checkStale(snapshotPath);
|
|
71
|
+
if (!staleResult.allFresh) {
|
|
72
|
+
return {
|
|
73
|
+
content: [
|
|
74
|
+
{
|
|
75
|
+
type: "text",
|
|
76
|
+
text: JSON.stringify({
|
|
77
|
+
task_id,
|
|
78
|
+
phase: phase || "implement",
|
|
79
|
+
budget,
|
|
80
|
+
total_tokens: totalTokens,
|
|
81
|
+
usage_percent: Math.round((totalTokens / budget) * 100),
|
|
82
|
+
status: determineStatus(totalTokens, budget),
|
|
83
|
+
breakdown,
|
|
84
|
+
stale_warning: {
|
|
85
|
+
message: "⚠️ 上下文快照中检测到 stale 条目(spec 文件已变更)",
|
|
86
|
+
stale_count: staleResult.staleEntries.length,
|
|
87
|
+
stale_entries: staleResult.staleEntries,
|
|
88
|
+
},
|
|
89
|
+
...getDegradationAdvice(totalTokens, budget),
|
|
90
|
+
}, null, 2),
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const usagePercent = Math.round((totalTokens / budget) * 100);
|
|
99
|
+
const status = determineStatus(totalTokens, budget);
|
|
100
|
+
return {
|
|
101
|
+
content: [
|
|
102
|
+
{
|
|
103
|
+
type: "text",
|
|
104
|
+
text: JSON.stringify({
|
|
105
|
+
task_id: task_id || null,
|
|
106
|
+
phase: phase || "implement",
|
|
107
|
+
budget,
|
|
108
|
+
total_tokens: totalTokens,
|
|
109
|
+
usage_percent: usagePercent,
|
|
110
|
+
status,
|
|
111
|
+
breakdown,
|
|
112
|
+
...getDegradationAdvice(totalTokens, budget),
|
|
113
|
+
}, null, 2),
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
return {
|
|
120
|
+
content: [
|
|
121
|
+
{
|
|
122
|
+
type: "text",
|
|
123
|
+
text: JSON.stringify({
|
|
124
|
+
error: true,
|
|
125
|
+
message: error instanceof Error ? error.message : String(error),
|
|
126
|
+
}),
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
isError: true,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
// ============ 辅助函数 ============
|
|
135
|
+
/**
|
|
136
|
+
* 判断预算状态
|
|
137
|
+
*/
|
|
138
|
+
function determineStatus(totalTokens, budget) {
|
|
139
|
+
const ratio = totalTokens / budget;
|
|
140
|
+
if (ratio >= BUDGET_THRESHOLDS.CRITICAL)
|
|
141
|
+
return "critical";
|
|
142
|
+
if (ratio >= BUDGET_THRESHOLDS.WARNING)
|
|
143
|
+
return "warning";
|
|
144
|
+
return "normal";
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* 根据状态生成降级建议
|
|
148
|
+
*/
|
|
149
|
+
function getDegradationAdvice(totalTokens, budget) {
|
|
150
|
+
const status = determineStatus(totalTokens, budget);
|
|
151
|
+
if (status === "normal") {
|
|
152
|
+
return { advice: "预算充足,可正常加载所有 required + recommended 上下文" };
|
|
153
|
+
}
|
|
154
|
+
if (status === "warning") {
|
|
155
|
+
return {
|
|
156
|
+
advice: "⚠️ 超过 60% 预算,建议将 recommended 上下文降级为 deferred(仅保留 URI 引用)",
|
|
157
|
+
degradation: {
|
|
158
|
+
action: "降级 recommended → deferred",
|
|
159
|
+
reason: "上下文接近预算上限,优先保留 required 内容",
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// critical
|
|
164
|
+
return {
|
|
165
|
+
advice: "🚨 超过 80% 预算,建议新开会话并使用恢复指令",
|
|
166
|
+
degradation: {
|
|
167
|
+
action: "停止加载新上下文 + 新开会话",
|
|
168
|
+
reason: "上下文已超预算上限",
|
|
169
|
+
},
|
|
170
|
+
recovery_instructions: {
|
|
171
|
+
step1: "新开会话",
|
|
172
|
+
step2: "调用 project_status() 恢复项目状态",
|
|
173
|
+
step3: "调用 task_get(current_task_id) 读取任务详情",
|
|
174
|
+
step4: "调用 journal_search(last_session) 恢复最近工作记录",
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=context-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-budget.js","sourceRoot":"","sources":["../../src/tools/context-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-generate.d.ts","sourceRoot":"","sources":["../../src/tools/context-generate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsCpE;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsGhD"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { getProjectRoot, getTaskDir } from "../utils/task-utils.js";
|
|
5
|
+
// ============ 常量 ============
|
|
6
|
+
const SPEC_ROOT = ".trellis/spec";
|
|
7
|
+
/**
|
|
8
|
+
* 各阶段的 priority 映射策略
|
|
9
|
+
*/
|
|
10
|
+
const PHASE_PRIORITY_MAP = {
|
|
11
|
+
implement: {
|
|
12
|
+
frontend: "required",
|
|
13
|
+
backend: "required",
|
|
14
|
+
guides: "recommended",
|
|
15
|
+
general: "recommended",
|
|
16
|
+
},
|
|
17
|
+
check: {
|
|
18
|
+
frontend: "recommended",
|
|
19
|
+
backend: "recommended",
|
|
20
|
+
guides: "required",
|
|
21
|
+
general: "recommended",
|
|
22
|
+
},
|
|
23
|
+
debug: {
|
|
24
|
+
frontend: "recommended",
|
|
25
|
+
backend: "recommended",
|
|
26
|
+
guides: "recommended",
|
|
27
|
+
general: "deferred",
|
|
28
|
+
},
|
|
29
|
+
plan: {
|
|
30
|
+
frontend: "recommended",
|
|
31
|
+
backend: "recommended",
|
|
32
|
+
guides: "required",
|
|
33
|
+
general: "required",
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* 注册 context_generate 工具
|
|
38
|
+
* 半自动生成 context.jsonl 推荐清单
|
|
39
|
+
*/
|
|
40
|
+
export function register(server) {
|
|
41
|
+
server.tool("context_generate", "半自动生成 context.jsonl 推荐清单。分析任务描述,扫描 spec 目录,返回按 phase 分配 priority 的上下文条目。PM 审核后写入 context.jsonl。", {
|
|
42
|
+
task_id: z.string().describe("任务 ID"),
|
|
43
|
+
phase: z
|
|
44
|
+
.string()
|
|
45
|
+
.describe("阶段标识:plan / implement / check / debug"),
|
|
46
|
+
}, async ({ task_id, phase }) => {
|
|
47
|
+
try {
|
|
48
|
+
const taskDir = getTaskDir(task_id);
|
|
49
|
+
const taskMdPath = path.join(taskDir, "task.md");
|
|
50
|
+
if (!fs.existsSync(taskMdPath)) {
|
|
51
|
+
return {
|
|
52
|
+
content: [
|
|
53
|
+
{
|
|
54
|
+
type: "text",
|
|
55
|
+
text: JSON.stringify({
|
|
56
|
+
error: true,
|
|
57
|
+
message: `任务 ${task_id} 的 task.md 不存在`,
|
|
58
|
+
}),
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
isError: true,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// 读取任务描述,提取关键词
|
|
65
|
+
const taskContent = fs.readFileSync(taskMdPath, "utf-8");
|
|
66
|
+
const keywords = extractKeywords(taskContent);
|
|
67
|
+
// 扫描 spec 目录
|
|
68
|
+
const projectRoot = getProjectRoot();
|
|
69
|
+
const specDir = path.join(projectRoot, SPEC_ROOT);
|
|
70
|
+
const specFiles = scanSpecFiles(specDir);
|
|
71
|
+
// 匹配并生成推荐清单
|
|
72
|
+
const priorityMap = PHASE_PRIORITY_MAP[phase] || PHASE_PRIORITY_MAP.implement;
|
|
73
|
+
const recommendations = specFiles.map((specFile) => {
|
|
74
|
+
const { confidence, matchedKeywords: matchedKws } = calculateConfidence(specFile, keywords);
|
|
75
|
+
const category = specFile.category;
|
|
76
|
+
const priority = priorityMap[category] || "deferred";
|
|
77
|
+
const tokenEstimate = Math.round(specFile.sizeBytes / 3);
|
|
78
|
+
return {
|
|
79
|
+
uri: `trellis://spec/${specFile.relativePath}`,
|
|
80
|
+
phase,
|
|
81
|
+
priority: confidence > 0.1 ? priority : "deferred",
|
|
82
|
+
reason: `匹配关键词: ${matchedKws.join(", ") || "目录分类"}`,
|
|
83
|
+
confidence: Math.round(confidence * 100) / 100,
|
|
84
|
+
token_estimate: tokenEstimate,
|
|
85
|
+
source: "auto",
|
|
86
|
+
content_hash: "",
|
|
87
|
+
frozen_at: null,
|
|
88
|
+
};
|
|
89
|
+
});
|
|
90
|
+
// 按置信度排序,过滤低置信度
|
|
91
|
+
const filtered = recommendations
|
|
92
|
+
.filter((r) => r.confidence > 0.1)
|
|
93
|
+
.sort((a, b) => b.confidence - a.confidence);
|
|
94
|
+
return {
|
|
95
|
+
content: [
|
|
96
|
+
{
|
|
97
|
+
type: "text",
|
|
98
|
+
text: JSON.stringify({
|
|
99
|
+
task_id,
|
|
100
|
+
phase,
|
|
101
|
+
total_specs_scanned: specFiles.length,
|
|
102
|
+
recommendations_count: filtered.length,
|
|
103
|
+
recommendations: filtered,
|
|
104
|
+
instruction: "请审核上述推荐清单,添加/删除/调整后写入任务目录的 context.jsonl",
|
|
105
|
+
}, null, 2),
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
return {
|
|
112
|
+
content: [
|
|
113
|
+
{
|
|
114
|
+
type: "text",
|
|
115
|
+
text: JSON.stringify({
|
|
116
|
+
error: true,
|
|
117
|
+
message: error instanceof Error ? error.message : String(error),
|
|
118
|
+
}),
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
isError: true,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 从任务内容中提取关键词
|
|
128
|
+
*/
|
|
129
|
+
function extractKeywords(content) {
|
|
130
|
+
// 提取中文和英文关键词(去除常见停用词)
|
|
131
|
+
const stopWords = new Set([
|
|
132
|
+
"的", "了", "和", "是", "在", "有", "中", "为", "以",
|
|
133
|
+
"the", "a", "an", "is", "are", "in", "of", "to", "for", "and",
|
|
134
|
+
"with", "on", "at", "by", "from", "that", "this", "be", "as",
|
|
135
|
+
]);
|
|
136
|
+
const words = content
|
|
137
|
+
.toLowerCase()
|
|
138
|
+
.replace(/[^\w\u4e00-\u9fff]+/g, " ")
|
|
139
|
+
.split(/\s+/)
|
|
140
|
+
.filter((w) => w.length > 1 && !stopWords.has(w));
|
|
141
|
+
// 去重
|
|
142
|
+
return [...new Set(words)];
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* 扫描 spec 目录下的所有 .md 文件
|
|
146
|
+
*/
|
|
147
|
+
function scanSpecFiles(specDir) {
|
|
148
|
+
const results = [];
|
|
149
|
+
if (!fs.existsSync(specDir)) {
|
|
150
|
+
return results;
|
|
151
|
+
}
|
|
152
|
+
const categories = ["frontend", "backend", "guides", "general"];
|
|
153
|
+
for (const category of categories) {
|
|
154
|
+
const categoryDir = path.join(specDir, category);
|
|
155
|
+
if (!fs.existsSync(categoryDir) || !fs.statSync(categoryDir).isDirectory()) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
const files = fs.readdirSync(categoryDir);
|
|
160
|
+
for (const file of files) {
|
|
161
|
+
if (!file.endsWith(".md"))
|
|
162
|
+
continue;
|
|
163
|
+
const filePath = path.join(categoryDir, file);
|
|
164
|
+
const stat = fs.statSync(filePath);
|
|
165
|
+
results.push({
|
|
166
|
+
relativePath: `${category}/${file.replace(/\.md$/, "")}`,
|
|
167
|
+
category,
|
|
168
|
+
fileName: file,
|
|
169
|
+
sizeBytes: stat.size,
|
|
170
|
+
matchedKeywords: [],
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
// 跳过无法读取的目录
|
|
176
|
+
console.error(`无法读取 spec 目录 ${categoryDir}: ${err}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return results;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* 计算 spec 文件与关键词的匹配置信度
|
|
183
|
+
* 返回置信度值和匹配的关键词列表(不修改原始对象)
|
|
184
|
+
*/
|
|
185
|
+
function calculateConfidence(specFile, keywords) {
|
|
186
|
+
const fileName = specFile.fileName.toLowerCase().replace(/\.md$/, "");
|
|
187
|
+
const category = specFile.category.toLowerCase();
|
|
188
|
+
let matchCount = 0;
|
|
189
|
+
const matched = [];
|
|
190
|
+
for (const keyword of keywords) {
|
|
191
|
+
// 只做正向匹配(文件名包含关键词),避免短文件名误匹配长关键词
|
|
192
|
+
if (fileName.includes(keyword)) {
|
|
193
|
+
matchCount += 2;
|
|
194
|
+
matched.push(keyword);
|
|
195
|
+
}
|
|
196
|
+
else if (category.includes(keyword)) {
|
|
197
|
+
matchCount += 1;
|
|
198
|
+
matched.push(keyword);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (keywords.length === 0)
|
|
202
|
+
return { confidence: 0.3, matchedKeywords: [] };
|
|
203
|
+
return {
|
|
204
|
+
confidence: Math.min(1.0, matchCount / Math.max(keywords.length, 1)),
|
|
205
|
+
matchedKeywords: matched,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=context-generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-generate.js","sourceRoot":"","sources":["../../src/tools/context-generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 框架管理工具 — framework_init / framework_check / framework_update
|
|
3
|
+
*
|
|
4
|
+
* 让 AI 通过 MCP 工具直接执行框架初始化、检查和更新,
|
|
5
|
+
* 用户无需离开 IDE,无需使用命令行。
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
|
+
/**
|
|
9
|
+
* 注册 framework_init 工具
|
|
10
|
+
*/
|
|
11
|
+
export declare function registerFrameworkInit(server: McpServer): void;
|
|
12
|
+
/**
|
|
13
|
+
* 注册 framework_check 工具
|
|
14
|
+
*/
|
|
15
|
+
export declare function registerFrameworkCheck(server: McpServer): void;
|
|
16
|
+
/**
|
|
17
|
+
* 注册 framework_update 工具
|
|
18
|
+
*/
|
|
19
|
+
export declare function registerFrameworkUpdate(server: McpServer): void;
|
|
20
|
+
//# sourceMappingURL=framework-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-tools.d.ts","sourceRoot":"","sources":["../../src/tools/framework-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqHpE;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyI7D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkG9D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+H/D"}
|