agent-work-loop 0.6.41 → 0.6.43

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 (50) hide show
  1. package/dist/{brief-GQRHGJQN.js → brief-GOGJDLY7.js} +5 -5
  2. package/dist/{changelog-HZMH3RPD.js → changelog-NLYZTB44.js} +5 -5
  3. package/dist/{chunk-7TMAQRJS.js → chunk-7CPPZX6X.js} +1 -1
  4. package/dist/{chunk-FKBBGXGF.js → chunk-E6MULIMV.js} +5 -5
  5. package/dist/{chunk-NOU677FX.js → chunk-I3WXYD5C.js} +1 -1
  6. package/dist/{chunk-OWILAE4M.js → chunk-I5SS6HFR.js} +49 -35
  7. package/dist/{chunk-XBUKFMNN.js → chunk-I5WWLNA6.js} +37 -9
  8. package/dist/{chunk-2XQZQP7Z.js → chunk-JQV65R3M.js} +5 -5
  9. package/dist/{chunk-7D4T7HFK.js → chunk-JR6MKCC4.js} +126 -6
  10. package/dist/{chunk-OJ7YO3MY.js → chunk-MBEY33YA.js} +2 -2
  11. package/dist/{chunk-G6JX5EYW.js → chunk-OVLA5DET.js} +61 -8
  12. package/dist/{chunk-6F4VAVKF.js → chunk-QVP5DUND.js} +3 -3
  13. package/dist/{chunk-B76434VM.js → chunk-SKLSWS5J.js} +2 -2
  14. package/dist/{chunk-4ZLARTXS.js → chunk-SOUTYYY4.js} +47 -3
  15. package/dist/{chunk-HFRQCP26.js → chunk-TQUXHTN5.js} +4 -4
  16. package/dist/{chunk-UNANHUG3.js → chunk-UJ6CK5HC.js} +2 -2
  17. package/dist/{chunk-SUF5ISJM.js → chunk-UNAASSQ4.js} +3 -1
  18. package/dist/{chunk-CSBKWYFK.js → chunk-YC23SNVC.js} +5 -5
  19. package/dist/cli.js +40 -40
  20. package/dist/{commit-SU6CTBU3.js → commit-BKN3ZJI7.js} +6 -6
  21. package/dist/{config-Z4G5SBWJ.js → config-DX3WL2JT.js} +9 -3
  22. package/dist/{doctor-GHWUUAWV.js → doctor-TBRNCTDS.js} +8 -8
  23. package/dist/{evolve-SQJ5LIE4.js → evolve-EMGWWWY3.js} +7 -7
  24. package/dist/{feedback-TPITVUZL.js → feedback-ZAAM5VYL.js} +5 -5
  25. package/dist/{gotchas-UEZG3HVO.js → gotchas-6ZWHP5Z6.js} +7 -7
  26. package/dist/{hold-recheck-STHUHCOU.js → hold-recheck-K7DV64KW.js} +16 -16
  27. package/dist/{init-AVVD77XM.js → init-3X6NVQQW.js} +2 -2
  28. package/dist/lane-QPZE7KYI.js +41 -0
  29. package/dist/{loop-summary-L4UTUOPY.js → loop-summary-CD6EIAHZ.js} +49 -7
  30. package/dist/{metrics-SOYVRSNM.js → metrics-VVXCH6TR.js} +4 -4
  31. package/dist/{record-V6V5XPPA.js → record-AC7LPU36.js} +5 -5
  32. package/dist/{remove-6VQS4ST6.js → remove-C64QRELY.js} +15 -15
  33. package/dist/{review-42SXUBZE.js → review-VCVPT3P6.js} +13 -13
  34. package/dist/{rules-ASJFXFGG.js → rules-2DIFP7K2.js} +8 -8
  35. package/dist/{state-6TNG2EC5.js → state-UIHEGC5P.js} +4 -4
  36. package/dist/status-2PUVZCFI.js +40 -0
  37. package/dist/{update-3AYB3V4I.js → update-KCQWDQDF.js} +2 -2
  38. package/dist/{verify-ZVZCJ3LH.js → verify-Y36JFAA7.js} +10 -10
  39. package/dist/version-check-XLXT7NSG.js +14 -0
  40. package/dist/{work-TVUOH7GQ.js → work-HHTQTJZW.js} +14 -14
  41. package/engine/skills/claude/awl-loop/SKILL.md +16 -0
  42. package/engine/skills/claude/awl-loop/reference.md +4 -0
  43. package/engine/skills/claude/awl-pipeline/SKILL.md +74 -0
  44. package/engine/skills/claude/awl-pipeline-exec/SKILL.md +8 -1
  45. package/engine/skills/claude/awl-pipeline-review/SKILL.md +7 -1
  46. package/engine/version.json +1 -1
  47. package/package.json +1 -1
  48. package/dist/lane-JTE45KFF.js +0 -41
  49. package/dist/status-43UVJLVD.js +0 -40
  50. package/dist/version-check-OKCLT4BF.js +0 -14
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  loadProjectName,
3
3
  readRecords
