@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.
@@ -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":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAUjC;;GAEG;AACH,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,SAAiB,EACjB,YAAY,GAAG,KAAK,EACpB,UAAU,GAAG,CAAC,EACd,YAAY,GAAG,GAAG;IAElB,MAAM,UAAU,GAAG,GAAG,YAAY,GAAG,SAAS,EAAE,CAAC;IAEjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,0BAA0B;YAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,+BAA+B,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAChF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAE3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,YAAY,GAAkB,IAAI,CAAC;gBACvC,IAAI,MAAM,GAAkB,IAAI,CAAC;gBAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;wBACjC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;oBAChD,CAAC;oBACD,IAAI,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;wBAC1C,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC;gBAED,IAAI,MAAM,KAAK,UAAU,IAAI,YAAY,EAAE,CAAC;oBAC1C,OAAO,YAAY,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,WAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;QAED,kCAAkC;QAClC,IAAI,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,YAAoB;;IACjD,uBAAuB;IACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,mBAAmB;IAC/C,CAAC;IAED,IAAI,CAAC;QACH,mCAAmC;QACnC,YAAY,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE;YAC9C,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GACV,KAAK,YAAY,KAAK,IAAI,QAAQ,IAAI,KAAK;YACzC,CAAC,CAAC,MAAC,KAA6B,CAAC,MAAM,0CAAE,QAAQ,EAAE;YACnD,CAAC,CAAC,SAAS,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,qBAAqB,EAAE,CAAC;IACpE,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=worktree-utils.test.d.ts.map
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@einja/dev-cli",
3
- "version": "0.1.16",
3
+ "version": "0.1.17",
4
4
  "description": "Einja CLI - .claude設定とテンプレート同期をnpxでインストール",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",