@gitwand/core 3.3.0 → 3.5.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/dist/__tests__/config.test.js +69 -0
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/corpus.d.ts.map +1 -1
- package/dist/__tests__/corpus.js +29 -0
- package/dist/__tests__/corpus.js.map +1 -1
- package/dist/__tests__/golden-funnel.test.d.ts +44 -0
- package/dist/__tests__/golden-funnel.test.d.ts.map +1 -0
- package/dist/__tests__/golden-funnel.test.js +100 -0
- package/dist/__tests__/golden-funnel.test.js.map +1 -0
- package/dist/__tests__/imports-extended.test.js +21 -0
- package/dist/__tests__/imports-extended.test.js.map +1 -1
- package/dist/__tests__/llm-refactoring-coupling.test.d.ts +16 -0
- package/dist/__tests__/llm-refactoring-coupling.test.d.ts.map +1 -0
- package/dist/__tests__/llm-refactoring-coupling.test.js +100 -0
- package/dist/__tests__/llm-refactoring-coupling.test.js.map +1 -0
- package/dist/__tests__/patterns/insertion-at-boundary.test.js +35 -0
- package/dist/__tests__/patterns/insertion-at-boundary.test.js.map +1 -1
- package/dist/__tests__/patterns/token-level-merge.test.d.ts +2 -0
- package/dist/__tests__/patterns/token-level-merge.test.d.ts.map +1 -0
- package/dist/__tests__/patterns/token-level-merge.test.js +117 -0
- package/dist/__tests__/patterns/token-level-merge.test.js.map +1 -0
- package/dist/__tests__/patterns/value-only-change.test.js +134 -0
- package/dist/__tests__/patterns/value-only-change.test.js.map +1 -1
- package/dist/__tests__/patterns/whitespace-only.test.js +57 -0
- package/dist/__tests__/patterns/whitespace-only.test.js.map +1 -1
- package/dist/__tests__/refactoring/refactoring-pipeline.test.js +36 -0
- package/dist/__tests__/refactoring/refactoring-pipeline.test.js.map +1 -1
- package/dist/__tests__/regression-guard-tiers.test.d.ts +33 -0
- package/dist/__tests__/regression-guard-tiers.test.d.ts.map +1 -0
- package/dist/__tests__/regression-guard-tiers.test.js +81 -0
- package/dist/__tests__/regression-guard-tiers.test.js.map +1 -0
- package/dist/__tests__/resolver.test.js +18 -0
- package/dist/__tests__/resolver.test.js.map +1 -1
- package/dist/__tests__/resolvers/import-extract.test.d.ts +2 -0
- package/dist/__tests__/resolvers/import-extract.test.d.ts.map +1 -0
- package/dist/__tests__/resolvers/import-extract.test.js +52 -0
- package/dist/__tests__/resolvers/import-extract.test.js.map +1 -0
- package/dist/__tests__/resolvers/json.test.js +12 -3
- package/dist/__tests__/resolvers/json.test.js.map +1 -1
- package/dist/__tests__/secrets/patterns.test.d.ts +2 -0
- package/dist/__tests__/secrets/patterns.test.d.ts.map +1 -0
- package/dist/__tests__/secrets/patterns.test.js +130 -0
- package/dist/__tests__/secrets/patterns.test.js.map +1 -0
- package/dist/__tests__/secrets/scanner.test.d.ts +2 -0
- package/dist/__tests__/secrets/scanner.test.d.ts.map +1 -0
- package/dist/__tests__/secrets/scanner.test.js +211 -0
- package/dist/__tests__/secrets/scanner.test.js.map +1 -0
- package/dist/__tests__/stats/tiers.test.d.ts +16 -0
- package/dist/__tests__/stats/tiers.test.d.ts.map +1 -0
- package/dist/__tests__/stats/tiers.test.js +97 -0
- package/dist/__tests__/stats/tiers.test.js.map +1 -0
- package/dist/__tests__/types.test.d.ts +2 -0
- package/dist/__tests__/types.test.d.ts.map +1 -0
- package/dist/__tests__/types.test.js +26 -0
- package/dist/__tests__/types.test.js.map +1 -0
- package/dist/classifier.d.ts.map +1 -1
- package/dist/classifier.js +7 -0
- package/dist/classifier.js.map +1 -1
- package/dist/config.d.ts +31 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +39 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/patterns/token-level-merge.d.ts +6 -0
- package/dist/patterns/token-level-merge.d.ts.map +1 -0
- package/dist/patterns/token-level-merge.js +149 -0
- package/dist/patterns/token-level-merge.js.map +1 -0
- package/dist/patterns/utils.d.ts +38 -1
- package/dist/patterns/utils.d.ts.map +1 -1
- package/dist/patterns/utils.js +171 -9
- package/dist/patterns/utils.js.map +1 -1
- package/dist/patterns/value-only-change.d.ts.map +1 -1
- package/dist/patterns/value-only-change.js +9 -5
- package/dist/patterns/value-only-change.js.map +1 -1
- package/dist/patterns/whitespace-only.d.ts.map +1 -1
- package/dist/patterns/whitespace-only.js +11 -2
- package/dist/patterns/whitespace-only.js.map +1 -1
- package/dist/refactoring/detect.d.ts.map +1 -1
- package/dist/refactoring/detect.js +72 -1
- package/dist/refactoring/detect.js.map +1 -1
- package/dist/resolver/assemble.d.ts.map +1 -1
- package/dist/resolver/assemble.js +40 -4
- package/dist/resolver/assemble.js.map +1 -1
- package/dist/resolver/index.d.ts.map +1 -1
- package/dist/resolver/index.js +8 -1
- package/dist/resolver/index.js.map +1 -1
- package/dist/resolvers/imports.d.ts +9 -0
- package/dist/resolvers/imports.d.ts.map +1 -1
- package/dist/resolvers/imports.js +39 -0
- package/dist/resolvers/imports.js.map +1 -1
- package/dist/secrets/patterns.d.ts +12 -0
- package/dist/secrets/patterns.d.ts.map +1 -0
- package/dist/secrets/patterns.js +98 -0
- package/dist/secrets/patterns.js.map +1 -0
- package/dist/secrets/scanner.d.ts +28 -0
- package/dist/secrets/scanner.d.ts.map +1 -0
- package/dist/secrets/scanner.js +161 -0
- package/dist/secrets/scanner.js.map +1 -0
- package/dist/secrets/types.d.ts +47 -0
- package/dist/secrets/types.d.ts.map +1 -0
- package/dist/secrets/types.js +9 -0
- package/dist/secrets/types.js.map +1 -0
- package/dist/stats/tiers.d.ts +30 -0
- package/dist/stats/tiers.d.ts.map +1 -0
- package/dist/stats/tiers.js +57 -0
- package/dist/stats/tiers.js.map +1 -0
- package/dist/types.d.ts +30 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ScanFileInput, SecretFinding, SecretsScanConfig } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* v3.5.0 (D5) — Globs de fichiers générés ignorés PAR DÉFAUT, quel que soit `config.ignore`.
|
|
4
|
+
* Sans ça, un simple `pnpm install` qui bump une intégrité de lockfile (`integrity: sha512-…`)
|
|
5
|
+
* déclenche un finding `high_entropy` sur la quasi-totalité des commits réels. Toujours
|
|
6
|
+
* appliqués en plus des entrées `.gitwandrc` `secrets.ignore[]` de l'utilisateur (additif, jamais
|
|
7
|
+
* remplacé). MIRROIR EXACT côté Rust : `apps/desktop/src-tauri/src/commands/secrets.rs`
|
|
8
|
+
* `DEFAULT_IGNORE_GLOBS` — verrouillé par le test de parité (scan-secrets.test.mjs). Toute
|
|
9
|
+
* modification de cette liste doit être répercutée des deux côtés.
|
|
10
|
+
*/
|
|
11
|
+
export declare const DEFAULT_IGNORE_GLOBS: string[];
|
|
12
|
+
export declare function scanSecrets(files: ScanFileInput[], config: SecretsScanConfig): SecretFinding[];
|
|
13
|
+
/** Entropie de Shannon en bits/char. */
|
|
14
|
+
export declare function shannonEntropy(s: string): number;
|
|
15
|
+
/**
|
|
16
|
+
* Masque une valeur secrète : ≤3 caractères de tête + `…` + ≤3 caractères de queue.
|
|
17
|
+
* Pour les correspondances courtes, où révéler 3+3 caractères exposerait (quasi) toute la
|
|
18
|
+
* valeur, on masque intégralement à la place. Le brut n'est JAMAIS retourné.
|
|
19
|
+
*/
|
|
20
|
+
export declare function redact(match: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* `true` si la valeur matchée ou le fichier doit être ignoré, d'après `.gitwandrc` `secrets.ignore[]`.
|
|
23
|
+
* Une entrée `/.../ ` est un littéral regex testé contre la valeur matchée ; toute autre entrée
|
|
24
|
+
* est un glob de chemin testé contre `path` (via `matchGlob`, le même moteur que les overrides de
|
|
25
|
+
* politique de merge).
|
|
26
|
+
*/
|
|
27
|
+
export declare function isIgnored(path: string, value: string, ignore: string[]): boolean;
|
|
28
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/secrets/scanner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAiB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAajG;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,EAYxC,CAAC;AAQF,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,iBAAiB,GAAG,aAAa,EAAE,CA2E9F;AAED,wCAAwC;AACxC,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAUhD;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAS5C;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAehF"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { matchGlob } from "../config.js";
|
|
2
|
+
import { BUILT_IN_PATTERNS } from "./patterns.js";
|
|
3
|
+
/**
|
|
4
|
+
* v3.5.0 — Scanner de secrets pur (aucune dépendance Node/git).
|
|
5
|
+
*
|
|
6
|
+
* Mirroir Rust : `apps/desktop/src-tauri/src/commands/secrets.rs` (`scan_lines`). Toute
|
|
7
|
+
* modification de comportement ici doit être répercutée côté Rust — voir le test de parité
|
|
8
|
+
* (Task 7).
|
|
9
|
+
*/
|
|
10
|
+
/** Nombre maximal de findings retournés (défensif — voir apps/desktop/CLAUDE.md P6.4). */
|
|
11
|
+
const MAX_FINDINGS = 500;
|
|
12
|
+
/**
|
|
13
|
+
* v3.5.0 (D5) — Globs de fichiers générés ignorés PAR DÉFAUT, quel que soit `config.ignore`.
|
|
14
|
+
* Sans ça, un simple `pnpm install` qui bump une intégrité de lockfile (`integrity: sha512-…`)
|
|
15
|
+
* déclenche un finding `high_entropy` sur la quasi-totalité des commits réels. Toujours
|
|
16
|
+
* appliqués en plus des entrées `.gitwandrc` `secrets.ignore[]` de l'utilisateur (additif, jamais
|
|
17
|
+
* remplacé). MIRROIR EXACT côté Rust : `apps/desktop/src-tauri/src/commands/secrets.rs`
|
|
18
|
+
* `DEFAULT_IGNORE_GLOBS` — verrouillé par le test de parité (scan-secrets.test.mjs). Toute
|
|
19
|
+
* modification de cette liste doit être répercutée des deux côtés.
|
|
20
|
+
*/
|
|
21
|
+
export const DEFAULT_IGNORE_GLOBS = [
|
|
22
|
+
"*.lock",
|
|
23
|
+
"package-lock.json",
|
|
24
|
+
"pnpm-lock.yaml",
|
|
25
|
+
"yarn.lock",
|
|
26
|
+
"Cargo.lock",
|
|
27
|
+
"*.min.js",
|
|
28
|
+
"*.min.css",
|
|
29
|
+
"dist/**",
|
|
30
|
+
"build/**",
|
|
31
|
+
"node_modules/**",
|
|
32
|
+
"*.map",
|
|
33
|
+
];
|
|
34
|
+
/** Longueur minimale d'un token pour être soumis à la détection par entropie. */
|
|
35
|
+
const MIN_ENTROPY_TOKEN_LENGTH = 20;
|
|
36
|
+
/** Caractères considérés comme faisant partie d'un token candidat à l'entropie. */
|
|
37
|
+
const ENTROPY_TOKEN_RE = /[A-Za-z0-9+/=_-]+/g;
|
|
38
|
+
export function scanSecrets(files, config) {
|
|
39
|
+
if (!config.enabled)
|
|
40
|
+
return [];
|
|
41
|
+
// Built-ins always apply; user `.gitwandrc` entries are additive on top, never a replacement.
|
|
42
|
+
const effectiveIgnore = [...DEFAULT_IGNORE_GLOBS, ...config.ignore];
|
|
43
|
+
const allPatterns = [...BUILT_IN_PATTERNS, ...config.extraPatterns];
|
|
44
|
+
const compiled = allPatterns.flatMap((pattern) => {
|
|
45
|
+
try {
|
|
46
|
+
return [{ pattern, re: new RegExp(pattern.regex, "g") }];
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Regex utilisateur malformée — on l'ignore silencieusement, jamais fatal.
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
const findings = [];
|
|
54
|
+
for (const file of files) {
|
|
55
|
+
for (const { line, text } of file.addedLines) {
|
|
56
|
+
const matchedRanges = [];
|
|
57
|
+
for (const { pattern, re } of compiled) {
|
|
58
|
+
re.lastIndex = 0;
|
|
59
|
+
let m;
|
|
60
|
+
while ((m = re.exec(text)) !== null) {
|
|
61
|
+
const matchValue = m[0];
|
|
62
|
+
if (matchValue.length === 0) {
|
|
63
|
+
re.lastIndex++;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
matchedRanges.push([m.index, m.index + matchValue.length]);
|
|
67
|
+
if (!isIgnored(file.path, matchValue, effectiveIgnore)) {
|
|
68
|
+
findings.push({
|
|
69
|
+
file: file.path,
|
|
70
|
+
line,
|
|
71
|
+
patternId: pattern.id,
|
|
72
|
+
severity: pattern.severity,
|
|
73
|
+
redactedExcerpt: redact(matchValue),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (config.entropyThreshold > 0) {
|
|
79
|
+
ENTROPY_TOKEN_RE.lastIndex = 0;
|
|
80
|
+
let tokenMatch;
|
|
81
|
+
while ((tokenMatch = ENTROPY_TOKEN_RE.exec(text)) !== null) {
|
|
82
|
+
const token = tokenMatch[0];
|
|
83
|
+
const start = tokenMatch.index;
|
|
84
|
+
const end = start + token.length;
|
|
85
|
+
if (token.length < MIN_ENTROPY_TOKEN_LENGTH)
|
|
86
|
+
continue;
|
|
87
|
+
const overlapsRegexHit = matchedRanges.some(([rStart, rEnd]) => start < rEnd && end > rStart);
|
|
88
|
+
if (overlapsRegexHit)
|
|
89
|
+
continue;
|
|
90
|
+
if (shannonEntropy(token) >= config.entropyThreshold) {
|
|
91
|
+
if (!isIgnored(file.path, token, effectiveIgnore)) {
|
|
92
|
+
findings.push({
|
|
93
|
+
file: file.path,
|
|
94
|
+
line,
|
|
95
|
+
patternId: "high_entropy",
|
|
96
|
+
severity: "low",
|
|
97
|
+
redactedExcerpt: redact(token),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return findings.slice(0, MAX_FINDINGS);
|
|
106
|
+
}
|
|
107
|
+
/** Entropie de Shannon en bits/char. */
|
|
108
|
+
export function shannonEntropy(s) {
|
|
109
|
+
if (s.length === 0)
|
|
110
|
+
return 0;
|
|
111
|
+
const freq = new Map();
|
|
112
|
+
for (const ch of s)
|
|
113
|
+
freq.set(ch, (freq.get(ch) ?? 0) + 1);
|
|
114
|
+
let entropy = 0;
|
|
115
|
+
for (const count of freq.values()) {
|
|
116
|
+
const p = count / s.length;
|
|
117
|
+
entropy -= p * Math.log2(p);
|
|
118
|
+
}
|
|
119
|
+
return entropy;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Masque une valeur secrète : ≤3 caractères de tête + `…` + ≤3 caractères de queue.
|
|
123
|
+
* Pour les correspondances courtes, où révéler 3+3 caractères exposerait (quasi) toute la
|
|
124
|
+
* valeur, on masque intégralement à la place. Le brut n'est JAMAIS retourné.
|
|
125
|
+
*/
|
|
126
|
+
export function redact(match) {
|
|
127
|
+
const VISIBLE_EDGE = 3;
|
|
128
|
+
const MIN_LENGTH_FOR_PARTIAL_REVEAL = 12;
|
|
129
|
+
if (match.length < MIN_LENGTH_FOR_PARTIAL_REVEAL) {
|
|
130
|
+
return "*".repeat(match.length);
|
|
131
|
+
}
|
|
132
|
+
const lead = match.slice(0, VISIBLE_EDGE);
|
|
133
|
+
const trail = match.slice(-VISIBLE_EDGE);
|
|
134
|
+
return `${lead}…${trail}`;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* `true` si la valeur matchée ou le fichier doit être ignoré, d'après `.gitwandrc` `secrets.ignore[]`.
|
|
138
|
+
* Une entrée `/.../ ` est un littéral regex testé contre la valeur matchée ; toute autre entrée
|
|
139
|
+
* est un glob de chemin testé contre `path` (via `matchGlob`, le même moteur que les overrides de
|
|
140
|
+
* politique de merge).
|
|
141
|
+
*/
|
|
142
|
+
export function isIgnored(path, value, ignore) {
|
|
143
|
+
for (const entry of ignore) {
|
|
144
|
+
if (entry.length >= 2 && entry.startsWith("/") && entry.endsWith("/")) {
|
|
145
|
+
const body = entry.slice(1, -1);
|
|
146
|
+
try {
|
|
147
|
+
if (new RegExp(body).test(value))
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Regex d'ignore malformée — on l'ignore silencieusement.
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else if (matchGlob(entry, path)) {
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/secrets/scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v3.5.0 — Types partagés du scanner de secrets.
|
|
3
|
+
*
|
|
4
|
+
* Mirroir Rust : `apps/desktop/src-tauri/src/types.rs` (SecretFinding, SecretPatternInput,
|
|
5
|
+
* SecretsScanConfig). Toute modification de forme ici doit être répercutée côté Rust — voir le
|
|
6
|
+
* test de parité (Task 7).
|
|
7
|
+
*/
|
|
8
|
+
export type SecretSeverity = "high" | "medium" | "low";
|
|
9
|
+
/** Un détecteur built-in ou fourni par l'utilisateur via `.gitwandrc`. */
|
|
10
|
+
export interface SecretPattern {
|
|
11
|
+
/** Identifiant stable, ex: "aws_access_key_id", "github_pat_classic". */
|
|
12
|
+
id: string;
|
|
13
|
+
/** Sous-ensemble commun Rust+JS — PAS de lookaround / backreferences. */
|
|
14
|
+
regex: string;
|
|
15
|
+
severity: SecretSeverity;
|
|
16
|
+
/** Description par défaut en anglais ; l'UI affiche une clé i18n par id quand elle existe. */
|
|
17
|
+
description: string;
|
|
18
|
+
}
|
|
19
|
+
/** Entrée du scanner pur (l'appelant extrait ceci depuis `git diff --cached`). */
|
|
20
|
+
export interface ScanFileInput {
|
|
21
|
+
path: string;
|
|
22
|
+
addedLines: Array<{
|
|
23
|
+
line: number;
|
|
24
|
+
text: string;
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
/** Config effective : built-ins + extensions utilisateur, résolue par l'appelant. */
|
|
28
|
+
export interface SecretsScanConfig {
|
|
29
|
+
/** Interrupteur maître (app setting ET .gitwandrc secrets.enabled). */
|
|
30
|
+
enabled: boolean;
|
|
31
|
+
/** Depuis .gitwandrc secrets.patterns[]. */
|
|
32
|
+
extraPatterns: SecretPattern[];
|
|
33
|
+
/** Chemins glob OU littéraux /regex/ à ignorer, depuis .gitwandrc. */
|
|
34
|
+
ignore: string[];
|
|
35
|
+
/** Bits/char Shannon sur tokens longs ; 0 désactive la détection par entropie. */
|
|
36
|
+
entropyThreshold: number;
|
|
37
|
+
}
|
|
38
|
+
export interface SecretFinding {
|
|
39
|
+
file: string;
|
|
40
|
+
line: number;
|
|
41
|
+
/** id built-in, id utilisateur, ou "high_entropy". */
|
|
42
|
+
patternId: string;
|
|
43
|
+
severity: SecretSeverity;
|
|
44
|
+
/** Excerpt masqué au centre — JAMAIS le secret brut. */
|
|
45
|
+
redactedExcerpt: string;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/secrets/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEvD,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,EAAE,EAAE,MAAM,CAAC;IACX,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,cAAc,CAAC;IACzB,8FAA8F;IAC9F,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED,qFAAqF;AACrF,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,OAAO,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,aAAa,EAAE,aAAa,EAAE,CAAC;IAC/B,sEAAsE;IACtE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kFAAkF;IAClF,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;IACzB,wDAAwD;IACxD,eAAe,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v3.5.0 — Types partagés du scanner de secrets.
|
|
3
|
+
*
|
|
4
|
+
* Mirroir Rust : `apps/desktop/src-tauri/src/types.rs` (SecretFinding, SecretPatternInput,
|
|
5
|
+
* SecretsScanConfig). Toute modification de forme ici doit être répercutée côté Rust — voir le
|
|
6
|
+
* test de parité (Task 7).
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/secrets/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Recoverable-before-model" metric (v2.7).
|
|
3
|
+
*
|
|
4
|
+
* Design: docs/superpowers/specs/2026-07-07-recoverable-before-model-metric-design.md §4.B
|
|
5
|
+
*
|
|
6
|
+
* Pure, derived summary over `MergeStats.byType` — NOT a change to resolution
|
|
7
|
+
* logic. Answers: of the residual left after the cheap deterministic passes,
|
|
8
|
+
* how much is still recoverable deterministically before the model is ever
|
|
9
|
+
* invoked?
|
|
10
|
+
*
|
|
11
|
+
* Design note: these fields are deliberately NOT added to `MergeStats` —
|
|
12
|
+
* that struct is a serialized public contract (CLI --json reports, MCP
|
|
13
|
+
* output), and derived metrics stay derived. `summarizeTiers` is a TS-side
|
|
14
|
+
* helper consumed separately by CLI/desktop/MCP. (An earlier revision cited
|
|
15
|
+
* the Rust↔TS parity probe as the reason; that probe covers git commands,
|
|
16
|
+
* not resolution structs — the contract argument is the real one.)
|
|
17
|
+
*/
|
|
18
|
+
import type { ConflictType } from "../types.js";
|
|
19
|
+
export type ResolutionTier = "trivial" | "advancedDeterministic" | "model" | "unresolved";
|
|
20
|
+
export interface TierSummary {
|
|
21
|
+
byTier: Record<ResolutionTier, number>;
|
|
22
|
+
/** advancedDeterministic + model + unresolved — everything past the cheap trivial passes. */
|
|
23
|
+
residual: number;
|
|
24
|
+
/** model + unresolved — the bucket a new deterministic pattern must shrink. */
|
|
25
|
+
aiReachable: number;
|
|
26
|
+
/** advancedDeterministic / residual, 0 when residual === 0 (never NaN/Infinity). */
|
|
27
|
+
recoverableBeforeModel: number;
|
|
28
|
+
}
|
|
29
|
+
export declare function summarizeTiers(byType: Record<ConflictType, number>): TierSummary;
|
|
30
|
+
//# sourceMappingURL=tiers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tiers.d.ts","sourceRoot":"","sources":["../../src/stats/tiers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,uBAAuB,GAAG,OAAO,GAAG,YAAY,CAAC;AAE1F,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACvC,6FAA6F;IAC7F,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,oFAAoF;IACpF,sBAAsB,EAAE,MAAM,CAAC;CAChC;AA2BD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,WAAW,CAiBhF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Recoverable-before-model" metric (v2.7).
|
|
3
|
+
*
|
|
4
|
+
* Design: docs/superpowers/specs/2026-07-07-recoverable-before-model-metric-design.md §4.B
|
|
5
|
+
*
|
|
6
|
+
* Pure, derived summary over `MergeStats.byType` — NOT a change to resolution
|
|
7
|
+
* logic. Answers: of the residual left after the cheap deterministic passes,
|
|
8
|
+
* how much is still recoverable deterministically before the model is ever
|
|
9
|
+
* invoked?
|
|
10
|
+
*
|
|
11
|
+
* Design note: these fields are deliberately NOT added to `MergeStats` —
|
|
12
|
+
* that struct is a serialized public contract (CLI --json reports, MCP
|
|
13
|
+
* output), and derived metrics stay derived. `summarizeTiers` is a TS-side
|
|
14
|
+
* helper consumed separately by CLI/desktop/MCP. (An earlier revision cited
|
|
15
|
+
* the Rust↔TS parity probe as the reason; that probe covers git commands,
|
|
16
|
+
* not resolution structs — the contract argument is the real one.)
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* ConflictType → tier. Exhaustive over the `ConflictType` union — a future
|
|
20
|
+
* addition to that union fails to compile here until classified.
|
|
21
|
+
*
|
|
22
|
+
* `token_level_merge` sits in `advancedDeterministic` even though it never
|
|
23
|
+
* auto-applies without user confirmation (see packages/core/CLAUDE.md) —
|
|
24
|
+
* "recoverable deterministically" means "doesn't need the model", not
|
|
25
|
+
* "applied without a human in the loop".
|
|
26
|
+
*/
|
|
27
|
+
const TIER_BY_TYPE = {
|
|
28
|
+
same_change: "trivial",
|
|
29
|
+
delete_no_change: "trivial",
|
|
30
|
+
one_side_change: "trivial",
|
|
31
|
+
non_overlapping: "trivial",
|
|
32
|
+
whitespace_only: "trivial",
|
|
33
|
+
reorder_only: "trivial",
|
|
34
|
+
insertion_at_boundary: "trivial",
|
|
35
|
+
value_only_change: "trivial",
|
|
36
|
+
generated_file: "trivial",
|
|
37
|
+
refactoring_aware_merge: "advancedDeterministic",
|
|
38
|
+
token_level_merge: "advancedDeterministic",
|
|
39
|
+
llm_proposed: "model",
|
|
40
|
+
complex: "unresolved",
|
|
41
|
+
};
|
|
42
|
+
export function summarizeTiers(byType) {
|
|
43
|
+
const byTier = {
|
|
44
|
+
trivial: 0,
|
|
45
|
+
advancedDeterministic: 0,
|
|
46
|
+
model: 0,
|
|
47
|
+
unresolved: 0,
|
|
48
|
+
};
|
|
49
|
+
for (const [type, tier] of Object.entries(TIER_BY_TYPE)) {
|
|
50
|
+
byTier[tier] += byType[type] ?? 0;
|
|
51
|
+
}
|
|
52
|
+
const residual = byTier.advancedDeterministic + byTier.model + byTier.unresolved;
|
|
53
|
+
const aiReachable = byTier.model + byTier.unresolved;
|
|
54
|
+
const recoverableBeforeModel = residual === 0 ? 0 : byTier.advancedDeterministic / residual;
|
|
55
|
+
return { byTier, residual, aiReachable, recoverableBeforeModel };
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=tiers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tiers.js","sourceRoot":"","sources":["../../src/stats/tiers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAgBH;;;;;;;;GAQG;AACH,MAAM,YAAY,GAAyC;IACzD,WAAW,EAAE,SAAS;IACtB,gBAAgB,EAAE,SAAS;IAC3B,eAAe,EAAE,SAAS;IAC1B,eAAe,EAAE,SAAS;IAC1B,eAAe,EAAE,SAAS;IAC1B,YAAY,EAAE,SAAS;IACvB,qBAAqB,EAAE,SAAS;IAChC,iBAAiB,EAAE,SAAS;IAC5B,cAAc,EAAE,SAAS;IACzB,uBAAuB,EAAE,uBAAuB;IAChD,iBAAiB,EAAE,uBAAuB;IAC1C,YAAY,EAAE,OAAO;IACrB,OAAO,EAAE,YAAY;CACtB,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,MAAoC;IACjE,MAAM,MAAM,GAAmC;QAC7C,OAAO,EAAE,CAAC;QACV,qBAAqB,EAAE,CAAC;QACxB,KAAK,EAAE,CAAC;QACR,UAAU,EAAE,CAAC;KACd,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAqC,EAAE,CAAC;QAC5F,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,qBAAqB,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;IACjF,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;IACrD,MAAM,sBAAsB,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,qBAAqB,GAAG,QAAQ,CAAC;IAE5F,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;AACnE,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export interface MergeInput {
|
|
|
16
16
|
filePath: string;
|
|
17
17
|
}
|
|
18
18
|
/** Classification du type de conflit */
|
|
19
|
-
export type ConflictType = "one_side_change" | "same_change" | "non_overlapping" | "whitespace_only" | "delete_no_change" | "generated_file" | "value_only_change" | "reorder_only" | "insertion_at_boundary" | "llm_proposed" | "refactoring_aware_merge" | "complex";
|
|
19
|
+
export type ConflictType = "one_side_change" | "same_change" | "non_overlapping" | "whitespace_only" | "delete_no_change" | "generated_file" | "value_only_change" | "reorder_only" | "insertion_at_boundary" | "token_level_merge" | "llm_proposed" | "refactoring_aware_merge" | "complex";
|
|
20
20
|
/** Niveau de confiance discret (label seuil, utilisé dans les options) */
|
|
21
21
|
export type Confidence = "certain" | "high" | "medium" | "low";
|
|
22
22
|
/**
|
|
@@ -255,6 +255,35 @@ export interface DecisionTrace {
|
|
|
255
255
|
* `undefined` pour tous les autres types de conflit.
|
|
256
256
|
*/
|
|
257
257
|
llmTrace?: LlmTrace;
|
|
258
|
+
/**
|
|
259
|
+
* v2.7 — Proposition de fusion token-level (uniquement si
|
|
260
|
+
* `selected === "token_level_merge"`). `undefined` pour tous les autres types.
|
|
261
|
+
*/
|
|
262
|
+
tokenMergeTrace?: TokenMergeTrace;
|
|
263
|
+
}
|
|
264
|
+
/** Détail de résolution pour une ligne du hunk. */
|
|
265
|
+
export interface TokenMergeLineDetail {
|
|
266
|
+
/** Index de la ligne dans le hunk (0-based, aligné sur base/ours/theirs). */
|
|
267
|
+
lineIndex: number;
|
|
268
|
+
/** Quelle passe a résolu cette ligne. */
|
|
269
|
+
resolvedBy: "pass1" | "pass2";
|
|
270
|
+
/** Contenu final proposé pour cette ligne. */
|
|
271
|
+
resolvedLine: string;
|
|
272
|
+
/** Indices de tokens modifiés par ours (uniquement renseigné pour pass2). */
|
|
273
|
+
oursTokenIndices?: number[];
|
|
274
|
+
/** Indices de tokens modifiés par theirs (uniquement renseigné pour pass2). */
|
|
275
|
+
theirsTokenIndices?: number[];
|
|
276
|
+
}
|
|
277
|
+
/** Proposition complète de fusion token-level pour un hunk. */
|
|
278
|
+
export interface TokenMergeTrace {
|
|
279
|
+
/** Lignes fusionnées proposées — appliquées telles quelles si l'utilisateur accepte. */
|
|
280
|
+
mergedLines: string[];
|
|
281
|
+
/** Nombre de lignes résolues par la passe 1 (décomposition ligne-par-ligne). */
|
|
282
|
+
pass1Count: number;
|
|
283
|
+
/** Nombre de lignes résolues par la passe 2 (diff token-level). */
|
|
284
|
+
pass2Count: number;
|
|
285
|
+
/** Détail par ligne, pour l'annotation visuelle dans le panneau de proposition. */
|
|
286
|
+
lineDetails: TokenMergeLineDetail[];
|
|
258
287
|
}
|
|
259
288
|
/**
|
|
260
289
|
* Input canonique pour la classification d'un hunk.
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED