agent-work-loop 0.6.26 → 0.6.27

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 (46) hide show
  1. package/README.md +17 -0
  2. package/dist/{brief-JIXESFMO.js → brief-TQND6XIK.js} +5 -5
  3. package/dist/{changelog-PBF6JBOC.js → changelog-J4LP6ZJI.js} +5 -5
  4. package/dist/{chunk-B6AEYNF3.js → chunk-CLWQEWEG.js} +4 -4
  5. package/dist/{chunk-JDCW2Y2G.js → chunk-DGPZEEFJ.js} +7 -7
  6. package/dist/{chunk-SQFGUNTY.js → chunk-DR7OZZ4N.js} +5 -5
  7. package/dist/{chunk-KEVDO3C3.js → chunk-GKKWXRQA.js} +9 -9
  8. package/dist/{chunk-AMQFBJCO.js → chunk-H4EMS47F.js} +7 -7
  9. package/dist/{chunk-NXH5EBBJ.js → chunk-J7EKKHVW.js} +8 -8
  10. package/dist/{chunk-6DXZYTDA.js → chunk-JXFQHNHV.js} +6 -6
  11. package/dist/{chunk-FQLRA2YC.js → chunk-KJG2ULS4.js} +1 -1
  12. package/dist/{chunk-PLHEP5QE.js → chunk-KNBSZQGN.js} +5 -5
  13. package/dist/{chunk-YODF2HTK.js → chunk-M4H4VNN6.js} +0 -26
  14. package/dist/{chunk-F34MITMC.js → chunk-MCNUMMKK.js} +2 -2
  15. package/dist/{chunk-XQ7JJXBY.js → chunk-MLD2GOVM.js} +7 -7
  16. package/dist/{chunk-OPPRCJT2.js → chunk-OSKS2YRU.js} +7 -7
  17. package/dist/{chunk-PUI2B27T.js → chunk-PFXDX4JF.js} +11 -11
  18. package/dist/{chunk-2YWYGWCZ.js → chunk-PIOV3MQT.js} +2 -3
  19. package/dist/{chunk-XD4IDIEM.js → chunk-UB4RLTLJ.js} +6 -6
  20. package/dist/cli.js +43 -43
  21. package/dist/{commit-OUZNLCNL.js → commit-2WWILQRB.js} +6 -6
  22. package/dist/{config-26FHYODU.js → config-XMM3V7MT.js} +3 -3
  23. package/dist/{doctor-UHUA6ULF.js → doctor-HZEAQNY7.js} +8 -8
  24. package/dist/{evolve-V5BQCSHC.js → evolve-EQ3N6F6M.js} +7 -7
  25. package/dist/{feedback-UJ7WSARN.js → feedback-4FT67LSI.js} +8 -8
  26. package/dist/{gotchas-L3NXDDDI.js → gotchas-QJBUVYJV.js} +11 -11
  27. package/dist/{hold-recheck-QINLKCPM.js → hold-recheck-L3DAS3MV.js} +18 -18
  28. package/dist/{init-6R4MT6FQ.js → init-PTTYGP2D.js} +2 -2
  29. package/dist/lane-WINQEOEW.js +41 -0
  30. package/dist/{loop-summary-FVJICIWA.js → loop-summary-OSYJB57M.js} +10 -10
  31. package/dist/{metrics-NVJFKQ4J.js → metrics-BC7ZUCGU.js} +4 -4
  32. package/dist/{record-JJJSGU5E.js → record-CKR6G6UZ.js} +5 -5
  33. package/dist/{review-I4QMZPTI.js → review-UJH6C7F4.js} +16 -16
  34. package/dist/{rules-OTUONMXO.js → rules-E52GU3GA.js} +8 -8
  35. package/dist/{state-UC45ECTI.js → state-X7DLLBOD.js} +4 -4
  36. package/dist/status-NGSQ4XK3.js +40 -0
  37. package/dist/{uninstall-HHKLOXF5.js → uninstall-JECZJNRJ.js} +17 -17
  38. package/dist/{update-BXRWE7OH.js → update-GA6I4AMF.js} +6 -6
  39. package/dist/{verify-A64P77RU.js → verify-KKQ2OQMO.js} +10 -10
  40. package/dist/version-check-7XE232L3.js +14 -0
  41. package/dist/{work-LMM5W2PQ.js → work-3SONYYYB.js} +14 -14
  42. package/engine/version.json +1 -1
  43. package/package.json +1 -1
  44. package/dist/lane-CJVXEV3A.js +0 -41
  45. package/dist/status-TU36KJDH.js +0 -40
  46. package/dist/version-check-UBXBVPTS.js +0 -14
