@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.
Files changed (58) hide show
  1. package/README.md +9 -9
  2. package/dist/cli/commands/init.d.ts +1 -0
  3. package/dist/cli/commands/init.d.ts.map +1 -1
  4. package/dist/cli/commands/init.js +21 -10
  5. package/dist/cli/commands/init.js.map +1 -1
  6. package/dist/cli/commands/record.d.ts +11 -0
  7. package/dist/cli/commands/record.d.ts.map +1 -0
  8. package/dist/cli/commands/record.js +425 -0
  9. package/dist/cli/commands/record.js.map +1 -0
  10. package/dist/cli/commands/ui.js +2 -2
  11. package/dist/cli/index.d.ts.map +1 -1
  12. package/dist/cli/index.js +13 -1
  13. package/dist/cli/index.js.map +1 -1
  14. package/dist/core/logger.d.ts +5 -0
  15. package/dist/core/logger.d.ts.map +1 -1
  16. package/dist/core/logger.js +28 -0
  17. package/dist/core/logger.js.map +1 -1
  18. package/dist/core/planning.d.ts +13 -0
  19. package/dist/core/planning.d.ts.map +1 -1
  20. package/dist/core/planning.js +174 -7
  21. package/dist/core/planning.js.map +1 -1
  22. package/dist/ui/assets/index-B0LGSKSp.js +148 -0
  23. package/dist/ui/assets/index-BdOHfAmP.js +148 -0
  24. package/dist/ui/assets/index-BfMXz_A9.js +212 -0
  25. package/dist/ui/assets/index-C1V1OpTU.js +212 -0
  26. package/dist/ui/assets/index-CoJ1w_rN.js +212 -0
  27. package/dist/ui/assets/index-Cwtzi3AY.js +212 -0
  28. package/dist/ui/assets/index-DKs5v38z.js +148 -0
  29. package/dist/ui/assets/index-DlGG47Su.js +212 -0
  30. package/dist/ui/assets/index-bcUWb_BE.js +212 -0
  31. package/dist/ui/assets/index-gcGvB3SX.js +212 -0
  32. package/dist/ui/http/handlers/project-artifacts.d.ts.map +1 -1
  33. package/dist/ui/http/handlers/project-artifacts.js +3 -6
  34. package/dist/ui/http/handlers/project-artifacts.js.map +1 -1
  35. package/dist/ui/http/handlers/project-overview.d.ts.map +1 -1
  36. package/dist/ui/http/handlers/project-overview.js +3 -6
  37. package/dist/ui/http/handlers/project-overview.js.map +1 -1
  38. package/dist/ui/http/handlers/project-recovery.d.ts.map +1 -1
  39. package/dist/ui/http/handlers/project-recovery.js +3 -6
  40. package/dist/ui/http/handlers/project-recovery.js.map +1 -1
  41. package/dist/ui/http/handlers/project-runtime.d.ts.map +1 -1
  42. package/dist/ui/http/handlers/project-runtime.js +3 -6
  43. package/dist/ui/http/handlers/project-runtime.js.map +1 -1
  44. package/dist/ui/http/handlers/project-tasks.d.ts.map +1 -1
  45. package/dist/ui/http/handlers/project-tasks.js +3 -6
  46. package/dist/ui/http/handlers/project-tasks.js.map +1 -1
  47. package/dist/ui/http/handlers/projects.d.ts +15 -0
  48. package/dist/ui/http/handlers/projects.d.ts.map +1 -1
  49. package/dist/ui/http/handlers/projects.js +27 -0
  50. package/dist/ui/http/handlers/projects.js.map +1 -1
  51. package/dist/ui/http/router.d.ts.map +1 -1
  52. package/dist/ui/http/router.js +47 -27
  53. package/dist/ui/http/router.js.map +1 -1
  54. package/dist/ui/http/server.js +1 -1
  55. package/dist/ui/index.html +1 -1
  56. package/dist/ui/project-scanner.js +1 -1
  57. package/dist/ui/project-scanner.js.map +1 -1
  58. 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
- - 单项目 dashboard
112
- - 文档 / 交付物 / session 浏览
113
- - runtime / drift / checkpoint / mailbox / superpowers 观察
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. 在首页看项目健康、blockedpending reviewdrift
176
- 2. 进入单项目页看 recovery、tasks、deliverables runtime pulse
177
- 3. 切到 `Artifacts` 页直接看 knowledge / deliverable / session 文本预览
178
- 4. 切到 `Runtime` 页看日志快照 vs 当前工作区快照,以及 checkpoint 列表
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,CAe3C;AAED,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9B,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAmCf;AAuBD,wBAAsB,4BAA4B,CAChD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,uBAAuB,CAAC,CAwBlC"}
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
- logger.list([
49
- `cd ${projectName}`,
50
- `workspace: ${state.paths.workspace}`,
51
- `runtime: ${state.paths.runtime}`,
52
- 'webforge onboard --json',
53
- '如需重跑初始化后自检,执行 webforge verify init',
54
- '必要时再拆开执行 webforge doctor / webforge resume / webforge logs runtime',
55
- '把需求文档放进 .webforge/knowledge/requirements/'
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":"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"}
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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"}
@@ -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>', '服务端口', '4173')
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 ?? '4173';
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}`);
@@ -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;AAmBpC,wBAAgB,aAAa,IAAI,OAAO,CA+BvC;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAUlD;AAED,wBAAgB,eAAe,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAEtE"}
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"}