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.
Files changed (54) hide show
  1. package/README.md +272 -12
  2. package/dist/brief-Z3JKXEUP.js +181 -0
  3. package/dist/changelog-R7BNBF2C.js +62 -0
  4. package/dist/chunk-4OCSYHYB.js +274 -0
  5. package/dist/chunk-6E7XEQOH.js +27 -0
  6. package/dist/chunk-7SYRDDTX.js +516 -0
  7. package/dist/chunk-BUWGQVHT.js +1243 -0
  8. package/dist/chunk-C7TN3LM3.js +448 -0
  9. package/dist/chunk-CCMG377E.js +771 -0
  10. package/dist/chunk-D5OINC3G.js +52 -0
  11. package/dist/chunk-F5LHXBH7.js +209 -0
  12. package/dist/chunk-FBEUJR2P.js +446 -0
  13. package/dist/chunk-I77CXOEX.js +693 -0
  14. package/dist/chunk-LMWAVN7B.js +904 -0
  15. package/dist/chunk-O7GRZZPJ.js +347 -0
  16. package/dist/chunk-TKPHC32G.js +96 -0
  17. package/dist/chunk-UOPWVM2H.js +727 -0
  18. package/dist/chunk-VU6IPRRM.js +166 -0
  19. package/dist/chunk-X5LMP5J7.js +307 -0
  20. package/dist/chunk-ZLTOL3D3.js +286 -0
  21. package/dist/cli.js +373 -11
  22. package/dist/commit-APXIVOSD.js +411 -0
  23. package/dist/config-TFMW7O4T.js +34 -0
  24. package/dist/doctor-BU6HWXE4.js +29 -0
  25. package/dist/evolve-NNQX2A43.js +38 -0
  26. package/dist/feedback-KAXNFMUY.js +125 -0
  27. package/dist/gotchas-CW4KZDEF.js +43 -0
  28. package/dist/hold-recheck-SLI7NDLU.js +133 -0
  29. package/dist/init-UDM5AXKI.js +79 -0
  30. package/dist/lane-MIVLTDEU.js +41 -0
  31. package/dist/loop-summary-XAI6KOGB.js +361 -0
  32. package/dist/metrics-WLRZZRTK.js +25 -0
  33. package/dist/record-UKDIUJ5T.js +68 -0
  34. package/dist/review-NTZ3HY3N.js +118 -0
  35. package/dist/rules-4VDP5LZW.js +33 -0
  36. package/dist/state-XM7NZ2HA.js +37 -0
  37. package/dist/status-I3MQOCQM.js +40 -0
  38. package/dist/uninstall-MOHJDMQH.js +545 -0
  39. package/dist/update-AYTBYAHI.js +61 -0
  40. package/dist/verify-6YF5FXWM.js +37 -0
  41. package/dist/version-check-G27JYMTZ.js +14 -0
  42. package/dist/work-6MMIQMUC.js +50 -0
  43. package/engine/skills/claude/awl-loop/SKILL.md +292 -0
  44. package/engine/skills/claude/awl-loop/reference.md +131 -0
  45. package/engine/skills/claude/awl-pipeline/SKILL.md +83 -0
  46. package/engine/skills/claude/awl-pipeline-exec/SKILL.md +200 -0
  47. package/engine/skills/claude/awl-pipeline-plan/SKILL.md +71 -0
  48. package/engine/skills/claude/awl-pipeline-review/SKILL.md +149 -0
  49. package/engine/skills/codex/AGENTS.awl.md +117 -0
  50. package/engine/templates/block-publish.mjs +9 -0
  51. package/engine/templates/pre-push.sample +7 -0
  52. package/engine/templates/related-cmd-examples.md +37 -0
  53. package/engine/version.json +2 -2
  54. 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(version, "-v, --version", "\uBC84\uC804\uC744 \uCD9C\uB825\uD569\uB2C8\uB2E4").helpOption("-h, --help", "\uB3C4\uC6C0\uB9D0\uC744 \uCD9C\uB825\uD569\uB2C8\uB2E4").addHelpText("beforeAll", `${BANNER}
18
- `).showHelpAfterError();
19
- program.action(() => {
20
- program.help();
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().parse(process.argv);
388
+ await buildProgram().parseAsync(process.argv);