package/README.md CHANGED
@@ -43,6 +43,23 @@ yarn global add agent-work-loop
43
43
  > ```
44
44
  > `dist/cli.js`가 `awl` bin으로 등록됩니다. 정식 npm 배포가 되면 이 문단은 지웁니다.
45
45
 
46
+ ### 나중에 업데이트하려면
47
+
48
+ 설치에 쓴 도구로 그대로 다시 실행하면 최신 버전을 받습니다(권장은 npm).
49
+
50
+ ```bash
51
+ npm install -g agent-work-loop@latest
52
+ ```
53
+
54
+ pnpm이나 yarn을 쓴다면:
55
+
56
+ ```bash
57
+ pnpm add -g agent-work-loop@latest
58
+ yarn global add agent-work-loop@latest
59
+ ```
60
+
61
+ 이건 CLI 패키지 자체를 새로 받는 것이고, 그 새 버전의 엔진(스킬 템플릿)을 `~/.awl`에 반영하는 건 `awl update`가 따로 합니다.
62
+
46
63
  설치가 됐는지 확인합니다:
47
64
 
48
65
  ```bash
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  loadProjectName,
3
3
  readRecords
4
- } from "./chunk-6DXZYTDA.js";
4
+ } from "./chunk-JXFQHNHV.js";
5
5
  import {
6
6
  loadState
7
- } from "./chunk-XD4IDIEM.js";
7
+ } from "./chunk-UB4RLTLJ.js";
8
8
  import {
9
9
  resolveProjectRoot,
10
10
  run
11
- } from "./chunk-B6AEYNF3.js";
12
- import "./chunk-2YWYGWCZ.js";
13
- import "./chunk-YODF2HTK.js";
11
+ } from "./chunk-CLWQEWEG.js";
12
+ import "./chunk-PIOV3MQT.js";
13
+ import "./chunk-M4H4VNN6.js";
14
14
 
15
15
  // src/commands/brief.ts
16
16
  var KST_OFFSET_MS = 9 * 60 * 60 * 1e3;
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  readRecords
3
- } from "./chunk-6DXZYTDA.js";
3
+ } from "./chunk-JXFQHNHV.js";
4
4
  import {
5
5
  loadState
6
- } from "./chunk-XD4IDIEM.js";
6
+ } from "./chunk-UB4RLTLJ.js";
7
7
  import {
8
8
  resolveProjectRoot
9
- } from "./chunk-B6AEYNF3.js";
10
- import "./chunk-2YWYGWCZ.js";
9
+ } from "./chunk-CLWQEWEG.js";
10
+ import "./chunk-PIOV3MQT.js";
11
11
  import {
12
12
  caps,
13
13
  signal
14
- } from "./chunk-YODF2HTK.js";
14
+ } from "./chunk-M4H4VNN6.js";
15
15
 
16
16
  // src/commands/changelog.ts
17
17
  function runChangelogDraft(opts) {
@@ -4,15 +4,15 @@ import {
4
4
  ask,
5
5
  buildScreens,
6
6
  promptNumber
7
- } from "./chunk-2YWYGWCZ.js";
7
+ } from "./chunk-PIOV3MQT.js";
8
8
  import {
9
9
  caps,
10
- card,
11
10
  findProjectRoot,
12
11
  makeColors,
13
12
  makeSymbols,
13
+ sectionBox,
14
14
  signal
15
- } from "./chunk-YODF2HTK.js";
15
+ } from "./chunk-M4H4VNN6.js";
16
16
 
17
17
  // src/commands/config.ts
18
18
  import fs from "fs";
@@ -479,7 +479,7 @@ function renderConfig(config, c) {
479
479
  `${s.lastBranch} ${color.dim('\uBA85\uB839\uC744 \uBC14\uAFB8\uB824\uBA74: awl config set verify.lint.cmd "biome check ."')}`
480
480
  );
481
481
  out.push(` ${color.dim("\uC9C1\uC811 \uD3B8\uC9D1\uB3C4 \uB429\uB2C8\uB2E4: .awl/config.json")}`);
482
- return card(`${config.project} \uC124\uC815`, out, c);
482
+ return sectionBox(`${config.project} \uC124\uC815`, out, c);
483
483
  }
484
484
  function writeConfigFile(projectRoot, config) {
485
485
  const p = path.join(projectRoot, ".awl", "config.json");
@@ -3,23 +3,23 @@ import {
3
3
  getLatestVersionCached,
4
4
  name,
5
5
  version
6
- } from "./chunk-F34MITMC.js";
6
+ } from "./chunk-MCNUMMKK.js";
7
7
  import {
8
8
  resolveProjectRoot
9
- } from "./chunk-B6AEYNF3.js";
9
+ } from "./chunk-CLWQEWEG.js";
10
10
  import {
11
11
  packageEngineDir,
12
12
  skillsVersionPath
13
- } from "./chunk-2YWYGWCZ.js";
13
+ } from "./chunk-PIOV3MQT.js";
14
14
  import {
15
15
  caps,
16
- card,
17
16
  installedEngineVersion,
18
17
  makeColors,
19
18
  makeSymbols,
20
19
  makeTokens,
20
+ sectionBox,
21
21
  signal
22
- } from "./chunk-YODF2HTK.js";
22
+ } from "./chunk-M4H4VNN6.js";
23
23
 
24
24
  // src/commands/version-check.ts
25
25
  import fs from "fs";
@@ -67,14 +67,14 @@ function renderVersionCheck(result, c) {
67
67
  const s = makeSymbols(c);
68
68
  const t = makeTokens(c);
69
69
  if (result.ok) {
70
- return card("\uBC84\uC804 \uD655\uC778", [`${signal(c, "ok")} \uBC84\uC804\uC774 \uC804\uBD80 \uC77C\uCE58\uD569\uB2C8\uB2E4.`], c);
70
+ return sectionBox("\uBC84\uC804 \uD655\uC778", [`${signal(c, "ok")} \uBC84\uC804\uC774 \uC804\uBD80 \uC77C\uCE58\uD569\uB2C8\uB2E4.`], c);
71
71
  }
72
72
  const out = [];
73
73
  for (const m of result.mismatches) {
74
74
  out.push(`${signal(c, "warn")} ${m.kind}: ${t.emphasis(m.a)} / ${t.emphasis(m.b)}`);
75
75
  out.push(`${s.lastBranch} ${color.dim(m.hint)}`);
76
76
  }
77
- return card(`\uBC84\uC804 \uBD88\uC77C\uCE58 ${result.mismatches.length}\uAC74`, out, c);
77
+ return sectionBox(`\uBC84\uC804 \uBD88\uC77C\uCE58 ${result.mismatches.length}\uAC74`, out, c);
78
78
  }
79
79
  async function runVersionCheck(opts) {
80
80
  const projectRoot = resolveProjectRoot();
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  computeDurationMs
3
- } from "./chunk-OPPRCJT2.js";
3
+ } from "./chunk-OSKS2YRU.js";
4
4
  import {
5
5
  computeCoverage,
6
6
  readRecords
7
- } from "./chunk-6DXZYTDA.js";
7
+ } from "./chunk-JXFQHNHV.js";
8
8
  import {
9
9
  loadState
10
- } from "./chunk-XD4IDIEM.js";
10
+ } from "./chunk-UB4RLTLJ.js";
11
11
  import {
12
12
  requireConfig
13
- } from "./chunk-B6AEYNF3.js";
13
+ } from "./chunk-CLWQEWEG.js";
14
14
  import {
15
15
  caps,
16
16
  generationsDir,
@@ -19,7 +19,7 @@ import {
19
19
  lockFile,
20
20
  makeColors,
21
21
  signal
22
- } from "./chunk-YODF2HTK.js";
22
+ } from "./chunk-M4H4VNN6.js";
23
23
 
24
24
  // src/commands/evolve.ts
25
25
  import fs from "fs";
@@ -1,27 +1,27 @@
1
1
  import {
2
2
  WORKTREES_DIR
3
- } from "./chunk-AMQFBJCO.js";
3
+ } from "./chunk-H4EMS47F.js";
4
4
  import {
5
5
  readRecords
6
- } from "./chunk-6DXZYTDA.js";
6
+ } from "./chunk-JXFQHNHV.js";
7
7
  import {
8
8
  loadState
9
- } from "./chunk-XD4IDIEM.js";
9
+ } from "./chunk-UB4RLTLJ.js";
10
10
  import {
11
11
  resolveProjectRoot,
12
12
  run
13
- } from "./chunk-B6AEYNF3.js";
13
+ } from "./chunk-CLWQEWEG.js";
14
14
  import {
15
15
  caps,
16
- card,
17
16
  makeColors,
18
17
  makeSymbols,
19
18
  makeTokens,
20
19
  padEndDisplay,
20
+ sectionBox,
21
21
  signal,
22
22
  statusBadge,
23
23
  stringWidth
24
- } from "./chunk-YODF2HTK.js";
24
+ } from "./chunk-M4H4VNN6.js";
25
25
 
