@fern-api/replay 0.6.0 → 0.6.2
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/cli.cjs +16642 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/index.cjs +2014 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +463 -0
- package/dist/index.d.ts +463 -12
- package/dist/index.js +1968 -10
- package/dist/index.js.map +1 -1
- package/package.json +16 -6
- package/dist/FernignoreMigrator.d.ts +0 -38
- package/dist/FernignoreMigrator.d.ts.map +0 -1
- package/dist/FernignoreMigrator.js +0 -210
- package/dist/FernignoreMigrator.js.map +0 -1
- package/dist/LockfileManager.d.ts +0 -31
- package/dist/LockfileManager.d.ts.map +0 -1
- package/dist/LockfileManager.js +0 -124
- package/dist/LockfileManager.js.map +0 -1
- package/dist/ReplayApplicator.d.ts +0 -30
- package/dist/ReplayApplicator.d.ts.map +0 -1
- package/dist/ReplayApplicator.js +0 -544
- package/dist/ReplayApplicator.js.map +0 -1
- package/dist/ReplayCommitter.d.ts +0 -19
- package/dist/ReplayCommitter.d.ts.map +0 -1
- package/dist/ReplayCommitter.js +0 -64
- package/dist/ReplayCommitter.js.map +0 -1
- package/dist/ReplayDetector.d.ts +0 -22
- package/dist/ReplayDetector.d.ts.map +0 -1
- package/dist/ReplayDetector.js +0 -147
- package/dist/ReplayDetector.js.map +0 -1
- package/dist/ReplayService.d.ts +0 -100
- package/dist/ReplayService.d.ts.map +0 -1
- package/dist/ReplayService.js +0 -596
- package/dist/ReplayService.js.map +0 -1
- package/dist/ThreeWayMerge.d.ts +0 -11
- package/dist/ThreeWayMerge.d.ts.map +0 -1
- package/dist/ThreeWayMerge.js +0 -48
- package/dist/ThreeWayMerge.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -462
- package/dist/cli.js.map +0 -1
- package/dist/commands/bootstrap.d.ts +0 -46
- package/dist/commands/bootstrap.d.ts.map +0 -1
- package/dist/commands/bootstrap.js +0 -237
- package/dist/commands/bootstrap.js.map +0 -1
- package/dist/commands/forget.d.ts +0 -16
- package/dist/commands/forget.d.ts.map +0 -1
- package/dist/commands/forget.js +0 -27
- package/dist/commands/forget.js.map +0 -1
- package/dist/commands/index.d.ts +0 -6
- package/dist/commands/index.d.ts.map +0 -1
- package/dist/commands/index.js +0 -6
- package/dist/commands/index.js.map +0 -1
- package/dist/commands/reset.d.ts +0 -16
- package/dist/commands/reset.d.ts.map +0 -1
- package/dist/commands/reset.js +0 -25
- package/dist/commands/reset.js.map +0 -1
- package/dist/commands/resolve.d.ts +0 -16
- package/dist/commands/resolve.d.ts.map +0 -1
- package/dist/commands/resolve.js +0 -28
- package/dist/commands/resolve.js.map +0 -1
- package/dist/commands/status.d.ts +0 -26
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -24
- package/dist/commands/status.js.map +0 -1
- package/dist/git/CommitDetection.d.ts +0 -7
- package/dist/git/CommitDetection.d.ts.map +0 -1
- package/dist/git/CommitDetection.js +0 -26
- package/dist/git/CommitDetection.js.map +0 -1
- package/dist/git/GitClient.d.ts +0 -22
- package/dist/git/GitClient.d.ts.map +0 -1
- package/dist/git/GitClient.js +0 -109
- package/dist/git/GitClient.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/types.d.ts +0 -80
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ReplayCommitter.js","sourceRoot":"","sources":["../src/ReplayCommitter.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,eAAe;IAChB,GAAG,CAAY;IACf,SAAS,CAAS;IAE1B,YAAY,GAAc,EAAE,SAAiB;QACzC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAe,EAAE,OAAuB;QAC3D,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEtB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,CAAC;QAED,IAAI,WAAW,GAAG,oBAAoB,OAAO,uBAAuB,CAAC;QAErE,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;YACtB,WAAW,IAAI,kBAAkB,OAAO,CAAC,UAAU,EAAE,CAAC;QAC1D,CAAC;QAED,IAAI,OAAO,EAAE,iBAAiB,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClF,WAAW,IAAI,eAAe,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACtE,WAAW,IAAI,SAAS,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/C,CAAC;QACL,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,OAAuB;QAC1D,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEtB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,CAAC;QAED,IAAI,WAAW,GAAG,yBAAyB,UAAU,mBAAmB,CAAC;QAEzE,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,WAAW,IAAI,uBAAuB,CAAC;YACvC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC1B,WAAW,IAAI,SAAS,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAClE,CAAC;QACL,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,OAAuB;QAChD,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAEnD,OAAO;YACH,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,WAAW,EAAE,OAAO,EAAE,UAAU,IAAI,SAAS;YAC7C,kBAAkB,EAAE,OAAO,EAAE,iBAAiB,IAAI,EAAE;YACpD,gBAAgB,EAAE,OAAO,EAAE,cAAc;SAC5C,CAAC;IACN,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,gBAAgB;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;QACxE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB;QAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;CACJ"}
|
package/dist/ReplayDetector.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { GitClient } from "./git/GitClient.js";
|
|
2
|
-
import type { LockfileManager } from "./LockfileManager.js";
|
|
3
|
-
import type { StoredPatch } from "./types.js";
|
|
4
|
-
export declare class ReplayDetector {
|
|
5
|
-
private git;
|
|
6
|
-
private lockManager;
|
|
7
|
-
private sdkOutputDir;
|
|
8
|
-
readonly warnings: string[];
|
|
9
|
-
constructor(git: GitClient, lockManager: LockfileManager, sdkOutputDir: string);
|
|
10
|
-
detectNewPatches(): Promise<StoredPatch[]>;
|
|
11
|
-
/**
|
|
12
|
-
* Compute content hash for deduplication.
|
|
13
|
-
* Removes commit SHA line and index lines before hashing,
|
|
14
|
-
* so rebased commits with same content produce the same hash.
|
|
15
|
-
*/
|
|
16
|
-
computeContentHash(patchContent: string): string;
|
|
17
|
-
/** Detect patches via tree diff for non-linear history. Returns a composite patch. */
|
|
18
|
-
private detectPatchesViaTreeDiff;
|
|
19
|
-
private parseGitLog;
|
|
20
|
-
private getLastGeneration;
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=ReplayDetector.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ReplayDetector.d.ts","sourceRoot":"","sources":["../src/ReplayDetector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAgD,WAAW,EAAE,MAAM,YAAY,CAAC;AAM5F,qBAAa,cAAc;IACvB,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,YAAY,CAAS;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAM;gBAErB,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM;IAMxE,gBAAgB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAuFhD;;;;OAIG;IACH,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAShD,sFAAsF;YACxE,wBAAwB;IAyCtC,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,iBAAiB;CAG5B"}
|
package/dist/ReplayDetector.js
DELETED
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
import { isGenerationCommit } from "./git/CommitDetection.js";
|
|
3
|
-
// Infrastructure files managed by the generation pipeline, not user code.
|
|
4
|
-
// Changes to these should never be captured as customization patches.
|
|
5
|
-
const INFRASTRUCTURE_FILES = new Set([".fernignore"]);
|
|
6
|
-
export class ReplayDetector {
|
|
7
|
-
git;
|
|
8
|
-
lockManager;
|
|
9
|
-
sdkOutputDir;
|
|
10
|
-
warnings = [];
|
|
11
|
-
constructor(git, lockManager, sdkOutputDir) {
|
|
12
|
-
this.git = git;
|
|
13
|
-
this.lockManager = lockManager;
|
|
14
|
-
this.sdkOutputDir = sdkOutputDir;
|
|
15
|
-
}
|
|
16
|
-
async detectNewPatches() {
|
|
17
|
-
const lock = this.lockManager.read();
|
|
18
|
-
const lastGen = this.getLastGeneration(lock);
|
|
19
|
-
if (!lastGen) {
|
|
20
|
-
return [];
|
|
21
|
-
}
|
|
22
|
-
const exists = await this.git.commitExists(lastGen.commit_sha);
|
|
23
|
-
if (!exists) {
|
|
24
|
-
this.warnings.push(`Generation commit ${lastGen.commit_sha.slice(0, 7)} not found in git history. ` +
|
|
25
|
-
`Skipping new patch detection. Existing lockfile patches will still be applied.`);
|
|
26
|
-
return [];
|
|
27
|
-
}
|
|
28
|
-
// Non-linear history (e.g. squash merge): fall back to tree-diff detection.
|
|
29
|
-
const isAncestor = await this.git.isAncestor(lastGen.commit_sha, "HEAD");
|
|
30
|
-
if (!isAncestor) {
|
|
31
|
-
return this.detectPatchesViaTreeDiff(lastGen);
|
|
32
|
-
}
|
|
33
|
-
const log = await this.git.exec([
|
|
34
|
-
"log",
|
|
35
|
-
"--format=%H%x00%an%x00%ae%x00%s",
|
|
36
|
-
`${lastGen.commit_sha}..HEAD`,
|
|
37
|
-
"--",
|
|
38
|
-
this.sdkOutputDir
|
|
39
|
-
]);
|
|
40
|
-
if (!log.trim()) {
|
|
41
|
-
return [];
|
|
42
|
-
}
|
|
43
|
-
const commits = this.parseGitLog(log);
|
|
44
|
-
const newPatches = [];
|
|
45
|
-
for (const commit of commits) {
|
|
46
|
-
if (isGenerationCommit(commit)) {
|
|
47
|
-
continue;
|
|
48
|
-
}
|
|
49
|
-
const parents = await this.git.getCommitParents(commit.sha);
|
|
50
|
-
if (parents.length > 1) {
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
if (lock.patches.find((p) => p.original_commit === commit.sha)) {
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
const patchContent = await this.git.formatPatch(commit.sha);
|
|
57
|
-
const contentHash = this.computeContentHash(patchContent);
|
|
58
|
-
if (lock.patches.find((p) => p.content_hash === contentHash)) {
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
const filesOutput = await this.git.exec(["diff-tree", "--no-commit-id", "--name-only", "-r", commit.sha]);
|
|
62
|
-
const files = filesOutput
|
|
63
|
-
.trim()
|
|
64
|
-
.split("\n")
|
|
65
|
-
.filter(Boolean)
|
|
66
|
-
.filter((f) => !INFRASTRUCTURE_FILES.has(f));
|
|
67
|
-
// Skip patches that only touch infrastructure files
|
|
68
|
-
if (files.length === 0) {
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
newPatches.push({
|
|
72
|
-
id: `patch-${commit.sha.slice(0, 8)}`,
|
|
73
|
-
content_hash: contentHash,
|
|
74
|
-
original_commit: commit.sha,
|
|
75
|
-
original_message: commit.message,
|
|
76
|
-
original_author: `${commit.authorName} <${commit.authorEmail}>`,
|
|
77
|
-
base_generation: lastGen.commit_sha,
|
|
78
|
-
files,
|
|
79
|
-
patch_content: patchContent
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
// Reverse so patches apply in chronological order (oldest first)
|
|
83
|
-
return newPatches.reverse();
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Compute content hash for deduplication.
|
|
87
|
-
* Removes commit SHA line and index lines before hashing,
|
|
88
|
-
* so rebased commits with same content produce the same hash.
|
|
89
|
-
*/
|
|
90
|
-
computeContentHash(patchContent) {
|
|
91
|
-
const normalized = patchContent
|
|
92
|
-
.split("\n")
|
|
93
|
-
.filter((line) => !line.startsWith("From ") && !line.startsWith("index ") && !line.startsWith("Date: "))
|
|
94
|
-
.join("\n");
|
|
95
|
-
return `sha256:${createHash("sha256").update(normalized).digest("hex")}`;
|
|
96
|
-
}
|
|
97
|
-
/** Detect patches via tree diff for non-linear history. Returns a composite patch. */
|
|
98
|
-
async detectPatchesViaTreeDiff(lastGen) {
|
|
99
|
-
// Get changed files first, then filter before computing the diff
|
|
100
|
-
const filesOutput = await this.git.exec(["diff", "--name-only", lastGen.commit_sha, "HEAD"]);
|
|
101
|
-
const files = filesOutput
|
|
102
|
-
.trim()
|
|
103
|
-
.split("\n")
|
|
104
|
-
.filter(Boolean)
|
|
105
|
-
.filter((f) => !INFRASTRUCTURE_FILES.has(f))
|
|
106
|
-
.filter((f) => !f.startsWith(".fern/"));
|
|
107
|
-
if (files.length === 0)
|
|
108
|
-
return [];
|
|
109
|
-
// Compute diff only for the filtered files
|
|
110
|
-
const diff = await this.git.exec(["diff", lastGen.commit_sha, "HEAD", "--", ...files]);
|
|
111
|
-
if (!diff.trim())
|
|
112
|
-
return [];
|
|
113
|
-
const contentHash = this.computeContentHash(diff);
|
|
114
|
-
// Dedup against existing patches — if an existing patch already captures
|
|
115
|
-
// this exact content, don't create a duplicate composite patch.
|
|
116
|
-
const lock = this.lockManager.read();
|
|
117
|
-
if (lock.patches.some((p) => p.content_hash === contentHash)) {
|
|
118
|
-
return [];
|
|
119
|
-
}
|
|
120
|
-
const headSha = (await this.git.exec(["rev-parse", "HEAD"])).trim();
|
|
121
|
-
return [
|
|
122
|
-
{
|
|
123
|
-
id: `patch-composite-${headSha.slice(0, 8)}`,
|
|
124
|
-
content_hash: contentHash,
|
|
125
|
-
original_commit: headSha,
|
|
126
|
-
original_message: "Customer customizations (composite)",
|
|
127
|
-
original_author: "composite",
|
|
128
|
-
base_generation: lastGen.commit_sha,
|
|
129
|
-
files,
|
|
130
|
-
patch_content: diff
|
|
131
|
-
}
|
|
132
|
-
];
|
|
133
|
-
}
|
|
134
|
-
parseGitLog(log) {
|
|
135
|
-
return log
|
|
136
|
-
.trim()
|
|
137
|
-
.split("\n")
|
|
138
|
-
.map((line) => {
|
|
139
|
-
const [sha, authorName, authorEmail, message] = line.split("\0");
|
|
140
|
-
return { sha, authorName, authorEmail, message };
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
getLastGeneration(lock) {
|
|
144
|
-
return lock.generations.find((g) => g.commit_sha === lock.current_generation);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
//# sourceMappingURL=ReplayDetector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ReplayDetector.js","sourceRoot":"","sources":["../src/ReplayDetector.ts"],"names":[],"mappings":"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"}
|
package/dist/ReplayService.d.ts
DELETED
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import type { FileResult, ReplayConfig, StoredPatch } from "./types.js";
|
|
2
|
-
export interface ConflictDetail {
|
|
3
|
-
patchId: string;
|
|
4
|
-
patchMessage: string;
|
|
5
|
-
reason?: string;
|
|
6
|
-
files: FileResult[];
|
|
7
|
-
/** Files that applied cleanly in a patch that also had conflicts. */
|
|
8
|
-
cleanFiles?: string[];
|
|
9
|
-
}
|
|
10
|
-
export interface ReplayReport {
|
|
11
|
-
flow: "first-generation" | "no-patches" | "normal-regeneration" | "skip-application";
|
|
12
|
-
patchesDetected: number;
|
|
13
|
-
patchesApplied: number;
|
|
14
|
-
patchesWithConflicts: number;
|
|
15
|
-
patchesSkipped: number;
|
|
16
|
-
patchesAbsorbed?: number;
|
|
17
|
-
patchesRepointed?: number;
|
|
18
|
-
patchesContentRebased?: number;
|
|
19
|
-
patchesKeptAsUserOwned?: number;
|
|
20
|
-
patchesPartiallyApplied?: number;
|
|
21
|
-
patchesConflictResolved?: number;
|
|
22
|
-
patchesRefreshed?: number;
|
|
23
|
-
conflicts: FileResult[];
|
|
24
|
-
conflictDetails?: ConflictDetail[];
|
|
25
|
-
wouldApply?: StoredPatch[];
|
|
26
|
-
warnings?: string[];
|
|
27
|
-
}
|
|
28
|
-
export interface ReplayOptions {
|
|
29
|
-
/** Log what would happen but don't modify anything */
|
|
30
|
-
dryRun?: boolean;
|
|
31
|
-
/** Write files and stage changes, but don't commit */
|
|
32
|
-
stageOnly?: boolean;
|
|
33
|
-
/** CLI version for commit metadata */
|
|
34
|
-
cliVersion?: string;
|
|
35
|
-
/** Generator versions for commit metadata */
|
|
36
|
-
generatorVersions?: Record<string, string>;
|
|
37
|
-
/** Commit generation + update lockfile, skip detection/application */
|
|
38
|
-
skipApplication?: boolean;
|
|
39
|
-
/** SHA of the base branch HEAD before replay runs. Stored in lockfile for squash merge recovery. */
|
|
40
|
-
baseBranchHead?: string;
|
|
41
|
-
}
|
|
42
|
-
export declare class ReplayService {
|
|
43
|
-
private git;
|
|
44
|
-
private detector;
|
|
45
|
-
private applicator;
|
|
46
|
-
private committer;
|
|
47
|
-
private lockManager;
|
|
48
|
-
private outputDir;
|
|
49
|
-
constructor(outputDir: string, _config: ReplayConfig);
|
|
50
|
-
runReplay(options?: ReplayOptions): Promise<ReplayReport>;
|
|
51
|
-
/**
|
|
52
|
-
* Sync the lockfile after a divergent PR was squash-merged.
|
|
53
|
-
* Call this BEFORE runReplay() when the CLI detects a merged divergent PR.
|
|
54
|
-
*
|
|
55
|
-
* After updating the generation record, re-detects customer patches via
|
|
56
|
-
* tree diff between the generation tag (pure generation tree) and HEAD
|
|
57
|
-
* (which includes customer customizations after squash merge). This ensures
|
|
58
|
-
* patches survive the squash merge → regenerate cycle even when the lockfile
|
|
59
|
-
* was restored from the base branch during conflict PR creation.
|
|
60
|
-
*/
|
|
61
|
-
syncFromDivergentMerge(generationCommitSha: string, options?: {
|
|
62
|
-
cliVersion?: string;
|
|
63
|
-
generatorVersions?: Record<string, string>;
|
|
64
|
-
baseBranchHead?: string;
|
|
65
|
-
}): Promise<void>;
|
|
66
|
-
private determineFlow;
|
|
67
|
-
private handleFirstGeneration;
|
|
68
|
-
/**
|
|
69
|
-
* Skip-application mode: commit the generation and update the lockfile
|
|
70
|
-
* but don't detect or apply patches. Sets a marker so the next normal
|
|
71
|
-
* run skips revert detection in preGenerationRebase().
|
|
72
|
-
*/
|
|
73
|
-
private handleSkipApplication;
|
|
74
|
-
private handleNoPatchesRegeneration;
|
|
75
|
-
private handleNormalRegeneration;
|
|
76
|
-
/**
|
|
77
|
-
* Rebase cleanly applied patches so they are relative to the current generation.
|
|
78
|
-
* This prevents recurring conflicts on subsequent regenerations.
|
|
79
|
-
* Returns the number of patches rebased.
|
|
80
|
-
*/
|
|
81
|
-
private rebasePatches;
|
|
82
|
-
/**
|
|
83
|
-
* For conflict patches with mixed results (some files merged, some conflicted),
|
|
84
|
-
* check if the cleanly merged files were absorbed by the generator (empty diff).
|
|
85
|
-
* If so, remove them from patch.files so they don't pollute the pre-generation
|
|
86
|
-
* rebase conflict marker check (`git grep <<<<<<< -- ...patch.files`).
|
|
87
|
-
*
|
|
88
|
-
* Non-absorbed clean files stay in patch.files — removing them would lose
|
|
89
|
-
* the customization on the next generation.
|
|
90
|
-
*/
|
|
91
|
-
private trimAbsorbedFiles;
|
|
92
|
-
/**
|
|
93
|
-
* Pre-generation rebase: update patches using the customer's current state.
|
|
94
|
-
* Called BEFORE commitGeneration() while HEAD has customer code.
|
|
95
|
-
*/
|
|
96
|
-
private preGenerationRebase;
|
|
97
|
-
private readFernignorePatterns;
|
|
98
|
-
private buildReport;
|
|
99
|
-
}
|
|
100
|
-
//# sourceMappingURL=ReplayService.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ReplayService.d.ts","sourceRoot":"","sources":["../src/ReplayService.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAoB,YAAY,EAAgB,WAAW,EAAE,MAAM,YAAY,CAAC;AAExG,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,kBAAkB,GAAG,YAAY,GAAG,qBAAqB,GAAG,kBAAkB,CAAC;IACrF,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC1B,sDAAsD;IACtD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,sEAAsE;IACtE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oGAAoG;IACpG,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,aAAa;IACtB,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY;IAU9C,SAAS,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAiB/D;;;;;;;;;OASG;IACG,sBAAsB,CACxB,mBAAmB,EAAE,MAAM,EAC3B,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GACvG,OAAO,CAAC,IAAI,CAAC;IAuChB,OAAO,CAAC,aAAa;YAaP,qBAAqB;IAkCnC;;;;OAIG;YACW,qBAAqB;YAyCrB,2BAA2B;YA+D3B,wBAAwB;IAsFtC;;;;OAIG;YACW,aAAa;IA0H3B;;;;;;;;OAQG;YACW,iBAAiB;IA4C/B;;;OAGG;YACW,mBAAmB;IAyGjC,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,WAAW;CAwDtB"}
|