@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,161 @@
1
+ /**
2
+ * run 命令 - runtime 兼容入口
3
+ * CLI 仅负责参数解析和结果渲染,真正执行交给 core/runtime。
4
+ */
5
+ import { Command } from 'commander';
6
+ import logger from '../utils/logger.js';
7
+ import { reviewTaskDeliverables } from '../../agent/index.js';
8
+ import { listDeliverables } from '../../core/deliverable.js';
9
+ import { runReadyTasks } from '../../core/runtime.js';
10
+ import { loadWorkspaceState } from '../../core/workspace.js';
11
+ export function createRunCommand() {
12
+ return new Command('run')
13
+ .description('执行 ready 队列中的任务(兼容层,内部走 runtime core)')
14
+ .option('-d, --dry-run', '仅预览 runtime 将要执行的 ready 队列')
15
+ .option('-n, --limit <count>', '最多执行的 ready 任务数', parsePositiveInteger)
16
+ .option('-p, --phase <id>', '兼容选项:保留旧参数,但当前 runtime 不直接按 phase 过滤')
17
+ .option('-w, --worker <role>', '兼容选项:保留旧参数,但当前 runtime 不直接按 worker 过滤')
18
+ .option('--auto', '兼容选项:runtime 已默认按 ready 队列批量执行')
19
+ .option('-s, --superpowers', '兼容选项:superpowers 由规划与技能体系决定', true)
20
+ .option('-e, --execution <mode>', '兼容选项:CLI 不再直接切换 execution mode', 'subagent')
21
+ .option('--session <id>', '覆盖默认生成的 runtime session id')
22
+ .action(async (options) => {
23
+ try {
24
+ await runCommand(options);
25
+ }
26
+ catch (error) {
27
+ logger.error(`运行失败: ${error}`);
28
+ process.exit(1);
29
+ }
30
+ });
31
+ }
32
+ export async function runCommand(options, basePath = process.cwd()) {
33
+ logger.h1('🚀 Runtime 执行入口');
34
+ renderCompatibilityWarnings(options);
35
+ if (options.dryRun) {
36
+ await renderDryRun(basePath, options.limit);
37
+ return;
38
+ }
39
+ const result = await runReadyTasks(basePath, {
40
+ limit: options.limit,
41
+ sessionId: options.session
42
+ });
43
+ renderRunSummary(result);
44
+ }
45
+ function renderCompatibilityWarnings(options) {
46
+ if (options.auto) {
47
+ logger.info('`--auto` 已成为默认行为,runtime 会按 ready 队列连续处理任务。');
48
+ }
49
+ if (options.phase) {
50
+ logger.warning(`当前兼容层尚未将 \`--phase ${options.phase}\` 下推到 runtime core,已按全局 ready 队列执行。`);
51
+ }
52
+ if (options.worker) {
53
+ logger.warning(`当前兼容层尚未将 \`--worker ${options.worker}\` 下推到 runtime core,已按任务分配规则执行。`);
54
+ }
55
+ if (options.execution && options.execution !== 'subagent') {
56
+ logger.warning(`\`--execution ${options.execution}\` 仅为兼容保留;执行模式现在由 agent 自身和 skills 决定。`);
57
+ }
58
+ if (options.superpowers === false) {
59
+ logger.warning('`--no-superpowers` 仅为兼容保留;CLI 不再直接切换 superpowers,相关行为由规划结果与技能路由决定。');
60
+ }
61
+ }
62
+ async function renderDryRun(basePath, limit) {
63
+ const workspace = await loadWorkspaceState(basePath);
64
+ const readyTasks = getReadyTasks(workspace.tasks.tasks, limit);
65
+ logger.h2('Runtime 预览');
66
+ logger.info(`status: ${workspace.runtime.status}`);
67
+ logger.info(`session: ${workspace.runtime.sessionId ?? 'none'}`);
68
+ logger.info(`summary: ${workspace.runtime.summary}`);
69
+ logger.info(`ready tasks: ${readyTasks.length}`);
70
+ if (readyTasks.length > 0) {
71
+ console.log();
72
+ logger.h2('即将执行的任务');
73
+ for (const task of readyTasks.slice(0, 5)) {
74
+ console.log(` ${task.id}: ${task.title} (${task.assignee}) [${task.phase}]`);
75
+ }
76
+ }
77
+ else {
78
+ logger.info('当前没有 ready task。');
79
+ }
80
+ }
81
+ function renderRunSummary(result) {
82
+ console.log();
83
+ logger.h2('Runtime 执行结果');
84
+ logger.info(`session: ${result.sessionId}`);
85
+ logger.info(`processed: ${result.processed}`);
86
+ logger.info(`completed: ${result.completed}`);
87
+ logger.info(`failed: ${result.failed}`);
88
+ logger.info(`blocked: ${result.blocked}`);
89
+ logger.info(`deliverables: ${result.deliverables}`);
90
+ console.log();
91
+ logger.info('下一步:');
92
+ logger.list([
93
+ 'webforge dashboard # 查看 runtime / task / session 状态',
94
+ 'webforge resume # 查看恢复建议与 next action',
95
+ 'webforge deliverables # 查看交付物'
96
+ ]);
97
+ }
98
+ function getReadyTasks(tasks, limit) {
99
+ const readyTasks = tasks
100
+ .filter((task) => task.status === 'ready')
101
+ .sort((left, right) => {
102
+ if (left.priority !== right.priority) {
103
+ return left.priority - right.priority;
104
+ }
105
+ const createdAtDiff = new Date(left.created_at).getTime() - new Date(right.created_at).getTime();
106
+ if (createdAtDiff !== 0) {
107
+ return createdAtDiff;
108
+ }
109
+ return left.id.localeCompare(right.id);
110
+ });
111
+ if (limit === undefined) {
112
+ return readyTasks;
113
+ }
114
+ return readyTasks.slice(0, limit);
115
+ }
116
+ function parsePositiveInteger(value) {
117
+ const parsed = Number.parseInt(value, 10);
118
+ if (!Number.isInteger(parsed) || parsed <= 0) {
119
+ throw new Error(`Expected a positive integer, received: ${value}`);
120
+ }
121
+ return parsed;
122
+ }
123
+ export function createDeliverablesCommand(basePath = process.cwd()) {
124
+ return new Command('deliverables')
125
+ .description('查看交付物')
126
+ .argument('[task-id]', '任务 ID')
127
+ .action(async (taskId) => {
128
+ if (taskId) {
129
+ await reviewTaskDeliverables(taskId, basePath);
130
+ return;
131
+ }
132
+ const deliverables = await listDeliverables(undefined, basePath);
133
+ console.log(`\n📦 所有交付物 (${deliverables.length}):\n`);
134
+ const grouped = {
135
+ pending_review: deliverables.filter((item) => item.status === 'pending_review'),
136
+ approved: deliverables.filter((item) => item.status === 'approved'),
137
+ rejected: deliverables.filter((item) => item.status === 'rejected')
138
+ };
139
+ if (grouped.pending_review.length > 0) {
140
+ console.log('⏳ 待审核:');
141
+ for (const item of grouped.pending_review) {
142
+ console.log(` • ${item.taskId}: ${item.title}`);
143
+ }
144
+ console.log();
145
+ }
146
+ if (grouped.approved.length > 0) {
147
+ console.log('✅ 已通过:');
148
+ for (const item of grouped.approved) {
149
+ console.log(` • ${item.taskId}: ${item.title}`);
150
+ }
151
+ console.log();
152
+ }
153
+ if (grouped.rejected.length > 0) {
154
+ console.log('❌ 已拒绝:');
155
+ for (const item of grouped.rejected) {
156
+ console.log(` • ${item.taskId}: ${item.title}`);
157
+ }
158
+ }
159
+ });
160
+ }
161
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * superpowers 命令 - 记录外部 workflow 的回写结果
3
+ */
4
+ import { Command } from 'commander';
5
+ import type { WorkspaceSuperpowersRun } from '../../types/index.js';
6
+ export interface RecordSuperpowersRunOptions {
7
+ summary: string;
8
+ task?: string;
9
+ session?: string;
10
+ artifact: string[];
11
+ owner?: string;
12
+ wave?: string;
13
+ thread?: string;
14
+ branch?: string;
15
+ worktree?: string;
16
+ compactFrom?: string;
17
+ json?: boolean;
18
+ }
19
+ export declare function createSuperpowersCommand(basePath?: string): Command;
20
+ export declare function recordSuperpowersRunCommand(workflow: string, options: RecordSuperpowersRunOptions, basePath?: string): Promise<WorkspaceSuperpowersRun>;
21
+ //# sourceMappingURL=superpowers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"superpowers.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/superpowers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,OAAO,KAAK,EAGV,uBAAuB,EACxB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAiClF;AAED,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,2BAA2B,EACpC,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,uBAAuB,CAAC,CAqClC"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * superpowers 命令 - 记录外部 workflow 的回写结果
3
+ */
4
+ import { basename } from 'path';
5
+ import { Command } from 'commander';
6
+ import { recordSuperpowersRun } from '../../core/superpowers-runs.js';
7
+ import logger from '../utils/logger.js';
8
+ export function createSuperpowersCommand(basePath = process.cwd()) {
9
+ const command = new Command('superpowers').description('记录 superpowers workflow 的回写结果');
10
+ command
11
+ .command('record')
12
+ .description('记录一次 workflow 执行结果,并把产物索引回写到 .webforge/')
13
+ .argument('<workflow>', 'workflow 名称,例如 writing-plans / brainstorming')
14
+ .requiredOption('--summary <text>', '本次 workflow 的结果摘要')
15
+ .option('-a, --artifact <value>', '记录产物,支持 path 或 kind:path,可重复传入', collectOption, [])
16
+ .option('--task <task-id>', '关联的 task id')
17
+ .option('--session <session-id>', '关联的 session id')
18
+ .option('--owner <worker-id>', '本次 workflow 的 owner / worker')
19
+ .option('--wave <wave-id>', 'subagent wave id')
20
+ .option('--thread <thread-id>', 'thread id')
21
+ .option('--branch <branch>', '关联 branch')
22
+ .option('--worktree <path>', '关联 worktree path')
23
+ .option('--compact-from <session-id>', 'compact 来源 session')
24
+ .option('--json', '输出结构化结果')
25
+ .action(async (workflow, options) => {
26
+ try {
27
+ await recordSuperpowersRunCommand(workflow, options, basePath);
28
+ }
29
+ catch (error) {
30
+ logger.error(`记录 superpowers workflow 失败: ${error}`);
31
+ process.exit(1);
32
+ }
33
+ });
34
+ return command;
35
+ }
36
+ export async function recordSuperpowersRunCommand(workflow, options, basePath = process.cwd()) {
37
+ if (!Array.isArray(options.artifact) || options.artifact.length === 0) {
38
+ throw new Error('至少提供一个 --artifact,确保 workflow 结果可恢复');
39
+ }
40
+ const input = {
41
+ workflow,
42
+ summary: options.summary,
43
+ taskId: options.task,
44
+ sessionId: options.session,
45
+ artifacts: options.artifact.map((item) => parseArtifactOption(item, workflow)),
46
+ metadata: buildMetadata(options)
47
+ };
48
+ const recorded = await recordSuperpowersRun(basePath, input);
49
+ if (options.json) {
50
+ console.log(JSON.stringify(recorded, null, 2));
51
+ return recorded;
52
+ }
53
+ logger.h1('🦾 Superpowers Workflow 已记录');
54
+ logger.info(`workflow: ${recorded.workflow}`);
55
+ logger.info(`run: ${recorded.id}`);
56
+ logger.info(`summary: ${recorded.summary}`);
57
+ if (recorded.taskId) {
58
+ logger.info(`task: ${recorded.taskId}`);
59
+ }
60
+ if (recorded.sessionId) {
61
+ logger.info(`session: ${recorded.sessionId}`);
62
+ }
63
+ console.log();
64
+ logger.h2('产物');
65
+ logger.list(recorded.artifacts.map((artifact) => `${artifact.kind}: ${artifact.path}`));
66
+ return recorded;
67
+ }
68
+ function buildMetadata(options) {
69
+ const metadata = {
70
+ owner: options.owner,
71
+ waveId: options.wave,
72
+ threadId: options.thread,
73
+ branch: options.branch,
74
+ worktreePath: options.worktree,
75
+ compactFromSession: options.compactFrom
76
+ };
77
+ return Object.values(metadata).some((value) => value !== undefined) ? metadata : undefined;
78
+ }
79
+ function parseArtifactOption(value, workflow) {
80
+ const separatorIndex = value.indexOf(':');
81
+ if (separatorIndex > 0 && !value.startsWith('./') && !value.startsWith('../') && !value.startsWith('/')) {
82
+ const kind = normalizeArtifactKind(value.slice(0, separatorIndex));
83
+ const path = value.slice(separatorIndex + 1);
84
+ return {
85
+ kind,
86
+ path,
87
+ label: basename(path)
88
+ };
89
+ }
90
+ return {
91
+ kind: inferArtifactKind(workflow, value),
92
+ path: value,
93
+ label: basename(value)
94
+ };
95
+ }
96
+ function inferArtifactKind(workflow, path) {
97
+ const normalized = `${workflow} ${path}`.toLowerCase();
98
+ if (normalized.includes('compact')) {
99
+ return 'compact-handoff';
100
+ }
101
+ if (normalized.includes('thread')) {
102
+ return 'thread';
103
+ }
104
+ if (normalized.includes('decision')) {
105
+ return 'decision';
106
+ }
107
+ if (normalized.includes('knowledge') || normalized.includes('requirements')) {
108
+ return 'knowledge';
109
+ }
110
+ if (normalized.includes('worktree') || normalized.includes('branch')) {
111
+ return 'worktree-metadata';
112
+ }
113
+ if (normalized.includes('plan')) {
114
+ return 'plan';
115
+ }
116
+ return 'note';
117
+ }
118
+ function normalizeArtifactKind(raw) {
119
+ switch (raw) {
120
+ case 'knowledge':
121
+ case 'decision':
122
+ case 'plan':
123
+ case 'compact-handoff':
124
+ case 'thread':
125
+ case 'worktree-metadata':
126
+ return raw;
127
+ case 'note':
128
+ default:
129
+ return 'note';
130
+ }
131
+ }
132
+ function collectOption(value, previous) {
133
+ return [...previous, value];
134
+ }
135
+ //# sourceMappingURL=superpowers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"superpowers.js","sourceRoot":"","sources":["../../../src/cli/commands/superpowers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * ui 命令 - 启动 Web UI 本地服务
3
+ */
4
+ import { Command } from 'commander';
5
+ import { type StartedUiHttpServerHandle } from '../../ui/http/server.js';
6
+ export interface UiCommandOptions {
7
+ root?: string;
8
+ host?: string;
9
+ port?: string;
10
+ staticRoot?: string;
11
+ }
12
+ export declare function createUiCommand(): Command;
13
+ export declare function startUiServer(options: UiCommandOptions): Promise<StartedUiHttpServerHandle>;
14
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ui.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAqB,KAAK,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAG5F,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,eAAe,IAAI,OAAO,CASzC;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,yBAAyB,CAAC,CA2BpC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * ui 命令 - 启动 Web UI 本地服务
3
+ */
4
+ import { Command } from 'commander';
5
+ import { startUiHttpServer } from '../../ui/http/server.js';
6
+ import logger from '../utils/logger.js';
7
+ export function createUiCommand() {
8
+ return new Command('ui')
9
+ .description('启动 WebForge 多项目只读 Web UI')
10
+ .option('--root <path>', '要扫描的项目根目录', process.cwd())
11
+ .option('--host <host>', '服务监听地址', '127.0.0.1')
12
+ .option('--port <port>', '服务端口', '4173')
13
+ .action(async (options) => {
14
+ await startUiServer(options);
15
+ });
16
+ }
17
+ export async function startUiServer(options) {
18
+ const root = options.root ?? process.cwd();
19
+ const host = options.host ?? '127.0.0.1';
20
+ const port = options.port ?? '4173';
21
+ const numericPort = Number.parseInt(port, 10);
22
+ if (Number.isNaN(numericPort) || numericPort < 0 || numericPort > 65535) {
23
+ throw new Error(`invalid ui port: ${port}`);
24
+ }
25
+ const handle = await startUiHttpServer({
26
+ rootPath: root,
27
+ host,
28
+ port: numericPort,
29
+ staticRoot: options.staticRoot
30
+ });
31
+ logger.h1('Web UI Ready');
32
+ logger.info('Web UI 本地服务已启动。');
33
+ logger.list([
34
+ `root: ${root}`,
35
+ `host: ${handle.host}`,
36
+ `port: ${handle.port}`,
37
+ `url: ${handle.url}`
38
+ ]);
39
+ return handle;
40
+ }
41
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../src/cli/commands/ui.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAkC,MAAM,yBAAyB,CAAC;AAC5F,OAAO,MAAM,MAAM,oBAAoB,CAAC;AASxC,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;SACrB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,eAAe,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SACnD,MAAM,CAAC,eAAe,EAAE,QAAQ,EAAE,WAAW,CAAC;SAC9C,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;QAC1C,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAyB;IAEzB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC;IACpC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAE9C,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,GAAG,KAAK,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;QACrC,QAAQ,EAAE,IAAI;QACd,IAAI;QACJ,IAAI,EAAE,WAAW;QACjB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;IAC1B,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC/B,MAAM,CAAC,IAAI,CAAC;QACV,SAAS,IAAI,EAAE;QACf,SAAS,MAAM,CAAC,IAAI,EAAE;QACtB,SAAS,MAAM,CAAC,IAAI,EAAE;QACtB,QAAQ,MAAM,CAAC,GAAG,EAAE;KACrB,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * verify 命令 - 对显式验证场景提供稳定入口
3
+ */
4
+ import { Command } from 'commander';
5
+ import { type InitVerificationSummary } from './init.js';
6
+ export interface VerifyInitOptions {
7
+ json?: boolean;
8
+ }
9
+ export declare function createVerifyCommand(basePath?: string): Command;
10
+ export declare function verifyInitCommand(projectPath?: string, options?: VerifyInitOptions, basePath?: string): Promise<InitVerificationSummary>;
11
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAqB7E;AAED,wBAAsB,iBAAiB,CACrC,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE,iBAAsB,EAC/B,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,uBAAuB,CAAC,CAmBlC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * verify 命令 - 对显式验证场景提供稳定入口
3
+ */
4
+ import { resolve } from 'path';
5
+ import { Command } from 'commander';
6
+ import logger from '../utils/logger.js';
7
+ import { buildInitVerificationSummary } from './init.js';
8
+ export function createVerifyCommand(basePath = process.cwd()) {
9
+ const command = new Command('verify').description('运行可复用的 WebForge 验证流程');
10
+ command
11
+ .command('init')
12
+ .description('验证初始化后的 onboarding contract 与 doctor/onboard 输出是否一致')
13
+ .argument('[project-path]', '要验证的项目路径,默认使用当前目录')
14
+ .option('--json', '输出结构化验证结果')
15
+ .action(async (projectPath, options) => {
16
+ try {
17
+ const summary = await verifyInitCommand(projectPath, options, basePath);
18
+ if (!summary.ok) {
19
+ process.exit(1);
20
+ }
21
+ }
22
+ catch (error) {
23
+ logger.error(`验证失败: ${error}`);
24
+ process.exit(1);
25
+ }
26
+ });
27
+ return command;
28
+ }
29
+ export async function verifyInitCommand(projectPath, options = {}, basePath = process.cwd()) {
30
+ const targetPath = projectPath ? resolve(basePath, projectPath) : basePath;
31
+ const summary = await buildInitVerificationSummary(targetPath);
32
+ if (options.json) {
33
+ console.log(JSON.stringify(summary, null, 2));
34
+ return summary;
35
+ }
36
+ logger.h1('🧪 Init Verification');
37
+ logger.info(`target: ${targetPath}`);
38
+ logger.info(`status: ${summary.ok ? 'ok' : 'fail'}`);
39
+ logger.info(`protocol doc: ${summary.protocolDocPath}`);
40
+ logger.info(`protocol doc exists: ${summary.protocolDocExists ? 'yes' : 'no'}`);
41
+ logger.info(`doctor: fail=${summary.doctorFailCount} | warn=${summary.doctorWarnCount}`);
42
+ logger.info(`onboard: canProceed=${summary.onboardCanProceed ? 'yes' : 'no'}`);
43
+ logger.info(`shouldRead contains AGENTS.md: ${summary.shouldReadHasAgents ? 'yes' : 'no'}`);
44
+ return summary;
45
+ }
46
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/cli/commands/verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EACL,4BAA4B,EAE7B,MAAM,WAAW,CAAC;AAMnB,MAAM,UAAU,mBAAmB,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAClE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAE1E,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qDAAqD,CAAC;SAClE,QAAQ,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;SAC/C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC;SAC7B,MAAM,CAAC,KAAK,EAAE,WAA+B,EAAE,OAA0B,EAAE,EAAE;QAC5E,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACxE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAAoB,EACpB,UAA6B,EAAE,EAC/B,WAAmB,OAAO,CAAC,GAAG,EAAE;IAEhC,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC3E,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,UAAU,CAAC,CAAC;IAE/D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC;IAClC,MAAM,CAAC,IAAI,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACxD,MAAM,CAAC,IAAI,CAAC,wBAAwB,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChF,MAAM,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,eAAe,WAAW,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACzF,MAAM,CAAC,IAAI,CAAC,uBAAuB,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/E,MAAM,CAAC,IAAI,CAAC,kCAAkC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAE5F,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * WebForge CLI 入口
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function createProgram(): Command;
7
+ export declare function registerGlobalErrorHandlers(): void;
8
+ export declare function isCliEntrypoint(argv?: string[]): boolean;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * WebForge CLI 入口
4
+ */
5
+ import { Command } from 'commander';
6
+ import { pathToFileURL } from 'url';
7
+ import { createInitCommand } from './commands/init.js';
8
+ import { createPlanCommand } from './commands/plan.js';
9
+ import { createRunCommand, createDeliverablesCommand } from './commands/run.js';
10
+ import { createOnboardCommand } from './commands/onboard.js';
11
+ import { createResumeCommand } from './commands/resume.js';
12
+ import { createDashboardCommand } from './commands/dashboard.js';
13
+ import { createDoctorCommand } from './commands/doctor.js';
14
+ import { createSuperpowersCommand } from './commands/superpowers.js';
15
+ import { createKnowledgeCommand } from './commands/knowledge.js';
16
+ import { createLogsCommand } from './commands/logs.js';
17
+ import { createMailboxCommand } from './commands/mailbox.js';
18
+ import { createReviewCommand } from './commands/review.js';
19
+ import { createCheckpointCommand } from './commands/checkpoint.js';
20
+ import { createUiCommand } from './commands/ui.js';
21
+ import logger from './utils/logger.js';
22
+ import { createVerifyCommand } from './commands/verify.js';
23
+ export function createProgram() {
24
+ const program = new Command();
25
+ program
26
+ .name('webforge')
27
+ .description('WebForge harness compatibility CLI')
28
+ .version('0.1.0')
29
+ .showHelpAfterError()
30
+ .configureOutput({
31
+ writeErr: (str) => logger.error(str.trim()),
32
+ outputError: (str, write) => write(logger.error(str.trim()))
33
+ });
34
+ program.addCommand(createInitCommand());
35
+ program.addCommand(createPlanCommand());
36
+ program.addCommand(createRunCommand());
37
+ program.addCommand(createOnboardCommand());
38
+ program.addCommand(createResumeCommand());
39
+ program.addCommand(createDashboardCommand());
40
+ program.addCommand(createDoctorCommand());
41
+ program.addCommand(createSuperpowersCommand());
42
+ program.addCommand(createKnowledgeCommand());
43
+ program.addCommand(createLogsCommand());
44
+ program.addCommand(createDeliverablesCommand());
45
+ program.addCommand(createReviewCommand());
46
+ program.addCommand(createCheckpointCommand());
47
+ program.addCommand(createMailboxCommand());
48
+ program.addCommand(createVerifyCommand());
49
+ program.addCommand(createUiCommand());
50
+ return program;
51
+ }
52
+ export function registerGlobalErrorHandlers() {
53
+ process.on('uncaughtException', (error) => {
54
+ logger.error(`未捕获的异常: ${error.message}`);
55
+ process.exit(1);
56
+ });
57
+ process.on('unhandledRejection', (reason) => {
58
+ logger.error(`未处理的 Promise: ${reason}`);
59
+ process.exit(1);
60
+ });
61
+ }
62
+ export function isCliEntrypoint(argv = process.argv) {
63
+ return Boolean(argv[1]) && import.meta.url === pathToFileURL(argv[1]).href;
64
+ }
65
+ if (isCliEntrypoint()) {
66
+ registerGlobalErrorHandlers();
67
+ createProgram().parse();
68
+ }
69
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * CLI 日志工具
3
+ * 美化终端输出
4
+ */
5
+ export declare const logger: {
6
+ info(message: string): void;
7
+ success(message: string): void;
8
+ warning(message: string): void;
9
+ error(message: string): void;
10
+ debug(message: string): void;
11
+ h1(title: string): void;
12
+ h2(title: string): void;
13
+ list(items: string[], bullet?: string): void;
14
+ table(rows: string[][]): void;
15
+ progress(current: number, total: number, width?: number): string;
16
+ };
17
+ export default logger;
18
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,eAAO,MAAM,MAAM;kBACH,MAAM,GAAG,IAAI;qBAIV,MAAM,GAAG,IAAI;qBAIb,MAAM,GAAG,IAAI;mBAIf,MAAM,GAAG,IAAI;mBAIb,MAAM,GAAG,IAAI;cAMlB,MAAM,GAAG,IAAI;cAKb,MAAM,GAAG,IAAI;gBAIX,MAAM,EAAE,WAAU,MAAM,GAAW,IAAI;gBAMvC,MAAM,EAAE,EAAE,GAAG,IAAI;sBAiBX,MAAM,SAAS,MAAM,UAAS,MAAM,GAAQ,MAAM;CAUrE,CAAC;AAEF,eAAe,MAAM,CAAC"}