@einja/dev-cli 0.1.15 → 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 +20 -5
- 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 +8 -3
- package/dist/commands/task-loop/lib/dependency-resolver.js.map +1 -1
- package/dist/commands/task-loop/lib/dependency-resolver.test.js +497 -3
- package/dist/commands/task-loop/lib/dependency-resolver.test.js.map +1 -1
- package/dist/commands/task-loop/lib/issue-parser.js +2 -2
- package/dist/commands/task-loop/lib/issue-parser.js.map +1 -1
- package/dist/commands/task-loop/lib/task-state-manager.d.ts +10 -2
- package/dist/commands/task-loop/lib/task-state-manager.d.ts.map +1 -1
- package/dist/commands/task-loop/lib/task-state-manager.js +39 -26
- package/dist/commands/task-loop/lib/task-state-manager.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 +4 -2
|
@@ -160,7 +160,7 @@ function parseMetadata(content, taskGroupId) {
|
|
|
160
160
|
const lines = content.split("\n");
|
|
161
161
|
for (const line of lines) {
|
|
162
162
|
// 依存関係: **依存関係**: ...
|
|
163
|
-
const depMatch = line.match(
|
|
163
|
+
const depMatch = line.match(/^\s*(?:[-*]\s*)?\*\*依存関係\*\*:\s*(.+)$/);
|
|
164
164
|
if (depMatch) {
|
|
165
165
|
const depText = depMatch[1].trim();
|
|
166
166
|
if (depText === "なし" || depText === "-" || depText === "") {
|
|
@@ -185,7 +185,7 @@ function parseMetadata(content, taskGroupId) {
|
|
|
185
185
|
}
|
|
186
186
|
}
|
|
187
187
|
// 完了条件: **完了条件**: ...
|
|
188
|
-
const criteriaMatch = line.match(
|
|
188
|
+
const criteriaMatch = line.match(/^\s*(?:[-*]\s*)?\*\*完了条件\*\*:\s*(.+)$/);
|
|
189
189
|
if (criteriaMatch) {
|
|
190
190
|
completionCriteria = criteriaMatch[1].trim();
|
|
191
191
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-parser.js","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/issue-parser.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"issue-parser.js","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/issue-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,12 @@ export declare class TaskStateManager {
|
|
|
13
13
|
private previousDoneTaskIds;
|
|
14
14
|
/** Vibe-Kanban タスク ID -> タスクグループ ID のマッピング */
|
|
15
15
|
private vibeTaskToGroupMap;
|
|
16
|
+
/** 対象Issue番号(フィルタリング用) */
|
|
17
|
+
private targetIssueNumber;
|
|
18
|
+
/**
|
|
19
|
+
* タスクが対象Issueに属するかチェック
|
|
20
|
+
*/
|
|
21
|
+
private isTaskForTargetIssue;
|
|
16
22
|
/**
|
|
17
23
|
* Vibe-Kanban タスク ID とタスクグループ ID のマッピングを登録
|
|
18
24
|
*/
|
|
@@ -20,15 +26,17 @@ export declare class TaskStateManager {
|
|
|
20
26
|
/**
|
|
21
27
|
* 現在の Done タスク ID 一覧を設定(初期化用)
|
|
22
28
|
* @param tasks 全タスク一覧
|
|
23
|
-
* @param issueNumber 対象Issue
|
|
29
|
+
* @param issueNumber 対象Issue番号(フィルタリング用、省略時は全件対象)
|
|
24
30
|
* @param descriptionCache タスクID -> description のキャッシュ(旧形式タスクのIssue判定用)
|
|
25
31
|
*/
|
|
26
32
|
initializeDoneTaskIds(tasks: VibeKanbanTask[], issueNumber?: number, descriptionCache?: Map<string, string | null>): void;
|
|
27
33
|
/**
|
|
28
34
|
* Done 状態の変化を検出
|
|
35
|
+
* @param currentTasks 現在のタスク一覧
|
|
36
|
+
* @param descriptionCache タスクID -> description のキャッシュ(旧形式タスクのIssue判定用)
|
|
29
37
|
* @returns 新たに Done になったタスクの ID 一覧
|
|
30
38
|
*/
|
|
31
|
-
detectNewlyCompletedTasks(currentTasks: VibeKanbanTask[]): string[];
|
|
39
|
+
detectNewlyCompletedTasks(currentTasks: VibeKanbanTask[], descriptionCache?: Map<string, string | null>): string[];
|
|
32
40
|
/**
|
|
33
41
|
* 新たに完了したタスクに対応するタスクグループ ID を取得
|
|
34
42
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-state-manager.d.ts","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/task-state-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEzE;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,mBAAmB,CAA0B;IACrD,8CAA8C;IAC9C,OAAO,CAAC,kBAAkB,CAAkC;
|
|
1
|
+
{"version":3,"file":"task-state-manager.d.ts","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/task-state-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEzE;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,mBAAmB,CAA0B;IACrD,8CAA8C;IAC9C,OAAO,CAAC,kBAAkB,CAAkC;IAC5D,0BAA0B;IAC1B,OAAO,CAAC,iBAAiB,CAAuB;IAEhD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;OAEG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAKlE;;;;;OAKG;IACH,qBAAqB,CACnB,KAAK,EAAE,cAAc,EAAE,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAC5C,IAAI;IAwBP;;;;;OAKG;IACH,yBAAyB,CACvB,YAAY,EAAE,cAAc,EAAE,EAC9B,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAC5C,MAAM,EAAE;IAiCX;;OAEG;IACH,wBAAwB,CAAC,yBAAyB,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAcvE;;OAEG;IACG,yBAAyB,CAC7B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,WAAW,CAAC;CAwBxB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQxE;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGxE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA4B/F"}
|
|
@@ -15,6 +15,26 @@ export class TaskStateManager {
|
|
|
15
15
|
this.previousDoneTaskIds = new Set();
|
|
16
16
|
/** Vibe-Kanban タスク ID -> タスクグループ ID のマッピング */
|
|
17
17
|
this.vibeTaskToGroupMap = new Map();
|
|
18
|
+
/** 対象Issue番号(フィルタリング用) */
|
|
19
|
+
this.targetIssueNumber = null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* タスクが対象Issueに属するかチェック
|
|
23
|
+
*/
|
|
24
|
+
isTaskForTargetIssue(task, descriptionCache) {
|
|
25
|
+
if (this.targetIssueNumber === null)
|
|
26
|
+
return true;
|
|
27
|
+
// 新形式: タイトルからIssue番号を抽出
|
|
28
|
+
const titleIssueNum = extractIssueNumberFromTitle(task.title);
|
|
29
|
+
if (titleIssueNum === this.targetIssueNumber)
|
|
30
|
+
return true;
|
|
31
|
+
// 旧形式: descriptionで判定
|
|
32
|
+
if (descriptionCache) {
|
|
33
|
+
const desc = descriptionCache.get(task.id);
|
|
34
|
+
if (desc === null || desc === void 0 ? void 0 : desc.includes(`GitHub Issue #${this.targetIssueNumber}`))
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
18
38
|
}
|
|
19
39
|
/**
|
|
20
40
|
* Vibe-Kanban タスク ID とタスクグループ ID のマッピングを登録
|
|
@@ -26,35 +46,24 @@ export class TaskStateManager {
|
|
|
26
46
|
/**
|
|
27
47
|
* 現在の Done タスク ID 一覧を設定(初期化用)
|
|
28
48
|
* @param tasks 全タスク一覧
|
|
29
|
-
* @param issueNumber 対象Issue
|
|
49
|
+
* @param issueNumber 対象Issue番号(フィルタリング用、省略時は全件対象)
|
|
30
50
|
* @param descriptionCache タスクID -> description のキャッシュ(旧形式タスクのIssue判定用)
|
|
31
51
|
*/
|
|
32
52
|
initializeDoneTaskIds(tasks, issueNumber, descriptionCache) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
if (!issueNumber) {
|
|
37
|
-
console.log(`🔧 初期化: previousDoneTaskIds に ${doneTasks.length} 件を登録`);
|
|
38
|
-
return;
|
|
53
|
+
// Issue番号を保持
|
|
54
|
+
if (issueNumber !== undefined) {
|
|
55
|
+
this.targetIssueNumber = issueNumber;
|
|
39
56
|
}
|
|
40
|
-
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
// 旧形式: descriptionで判定
|
|
47
|
-
if (descriptionCache) {
|
|
48
|
-
const desc = descriptionCache.get(t.id);
|
|
49
|
-
if (desc === null || desc === void 0 ? void 0 : desc.includes(issuePatternInDesc))
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
return false;
|
|
53
|
-
});
|
|
57
|
+
// フィルタリング適用(対象Issue番号がある場合のみ)
|
|
58
|
+
const doneTasks = tasks
|
|
59
|
+
.filter((t) => t.status === "done")
|
|
60
|
+
.filter((t) => this.isTaskForTargetIssue(t, descriptionCache));
|
|
61
|
+
this.previousDoneTaskIds = new Set(doneTasks.map((t) => t.id));
|
|
62
|
+
// ログ出力
|
|
54
63
|
console.log(`🔧 初期化: previousDoneTaskIds に ${doneTasks.length} 件を登録`);
|
|
55
|
-
if (
|
|
56
|
-
console.log(` (Issue #${issueNumber} 関連: ${
|
|
57
|
-
for (const task of
|
|
64
|
+
if (issueNumber !== undefined && doneTasks.length > 0) {
|
|
65
|
+
console.log(` (Issue #${issueNumber} 関連: ${doneTasks.length} 件)`);
|
|
66
|
+
for (const task of doneTasks) {
|
|
58
67
|
const taskGroupId = extractTaskGroupIdFromTitle(task.title);
|
|
59
68
|
console.log(` - ${taskGroupId || task.title}`);
|
|
60
69
|
}
|
|
@@ -62,10 +71,14 @@ export class TaskStateManager {
|
|
|
62
71
|
}
|
|
63
72
|
/**
|
|
64
73
|
* Done 状態の変化を検出
|
|
74
|
+
* @param currentTasks 現在のタスク一覧
|
|
75
|
+
* @param descriptionCache タスクID -> description のキャッシュ(旧形式タスクのIssue判定用)
|
|
65
76
|
* @returns 新たに Done になったタスクの ID 一覧
|
|
66
77
|
*/
|
|
67
|
-
detectNewlyCompletedTasks(currentTasks) {
|
|
68
|
-
|
|
78
|
+
detectNewlyCompletedTasks(currentTasks, descriptionCache) {
|
|
79
|
+
// 対象Issueに関連するタスクのみフィルタリング
|
|
80
|
+
const relevantTasks = currentTasks.filter((t) => this.isTaskForTargetIssue(t, descriptionCache));
|
|
81
|
+
const currentDoneIds = new Set(relevantTasks.filter((t) => t.status === "done").map((t) => t.id));
|
|
69
82
|
// デバッグ: 比較情報を出力
|
|
70
83
|
console.log(` 🔍 Done検出: 現在Done=${currentDoneIds.size}件, 前回Done=${this.previousDoneTaskIds.size}件`);
|
|
71
84
|
const newlyCompletedIds = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-state-manager.js","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/task-state-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAA7B;QACU,wBAAmB,GAAgB,IAAI,GAAG,EAAE,CAAC;QACrD,8CAA8C;QACtC,uBAAkB,GAAwB,IAAI,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"task-state-manager.js","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/task-state-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git worktree 関連のユーティリティ関数
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* direnv allow の実行結果
|
|
6
|
+
*/
|
|
7
|
+
export interface DirenvAllowResult {
|
|
8
|
+
success: boolean;
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* attempt.id からワークツリーパスを取得
|
|
13
|
+
* --porcelain オプションで安定したパースを実現
|
|
14
|
+
*
|
|
15
|
+
* @param attemptId - Vibe-KanbanのattemptID
|
|
16
|
+
* @param branchPrefix - ブランチ名のプレフィックス(デフォルト: "vk/")
|
|
17
|
+
* @param maxRetries - 最大リトライ回数(デフォルト: 3)
|
|
18
|
+
* @param retryDelayMs - リトライ間隔(デフォルト: 500ms)
|
|
19
|
+
* @returns ワークツリーのパス。見つからない場合は null
|
|
20
|
+
*/
|
|
21
|
+
export declare function getWorktreePathByAttemptId(attemptId: string, branchPrefix?: string, maxRetries?: number, retryDelayMs?: number): Promise<string | null>;
|
|
22
|
+
/**
|
|
23
|
+
* 指定パスで direnv allow を実行
|
|
24
|
+
* .envrc が存在する場合のみ実行
|
|
25
|
+
*
|
|
26
|
+
* @param worktreePath - ワークツリーのパス
|
|
27
|
+
* @returns 実行結果
|
|
28
|
+
*/
|
|
29
|
+
export declare function runDirenvAllow(worktreePath: string): DirenvAllowResult;
|
|
30
|
+
//# sourceMappingURL=worktree-utils.d.ts.map
|
|
@@ -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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@einja/dev-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.17",
|
|
4
4
|
"description": "Einja CLI - .claude設定とテンプレート同期をnpxでインストール",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -67,6 +67,8 @@
|
|
|
67
67
|
"lint": "biome lint ./src",
|
|
68
68
|
"format": "biome format ./src",
|
|
69
69
|
"test": "vitest run --passWithNoTests",
|
|
70
|
-
"test:watch": "vitest --passWithNoTests"
|
|
70
|
+
"test:watch": "vitest --passWithNoTests",
|
|
71
|
+
"preset:update": "tsx ../../scripts/cli-template-update.ts",
|
|
72
|
+
"scaffold:update": "tsx ../../scripts/template-update.ts"
|
|
71
73
|
}
|
|
72
74
|
}
|