@wandoupeas/coding-forge 0.1.0 → 0.1.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 +9 -9
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +21 -10
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/record.d.ts +11 -0
- package/dist/cli/commands/record.d.ts.map +1 -0
- package/dist/cli/commands/record.js +425 -0
- package/dist/cli/commands/record.js.map +1 -0
- package/dist/cli/commands/ui.js +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +13 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/core/logger.d.ts +5 -0
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +28 -0
- package/dist/core/logger.js.map +1 -1
- package/dist/core/planning.d.ts +13 -0
- package/dist/core/planning.d.ts.map +1 -1
- package/dist/core/planning.js +174 -7
- package/dist/core/planning.js.map +1 -1
- package/dist/ui/assets/index-B0LGSKSp.js +148 -0
- package/dist/ui/assets/index-BdOHfAmP.js +148 -0
- package/dist/ui/assets/index-BfMXz_A9.js +212 -0
- package/dist/ui/assets/index-C1V1OpTU.js +212 -0
- package/dist/ui/assets/index-CoJ1w_rN.js +212 -0
- package/dist/ui/assets/index-Cwtzi3AY.js +212 -0
- package/dist/ui/assets/index-DKs5v38z.js +148 -0
- package/dist/ui/assets/index-DlGG47Su.js +212 -0
- package/dist/ui/assets/index-bcUWb_BE.js +212 -0
- package/dist/ui/assets/index-gcGvB3SX.js +212 -0
- package/dist/ui/http/handlers/project-artifacts.d.ts.map +1 -1
- package/dist/ui/http/handlers/project-artifacts.js +3 -6
- package/dist/ui/http/handlers/project-artifacts.js.map +1 -1
- package/dist/ui/http/handlers/project-overview.d.ts.map +1 -1
- package/dist/ui/http/handlers/project-overview.js +3 -6
- package/dist/ui/http/handlers/project-overview.js.map +1 -1
- package/dist/ui/http/handlers/project-recovery.d.ts.map +1 -1
- package/dist/ui/http/handlers/project-recovery.js +3 -6
- package/dist/ui/http/handlers/project-recovery.js.map +1 -1
- package/dist/ui/http/handlers/project-runtime.d.ts.map +1 -1
- package/dist/ui/http/handlers/project-runtime.js +3 -6
- package/dist/ui/http/handlers/project-runtime.js.map +1 -1
- package/dist/ui/http/handlers/project-tasks.d.ts.map +1 -1
- package/dist/ui/http/handlers/project-tasks.js +3 -6
- package/dist/ui/http/handlers/project-tasks.js.map +1 -1
- package/dist/ui/http/handlers/projects.d.ts +15 -0
- package/dist/ui/http/handlers/projects.d.ts.map +1 -1
- package/dist/ui/http/handlers/projects.js +27 -0
- package/dist/ui/http/handlers/projects.js.map +1 -1
- package/dist/ui/http/router.d.ts.map +1 -1
- package/dist/ui/http/router.js +47 -27
- package/dist/ui/http/router.js.map +1 -1
- package/dist/ui/http/server.js +1 -1
- package/dist/ui/index.html +1 -1
- package/dist/ui/project-scanner.js +1 -1
- package/dist/ui/project-scanner.js.map +1 -1
- package/package.json +6 -3
package/README.md
CHANGED
|
@@ -105,12 +105,12 @@ node dist/cli/index.js ui --root ~/projects
|
|
|
105
105
|
webforge ui --root ~/projects
|
|
106
106
|
```
|
|
107
107
|
|
|
108
|
-
这个 UI 当前是只读监控台,会自动扫描根目录下带 `.webforge/`
|
|
108
|
+
这个 UI 当前是只读监控台,会自动扫描根目录下带 `.webforge/` 的项目,并提供一套更接近“研究终端”的观察面:
|
|
109
109
|
|
|
110
|
-
-
|
|
111
|
-
-
|
|
112
|
-
-
|
|
113
|
-
- runtime / drift /
|
|
110
|
+
- 首页 `Project Index + Workspace Ledger + Signal Rail`
|
|
111
|
+
- 单项目统一 `Summary / Evidence / Runtime` 骨架
|
|
112
|
+
- knowledge / deliverables / sessions 的资源浏览器
|
|
113
|
+
- runtime 事件流、双快照对照、checkpoint / drift / mailbox / superpowers 观察
|
|
114
114
|
|
|
115
115
|
## 怎么使用
|
|
116
116
|
|
|
@@ -172,10 +172,10 @@ webforge ui --root ~/projects
|
|
|
172
172
|
|
|
173
173
|
推荐用法:
|
|
174
174
|
|
|
175
|
-
1.
|
|
176
|
-
2.
|
|
177
|
-
3.
|
|
178
|
-
4.
|
|
175
|
+
1. 在首页用 `Project Index` 快速切项目,用 `Workspace Ledger` 看当前快照,用 `Signal Rail` 盯住 blocked / pending review / drift
|
|
176
|
+
2. 进入单项目后,始终先看右侧 recovery rail,再决定沿 `Summary / Evidence / Runtime` 哪条视角继续
|
|
177
|
+
3. 在 `Evidence` 里把 knowledge / deliverable / session 当资源浏览器来读,而不是翻三列卡片
|
|
178
|
+
4. 在 `Runtime` 里优先看 `Recent events` 和 `Snapshots comparison`,再看 drift reasons 和 checkpoint
|
|
179
179
|
|
|
180
180
|
## 仓库结构
|
|
181
181
|
|
|
@@ -14,6 +14,7 @@ export interface InitVerificationSummary {
|
|
|
14
14
|
export declare function createInitCommand(): Command;
|
|
15
15
|
export declare function initProject(projectName: string, options: {
|
|
16
16
|
template?: string;
|
|
17
|
+
inPlace?: boolean;
|
|
17
18
|
}, basePath?: string): Promise<void>;
|
|
18
19
|
export declare function buildInitVerificationSummary(projectRoot: string): Promise<InitVerificationSummary>;
|
|
19
20
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,EAAE,EAAE,OAAO,CAAC;CACb;AAED,wBAAgB,iBAAiB,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,EAAE,EAAE,OAAO,CAAC;CACb;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAgB3C;AAED,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EACjD,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,IAAI,CAAC,CA6Cf;AAuBD,wBAAsB,4BAA4B,CAChD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,uBAAuB,CAAC,CAwBlC"}
|
|
@@ -14,6 +14,7 @@ export function createInitCommand() {
|
|
|
14
14
|
.description('初始化 WebForge 项目')
|
|
15
15
|
.argument('<project-name>', '项目名称')
|
|
16
16
|
.option('-t, --template <template>', '项目模板', 'default')
|
|
17
|
+
.option('--in-place', '在当前目录就地初始化(不创建子目录)')
|
|
17
18
|
.action(async (projectName, options) => {
|
|
18
19
|
try {
|
|
19
20
|
await initProject(projectName, options);
|
|
@@ -27,7 +28,7 @@ export function createInitCommand() {
|
|
|
27
28
|
}
|
|
28
29
|
export async function initProject(projectName, options, basePath = process.cwd()) {
|
|
29
30
|
logger.info(`初始化项目: ${projectName}\n`);
|
|
30
|
-
const projectRoot = join(basePath, projectName);
|
|
31
|
+
const projectRoot = options.inPlace ? basePath : join(basePath, projectName);
|
|
31
32
|
const state = await createWorkspace(projectRoot, {
|
|
32
33
|
projectName,
|
|
33
34
|
template: options.template
|
|
@@ -45,15 +46,25 @@ export async function initProject(projectName, options, basePath = process.cwd()
|
|
|
45
46
|
logger.info('验证入口: webforge verify init');
|
|
46
47
|
console.log();
|
|
47
48
|
logger.info('下一步:');
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
49
|
+
const nextSteps = options.inPlace
|
|
50
|
+
? [
|
|
51
|
+
`workspace: ${state.paths.workspace}`,
|
|
52
|
+
`runtime: ${state.paths.runtime}`,
|
|
53
|
+
'webforge onboard --json',
|
|
54
|
+
'如需重跑初始化后自检,执行 webforge verify init',
|
|
55
|
+
'必要时再拆开执行 webforge doctor / webforge resume / webforge logs runtime',
|
|
56
|
+
'把需求文档放进 .webforge/knowledge/requirements/'
|
|
57
|
+
]
|
|
58
|
+
: [
|
|
59
|
+
`cd ${projectName}`,
|
|
60
|
+
`workspace: ${state.paths.workspace}`,
|
|
61
|
+
`runtime: ${state.paths.runtime}`,
|
|
62
|
+
'webforge onboard --json',
|
|
63
|
+
'如需重跑初始化后自检,执行 webforge verify init',
|
|
64
|
+
'必要时再拆开执行 webforge doctor / webforge resume / webforge logs runtime',
|
|
65
|
+
'把需求文档放进 .webforge/knowledge/requirements/'
|
|
66
|
+
];
|
|
67
|
+
logger.list(nextSteps);
|
|
57
68
|
console.log();
|
|
58
69
|
}
|
|
59
70
|
async function scaffoldRepoContract(projectRoot, projectName) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAYhD,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;SAChC,WAAW,CAAC,iBAAiB,CAAC;SAC9B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;SAClC,MAAM,CAAC,2BAA2B,EAAE,MAAM,EAAE,SAAS,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* record 命令 - 旁路回写
|
|
3
|
+
*
|
|
4
|
+
* 当 agent 直接在仓库里工作(不走 webforge run 主循环)时,
|
|
5
|
+
* 用这个命令把已完成的工作回写到 .webforge/。
|
|
6
|
+
*
|
|
7
|
+
* 这解决了 harness 的核心缺陷:只有 runtime 主循环内部才会自动回写状态。
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
export declare function createRecordCommand(): Command;
|
|
11
|
+
//# sourceMappingURL=record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/record.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,wBAAgB,mBAAmB,IAAI,OAAO,CAkF7C"}
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* record 命令 - 旁路回写
|
|
3
|
+
*
|
|
4
|
+
* 当 agent 直接在仓库里工作(不走 webforge run 主循环)时,
|
|
5
|
+
* 用这个命令把已完成的工作回写到 .webforge/。
|
|
6
|
+
*
|
|
7
|
+
* 这解决了 harness 的核心缺陷:只有 runtime 主循环内部才会自动回写状态。
|
|
8
|
+
*/
|
|
9
|
+
import { Command } from 'commander';
|
|
10
|
+
import { existsSync } from 'fs';
|
|
11
|
+
import { execSync } from 'child_process';
|
|
12
|
+
import { join } from 'path';
|
|
13
|
+
import logger from '../utils/logger.js';
|
|
14
|
+
import { readJson, writeJson } from '../../utils/file.js';
|
|
15
|
+
import { LogManager } from '../../core/logger.js';
|
|
16
|
+
export function createRecordCommand() {
|
|
17
|
+
const command = new Command('record')
|
|
18
|
+
.description('旁路回写:把直接完成的工作记录到 .webforge/');
|
|
19
|
+
command
|
|
20
|
+
.command('task <task-id>')
|
|
21
|
+
.description('更新任务状态并记录到 runtime log')
|
|
22
|
+
.option('-s, --status <status>', '任务状态: completed/in_progress/blocked', 'completed')
|
|
23
|
+
.option('--summary <text>', '完成摘要')
|
|
24
|
+
.option('-d, --deliverable <paths...>', '关联的交付物文件路径')
|
|
25
|
+
.option('--session <id>', '会话 ID(默认自动生成)')
|
|
26
|
+
.action(async (taskId, options) => {
|
|
27
|
+
try {
|
|
28
|
+
await recordTask(taskId, options);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
logger.error(`回写失败: ${error}`);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
command
|
|
36
|
+
.command('session')
|
|
37
|
+
.description('创建或更新当前工作会话')
|
|
38
|
+
.option('--summary <text>', '会话摘要')
|
|
39
|
+
.option('-p, --phase <id>', '当前阶段')
|
|
40
|
+
.option('-t, --task <id>', '当前任务')
|
|
41
|
+
.action(async (options) => {
|
|
42
|
+
try {
|
|
43
|
+
await recordSession(options);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
logger.error(`回写失败: ${error}`);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
command
|
|
51
|
+
.command('log <message>')
|
|
52
|
+
.description('追加一条 runtime 事件日志')
|
|
53
|
+
.option('-t, --task <id>', '关联的任务 ID')
|
|
54
|
+
.option('--level <level>', '日志级别: info/warning/error', 'info')
|
|
55
|
+
.action(async (message, options) => {
|
|
56
|
+
try {
|
|
57
|
+
await recordLog(message, options);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
logger.error(`回写失败: ${error}`);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
command
|
|
65
|
+
.command('auto')
|
|
66
|
+
.description('自动检测 git 变更并回写到 .webforge/(适合 hook 调用)')
|
|
67
|
+
.option('--summary <text>', '工作摘要')
|
|
68
|
+
.option('--json', 'JSON 输出')
|
|
69
|
+
.action(async (options) => {
|
|
70
|
+
try {
|
|
71
|
+
await recordAuto(options);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (!options.json) {
|
|
75
|
+
logger.error(`自动回写失败: ${error}`);
|
|
76
|
+
}
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
command
|
|
81
|
+
.command('snapshot')
|
|
82
|
+
.description('保存当前工作快照(适合会话结束时的 Stop hook)')
|
|
83
|
+
.option('--reason <text>', '快照原因', 'session_end')
|
|
84
|
+
.option('--json', 'JSON 输出')
|
|
85
|
+
.action(async (options) => {
|
|
86
|
+
try {
|
|
87
|
+
await recordSnapshot(options);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
if (!options.json) {
|
|
91
|
+
logger.error(`快照失败: ${error}`);
|
|
92
|
+
}
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return command;
|
|
97
|
+
}
|
|
98
|
+
async function recordTask(taskId, options, basePath = process.cwd()) {
|
|
99
|
+
const tasksPath = join(basePath, '.webforge', 'tasks.json');
|
|
100
|
+
const runtimePath = join(basePath, '.webforge', 'runtime.json');
|
|
101
|
+
if (!existsSync(tasksPath)) {
|
|
102
|
+
throw new Error('.webforge/tasks.json 不存在,请先运行 webforge init');
|
|
103
|
+
}
|
|
104
|
+
const tasksData = await readJson(tasksPath);
|
|
105
|
+
const task = tasksData.tasks.find((t) => t.id === taskId);
|
|
106
|
+
if (!task) {
|
|
107
|
+
throw new Error(`任务 ${taskId} 不存在`);
|
|
108
|
+
}
|
|
109
|
+
const newStatus = options.status ?? 'completed';
|
|
110
|
+
const now = new Date().toISOString();
|
|
111
|
+
const oldStatus = task.status;
|
|
112
|
+
task.status = newStatus;
|
|
113
|
+
task.updated_at = now;
|
|
114
|
+
if (options.summary) {
|
|
115
|
+
task.description = options.summary;
|
|
116
|
+
}
|
|
117
|
+
await writeJson(tasksPath, tasksData);
|
|
118
|
+
// 写 runtime log
|
|
119
|
+
const sessionId = options.session ?? await getOrCreateSessionId(basePath);
|
|
120
|
+
const logManager = new LogManager('runtime', basePath, sessionId);
|
|
121
|
+
await logManager.addEntry('info', `task_${newStatus}`, {
|
|
122
|
+
taskId,
|
|
123
|
+
metadata: {
|
|
124
|
+
previousStatus: oldStatus,
|
|
125
|
+
newStatus,
|
|
126
|
+
summary: options.summary ?? `${taskId} marked as ${newStatus}`,
|
|
127
|
+
recordedBy: 'webforge record task',
|
|
128
|
+
sessionId
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
// 写 deliverables
|
|
132
|
+
if (options.deliverable && options.deliverable.length > 0) {
|
|
133
|
+
await recordDeliverables(basePath, taskId, options.deliverable, now);
|
|
134
|
+
}
|
|
135
|
+
// 更新 runtime
|
|
136
|
+
const runtime = await readJson(runtimePath);
|
|
137
|
+
runtime.updatedAt = now;
|
|
138
|
+
runtime.sessionId = sessionId;
|
|
139
|
+
runtime.taskId = taskId;
|
|
140
|
+
runtime.phaseId = task.phase ?? runtime.phaseId;
|
|
141
|
+
runtime.summary = options.summary ?? `${taskId} → ${newStatus}`;
|
|
142
|
+
await writeJson(runtimePath, runtime);
|
|
143
|
+
// 更新 session
|
|
144
|
+
await persistSessionRecord(basePath, sessionId, taskId, task.phase, now);
|
|
145
|
+
logger.success(`${taskId}: ${oldStatus} → ${newStatus}`);
|
|
146
|
+
if (options.deliverable) {
|
|
147
|
+
logger.info(`交付物: ${options.deliverable.join(', ')}`);
|
|
148
|
+
}
|
|
149
|
+
logger.info(`会话: ${sessionId}`);
|
|
150
|
+
logger.info(`日志: .webforge/logs/runtime-${sessionId}.jsonl`);
|
|
151
|
+
}
|
|
152
|
+
async function recordSession(options, basePath = process.cwd()) {
|
|
153
|
+
const runtimePath = join(basePath, '.webforge', 'runtime.json');
|
|
154
|
+
if (!existsSync(runtimePath)) {
|
|
155
|
+
throw new Error('.webforge/runtime.json 不存在');
|
|
156
|
+
}
|
|
157
|
+
const now = new Date().toISOString();
|
|
158
|
+
const sessionId = await getOrCreateSessionId(basePath);
|
|
159
|
+
const runtime = await readJson(runtimePath);
|
|
160
|
+
runtime.updatedAt = now;
|
|
161
|
+
runtime.status = 'active';
|
|
162
|
+
runtime.sessionId = sessionId;
|
|
163
|
+
if (options.phase) {
|
|
164
|
+
runtime.phaseId = options.phase;
|
|
165
|
+
}
|
|
166
|
+
if (options.task) {
|
|
167
|
+
runtime.taskId = options.task;
|
|
168
|
+
}
|
|
169
|
+
if (options.summary) {
|
|
170
|
+
runtime.summary = options.summary;
|
|
171
|
+
}
|
|
172
|
+
await writeJson(runtimePath, runtime);
|
|
173
|
+
await persistSessionRecord(basePath, sessionId, options.task ?? runtime.taskId ?? null, options.phase ?? runtime.phaseId ?? null, now);
|
|
174
|
+
const logManager = new LogManager('runtime', basePath, sessionId);
|
|
175
|
+
await logManager.addEntry('info', 'session_recorded', {
|
|
176
|
+
metadata: {
|
|
177
|
+
summary: options.summary ?? 'session recorded via webforge record',
|
|
178
|
+
recordedBy: 'webforge record session'
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
logger.success(`会话已记录: ${sessionId}`);
|
|
182
|
+
logger.info(`状态: phase=${options.phase ?? 'unchanged'}, task=${options.task ?? 'unchanged'}`);
|
|
183
|
+
}
|
|
184
|
+
async function recordLog(message, options, basePath = process.cwd()) {
|
|
185
|
+
const sessionId = await getOrCreateSessionId(basePath);
|
|
186
|
+
const logManager = new LogManager('runtime', basePath, sessionId);
|
|
187
|
+
const level = (options.level ?? 'info');
|
|
188
|
+
await logManager.addEntry(level, message, {
|
|
189
|
+
taskId: options.task,
|
|
190
|
+
metadata: {
|
|
191
|
+
recordedBy: 'webforge record log'
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
logger.success(`日志已记录: ${message}`);
|
|
195
|
+
}
|
|
196
|
+
async function getOrCreateSessionId(basePath) {
|
|
197
|
+
const runtimePath = join(basePath, '.webforge', 'runtime.json');
|
|
198
|
+
if (existsSync(runtimePath)) {
|
|
199
|
+
const runtime = await readJson(runtimePath);
|
|
200
|
+
if (runtime.sessionId) {
|
|
201
|
+
return runtime.sessionId;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return `record-${Date.now()}`;
|
|
205
|
+
}
|
|
206
|
+
async function persistSessionRecord(basePath, sessionId, taskId, phaseId, timestamp) {
|
|
207
|
+
const sessionsPath = join(basePath, '.webforge', 'sessions', 'index.json');
|
|
208
|
+
const sessions = existsSync(sessionsPath)
|
|
209
|
+
? await readJson(sessionsPath)
|
|
210
|
+
: [];
|
|
211
|
+
const existingIndex = sessions.findIndex((s) => s.id === sessionId);
|
|
212
|
+
const sessionRecord = {
|
|
213
|
+
id: sessionId,
|
|
214
|
+
name: `work session ${sessionId}`,
|
|
215
|
+
status: 'active',
|
|
216
|
+
lastActive: timestamp,
|
|
217
|
+
currentTask: taskId,
|
|
218
|
+
currentPhase: phaseId
|
|
219
|
+
};
|
|
220
|
+
if (existingIndex >= 0) {
|
|
221
|
+
sessions[existingIndex] = { ...sessions[existingIndex], ...sessionRecord };
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
sessions.push(sessionRecord);
|
|
225
|
+
}
|
|
226
|
+
await writeJson(sessionsPath, sessions);
|
|
227
|
+
}
|
|
228
|
+
async function recordDeliverables(basePath, taskId, paths, timestamp) {
|
|
229
|
+
const indexPath = join(basePath, '.webforge', 'deliverables', 'index.json');
|
|
230
|
+
const deliverables = existsSync(indexPath)
|
|
231
|
+
? await readJson(indexPath)
|
|
232
|
+
: [];
|
|
233
|
+
for (const filePath of paths) {
|
|
234
|
+
const id = `D${String(deliverables.length + 1).padStart(3, '0')}`;
|
|
235
|
+
deliverables.push({
|
|
236
|
+
id,
|
|
237
|
+
taskId,
|
|
238
|
+
title: filePath.split('/').pop() ?? filePath,
|
|
239
|
+
type: 'file',
|
|
240
|
+
status: 'completed',
|
|
241
|
+
path: filePath,
|
|
242
|
+
createdAt: timestamp,
|
|
243
|
+
createdBy: 'agent'
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
await writeJson(indexPath, deliverables);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* 基于 git diff 自动检测改动并回写到 .webforge/
|
|
250
|
+
*/
|
|
251
|
+
async function recordAuto(options, basePath = process.cwd()) {
|
|
252
|
+
const runtimePath = join(basePath, '.webforge', 'runtime.json');
|
|
253
|
+
if (!existsSync(runtimePath)) {
|
|
254
|
+
if (options.json) {
|
|
255
|
+
console.log(JSON.stringify({ recorded: false, reason: 'no_workspace' }));
|
|
256
|
+
}
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
const now = new Date().toISOString();
|
|
260
|
+
const sessionId = await getOrCreateSessionId(basePath);
|
|
261
|
+
const changedFiles = getGitChangedFiles(basePath);
|
|
262
|
+
if (changedFiles.length === 0) {
|
|
263
|
+
if (options.json) {
|
|
264
|
+
console.log(JSON.stringify({ recorded: false, reason: 'no_changes' }));
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
logger.info('没有检测到文件变更,跳过回写');
|
|
268
|
+
}
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
// 分类改动文件
|
|
272
|
+
const srcFiles = changedFiles.filter((f) => f.startsWith('src/') || f.startsWith('ui/'));
|
|
273
|
+
const testFiles = changedFiles.filter((f) => f.includes('test') || f.includes('spec'));
|
|
274
|
+
const docFiles = changedFiles.filter((f) => f.endsWith('.md') || f.startsWith('docs/'));
|
|
275
|
+
const configFiles = changedFiles.filter((f) => f.includes('config') || f.includes('package.json') || f.includes('tsconfig'));
|
|
276
|
+
const autoSummary = options.summary ?? buildAutoSummary(srcFiles, testFiles, docFiles, configFiles);
|
|
277
|
+
// 更新 runtime
|
|
278
|
+
const runtime = await readJson(runtimePath);
|
|
279
|
+
runtime.updatedAt = now;
|
|
280
|
+
runtime.status = 'active';
|
|
281
|
+
runtime.sessionId = sessionId;
|
|
282
|
+
runtime.summary = autoSummary;
|
|
283
|
+
await writeJson(runtimePath, runtime);
|
|
284
|
+
// 记录 session
|
|
285
|
+
await persistSessionRecord(basePath, sessionId, runtime.taskId, runtime.phaseId, now);
|
|
286
|
+
// 写 log
|
|
287
|
+
const logManager = new LogManager('runtime', basePath, sessionId);
|
|
288
|
+
await logManager.addEntry('info', 'auto_record', {
|
|
289
|
+
taskId: runtime.taskId ?? undefined,
|
|
290
|
+
metadata: {
|
|
291
|
+
summary: autoSummary,
|
|
292
|
+
changedFileCount: changedFiles.length,
|
|
293
|
+
srcFiles: srcFiles.length,
|
|
294
|
+
testFiles: testFiles.length,
|
|
295
|
+
docFiles: docFiles.length,
|
|
296
|
+
recordedBy: 'webforge record auto'
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
// 记录交付物
|
|
300
|
+
if (srcFiles.length > 0 && runtime.taskId) {
|
|
301
|
+
await recordDeliverables(basePath, runtime.taskId, srcFiles.slice(0, 20), now);
|
|
302
|
+
}
|
|
303
|
+
if (options.json) {
|
|
304
|
+
console.log(JSON.stringify({
|
|
305
|
+
recorded: true,
|
|
306
|
+
sessionId,
|
|
307
|
+
changedFiles: changedFiles.length,
|
|
308
|
+
summary: autoSummary
|
|
309
|
+
}));
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
logger.success(`自动回写完成`);
|
|
313
|
+
logger.info(`会话: ${sessionId}`);
|
|
314
|
+
logger.info(`变更文件: ${changedFiles.length} (src=${srcFiles.length} test=${testFiles.length} doc=${docFiles.length})`);
|
|
315
|
+
logger.info(`摘要: ${autoSummary}`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* 保存当前工作快照 — 会话结束时由 Stop hook 调用
|
|
320
|
+
*/
|
|
321
|
+
async function recordSnapshot(options, basePath = process.cwd()) {
|
|
322
|
+
const runtimePath = join(basePath, '.webforge', 'runtime.json');
|
|
323
|
+
if (!existsSync(runtimePath)) {
|
|
324
|
+
if (options.json) {
|
|
325
|
+
console.log(JSON.stringify({ snapshot: false, reason: 'no_workspace' }));
|
|
326
|
+
}
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
const now = new Date().toISOString();
|
|
330
|
+
const reason = options.reason ?? 'session_end';
|
|
331
|
+
const sessionId = await getOrCreateSessionId(basePath);
|
|
332
|
+
const changedFiles = getGitChangedFiles(basePath);
|
|
333
|
+
// 读取当前 tasks 状态
|
|
334
|
+
const tasksPath = join(basePath, '.webforge', 'tasks.json');
|
|
335
|
+
let taskSummary = '';
|
|
336
|
+
if (existsSync(tasksPath)) {
|
|
337
|
+
const tasksData = await readJson(tasksPath);
|
|
338
|
+
const completed = tasksData.tasks.filter((t) => t.status === 'completed').length;
|
|
339
|
+
const inProgress = tasksData.tasks.filter((t) => t.status === 'in_progress').length;
|
|
340
|
+
const ready = tasksData.tasks.filter((t) => t.status === 'ready').length;
|
|
341
|
+
const total = tasksData.tasks.length;
|
|
342
|
+
taskSummary = `${completed}/${total} 已完成, ${inProgress} 进行中, ${ready} 就绪`;
|
|
343
|
+
}
|
|
344
|
+
// 更新 runtime 为 idle
|
|
345
|
+
const runtime = await readJson(runtimePath);
|
|
346
|
+
const previousSummary = runtime.summary;
|
|
347
|
+
runtime.updatedAt = now;
|
|
348
|
+
runtime.status = 'idle';
|
|
349
|
+
runtime.summary = `会话暂停: ${reason}. 上次工作: ${previousSummary}`;
|
|
350
|
+
await writeJson(runtimePath, runtime);
|
|
351
|
+
// 更新 session 为 paused
|
|
352
|
+
const sessionsPath = join(basePath, '.webforge', 'sessions', 'index.json');
|
|
353
|
+
if (existsSync(sessionsPath)) {
|
|
354
|
+
const sessions = await readJson(sessionsPath);
|
|
355
|
+
const currentSession = sessions.find((s) => s.id === sessionId);
|
|
356
|
+
if (currentSession) {
|
|
357
|
+
currentSession.status = 'paused';
|
|
358
|
+
currentSession.lastActive = now;
|
|
359
|
+
await writeJson(sessionsPath, sessions);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
// 写 log
|
|
363
|
+
const logManager = new LogManager('runtime', basePath, sessionId);
|
|
364
|
+
await logManager.addEntry('info', `snapshot_${reason}`, {
|
|
365
|
+
taskId: runtime.taskId ?? undefined,
|
|
366
|
+
metadata: {
|
|
367
|
+
reason,
|
|
368
|
+
previousSummary,
|
|
369
|
+
taskSummary,
|
|
370
|
+
changedFileCount: changedFiles.length,
|
|
371
|
+
changedFiles: changedFiles.slice(0, 30),
|
|
372
|
+
recordedBy: 'webforge record snapshot'
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
if (options.json) {
|
|
376
|
+
console.log(JSON.stringify({
|
|
377
|
+
snapshot: true,
|
|
378
|
+
sessionId,
|
|
379
|
+
reason,
|
|
380
|
+
taskSummary,
|
|
381
|
+
changedFiles: changedFiles.length,
|
|
382
|
+
previousSummary
|
|
383
|
+
}));
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
logger.success(`快照已保存: ${reason}`);
|
|
387
|
+
logger.info(`会话: ${sessionId} → paused`);
|
|
388
|
+
logger.info(`任务: ${taskSummary}`);
|
|
389
|
+
logger.info(`变更文件: ${changedFiles.length}`);
|
|
390
|
+
logger.info(`上次工作: ${previousSummary}`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
function getGitChangedFiles(basePath) {
|
|
394
|
+
try {
|
|
395
|
+
const output = execSync('git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null || echo ""', {
|
|
396
|
+
cwd: basePath,
|
|
397
|
+
encoding: 'utf-8',
|
|
398
|
+
timeout: 5000
|
|
399
|
+
});
|
|
400
|
+
return output
|
|
401
|
+
.split('\n')
|
|
402
|
+
.map((line) => line.trim())
|
|
403
|
+
.filter((line) => line.length > 0 && !line.startsWith('.webforge/'));
|
|
404
|
+
}
|
|
405
|
+
catch {
|
|
406
|
+
return [];
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
function buildAutoSummary(srcFiles, testFiles, docFiles, configFiles) {
|
|
410
|
+
const parts = [];
|
|
411
|
+
if (srcFiles.length > 0) {
|
|
412
|
+
parts.push(`${srcFiles.length} 个源文件变更`);
|
|
413
|
+
}
|
|
414
|
+
if (testFiles.length > 0) {
|
|
415
|
+
parts.push(`${testFiles.length} 个测试文件`);
|
|
416
|
+
}
|
|
417
|
+
if (docFiles.length > 0) {
|
|
418
|
+
parts.push(`${docFiles.length} 个文档`);
|
|
419
|
+
}
|
|
420
|
+
if (configFiles.length > 0) {
|
|
421
|
+
parts.push(`${configFiles.length} 个配置`);
|
|
422
|
+
}
|
|
423
|
+
return parts.length > 0 ? parts.join(', ') : '工作进行中';
|
|
424
|
+
}
|
|
425
|
+
//# sourceMappingURL=record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../../src/cli/commands/record.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/commands/ui.js
CHANGED
|
@@ -9,7 +9,7 @@ export function createUiCommand() {
|
|
|
9
9
|
.description('启动 WebForge 多项目只读 Web UI')
|
|
10
10
|
.option('--root <path>', '要扫描的项目根目录', process.cwd())
|
|
11
11
|
.option('--host <host>', '服务监听地址', '127.0.0.1')
|
|
12
|
-
.option('--port <port>', '服务端口', '
|
|
12
|
+
.option('--port <port>', '服务端口', '4317')
|
|
13
13
|
.action(async (options) => {
|
|
14
14
|
await startUiServer(options);
|
|
15
15
|
});
|
|
@@ -17,7 +17,7 @@ export function createUiCommand() {
|
|
|
17
17
|
export async function startUiServer(options) {
|
|
18
18
|
const root = options.root ?? process.cwd();
|
|
19
19
|
const host = options.host ?? '127.0.0.1';
|
|
20
|
-
const port = options.port ?? '
|
|
20
|
+
const port = options.port ?? '4317';
|
|
21
21
|
const numericPort = Number.parseInt(port, 10);
|
|
22
22
|
if (Number.isNaN(numericPort) || numericPort < 0 || numericPort > 65535) {
|
|
23
23
|
throw new Error(`invalid ui port: ${port}`);
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,wBAAgB,aAAa,IAAI,OAAO,CAgCvC;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAUlD;AAED,wBAAgB,eAAe,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAUtE"}
|