github-issue-tower-defence-management 1.75.0 → 1.77.0

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 (56) hide show
  1. package/.github/workflows/umino-project.yml +5 -3
  2. package/CHANGELOG.md +22 -0
  3. package/README.md +1 -1
  4. package/bin/adapter/repositories/ProxyClaudeTokenUsageRepository.js +66 -0
  5. package/bin/adapter/repositories/ProxyClaudeTokenUsageRepository.js.map +1 -1
  6. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +32 -1
  7. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -1
  8. package/bin/domain/usecases/ChangeTargetPullRequestApprover.js +4 -3
  9. package/bin/domain/usecases/ChangeTargetPullRequestApprover.js.map +1 -1
  10. package/bin/domain/usecases/CheckIssueReviewReadinessUseCase.js.map +1 -1
  11. package/bin/domain/usecases/IssueRejectionEvaluator.js +35 -1
  12. package/bin/domain/usecases/IssueRejectionEvaluator.js.map +1 -1
  13. package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js.map +1 -1
  14. package/bin/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.js.map +1 -1
  15. package/bin/domain/usecases/StartPreparationUseCase.js +27 -5
  16. package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
  17. package/package.json +1 -1
  18. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.test.ts +126 -0
  19. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.ts +31 -0
  20. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +43 -1
  21. package/src/domain/usecases/ChangeTargetPullRequestApprover.test.ts +39 -0
  22. package/src/domain/usecases/ChangeTargetPullRequestApprover.ts +4 -3
  23. package/src/domain/usecases/CheckIssueReviewReadinessUseCase.test.ts +4 -0
  24. package/src/domain/usecases/CheckIssueReviewReadinessUseCase.ts +5 -1
  25. package/src/domain/usecases/IssueRejectionEvaluator.test.ts +141 -0
  26. package/src/domain/usecases/IssueRejectionEvaluator.ts +56 -3
  27. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +2 -0
  28. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +1 -0
  29. package/src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.test.ts +2 -0
  30. package/src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.ts +1 -0
  31. package/src/domain/usecases/StartPreparationUseCase.test.ts +180 -0
  32. package/src/domain/usecases/StartPreparationUseCase.ts +46 -13
  33. package/src/domain/usecases/adapter-interfaces/ClaudeTokenUsageRepository.ts +1 -0
  34. package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +5 -0
  35. package/types/adapter/repositories/ProxyClaudeTokenUsageRepository.d.ts +1 -0
  36. package/types/adapter/repositories/ProxyClaudeTokenUsageRepository.d.ts.map +1 -1
  37. package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts +1 -0
  38. package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -1
  39. package/types/domain/usecases/ChangeTargetPullRequestApprover.d.ts.map +1 -1
  40. package/types/domain/usecases/CheckIssueReviewReadinessUseCase.d.ts +1 -1
  41. package/types/domain/usecases/CheckIssueReviewReadinessUseCase.d.ts.map +1 -1
  42. package/types/domain/usecases/IssueRejectionEvaluator.d.ts +4 -2
  43. package/types/domain/usecases/IssueRejectionEvaluator.d.ts.map +1 -1
  44. package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts +1 -1
  45. package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts.map +1 -1
  46. package/types/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.d.ts +1 -1
  47. package/types/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.d.ts.map +1 -1
  48. package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
  49. package/types/domain/usecases/adapter-interfaces/ClaudeTokenUsageRepository.d.ts +1 -0
  50. package/types/domain/usecases/adapter-interfaces/ClaudeTokenUsageRepository.d.ts.map +1 -1
  51. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts +1 -0
  52. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts.map +1 -1
  53. package/bin/domain/usecases/ClearNextActionHourUseCase.js +0 -44
  54. package/bin/domain/usecases/ClearNextActionHourUseCase.js.map +0 -1
  55. package/types/domain/usecases/ClearNextActionHourUseCase.d.ts +0 -14
  56. package/types/domain/usecases/ClearNextActionHourUseCase.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"StartPreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StartPreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/StartPreparationUseCase.ts"],"names":[],"mappings":";;;AAKA,+DAGoC;AAEpC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAClC,MAAM,kCAAkC,GAAG,GAAG,CAAC;AAC/C,MAAM,kCAAkC,GAAG,GAAG,CAAC;AAClC,QAAA,+BAA+B,GAAG,iBAAiB,CAAC;AAUjE,MAAa,uBAAuB;IAClC,YACmB,iBAAsD,EACtD,eAShB,EACgB,kBAAsC,EACtC,0BAAsD;QAZtD,sBAAiB,GAAjB,iBAAiB,CAAqC;QACtD,oBAAe,GAAf,eAAe,CAS/B;QACgB,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,+BAA0B,GAA1B,0BAA0B,CAA4B;QAGjE,4BAAuB,GAAG,CAAC,SAAwB,EAAU,EAAE;YACrE,MAAM,UAAU,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YACnD,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO,kBAAkB,CAAC;YAC7D,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO,gBAAgB,CAAC;YACzD,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC;QAEM,+BAA0B,GAAG,CACnC,KAAuB,EACvB,eAAuB,EACd,EAAE;YACX,MAAM,QAAQ,GAAG,KAAK,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;YAC1D,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACrD,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC;QACnD,CAAC,CAAC;QAEM,8BAAyB,GAAG,CAClC,KAAuB,EACvB,eAAuB,EACvB,eAAuB,EACf,EAAE;YACV,MAAM,QAAQ,GAAG,KAAK,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;YAC1D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,QAAQ,CAAC,QAAQ,GAAG,eAAe,CAAC;YAC7C,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACrD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,OAAO,CAAC,QAAQ,GAAG,eAAe,CAAC;YAC5C,CAAC;YACD,OAAO,MAAM,CAAC,iBAAiB,CAAC;QAClC,CAAC,CAAC;QAEM,6CAAwC,GAAG,CACjD,CAAmB,EACnB,CAAmB,EACnB,eAAuB,EACvB,eAAuB,EACf,EAAE;YACV,MAAM,kBAAkB,GAAG,IAAI,CAAC,yBAAyB,CACvD,CAAC,EACD,eAAe,EACf,eAAe,CAChB,CAAC;YACF,MAAM,kBAAkB,GAAG,IAAI,CAAC,yBAAyB,CACvD,CAAC,EACD,eAAe,EACf,eAAe,CAChB,CAAC;YACF,IAAI,kBAAkB,KAAK,kBAAkB,EAAE,CAAC;gBAC9C,OAAO,kBAAkB,GAAG,kBAAkB,CAAC;YACjD,CAAC;YACD,OAAO,CAAC,CAAC,mBAAmB,GAAG,CAAC,CAAC,mBAAmB,CAAC;QACvD,CAAC,CAAC;QAEM,2BAAsB,GAAG,CAC/B,WAAmB,EACnB,sBAA8B,EACtB,EAAE;YACV,IAAI,WAAW,GAAG,sBAAsB,EAAE,CAAC;gBACzC,OAAO,uBAAuB,CAAC;YACjC,CAAC;YACD,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,sBAAsB,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC;QAEF,4BAAuB,GAAG,CACxB,mBAA2B,EAC3B,mBAA2B,EACnB,EAAE;YACV,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAC/C,mBAAmB,EACnB,kCAAkC,CACnC,CAAC;YACF,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAC/C,mBAAmB,EACnB,kCAAkC,CACnC,CAAC;YACF,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QAChD,CAAC,CAAC;QAEM,yBAAoB,GAAG,CAC7B,WAA+B,EAC/B,8BAAsC,EACtC,SAAwB,EACxB,aAAqB,EAKrB,EAAE;YACF,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;YAChE,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAC1C,MAAM,cAAc,GAAG,WAAW;iBAC/B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;iBACjC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;iBAClC,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,eAAe,CAAC,CACpE;iBACA,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,mBAAmB,GAAG,GAAG,GAAG,8BAA8B,CACnE;iBACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACb,IAAI,CAAC,wCAAwC,CAC3C,CAAC,EACD,CAAC,EACD,eAAe,EACf,eAAe,CAChB,CACF,CAAC;YAEJ,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;YAC/D,CAAC;YAED,MAAM,gBAAgB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACtD,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,KAAK,EAAE,IAAI,CAAC,uBAAuB,CACjC,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,mBAAmB,CAC1B;aACF,CAAC,CAAC,CAAC;YAEJ,MAAM,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAE5D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACnE,MAAM,YAAY,GAAa,EAAE,CAAC;YAClC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC9C,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;oBACjC,IAAI,CAAC,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC;wBACpB,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;QAClE,CAAC,CAAC;QAEF,uBAAkB,GAAG,CACnB,WAA+B,EAC/B,8BAAsC,EACtC,SAAwB,EACF,EAAE;YACxB,MAAM,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;YAChE,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAC1C,MAAM,cAAc,GAAG,WAAW;iBAC/B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;iBACjC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;iBAClC,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,eAAe,CAAC,CACpE;iBACA,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,mBAAmB,GAAG,GAAG,GAAG,8BAA8B,CACnE;iBACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACb,IAAI,CAAC,wCAAwC,CAC3C,CAAC,EACD,CAAC,EACD,eAAe,EACf,eAAe,CAChB,CACF,CAAC;YACJ,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAyB,WAAW;iBAC/C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;iBACxD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACf,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;gBACtB,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;gBAC9C,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,iBAAiB,EACf,CAAC,KAAK,CAAC,OAAO;oBACd,CAAC,KAAK,CAAC,QAAQ;oBACf,CAAC,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,eAAe,CAAC;oBACxD,KAAK,CAAC,mBAAmB,GAAG,GAAG,IAAI,8BAA8B;aACpE,CAAC,CAAC,CAAC;YACN,MAAM,eAAe,GAAyB,cAAc,CAAC,GAAG,CAC9D,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACV,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;gBACtB,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;gBAC9C,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,KAAK;gBACf,iBAAiB,EAAE,KAAK;aACzB,CAAC,CACH,CAAC;YACF,OAAO,CAAC,GAAG,eAAe,EAAE,GAAG,QAAQ,CAAC,CAAC;QAC3C,CAAC,CAAC;QAEF,QAAG,GAAG,KAAK,EAAE,MAaZ,EAA2D,EAAE;YAC5D,MAAM,WAAW,GACf,MAAM,IAAI,CAAC,0BAA0B,CAAC,uBAAuB,EAAE,CAAC;YAClE,IAAI,cAAc,GAAoB,IAAI,CAAC;YAC3C,IAAI,YAAY,GAAkB,IAAI,CAAC;YACvC,IAAI,wBAAwB,GAA4C,EAAE,CAAC;YAC3E,IAAI,mBAAmB,GAA2B,EAAE,CAAC;YACrD,MAAM,aAAa,GACjB,WAAW,CAAC,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,IAAI,CAAC,kBAAkB,CACrB,WAAW,EACX,MAAM,CAAC,8BAA8B,EACrC,MAAM,CAAC,mBAAmB,CAC3B;gBACH,CAAC,CAAC,IAAI,CAAC;YACX,MAAM,2BAA2B,GAC/B,MAAM,CAAC,2BAA2B,IAAI,uBAAuB,CAAC;YAChE,IAAI,gCAAgC,GAAG,2BAA2B,CAAC;YACnE,IAAI,4BAA4B,GAAG,MAAM,CAAC,mBAAmB,CAAC;YAC9D,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,EACJ,MAAM,EAAE,MAAM,EACd,YAAY,EACZ,gBAAgB,EAAE,sBAAsB,GACzC,GAAG,IAAI,CAAC,oBAAoB,CAC3B,WAAW,EACX,MAAM,CAAC,8BAA8B,EACrC,MAAM,CAAC,mBAAmB,EAC1B,2BAA2B,CAC5B,CAAC;gBACF,IAAI,cAAc,GAAG,MAAM,CAAC;gBAC5B,IAAI,WAAW,GAAG,YAAY,CAAC;gBAC/B,IAAI,6BAA6B,GAAG,sBAAsB,CAAC;gBAC3D,IACE,cAAc,CAAC,MAAM,KAAK,CAAC;oBAC3B,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,mBAAmB,CAAC;wBACtD,kBAAkB,EACpB,CAAC;oBACD,MAAM,iBAAiB,GACrB,MAAM,CAAC,oBAAoB,IAAI,uCAA+B,CAAC;oBACjE,MAAM,EACJ,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,WAAW,EACzB,gBAAgB,EAAE,wBAAwB,GAC3C,GAAG,IAAI,CAAC,oBAAoB,CAC3B,WAAW,EACX,MAAM,CAAC,8BAA8B,EACrC,iBAAiB,EACjB,2BAA2B,CAC5B,CAAC;oBACF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC9B,OAAO,CAAC,IAAI,CACV,8BAA8B,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,mBAAmB,CAAC,+EAA+E,iBAAiB,GAAG,CAC1L,CAAC;wBACF,cAAc,GAAG,cAAc,CAAC;wBAChC,WAAW,GAAG,WAAW,CAAC;wBAC1B,6BAA6B,GAAG,wBAAwB,CAAC;wBACzD,4BAA4B,GAAG,iBAAiB,CAAC;oBACnD,CAAC;gBACH,CAAC;gBACD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAChC,OAAO,CAAC,IAAI,CACV,OAAO,WAAW,CAAC,MAAM,0FAA0F,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,mBAAmB,CAAC,oCAAoC,MAAM,CAAC,8BAA8B,oCAAoC,CACzR,CAAC;oBACF,OAAO,EAAE,aAAa,EAAE,CAAC;gBAC3B,CAAC;gBACD,MAAM,IAAI,CAAC,0BAA0B,CAAC,gBAAgB,EAAE,CAAC;gBACzD,mBAAmB;oBACjB,MAAM,IAAI,CAAC,0BAA0B,CAAC,sBAAsB,EAAE,CAAC;gBACjE,cAAc,GAAG,cAAc,CAAC;gBAChC,wBAAwB,GAAG,6BAA6B,CAAC;gBACzD,gCAAgC,GAAG,WAAW,CAAC;gBAC/C,YAAY,GAAG,IAAI,CAAC,0BAA0B,CAAC,YAAY,EAAE,CAAC;YAChE,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACzE,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CACjE,OAAO,EACP,MAAM,CAAC,sBAAsB,CAC9B,CAAC;YAEF,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CACjE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CACpC,CAAC;YACF,MAAM,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAC1D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,wCAAuB,CAC1C,CAAC;YACF,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAC7B,OAAO,CAAC,KAAK,CACX,8BAA8B,wCAAuB,yBAAyB,CAC/E,CAAC;gBACF,OAAO,EAAE,aAAa,EAAE,CAAC;YAC3B,CAAC;YAED,MAAM,uBAAuB,GAAG,eAAe;iBAC5C,MAAM,CACL,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,MAAM,KAAK,+CAA8B,IAAI,CAAC,KAAK,CAAC,QAAQ,CACrE;iBACA,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;YAClC,MAAM,4BAA4B,GAAG,eAAe,CAAC,MAAM,CACzD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,wCAAuB,CACpD,CAAC,MAAM,CAAC;YACT,IAAI,mCAAmC,GAAG,4BAA4B,CAAC;YACvE,IAAI,qBAAqB,GAAG,CAAC,CAAC;YAC9B,MAAM,uBAAuB,GAA2B,EAAE,CAAC;YAE3D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,IAAI,IAAI,CACzB,GAAG,CAAC,WAAW,EAAE,EACjB,GAAG,CAAC,QAAQ,EAAE,EACd,GAAG,CAAC,OAAO,EAAE,CACd,CAAC;YACF,MAAM,aAAa,GAAG,IAAI,IAAI,CAC5B,UAAU,CAAC,WAAW,EAAE,EACxB,UAAU,CAAC,QAAQ,EAAE,EACrB,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CACzB,CAAC;YAEF,KACE,IAAI,CAAC,GAAG,CAAC,EACT,CAAC,GAAG,uBAAuB,CAAC,MAAM;gBAClC,mCAAmC,GAAG,gCAAgC,EACtE,CAAC,EAAE,EACH,CAAC;gBACD,MAAM,KAAK,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;gBACzC,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvC,SAAS;gBACX,CAAC;gBACD,IACE,KAAK,CAAC,cAAc,KAAK,IAAI;oBAC7B,KAAK,CAAC,cAAc,IAAI,aAAa,EACrC,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,IAAI,KAAK,CAAC,cAAc,KAAK,IAAI,IAAI,WAAW,GAAG,KAAK,CAAC,cAAc,EAAE,CAAC;oBACxE,SAAS;gBACX,CAAC;gBACD,IACE,MAAM,CAAC,mBAAmB,KAAK,IAAI;oBACnC,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAClD,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,MAAM,oBAAoB,GACxB,MAAM,CAAC,oBAAoB,KAAK,IAAI;oBAClC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE,CAClC,MAAM,CAAC,oBAAoB,KAAK,IAAI;wBAClC,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC;wBAC7C,CAAC,CAAC,KAAK,CACV;oBACH,CAAC,CAAC,SAAS,CAAC;gBAChB,MAAM,KAAK,GACT,KAAK,CAAC,MAAM;qBACT,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;oBACxD,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;qBAC1B,IAAI,EAAE;oBACT,oBAAoB;oBACpB,KAAK,CAAC,MAAM;yBACT,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;wBACvD,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;yBACzB,IAAI,EAAE;oBACT,MAAM,CAAC,mBAAmB;oBAC1B,MAAM,CAAC,gBAAgB,CAAC;gBAC1B,MAAM,KAAK,GACT,KAAK,CAAC,MAAM;qBACT,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;oBACxD,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;qBAC1B,IAAI,EAAE,IAAI,4BAA4B,CAAC;gBAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CACX,qCAAqC,KAAK,CAAC,GAAG,6DAA6D,CAC5G,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAC7C,IAAI,UAAkB,CAAC;gBACvB,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACpE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;wBAChB,OAAO,CAAC,IAAI,CACV,wBAAwB,KAAK,CAAC,GAAG,gCAAgC,CAClE,CAAC;wBACF,SAAS;oBACX,CAAC;oBACD,IAAI,EAAE,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;wBAC3B,OAAO,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,GAAG,+BAA+B,CAAC,CAAC;wBACtE,SAAS;oBACX,CAAC;oBACD,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACN,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAC9D,KAAK,CAAC,GAAG,CACV,CAAC;oBACF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC1B,MAAM,SAAS,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CACpC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CACxD,CAAC;wBACF,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;wBACjC,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBACxC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;4BACvC,MAAM,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;4BAC7D,IAAI,WAAW,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gCACpC,MAAM,IAAI,CAAC,eAAe,CAAC,uBAAuB,CAChD,WAAW,CAAC,GAAG,EACf,WAAW,CAAC,UAAU,CACvB,CAAC;4BACJ,CAAC;4BACD,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAC3C,WAAW,CAAC,GAAG,EACf,oFAAoF,KAAK,CAAC,GAAG,iCAAiC,WAAW,CAAC,GAAG,GAAG,CACjJ,CAAC;wBACJ,CAAC;wBACD,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAClE,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAC3C,KAAK,CAAC,GAAG,EACT,GAAG,YAAY,CAAC,MAAM,qGAAqG,aAAa,iBAAiB,WAAW,CAAC,GAAG,EAAE,CAC3K,CAAC;wBACF,IAAI,WAAW,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;4BACpC,OAAO,CAAC,IAAI,CACV,kBAAkB,KAAK,CAAC,GAAG,qDAAqD,CACjF,CAAC;4BACF,SAAS;wBACX,CAAC;wBACD,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;oBACtC,CAAC;yBAAM,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACnC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;4BACtC,OAAO,CAAC,IAAI,CACV,kBAAkB,KAAK,CAAC,GAAG,gDAAgD,CAC5E,CAAC;4BACF,SAAS;wBACX,CAAC;wBACD,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;oBACxC,CAAC;yBAAM,CAAC;wBACN,UAAU,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBAClC,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;oBACnC,OAAO,CAAC,KAAK,CACX,kBAAkB,KAAK,CAAC,GAAG,iDAAiD,UAAU,EAAE,CACzF,CAAC;oBACF,SAAS;gBACX,CAAC;gBAED,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CACrC,OAAO,EACP,KAAK,EACL,uBAAuB,CAAC,EAAE,CAC3B,CAAC;gBACF,KAAK,CAAC,MAAM,GAAG,wCAAuB,CAAC;gBAEvC,MAAM,MAAM,GAAa;oBACvB,KAAK,CAAC,GAAG;oBACT,KAAK;oBACL,KAAK;oBACL,kBAAkB;oBAClB,MAAM,CAAC,cAAc;oBACrB,UAAU;oBACV,UAAU;iBACX,CAAC;gBACF,IACE,MAAM,CAAC,mBAAmB,KAAK,IAAI;oBACnC,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EACrC,CAAC;oBACD,MAAM,SAAS,GACb,MAAM,CAAC,mBAAmB,CACxB,qBAAqB,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAC1D,CAAC;oBACJ,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;gBACxC,CAAC;gBACD,IAAI,QAA4C,CAAC;gBACjD,IAAI,cAAc,KAAK,IAAI,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;oBACrD,MAAM,8BAA8B,GAAG,wBAAwB;yBAC5D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACX,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,SAAS,EACP,CAAC,CAAC,KAAK;4BACP,CAAC,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;4BACnC,CAAC,uBAAuB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;qBAC1C,CAAC,CAAC;yBACF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;yBAC9B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChD,IAAI,8BAA8B,KAAK,SAAS,EAAE,CAAC;wBACjD,MAAM;oBACR,CAAC;oBACD,MAAM,QAAQ,GAAG,8BAA8B,CAAC,KAAK,CAAC;oBACtD,uBAAuB,CAAC,QAAQ,CAAC;wBAC/B,CAAC,uBAAuB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC/C,QAAQ,GAAG;wBACT,uBAAuB,EAAE,QAAQ;wBACjC,kBAAkB,EAAE,YAAY;qBACjC,CAAC;gBACJ,CAAC;gBACD,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CACtC,IAAI,EACJ,MAAM,EACN,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CACzC,CAAC;gBACF,qBAAqB,EAAE,CAAC;gBACxB,mCAAmC,EAAE,CAAC;YACxC,CAAC;YACD,OAAO,EAAE,aAAa,EAAE,CAAC;QAC3B,CAAC,CAAC;IA9fC,CAAC;CA+fL;AA9gBD,0DA8gBC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.75.0",