4
- } from "./chunk-6F4VAVKF.js";
4
+ } from "./chunk-QVP5DUND.js";
5
5
  import {
6
6
  loadState
7
- } from "./chunk-UNANHUG3.js";
7
+ } from "./chunk-UJ6CK5HC.js";
8
8
  import {
9
9
  resolveProjectRoot,
10
10
  run
11
- } from "./chunk-7D4T7HFK.js";
12
- import "./chunk-7TMAQRJS.js";
13
- import "./chunk-SUF5ISJM.js";
11
+ } from "./chunk-JR6MKCC4.js";
12
+ import "./chunk-7CPPZX6X.js";
13
+ import "./chunk-UNAASSQ4.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-6F4VAVKF.js";
3
+ } from "./chunk-QVP5DUND.js";
4
4
  import {
5
5
  loadState
6
- } from "./chunk-UNANHUG3.js";
6
+ } from "./chunk-UJ6CK5HC.js";
7
7
  import {
8
8
  resolveProjectRoot
9
- } from "./chunk-7D4T7HFK.js";
10
- import "./chunk-7TMAQRJS.js";
9
+ } from "./chunk-JR6MKCC4.js";
10
+ import "./chunk-7CPPZX6X.js";
11
11
  import {
12
12
  caps,
13
13
  signal
14
- } from "./chunk-SUF5ISJM.js";
14
+ } from "./chunk-UNAASSQ4.js";
15
15
 
16
16
  // src/commands/changelog.ts
17
17
  function runChangelogDraft(opts) {
@@ -18,7 +18,7 @@ import {
18
18
  sectionBox,
19
19
  signal,
20
20
  stringWidth
21
- } from "./chunk-SUF5ISJM.js";
21
+ } from "./chunk-UNAASSQ4.js";
22
22
 
23
23
  // src/commands/init.ts
24
24
  import fs from "fs";
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  computeDurationMs
3
- } from "./chunk-4ZLARTXS.js";
3
+ } from "./chunk-SOUTYYY4.js";
4
4
  import {
5
5
  computeCoverage,
6
6
  readRecords
7
- } from "./chunk-6F4VAVKF.js";
7
+ } from "./chunk-QVP5DUND.js";
8
8
  import {
9
9
  loadState
10
- } from "./chunk-UNANHUG3.js";
10
+ } from "./chunk-UJ6CK5HC.js";
11
11
  import {
12
12
  requireConfig
13
- } from "./chunk-7D4T7HFK.js";
13
+ } from "./chunk-JR6MKCC4.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-SUF5ISJM.js";
22
+ } from "./chunk-UNAASSQ4.js";
23
23
 
24
24
  // src/commands/evolve.ts
25
25
  import fs from "fs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  run
3
- } from "./chunk-7D4T7HFK.js";
3
+ } from "./chunk-JR6MKCC4.js";
4
4
 
5
5
  // src/core/protected-files.ts