26
26
  // src/commands/status.ts
27
27
  import fs2 from "fs";
@@ -240,7 +240,7 @@ function renderStatus(report, c) {
240
240
  const t = makeTokens(c);
241
241
  const s = makeSymbols(c);
242
242
  if (report.phase === null && report.criteria.total === 0 && report.records.total === 0) {
243
- return card(
243
+ return sectionBox(
244
244
  "\uC9C4\uD589 \uC0C1\uD669",
245
245
  [
246
246
  `${signal(c, "info")} \uC544\uC9C1 \uC2DC\uC791 \uC804\uC785\uB2C8\uB2E4.`,
@@ -285,7 +285,7 @@ function renderStatus(report, c) {
285
285
  ` ${s.lastBranch} \uAC8C\uC774\uD2B8 ${g.gate} ${decisionColored(t, g.decision ?? "")}${autoTag} ${when} ${color.dim(summary)}`
286
286
  );
287
287
  }
288
- return card(`\uC9C4\uD589 \uC0C1\uD669 \xB7 ${report.generation}\uC138\uB300`, out, c);
288
+ return sectionBox(`\uC9C4\uD589 \uC0C1\uD669 \xB7 ${report.generation}\uC138\uB300`, out, c);
289
289
  }
290
290
  function markerBaseName(f) {
291
291
  return f.replace(/\.md$/, "").replace(/\.(taken|hold|pass)$/, "");
@@ -382,7 +382,7 @@ function renderPipelineGroups(groups, c) {
382
382
  out.push(` ${statusBadge(c, w.status)} ${padEndDisplay(w.name, nameWidth)}${w.status}`);
383
383
  }
384
384
  });
385
- return card(`\uD30C\uC774\uD504\uB77C\uC778 ${groups.length}\uAC1C \uB808\uC778`, out, c);
385
+ return sectionBox(`\uD30C\uC774\uD504\uB77C\uC778 ${groups.length}\uAC1C \uB808\uC778`, out, c);
386
386
  }
387
387
  async function runStatus(opts) {
388
388
  const root = resolveProjectRoot();
@@ -5,22 +5,22 @@ import {
5
5
  runWorkNew,
6
6
  sanitizeForGit,
7
7
  worktreeDirtyTracked
8
- } from "./chunk-PUI2B27T.js";
8
+ } from "./chunk-PFXDX4JF.js";
9
9
  import {
10
10
  loadState,
11
11
  writeState
12
- } from "./chunk-XD4IDIEM.js";
12
+ } from "./chunk-UB4RLTLJ.js";
13
13
  import {
14
14
  resolveProjectRoot,
15
15
  run
16
- } from "./chunk-B6AEYNF3.js";
16
+ } from "./chunk-CLWQEWEG.js";
17
17
  import {
18
18
  caps,
19
- card,
20
19
  feedback,
21
20
  makeColors,
21
+ sectionBox,
22
22
  signal
23
- } from "./chunk-YODF2HTK.js";
23
+ } from "./chunk-M4H4VNN6.js";
24
24
 
25
25
  // src/commands/lane.ts
26
26
  import fs from "fs";
