@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 wandoupeas
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,347 @@
1
+ # WebForge
2
+
3
+ WebForge 是一个面向 Coding Agent 的 `agent-first harness` 参考实现。
4
+ 它的目标不是替 agent 做决策,而是把项目状态、执行上下文、恢复机制和协作协议稳定地落在仓库里。
5
+
6
+ 最重要的一点:
7
+
8
+ > 你应该直接使用 `Codex` 或 `Claude Code` 在仓库里工作,而 WebForge 负责约束和辅助它们如何工作。
9
+
10
+ ## 它是什么
11
+
12
+ - 一个可持久化的 workspace contract
13
+ - 一组围绕 `.webforge/` 运行的 core services
14
+ - 一个 ready-task runtime 主循环
15
+ - 一层以观察和校验为主的轻量 CLI
16
+ - 一套能与 `superpowers` 共存的工程方法
17
+
18
+ ## 它不是什么
19
+
20
+ - 不是把 CLI 当成主控制面的工作流引擎
21
+ - 不是 if/else 驱动的伪 agent 编排器
22
+ - 不是只靠聊天上下文维持连续性的工具
23
+ - 不是把 `superpowers` 当成唯一记忆源的包装器
24
+
25
+ ## 核心模型
26
+
27
+ ```text
28
+ 用户目标
29
+ -> Coding Agent
30
+ -> WebForge workspace contract (.webforge/)
31
+ -> WebForge repo-side harness contract
32
+ -> planning/context/runtime core
33
+ -> deliverables / code / sessions
34
+ ```
35
+
36
+ 真正的项目真相位于 `.webforge/`:
37
+
38
+ - `runtime.json`:当前执行状态
39
+ - `tasks.json` / `phases.json`:任务图与阶段图
40
+ - `knowledge/index.json`:知识入口
41
+ - `deliverables/index.json`:交付物索引
42
+ - `sessions/index.json`:跨会话恢复入口
43
+
44
+ ## 快速开始
45
+
46
+ 先构建 CLI:
47
+
48
+ ```bash
49
+ npm install
50
+ npm run build
51
+ ```
52
+
53
+ 如果你是 npm 使用者,安装方式会是:
54
+
55
+ ```bash
56
+ npm install -g @wandoupeas/coding-forge
57
+ ```
58
+
59
+ 或者直接临时运行:
60
+
61
+ ```bash
62
+ npx @wandoupeas/coding-forge --help
63
+ ```
64
+
65
+ 然后初始化一个新仓库:
66
+
67
+ ```bash
68
+ node dist/cli/index.js init demo-app
69
+ ```
70
+
71
+ 这一步会同时生成:
72
+
73
+ - `.webforge/` workspace contract
74
+ - `AGENTS.md`
75
+ - `docs/agent-guide.md`
76
+ - `docs/methodology/superpowers-integration.md`
77
+
78
+ 初始化完成后,进入新仓库先运行:
79
+
80
+ ```bash
81
+ node dist/cli/index.js doctor
82
+ ```
83
+
84
+ 如果你希望让正在仓库里工作的 agent 直接消费结构化状态,可以使用:
85
+
86
+ ```bash
87
+ node dist/cli/index.js doctor --json
88
+ node dist/cli/index.js resume --json
89
+ ```
90
+
91
+ 这两个命令分别回答:
92
+
93
+ - 仓库契约是否完整
94
+ - 当前 agent 下一步应该做什么
95
+
96
+ 如果你想用本地 Web UI 统一查看多个 WebForge 项目,可以直接启动:
97
+
98
+ ```bash
99
+ node dist/cli/index.js ui --root ~/projects
100
+ ```
101
+
102
+ 如果你已经通过 npm 安装,则等价命令是:
103
+
104
+ ```bash
105
+ webforge ui --root ~/projects
106
+ ```
107
+
108
+ 这个 UI 当前是只读监控台,会自动扫描根目录下带 `.webforge/` 的项目,并提供:
109
+
110
+ - 多项目总览
111
+ - 单项目 dashboard
112
+ - 文档 / 交付物 / session 浏览
113
+ - runtime / drift / checkpoint / mailbox / superpowers 观察
114
+
115
+ ## 怎么使用
116
+
117
+ 如果你是人类开发者,先看这两份:
118
+
119
+ - [`docs/manuals/operations.md`](docs/manuals/operations.md)
120
+ - [`docs/manuals/command-reference.md`](docs/manuals/command-reference.md)
121
+ - [`docs/manuals/scenario-playbooks.md`](docs/manuals/scenario-playbooks.md)
122
+
123
+ 如果你是正在仓库里工作的 `Codex` 或 `Claude Code`,先看这两份:
124
+
125
+ - [`AGENTS.md`](AGENTS.md)
126
+ - [`docs/agent-guide.md`](docs/agent-guide.md)
127
+
128
+ 推荐最短使用路径:
129
+
130
+ ```bash
131
+ node dist/cli/index.js init demo-app
132
+ cd demo-app
133
+ node /path/to/work-forge/dist/cli/index.js onboard --json
134
+ ```
135
+
136
+ 如果你已经通过 npm 安装,则等价命令是:
137
+
138
+ ```bash
139
+ webforge init demo-app
140
+ cd demo-app
141
+ webforge onboard --json
142
+ ```
143
+
144
+ `init` 会同时生成带 onboarding contract 的 `AGENTS.md`、`docs/agent-guide.md`、`docs/methodology/superpowers-integration.md`,以及可直接照着执行的 `docs/examples/agent-onboarding-protocol.md`。初始化结束时还会立即跑一次 post-init self-check,确认 `doctor` 和 `onboard` 与这些协议文件保持一致。
145
+
146
+ 如果你想显式重跑这次自检,可以直接执行:
147
+
148
+ ```bash
149
+ node /path/to/work-forge/dist/cli/index.js verify init demo-app --json
150
+ ```
151
+
152
+ 如果你是 npm 安装用户,则直接执行:
153
+
154
+ ```bash
155
+ webforge verify init demo-app --json
156
+ ```
157
+
158
+ 然后:
159
+
160
+ 1. 读取 `shouldRead`
161
+ 2. 导入需求到 `.webforge/knowledge/`
162
+ 3. 运行 `plan`
163
+ 4. 运行 `run`
164
+ 5. 用 `dashboard / logs runtime / deliverables / review` 观察和收口
165
+ 其中 `logs runtime --json` 会同时给出 runtime 事件流、这条日志对应的恢复快照,以及当前工作区恢复快照
166
+
167
+ 如果你需要并行观察多个项目,则直接开 Web UI:
168
+
169
+ ```bash
170
+ webforge ui --root ~/projects
171
+ ```
172
+
173
+ 推荐用法:
174
+
175
+ 1. 在首页看项目健康、blocked、pending review、drift
176
+ 2. 进入单项目页看 recovery、tasks、deliverables 和 runtime pulse
177
+ 3. 切到 `Artifacts` 页直接看 knowledge / deliverable / session 文本预览
178
+ 4. 切到 `Runtime` 页看日志快照 vs 当前工作区快照,以及 checkpoint 列表
179
+
180
+ ## 仓库结构
181
+
182
+ ```text
183
+ .
184
+ ├── AGENTS.md
185
+ ├── README.md
186
+ ├── ARCHITECTURE.md
187
+ ├── docs/
188
+ │ ├── agent-guide.md
189
+ │ └── methodology/
190
+ ├── src/
191
+ │ ├── core/
192
+ │ ├── agent/
193
+ │ ├── cli/
194
+ │ └── testing/
195
+ └── .webforge/ # 由 workspace 初始化后生成
196
+ ```
197
+
198
+ ## 五层分工
199
+
200
+ 1. `workspace contract`
201
+ `.webforge/` 的目录、文件、索引和字段约定。
202
+ 2. `state services`
203
+ `workspace / session / deliverable / mailbox / task` 等稳定持久化服务。
204
+ 3. `execution core`
205
+ `planning / context / runtime`,负责构建任务图和 ready-task 主循环。
206
+ 4. `agent facade`
207
+ `Agent` 只接收 `{ task, context }`,返回标准结果。
208
+ 5. `workflow enhancement layer`
209
+ `superpowers` 等方法增强层,负责“怎么做更稳”,不负责“项目真相是什么”。
210
+
211
+ ## 与 superpowers 的关系
212
+
213
+ WebForge 和 `superpowers` 不是互相替代的关系:
214
+
215
+ - WebForge 负责项目状态、恢复和执行协议
216
+ - `superpowers` 负责设计、计划、评审、compact、线程化恢复等工作方法
217
+
218
+ 一句话:
219
+
220
+ > WebForge 决定项目如何运作;superpowers 决定某类工作如何做得更稳。
221
+
222
+ ## 当前实现重点
223
+
224
+ - `src/core/planning.ts`
225
+ 从 knowledge index 构建任务图与阶段图
226
+ - `src/core/context.ts`
227
+ 为任务构建统一执行上下文
228
+ - `src/core/runtime.ts`
229
+ 按 ready 队列执行 `claim -> context -> agent.execute -> persist`
230
+ - `src/agent/`
231
+ 只保留标准执行门面与 handler
232
+ - `src/cli/`
233
+ 只保留兼容层和观察入口
234
+ 包括 `init / plan / run / onboard / resume / dashboard / doctor / superpowers / knowledge / logs / deliverables / review / checkpoint / mailbox`
235
+
236
+ ## 适配对象
237
+
238
+ 这套设计优先兼容:
239
+
240
+ - Codex
241
+ - Claude Code
242
+
243
+ 兼容方式不是强行统一交互体验,而是统一仓库内事实模型:
244
+
245
+ - 统一读 `.webforge/`
246
+ - 统一写 `.webforge/`
247
+ - 统一通过 runtime / session / thread linkage / deliverable / knowledge 恢复上下文
248
+
249
+ ## Codex / Claude Code 接入范式
250
+
251
+ 如果你是人类开发者在仓库里工作,推荐顺序是:
252
+
253
+ ```bash
254
+ node dist/cli/index.js doctor
255
+ node dist/cli/index.js resume
256
+ node dist/cli/index.js dashboard
257
+ ```
258
+
259
+ 如果你是希望让 agent 直接消费仓库状态,推荐顺序是:
260
+
261
+ ```bash
262
+ node dist/cli/index.js onboard --json
263
+ ```
264
+
265
+ 或者显式拆开:
266
+
267
+ ```bash
268
+ node dist/cli/index.js doctor --json
269
+ node dist/cli/index.js resume --json
270
+ ```
271
+
272
+ 标准含义:
273
+
274
+ 1. `onboard --json`
275
+ 一次性输出 `doctor + resume + runtime log + recoveryReadiness` 的统一握手结果。
276
+ 2. `doctor --json`
277
+ 先判断仓库契约是否完整,再决定能否直接继续工作。
278
+ 3. `resume --json`
279
+ 获取当前 `nextAction`、`shouldRead`、`readyCount`、`blockedCount`、`pendingReviewCount`。
280
+ 4. 读取 `shouldRead` 里的文件。
281
+ 5. 如问题还在发散,用 `brainstorming`;如 spec 已经稳定,用 `writing-plans`。
282
+ 6. 如果使用了 `superpowers` workflow,把结果用 `webforge superpowers record ...` 回写到 `.webforge/superpowers-runs.json`。
283
+ 7. 执行工作,并把结果回写到 `.webforge/`。
284
+
285
+ 一句话:
286
+
287
+ > `doctor` 先回答“仓库能不能继续”,`resume` 再回答“现在应该做什么”。
288
+
289
+ `onboard --json` 里的 `recoveryReadiness` 会继续回答第三个问题:
290
+
291
+ > 当前 `workflow context / latest superpowers run / thread linkage` 指向的 `artifact / worktree / compact / thread` 线索还能不能直接恢复。
292
+
293
+ ## 推荐阅读顺序
294
+
295
+ 1. `AGENTS.md`
296
+ 2. `ARCHITECTURE.md`
297
+ 3. `docs/manuals/operations.md`
298
+ 4. `docs/manuals/scenario-playbooks.md`
299
+ 5. `docs/manuals/command-reference.md`
300
+ 6. `docs/agent-guide.md`
301
+
302
+ ## 里程碑说明
303
+
304
+ 如果你想看当前内部工程进展、已完成能力、验证状态和下一阶段建议,直接看:
305
+
306
+ - [`docs/milestones/2026-03-31-v0.1-internal-progress.md`](docs/milestones/2026-03-31-v0.1-internal-progress.md)
307
+ 6. `docs/methodology/harness-principles.md`
308
+ 7. `docs/methodology/superpowers-integration.md`
309
+ 8. `docs/examples/minimal-agent-onboarding.md`
310
+
311
+ ## 本地验证
312
+
313
+ 常用验证命令:
314
+
315
+ ```bash
316
+ npm run test:unit
317
+ npm run build
318
+ npm run smoke:onboarding
319
+ node dist/cli/index.js --help
320
+ node dist/cli/index.js doctor
321
+ ```
322
+
323
+ 常用结构化观察命令:
324
+
325
+ ```bash
326
+ node dist/cli/index.js onboard --json
327
+ node dist/cli/index.js doctor --json
328
+ node dist/cli/index.js resume --json
329
+ node dist/cli/index.js logs runtime --json
330
+ ```
331
+
332
+ 常用 workflow 回写命令:
333
+
334
+ ```bash
335
+ node dist/cli/index.js superpowers record writing-plans \
336
+ --summary "approved spec converted into execution plan" \
337
+ --artifact plan:docs/superpowers/plans/demo-plan.md \
338
+ --task T001
339
+ ```
340
+
341
+ ## 项目状态
342
+
343
+ 当前仓库正在向 WebForge v0.2 收敛:
344
+
345
+ - `runtime` 已成为唯一主循环
346
+ - CLI 已缩减为兼容层
347
+ - 文档正在统一到 harness-first 叙事
@@ -0,0 +1,9 @@
1
+ import type { AgentConfig, AgentExecutionInput, AgentExecutionResult } from '../context.js';
2
+ import type { AgentProvider } from '../../types/index.js';
3
+ export interface AgentExecutionEngine {
4
+ execute(input: AgentExecutionInput, config: AgentConfig): Promise<AgentExecutionResult>;
5
+ }
6
+ export interface AgentAdapter extends AgentExecutionEngine {
7
+ provider: AgentProvider;
8
+ }
9
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/agent/adapters/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,OAAO,CACL,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAa,SAAQ,oBAAoB;IACxD,QAAQ,EAAE,aAAa,CAAC;CACzB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/agent/adapters/base.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { AgentAdapter } from './base.js';
2
+ import { type CommandRunner } from './command-bridge.js';
3
+ export declare function createClaudeCodeAgentAdapter(fallback: AgentAdapter, runner?: CommandRunner): AgentAdapter;
4
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/agent/adapters/claude-code.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EACL,KAAK,aAAa,EAKnB,MAAM,qBAAqB,CAAC;AAE7B,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,YAAY,EACtB,MAAM,GAAE,aAA0B,GACjC,YAAY,CA6Bd"}
@@ -0,0 +1,25 @@
1
+ import { enrichResultMetadata, mapClaudeArgs, parseAgentExecutionResult, runCommand } from './command-bridge.js';
2
+ export function createClaudeCodeAgentAdapter(fallback, runner = runCommand) {
3
+ return {
4
+ provider: 'claude-code',
5
+ async execute(input, config) {
6
+ const command = config.runtimeProfile.command ?? 'claude';
7
+ try {
8
+ const execution = await runner(mapClaudeArgs(command, input, config));
9
+ if (execution.exitCode !== 0) {
10
+ throw new Error(execution.stderr.trim() || execution.stdout.trim() || 'claude failed');
11
+ }
12
+ const parsed = parseAgentExecutionResult(execution.stdout);
13
+ return enrichResultMetadata(parsed, 'claude-code', 'external-command', config);
14
+ }
15
+ catch (error) {
16
+ const fallbackResult = await fallback.execute(input, config);
17
+ return enrichResultMetadata(fallbackResult, 'claude-code', 'bridge-fallback', config, {
18
+ adapterFallbackProvider: fallback.provider,
19
+ adapterError: error instanceof Error ? error.message : String(error)
20
+ });
21
+ }
22
+ }
23
+ };
24
+ }
25
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/agent/adapters/claude-code.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,oBAAoB,EACpB,aAAa,EACb,yBAAyB,EACzB,UAAU,EACX,MAAM,qBAAqB,CAAC;AAE7B,MAAM,UAAU,4BAA4B,CAC1C,QAAsB,EACtB,SAAwB,UAAU;IAElC,OAAO;QACL,QAAQ,EAAE,aAAa;QACvB,KAAK,CAAC,OAAO,CAAC,KAA0B,EAAE,MAAmB;YAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,IAAI,QAAQ,CAAC;YAE1D,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;gBACtE,IAAI,SAAS,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBAC7B,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,eAAe,CAAC,CAAC;gBACzF,CAAC;gBAED,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC3D,OAAO,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;YACjF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC7D,OAAO,oBAAoB,CACzB,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,MAAM,EACN;oBACE,uBAAuB,EAAE,QAAQ,CAAC,QAAQ;oBAC1C,YAAY,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBACrE,CACF,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { AgentAdapter } from './base.js';
2
+ import { type CommandRunner } from './command-bridge.js';
3
+ export declare function createCodexAgentAdapter(fallback: AgentAdapter, runner?: CommandRunner): AgentAdapter;
4
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/agent/adapters/codex.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EACL,KAAK,aAAa,EAMnB,MAAM,qBAAqB,CAAC;AAE7B,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,YAAY,EACtB,MAAM,GAAE,aAA0B,GACjC,YAAY,CA4Bd"}
@@ -0,0 +1,27 @@
1
+ import { enrichResultMetadata, mapCodexArgs, readStructuredOutput, runCommand, withTemporarySchemaFiles } from './command-bridge.js';
2
+ export function createCodexAgentAdapter(fallback, runner = runCommand) {
3
+ return {
4
+ provider: 'codex',
5
+ async execute(input, config) {
6
+ const command = config.runtimeProfile.command ?? 'codex';
7
+ try {
8
+ return await withTemporarySchemaFiles(async ({ schemaPath, outputPath }) => {
9
+ const execution = await runner(mapCodexArgs(command, input, config, schemaPath, outputPath));
10
+ if (execution.exitCode !== 0) {
11
+ throw new Error(execution.stderr.trim() || execution.stdout.trim() || 'codex failed');
12
+ }
13
+ const parsed = await readStructuredOutput(outputPath, execution.stdout);
14
+ return enrichResultMetadata(parsed, 'codex', 'external-command', config);
15
+ });
16
+ }
17
+ catch (error) {
18
+ const fallbackResult = await fallback.execute(input, config);
19
+ return enrichResultMetadata(fallbackResult, 'codex', 'bridge-fallback', config, {
20
+ adapterFallbackProvider: fallback.provider,
21
+ adapterError: error instanceof Error ? error.message : String(error)
22
+ });
23
+ }
24
+ }
25
+ };
26
+ }
27
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/agent/adapters/codex.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,oBAAoB,EACpB,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,wBAAwB,EACzB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,UAAU,uBAAuB,CACrC,QAAsB,EACtB,SAAwB,UAAU;IAElC,OAAO;QACL,QAAQ,EAAE,OAAO;QACjB,KAAK,CAAC,OAAO,CAAC,KAA0B,EAAE,MAAmB;YAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,IAAI,OAAO,CAAC;YAEzD,IAAI,CAAC;gBACH,OAAO,MAAM,wBAAwB,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE;oBACzE,MAAM,SAAS,GAAG,MAAM,MAAM,CAC5B,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAC7D,CAAC;oBAEF,IAAI,SAAS,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;wBAC7B,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,cAAc,CAAC,CAAC;oBACxF,CAAC;oBAED,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;oBACxE,OAAO,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;gBAC3E,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC7D,OAAO,oBAAoB,CAAC,cAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE;oBAC9E,uBAAuB,EAAE,QAAQ,CAAC,QAAQ;oBAC1C,YAAY,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBACrE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,67 @@
1
+ import type { AgentConfig, AgentExecutionInput, AgentExecutionResult, AgentRuntimeProfile } from '../context.js';
2
+ export interface CommandExecutionResult {
3
+ exitCode: number;
4
+ stdout: string;
5
+ stderr: string;
6
+ }
7
+ export interface CommandExecutionRequest {
8
+ command: string;
9
+ args: string[];
10
+ cwd: string;
11
+ input?: string;
12
+ }
13
+ export type CommandRunner = (request: CommandExecutionRequest) => Promise<CommandExecutionResult>;
14
+ export declare function runCommand(request: CommandExecutionRequest): Promise<CommandExecutionResult>;
15
+ export declare const AGENT_RESULT_SCHEMA: {
16
+ readonly type: "object";
17
+ readonly additionalProperties: false;
18
+ readonly required: readonly ["success", "summary", "needsReview"];
19
+ readonly properties: {
20
+ readonly success: {
21
+ readonly type: "boolean";
22
+ };
23
+ readonly summary: {
24
+ readonly type: "string";
25
+ };
26
+ readonly needsReview: {
27
+ readonly type: "boolean";
28
+ };
29
+ readonly error: {
30
+ readonly type: readonly ["string", "null"];
31
+ };
32
+ readonly metadata: {
33
+ readonly type: "object";
34
+ };
35
+ readonly deliverables: {
36
+ readonly type: "array";
37
+ readonly items: {
38
+ readonly type: "object";
39
+ readonly additionalProperties: false;
40
+ readonly required: readonly ["type", "title", "content"];
41
+ readonly properties: {
42
+ readonly type: {
43
+ readonly type: "string";
44
+ readonly enum: readonly ["document", "code", "test", "config", "design", "review"];
45
+ };
46
+ readonly title: {
47
+ readonly type: "string";
48
+ };
49
+ readonly content: {
50
+ readonly type: "string";
51
+ };
52
+ };
53
+ };
54
+ };
55
+ };
56
+ };
57
+ export declare function buildAgentPrompt(input: AgentExecutionInput, config: AgentConfig): string;
58
+ export declare function mapCodexArgs(command: string, input: AgentExecutionInput, config: AgentConfig, schemaPath: string, outputPath: string): CommandExecutionRequest;
59
+ export declare function mapClaudeArgs(command: string, input: AgentExecutionInput, config: AgentConfig): CommandExecutionRequest;
60
+ export declare function withTemporarySchemaFiles<T>(callback: (paths: {
61
+ schemaPath: string;
62
+ outputPath: string;
63
+ }) => Promise<T>): Promise<T>;
64
+ export declare function readStructuredOutput(outputPath: string, stdout: string): Promise<AgentExecutionResult>;
65
+ export declare function parseAgentExecutionResult(raw: string): AgentExecutionResult;
66
+ export declare function enrichResultMetadata(result: AgentExecutionResult, provider: AgentRuntimeProfile['provider'], mode: 'external-command' | 'bridge-fallback', config: AgentConfig, extra?: Record<string, unknown>): AgentExecutionResult;
67
+ //# sourceMappingURL=command-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-bridge.d.ts","sourceRoot":"","sources":["../../../src/agent/adapters/command-bridge.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,OAAO,EAAE,uBAAuB,KAC7B,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAErC,wBAAsB,UAAU,CAC9B,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CA0DjC;AAED,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BtB,CAAC;AAEX,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,WAAW,GAClB,MAAM,CA0ER;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,uBAAuB,CAsBzB;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,mBAAmB,EAC1B,MAAM,EAAE,WAAW,GAClB,uBAAuB,CA4BzB;AAED,wBAAsB,wBAAwB,CAAC,CAAC,EAC9C,QAAQ,EAAE,CAAC,KAAK,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC,CAAC,CAAC,GAC1E,OAAO,CAAC,CAAC,CAAC,CAYZ;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,oBAAoB,CAAC,CAG/B;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAe3E;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,EAAE,mBAAmB,CAAC,UAAU,CAAC,EACzC,IAAI,EAAE,kBAAkB,GAAG,iBAAiB,EAC5C,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,oBAAoB,CAatB"}