@einja/dev-cli 0.1.16 → 0.1.17
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/dist/commands/task-loop/index.d.ts.map +1 -1
- package/dist/commands/task-loop/index.js +19 -4
- package/dist/commands/task-loop/index.js.map +1 -1
- package/dist/commands/task-loop/lib/branch-selector.d.ts +13 -0
- package/dist/commands/task-loop/lib/branch-selector.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/branch-selector.js +93 -0
- package/dist/commands/task-loop/lib/branch-selector.js.map +1 -0
- package/dist/commands/task-loop/lib/dependency-resolver.d.ts.map +1 -1
- package/dist/commands/task-loop/lib/dependency-resolver.js +4 -2
- package/dist/commands/task-loop/lib/dependency-resolver.js.map +1 -1
- package/dist/commands/task-loop/lib/dependency-resolver.test.js +494 -0
- package/dist/commands/task-loop/lib/dependency-resolver.test.js.map +1 -1
- package/dist/commands/task-loop/lib/worktree-utils.d.ts +30 -0
- package/dist/commands/task-loop/lib/worktree-utils.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/worktree-utils.js +85 -0
- package/dist/commands/task-loop/lib/worktree-utils.js.map +1 -0
- package/dist/commands/task-loop/lib/worktree-utils.test.d.ts +2 -0
- package/dist/commands/task-loop/lib/worktree-utils.test.d.ts.map +1 -0
- package/dist/commands/task-loop/lib/worktree-utils.test.js +190 -0
- package/dist/commands/task-loop/lib/worktree-utils.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-utils.d.ts","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/worktree-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AASD;;;;;;;;;GASG;AACH,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,MAAM,EACjB,YAAY,SAAQ,EACpB,UAAU,SAAI,EACd,YAAY,SAAM,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsCxB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,iBAAiB,CAoBtE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git worktree 関連のユーティリティ関数
|
|
3
|
+
*/
|
|
4
|
+
import { execFileSync, execSync } from "node:child_process";
|
|
5
|
+
import { existsSync } from "node:fs";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
/**
|
|
8
|
+
* 指定ミリ秒待機する
|
|
9
|
+
*/
|
|
10
|
+
function sleep(ms) {
|
|
11
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* attempt.id からワークツリーパスを取得
|
|
15
|
+
* --porcelain オプションで安定したパースを実現
|
|
16
|
+
*
|
|
17
|
+
* @param attemptId - Vibe-KanbanのattemptID
|
|
18
|
+
* @param branchPrefix - ブランチ名のプレフィックス(デフォルト: "vk/")
|
|
19
|
+
* @param maxRetries - 最大リトライ回数(デフォルト: 3)
|
|
20
|
+
* @param retryDelayMs - リトライ間隔(デフォルト: 500ms)
|
|
21
|
+
* @returns ワークツリーのパス。見つからない場合は null
|
|
22
|
+
*/
|
|
23
|
+
export async function getWorktreePathByAttemptId(attemptId, branchPrefix = "vk/", maxRetries = 3, retryDelayMs = 500) {
|
|
24
|
+
const branchName = `${branchPrefix}${attemptId}`;
|
|
25
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
26
|
+
try {
|
|
27
|
+
// --porcelain で機械可読な形式を取得
|
|
28
|
+
const output = execSync("git worktree list --porcelain", { encoding: "utf-8" });
|
|
29
|
+
const blocks = output.trim().split("\n\n");
|
|
30
|
+
for (const block of blocks) {
|
|
31
|
+
const lines = block.split("\n");
|
|
32
|
+
let worktreePath = null;
|
|
33
|
+
let branch = null;
|
|
34
|
+
for (const line of lines) {
|
|
35
|
+
if (line.startsWith("worktree ")) {
|
|
36
|
+
worktreePath = line.slice("worktree ".length);
|
|
37
|
+
}
|
|
38
|
+
if (line.startsWith("branch refs/heads/")) {
|
|
39
|
+
branch = line.slice("branch refs/heads/".length);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (branch === branchName && worktreePath) {
|
|
43
|
+
return worktreePath;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (_a) {
|
|
48
|
+
// git コマンド失敗時は次のリトライへ
|
|
49
|
+
}
|
|
50
|
+
// ワークツリー作成直後は反映されていない可能性があるためリトライ
|
|
51
|
+
if (i < maxRetries - 1) {
|
|
52
|
+
await sleep(retryDelayMs);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 指定パスで direnv allow を実行
|
|
59
|
+
* .envrc が存在する場合のみ実行
|
|
60
|
+
*
|
|
61
|
+
* @param worktreePath - ワークツリーのパス
|
|
62
|
+
* @returns 実行結果
|
|
63
|
+
*/
|
|
64
|
+
export function runDirenvAllow(worktreePath) {
|
|
65
|
+
var _a;
|
|
66
|
+
// .envrc が存在しない場合はスキップ
|
|
67
|
+
if (!existsSync(join(worktreePath, ".envrc"))) {
|
|
68
|
+
return { success: true }; // .envrc がないので成功扱い
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
// execFileSync を使用してシェルインジェクションを防止
|
|
72
|
+
execFileSync("direnv", ["allow", worktreePath], {
|
|
73
|
+
cwd: worktreePath,
|
|
74
|
+
stdio: "pipe",
|
|
75
|
+
});
|
|
76
|
+
return { success: true };
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
const stderr = error instanceof Error && "stderr" in error
|
|
80
|
+
? (_a = error.stderr) === null || _a === void 0 ? void 0 : _a.toString()
|
|
81
|
+
: undefined;
|
|
82
|
+
return { success: false, error: stderr || "direnv allow failed" };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=worktree-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-utils.js","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/worktree-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-utils.test.d.ts","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/worktree-utils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { getWorktreePathByAttemptId, runDirenvAllow } from "./worktree-utils.js";
|
|
3
|
+
// node:child_process のモック
|
|
4
|
+
vi.mock("node:child_process", () => ({
|
|
5
|
+
execSync: vi.fn(),
|
|
6
|
+
execFileSync: vi.fn(),
|
|
7
|
+
}));
|
|
8
|
+
// node:fs のモック
|
|
9
|
+
vi.mock("node:fs", () => ({
|
|
10
|
+
existsSync: vi.fn(),
|
|
11
|
+
}));
|
|
12
|
+
import { execFileSync, execSync } from "node:child_process";
|
|
13
|
+
import { existsSync } from "node:fs";
|
|
14
|
+
describe("worktree-utils", () => {
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
// 各テスト前にモックをリセット
|
|
17
|
+
vi.clearAllMocks();
|
|
18
|
+
});
|
|
19
|
+
describe("getWorktreePathByAttemptId", () => {
|
|
20
|
+
it("porcelain形式の出力をパースし、ブランチ名が一致するワークツリーパスを返す", async () => {
|
|
21
|
+
// Given: git worktree list --porcelain の出力
|
|
22
|
+
const porcelainOutput = `worktree /path/to/main
|
|
23
|
+
HEAD abc123def456
|
|
24
|
+
branch refs/heads/main
|
|
25
|
+
|
|
26
|
+
worktree /path/to/worktree1
|
|
27
|
+
HEAD def456abc789
|
|
28
|
+
branch refs/heads/vk/attempt-123
|
|
29
|
+
|
|
30
|
+
worktree /path/to/worktree2
|
|
31
|
+
HEAD 789abc456def
|
|
32
|
+
branch refs/heads/feature/test
|
|
33
|
+
`;
|
|
34
|
+
vi.mocked(execSync).mockReturnValue(porcelainOutput);
|
|
35
|
+
// When: attempt-123 のワークツリーパスを取得
|
|
36
|
+
const result = await getWorktreePathByAttemptId("attempt-123");
|
|
37
|
+
// Then: 正しいパスが返る
|
|
38
|
+
expect(result).toBe("/path/to/worktree1");
|
|
39
|
+
expect(execSync).toHaveBeenCalledWith("git worktree list --porcelain", {
|
|
40
|
+
encoding: "utf-8",
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
it("複数のワークツリーがある場合、正しいブランチのものを選択する", async () => {
|
|
44
|
+
// Given: 複数のワークツリーを含む出力
|
|
45
|
+
const porcelainOutput = `worktree /path/to/main
|
|
46
|
+
HEAD abc123def456
|
|
47
|
+
branch refs/heads/main
|
|
48
|
+
|
|
49
|
+
worktree /path/to/vk-attempt-456
|
|
50
|
+
HEAD def456abc789
|
|
51
|
+
branch refs/heads/vk/attempt-456
|
|
52
|
+
|
|
53
|
+
worktree /path/to/vk-attempt-789
|
|
54
|
+
HEAD 789abc456def
|
|
55
|
+
branch refs/heads/vk/attempt-789
|
|
56
|
+
`;
|
|
57
|
+
vi.mocked(execSync).mockReturnValue(porcelainOutput);
|
|
58
|
+
// When: attempt-789 のワークツリーパスを取得
|
|
59
|
+
const result = await getWorktreePathByAttemptId("attempt-789");
|
|
60
|
+
// Then: attempt-789 に対応するパスが返る
|
|
61
|
+
expect(result).toBe("/path/to/vk-attempt-789");
|
|
62
|
+
});
|
|
63
|
+
it("ブランチが見つからない場合、nullを返す", async () => {
|
|
64
|
+
// Given: 対象のブランチが存在しない出力
|
|
65
|
+
const porcelainOutput = `worktree /path/to/main
|
|
66
|
+
HEAD abc123def456
|
|
67
|
+
branch refs/heads/main
|
|
68
|
+
|
|
69
|
+
worktree /path/to/worktree1
|
|
70
|
+
HEAD def456abc789
|
|
71
|
+
branch refs/heads/vk/attempt-123
|
|
72
|
+
`;
|
|
73
|
+
vi.mocked(execSync).mockReturnValue(porcelainOutput);
|
|
74
|
+
// When: 存在しないattempt-999のワークツリーパスを取得
|
|
75
|
+
const result = await getWorktreePathByAttemptId("attempt-999");
|
|
76
|
+
// Then: nullが返る
|
|
77
|
+
expect(result).toBeNull();
|
|
78
|
+
});
|
|
79
|
+
it("gitコマンドが失敗した場合、リトライして最終的にnullを返す", async () => {
|
|
80
|
+
// Given: execSyncが常に失敗する
|
|
81
|
+
vi.mocked(execSync).mockImplementation(() => {
|
|
82
|
+
throw new Error("git command failed");
|
|
83
|
+
});
|
|
84
|
+
// When: ワークツリーパスを取得(maxRetries=3, retryDelayMs=10で高速化)
|
|
85
|
+
const result = await getWorktreePathByAttemptId("attempt-123", "vk/", 3, 10);
|
|
86
|
+
// Then: nullが返り、3回リトライされる
|
|
87
|
+
expect(result).toBeNull();
|
|
88
|
+
expect(execSync).toHaveBeenCalledTimes(3);
|
|
89
|
+
});
|
|
90
|
+
it("1回目は失敗し2回目で成功した場合、正しいパスを返す", async () => {
|
|
91
|
+
// Given: 1回目は失敗、2回目以降は成功
|
|
92
|
+
vi.mocked(execSync)
|
|
93
|
+
.mockImplementationOnce(() => {
|
|
94
|
+
throw new Error("git command failed");
|
|
95
|
+
})
|
|
96
|
+
.mockReturnValue(`worktree /path/to/worktree1
|
|
97
|
+
HEAD def456abc789
|
|
98
|
+
branch refs/heads/vk/attempt-123
|
|
99
|
+
`);
|
|
100
|
+
// When: ワークツリーパスを取得(retryDelayMs=10で高速化)
|
|
101
|
+
const result = await getWorktreePathByAttemptId("attempt-123", "vk/", 3, 10);
|
|
102
|
+
// Then: 正しいパスが返る
|
|
103
|
+
expect(result).toBe("/path/to/worktree1");
|
|
104
|
+
expect(execSync).toHaveBeenCalledTimes(2);
|
|
105
|
+
});
|
|
106
|
+
it("空の出力の場合、nullを返す", async () => {
|
|
107
|
+
// Given: 空の出力
|
|
108
|
+
vi.mocked(execSync).mockReturnValue("");
|
|
109
|
+
// When: ワークツリーパスを取得
|
|
110
|
+
const result = await getWorktreePathByAttemptId("attempt-123");
|
|
111
|
+
// Then: nullが返る
|
|
112
|
+
expect(result).toBeNull();
|
|
113
|
+
});
|
|
114
|
+
it("ワークツリーパスは存在するがブランチ情報がない場合、nullを返す", async () => {
|
|
115
|
+
// Given: ブランチ情報がない出力
|
|
116
|
+
const porcelainOutput = `worktree /path/to/worktree1
|
|
117
|
+
HEAD def456abc789
|
|
118
|
+
`;
|
|
119
|
+
vi.mocked(execSync).mockReturnValue(porcelainOutput);
|
|
120
|
+
// When: ワークツリーパスを取得
|
|
121
|
+
const result = await getWorktreePathByAttemptId("attempt-123");
|
|
122
|
+
// Then: nullが返る(ブランチ情報がないため)
|
|
123
|
+
expect(result).toBeNull();
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe("runDirenvAllow", () => {
|
|
127
|
+
it(".envrcが存在しない場合、成功を返す", () => {
|
|
128
|
+
// Given: .envrcファイルが存在しない
|
|
129
|
+
vi.mocked(existsSync).mockReturnValue(false);
|
|
130
|
+
// When: direnv allowを実行
|
|
131
|
+
const result = runDirenvAllow("/path/to/worktree");
|
|
132
|
+
// Then: 成功が返る
|
|
133
|
+
expect(result.success).toBe(true);
|
|
134
|
+
expect(execFileSync).not.toHaveBeenCalled();
|
|
135
|
+
});
|
|
136
|
+
it(".envrcが存在する場合、direnvコマンドを実行し成功を返す", () => {
|
|
137
|
+
// Given: .envrcファイルが存在し、direnvコマンドが成功する
|
|
138
|
+
vi.mocked(existsSync).mockReturnValue(true);
|
|
139
|
+
vi.mocked(execFileSync).mockReturnValue("");
|
|
140
|
+
// When: direnv allowを実行
|
|
141
|
+
const result = runDirenvAllow("/path/to/worktree");
|
|
142
|
+
// Then: 成功が返り、正しいコマンドが実行される
|
|
143
|
+
expect(result.success).toBe(true);
|
|
144
|
+
expect(execFileSync).toHaveBeenCalledWith("direnv", ["allow", "/path/to/worktree"], {
|
|
145
|
+
cwd: "/path/to/worktree",
|
|
146
|
+
stdio: "pipe",
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
it("direnvコマンドが失敗した場合、エラーを返す", () => {
|
|
150
|
+
// Given: .envrcファイルが存在し、direnvコマンドが失敗する
|
|
151
|
+
vi.mocked(existsSync).mockReturnValue(true);
|
|
152
|
+
const mockError = new Error("direnv failed");
|
|
153
|
+
mockError.stderr = Buffer.from("permission denied");
|
|
154
|
+
vi.mocked(execFileSync).mockImplementation(() => {
|
|
155
|
+
throw mockError;
|
|
156
|
+
});
|
|
157
|
+
// When: direnv allowを実行
|
|
158
|
+
const result = runDirenvAllow("/path/to/worktree");
|
|
159
|
+
// Then: エラーが返る
|
|
160
|
+
expect(result.success).toBe(false);
|
|
161
|
+
expect(result.error).toBe("permission denied");
|
|
162
|
+
});
|
|
163
|
+
it("direnvコマンドが失敗しstderrがない場合、デフォルトエラーメッセージを返す", () => {
|
|
164
|
+
// Given: .envrcファイルが存在し、direnvコマンドがstderrなしで失敗する
|
|
165
|
+
vi.mocked(existsSync).mockReturnValue(true);
|
|
166
|
+
vi.mocked(execFileSync).mockImplementation(() => {
|
|
167
|
+
throw new Error("unknown error");
|
|
168
|
+
});
|
|
169
|
+
// When: direnv allowを実行
|
|
170
|
+
const result = runDirenvAllow("/path/to/worktree");
|
|
171
|
+
// Then: デフォルトエラーメッセージが返る
|
|
172
|
+
expect(result.success).toBe(false);
|
|
173
|
+
expect(result.error).toBe("direnv allow failed");
|
|
174
|
+
});
|
|
175
|
+
it("パスにスペースが含まれる場合も正しく処理される", () => {
|
|
176
|
+
// Given: スペースを含むパスで.envrcが存在
|
|
177
|
+
vi.mocked(existsSync).mockReturnValue(true);
|
|
178
|
+
vi.mocked(execFileSync).mockReturnValue("");
|
|
179
|
+
// When: direnv allowを実行
|
|
180
|
+
const result = runDirenvAllow("/path/to/my worktree");
|
|
181
|
+
// Then: パスが配列要素として正しく渡される
|
|
182
|
+
expect(result.success).toBe(true);
|
|
183
|
+
expect(execFileSync).toHaveBeenCalledWith("direnv", ["allow", "/path/to/my worktree"], {
|
|
184
|
+
cwd: "/path/to/my worktree",
|
|
185
|
+
stdio: "pipe",
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
//# sourceMappingURL=worktree-utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-utils.test.js","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/worktree-utils.test.ts"],"names":[],"mappings":"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"}
|