intentpatch 0.6.0 → 0.8.0
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.ko.md +44 -22
- package/README.md +45 -18
- package/dist/application/ports/property-type-compatibility.d.ts +5 -0
- package/dist/application/ports/property-type-compatibility.d.ts.map +1 -0
- package/dist/application/ports/property-type-compatibility.js +2 -0
- package/dist/application/ports/property-type-compatibility.js.map +1 -0
- package/dist/application/ports/yarn-lock-parser.d.ts +19 -0
- package/dist/application/ports/yarn-lock-parser.d.ts.map +1 -0
- package/dist/application/ports/yarn-lock-parser.js +2 -0
- package/dist/application/ports/yarn-lock-parser.js.map +1 -0
- package/dist/application/rules/missing-test-change-rule.d.ts.map +1 -1
- package/dist/application/rules/missing-test-change-rule.js +17 -12
- package/dist/application/rules/missing-test-change-rule.js.map +1 -1
- package/dist/application/rules/public-api-compatibility-rule.d.ts +3 -1
- package/dist/application/rules/public-api-compatibility-rule.d.ts.map +1 -1
- package/dist/application/rules/public-api-compatibility-rule.js +16 -11
- package/dist/application/rules/public-api-compatibility-rule.js.map +1 -1
- package/dist/application/rules/yarn-lockfile-rule.d.ts +12 -0
- package/dist/application/rules/yarn-lockfile-rule.d.ts.map +1 -0
- package/dist/application/rules/yarn-lockfile-rule.js +106 -0
- package/dist/application/rules/yarn-lockfile-rule.js.map +1 -0
- package/dist/application/services/analyze-test-changes.d.ts.map +1 -1
- package/dist/application/services/analyze-test-changes.js +3 -1
- package/dist/application/services/analyze-test-changes.js.map +1 -1
- package/dist/application/use-cases/analyze-agent-turn.d.ts +20 -0
- package/dist/application/use-cases/analyze-agent-turn.d.ts.map +1 -0
- package/dist/application/use-cases/analyze-agent-turn.js +28 -0
- package/dist/application/use-cases/analyze-agent-turn.js.map +1 -0
- package/dist/domain/change-contract.d.ts +3 -0
- package/dist/domain/change-contract.d.ts.map +1 -1
- package/dist/domain/change-contract.js +19 -0
- package/dist/domain/change-contract.js.map +1 -1
- package/dist/infrastructure/config/json-change-contract-loader.js +13 -1
- package/dist/infrastructure/config/json-change-contract-loader.js.map +1 -1
- package/dist/infrastructure/git/git-file-snapshot-source.js +1 -1
- package/dist/infrastructure/git/git-file-snapshot-source.js.map +1 -1
- package/dist/infrastructure/git/git-private-agent-intent-store.js +7 -7
- package/dist/infrastructure/git/git-private-agent-intent-store.js.map +1 -1
- package/dist/infrastructure/git/git-private-agent-report-writer.d.ts +8 -0
- package/dist/infrastructure/git/git-private-agent-report-writer.d.ts.map +1 -0
- package/dist/infrastructure/git/git-private-agent-report-writer.js +45 -0
- package/dist/infrastructure/git/git-private-agent-report-writer.js.map +1 -0
- package/dist/infrastructure/typescript/typescript-function-signature-compatibility.d.ts.map +1 -1
- package/dist/infrastructure/typescript/typescript-function-signature-compatibility.js +47 -3
- package/dist/infrastructure/typescript/typescript-function-signature-compatibility.js.map +1 -1
- package/dist/infrastructure/typescript/typescript-property-type-compatibility.d.ts +6 -0
- package/dist/infrastructure/typescript/typescript-property-type-compatibility.d.ts.map +1 -0
- package/dist/infrastructure/typescript/typescript-property-type-compatibility.js +72 -0
- package/dist/infrastructure/typescript/typescript-property-type-compatibility.js.map +1 -0
- package/dist/infrastructure/yarn/yarn-lock-parser.d.ts +6 -0
- package/dist/infrastructure/yarn/yarn-lock-parser.d.ts.map +1 -0
- package/dist/infrastructure/yarn/yarn-lock-parser.js +77 -0
- package/dist/infrastructure/yarn/yarn-lock-parser.js.map +1 -0
- package/dist/presentation/agent-hook/input.d.ts +3 -0
- package/dist/presentation/agent-hook/input.d.ts.map +1 -0
- package/dist/presentation/agent-hook/input.js +20 -0
- package/dist/presentation/agent-hook/input.js.map +1 -0
- package/dist/presentation/agent-hook/summary.d.ts +4 -0
- package/dist/presentation/agent-hook/summary.d.ts.map +1 -0
- package/dist/presentation/agent-hook/summary.js +8 -0
- package/dist/presentation/agent-hook/summary.js.map +1 -0
- package/dist/presentation/analyze-repository.d.ts.map +1 -1
- package/dist/presentation/analyze-repository.js +5 -1
- package/dist/presentation/analyze-repository.js.map +1 -1
- package/dist/presentation/claude-code/hook.d.ts +2 -7
- package/dist/presentation/claude-code/hook.d.ts.map +1 -1
- package/dist/presentation/claude-code/hook.js +12 -38
- package/dist/presentation/claude-code/hook.js.map +1 -1
- package/dist/presentation/cli/arguments.d.ts +11 -1
- package/dist/presentation/cli/arguments.d.ts.map +1 -1
- package/dist/presentation/cli/arguments.js +17 -0
- package/dist/presentation/cli/arguments.js.map +1 -1
- package/dist/presentation/cli/main.js +25 -0
- package/dist/presentation/cli/main.js.map +1 -1
- package/dist/presentation/cli/text-report.js +3 -0
- package/dist/presentation/cli/text-report.js.map +1 -1
- package/dist/presentation/codex/hook.d.ts +5 -0
- package/dist/presentation/codex/hook.d.ts.map +1 -0
- package/dist/presentation/codex/hook.js +62 -0
- package/dist/presentation/codex/hook.js.map +1 -0
- package/dist/presentation/cursor/hook.d.ts +12 -0
- package/dist/presentation/cursor/hook.d.ts.map +1 -0
- package/dist/presentation/cursor/hook.js +69 -0
- package/dist/presentation/cursor/hook.js.map +1 -0
- package/dist/presentation/html/html-report.d.ts.map +1 -1
- package/dist/presentation/html/html-report.js +84 -14
- package/dist/presentation/html/html-report.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
const lockfilePath = "yarn.lock";
|
|
2
|
+
/** Yarn 4가 고정한 레지스트리 패키지의 추가·제거·단일 버전 교체를 보고한다. */
|
|
3
|
+
export class YarnLockfileRule {
|
|
4
|
+
snapshots;
|
|
5
|
+
parser;
|
|
6
|
+
constructor(snapshots, parser) {
|
|
7
|
+
this.snapshots = snapshots;
|
|
8
|
+
this.parser = parser;
|
|
9
|
+
}
|
|
10
|
+
async analyze(context) {
|
|
11
|
+
if (!context.changes.files.some((file) => file.path === lockfilePath || file.previousPath === lockfilePath))
|
|
12
|
+
return [];
|
|
13
|
+
const snapshot = await this.snapshots.read(context.target, lockfilePath);
|
|
14
|
+
const before = snapshot.before === undefined ? undefined : this.parser.parse(snapshot.before);
|
|
15
|
+
const after = snapshot.after === undefined ? undefined : this.parser.parse(snapshot.after);
|
|
16
|
+
const errors = [
|
|
17
|
+
...(before !== undefined && !before.ok ? [parseFinding("base", before)] : []),
|
|
18
|
+
...(after !== undefined && !after.ok ? [parseFinding("current", after)] : []),
|
|
19
|
+
];
|
|
20
|
+
if (errors.length > 0)
|
|
21
|
+
return errors;
|
|
22
|
+
if (before === undefined && after?.ok)
|
|
23
|
+
return [presenceFinding("added", after.packages.size)];
|
|
24
|
+
if (after === undefined && before?.ok)
|
|
25
|
+
return [presenceFinding("removed", before.packages.size)];
|
|
26
|
+
if (!before?.ok || !after?.ok)
|
|
27
|
+
return [];
|
|
28
|
+
const findings = [];
|
|
29
|
+
const beforeByName = groupByName(before.packages);
|
|
30
|
+
const afterByName = groupByName(after.packages);
|
|
31
|
+
const names = [...new Set([...beforeByName.keys(), ...afterByName.keys()])].sort();
|
|
32
|
+
for (const name of names) {
|
|
33
|
+
const removed = (beforeByName.get(name) ?? []).filter((item) => !after.packages.has(item.id));
|
|
34
|
+
const added = (afterByName.get(name) ?? []).filter((item) => !before.packages.has(item.id));
|
|
35
|
+
if (removed.length === 1 &&
|
|
36
|
+
added.length === 1 &&
|
|
37
|
+
removed[0] !== undefined &&
|
|
38
|
+
added[0] !== undefined) {
|
|
39
|
+
findings.push({
|
|
40
|
+
ruleId: "dependency/locked-version-changed",
|
|
41
|
+
severity: "low",
|
|
42
|
+
title: "Resolved package version changed",
|
|
43
|
+
description: `${name} changed from ${removed[0].version} to ${added[0].version} in yarn.lock.`,
|
|
44
|
+
file: lockfilePath,
|
|
45
|
+
evidence: { ...evidence(added[0]), from: removed[0].version, to: added[0].version },
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
findings.push(...added.map((item) => packageFinding("added", item)), ...removed.map((item) => packageFinding("removed", item)));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return findings;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function groupByName(packages) {
|
|
56
|
+
const grouped = new Map();
|
|
57
|
+
for (const item of packages.values()) {
|
|
58
|
+
const group = grouped.get(item.name) ?? [];
|
|
59
|
+
group.push(item);
|
|
60
|
+
grouped.set(item.name, group);
|
|
61
|
+
}
|
|
62
|
+
return grouped;
|
|
63
|
+
}
|
|
64
|
+
function evidence(item) {
|
|
65
|
+
return {
|
|
66
|
+
package: item.name,
|
|
67
|
+
version: item.version,
|
|
68
|
+
packageId: item.id,
|
|
69
|
+
rootDirect: item.rootDirect,
|
|
70
|
+
packageManager: "yarn",
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function packageFinding(kind, item) {
|
|
74
|
+
return {
|
|
75
|
+
ruleId: `dependency/locked-package-${kind}`,
|
|
76
|
+
severity: "low",
|
|
77
|
+
title: kind === "added" ? "Resolved package added" : "Resolved package removed",
|
|
78
|
+
description: `${item.id} was ${kind} in yarn.lock.`,
|
|
79
|
+
file: lockfilePath,
|
|
80
|
+
evidence: evidence(item),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function parseFinding(side, result) {
|
|
84
|
+
const unsupported = result.kind === "unsupported";
|
|
85
|
+
return {
|
|
86
|
+
ruleId: unsupported
|
|
87
|
+
? "dependency/unsupported-yarn-lockfile"
|
|
88
|
+
: "dependency/invalid-yarn-lockfile",
|
|
89
|
+
severity: unsupported ? "low" : "high",
|
|
90
|
+
title: unsupported ? "Unsupported Yarn lockfile" : "Invalid Yarn lockfile",
|
|
91
|
+
description: `Could not analyze the ${side} yarn.lock: ${result.reason}`,
|
|
92
|
+
file: lockfilePath,
|
|
93
|
+
evidence: { side, reason: result.reason },
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function presenceFinding(kind, packageCount) {
|
|
97
|
+
return {
|
|
98
|
+
ruleId: `dependency/yarn-lockfile-${kind}`,
|
|
99
|
+
severity: "low",
|
|
100
|
+
title: kind === "added" ? "Yarn lockfile added" : "Yarn lockfile removed",
|
|
101
|
+
description: `yarn.lock was ${kind} with ${packageCount} resolved registry packages.`,
|
|
102
|
+
file: lockfilePath,
|
|
103
|
+
evidence: { packageCount },
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=yarn-lockfile-rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yarn-lockfile-rule.js","sourceRoot":"","sources":["../../../src/application/rules/yarn-lockfile-rule.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-test-changes.d.ts","sourceRoot":"","sources":["../../../src/application/services/analyze-test-changes.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAM3E,gDAAgD;AAChD,qBAAa,kBAAmB,YAAW,kBAAkB;IAC9C,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"analyze-test-changes.d.ts","sourceRoot":"","sources":["../../../src/application/services/analyze-test-changes.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAM3E,gDAAgD;AAChD,qBAAa,kBAAmB,YAAW,kBAAkB;IAC9C,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAmC5E"}
|
|
@@ -22,7 +22,9 @@ export class AnalyzeTestChanges {
|
|
|
22
22
|
sourcePath: source.path,
|
|
23
23
|
sourceChangeKind: source.kind,
|
|
24
24
|
matchingTests: testFiles
|
|
25
|
-
.filter((test) =>
|
|
25
|
+
.filter((test) => (Object.hasOwn(policy.related ?? {}, source.path)
|
|
26
|
+
? (policy.related?.[source.path] ?? []).some((path) => matchesPathPattern(test.path, path))
|
|
27
|
+
: testIdentity(test.path) === sourceIdentity(source.path)) &&
|
|
26
28
|
(source.kind === "deleted" || test.changeKind !== "deleted"))
|
|
27
29
|
.map((test) => test.path),
|
|
28
30
|
})),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-test-changes.js","sourceRoot":"","sources":["../../../src/application/services/analyze-test-changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAA2B,MAAM,6BAA6B,CAAC;AAGhG,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAC/C,MAAM,UAAU,GAAG,kDAAkD,CAAC;AAEtE,gDAAgD;AAChD,MAAM,OAAO,kBAAkB;IACtB,KAAK,CAAC,OAAO,CAAC,OAAwB;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC;QACvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,wBAAwB,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK;aACpC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;aACvD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAC9C,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC;YACxC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CACzC,CAAC;QAEF,OAAO,wBAAwB,CAAC;YAC9B,SAAS;YACT,cAAc,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC3C,UAAU,EAAE,MAAM,CAAC,IAAI;gBACvB,gBAAgB,EAAE,MAAM,CAAC,IAAI;gBAC7B,aAAa,EAAE,SAAS;qBACrB,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CACP,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"analyze-test-changes.js","sourceRoot":"","sources":["../../../src/application/services/analyze-test-changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAA2B,MAAM,6BAA6B,CAAC;AAGhG,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAC/C,MAAM,UAAU,GAAG,kDAAkD,CAAC;AAEtE,gDAAgD;AAChD,MAAM,OAAO,kBAAkB;IACtB,KAAK,CAAC,OAAO,CAAC,OAAwB;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC;QACvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,wBAAwB,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK;aACpC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;aACvD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAC9C,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC;YACxC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CACzC,CAAC;QAEF,OAAO,wBAAwB,CAAC;YAC9B,SAAS;YACT,cAAc,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC3C,UAAU,EAAE,MAAM,CAAC,IAAI;gBACvB,gBAAgB,EAAE,MAAM,CAAC,IAAI;gBAC7B,aAAa,EAAE,SAAS;qBACrB,MAAM,CACL,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC;oBAC/C,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAClD,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CACpC;oBACH,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC5D,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAC/D;qBACA,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;aAC5B,CAAC,CAAC;SACJ,CAAC,CAAC;IACL,CAAC;CACF;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,QAA2B;IAC3D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ChangeReport } from "../../domain/report.js";
|
|
2
|
+
import type { AgentIntentSessionStore } from "../ports/agent-intent-session-store.js";
|
|
3
|
+
export interface AgentTurnAnalysisRequest {
|
|
4
|
+
readonly workingDirectory: string;
|
|
5
|
+
readonly baseRef: string;
|
|
6
|
+
readonly intentOverride: string;
|
|
7
|
+
}
|
|
8
|
+
export interface AgentTurnDependencies {
|
|
9
|
+
readonly store: AgentIntentSessionStore;
|
|
10
|
+
readonly analyze: (request: AgentTurnAnalysisRequest) => Promise<ChangeReport>;
|
|
11
|
+
}
|
|
12
|
+
/** 에이전트별 이벤트 형식과 무관하게 요청 보관·Git 비교를 한 흐름으로 묶는다. */
|
|
13
|
+
export declare class AnalyzeAgentTurn {
|
|
14
|
+
private readonly dependencies;
|
|
15
|
+
constructor(dependencies: AgentTurnDependencies);
|
|
16
|
+
capture(key: string, cwd: string, prompt: string): Promise<void>;
|
|
17
|
+
analyze(key: string, cwd: string): Promise<ChangeReport | undefined>;
|
|
18
|
+
clear(key: string, cwd: string): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=analyze-agent-turn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-agent-turn.d.ts","sourceRoot":"","sources":["../../../src/application/use-cases/analyze-agent-turn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAItF,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CAChF;AAED,mDAAmD;AACnD,qBAAa,gBAAgB;IACR,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,qBAAqB;IAE1D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAUpE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG5D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const maximumPromptBytes = 64 * 1024;
|
|
2
|
+
/** 에이전트별 이벤트 형식과 무관하게 요청 보관·Git 비교를 한 흐름으로 묶는다. */
|
|
3
|
+
export class AnalyzeAgentTurn {
|
|
4
|
+
dependencies;
|
|
5
|
+
constructor(dependencies) {
|
|
6
|
+
this.dependencies = dependencies;
|
|
7
|
+
}
|
|
8
|
+
async capture(key, cwd, prompt) {
|
|
9
|
+
if (prompt.trim().length === 0 || Buffer.byteLength(prompt, "utf8") > maximumPromptBytes) {
|
|
10
|
+
throw new Error("Agent hook prompt must be nonempty and at most 64 KiB");
|
|
11
|
+
}
|
|
12
|
+
await this.dependencies.store.capture(key, cwd, prompt);
|
|
13
|
+
}
|
|
14
|
+
async analyze(key, cwd) {
|
|
15
|
+
const captured = await this.dependencies.store.take(key, cwd);
|
|
16
|
+
if (captured === undefined)
|
|
17
|
+
return undefined;
|
|
18
|
+
return this.dependencies.analyze({
|
|
19
|
+
workingDirectory: cwd,
|
|
20
|
+
baseRef: captured.baseRef,
|
|
21
|
+
intentOverride: captured.intent,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
async clear(key, cwd) {
|
|
25
|
+
await this.dependencies.store.clear(key, cwd);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=analyze-agent-turn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-agent-turn.js","sourceRoot":"","sources":["../../../src/application/use-cases/analyze-agent-turn.ts"],"names":[],"mappings":"AAGA,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;AAarC,mDAAmD;AACnD,MAAM,OAAO,gBAAgB;IACS;IAApC,YAAoC,YAAmC;QAAnC,iBAAY,GAAZ,YAAY,CAAuB;IAAG,CAAC;IAEpE,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,GAAW,EAAE,MAAc;QAC3D,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,kBAAkB,EAAE,CAAC;YACzF,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,GAAW;QAC3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9D,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC7C,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;YAC/B,gBAAgB,EAAE,GAAG;YACrB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,cAAc,EAAE,QAAQ,CAAC,MAAM;SAChC,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,GAAW;QACzC,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;CACF"}
|
|
@@ -8,6 +8,8 @@ export interface TestChangePolicy {
|
|
|
8
8
|
readonly requireFor: readonly string[];
|
|
9
9
|
readonly include: readonly string[];
|
|
10
10
|
readonly exclude: readonly string[];
|
|
11
|
+
/** 이전 버전의 공개 정책 객체도 계속 사용할 수 있도록 선택적으로 유지한다. */
|
|
12
|
+
readonly related?: Readonly<Record<string, readonly string[]>>;
|
|
11
13
|
}
|
|
12
14
|
export interface ChangeContract {
|
|
13
15
|
readonly intent?: string;
|
|
@@ -26,6 +28,7 @@ export interface CreateChangeContractInput {
|
|
|
26
28
|
requireFor?: readonly string[];
|
|
27
29
|
include?: readonly string[];
|
|
28
30
|
exclude?: readonly string[];
|
|
31
|
+
related?: Readonly<Record<string, readonly string[]>>;
|
|
29
32
|
}>;
|
|
30
33
|
}
|
|
31
34
|
/** 사용자 기대 범위를 정규화해 규칙마다 설정 해석이 달라지지 않게 한다. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-contract.d.ts","sourceRoot":"","sources":["../../src/domain/change-contract.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"change-contract.d.ts","sourceRoot":"","sources":["../../src/domain/change-contract.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,gDAAgD;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;QACxB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC5B,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;QACxB,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC/B,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;KACvD,CAAC,CAAC;CACJ;AAED,8CAA8C;AAC9C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,cAAc,CAmBrF"}
|
|
@@ -25,6 +25,7 @@ function normalizeTestPolicy(input) {
|
|
|
25
25
|
const requireFor = normalizePatterns(input.requireFor ?? [], "tests.requireFor");
|
|
26
26
|
const include = normalizePatterns(input.include ?? [], "tests.include");
|
|
27
27
|
const exclude = normalizePatterns(input.exclude ?? [], "tests.exclude");
|
|
28
|
+
const related = normalizeRelatedTests(input.related ?? {});
|
|
28
29
|
if (requireFor.length === 0) {
|
|
29
30
|
throw new Error("Change contract tests.requireFor must contain at least one pattern.");
|
|
30
31
|
}
|
|
@@ -35,8 +36,26 @@ function normalizeTestPolicy(input) {
|
|
|
35
36
|
requireFor: Object.freeze(requireFor),
|
|
36
37
|
include: Object.freeze(include),
|
|
37
38
|
exclude: Object.freeze(exclude),
|
|
39
|
+
related: Object.freeze(related),
|
|
38
40
|
});
|
|
39
41
|
}
|
|
42
|
+
function normalizeRelatedTests(values) {
|
|
43
|
+
const related = Object.create(null);
|
|
44
|
+
for (const [source, tests] of Object.entries(values).sort(([left], [right]) => left.localeCompare(right))) {
|
|
45
|
+
const path = normalizePattern(source, "tests.related");
|
|
46
|
+
if (path.includes("*")) {
|
|
47
|
+
throw new Error("Change contract tests.related source paths must be exact paths.");
|
|
48
|
+
}
|
|
49
|
+
if (Object.hasOwn(related, path)) {
|
|
50
|
+
throw new Error(`Change contract tests.related contains a duplicate source path: ${path}`);
|
|
51
|
+
}
|
|
52
|
+
if (!Array.isArray(tests) || tests.length === 0) {
|
|
53
|
+
throw new Error(`Change contract tests.related[${JSON.stringify(source)}] must contain test paths.`);
|
|
54
|
+
}
|
|
55
|
+
related[path] = Object.freeze(normalizePatterns(tests, `tests.related[${source}]`));
|
|
56
|
+
}
|
|
57
|
+
return related;
|
|
58
|
+
}
|
|
40
59
|
function normalizeIntent(value) {
|
|
41
60
|
if (value === undefined) {
|
|
42
61
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-contract.js","sourceRoot":"","sources":["../../src/domain/change-contract.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"change-contract.js","sourceRoot":"","sources":["../../src/domain/change-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { isRecord } from "../../domain/value-guards.js";
|
|
|
5
5
|
const defaultConfigurationFile = ".intentpatch.json";
|
|
6
6
|
const rootFields = new Set(["intent", "scope", "tests"]);
|
|
7
7
|
const scopeFields = new Set(["include", "allow", "maxFiles", "maxLines"]);
|
|
8
|
-
const testFields = new Set(["requireFor", "include", "exclude"]);
|
|
8
|
+
const testFields = new Set(["requireFor", "include", "exclude", "related"]);
|
|
9
9
|
/** JSON 설정을 엄격하게 검증하고 ChangeContract 도메인 모델로 변환한다. */
|
|
10
10
|
export class JsonChangeContractLoader {
|
|
11
11
|
async load(workingDirectory, configurationPath) {
|
|
@@ -85,10 +85,22 @@ function parseConfiguration(content) {
|
|
|
85
85
|
requireFor: optionalStringArray(testsValue.requireFor, "tests.requireFor"),
|
|
86
86
|
include: optionalStringArray(testsValue.include, "tests.include"),
|
|
87
87
|
exclude: optionalStringArray(testsValue.exclude, "tests.exclude"),
|
|
88
|
+
related: optionalRelatedTests(testsValue.related),
|
|
88
89
|
},
|
|
89
90
|
}),
|
|
90
91
|
};
|
|
91
92
|
}
|
|
93
|
+
function optionalRelatedTests(value) {
|
|
94
|
+
if (value === undefined)
|
|
95
|
+
return {};
|
|
96
|
+
if (!isRecord(value))
|
|
97
|
+
throw new Error("tests.related must be a JSON object.");
|
|
98
|
+
const related = Object.create(null);
|
|
99
|
+
for (const [source, paths] of Object.entries(value)) {
|
|
100
|
+
related[source] = optionalStringArray(paths, `tests.related[${source}]`);
|
|
101
|
+
}
|
|
102
|
+
return related;
|
|
103
|
+
}
|
|
92
104
|
function assertKnownFields(value, knownFields, location) {
|
|
93
105
|
const unknownField = Object.keys(value).find((field) => !knownFields.has(field));
|
|
94
106
|
if (unknownField !== undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-change-contract-loader.js","sourceRoot":"","sources":["../../../src/infrastructure/config/json-change-contract-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAGL,oBAAoB,GACrB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,MAAM,wBAAwB,GAAG,mBAAmB,CAAC;AACrD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AACzD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AAC1E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"json-change-contract-loader.js","sourceRoot":"","sources":["../../../src/infrastructure/config/json-change-contract-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -73,7 +73,7 @@ export class GitFileSnapshotSource {
|
|
|
73
73
|
if (!metadata.isFile()) {
|
|
74
74
|
throw new Error(`Expected a regular file: ${path}`);
|
|
75
75
|
}
|
|
76
|
-
const sizeLimit = path === "package-lock.json" || path === "pnpm-lock.yaml"
|
|
76
|
+
const sizeLimit = path === "package-lock.json" || path === "pnpm-lock.yaml" || path === "yarn.lock"
|
|
77
77
|
? maximumLockfileSize
|
|
78
78
|
: maximumTextFileSize;
|
|
79
79
|
if (metadata.size > sizeLimit) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-file-snapshot-source.js","sourceRoot":"","sources":["../../../src/infrastructure/git/git-file-snapshot-source.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"git-file-snapshot-source.js","sourceRoot":"","sources":["../../../src/infrastructure/git/git-file-snapshot-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ export class GitPrivateAgentIntentStore {
|
|
|
17
17
|
cwd: workingDirectory,
|
|
18
18
|
})).trim();
|
|
19
19
|
if (!/^[0-9a-f]{40,64}$/u.test(baseRef)) {
|
|
20
|
-
throw new Error("
|
|
20
|
+
throw new Error("Agent hook requires a repository with an existing HEAD commit");
|
|
21
21
|
}
|
|
22
22
|
const temporaryPath = `${statePath}.${randomUUID()}.tmp`;
|
|
23
23
|
try {
|
|
@@ -45,20 +45,20 @@ export class GitPrivateAgentIntentStore {
|
|
|
45
45
|
}
|
|
46
46
|
try {
|
|
47
47
|
if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > maximumSnapshotBytes) {
|
|
48
|
-
throw new Error("
|
|
48
|
+
throw new Error("Agent hook state is not a bounded regular file");
|
|
49
49
|
}
|
|
50
50
|
if (process.platform !== "win32" && (metadata.mode & 0o077) !== 0) {
|
|
51
|
-
throw new Error("
|
|
51
|
+
throw new Error("Agent hook state is not private to its owner");
|
|
52
52
|
}
|
|
53
53
|
let value;
|
|
54
54
|
try {
|
|
55
55
|
value = JSON.parse(await readFile(statePath, "utf8"));
|
|
56
56
|
}
|
|
57
57
|
catch {
|
|
58
|
-
throw new Error("
|
|
58
|
+
throw new Error("Agent hook state is invalid JSON");
|
|
59
59
|
}
|
|
60
60
|
if (!isCapturedIntent(value) || value.repositoryRoot !== repositoryRoot) {
|
|
61
|
-
throw new Error("
|
|
61
|
+
throw new Error("Agent hook state does not match this repository");
|
|
62
62
|
}
|
|
63
63
|
return { intent: value.intent, baseRef: value.baseRef };
|
|
64
64
|
}
|
|
@@ -89,10 +89,10 @@ export class GitPrivateAgentIntentStore {
|
|
|
89
89
|
await mkdir(privateDirectory, { mode: 0o700, recursive: true });
|
|
90
90
|
const metadata = await lstat(privateDirectory);
|
|
91
91
|
if (!metadata.isDirectory() || metadata.isSymbolicLink()) {
|
|
92
|
-
throw new Error("
|
|
92
|
+
throw new Error("Agent hook state directory is not a regular directory");
|
|
93
93
|
}
|
|
94
94
|
if (process.platform !== "win32" && (metadata.mode & 0o077) !== 0) {
|
|
95
|
-
throw new Error("
|
|
95
|
+
throw new Error("Agent hook state directory is not private to its owner");
|
|
96
96
|
}
|
|
97
97
|
const name = createHash("sha256").update(sessionId).digest("hex");
|
|
98
98
|
return { statePath: join(privateDirectory, `${name}.json`), repositoryRoot };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-private-agent-intent-store.js","sourceRoot":"","sources":["../../../src/infrastructure/git/git-private-agent-intent-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKjC,OAAO,EAAsB,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAErF,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvC,6CAA6C;AAC7C,MAAM,OAAO,0BAA0B;IACD;IAApC,YAAoC,WAA0B,IAAI,iBAAiB,EAAE;QAAjD,aAAQ,GAAR,QAAQ,CAAyC;IAAG,CAAC;IAElF,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,gBAAwB,EAAE,MAAc;QAC9E,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACvF,MAAM,OAAO,GAAG,CACd,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YACtB,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC;YAChC,GAAG,EAAE,gBAAgB;SACtB,CAAC,CACH,CAAC,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"git-private-agent-intent-store.js","sourceRoot":"","sources":["../../../src/infrastructure/git/git-private-agent-intent-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKjC,OAAO,EAAsB,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAErF,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvC,6CAA6C;AAC7C,MAAM,OAAO,0BAA0B;IACD;IAApC,YAAoC,WAA0B,IAAI,iBAAiB,EAAE;QAAjD,aAAQ,GAAR,QAAQ,CAAyC;IAAG,CAAC;IAElF,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,gBAAwB,EAAE,MAAc;QAC9E,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACvF,MAAM,OAAO,GAAG,CACd,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YACtB,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC;YAChC,GAAG,EAAE,gBAAgB;SACtB,CAAC,CACH,CAAC,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,aAAa,GAAG,GAAG,SAAS,IAAI,UAAU,EAAE,MAAM,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE;gBAClF,QAAQ,EAAE,MAAM;gBAChB,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QACzC,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,IAAI,CACf,SAAiB,EACjB,gBAAwB;QAExB,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACvF,IAAI,QAA2C,CAAC;QAChD,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,SAAS,CAAC,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC;YACvC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,QAAQ,CAAC,cAAc,EAAE,IAAI,QAAQ,CAAC,IAAI,GAAG,oBAAoB,EAAE,CAAC;gBAC5F,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACpE,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,KAAc,CAAC;YACnB,IAAI,CAAC;gBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAY,CAAC;YACnE,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACtD,CAAC;YACD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,cAAc,KAAK,cAAc,EAAE,CAAC;gBACxE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,gBAAwB;QAC5D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACvE,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC;IAEO,KAAK,CAAC,QAAQ,CACpB,SAAiB,EACjB,gBAAwB;QAExB,MAAM,CAAC,UAAU,EAAE,kBAAkB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACzD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAChB,UAAU,EAAE,KAAK;gBACjB,SAAS,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC;gBAC3C,GAAG,EAAE,gBAAgB;aACtB,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAChB,UAAU,EAAE,KAAK;gBACjB,SAAS,EAAE,CAAC,WAAW,EAAE,oBAAoB,CAAC;gBAC9C,GAAG,EAAE,gBAAgB;aACtB,CAAC;SACH,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;QACjE,MAAM,KAAK,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE,GAAG,IAAI,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/E,CAAC;CACF;AAED,SAAS,gBAAgB,CACvB,KAAc;IAEd,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,gBAAgB,IAAI,KAAK;QACzB,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ;QACxC,SAAS,IAAI,KAAK;QAClB,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACxC,QAAQ,IAAI,KAAK;QACjB,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CACxB,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACnG,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,MAAM,KAAK,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type CommandRunner } from "../process/command-runner.js";
|
|
2
|
+
/** 민감한 요청문이 들어갈 수 있는 HTML을 작업 트리 밖의 Git 메타데이터에 보관한다. */
|
|
3
|
+
export declare class GitPrivateAgentReportWriter {
|
|
4
|
+
private readonly commands;
|
|
5
|
+
constructor(commands?: CommandRunner);
|
|
6
|
+
write(key: string, workingDirectory: string, content: string): Promise<string>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=git-private-agent-report-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-private-agent-report-writer.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/git/git-private-agent-report-writer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,8BAA8B,CAAC;AAErF,wDAAwD;AACxD,qBAAa,2BAA2B;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,GAAE,aAAuC;IAExE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAiC5F"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { lstat, mkdir, realpath, rename, unlink, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { NodeCommandRunner } from "../process/command-runner.js";
|
|
5
|
+
/** 민감한 요청문이 들어갈 수 있는 HTML을 작업 트리 밖의 Git 메타데이터에 보관한다. */
|
|
6
|
+
export class GitPrivateAgentReportWriter {
|
|
7
|
+
commands;
|
|
8
|
+
constructor(commands = new NodeCommandRunner()) {
|
|
9
|
+
this.commands = commands;
|
|
10
|
+
}
|
|
11
|
+
async write(key, workingDirectory, content) {
|
|
12
|
+
const gitDirectory = await realpath((await this.commands.run({
|
|
13
|
+
executable: "git",
|
|
14
|
+
arguments: ["rev-parse", "--absolute-git-dir"],
|
|
15
|
+
cwd: workingDirectory,
|
|
16
|
+
})).trim());
|
|
17
|
+
const directory = join(gitDirectory, "intentpatch-reports");
|
|
18
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
19
|
+
const metadata = await lstat(directory);
|
|
20
|
+
if (!metadata.isDirectory() || metadata.isSymbolicLink()) {
|
|
21
|
+
throw new Error("Agent report directory is not a regular directory");
|
|
22
|
+
}
|
|
23
|
+
if (process.platform !== "win32" && (metadata.mode & 0o077) !== 0) {
|
|
24
|
+
throw new Error("Agent report directory is not private to its owner");
|
|
25
|
+
}
|
|
26
|
+
const name = createHash("sha256").update(key).digest("hex");
|
|
27
|
+
const destination = join(directory, `${name}.html`);
|
|
28
|
+
const temporary = join(directory, `${name}.${randomUUID()}.tmp`);
|
|
29
|
+
try {
|
|
30
|
+
await writeFile(temporary, content, { encoding: "utf8", flag: "wx", mode: 0o600 });
|
|
31
|
+
await rename(temporary, destination);
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
await unlink(temporary).catch((error) => {
|
|
35
|
+
if (!isMissing(error))
|
|
36
|
+
throw error;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return destination;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function isMissing(error) {
|
|
43
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=git-private-agent-report-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-private-agent-report-writer.js","sourceRoot":"","sources":["../../../src/infrastructure/git/git-private-agent-report-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAsB,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAErF,wDAAwD;AACxD,MAAM,OAAO,2BAA2B;IACF;IAApC,YAAoC,WAA0B,IAAI,iBAAiB,EAAE;QAAjD,aAAQ,GAAR,QAAQ,CAAyC;IAAG,CAAC;IAElF,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,gBAAwB,EAAE,OAAe;QACvE,MAAM,YAAY,GAAG,MAAM,QAAQ,CACjC,CACE,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YACtB,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,CAAC,WAAW,EAAE,oBAAoB,CAAC;YAC9C,GAAG,EAAE,gBAAgB;SACtB,CAAC,CACH,CAAC,IAAI,EAAE,CACT,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;QAC5D,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,IAAI,UAAU,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACnF,MAAM,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBAC/C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;oBAAE,MAAM,KAAK,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACnG,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescript-function-signature-compatibility.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/typescript/typescript-function-signature-compatibility.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,6DAA6D,CAAC;
|
|
1
|
+
{"version":3,"file":"typescript-function-signature-compatibility.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/typescript/typescript-function-signature-compatibility.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,6DAA6D,CAAC;AAWlH,kGAAkG;AAClG,qBAAa,wCAAyC,YAAW,8BAA8B;IACtF,sBAAsB,CAC3B,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,OAAO,GAAG,SAAS;CAkDvB"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import ts from "typescript";
|
|
2
2
|
const comparisonPath = "/__intentpatch_function_signatures__.ts";
|
|
3
|
+
const primitiveParameterTypes = new Set([
|
|
4
|
+
ts.SyntaxKind.StringKeyword,
|
|
5
|
+
ts.SyntaxKind.NumberKeyword,
|
|
6
|
+
ts.SyntaxKind.BooleanKeyword,
|
|
7
|
+
ts.SyntaxKind.BigIntKeyword,
|
|
8
|
+
ts.SyntaxKind.SymbolKeyword,
|
|
9
|
+
]);
|
|
3
10
|
/** Uses TypeScript assignability only when both self-contained signature types can be checked. */
|
|
4
11
|
export class TypeScriptFunctionSignatureCompatibility {
|
|
5
12
|
preservesPreviousCalls(previous, current) {
|
|
@@ -24,10 +31,15 @@ export class TypeScriptFunctionSignatureCompatibility {
|
|
|
24
31
|
? sourceFile
|
|
25
32
|
: getSourceFile(path, languageVersion, onError, shouldCreateNewSourceFile);
|
|
26
33
|
const program = ts.createProgram([comparisonPath], options, host);
|
|
27
|
-
if (program.getSyntacticDiagnostics(sourceFile).length > 0
|
|
28
|
-
|
|
34
|
+
if (program.getSyntacticDiagnostics(sourceFile).length > 0)
|
|
35
|
+
return undefined;
|
|
36
|
+
// A new union arm cannot invalidate calls that supplied the old primitive type.
|
|
37
|
+
// This narrow proof also works when unchanged return names or new union arms are
|
|
38
|
+
// declared outside the isolated comparison program.
|
|
39
|
+
if (preservesPrimitiveParameterCalls(sourceFile))
|
|
40
|
+
return true;
|
|
41
|
+
if (program.getSemanticDiagnostics(sourceFile).length > 0)
|
|
29
42
|
return undefined;
|
|
30
|
-
}
|
|
31
43
|
const checker = program.getTypeChecker();
|
|
32
44
|
const declarations = sourceFile.statements.filter(ts.isInterfaceDeclaration);
|
|
33
45
|
const previousSymbol = declarations[0] && checker.getSymbolAtLocation(declarations[0].name);
|
|
@@ -37,6 +49,38 @@ export class TypeScriptFunctionSignatureCompatibility {
|
|
|
37
49
|
return checker.isTypeAssignableTo(checker.getDeclaredTypeOfSymbol(currentSymbol), checker.getDeclaredTypeOfSymbol(previousSymbol));
|
|
38
50
|
}
|
|
39
51
|
}
|
|
52
|
+
function preservesPrimitiveParameterCalls(sourceFile) {
|
|
53
|
+
const declarations = sourceFile.statements.filter(ts.isInterfaceDeclaration);
|
|
54
|
+
const previousCalls = declarations[0]?.members.filter(ts.isCallSignatureDeclaration) ?? [];
|
|
55
|
+
const currentCalls = declarations[1]?.members.filter(ts.isCallSignatureDeclaration) ?? [];
|
|
56
|
+
return (previousCalls.length > 0 &&
|
|
57
|
+
previousCalls.every((previous) => currentCalls.some((current) => preservesPrimitiveCall(previous, current, sourceFile))));
|
|
58
|
+
}
|
|
59
|
+
function preservesPrimitiveCall(previous, current, sourceFile) {
|
|
60
|
+
if (previous.typeParameters?.length ||
|
|
61
|
+
current.typeParameters?.length ||
|
|
62
|
+
previous.parameters.length !== current.parameters.length ||
|
|
63
|
+
previous.parameters.length === 0 ||
|
|
64
|
+
previous.type?.getText(sourceFile) !== current.type?.getText(sourceFile)) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return previous.parameters.every((parameter, index) => {
|
|
68
|
+
const currentParameter = current.parameters[index];
|
|
69
|
+
const previousType = parameter.type;
|
|
70
|
+
const currentType = currentParameter?.type;
|
|
71
|
+
if (currentParameter === undefined ||
|
|
72
|
+
previousType === undefined ||
|
|
73
|
+
currentType === undefined ||
|
|
74
|
+
!primitiveParameterTypes.has(previousType.kind) ||
|
|
75
|
+
Boolean(parameter.questionToken) !== Boolean(currentParameter.questionToken) ||
|
|
76
|
+
Boolean(parameter.dotDotDotToken) !== Boolean(currentParameter.dotDotDotToken)) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
return (currentType.kind === previousType.kind ||
|
|
80
|
+
(ts.isUnionTypeNode(currentType) &&
|
|
81
|
+
currentType.types.some((type) => type.kind === previousType.kind)));
|
|
82
|
+
});
|
|
83
|
+
}
|
|
40
84
|
/** Convert the extractor's name-free display signature into a call signature for the checker. */
|
|
41
85
|
function toCallSignature(signature) {
|
|
42
86
|
// The display normalizer is not string-literal-aware; avoid proving compatibility from it.
|