3
+ "version": "1.77.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -15,6 +15,13 @@ jest.mock('../proxy/TokenListLoader', () => ({
15
15
  loadTokenEntries: mockLoadTokenEntries,
16
16
  }));
17
17
 
18
+ const mockFsReaddirSync = jest.fn();
19
+ const mockFsReadFileSync = jest.fn();
20
+ jest.mock('fs', () => ({
21
+ readdirSync: mockFsReaddirSync,
22
+ readFileSync: mockFsReadFileSync,
23
+ }));
24
+
18
25
  import { ProxyClaudeTokenUsageRepository } from './ProxyClaudeTokenUsageRepository';
19
26
 
20
27
  describe('ProxyClaudeTokenUsageRepository', () => {
@@ -724,4 +731,123 @@ describe('ProxyClaudeTokenUsageRepository', () => {
724
731
  expect(repository.proxyBaseUrl()).toBe('http://127.0.0.1:9999');
725
732
  });
726
733
  });
734
+
735
+ describe('getTokenInFlightCounts', () => {
736
+ it('should return empty object when proc directory cannot be read', async () => {
737
+ mockFsReaddirSync.mockImplementation(() => {
738
+ throw new Error('ENOENT');
739
+ });
740
+ const repository = new ProxyClaudeTokenUsageRepository('/tokens.json');
741
+
742
+ const result = await repository.getTokenInFlightCounts();
743
+
744
+ expect(result).toEqual({});
745
+ });
746
+
747
+ it('should return empty object when no process has CLAUDE_CODE_OAUTH_TOKEN', async () => {
748
+ mockFsReaddirSync.mockReturnValue(['1234', '5678', 'self']);
749
+ mockFsReadFileSync.mockReturnValue('HOME=/home/user\0PATH=/usr/bin\0');
750
+ const repository = new ProxyClaudeTokenUsageRepository('/tokens.json');
751
+
752
+ const result = await repository.getTokenInFlightCounts();
753
+
754
+ expect(result).toEqual({});
755
+ });
756
+
757
+ it('should count one process when one pid has CLAUDE_CODE_OAUTH_TOKEN', async () => {
758
+ mockFsReaddirSync.mockReturnValue(['1234', 'self']);
759
+ mockFsReadFileSync.mockImplementation((filePath: string) => {
760
+ if (filePath === '/proc/1234/environ') {
761
+ return 'HOME=/home/user\0CLAUDE_CODE_OAUTH_TOKEN=sk-ant-abc\0PATH=/usr/bin\0';
762
+ }
763
+ throw new Error('EACCES');
764
+ });
765
+ const repository = new ProxyClaudeTokenUsageRepository('/tokens.json');
766
+
767
+ const result = await repository.getTokenInFlightCounts();
768
+
769
+ expect(result).toEqual({ 'sk-ant-abc': 1 });
770
+ });
771
+
772
+ it('should count multiple processes using the same token', async () => {
773
+ mockFsReaddirSync.mockReturnValue(['1234', '5678', '9999']);
774
+ mockFsReadFileSync.mockImplementation((filePath: string) => {
775
+ if (
776
+ filePath === '/proc/1234/environ' ||
777
+ filePath === '/proc/5678/environ'
778
+ ) {
779
+ return 'CLAUDE_CODE_OAUTH_TOKEN=sk-ant-abc\0OTHER=val\0';
780
+ }
781
+ if (filePath === '/proc/9999/environ') {
782
+ return 'HOME=/home/user\0PATH=/usr/bin\0';
783
+ }
784
+ throw new Error('ENOENT');
785
+ });
786
+ const repository = new ProxyClaudeTokenUsageRepository('/tokens.json');
787
+
788
+ const result = await repository.getTokenInFlightCounts();
789
+
790
+ expect(result).toEqual({ 'sk-ant-abc': 2 });
791
+ });
792
+
793
+ it('should count processes separately when they use different tokens', async () => {
794
+ mockFsReaddirSync.mockReturnValue(['1234', '5678']);
795
+ mockFsReadFileSync.mockImplementation((filePath: string) => {
796
+ if (filePath === '/proc/1234/environ') {
797
+ return 'CLAUDE_CODE_OAUTH_TOKEN=sk-ant-abc\0';
798
+ }
799
+ if (filePath === '/proc/5678/environ') {
800
+ return 'CLAUDE_CODE_OAUTH_TOKEN=sk-ant-xyz\0';
801
+ }
802
+ throw new Error('ENOENT');
803
+ });
804
+ const repository = new ProxyClaudeTokenUsageRepository('/tokens.json');
805
+
806
+ const result = await repository.getTokenInFlightCounts();
807
+
808
+ expect(result).toEqual({ 'sk-ant-abc': 1, 'sk-ant-xyz': 1 });
809
+ });
810
+
811
+ it('should skip non-numeric proc entries', async () => {
812
+ mockFsReaddirSync.mockReturnValue(['1234', 'self', 'net', 'sys']);
813
+ mockFsReadFileSync.mockImplementation((filePath: string) => {
814
+ if (filePath === '/proc/1234/environ') {
815
+ return 'CLAUDE_CODE_OAUTH_TOKEN=sk-ant-abc\0';
816
+ }
817
+ throw new Error('ENOENT');
818
+ });
819
+ const repository = new ProxyClaudeTokenUsageRepository('/tokens.json');
820
+
821
+ const result = await repository.getTokenInFlightCounts();
822
+
823
+ expect(result).toEqual({ 'sk-ant-abc': 1 });
824
+ });
825
+
826
+ it('should skip processes whose environ file cannot be read', async () => {
827
+ mockFsReaddirSync.mockReturnValue(['1234', '5678']);
828
+ mockFsReadFileSync.mockImplementation((filePath: string) => {
829
+ if (filePath === '/proc/1234/environ') {
830
+ return 'CLAUDE_CODE_OAUTH_TOKEN=sk-ant-abc\0';
831
+ }
832
+ throw new Error('EPERM');
833
+ });
834
+ const repository = new ProxyClaudeTokenUsageRepository('/tokens.json');
835
+
836
+ const result = await repository.getTokenInFlightCounts();
837
+
838
+ expect(result).toEqual({ 'sk-ant-abc': 1 });
839
+ });
840
+
841
+ it('should skip entries where CLAUDE_CODE_OAUTH_TOKEN has an empty value', async () => {
842
+ mockFsReaddirSync.mockReturnValue(['1234']);
843
+ mockFsReadFileSync.mockReturnValue(
844
+ 'CLAUDE_CODE_OAUTH_TOKEN=\0OTHER=val\0',
845
+ );
846
+ const repository = new ProxyClaudeTokenUsageRepository('/tokens.json');
847
+
848
+ const result = await repository.getTokenInFlightCounts();
849
+
850
+ expect(result).toEqual({});
851
+ });
852
+ });
727
853
  });
