agent-work-loop 0.6.44 → 0.6.45

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 (43) hide show
  1. package/README.md +3 -3
  2. package/dist/{brief-I2EQVY3F.js → brief-SGMFXOY2.js} +3 -3
  3. package/dist/{changelog-UBIZQHQO.js → changelog-VNJ4EQ74.js} +3 -3
  4. package/dist/{chunk-DNDODLP2.js → chunk-5MXSJD3C.js} +1 -1
  5. package/dist/{chunk-L4VWHK4D.js → chunk-DQF7RF37.js} +5 -5
  6. package/dist/{chunk-236TTTK3.js → chunk-EHJYX57P.js} +1 -1
  7. package/dist/{chunk-4BUPV5VU.js → chunk-FK3Q7UY2.js} +2 -2
  8. package/dist/{chunk-3N3QH4PK.js → chunk-HAUTKVB5.js} +2 -2
  9. package/dist/{chunk-LBZNBCAY.js → chunk-IA32FVBA.js} +4 -4
  10. package/dist/{chunk-2FQ5HCDI.js → chunk-ISLNBWKV.js} +7 -7
  11. package/dist/{chunk-GYXIREXZ.js → chunk-IVEV5L7P.js} +1 -1
  12. package/dist/{chunk-SNWJWX5K.js → chunk-MLTY3EE6.js} +60 -1
  13. package/dist/{chunk-3LPCP55B.js → chunk-PUINOFOR.js} +3 -3
  14. package/dist/{chunk-O7PUNJVM.js → chunk-QKKMA2VT.js} +4 -4
  15. package/dist/{chunk-WOH6WML7.js → chunk-VE2GVNNS.js} +1 -1
  16. package/dist/{chunk-K2JV27JR.js → chunk-VVZOIFL4.js} +1 -1
  17. package/dist/{chunk-SKJZSRVR.js → chunk-ZRKOZQKP.js} +4 -4
  18. package/dist/cli.js +42 -40
  19. package/dist/{commit-I5ULIUHW.js → commit-GPQATPEA.js} +4 -4
  20. package/dist/{config-6VD46H24.js → config-QTEKLFZP.js} +1 -1
  21. package/dist/{doctor-QQLQOP3Y.js → doctor-TMMIO4CE.js} +6 -6
  22. package/dist/{evolve-MXGX33GB.js → evolve-N3S32P5I.js} +5 -5
  23. package/dist/{feedback-K3P6667T.js → feedback-log-UCNJ2GVT.js} +9 -9
  24. package/dist/{gotchas-HF5Q2MOA.js → gotchas-PDG2ZZFQ.js} +5 -5
  25. package/dist/{hold-recheck-CBSGGRBM.js → hold-recheck-UNAILFN5.js} +4 -4
  26. package/dist/{lane-BJ2NJYAH.js → lane-24GAVVR6.js} +13 -13
  27. package/dist/{loop-summary-RZQBTKVY.js → loop-summary-CODZMRUY.js} +4 -4
  28. package/dist/{metrics-6SZQAG3C.js → metrics-ZR7BPATB.js} +2 -2
  29. package/dist/{record-UU4WPT2Z.js → record-TSB22DIO.js} +3 -3
  30. package/dist/{remove-UOAMHEUC.js → remove-J7B32U75.js} +13 -13
  31. package/dist/{review-DXSGXZLX.js → review-EM5Q2ZJX.js} +11 -11
  32. package/dist/{rules-QDAC6BUX.js → rules-QLUXNSCN.js} +6 -6
  33. package/dist/{state-DZC7JVEK.js → state-6IIH7SW2.js} +2 -2
  34. package/dist/{status-ZZEF4NYL.js → status-2LPWVCHT.js} +4 -4
  35. package/dist/{verify-LOTTWOHB.js → verify-VWKIBPZD.js} +8 -8
  36. package/dist/{version-check-SILVRBMJ.js → version-check-3BZXXAQD.js} +3 -3
  37. package/dist/{work-RCV5H7TL.js → work-PEJN55JB.js} +12 -12
  38. package/engine/skills/claude/awl-loop/reference.md +1 -1
  39. package/engine/skills/claude/awl-pipeline/SKILL.md +1 -1
  40. package/engine/templates/block-publish.mjs +20 -2
  41. package/engine/templates/pre-push.sample +8 -2
  42. package/engine/version.json +1 -1
  43. package/package.json +1 -1
package/README.md CHANGED
@@ -136,7 +136,7 @@ $ awl init
136
136
  - **`.awl/config.json`**: 검증 명령과 프로젝트 성격. **커밋하세요.** 팀원이 같이 씁니다.
137
137
  - **`.awl/state.json`**: 지금 어느 워크아이템의 어느 단계인지. gitignore 대상입니다.
138
138
  - **`.claude/skills/`** 또는 **`AGENTS.md`**: 작업 루프 스킬. 선택한 에이전트에 설치됩니다.
139
- - **`.git/hooks/pre-push`**: `AWL_ALLOW_PUSH=1` 없이는 `git push`를 막는 훅. "push는 사람이 한다"는 규칙을 git 레벨에서도 강제합니다(사람이 push 때는 `AWL_ALLOW_PUSH=1 git push`로 명시적으로 통과시킵니다).
139
+ - **`.git/hooks/pre-push`**: "push는 사람이 한다"는 규칙을 git 레벨에서도 강제하는 훅. 사람이 실제 터미널에서 직접 치는 `git push`는 그냥 통과합니다(제어 터미널이 잡히는지로 판별). 에이전트가 비대화형으로 실행한 push는 막히고, 이 경우엔 `AWL_ALLOW_PUSH=1 git push`로 명시적으로 통과시켜야 합니다.
140
140
 
141
141
  이제 에이전트(Claude Code / Codex)를 열고 목표를 서술문으로 줍니다.
142
142
 
@@ -233,7 +233,7 @@ awl records # 쌓인 기록
233
233
  awl gotchas # 아직 규칙이 안 된 교훈
234
234
  awl rules # 이 프로젝트에 적용되는 규칙
235
235
  awl metrics # 워크아이템 세대별 지표 추세
