@winspan/claude-forge 0.2.15 → 0.3.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.md +2 -2
- package/dist/claudemd/detector.d.ts +1 -0
- package/dist/claudemd/detector.d.ts.map +1 -1
- package/dist/claudemd/detector.js +78 -0
- package/dist/claudemd/detector.js.map +1 -1
- package/dist/daemon/handler-context.d.ts +1 -1
- package/dist/daemon/handler-context.d.ts.map +1 -1
- package/dist/daemon/handlers/session-cleanup.js +1 -1
- package/dist/daemon/handlers/session-cleanup.js.map +1 -1
- package/dist/daemon/handlers/stop-handler.d.ts.map +1 -1
- package/dist/daemon/handlers/stop-handler.js +2 -0
- package/dist/daemon/handlers/stop-handler.js.map +1 -1
- package/dist/daemon/handlers/user-prompt-handler.d.ts +2 -0
- package/dist/daemon/handlers/user-prompt-handler.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt-handler.js +32 -4
- package/dist/daemon/handlers/user-prompt-handler.js.map +1 -1
- package/dist/skill-registry/evolver/keyword-evolver.d.ts.map +1 -1
- package/dist/skill-registry/evolver/keyword-evolver.js +9 -7
- package/dist/skill-registry/evolver/keyword-evolver.js.map +1 -1
- package/dist/skill-registry/fuzzy-matcher.d.ts +15 -0
- package/dist/skill-registry/fuzzy-matcher.d.ts.map +1 -0
- package/dist/skill-registry/fuzzy-matcher.js +41 -0
- package/dist/skill-registry/fuzzy-matcher.js.map +1 -0
- package/dist/skill-registry/index.d.ts.map +1 -1
- package/dist/skill-registry/index.js +14 -5
- package/dist/skill-registry/index.js.map +1 -1
- package/dist/skill-registry/orchestration-config.d.ts +10 -0
- package/dist/skill-registry/orchestration-config.d.ts.map +1 -1
- package/dist/skill-registry/orchestration-config.js +20 -0
- package/dist/skill-registry/orchestration-config.js.map +1 -1
- package/dist/skill-registry/orchestrator.d.ts +5 -0
- package/dist/skill-registry/orchestrator.d.ts.map +1 -1
- package/dist/skill-registry/orchestrator.js +82 -29
- package/dist/skill-registry/orchestrator.js.map +1 -1
- package/dist/utils/formatter.d.ts +1 -1
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +7 -2
- package/dist/utils/formatter.js.map +1 -1
- package/dist/utils/plan-reader.d.ts +7 -8
- package/dist/utils/plan-reader.d.ts.map +1 -1
- package/dist/utils/plan-reader.js +39 -30
- package/dist/utils/plan-reader.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,64 +1,74 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* 扫描项目 docs/plan-*.md,返回包含未完成任务的计划文件路径列表(按文件名倒序,最新在前)
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
function findPlanFiles(projectPath) {
|
|
7
|
+
const docsDir = path.join(projectPath, 'docs');
|
|
8
|
+
try {
|
|
9
|
+
if (!fs.existsSync(docsDir))
|
|
10
|
+
return [];
|
|
11
|
+
return fs.readdirSync(docsDir)
|
|
12
|
+
.filter(f => /^plan-.+\.md$/.test(f))
|
|
13
|
+
.sort()
|
|
14
|
+
.reverse()
|
|
15
|
+
.map(f => path.join(docsDir, f));
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
12
20
|
}
|
|
13
21
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* 出错返回 null。
|
|
22
|
+
* 读取项目 docs/plan-*.md,返回最新的含未完成任务的计划文件。
|
|
23
|
+
* 按文件名倒序扫描,找到第一个有 pending/in-progress 任务的文件即返回。
|
|
17
24
|
*/
|
|
18
|
-
export function readPlanFile(projectPath
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
const yesterday = new Date(today);
|
|
22
|
-
yesterday.setDate(yesterday.getDate() - 1);
|
|
23
|
-
return [today, yesterday];
|
|
24
|
-
})();
|
|
25
|
-
for (const d of dates) {
|
|
25
|
+
export function readPlanFile(projectPath) {
|
|
26
|
+
const files = findPlanFiles(projectPath);
|
|
27
|
+
for (const filePath of files) {
|
|
26
28
|
try {
|
|
27
|
-
const filePath = getPlanFilePath(projectPath, d);
|
|
28
|
-
if (!fs.existsSync(filePath))
|
|
29
|
-
continue;
|
|
30
29
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
31
30
|
const tasks = parsePlanTasks(content);
|
|
32
31
|
if (tasks.length === 0)
|
|
33
32
|
continue;
|
|
34
|
-
const dateStr = d.getFullYear()
|
|
35
|
-
+ '-' + String(d.getMonth() + 1).padStart(2, '0')
|
|
36
|
-
+ '-' + String(d.getDate()).padStart(2, '0');
|
|
37
33
|
const hasInProgress = tasks.some(t => t.status === 'in-progress');
|
|
38
34
|
const hasIncomplete = tasks.some(t => t.status === 'pending' || t.status === 'in-progress');
|
|
39
|
-
|
|
35
|
+
if (!hasIncomplete)
|
|
36
|
+
continue;
|
|
37
|
+
return { filePath, tasks, hasInProgress, hasIncomplete };
|
|
40
38
|
}
|
|
41
39
|
catch {
|
|
42
|
-
|
|
40
|
+
continue;
|
|
43
41
|
}
|
|
44
42
|
}
|
|
45
43
|
return null;
|
|
46
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* 返回当前项目最新 plan 文件路径(用于提示用户在哪里写计划)。
|
|
47
|
+
* 若已有 plan 文件则返回最新的,否则返回建议新建的路径。
|
|
48
|
+
*/
|
|
49
|
+
export function getPlanFilePath(projectPath) {
|
|
50
|
+
const files = findPlanFiles(projectPath);
|
|
51
|
+
if (files.length > 0)
|
|
52
|
+
return files[0];
|
|
53
|
+
// 建议新建:docs/plan-v1.md
|
|
54
|
+
return path.join(projectPath, 'docs', 'plan-v1.md');
|
|
55
|
+
}
|
|
47
56
|
/**
|
|
48
57
|
* 构建会话开始时注入的计划上下文。
|
|
49
|
-
*
|
|
58
|
+
* 若项目 docs/ 下没有含未完成任务的 plan 文件,返回 null。
|
|
50
59
|
*/
|
|
51
60
|
export function buildSessionStartPlanContext(projectPath) {
|
|
52
61
|
try {
|
|
53
62
|
const planFile = readPlanFile(projectPath);
|
|
54
63
|
if (!planFile)
|
|
55
64
|
return null;
|
|
56
|
-
const {
|
|
65
|
+
const { filePath, tasks } = planFile;
|
|
66
|
+
const fileName = path.basename(filePath);
|
|
57
67
|
const pending = tasks.filter(t => t.status === 'pending');
|
|
58
68
|
const inProgress = tasks.filter(t => t.status === 'in-progress');
|
|
59
69
|
const done = tasks.filter(t => t.status === 'done');
|
|
60
70
|
const parts = [];
|
|
61
|
-
parts.push(`[Forge 计划]
|
|
71
|
+
parts.push(`[Forge 计划] 当前计划文件:docs/${fileName}`);
|
|
62
72
|
if (inProgress.length > 0) {
|
|
63
73
|
parts.push('进行中:');
|
|
64
74
|
for (const t of inProgress)
|
|
@@ -89,7 +99,6 @@ function parsePlanTasks(content) {
|
|
|
89
99
|
const tasks = [];
|
|
90
100
|
const lines = content.split('\n');
|
|
91
101
|
for (const line of lines) {
|
|
92
|
-
// 匹配 `- [?] 任务文字` 格式(支持任意空白前缀)
|
|
93
102
|
const match = line.match(/^\s*-\s+\[([^\]]*)\]\s+(.+)$/);
|
|
94
103
|
if (!match)
|
|
95
104
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-reader.js","sourceRoot":"","sources":["../../src/utils/plan-reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"plan-reader.js","sourceRoot":"","sources":["../../src/utils/plan-reader.ts"],"names":[],"mappings":"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"}
|