@wandoupeas/coding-forge 0.1.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.
Files changed (262) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +347 -0
  3. package/dist/agent/adapters/base.d.ts +9 -0
  4. package/dist/agent/adapters/base.d.ts.map +1 -0
  5. package/dist/agent/adapters/base.js +2 -0
  6. package/dist/agent/adapters/base.js.map +1 -0
  7. package/dist/agent/adapters/claude-code.d.ts +4 -0
  8. package/dist/agent/adapters/claude-code.d.ts.map +1 -0
  9. package/dist/agent/adapters/claude-code.js +25 -0
  10. package/dist/agent/adapters/claude-code.js.map +1 -0
  11. package/dist/agent/adapters/codex.d.ts +4 -0
  12. package/dist/agent/adapters/codex.d.ts.map +1 -0
  13. package/dist/agent/adapters/codex.js +27 -0
  14. package/dist/agent/adapters/codex.js.map +1 -0
  15. package/dist/agent/adapters/command-bridge.d.ts +67 -0
  16. package/dist/agent/adapters/command-bridge.d.ts.map +1 -0
  17. package/dist/agent/adapters/command-bridge.js +266 -0
  18. package/dist/agent/adapters/command-bridge.js.map +1 -0
  19. package/dist/agent/adapters/index.d.ts +7 -0
  20. package/dist/agent/adapters/index.d.ts.map +1 -0
  21. package/dist/agent/adapters/index.js +25 -0
  22. package/dist/agent/adapters/index.js.map +1 -0
  23. package/dist/agent/adapters/stub.d.ts +3 -0
  24. package/dist/agent/adapters/stub.d.ts.map +1 -0
  25. package/dist/agent/adapters/stub.js +66 -0
  26. package/dist/agent/adapters/stub.js.map +1 -0
  27. package/dist/agent/context.d.ts +36 -0
  28. package/dist/agent/context.d.ts.map +1 -0
  29. package/dist/agent/context.js +16 -0
  30. package/dist/agent/context.js.map +1 -0
  31. package/dist/agent/handlers/index.d.ts +6 -0
  32. package/dist/agent/handlers/index.d.ts.map +1 -0
  33. package/dist/agent/handlers/index.js +61 -0
  34. package/dist/agent/handlers/index.js.map +1 -0
  35. package/dist/agent/index.d.ts +18 -0
  36. package/dist/agent/index.d.ts.map +1 -0
  37. package/dist/agent/index.js +37 -0
  38. package/dist/agent/index.js.map +1 -0
  39. package/dist/agent/types.d.ts +21 -0
  40. package/dist/agent/types.d.ts.map +1 -0
  41. package/dist/agent/types.js +5 -0
  42. package/dist/agent/types.js.map +1 -0
  43. package/dist/cli/agent-briefing.d.ts +24 -0
  44. package/dist/cli/agent-briefing.d.ts.map +1 -0
  45. package/dist/cli/agent-briefing.js +133 -0
  46. package/dist/cli/agent-briefing.js.map +1 -0
  47. package/dist/cli/commands/checkpoint.d.ts +12 -0
  48. package/dist/cli/commands/checkpoint.d.ts.map +1 -0
  49. package/dist/cli/commands/checkpoint.js +86 -0
  50. package/dist/cli/commands/checkpoint.js.map +1 -0
  51. package/dist/cli/commands/dashboard.d.ts +14 -0
  52. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  53. package/dist/cli/commands/dashboard.js +192 -0
  54. package/dist/cli/commands/dashboard.js.map +1 -0
  55. package/dist/cli/commands/doctor.d.ts +27 -0
  56. package/dist/cli/commands/doctor.d.ts.map +1 -0
  57. package/dist/cli/commands/doctor.js +425 -0
  58. package/dist/cli/commands/doctor.js.map +1 -0
  59. package/dist/cli/commands/init.d.ts +19 -0
  60. package/dist/cli/commands/init.d.ts.map +1 -0
  61. package/dist/cli/commands/init.js +303 -0
  62. package/dist/cli/commands/init.js.map +1 -0
  63. package/dist/cli/commands/knowledge.d.ts +6 -0
  64. package/dist/cli/commands/knowledge.d.ts.map +1 -0
  65. package/dist/cli/commands/knowledge.js +408 -0
  66. package/dist/cli/commands/knowledge.js.map +1 -0
  67. package/dist/cli/commands/logs.d.ts +50 -0
  68. package/dist/cli/commands/logs.d.ts.map +1 -0
  69. package/dist/cli/commands/logs.js +248 -0
  70. package/dist/cli/commands/logs.js.map +1 -0
  71. package/dist/cli/commands/mailbox.d.ts +12 -0
  72. package/dist/cli/commands/mailbox.d.ts.map +1 -0
  73. package/dist/cli/commands/mailbox.js +131 -0
  74. package/dist/cli/commands/mailbox.js.map +1 -0
  75. package/dist/cli/commands/onboard.d.ts +43 -0
  76. package/dist/cli/commands/onboard.d.ts.map +1 -0
  77. package/dist/cli/commands/onboard.js +313 -0
  78. package/dist/cli/commands/onboard.js.map +1 -0
  79. package/dist/cli/commands/plan.d.ts +16 -0
  80. package/dist/cli/commands/plan.d.ts.map +1 -0
  81. package/dist/cli/commands/plan.js +211 -0
  82. package/dist/cli/commands/plan.js.map +1 -0
  83. package/dist/cli/commands/resume.d.ts +102 -0
  84. package/dist/cli/commands/resume.d.ts.map +1 -0
  85. package/dist/cli/commands/resume.js +256 -0
  86. package/dist/cli/commands/resume.js.map +1 -0
  87. package/dist/cli/commands/review.d.ts +13 -0
  88. package/dist/cli/commands/review.d.ts.map +1 -0
  89. package/dist/cli/commands/review.js +91 -0
  90. package/dist/cli/commands/review.js.map +1 -0
  91. package/dist/cli/commands/run.d.ts +19 -0
  92. package/dist/cli/commands/run.d.ts.map +1 -0
  93. package/dist/cli/commands/run.js +161 -0
  94. package/dist/cli/commands/run.js.map +1 -0
  95. package/dist/cli/commands/superpowers.d.ts +21 -0
  96. package/dist/cli/commands/superpowers.d.ts.map +1 -0
  97. package/dist/cli/commands/superpowers.js +135 -0
  98. package/dist/cli/commands/superpowers.js.map +1 -0
  99. package/dist/cli/commands/ui.d.ts +14 -0
  100. package/dist/cli/commands/ui.d.ts.map +1 -0
  101. package/dist/cli/commands/ui.js +41 -0
  102. package/dist/cli/commands/ui.js.map +1 -0
  103. package/dist/cli/commands/verify.d.ts +11 -0
  104. package/dist/cli/commands/verify.d.ts.map +1 -0
  105. package/dist/cli/commands/verify.js +46 -0
  106. package/dist/cli/commands/verify.js.map +1 -0
  107. package/dist/cli/index.d.ts +9 -0
  108. package/dist/cli/index.d.ts.map +1 -0
  109. package/dist/cli/index.js +69 -0
  110. package/dist/cli/index.js.map +1 -0
  111. package/dist/cli/utils/logger.d.ts +18 -0
  112. package/dist/cli/utils/logger.d.ts.map +1 -0
  113. package/dist/cli/utils/logger.js +57 -0
  114. package/dist/cli/utils/logger.js.map +1 -0
  115. package/dist/core/checkpoint.d.ts +54 -0
  116. package/dist/core/checkpoint.d.ts.map +1 -0
  117. package/dist/core/checkpoint.js +227 -0
  118. package/dist/core/checkpoint.js.map +1 -0
  119. package/dist/core/context.d.ts +36 -0
  120. package/dist/core/context.d.ts.map +1 -0
  121. package/dist/core/context.js +71 -0
  122. package/dist/core/context.js.map +1 -0
  123. package/dist/core/deliverable.d.ts +34 -0
  124. package/dist/core/deliverable.d.ts.map +1 -0
  125. package/dist/core/deliverable.js +125 -0
  126. package/dist/core/deliverable.js.map +1 -0
  127. package/dist/core/harness-hints.d.ts +43 -0
  128. package/dist/core/harness-hints.d.ts.map +1 -0
  129. package/dist/core/harness-hints.js +162 -0
  130. package/dist/core/harness-hints.js.map +1 -0
  131. package/dist/core/logger.d.ts +104 -0
  132. package/dist/core/logger.d.ts.map +1 -0
  133. package/dist/core/logger.js +199 -0
  134. package/dist/core/logger.js.map +1 -0
  135. package/dist/core/mailbox.d.ts +69 -0
  136. package/dist/core/mailbox.d.ts.map +1 -0
  137. package/dist/core/mailbox.js +225 -0
  138. package/dist/core/mailbox.js.map +1 -0
  139. package/dist/core/planning.d.ts +110 -0
  140. package/dist/core/planning.d.ts.map +1 -0
  141. package/dist/core/planning.js +832 -0
  142. package/dist/core/planning.js.map +1 -0
  143. package/dist/core/runtime.d.ts +22 -0
  144. package/dist/core/runtime.d.ts.map +1 -0
  145. package/dist/core/runtime.js +364 -0
  146. package/dist/core/runtime.js.map +1 -0
  147. package/dist/core/session.d.ts +62 -0
  148. package/dist/core/session.d.ts.map +1 -0
  149. package/dist/core/session.js +266 -0
  150. package/dist/core/session.js.map +1 -0
  151. package/dist/core/superpowers-registry.d.ts +20 -0
  152. package/dist/core/superpowers-registry.d.ts.map +1 -0
  153. package/dist/core/superpowers-registry.js +180 -0
  154. package/dist/core/superpowers-registry.js.map +1 -0
  155. package/dist/core/superpowers-runs.d.ts +19 -0
  156. package/dist/core/superpowers-runs.d.ts.map +1 -0
  157. package/dist/core/superpowers-runs.js +231 -0
  158. package/dist/core/superpowers-runs.js.map +1 -0
  159. package/dist/core/task.d.ts +43 -0
  160. package/dist/core/task.d.ts.map +1 -0
  161. package/dist/core/task.js +232 -0
  162. package/dist/core/task.js.map +1 -0
  163. package/dist/core/threads.d.ts +23 -0
  164. package/dist/core/threads.d.ts.map +1 -0
  165. package/dist/core/threads.js +92 -0
  166. package/dist/core/threads.js.map +1 -0
  167. package/dist/core/worker.d.ts +48 -0
  168. package/dist/core/worker.d.ts.map +1 -0
  169. package/dist/core/worker.js +181 -0
  170. package/dist/core/worker.js.map +1 -0
  171. package/dist/core/workflow-context.d.ts +16 -0
  172. package/dist/core/workflow-context.d.ts.map +1 -0
  173. package/dist/core/workflow-context.js +102 -0
  174. package/dist/core/workflow-context.js.map +1 -0
  175. package/dist/core/workspace.d.ts +13 -0
  176. package/dist/core/workspace.d.ts.map +1 -0
  177. package/dist/core/workspace.js +208 -0
  178. package/dist/core/workspace.js.map +1 -0
  179. package/dist/testing/index.d.ts +21 -0
  180. package/dist/testing/index.d.ts.map +1 -0
  181. package/dist/testing/index.js +55 -0
  182. package/dist/testing/index.js.map +1 -0
  183. package/dist/types/index.d.ts +298 -0
  184. package/dist/types/index.d.ts.map +1 -0
  185. package/dist/types/index.js +5 -0
  186. package/dist/types/index.js.map +1 -0
  187. package/dist/ui/assets/index-DLwnhrrc.css +1 -0
  188. package/dist/ui/assets/index-cDUGEuwi.js +234 -0
  189. package/dist/ui/http/handlers/project-artifacts.d.ts +3 -0
  190. package/dist/ui/http/handlers/project-artifacts.d.ts.map +1 -0
  191. package/dist/ui/http/handlers/project-artifacts.js +20 -0
  192. package/dist/ui/http/handlers/project-artifacts.js.map +1 -0
  193. package/dist/ui/http/handlers/project-overview.d.ts +3 -0
  194. package/dist/ui/http/handlers/project-overview.d.ts.map +1 -0
  195. package/dist/ui/http/handlers/project-overview.js +20 -0
  196. package/dist/ui/http/handlers/project-overview.js.map +1 -0
  197. package/dist/ui/http/handlers/project-recovery.d.ts +3 -0
  198. package/dist/ui/http/handlers/project-recovery.d.ts.map +1 -0
  199. package/dist/ui/http/handlers/project-recovery.js +20 -0
  200. package/dist/ui/http/handlers/project-recovery.js.map +1 -0
  201. package/dist/ui/http/handlers/project-runtime.d.ts +3 -0
  202. package/dist/ui/http/handlers/project-runtime.d.ts.map +1 -0
  203. package/dist/ui/http/handlers/project-runtime.js +20 -0
  204. package/dist/ui/http/handlers/project-runtime.js.map +1 -0
  205. package/dist/ui/http/handlers/project-tasks.d.ts +3 -0
  206. package/dist/ui/http/handlers/project-tasks.d.ts.map +1 -0
  207. package/dist/ui/http/handlers/project-tasks.js +20 -0
  208. package/dist/ui/http/handlers/project-tasks.js.map +1 -0
  209. package/dist/ui/http/handlers/projects.d.ts +23 -0
  210. package/dist/ui/http/handlers/projects.d.ts.map +1 -0
  211. package/dist/ui/http/handlers/projects.js +29 -0
  212. package/dist/ui/http/handlers/projects.js.map +1 -0
  213. package/dist/ui/http/router.d.ts +5 -0
  214. package/dist/ui/http/router.d.ts.map +1 -0
  215. package/dist/ui/http/router.js +81 -0
  216. package/dist/ui/http/router.js.map +1 -0
  217. package/dist/ui/http/server.d.ts +29 -0
  218. package/dist/ui/http/server.d.ts.map +1 -0
  219. package/dist/ui/http/server.js +143 -0
  220. package/dist/ui/http/server.js.map +1 -0
  221. package/dist/ui/index.html +13 -0
  222. package/dist/ui/project-registry.d.ts +9 -0
  223. package/dist/ui/project-registry.d.ts.map +1 -0
  224. package/dist/ui/project-registry.js +19 -0
  225. package/dist/ui/project-registry.js.map +1 -0
  226. package/dist/ui/project-scanner.d.ts +10 -0
  227. package/dist/ui/project-scanner.d.ts.map +1 -0
  228. package/dist/ui/project-scanner.js +135 -0
  229. package/dist/ui/project-scanner.js.map +1 -0
  230. package/dist/ui/read-models/artifacts.d.ts +58 -0
  231. package/dist/ui/read-models/artifacts.d.ts.map +1 -0
  232. package/dist/ui/read-models/artifacts.js +97 -0
  233. package/dist/ui/read-models/artifacts.js.map +1 -0
  234. package/dist/ui/read-models/overview.d.ts +38 -0
  235. package/dist/ui/read-models/overview.d.ts.map +1 -0
  236. package/dist/ui/read-models/overview.js +55 -0
  237. package/dist/ui/read-models/overview.js.map +1 -0
  238. package/dist/ui/read-models/recovery.d.ts +18 -0
  239. package/dist/ui/read-models/recovery.d.ts.map +1 -0
  240. package/dist/ui/read-models/recovery.js +26 -0
  241. package/dist/ui/read-models/recovery.js.map +1 -0
  242. package/dist/ui/read-models/runtime.d.ts +53 -0
  243. package/dist/ui/read-models/runtime.d.ts.map +1 -0
  244. package/dist/ui/read-models/runtime.js +86 -0
  245. package/dist/ui/read-models/runtime.js.map +1 -0
  246. package/dist/ui/read-models/tasks.d.ts +34 -0
  247. package/dist/ui/read-models/tasks.d.ts.map +1 -0
  248. package/dist/ui/read-models/tasks.js +46 -0
  249. package/dist/ui/read-models/tasks.js.map +1 -0
  250. package/dist/utils/config.d.ts +30 -0
  251. package/dist/utils/config.d.ts.map +1 -0
  252. package/dist/utils/config.js +152 -0
  253. package/dist/utils/config.js.map +1 -0
  254. package/dist/utils/file.d.ts +24 -0
  255. package/dist/utils/file.d.ts.map +1 -0
  256. package/dist/utils/file.js +42 -0
  257. package/dist/utils/file.js.map +1 -0
  258. package/dist/utils/lock.d.ts +7 -0
  259. package/dist/utils/lock.d.ts.map +1 -0
  260. package/dist/utils/lock.js +36 -0
  261. package/dist/utils/lock.js.map +1 -0
  262. package/package.json +78 -0