236
- awl feedback # awl 도구 자체에 대한 피드백
236
+ awl feedback-log # awl 도구 자체에 남겨진 피드백 기록 검토
237
237
  ```
238
238
 
239
239
  ---
@@ -354,7 +354,7 @@ awl work switch <ID> # 보관된 워크아이템으로 전환
354
354
  정확한 동작입니다. 확신할 수 없으면 커밋하지 않고 사람에게 알리도록 설계했습니다. `git status`/`git diff`로 실제로 무엇이 섞였는지 확인하세요. 완료 조건마다 `awl commit <AC> -m`으로 닫고 넘어가는 습관을 들이세요(`awl commit --start`를 편집보다 먼저 호출하지 않으면 그 편집이 스냅샷에 흡수돼 격리 커밋이 무의미해집니다).
355
355
 
356
356
  **`git push`가 막힌다**
357
- `awl init`이 심는 pre-push 훅 때문입니다(위 5분 시작 참고). 정말 push하려면 `AWL_ALLOW_PUSH=1 git push`를 씁니다.
357
+ `awl init`이 심는 pre-push 훅 때문입니다(위 5분 시작 참고). 실제 터미널에서 사람이 직접 치는 push 막히지 않습니다 — 막혔다면 비대화형(에이전트, CI, 스크립트)으로 실행된 경우이고, 그때는 `AWL_ALLOW_PUSH=1 git push`를 씁니다.
358
358
 
359
359
  **대형 저장소에서 `awl lane new`/`awl work new --worktree`가 `Could not write new index file`로 실패한다**
360
360
  `git worktree add`가 기본 180초 안에 못 끝나 강제 종료됐다는 뜻입니다(대형 모노레포는
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  loadProjectName,
3
3
  readRecords
4
- } from "./chunk-4BUPV5VU.js";
4
+ } from "./chunk-FK3Q7UY2.js";
5
5
  import {
6
6
  loadState
7
- } from "./chunk-WOH6WML7.js";
7
+ } from "./chunk-VE2GVNNS.js";
8
8
  import {
9
9
  resolveProjectRoot,
10
10
  run
11
- } from "./chunk-SNWJWX5K.js";
11
+ } from "./chunk-MLTY3EE6.js";
12
12
  import "./chunk-SJG22DAK.js";
13
13
  import "./chunk-FGHILN3D.js";
14
14
 
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  readRecords
3
- } from "./chunk-4BUPV5VU.js";
3
+ } from "./chunk-FK3Q7UY2.js";
4
4
  import {
5
5
  loadState
6
- } from "./chunk-WOH6WML7.js";
6
+ } from "./chunk-VE2GVNNS.js";
7
7
  import {
8
8
  resolveProjectRoot
9
- } from "./chunk-SNWJWX5K.js";
9
+ } from "./chunk-MLTY3EE6.js";
10
10
  import "./chunk-SJG22DAK.js";
11
11
  import {
12
12
  caps,
@@ -4,7 +4,7 @@ import {
4
4
 
5
5
  // package.json
6
6
  var name = "agent-work-loop";
7
- var version = "0.6.44";
7
+ var version = "0.6.45";
8
8
 
9
9
  // src/core/npm-registry.ts
10
10
  import fs from "fs";
@@ -1,22 +1,22 @@
1
1
  import {
2
2
  loadProjectName,
3
3
  readRecords
4
- } from "./chunk-4BUPV5VU.js";
4
+ } from "./chunk-FK3Q7UY2.js";
5
5
  import {
6
6
  loadState,
7
7
  readStateLock
8
- } from "./chunk-WOH6WML7.js";
8
+ } from "./chunk-VE2GVNNS.js";
9
9
  import {
10
10
  gatherVersionInputs
11
- } from "./chunk-3N3QH4PK.js";
11
+ } from "./chunk-HAUTKVB5.js";
12
12
  import {
13
13
  checkVersions
14
- } from "./chunk-DNDODLP2.js";
14
+ } from "./chunk-5MXSJD3C.js";
15
15
  import {
16
16
  CommandNotFoundError,
17
17
  run,
18
18
  tokenize
19
- } from "./chunk-SNWJWX5K.js";
19
+ } from "./chunk-MLTY3EE6.js";
20
20
  import {
21
21
  listRegisteredProjects
22
22
  } from "./chunk-SJG22DAK.js";
@@ -2,7 +2,7 @@ import {
2
2
  acquireLock,
3
3
  loadGotchaList,
4
4
  releaseLock
5
- } from "./chunk-SKJZSRVR.js";
5
+ } from "./chunk-ZRKOZQKP.js";
6
6
  import {
7
7
  caps,
8
8
  makeColors,
@@ -2,11 +2,11 @@ import {
2
2
  getCriterion,
3
3
  loadState,
4
4
  writeState
5
- } from "./chunk-WOH6WML7.js";
5
+ } from "./chunk-VE2GVNNS.js";
6
6
  import {
7
7
  resolveProjectRoot,
8
8
  run
9
- } from "./chunk-SNWJWX5K.js";
9
+ } from "./chunk-MLTY3EE6.js";
10
10
  import {
11
11
  caps,
12
12
  makeColors,
@@ -3,10 +3,10 @@ import {
3
3
  getLatestVersionCached,
4
4
  name,
5
5
  version
6
- } from "./chunk-DNDODLP2.js";
6
+ } from "./chunk-5MXSJD3C.js";
7
7
  import {
8
8
  resolveProjectRoot
9
- } from "./chunk-SNWJWX5K.js";
9
+ } from "./chunk-MLTY3EE6.js";
10
10
  import {
11
11
  packageEngineDir,
12
12
  skillsVersionPath
@@ -5,18 +5,18 @@ import {
5
5
  runWorkNew,
6
6
  sanitizeForGit,
7
7
  worktreeDirtyTracked
8
- } from "./chunk-2FQ5HCDI.js";
8
+ } from "./chunk-ISLNBWKV.js";
9
9
  import {
10
10
  loadProjectName
11
- } from "./chunk-4BUPV5VU.js";
11
+ } from "./chunk-FK3Q7UY2.js";
12
12
  import {
13
13
  loadState,
14
14
  writeState
15
- } from "./chunk-WOH6WML7.js";
15
+ } from "./chunk-VE2GVNNS.js";
16
16
  import {
17
17
  resolveProjectRoot,
18
18
  run
19
- } from "./chunk-SNWJWX5K.js";
19
+ } from "./chunk-MLTY3EE6.js";
20
20
  import {
21
21
  WORKTREES_DIR,
22
22
  caps,
@@ -4,34 +4,34 @@ import {
4
4
  } from "./chunk-D5OINC3G.js";
5
5
  import {
6
6
  parseRuleFile
7
- } from "./chunk-236TTTK3.js";
7
+ } from "./chunk-EHJYX57P.js";
8
8
  import {
9
9
  nextGotchaId
10
- } from "./chunk-SKJZSRVR.js";
10
+ } from "./chunk-ZRKOZQKP.js";
11
11
  import {
12
12
  buildVerifyBaseline,
13
13
  isCheckPassed,
14
14
  runVerifyChecks,
15
15
  writeVerifyBaseline
16
- } from "./chunk-O7PUNJVM.js";
16
+ } from "./chunk-QKKMA2VT.js";
17
17
  import {
18
18
  gitBranch
19
- } from "./chunk-L4VWHK4D.js";
19
+ } from "./chunk-DQF7RF37.js";
20
20
  import {
21
21
  loadProjectName
22
- } from "./chunk-4BUPV5VU.js";
22
+ } from "./chunk-FK3Q7UY2.js";
23
23
  import {
24
24
  loadState,
25
25
  migrateState,
26
26
  writeState
27
- } from "./chunk-WOH6WML7.js";
27
+ } from "./chunk-VE2GVNNS.js";
28
28
  import {
29
29
  loadConfig,
30
30
  multiProjectFooter,
31
31
  resolveProjectRoot,
32
32
  resolveProjectScope,
33
33
  run
34
- } from "./chunk-SNWJWX5K.js";
34
+ } from "./chunk-MLTY3EE6.js";
35
35
  import {
36
36
  installClaudeSkill
37
37
  } from "./chunk-SJG22DAK.js";
@@ -3,7 +3,7 @@ import {
3
3
  multiProjectFooter,
4
4
  requireConfig,
5
5
  resolveProjectScope
6
- } from "./chunk-SNWJWX5K.js";
6
+ } from "./chunk-MLTY3EE6.js";
7
7
  import {
8
8
  caps,
9
9
  generationsDir,
@@ -10,6 +10,7 @@ import {
10
10
  openFlow,
11
11
  promptNumber,
12
12
  selectMulti,
13
+ selectSingle,
13
14
  step,
14
15
  verifyStepLines
15
16
  } from "./chunk-SJG22DAK.js";
@@ -136,6 +137,9 @@ function resolveProjectScope(cwd = process.cwd()) {
136
137
  return { mode: "single", projectRoot: root };
137
138
  }
138
139
  const registered = listRegisteredProjects().filter((p) => fs.existsSync(p.path));
140
+ if (registered.length === 1) {
141
+ return { mode: "single", projectRoot: registered[0]?.path };
142
+ }
139
143
  if (registered.length > 0) {
140
144
  return { mode: "multi", projects: registered };
141
145
  }
@@ -550,6 +554,11 @@ function renderConfig(config, c) {
550
554
  out.push(`${s.branch} \uC8FC \uC5B8\uC5B4 ${config.mainLanguage.join(", ") || "(\uC5C6\uC74C)"}`);
551
555
  out.push(`${s.branch} \uC131\uACA9 ${config.character || "(\uC5C6\uC74C)"}`);
552
556
  out.push(`${s.branch} \uC5D4\uC9C4 ${config.engineVersion}`);
557
+ const feedbackOn = config.feedback?.enabled ?? false;
558
+ out.push(`${s.branch} \uD53C\uB4DC\uBC31 ${feedbackOn ? "\uCF1C\uC9D0" : "\uAEBC\uC9D0"}`);
559
+ out.push(
560
+ `${s.vGuide} ${s.lastBranch} \uACBD\uB85C: ${color.dim(config.feedback?.path || `(\uAE30\uBCF8\uAC12) ${DEFAULT_FEEDBACK_PATH}`)}`
561
+ );
553
562
  out.push("");
554
563
  for (const k of VERIFY_ORDER) {
555
564
  const entry = config.verify[k];
@@ -573,7 +582,7 @@ function writeConfigFile(projectRoot, config) {
573
582
  fs.writeFileSync(p, `${JSON.stringify(config, null, 2)}
574
583
  `);
575
584
  }
576
- var EDIT_MENU = ["\uADF8\uB300\uB85C \uB454\uB2E4", "\uC8FC \uC5B8\uC5B4", "\uAC80\uC99D \uBA85\uB839\uC5B4", "\uC131\uACA9", "\uD504\uB85C\uC81D\uD2B8 \uC774\uB984"];
585
+ var EDIT_MENU = ["\uADF8\uB300\uB85C \uB454\uB2E4", "\uC8FC \uC5B8\uC5B4", "\uAC80\uC99D \uBA85\uB839\uC5B4", "\uC131\uACA9", "\uD504\uB85C\uC81D\uD2B8 \uC774\uB984", "\uD53C\uB4DC\uBC31 \uBAA8\uB4DC"];
577
586
  async function editVerifyCommands(rl, config, projectRoot, c, flow) {
578
587
  process.stdout.write(
579
588
  `${flowConnector(c)}
@@ -663,6 +672,54 @@ async function editProjectName(rl, config, projectRoot, c, flow) {
663
672
  });
664
673
  step(flow, outcome.message);
665
674
  }
675
+ async function editFeedback(rl, config, projectRoot, c, flow) {
676
+ const curEnabled = config.feedback?.enabled ?? false;
677
+ process.stdout.write(
678
+ `${flowConnector(c)}
679
+ ${flowActiveNode(
680
+ "\uD53C\uB4DC\uBC31 \uBAA8\uB4DC",
681
+ [
682
+ `\uD604\uC7AC: ${curEnabled ? "\uCF1C\uC9D0" : "\uAEBC\uC9D0"}`,
683
+ `\uACBD\uB85C: ${config.feedback?.path || `(\uAE30\uBCF8\uAC12) ${DEFAULT_FEEDBACK_PATH}`}`,
684
+ "",
685
+ "awl/awl-loop/awl-pipeline \uC2A4\uD0AC\xB7CLI \uC790\uCCB4\uC758 \uC124\uACC4 \uAC2D\xB7\uBC84\uADF8\xB7\uB9C8\uCC30\uC744 \uB2E4\uB978 \uD504\uB85C\uC81D\uD2B8\uB85C \uB77C\uC6B0\uD305\uD569\uB2C8\uB2E4."
686
+ ],
687
+ c
688
+ )}
689
+ `
690
+ );
691
+ const choice = await selectSingle(
692
+ rl,
693
+ ["\uCF1C\uC9D0", "\uAEBC\uC9D0"],
694
+ curEnabled ? 0 : 1,
695
+ c,
696
+ false,
697
+ "\uD53C\uB4DC\uBC31 \uBAA8\uB4DC"
698
+ );
699
+ const toggled = await applyConfigValue(
700
+ config,
701
+ projectRoot,
702
+ { kind: "feedback.enabled" },
703
+ choice === 0 ? "true" : "false",
704
+ { force: false }
705
+ );
706
+ step(flow, toggled.message);
707
+ const pathAnswer = (await ask(
708
+ rl,
709
+ `${flowConnector(c)} \uACBD\uB85C [${config.feedback?.path || DEFAULT_FEEDBACK_PATH}] (\uBE44\uC6B0\uBA74 \uADF8\uB300\uB85C, '-'\uBA74 \uAE30\uBCF8\uAC12): `
710
+ )).trim();
711
+ if (pathAnswer === "") {
712
+ return;
713
+ }
714
+ const outcome = await applyConfigValue(
715
+ config,
716
+ projectRoot,
717
+ { kind: "feedback.path" },
718
+ pathAnswer === "-" ? "" : pathAnswer,
719
+ { force: false }
720
+ );
721
+ step(flow, outcome.message);
722
+ }
666
723
  async function interactiveEditMenu(rl, config, projectRoot, c) {
667
724
  const flow = openFlow("\uC124\uC815 \uC218\uC815", c);
668
725
  process.stdout.write(`${flowConnector(c)}
@@ -685,6 +742,8 @@ ${flowActiveNode("\uC218\uC815\uD560 \uD56D\uBAA9\uC744 \uACE0\uB974\uC138\uC694
685
742
  await editCharacter(rl, config, projectRoot, c, flow);
686
743
  } else if (idx === 4) {
687
744
  await editProjectName(rl, config, projectRoot, c, flow);
745
+ } else if (idx === 5) {
746
+ await editFeedback(rl, config, projectRoot, c, flow);
688
747
  }
689
748
  closeFlow(flow);
690
749
  return true;
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  readRecords
3
- } from "./chunk-4BUPV5VU.js";
3
+ } from "./chunk-FK3Q7UY2.js";
4
4
  import {
5
5
  loadState
6
- } from "./chunk-WOH6WML7.js";
6
+ } from "./chunk-VE2GVNNS.js";
7
7
  import {
8
8
  multiProjectFooter,
9
9
  resolveProjectScope,
10
10
  run
11
- } from "./chunk-SNWJWX5K.js";
11
+ } from "./chunk-MLTY3EE6.js";
12
12
  import {
13
13
  WORKTREES_DIR,
14
14
  caps,
@@ -1,20 +1,20 @@
1
1
  import {
2
2
  protectedFilesMessage
3
- } from "./chunk-K2JV27JR.js";
3
+ } from "./chunk-VVZOIFL4.js";
4
4
  import {
5
5
  gitDirtyFiles
6
- } from "./chunk-L4VWHK4D.js";
6
+ } from "./chunk-DQF7RF37.js";
7
7
  import {
8
8
  applyVerificationAttempts,
9
9
  loadState,
10
10
  writeState
11
- } from "./chunk-WOH6WML7.js";
11
+ } from "./chunk-VE2GVNNS.js";
12
12
  import {
13
13
  CommandNotFoundError,
14
14
  VERIFY_ORDER,
15
15
  requireConfig,
16
16
  run
17
- } from "./chunk-SNWJWX5K.js";
17
+ } from "./chunk-MLTY3EE6.js";
18
18
  import {
19
19
  caps,
20
20
  makeColors,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveProjectRoot
3
- } from "./chunk-SNWJWX5K.js";
3
+ } from "./chunk-MLTY3EE6.js";
4
4
  import {
5
5
  caps,
6
6
  makeColors,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  run
3
- } from "./chunk-SNWJWX5K.js";
3
+ } from "./chunk-MLTY3EE6.js";
4
4
 
5
5
  // src/core/protected-files.ts
6
6
  async function changedProtectedFiles(projectRoot, protectedFiles) {
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  computeDurationMs
3
- } from "./chunk-GYXIREXZ.js";
3
+ } from "./chunk-IVEV5L7P.js";
4
4
  import {
5
5
  computeCoverage,
6
6
  readRecords
7
- } from "./chunk-4BUPV5VU.js";
7
+ } from "./chunk-FK3Q7UY2.js";
8
8
  import {
9
9
  loadState
10
- } from "./chunk-WOH6WML7.js";
10
+ } from "./chunk-VE2GVNNS.js";
11
11
  import {
12
12
  requireConfig
13
- } from "./chunk-SNWJWX5K.js";
13
+ } from "./chunk-MLTY3EE6.js";
14
14
  import {
15
15
  caps,
16
16
  generationsDir,
package/dist/cli.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  computeUpdateAvailable,
4
4
  readCachedLatestVersion,
5
5
  version
6
- } from "./chunk-DNDODLP2.js";
6
+ } from "./chunk-5MXSJD3C.js";
7
7
  import {
8
8
  caps,
9
9
  engineDir,
@@ -109,7 +109,7 @@ function renderExamplesCard(c) {
109
109
  examples: [
110
110
  { cmd: "awl brief --today", note: "\uC624\uB298 \uD558\uB8E8 \uC694\uC57D" },
111
111
  { cmd: "awl metrics --compare", note: "\uC138\uB300 \uAC04 \uBE44\uAD50" },
112
- { cmd: "awl feedback --severity high", note: "awl \uC790\uCCB4\uC5D0 \uB300\uD55C \uD53C\uB4DC\uBC31, \uC2EC\uAC01\uB3C4 \uD544\uD130" },
112
+ { cmd: "awl feedback-log --severity high", note: "awl \uC790\uCCB4\uC5D0 \uB300\uD55C \uD53C\uB4DC\uBC31, \uC2EC\uAC01\uB3C4 \uD544\uD130" },
113
113
  { cmd: "awl changelog --workitem WI-01", note: "\uADF8 \uC6CC\uD06C\uC544\uC774\uD15C\uC758 \uBCC0\uACBD \uC774\uB825" }
114
114
  ]
115
115
  }
@@ -239,7 +239,7 @@ function buildProgram() {
239
239
  "--archive",
240
240
  "(--pipeline\uACFC \uD568\uAED8) \uC720\uC608 \uAE30\uAC04(3\uC77C) \uC9C0\uB09C \uC644\uB8CC workitem\uC744 .tasks/archive/ \uB85C \uBCF4\uAD00\uD569\uB2C8\uB2E4"
241
241
  ).action(async (opts) => {
242
- const { runStatus } = await import("./status-ZZEF4NYL.js");
242
+ const { runStatus } = await import("./status-2LPWVCHT.js");
243
243
  await runStatus({
244
244
  json: opts.json === true,
245
245
  pipeline: opts.pipeline === true,
@@ -247,15 +247,15 @@ function buildProgram() {
247
247
  });
248
248
  });
249
249
  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) => {
250
- const { runBrief } = await import("./brief-I2EQVY3F.js");
250
+ const { runBrief } = await import("./brief-SGMFXOY2.js");
251
251
  await runBrief({ today: opts.today === true, date: opts.date, json: opts.json === true });
252
252
  });
253
253
  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) => {
254
- const { runDoctor } = await import("./doctor-QQLQOP3Y.js");
254
+ const { runDoctor } = await import("./doctor-TMMIO4CE.js");
255
255
  await runDoctor({ json: opts.json === true });
256
256
  });
257
257
  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) => {
258
- const { runVersionCheck } = await import("./version-check-SILVRBMJ.js");
258
+ const { runVersionCheck } = await import("./version-check-3BZXXAQD.js");
259
259
  await runVersionCheck({ json: opts.json === true });
260
260
  });
261
261
  program.command("update").description(
@@ -269,7 +269,7 @@ function buildProgram() {
269
269
  });
270
270
  program.command("remove").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(
271
271
  async (opts) => {
272
- const { runRemove } = await import("./remove-UOAMHEUC.js");
272
+ const { runRemove } = await import("./remove-J7B32U75.js");
273
273
  await runRemove({
274
274
  yes: opts.yes === true,
275
275
  project: opts.project === true,
@@ -281,22 +281,22 @@ function buildProgram() {
281
281
  );
282
282
  const config = program.command("config").description("\uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \uC124\uC815\uC744 \uBD05\uB2C8\uB2E4 (TTY \uBA74 \uC218\uC815\uB3C4)");
283
283
  config.action(async () => {
284
- const { runConfig } = await import("./config-6VD46H24.js");
284
+ const { runConfig } = await import("./config-QTEKLFZP.js");
285
285
  await runConfig();
286
286
  });
287
287
  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(
288
288
  async (key, value, opts) => {
289
- const { runConfigSet } = await import("./config-6VD46H24.js");
289
+ const { runConfigSet } = await import("./config-QTEKLFZP.js");
290
290
  await runConfigSet(key, value, { force: opts.force === true });
291
291
  }
292
292
  );
293
293
  const work = program.command("work").description("\uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \uC6CC\uD06C\uC544\uC774\uD15C\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4");
294
294
  work.option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
295
- const { runWorkList } = await import("./work-RCV5H7TL.js");
295
+ const { runWorkList } = await import("./work-PEJN55JB.js");
296
296
  runWorkList({ json: opts.json === true });
297
297
  });
298
298
  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) => {
299
- const { runWorkList } = await import("./work-RCV5H7TL.js");
299
+ const { runWorkList } = await import("./work-PEJN55JB.js");
300
300
  runWorkList({ json: opts.json === true });
301
301
  });
302
302
  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(
@@ -304,7 +304,7 @@ function buildProgram() {
304
304
  "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)"
305
305
  ).option("--experiment <json>", '\uC2E4\uD5D8 \uCF00\uC774\uC2A4 \uBA54\uD0C0 JSON (\uC608: {"model":"lite","mode":"loop"})').action(
306
306
  async (id, description, opts) => {
307
- const { runWorkNew } = await import("./work-RCV5H7TL.js");
307
+ const { runWorkNew } = await import("./work-PEJN55JB.js");
308
308
  const parsedExp = parseExperimentOption(opts.experiment);
309
309
  if (!parsedExp.ok) {
310
310
  process.stderr.write(`
@@ -316,52 +316,52 @@ function buildProgram() {
316
316
  }
317
317
  );
318
318
  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) => {
319
- const { runWorkSwitch } = await import("./work-RCV5H7TL.js");
319
+ const { runWorkSwitch } = await import("./work-PEJN55JB.js");
320
320
  await runWorkSwitch(id);
321
321
  });
