agent-work-loop 0.0.0 → 0.6.22
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/README.md +272 -12
- package/dist/brief-Z3JKXEUP.js +181 -0
- package/dist/changelog-R7BNBF2C.js +62 -0
- package/dist/chunk-4OCSYHYB.js +274 -0
- package/dist/chunk-6E7XEQOH.js +27 -0
- package/dist/chunk-7SYRDDTX.js +516 -0
- package/dist/chunk-BUWGQVHT.js +1243 -0
- package/dist/chunk-C7TN3LM3.js +448 -0
- package/dist/chunk-CCMG377E.js +771 -0
- package/dist/chunk-D5OINC3G.js +52 -0
- package/dist/chunk-F5LHXBH7.js +209 -0
- package/dist/chunk-FBEUJR2P.js +446 -0
- package/dist/chunk-I77CXOEX.js +693 -0
- package/dist/chunk-LMWAVN7B.js +904 -0
- package/dist/chunk-O7GRZZPJ.js +347 -0
- package/dist/chunk-TKPHC32G.js +96 -0
- package/dist/chunk-UOPWVM2H.js +727 -0
- package/dist/chunk-VU6IPRRM.js +166 -0
- package/dist/chunk-X5LMP5J7.js +307 -0
- package/dist/chunk-ZLTOL3D3.js +286 -0
- package/dist/cli.js +373 -11
- package/dist/commit-APXIVOSD.js +411 -0
- package/dist/config-TFMW7O4T.js +34 -0
- package/dist/doctor-BU6HWXE4.js +29 -0
- package/dist/evolve-NNQX2A43.js +38 -0
- package/dist/feedback-KAXNFMUY.js +125 -0
- package/dist/gotchas-CW4KZDEF.js +43 -0
- package/dist/hold-recheck-SLI7NDLU.js +133 -0
- package/dist/init-UDM5AXKI.js +79 -0
- package/dist/lane-MIVLTDEU.js +41 -0
- package/dist/loop-summary-XAI6KOGB.js +361 -0
- package/dist/metrics-WLRZZRTK.js +25 -0
- package/dist/record-UKDIUJ5T.js +68 -0
- package/dist/review-NTZ3HY3N.js +118 -0
- package/dist/rules-4VDP5LZW.js +33 -0
- package/dist/state-XM7NZ2HA.js +37 -0
- package/dist/status-I3MQOCQM.js +40 -0
- package/dist/uninstall-MOHJDMQH.js +545 -0
- package/dist/update-AYTBYAHI.js +61 -0
- package/dist/verify-6YF5FXWM.js +37 -0
- package/dist/version-check-G27JYMTZ.js +14 -0
- package/dist/work-6MMIQMUC.js +50 -0
- package/engine/skills/claude/awl-loop/SKILL.md +292 -0
- package/engine/skills/claude/awl-loop/reference.md +131 -0
- package/engine/skills/claude/awl-pipeline/SKILL.md +83 -0
- package/engine/skills/claude/awl-pipeline-exec/SKILL.md +200 -0
- package/engine/skills/claude/awl-pipeline-plan/SKILL.md +71 -0
- package/engine/skills/claude/awl-pipeline-review/SKILL.md +149 -0
- package/engine/skills/codex/AGENTS.awl.md +117 -0
- package/engine/templates/block-publish.mjs +9 -0
- package/engine/templates/pre-push.sample +7 -0
- package/engine/templates/related-cmd-examples.md +37 -0
- package/engine/version.json +2 -2
- package/package.json +9 -3
package/dist/cli.js
CHANGED
|
@@ -1,26 +1,388 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
computeUpdateAvailable,
|
|
4
|
+
readCachedLatestVersion,
|
|
5
|
+
version
|
|
6
|
+
} from "./chunk-VU6IPRRM.js";
|
|
7
|
+
import {
|
|
8
|
+
caps,
|
|
9
|
+
gradient,
|
|
10
|
+
installedEngineVersion,
|
|
11
|
+
makeColors,
|
|
12
|
+
makeSymbols,
|
|
13
|
+
signal,
|
|
14
|
+
visibleWidth
|
|
15
|
+
} from "./chunk-7SYRDDTX.js";
|
|
2
16
|
|
|
3
17
|
// src/program.ts
|
|
4
18
|
import { Command } from "commander";
|
|
5
|
-
|
|
6
|
-
// package.json
|
|
7
|
-
var version = "0.0.0";
|
|
8
|
-
|
|
9
|
-
// src/program.ts
|
|
10
19
|
var BANNER = `Agent Work Loop
|
|
11
20
|
|
|
12
21
|
\uAC19\uC740 \uC2E4\uD328\uB97C \uB450 \uBC88 \uD558\uC9C0 \uC54A\uAC8C \uB9CC\uB4DC\uB294 \uB3C4\uAD6C\uC785\uB2C8\uB2E4.
|
|
13
22
|
awl \uC790\uCCB4\uB294 \uD310\uB2E8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uD30C\uC77C\uACFC \uC0C1\uD0DC\uB9CC \uAD00\uB9AC\uD569\uB2C8\uB2E4.
|
|
14
|
-
\uD310\uB2E8\uC740 Claude Code \uB098 Codex \uAC00 \uD569\uB2C8\uB2E4
|
|
23
|
+
\uD310\uB2E8\uC740 Claude Code \uB098 Codex \uAC00 \uD569\uB2C8\uB2E4.
|
|
24
|
+
|
|
25
|
+
\uC2DC\uC791\uD558\uAE30:
|
|
26
|
+
1. awl init \uC774 \uD504\uB85C\uC81D\uD2B8\uB97C \uC124\uC815\uD569\uB2C8\uB2E4
|
|
27
|
+
2. awl status \uC9C0\uAE08 \uC5B4\uB514\uAE4C\uC9C0 \uC654\uB294\uC9C0 \uBD05\uB2C8\uB2E4
|
|
28
|
+
3. awl doctor \uC124\uCE58\uC640 \uD658\uACBD\uC744 \uC810\uAC80\uD569\uB2C8\uB2E4`;
|
|
29
|
+
var DENSE_AWL = `\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2557
|
|
30
|
+
\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551
|
|
31
|
+
\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551
|
|
32
|
+
\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551
|
|
33
|
+
\u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2554\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557
|
|
34
|
+
\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u255D\u255A\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D`;
|
|
35
|
+
var ASCII_AWL = ` _ __ __
|
|
36
|
+
/ \\ \\ \\ / /
|
|
37
|
+
/ _ \\ \\ \\ /\\ / /
|
|
38
|
+
/ ___ \\ \\ V V /
|
|
39
|
+
/_/ \\_\\ \\_/\\_/`;
|
|
40
|
+
function renderBanner(c = caps()) {
|
|
41
|
+
const markLines = gradient((c.unicode ? DENSE_AWL : ASCII_AWL).split("\n"), c);
|
|
42
|
+
const copyLines = BANNER.split("\n");
|
|
43
|
+
const markWidth = Math.max(...markLines.map(visibleWidth));
|
|
44
|
+
const rowCount = Math.max(markLines.length, copyLines.length);
|
|
45
|
+
return Array.from({ length: rowCount }, (_, i) => {
|
|
46
|
+
const mark = markLines[i] ?? "";
|
|
47
|
+
const copy = copyLines[i] ?? "";
|
|
48
|
+
return `${mark}${" ".repeat(Math.max(0, markWidth - visibleWidth(mark)) + 4)}${copy}`.trimEnd();
|
|
49
|
+
}).join("\n");
|
|
50
|
+
}
|
|
51
|
+
function versionString(c = caps()) {
|
|
52
|
+
const color = makeColors(c.color);
|
|
53
|
+
const s = makeSymbols(c);
|
|
54
|
+
const engineVer = installedEngineVersion();
|
|
55
|
+
const heading = `awl v${version}`;
|
|
56
|
+
let base;
|
|
57
|
+
if (engineVer === null) {
|
|
58
|
+
base = [
|
|
59
|
+
heading,
|
|
60
|
+
` ${s.lastBranch} Engine Template: ${color.dim("(\uC124\uCE58\uB418\uC9C0 \uC54A\uC74C)")}`,
|
|
61
|
+
"",
|
|
62
|
+
` ${signal(c, "warn")} \uC5D4\uC9C4 \uD15C\uD50C\uB9BF\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.`,
|
|
63
|
+
` ${color.dim("'awl init'\uC744 \uC2E4\uD589\uD558\uC5EC \uD15C\uD50C\uB9BF\uC744 \uC124\uCE58\uD558\uC138\uC694.")}`
|
|
64
|
+
].join("\n");
|
|
65
|
+
} else {
|
|
66
|
+
const template = ` ${s.lastBranch} Engine Template: v${engineVer}`;
|
|
67
|
+
if (engineVer === version) {
|
|
68
|
+
base = `${heading}
|
|
69
|
+
${template}`;
|
|
70
|
+
} else {
|
|
71
|
+
base = [
|
|
72
|
+
heading,
|
|
73
|
+
template,
|
|
74
|
+
"",
|
|
75
|
+
` ${signal(c, "warn")} \uBC84\uC804 \uBD88\uC77C\uCE58 \uAC10\uC9C0!`,
|
|
76
|
+
" CLI \uBCF8\uCCB4\uC640 \uD648 \uB514\uB809\uD1A0\uB9AC(~/.awl/engine)\uC758 \uC2A4\uD0AC \uD15C\uD50C\uB9BF \uBC84\uC804\uC774 \uB2E4\uB985\uB2C8\uB2E4.",
|
|
77
|
+
` ${color.dim("\uD574\uACB0\uD558\uB824\uBA74 awl update \uB85C \uC5D4\uC9C4\uC744 \uAC31\uC2E0\uD558\uC138\uC694.")}`
|
|
78
|
+
].join("\n");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const updateAvailable = computeUpdateAvailable(version, readCachedLatestVersion());
|
|
82
|
+
if (!updateAvailable) {
|
|
83
|
+
return base;
|
|
84
|
+
}
|
|
85
|
+
return [
|
|
86
|
+
base,
|
|
87
|
+
"",
|
|
88
|
+
` ${signal(c, "warn")} \uC0C8 \uBC84\uC804 v${updateAvailable.latest} \uC788\uC74C`,
|
|
89
|
+
` ${color.dim(updateAvailable.hint)}`
|
|
90
|
+
].join("\n");
|
|
91
|
+
}
|
|
92
|
+
function parseExperimentOption(input) {
|
|
93
|
+
if (typeof input !== "string" || input.trim() === "") {
|
|
94
|
+
return { ok: true, value: void 0 };
|
|
95
|
+
}
|
|
96
|
+
let parsed;
|
|
97
|
+
try {
|
|
98
|
+
parsed = JSON.parse(input);
|
|
99
|
+
} catch {
|
|
100
|
+
return { ok: false, error: "--experiment JSON \uC744 \uD30C\uC2F1\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4." };
|
|
101
|
+
}
|
|
102
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
103
|
+
return { ok: false, error: "--experiment \uC740 JSON \uAC1D\uCCB4\uC5EC\uC57C \uD569\uB2C8\uB2E4." };
|
|
104
|
+
}
|
|
105
|
+
return { ok: true, value: parsed };
|
|
106
|
+
}
|
|
107
|
+
function parseWorkitemsOption(input) {
|
|
108
|
+
if (typeof input !== "string" || input.trim() === "") {
|
|
109
|
+
return void 0;
|
|
110
|
+
}
|
|
111
|
+
const ids = input.split(",").map((s) => s.trim()).filter((s) => s.length > 0);
|
|
112
|
+
return ids.length > 0 ? ids : void 0;
|
|
113
|
+
}
|
|
15
114
|
function buildProgram() {
|
|
16
115
|
const program = new Command();
|
|
17
|
-
program.name("awl").version(
|
|
18
|
-
`).showHelpAfterError();
|
|
19
|
-
program.action(() => {
|
|
20
|
-
|
|
116
|
+
program.name("awl").version(versionString(), "-v, --version", "\uBC84\uC804\uC744 \uCD9C\uB825\uD569\uB2C8\uB2E4").helpOption("-h, --help", "\uB3C4\uC6C0\uB9D0\uC744 \uCD9C\uB825\uD569\uB2C8\uB2E4").addHelpText("beforeAll", (ctx) => ctx.command === program ? `${renderBanner()}
|
|
117
|
+
` : "").showHelpAfterError();
|
|
118
|
+
program.command("init").description("\uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 Agent Work Loop \uB97C \uC124\uC815\uD569\uB2C8\uB2E4").option("--yes", "\uC9C8\uBB38 \uC5C6\uC774 \uC790\uB3D9 \uAC10\uC9C0\uB41C \uAC12\uC73C\uB85C \uC9C4\uD589\uD569\uB2C8\uB2E4 (\uBE44\uB300\uD654\uD615)").action(async (opts) => {
|
|
119
|
+
const { runInit } = await import("./init-UDM5AXKI.js");
|
|
120
|
+
await runInit({ yes: opts.yes === true });
|
|
121
|
+
});
|
|
122
|
+
program.command("status").description("\uC9C0\uAE08 \uC5B4\uB514\uAE4C\uC9C0 \uC654\uB294\uC9C0 \uD55C\uB208\uC5D0 \uBD05\uB2C8\uB2E4").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").option("--pipeline", ".tasks \uB808\uC778(plan/exec/review)\uC758 workitem \uC0C1\uD0DC\uB97C \uBC30\uC9C0\uB85C \uBD05\uB2C8\uB2E4").option(
|
|
123
|
+
"--archive",
|
|
124
|
+
"(--pipeline\uACFC \uD568\uAED8) \uC720\uC608 \uAE30\uAC04(3\uC77C) \uC9C0\uB09C \uC644\uB8CC workitem\uC744 .tasks/archive/ \uB85C \uBCF4\uAD00\uD569\uB2C8\uB2E4"
|
|
125
|
+
).action(async (opts) => {
|
|
126
|
+
const { runStatus } = await import("./status-I3MQOCQM.js");
|
|
127
|
+
await runStatus({
|
|
128
|
+
json: opts.json === true,
|
|
129
|
+
pipeline: opts.pipeline === true,
|
|
130
|
+
archive: opts.archive === true
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
program.command("brief").description("KST \uC624\uB298(\uB610\uB294 --date)\uC758 \uC9C4\uD589\uBD84\uC744 \uBAA8\uC544 \uB0C5\uB2C8\uB2E4(\uC2A4\uD0AC \uC18C\uBE44\uC6A9 --json)").option("--today", "\uC624\uB298(KST) \uAE30\uC900\uC73C\uB85C \uBAA8\uC74D\uB2C8\uB2E4(\uAE30\uBCF8)").option("--date <YYYY-MM-DD>", "KST \uAE30\uC900 \uD2B9\uC815 \uB0A0\uC9DC\uB85C \uBAA8\uC74D\uB2C8\uB2E4").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
|
|
134
|
+
const { runBrief } = await import("./brief-Z3JKXEUP.js");
|
|
135
|
+
await runBrief({ today: opts.today === true, date: opts.date, json: opts.json === true });
|
|
136
|
+
});
|
|
137
|
+
program.command("doctor").description("\uC124\uCE58\uC640 \uD658\uACBD\uC744 \uC810\uAC80\uD569\uB2C8\uB2E4 (\uC544\uBB34\uAC83\uB3C4 \uACE0\uCE58\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4)").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
|
|
138
|
+
const { runDoctor } = await import("./doctor-BU6HWXE4.js");
|
|
139
|
+
await runDoctor({ json: opts.json === true });
|
|
140
|
+
});
|
|
141
|
+
program.command("version-check").description("\uBC84\uC804 \uBD88\uC77C\uCE58\uB97C \uAC80\uC0AC\uD569\uB2C8\uB2E4 (package/engine/\uD504\uB85C\uC81D\uD2B8/\uC2A4\uD0AC)").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
|
|
142
|
+
const { runVersionCheck } = await import("./version-check-G27JYMTZ.js");
|
|
143
|
+
await runVersionCheck({ json: opts.json === true });
|
|
144
|
+
});
|
|
145
|
+
program.command("update").description("\uC124\uCE58\uB41C \uC5D4\uC9C4(~/.awl/engine)\uC744 \uAC31\uC2E0\uD569\uB2C8\uB2E4").action(async () => {
|
|
146
|
+
const { runUpdate } = await import("./update-AYTBYAHI.js");
|
|
147
|
+
runUpdate();
|
|
148
|
+
});
|
|
149
|
+
program.command("uninstall").description("awl \uC774 \uC190\uB304 \uD754\uC801\uC744 \uC9C0\uC6C1\uB2C8\uB2E4 (\uAE30\uBCF8\uC740 \uB4DC\uB77C\uC774\uB7F0 \u2014 --yes \uC5C6\uC774\uB294 \uC0AD\uC81C\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4)").option("--yes", "\uC2E4\uC81C\uB85C \uC0AD\uC81C\uD569\uB2C8\uB2E4 (\uAE30\uBCF8\uC740 \uB4DC\uB77C\uC774\uB7F0)").option("--project", "\uC774 \uD504\uB85C\uC81D\uD2B8 \uB85C\uCEEC\uB9CC \uC815\uB9AC\uD569\uB2C8\uB2E4 (\uAE30\uBCF8\uAC12)").option("--global", "\uC804\uC5ED(~/.awl)\uB9CC \uC815\uB9AC\uD569\uB2C8\uB2E4 \u2014 \uB2E4\uB978 \uD504\uB85C\uC81D\uD2B8\uC758 \uD559\uC2B5\uB3C4 \uD568\uAED8 \uC0AC\uB77C\uC9D1\uB2C8\uB2E4").option("--all", "\uD504\uB85C\uC81D\uD2B8 \uB85C\uCEEC + \uC804\uC5ED\uC744 \uBAA8\uB450 \uC815\uB9AC\uD569\uB2C8\uB2E4").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(
|
|
150
|
+
async (opts) => {
|
|
151
|
+
const { runUninstall } = await import("./uninstall-MOHJDMQH.js");
|
|
152
|
+
await runUninstall({
|
|
153
|
+
yes: opts.yes === true,
|
|
154
|
+
project: opts.project === true,
|
|
155
|
+
global: opts.global === true,
|
|
156
|
+
all: opts.all === true,
|
|
157
|
+
json: opts.json === true
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
);
|
|
161
|
+
const config = program.command("config").description("\uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \uC124\uC815\uC744 \uBD05\uB2C8\uB2E4 (TTY \uBA74 \uC218\uC815\uB3C4)");
|
|
162
|
+
config.action(async () => {
|
|
163
|
+
const { runConfig } = await import("./config-TFMW7O4T.js");
|
|
164
|
+
await runConfig();
|
|
165
|
+
});
|
|
166
|
+
config.command("set [key] [value]").description("\uC124\uC815 \uAC12\uC744 \uBC14\uAFC9\uB2C8\uB2E4 (\uD0A4 \uC0DD\uB7B5 \uC2DC \uBAA9\uB85D, cmd \uB294 \uC2E4\uC81C\uB85C \uC2E4\uD589\uD574 \uBD05\uB2C8\uB2E4)").option("--force", "\uAC80\uC99D\uC5D0 \uC2E4\uD328\uD574\uB3C4 \uC800\uC7A5\uD569\uB2C8\uB2E4").action(
|
|
167
|
+
async (key, value, opts) => {
|
|
168
|
+
const { runConfigSet } = await import("./config-TFMW7O4T.js");
|
|
169
|
+
await runConfigSet(key, value, { force: opts.force === true });
|
|
170
|
+
}
|
|
171
|
+
);
|
|
172
|
+
const work = program.command("work").description("\uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \uC6CC\uD06C\uC544\uC774\uD15C\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4");
|
|
173
|
+
work.option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
|
|
174
|
+
const { runWorkList } = await import("./work-6MMIQMUC.js");
|
|
175
|
+
runWorkList({ json: opts.json === true });
|
|
176
|
+
});
|
|
177
|
+
work.command("list").description("\uB4F1\uB85D\uB41C \uC6CC\uD06C\uC544\uC774\uD15C \uBAA9\uB85D\uACFC \uC9C4\uD589 \uC0C1\uD669\uC744 \uBD05\uB2C8\uB2E4").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
|
|
178
|
+
const { runWorkList } = await import("./work-6MMIQMUC.js");
|
|
179
|
+
runWorkList({ json: opts.json === true });
|
|
180
|
+
});
|
|
181
|
+
work.command("new <id> [description]").description("\uC0C8 \uC6CC\uD06C\uC544\uC774\uD15C\uC744 \uB9CC\uB4E4\uACE0 \uC804\uD658\uD569\uB2C8\uB2E4 (\uD604\uC7AC \uC6CC\uD06C\uC544\uC774\uD15C\uC740 \uBCF4\uAD00\uB429\uB2C8\uB2E4)").option("--worktree [branch]", "\uACA9\uB9AC\uB41C git worktree \uB97C \uB9CC\uB4E4\uC5B4 \uADF8 \uC548\uC5D0\uC11C \uC2DC\uC791\uD569\uB2C8\uB2E4").option("--skip-baseline", "\uAC80\uC99D \uBCA0\uC774\uC2A4\uB77C\uC778 \uCEA1\uCC98\uB97C \uAC74\uB108\uB701\uB2C8\uB2E4 (\uB290\uB9B0 \uD504\uB85C\uC81D\uD2B8\uC6A9)").option(
|
|
182
|
+
"--isolated",
|
|
183
|
+
"records(~/.awl)\uB97C \uC774 \uC6CC\uD06C\uC544\uC774\uD15C \uC804\uC6A9 AWL_HOME \uC73C\uB85C \uACA9\uB9AC\uD569\uB2C8\uB2E4 (\uBCD1\uB82C \uC138\uC158\uC6A9)"
|
|
184
|
+
).option("--experiment <json>", '\uC2E4\uD5D8 \uCF00\uC774\uC2A4 \uBA54\uD0C0 JSON (\uC608: {"model":"lite","mode":"loop"})').action(
|
|
185
|
+
async (id, description, opts) => {
|
|
186
|
+
const { runWorkNew } = await import("./work-6MMIQMUC.js");
|
|
187
|
+
const parsedExp = parseExperimentOption(opts.experiment);
|
|
188
|
+
if (!parsedExp.ok) {
|
|
189
|
+
process.stderr.write(`
|
|
190
|
+
${signal(caps(), "error")} ${parsedExp.error}
|
|
191
|
+
`);
|
|
192
|
+
process.exit(1);
|
|
193
|
+
}
|
|
194
|
+
await runWorkNew(id, description, { ...opts, experiment: parsedExp.value });
|
|
195
|
+
}
|
|
196
|
+
);
|
|
197
|
+
work.command("switch <id>").description("\uB2E4\uB978 \uC6CC\uD06C\uC544\uC774\uD15C\uC73C\uB85C \uC804\uD658\uD569\uB2C8\uB2E4 (\uD604\uC7AC \uC6CC\uD06C\uC544\uC774\uD15C\uC740 \uBCF4\uAD00\uB429\uB2C8\uB2E4)").action(async (id) => {
|
|
198
|
+
const { runWorkSwitch } = await import("./work-6MMIQMUC.js");
|
|
199
|
+
await runWorkSwitch(id);
|
|
200
|
+
});
|
|
201
|
+
work.command("abandon <id>").description("\uC6CC\uD06C\uC544\uC774\uD15C\uC744 \uC911\uB2E8 \uCC98\uB9AC\uD569\uB2C8\uB2E4 (\uC0AD\uC81C\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4, \uAE30\uB85D\uC740 \uB0A8\uC2B5\uB2C8\uB2E4)").action(async (id) => {
|
|
202
|
+
const { runWorkAbandon } = await import("./work-6MMIQMUC.js");
|
|
203
|
+
runWorkAbandon(id);
|
|
204
|
+
});
|
|
205
|
+
work.command("done <id>").description(
|
|
206
|
+
"\uC644\uB8CC\uB41C \uC6CC\uD06C\uC544\uC774\uD15C\uC744 \uC815\uB9AC\uD569\uB2C8\uB2E4 (\uC6CC\uD06C\uD2B8\uB9AC \uC81C\uAC70 + \uC0C1\uD0DC \uC2A4\uB0C5\uC0F7 \uD68C\uC218, \uAE30\uB85D\uC740 \uB0A8\uC2B5\uB2C8\uB2E4)"
|
|
207
|
+
).option("--force", "\uC815\uB9AC\uB418\uC9C0 \uC54A\uC740 \uBCC0\uACBD\uC774 \uC788\uC5B4\uB3C4 \uC6CC\uD06C\uD2B8\uB9AC\uB97C \uC81C\uAC70\uD569\uB2C8\uB2E4").action(async (id, opts) => {
|
|
208
|
+
const { runWorkDone } = await import("./work-6MMIQMUC.js");
|
|
209
|
+
await runWorkDone(id, { force: opts.force === true });
|
|
210
|
+
});
|
|
211
|
+
const lane = program.command("lane").description("\uACA9\uB9AC \uB808\uC778(worktree)\uC73C\uB85C \uD30C\uC774\uD504\uB77C\uC778\uC744 \uBCD1\uB82C \uC2E4\uD589\uD569\uB2C8\uB2E4 (\uB808\uC778 \uC0DD\uC131\xB7\uC870\uD68C\xB7\uC815\uB9AC)");
|
|
212
|
+
lane.option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
|
|
213
|
+
const { runLaneList } = await import("./lane-MIVLTDEU.js");
|
|
214
|
+
await runLaneList({ json: opts.json === true });
|
|
215
|
+
});
|
|
216
|
+
lane.command("new <name> [description]").description("\uACA9\uB9AC \uB808\uC778\uC744 \uB9CC\uB4ED\uB2C8\uB2E4 (worktree + \uC804\uC6A9 AWL_HOME + \uC2A4\uD0AC \uC7AC\uC124\uCE58 + \uAE30\uB3D9 \uC548\uB0B4)").action(async (name, description) => {
|
|
217
|
+
const { runLaneNew } = await import("./lane-MIVLTDEU.js");
|
|
218
|
+
await runLaneNew(name, description);
|
|
219
|
+
});
|
|
220
|
+
lane.command("ls").description("\uD604\uC874 \uB808\uC778\uC744 \uC774\uB984\xB7\uACBD\uB85C\xB7\uBE0C\uB79C\uCE58\uC640 \uD568\uAED8 \uB098\uC5F4\uD569\uB2C8\uB2E4").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
|
|
221
|
+
const { runLaneList } = await import("./lane-MIVLTDEU.js");
|
|
222
|
+
await runLaneList({ json: opts.json === true });
|
|
223
|
+
});
|
|
224
|
+
lane.command("rm <name>").description("\uB808\uC778\uC758 \uC6CC\uD06C\uD2B8\uB9AC\uB97C \uD68C\uC218\uD558\uACE0 \uB514\uB809\uD1A0\uB9AC\uB97C \uC81C\uAC70\uD569\uB2C8\uB2E4").option("--force", "\uCEE4\uBC0B\uB418\uC9C0 \uC54A\uC740 \uBCC0\uACBD\uC774 \uC788\uC5B4\uB3C4 \uC81C\uAC70\uD569\uB2C8\uB2E4").action(async (name, opts) => {
|
|
225
|
+
const { runLaneRemove } = await import("./lane-MIVLTDEU.js");
|
|
226
|
+
await runLaneRemove(name, { force: opts.force === true });
|
|
227
|
+
});
|
|
228
|
+
program.command("records").description("\uC313\uC778 \uAE30\uB85D\uC744 \uBD05\uB2C8\uB2E4").option("--type <type>", "\uD0C0\uC785\uC73C\uB85C \uAC70\uB985\uB2C8\uB2E4 (attempt, blocked \uB4F1)").option("--workitem <id>", "\uC6CC\uD06C\uC544\uC774\uD15C\uC73C\uB85C \uAC70\uB985\uB2C8\uB2E4").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
|
|
229
|
+
const { runRecords } = await import("./record-UKDIUJ5T.js");
|
|
230
|
+
runRecords({ type: opts.type, workitem: opts.workitem, json: opts.json === true });
|
|
231
|
+
});
|
|
232
|
+
const rules = program.command("rules").description("\uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uC801\uC6A9\uB418\uB294 \uADDC\uCE59\uC744 \uBD05\uB2C8\uB2E4").enablePositionalOptions();
|
|
233
|
+
rules.option("--scope <scope>", "\uBC94\uC704\uB85C \uAC70\uB985\uB2C8\uB2E4 (implement \uB4F1)").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
|
|
234
|
+
const { runRules } = await import("./rules-4VDP5LZW.js");
|
|
235
|
+
runRules({ scope: opts.scope, json: opts.json === true });
|
|
236
|
+
});
|
|
237
|
+
rules.command("edit").description("$EDITOR \uB85C \uADDC\uCE59 \uD30C\uC77C\uC744 \uC5FD\uB2C8\uB2E4").action(async () => {
|
|
238
|
+
const { runRules } = await import("./rules-4VDP5LZW.js");
|
|
239
|
+
runRules({ edit: true });
|
|
240
|
+
});
|
|
241
|
+
rules.command("promote <gotchaId>").description("\uAD50\uD6C8\uC744 \uADDC\uCE59\uC73C\uB85C \uC2B9\uACA9\uD569\uB2C8\uB2E4 (applies/counter \uD544\uC218, \uC0AC\uB78C\uC774 \uC2E4\uD589)").option("--applies <cond>", "\uC801\uC6A9 \uC870\uAC74 (\uD544\uC218)").option("--counter <cond>", "\uBC18\uC99D \uC870\uAC74 (\uD544\uC218)").option("--rule-scope <scope>", "\uB85C\uB4DC \uB2E8\uACC4 (audit/criteria/implement/commit/review)").action(
|
|
242
|
+
async (gotchaId, opts) => {
|
|
243
|
+
const { runRulesPromote } = await import("./rules-4VDP5LZW.js");
|
|
244
|
+
runRulesPromote(gotchaId, {
|
|
245
|
+
applies: opts.applies,
|
|
246
|
+
counter: opts.counter,
|
|
247
|
+
scope: opts.ruleScope
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
);
|
|
251
|
+
program.command("gotchas").description("\uC544\uC9C1 \uADDC\uCE59\uC774 \uB418\uC9C0 \uC54A\uC740 \uD568\uC815\uC744 \uBD05\uB2C8\uB2E4").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
|
|
252
|
+
const { runGotchas } = await import("./gotchas-CW4KZDEF.js");
|
|
253
|
+
runGotchas({ json: opts.json === true });
|
|
254
|
+
});
|
|
255
|
+
program.command("metrics").description("\uC6CC\uD06C\uC544\uC774\uD15C(\uC138\uB300)\uBCC4 \uD504\uB85D\uC2DC \uC9C0\uD45C \uCD94\uC138\uB97C \uBD05\uB2C8\uB2E4 (\uD1A0\uD070 \uC9C1\uC811 \uCE21\uC815 \uC544\uB2D8)").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").option("--compare", "\uC2E4\uD5D8 \uCF00\uC774\uC2A4(experiment model/mode/taskType)\uBCC4\uB85C \uC9C0\uD45C\uB97C \uBE44\uAD50\uD569\uB2C8\uB2E4").action(async (opts) => {
|
|
256
|
+
const { runMetrics } = await import("./metrics-WLRZZRTK.js");
|
|
257
|
+
runMetrics({ json: opts.json === true, compare: opts.compare === true });
|
|
258
|
+
});
|
|
259
|
+
program.command("loop-summary").description("\uB8E8\uD504/\uD30C\uC774\uD504\uB77C\uC778 \uC644\uB8CC\uB97C 4\uB80C\uC988(\uAC1C\uC785\xB7\uD488\uC9C8\xB7\uD6A8\uC728\xB7\uC0B0\uCD9C)\uB85C \uC694\uC57D\uD569\uB2C8\uB2E4").option("--workitem <id>", "\uB300\uC0C1 \uC6CC\uD06C\uC544\uC774\uD15C (\uAE30\uBCF8: \uD604\uC7AC)").option("--workitems <ids>", "\uBC30\uCE58 \uBAA8\uB4DC: \uCF64\uB9C8\uB85C \uAD6C\uBD84\uD55C \uC6CC\uD06C\uC544\uC774\uD15C \uBAA9\uB85D").option("--since <iso>", "\uBC30\uCE58 \uBAA8\uB4DC: \uC774 \uC2DC\uAC01(ISO) \uC774\uD6C4 \uC644\uB8CC\uB41C \uC6CC\uD06C\uC544\uC774\uD15C \uC804\uBD80").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(
|
|
260
|
+
async (opts) => {
|
|
261
|
+
const { runLoopSummary } = await import("./loop-summary-XAI6KOGB.js");
|
|
262
|
+
runLoopSummary({
|
|
263
|
+
workitem: opts.workitem,
|
|
264
|
+
workitems: parseWorkitemsOption(opts.workitems),
|
|
265
|
+
since: opts.since,
|
|
266
|
+
json: opts.json === true
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
);
|
|
270
|
+
program.command("feedback").description("awl \uB3C4\uAD6C \uC790\uCCB4 \uD53C\uB4DC\uBC31\uC744 area \uBCC4\uB85C \uBB36\uC5B4 \uBD05\uB2C8\uB2E4 (\uD574\uBC95\uC740 \uC81C\uC2DC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4)").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").option("--area <area>", "area \uB85C \uAC70\uB985\uB2C8\uB2E4 (commit, gate, verify \uB4F1)").option("--severity <sev>", "severity \uB85C \uAC70\uB985\uB2C8\uB2E4 (high/medium/low)").option("--since <date>", "\uC774 ISO \uB0A0\uC9DC \uC774\uD6C4 \uC218\uC9D1\uBD84\uB9CC \uBD05\uB2C8\uB2E4 (\uC608: 2026-07-01)").action(async (opts) => {
|
|
271
|
+
const { runFeedback } = await import("./feedback-KAXNFMUY.js");
|
|
272
|
+
runFeedback({
|
|
273
|
+
json: opts.json === true,
|
|
274
|
+
area: opts.area,
|
|
275
|
+
severity: opts.severity,
|
|
276
|
+
since: opts.since
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
program.command("changelog").description("Gate 2 \uC2B9\uC778 \uB4A4 CHANGELOG.md\uC5D0 \uC62E\uAE38 \uCD08\uC548\uC744 \uB9CC\uB4ED\uB2C8\uB2E4 (\uD30C\uC77C\uC740 \uC4F0\uC9C0 \uC54A\uC74C)").option("--workitem <id>", "\uB300\uC0C1 \uC6CC\uD06C\uC544\uC774\uD15C (\uAE30\uBCF8: \uD604\uC7AC)").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
|
|
280
|
+
const { runChangelogDraft } = await import("./changelog-R7BNBF2C.js");
|
|
281
|
+
runChangelogDraft({ workitem: opts.workitem, json: opts.json === true });
|
|
282
|
+
});
|
|
283
|
+
program.command("commit <criterion>").description("\uC644\uB8CC \uC870\uAC74 \uC791\uC5C5\uC744 \uACA9\uB9AC \uCEE4\uBC0B\uD569\uB2C8\uB2E4 (\uB0B4 \uBCC0\uACBD\uB9CC)").option("--start", "\uBCA0\uC774\uC2A4\uB77C\uC778\uC744 \uC7A1\uC2B5\uB2C8\uB2E4 (\uC791\uC5C5 \uC2DC\uC791 \uC2DC)").option("-m, --message <msg>", "\uCEE4\uBC0B \uBA54\uC2DC\uC9C0").option("--base <ref>", "\uBCA0\uC774\uC2A4 \uB4DC\uB9AC\uD504\uD2B8\uB97C \uD655\uC778\uD560 \uAE30\uC900 \uBE0C\uB79C\uCE58").option("--force", "\uBCF4\uD638 \uD30C\uC77C \uBCC0\uACBD \uAC80\uC0AC\uB97C \uC0AC\uB78C\uC774 \uD655\uC778\uD558\uACE0 \uC6B0\uD68C\uD569\uB2C8\uB2E4").action(
|
|
284
|
+
async (criterion, opts) => {
|
|
285
|
+
const { runCommit } = await import("./commit-APXIVOSD.js");
|
|
286
|
+
await runCommit(criterion, {
|
|
287
|
+
start: opts.start,
|
|
288
|
+
message: opts.message,
|
|
289
|
+
base: opts.base,
|
|
290
|
+
force: opts.force
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
);
|
|
294
|
+
program.command("review <range>").description("\uB9AC\uBDF0\uC5B4\uC5D0\uAC8C \uB118\uAE38 \uC790\uB8CC\uB97C \uC870\uB9BD\uD569\uB2C8\uB2E4 (provenance \uD3EC\uD568)").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").option("--base <ref>", "diff \uAE30\uC900 (\uAE30\uBCF8\uC740 \uC644\uB8CC \uC870\uAC74 baseline)").action(async (range, opts) => {
|
|
295
|
+
const { runReview } = await import("./review-NTZ3HY3N.js");
|
|
296
|
+
await runReview(range, { json: opts.json === true, base: opts.base });
|
|
297
|
+
});
|
|
298
|
+
program.command("record <type>", { hidden: true }).description("\uAD6C\uC870\uD654\uB41C \uAE30\uB85D\uC744 \uB0A8\uAE41\uB2C8\uB2E4").option("--json <data>", "\uAE30\uB85D\uD560 \uB370\uC774\uD130 (JSON \uBB38\uC790\uC5F4)").option("--file <path>", "\uB370\uC774\uD130 \uD30C\uC77C \uACBD\uB85C (\uD070 \uB370\uC774\uD130\uC6A9)").option("--diff", "git diff \uB97C \uCEA1\uCC98\uD574 \uCCA8\uBD80\uD569\uB2C8\uB2E4 (blocked)").option("--workitem <id>", "\uC774 \uAE30\uB85D\uB9CC \uB2E4\uB978 \uC6CC\uD06C\uC544\uC774\uD15C\uC73C\uB85C \uB0A8\uAE41\uB2C8\uB2E4(\uAE30\uBCF8\uC740 \uD604\uC7AC \uC6CC\uD06C\uC544\uC774\uD15C)").action(
|
|
299
|
+
async (type, opts) => {
|
|
300
|
+
const { runRecord } = await import("./record-UKDIUJ5T.js");
|
|
301
|
+
await runRecord(type, {
|
|
302
|
+
json: opts.json,
|
|
303
|
+
file: opts.file,
|
|
304
|
+
diff: opts.diff === true,
|
|
305
|
+
workitem: opts.workitem
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
);
|
|
309
|
+
program.command("verify", { hidden: true }).description("\uAC80\uC99D \uBA85\uB839\uC744 \uC21C\uC11C\uB300\uB85C \uC2E4\uD589\uD569\uB2C8\uB2E4").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").option("--bail", "\uCCAB \uC2E4\uD328\uC5D0\uC11C \uBA48\uCDA5\uB2C8\uB2E4").option("--force", "\uBCF4\uD638 \uD30C\uC77C \uBCC0\uACBD \uAC80\uC0AC\uB97C \uC0AC\uB78C\uC774 \uD655\uC778\uD558\uACE0 \uC6B0\uD68C\uD569\uB2C8\uB2E4").option("--since-baseline", "\uBCA0\uC774\uC2A4\uB77C\uC778 \uB300\uBE44 \uC2E0\uADDC \uC2E4\uD328\uB9CC \uD68C\uADC0\uB85C \uD310\uC815\uD569\uB2C8\uB2E4").option(
|
|
310
|
+
"--related",
|
|
311
|
+
"\uBCC0\uACBD\uB41C \uD30C\uC77C\uC5D0 \uAD00\uB828\uB41C \uD14C\uC2A4\uD2B8\uB9CC \uC2E4\uD589\uD569\uB2C8\uB2E4(relatedCmd \uD544\uC694, \uC5C6\uC73C\uBA74 \uC804\uCCB4 \uD14C\uC2A4\uD2B8\uB85C \uD3F4\uBC31)"
|
|
312
|
+
).action(
|
|
313
|
+
async (opts) => {
|
|
314
|
+
const { runVerify } = await import("./verify-6YF5FXWM.js");
|
|
315
|
+
await runVerify({
|
|
316
|
+
json: opts.json === true,
|
|
317
|
+
bail: opts.bail === true,
|
|
318
|
+
sinceBaseline: opts.sinceBaseline === true,
|
|
319
|
+
related: opts.related === true,
|
|
320
|
+
force: opts.force === true
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
);
|
|
324
|
+
program.command("hold-recheck", { hidden: true }).description(".tasks/plan \uC758 \uC758\uC874\uD615 hold \uB97C \uC7AC\uC810\uAC80\uD574 \uCC29\uC9C0+\uD569\uACA9\uD55C \uC758\uC874\uC774\uBA74 \uC790\uB3D9 un-hold \uD569\uB2C8\uB2E4").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
|
|
325
|
+
const { runHoldRecheck } = await import("./hold-recheck-SLI7NDLU.js");
|
|
326
|
+
await runHoldRecheck({ json: opts.json === true });
|
|
327
|
+
});
|
|
328
|
+
const state = program.command("state", { hidden: true }).description("\uB8E8\uD504 \uC0C1\uD0DC\uB97C \uC77D\uACE0 \uC501\uB2C8\uB2E4");
|
|
329
|
+
state.command("get").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
|
|
330
|
+
const { runStateGet } = await import("./state-XM7NZ2HA.js");
|
|
331
|
+
runStateGet({ json: opts.json === true });
|
|
332
|
+
});
|
|
333
|
+
state.command("set").requiredOption("--json <patch>", "\uBD80\uBD84 \uAC31\uC2E0 (JSON \uBB38\uC790\uC5F4)").action(async (opts) => {
|
|
334
|
+
const { runStateSet } = await import("./state-XM7NZ2HA.js");
|
|
335
|
+
const { hasApprovedGate1 } = await import("./record-UKDIUJ5T.js");
|
|
336
|
+
runStateSet(opts.json, {
|
|
337
|
+
// phase:'loop' 로의 전이는 이 워크아이템에 "승인된" 게이트1 레코드가 있을
|
|
338
|
+
// 때만 허용한다(0.6.3, 적대검증 발견). 예전엔 gate:1 레코드의 존재만 봐서
|
|
339
|
+
// (decision 무관) 사람이 REJECT 한 계획도 루프에 진입할 수 있었다.
|
|
340
|
+
// hasApprovedGate1 이 workitem falsy 도 fail-closed 로 처리한다.
|
|
341
|
+
requireGateForLoop: (workitem) => hasApprovedGate1(workitem)
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
program.command("evolve", { hidden: true }).description("\uAE30\uB85D\uC744 \uBAA8\uC544 \uAD50\uD6C8\uC73C\uB85C, \uAD50\uD6C8\uC744 \uADDC\uCE59\uC73C\uB85C \uC787\uC2B5\uB2C8\uB2E4").option("--collect", "\uC774\uBC88 \uC6CC\uD06C\uC544\uC774\uD15C\uC758 \uAE30\uB85D\uC744 \uBAA8\uC544 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").option("--record", "\uAD50\uD6C8\uC744 gotchas \uC5D0 \uAE30\uB85D\uD569\uB2C8\uB2E4 (--json \uC73C\uB85C \uB370\uC774\uD130)").option("--json [data]", "collect: \uCD9C\uB825 \uD50C\uB798\uADF8 / record: \uAD50\uD6C8 \uB370\uC774\uD130(JSON \uBB38\uC790\uC5F4)").option("--workitem <wi>", "\uC6CC\uD06C\uC544\uC774\uD15C\uC73C\uB85C \uAC70\uB985\uB2C8\uB2E4 (--collect)").option("--from <YYYY-MM>", "\uAE30\uAC04 \uC2DC\uC791 \uC6D4\uB85C \uC77D\uAE30\uB97C \uC881\uD799\uB2C8\uB2E4 (--collect, \uC5C6\uC73C\uBA74 \uC804\uB7C9)").option("--to <YYYY-MM>", "\uAE30\uAC04 \uB05D \uC6D4 (--collect)").action(
|
|
345
|
+
async (opts) => {
|
|
346
|
+
const m = await import("./evolve-NNQX2A43.js");
|
|
347
|
+
if (opts.collect && opts.record) {
|
|
348
|
+
process.stderr.write("\n --collect \uC640 --record \uB294 \uB3D9\uC2DC\uC5D0 \uC4F8 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\n");
|
|
349
|
+
process.exit(1);
|
|
350
|
+
} else if (opts.record) {
|
|
351
|
+
if (typeof opts.json !== "string" || opts.json.trim() === "") {
|
|
352
|
+
process.stderr.write("\n --record \uB294 --json '<\uAD50\uD6C8>' \uC774 \uD544\uC694\uD569\uB2C8\uB2E4.\n");
|
|
353
|
+
process.exit(1);
|
|
354
|
+
}
|
|
355
|
+
m.runEvolveRecord(opts.json);
|
|
356
|
+
} else if (opts.collect) {
|
|
357
|
+
m.runEvolveCollect({ workitem: opts.workitem, json: true, from: opts.from, to: opts.to });
|
|
358
|
+
} else {
|
|
359
|
+
process.stderr.write("\n --collect \uB610\uB294 --record \uB97C \uC9C0\uC815\uD558\uC138\uC694.\n");
|
|
360
|
+
process.exit(1);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
);
|
|
364
|
+
program.command("defer-summary", { hidden: true }).description("\uBCF4\uB958\uD55C \uC911\uC694 \uD56D\uBAA9(\uC0AC\uB78C \uCD5C\uC885 \uD655\uC778 \uD56D\uBAA9)\uC744 \uCD5C\uC885 \uC694\uC57D\uD569\uB2C8\uB2E4").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").option("--workitem <wi>", "\uC6CC\uD06C\uC544\uC774\uD15C \uC9C0\uC815(\uC5C6\uC73C\uBA74 \uD604\uC7AC)").action(async (opts) => {
|
|
365
|
+
const m = await import("./record-UKDIUJ5T.js");
|
|
366
|
+
m.runDeferSummary({ json: opts.json === true, workitem: opts.workitem });
|
|
367
|
+
});
|
|
368
|
+
program.action((_opts, command) => {
|
|
369
|
+
const [first, second] = command.args;
|
|
370
|
+
if (first === void 0) {
|
|
371
|
+
program.help();
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
if (first === "help") {
|
|
375
|
+
const target = second !== void 0 ? program.commands.find((c) => c.name() === second) : void 0;
|
|
376
|
+
(target ?? program).help();
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
program.error(`\uC54C \uC218 \uC5C6\uB294 \uBA85\uB839\uC785\uB2C8\uB2E4: '${first}'. awl --help \uB85C \uBA85\uB839 \uBAA9\uB85D\uC744 \uBCF4\uC138\uC694.`, {
|
|
380
|
+
exitCode: 1,
|
|
381
|
+
code: "awl.unknownCommand"
|
|
382
|
+
});
|
|
21
383
|
});
|
|
22
384
|
return program;
|
|
23
385
|
}
|
|
24
386
|
|
|
25
387
|
// src/cli.ts
|
|
26
|
-
buildProgram().
|
|
388
|
+
await buildProgram().parseAsync(process.argv);
|