@@ -1,3 +1,5 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
1
3
  import { ClaudeTokenUsage } from '../../domain/entities/ClaudeTokenUsage';
2
4
  import { ClaudeTokenUsageRepository } from '../../domain/usecases/adapter-interfaces/ClaudeTokenUsageRepository';
3
5
  import { ensureProxyRunning } from '../proxy/ensureProxyRunning';
@@ -93,5 +95,34 @@ export class ProxyClaudeTokenUsageRepository implements ClaudeTokenUsageReposito
93
95
  });
94
96
  };
95
97
 
98
+ getTokenInFlightCounts = async (): Promise<Record<string, number>> => {
99
+ const counts: Record<string, number> = {};
100
+ let procEntries: string[];
101
+ try {
102
+ procEntries = fs.readdirSync('/proc');
103
+ } catch {
104
+ return counts;
105
+ }
106
+ for (const entry of procEntries) {
107
+ if (!/^\d+$/.test(entry)) continue;
108
+ const environPath = path.join('/proc', entry, 'environ');
109
+ let environ: string;
110
+ try {
111
+ environ = fs.readFileSync(environPath, 'utf8');
112
+ } catch {
113
+ continue;
114
+ }
115
+ const vars = environ.split('\0');
116
+ const tokenEntry = vars.find((v) =>
117
+ v.startsWith('CLAUDE_CODE_OAUTH_TOKEN='),
118
+ );
119
+ if (tokenEntry === undefined) continue;
120
+ const token = tokenEntry.slice('CLAUDE_CODE_OAUTH_TOKEN='.length);
121
+ if (token.length === 0) continue;
122
+ counts[token] = (counts[token] ?? 0) + 1;
123
+ }
124
+ return counts;
125
+ };
126
+
96
127
  proxyBaseUrl = (): string => `http://127.0.0.1:${this.port}`;