@@ -168,7 +168,7 @@ async function collectLanes(root) {
168
168
  function renderLaneList(lanes, c) {
169
169
  const color = makeColors(c.color);
170
170
  if (lanes.length === 0) {
171
- return card(
171
+ return sectionBox(
172
172
  "\uB808\uC778",
173
173
  [
174
174
  `${signal(c, "info")} \uB808\uC778\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.`,
@@ -184,7 +184,7 @@ function renderLaneList(lanes, c) {
184
184
  out.push(`${color.bold(l.name.padEnd(nameWidth, " "))}${color.dim(l.branch)}`);
185
185
  out.push(` ${color.dim(l.path)}`);
186
186
  }
187
- return card("\uB808\uC778", out, c);
187
+ return sectionBox("\uB808\uC778", out, c);
188
188
  }
189
189
  async function runLaneList(opts) {
190
190
  const root = requireRoot();
@@ -1,25 +1,24 @@
1
1
  import {
2
2
  gatherVersionInputs
3
- } from "./chunk-JDCW2Y2G.js";
3
+ } from "./chunk-DGPZEEFJ.js";
4
4
  import {
5
5
  checkVersions
6
- } from "./chunk-F34MITMC.js";
6
+ } from "./chunk-MCNUMMKK.js";
7
7
  import {
8
8
  loadProjectName,
9
9
  readRecords
10
- } from "./chunk-6DXZYTDA.js";
10
+ } from "./chunk-JXFQHNHV.js";
11
11
  import {
12
12
  loadState,
13
13
  readStateLock
14
- } from "./chunk-XD4IDIEM.js";
14
+ } from "./chunk-UB4RLTLJ.js";
15
15
  import {
16
16
  CommandNotFoundError,
17
17
  run,
18
18
  tokenize
19
- } from "./chunk-B6AEYNF3.js";
19
+ } from "./chunk-CLWQEWEG.js";
20
20
  import {
21
21
  caps,
22
- card,
23
22
  clipToWidth,
24
23
  findProjectRoot,
25
24
  globalRoot,
@@ -30,9 +29,10 @@ import {
30
29
  makeTokens,
31
30
  projectsFile,
32
31
  rulesDir,
32
+ sectionBox,
33
33
  signal,
34
34
  visibleWidth
35
- } from "./chunk-YODF2HTK.js";
35
+ } from "./chunk-M4H4VNN6.js";
36
36
 
37
37
  // src/commands/doctor.ts
38
38
  import fs from "fs";
@@ -744,7 +744,7 @@ function renderText(report, c) {
744
744
  const action = problems.some((p) => (p.hint ?? "").includes("init")) ? "awl init \uC744 \uC2E4\uD589\uD558\uC138\uC694." : "\uC704 \uC548\uB0B4\uB97C \uD655\uC778\uD558\uC138\uC694.";
745
745
  lines.push(`${signal(c, "error")} ${color.red(`\uBB38\uC81C ${problems.length}\uAC1C.`)} ${action}`);
746
746
  }
747
- return card("Agent Work Loop \xB7 \uC9C4\uB2E8", lines, c);
747
+ return sectionBox("Agent Work Loop \xB7 \uC9C4\uB2E8", lines, c);
748
748
  }
749
749
  async function runDoctor(opts) {
750
750
  const report = await collectChecks();
@@ -2,18 +2,18 @@ import {
2
2
  getCriterion,
3
3
  loadState,
4
4
  writeState
5
- } from "./chunk-XD4IDIEM.js";
5
+ } from "./chunk-UB4RLTLJ.js";
6
6
  import {
7
7
  resolveProjectRoot,
8
8
  run
9
- } from "./chunk-B6AEYNF3.js";
9
+ } from "./chunk-CLWQEWEG.js";
10
10
  import {
11
11
  caps,
12
- card,
13
12
  makeColors,
14
13
  recordsDir,
14
+ sectionBox,
15
15
  signal
16
- } from "./chunk-YODF2HTK.js";
16
+ } from "./chunk-M4H4VNN6.js";
17
17
 
18
18
  // src/commands/record.ts
19
19
  import crypto from "crypto";
@@ -468,7 +468,7 @@ function summaryOf(r) {
468
468
  function renderRecords(records, c) {
469
469
  const color = makeColors(c.color);
470
470
  if (records.length === 0) {
471
- return card("\uAE30\uB85D", ["\uAE30\uB85D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."], c);
471
+ return sectionBox("\uAE30\uB85D", ["\uAE30\uB85D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."], c);
472
472
  }
473
473
  const out = [];
474
474
  for (const r of records) {
@@ -479,7 +479,7 @@ function renderRecords(records, c) {
479
479
  }
480
480
  out.push("");
481
481
  out.push(color.dim("\uC0C1\uC138\uB294 awl records --json \uB610\uB294 ~/.awl/records/ \uB97C \uBCF4\uC138\uC694."));
482
- return card(`\uAE30\uB85D ${records.length}\uAC1C \xB7 \uCD5C\uADFC\uC21C`, out, c);
482
+ return sectionBox(`\uAE30\uB85D ${records.length}\uAC1C \xB7 \uCD5C\uADFC\uC21C`, out, c);
483
483
  }
484
484
  async function runRecord(type, opts) {
485
485
  if (!RECORD_TYPES.includes(type)) {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  run
3
- } from "./chunk-B6AEYNF3.js";
3
+ } from "./chunk-CLWQEWEG.js";
4
4
 
5
5
  // src/core/protected-files.ts
6
6
  async function changedProtectedFiles(projectRoot, protectedFiles) {
@@ -2,14 +2,14 @@ import {
2
2
  acquireLock,
3
3
  loadGotchaList,
4
4
  releaseLock
5
- } from "./chunk-SQFGUNTY.js";
5
+ } from "./chunk-DR7OZZ4N.js";
6
6
  import {
7
7
  caps,
8
- card,
9
8
  makeColors,
10
9
  rulesDir,
10
+ sectionBox,
11
11
  signal
12
- } from "./chunk-YODF2HTK.js";
12
+ } from "./chunk-M4H4VNN6.js";
13
13
 
14
14
  // src/commands/rules.ts
15
15
  import { spawnSync } from "child_process";
@@ -100,14 +100,14 @@ function renderRules(rules, warnings, c) {
100
100
  out.push("\uC801\uC6A9\uB418\uB294 \uADDC\uCE59\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.");
101
101
  out.push("");
102
102
  out.push(color.dim("\uADDC\uCE59\uC740 \uC791\uC5C5\uD558\uB2E4 \uAC19\uC740 \uC2E4\uD328\uB97C \uB450 \uBC88 \uD560 \uB54C \uC313\uC785\uB2C8\uB2E4."));
103
- return card("\uADDC\uCE59", out, c);
103
+ return sectionBox("\uADDC\uCE59", out, c);
104
104
  }
105
105
  for (const r of rules) {
106
106
  const scope = r.scope ? color.dim(`[${r.scope}]`) : color.dim("[\uBC94\uC6A9]");
107
107
  out.push(`${color.bold(r.id)} ${scope}`);
108
108
  out.push(` ${r.body.split("\n")[0] ?? ""}`);
109
109
  }
110
- return card(`\uADDC\uCE59 ${rules.length}\uAC1C`, out, c);
110
+ return sectionBox(`\uADDC\uCE59 ${rules.length}\uAC1C`, out, c);
111
111
  }