6
6
  async function changedProtectedFiles(projectRoot, protectedFiles) {
@@ -1,22 +1,25 @@
1
1
  import {
2
2
  gatherVersionInputs
3
- } from "./chunk-HFRQCP26.js";
3
+ } from "./chunk-TQUXHTN5.js";
4
4
  import {
5
5
  checkVersions
6
- } from "./chunk-B76434VM.js";
6
+ } from "./chunk-SKLSWS5J.js";
7
7
  import {
8
8
  loadProjectName,
9
9
  readRecords
10
- } from "./chunk-6F4VAVKF.js";
10
+ } from "./chunk-QVP5DUND.js";
11
11
  import {
12
12
  loadState,
13
13
  readStateLock
14
- } from "./chunk-UNANHUG3.js";
14
+ } from "./chunk-UJ6CK5HC.js";
15
15
  import {
16
16
  CommandNotFoundError,
17
17
  run,
18
18
  tokenize
19
- } from "./chunk-7D4T7HFK.js";
19
+ } from "./chunk-JR6MKCC4.js";
20
+ import {
21
+ listRegisteredProjects
22
+ } from "./chunk-7CPPZX6X.js";
20
23
  import {
21
24
  caps,
22
25
  clipToWidth,
@@ -32,7 +35,7 @@ import {
32
35
  sectionBox,
33
36
  signal,
34
37
  visibleWidth
35
- } from "./chunk-SUF5ISJM.js";
38
+ } from "./chunk-UNAASSQ4.js";
36
39
 
37
40
  // src/commands/doctor.ts
38
41
  import fs from "fs";
@@ -372,7 +375,12 @@ function collectGlobal(checks, versionResult) {
372
375
  checks.push({ group: "\uC804\uC5ED \uC124\uCE58", name: "\uD504\uB85C\uC81D\uD2B8", status: "info", value: `${projectCount}\uAC1C` });
373
376
  }