@@ -0,0 +1,34 @@
1
+ import type { TaskStatus } from '../../types/index.js';
2
+ export interface TaskStatusCounts {
3
+ total: number;
4
+ pending: number;
5
+ ready: number;
6
+ inProgress: number;
7
+ blocked: number;
8
+ completed: number;
9
+ failed: number;
10
+ pendingReview: number;
11
+ }
12
+ export interface TaskReadModelItem {
13
+ id: string;
14
+ phaseId: string;
15
+ title: string;
16
+ description?: string;
17
+ status: TaskStatus;
18
+ assignee: string;
19
+ priority: number;
20
+ dependsOn: string[];
21
+ blockedBy: string[];
22
+ updatedAt: string;
23
+ workflow: string | null;
24
+ }
25
+ export interface TasksReadModel {
26
+ counts: TaskStatusCounts;
27
+ items: TaskReadModelItem[];
28
+ ready: TaskReadModelItem[];
29
+ inProgress: TaskReadModelItem[];
30
+ blocked: TaskReadModelItem[];
31
+ pendingReview: TaskReadModelItem[];
32
+ }
33
+ export declare function buildTasksReadModel(basePath?: string): Promise<TasksReadModel>;
34
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/ui/read-models/tasks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,aAAa,EAAE,iBAAiB,EAAE,CAAC;CACpC;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,CA4BnG"}
@@ -0,0 +1,46 @@
1
+ import { loadWorkspaceState } from '../../core/workspace.js';
2
+ export async function buildTasksReadModel(basePath = process.cwd()) {
3
+ const workspace = await loadWorkspaceState(basePath);
4
+ const pendingReviewTaskIds = new Set(workspace.indexes.deliverables
5
+ .filter((deliverable) => deliverable.status === 'pending_review')
6
+ .map((deliverable) => deliverable.taskId));
7
+ const items = workspace.tasks.tasks
8
+ .map((task) => toTaskReadModelItem(task))
9
+ .sort((left, right) => left.id.localeCompare(right.id));
10
+ return {
11
+ counts: {
12
+ total: items.length,
13
+ pending: countByStatus(items, 'pending'),
14
+ ready: countByStatus(items, 'ready'),
15
+ inProgress: countByStatus(items, 'in_progress'),
16
+ blocked: countByStatus(items, 'blocked'),
17
+ completed: countByStatus(items, 'completed'),
18
+ failed: countByStatus(items, 'failed'),
19
+ pendingReview: items.filter((item) => pendingReviewTaskIds.has(item.id)).length
20
+ },
21
+ items,
22
+ ready: items.filter((item) => item.status === 'ready'),
23
+ inProgress: items.filter((item) => item.status === 'in_progress'),
24
+ blocked: items.filter((item) => item.status === 'blocked'),
25
+ pendingReview: items.filter((item) => pendingReviewTaskIds.has(item.id))
26
+ };
27
+ }
28
+ function toTaskReadModelItem(task) {
29
+ return {
30
+ id: task.id,
31
+ phaseId: task.phase,
32
+ title: task.title,
33
+ description: task.description,
34
+ status: task.status,
35
+ assignee: task.assignee,
36
+ priority: task.priority,
37
+ dependsOn: task.depends_on,
38
+ blockedBy: task.blocked_by ?? [],
39
+ updatedAt: task.updated_at,
40
+ workflow: task.workflowContext?.workflow ?? null
41
+ };
42
+ }
43
+ function countByStatus(items, status) {
44
+ return items.filter((item) => item.status === status).length;
45
+ }
46
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/ui/read-models/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * 配置管理模块
3
+ */
4
+ import { AgentProfileConfig, WebForgeConfig, WorkerConfig } from '../types/index.js';
5
+ /**
6
+ * 加载项目配置
7
+ */
8
+ export declare function loadConfig(basePath?: string): Promise<WebForgeConfig>;
9
+ /**
10
+ * 保存项目配置
11
+ */
12
+ export declare function saveConfig(config: WebForgeConfig, basePath?: string): Promise<void>;
13
+ /**
14
+ * 加载 Worker 配置
15
+ */
16
+ export declare function loadWorkerConfig(role: string, basePath?: string): Promise<WorkerConfig>;
17
+ /**
18
+ * 保存 Worker 配置
19
+ */
20
+ export declare function saveWorkerConfig(role: string, config: WorkerConfig, basePath?: string): Promise<void>;
21
+ export declare function createDefaultAgentProfileConfig(): AgentProfileConfig;
22
+ /**
23
+ * 创建默认配置
24
+ */
25
+ export declare function createDefaultConfig(projectName: string): WebForgeConfig;
26
+ /**
27
+ * 创建默认 Worker 配置
28
+ */
29
+ export declare function createDefaultWorkerConfig(role: string): WorkerConfig;
30
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAQ3B;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAI3E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,cAAc,EACtB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,YAAY,CAAC,CAOvB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAgB,+BAA+B,IAAI,kBAAkB,CAMpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAoDvE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CA6CpE"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * 配置管理模块
3
+ */
4
+ import { readText, writeText } from './file.js';
5
+ import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
6
+ import { join } from 'path';
7
+ const CONFIG_FILE = '.webforge/config.yaml';
8
+ const WORKER_FILE = '.webforge/workers/{role}/worker.yaml';
9
+ /**
10
+ * 加载项目配置
11
+ */
12
+ export async function loadConfig(basePath) {
13
+ const path = join(basePath || process.cwd(), CONFIG_FILE);
14
+ const content = await readText(path);
15
+ return parseYaml(content);
16
+ }
17
+ /**
18
+ * 保存项目配置
19
+ */
20
+ export async function saveConfig(config, basePath) {
21
+ const path = join(basePath || process.cwd(), CONFIG_FILE);
22
+ const content = stringifyYaml(config);
23
+ await writeText(path, content);
24
+ }
25
+ /**
26
+ * 加载 Worker 配置
27
+ */
28
+ export async function loadWorkerConfig(role, basePath) {
29
+ const path = join(basePath || process.cwd(), WORKER_FILE.replace('{role}', role));
30
+ const content = await readText(path);
31
+ return parseYaml(content);
32
+ }
33
+ /**
34
+ * 保存 Worker 配置
35
+ */
36
+ export async function saveWorkerConfig(role, config, basePath) {
37
+ const path = join(basePath || process.cwd(), WORKER_FILE.replace('{role}', role));
38
+ const content = stringifyYaml(config);
39
+ await writeText(path, content);
40
+ }
41
+ export function createDefaultAgentProfileConfig() {
42
+ return {
43
+ provider: 'stub',
44
+ fallback_provider: 'stub',
45
+ permission_profile: 'workspace-write'
46
+ };
47
+ }
48
+ /**
49
+ * 创建默认配置
50
+ */
51
+ export function createDefaultConfig(projectName) {
52
+ return {
53
+ project: {
54
+ name: projectName,
55
+ version: '0.1.0',
56
+ description: `${projectName} 项目`
57
+ },
58
+ orchestrator: {
59
+ max_parallel_workers: 5,
60
+ checkpoint_interval: 300
61
+ },
62
+ agent: createDefaultAgentProfileConfig(),
63
+ workers: ['pm', 'frontend', 'backend', 'qa', 'devops'],
64
+ phases: [
65
+ {
66
+ id: 'P1',
67
+ name: '架构设计',
68
+ status: 'pending',
69
+ progress: 0,
70
+ depends_on: [],
71
+ created_at: new Date().toISOString(),
72
+ updated_at: new Date().toISOString()
73
+ },
74
+ {
75
+ id: 'P2',
76
+ name: '核心实现',
77
+ status: 'pending',
78
+ progress: 0,
79
+ depends_on: ['P1'],
80
+ created_at: new Date().toISOString(),
81
+ updated_at: new Date().toISOString()
82
+ },
83
+ {
84
+ id: 'P3',
85
+ name: 'CLI 实现',
86
+ status: 'pending',
87
+ progress: 0,
88
+ depends_on: ['P2'],
89
+ created_at: new Date().toISOString(),
90
+ updated_at: new Date().toISOString()
91
+ },
92
+ {
93
+ id: 'P4',
94
+ name: '测试集成',
95
+ status: 'pending',
96
+ progress: 0,
97
+ depends_on: ['P3'],
98
+ created_at: new Date().toISOString(),
99
+ updated_at: new Date().toISOString()
100
+ }
101
+ ]
102
+ };
103
+ }
104
+ /**
105
+ * 创建默认 Worker 配置
106
+ */
107
+ export function createDefaultWorkerConfig(role) {
108
+ const configs = {
109
+ pm: {
110
+ role: 'pm',
111
+ name: 'Project Manager',
112
+ description: '负责需求分析、任务规划',
113
+ skills: ['requirement-analysis', 'task-planning'],
114
+ tools: ['read', 'write'],
115
+ system_prompt: '你是项目经理,擅长需求分析和任务规划。'
116
+ },
117
+ frontend: {
118
+ role: 'frontend',
119
+ name: 'Frontend Developer',
120
+ description: '负责前端开发',
121
+ skills: ['react', 'typescript', 'tailwind'],
122
+ tools: ['read', 'write', 'edit', 'bash'],
123
+ system_prompt: '你是前端开发专家,擅长 React + TypeScript。'
124
+ },
125
+ backend: {
126
+ role: 'backend',
127
+ name: 'Backend Developer',
128
+ description: '负责后端开发',
129
+ skills: ['nodejs', 'database', 'api-design'],
130
+ tools: ['read', 'write', 'edit', 'bash'],
131
+ system_prompt: '你是后端开发专家,擅长 API 设计。'
132
+ },
133
+ qa: {
134
+ role: 'qa',
135
+ name: 'QA Engineer',
136
+ description: '负责测试',
137
+ skills: ['testing', 'test-design'],
138
+ tools: ['read', 'write', 'bash'],
139
+ system_prompt: '你是 QA 工程师,擅长测试设计。'
140
+ },
141
+ devops: {
142
+ role: 'devops',
143
+ name: 'DevOps Engineer',
144
+ description: '负责部署',
145
+ skills: ['docker', 'ci-cd', 'deployment'],
146
+ tools: ['read', 'write', 'bash'],
147
+ system_prompt: '你是 DevOps 工程师,擅长部署。'
148
+ }
149
+ };
150
+ return configs[role] || configs.pm;
151
+ }
152
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 文件工具模块
3
+ */
4
+ /**
5
+ * 确保目录存在
6
+ */
7
+ export declare function ensureDir(path: string): Promise<void>;
8
+ /**
9
+ * 读取 JSON 文件
10
+ */
11
+ export declare function readJson<T>(path: string): Promise<T>;
12
+ /**
13
+ * 写入 JSON 文件
14
+ */
15
+ export declare function writeJson(path: string, data: unknown): Promise<void>;
16
+ /**
17
+ * 读取文本文件
18
+ */
19
+ export declare function readText(path: string): Promise<string>;
20
+ /**
21
+ * 写入文本文件
22
+ */
23
+ export declare function writeText(path: string, content: string): Promise<void>;
24
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3D;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAG1D;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE5D;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5E"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * 文件工具模块
3
+ */
4
+ import { readFile, writeFile, mkdir } from 'fs/promises';
5
+ import { dirname } from 'path';
6
+ import { existsSync } from 'fs';
7
+ /**
8
+ * 确保目录存在
9
+ */
10
+ export async function ensureDir(path) {
11
+ if (!existsSync(path)) {
12
+ await mkdir(path, { recursive: true });
13
+ }
14
+ }
15
+ /**
16
+ * 读取 JSON 文件
17
+ */
18
+ export async function readJson(path) {
19
+ const content = await readFile(path, 'utf-8');
20
+ return JSON.parse(content);
21
+ }
22
+ /**
23
+ * 写入 JSON 文件
24
+ */
25
+ export async function writeJson(path, data) {
26
+ await ensureDir(dirname(path));
27
+ await writeFile(path, JSON.stringify(data, null, 2), 'utf-8');
28
+ }
29
+ /**
30
+ * 读取文本文件
31
+ */
32
+ export async function readText(path) {
33
+ return readFile(path, 'utf-8');
34
+ }
35
+ /**
36
+ * 写入文本文件
37
+ */
38
+ export async function writeText(path, content) {
39
+ await ensureDir(dirname(path));
40
+ await writeFile(path, content, 'utf-8');
41
+ }
42
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,IAAY;IAC5C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,IAAa;IACzD,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,OAAe;IAC3D,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface FileLockOptions {
2
+ retryDelayMs?: number;
3
+ timeoutMs?: number;
4
+ }
5
+ export declare function withFileLock<T>(lockPath: string, fn: () => Promise<T>, options?: FileLockOptions): Promise<T>;
6
+ export {};
7
+ //# sourceMappingURL=lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/utils/lock.ts"],"names":[],"mappings":"AAIA,UAAU,eAAe;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,YAAY,CAAC,CAAC,EAClC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,CAAC,CAAC,CAiCZ"}
@@ -0,0 +1,36 @@
1
+ import { open, unlink } from 'fs/promises';
2
+ import { dirname } from 'path';
3
+ import { ensureDir } from './file.js';
4
+ export async function withFileLock(lockPath, fn, options) {
5
+ const retryDelayMs = options?.retryDelayMs ?? 20;
6
+ const timeoutMs = options?.timeoutMs ?? 5000;
7
+ const startTime = Date.now();
8
+ await ensureDir(dirname(lockPath));
9
+ let handle;
10
+ while (true) {
11
+ try {
12
+ handle = await open(lockPath, 'wx');
13
+ break;
14
+ }
15
+ catch (error) {
16
+ if (error?.code !== 'EEXIST') {
17
+ throw error;
18
+ }
19
+ if (Date.now() - startTime >= timeoutMs) {
20
+ throw new Error(`Timed out acquiring file lock: ${lockPath}`);
21
+ }
22
+ await sleep(retryDelayMs);
23
+ }
24
+ }
25
+ try {
26
+ return await fn();
27
+ }
28
+ finally {
29
+ await handle?.close();
30
+ await unlink(lockPath).catch(() => undefined);
31
+ }
32
+ }
33
+ function sleep(ms) {
34
+ return new Promise(resolve => setTimeout(resolve, ms));
35
+ }
36
+ //# sourceMappingURL=lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/utils/lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAOtC,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,EAAoB,EACpB,OAAyB;IAEzB,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC;IACjD,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEnC,IAAI,MAAoD,CAAC;IAEzD,OAAO,IAAI,EAAE,CAAC;QAEZ,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACpC,MAAM;QACR,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,MAAM,KAAK,CAAC;YACd,CAAC;YAED,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAC;YAChE,CAAC;YAED,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC;QACtB,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "@wandoupeas/coding-forge",
3
+ "version": "0.1.0",
4
+ "description": "Agent-first harness CLI for Codex and Claude Code",
5
+ "type": "module",
6
+ "main": "./dist/cli/index.js",
7
+ "types": "./dist/cli/index.d.ts",
8
+ "bin": {
9
+ "webforge": "./dist/cli/index.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc && tsc --noEmit -p tsconfig.ui.json && vite build",
18
+ "dev": "tsc --watch",
19
+ "ui:dev": "vite --host 127.0.0.1 --port 4173",
20
+ "smoke:onboarding": "node scripts/smoke-agent-onboarding.mjs",
21
+ "test": "vitest",
22
+ "test:unit": "vitest run",
23
+ "test:coverage": "vitest run --coverage",
24
+ "test:watch": "vitest watch",
25
+ "prepublishOnly": "npm run build && npm run smoke:onboarding && npm run test:coverage"
26
+ },
27
+ "keywords": [
28
+ "agent",
29
+ "harness",
30
+ "cli",
31
+ "codex",
32
+ "claude-code",
33
+ "development",
34
+ "workflow"
35
+ ],
36
+ "author": "wandoupeas",
37
+ "license": "MIT",
38
+ "homepage": "https://github.com/wandoupeas/coding-forge#readme",
39
+ "bugs": {
40
+ "url": "https://github.com/wandoupeas/coding-forge/issues"
41
+ },
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "git+https://github.com/wandoupeas/coding-forge.git"
45
+ },
46
+ "dependencies": {
47
+ "@anthropic-ai/sdk": "^0.80.0",
48
+ "@mantine/core": "^8.3.18",
49
+ "@mantine/hooks": "^8.3.18",
50
+ "@tanstack/react-table": "^8.21.3",
51
+ "chalk": "^5.3.0",
52
+ "commander": "^12.0.0",
53
+ "fs-extra": "^11.2.0",
54
+ "mammoth": "^1.12.0",
55
+ "pdf-parse": "^2.4.5",
56
+ "react": "^19.2.4",
57
+ "react-dom": "^19.2.4",
58
+ "react-router-dom": "^6.30.3",
59
+ "recharts": "^3.8.1",
60
+ "xlsx": "^0.18.5",
61
+ "yaml": "^2.4.0"
62
+ },
63
+ "devDependencies": {
64
+ "@types/fs-extra": "^11.0.4",
65
+ "@types/node": "^20.11.0",
66
+ "@types/pdf-parse": "^1.1.5",
67
+ "@types/react": "^19.2.14",
68
+ "@types/react-dom": "^19.2.3",
69
+ "@vitejs/plugin-react": "^4.7.0",
70
+ "@vitest/coverage-v8": "^1.3.0",
71
+ "typescript": "^5.3.0",
72
+ "vite": "^5.4.21",
73
+ "vitest": "^1.3.0"
74
+ },
75
+ "engines": {
76
+ "node": ">=18.0.0"
77
+ }
78
+ }