112
112
  function runRules(opts) {
113
113
  if (opts.edit) {
@@ -390,31 +390,6 @@ function viewportWidth() {
390
390
  }
391
391
  return HARD_MAX_WIDTH;
392
392
  }
393
- function card(title, lines, c = caps(), minInnerWidth = 0) {
394
- const s = makeSymbols(c);
395
- const t = makeTokens(c);
396
- const pad = 2;
397
- const maxInner = Math.max(
398
- minInnerWidth,
399
- Math.min(HARD_MAX_WIDTH, viewportWidth() - (2 + pad * 2))
400
- );
401
- const wrapped = lines.flatMap((line) => wrapToWidth(line, maxInner, { hanging: true }));
402
- const inner = Math.min(
403
- maxInner,
404
- Math.max(minInnerWidth, visibleWidth(title), ...wrapped.map(visibleWidth), 0)
405
- );
406
- const frame = (text) => t.frame(text);
407
- const row = (text) => {
408
- const gap = Math.max(0, inner - visibleWidth(text));
409
- return `${frame(s.boxV)}${" ".repeat(pad)}${text}${" ".repeat(gap + pad)}${frame(s.boxV)}`;
410
- };
411
- const safeTitle = truncateToWidth(title, inner);
412
- const tvis = visibleWidth(safeTitle);
413
- const dash = Math.max(1, inner + pad * 2 - 3 - tvis);
414
- const top = frame(`${s.boxTL}${s.boxH} `) + t.emphasis(t.accent(safeTitle)) + frame(` ${s.boxH.repeat(dash)}${s.boxTR}`);
415
- const bottom = frame(`${s.boxBL}${s.boxH.repeat(inner + pad * 2)}${s.boxBR}`);
416
- return [top, ...wrapped.map(row), bottom].join("\n");
417
- }
418
393
  function sectionBox(title, lines, c = caps(), minInnerWidth = 0) {
419
394
  const s = makeSymbols(c);
420
395
  const t = makeTokens(c);
@@ -536,7 +511,6 @@ export {
536
511
  clipToWidth,
537
512
  padEndDisplay,
538
513
  makeSymbols,
539
- card,
540
514
  sectionBox,
541
515
  makeTokens,
542
516
  signal,
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  npmVersionCachePath
3
- } from "./chunk-YODF2HTK.js";
3
+ } from "./chunk-M4H4VNN6.js";
4
4
 
5
5
  // package.json
6
6
  var name = "agent-work-loop";
7
- var version = "0.6.26";
7
+ var version = "0.6.27";
8
8
 
9
9
  // src/core/npm-registry.ts
10
10
  import fs from "fs";
@@ -1,26 +1,26 @@
1
1
  import {
2
2
  protectedFilesMessage
3
- } from "./chunk-FQLRA2YC.js";
3
+ } from "./chunk-KJG2ULS4.js";
4
4
  import {
5
5
  gitDirtyFiles
6
- } from "./chunk-NXH5EBBJ.js";
6
+ } from "./chunk-J7EKKHVW.js";
7
7
  import {
8
8
  applyVerificationAttempts,
9
9
  loadState,
10
10
  writeState
11
- } from "./chunk-XD4IDIEM.js";
11
+ } from "./chunk-UB4RLTLJ.js";
12
12
  import {
13
13
  CommandNotFoundError,
14
14
  VERIFY_ORDER,
15
15
  requireConfig,
16
16
  run
17
- } from "./chunk-B6AEYNF3.js";
17
+ } from "./chunk-CLWQEWEG.js";
18
18
  import {
19
19
  caps,
20
- card,
21
20
  makeColors,
21
+ sectionBox,
22
22
  signal
23
- } from "./chunk-YODF2HTK.js";
23
+ } from "./chunk-M4H4VNN6.js";
24
24
 
25
25
  // src/commands/verify.ts
26
26
  import fs from "fs";
@@ -102,7 +102,7 @@ function renderVerify(report, c) {
102
102
  out.push(
103
103
  report.passed ? `${signal(c, "ok")} \uC804\uBD80 \uD1B5\uACFC\uD588\uC2B5\uB2C8\uB2E4.` : `${signal(c, "error")} \uC2E4\uD328\uD55C \uAC80\uC99D\uC774 \uC788\uC2B5\uB2C8\uB2E4.`
104
104
  );
105
- return card("\uAC80\uC99D \uACB0\uACFC", out, c);
105
+ return sectionBox("\uAC80\uC99D \uACB0\uACFC", out, c);
106
106
  }
107
107
  function isCheckPassed(r) {
108
108
  return !r.error && !r.timedOut && r.exitCode === 0;
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  requireConfig
3
- } from "./chunk-B6AEYNF3.js";
3
+ } from "./chunk-CLWQEWEG.js";
4
4
  import {
5
5
  caps,
6
- card,
7
6
  generationsDir,
8
7
  makeColors,
9
8
  padEndDisplay,
9
+ sectionBox,
10
10
  stringWidth
11
- } from "./chunk-YODF2HTK.js";
11
+ } from "./chunk-M4H4VNN6.js";
12
12
 
13
13
  // src/commands/metrics.ts
14
14
  import fs from "fs";
@@ -78,7 +78,7 @@ function renderMetrics(generations, c) {
78
78
  const color = makeColors(c.color);
79
79
  const caveat = color.dim(renderMetricsCaveat());
80
80
  if (generations.length === 0) {
81
- return card("\uC138\uB300 \uC9C0\uD45C", ["\uC138\uB300 \uAE30\uB85D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.", "", caveat], c);
81
+ return sectionBox("\uC138\uB300 \uC9C0\uD45C", ["\uC138\uB300 \uAE30\uB85D\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.", "", caveat], c);
82
82
  }
83
83
  const idWidth = Math.max(...generations.map((g) => g.workitem.length), 9) + 2;
84
84
  const out = [];
@@ -93,7 +93,7 @@ function renderMetrics(generations, c) {
93
93
  }
94
94
  out.push("");
95
95
  out.push(caveat);
96
- return card(`\uC138\uB300 ${generations.length}\uAC1C \xB7 \uC2DC\uAC04\uC21C`, out, c);
96
+ return sectionBox(`\uC138\uB300 ${generations.length}\uAC1C \xB7 \uC2DC\uAC04\uC21C`, out, c);
97
97
  }
98
98
  var str = (v) => typeof v === "string" && v !== "" ? v : "?";
99
99
  var round2 = (n) => Math.round(n * 100) / 100;