374
377
  async function collectProject(checks, projectRoot, versionResult) {
375
- if (!projectRoot) {
378
+ if (projectRoot) {
379
+ await collectSingleProject(checks, projectRoot, "\uC774 \uD504\uB85C\uC81D\uD2B8", versionResult);
380
+ return;
381
+ }
382
+ const registered = listRegisteredProjects().filter((p) => exists(p.path));
383
+ if (registered.length === 0) {
376
384
  checks.push({
377
385
  group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
378
386
  name: "\uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8",
@@ -381,15 +389,21 @@ async function collectProject(checks, projectRoot, versionResult) {
381
389
  });
382
390
  return;
383
391
  }
392
+ for (const p of registered) {
393
+ const pVersionResult = checkVersions(gatherVersionInputs(p.path));
394
+ await collectSingleProject(checks, p.path, `\uD504\uB85C\uC81D\uD2B8: ${p.name}`, pVersionResult);
395
+ }
396
+ }
397
+ async function collectSingleProject(checks, projectRoot, groupLabel, versionResult) {
384
398
  checks.push({
385
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
399
+ group: groupLabel,
386
400
  name: "\uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8",
387
401
  status: "info",
388
402
  value: projectRoot
389
403
  });
390
404
  const branch = await gitBranch(projectRoot);
391
405
  checks.push({
392
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
406
+ group: groupLabel,
393
407
  name: "\uBE0C\uB79C\uCE58",
394
408
  status: "info",
395
409
  value: branch ?? "\uC54C \uC218 \uC5C6\uC74C (\uD655\uC778 \uC2E4\uD328)"
@@ -397,16 +411,16 @@ async function collectProject(checks, projectRoot, versionResult) {
397
411
  const dirtyFiles = await gitDirtyFiles(projectRoot);
398
412
  if (dirtyFiles === null) {
399
413
  checks.push({
400
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
414
+ group: groupLabel,
401
415
  name: "\uC6CC\uD0B9\uD2B8\uB9AC",
402
416
  status: "info",
403
417
  value: "\uD655\uC778 \uC548 \uB428 (git \uC800\uC7A5\uC18C\uAC00 \uC544\uB2C8\uAC70\uB098 \uD655\uC778 \uC2E4\uD328)"
404
418
  });
405
419
  } else if (dirtyFiles.length === 0) {
406
- checks.push({ group: "\uC774 \uD504\uB85C\uC81D\uD2B8", name: "\uC6CC\uD0B9\uD2B8\uB9AC", status: "ok", value: "\uD074\uB9B0" });
420
+ checks.push({ group: groupLabel, name: "\uC6CC\uD0B9\uD2B8\uB9AC", status: "ok", value: "\uD074\uB9B0" });
407
421
  } else {
408
422
  checks.push({
409
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
423
+ group: groupLabel,
410
424
  name: "\uC6CC\uD0B9\uD2B8\uB9AC",
411
425
  status: "warn",
412
426
  value: `\uBBF8\uCEE4\uBC0B \uBCC0\uACBD ${dirtyFiles.length}\uAC1C`,
@@ -416,7 +430,7 @@ async function collectProject(checks, projectRoot, versionResult) {
416
430
  const configPath = path.join(projectRoot, ".awl", "config.json");
417
431
  if (!exists(configPath)) {
418
432
  checks.push({
419
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
433
+ group: groupLabel,
420
434
  name: "config.json",
421
435
  status: "missing",
422
436
  value: "\uC5C6\uC74C",
@@ -427,7 +441,7 @@ async function collectProject(checks, projectRoot, versionResult) {
427
441
  const raw = readJson(configPath);
428
442
  if (!isAwlConfig(raw)) {
429
443
  checks.push({
430
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
444
+ group: groupLabel,
431
445
  name: "config.json",
432
446
  status: "fail",
433
447
  value: "\uD615\uC2DD \uC624\uB958",
@@ -435,11 +449,11 @@ async function collectProject(checks, projectRoot, versionResult) {
435
449
  });
436
450
  return;
437
451
  }
438
- checks.push({ group: "\uC774 \uD504\uB85C\uC81D\uD2B8", name: "config.json", status: "ok", value: "\uC788\uC74C" });
452
+ checks.push({ group: groupLabel, name: "config.json", status: "ok", value: "\uC788\uC74C" });
439
453
  const recordedNaming = typeof raw.namingConvention === "string" ? raw.namingConvention : void 0;
440
454
  if (recordedNaming) {
441
455
  checks.push({
442
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
456
+ group: groupLabel,
443
457
  name: "\uB124\uC774\uBC0D \uCEE8\uBCA4\uC158",
444
458
  status: "info",
445
459
  value: recordedNaming
@@ -450,17 +464,17 @@ async function collectProject(checks, projectRoot, versionResult) {
450
464
  );
451
465
  if (naming.reason === "detected" && naming.convention) {
452
466
  checks.push({
453
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
467
+ group: groupLabel,
454
468
  name: "\uB124\uC774\uBC0D \uCEE8\uBCA4\uC158",
455
469
  status: "info",
456
470
  value: `${naming.convention} (${naming.counts[naming.convention]}/${naming.decisiveTotal} \uD30C\uC77C, \uBBF8\uAE30\uB85D)`,
457
471
  hint: `config.json \uC5D0 \uAE30\uB85D\uD558\uB824\uBA74: awl config set namingConvention ${naming.convention}`
458
472
  });
459
473
  } else if (naming.reason === "mixed") {
460
- checks.push({ group: "\uC774 \uD504\uB85C\uC81D\uD2B8", name: "\uB124\uC774\uBC0D \uCEE8\uBCA4\uC158", status: "info", value: "\uD63C\uC7AC" });
474
+ checks.push({ group: groupLabel, name: "\uB124\uC774\uBC0D \uCEE8\uBCA4\uC158", status: "info", value: "\uD63C\uC7AC" });
461
475
  } else {
462
476
  checks.push({
463
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
477
+ group: groupLabel,
464
478
  name: "\uB124\uC774\uBC0D \uCEE8\uBCA4\uC158",
465
479
  status: "info",
466
480
  value: "\uD310\uB2E8 \uBCF4\uB958 (\uD30C\uC77C \uBD80\uC871)"
@@ -470,16 +484,16 @@ async function collectProject(checks, projectRoot, versionResult) {
470
484
  const sizeReport = computeFileSizeOutliers(countFileLines(projectRoot));
471
485
  if (sizeReport.threshold === null) {
472
486
  checks.push({
473
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
487
+ group: groupLabel,
474
488
  name: "\uD30C\uC77C \uD06C\uAE30",
475
489
  status: "info",
476
490
  value: "\uD310\uB2E8 \uBCF4\uB958 (\uD30C\uC77C \uBD80\uC871)"
477
491
  });
478
492
  } else if (sizeReport.outliers.length === 0) {
479
- checks.push({ group: "\uC774 \uD504\uB85C\uC81D\uD2B8", name: "\uD30C\uC77C \uD06C\uAE30", status: "ok", value: "\uC774\uC0C1\uCE58 \uC5C6\uC74C" });
493
+ checks.push({ group: groupLabel, name: "\uD30C\uC77C \uD06C\uAE30", status: "ok", value: "\uC774\uC0C1\uCE58 \uC5C6\uC74C" });
480
494
  } else {
481
495
  checks.push({
482
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
496
+ group: groupLabel,
483
497
  name: "\uD30C\uC77C \uD06C\uAE30",
484
498
  status: "warn",
485
499
  value: `\uC774\uC0C1\uCE58 ${sizeReport.outliers.length}\uAC1C (\uC784\uACC4\uAC12 ${Math.round(sizeReport.threshold)}\uC904)`,
@@ -492,7 +506,7 @@ async function collectProject(checks, projectRoot, versionResult) {
492
506
  if (installed !== null) {
493
507
  const projectMismatch = findMismatch(versionResult, "project-vs-engine");
494
508
  checks.push({
495
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
509
+ group: groupLabel,
496
510
  name: "\uC5D4\uC9C4 \uBC84\uC804 \uC77C\uCE58",
497
511
  status: projectMismatch ? "warn" : "ok",
498
512
  value: projectMismatch ? `config ${raw.engineVersion} / \uC124\uCE58 ${installed}` : raw.engineVersion,
@@ -506,7 +520,7 @@ async function collectProject(checks, projectRoot, versionResult) {
506
520
  const first = tokenize(spec.cmd)[0] ?? "";
507
521
  if (!first) {
508
522
  checks.push({
509
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
523
+ group: groupLabel,
510
524
  name: `\uAC80\uC99D: ${vname}`,
511
525
  status: "warn",
512
526
  value: "\uBA85\uB839 \uBE44\uC5B4 \uC788\uC74C"
@@ -516,7 +530,7 @@ async function collectProject(checks, projectRoot, versionResult) {
516
530
  const cwd = spec.cwd ? path.isAbsolute(spec.cwd) ? spec.cwd : path.join(projectRoot, spec.cwd) : void 0;
517
531
  if (cwd && !isDirectory(cwd)) {
518
532
  checks.push({
519
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
533
+ group: groupLabel,
520
534
  name: `\uAC80\uC99D: ${vname}`,
521
535
  status: "missing",
522
536
  value: "cwd \uC5C6\uC74C",
@@ -527,7 +541,7 @@ async function collectProject(checks, projectRoot, versionResult) {
527
541
  try {
528
542
  await run({ cmd: first, args: ["--version"], cwd, timeoutMs: 3e3 });
529
543
  checks.push({
530
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
544
+ group: groupLabel,
531
545
  name: `\uAC80\uC99D: ${vname}`,
532
546
  status: "ok",
533
547
  value: `${first} \uC2E4\uD589 \uAC00\uB2A5`
@@ -535,7 +549,7 @@ async function collectProject(checks, projectRoot, versionResult) {
535
549
  } catch (e) {
536
550
  if (e instanceof CommandNotFoundError) {
537
551
  checks.push({
538
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
552
+ group: groupLabel,
539
553
  name: `\uAC80\uC99D: ${vname}`,
540
554
  status: "missing",
541
555
  value: "\uBA85\uB839 \uC5C6\uC74C",
@@ -543,7 +557,7 @@ async function collectProject(checks, projectRoot, versionResult) {
543
557
  });
544
558
  } else {
545
559
  checks.push({
546
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
560
+ group: groupLabel,
547
561
  name: `\uAC80\uC99D: ${vname}`,
548
562
  status: "warn",
549
563
  value: "\uD655\uC778 \uC2E4\uD328",
@@ -555,7 +569,7 @@ async function collectProject(checks, projectRoot, versionResult) {
555
569
  const statePath = path.join(projectRoot, ".awl", "state.json");
556
570
  if (!exists(statePath)) {
557
571
  checks.push({
558
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
572
+ group: groupLabel,
559
573
  name: "state.json",
560
574
  status: "info",
561
575
  value: "\uC5C6\uC74C (\uC544\uC9C1 \uC2DC\uC791 \uC804)"
@@ -565,9 +579,9 @@ async function collectProject(checks, projectRoot, versionResult) {
565
579
  if (st && typeof st === "object") {
566
580
  const o = st;
567
581
  const pos = typeof o.phase === "string" && o.phase || typeof o.step === "string" && o.step || typeof o.position === "string" && o.position || "\uC788\uC74C";
568
- checks.push({ group: "\uC774 \uD504\uB85C\uC81D\uD2B8", name: "state.json", status: "ok", value: String(pos) });
582
+ checks.push({ group: groupLabel, name: "state.json", status: "ok", value: String(pos) });
569
583
  } else {
570
- checks.push({ group: "\uC774 \uD504\uB85C\uC81D\uD2B8", name: "state.json", status: "warn", value: "\uD615\uC2DD \uC624\uB958" });
584
+ checks.push({ group: groupLabel, name: "state.json", status: "warn", value: "\uD615\uC2DD \uC624\uB958" });
571
585
  }
572
586
  let stateBytes = null;
573
587
  try {
@@ -577,7 +591,7 @@ async function collectProject(checks, projectRoot, versionResult) {
577
591
  }
578
592
  if (stateBytes !== null && stateBytes > STATE_SIZE_WARN_BYTES) {
579
593
  checks.push({
580
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
594
+ group: groupLabel,
581
595
  name: "state.json \uD06C\uAE30",
582
596
  status: "warn",
583
597
  value: `${(stateBytes / (1024 * 1024)).toFixed(1)}MB`,
@@ -594,7 +608,7 @@ async function collectProject(checks, projectRoot, versionResult) {
594
608
  if (leftoverWorktrees.length > 0) {
595
609
  const shown = leftoverWorktrees.slice(0, 3).join(", ");
596
610
  checks.push({
597
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
611
+ group: groupLabel,
598
612
  name: "\uC6CC\uD06C\uD2B8\uB9AC \uC794\uC874",
599
613
  status: "warn",
600
614
  value: `${leftoverWorktrees.length}\uAC1C`,
@@ -611,7 +625,7 @@ async function collectProject(checks, projectRoot, versionResult) {
611
625
  const hasCommits = await gitHasCommits(projectRoot);
612
626
  if (detectRecordTrailGap({ hasCommits, activeWorkitem, gateAttemptRecords })) {
613
627
  checks.push({
614
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
628
+ group: groupLabel,
615
629
  name: "record \uD2B8\uB808\uC77C",
616
630
  status: "warn",
617
631
  value: "\uACF5\uBC31 (\uD65C\uC131 \uC6CC\uD06C\uC544\uC774\uD15C \uC5C6\uC774 \uCEE4\uBC0B \uC774\uB825)",
@@ -632,7 +646,7 @@ async function collectProject(checks, projectRoot, versionResult) {
632
646
  const fmt = (iso) => iso ? iso.slice(0, 16).replace("T", " ") : "\uC5C6\uC74C";
633
647
  const lockNote = lock ? ` \xB7 \uB2E4\uB978 \uC138\uC158\uC774 state \uC4F0\uB294 \uC911(${lock.token})` : "";
634
648
  checks.push({
635
- group: "\uC774 \uD504\uB85C\uC81D\uD2B8",
649
+ group: groupLabel,
636
650
  name: "\uCD5C\uADFC \uD65C\uB3D9",
637
651
  status: lock ? "warn" : "info",
638
652
  value: `\uAE30\uB85D ${fmt(lastAt)} \xB7 state ${fmt(stateMtime)}${lockNote}`,
@@ -7,32 +7,34 @@ import {
7
7
  isCheckPassed,
8
8
  runVerifyChecks,
9
9
  writeVerifyBaseline
10
- } from "./chunk-CSBKWYFK.js";
10
+ } from "./chunk-YC23SNVC.js";
11
11
  import {
12
12
  gitBranch
13
- } from "./chunk-OWILAE4M.js";
13
+ } from "./chunk-I5SS6HFR.js";
14
14
  import {
15
15
  parseRuleFile
16
- } from "./chunk-OJ7YO3MY.js";
16
+ } from "./chunk-MBEY33YA.js";
17
17
  import {
18
18
  nextGotchaId
19
- } from "./chunk-FKBBGXGF.js";
19
+ } from "./chunk-E6MULIMV.js";
20
20
  import {
21
21
  loadProjectName
22
- } from "./chunk-6F4VAVKF.js";
22
+ } from "./chunk-QVP5DUND.js";
23
23
  import {
24
24
  loadState,
25
25
  migrateState,
26
26
  writeState
27
- } from "./chunk-UNANHUG3.js";
27
+ } from "./chunk-UJ6CK5HC.js";
28
28
  import {
29
29
  loadConfig,
30
+ multiProjectFooter,
30
31
  resolveProjectRoot,
32
+ resolveProjectScope,
31
33
  run
32
- } from "./chunk-7D4T7HFK.js";
34
+ } from "./chunk-JR6MKCC4.js";
33
35
  import {
34
36
  installClaudeSkill
35
- } from "./chunk-7TMAQRJS.js";
37
+ } from "./chunk-7CPPZX6X.js";
36
38
  import {
37
39
  caps,
38
40
  feedback,
@@ -42,7 +44,7 @@ import {
42
44
  makeTokens,
43
45
  sectionBox,
44
46
  signal
45
- } from "./chunk-SUF5ISJM.js";
47
+ } from "./chunk-UNAASSQ4.js";
46
48
 
47
49
  // src/commands/work.ts
48
50
  import fs2 from "fs";
@@ -649,6 +651,32 @@ function requireRoot() {
649
651
  return root;
650
652
  }
651
653
  function runWorkList(opts) {
654
+ const scope = resolveProjectScope();
655
+ if (scope.mode === "multi" && scope.projects) {
656
+ const c = caps();
657
+ const color = makeColors(c.color);
658
+ const perProject = scope.projects.map((p) => ({
659
+ name: p.name,
660
+ path: p.path,
661
+ list: summarizeWorkitems(loadState(p.path))
662
+ }));
663
+ if (opts.json) {
664
+ process.stdout.write(
665
+ `${JSON.stringify({ multiProject: true, projects: perProject }, null, 2)}
666
+ `
667
+ );
668
+ return;
669
+ }
670
+ const blocks = perProject.map(
671
+ ({ name, path: path3, list: list2 }) => `${color.bold(`\uD504\uB85C\uC81D\uD2B8: ${name} (${path3})`)}
672
+ ${renderWorkList(list2, c)}`
673
+ );
674
+ process.stdout.write(`${blocks.join("\n\n")}
675
+ `);
676
+ process.stdout.write(`${multiProjectFooter(scope.projects, "awl work list", c)}
677
+ `);
678
+ return;
679
+ }
652
680
  const root = requireRoot();
653
681
  const list = summarizeWorkitems(loadState(root));
654
682
  if (opts.json) {
@@ -5,25 +5,25 @@ import {
5
5
  runWorkNew,
6
6
  sanitizeForGit,
7
7
  worktreeDirtyTracked
8
- } from "./chunk-XBUKFMNN.js";
8
+ } from "./chunk-I5WWLNA6.js";
9
9
  import {
10
10
  loadProjectName
11
- } from "./chunk-6F4VAVKF.js";
11
+ } from "./chunk-QVP5DUND.js";
12
12
  import {
13
13
  loadState,
14
14
  writeState
15
- } from "./chunk-UNANHUG3.js";
15
+ } from "./chunk-UJ6CK5HC.js";
16
16
  import {
17
17
  resolveProjectRoot,
18
18
  run
19
- } from "./chunk-7D4T7HFK.js";
19
+ } from "./chunk-JR6MKCC4.js";
20
20
  import {
21
21
  caps,
22
22
  feedback,
23
23
  makeColors,
24
24
  sectionBox,
25
25
  signal
26
- } from "./chunk-SUF5ISJM.js";
26
+ } from "./chunk-UNAASSQ4.js";
27
27
 
28
28
  // src/commands/lane.ts
29
29
  import fs from "fs";