97
128
  }
@@ -220,7 +220,10 @@ type PullRequestFilesResponseItem = {
220
220
  function isPullRequestFilesResponse(
221
221
  value: unknown,
222
222
  ): value is PullRequestFilesResponseItem[] {
223
- return typia.is<PullRequestFilesResponseItem[]>(value);
223
+ if (!Array.isArray(value)) return false;
224
+ return value.every(
225
+ (item) => typeof item === 'object' && item !== null && 'filename' in item,
226
+ );
224
227
  }
225
228
 
226
229
  const fnmatch = (pattern: string, str: string): boolean => {
@@ -1174,6 +1177,45 @@ export class ApiV3CheerioRestIssueRepository
1174
1177
  }
1175
1178
  };
1176
1179
 
1180
+ requestChangesWithInlineComment = async (
1181
+ prUrl: string,
1182
+ changedFilePath: string | null,
1183
+ commentBody: string,
1184
+ ): Promise<void> => {
1185
+ const { owner, repo, issueNumber: prNumber } = this.parseIssueUrl(prUrl);
1186
+ if (changedFilePath === null) {
1187
+ await this.createCommentByUrl(prUrl, commentBody);
1188
+ return;
1189
+ }
1190
+ const reviewBody: Record<string, unknown> = {
1191
+ event: 'REQUEST_CHANGES',
1192
+ comments: [
1193
+ {
1194
+ path: changedFilePath,
1195
+ position: 1,
1196
+ body: commentBody,
1197
+ },
1198
+ ],
1199
+ };
1200
+ const response = await fetch(
1201
+ `https://api.github.com/repos/${owner}/${repo}/pulls/${prNumber}/reviews`,
1202
+ {
1203
+ method: 'POST',
1204
+ headers: {
1205
+ Authorization: `Bearer ${this.ghToken}`,
1206
+ 'Content-Type': 'application/json',
1207
+ Accept: 'application/vnd.github+json',
1208
+ },
1209
+ body: JSON.stringify(reviewBody),
1210
+ },
1211
+ );
1212
+ if (!response.ok) {
1213
+ throw new Error(
1214
+ `Failed to request changes on PR ${prUrl}: HTTP ${response.status}`,
1215
+ );
1216
+ }
1217
+ };
1218
+
1177
1219
  deletePullRequestBranch = async (
1178
1220
  prUrl: string,
1179
1221
  branchName: string,
@@ -128,4 +128,43 @@ describe('ChangeTargetPullRequestApprover', () => {
128
128
  ).not.toHaveBeenCalled();
129
129
  expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
130
130
  });
131
+
132
+ it('should treat change-target-must: path as an allowed confinement path and approve when all files are confined to it', async () => {
133
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
134
+ 'src/domain/entities/Foo.ts',
135
+ 'src/domain/usecases/Bar.ts',
136
+ ]);
137
+
138
+ await approver.approveIfConfined(['change-target-must:src/domain'], prUrl);
139
+
140
+ expect(
141
+ mockIssueRepository.getPullRequestChangedFilePaths,
142
+ ).toHaveBeenCalledWith(prUrl);
143
+ expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(prUrl);
144
+ });
145
+
146
+ it('should not approve when a file is outside the change-target-must path', async () => {
147
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
148
+ 'src/domain/entities/Foo.ts',
149
+ 'src/adapter/Outside.ts',
150
+ ]);
151
+
152
+ await approver.approveIfConfined(['change-target-must:src/domain'], prUrl);
153
+
154
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
155
+ });
156
+
157
+ it('should not approve when a file is outside both change-target and change-target-must allowed paths', async () => {
158
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
159
+ 'src/domain/Foo.ts',
160
+ 'unrelated/Outside.ts',
161
+ ]);
162
+
163
+ await approver.approveIfConfined(
164
+ ['change-target:src/domain', 'change-target-must:docs'],
165
+ prUrl,
166
+ );
167
+
168
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
169
+ });
131
170
  });
