@accelerator-mzq/forge 4.0.0 → 4.0.2
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/dist/cli/commands/monitor.d.ts.map +1 -1
- package/dist/cli/commands/monitor.js +30 -6
- package/dist/cli/commands/monitor.js.map +1 -1
- package/dist/cli/commands/preflight.d.ts.map +1 -1
- package/dist/cli/commands/preflight.js +98 -0
- package/dist/cli/commands/preflight.js.map +1 -1
- package/dist/cli/index.js +0 -0
- package/dist/core/templates/skills/using-forge.md +26 -0
- package/package.json +19 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/monitor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,wBAAgB,mBAAmB,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/monitor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,wBAAgB,mBAAmB,IAAI,OAAO,CA4I7C"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/cli/commands/monitor.ts — forge monitor 子命令组(spec §7)
|
|
2
2
|
import { Command } from 'commander';
|
|
3
|
-
import { writeFileSync, mkdirSync } from 'node:fs';
|
|
3
|
+
import { writeFileSync, mkdirSync, readFileSync, existsSync } from 'node:fs';
|
|
4
4
|
import { join, dirname } from 'node:path';
|
|
5
5
|
import { isMonitorEnabled, setMonitorEnabled } from '../../core/monitor/config.js';
|
|
6
6
|
import { readTrace, appendTraceEvent, readCliExits, monitorDir, sessionChangeId, readSessionTrace, } from '../../core/monitor/trace-store.js';
|
|
@@ -47,6 +47,7 @@ export function buildMonitorCommand() {
|
|
|
47
47
|
.requiredOption('--event <event>', '事件类型(stage_enter|decision|hardening_step|stage_exit)')
|
|
48
48
|
.option('--change <id>', 'change-id')
|
|
49
49
|
.option('--json <payload>', 'data 负载(JSON)', '{}')
|
|
50
|
+
.option('--json-file <path>', 'data 负载从文件读(优先于 --json;Windows 推荐,避 cmd.exe 吃 JSON 引号)')
|
|
50
51
|
.action((opts) => {
|
|
51
52
|
// 硬约束(spec §7):永远 exit 0;关闭时静默 no-op。
|
|
52
53
|
try {
|
|
@@ -57,13 +58,36 @@ export function buildMonitorCommand() {
|
|
|
57
58
|
const changeId = opts.change ?? sessionChangeId(root);
|
|
58
59
|
let data;
|
|
59
60
|
let event = opts.event; // JSON 解析失败或 stage 非法时降级为 'record_error'
|
|
60
|
-
|
|
61
|
-
|
|
61
|
+
// jsonFile 优先于 --json(Windows 路径,避 cmd.exe 引号嵌套问题)
|
|
62
|
+
// 读文件失败 / 解析失败一律降级 record_error,与 stdin --json 失败语义对称
|
|
63
|
+
let jsonContent = opts.json;
|
|
64
|
+
let fileReadError = null;
|
|
65
|
+
if (typeof opts.jsonFile === 'string' && opts.jsonFile.trim() !== '') {
|
|
66
|
+
try {
|
|
67
|
+
if (!existsSync(opts.jsonFile)) {
|
|
68
|
+
fileReadError = new Error(`--json-file 路径不存在: ${opts.jsonFile}`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
jsonContent = readFileSync(opts.jsonFile, 'utf8');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
fileReadError = err;
|
|
76
|
+
}
|
|
62
77
|
}
|
|
63
|
-
|
|
64
|
-
// 坏输入降级为 record_error,不报错退出
|
|
78
|
+
if (fileReadError) {
|
|
65
79
|
event = 'record_error';
|
|
66
|
-
data = { original_event: opts.event, error:
|
|
80
|
+
data = { original_event: opts.event, error: fileReadError.message };
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
try {
|
|
84
|
+
data = JSON.parse(jsonContent);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
// 坏输入降级为 record_error,不报错退出
|
|
88
|
+
event = 'record_error';
|
|
89
|
+
data = { original_event: opts.event, error: err.message };
|
|
90
|
+
}
|
|
67
91
|
}
|
|
68
92
|
// stage 合法性校验 —— 无效 stage 同样降级为 record_error(与坏 JSON 对称,spec §7「坏输入」)
|
|
69
93
|
if (event !== 'record_error' &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../../src/cli/commands/monitor.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../../src/cli/commands/monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/preflight.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/preflight.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAwL/C"}
|
|
@@ -58,6 +58,104 @@ export function buildPreflightCommand() {
|
|
|
58
58
|
`建议: git checkout -b ${suggestedBranch},或加 --allow-protected-branch 覆盖`);
|
|
59
59
|
process.exit(2);
|
|
60
60
|
});
|
|
61
|
+
// stage-extensions-check:扫 forge/config.yaml#stage_extensions 配置常见漏洞
|
|
62
|
+
// - adversarial entry 漏 --user-focus / --target-label → codex 失焦扫整个 working tree
|
|
63
|
+
// - adversarial 模式 entry 漏 build_prompt → helper run 立即失败
|
|
64
|
+
// - defaults 过松(timeout > 900 / max_rounds > 3)→ 易 15+ 分钟 hang
|
|
65
|
+
// loose 模式:发现问题只 emit stderr,exit 0 不阻塞;沿 codex stage-extensions 整体 loose 哲学
|
|
66
|
+
cmd
|
|
67
|
+
.command('stage-extensions-check')
|
|
68
|
+
.description('扫 forge/config.yaml#stage_extensions 配置常见漏洞(user-focus 缺失 / defaults 过松等)')
|
|
69
|
+
.action(() => {
|
|
70
|
+
const cwd = process.cwd();
|
|
71
|
+
const configPath = join(cwd, 'forge', 'config.yaml');
|
|
72
|
+
// 没 config 文件 → graceful skip(新项目初始化前跑此命令不算错)
|
|
73
|
+
if (!existsSync(configPath)) {
|
|
74
|
+
return; // exit 0
|
|
75
|
+
}
|
|
76
|
+
// parse 失败 → 同 branch-check 走 exit 2(config 错)
|
|
77
|
+
let config;
|
|
78
|
+
try {
|
|
79
|
+
config = parseConfig(readFileSync(configPath, 'utf-8'));
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
console.error(`forge preflight: 解析 forge/config.yaml 失败: ${err.message}`);
|
|
83
|
+
process.exit(2);
|
|
84
|
+
}
|
|
85
|
+
const se = config.stage_extensions;
|
|
86
|
+
// 没 stage_extensions 段 → 不报警(用户没用此特性)
|
|
87
|
+
if (!se || typeof se !== 'object') {
|
|
88
|
+
return; // exit 0
|
|
89
|
+
}
|
|
90
|
+
const findings = [];
|
|
91
|
+
const stages = [
|
|
92
|
+
'brainstorming',
|
|
93
|
+
'propose',
|
|
94
|
+
'apply_critical_plan_review',
|
|
95
|
+
'review',
|
|
96
|
+
'verify',
|
|
97
|
+
];
|
|
98
|
+
// 逐 stage 扫 entry
|
|
99
|
+
for (const stage of stages) {
|
|
100
|
+
const entries = se[stage];
|
|
101
|
+
if (!Array.isArray(entries))
|
|
102
|
+
continue;
|
|
103
|
+
for (const entry of entries) {
|
|
104
|
+
// 显式 disabled 跳过(不扫已停用的 entry)
|
|
105
|
+
if (entry.enabled === false)
|
|
106
|
+
continue;
|
|
107
|
+
const name = typeof entry.name === 'string' ? entry.name : '?';
|
|
108
|
+
// R1:adversarial build_prompt 含 helper 但缺 --user-focus / --target-label
|
|
109
|
+
if (typeof entry.build_prompt === 'string') {
|
|
110
|
+
const bp = entry.build_prompt;
|
|
111
|
+
// 用两次 includes 检测,容忍 helper 路径用引号包裹("${FORGE_HELPER_DIR}/codex-review-helper.mjs" build-prompt)
|
|
112
|
+
if (bp.includes('codex-review-helper.mjs') && bp.includes('build-prompt')) {
|
|
113
|
+
if (!bp.includes('--user-focus')) {
|
|
114
|
+
findings.push(`[WARN] stage_extensions.${stage}[${name}].build_prompt 漏 --user-focus → ` +
|
|
115
|
+
`codex 会用字面 'Focus: (none provided)' 失焦扫整个 working tree,` +
|
|
116
|
+
`可能 surface 无关 finding`);
|
|
117
|
+
}
|
|
118
|
+
if (!bp.includes('--target-label')) {
|
|
119
|
+
findings.push(`[WARN] stage_extensions.${stage}[${name}].build_prompt 漏 --target-label → ` +
|
|
120
|
+
`codex review 报告 target 显示字面 'current branch' 不精确`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// R4:command 含 --mode adversarial 但 entry 无 build_prompt
|
|
125
|
+
if (typeof entry.command === 'string' && entry.command.includes('--mode adversarial')) {
|
|
126
|
+
const hasBp = typeof entry.build_prompt === 'string' && entry.build_prompt.trim() !== '';
|
|
127
|
+
if (!hasBp) {
|
|
128
|
+
findings.push(`[WARN] stage_extensions.${stage}[${name}] command 用 --mode adversarial 但 entry 无 build_prompt → ` +
|
|
129
|
+
`helper 的 run --mode adversarial 强制 --prompt-file,缺会立即失败`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// R2/R3:defaults 收紧建议(默认值实测易 hang)
|
|
135
|
+
const defaults = se.defaults;
|
|
136
|
+
const timeout = typeof defaults?.timeout_sec === 'number' ? defaults.timeout_sec : 900;
|
|
137
|
+
if (timeout > 900) {
|
|
138
|
+
findings.push(`[SUGGESTION] stage_extensions.defaults.timeout_sec=${timeout} > 900,实测 codex 偶尔 ` +
|
|
139
|
+
`15+ 分钟无输出 hang;建议 600`);
|
|
140
|
+
}
|
|
141
|
+
const convergence = defaults?.convergence;
|
|
142
|
+
const maxRounds = typeof convergence?.max_rounds === 'number' ? convergence.max_rounds : 10;
|
|
143
|
+
if (maxRounds > 3) {
|
|
144
|
+
findings.push(`[SUGGESTION] stage_extensions.defaults.convergence.max_rounds=${maxRounds} > 3,` +
|
|
145
|
+
`多轮重跑成本大;建议 1(loose 模式不需要收敛 loop)`);
|
|
146
|
+
}
|
|
147
|
+
// 输出 summary
|
|
148
|
+
if (findings.length === 0) {
|
|
149
|
+
console.error(`forge preflight stage-extensions-check: ✓ 配置完整,无已知问题`);
|
|
150
|
+
return; // exit 0
|
|
151
|
+
}
|
|
152
|
+
console.error(`forge preflight stage-extensions-check: ${findings.length} 项建议改进(loose,不阻塞)`);
|
|
153
|
+
for (const f of findings) {
|
|
154
|
+
console.error(` ${f}`);
|
|
155
|
+
}
|
|
156
|
+
console.error(`\n详:docs/migration/setup-stage-extensions.md`);
|
|
157
|
+
return; // exit 0(loose,不阻塞;CI 想 strict 可用 grep 自检)
|
|
158
|
+
});
|
|
61
159
|
return cmd;
|
|
62
160
|
}
|
|
63
161
|
//# sourceMappingURL=preflight.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../../src/cli/commands/preflight.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,4DAA4D;AAC5D,wDAAwD;AACxD,qFAAqF;AACrF,wEAAwE;AAExE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEtE;;;GAGG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAC;IAEnF,GAAG;SACA,OAAO,CAAC,yBAAyB,CAAC;SAClC,WAAW,CAAC,sEAAsE,CAAC;SACnF,MAAM,CAAC,0BAA0B,EAAE,iCAAiC,CAAC;SACrE,MAAM,CAAC,CAAC,QAA4B,EAAE,IAAwC,EAAE,EAAE;QACjF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE1B,kEAAkE;QAClE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,SAAS;QACnB,CAAC;QAED,mFAAmF;QACnF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QACrD,IAAI,iBAAiB,GAAsB,0BAA0B,CAAC;QACtE,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC7C,iBAAiB,GAAG,MAAM,CAAC,kBAAkB,CAAC;gBAChD,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,mDAAmD;gBACnD,OAAO,CAAC,KAAK,CAAC,6CAA8C,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;gBACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAE5C,aAAa;QACb,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/C,OAAO,CAAC,SAAS;QACnB,CAAC;QAED,kEAAkE;QAClE,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CACX,0BAA0B,aAAa,UAAU;gBAC/C,kDAAkD,CACrD,CAAC;YACF,OAAO,CAAC,SAAS;QACnB,CAAC;QAED,8BAA8B;QAC9B,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC,CAAC,0BAA0B,CAAC;QACtF,OAAO,CAAC,KAAK,CACX,0BAA0B,aAAa,sBAAsB;YAC3D,uBAAuB,eAAe,iCAAiC,CAC1E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../../src/cli/commands/preflight.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
File without changes
|
|
@@ -29,6 +29,32 @@ If CLAUDE.md says "don't use TDD" and a skill says "always use TDD," follow the
|
|
|
29
29
|
|
|
30
30
|
**In Claude Code:** Use the `Skill` tool. When you invoke a skill, its content is loaded and presented to you—follow it directly. Never use the Read tool on skill files.
|
|
31
31
|
|
|
32
|
+
**In OpenCode:** Use OpenCode's native `skill` tool to list and load skills. Skills are auto-discovered via `config.skills.paths`(forge plugin 自动注入,无需手动 symlink)。
|
|
33
|
+
|
|
34
|
+
**In Codex CLI:** Skills 通过 `~/.agents/skills/forge/` symlink 被 Codex 原生 discovery 扫到(安装见 `docs/codex-install.md`)。Codex 没有显式的 skill invoke 工具 — 当一个 skill 的 trigger phrase / description 匹配当前任务时,直接读它的 `SKILL.md` 并按内容执行。
|
|
35
|
+
|
|
36
|
+
## Platform Tool Mapping
|
|
37
|
+
|
|
38
|
+
Skills 是按 Claude Code 工具名写的。在其它 harness 上遇到这些名字时,按下表替换:
|
|
39
|
+
|
|
40
|
+
| Claude Code 引用 | Codex 等价 | OpenCode 等价 |
|
|
41
|
+
| ------------------------- | ---------------------------------------------------------------- | --------------------------------- |
|
|
42
|
+
| `Skill` 工具 | 直接读 `SKILL.md` 并按内容执行 | OpenCode 原生 `skill` 工具 |
|
|
43
|
+
| `Task` 工具(派 subagent) | `spawn_agent`(需 `~/.codex/config.toml` 开 `multi_agent = true`) | OpenCode `@mention` subagent 系统 |
|
|
44
|
+
| `TodoWrite` | `update_plan` | `todowrite` |
|
|
45
|
+
| `Read` / `Write` / `Edit` | 原生文件工具 | 原生文件工具 |
|
|
46
|
+
| `Bash` | 原生 shell 工具 | 原生 shell 工具 |
|
|
47
|
+
|
|
48
|
+
## workflow-monitor 跨 harness 兼容
|
|
49
|
+
|
|
50
|
+
`forge/config.yaml#monitor.enabled=true` 后,workflow-monitor 自动注入的可用性按 harness 不同:
|
|
51
|
+
|
|
52
|
+
| Harness | 自动注入 | 触发路径 |
|
|
53
|
+
| ----------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
54
|
+
| Claude Code | ✅ | SessionStart hook(`hooks/session-start`)跑 `monitor-check.mjs` → exit 0 时把 `hooks/workflow-monitor-injection.md` 注入 |
|
|
55
|
+
| OpenCode | ✅ | `.opencode/plugins/forge.js` 的 `transform` hook 在 bootstrap 拼接 monitor injection(同 Tier 1 行为) |
|
|
56
|
+
| Codex | ❌ | **无 hook 通道** — 不会自动注入。如 `monitor.enabled=true` 但你在 Codex session,主动 `Read` `<forge plugin root>/hooks/workflow-monitor-injection.md` 按其指引执行 monitor record |
|
|
57
|
+
|
|
32
58
|
# Using Skills
|
|
33
59
|
|
|
34
60
|
## The Rule
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@accelerator-mzq/forge",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.2",
|
|
4
4
|
"description": "OpenSpec × superpowers fusion: spec-driven workflow + behavior-shaping skills, packaged as multi-harness CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -18,6 +18,23 @@
|
|
|
18
18
|
"LICENSE",
|
|
19
19
|
"LICENSE-THIRD-PARTY.md"
|
|
20
20
|
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "node scripts/copy-templates.mjs && tsc -p tsconfig.json",
|
|
23
|
+
"prepublishOnly": "node scripts/release-gate.mjs",
|
|
24
|
+
"release:gate": "node scripts/release-gate.mjs",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"test:watch": "vitest",
|
|
27
|
+
"lint": "eslint .",
|
|
28
|
+
"lint:fix": "eslint . --fix",
|
|
29
|
+
"format": "prettier --write .",
|
|
30
|
+
"format:check": "prettier --check .",
|
|
31
|
+
"typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit",
|
|
32
|
+
"eval": "tsx forge-eval/index.ts",
|
|
33
|
+
"eval:changed": "tsx forge-eval/index.ts --changed-only",
|
|
34
|
+
"eval:skill": "tsx forge-eval/index.ts --skill",
|
|
35
|
+
"eval-regen": "tsx forge-eval/regeneration-index.ts",
|
|
36
|
+
"eval-regen:scenario": "tsx forge-eval/regeneration-index.ts --scenario"
|
|
37
|
+
},
|
|
21
38
|
"dependencies": {
|
|
22
39
|
"@anthropic-ai/sdk": "^0.93.0",
|
|
23
40
|
"canonicalize": "^3.0.0",
|
|
@@ -64,21 +81,5 @@
|
|
|
64
81
|
"homepage": "https://github.com/Accelerator-mzq/forge",
|
|
65
82
|
"bugs": {
|
|
66
83
|
"url": "https://github.com/Accelerator-mzq/forge/issues"
|
|
67
|
-
},
|
|
68
|
-
"scripts": {
|
|
69
|
-
"build": "node scripts/copy-templates.mjs && tsc -p tsconfig.json",
|
|
70
|
-
"release:gate": "node scripts/release-gate.mjs",
|
|
71
|
-
"test": "vitest run",
|
|
72
|
-
"test:watch": "vitest",
|
|
73
|
-
"lint": "eslint .",
|
|
74
|
-
"lint:fix": "eslint . --fix",
|
|
75
|
-
"format": "prettier --write .",
|
|
76
|
-
"format:check": "prettier --check .",
|
|
77
|
-
"typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit",
|
|
78
|
-
"eval": "tsx forge-eval/index.ts",
|
|
79
|
-
"eval:changed": "tsx forge-eval/index.ts --changed-only",
|
|
80
|
-
"eval:skill": "tsx forge-eval/index.ts --skill",
|
|
81
|
-
"eval-regen": "tsx forge-eval/regeneration-index.ts",
|
|
82
|
-
"eval-regen:scenario": "tsx forge-eval/regeneration-index.ts --scenario"
|
|
83
84
|
}
|
|
84
|
-
}
|
|
85
|
+
}
|