agent-work-loop 0.6.44 → 0.6.46

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-2FQ5HCDI.js → chunk-AGFQC2UO.js} +7 -7
  5. package/dist/{chunk-L4VWHK4D.js → chunk-DA27NBCS.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-GYXIREXZ.js → chunk-IVEV5L7P.js} +1 -1
  9. package/dist/{chunk-SNWJWX5K.js → chunk-MLTY3EE6.js} +60 -1
  10. package/dist/{chunk-3LPCP55B.js → chunk-PUINOFOR.js} +3 -3
  11. package/dist/{chunk-LBZNBCAY.js → chunk-SSSOO2GH.js} +4 -4
  12. package/dist/{chunk-WOH6WML7.js → chunk-VE2GVNNS.js} +1 -1
  13. package/dist/{chunk-K2JV27JR.js → chunk-VVZOIFL4.js} +1 -1
  14. package/dist/{chunk-O7PUNJVM.js → chunk-WWZIKKHP.js} +4 -4
  15. package/dist/{chunk-3N3QH4PK.js → chunk-XWMS6Z5E.js} +2 -2
  16. package/dist/{chunk-DNDODLP2.js → chunk-ZEX5ZF6C.js} +1 -1
  17. package/dist/{chunk-SKJZSRVR.js → chunk-ZRKOZQKP.js} +4 -4
  18. package/dist/cli.js +123 -46
  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-JNUZJC6Z.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-ETMPPVXP.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-VJ7VBKTZ.js} +13 -13
  31. package/dist/{review-DXSGXZLX.js → review-CGALGS5X.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-7NQ3DOFY.js} +8 -8
  36. package/dist/{version-check-SILVRBMJ.js → version-check-5BX3SO7G.js} +3 -3
  37. package/dist/{work-RCV5H7TL.js → work-3YHL3P6U.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,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-WWZIKKHP.js";
17
17
  import {
18
18
  gitBranch
19
- } from "./chunk-L4VWHK4D.js";
19
+ } from "./chunk-DA27NBCS.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";
@@ -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-XWMS6Z5E.js";
12
12
  import {
13
13
  checkVersions
14
- } from "./chunk-DNDODLP2.js";
14
+ } from "./chunk-ZEX5ZF6C.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,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,
@@ -5,18 +5,18 @@ import {
5
5
  runWorkNew,
6
6
  sanitizeForGit,
7
7
  worktreeDirtyTracked
8
- } from "./chunk-2FQ5HCDI.js";
8
+ } from "./chunk-AGFQC2UO.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,
@@ -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,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-DA27NBCS.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,
@@ -3,10 +3,10 @@ import {
3
3
  getLatestVersionCached,
4
4
  name,
5
5
  version
6
- } from "./chunk-DNDODLP2.js";
6
+ } from "./chunk-ZEX5ZF6C.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
@@ -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.46";
8
8
 
9
9
  // src/core/npm-registry.ts
10
10
  import fs from "fs";
@@ -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,