@@ -34,11 +34,12 @@ export class ChangeTargetPullRequestApprover {
34
34
  };
35
35
 
36
36
  private extractChangeTargetPaths = (labels: string[]): string[] => {
37
- const prefix = 'change-target:';
37
+ const prefixes = ['change-target:', 'change-target-must:'];
38
38
  const paths: string[] = [];
39
39
  for (const label of labels) {
40
- if (!label.startsWith(prefix)) continue;
41
- const raw = label.slice(prefix.length).trim();
40
+ const matchedPrefix = prefixes.find((p) => label.startsWith(p));
41
+ if (!matchedPrefix) continue;
42
+ const raw = label.slice(matchedPrefix.length).trim();
42
43
  if (raw.length === 0) continue;
43
44
  const normalized = raw.replace(/\/+$/, '');
44
45
  if (normalized.length === 0) continue;
@@ -78,6 +78,8 @@ describe('CheckIssueReviewReadinessUseCase', () => {
78
78
  get: jest.Mock;
79
79
  findRelatedOpenPRs: jest.Mock;
80
80
  getOpenPullRequest: jest.Mock;
81
+ getPullRequestChangedFilePaths: jest.Mock;
82
+ requestChangesWithInlineComment: jest.Mock;
81
83
  };
82
84
  let useCase: CheckIssueReviewReadinessUseCase;
83
85
  let mockProject: Project;
@@ -95,6 +97,8 @@ describe('CheckIssueReviewReadinessUseCase', () => {
95
97
  get: jest.fn(),
96
98
  findRelatedOpenPRs: jest.fn(),
97
99
  getOpenPullRequest: jest.fn(),
100
+ getPullRequestChangedFilePaths: jest.fn().mockResolvedValue([]),
101
+ requestChangesWithInlineComment: jest.fn().mockResolvedValue(undefined),
98
102
  };
99
103
 
100
104
  useCase = new CheckIssueReviewReadinessUseCase(
@@ -18,7 +18,11 @@ export class CheckIssueReviewReadinessUseCase {
18
18
  private readonly projectRepository: Pick<ProjectRepository, 'getByUrl'>,
19
19
  private readonly issueRepository: Pick<
20
20
  IssueRepository,
21
- 'get' | 'findRelatedOpenPRs' | 'getOpenPullRequest'
21
+ | 'get'
22
+ | 'findRelatedOpenPRs'
23
+ | 'getOpenPullRequest'
24
+ | 'getPullRequestChangedFilePaths'
25
+ | 'requestChangesWithInlineComment'
22
26
  >,
23
27
  ) {
24
28
  this.issueRejectionEvaluator = new IssueRejectionEvaluator(issueRepository);
@@ -22,6 +22,8 @@ describe('IssueRejectionEvaluator', () => {
22
22
  let mockIssueRepository: {
23
23
  findRelatedOpenPRs: jest.Mock;
24
24
  getOpenPullRequest: jest.Mock;
25
+ getPullRequestChangedFilePaths: jest.Mock;
26
+ requestChangesWithInlineComment: jest.Mock;
25
27
  };
26
28
  let evaluator: IssueRejectionEvaluator;
27
29
 
@@ -31,6 +33,8 @@ describe('IssueRejectionEvaluator', () => {
31
33
  mockIssueRepository = {
32
34
  findRelatedOpenPRs: jest.fn(),
33
35
  getOpenPullRequest: jest.fn(),
36
+ getPullRequestChangedFilePaths: jest.fn().mockResolvedValue([]),
37
+ requestChangesWithInlineComment: jest.fn().mockResolvedValue(undefined),
34
38
  };
35
39
 
36
40
  evaluator = new IssueRejectionEvaluator(mockIssueRepository);
@@ -200,5 +204,142 @@ describe('IssueRejectionEvaluator', () => {
200
204
  expect(result.rejections).toHaveLength(1);
201
205
  expect(result.rejections[0].type).toBe('PULL_REQUEST_NOT_FOUND');
202
206
  });
207
+
208
+ describe('change-target-must: label behavior', () => {
209
+ const prUrl = 'https://github.com/user/repo/pull/1';
210
+
211
+ it('should not reject when required path contains at least one changed file', async () => {
212
+ mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
213
+ createReadyPr(prUrl),
214
+ ]);
215
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
216
+ 'src/domain/entities/Foo.ts',
217
+ 'src/adapter/Bar.ts',
218
+ ]);
219
+
220
+ const result = await evaluator.evaluate({
221
+ url: 'https://github.com/user/repo/issues/1',
222
+ labels: ['change-target-must:src/domain'],
223
+ isPr: false,
224
+ });
225
+
226
+ expect(result.rejections).toHaveLength(0);
227
+ expect(result.approvedPrUrl).toBe(prUrl);
228
+ expect(
229
+ mockIssueRepository.requestChangesWithInlineComment,
230
+ ).not.toHaveBeenCalled();
231
+ });
232
+
233
+ it('should reject with CHANGE_TARGET_MUST_PATH_NOT_CHANGED and post inline comment when required path has no changed file', async () => {
234
+ mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
235
+ createReadyPr(prUrl),
236
+ ]);
237
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
238
+ 'src/adapter/Bar.ts',
239
+ ]);
240
+
241
+ const result = await evaluator.evaluate({
242
+ url: 'https://github.com/user/repo/issues/1',
243
+ labels: ['change-target-must:src/domain'],
244
+ isPr: false,
245
+ });
246
+
247
+ expect(result.rejections).toHaveLength(1);
248
+ expect(result.rejections[0].type).toBe(
249
+ 'CHANGE_TARGET_MUST_PATH_NOT_CHANGED',
250
+ );
251
+ expect(result.rejections[0].detail).toContain('src/domain');
252
+ expect(result.approvedPrUrl).toBeNull();
253
+ expect(
254
+ mockIssueRepository.requestChangesWithInlineComment,
255
+ ).toHaveBeenCalledWith(
256
+ prUrl,
257
+ 'src/adapter/Bar.ts',
258
+ expect.stringContaining('src/domain'),
259
+ );
260
+ });
261
+
262
+ it('should post PR-level comment as fallback when PR has no changed files', async () => {
263
+ mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
264
+ createReadyPr(prUrl),
265
+ ]);
266
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue(
267
+ [],
268
+ );
269
+
270
+ const result = await evaluator.evaluate({
271
+ url: 'https://github.com/user/repo/issues/1',
272
+ labels: ['change-target-must:src/domain'],
273
+ isPr: false,
274
+ });
275
+
276
+ expect(result.rejections).toHaveLength(1);
277
+ expect(result.rejections[0].type).toBe(
278
+ 'CHANGE_TARGET_MUST_PATH_NOT_CHANGED',
279
+ );
280
+ expect(
281
+ mockIssueRepository.requestChangesWithInlineComment,
282
+ ).toHaveBeenCalledWith(prUrl, null, expect.any(String));
283
+ });
284
+
285
+ it('should match boundary-safely so that change-target-must:foo matches foo/bar.ts but not foobar/baz.ts', async () => {
286
+ mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
287
+ createReadyPr(prUrl),
288
+ ]);
289
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
290
+ 'foobar/baz.ts',
291
+ ]);
292
+
293
+ const result = await evaluator.evaluate({
294
+ url: 'https://github.com/user/repo/issues/1',
295
+ labels: ['change-target-must:foo'],
296
+ isPr: false,
297
+ });
298
+
299
+ expect(result.rejections).toHaveLength(1);
300
+ expect(result.rejections[0].type).toBe(
301
+ 'CHANGE_TARGET_MUST_PATH_NOT_CHANGED',
302
+ );
303
+ expect(
304
+ mockIssueRepository.requestChangesWithInlineComment,
305
+ ).toHaveBeenCalledWith(prUrl, 'foobar/baz.ts', expect.any(String));
306
+ });
307
+
308
+ it('should not reject when changed file is exactly the required path (boundary-safe exact match)', async () => {
309
+ mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
310
+ createReadyPr(prUrl),
311
+ ]);
312
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
313
+ 'foo',
314
+ ]);
315
+
316
+ const result = await evaluator.evaluate({
317
+ url: 'https://github.com/user/repo/issues/1',
318
+ labels: ['change-target-must:foo'],
319
+ isPr: false,
320
+ });
321
+
322
+ expect(result.rejections).toHaveLength(0);
323
+ expect(result.approvedPrUrl).toBe(prUrl);
324
+ });
325
+
326
+ it('should not reject when changed file is under the change-target-must path', async () => {
327
+ mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
328
+ createReadyPr(prUrl),
329
+ ]);
330
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
331
+ 'src/domain/entities/Foo.ts',
332
+ ]);
333
+
334
+ const result = await evaluator.evaluate({
335
+ url: 'https://github.com/user/repo/issues/1',
336
+ labels: ['change-target-must:src/domain'],
337
+ isPr: false,
338
+ });
339
+
340
+ expect(result.rejections).toHaveLength(0);
341
+ expect(result.approvedPrUrl).toBe(prUrl);
342
+ });
343
+ });
203
344
  });
