@einja/dev-cli 0.1.41 → 0.1.45
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 +0 -1
- package/dist/cli.js +0 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +1 -20
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/task-loop/lib/github-client.test.js.map +1 -1
- package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js +2 -2
- package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js.map +1 -1
- package/dist/lib/preset-update/file-copier.js +3 -3
- package/dist/lib/preset-update/file-copier.js.map +1 -1
- package/dist/lib/sync/file-filter.js +2 -2
- package/dist/lib/sync/file-filter.js.map +1 -1
- package/dist/lib/sync/file-filter.test.js +20 -0
- package/dist/lib/sync/file-filter.test.js.map +1 -1
- package/dist/lib/sync/marker-processor.js.map +1 -1
- package/dist/lib/sync/metadata-manager.js +1 -1
- package/dist/lib/sync/metadata-manager.js.map +1 -1
- package/dist/lib/sync/metadata-manager.test.js +3 -2
- package/dist/lib/sync/metadata-manager.test.js.map +1 -1
- package/dist/lib/sync/project-private-synchronizer.d.ts.map +1 -1
- package/dist/lib/sync/project-private-synchronizer.js +5 -1
- package/dist/lib/sync/project-private-synchronizer.js.map +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/presets/default/.claude/agents/einja/backend-architect.md +17 -1
- package/presets/default/.claude/agents/einja/codex-agent.md +1 -1
- package/presets/default/.claude/agents/einja/design-engineer.md +1 -1
- package/presets/default/.claude/agents/einja/docs/docs-updater.md +3 -93
- package/presets/default/.claude/agents/einja/frontend-architect.md +17 -1
- package/presets/default/.claude/agents/einja/frontend-coder.md +1 -1
- package/presets/default/.claude/agents/einja/{specs/spec-design-generator.md → issue-specs/design-generator.md} +12 -7
- package/presets/default/.claude/agents/einja/{specs/spec-qa-generator.md → issue-specs/qa-generator.md} +6 -4
- package/presets/default/.claude/agents/einja/{specs/spec-requirements-generator.md → issue-specs/requirements-generator.md} +5 -5
- package/presets/default/.claude/agents/einja/{specs/spec-tasks-generator.md → issue-specs/tasks-generator.md} +13 -14
- package/presets/default/.claude/agents/einja/{specs/spec-tasks-validator.md → issue-specs/tasks-validator.md} +9 -9
- package/presets/default/.claude/agents/einja/issue-specs/ui-design-generator.md +114 -0
- package/presets/default/.claude/agents/einja/task/task-executer.md +9 -3
- package/presets/default/.claude/agents/einja/task/task-modification-analyzer.md +2 -2
- package/presets/default/.claude/agents/einja/task/task-qa.md +3 -3
- package/presets/default/.claude/agents/einja/task/task-reviewer.md +13 -1
- package/presets/default/.claude/commands/einja/einja-sync.md +119 -44
- package/presets/default/.claude/commands/einja/issue-exec.md +29 -19
- package/presets/default/.claude/commands/einja/sync-cursor-commands.md +6 -6
- package/presets/default/.claude/commands/einja/{update-docs-by-task-specs.md → update-docs-by-issue-specs.md} +58 -58
- package/presets/default/.claude/hooks/einja/plan-mode-skill-loader.sh +5 -1
- package/presets/default/.claude/settings.json +14 -4
- package/presets/default/.claude/skills/{einja-general-context-loader → _einja-general-context-loader}/SKILL.md +2 -2
- package/presets/default/.claude/skills/{einja-output-format → _einja-output-format}/SKILL.md +1 -1
- package/presets/default/.claude/skills/_einja-project-overview/SKILL.md +29 -0
- package/presets/default/.claude/skills/{einja-spec-context-loader → _einja-spec-context-loader}/SKILL.md +5 -5
- package/presets/default/.claude/skills/einja-coding-standards/references/testing-strategy.md +899 -0
- package/presets/default/.claude/skills/einja-conflict-resolver/SKILL.md +1 -1
- package/presets/default/.claude/skills/einja-create-pr/SKILL.md +138 -0
- package/presets/default/.claude/skills/einja-infra-maintenance/SKILL.md +779 -0
- package/presets/default/.claude/{commands/einja/spec-create.md → skills/einja-issue-spec-create/SKILL.md} +47 -24
- package/presets/default/.claude/skills/einja-issue-spec-generator/SKILL.md +105 -0
- package/presets/default/.claude/skills/einja-issue-spec-generator/references/format-rules.md +35 -0
- package/presets/default/.claude/skills/einja-issue-spec-validator/SKILL.md +130 -0
- package/presets/default/.claude/skills/einja-issue-spec-validator/references/validation-rules.md +52 -0
- package/presets/default/.claude/skills/einja-npm-release/SKILL.md +242 -0
- package/presets/default/.claude/skills/einja-skill-creator/SKILL.md +68 -12
- package/presets/default/.claude/skills/einja-skill-creator/scripts/aggregate_benchmark.py +368 -121
- package/presets/default/.claude/skills/einja-skill-creator/scripts/compare_runs.py +154 -0
- package/presets/default/.claude/skills/einja-skill-creator/scripts/generate_report.py +14 -7
- package/presets/default/.claude/skills/einja-skill-creator/scripts/improve_description.py +2 -7
- package/presets/default/.claude/skills/einja-skill-creator/scripts/run_loop.py +263 -183
- package/presets/default/.claude/skills/einja-skill-first/SKILL.md +265 -0
- package/presets/default/.claude/skills/einja-subagent-question-protocol/SKILL.md +98 -0
- package/presets/default/.claude/skills/einja-task-commit/SKILL.md +7 -7
- package/presets/default/.claude/{commands/einja/task-exec.md → skills/einja-task-exec/SKILL.md} +3 -78
- package/presets/default/.claude/skills/einja-task-qa/SKILL.md +4 -4
- package/presets/default/.claude/skills/einja-task-qa/references/troubleshooting.md +1 -1
- package/presets/default/.claude/skills/einja-task-qa/references/usage-patterns.md +2 -2
- package/presets/default/.claude/skills/einja-team-exec/SKILL.md +165 -0
- package/presets/default/CLAUDE.md.template +21 -6
- package/presets/default/docs/einja/instructions/deployment-setup.md +1 -1
- package/presets/default/docs/einja/instructions/issue-exec-workflow.md +11 -11
- package/presets/default/docs/einja/instructions/local-server-environment-and-worktree.md +1 -1
- package/presets/default/docs/einja/instructions/setup-flow.md +279 -0
- package/presets/default/docs/einja/instructions/task-execute.md +42 -42
- package/presets/default/docs/einja/steering/acceptance-criteria-and-qa-guide.md +1 -1
- package/presets/default/docs/einja/steering/branch-strategy.md +1 -1
- package/presets/default/docs/einja/steering/development-workflow.md +93 -25
- package/presets/default/docs/einja/steering/infrastructure/deployment.md +107 -0
- package/presets/default/docs/einja/steering/task-management.md +9 -13
- package/presets/default/scripts/ensure-serena.sh +2 -2
- package/presets/default/scripts/env-rotate-secrets.ts +66 -6
- package/presets/default/scripts/init-github.ts +363 -0
- package/presets/default/scripts/init.sh +11 -5
- package/presets/default/scripts/setup-dev.ts +16 -1
- package/dist/lib/sync/backup-manager.d.ts +0 -50
- package/dist/lib/sync/backup-manager.d.ts.map +0 -1
- package/dist/lib/sync/backup-manager.js +0 -117
- package/dist/lib/sync/backup-manager.js.map +0 -1
- package/dist/lib/sync/backup-manager.test.d.ts +0 -2
- package/dist/lib/sync/backup-manager.test.d.ts.map +0 -1
- package/dist/lib/sync/backup-manager.test.js +0 -155
- package/dist/lib/sync/backup-manager.test.js.map +0 -1
- package/presets/default/.claude/agents/einja/git/conflict-resolver.md +0 -152
- package/presets/default/.claude/hooks/einja/validate-git-commit.sh +0 -239
- package/presets/default/.claude/skills/einja-project-overview/SKILL.md +0 -39
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import fs from "fs-extra";
|
|
3
|
-
/**
|
|
4
|
-
* バックアップ管理クラス
|
|
5
|
-
* 同期前のファイルバックアップとリストア機能を提供
|
|
6
|
-
*/
|
|
7
|
-
export class BackupManager {
|
|
8
|
-
constructor(projectRoot) {
|
|
9
|
-
this.projectRoot = projectRoot;
|
|
10
|
-
this.backupDir = path.join(projectRoot, ".einja-sync-backups");
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* バックアップディレクトリを作成する
|
|
14
|
-
*/
|
|
15
|
-
async ensureBackupDir() {
|
|
16
|
-
await fs.ensureDir(this.backupDir);
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* ファイルをバックアップする
|
|
20
|
-
* @param filePath - プロジェクトルートからの相対パス
|
|
21
|
-
* @returns バックアップファイルのパス
|
|
22
|
-
*/
|
|
23
|
-
async backupFile(filePath) {
|
|
24
|
-
const sourcePath = path.join(this.projectRoot, filePath);
|
|
25
|
-
if (!(await fs.pathExists(sourcePath))) {
|
|
26
|
-
throw new Error(`バックアップ対象ファイルが存在しません: ${filePath}`);
|
|
27
|
-
}
|
|
28
|
-
await this.ensureBackupDir();
|
|
29
|
-
// バックアップファイル名:タイムスタンプ付き
|
|
30
|
-
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
31
|
-
const fileName = path.basename(filePath);
|
|
32
|
-
const backupFileName = `${fileName}.${timestamp}.bak`;
|
|
33
|
-
const backupPath = path.join(this.backupDir, backupFileName);
|
|
34
|
-
await fs.copy(sourcePath, backupPath);
|
|
35
|
-
return backupPath;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* 複数のファイルをバックアップする
|
|
39
|
-
* @param filePaths - バックアップするファイルパスのリスト
|
|
40
|
-
* @returns バックアップファイルパスのマップ
|
|
41
|
-
*/
|
|
42
|
-
async backupFiles(filePaths) {
|
|
43
|
-
const backupMap = new Map();
|
|
44
|
-
for (const filePath of filePaths) {
|
|
45
|
-
try {
|
|
46
|
-
const backupPath = await this.backupFile(filePath);
|
|
47
|
-
backupMap.set(filePath, backupPath);
|
|
48
|
-
}
|
|
49
|
-
catch (error) {
|
|
50
|
-
// ファイルが存在しない場合はスキップ
|
|
51
|
-
if (error instanceof Error && error.message.includes("存在しません")) {
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
throw error;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return backupMap;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* バックアップファイルをリストアする
|
|
61
|
-
* @param backupPath - バックアップファイルのパス
|
|
62
|
-
* @param targetPath - リストア先のパス
|
|
63
|
-
*/
|
|
64
|
-
async restoreFile(backupPath, targetPath) {
|
|
65
|
-
if (!(await fs.pathExists(backupPath))) {
|
|
66
|
-
throw new Error(`バックアップファイルが存在しません: ${backupPath}`);
|
|
67
|
-
}
|
|
68
|
-
const targetFullPath = path.join(this.projectRoot, targetPath);
|
|
69
|
-
await fs.copy(backupPath, targetFullPath, { overwrite: true });
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* すべてのバックアップファイルをリストアする
|
|
73
|
-
* @param backupMap - backupFilesで取得したマップ
|
|
74
|
-
*/
|
|
75
|
-
async restoreFiles(backupMap) {
|
|
76
|
-
for (const [filePath, backupPath] of backupMap.entries()) {
|
|
77
|
-
await this.restoreFile(backupPath, filePath);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* 古いバックアップファイルをクリーンアップする
|
|
82
|
-
* @param maxAge - 保持する最大日数(デフォルト: 7日)
|
|
83
|
-
*/
|
|
84
|
-
async cleanupOldBackups(maxAge = 7) {
|
|
85
|
-
if (!(await fs.pathExists(this.backupDir))) {
|
|
86
|
-
return 0;
|
|
87
|
-
}
|
|
88
|
-
const files = await fs.readdir(this.backupDir);
|
|
89
|
-
const now = Date.now();
|
|
90
|
-
const maxAgeMs = maxAge * 24 * 60 * 60 * 1000;
|
|
91
|
-
let deletedCount = 0;
|
|
92
|
-
for (const file of files) {
|
|
93
|
-
const filePath = path.join(this.backupDir, file);
|
|
94
|
-
const stat = await fs.stat(filePath);
|
|
95
|
-
if (now - stat.mtime.getTime() > maxAgeMs) {
|
|
96
|
-
await fs.remove(filePath);
|
|
97
|
-
deletedCount++;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
return deletedCount;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* すべてのバックアップファイルを削除する
|
|
104
|
-
*/
|
|
105
|
-
async clearAllBackups() {
|
|
106
|
-
if (await fs.pathExists(this.backupDir)) {
|
|
107
|
-
await fs.remove(this.backupDir);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* バックアップディレクトリのパスを取得する
|
|
112
|
-
*/
|
|
113
|
-
getBackupDir() {
|
|
114
|
-
return this.backupDir;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
//# sourceMappingURL=backup-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"backup-manager.js","sourceRoot":"","sources":["../../../src/lib/sync/backup-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"backup-manager.test.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/backup-manager.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import os from "node:os";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import fs from "fs-extra";
|
|
4
|
-
import { beforeEach, describe, expect, it } from "vitest";
|
|
5
|
-
import { BackupManager } from "./backup-manager.js";
|
|
6
|
-
describe("BackupManager", () => {
|
|
7
|
-
let tempDir;
|
|
8
|
-
let manager;
|
|
9
|
-
beforeEach(async () => {
|
|
10
|
-
// テスト用一時ディレクトリを作成
|
|
11
|
-
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "backup-test-"));
|
|
12
|
-
manager = new BackupManager(tempDir);
|
|
13
|
-
});
|
|
14
|
-
describe("backupFile", () => {
|
|
15
|
-
it("ファイルをバックアップディレクトリにコピーする", async () => {
|
|
16
|
-
const testFile = "test.txt";
|
|
17
|
-
const testContent = "Test content";
|
|
18
|
-
const testFilePath = path.join(tempDir, testFile);
|
|
19
|
-
// テストファイルを作成
|
|
20
|
-
await fs.writeFile(testFilePath, testContent, "utf-8");
|
|
21
|
-
// バックアップを実行
|
|
22
|
-
const backupPath = await manager.backupFile(testFile);
|
|
23
|
-
// バックアップファイルが存在することを確認
|
|
24
|
-
expect(await fs.pathExists(backupPath)).toBe(true);
|
|
25
|
-
// バックアップの内容が元のファイルと一致することを確認
|
|
26
|
-
const backupContent = await fs.readFile(backupPath, "utf-8");
|
|
27
|
-
expect(backupContent).toBe(testContent);
|
|
28
|
-
});
|
|
29
|
-
it("存在しないファイルをバックアップしようとした場合、エラーをスローする", async () => {
|
|
30
|
-
await expect(manager.backupFile("nonexistent.txt")).rejects.toThrow("バックアップ対象ファイルが存在しません");
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
describe("backupFiles", () => {
|
|
34
|
-
it("複数のファイルをバックアップする", async () => {
|
|
35
|
-
const files = ["file1.txt", "file2.txt"];
|
|
36
|
-
const content1 = "Content 1";
|
|
37
|
-
const content2 = "Content 2";
|
|
38
|
-
// テストファイルを作成
|
|
39
|
-
await fs.writeFile(path.join(tempDir, files[0]), content1, "utf-8");
|
|
40
|
-
await fs.writeFile(path.join(tempDir, files[1]), content2, "utf-8");
|
|
41
|
-
// バックアップを実行
|
|
42
|
-
const backupMap = await manager.backupFiles(files);
|
|
43
|
-
// 2つのファイルがバックアップされたことを確認
|
|
44
|
-
expect(backupMap.size).toBe(2);
|
|
45
|
-
expect(backupMap.has(files[0])).toBe(true);
|
|
46
|
-
expect(backupMap.has(files[1])).toBe(true);
|
|
47
|
-
// バックアップファイルの内容を確認
|
|
48
|
-
const backup1Content = await fs.readFile(backupMap.get(files[0]), "utf-8");
|
|
49
|
-
const backup2Content = await fs.readFile(backupMap.get(files[1]), "utf-8");
|
|
50
|
-
expect(backup1Content).toBe(content1);
|
|
51
|
-
expect(backup2Content).toBe(content2);
|
|
52
|
-
});
|
|
53
|
-
it("存在しないファイルはスキップする", async () => {
|
|
54
|
-
const files = ["exists.txt", "nonexistent.txt"];
|
|
55
|
-
await fs.writeFile(path.join(tempDir, files[0]), "Content", "utf-8");
|
|
56
|
-
// バックアップを実行(エラーにならず、存在するファイルのみバックアップ)
|
|
57
|
-
const backupMap = await manager.backupFiles(files);
|
|
58
|
-
expect(backupMap.size).toBe(1);
|
|
59
|
-
expect(backupMap.has(files[0])).toBe(true);
|
|
60
|
-
expect(backupMap.has(files[1])).toBe(false);
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
describe("restoreFile", () => {
|
|
64
|
-
it("バックアップファイルをリストアする", async () => {
|
|
65
|
-
const originalFile = "test.txt";
|
|
66
|
-
const originalContent = "Original content";
|
|
67
|
-
const originalPath = path.join(tempDir, originalFile);
|
|
68
|
-
// 元のファイルを作成してバックアップ
|
|
69
|
-
await fs.writeFile(originalPath, originalContent, "utf-8");
|
|
70
|
-
const backupPath = await manager.backupFile(originalFile);
|
|
71
|
-
// 元のファイルを変更
|
|
72
|
-
await fs.writeFile(originalPath, "Modified content", "utf-8");
|
|
73
|
-
// リストアを実行
|
|
74
|
-
await manager.restoreFile(backupPath, originalFile);
|
|
75
|
-
// 元の内容に戻っていることを確認
|
|
76
|
-
const restoredContent = await fs.readFile(originalPath, "utf-8");
|
|
77
|
-
expect(restoredContent).toBe(originalContent);
|
|
78
|
-
});
|
|
79
|
-
it("バックアップファイルが存在しない場合、エラーをスローする", async () => {
|
|
80
|
-
await expect(manager.restoreFile("/nonexistent/backup.txt", "test.txt")).rejects.toThrow("バックアップファイルが存在しません");
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
describe("restoreFiles", () => {
|
|
84
|
-
it("複数のバックアップファイルをリストアする", async () => {
|
|
85
|
-
const files = ["file1.txt", "file2.txt"];
|
|
86
|
-
const originalContents = ["Content 1", "Content 2"];
|
|
87
|
-
// 元のファイルを作成してバックアップ
|
|
88
|
-
await fs.writeFile(path.join(tempDir, files[0]), originalContents[0], "utf-8");
|
|
89
|
-
await fs.writeFile(path.join(tempDir, files[1]), originalContents[1], "utf-8");
|
|
90
|
-
const backupMap = await manager.backupFiles(files);
|
|
91
|
-
// 元のファイルを変更
|
|
92
|
-
await fs.writeFile(path.join(tempDir, files[0]), "Modified 1", "utf-8");
|
|
93
|
-
await fs.writeFile(path.join(tempDir, files[1]), "Modified 2", "utf-8");
|
|
94
|
-
// リストアを実行
|
|
95
|
-
await manager.restoreFiles(backupMap);
|
|
96
|
-
// 両方のファイルが元の内容に戻っていることを確認
|
|
97
|
-
const restored1 = await fs.readFile(path.join(tempDir, files[0]), "utf-8");
|
|
98
|
-
const restored2 = await fs.readFile(path.join(tempDir, files[1]), "utf-8");
|
|
99
|
-
expect(restored1).toBe(originalContents[0]);
|
|
100
|
-
expect(restored2).toBe(originalContents[1]);
|
|
101
|
-
});
|
|
102
|
-
});
|
|
103
|
-
describe("cleanupOldBackups", () => {
|
|
104
|
-
it("古いバックアップファイルを削除する", async () => {
|
|
105
|
-
const backupDir = manager.getBackupDir();
|
|
106
|
-
await fs.ensureDir(backupDir);
|
|
107
|
-
// 古いバックアップファイルを作成(8日前)
|
|
108
|
-
const oldBackup = path.join(backupDir, "old-backup.txt");
|
|
109
|
-
await fs.writeFile(oldBackup, "Old backup", "utf-8");
|
|
110
|
-
const oldDate = new Date();
|
|
111
|
-
oldDate.setDate(oldDate.getDate() - 8);
|
|
112
|
-
await fs.utimes(oldBackup, oldDate, oldDate);
|
|
113
|
-
// 新しいバックアップファイルを作成(今日)
|
|
114
|
-
const newBackup = path.join(backupDir, "new-backup.txt");
|
|
115
|
-
await fs.writeFile(newBackup, "New backup", "utf-8");
|
|
116
|
-
// クリーンアップを実行(7日より古いファイルを削除)
|
|
117
|
-
const deletedCount = await manager.cleanupOldBackups(7);
|
|
118
|
-
// 1ファイルが削除されたことを確認
|
|
119
|
-
expect(deletedCount).toBe(1);
|
|
120
|
-
// 古いファイルが削除され、新しいファイルは残っていることを確認
|
|
121
|
-
expect(await fs.pathExists(oldBackup)).toBe(false);
|
|
122
|
-
expect(await fs.pathExists(newBackup)).toBe(true);
|
|
123
|
-
});
|
|
124
|
-
it("バックアップディレクトリが存在しない場合、0を返す", async () => {
|
|
125
|
-
const deletedCount = await manager.cleanupOldBackups(7);
|
|
126
|
-
expect(deletedCount).toBe(0);
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
describe("clearAllBackups", () => {
|
|
130
|
-
it("すべてのバックアップファイルを削除する", async () => {
|
|
131
|
-
const backupDir = manager.getBackupDir();
|
|
132
|
-
// バックアップファイルを作成
|
|
133
|
-
const testFile = "test.txt";
|
|
134
|
-
await fs.writeFile(path.join(tempDir, testFile), "Content", "utf-8");
|
|
135
|
-
await manager.backupFile(testFile);
|
|
136
|
-
// バックアップディレクトリが存在することを確認
|
|
137
|
-
expect(await fs.pathExists(backupDir)).toBe(true);
|
|
138
|
-
// すべてのバックアップを削除
|
|
139
|
-
await manager.clearAllBackups();
|
|
140
|
-
// バックアップディレクトリが削除されたことを確認
|
|
141
|
-
expect(await fs.pathExists(backupDir)).toBe(false);
|
|
142
|
-
});
|
|
143
|
-
it("バックアップディレクトリが存在しない場合、エラーにならない", async () => {
|
|
144
|
-
// エラーなく実行できることを確認
|
|
145
|
-
await expect(manager.clearAllBackups()).resolves.toBeUndefined();
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
describe("getBackupDir", () => {
|
|
149
|
-
it("バックアップディレクトリのパスを返す", () => {
|
|
150
|
-
const backupDir = manager.getBackupDir();
|
|
151
|
-
expect(backupDir).toBe(path.join(tempDir, ".einja-sync-backups"));
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
//# sourceMappingURL=backup-manager.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"backup-manager.test.js","sourceRoot":"","sources":["../../../src/lib/sync/backup-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: conflict-resolver
|
|
3
|
-
description: gitコンフリクトを安全に解消する専用エージェント
|
|
4
|
-
model: sonnet
|
|
5
|
-
color: orange
|
|
6
|
-
skills:
|
|
7
|
-
- conflict-resolver
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# conflict-resolver エージェント
|
|
11
|
-
|
|
12
|
-
gitコンフリクト(rebase/merge/stash/cherry-pick等)を1ファイルずつユーザーに確認しながら安全に解消します。
|
|
13
|
-
|
|
14
|
-
## 役割
|
|
15
|
-
|
|
16
|
-
- コンフリクト状態の検出と診断
|
|
17
|
-
- 各コンフリクトファイルについてマージ案を提示
|
|
18
|
-
- ユーザー確認後に解消を実行
|
|
19
|
-
- 操作の継続(rebase --continue等)または中断を管理
|
|
20
|
-
|
|
21
|
-
## 処理フロー
|
|
22
|
-
|
|
23
|
-
conflict-resolver Skill を実行し、以下の手順でコンフリクトを解消します:
|
|
24
|
-
|
|
25
|
-
### ステップ1: コンフリクト状態の確認
|
|
26
|
-
|
|
27
|
-
1. コンフリクトファイルの一覧を表示
|
|
28
|
-
2. 操作タイプを判定(rebase/merge/cherry-pick/stash)
|
|
29
|
-
3. 10件以上の場合は継続確認
|
|
30
|
-
|
|
31
|
-
### ステップ2: 各ファイルについてユーザーに確認(1ファイルずつ)
|
|
32
|
-
|
|
33
|
-
**⚠️ 重要**: 複数ファイルをまとめて質問せず、必ず1ファイルごとにAskUserQuestionを実行すること。
|
|
34
|
-
|
|
35
|
-
各コンフリクトファイルに対して:
|
|
36
|
-
|
|
37
|
-
1. 双方の差分を表示(`git diff --ours` / `git diff --theirs`)
|
|
38
|
-
2. ファイル内容を読み、両方の変更箇所を理解
|
|
39
|
-
3. **AskUserQuestionツールで**マージ案を提示し、ユーザーの選択を待つ
|
|
40
|
-
|
|
41
|
-
```yaml
|
|
42
|
-
AskUserQuestion:
|
|
43
|
-
question: "{ファイル名}のコンフリクト解消方法を選択してください"
|
|
44
|
-
header: "コンフリクト解消"
|
|
45
|
-
options:
|
|
46
|
-
- label: "HEAD側を優先"
|
|
47
|
-
description: "現在のブランチの変更を採用。メリット: 現在の実装を維持。デメリット: マージ元の変更が失われる"
|
|
48
|
-
- label: "マージ元を優先"
|
|
49
|
-
description: "マージ元の変更を採用。メリット: 新しい変更を取り込める。デメリット: 現在の実装が上書きされる"
|
|
50
|
-
- label: "マージ案A(両方の変更を統合)"
|
|
51
|
-
description: "{具体的なマージ内容}。メリット: 両方の変更を活かせる。デメリット: 統合リスク"
|
|
52
|
-
- label: "このファイルをスキップ"
|
|
53
|
-
description: "後で手動解消。メリット: 判断保留。デメリット: 後で対応が必要"
|
|
54
|
-
- label: "操作全体を中断"
|
|
55
|
-
description: "rebase/merge/cherry-pickを中断。メリット: 安全に戻せる。デメリット: 解消作業が無効"
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
4. ユーザーの選択後、次のファイルへ進む(全ファイル完了までループ)
|
|
59
|
-
|
|
60
|
-
### ステップ3: 確認後に解消を実行
|
|
61
|
-
|
|
62
|
-
1. ユーザーが選択した案に従ってファイルを編集
|
|
63
|
-
2. `git add <file>` でステージング
|
|
64
|
-
3. 編集結果をユーザーに表示して最終確認
|
|
65
|
-
|
|
66
|
-
### ステップ4: 全ファイル解消後
|
|
67
|
-
|
|
68
|
-
1. 残りコンフリクトの検証(`git diff --check`)
|
|
69
|
-
2. 操作タイプに応じて継続:
|
|
70
|
-
- rebase: `git rebase --continue`
|
|
71
|
-
- merge: `git commit`
|
|
72
|
-
- cherry-pick: `git cherry-pick --continue`
|
|
73
|
-
- stash: `git stash drop`
|
|
74
|
-
3. 追加のコンフリクトがあればステップ2に戻る
|
|
75
|
-
|
|
76
|
-
### ステップ5: 中断・やり直しオプション
|
|
77
|
-
|
|
78
|
-
ユーザーが中断を希望した場合、操作タイプに応じて中断:
|
|
79
|
-
- rebase: `git rebase --abort`
|
|
80
|
-
- merge: `git merge --abort`
|
|
81
|
-
- cherry-pick: `git cherry-pick --abort`
|
|
82
|
-
- stash: `git checkout -- .` でリセット
|
|
83
|
-
|
|
84
|
-
## 禁止事項
|
|
85
|
-
|
|
86
|
-
以下の操作は**絶対に行わない**:
|
|
87
|
-
|
|
88
|
-
- ユーザー確認なしでのコンフリクト自動解消
|
|
89
|
-
- `--ours`や`--theirs`オプションの無断使用
|
|
90
|
-
- コンフリクトマーカー(`<<<<<<<`、`=======`、`>>>>>>>`)を残したままのコミット
|
|
91
|
-
|
|
92
|
-
## 出力形式
|
|
93
|
-
|
|
94
|
-
### 成功時
|
|
95
|
-
|
|
96
|
-
```markdown
|
|
97
|
-
## コンフリクト解消完了
|
|
98
|
-
|
|
99
|
-
### 解消サマリー
|
|
100
|
-
- **コンフリクトファイル数**: {count}個
|
|
101
|
-
- **操作タイプ**: [rebase / merge / cherry-pick / stash]
|
|
102
|
-
|
|
103
|
-
### 解消ファイル一覧
|
|
104
|
-
| # | ファイル | 解消方法 |
|
|
105
|
-
|---|---------|---------|
|
|
106
|
-
| 1 | src/auth/login.ts | 両方の変更を取り込み |
|
|
107
|
-
| 2 | src/config.ts | HEAD側を優先 |
|
|
108
|
-
|
|
109
|
-
### ステータス: SUCCESS
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### 中断時
|
|
113
|
-
|
|
114
|
-
```markdown
|
|
115
|
-
## コンフリクト解消
|
|
116
|
-
|
|
117
|
-
### ステータス: ABORTED
|
|
118
|
-
|
|
119
|
-
**理由**: [ユーザーが中断を選択 / 手動解消を希望]
|
|
120
|
-
|
|
121
|
-
操作は中断されました。
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
### 失敗時
|
|
125
|
-
|
|
126
|
-
```markdown
|
|
127
|
-
## コンフリクト解消
|
|
128
|
-
|
|
129
|
-
### ステータス: FAILURE
|
|
130
|
-
|
|
131
|
-
**エラー**: [エラー内容]
|
|
132
|
-
|
|
133
|
-
[推奨される対処方法]
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
## 利用シーン
|
|
137
|
-
|
|
138
|
-
| シーン | 呼び出し元 |
|
|
139
|
-
|--------|-----------|
|
|
140
|
-
| PR作成時のコンフリクト | task-committer |
|
|
141
|
-
| rebase時のコンフリクト | 直接呼び出し |
|
|
142
|
-
| merge時のコンフリクト | 直接呼び出し |
|
|
143
|
-
| stash適用時のコンフリクト | 直接呼び出し |
|
|
144
|
-
|
|
145
|
-
## 連携エージェント
|
|
146
|
-
|
|
147
|
-
- **呼び出し元**: `task-committer` - push時にコンフリクトが発生した場合
|
|
148
|
-
- **単体呼び出し**: ユーザーがrebase/merge/stash時に直接呼び出し可能
|
|
149
|
-
|
|
150
|
-
<!-- @einja:project-private:start id="git-conflict-resolver-project" -->
|
|
151
|
-
<!-- プロジェクト固有の情報を記入 -->
|
|
152
|
-
<!-- @einja:project-private:end -->
|