@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.
- package/README.md +30 -2
- package/dist/cli.js +3 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +11 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +1 -1
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +69 -7
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/sync.test.js +11 -25
- package/dist/commands/sync.test.js.map +1 -1
- package/dist/commands/task-loop/index.d.ts.map +1 -1
- package/dist/commands/task-loop/index.js +5 -2
- package/dist/commands/task-loop/index.js.map +1 -1
- package/dist/commands/task-loop/lib/__mocks__/child-process.mock.d.ts +227 -0
- package/dist/commands/task-loop/lib/__mocks__/child-process.mock.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/__mocks__/child-process.mock.js +351 -0
- package/dist/commands/task-loop/lib/__mocks__/child-process.mock.js.map +1 -0
- package/dist/commands/task-loop/lib/__mocks__/sample-issues.d.ts +46 -0
- package/dist/commands/task-loop/lib/__mocks__/sample-issues.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/__mocks__/sample-issues.js +224 -0
- package/dist/commands/task-loop/lib/__mocks__/sample-issues.js.map +1 -0
- package/dist/commands/task-loop/lib/branch-manager.d.ts.map +1 -1
- package/dist/commands/task-loop/lib/branch-manager.js +14 -8
- package/dist/commands/task-loop/lib/branch-manager.js.map +1 -1
- package/dist/commands/task-loop/lib/branch-manager.test.d.ts +2 -0
- package/dist/commands/task-loop/lib/branch-manager.test.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/branch-manager.test.js +539 -0
- package/dist/commands/task-loop/lib/branch-manager.test.js.map +1 -0
- package/dist/commands/task-loop/lib/conflict-handler.js +1 -1
- package/dist/commands/task-loop/lib/conflict-handler.js.map +1 -1
- package/dist/commands/task-loop/lib/dependency-resolver.test.d.ts +2 -0
- package/dist/commands/task-loop/lib/dependency-resolver.test.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/dependency-resolver.test.js +1129 -0
- package/dist/commands/task-loop/lib/dependency-resolver.test.js.map +1 -0
- package/dist/commands/task-loop/lib/gh-setup.d.ts.map +1 -1
- package/dist/commands/task-loop/lib/gh-setup.js.map +1 -1
- package/dist/commands/task-loop/lib/github-client.d.ts.map +1 -1
- package/dist/commands/task-loop/lib/github-client.js +3 -3
- package/dist/commands/task-loop/lib/github-client.js.map +1 -1
- package/dist/commands/task-loop/lib/github-client.test.d.ts +2 -0
- package/dist/commands/task-loop/lib/github-client.test.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/github-client.test.js +377 -0
- package/dist/commands/task-loop/lib/github-client.test.js.map +1 -0
- package/dist/commands/task-loop/lib/issue-parser.js +4 -4
- package/dist/commands/task-loop/lib/issue-parser.js.map +1 -1
- package/dist/commands/task-loop/lib/issue-parser.test.d.ts +2 -0
- package/dist/commands/task-loop/lib/issue-parser.test.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/issue-parser.test.js +854 -0
- package/dist/commands/task-loop/lib/issue-parser.test.js.map +1 -0
- package/dist/commands/task-loop/lib/pull-request-manager.d.ts +35 -0
- package/dist/commands/task-loop/lib/pull-request-manager.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/pull-request-manager.js +150 -0
- package/dist/commands/task-loop/lib/pull-request-manager.js.map +1 -0
- package/dist/commands/task-loop/lib/task-number-utils.d.ts +10 -4
- package/dist/commands/task-loop/lib/task-number-utils.d.ts.map +1 -1
- package/dist/commands/task-loop/lib/task-number-utils.js +19 -10
- package/dist/commands/task-loop/lib/task-number-utils.js.map +1 -1
- package/dist/commands/task-loop/lib/task-number-utils.test.d.ts +2 -0
- package/dist/commands/task-loop/lib/task-number-utils.test.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/task-number-utils.test.js +379 -0
- package/dist/commands/task-loop/lib/task-number-utils.test.js.map +1 -0
- package/dist/commands/task-loop/lib/task-state-manager.d.ts.map +1 -1
- package/dist/commands/task-loop/lib/task-state-manager.js +1 -1
- package/dist/commands/task-loop/lib/task-state-manager.js.map +1 -1
- package/dist/commands/task-loop/lib/task-state-manager.test.d.ts +2 -0
- package/dist/commands/task-loop/lib/task-state-manager.test.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/task-state-manager.test.js +541 -0
- package/dist/commands/task-loop/lib/task-state-manager.test.js.map +1 -0
- package/dist/lib/file-system.js +1 -1
- package/dist/lib/file-system.js.map +1 -1
- package/dist/lib/mcp-config.d.ts.map +1 -1
- package/dist/lib/mcp-config.js +8 -4
- package/dist/lib/mcp-config.js.map +1 -1
- package/dist/lib/mcp-config.test.js +2 -2
- package/dist/lib/mcp-config.test.js.map +1 -1
- package/dist/lib/merger.d.ts.map +1 -1
- package/dist/lib/merger.js.map +1 -1
- package/dist/lib/preset-update/cli-repo-detector.test.js.map +1 -1
- package/dist/lib/preset-update/file-copier.d.ts +2 -0
- package/dist/lib/preset-update/file-copier.d.ts.map +1 -1
- package/dist/lib/preset-update/file-copier.js +12 -8
- package/dist/lib/preset-update/file-copier.js.map +1 -1
- package/dist/lib/preset-update/file-copier.test.js +36 -5
- package/dist/lib/preset-update/file-copier.test.js.map +1 -1
- package/dist/lib/preset-update/preset-finder.d.ts +1 -1
- package/dist/lib/preset-update/preset-finder.d.ts.map +1 -1
- package/dist/lib/preset-update/preset-finder.js +1 -1
- package/dist/lib/preset-update/preset-finder.js.map +1 -1
- package/dist/lib/preset-update/preset-finder.test.js +11 -11
- package/dist/lib/preset-update/preset-finder.test.js.map +1 -1
- package/dist/lib/preset.js +3 -3
- package/dist/lib/preset.js.map +1 -1
- package/dist/lib/sync/backup-manager.d.ts.map +1 -1
- package/dist/lib/sync/backup-manager.js +1 -1
- package/dist/lib/sync/backup-manager.js.map +1 -1
- package/dist/lib/sync/backup-manager.test.js +2 -2
- package/dist/lib/sync/backup-manager.test.js.map +1 -1
- package/dist/lib/sync/batch-processor.d.ts.map +1 -1
- package/dist/lib/sync/batch-processor.js.map +1 -1
- package/dist/lib/sync/batch-processor.test.js.map +1 -1
- package/dist/lib/sync/category-validator.d.ts.map +1 -1
- package/dist/lib/sync/category-validator.js.map +1 -1
- package/dist/lib/sync/category-validator.test.js +2 -11
- package/dist/lib/sync/category-validator.test.js.map +1 -1
- package/dist/lib/sync/conflict-reporter.d.ts.map +1 -1
- package/dist/lib/sync/conflict-reporter.js +1 -2
- package/dist/lib/sync/conflict-reporter.js.map +1 -1
- package/dist/lib/sync/conflict-reporter.test.js +2 -7
- package/dist/lib/sync/conflict-reporter.test.js.map +1 -1
- package/dist/lib/sync/diff-engine.d.ts.map +1 -1
- package/dist/lib/sync/diff-engine.js +2 -4
- package/dist/lib/sync/diff-engine.js.map +1 -1
- package/dist/lib/sync/diff-engine.test.js.map +1 -1
- package/dist/lib/sync/file-filter.d.ts.map +1 -1
- package/dist/lib/sync/file-filter.js +26 -3
- package/dist/lib/sync/file-filter.js.map +1 -1
- package/dist/lib/sync/file-filter.test.js +26 -2
- package/dist/lib/sync/file-filter.test.js.map +1 -1
- package/dist/lib/sync/hash-cache.d.ts.map +1 -1
- package/dist/lib/sync/hash-cache.js.map +1 -1
- package/dist/lib/sync/hash-cache.test.js +2 -2
- package/dist/lib/sync/hash-cache.test.js.map +1 -1
- package/dist/lib/sync/integration.test.js +289 -2
- package/dist/lib/sync/integration.test.js.map +1 -1
- package/dist/lib/sync/marker-processor.d.ts +34 -10
- package/dist/lib/sync/marker-processor.d.ts.map +1 -1
- package/dist/lib/sync/marker-processor.js +142 -41
- package/dist/lib/sync/marker-processor.js.map +1 -1
- package/dist/lib/sync/marker-processor.test.js +134 -1
- package/dist/lib/sync/marker-processor.test.js.map +1 -1
- package/dist/lib/sync/metadata-manager.d.ts.map +1 -1
- package/dist/lib/sync/metadata-manager.js.map +1 -1
- package/dist/lib/sync/metadata-manager.test.js +4 -6
- package/dist/lib/sync/metadata-manager.test.js.map +1 -1
- package/dist/lib/sync/performance.test.js +2 -2
- package/dist/lib/sync/performance.test.js.map +1 -1
- package/dist/lib/sync/seed-synchronizer.d.ts +27 -0
- package/dist/lib/sync/seed-synchronizer.d.ts.map +1 -0
- package/dist/lib/sync/seed-synchronizer.js +72 -0
- package/dist/lib/sync/seed-synchronizer.js.map +1 -0
- package/dist/lib/sync/seed-synchronizer.test.d.ts +2 -0
- package/dist/lib/sync/seed-synchronizer.test.d.ts.map +1 -0
- package/dist/lib/sync/seed-synchronizer.test.js +147 -0
- package/dist/lib/sync/seed-synchronizer.test.js.map +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/preset-update.d.ts +1 -1
- package/dist/types/sync.d.ts +4 -2
- package/dist/types/sync.d.ts.map +1 -1
- package/dist/types/sync.js.map +1 -1
- package/package.json +1 -2
- package/presets/default/.claude/agents/einja/backend-architect.md +1131 -0
- package/presets/{minimal/.claude/agents/einja/frontend → default/.claude/agents/einja}/design-engineer.md +1 -1
- package/presets/{minimal/.claude/agents/einja/frontend → default/.claude/agents/einja}/frontend-architect.md +1 -1
- package/presets/{minimal/.claude/agents/einja/frontend → default/.claude/agents/einja}/frontend-coder.md +1 -37
- package/presets/{minimal → default}/.claude/agents/einja/task/task-committer.md +12 -6
- package/presets/{minimal → default}/.claude/agents/einja/task/task-executer.md +9 -9
- package/presets/{minimal → default}/.claude/commands/einja/frontend-implement.md +1 -1
- package/presets/{minimal → default}/.claude/commands/einja/update-docs-by-task-specs.md +6 -6
- package/presets/{minimal/.claude/skills/einja/api-development → default/.claude/skills/einja-api-development}/SKILL.md +5 -5
- package/presets/{minimal/.claude/skills/einja/backend-architecture → default/.claude/skills/einja-backend-architecture}/SKILL.md +5 -5
- package/presets/{minimal/.claude/skills/einja/coding-standards → default/.claude/skills/einja-coding-standards}/SKILL.md +6 -6
- package/presets/{minimal/.claude/skills/einja/component-design → default/.claude/skills/einja-component-design}/SKILL.md +6 -6
- package/presets/{minimal/.claude/skills/einja/frontend-development → default/.claude/skills/einja-frontend-development}/SKILL.md +5 -5
- package/presets/{minimal/.claude/skills/einja/output-format → default/.claude/skills/einja-output-format}/SKILL.md +54 -5
- package/presets/{minimal → default}/preset.yaml +1 -1
- package/presets/{minimal → default}/symlinks.json +10 -10
- package/scaffolds/cli/preset.yaml +110 -0
- package/scaffolds/example/README.md +35 -0
- package/scaffolds/example/specs/issues/issue999-example-task/design.md +879 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/README.md +150 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-1.md +268 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-2.md +179 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/1-3.md +392 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase1/evidence/.gitkeep +0 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase2/2-1.md +459 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/phase2/evidence/.gitkeep +0 -0
- package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/scenarios.md +125 -0
- package/scaffolds/example/specs/issues/issue999-example-task/requirements.md +494 -0
- package/scaffolds/example/specs/issues/issue999-example-task/tasks.md +212 -0
- package/scaffolds/instructions/deployment-setup.md +458 -0
- package/scaffolds/instructions/environment-setup.md +509 -0
- package/scaffolds/instructions/local-server-environment-and-worktree.md +539 -0
- package/scaffolds/instructions/task-execute.md +649 -0
- package/scaffolds/instructions/task-vibe-kanban-loop.md +495 -0
- package/scaffolds/memory/archive/.gitkeep +0 -0
- package/scaffolds/memory/decisions.md +35 -0
- package/scaffolds/memory/patterns.md +37 -0
- package/scaffolds/steering/README.md +42 -0
- package/scaffolds/steering/acceptance-criteria-and-qa-guide.md +11 -0
- package/scaffolds/steering/architecture.md +11 -0
- package/scaffolds/steering/branch-strategy.md +11 -0
- package/scaffolds/steering/commit-rules.md +12 -1
- package/scaffolds/steering/db-schema-design.md +11 -0
- package/scaffolds/steering/development/api-development.md +15 -4
- package/scaffolds/steering/development/backend-architecture.md +11 -0
- package/scaffolds/steering/development/frontend-development.md +11 -0
- package/scaffolds/steering/development/review-guidelines.md +11 -0
- package/scaffolds/steering/development/testing-strategy.md +85 -0
- package/scaffolds/steering/development-workflow.md +11 -0
- package/scaffolds/steering/infrastructure/deployment.md +11 -0
- package/scaffolds/steering/infrastructure/environment-variables.md +11 -0
- package/scaffolds/steering/product.md +11 -0
- package/scaffolds/steering/task-management.md +11 -0
- package/scaffolds/CLAUDE.md.template +0 -386
- /package/presets/{minimal → default}/.claude/agents/einja/docs/docs-updater.md +0 -0
- /package/presets/{minimal → default}/.claude/agents/einja/git/conflict-resolver.md +0 -0
- /package/presets/{minimal → default}/.claude/agents/einja/specs/spec-design-generator.md +0 -0
- /package/presets/{minimal → default}/.claude/agents/einja/specs/spec-qa-generator.md +0 -0
- /package/presets/{minimal → default}/.claude/agents/einja/specs/spec-requirements-generator.md +0 -0
- /package/presets/{minimal → default}/.claude/agents/einja/specs/spec-tasks-generator.md +0 -0
- /package/presets/{minimal → default}/.claude/agents/einja/task/task-modification-analyzer.md +0 -0
- /package/presets/{minimal → default}/.claude/agents/einja/task/task-qa.md +0 -0
- /package/presets/{minimal → default}/.claude/agents/einja/task/task-reviewer.md +0 -0
- /package/presets/{minimal → default}/.claude/commands/einja/spec-create.md +0 -0
- /package/presets/{minimal → default}/.claude/commands/einja/start-dev.md +0 -0
- /package/presets/{minimal → default}/.claude/commands/einja/sync-cursor-commands.md +0 -0
- /package/presets/{minimal → default}/.claude/commands/einja/task-exec.md +0 -0
- /package/presets/{minimal → default}/.claude/hooks/einja/biome-format.sh +0 -0
- /package/presets/{minimal → default}/.claude/hooks/einja/design-doc-check.sh +0 -0
- /package/presets/{minimal → default}/.claude/hooks/einja/detect-secrets.sh +0 -0
- /package/presets/{minimal → default}/.claude/hooks/einja/large-file-warning.sh +0 -0
- /package/presets/{minimal → default}/.claude/hooks/einja/playwright-resize.sh +0 -0
- /package/presets/{minimal → default}/.claude/hooks/einja/typecheck.sh +0 -0
- /package/presets/{minimal → default}/.claude/hooks/einja/unset-volta-recursion.sh +0 -0
- /package/presets/{minimal → default}/.claude/hooks/einja/validate-git-commit.sh +0 -0
- /package/presets/{minimal → default}/.claude/hooks/einja/warn-index-ts.sh +0 -0
- /package/presets/{minimal → default}/.claude/hooks/einja/warn-relative-import.sh +0 -0
- /package/presets/{minimal → default}/.claude/settings.json +0 -0
- /package/presets/{minimal/.claude/skills/einja/coding-standards → default/.claude/skills/einja-coding-standards}/reference/naming-conventions.md +0 -0
- /package/presets/{minimal/.claude/skills/einja/coding-standards → default/.claude/skills/einja-coding-standards}/reference/prohibited-patterns.md +0 -0
- /package/presets/{minimal/.claude/skills/einja/coding-standards → default/.claude/skills/einja-coding-standards}/reference/typescript-rules.md +0 -0
- /package/presets/{minimal/.claude/skills/einja/component-design → default/.claude/skills/einja-component-design}/reference/directory-structure.md +0 -0
- /package/presets/{minimal/.claude/skills/einja/component-design → default/.claude/skills/einja-component-design}/reference/props-patterns.md +0 -0
- /package/presets/{minimal/.claude/skills/einja/component-design → default/.claude/skills/einja-component-design}/reference/styling-guide.md +0 -0
- /package/presets/{minimal/.claude/skills/einja/conflict-resolver → default/.claude/skills/einja-conflict-resolver}/SKILL.md +0 -0
- /package/presets/{minimal/.claude/skills/einja/general-context-loader → default/.claude/skills/einja-general-context-loader}/SKILL.md +0 -0
- /package/presets/{minimal/.claude/skills/einja/spec-context-loader → default/.claude/skills/einja-spec-context-loader}/SKILL.md +0 -0
- /package/presets/{minimal/.claude/skills/einja/task-commit → default/.claude/skills/einja-task-commit}/SKILL.md +0 -0
- /package/presets/{minimal/.claude/skills/einja/task-qa → default/.claude/skills/einja-task-qa}/SKILL.md +0 -0
- /package/presets/{minimal/.claude/skills/einja/task-qa → default/.claude/skills/einja-task-qa}/reference/failure-patterns.md +0 -0
- /package/presets/{minimal/.claude/skills/einja/task-qa → default/.claude/skills/einja-task-qa}/reference/troubleshooting.md +0 -0
- /package/presets/{minimal/.claude/skills/einja/task-qa → default/.claude/skills/einja-task-qa}/reference/usage-patterns.md +0 -0
- /package/presets/{minimal/.claude/skills/einja/task-qa → default/.claude/skills/einja-task-qa}/templates/qa-test-template.md +0 -0
- /package/{templates → scaffolds/templates}/README.md +0 -0
- /package/{templates → scaffolds/templates}/design-simple.md.template +0 -0
- /package/{templates → scaffolds/templates}/design.md.template +0 -0
- /package/{templates → scaffolds/templates}/qa-test.md.template +0 -0
- /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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflict-handler.js","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/conflict-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.test.d.ts","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/dependency-resolver.test.ts"],"names":[],"mappings":""}
|