204
345
  });
@@ -10,7 +10,8 @@ export type PrRejectedReasonType =
10
10
  | 'PULL_REQUEST_CONFLICTED'
11
11
  | 'ANY_CI_JOB_FAILED_OR_IN_PROGRESS'
12
12
  | 'REQUIRED_CI_JOB_NEVER_STARTED'
13
- | 'ANY_REVIEW_COMMENT_NOT_RESOLVED';
13
+ | 'ANY_REVIEW_COMMENT_NOT_RESOLVED'
14
+ | 'CHANGE_TARGET_MUST_PATH_NOT_CHANGED';
14
15
 
15
16
  export type PrRejectionResult = {
16
17
  rejections: { type: PrRejectedReasonType; detail: string }[];
@@ -21,7 +22,10 @@ export class IssueRejectionEvaluator {
21
22
  constructor(
22
23
  private readonly issueRepository: Pick<
23
24
  IssueRepository,
24
- 'findRelatedOpenPRs' | 'getOpenPullRequest'
25
+ | 'findRelatedOpenPRs'
26
+ | 'getOpenPullRequest'
27
+ | 'getPullRequestChangedFilePaths'
28
+ | 'requestChangesWithInlineComment'
25
29
  >,
26
30
  ) {}
27
31
 
@@ -103,11 +107,40 @@ export class IssueRejectionEvaluator {
103
107
  detail: `ANY_REVIEW_COMMENT_NOT_RESOLVED: ${pr.url}`,
104
108
  });
105
109
  }
