@einja/dev-cli 0.1.6
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 +179 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +49 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +243 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +23 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/sync.d.ts +7 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +294 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/sync.test.d.ts +2 -0
- package/dist/commands/sync.test.d.ts.map +1 -0
- package/dist/commands/sync.test.js +593 -0
- package/dist/commands/sync.test.js.map +1 -0
- package/dist/commands/task-loop.d.ts +11 -0
- package/dist/commands/task-loop.d.ts.map +1 -0
- package/dist/commands/task-loop.js +81 -0
- package/dist/commands/task-loop.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/file-system.d.ts +39 -0
- package/dist/lib/file-system.d.ts.map +1 -0
- package/dist/lib/file-system.js +79 -0
- package/dist/lib/file-system.js.map +1 -0
- package/dist/lib/mcp-config.d.ts +43 -0
- package/dist/lib/mcp-config.d.ts.map +1 -0
- package/dist/lib/mcp-config.js +109 -0
- package/dist/lib/mcp-config.js.map +1 -0
- package/dist/lib/mcp-config.test.d.ts +2 -0
- package/dist/lib/mcp-config.test.d.ts.map +1 -0
- package/dist/lib/mcp-config.test.js +285 -0
- package/dist/lib/mcp-config.test.js.map +1 -0
- package/dist/lib/merger.d.ts +41 -0
- package/dist/lib/merger.d.ts.map +1 -0
- package/dist/lib/merger.js +164 -0
- package/dist/lib/merger.js.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.d.ts +35 -0
- package/dist/lib/preset-update/cli-repo-detector.d.ts.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.js +83 -0
- package/dist/lib/preset-update/cli-repo-detector.js.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.test.d.ts +2 -0
- package/dist/lib/preset-update/cli-repo-detector.test.d.ts.map +1 -0
- package/dist/lib/preset-update/cli-repo-detector.test.js +120 -0
- package/dist/lib/preset-update/cli-repo-detector.test.js.map +1 -0
- package/dist/lib/preset-update/file-copier.d.ts +59 -0
- package/dist/lib/preset-update/file-copier.d.ts.map +1 -0
- package/dist/lib/preset-update/file-copier.js +220 -0
- package/dist/lib/preset-update/file-copier.js.map +1 -0
- package/dist/lib/preset-update/file-copier.test.d.ts +2 -0
- package/dist/lib/preset-update/file-copier.test.d.ts.map +1 -0
- package/dist/lib/preset-update/file-copier.test.js +297 -0
- package/dist/lib/preset-update/file-copier.test.js.map +1 -0
- package/dist/lib/preset-update/preset-finder.d.ts +39 -0
- package/dist/lib/preset-update/preset-finder.d.ts.map +1 -0
- package/dist/lib/preset-update/preset-finder.js +92 -0
- package/dist/lib/preset-update/preset-finder.js.map +1 -0
- package/dist/lib/preset-update/preset-finder.test.d.ts +2 -0
- package/dist/lib/preset-update/preset-finder.test.d.ts.map +1 -0
- package/dist/lib/preset-update/preset-finder.test.js +128 -0
- package/dist/lib/preset-update/preset-finder.test.js.map +1 -0
- package/dist/lib/preset.d.ts +14 -0
- package/dist/lib/preset.d.ts.map +1 -0
- package/dist/lib/preset.js +52 -0
- package/dist/lib/preset.js.map +1 -0
- package/dist/lib/sync/backup-manager.d.ts +50 -0
- package/dist/lib/sync/backup-manager.d.ts.map +1 -0
- package/dist/lib/sync/backup-manager.js +117 -0
- package/dist/lib/sync/backup-manager.js.map +1 -0
- package/dist/lib/sync/backup-manager.test.d.ts +2 -0
- package/dist/lib/sync/backup-manager.test.d.ts.map +1 -0
- package/dist/lib/sync/backup-manager.test.js +155 -0
- package/dist/lib/sync/backup-manager.test.js.map +1 -0
- package/dist/lib/sync/batch-processor.d.ts +27 -0
- package/dist/lib/sync/batch-processor.d.ts.map +1 -0
- package/dist/lib/sync/batch-processor.js +46 -0
- package/dist/lib/sync/batch-processor.js.map +1 -0
- package/dist/lib/sync/batch-processor.test.d.ts +2 -0
- package/dist/lib/sync/batch-processor.test.d.ts.map +1 -0
- package/dist/lib/sync/batch-processor.test.js +110 -0
- package/dist/lib/sync/batch-processor.test.js.map +1 -0
- package/dist/lib/sync/category-validator.d.ts +36 -0
- package/dist/lib/sync/category-validator.d.ts.map +1 -0
- package/dist/lib/sync/category-validator.js +46 -0
- package/dist/lib/sync/category-validator.js.map +1 -0
- package/dist/lib/sync/category-validator.test.d.ts +2 -0
- package/dist/lib/sync/category-validator.test.d.ts.map +1 -0
- package/dist/lib/sync/category-validator.test.js +89 -0
- package/dist/lib/sync/category-validator.test.js.map +1 -0
- package/dist/lib/sync/conflict-reporter.d.ts +57 -0
- package/dist/lib/sync/conflict-reporter.d.ts.map +1 -0
- package/dist/lib/sync/conflict-reporter.js +81 -0
- package/dist/lib/sync/conflict-reporter.js.map +1 -0
- package/dist/lib/sync/conflict-reporter.test.d.ts +2 -0
- package/dist/lib/sync/conflict-reporter.test.d.ts.map +1 -0
- package/dist/lib/sync/conflict-reporter.test.js +132 -0
- package/dist/lib/sync/conflict-reporter.test.js.map +1 -0
- package/dist/lib/sync/diff-engine.d.ts +28 -0
- package/dist/lib/sync/diff-engine.d.ts.map +1 -0
- package/dist/lib/sync/diff-engine.js +118 -0
- package/dist/lib/sync/diff-engine.js.map +1 -0
- package/dist/lib/sync/diff-engine.test.d.ts +2 -0
- package/dist/lib/sync/diff-engine.test.d.ts.map +1 -0
- package/dist/lib/sync/diff-engine.test.js +133 -0
- package/dist/lib/sync/diff-engine.test.js.map +1 -0
- package/dist/lib/sync/file-filter.d.ts +40 -0
- package/dist/lib/sync/file-filter.d.ts.map +1 -0
- package/dist/lib/sync/file-filter.js +171 -0
- package/dist/lib/sync/file-filter.js.map +1 -0
- package/dist/lib/sync/file-filter.test.d.ts +2 -0
- package/dist/lib/sync/file-filter.test.d.ts.map +1 -0
- package/dist/lib/sync/file-filter.test.js +179 -0
- package/dist/lib/sync/file-filter.test.js.map +1 -0
- package/dist/lib/sync/hash-cache.d.ts +34 -0
- package/dist/lib/sync/hash-cache.d.ts.map +1 -0
- package/dist/lib/sync/hash-cache.js +51 -0
- package/dist/lib/sync/hash-cache.js.map +1 -0
- package/dist/lib/sync/hash-cache.test.d.ts +2 -0
- package/dist/lib/sync/hash-cache.test.d.ts.map +1 -0
- package/dist/lib/sync/hash-cache.test.js +110 -0
- package/dist/lib/sync/hash-cache.test.js.map +1 -0
- package/dist/lib/sync/integration.test.d.ts +2 -0
- package/dist/lib/sync/integration.test.d.ts.map +1 -0
- package/dist/lib/sync/integration.test.js +317 -0
- package/dist/lib/sync/integration.test.js.map +1 -0
- package/dist/lib/sync/marker-processor.d.ts +54 -0
- package/dist/lib/sync/marker-processor.d.ts.map +1 -0
- package/dist/lib/sync/marker-processor.js +208 -0
- package/dist/lib/sync/marker-processor.js.map +1 -0
- package/dist/lib/sync/marker-processor.test.d.ts +2 -0
- package/dist/lib/sync/marker-processor.test.d.ts.map +1 -0
- package/dist/lib/sync/marker-processor.test.js +245 -0
- package/dist/lib/sync/marker-processor.test.js.map +1 -0
- package/dist/lib/sync/metadata-manager.d.ts +46 -0
- package/dist/lib/sync/metadata-manager.d.ts.map +1 -0
- package/dist/lib/sync/metadata-manager.js +129 -0
- package/dist/lib/sync/metadata-manager.js.map +1 -0
- package/dist/lib/sync/metadata-manager.test.d.ts +2 -0
- package/dist/lib/sync/metadata-manager.test.d.ts.map +1 -0
- package/dist/lib/sync/metadata-manager.test.js +137 -0
- package/dist/lib/sync/metadata-manager.test.js.map +1 -0
- package/dist/lib/sync/performance.test.d.ts +2 -0
- package/dist/lib/sync/performance.test.d.ts.map +1 -0
- package/dist/lib/sync/performance.test.js +126 -0
- package/dist/lib/sync/performance.test.js.map +1 -0
- package/dist/types/index.d.ts +59 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/preset-update.d.ts +106 -0
- package/dist/types/preset-update.d.ts.map +1 -0
- package/dist/types/preset-update.js +5 -0
- package/dist/types/preset-update.js.map +1 -0
- package/dist/types/sync.d.ts +169 -0
- package/dist/types/sync.d.ts.map +1 -0
- package/dist/types/sync.js +19 -0
- package/dist/types/sync.js.map +1 -0
- package/package.json +72 -0
- package/presets/minimal/.claude/agents/einja/docs/docs-updater.md +161 -0
- package/presets/minimal/.claude/agents/einja/frontend/design-engineer.md +685 -0
- package/presets/minimal/.claude/agents/einja/frontend/frontend-architect.md +747 -0
- package/presets/minimal/.claude/agents/einja/frontend/frontend-coder.md +441 -0
- package/presets/minimal/.claude/agents/einja/git/conflict-resolver.md +148 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-design-generator.md +462 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-qa-generator.md +466 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-requirements-generator.md +416 -0
- package/presets/minimal/.claude/agents/einja/specs/spec-tasks-generator.md +608 -0
- package/presets/minimal/.claude/agents/einja/task/task-committer.md +82 -0
- package/presets/minimal/.claude/agents/einja/task/task-executer.md +352 -0
- package/presets/minimal/.claude/agents/einja/task/task-modification-analyzer.md +369 -0
- package/presets/minimal/.claude/agents/einja/task/task-qa.md +74 -0
- package/presets/minimal/.claude/agents/einja/task/task-reviewer.md +169 -0
- package/presets/minimal/.claude/commands/einja/frontend-implement.md +322 -0
- package/presets/minimal/.claude/commands/einja/spec-create.md +254 -0
- package/presets/minimal/.claude/commands/einja/start-dev.md +98 -0
- package/presets/minimal/.claude/commands/einja/sync-cursor-commands.md +203 -0
- package/presets/minimal/.claude/commands/einja/task-exec.md +390 -0
- package/presets/minimal/.claude/commands/einja/update-docs-by-task-specs.md +448 -0
- package/presets/minimal/.claude/hooks/einja/biome-format.sh +49 -0
- package/presets/minimal/.claude/hooks/einja/design-doc-check.sh +61 -0
- package/presets/minimal/.claude/hooks/einja/detect-secrets.sh +62 -0
- package/presets/minimal/.claude/hooks/einja/large-file-warning.sh +42 -0
- package/presets/minimal/.claude/hooks/einja/playwright-resize.sh +36 -0
- package/presets/minimal/.claude/hooks/einja/typecheck.sh +37 -0
- package/presets/minimal/.claude/hooks/einja/unset-volta-recursion.sh +32 -0
- package/presets/minimal/.claude/hooks/einja/validate-git-commit.sh +239 -0
- package/presets/minimal/.claude/hooks/einja/warn-index-ts.sh +34 -0
- package/presets/minimal/.claude/hooks/einja/warn-relative-import.sh +48 -0
- package/presets/minimal/.claude/settings.json +174 -0
- package/presets/minimal/.claude/skills/einja/api-development/SKILL.md +14 -0
- package/presets/minimal/.claude/skills/einja/backend-architecture/SKILL.md +14 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/SKILL.md +120 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/reference/naming-conventions.md +107 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/reference/prohibited-patterns.md +169 -0
- package/presets/minimal/.claude/skills/einja/coding-standards/reference/typescript-rules.md +247 -0
- package/presets/minimal/.claude/skills/einja/component-design/SKILL.md +109 -0
- package/presets/minimal/.claude/skills/einja/component-design/reference/directory-structure.md +117 -0
- package/presets/minimal/.claude/skills/einja/component-design/reference/props-patterns.md +159 -0
- package/presets/minimal/.claude/skills/einja/component-design/reference/styling-guide.md +200 -0
- package/presets/minimal/.claude/skills/einja/conflict-resolver/SKILL.md +190 -0
- package/presets/minimal/.claude/skills/einja/frontend-development/SKILL.md +14 -0
- package/presets/minimal/.claude/skills/einja/general-context-loader/SKILL.md +254 -0
- package/presets/minimal/.claude/skills/einja/output-format/SKILL.md +137 -0
- package/presets/minimal/.claude/skills/einja/spec-context-loader/SKILL.md +177 -0
- package/presets/minimal/.claude/skills/einja/task-commit/SKILL.md +269 -0
- package/presets/minimal/.claude/skills/einja/task-qa/SKILL.md +306 -0
- package/presets/minimal/.claude/skills/einja/task-qa/reference/failure-patterns.md +69 -0
- package/presets/minimal/.claude/skills/einja/task-qa/reference/troubleshooting.md +65 -0
- package/presets/minimal/.claude/skills/einja/task-qa/reference/usage-patterns.md +52 -0
- package/presets/minimal/.claude/skills/einja/task-qa/templates/qa-test-template.md +128 -0
- package/presets/minimal/preset.yaml +111 -0
- package/presets/minimal/symlinks.json +45 -0
- package/scaffolds/.mcp.json +45 -0
- package/scaffolds/CLAUDE.md.template +318 -0
- package/scaffolds/steering/README.md +170 -0
- package/scaffolds/steering/acceptance-criteria-and-qa-guide.md +415 -0
- package/scaffolds/steering/architecture.md +481 -0
- package/scaffolds/steering/branch-strategy.md +362 -0
- package/scaffolds/steering/commit-rules.md +217 -0
- package/scaffolds/steering/db-schema-design.md +609 -0
- package/scaffolds/steering/development/api-development.md +783 -0
- package/scaffolds/steering/development/backend-architecture.md +731 -0
- package/scaffolds/steering/development/frontend-development.md +1537 -0
- package/scaffolds/steering/development/review-guidelines.md +365 -0
- package/scaffolds/steering/development/testing-strategy.md +819 -0
- package/scaffolds/steering/development-workflow.md +429 -0
- package/scaffolds/steering/infrastructure/deployment.md +277 -0
- package/scaffolds/steering/infrastructure/environment-variables.md +298 -0
- package/scaffolds/steering/product.md +540 -0
- package/scaffolds/steering/task-management.md +367 -0
- package/templates/README.md +159 -0
- package/templates/design-simple.md.template +172 -0
- package/templates/design.md.template +327 -0
- package/templates/qa-test.md.template +125 -0
- package/templates/requirements.md.template +254 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ファイルハッシュキャッシュ
|
|
3
|
+
* 同一ファイルの重複ハッシュ計算を避けるためのキャッシュ機構
|
|
4
|
+
*/
|
|
5
|
+
export class HashCache {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.cache = new Map();
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* キャッシュキーを生成する
|
|
11
|
+
* キャッシュキー形式: ${filePath}:${contentLength}
|
|
12
|
+
*/
|
|
13
|
+
generateKey(filePath, contentLength) {
|
|
14
|
+
return `${filePath}:${contentLength}`;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* キャッシュからハッシュを取得する
|
|
18
|
+
* @returns ハッシュ値(キャッシュに存在しない場合はundefined)
|
|
19
|
+
*/
|
|
20
|
+
get(filePath, contentLength) {
|
|
21
|
+
const key = this.generateKey(filePath, contentLength);
|
|
22
|
+
return this.cache.get(key);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* ハッシュをキャッシュに保存する
|
|
26
|
+
*/
|
|
27
|
+
set(filePath, contentLength, hash) {
|
|
28
|
+
const key = this.generateKey(filePath, contentLength);
|
|
29
|
+
this.cache.set(key, hash);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* キャッシュに存在するかチェックする
|
|
33
|
+
*/
|
|
34
|
+
has(filePath, contentLength) {
|
|
35
|
+
const key = this.generateKey(filePath, contentLength);
|
|
36
|
+
return this.cache.has(key);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* キャッシュをクリアする
|
|
40
|
+
*/
|
|
41
|
+
clear() {
|
|
42
|
+
this.cache.clear();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* キャッシュサイズ(エントリ数)を取得する
|
|
46
|
+
*/
|
|
47
|
+
size() {
|
|
48
|
+
return this.cache.size;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=hash-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash-cache.js","sourceRoot":"","sources":["../../../src/lib/sync/hash-cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,SAAS;IAAtB;QACS,UAAK,GAAwB,IAAI,GAAG,EAAE,CAAC;IAgDhD,CAAC;IA9CA;;;OAGG;IACK,WAAW,CAAC,QAAgB,EAAE,aAAqB;QAC1D,OAAO,GAAG,QAAQ,IAAI,aAAa,EAAE,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,GAAG,CAAC,QAAgB,EAAE,aAAqB;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,QAAgB,EAAE,aAAqB,EAAE,IAAY;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,QAAgB,EAAE,aAAqB;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,IAAI;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACxB,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash-cache.test.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/hash-cache.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { HashCache } from "./hash-cache.js";
|
|
3
|
+
describe("HashCache", () => {
|
|
4
|
+
describe("ハッシュの保存と取得", () => {
|
|
5
|
+
it("ハッシュを保存し、同じキーで取得できること", () => {
|
|
6
|
+
const cache = new HashCache();
|
|
7
|
+
const filePath = ".claude/commands/einja/spec-create.md";
|
|
8
|
+
const contentLength = 1024;
|
|
9
|
+
const hash = "abc123def456";
|
|
10
|
+
cache.set(filePath, contentLength, hash);
|
|
11
|
+
const result = cache.get(filePath, contentLength);
|
|
12
|
+
expect(result).toBe(hash);
|
|
13
|
+
});
|
|
14
|
+
it("存在しないキーの場合、undefinedが返されること", () => {
|
|
15
|
+
const cache = new HashCache();
|
|
16
|
+
const result = cache.get("nonexistent.md", 100);
|
|
17
|
+
expect(result).toBeUndefined();
|
|
18
|
+
});
|
|
19
|
+
it("異なるファイルパスで異なるハッシュを保存できること", () => {
|
|
20
|
+
const cache = new HashCache();
|
|
21
|
+
const file1 = "file1.md";
|
|
22
|
+
const file2 = "file2.md";
|
|
23
|
+
const hash1 = "hash1";
|
|
24
|
+
const hash2 = "hash2";
|
|
25
|
+
cache.set(file1, 100, hash1);
|
|
26
|
+
cache.set(file2, 100, hash2);
|
|
27
|
+
expect(cache.get(file1, 100)).toBe(hash1);
|
|
28
|
+
expect(cache.get(file2, 100)).toBe(hash2);
|
|
29
|
+
});
|
|
30
|
+
it("同じファイルパスでも異なるコンテンツ長で異なるハッシュを保存できること", () => {
|
|
31
|
+
const cache = new HashCache();
|
|
32
|
+
const filePath = "file.md";
|
|
33
|
+
const hash1 = "hash1";
|
|
34
|
+
const hash2 = "hash2";
|
|
35
|
+
cache.set(filePath, 100, hash1);
|
|
36
|
+
cache.set(filePath, 200, hash2);
|
|
37
|
+
expect(cache.get(filePath, 100)).toBe(hash1);
|
|
38
|
+
expect(cache.get(filePath, 200)).toBe(hash2);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe("hasメソッド", () => {
|
|
42
|
+
it("保存されたキーに対してtrueを返すこと", () => {
|
|
43
|
+
const cache = new HashCache();
|
|
44
|
+
cache.set("file.md", 100, "hash");
|
|
45
|
+
expect(cache.has("file.md", 100)).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
it("保存されていないキーに対してfalseを返すこと", () => {
|
|
48
|
+
const cache = new HashCache();
|
|
49
|
+
expect(cache.has("file.md", 100)).toBe(false);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe("clearメソッド", () => {
|
|
53
|
+
it("すべてのキャッシュをクリアできること", () => {
|
|
54
|
+
const cache = new HashCache();
|
|
55
|
+
cache.set("file1.md", 100, "hash1");
|
|
56
|
+
cache.set("file2.md", 200, "hash2");
|
|
57
|
+
expect(cache.size()).toBe(2);
|
|
58
|
+
cache.clear();
|
|
59
|
+
expect(cache.size()).toBe(0);
|
|
60
|
+
expect(cache.has("file1.md", 100)).toBe(false);
|
|
61
|
+
expect(cache.has("file2.md", 200)).toBe(false);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
describe("sizeメソッド", () => {
|
|
65
|
+
it("キャッシュエントリ数を正しく返すこと", () => {
|
|
66
|
+
const cache = new HashCache();
|
|
67
|
+
expect(cache.size()).toBe(0);
|
|
68
|
+
cache.set("file1.md", 100, "hash1");
|
|
69
|
+
expect(cache.size()).toBe(1);
|
|
70
|
+
cache.set("file2.md", 200, "hash2");
|
|
71
|
+
expect(cache.size()).toBe(2);
|
|
72
|
+
cache.clear();
|
|
73
|
+
expect(cache.size()).toBe(0);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe("同一ファイルの2回目以降のハッシュ計算をスキップ", () => {
|
|
77
|
+
it("同じファイルパスとコンテンツ長で2回getした場合、2回目はキャッシュから取得されること", () => {
|
|
78
|
+
const cache = new HashCache();
|
|
79
|
+
const filePath = ".claude/commands/einja/spec-create.md";
|
|
80
|
+
const contentLength = 1024;
|
|
81
|
+
const hash = "abc123def456";
|
|
82
|
+
// 1回目:保存
|
|
83
|
+
cache.set(filePath, contentLength, hash);
|
|
84
|
+
// 2回目:取得(キャッシュヒット)
|
|
85
|
+
const result1 = cache.get(filePath, contentLength);
|
|
86
|
+
const result2 = cache.get(filePath, contentLength);
|
|
87
|
+
expect(result1).toBe(hash);
|
|
88
|
+
expect(result2).toBe(hash);
|
|
89
|
+
expect(result1).toBe(result2);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe("キャッシュキーの一意性", () => {
|
|
93
|
+
it("ファイルパスとコンテンツ長の組み合わせでキャッシュキーが一意であること", () => {
|
|
94
|
+
const cache = new HashCache();
|
|
95
|
+
// 同じファイルパス、異なるコンテンツ長
|
|
96
|
+
cache.set("file.md", 100, "hash_100");
|
|
97
|
+
cache.set("file.md", 200, "hash_200");
|
|
98
|
+
// 異なるファイルパス、同じコンテンツ長
|
|
99
|
+
cache.set("file1.md", 100, "hash_file1");
|
|
100
|
+
cache.set("file2.md", 100, "hash_file2");
|
|
101
|
+
expect(cache.get("file.md", 100)).toBe("hash_100");
|
|
102
|
+
expect(cache.get("file.md", 200)).toBe("hash_200");
|
|
103
|
+
expect(cache.get("file1.md", 100)).toBe("hash_file1");
|
|
104
|
+
expect(cache.get("file2.md", 100)).toBe("hash_file2");
|
|
105
|
+
// すべて異なるキーとして扱われている
|
|
106
|
+
expect(cache.size()).toBe(4);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
//# sourceMappingURL=hash-cache.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash-cache.test.js","sourceRoot":"","sources":["../../../src/lib/sync/hash-cache.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { ConflictReporter } from "./conflict-reporter.js";
|
|
3
|
+
import { DiffEngine } from "./diff-engine.js";
|
|
4
|
+
/**
|
|
5
|
+
* タスクグループ1.3: 3方向マージエンジンとコンフリクト検出の統合テスト
|
|
6
|
+
*
|
|
7
|
+
* 受け入れ基準:
|
|
8
|
+
* - AC7.1: コンフリクトマーカーが正しく挿入される(Integration)
|
|
9
|
+
* - AC7.2: コンフリクト解消方法のヘルプメッセージが生成される(Unit - task-executerで検証済み)
|
|
10
|
+
* - AC7.3: コンフリクトマーカーを検出できる(Integration)
|
|
11
|
+
*/
|
|
12
|
+
describe("DiffEngine と ConflictReporter の統合テスト", () => {
|
|
13
|
+
const diffEngine = new DiffEngine();
|
|
14
|
+
const conflictReporter = new ConflictReporter();
|
|
15
|
+
describe("AC7.1: コンフリクトマーカーの挿入", () => {
|
|
16
|
+
it("同じ行を異なる内容で変更した場合、コンフリクトマーカーが挿入される", () => {
|
|
17
|
+
// Given: ローカルとテンプレートで同じ行を異なる内容で変更
|
|
18
|
+
const base = "Hello World\nThis is a test\nEnd of file";
|
|
19
|
+
const local = "Hello World\nThis is LOCAL change\nEnd of file";
|
|
20
|
+
const template = "Hello World\nThis is TEMPLATE change\nEnd of file";
|
|
21
|
+
// When: DiffEngine.merge3Wayを実行
|
|
22
|
+
const result = diffEngine.merge3Way(base, local, template);
|
|
23
|
+
// Then: コンフリクトマーカーが挿入される
|
|
24
|
+
expect(result.success).toBe(false);
|
|
25
|
+
expect(result.content).toContain("<<<<<<< LOCAL (your changes)");
|
|
26
|
+
expect(result.content).toContain("This is LOCAL change");
|
|
27
|
+
expect(result.content).toContain("=======");
|
|
28
|
+
expect(result.content).toContain("This is TEMPLATE change");
|
|
29
|
+
expect(result.content).toContain(">>>>>>> TEMPLATE (from @einja/cli)");
|
|
30
|
+
// Then: conflicts配列にコンフリクト情報が含まれる
|
|
31
|
+
expect(result.conflicts).toHaveLength(1);
|
|
32
|
+
expect(result.conflicts[0]).toMatchObject({
|
|
33
|
+
line: expect.any(Number),
|
|
34
|
+
localContent: "This is LOCAL change",
|
|
35
|
+
templateContent: "This is TEMPLATE change",
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
it("複数箇所でコンフリクトが発生した場合、すべてマーカーが挿入される", () => {
|
|
39
|
+
// Given: 複数箇所で変更
|
|
40
|
+
const base = "Line 1\nLine 2\nLine 3\nLine 4";
|
|
41
|
+
const local = "Line 1 LOCAL\nLine 2\nLine 3 LOCAL\nLine 4";
|
|
42
|
+
const template = "Line 1 TEMPLATE\nLine 2\nLine 3 TEMPLATE\nLine 4";
|
|
43
|
+
// When: マージを実行
|
|
44
|
+
const result = diffEngine.merge3Way(base, local, template);
|
|
45
|
+
// Then: 2つのコンフリクトが検出される
|
|
46
|
+
expect(result.success).toBe(false);
|
|
47
|
+
expect(result.conflicts).toHaveLength(2);
|
|
48
|
+
// Then: 両方のコンフリクトにマーカーが挿入される
|
|
49
|
+
const markerCount = (result.content.match(/<<<<<<< LOCAL/g) || [])
|
|
50
|
+
.length;
|
|
51
|
+
expect(markerCount).toBe(2);
|
|
52
|
+
});
|
|
53
|
+
it("コンフリクトがない場合、マーカーは挿入されない", () => {
|
|
54
|
+
// Given: ローカルのみ変更
|
|
55
|
+
const base = "Hello World\nThis is a test\nEnd of file";
|
|
56
|
+
const local = "Hello World\nThis is LOCAL change\nEnd of file";
|
|
57
|
+
const template = base; // テンプレートは変更なし
|
|
58
|
+
// When: マージを実行
|
|
59
|
+
const result = diffEngine.merge3Way(base, local, template);
|
|
60
|
+
// Then: コンフリクトなし
|
|
61
|
+
expect(result.success).toBe(true);
|
|
62
|
+
expect(result.conflicts).toHaveLength(0);
|
|
63
|
+
expect(result.content).not.toContain("<<<<<<< LOCAL");
|
|
64
|
+
expect(result.content).toContain("This is LOCAL change");
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe("AC7.2: コンフリクト解消方法のヘルプメッセージ", () => {
|
|
68
|
+
it("formatExitMessageでコンフリクト情報とヘルプが含まれる", () => {
|
|
69
|
+
// Given: コンフリクトが検出された
|
|
70
|
+
const conflicts = new Map();
|
|
71
|
+
conflicts.set(".claude/commands/einja/test.md", [
|
|
72
|
+
{
|
|
73
|
+
line: 10,
|
|
74
|
+
localContent: "local content",
|
|
75
|
+
templateContent: "template content",
|
|
76
|
+
},
|
|
77
|
+
]);
|
|
78
|
+
const report = conflictReporter.createReport(conflicts);
|
|
79
|
+
// When: 終了メッセージを生成
|
|
80
|
+
const message = conflictReporter.formatExitMessage(report);
|
|
81
|
+
// Then: コンフリクト情報が含まれる
|
|
82
|
+
expect(message).toContain("1件のコンフリクトが検出されました");
|
|
83
|
+
expect(message).toContain(".claude/commands/einja/test.md");
|
|
84
|
+
expect(message).toContain("行10");
|
|
85
|
+
// Then: ヘルプメッセージが含まれる
|
|
86
|
+
expect(message).toContain("💡 コンフリクト解消方法:");
|
|
87
|
+
expect(message).toContain("<<<<<<< LOCAL と >>>>>>> TEMPLATE の間を手動編集");
|
|
88
|
+
expect(message).toContain("コンフリクトマーカーを削除");
|
|
89
|
+
expect(message).toContain("再度 sync を実行");
|
|
90
|
+
// Then: 警告メッセージが含まれる
|
|
91
|
+
expect(message).toContain("同期処理は部分的に完了しましたが、コンフリクトの解消が必要です");
|
|
92
|
+
});
|
|
93
|
+
it("formatHelpMessageが正しいフォーマットで生成される", () => {
|
|
94
|
+
// When: ヘルプメッセージを生成
|
|
95
|
+
const helpMessage = conflictReporter.formatHelpMessage();
|
|
96
|
+
// Then: 必要な情報が含まれる
|
|
97
|
+
expect(helpMessage).toContain("💡 コンフリクト解消方法:");
|
|
98
|
+
expect(helpMessage).toContain("1. 上記ファイルを開く");
|
|
99
|
+
expect(helpMessage).toContain("2. <<<<<<< LOCAL と >>>>>>> TEMPLATE の間を手動編集");
|
|
100
|
+
expect(helpMessage).toContain("3. コンフリクトマーカーを削除");
|
|
101
|
+
expect(helpMessage).toContain("4. 再度 sync を実行");
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe("AC7.3: 未解決コンフリクトの検出", () => {
|
|
105
|
+
it("hasConflictMarkersがコンフリクトマーカーを検出する", () => {
|
|
106
|
+
// Given: コンフリクトファイルが存在
|
|
107
|
+
const contentWithConflict = `Line 1
|
|
108
|
+
<<<<<<< LOCAL (your changes)
|
|
109
|
+
Local change
|
|
110
|
+
=======
|
|
111
|
+
Template change
|
|
112
|
+
>>>>>>> TEMPLATE (from @einja/cli)
|
|
113
|
+
Line 2`;
|
|
114
|
+
// When: コンフリクトマーカーをチェック
|
|
115
|
+
const hasConflict = diffEngine.hasConflictMarkers(contentWithConflict);
|
|
116
|
+
// Then: trueを返す
|
|
117
|
+
expect(hasConflict).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
it("hasConflictMarkersがコンフリクトなしファイルをfalseと判定する", () => {
|
|
120
|
+
// Given: 通常のファイル
|
|
121
|
+
const contentWithoutConflict = "Line 1\nLine 2\nLine 3";
|
|
122
|
+
// When: コンフリクトマーカーをチェック
|
|
123
|
+
const hasConflict = diffEngine.hasConflictMarkers(contentWithoutConflict);
|
|
124
|
+
// Then: falseを返す
|
|
125
|
+
expect(hasConflict).toBe(false);
|
|
126
|
+
});
|
|
127
|
+
it("formatUnresolvedConflictErrorが適切なエラーメッセージを生成する", () => {
|
|
128
|
+
// Given: 未解決のコンフリクトが存在
|
|
129
|
+
const filePath = ".claude/commands/einja/test.md";
|
|
130
|
+
// When: エラーメッセージを生成
|
|
131
|
+
const errorMessage = conflictReporter.formatUnresolvedConflictError(filePath);
|
|
132
|
+
// Then: "未解決のコンフリクトが存在します"メッセージが生成される
|
|
133
|
+
expect(errorMessage).toContain("❌ 未解決のコンフリクトが存在します");
|
|
134
|
+
expect(errorMessage).toContain(filePath);
|
|
135
|
+
expect(errorMessage).toContain("コンフリクトマーカー(<<<<<<< LOCAL, =======, >>>>>>> TEMPLATE)を解消してから再度実行してください");
|
|
136
|
+
});
|
|
137
|
+
it("ConflictReporter.hasUnresolvedConflictsがマーカーを検出する", () => {
|
|
138
|
+
// Given: コンフリクトマーカーを含むファイル
|
|
139
|
+
const contentWithConflict = `Line 1
|
|
140
|
+
<<<<<<< LOCAL (your changes)
|
|
141
|
+
Local change
|
|
142
|
+
=======
|
|
143
|
+
Template change
|
|
144
|
+
>>>>>>> TEMPLATE (from @einja/cli)
|
|
145
|
+
Line 2`;
|
|
146
|
+
// When: hasUnresolvedConflictsでチェック
|
|
147
|
+
const hasConflict = conflictReporter.hasUnresolvedConflicts(contentWithConflict);
|
|
148
|
+
// Then: trueを返す
|
|
149
|
+
expect(hasConflict).toBe(true);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
describe("DiffEngine.parseConflictMarkers", () => {
|
|
153
|
+
it("コンフリクトマーカーからコンフリクト情報を抽出できる", () => {
|
|
154
|
+
// Given: コンフリクトマーカーを含むファイル
|
|
155
|
+
const contentWithConflict = `Line 1
|
|
156
|
+
<<<<<<< LOCAL (your changes)
|
|
157
|
+
Local change 1
|
|
158
|
+
Local change 2
|
|
159
|
+
=======
|
|
160
|
+
Template change 1
|
|
161
|
+
Template change 2
|
|
162
|
+
>>>>>>> TEMPLATE (from @einja/cli)
|
|
163
|
+
Line 2`;
|
|
164
|
+
// When: コンフリクトマーカーをパース
|
|
165
|
+
const conflicts = diffEngine.parseConflictMarkers(contentWithConflict);
|
|
166
|
+
// Then: コンフリクト情報が抽出される
|
|
167
|
+
expect(conflicts).toHaveLength(1);
|
|
168
|
+
expect(conflicts[0]).toMatchObject({
|
|
169
|
+
line: 2,
|
|
170
|
+
localContent: "Local change 1\nLocal change 2",
|
|
171
|
+
templateContent: "Template change 1\nTemplate change 2",
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
it("複数のコンフリクトマーカーをパースできる", () => {
|
|
175
|
+
// Given: 複数のコンフリクトマーカー
|
|
176
|
+
const contentWithConflicts = `Line 1
|
|
177
|
+
<<<<<<< LOCAL (your changes)
|
|
178
|
+
Local A
|
|
179
|
+
=======
|
|
180
|
+
Template A
|
|
181
|
+
>>>>>>> TEMPLATE (from @einja/cli)
|
|
182
|
+
Line 2
|
|
183
|
+
<<<<<<< LOCAL (your changes)
|
|
184
|
+
Local B
|
|
185
|
+
=======
|
|
186
|
+
Template B
|
|
187
|
+
>>>>>>> TEMPLATE (from @einja/cli)
|
|
188
|
+
Line 3`;
|
|
189
|
+
// When: パース
|
|
190
|
+
const conflicts = diffEngine.parseConflictMarkers(contentWithConflicts);
|
|
191
|
+
// Then: 2つのコンフリクトが抽出される
|
|
192
|
+
expect(conflicts).toHaveLength(2);
|
|
193
|
+
expect(conflicts[0].localContent).toBe("Local A");
|
|
194
|
+
expect(conflicts[1].localContent).toBe("Local B");
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
describe("ConflictReporter.createReport", () => {
|
|
198
|
+
it("複数ファイルのコンフリクトをレポートにまとめる", () => {
|
|
199
|
+
// Given: 複数ファイルにコンフリクトが存在
|
|
200
|
+
const conflicts = new Map();
|
|
201
|
+
conflicts.set("file1.md", [
|
|
202
|
+
{ line: 10, localContent: "local1", templateContent: "template1" },
|
|
203
|
+
{ line: 20, localContent: "local2", templateContent: "template2" },
|
|
204
|
+
]);
|
|
205
|
+
conflicts.set("file2.md", [
|
|
206
|
+
{ line: 5, localContent: "local3", templateContent: "template3" },
|
|
207
|
+
]);
|
|
208
|
+
// When: レポートを作成
|
|
209
|
+
const report = conflictReporter.createReport(conflicts);
|
|
210
|
+
// Then: 総コンフリクト数が正しい
|
|
211
|
+
expect(report.totalConflicts).toBe(3);
|
|
212
|
+
expect(report.hasConflicts).toBe(true);
|
|
213
|
+
expect(report.files).toHaveLength(2);
|
|
214
|
+
// Then: ファイル情報が含まれる
|
|
215
|
+
expect(report.files[0].path).toBe("file1.md");
|
|
216
|
+
expect(report.files[0].conflicts).toHaveLength(2);
|
|
217
|
+
expect(report.files[1].path).toBe("file2.md");
|
|
218
|
+
expect(report.files[1].conflicts).toHaveLength(1);
|
|
219
|
+
});
|
|
220
|
+
it("コンフリクトがない場合、hasConflictsがfalse", () => {
|
|
221
|
+
// Given: コンフリクトなし
|
|
222
|
+
const conflicts = new Map();
|
|
223
|
+
// When: レポートを作成
|
|
224
|
+
const report = conflictReporter.createReport(conflicts);
|
|
225
|
+
// Then: hasConflictsがfalse
|
|
226
|
+
expect(report.hasConflicts).toBe(false);
|
|
227
|
+
expect(report.totalConflicts).toBe(0);
|
|
228
|
+
expect(report.files).toHaveLength(0);
|
|
229
|
+
});
|
|
230
|
+
it("formatReportが人間が読みやすい形式で出力する", () => {
|
|
231
|
+
// Given: コンフリクトレポート
|
|
232
|
+
const conflicts = new Map();
|
|
233
|
+
conflicts.set(".claude/agents/einja/test.md", [
|
|
234
|
+
{ line: 15, localContent: "local", templateContent: "template" },
|
|
235
|
+
]);
|
|
236
|
+
const report = conflictReporter.createReport(conflicts);
|
|
237
|
+
// When: フォーマット
|
|
238
|
+
const formatted = conflictReporter.formatReport(report);
|
|
239
|
+
// Then: 適切にフォーマットされる
|
|
240
|
+
expect(formatted).toContain("⚠️ 1件のコンフリクトが検出されました");
|
|
241
|
+
expect(formatted).toContain("📄 .claude/agents/einja/test.md (1箇所)");
|
|
242
|
+
expect(formatted).toContain("- 行15");
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
describe("AC5.3: ドライラン時のコンフリクト表示(統合)", () => {
|
|
246
|
+
it("DiffEngine + ConflictReporterでコンフリクト検出とレポート生成が連携する", () => {
|
|
247
|
+
// Given: コンフリクトが発生する状況
|
|
248
|
+
const base = "Line 1\nLine 2\nLine 3";
|
|
249
|
+
const local = "Line 1\nLocal Line 2\nLine 3";
|
|
250
|
+
const template = "Line 1\nTemplate Line 2\nLine 3";
|
|
251
|
+
// When: DiffEngineでマージを試行
|
|
252
|
+
const mergeResult = diffEngine.merge3Way(base, local, template);
|
|
253
|
+
// Then: マージが失敗し、コンフリクト情報が含まれる
|
|
254
|
+
expect(mergeResult.success).toBe(false);
|
|
255
|
+
expect(mergeResult.conflicts).toHaveLength(1);
|
|
256
|
+
// When: ConflictReporterでレポート作成
|
|
257
|
+
const conflicts = new Map();
|
|
258
|
+
conflicts.set("test.md", mergeResult.conflicts);
|
|
259
|
+
const report = conflictReporter.createReport(conflicts);
|
|
260
|
+
// Then: レポートにコンフリクト情報が含まれる
|
|
261
|
+
expect(report.hasConflicts).toBe(true);
|
|
262
|
+
expect(report.totalConflicts).toBe(1);
|
|
263
|
+
expect(report.files[0].path).toBe("test.md");
|
|
264
|
+
// Then: フォーマット済みレポートに行番号とファイルパスが含まれる
|
|
265
|
+
const formattedReport = conflictReporter.formatReport(report);
|
|
266
|
+
expect(formattedReport).toContain("test.md");
|
|
267
|
+
expect(formattedReport).toContain("行");
|
|
268
|
+
});
|
|
269
|
+
it("複数ファイルのコンフリクトをまとめてレポート生成できる", () => {
|
|
270
|
+
// Given: 複数ファイルでコンフリクトが発生
|
|
271
|
+
const base = "Content";
|
|
272
|
+
const local1 = "Local Content 1";
|
|
273
|
+
const template1 = "Template Content 1";
|
|
274
|
+
const local2 = "Local Content 2";
|
|
275
|
+
const template2 = "Template Content 2";
|
|
276
|
+
// When: 各ファイルでマージを試行
|
|
277
|
+
const result1 = diffEngine.merge3Way(base, local1, template1);
|
|
278
|
+
const result2 = diffEngine.merge3Way(base, local2, template2);
|
|
279
|
+
// When: ConflictReporterでレポート作成
|
|
280
|
+
const conflicts = new Map();
|
|
281
|
+
conflicts.set("file1.md", result1.conflicts);
|
|
282
|
+
conflicts.set("file2.md", result2.conflicts);
|
|
283
|
+
const report = conflictReporter.createReport(conflicts);
|
|
284
|
+
// Then: 両ファイルのコンフリクトが含まれる
|
|
285
|
+
expect(report.totalConflicts).toBe(2);
|
|
286
|
+
expect(report.files).toHaveLength(2);
|
|
287
|
+
// Then: フォーマット済みレポートに両ファイルの情報が含まれる
|
|
288
|
+
const formattedReport = conflictReporter.formatReport(report);
|
|
289
|
+
expect(formattedReport).toContain("file1.md");
|
|
290
|
+
expect(formattedReport).toContain("file2.md");
|
|
291
|
+
expect(formattedReport).toContain("2件のコンフリクトが検出されました");
|
|
292
|
+
});
|
|
293
|
+
it("コンフリクトがない場合、成功メッセージが返る", () => {
|
|
294
|
+
// Given: コンフリクトが発生しない状況(異なる行を変更)
|
|
295
|
+
const base = "Line 1\nLine 2\nLine 3\nLine 4";
|
|
296
|
+
const local = "Line 1 - Local\nLine 2\nLine 3\nLine 4"; // Line 1を変更
|
|
297
|
+
const template = "Line 1\nLine 2\nLine 3\nLine 4 - Template"; // Line 4を変更
|
|
298
|
+
// When: マージを試行
|
|
299
|
+
const mergeResult = diffEngine.merge3Way(base, local, template);
|
|
300
|
+
// Then: マージが成功(異なる行を変更しているのでコンフリクトなし)
|
|
301
|
+
expect(mergeResult.success).toBe(true);
|
|
302
|
+
expect(mergeResult.conflicts).toHaveLength(0);
|
|
303
|
+
expect(mergeResult.content).toContain("Line 1 - Local");
|
|
304
|
+
expect(mergeResult.content).toContain("Line 4 - Template");
|
|
305
|
+
// When: ConflictReporterでレポート作成
|
|
306
|
+
const conflicts = new Map();
|
|
307
|
+
const report = conflictReporter.createReport(conflicts);
|
|
308
|
+
// Then: コンフリクトなしのレポート
|
|
309
|
+
expect(report.hasConflicts).toBe(false);
|
|
310
|
+
expect(report.totalConflicts).toBe(0);
|
|
311
|
+
// Then: フォーマット済みレポートでコンフリクトなしメッセージ
|
|
312
|
+
const formattedReport = conflictReporter.formatReport(report);
|
|
313
|
+
expect(formattedReport).toBe("コンフリクトは検出されませんでした。");
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
//# sourceMappingURL=integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../../src/lib/sync/integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { MarkerSection, MarkerValidationResult } from "../../types/sync.js";
|
|
2
|
+
/**
|
|
3
|
+
* @einja:managedマーカーの処理を行うクラス
|
|
4
|
+
* マーカーをパースしてセクションを分離し、検証・置換処理を提供します。
|
|
5
|
+
*/
|
|
6
|
+
export declare class MarkerProcessor {
|
|
7
|
+
/**
|
|
8
|
+
* Markdownファイル用のマーカーパターン
|
|
9
|
+
*/
|
|
10
|
+
private static readonly MARKDOWN_START_PATTERN;
|
|
11
|
+
private static readonly MARKDOWN_END_PATTERN;
|
|
12
|
+
/**
|
|
13
|
+
* YAML/JSONファイル用のマーカーパターン
|
|
14
|
+
*/
|
|
15
|
+
private static readonly YAML_START_PATTERN;
|
|
16
|
+
private static readonly YAML_END_PATTERN;
|
|
17
|
+
/**
|
|
18
|
+
* ファイル内容をパースしてマーカーセクションに分離する
|
|
19
|
+
*
|
|
20
|
+
* @param content - ファイル内容
|
|
21
|
+
* @returns セクション配列(managedとunmanagedが交互に配置される)
|
|
22
|
+
*/
|
|
23
|
+
parseMarkers(content: string): MarkerSection[];
|
|
24
|
+
/**
|
|
25
|
+
* マーカーペアの検証を行う
|
|
26
|
+
*
|
|
27
|
+
* @param content - ファイル内容
|
|
28
|
+
* @returns 検証結果
|
|
29
|
+
*/
|
|
30
|
+
validateMarkers(content: string): MarkerValidationResult;
|
|
31
|
+
/**
|
|
32
|
+
* マーカー内セクションをテンプレート版で置換する
|
|
33
|
+
*
|
|
34
|
+
* @param localSections - ローカル版のセクション配列
|
|
35
|
+
* @param templateContent - テンプレート版の内容
|
|
36
|
+
* @returns 置換後の内容
|
|
37
|
+
*/
|
|
38
|
+
replaceManaged(localSections: MarkerSection[], templateContent: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* 行がマーカー開始かどうかを判定する
|
|
41
|
+
*
|
|
42
|
+
* @param line - 行内容
|
|
43
|
+
* @returns マーカー開始の場合true
|
|
44
|
+
*/
|
|
45
|
+
private isStartMarker;
|
|
46
|
+
/**
|
|
47
|
+
* 行がマーカー終了かどうかを判定する
|
|
48
|
+
*
|
|
49
|
+
* @param line - 行内容
|
|
50
|
+
* @returns マーカー終了の場合true
|
|
51
|
+
*/
|
|
52
|
+
private isEndMarker;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=marker-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker-processor.d.ts","sourceRoot":"","sources":["../../../src/lib/sync/marker-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGX,aAAa,EACb,sBAAsB,EACtB,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,qBAAa,eAAe;IAC3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CACP;IACvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CACP;IAErC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAsC;IAChF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAoC;IAE5E;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE;IA+E9C;;;;;OAKG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB;IAqDxD;;;;;;OAMG;IACH,cAAc,CACb,aAAa,EAAE,aAAa,EAAE,EAC9B,eAAe,EAAE,MAAM,GACrB,MAAM;IAqCT;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAOrB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;CAMnB"}
|