322
322
  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) => {
323
- const { runWorkAbandon } = await import("./work-RCV5H7TL.js");
323
+ const { runWorkAbandon } = await import("./work-PEJN55JB.js");
324
324
  runWorkAbandon(id);
325
325
  });
326
326
  work.command("done <id>").description(
327
327
  "\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)"
328
328
  ).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) => {
329
- const { runWorkDone } = await import("./work-RCV5H7TL.js");
329
+ const { runWorkDone } = await import("./work-PEJN55JB.js");
330
330
  await runWorkDone(id, { force: opts.force === true });
331
331
  });
332
332
  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)");
333
333
  lane.option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
334
- const { runLaneList } = await import("./lane-BJ2NJYAH.js");
334
+ const { runLaneList } = await import("./lane-24GAVVR6.js");
335
335
  await runLaneList({ json: opts.json === true });
336
336
  });
337
337
  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) => {
338
- const { runLaneNew } = await import("./lane-BJ2NJYAH.js");
338
+ const { runLaneNew } = await import("./lane-24GAVVR6.js");
339
339
  await runLaneNew(name, description);
340
340
  });
341
341
  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) => {
342
- const { runLaneList } = await import("./lane-BJ2NJYAH.js");
342
+ const { runLaneList } = await import("./lane-24GAVVR6.js");
343
343
  await runLaneList({ json: opts.json === true });
344
344
  });
345
345
  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) => {
346
- const { runLaneRemove } = await import("./lane-BJ2NJYAH.js");
346
+ const { runLaneRemove } = await import("./lane-24GAVVR6.js");
347
347
  await runLaneRemove(name, { force: opts.force === true });
348
348
  });
349
349
  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) => {
350
- const { runRecords } = await import("./record-UU4WPT2Z.js");
350
+ const { runRecords } = await import("./record-TSB22DIO.js");
351
351
  runRecords({ type: opts.type, workitem: opts.workitem, json: opts.json === true });
352
352
  });
353
353
  const rules = program.command("rules").description("\uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uC801\uC6A9\uB418\uB294 \uADDC\uCE59\uC744 \uBD05\uB2C8\uB2E4").enablePositionalOptions();
354
354
  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) => {
355
- const { runRules } = await import("./rules-QDAC6BUX.js");
355
+ const { runRules } = await import("./rules-QLUXNSCN.js");
356
356
  runRules({ scope: opts.scope, json: opts.json === true });
357
357
  });
358
358
  rules.command("edit").description("$EDITOR \uB85C \uADDC\uCE59 \uD30C\uC77C\uC744 \uC5FD\uB2C8\uB2E4").action(async () => {
359
- const { runRules } = await import("./rules-QDAC6BUX.js");
359
+ const { runRules } = await import("./rules-QLUXNSCN.js");
360
360
  runRules({ edit: true });
361
361
  });