110
+
111
+ const mustPaths = this.extractChangeTargetMustPaths(issue.labels);
112
+ if (mustPaths.length > 0) {
113
+ const changedFilePaths =
114
+ await this.issueRepository.getPullRequestChangedFilePaths(pr.url);
115
+ for (const mustPath of mustPaths) {
116
+ const hasChange = changedFilePaths.some((filePath) =>
117
+ this.isFilePathUnderPath(filePath, mustPath),
118
+ );
119
+ if (!hasChange) {
120
+ rejections.push({
121
+ type: 'CHANGE_TARGET_MUST_PATH_NOT_CHANGED',
122
+ detail: `CHANGE_TARGET_MUST_PATH_NOT_CHANGED: ${mustPath}`,
123
+ });
124
+ const firstChangedFile =
125
+ changedFilePaths.length > 0 ? changedFilePaths[0] : null;
126
+ const commentBody = `The directory \`${mustPath}\` must contain at least one changed file in this pull request.`;
127
+ await this.issueRepository.requestChangesWithInlineComment(
128
+ pr.url,
129
+ firstChangedFile,
130
+ commentBody,
131
+ );
132
+ }
133
+ }
134
+ }
135
+
106
136
  if (
107
137
  !pr.isDraft &&
108
138
  !pr.isConflicted &&
109
139
  pr.isPassedAllCiJob &&
110
- pr.isResolvedAllReviewComments
140
+ pr.isResolvedAllReviewComments &&
141
+ rejections.filter(
142
+ (r) => r.type === 'CHANGE_TARGET_MUST_PATH_NOT_CHANGED',
143
+ ).length === 0
111
144
  ) {
112
145
  approvedPrUrl = pr.url;
113
146
  }
@@ -126,4 +159,24 @@ export class IssueRejectionEvaluator {
126
159
  }
127
160
  return [pr];
128
161
  };
162
+
163
+ private extractChangeTargetMustPaths = (labels: string[]): string[] => {
164
+ const prefix = 'change-target-must:';
165
+ const paths: string[] = [];
166
+ for (const label of labels) {
167
+ if (!label.startsWith(prefix)) continue;
168
+ const raw = label.slice(prefix.length).trim();
169
+ if (raw.length === 0) continue;
170
+ const normalized = raw.replace(/\/+$/, '');
171
+ if (normalized.length === 0) continue;
172
+ paths.push(normalized);
173
+ }
174
+ return paths;
175
+ };
176
+
177
+ private isFilePathUnderPath = (
178
+ filePath: string,
179
+ targetPath: string,
180
+ ): boolean =>
181
+ filePath === targetPath || filePath.startsWith(`${targetPath}/`);
129
182
  }
@@ -96,6 +96,7 @@ describe('NotifyFinishedIssuePreparationUseCase', () => {
96
96
  getOpenPullRequest: jest.Mock;
97
97
  getPullRequestChangedFilePaths: jest.Mock;
98
98
  approvePullRequest: jest.Mock;
99
+ requestChangesWithInlineComment: jest.Mock;
99
100
  setDependedIssueUrl: jest.Mock;
100
101
  };
101
102
  let mockIssueCommentRepository: {
@@ -130,6 +131,7 @@ describe('NotifyFinishedIssuePreparationUseCase', () => {
130
131
  getOpenPullRequest: jest.fn(),
131
132
  getPullRequestChangedFilePaths: jest.fn().mockResolvedValue([]),
132
133
  approvePullRequest: jest.fn().mockResolvedValue(undefined),
134
+ requestChangesWithInlineComment: jest.fn().mockResolvedValue(undefined),
133
135
  setDependedIssueUrl: jest.fn(),
134
136
  };
135
137