@einja/dev-cli 0.1.9 → 0.1.11

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 (251) hide show
  1. package/README.md +30 -2
  2. package/dist/cli.js +3 -6
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/init.d.ts.map +1 -1
  5. package/dist/commands/init.js +11 -6
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/list.js +1 -1
  8. package/dist/commands/list.js.map +1 -1
  9. package/dist/commands/sync.d.ts.map +1 -1
  10. package/dist/commands/sync.js +69 -7
  11. package/dist/commands/sync.js.map +1 -1
  12. package/dist/commands/sync.test.js +11 -25
  13. package/dist/commands/sync.test.js.map +1 -1
  14. package/dist/commands/task-loop/index.d.ts.map +1 -1
  15. package/dist/commands/task-loop/index.js +5 -2
  16. package/dist/commands/task-loop/index.js.map +1 -1
  17. package/dist/commands/task-loop/lib/__mocks__/child-process.mock.d.ts +227 -0
  18. package/dist/commands/task-loop/lib/__mocks__/child-process.mock.d.ts.map +1 -0
  19. package/dist/commands/task-loop/lib/__mocks__/child-process.mock.js +351 -0
  20. package/dist/commands/task-loop/lib/__mocks__/child-process.mock.js.map +1 -0
  21. package/dist/commands/task-loop/lib/__mocks__/sample-issues.d.ts +46 -0
  22. package/dist/commands/task-loop/lib/__mocks__/sample-issues.d.ts.map +1 -0
  23. package/dist/commands/task-loop/lib/__mocks__/sample-issues.js +224 -0
  24. package/dist/commands/task-loop/lib/__mocks__/sample-issues.js.map +1 -0
  25. package/dist/commands/task-loop/lib/branch-manager.d.ts.map +1 -1
  26. package/dist/commands/task-loop/lib/branch-manager.js +14 -8
  27. package/dist/commands/task-loop/lib/branch-manager.js.map +1 -1
  28. package/dist/commands/task-loop/lib/branch-manager.test.d.ts +2 -0
  29. package/dist/commands/task-loop/lib/branch-manager.test.d.ts.map +1 -0
  30. package/dist/commands/task-loop/lib/branch-manager.test.js +539 -0
  31. package/dist/commands/task-loop/lib/branch-manager.test.js.map +1 -0
  32. package/dist/commands/task-loop/lib/conflict-handler.js +1 -1
  33. package/dist/commands/task-loop/lib/conflict-handler.js.map +1 -1
  34. package/dist/commands/task-loop/lib/dependency-resolver.test.d.ts +2 -0
  35. package/dist/commands/task-loop/lib/dependency-resolver.test.d.ts.map +1 -0
  36. package/dist/commands/task-loop/lib/dependency-resolver.test.js +1129 -0
  37. package/dist/commands/task-loop/lib/dependency-resolver.test.js.map +1 -0
  38. package/dist/commands/task-loop/lib/gh-setup.d.ts.map +1 -1
  39. package/dist/commands/task-loop/lib/gh-setup.js.map +1 -1
  40. package/dist/commands/task-loop/lib/github-client.d.ts.map +1 -1
  41. package/dist/commands/task-loop/lib/github-client.js +3 -3
  42. package/dist/commands/task-loop/lib/github-client.js.map +1 -1
  43. package/dist/commands/task-loop/lib/github-client.test.d.ts +2 -0
  44. package/dist/commands/task-loop/lib/github-client.test.d.ts.map +1 -0
  45. package/dist/commands/task-loop/lib/github-client.test.js +377 -0
  46. package/dist/commands/task-loop/lib/github-client.test.js.map +1 -0
  47. package/dist/commands/task-loop/lib/issue-parser.js +4 -4
  48. package/dist/commands/task-loop/lib/issue-parser.js.map +1 -1
  49. package/dist/commands/task-loop/lib/issue-parser.test.d.ts +2 -0
  50. package/dist/commands/task-loop/lib/issue-parser.test.d.ts.map +1 -0
  51. package/dist/commands/task-loop/lib/issue-parser.test.js +854 -0
  52. package/dist/commands/task-loop/lib/issue-parser.test.js.map +1 -0
  53. package/dist/commands/task-loop/lib/pull-request-manager.d.ts +35 -0
  54. package/dist/commands/task-loop/lib/pull-request-manager.d.ts.map +1 -0
  55. package/dist/commands/task-loop/lib/pull-request-manager.js +150 -0
  56. package/dist/commands/task-loop/lib/pull-request-manager.js.map +1 -0
  57. package/dist/commands/task-loop/lib/task-number-utils.d.ts +10 -4
  58. package/dist/commands/task-loop/lib/task-number-utils.d.ts.map +1 -1
  59. package/dist/commands/task-loop/lib/task-number-utils.js +19 -10
  60. package/dist/commands/task-loop/lib/task-number-utils.js.map +1 -1
  61. package/dist/commands/task-loop/lib/task-number-utils.test.d.ts +2 -0
  62. package/dist/commands/task-loop/lib/task-number-utils.test.d.ts.map +1 -0
  63. package/dist/commands/task-loop/lib/task-number-utils.test.js +379 -0
  64. package/dist/commands/task-loop/lib/task-number-utils.test.js.map +1 -0
  65. package/dist/commands/task-loop/lib/task-state-manager.d.ts.map +1 -1
  66. package/dist/commands/task-loop/lib/task-state-manager.js +1 -1
  67. package/dist/commands/task-loop/lib/task-state-manager.js.map +1 -1
  68. package/dist/commands/task-loop/lib/task-state-manager.test.d.ts +2 -0
  69. package/dist/commands/task-loop/lib/task-state-manager.test.d.ts.map +1 -0
  70. package/dist/commands/task-loop/lib/task-state-manager.test.js +541 -0
  71. package/dist/commands/task-loop/lib/task-state-manager.test.js.map +1 -0
  72. package/dist/lib/file-system.js +1 -1
  73. package/dist/lib/file-system.js.map +1 -1
  74. package/dist/lib/mcp-config.d.ts.map +1 -1
  75. package/dist/lib/mcp-config.js +8 -4
  76. package/dist/lib/mcp-config.js.map +1 -1
  77. package/dist/lib/mcp-config.test.js +2 -2
  78. package/dist/lib/mcp-config.test.js.map +1 -1
  79. package/dist/lib/merger.d.ts.map +1 -1
  80. package/dist/lib/merger.js.map +1 -1
  81. package/dist/lib/preset-update/cli-repo-detector.test.js.map +1 -1
  82. package/dist/lib/preset-update/file-copier.d.ts +2 -0
  83. package/dist/lib/preset-update/file-copier.d.ts.map +1 -1
  84. package/dist/lib/preset-update/file-copier.js +12 -8
  85. package/dist/lib/preset-update/file-copier.js.map +1 -1
  86. package/dist/lib/preset-update/file-copier.test.js +36 -5
  87. package/dist/lib/preset-update/file-copier.test.js.map +1 -1
  88. package/dist/lib/preset-update/preset-finder.d.ts +1 -1
  89. package/dist/lib/preset-update/preset-finder.d.ts.map +1 -1
  90. package/dist/lib/preset-update/preset-finder.js +1 -1
  91. package/dist/lib/preset-update/preset-finder.js.map +1 -1
  92. package/dist/lib/preset-update/preset-finder.test.js +11 -11
  93. package/dist/lib/preset-update/preset-finder.test.js.map +1 -1
  94. package/dist/lib/preset.js +3 -3
  95. package/dist/lib/preset.js.map +1 -1
  96. package/dist/lib/sync/backup-manager.d.ts.map +1 -1
  97. package/dist/lib/sync/backup-manager.js +1 -1
  98. package/dist/lib/sync/backup-manager.js.map +1 -1
  99. package/dist/lib/sync/backup-manager.test.js +2 -2
  100. package/dist/lib/sync/backup-manager.test.js.map +1 -1
  101. package/dist/lib/sync/batch-processor.d.ts.map +1 -1
  102. package/dist/lib/sync/batch-processor.js.map +1 -1
  103. package/dist/lib/sync/batch-processor.test.js.map +1 -1
  104. package/dist/lib/sync/category-validator.d.ts.map +1 -1
  105. package/dist/lib/sync/category-validator.js.map +1 -1
  106. package/dist/lib/sync/category-validator.test.js +2 -11
  107. package/dist/lib/sync/category-validator.test.js.map +1 -1
  108. package/dist/lib/sync/conflict-reporter.d.ts.map +1 -1
  109. package/dist/lib/sync/conflict-reporter.js +1 -2
  110. package/dist/lib/sync/conflict-reporter.js.map +1 -1
  111. package/dist/lib/sync/conflict-reporter.test.js +2 -7
  112. package/dist/lib/sync/conflict-reporter.test.js.map +1 -1
  113. package/dist/lib/sync/diff-engine.d.ts.map +1 -1
  114. package/dist/lib/sync/diff-engine.js +2 -4
  115. package/dist/lib/sync/diff-engine.js.map +1 -1
  116. package/dist/lib/sync/diff-engine.test.js.map +1 -1
  117. package/dist/lib/sync/file-filter.d.ts.map +1 -1
  118. package/dist/lib/sync/file-filter.js +26 -3
  119. package/dist/lib/sync/file-filter.js.map +1 -1
  120. package/dist/lib/sync/file-filter.test.js +26 -2
  121. package/dist/lib/sync/file-filter.test.js.map +1 -1
  122. package/dist/lib/sync/hash-cache.d.ts.map +1 -1
  123. package/dist/lib/sync/hash-cache.js.map +1 -1
  124. package/dist/lib/sync/hash-cache.test.js +2 -2
  125. package/dist/lib/sync/hash-cache.test.js.map +1 -1
  126. package/dist/lib/sync/integration.test.js +289 -2
  127. package/dist/lib/sync/integration.test.js.map +1 -1
  128. package/dist/lib/sync/marker-processor.d.ts +34 -10
  129. package/dist/lib/sync/marker-processor.d.ts.map +1 -1
  130. package/dist/lib/sync/marker-processor.js +142 -41
  131. package/dist/lib/sync/marker-processor.js.map +1 -1
  132. package/dist/lib/sync/marker-processor.test.js +134 -1
  133. package/dist/lib/sync/marker-processor.test.js.map +1 -1
  134. package/dist/lib/sync/metadata-manager.d.ts.map +1 -1
  135. package/dist/lib/sync/metadata-manager.js.map +1 -1
  136. package/dist/lib/sync/metadata-manager.test.js +4 -6
  137. package/dist/lib/sync/metadata-manager.test.js.map +1 -1
  138. package/dist/lib/sync/performance.test.js +2 -2
  139. package/dist/lib/sync/performance.test.js.map +1 -1
  140. package/dist/lib/sync/seed-synchronizer.d.ts +27 -0
  141. package/dist/lib/sync/seed-synchronizer.d.ts.map +1 -0
  142. package/dist/lib/sync/seed-synchronizer.js +72 -0
  143. package/dist/lib/sync/seed-synchronizer.js.map +1 -0
  144. package/dist/lib/sync/seed-synchronizer.test.d.ts +2 -0
  145. package/dist/lib/sync/seed-synchronizer.test.d.ts.map +1 -0
  146. package/dist/lib/sync/seed-synchronizer.test.js +147 -0
  147. package/dist/lib/sync/seed-synchronizer.test.js.map +1 -0
  148. package/dist/types/index.d.ts.map +1 -1
  149. package/dist/types/preset-update.d.ts +1 -1
  150. package/dist/types/sync.d.ts +4 -2
  151. package/dist/types/sync.d.ts.map +1 -1
  152. package/dist/types/sync.js.map +1 -1
  153. package/package.json +1 -2
  154. package/presets/default/.claude/agents/einja/backend-architect.md +1131 -0
  155. package/presets/{minimal/.claude/agents/einja/frontend → default/.claude/agents/einja}/design-engineer.md +1 -1
  156. package/presets/{minimal/.claude/agents/einja/frontend → default/.claude/agents/einja}/frontend-architect.md +1 -1
  157. package/presets/{minimal/.claude/agents/einja/frontend → default/.claude/agents/einja}/frontend-coder.md +1 -37
  158. package/presets/{minimal → default}/.claude/agents/einja/task/task-committer.md +12 -6
  159. package/presets/{minimal → default}/.claude/agents/einja/task/task-executer.md +9 -9
  160. package/presets/{minimal → default}/.claude/commands/einja/frontend-implement.md +1 -1
  161. package/presets/{minimal → default}/.claude/commands/einja/update-docs-by-task-specs.md +6 -6
  162. package/presets/{minimal/.claude/skills/einja/api-development → default/.claude/skills/einja-api-development}/SKILL.md +5 -5
  163. package/presets/{minimal/.claude/skills/einja/backend-architecture → default/.claude/skills/einja-backend-architecture}/SKILL.md +5 -5
  164. package/presets/{minimal/.claude/skills/einja/coding-standards → default/.claude/skills/einja-coding-standards}/SKILL.md +6 -6
  165. package/presets/{minimal/.claude/skills/einja/component-design → default/.claude/skills/einja-component-design}/SKILL.md +6 -6
  166. package/presets/{minimal/.claude/skills/einja/frontend-development → default/.claude/skills/einja-frontend-development}/SKILL.md +5 -5
  167. package/presets/{minimal/.claude/skills/einja/output-format → default/.claude/skills/einja-output-format}/SKILL.md +54 -5
  168. package/presets/{minimal → default}/preset.yaml +1 -1
  169. package/presets/{minimal → default}/symlinks.json +10 -10
  170. package/scaffolds/cli/preset.yaml +110 -0
  171. package/scaffolds/example/README.md +35 -0
  172. package/scaffolds/example/specs/issues/issue999-example-task/design.md +879 -0
  173. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/README.md +150 -0
  174. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-1.md +268 -0
  175. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-2.md +179 -0
  176. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-3.md +392 -0
  177. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/evidence/.gitkeep +0 -0
  178. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase2/2-1.md +459 -0
  179. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase2/evidence/.gitkeep +0 -0
  180. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/scenarios.md +125 -0
  181. package/scaffolds/example/specs/issues/issue999-example-task/requirements.md +494 -0
  182. package/scaffolds/example/specs/issues/issue999-example-task/tasks.md +212 -0
  183. package/scaffolds/instructions/deployment-setup.md +458 -0
  184. package/scaffolds/instructions/environment-setup.md +509 -0
  185. package/scaffolds/instructions/local-server-environment-and-worktree.md +539 -0
  186. package/scaffolds/instructions/task-execute.md +649 -0
  187. package/scaffolds/instructions/task-vibe-kanban-loop.md +495 -0
  188. package/scaffolds/memory/archive/.gitkeep +0 -0
  189. package/scaffolds/memory/decisions.md +35 -0
  190. package/scaffolds/memory/patterns.md +37 -0
  191. package/scaffolds/steering/README.md +42 -0
  192. package/scaffolds/steering/acceptance-criteria-and-qa-guide.md +11 -0
  193. package/scaffolds/steering/architecture.md +11 -0
  194. package/scaffolds/steering/branch-strategy.md +11 -0
  195. package/scaffolds/steering/commit-rules.md +12 -1
  196. package/scaffolds/steering/db-schema-design.md +11 -0
  197. package/scaffolds/steering/development/api-development.md +15 -4
  198. package/scaffolds/steering/development/backend-architecture.md +11 -0
  199. package/scaffolds/steering/development/frontend-development.md +11 -0
  200. package/scaffolds/steering/development/review-guidelines.md +11 -0
  201. package/scaffolds/steering/development/testing-strategy.md +85 -0
  202. package/scaffolds/steering/development-workflow.md +11 -0
  203. package/scaffolds/steering/infrastructure/deployment.md +11 -0
  204. package/scaffolds/steering/infrastructure/environment-variables.md +11 -0
  205. package/scaffolds/steering/product.md +11 -0
  206. package/scaffolds/steering/task-management.md +11 -0
  207. package/scaffolds/CLAUDE.md.template +0 -386
  208. /package/presets/{minimal → default}/.claude/agents/einja/docs/docs-updater.md +0 -0
  209. /package/presets/{minimal → default}/.claude/agents/einja/git/conflict-resolver.md +0 -0
  210. /package/presets/{minimal → default}/.claude/agents/einja/specs/spec-design-generator.md +0 -0
  211. /package/presets/{minimal → default}/.claude/agents/einja/specs/spec-qa-generator.md +0 -0
  212. /package/presets/{minimal → default}/.claude/agents/einja/specs/spec-requirements-generator.md +0 -0
  213. /package/presets/{minimal → default}/.claude/agents/einja/specs/spec-tasks-generator.md +0 -0
  214. /package/presets/{minimal → default}/.claude/agents/einja/task/task-modification-analyzer.md +0 -0
  215. /package/presets/{minimal → default}/.claude/agents/einja/task/task-qa.md +0 -0
  216. /package/presets/{minimal → default}/.claude/agents/einja/task/task-reviewer.md +0 -0
  217. /package/presets/{minimal → default}/.claude/commands/einja/spec-create.md +0 -0
  218. /package/presets/{minimal → default}/.claude/commands/einja/start-dev.md +0 -0
  219. /package/presets/{minimal → default}/.claude/commands/einja/sync-cursor-commands.md +0 -0
  220. /package/presets/{minimal → default}/.claude/commands/einja/task-exec.md +0 -0
  221. /package/presets/{minimal → default}/.claude/hooks/einja/biome-format.sh +0 -0
  222. /package/presets/{minimal → default}/.claude/hooks/einja/design-doc-check.sh +0 -0
  223. /package/presets/{minimal → default}/.claude/hooks/einja/detect-secrets.sh +0 -0
  224. /package/presets/{minimal → default}/.claude/hooks/einja/large-file-warning.sh +0 -0
  225. /package/presets/{minimal → default}/.claude/hooks/einja/playwright-resize.sh +0 -0
  226. /package/presets/{minimal → default}/.claude/hooks/einja/typecheck.sh +0 -0
  227. /package/presets/{minimal → default}/.claude/hooks/einja/unset-volta-recursion.sh +0 -0
  228. /package/presets/{minimal → default}/.claude/hooks/einja/validate-git-commit.sh +0 -0
  229. /package/presets/{minimal → default}/.claude/hooks/einja/warn-index-ts.sh +0 -0
  230. /package/presets/{minimal → default}/.claude/hooks/einja/warn-relative-import.sh +0 -0
  231. /package/presets/{minimal → default}/.claude/settings.json +0 -0
  232. /package/presets/{minimal/.claude/skills/einja/coding-standards → default/.claude/skills/einja-coding-standards}/reference/naming-conventions.md +0 -0
  233. /package/presets/{minimal/.claude/skills/einja/coding-standards → default/.claude/skills/einja-coding-standards}/reference/prohibited-patterns.md +0 -0
  234. /package/presets/{minimal/.claude/skills/einja/coding-standards → default/.claude/skills/einja-coding-standards}/reference/typescript-rules.md +0 -0
  235. /package/presets/{minimal/.claude/skills/einja/component-design → default/.claude/skills/einja-component-design}/reference/directory-structure.md +0 -0
  236. /package/presets/{minimal/.claude/skills/einja/component-design → default/.claude/skills/einja-component-design}/reference/props-patterns.md +0 -0
  237. /package/presets/{minimal/.claude/skills/einja/component-design → default/.claude/skills/einja-component-design}/reference/styling-guide.md +0 -0
  238. /package/presets/{minimal/.claude/skills/einja/conflict-resolver → default/.claude/skills/einja-conflict-resolver}/SKILL.md +0 -0
  239. /package/presets/{minimal/.claude/skills/einja/general-context-loader → default/.claude/skills/einja-general-context-loader}/SKILL.md +0 -0
  240. /package/presets/{minimal/.claude/skills/einja/spec-context-loader → default/.claude/skills/einja-spec-context-loader}/SKILL.md +0 -0
  241. /package/presets/{minimal/.claude/skills/einja/task-commit → default/.claude/skills/einja-task-commit}/SKILL.md +0 -0
  242. /package/presets/{minimal/.claude/skills/einja/task-qa → default/.claude/skills/einja-task-qa}/SKILL.md +0 -0
  243. /package/presets/{minimal/.claude/skills/einja/task-qa → default/.claude/skills/einja-task-qa}/reference/failure-patterns.md +0 -0
  244. /package/presets/{minimal/.claude/skills/einja/task-qa → default/.claude/skills/einja-task-qa}/reference/troubleshooting.md +0 -0
  245. /package/presets/{minimal/.claude/skills/einja/task-qa → default/.claude/skills/einja-task-qa}/reference/usage-patterns.md +0 -0
  246. /package/presets/{minimal/.claude/skills/einja/task-qa → default/.claude/skills/einja-task-qa}/templates/qa-test-template.md +0 -0
  247. /package/{templates → scaffolds/templates}/README.md +0 -0
  248. /package/{templates → scaffolds/templates}/design-simple.md.template +0 -0
  249. /package/{templates → scaffolds/templates}/design.md.template +0 -0
  250. /package/{templates → scaffolds/templates}/qa-test.md.template +0 -0
  251. /package/{templates → scaffolds/templates}/requirements.md.template +0 -0