362
362
  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(
363
363
  async (gotchaId, opts) => {
364
- const { runRulesPromote } = await import("./rules-QDAC6BUX.js");
364
+ const { runRulesPromote } = await import("./rules-QLUXNSCN.js");
365
365
  runRulesPromote(gotchaId, {
366
366
  applies: opts.applies,
367
367
  counter: opts.counter,
@@ -370,16 +370,16 @@ function buildProgram() {
370
370
  }
371
371
  );
372
372
  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) => {
373
- const { runGotchas } = await import("./gotchas-HF5Q2MOA.js");
373
+ const { runGotchas } = await import("./gotchas-PDG2ZZFQ.js");
374
374
  runGotchas({ json: opts.json === true });
375
375
  });
376
376
  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) => {
377
- const { runMetrics } = await import("./metrics-6SZQAG3C.js");
377
+ const { runMetrics } = await import("./metrics-ZR7BPATB.js");
378
378
  runMetrics({ json: opts.json === true, compare: opts.compare === true });
379
379
  });
380
380
  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(
381
381
  async (opts) => {
382
- const { runLoopSummary } = await import("./loop-summary-RZQBTKVY.js");
382
+ const { runLoopSummary } = await import("./loop-summary-CODZMRUY.js");
383
383
  runLoopSummary({
384
384
  workitem: opts.workitem,
385
385
  workitems: parseWorkitemsOption(opts.workitems),
@@ -388,9 +388,11 @@ function buildProgram() {
388
388
  });
389
389
  }
390
390
  );
391
- 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) => {
392
- const { runFeedback } = await import("./feedback-K3P6667T.js");
393
- runFeedback({
391
+ program.command("feedback-log").description(
392
+ "awl \uB3C4\uAD6C \uC790\uCCB4\uC5D0 \uB0A8\uACA8\uC9C4 \uD53C\uB4DC\uBC31 \uAE30\uB85D(awl-feedback)\uC744 area \uBCC4\uB85C \uBB36\uC5B4 \uAC80\uD1A0\uD569\uB2C8\uB2E4 (\uD574\uBC95\uC740 \uC81C\uC2DC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4)"
393
+ ).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) => {
394
+ const { runFeedbackLog } = await import("./feedback-log-UCNJ2GVT.js");
395
+ runFeedbackLog({
394
396
  json: opts.json === true,
395
397
  area: opts.area,
396
398
  severity: opts.severity,
@@ -398,12 +400,12 @@ function buildProgram() {
398
400
  });
399
401
  });
400
402
  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) => {
401
- const { runChangelogDraft } = await import("./changelog-UBIZQHQO.js");
403
+ const { runChangelogDraft } = await import("./changelog-VNJ4EQ74.js");
402
404
  runChangelogDraft({ workitem: opts.workitem, json: opts.json === true });
403
405
  });
