@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.
- package/LICENSE +21 -0
- package/README.md +347 -0
- package/dist/agent/adapters/base.d.ts +9 -0
- package/dist/agent/adapters/base.d.ts.map +1 -0
- package/dist/agent/adapters/base.js +2 -0
- package/dist/agent/adapters/base.js.map +1 -0
- package/dist/agent/adapters/claude-code.d.ts +4 -0
- package/dist/agent/adapters/claude-code.d.ts.map +1 -0
- package/dist/agent/adapters/claude-code.js +25 -0
- package/dist/agent/adapters/claude-code.js.map +1 -0
- package/dist/agent/adapters/codex.d.ts +4 -0
- package/dist/agent/adapters/codex.d.ts.map +1 -0
- package/dist/agent/adapters/codex.js +27 -0
- package/dist/agent/adapters/codex.js.map +1 -0
- package/dist/agent/adapters/command-bridge.d.ts +67 -0
- package/dist/agent/adapters/command-bridge.d.ts.map +1 -0
- package/dist/agent/adapters/command-bridge.js +266 -0
- package/dist/agent/adapters/command-bridge.js.map +1 -0
- package/dist/agent/adapters/index.d.ts +7 -0
- package/dist/agent/adapters/index.d.ts.map +1 -0
- package/dist/agent/adapters/index.js +25 -0
- package/dist/agent/adapters/index.js.map +1 -0
- package/dist/agent/adapters/stub.d.ts +3 -0
- package/dist/agent/adapters/stub.d.ts.map +1 -0
- package/dist/agent/adapters/stub.js +66 -0
- package/dist/agent/adapters/stub.js.map +1 -0
- package/dist/agent/context.d.ts +36 -0
- package/dist/agent/context.d.ts.map +1 -0
- package/dist/agent/context.js +16 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/handlers/index.d.ts +6 -0
- package/dist/agent/handlers/index.d.ts.map +1 -0
- package/dist/agent/handlers/index.js +61 -0
- package/dist/agent/handlers/index.js.map +1 -0
- package/dist/agent/index.d.ts +18 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +37 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/types.d.ts +21 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli/agent-briefing.d.ts +24 -0
- package/dist/cli/agent-briefing.d.ts.map +1 -0
- package/dist/cli/agent-briefing.js +133 -0
- package/dist/cli/agent-briefing.js.map +1 -0
- package/dist/cli/commands/checkpoint.d.ts +12 -0
- package/dist/cli/commands/checkpoint.d.ts.map +1 -0
- package/dist/cli/commands/checkpoint.js +86 -0
- package/dist/cli/commands/checkpoint.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +14 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +192 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +27 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +425 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.d.ts +19 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +303 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/knowledge.d.ts +6 -0
- package/dist/cli/commands/knowledge.d.ts.map +1 -0
- package/dist/cli/commands/knowledge.js +408 -0
- package/dist/cli/commands/knowledge.js.map +1 -0
- package/dist/cli/commands/logs.d.ts +50 -0
- package/dist/cli/commands/logs.d.ts.map +1 -0
- package/dist/cli/commands/logs.js +248 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/mailbox.d.ts +12 -0
- package/dist/cli/commands/mailbox.d.ts.map +1 -0
- package/dist/cli/commands/mailbox.js +131 -0
- package/dist/cli/commands/mailbox.js.map +1 -0
- package/dist/cli/commands/onboard.d.ts +43 -0
- package/dist/cli/commands/onboard.d.ts.map +1 -0
- package/dist/cli/commands/onboard.js +313 -0
- package/dist/cli/commands/onboard.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +16 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +211 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +102 -0
- package/dist/cli/commands/resume.d.ts.map +1 -0
- package/dist/cli/commands/resume.js +256 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/review.d.ts +13 -0
- package/dist/cli/commands/review.d.ts.map +1 -0
- package/dist/cli/commands/review.js +91 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/run.d.ts +19 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +161 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/superpowers.d.ts +21 -0
- package/dist/cli/commands/superpowers.d.ts.map +1 -0
- package/dist/cli/commands/superpowers.js +135 -0
- package/dist/cli/commands/superpowers.js.map +1 -0
- package/dist/cli/commands/ui.d.ts +14 -0
- package/dist/cli/commands/ui.d.ts.map +1 -0
- package/dist/cli/commands/ui.js +41 -0
- package/dist/cli/commands/ui.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +11 -0
- package/dist/cli/commands/verify.d.ts.map +1 -0
- package/dist/cli/commands/verify.js +46 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +69 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/logger.d.ts +18 -0
- package/dist/cli/utils/logger.d.ts.map +1 -0
- package/dist/cli/utils/logger.js +57 -0
- package/dist/cli/utils/logger.js.map +1 -0
- package/dist/core/checkpoint.d.ts +54 -0
- package/dist/core/checkpoint.d.ts.map +1 -0
- package/dist/core/checkpoint.js +227 -0
- package/dist/core/checkpoint.js.map +1 -0
- package/dist/core/context.d.ts +36 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +71 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/deliverable.d.ts +34 -0
- package/dist/core/deliverable.d.ts.map +1 -0
- package/dist/core/deliverable.js +125 -0
- package/dist/core/deliverable.js.map +1 -0
- package/dist/core/harness-hints.d.ts +43 -0
- package/dist/core/harness-hints.d.ts.map +1 -0
- package/dist/core/harness-hints.js +162 -0
- package/dist/core/harness-hints.js.map +1 -0
- package/dist/core/logger.d.ts +104 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +199 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/mailbox.d.ts +69 -0
- package/dist/core/mailbox.d.ts.map +1 -0
- package/dist/core/mailbox.js +225 -0
- package/dist/core/mailbox.js.map +1 -0
- package/dist/core/planning.d.ts +110 -0
- package/dist/core/planning.d.ts.map +1 -0
- package/dist/core/planning.js +832 -0
- package/dist/core/planning.js.map +1 -0
- package/dist/core/runtime.d.ts +22 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +364 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/session.d.ts +62 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +266 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/superpowers-registry.d.ts +20 -0
- package/dist/core/superpowers-registry.d.ts.map +1 -0
- package/dist/core/superpowers-registry.js +180 -0
- package/dist/core/superpowers-registry.js.map +1 -0
- package/dist/core/superpowers-runs.d.ts +19 -0
- package/dist/core/superpowers-runs.d.ts.map +1 -0
- package/dist/core/superpowers-runs.js +231 -0
- package/dist/core/superpowers-runs.js.map +1 -0
- package/dist/core/task.d.ts +43 -0
- package/dist/core/task.d.ts.map +1 -0
- package/dist/core/task.js +232 -0
- package/dist/core/task.js.map +1 -0
- package/dist/core/threads.d.ts +23 -0
- package/dist/core/threads.d.ts.map +1 -0
- package/dist/core/threads.js +92 -0
- package/dist/core/threads.js.map +1 -0
- package/dist/core/worker.d.ts +48 -0
- package/dist/core/worker.d.ts.map +1 -0
- package/dist/core/worker.js +181 -0
- package/dist/core/worker.js.map +1 -0
- package/dist/core/workflow-context.d.ts +16 -0
- package/dist/core/workflow-context.d.ts.map +1 -0
- package/dist/core/workflow-context.js +102 -0
- package/dist/core/workflow-context.js.map +1 -0
- package/dist/core/workspace.d.ts +13 -0
- package/dist/core/workspace.d.ts.map +1 -0
- package/dist/core/workspace.js +208 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/testing/index.d.ts +21 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +55 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/types/index.d.ts +298 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/assets/index-DLwnhrrc.css +1 -0
- package/dist/ui/assets/index-cDUGEuwi.js +234 -0
- package/dist/ui/http/handlers/project-artifacts.d.ts +3 -0
- package/dist/ui/http/handlers/project-artifacts.d.ts.map +1 -0
- package/dist/ui/http/handlers/project-artifacts.js +20 -0
- package/dist/ui/http/handlers/project-artifacts.js.map +1 -0
- package/dist/ui/http/handlers/project-overview.d.ts +3 -0
- package/dist/ui/http/handlers/project-overview.d.ts.map +1 -0
- package/dist/ui/http/handlers/project-overview.js +20 -0
- package/dist/ui/http/handlers/project-overview.js.map +1 -0
- package/dist/ui/http/handlers/project-recovery.d.ts +3 -0
- package/dist/ui/http/handlers/project-recovery.d.ts.map +1 -0
- package/dist/ui/http/handlers/project-recovery.js +20 -0
- package/dist/ui/http/handlers/project-recovery.js.map +1 -0
- package/dist/ui/http/handlers/project-runtime.d.ts +3 -0
- package/dist/ui/http/handlers/project-runtime.d.ts.map +1 -0
- package/dist/ui/http/handlers/project-runtime.js +20 -0
- package/dist/ui/http/handlers/project-runtime.js.map +1 -0
- package/dist/ui/http/handlers/project-tasks.d.ts +3 -0
- package/dist/ui/http/handlers/project-tasks.d.ts.map +1 -0
- package/dist/ui/http/handlers/project-tasks.js +20 -0
- package/dist/ui/http/handlers/project-tasks.js.map +1 -0
- package/dist/ui/http/handlers/projects.d.ts +23 -0
- package/dist/ui/http/handlers/projects.d.ts.map +1 -0
- package/dist/ui/http/handlers/projects.js +29 -0
- package/dist/ui/http/handlers/projects.js.map +1 -0
- package/dist/ui/http/router.d.ts +5 -0
- package/dist/ui/http/router.d.ts.map +1 -0
- package/dist/ui/http/router.js +81 -0
- package/dist/ui/http/router.js.map +1 -0
- package/dist/ui/http/server.d.ts +29 -0
- package/dist/ui/http/server.d.ts.map +1 -0
- package/dist/ui/http/server.js +143 -0
- package/dist/ui/http/server.js.map +1 -0
- package/dist/ui/index.html +13 -0
- package/dist/ui/project-registry.d.ts +9 -0
- package/dist/ui/project-registry.d.ts.map +1 -0
- package/dist/ui/project-registry.js +19 -0
- package/dist/ui/project-registry.js.map +1 -0
- package/dist/ui/project-scanner.d.ts +10 -0
- package/dist/ui/project-scanner.d.ts.map +1 -0
- package/dist/ui/project-scanner.js +135 -0
- package/dist/ui/project-scanner.js.map +1 -0
- package/dist/ui/read-models/artifacts.d.ts +58 -0
- package/dist/ui/read-models/artifacts.d.ts.map +1 -0
- package/dist/ui/read-models/artifacts.js +97 -0
- package/dist/ui/read-models/artifacts.js.map +1 -0
- package/dist/ui/read-models/overview.d.ts +38 -0
- package/dist/ui/read-models/overview.d.ts.map +1 -0
- package/dist/ui/read-models/overview.js +55 -0
- package/dist/ui/read-models/overview.js.map +1 -0
- package/dist/ui/read-models/recovery.d.ts +18 -0
- package/dist/ui/read-models/recovery.d.ts.map +1 -0
- package/dist/ui/read-models/recovery.js +26 -0
- package/dist/ui/read-models/recovery.js.map +1 -0
- package/dist/ui/read-models/runtime.d.ts +53 -0
- package/dist/ui/read-models/runtime.d.ts.map +1 -0
- package/dist/ui/read-models/runtime.js +86 -0
- package/dist/ui/read-models/runtime.js.map +1 -0
- package/dist/ui/read-models/tasks.d.ts +34 -0
- package/dist/ui/read-models/tasks.d.ts.map +1 -0
- package/dist/ui/read-models/tasks.js +46 -0
- package/dist/ui/read-models/tasks.js.map +1 -0
- package/dist/utils/config.d.ts +30 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +152 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/file.d.ts +24 -0
- package/dist/utils/file.d.ts.map +1 -0
- package/dist/utils/file.js +42 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/lock.d.ts +7 -0
- package/dist/utils/lock.d.ts.map +1 -0
- package/dist/utils/lock.js +36 -0
- package/dist/utils/lock.js.map +1 -0
- 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"}
|