agent-work-loop 0.6.26 → 0.6.30

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 (47) hide show
  1. package/README.md +28 -0
  2. package/dist/{brief-JIXESFMO.js → brief-O6IGLOPY.js} +5 -5
  3. package/dist/{changelog-PBF6JBOC.js → changelog-4XKSWJX2.js} +5 -5
  4. package/dist/{chunk-PUI2B27T.js → chunk-3CR74VLL.js} +111 -14
  5. package/dist/{chunk-YODF2HTK.js → chunk-45X7T64Y.js} +12 -37
  6. package/dist/{chunk-F34MITMC.js → chunk-7WDDWO2B.js} +3 -3
  7. package/dist/{chunk-XD4IDIEM.js → chunk-7WE2E76P.js} +6 -6
  8. package/dist/{chunk-2YWYGWCZ.js → chunk-AYFHV27J.js} +70 -32
  9. package/dist/{chunk-JDCW2Y2G.js → chunk-FJKJTXN4.js} +7 -7
  10. package/dist/{chunk-NXH5EBBJ.js → chunk-FOTWJOWF.js} +8 -8
  11. package/dist/{chunk-OPPRCJT2.js → chunk-FUP7DKT3.js} +7 -7
  12. package/dist/{chunk-AMQFBJCO.js → chunk-IEFYCUWX.js} +18 -8
  13. package/dist/{chunk-SQFGUNTY.js → chunk-ILXQGAUE.js} +5 -5
  14. package/dist/{chunk-KEVDO3C3.js → chunk-R4LFOY5M.js} +9 -9
  15. package/dist/{chunk-B6AEYNF3.js → chunk-RAMHRXFX.js} +40 -23
  16. package/dist/{chunk-PLHEP5QE.js → chunk-RXG6BUQ6.js} +5 -5
  17. package/dist/{chunk-6DXZYTDA.js → chunk-TTLFDLK6.js} +6 -6
  18. package/dist/{chunk-XQ7JJXBY.js → chunk-VX23A4FW.js} +7 -7
  19. package/dist/{chunk-FQLRA2YC.js → chunk-WZCIAGNJ.js} +1 -1
  20. package/dist/cli.js +61 -53
  21. package/dist/{commit-OUZNLCNL.js → commit-2UFIIERX.js} +6 -6
  22. package/dist/{config-26FHYODU.js → config-D7LUIZYA.js} +3 -3
  23. package/dist/{doctor-UHUA6ULF.js → doctor-IAK57PIS.js} +8 -8
  24. package/dist/{evolve-V5BQCSHC.js → evolve-RMKOBGSK.js} +7 -7
  25. package/dist/{feedback-UJ7WSARN.js → feedback-RT63F57C.js} +8 -8
  26. package/dist/{gotchas-L3NXDDDI.js → gotchas-DM7BXF77.js} +11 -11
  27. package/dist/{hold-recheck-QINLKCPM.js → hold-recheck-I6JMGTP6.js} +18 -18
  28. package/dist/{init-6R4MT6FQ.js → init-XUJTEY2Y.js} +6 -2
  29. package/dist/lane-OZ5WGGDT.js +41 -0
  30. package/dist/{loop-summary-FVJICIWA.js → loop-summary-7HMFHKUD.js} +10 -10
  31. package/dist/{metrics-NVJFKQ4J.js → metrics-F3YDMURU.js} +4 -4
  32. package/dist/{record-JJJSGU5E.js → record-ZNGMMZHF.js} +5 -5
  33. package/dist/{review-I4QMZPTI.js → review-R5I4KYFN.js} +16 -16
  34. package/dist/{rules-OTUONMXO.js → rules-GVDXKROQ.js} +8 -8
  35. package/dist/{state-UC45ECTI.js → state-B45D6VSF.js} +4 -4
  36. package/dist/status-7SBNSHTV.js +40 -0
  37. package/dist/{uninstall-HHKLOXF5.js → uninstall-Q6KJYH5E.js} +17 -17
  38. package/dist/update-WHHGVXIY.js +135 -0
  39. package/dist/{verify-A64P77RU.js → verify-ZBDWID5U.js} +10 -10
  40. package/dist/version-check-3NVRLYUF.js +14 -0
  41. package/dist/{work-LMM5W2PQ.js → work-EVYCDIPE.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/update-BXRWE7OH.js +0 -61
  47. package/dist/version-check-UBXBVPTS.js +0 -14
@@ -1,25 +1,24 @@
1
1
  import {
2
2
  gatherVersionInputs
3
- } from "./chunk-JDCW2Y2G.js";
3
+ } from "./chunk-FJKJTXN4.js";
4
4
  import {
5
5
  checkVersions
6
- } from "./chunk-F34MITMC.js";
6
+ } from "./chunk-7WDDWO2B.js";
7
7
  import {
8
8
  loadProjectName,
9
9
  readRecords
10
- } from "./chunk-6DXZYTDA.js";
10
+ } from "./chunk-TTLFDLK6.js";
11
11
  import {
12
12
  loadState,
13
13
  readStateLock
14
- } from "./chunk-XD4IDIEM.js";
14
+ } from "./chunk-7WE2E76P.js";
15
15
  import {
16
16
  CommandNotFoundError,
17
17
  run,
18
18
  tokenize
19
- } from "./chunk-B6AEYNF3.js";
19
+ } from "./chunk-RAMHRXFX.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-45X7T64Y.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();
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  requireConfig
3
- } from "./chunk-B6AEYNF3.js";
3
+ } from "./chunk-RAMHRXFX.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-45X7T64Y.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();
@@ -5,22 +5,25 @@ import {
5
5
  runWorkNew,
6
6
  sanitizeForGit,
7
7
  worktreeDirtyTracked
8
- } from "./chunk-PUI2B27T.js";
8
+ } from "./chunk-3CR74VLL.js";
9
+ import {
10
+ loadProjectName
11
+ } from "./chunk-TTLFDLK6.js";
9
12
  import {
10
13
  loadState,
11
14
  writeState
12
- } from "./chunk-XD4IDIEM.js";
15
+ } from "./chunk-7WE2E76P.js";
13
16
  import {
14
17
  resolveProjectRoot,
15
18
  run
16
- } from "./chunk-B6AEYNF3.js";
19
+ } from "./chunk-RAMHRXFX.js";
17
20
  import {
18
21
  caps,
19
- card,
20
22
  feedback,
21
23
  makeColors,
24
+ sectionBox,
22
25
  signal
23
- } from "./chunk-YODF2HTK.js";
26
+ } from "./chunk-45X7T64Y.js";
24
27
 
25
28
  // src/commands/lane.ts
26
29
  import fs from "fs";
@@ -168,7 +171,7 @@ async function collectLanes(root) {
168
171
  function renderLaneList(lanes, c) {
169
172
  const color = makeColors(c.color);
170
173
  if (lanes.length === 0) {
171
- return card(
174
+ return sectionBox(
172
175
  "\uB808\uC778",
173
176
  [
174
177
  `${signal(c, "info")} \uB808\uC778\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.`,
@@ -184,7 +187,7 @@ function renderLaneList(lanes, c) {
184
187
  out.push(`${color.bold(l.name.padEnd(nameWidth, " "))}${color.dim(l.branch)}`);
185
188
  out.push(` ${color.dim(l.path)}`);
186
189
  }
187
- return card("\uB808\uC778", out, c);
190
+ return sectionBox("\uB808\uC778", out, c);
188
191
  }
189
192
  async function runLaneList(opts) {
190
193
  const root = requireRoot();
@@ -258,7 +261,8 @@ ${feedback(c, "error", `\uB808\uC778 \uBE0C\uB79C\uCE58 ${branch} \uC5D0 \uBCD1\
258
261
  }
259
262
  let merged = null;
260
263
  try {
261
- merged = mergeIsolatedHome(path.join(lanePath, ".awl", "home"));
264
+ const project = loadProjectName(root) ?? path.basename(root);
265
+ merged = mergeIsolatedHome(path.join(lanePath, ".awl", "home"), { project, lane: laneName });
262
266
  } catch (e) {
263
267
  process.stderr.write(
264
268
  `
@@ -287,6 +291,12 @@ ${feedback(c, "ok", `\uB808\uC778 \uC81C\uAC70 ${color.bold(laneName)}`, branch
287
291
  if (merged && (merged.gotchasAdded > 0 || merged.rulesAdded > 0 || merged.generationsAdded > 0)) {
288
292
  process.stdout.write(
289
293
  ` ${color.dim(`\uD559\uC2B5 \uC804\uC5ED \uBCD1\uD569 gotcha ${merged.gotchasAdded} \xB7 rule ${merged.rulesAdded} \xB7 generation ${merged.generationsAdded}`)}
294
+ `
295
+ );
296
+ }
297
+ if (merged && merged.recordsMerged > 0) {
298
+ process.stdout.write(
299
+ ` ${color.dim(`records \uC804\uC5ED \uBCD1\uD569 ${merged.recordsMerged}\uAC74${merged.recordsArchivePath ? ` \xB7 \uC544\uCE74\uC774\uBE0C ${merged.recordsArchivePath}` : ""}`)}
290
300
  `
291
301
  );
292
302
  }
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  computeDurationMs
3
- } from "./chunk-OPPRCJT2.js";
3
+ } from "./chunk-FUP7DKT3.js";
4
4
  import {
5
5
  computeCoverage,
6
6
  readRecords
7
- } from "./chunk-6DXZYTDA.js";
7
+ } from "./chunk-TTLFDLK6.js";
8
8
  import {
9
9
  loadState
10
- } from "./chunk-XD4IDIEM.js";
10
+ } from "./chunk-7WE2E76P.js";
11
11
  import {
12
12
  requireConfig
13
- } from "./chunk-B6AEYNF3.js";
13
+ } from "./chunk-RAMHRXFX.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-45X7T64Y.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-IEFYCUWX.js";
4
4
  import {
5
5
  readRecords
6
- } from "./chunk-6DXZYTDA.js";
6
+ } from "./chunk-TTLFDLK6.js";
7
7
  import {
8
8
  loadState
9
- } from "./chunk-XD4IDIEM.js";
9
+ } from "./chunk-7WE2E76P.js";
10
10
  import {
11
11
  resolveProjectRoot,
12
12
  run
13
- } from "./chunk-B6AEYNF3.js";
13
+ } from "./chunk-RAMHRXFX.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-45X7T64Y.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();
@@ -3,16 +3,17 @@ import {
3
3
  LANG_VALUES,
4
4
  ask,
5
5
  buildScreens,
6
- promptNumber
7
- } from "./chunk-2YWYGWCZ.js";
6
+ promptNumber,
7
+ selectMulti
8
+ } from "./chunk-AYFHV27J.js";
8
9
  import {
9
10
  caps,
10
- card,
11
11
  findProjectRoot,
12
12
  makeColors,
13
13
  makeSymbols,
14
+ sectionBox,
14
15
  signal
15
- } from "./chunk-YODF2HTK.js";
16
+ } from "./chunk-45X7T64Y.js";
16
17
 
17
18
  // src/commands/config.ts
18
19
  import fs from "fs";
@@ -204,7 +205,7 @@ function loadConfig(projectRoot) {
204
205
  const rv = raw.verify;
205
206
  const config = {
206
207
  project: raw.project,
207
- mainLanguage: typeof raw.mainLanguage === "string" ? raw.mainLanguage : "",
208
+ mainLanguage: Array.isArray(raw.mainLanguage) ? raw.mainLanguage.filter((v) => typeof v === "string") : [],
208
209
  character: typeof raw.character === "string" ? raw.character : "",
209
210
  engineVersion: raw.engineVersion,
210
211
  ...typeof raw.namingConvention === "string" ? { namingConvention: raw.namingConvention } : {},
@@ -329,18 +330,19 @@ async function applyConfigValue(config, projectRoot, parsed, rawValue, opts) {
329
330
  return { ok: true, message: `project = ${v2}` };
330
331
  }
331
332
  if (parsed.kind === "mainLanguage") {
332
- const v2 = rawValue.trim();
333
- if (v2 === "") {
333
+ const values = rawValue.split(",").map((s) => s.trim()).filter(Boolean);
334
+ if (values.length === 0) {
334
335
  return { ok: false, message: "mainLanguage \uB294 \uBE44\uC6B8 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4." };
335
336
  }
336
- config.mainLanguage = v2;
337
- if (!KNOWN_LANGUAGES.includes(v2)) {
337
+ config.mainLanguage = values;
338
+ const unknown = values.filter((v2) => !KNOWN_LANGUAGES.includes(v2));
339
+ if (unknown.length > 0) {
338
340
  return {
339
341
  ok: true,
340
- message: `mainLanguage = ${v2} (\uACBD\uACE0: \uC54C\uB824\uC9C4 \uAC12\uC774 \uC544\uB2D9\uB2C8\uB2E4 \u2014 ${KNOWN_LANGUAGES.join("/")})`
342
+ message: `mainLanguage = ${values.join(", ")} (\uACBD\uACE0: \uC54C\uB824\uC9C4 \uAC12\uC774 \uC544\uB2D9\uB2C8\uB2E4 \u2014 ${unknown.join(", ")} / \uC54C\uB824\uC9C4 \uAC12: ${KNOWN_LANGUAGES.join("/")})`
341
343
  };
342
344
  }
343
- return { ok: true, message: `mainLanguage = ${v2}` };
345
+ return { ok: true, message: `mainLanguage = ${values.join(", ")}` };
344
346
  }
345
347
  if (parsed.kind === "character") {
346
348
  config.character = rawValue;
@@ -460,7 +462,7 @@ function renderConfig(config, c) {
460
462
  const color = makeColors(c.color);
461
463
  const s = makeSymbols(c);
462
464
  const out = [];
463
- out.push(`${s.branch} \uC8FC \uC5B8\uC5B4 ${config.mainLanguage || "(\uC5C6\uC74C)"}`);
465
+ out.push(`${s.branch} \uC8FC \uC5B8\uC5B4 ${config.mainLanguage.join(", ") || "(\uC5C6\uC74C)"}`);
464
466
  out.push(`${s.branch} \uC131\uACA9 ${config.character || "(\uC5C6\uC74C)"}`);
465
467
  out.push(`${s.branch} \uC5D4\uC9C4 ${config.engineVersion}`);
466
468
  out.push("");
@@ -479,7 +481,7 @@ function renderConfig(config, c) {
479
481
  `${s.lastBranch} ${color.dim('\uBA85\uB839\uC744 \uBC14\uAFB8\uB824\uBA74: awl config set verify.lint.cmd "biome check ."')}`
480
482
  );
481
483
  out.push(` ${color.dim("\uC9C1\uC811 \uD3B8\uC9D1\uB3C4 \uB429\uB2C8\uB2E4: .awl/config.json")}`);
482
- return card(`${config.project} \uC124\uC815`, out, c);
484
+ return sectionBox(`${config.project} \uC124\uC815`, out, c);
483
485
  }
484
486
  function writeConfigFile(projectRoot, config) {
485
487
  const p = path.join(projectRoot, ".awl", "config.json");
@@ -513,19 +515,34 @@ ${screens.verify}
513
515
  async function editMainLanguage(rl, config, projectRoot, c) {
514
516
  const screens = buildScreens(projectRoot, true, c);
515
517
  process.stdout.write(`
516
- \uD604\uC7AC \uC124\uC815: ${config.mainLanguage || "(\uC5C6\uC74C)"}
518
+ \uD604\uC7AC \uC124\uC815: ${config.mainLanguage.join(", ") || "(\uC5C6\uC74C)"}
517
519
  `);
518
520
  process.stdout.write(`${screens.lang}
519
521
  `);
520
- const curIdx = LANG_VALUES.indexOf(config.mainLanguage);
521
- const idx = await promptNumber(rl, curIdx >= 0 ? curIdx : 0, LANG_OPTIONS.length);
522
- let value = LANG_VALUES[idx] ?? "";
523
- if (idx === LANG_OPTIONS.length - 1) {
524
- value = (await ask(rl, " \uC8FC \uC5B8\uC5B4\uB97C \uC785\uB825\uD558\uC138\uC694: ")).trim();
522
+ const curIndices = config.mainLanguage.map((lang) => LANG_VALUES.indexOf(lang)).filter((i) => i >= 0);
523
+ const checked = await selectMulti(
524
+ rl,
525
+ LANG_OPTIONS,
526
+ curIndices.length > 0 ? curIndices : [0],
527
+ c,
528
+ false,
529
+ "\uC8FC \uC5B8\uC5B4"
530
+ );
531
+ const manualIdx = LANG_OPTIONS.length - 1;
532
+ const values = checked.filter((i) => i !== manualIdx).map((i) => LANG_VALUES[i]).filter((v) => typeof v === "string" && v !== "");
533
+ if (checked.includes(manualIdx)) {
534
+ const typed = (await ask(rl, " \uC8FC \uC5B8\uC5B4\uB97C \uC785\uB825\uD558\uC138\uC694: ")).trim();
535
+ if (typed) {
536
+ values.push(typed);
537
+ }
525
538
  }
526
- const outcome = await applyConfigValue(config, projectRoot, { kind: "mainLanguage" }, value, {
527
- force: false
528
- });
539
+ const outcome = await applyConfigValue(
540
+ config,
541
+ projectRoot,
542
+ { kind: "mainLanguage" },
543
+ values.join(","),
544
+ { force: false }
545
+ );
529
546
  process.stdout.write(` ${outcome.message}
530
547
  `);
531
548
  }
@@ -621,7 +638,7 @@ function renderSettableKeys(config, c) {
621
638
  const color = makeColors(c.color);
622
639
  const currentOf = (key) => {
623
640
  if (key === "project") return config.project;
624
- if (key === "mainLanguage") return config.mainLanguage || "(\uC5C6\uC74C)";
641
+ if (key === "mainLanguage") return config.mainLanguage.join(", ") || "(\uC5C6\uC74C)";
625
642
  if (key === "character") return config.character || "(\uC5C6\uC74C)";
626
643
  const m = /^verify\.(typecheck|lint|test|e2e)\.(cmd|cwd|env)$/.exec(key);
627
644
  if (!m?.[1] || !m[2]) return "";
@@ -2,14 +2,14 @@ import {
2
2
  acquireLock,
3
3
  loadGotchaList,
4
4
  releaseLock
5
- } from "./chunk-SQFGUNTY.js";
5
+ } from "./chunk-ILXQGAUE.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-45X7T64Y.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) {
@@ -2,18 +2,18 @@ import {
2
2
  getCriterion,
3
3
  loadState,
4
4
  writeState
5
- } from "./chunk-XD4IDIEM.js";
5
+ } from "./chunk-7WE2E76P.js";
6
6
  import {
7
7
  resolveProjectRoot,
8
8
  run
9
- } from "./chunk-B6AEYNF3.js";
9
+ } from "./chunk-RAMHRXFX.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-45X7T64Y.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,26 +1,26 @@
1
1
  import {
2
2
  protectedFilesMessage
3
- } from "./chunk-FQLRA2YC.js";
3
+ } from "./chunk-WZCIAGNJ.js";
4
4
  import {
5
5
  gitDirtyFiles
6
- } from "./chunk-NXH5EBBJ.js";
6
+ } from "./chunk-FOTWJOWF.js";
7
7
  import {
8
8
  applyVerificationAttempts,
9
9
  loadState,
10
10
  writeState
11
- } from "./chunk-XD4IDIEM.js";
11
+ } from "./chunk-7WE2E76P.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-RAMHRXFX.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-45X7T64Y.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,6 +1,6 @@
1
1
  import {
2
2
  run
3
- } from "./chunk-B6AEYNF3.js";
3
+ } from "./chunk-RAMHRXFX.js";
4
4
 
5
5
  // src/core/protected-files.ts
6
6
  async function changedProtectedFiles(projectRoot, protectedFiles) {