@winspan/claude-forge 0.4.7 → 0.4.9
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 +7 -7
- package/dist/ai-provider/base-provider.d.ts +23 -1
- package/dist/ai-provider/base-provider.d.ts.map +1 -1
- package/dist/ai-provider/base-provider.js +40 -1
- package/dist/ai-provider/base-provider.js.map +1 -1
- package/dist/ai-provider/ollama-provider.d.ts +9 -1
- package/dist/ai-provider/ollama-provider.d.ts.map +1 -1
- package/dist/ai-provider/ollama-provider.js +14 -1
- package/dist/ai-provider/ollama-provider.js.map +1 -1
- package/dist/ai-provider/openai-provider.d.ts +9 -1
- package/dist/ai-provider/openai-provider.d.ts.map +1 -1
- package/dist/ai-provider/openai-provider.js +11 -1
- package/dist/ai-provider/openai-provider.js.map +1 -1
- package/dist/autopilot/intent-engine.d.ts +3 -1
- package/dist/autopilot/intent-engine.d.ts.map +1 -1
- package/dist/autopilot/intent-engine.js +16 -4
- package/dist/autopilot/intent-engine.js.map +1 -1
- package/dist/cli/commands/query.d.ts.map +1 -1
- package/dist/cli/commands/query.js +30 -0
- package/dist/cli/commands/query.js.map +1 -1
- package/dist/daemon/handlers/session-cleanup.d.ts +6 -0
- package/dist/daemon/handlers/session-cleanup.d.ts.map +1 -1
- package/dist/daemon/handlers/session-cleanup.js +49 -0
- 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 +8 -0
- package/dist/daemon/handlers/user-prompt-handler.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt-handler.js +77 -7
- package/dist/daemon/handlers/user-prompt-handler.js.map +1 -1
- package/dist/daemon/server.js +1 -1
- package/dist/hooks/stop.sh +13 -1
- package/dist/pipeline/artifact-generator.d.ts.map +1 -1
- package/dist/pipeline/artifact-generator.js +34 -4
- package/dist/pipeline/artifact-generator.js.map +1 -1
- package/dist/pipeline/index.d.ts.map +1 -1
- package/dist/pipeline/index.js +12 -0
- package/dist/pipeline/index.js.map +1 -1
- package/dist/retrospective/report-writer.d.ts +3 -7
- package/dist/retrospective/report-writer.d.ts.map +1 -1
- package/dist/retrospective/report-writer.js +12 -34
- package/dist/retrospective/report-writer.js.map +1 -1
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/sqlite.d.ts +20 -2
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +73 -3
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/utils/artifact-manager.d.ts +1 -5
- package/dist/utils/artifact-manager.d.ts.map +1 -1
- package/dist/utils/artifact-manager.js +16 -18
- package/dist/utils/artifact-manager.js.map +1 -1
- package/dist/utils/plan-reader.d.ts +22 -4
- package/dist/utils/plan-reader.d.ts.map +1 -1
- package/dist/utils/plan-reader.js +62 -16
- package/dist/utils/plan-reader.js.map +1 -1
- package/package.json +1 -1
|
@@ -46,13 +46,11 @@ export class ArtifactManager {
|
|
|
46
46
|
return this.currentSessionDir;
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
|
-
*
|
|
49
|
+
* 写入产物文件(追加模式:当天同名文件追加内容,不重复创建)
|
|
50
50
|
* 支持二级目录:日期/阶段/文件名
|
|
51
51
|
*/
|
|
52
52
|
writeArtifact(type, filename, content, description, phaseSubdir) {
|
|
53
53
|
const sessionDir = this.getCurrentSessionDir();
|
|
54
|
-
const now = new Date();
|
|
55
|
-
const timePrefix = this.formatTimePrefix(now);
|
|
56
54
|
// 如果指定了阶段子目录,创建二级目录
|
|
57
55
|
let targetDir = sessionDir;
|
|
58
56
|
if (phaseSubdir) {
|
|
@@ -61,12 +59,21 @@ export class ArtifactManager {
|
|
|
61
59
|
fs.mkdirSync(targetDir, { recursive: true });
|
|
62
60
|
}
|
|
63
61
|
}
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
62
|
+
const filePath = path.join(targetDir, filename);
|
|
63
|
+
if (fs.existsSync(filePath)) {
|
|
64
|
+
// 追加模式:加分隔线后追加新内容
|
|
65
|
+
const now = new Date();
|
|
66
|
+
const timeStr = `${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;
|
|
67
|
+
const separator = `\n\n---\n\n> 追加于 ${timeStr}\n\n`;
|
|
68
|
+
fs.appendFileSync(filePath, separator + content, 'utf-8');
|
|
69
|
+
logger.info(`[Forge:产物管理] 追加 ${type} 产物: ${phaseSubdir ? phaseSubdir + '/' : ''}${filename}`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
73
|
+
logger.info(`[Forge:产物管理] 写入 ${type} 产物: ${phaseSubdir ? phaseSubdir + '/' : ''}${filename}`);
|
|
74
|
+
// 新文件才更新索引
|
|
75
|
+
this.updateIndex(type, filename, description, phaseSubdir);
|
|
76
|
+
}
|
|
70
77
|
return filePath;
|
|
71
78
|
}
|
|
72
79
|
/**
|
|
@@ -116,15 +123,6 @@ export class ArtifactManager {
|
|
|
116
123
|
const day = String(date.getDate()).padStart(2, '0');
|
|
117
124
|
return `${year}-${month}-${day}`;
|
|
118
125
|
}
|
|
119
|
-
/**
|
|
120
|
-
* 格式化时间前缀 HH-MM-SS(用于文件名去重)
|
|
121
|
-
*/
|
|
122
|
-
formatTimePrefix(date) {
|
|
123
|
-
const hour = String(date.getHours()).padStart(2, '0');
|
|
124
|
-
const minute = String(date.getMinutes()).padStart(2, '0');
|
|
125
|
-
const second = String(date.getSeconds()).padStart(2, '0');
|
|
126
|
-
return `${hour}-${minute}-${second}`;
|
|
127
|
-
}
|
|
128
126
|
/**
|
|
129
127
|
* 获取产物类型的中文标签
|
|
130
128
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-manager.js","sourceRoot":"","sources":["../../src/utils/artifact-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAcrC,MAAM,OAAO,eAAe;IAKN;IAJZ,OAAO,CAAS;IAChB,SAAS,CAAS;IAClB,iBAAiB,GAAkB,IAAI,CAAC;IAEhD,YAAoB,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;QACrC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAErD,eAAe;QACf,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC;QACpC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,aAAa,CACX,IAAkB,EAClB,QAAgB,EAChB,OAAe,EACf,WAAmB,EACnB,WAAoB;QAEpB,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"artifact-manager.js","sourceRoot":"","sources":["../../src/utils/artifact-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,14 +8,32 @@ export interface PlanFile {
|
|
|
8
8
|
hasInProgress: boolean;
|
|
9
9
|
hasIncomplete: boolean;
|
|
10
10
|
}
|
|
11
|
+
export interface ActivePlanSummary {
|
|
12
|
+
/** 计划文件相对路径(供日志/提示使用) */
|
|
13
|
+
relPath: string;
|
|
14
|
+
/** 计划标题(第一个 # 标题) */
|
|
15
|
+
title: string;
|
|
16
|
+
/** 进行中的任务列表 */
|
|
17
|
+
inProgress: string[];
|
|
18
|
+
/** 待处理的任务列表 */
|
|
19
|
+
pending: string[];
|
|
20
|
+
/** 已完成数量 */
|
|
21
|
+
doneCount: number;
|
|
22
|
+
/** 原始计划内容(供注入 AI prompt) */
|
|
23
|
+
rawContent: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 读取活跃计划的结构化摘要(供意图引擎使用)。
|
|
27
|
+
* 返回 null 表示无活跃计划。
|
|
28
|
+
*/
|
|
29
|
+
export declare function readActivePlanSummary(projectPath: string): ActivePlanSummary | null;
|
|
11
30
|
/**
|
|
12
|
-
*
|
|
13
|
-
* 按文件名倒序扫描,找到第一个有 pending/in-progress 任务的文件即返回。
|
|
31
|
+
* 读取最新含未完成任务的计划文件(新格式优先,兼容旧格式)。
|
|
14
32
|
*/
|
|
15
33
|
export declare function readPlanFile(projectPath: string): PlanFile | null;
|
|
16
34
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
35
|
+
* 返回今日计划文档写入路径(供提示信息使用)。
|
|
36
|
+
* 格式:docs/YYYY-MM-DD/架构设计/实现计划.md
|
|
19
37
|
*/
|
|
20
38
|
export declare function getPlanFilePath(projectPath: string): string;
|
|
21
39
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-reader.d.ts","sourceRoot":"","sources":["../../src/utils/plan-reader.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC;CAC5C;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"plan-reader.d.ts","sourceRoot":"","sources":["../../src/utils/plan-reader.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,MAAM,CAAC;CAC5C;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAgDD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAmBnF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAgBjE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgC/E"}
|
|
@@ -1,26 +1,73 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* 扫描 docs/YYYY-MM-DD/架构设计/ 目录下的计划文档(最新日期优先)。
|
|
5
|
+
* 同时兼容旧格式 docs/plan-*.md(向后兼容,排在新格式之后)。
|
|
5
6
|
*/
|
|
6
7
|
function findPlanFiles(projectPath) {
|
|
7
8
|
const docsDir = path.join(projectPath, 'docs');
|
|
9
|
+
if (!fs.existsSync(docsDir))
|
|
10
|
+
return [];
|
|
11
|
+
const results = [];
|
|
12
|
+
try {
|
|
13
|
+
// 新格式:docs/YYYY-MM-DD/架构设计/*.md(按日期倒序)
|
|
14
|
+
const dateDirs = fs.readdirSync(docsDir)
|
|
15
|
+
.filter(f => /^\d{4}-\d{2}-\d{2}$/.test(f))
|
|
16
|
+
.sort()
|
|
17
|
+
.reverse();
|
|
18
|
+
for (const dateDir of dateDirs) {
|
|
19
|
+
const designDir = path.join(docsDir, dateDir, '架构设计');
|
|
20
|
+
if (!fs.existsSync(designDir))
|
|
21
|
+
continue;
|
|
22
|
+
const files = fs.readdirSync(designDir)
|
|
23
|
+
.filter(f => f.endsWith('.md'))
|
|
24
|
+
.sort()
|
|
25
|
+
.reverse()
|
|
26
|
+
.map(f => path.join(designDir, f));
|
|
27
|
+
results.push(...files);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// 忽略读取错误
|
|
32
|
+
}
|
|
8
33
|
try {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return fs.readdirSync(docsDir)
|
|
34
|
+
// 旧格式(兼容):docs/plan-*.md
|
|
35
|
+
const legacyFiles = fs.readdirSync(docsDir)
|
|
12
36
|
.filter(f => /^plan-.+\.md$/.test(f))
|
|
13
37
|
.sort()
|
|
14
38
|
.reverse()
|
|
15
39
|
.map(f => path.join(docsDir, f));
|
|
40
|
+
results.push(...legacyFiles);
|
|
16
41
|
}
|
|
17
42
|
catch {
|
|
18
|
-
|
|
43
|
+
// 忽略读取错误
|
|
19
44
|
}
|
|
45
|
+
return results;
|
|
20
46
|
}
|
|
21
47
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
48
|
+
* 读取活跃计划的结构化摘要(供意图引擎使用)。
|
|
49
|
+
* 返回 null 表示无活跃计划。
|
|
50
|
+
*/
|
|
51
|
+
export function readActivePlanSummary(projectPath) {
|
|
52
|
+
const planFile = readPlanFile(projectPath);
|
|
53
|
+
if (!planFile)
|
|
54
|
+
return null;
|
|
55
|
+
try {
|
|
56
|
+
const rawContent = fs.readFileSync(planFile.filePath, 'utf-8');
|
|
57
|
+
const relPath = path.relative(projectPath, planFile.filePath);
|
|
58
|
+
const titleMatch = rawContent.match(/^#\s+(.+)$/m);
|
|
59
|
+
const title = titleMatch ? titleMatch[1].trim() : '实现计划';
|
|
60
|
+
const inProgress = planFile.tasks.filter(t => t.status === 'in-progress').map(t => t.title);
|
|
61
|
+
const pending = planFile.tasks.filter(t => t.status === 'pending').map(t => t.title);
|
|
62
|
+
const doneCount = planFile.tasks.filter(t => t.status === 'done').length;
|
|
63
|
+
return { relPath, title, inProgress, pending, doneCount, rawContent };
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 读取最新含未完成任务的计划文件(新格式优先,兼容旧格式)。
|
|
24
71
|
*/
|
|
25
72
|
export function readPlanFile(projectPath) {
|
|
26
73
|
const files = findPlanFiles(projectPath);
|
|
@@ -43,15 +90,13 @@ export function readPlanFile(projectPath) {
|
|
|
43
90
|
return null;
|
|
44
91
|
}
|
|
45
92
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
93
|
+
* 返回今日计划文档写入路径(供提示信息使用)。
|
|
94
|
+
* 格式:docs/YYYY-MM-DD/架构设计/实现计划.md
|
|
48
95
|
*/
|
|
49
96
|
export function getPlanFilePath(projectPath) {
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
// 建议新建:docs/plan-v1.md
|
|
54
|
-
return path.join(projectPath, 'docs', 'plan-v1.md');
|
|
97
|
+
const now = new Date();
|
|
98
|
+
const dateDir = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;
|
|
99
|
+
return path.join(projectPath, 'docs', dateDir, '架构设计', '实现计划.md');
|
|
55
100
|
}
|
|
56
101
|
/**
|
|
57
102
|
* 构建会话开始时注入的计划上下文。
|
|
@@ -63,12 +108,13 @@ export function buildSessionStartPlanContext(projectPath) {
|
|
|
63
108
|
if (!planFile)
|
|
64
109
|
return null;
|
|
65
110
|
const { filePath, tasks } = planFile;
|
|
66
|
-
|
|
111
|
+
// 相对于 projectPath 展示路径
|
|
112
|
+
const relPath = path.relative(projectPath, filePath);
|
|
67
113
|
const pending = tasks.filter(t => t.status === 'pending');
|
|
68
114
|
const inProgress = tasks.filter(t => t.status === 'in-progress');
|
|
69
115
|
const done = tasks.filter(t => t.status === 'done');
|
|
70
116
|
const parts = [];
|
|
71
|
-
parts.push(`[Forge 计划]
|
|
117
|
+
parts.push(`[Forge 计划] 当前计划文件:${relPath}`);
|
|
72
118
|
if (inProgress.length > 0) {
|
|
73
119
|
parts.push('进行中:');
|
|
74
120
|
for (const t of inProgress)
|
|
@@ -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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"}
|