@@ -145,7 +145,7 @@ function renderCompare(groups, untagged, c) {
145
145
  const color = makeColors(c.color);
146
146
  const caveat = color.dim(renderMetricsCaveat());
147
147
  if (groups.length === 0) {
148
- return card(
148
+ return sectionBox(
149
149
  "\uCF00\uC774\uC2A4 \uBE44\uAD50",
150
150
  [`experiment \uD0DC\uADF8\uAC00 \uC788\uB294 \uC138\uB300\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4(\uD0DC\uADF8 \uC5C6\uB294 \uC138\uB300 ${untagged}\uAC1C).`, "", caveat],
151
151
  c
@@ -166,7 +166,7 @@ function renderCompare(groups, untagged, c) {
166
166
  }
167
167
  out.push("");
168
168
  out.push(caveat);
169
- return card(`\uCF00\uC774\uC2A4 ${groups.length}\uAC1C \uBE44\uAD50`, out, c);
169
+ return sectionBox(`\uCF00\uC774\uC2A4 ${groups.length}\uAC1C \uBE44\uAD50`, out, c);
170
170
  }
171
171
  function runMetrics(opts) {
172
172
  const { config } = requireConfig();
@@ -7,39 +7,39 @@ import {
7
7
  isCheckPassed,
8
8
  runVerifyChecks,
9
9
  writeVerifyBaseline
10
- } from "./chunk-XQ7JJXBY.js";
10
+ } from "./chunk-MLD2GOVM.js";
11
11
  import {
12
12
  gitBranch
13
- } from "./chunk-NXH5EBBJ.js";
13
+ } from "./chunk-J7EKKHVW.js";
14
14
  import {
15
15
  parseRuleFile
16
- } from "./chunk-PLHEP5QE.js";
16
+ } from "./chunk-KNBSZQGN.js";
17
17
  import {
18
18
  nextGotchaId
19
- } from "./chunk-SQFGUNTY.js";
19
+ } from "./chunk-DR7OZZ4N.js";
20
20
  import {
21
21
  loadState,
22
22
  migrateState,
23
23
  writeState
24
- } from "./chunk-XD4IDIEM.js";
24
+ } from "./chunk-UB4RLTLJ.js";
25
25
  import {
26
26
  loadConfig,
27
27
  resolveProjectRoot,
28
28
  run
29
- } from "./chunk-B6AEYNF3.js";
29
+ } from "./chunk-CLWQEWEG.js";
30
30
  import {
31
31
  installClaudeSkill
32
- } from "./chunk-2YWYGWCZ.js";
32
+ } from "./chunk-PIOV3MQT.js";
33
33
  import {
34
34
  caps,
35
- card,
36
35
  feedback,
37
36
  globalRoot,
38
37
  makeColors,
39
38
  makeSymbols,
40
39
  makeTokens,
40
+ sectionBox,
41
41
  signal
42
- } from "./chunk-YODF2HTK.js";
42
+ } from "./chunk-M4H4VNN6.js";
43
43
 
44
44
  // src/commands/work.ts
45
45
  import fs2 from "fs";
@@ -299,7 +299,7 @@ function renderWorkList(list, c) {
299
299
  const t = makeTokens(c);
300
300
  const s = makeSymbols(c);
301
301
  if (list.length === 0) {
302
- return card(
302
+ return sectionBox(
303
303
  "\uC6CC\uD06C\uC544\uC774\uD15C",
304
304
  [
305
305
  `${signal(c, "info")} \uB4F1\uB85D\uB41C \uC6CC\uD06C\uC544\uC774\uD15C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.`,
@@ -324,7 +324,7 @@ function renderWorkList(list, c) {
324
324
  out.push(` ${s.lastBranch} ${color.dim(`worktree: ${w.worktreePath}`)}`);
325
325
  }
326
326
  }
327
- return card("\uC6CC\uD06C\uC544\uC774\uD15C", out, c);
327
+ return sectionBox("\uC6CC\uD06C\uC544\uC774\uD15C", out, c);
328
328
  }
329
329
  function registryOf(state) {
330
330
  return state.workitems && typeof state.workitems === "object" ? state.workitems : {};
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  caps,
3
- card,
4
3
  engineDir,
5
4
  globalRoot,
6
5
  installedEngineVersion,
@@ -13,7 +12,7 @@ import {
13
12
  sectionBox,
14
13
  signal,
15
14
  stringWidth
16
- } from "./chunk-YODF2HTK.js";
15
+ } from "./chunk-M4H4VNN6.js";
17
16
 
18
17
  // src/commands/init.ts
19
18
  import fs from "fs";
@@ -1019,7 +1018,7 @@ async function handleExistingConfig(rl, projectRoot, c, now) {
1019
1018
  process.stdout.write(" \uC774 \uC124\uC815\uC744 \uADF8\uB300\uB85C \uC4F0\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?\n\n");
1020
1019
  const options = ["\uADF8\uB300\uB85C \uC4F4\uB2E4", "\uAC80\uC99D \uBA85\uB839\uC5B4\uB9CC \uACE0\uCE5C\uB2E4", "\uCC98\uC74C\uBD80\uD130 \uB2E4\uC2DC"];
1021
1020
  process.stdout.write(
1022
- `${card(
1021
+ `${sectionBox(
1023
1022
  "\uAE30\uC874 \uC124\uC815",
1024
1023
  options.map((option, i) => `${i + 1}. ${option}`),
1025
1024
  c