404
406
  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(
405
407
  async (criterion, opts) => {
406
- const { runCommit } = await import("./commit-I5ULIUHW.js");
408
+ const { runCommit } = await import("./commit-GPQATPEA.js");
407
409
  await runCommit(criterion, {
408
410
  start: opts.start,
409
411
  message: opts.message,
@@ -413,12 +415,12 @@ function buildProgram() {
413
415
  }
414
416
  );
415
417
  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) => {
416
- const { runReview } = await import("./review-DXSGXZLX.js");
418
+ const { runReview } = await import("./review-EM5Q2ZJX.js");
417
419
  await runReview(range, { json: opts.json === true, base: opts.base });
418
420
  });
419
421
  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(
420
422
  async (type, opts) => {
421
- const { runRecord } = await import("./record-UU4WPT2Z.js");
423
+ const { runRecord } = await import("./record-TSB22DIO.js");
422
424
  await runRecord(type, {
423
425
  json: opts.json,
424
426
  file: opts.file,
@@ -432,7 +434,7 @@ function buildProgram() {
432
434
  "\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)"
433
435
  ).action(
434
436
  async (opts) => {
435
- const { runVerify } = await import("./verify-LOTTWOHB.js");
437
+ const { runVerify } = await import("./verify-VWKIBPZD.js");
436
438
  await runVerify({
437
439
  json: opts.json === true,
438
440
  bail: opts.bail === true,
@@ -443,17 +445,17 @@ function buildProgram() {
443
445
  }
444
446
  );
445
447
  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) => {
446
- const { runHoldRecheck } = await import("./hold-recheck-CBSGGRBM.js");
448
+ const { runHoldRecheck } = await import("./hold-recheck-UNAILFN5.js");
447
449
  await runHoldRecheck({ json: opts.json === true });
448
450
  });
449
451
  const state = program.command("state", { hidden: true }).description("\uB8E8\uD504 \uC0C1\uD0DC\uB97C \uC77D\uACE0 \uC501\uB2C8\uB2E4");
450
452
  state.command("get").option("--json", "\uAE30\uACC4\uAC00 \uC77D\uC744 \uC218 \uC788\uB294 JSON\uC73C\uB85C \uCD9C\uB825\uD569\uB2C8\uB2E4").action(async (opts) => {
451
- const { runStateGet } = await import("./state-DZC7JVEK.js");
453
+ const { runStateGet } = await import("./state-6IIH7SW2.js");
452
454
  runStateGet({ json: opts.json === true });
453
455
  });
454
456
  state.command("set").requiredOption("--json <patch>", "\uBD80\uBD84 \uAC31\uC2E0 (JSON \uBB38\uC790\uC5F4)").action(async (opts) => {
455
- const { runStateSet } = await import("./state-DZC7JVEK.js");
456
- const { hasApprovedGate1 } = await import("./record-UU4WPT2Z.js");
457
+ const { runStateSet } = await import("./state-6IIH7SW2.js");
458
+ const { hasApprovedGate1 } = await import("./record-TSB22DIO.js");
457
459
  runStateSet(opts.json, {
458
460
  // phase:'loop' 로의 전이는 이 워크아이템에 "승인된" 게이트1 레코드가 있을
459
461
  // 때만 허용한다(0.6.3, 적대검증 발견). 예전엔 gate:1 레코드의 존재만 봐서
@@ -464,7 +466,7 @@ function buildProgram() {
464
466
  });
465
467
  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(
466
468
  async (opts) => {
467
- const m = await import("./evolve-MXGX33GB.js");
469
+ const m = await import("./evolve-N3S32P5I.js");
468
470
  if (opts.collect && opts.record) {
469
471
  process.stderr.write("\n --collect \uC640 --record \uB294 \uB3D9\uC2DC\uC5D0 \uC4F8 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\n");
470
472
  process.exit(1);
@@ -483,7 +485,7 @@ function buildProgram() {
483
485
  }
484
486
  );
485
487
  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) => {
486
- const m = await import("./record-UU4WPT2Z.js");
488
+ const m = await import("./record-TSB22DIO.js");
487
489
  m.runDeferSummary({ json: opts.json === true, workitem: opts.workitem });
488
490
  });
489
491
  program.action((opts, command) => {
@@ -1,20 +1,20 @@
1
1
  import {
2
2
  protectedFilesMessage
3
- } from "./chunk-K2JV27JR.js";
3
+ } from "./chunk-VVZOIFL4.js";
4
4
  import {
5
5
  hasApprovedGate1
6
- } from "./chunk-4BUPV5VU.js";
6
+ } from "./chunk-FK3Q7UY2.js";
7
7
  import {
8
8
  getCriterion,
9
9
  loadState,
10
10
  setCriterion,
11
11
  writeState
12
- } from "./chunk-WOH6WML7.js";
12
+ } from "./chunk-VE2GVNNS.js";
13
13
  import {
14
14
  loadConfig,
15
15
  resolveProjectRoot,
16
16
  run
17
- } from "./chunk-SNWJWX5K.js";
17
+ } from "./chunk-MLTY3EE6.js";
18
18
  import "./chunk-SJG22DAK.js";
19
19
  import {
20
20
  caps,
@@ -16,7 +16,7 @@ import {
16
16
  runConfig,
17
17
  runConfigSet,
18
18
  validateConfig
19
- } from "./chunk-SNWJWX5K.js";
19
+ } from "./chunk-MLTY3EE6.js";
20
20
  import "./chunk-SJG22DAK.js";
21
21
  import "./chunk-FGHILN3D.js";
22
22
  export {
@@ -8,12 +8,12 @@ import {
8
8
  gitHasCommits,
9
9
  renderText,
10
10
  runDoctor
11
- } from "./chunk-L4VWHK4D.js";
12
- import "./chunk-4BUPV5VU.js";
13
- import "./chunk-WOH6WML7.js";
14
- import "./chunk-3N3QH4PK.js";
15
- import "./chunk-DNDODLP2.js";
16
- import "./chunk-SNWJWX5K.js";
11
+ } from "./chunk-DQF7RF37.js";
12
+ import "./chunk-FK3Q7UY2.js";
13
+ import "./chunk-VE2GVNNS.js";
14
+ import "./chunk-HAUTKVB5.js";
15
+ import "./chunk-5MXSJD3C.js";
16
+ import "./chunk-MLTY3EE6.js";
17
17
  import "./chunk-SJG22DAK.js";
18
18
  import "./chunk-FGHILN3D.js";
19
19
  export {
@@ -13,11 +13,11 @@ import {
13
13
  runEvolveCollect,
14
14
  runEvolveRecord,
15
15
  writeGeneration
16
- } from "./chunk-SKJZSRVR.js";
17
- import "./chunk-GYXIREXZ.js";
18
- import "./chunk-4BUPV5VU.js";
19
- import "./chunk-WOH6WML7.js";
20
- import "./chunk-SNWJWX5K.js";
16
+ } from "./chunk-ZRKOZQKP.js";
17
+ import "./chunk-IVEV5L7P.js";
18
+ import "./chunk-FK3Q7UY2.js";
19
+ import "./chunk-VE2GVNNS.js";
20
+ import "./chunk-MLTY3EE6.js";
21
21
  import "./chunk-SJG22DAK.js";
22
22
  import "./chunk-FGHILN3D.js";
23
23
  export {
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  readRecords
3
- } from "./chunk-4BUPV5VU.js";
4
- import "./chunk-WOH6WML7.js";
5
- import "./chunk-SNWJWX5K.js";
3
+ } from "./chunk-FK3Q7UY2.js";
4
+ import "./chunk-VE2GVNNS.js";
5
+ import "./chunk-MLTY3EE6.js";
6
6
  import "./chunk-SJG22DAK.js";
7
7
  import {
8
8
  caps,
@@ -11,7 +11,7 @@ import {
11
11
  signal
12
12
  } from "./chunk-FGHILN3D.js";
13
13
 
14
- // src/commands/feedback.ts
14
+ // src/commands/feedback-log.ts
15
15
  var SEVERITY_RANK = { high: 0, medium: 1, low: 2 };
16
16
  function loadAwlFeedback(filter = {}) {
17
17
  let records = readRecords().filter((r) => r.type === "awl-feedback");
@@ -60,7 +60,7 @@ function buildFeedbackReport(records) {
60
60
  const prioritized = Object.entries(areas).filter(([, g]) => g.count >= 2).sort(([, a], [, b]) => b.count - a.count).map(([area]) => area);
61
61
  return { collectedFrom: workitems.size, areas, prioritized };
62
62
  }
63
- function renderFeedback(report, c) {
63
+ function renderFeedbackLog(report, c) {
64
64
  const color = makeColors(c.color);
65
65
  const entries = Object.entries(report.areas).sort(([, a], [, b]) => b.count - a.count);
66
66
  if (entries.length === 0) {
@@ -98,7 +98,7 @@ function renderFeedback(report, c) {
98
98
  }
99
99
  return sectionBox(`awl \uC790\uCCB4 \uD53C\uB4DC\uBC31 \xB7 \uC6CC\uD06C\uC544\uC774\uD15C ${report.collectedFrom}\uAC1C\uC5D0\uC11C \uC218\uC9D1`, out, c);
100
100
  }
101
- function runFeedback(opts) {
101
+ function runFeedbackLog(opts) {
102
102
  if (isInvalidSince(opts.since)) {
103
103
  process.stderr.write(
104
104
  `
@@ -113,13 +113,13 @@ function runFeedback(opts) {
113
113
  `);
114
114
  return;
115
115
  }
116
- process.stdout.write(`${renderFeedback(report, caps())}
116
+ process.stdout.write(`${renderFeedbackLog(report, caps())}
117
117
  `);
118
118
  }
119
119
  export {
120
120
  buildFeedbackReport,
121
121
  isInvalidSince,
122
122
  loadAwlFeedback,
123
- renderFeedback,
124
- runFeedback
123
+ renderFeedbackLog,
124
+ runFeedbackLog
125
125
  };
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  loadGotchaList
3
- } from "./chunk-SKJZSRVR.js";
4
- import "./chunk-GYXIREXZ.js";
5
- import "./chunk-4BUPV5VU.js";
6
- import "./chunk-WOH6WML7.js";
7
- import "./chunk-SNWJWX5K.js";
3
+ } from "./chunk-ZRKOZQKP.js";
4
+ import "./chunk-IVEV5L7P.js";
5
+ import "./chunk-FK3Q7UY2.js";
6
+ import "./chunk-VE2GVNNS.js";
7
+ import "./chunk-MLTY3EE6.js";
8
8
  import "./chunk-SJG22DAK.js";
9
9
  import {
10
10
  caps,
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  pipelineLanes
3
- } from "./chunk-3LPCP55B.js";
4
- import "./chunk-4BUPV5VU.js";
5
- import "./chunk-WOH6WML7.js";
3
+ } from "./chunk-PUINOFOR.js";
4
+ import "./chunk-FK3Q7UY2.js";
5
+ import "./chunk-VE2GVNNS.js";
6
6
  import {
7
7
  resolveProjectRoot
8
- } from "./chunk-SNWJWX5K.js";
8
+ } from "./chunk-MLTY3EE6.js";
9
9
  import "./chunk-SJG22DAK.js";
10
10
  import {
11
11
  caps,
@@ -9,20 +9,20 @@ import {
9
9
  runLaneRemove,
10
10
  unmergedCommitCount,
11
11
  worktreeUntracked
12
- } from "./chunk-LBZNBCAY.js";
13
- import "./chunk-2FQ5HCDI.js";
12
+ } from "./chunk-IA32FVBA.js";
13
+ import "./chunk-ISLNBWKV.js";
14
14
  import "./chunk-D5OINC3G.js";
15
- import "./chunk-236TTTK3.js";
16
- import "./chunk-SKJZSRVR.js";
17
- import "./chunk-GYXIREXZ.js";
18
- import "./chunk-O7PUNJVM.js";
19
- import "./chunk-K2JV27JR.js";
20
- import "./chunk-L4VWHK4D.js";
21
- import "./chunk-4BUPV5VU.js";
22
- import "./chunk-WOH6WML7.js";
23
- import "./chunk-3N3QH4PK.js";
24
- import "./chunk-DNDODLP2.js";
25
- import "./chunk-SNWJWX5K.js";
15
+ import "./chunk-EHJYX57P.js";
16
+ import "./chunk-ZRKOZQKP.js";
17
+ import "./chunk-IVEV5L7P.js";
18
+ import "./chunk-QKKMA2VT.js";
19
+ import "./chunk-VVZOIFL4.js";
20
+ import "./chunk-DQF7RF37.js";
21
+ import "./chunk-FK3Q7UY2.js";
22
+ import "./chunk-VE2GVNNS.js";
23
+ import "./chunk-HAUTKVB5.js";
24
+ import "./chunk-5MXSJD3C.js";
25
+ import "./chunk-MLTY3EE6.js";
26
26
  import "./chunk-SJG22DAK.js";
27
27
  import "./chunk-FGHILN3D.js";
28
28
  export {
@@ -6,20 +6,20 @@ import {
6
6
  computeDurationMs,
7
7
  fmtDuration,
8
8
  loadGenerations
9
- } from "./chunk-GYXIREXZ.js";
9
+ } from "./chunk-IVEV5L7P.js";
10
10
  import {
11
11
  collectDeferred,
12
12
  readRecords
13
- } from "./chunk-4BUPV5VU.js";
13
+ } from "./chunk-FK3Q7UY2.js";
14
14
  import {
15
15
  loadState
16
- } from "./chunk-WOH6WML7.js";
16
+ } from "./chunk-VE2GVNNS.js";
17
17
  import {
18
18
  loadConfig,
19
19
  multiProjectFooter,
20
20
  requireConfig,
21
21
  resolveProjectScope
22
- } from "./chunk-SNWJWX5K.js";
22
+ } from "./chunk-MLTY3EE6.js";
23
23
  import "./chunk-SJG22DAK.js";
24
24
  import {
25
25
  caps,
@@ -8,8 +8,8 @@ import {
8
8
  renderMetrics,
9
9
  renderMetricsCaveat,
10
10
  runMetrics
11
- } from "./chunk-GYXIREXZ.js";
12
- import "./chunk-SNWJWX5K.js";
11
+ } from "./chunk-IVEV5L7P.js";
12
+ import "./chunk-MLTY3EE6.js";
13
13
  import "./chunk-SJG22DAK.js";
14
14
  import "./chunk-FGHILN3D.js";
15
15
  export {
@@ -29,9 +29,9 @@ import {
29
29
  runRecords,
30
30
  selectMonthFiles,
31
31
  shouldDefer
32
- } from "./chunk-4BUPV5VU.js";
33
- import "./chunk-WOH6WML7.js";
34
- import "./chunk-SNWJWX5K.js";
32
+ } from "./chunk-FK3Q7UY2.js";
33
+ import "./chunk-VE2GVNNS.js";
34
+ import "./chunk-MLTY3EE6.js";
35
35
  import "./chunk-SJG22DAK.js";
36
36
  import "./chunk-FGHILN3D.js";
37
37
  export {
@@ -4,25 +4,25 @@ import {
4
4
  laneBranchMap,
5
5
  unmergedCommitCount,
6
6
  worktreeUntracked
7
- } from "./chunk-LBZNBCAY.js";
7
+ } from "./chunk-IA32FVBA.js";
8
8
  import {
9
9
  removeGitWorktree,
10
10
  worktreeDirtyTracked
11
- } from "./chunk-2FQ5HCDI.js";
11
+ } from "./chunk-ISLNBWKV.js";
12
12
  import "./chunk-D5OINC3G.js";
13
- import "./chunk-236TTTK3.js";
14
- import "./chunk-SKJZSRVR.js";
15
- import "./chunk-GYXIREXZ.js";
16
- import "./chunk-O7PUNJVM.js";
17
- import "./chunk-K2JV27JR.js";
18
- import "./chunk-L4VWHK4D.js";
19
- import "./chunk-4BUPV5VU.js";
20
- import "./chunk-WOH6WML7.js";
21
- import "./chunk-3N3QH4PK.js";
22
- import "./chunk-DNDODLP2.js";
13
+ import "./chunk-EHJYX57P.js";
14
+ import "./chunk-ZRKOZQKP.js";
15
+ import "./chunk-IVEV5L7P.js";
16
+ import "./chunk-QKKMA2VT.js";
17
+ import "./chunk-VVZOIFL4.js";
18
+ import "./chunk-DQF7RF37.js";
19
+ import "./chunk-FK3Q7UY2.js";
20
+ import "./chunk-VE2GVNNS.js";
21
+ import "./chunk-HAUTKVB5.js";
22
+ import "./chunk-5MXSJD3C.js";
23
23
  import {
24
24
  resolveProjectRoot
25
- } from "./chunk-SNWJWX5K.js";
25
+ } from "./chunk-MLTY3EE6.js";
26
26
  import {
27
27
  packageEngineDir
28
28
  } from "./chunk-SJG22DAK.js";
@@ -1,24 +1,24 @@
1
1
  import {
2
2
  filterRules,
3
3
  loadRules
4
- } from "./chunk-236TTTK3.js";
5
- import "./chunk-SKJZSRVR.js";
6
- import "./chunk-GYXIREXZ.js";
4
+ } from "./chunk-EHJYX57P.js";
5
+ import "./chunk-ZRKOZQKP.js";
6
+ import "./chunk-IVEV5L7P.js";
7
7
  import {
8
8
  runVerifyChecks
9
- } from "./chunk-O7PUNJVM.js";
10
- import "./chunk-K2JV27JR.js";
11
- import "./chunk-L4VWHK4D.js";
12
- import "./chunk-4BUPV5VU.js";
9
+ } from "./chunk-QKKMA2VT.js";
10
+ import "./chunk-VVZOIFL4.js";
11
+ import "./chunk-DQF7RF37.js";
12
+ import "./chunk-FK3Q7UY2.js";
13
13
  import {
14
14
  loadState
15
- } from "./chunk-WOH6WML7.js";
16
- import "./chunk-3N3QH4PK.js";
17
- import "./chunk-DNDODLP2.js";
15
+ } from "./chunk-VE2GVNNS.js";
16
+ import "./chunk-HAUTKVB5.js";
17
+ import "./chunk-5MXSJD3C.js";
18
18
  import {
19
19
  requireConfig,
20
20
  run
21
- } from "./chunk-SNWJWX5K.js";
21
+ } from "./chunk-MLTY3EE6.js";
22
22
  import "./chunk-SJG22DAK.js";
23
23
  import {
24
24
  caps,
@@ -10,12 +10,12 @@ import {
10
10
  runRulesPromote,
11
11
  suggestLinter,
12
12
  validatePromoteOpts
13
- } from "./chunk-236TTTK3.js";
14
- import "./chunk-SKJZSRVR.js";
15
- import "./chunk-GYXIREXZ.js";
16
- import "./chunk-4BUPV5VU.js";
17
- import "./chunk-WOH6WML7.js";
18
- import "./chunk-SNWJWX5K.js";
13
+ } from "./chunk-EHJYX57P.js";
14
+ import "./chunk-ZRKOZQKP.js";
15
+ import "./chunk-IVEV5L7P.js";
16
+ import "./chunk-FK3Q7UY2.js";
17
+ import "./chunk-VE2GVNNS.js";
18
+ import "./chunk-MLTY3EE6.js";
19
19
  import "./chunk-SJG22DAK.js";
20
20
  import "./chunk-FGHILN3D.js";
21
21
  export {
@@ -14,8 +14,8 @@ import {
14
14
  stateLockFile,
15
15
  statePath,
16
16
  writeState
17
- } from "./chunk-WOH6WML7.js";
18
- import "./chunk-SNWJWX5K.js";
17
+ } from "./chunk-VE2GVNNS.js";
18
+ import "./chunk-MLTY3EE6.js";
19
19
  import "./chunk-SJG22DAK.js";
20
20
  import "./chunk-FGHILN3D.js";
21
21
  export {
@@ -9,10 +9,10 @@ import {
9
9
  renderPipelineGroups,
10
10
  renderStatus,
11
11
  runStatus
12
- } from "./chunk-3LPCP55B.js";
13
- import "./chunk-4BUPV5VU.js";
14
- import "./chunk-WOH6WML7.js";
15
- import "./chunk-SNWJWX5K.js";
12
+ } from "./chunk-PUINOFOR.js";
13
+ import "./chunk-FK3Q7UY2.js";
14
+ import "./chunk-VE2GVNNS.js";
15
+ import "./chunk-MLTY3EE6.js";
16
16
  import "./chunk-SJG22DAK.js";
17
17
  import "./chunk-FGHILN3D.js";
18
18
  export {
@@ -11,14 +11,14 @@ import {
11
11
  substituteRelatedCmd,
12
12
  verifyBaselinePath,
13
13
  writeVerifyBaseline
14
- } from "./chunk-O7PUNJVM.js";
15
- import "./chunk-K2JV27JR.js";
16
- import "./chunk-L4VWHK4D.js";
17
- import "./chunk-4BUPV5VU.js";
18
- import "./chunk-WOH6WML7.js";
19
- import "./chunk-3N3QH4PK.js";
20
- import "./chunk-DNDODLP2.js";
21
- import "./chunk-SNWJWX5K.js";
14
+ } from "./chunk-QKKMA2VT.js";
15
+ import "./chunk-VVZOIFL4.js";
16
+ import "./chunk-DQF7RF37.js";
17
+ import "./chunk-FK3Q7UY2.js";
18
+ import "./chunk-VE2GVNNS.js";
19
+ import "./chunk-HAUTKVB5.js";
20
+ import "./chunk-5MXSJD3C.js";
21
+ import "./chunk-MLTY3EE6.js";
22
22
  import "./chunk-SJG22DAK.js";
23
23
  import "./chunk-FGHILN3D.js";
24
24
  export {
@@ -2,9 +2,9 @@ import {
2
2
  gatherVersionInputs,
3
3
  renderVersionCheck,
4
4
  runVersionCheck
5
- } from "./chunk-3N3QH4PK.js";
6
- import "./chunk-DNDODLP2.js";
7
- import "./chunk-SNWJWX5K.js";
5
+ } from "./chunk-HAUTKVB5.js";
6
+ import "./chunk-5MXSJD3C.js";
7
+ import "./chunk-MLTY3EE6.js";
8
8
  import "./chunk-SJG22DAK.js";
9
9
  import "./chunk-FGHILN3D.js";
10
10
  export {
@@ -20,19 +20,19 @@ import {
20
20
  summarizeWorkitems,
21
21
  withCostAtStart,
22
22
  worktreeDirtyTracked
23
- } from "./chunk-2FQ5HCDI.js";
23
+ } from "./chunk-ISLNBWKV.js";
24
24
  import "./chunk-D5OINC3G.js";
25
- import "./chunk-236TTTK3.js";
26
- import "./chunk-SKJZSRVR.js";
27
- import "./chunk-GYXIREXZ.js";
28
- import "./chunk-O7PUNJVM.js";
29
- import "./chunk-K2JV27JR.js";
30
- import "./chunk-L4VWHK4D.js";
31
- import "./chunk-4BUPV5VU.js";
32
- import "./chunk-WOH6WML7.js";
33
- import "./chunk-3N3QH4PK.js";
34
- import "./chunk-DNDODLP2.js";
35
- import "./chunk-SNWJWX5K.js";
25
+ import "./chunk-EHJYX57P.js";
26
+ import "./chunk-ZRKOZQKP.js";
27
+ import "./chunk-IVEV5L7P.js";
28
+ import "./chunk-QKKMA2VT.js";
29
+ import "./chunk-VVZOIFL4.js";
30
+ import "./chunk-DQF7RF37.js";
31
+ import "./chunk-FK3Q7UY2.js";
32
+ import "./chunk-VE2GVNNS.js";
33
+ import "./chunk-HAUTKVB5.js";
34
+ import "./chunk-5MXSJD3C.js";
35
+ import "./chunk-MLTY3EE6.js";
36
36
  import "./chunk-SJG22DAK.js";
37
37
  import "./chunk-FGHILN3D.js";
38
38
  export {
@@ -112,7 +112,7 @@ awl evolve --record --json '{"lesson":"...","context":"...","source":{...},"same
112
112
  `awl evolve --collect` 출력의 `awlFeedback.prompt` 를 본다. 이번 워크아이템에서 awl 도구 자체(작업 대상 코드가 아니라)가 불편했다면 남긴다:
113
113
 
114
114
  `awl record awl-feedback --json '{"area":"commit","what":"...","impact":"...","severity":"high","suggestion":"..."}'`
115
- - `area`: 어느 기능인가 (commit/review/gate/verify/state/init/cli/기타) — 나중에 모으기(`awl feedback`)의 묶는 키.
115
+ - `area`: 어느 기능인가 (commit/review/gate/verify/state/init/cli/기타) — 나중에 모으기(`awl feedback-log`)의 묶는 키.
116
116
  - `what`: 무슨 일이 있었나(사실). `impact`: 그래서 무엇을 해야 했나(아픔의 크기). `severity`: high/medium/low.
117
117
  - `suggestion`: 선택. 개선 아이디어. 강제 아님 — 번역(패치로 바꾸기)은 사람 몫이다.
118
118
 
@@ -102,7 +102,7 @@ exec가 이 문서를 집어갈지는 기존 **실행형 판별**(완료조건
102
102
  그대로 맡긴다 — 이 절에서 "자동 착수 금지"를 별도로 못박지 않는다.
103
103
 
104
104
  **`awl record awl-feedback`과 다르다**: awl-loop에 이미 있는 `awl record awl-feedback`(evolve
105
- 시점 1회, 구조화 JSON, 그 프로젝트의 `~/.awl/records/`에 로컬 저장, 사람이 나중에 `awl feedback`으로
105
+ 시점 1회, 구조화 JSON, 그 프로젝트의 `~/.awl/records/`에 로컬 저장, 사람이 나중에 `awl feedback-log`로
106
106
  수동 수집·번역)와 목적이 다르다 — 이 절의 피드백 모드는 **다른 프로젝트로 즉시 라우팅**돼 그 프로젝트의
107
107
  `.tasks/plan/`(exec가 실제로 감시하는 큐)에 바로 꽂히는 **능동적** 경로다. 세션 중 계속 켜둘 수 있고
108
108
  (evolve 시점 1회가 아님), 구조화 JSON이 아니라 실행형 판별을 거칠 수 있는 workitem 형식 문서다. 둘 다
@@ -1,9 +1,27 @@
1
+ import fs from 'node:fs';
2
+
1
3
  const dryRun =
2
4
  process.env.npm_config_dry_run === 'true' ||
3
5
  process.env.npm_config_dry_run === '1' ||
4
6
  process.argv.includes('--dry-run');
5
- if (dryRun || process.env.AWL_ALLOW_PUBLISH === '1') process.exit(0);
7
+
8
+ // Same rationale as engine/templates/pre-push.sample: this script can't tell
9
+ // a human's `npm publish` apart from one an agent ran programmatically, so
10
+ // it checks for a controlling terminal instead of demanding the override
11
+ // variable from everyone.
12
+ function hasControllingTerminal() {
13
+ try {
14
+ fs.closeSync(fs.openSync('/dev/tty', 'r+'));
15
+ return true;
16
+ } catch {
17
+ return false;
18
+ }
19
+ }
20
+
21
+ if (dryRun || process.env.AWL_ALLOW_PUBLISH === '1' || hasControllingTerminal()) {
22
+ process.exit(0);
23
+ }
6
24
  console.error(
7
- '❌ awl: npm publish is blocked. A human must explicitly set AWL_ALLOW_PUBLISH=1 after review.',
25
+ '❌ awl: npm publish is blocked (no interactive terminal detected). A human at a terminal can publish directly; otherwise set AWL_ALLOW_PUBLISH=1 after review.',
8
26
  );
9
27
  process.exit(1);
@@ -1,7 +1,13 @@
1
1
  #!/bin/sh
2
- # awl safety hook: normal pushes need an explicit human/release override.
2
+ # awl safety hook: a human at an interactive terminal can push directly.
3
+ # This hook has no way to tell a human's `git push` apart from one an agent
4
+ # ran programmatically, so it checks for a controlling terminal instead
5
+ # (agents/CI invocations don't have one; opening /dev/tty fails for them).
3
6
  if [ "${AWL_ALLOW_PUSH:-}" = "1" ]; then
4
7
  exit 0
5
8
  fi
6
- echo "❌ awl: git push is blocked. Review the release, then use AWL_ALLOW_PUSH=1 git push." >&2
9
+ if ( exec 3<>/dev/tty ) 2>/dev/null; then
10
+ exit 0
11
+ fi
12
+ echo "❌ awl: git push is blocked (no interactive terminal detected). A human at a terminal can push directly; otherwise use AWL_ALLOW_PUSH=1 git push." >&2
7
13
  exit 1
@@ -1,4 +1,4 @@
1
1
  {
2
- "engineVersion": "0.6.44",
2
+ "engineVersion": "0.6.45",
3
3
  "note": "~/.awl/engine 으로 복사되는 스킬·검사기·템플릿·마이그레이션. skills/ 에 awl-loop 스킬이 들어있습니다."
4
4
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-work-loop",
3
- "version": "0.6.44",
3
+ "version": "0.6.45",
4
4
  "description": "같은 실패를 두 번 하지 않는 도구. AI 에이전트가 한 일과 확인한 내용을 파일로 남깁니다.",
5
5
  "type": "module",
6
6
  "bin": {