@@ -0,0 +1,539 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ // conflict-handler モジュールをモック
3
+ vi.mock("./conflict-handler.js", () => ({
4
+ resolveConflictWithClaude: vi.fn(),
5
+ }));
6
+ // child_process モジュールをモック
7
+ vi.mock("node:child_process");
8
+ import { execSync } from "node:child_process";
9
+ import { branchExists, ensureIssueBranchWithoutCheckout, ensurePhaseBranchWithoutCheckout, fetchRemote, getDefaultBranch, getPhaseBranchName, getPhaseBranchNameNew, mergePhaseBranchIntoIssue, syncPhaseBranch, } from "./branch-manager.js";
10
+ import { resolveConflictWithClaude } from "./conflict-handler.js";
11
+ describe("branch-manager", () => {
12
+ beforeEach(() => {
13
+ vi.clearAllMocks();
14
+ });
15
+ describe("fetchRemote", () => {
16
+ it("git fetch origin を実行する", () => {
17
+ // Given: fetchRemote が呼び出される
18
+ vi.mocked(execSync).mockReturnValueOnce(Buffer.from(""));
19
+ // When: fetchRemote を実行
20
+ fetchRemote();
21
+ // Then: git fetch origin が実行される
22
+ expect(execSync).toHaveBeenCalledWith("git fetch origin", { stdio: "inherit" });
23
+ });
24
+ });
25
+ describe("getDefaultBranch", () => {
26
+ it("リモートのデフォルトブランチ名を返す", () => {
27
+ // Given: リモートのデフォルトブランチが main
28
+ vi.mocked(execSync).mockReturnValueOnce("main\n");
29
+ // When: getDefaultBranch を呼び出す
30
+ const result = getDefaultBranch();
31
+ // Then: main が返る
32
+ expect(result).toBe("main");
33
+ });
34
+ it("コマンド失敗時は main をデフォルトとして返す", () => {
35
+ // Given: git コマンドが失敗する
36
+ vi.mocked(execSync).mockImplementationOnce(() => {
37
+ throw new Error("command failed");
38
+ });
39
+ // When: getDefaultBranch を呼び出す
40
+ const result = getDefaultBranch();
41
+ // Then: デフォルト値 main が返る
42
+ expect(result).toBe("main");
43
+ });
44
+ });
45
+ describe("branchExists", () => {
46
+ it("ローカルブランチが存在する場合、true を返す", () => {
47
+ // Given: ローカルブランチが存在する
48
+ vi.mocked(execSync).mockReturnValueOnce(Buffer.from("commit-hash"));
49
+ // When: branchExists を呼び出す
50
+ const result = branchExists("feature/test");
51
+ // Then: true が返る
52
+ expect(result).toBe(true);
53
+ expect(execSync).toHaveBeenCalledWith("git rev-parse --verify feature/test", {
54
+ stdio: "ignore",
55
+ });
56
+ });
57
+ it("ローカルにはないがリモートブランチが存在する場合、true を返す", () => {
58
+ // Given: ローカルブランチは存在しないが、リモートブランチは存在する
59
+ vi.mocked(execSync)
60
+ .mockImplementationOnce(() => {
61
+ throw new Error("local branch not found");
62
+ })
63
+ .mockReturnValueOnce(Buffer.from("commit-hash"));
64
+ // When: branchExists を呼び出す
65
+ const result = branchExists("feature/test");
66
+ // Then: true が返る
67
+ expect(result).toBe(true);
68
+ expect(execSync).toHaveBeenCalledWith("git rev-parse --verify origin/feature/test", {
69
+ stdio: "ignore",
70
+ });
71
+ });
72
+ it("ローカルにもリモートにもブランチが存在しない場合、false を返す", () => {
73
+ // Given: ローカルにもリモートにもブランチが存在しない
74
+ vi.mocked(execSync).mockImplementation(() => {
75
+ throw new Error("branch not found");
76
+ });
77
+ // When: branchExists を呼び出す
78
+ const result = branchExists("non-existent");
79
+ // Then: false が返る
80
+ expect(result).toBe(false);
81
+ });
82
+ });
83
+ describe("getPhaseBranchNameNew", () => {
84
+ it("Phaseブランチ名を返す", () => {
85
+ // When: getPhaseBranchNameNew を呼び出す
86
+ const result = getPhaseBranchNameNew(123, 3);
87
+ // Then: issue/123-phase3 が返る
88
+ expect(result).toBe("issue/123-phase3");
89
+ });
90
+ });
91
+ describe("getPhaseBranchName", () => {
92
+ it("Phaseブランチ名を返す", () => {
93
+ // When: getPhaseBranchName を呼び出す
94
+ const result = getPhaseBranchName(123, 4);
95
+ // Then: issue/123-phase4 が返る
96
+ expect(result).toBe("issue/123-phase4");
97
+ });
98
+ });
99
+ describe("ensureIssueBranchWithoutCheckout", () => {
100
+ it("既存のIssueブランチの場合、チェックアウトせずに確認する", () => {
101
+ // Given: Issueブランチが既に存在する
102
+ vi.mocked(execSync)
103
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
104
+ .mockReturnValueOnce(Buffer.from("commit-hash")); // branchExists (local)
105
+ // When: ensureIssueBranchWithoutCheckout を呼び出す
106
+ const result = ensureIssueBranchWithoutCheckout(123, "main");
107
+ // Then: issue/123 が返り、チェックアウトコマンドは実行されない
108
+ expect(result).toBe("issue/123");
109
+ const commands = vi.mocked(execSync).mock.calls.map((call) => call[0]);
110
+ expect(commands.some((cmd) => String(cmd).includes("checkout"))).toBe(false);
111
+ });
112
+ it("Issueブランチが未存在の場合、チェックアウトせずに作成してプッシュする", () => {
113
+ // Given: Issueブランチが存在しない
114
+ vi.mocked(execSync)
115
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
116
+ .mockImplementationOnce(() => {
117
+ throw new Error("branch not found");
118
+ }) // branchExists local check fails
119
+ .mockImplementationOnce(() => {
120
+ throw new Error("remote branch not found");
121
+ }) // branchExists remote check fails
122
+ .mockReturnValueOnce(Buffer.from("")) // git branch (create)
123
+ .mockReturnValueOnce(Buffer.from("")); // git push
124
+ // When: ensureIssueBranchWithoutCheckout を呼び出す
125
+ const result = ensureIssueBranchWithoutCheckout(456, "develop");
126
+ // Then: issue/456 が作成され、プッシュされる
127
+ expect(result).toBe("issue/456");
128
+ expect(execSync).toHaveBeenCalledWith("git branch issue/456 origin/develop", {
129
+ stdio: "inherit",
130
+ });
131
+ expect(execSync).toHaveBeenCalledWith("git push -u origin issue/456", { stdio: "inherit" });
132
+ // チェックアウトコマンドは実行されない
133
+ const commands = vi.mocked(execSync).mock.calls.map((call) => call[0]);
134
+ expect(commands.some((cmd) => String(cmd).includes("checkout"))).toBe(false);
135
+ });
136
+ });
137
+ describe("ensurePhaseBranchWithoutCheckout", () => {
138
+ it("既存のPhaseブランチの場合、確認のみ行う", () => {
139
+ // Given: Phaseブランチが既に存在する
140
+ vi.mocked(execSync).mockReturnValueOnce(Buffer.from("commit-hash")); // branchExists
141
+ // When: ensurePhaseBranchWithoutCheckout を呼び出す
142
+ const result = ensurePhaseBranchWithoutCheckout(123, 1, "issue/123");
143
+ // Then: issue/123-phase1 が返る
144
+ expect(result).toBe("issue/123-phase1");
145
+ });
146
+ it("Phaseブランチが未存在の場合、作成してプッシュする", () => {
147
+ // Given: Phaseブランチが存在しない
148
+ vi.mocked(execSync)
149
+ .mockImplementationOnce(() => {
150
+ throw new Error("branch not found");
151
+ }) // branchExists local check fails
152
+ .mockImplementationOnce(() => {
153
+ throw new Error("remote branch not found");
154
+ }) // branchExists remote check fails
155
+ .mockReturnValueOnce(Buffer.from("")) // git branch
156
+ .mockReturnValueOnce(Buffer.from("")); // git push
157
+ // When: ensurePhaseBranchWithoutCheckout を呼び出す
158
+ const result = ensurePhaseBranchWithoutCheckout(456, 2, "issue/456");
159
+ // Then: issue/456-phase2 が作成され、プッシュされる
160
+ expect(result).toBe("issue/456-phase2");
161
+ expect(execSync).toHaveBeenCalledWith("git branch issue/456-phase2 issue/456", {
162
+ stdio: "inherit",
163
+ });
164
+ expect(execSync).toHaveBeenCalledWith("git push -u origin issue/456-phase2", {
165
+ stdio: "inherit",
166
+ });
167
+ });
168
+ });
169
+ describe("syncPhaseBranch", () => {
170
+ it("Phaseブランチがリモートに未存在の場合、Issueブランチから新規作成する", async () => {
171
+ // Given: Phaseブランチがリモートとローカルのどちらにも存在しない
172
+ vi.mocked(execSync)
173
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
174
+ .mockImplementationOnce(() => {
175
+ throw new Error("remote issue branch not found");
176
+ }) // issue branch remote check fails (syncIssueBranch内)
177
+ .mockImplementationOnce(() => {
178
+ throw new Error("remote phase branch not found");
179
+ }) // phase branch remote check fails
180
+ .mockImplementationOnce(() => {
181
+ throw new Error("local branch not found");
182
+ }) // branchExists local check fails
183
+ .mockImplementationOnce(() => {
184
+ throw new Error("remote branch not found");
185
+ }) // branchExists remote check fails
186
+ .mockReturnValueOnce(Buffer.from("")) // git branch (create)
187
+ .mockReturnValueOnce(Buffer.from("")); // git push
188
+ // When: syncPhaseBranch を呼び出す
189
+ const result = await syncPhaseBranch(123, 1, "issue/123", "main");
190
+ // Then: issue/123-phase1 が作成され、プッシュされる
191
+ expect(result).toBe("issue/123-phase1");
192
+ expect(execSync).toHaveBeenCalledWith("git branch issue/123-phase1 issue/123", {
193
+ stdio: "inherit",
194
+ });
195
+ expect(execSync).toHaveBeenCalledWith("git push -u origin issue/123-phase1", {
196
+ stdio: "inherit",
197
+ });
198
+ });
199
+ it("リモートにPhaseブランチが存在する場合、fetchして同期する", async () => {
200
+ // Given: Phaseブランチがリモートに存在する
201
+ vi.mocked(execSync)
202
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
203
+ .mockImplementationOnce(() => {
204
+ throw new Error("remote issue branch not found");
205
+ }) // issue branch remote check fails (syncIssueBranch内)
206
+ .mockReturnValueOnce(Buffer.from("commit-hash")) // remote phase branch exists
207
+ .mockReturnValueOnce(Buffer.from("")) // git fetch origin phase-branch
208
+ .mockImplementationOnce(() => {
209
+ throw new Error("local branch not found");
210
+ }) // local phase branch check fails
211
+ .mockReturnValueOnce(Buffer.from("")) // git branch (create from remote)
212
+ .mockReturnValueOnce("merge-base-commit\n") // merge-base (for mergeIssueBranchIntoPhase)
213
+ .mockReturnValueOnce("merge-base-commit\n"); // issue head (同じ = マージ済み)
214
+ // When: syncPhaseBranch を呼び出す
215
+ const result = await syncPhaseBranch(123, 1, "issue/123", "main");
216
+ // Then: issue/123-phase1 が返り、リモートからフェッチされる
217
+ expect(result).toBe("issue/123-phase1");
218
+ expect(execSync).toHaveBeenCalledWith("git fetch origin issue/123-phase1", {
219
+ stdio: "inherit",
220
+ });
221
+ expect(execSync).toHaveBeenCalledWith("git branch issue/123-phase1 origin/issue/123-phase1", {
222
+ stdio: "inherit",
223
+ });
224
+ });
225
+ it("ローカルのみの変更がある場合、マージする", async () => {
226
+ // Given: Phaseブランチがリモートに存在し、ローカルにも存在する
227
+ vi.mocked(execSync)
228
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
229
+ .mockImplementationOnce(() => {
230
+ throw new Error("remote issue branch not found");
231
+ }) // issue branch remote check fails (syncIssueBranch内)
232
+ .mockReturnValueOnce(Buffer.from("commit-hash")) // remote phase branch exists
233
+ .mockReturnValueOnce(Buffer.from("")) // git fetch origin phase-branch
234
+ .mockReturnValueOnce(Buffer.from("local-commit")) // local phase branch exists
235
+ // mergeRemoteIntoLocal の内部処理
236
+ .mockReturnValueOnce("local-commit\n") // git rev-parse local
237
+ .mockReturnValueOnce("remote-commit\n") // git rev-parse remote
238
+ .mockReturnValueOnce("main-branch\n") // getCurrentBranch
239
+ .mockReturnValueOnce(Buffer.from("")) // git merge-base --is-ancestor (fast-forward可能)
240
+ .mockReturnValueOnce(Buffer.from("")) // git branch -f
241
+ // mergeIssueBranchIntoPhase の内部処理
242
+ .mockReturnValueOnce("merge-base-commit\n") // merge-base
243
+ .mockReturnValueOnce("merge-base-commit\n"); // issue head (同じ = マージ済み)
244
+ // When: syncPhaseBranch を呼び出す
245
+ const result = await syncPhaseBranch(123, 1, "issue/123", "main");
246
+ // Then: issue/123-phase1 が返り、マージされる
247
+ expect(result).toBe("issue/123-phase1");
248
+ });
249
+ });
250
+ describe("mergePhaseBranchIntoIssue", () => {
251
+ it("Phaseブランチがリモートに未存在の場合、スキップする", async () => {
252
+ // Given: Phaseブランチがリモートに存在しない
253
+ vi.mocked(execSync)
254
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
255
+ .mockImplementationOnce(() => {
256
+ throw new Error("remote branch not found");
257
+ }); // rev-parse fails
258
+ // When: mergePhaseBranchIntoIssue を呼び出す
259
+ await mergePhaseBranchIntoIssue(123, 1, "issue/123");
260
+ // Then: マージがスキップされる(エラーなし)
261
+ expect(execSync).toHaveBeenCalledTimes(2); // fetchRemote + rev-parse check
262
+ });
263
+ it("Phaseブランチが既にマージ済みの場合、スキップする", async () => {
264
+ // Given: PhaseブランチがIssueブランチに既にマージ済み
265
+ vi.mocked(execSync)
266
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
267
+ .mockReturnValueOnce(Buffer.from("commit-hash")) // remote phase branch exists
268
+ .mockReturnValueOnce("phase-commit\n") // merge-base
269
+ .mockReturnValueOnce("phase-commit\n"); // phase head (同じ = マージ済み)
270
+ // When: mergePhaseBranchIntoIssue を呼び出す
271
+ await mergePhaseBranchIntoIssue(123, 1, "issue/123");
272
+ // Then: マージがスキップされる
273
+ expect(execSync).toHaveBeenCalledTimes(4);
274
+ });
275
+ it("GitHub APIでマージ成功する", async () => {
276
+ // Given: GitHub APIでマージが成功する
277
+ vi.mocked(execSync)
278
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
279
+ .mockReturnValueOnce(Buffer.from("commit-hash")) // remote phase branch exists
280
+ .mockReturnValueOnce("merge-base-commit\n") // merge-base
281
+ .mockReturnValueOnce("phase-head-commit\n") // phase head
282
+ .mockReturnValueOnce(Buffer.from("")) // gh auth status
283
+ .mockReturnValueOnce(Buffer.from("")) // gh api repos/.../merges
284
+ .mockReturnValueOnce(Buffer.from("")) // git fetch issue branch
285
+ .mockReturnValueOnce(Buffer.from("")); // git branch -f
286
+ // When: mergePhaseBranchIntoIssue を呼び出す
287
+ await mergePhaseBranchIntoIssue(123, 1, "issue/123");
288
+ // Then: GitHub APIでマージが実行される
289
+ expect(execSync).toHaveBeenCalledWith(expect.stringContaining('gh api repos/:owner/:repo/merges -f base="issue/123"'), expect.anything());
290
+ });
291
+ it("GitHub APIで409 Conflictの場合、worktreeで再試行する", async () => {
292
+ // Given: GitHub APIが409を返し、worktreeでマージ成功
293
+ vi.mocked(execSync)
294
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
295
+ .mockReturnValueOnce(Buffer.from("commit-hash")) // remote phase branch exists
296
+ .mockReturnValueOnce("merge-base-commit\n") // merge-base
297
+ .mockReturnValueOnce("phase-head-commit\n") // phase head
298
+ .mockReturnValueOnce(Buffer.from("")) // gh auth status
299
+ .mockImplementationOnce(() => {
300
+ throw new Error("409 Conflict");
301
+ }) // gh api で 409 エラー
302
+ .mockReturnValueOnce(Buffer.from("")) // git worktree add
303
+ .mockReturnValueOnce(Buffer.from("")) // git merge
304
+ .mockReturnValueOnce(Buffer.from("")) // git push
305
+ .mockReturnValueOnce(Buffer.from("")) // git worktree remove
306
+ .mockReturnValueOnce(Buffer.from("")) // git fetch issue branch
307
+ .mockReturnValueOnce(Buffer.from("")); // git branch -f
308
+ // When: mergePhaseBranchIntoIssue を呼び出す
309
+ await mergePhaseBranchIntoIssue(123, 1, "issue/123");
310
+ // Then: worktreeでマージが実行される
311
+ expect(execSync).toHaveBeenCalledWith(expect.stringContaining("git worktree add"), expect.anything());
312
+ });
313
+ it("worktreeでコンフリクト発生時、resolveConflictWithClaudeを呼び出す", async () => {
314
+ // Given: worktreeでコンフリクトが発生
315
+ vi.mocked(execSync)
316
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
317
+ .mockReturnValueOnce(Buffer.from("commit-hash")) // remote phase branch exists
318
+ .mockReturnValueOnce("merge-base-commit\n") // merge-base
319
+ .mockReturnValueOnce("phase-head-commit\n") // phase head
320
+ .mockReturnValueOnce(Buffer.from("")) // gh auth status
321
+ .mockImplementationOnce(() => {
322
+ throw new Error("409 Conflict");
323
+ }) // gh api で 409 エラー
324
+ .mockReturnValueOnce(Buffer.from("")) // git worktree add
325
+ .mockImplementationOnce(() => {
326
+ throw new Error("CONFLICT");
327
+ }); // git merge でコンフリクト
328
+ vi.mocked(resolveConflictWithClaude).mockResolvedValueOnce(true);
329
+ vi.mocked(execSync)
330
+ .mockReturnValueOnce(Buffer.from("")) // git push after resolve
331
+ .mockReturnValueOnce(Buffer.from("")) // git worktree remove
332
+ .mockReturnValueOnce(Buffer.from("")) // git fetch issue branch
333
+ .mockReturnValueOnce(Buffer.from("")); // git branch -f
334
+ // When: mergePhaseBranchIntoIssue を呼び出す
335
+ await mergePhaseBranchIntoIssue(123, 1, "issue/123");
336
+ // Then: resolveConflictWithClaude が呼び出される
337
+ expect(resolveConflictWithClaude).toHaveBeenCalledWith({
338
+ targetBranch: "issue/123",
339
+ sourceBranch: "issue/123-phase1",
340
+ operationType: "phase",
341
+ }, expect.stringContaining("merge-work-"));
342
+ });
343
+ it("resolveConflictWithClaudeが失敗した場合、エラーをスローする", async () => {
344
+ // Given: コンフリクト解消が失敗
345
+ vi.mocked(execSync)
346
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
347
+ .mockReturnValueOnce(Buffer.from("commit-hash")) // remote phase branch exists
348
+ .mockReturnValueOnce("merge-base-commit\n") // merge-base
349
+ .mockReturnValueOnce("phase-head-commit\n") // phase head
350
+ .mockReturnValueOnce(Buffer.from("")) // gh auth status
351
+ .mockImplementationOnce(() => {
352
+ throw new Error("409 Conflict");
353
+ })
354
+ .mockReturnValueOnce(Buffer.from("")) // git worktree add
355
+ .mockImplementationOnce(() => {
356
+ throw new Error("CONFLICT");
357
+ });
358
+ vi.mocked(resolveConflictWithClaude).mockResolvedValueOnce(false);
359
+ vi.mocked(execSync).mockReturnValueOnce(Buffer.from("")); // git worktree remove
360
+ // When/Then: エラーがスローされる
361
+ await expect(mergePhaseBranchIntoIssue(123, 1, "issue/123")).rejects.toThrow("Issue ブランチ issue/123 への Phase ブランチ issue/123-phase1 のマージでコンフリクトを解消できませんでした。");
362
+ // Then: worktree がクリーンアップされる
363
+ expect(execSync).toHaveBeenCalledWith(expect.stringContaining("git worktree remove"), expect.objectContaining({ stdio: "ignore" }));
364
+ });
365
+ });
366
+ describe("mergeRemoteIntoLocal - fast-forward vs merge", () => {
367
+ it("fast-forward可能な場合、fast-forwardマージする", async () => {
368
+ // Given: Issueブランチがリモートに存在し、fast-forward可能
369
+ vi.mocked(execSync)
370
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
371
+ .mockReturnValueOnce(Buffer.from("commit-hash")) // remote issue branch exists
372
+ .mockReturnValueOnce(Buffer.from("")) // git fetch origin issue/123
373
+ .mockReturnValueOnce(Buffer.from("local-commit")) // local issue branch exists
374
+ .mockReturnValueOnce("local-commit\n") // git rev-parse local
375
+ .mockReturnValueOnce("remote-commit\n") // git rev-parse remote
376
+ .mockReturnValueOnce("main\n") // getCurrentBranch
377
+ .mockReturnValueOnce(Buffer.from("")) // git merge-base --is-ancestor (fast-forward可能)
378
+ .mockReturnValueOnce(Buffer.from("")) // git branch -f
379
+ .mockReturnValueOnce("merge-base-commit\n") // merge-base (for mergeBaseBranchIntoIssue)
380
+ .mockReturnValueOnce("merge-base-commit\n") // base head (同じ = マージ済み)
381
+ .mockImplementationOnce(() => {
382
+ throw new Error("remote phase branch not found");
383
+ }) // phase branch remote check fails
384
+ .mockImplementationOnce(() => {
385
+ throw new Error("local branch not found");
386
+ }) // branchExists local check fails
387
+ .mockImplementationOnce(() => {
388
+ throw new Error("remote branch not found");
389
+ }) // branchExists remote check fails
390
+ .mockReturnValueOnce(Buffer.from("")) // git branch (create)
391
+ .mockReturnValueOnce(Buffer.from("")); // git push
392
+ // When: syncIssueBranch を呼び出す(内部で mergeRemoteIntoLocal が呼ばれる)
393
+ await syncPhaseBranch(123, 1, "issue/123", "main");
394
+ // Then: fast-forwardマージが実行される(git branch -f)
395
+ expect(execSync).toHaveBeenCalledWith(expect.stringContaining("git branch -f issue/123 origin/issue/123"), expect.anything());
396
+ });
397
+ it("fast-forward不可の場合、通常マージする(worktree使用)", async () => {
398
+ // Given: Issueブランチがリモートに存在し、fast-forward不可
399
+ vi.mocked(execSync)
400
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
401
+ .mockReturnValueOnce(Buffer.from("commit-hash")) // remote issue branch exists
402
+ .mockReturnValueOnce(Buffer.from("")) // git fetch origin issue/123
403
+ .mockReturnValueOnce(Buffer.from("local-commit")) // local issue branch exists
404
+ .mockReturnValueOnce("local-commit\n") // git rev-parse local
405
+ .mockReturnValueOnce("remote-commit\n") // git rev-parse remote
406
+ .mockReturnValueOnce("main\n") // getCurrentBranch
407
+ .mockImplementationOnce(() => {
408
+ throw new Error("not ancestor");
409
+ }) // git merge-base --is-ancestor (fast-forward不可)
410
+ .mockImplementationOnce(() => {
411
+ throw new Error("not ancestor");
412
+ }) // git merge-base --is-ancestor (プッシュも不可)
413
+ .mockReturnValueOnce(Buffer.from("")) // git worktree add
414
+ .mockReturnValueOnce(Buffer.from("")) // git merge
415
+ .mockReturnValueOnce(Buffer.from("")) // git push
416
+ .mockReturnValueOnce(Buffer.from("")) // git worktree remove
417
+ .mockReturnValueOnce("merge-base-commit\n") // merge-base (for mergeBaseBranchIntoIssue)
418
+ .mockReturnValueOnce("merge-base-commit\n") // base head (同じ = マージ済み)
419
+ .mockImplementationOnce(() => {
420
+ throw new Error("remote phase branch not found");
421
+ }) // phase branch remote check fails
422
+ .mockImplementationOnce(() => {
423
+ throw new Error("local branch not found");
424
+ }) // branchExists local check fails
425
+ .mockImplementationOnce(() => {
426
+ throw new Error("remote branch not found");
427
+ }) // branchExists remote check fails
428
+ .mockReturnValueOnce(Buffer.from("")) // git branch (create)
429
+ .mockReturnValueOnce(Buffer.from("")); // git push
430
+ // When: syncIssueBranch を呼び出す
431
+ await syncPhaseBranch(123, 1, "issue/123", "main");
432
+ // Then: worktreeでマージが実行される
433
+ expect(execSync).toHaveBeenCalledWith(expect.stringContaining("git worktree add"), expect.anything());
434
+ expect(execSync).toHaveBeenCalledWith(expect.stringContaining("git -C"), expect.anything());
435
+ });
436
+ });
437
+ describe("gh-auth 失敗時の処理", () => {
438
+ it("gh auth statusが失敗した場合、worktreeでマージする", async () => {
439
+ // Given: gh auth status が失敗する
440
+ vi.mocked(execSync)
441
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
442
+ .mockReturnValueOnce(Buffer.from("commit-hash")) // remote phase branch exists
443
+ .mockReturnValueOnce("merge-base-commit\n") // merge-base
444
+ .mockReturnValueOnce("phase-head-commit\n") // phase head
445
+ .mockImplementationOnce(() => {
446
+ throw new Error("not logged in");
447
+ }) // gh auth status fails
448
+ .mockReturnValueOnce(Buffer.from("")) // git worktree add
449
+ .mockReturnValueOnce(Buffer.from("")) // git merge
450
+ .mockReturnValueOnce(Buffer.from("")) // git push
451
+ .mockReturnValueOnce(Buffer.from("")) // git worktree remove
452
+ .mockReturnValueOnce(Buffer.from("")) // git fetch issue branch
453
+ .mockReturnValueOnce(Buffer.from("")); // git branch -f
454
+ // When: mergePhaseBranchIntoIssue を呼び出す
455
+ await mergePhaseBranchIntoIssue(123, 1, "issue/123");
456
+ // Then: worktreeでマージが実行される
457
+ expect(execSync).toHaveBeenCalledWith(expect.stringContaining("git worktree add"), expect.anything());
458
+ });
459
+ });
460
+ describe("コンフリクトエスカレーション", () => {
461
+ it("ベースブランチマージでコンフリクト時、Claude解決に委譲する", async () => {
462
+ // Given: ベースブランチのマージでコンフリクトが発生
463
+ vi.mocked(execSync)
464
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
465
+ .mockReturnValueOnce(Buffer.from("commit-hash")) // remote issue branch exists
466
+ .mockReturnValueOnce(Buffer.from("")) // git fetch origin issue/123
467
+ .mockReturnValueOnce(Buffer.from("local-commit")) // local issue branch exists
468
+ .mockReturnValueOnce("local-commit\n") // git rev-parse local
469
+ .mockReturnValueOnce("remote-commit\n") // git rev-parse remote (同じでない)
470
+ .mockReturnValueOnce("main\n") // getCurrentBranch
471
+ .mockReturnValueOnce(Buffer.from("")) // git merge-base --is-ancestor
472
+ .mockReturnValueOnce(Buffer.from("")) // git branch -f
473
+ .mockReturnValueOnce("merge-base-commit\n") // merge-base (for mergeBaseBranchIntoIssue)
474
+ .mockReturnValueOnce("base-head-commit\n") // base head (異なる = マージが必要)
475
+ .mockImplementationOnce(() => {
476
+ throw new Error("not logged in");
477
+ }) // gh auth status fails
478
+ .mockReturnValueOnce(Buffer.from("")) // git worktree add
479
+ .mockImplementationOnce(() => {
480
+ throw new Error("CONFLICT");
481
+ }); // git merge でコンフリクト
482
+ vi.mocked(resolveConflictWithClaude).mockResolvedValueOnce(true);
483
+ vi.mocked(execSync)
484
+ .mockReturnValueOnce(Buffer.from("")) // git push after resolve
485
+ .mockReturnValueOnce(Buffer.from("")) // git worktree remove
486
+ .mockReturnValueOnce(Buffer.from("")) // git fetch issue branch
487
+ .mockReturnValueOnce(Buffer.from("")) // git branch -f
488
+ .mockImplementationOnce(() => {
489
+ throw new Error("remote phase branch not found");
490
+ }) // phase branch remote check fails
491
+ .mockImplementationOnce(() => {
492
+ throw new Error("local branch not found");
493
+ }) // branchExists local check fails
494
+ .mockImplementationOnce(() => {
495
+ throw new Error("remote branch not found");
496
+ }) // branchExists remote check fails
497
+ .mockReturnValueOnce(Buffer.from("")) // git branch (create)
498
+ .mockReturnValueOnce(Buffer.from("")); // git push
499
+ // When: syncPhaseBranch を呼び出す
500
+ const result = await syncPhaseBranch(123, 1, "issue/123", "main");
501
+ // Then: resolveConflictWithClaude が呼び出される
502
+ expect(resolveConflictWithClaude).toHaveBeenCalledWith({
503
+ targetBranch: "issue/123",
504
+ sourceBranch: "main",
505
+ operationType: "base",
506
+ }, expect.stringContaining("merge-work-"));
507
+ expect(result).toBe("issue/123-phase1");
508
+ });
509
+ it("Claude解決が失敗した場合、エラーをスローする", async () => {
510
+ // Given: Claude解決が失敗
511
+ vi.mocked(execSync)
512
+ .mockReturnValueOnce(Buffer.from("")) // fetchRemote
513
+ .mockReturnValueOnce(Buffer.from("commit-hash")) // remote issue branch exists
514
+ .mockReturnValueOnce(Buffer.from("")) // git fetch origin issue/123
515
+ .mockReturnValueOnce(Buffer.from("local-commit")) // local issue branch exists
516
+ .mockReturnValueOnce("local-commit\n") // git rev-parse local
517
+ .mockReturnValueOnce("remote-commit\n") // git rev-parse remote
518
+ .mockReturnValueOnce("main\n") // getCurrentBranch
519
+ .mockReturnValueOnce(Buffer.from("")) // git merge-base --is-ancestor
520
+ .mockReturnValueOnce(Buffer.from("")) // git branch -f
521
+ .mockReturnValueOnce("merge-base-commit\n") // merge-base (for mergeBaseBranchIntoIssue)
522
+ .mockReturnValueOnce("base-head-commit\n") // base head (異なる = マージが必要)
523
+ .mockImplementationOnce(() => {
524
+ throw new Error("not logged in");
525
+ }) // gh auth status fails
526
+ .mockReturnValueOnce(Buffer.from("")) // git worktree add
527
+ .mockImplementationOnce(() => {
528
+ throw new Error("CONFLICT");
529
+ }); // git merge でコンフリクト
530
+ vi.mocked(resolveConflictWithClaude).mockResolvedValueOnce(false);
531
+ vi.mocked(execSync).mockReturnValueOnce(Buffer.from("")); // git worktree remove
532
+ // When/Then: エラーがスローされる
533
+ await expect(syncPhaseBranch(123, 1, "issue/123", "main")).rejects.toThrow("Issue ブランチ issue/123 へのベースブランチ main のマージでコンフリクトを解消できませんでした。");
534
+ // Then: worktree がクリーンアップされる
535
+ expect(execSync).toHaveBeenCalledWith(expect.stringContaining("git worktree remove"), expect.objectContaining({ stdio: "ignore" }));
536
+ });
537
+ });
538
+ });
539
+ //# sourceMappingURL=branch-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-manager.test.js","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/branch-manager.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { spawn, execSync } from "node:child_process";
1
+ import { execSync, spawn } from "node:child_process";
2
2
  function hasConflicts(cwd) {
3
3
  try {
4
4
  const options = cwd ? { cwd, encoding: "utf-8" } : { encoding: "utf-8" };
@@ -1 +1 @@
1
- {"version":3,"file":"conflict-handler.js","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/conflict-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAQrD,SAAS,YAAY,CAAC,GAAY;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAgB,EAAE,CAAC;QAC3F,MAAM,MAAM,GAAG,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,IAAkB,EAClB,YAAoB;IAEpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,gBAAgB,YAAY,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,MAAM,IAAI,CAAC,YAAY;;YAEhD,YAAY;;;;;;;;;;;;;;;;uBAgBD,CAAC;IAEtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE;YACtC,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,YAAY;SAClB,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;YACvE,IAAI,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;gBACvE,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;gBACvE,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"conflict-handler.js","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/conflict-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAQrD,SAAS,YAAY,CAAC,GAAY;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAgB,EAAE,CAAC;QAC3F,MAAM,MAAM,GAAG,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,IAAkB,EAClB,YAAoB;IAEpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,gBAAgB,YAAY,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,MAAM,IAAI,CAAC,YAAY;;YAEhD,YAAY;;;;;;;;;;;;;;;;uBAgBD,CAAC;IAEtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE;YACtC,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,YAAY;SAClB,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;YACvE,IAAI,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;gBACvE,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;gBACvE,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dependency-resolver.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-resolver.test.d.ts","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/dependency-resolver.test.ts"],"names":[],"mappings":""}