@gitwand/cli 2.8.1 → 2.8.4
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.d.ts.map +1 -1
- package/dist/cli.js +14 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/resolve.d.ts.map +1 -1
- package/dist/commands/resolve.js +45 -5
- package/dist/commands/resolve.js.map +1 -1
- package/dist/llm-config.d.ts +53 -0
- package/dist/llm-config.d.ts.map +1 -0
- package/dist/llm-config.js +135 -0
- package/dist/llm-config.js.map +1 -0
- package/dist/llm-endpoint.d.ts +51 -0
- package/dist/llm-endpoint.d.ts.map +1 -0
- package/dist/llm-endpoint.js +189 -0
- package/dist/llm-endpoint.js.map +1 -0
- package/dist/reporting.d.ts +6 -1
- package/dist/reporting.d.ts.map +1 -1
- package/dist/reporting.js +2 -0
- package/dist/reporting.js.map +1 -1
- package/package.json +6 -3
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAgCH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IACzC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;CACzC,CAoBA;AAED;;;;GAIG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAe1C"}
|
package/dist/cli.js
CHANGED
|
@@ -28,12 +28,20 @@ function printHelp() {
|
|
|
28
28
|
console.log(` gitwand --help Show this help`);
|
|
29
29
|
console.log();
|
|
30
30
|
console.log(`${c.bold}Options:${c.reset}`);
|
|
31
|
-
console.log(` --dry-run
|
|
32
|
-
console.log(` --verbose
|
|
33
|
-
console.log(` --no-whitespace
|
|
34
|
-
console.log(` --concurrency=N
|
|
35
|
-
console.log(` --ci
|
|
36
|
-
console.log(` --json
|
|
31
|
+
console.log(` --dry-run Analyze without writing files`);
|
|
32
|
+
console.log(` --verbose Show details for each resolution`);
|
|
33
|
+
console.log(` --no-whitespace Don't resolve whitespace-only conflicts`);
|
|
34
|
+
console.log(` --concurrency=N Parallel file workers (default ${DEFAULT_CONCURRENCY}, min 1)`);
|
|
35
|
+
console.log(` --ci CI mode: JSON output + exit code 1 if unresolved`);
|
|
36
|
+
console.log(` --json Output results as JSON (implies --ci behavior)`);
|
|
37
|
+
console.log(` --llm-fallback Enable LLM fallback for unresolved conflicts (opt-in, experimental)`);
|
|
38
|
+
console.log(` --llm-provider=X LLM provider: claude (default) | openai | ollama`);
|
|
39
|
+
console.log(` --llm-model=X Model name (e.g. claude-sonnet-4-6, gpt-4o-mini, llama3)`);
|
|
40
|
+
console.log();
|
|
41
|
+
console.log(`${c.bold}LLM environment:${c.reset}`);
|
|
42
|
+
console.log(` ANTHROPIC_API_KEY Required for --llm-provider=claude`);
|
|
43
|
+
console.log(` OPENAI_API_KEY Required for --llm-provider=openai`);
|
|
44
|
+
console.log(` OLLAMA_URL Optional override (default http://localhost:11434)`);
|
|
37
45
|
console.log();
|
|
38
46
|
}
|
|
39
47
|
/**
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,SAAS,SAAS;IAChB,WAAW,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/commands/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/commands/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAcH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC,CA2Lf"}
|
package/dist/commands/resolve.js
CHANGED
|
@@ -18,17 +18,45 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import { readFile, writeFile } from "node:fs/promises";
|
|
20
20
|
import { resolve as resolvePath } from "node:path";
|
|
21
|
-
import { resolve } from "@gitwand/core";
|
|
21
|
+
import { resolve, resolveAsync } from "@gitwand/core";
|
|
22
22
|
import { c, printBanner, WAND } from "../ui.js";
|
|
23
23
|
import { getConflictedFiles } from "../git.js";
|
|
24
24
|
import { parseConcurrency, runPool } from "../concurrency.js";
|
|
25
25
|
import { buildPartialContent } from "../partial-content.js";
|
|
26
26
|
import { buildCIReport } from "../reporting.js";
|
|
27
|
+
import { buildLlmEndpoint } from "../llm-endpoint.js";
|
|
28
|
+
import { resolveLlmConfig, buildResolveLlmOptions } from "../llm-config.js";
|
|
27
29
|
export async function cmdResolve(files, flags) {
|
|
28
30
|
const isCIMode = flags.ci || flags.json;
|
|
29
31
|
const verbose = !isCIMode && (flags.verbose === true || typeof flags.verbose === "string");
|
|
30
32
|
const resolveWhitespace = !(flags["no-whitespace"] === true);
|
|
31
33
|
const concurrency = parseConcurrency(flags.concurrency);
|
|
34
|
+
const llmFallbackEnabled = flags["llm-fallback"] === true;
|
|
35
|
+
// v2.5 — LLM fallback opt-in. Bascule de `resolve()` vers `resolveAsync()`
|
|
36
|
+
// et injecte un endpoint Node (fetch natif) qui wrap Claude / OpenAI / Ollama.
|
|
37
|
+
// Le fichier `.gitwandrc.llmFallback` est mergé avec les flags CLI (flags
|
|
38
|
+
// prioritaires). Aucune dep npm ajoutée : tout passe par `fetch` natif Node 20+.
|
|
39
|
+
let llmCliConfig = null;
|
|
40
|
+
let llmFileConfig = null;
|
|
41
|
+
if (llmFallbackEnabled) {
|
|
42
|
+
try {
|
|
43
|
+
const resolved = resolveLlmConfig(flags);
|
|
44
|
+
llmCliConfig = resolved.config;
|
|
45
|
+
llmFileConfig = resolved.fileConfig;
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
49
|
+
console.error(`${c.red}${msg}${c.reset}`);
|
|
50
|
+
process.exit(2);
|
|
51
|
+
}
|
|
52
|
+
// TS ne sait pas que `process.exit` ne revient pas — garde explicite.
|
|
53
|
+
if (llmCliConfig === null)
|
|
54
|
+
process.exit(2);
|
|
55
|
+
// Avertissement stderr (toujours visible, même en --json) — l'utilisateur
|
|
56
|
+
// doit savoir que du code va sortir de sa machine. Aucune télémétrie,
|
|
57
|
+
// mais l'opt-in mérite un disclaimer clair à chaque invocation.
|
|
58
|
+
console.error(`${c.yellow}[GitWand] LLM fallback enabled — your code will be sent to "${llmCliConfig.provider}" (model: ${llmCliConfig.model}). Review before commit.${c.reset}`);
|
|
59
|
+
}
|
|
32
60
|
if (!isCIMode) {
|
|
33
61
|
printBanner();
|
|
34
62
|
}
|
|
@@ -60,10 +88,22 @@ export async function cmdResolve(files, flags) {
|
|
|
60
88
|
printLines: isCIMode ? [] : [`${c.red} \u2717 ${file} — file not found${c.reset}`],
|
|
61
89
|
};
|
|
62
90
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
91
|
+
// Rétro-compat : sans `--llm-fallback`, on garde le `resolve()` synchrone
|
|
92
|
+
// — comportement v2.4 intact. Avec le flag, on passe par `resolveAsync()`
|
|
93
|
+
// qui supporte le pattern `llm_proposed` (priorité 998 dans le core).
|
|
94
|
+
const result = llmFallbackEnabled && llmCliConfig !== null
|
|
95
|
+
? await resolveAsync(content, file, {
|
|
96
|
+
verbose: false,
|
|
97
|
+
resolveWhitespace,
|
|
98
|
+
llmFallback: {
|
|
99
|
+
...buildResolveLlmOptions(llmCliConfig, llmFileConfig),
|
|
100
|
+
endpoint: buildLlmEndpoint(llmCliConfig),
|
|
101
|
+
},
|
|
102
|
+
})
|
|
103
|
+
: resolve(content, file, {
|
|
104
|
+
verbose: false,
|
|
105
|
+
resolveWhitespace,
|
|
106
|
+
});
|
|
67
107
|
// Écriture sur disque (sauf dry-run). L'écriture est concurrente entre
|
|
68
108
|
// fichiers distincts, mais chaque fichier n'a qu'un seul writer — il n'y
|
|
69
109
|
// a donc pas de write-race possible tant que les chemins sont distincts.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/commands/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,OAAO,EAAoB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/commands/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Résolution de la configuration LLM côté CLI.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline :
|
|
5
|
+
* 1. lire `.gitwandrc` (ou `.gitwandrc.json`) à la racine du repo Git courant,
|
|
6
|
+
* 2. extraire la section `llmFallback` via `parseGitwandrc` (validation typée),
|
|
7
|
+
* 3. merger avec les flags CLI — les flags CLI ont toujours priorité,
|
|
8
|
+
* 4. retourner un `CliLlmConfig` prêt à passer à `buildLlmEndpoint()`.
|
|
9
|
+
*
|
|
10
|
+
* Le champ `endpoint` n'est jamais lu depuis le fichier (non sérialisable) ;
|
|
11
|
+
* il est construit par `buildLlmEndpoint()` au moment de l'appel.
|
|
12
|
+
*/
|
|
13
|
+
import { type GitWandrcConfig, type LlmFallbackConfig } from "@gitwand/core";
|
|
14
|
+
import { type CliLlmConfig, type CliLlmProvider } from "./llm-endpoint.js";
|
|
15
|
+
/** Liste blanche des providers acceptés par le flag `--llm-provider`. */
|
|
16
|
+
export declare const VALID_PROVIDERS: CliLlmProvider[];
|
|
17
|
+
/**
|
|
18
|
+
* Lit le fichier `.gitwandrc` (ou `.gitwandrc.json`) à la racine du repo
|
|
19
|
+
* git courant et retourne sa config parsée. Retourne `null` si :
|
|
20
|
+
* - on n'est pas dans un repo git,
|
|
21
|
+
* - le fichier n'existe pas,
|
|
22
|
+
* - le contenu est invalide (`parseGitwandrc` renvoie null).
|
|
23
|
+
*
|
|
24
|
+
* Tolérant : ne throw jamais — un fichier illisible ne doit pas faire crasher
|
|
25
|
+
* le CLI. L'utilisateur peut toujours passer la config via les flags.
|
|
26
|
+
*/
|
|
27
|
+
export declare function loadGitwandrcLlmConfig(): GitWandrcConfig["llmFallback"] | null;
|
|
28
|
+
/**
|
|
29
|
+
* Merge `.gitwandrc.llmFallback` (s'il existe) avec les flags CLI.
|
|
30
|
+
*
|
|
31
|
+
* Priorité des sources (de la plus faible à la plus forte) :
|
|
32
|
+
* defaults < `.gitwandrc` < flags CLI
|
|
33
|
+
*
|
|
34
|
+
* Retourne `{ config, fileConfig }` :
|
|
35
|
+
* - `config` : `CliLlmConfig` complet, prêt pour `buildLlmEndpoint()`,
|
|
36
|
+
* - `fileConfig` : la section `.gitwandrc.llmFallback` brute (utile pour
|
|
37
|
+
* propager `minPostMergeScore`, `contextLines`, `minMode` à `resolveAsync`).
|
|
38
|
+
*/
|
|
39
|
+
export declare function resolveLlmConfig(flags: Record<string, boolean | string>): {
|
|
40
|
+
config: CliLlmConfig;
|
|
41
|
+
fileConfig: GitWandrcConfig["llmFallback"] | null;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Construit le bloc `llmFallback` à passer à `resolveAsync()`, en partant de
|
|
45
|
+
* la config fichier (pour `minPostMergeScore`, `contextLines`, `minMode`) et
|
|
46
|
+
* en y attachant les champs essentiels (`enabled: true`, `model`, `maxTokens`,
|
|
47
|
+
* `temperature`).
|
|
48
|
+
*
|
|
49
|
+
* L'`endpoint` lui-même n'est PAS ajouté ici — le caller le branche après
|
|
50
|
+
* via `buildLlmEndpoint(config)`.
|
|
51
|
+
*/
|
|
52
|
+
export declare function buildResolveLlmOptions(cliConfig: CliLlmConfig, fileConfig: GitWandrcConfig["llmFallback"] | null): Omit<LlmFallbackConfig, "endpoint">;
|
|
53
|
+
//# sourceMappingURL=llm-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-config.d.ts","sourceRoot":"","sources":["../src/llm-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAS3B,yEAAyE;AACzE,eAAO,MAAM,eAAe,EAAE,cAAc,EAAmC,CAAC;AAEhF;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,IAAI,eAAe,CAAC,aAAa,CAAC,GAAG,IAAI,CAiB9E;AAmBD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,GACtC;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,eAAe,CAAC,aAAa,CAAC,GAAG,IAAI,CAAA;CAAE,CAiC7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,YAAY,EACvB,UAAU,EAAE,eAAe,CAAC,aAAa,CAAC,GAAG,IAAI,GAChD,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAarC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Résolution de la configuration LLM côté CLI.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline :
|
|
5
|
+
* 1. lire `.gitwandrc` (ou `.gitwandrc.json`) à la racine du repo Git courant,
|
|
6
|
+
* 2. extraire la section `llmFallback` via `parseGitwandrc` (validation typée),
|
|
7
|
+
* 3. merger avec les flags CLI — les flags CLI ont toujours priorité,
|
|
8
|
+
* 4. retourner un `CliLlmConfig` prêt à passer à `buildLlmEndpoint()`.
|
|
9
|
+
*
|
|
10
|
+
* Le champ `endpoint` n'est jamais lu depuis le fichier (non sérialisable) ;
|
|
11
|
+
* il est construit par `buildLlmEndpoint()` au moment de l'appel.
|
|
12
|
+
*/
|
|
13
|
+
import { execSync } from "node:child_process";
|
|
14
|
+
import { readFileSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { parseGitwandrc, } from "@gitwand/core";
|
|
17
|
+
import { DEFAULT_LLM_MAX_TOKENS, DEFAULT_LLM_TEMPERATURE, } from "./llm-endpoint.js";
|
|
18
|
+
/** Modèles par défaut par provider (alignés sur les recommandations v2.5). */
|
|
19
|
+
const DEFAULT_MODELS = {
|
|
20
|
+
claude: "claude-sonnet-4-6",
|
|
21
|
+
openai: "gpt-4o-mini",
|
|
22
|
+
ollama: "llama3",
|
|
23
|
+
};
|
|
24
|
+
/** Liste blanche des providers acceptés par le flag `--llm-provider`. */
|
|
25
|
+
export const VALID_PROVIDERS = ["claude", "openai", "ollama"];
|
|
26
|
+
/**
|
|
27
|
+
* Lit le fichier `.gitwandrc` (ou `.gitwandrc.json`) à la racine du repo
|
|
28
|
+
* git courant et retourne sa config parsée. Retourne `null` si :
|
|
29
|
+
* - on n'est pas dans un repo git,
|
|
30
|
+
* - le fichier n'existe pas,
|
|
31
|
+
* - le contenu est invalide (`parseGitwandrc` renvoie null).
|
|
32
|
+
*
|
|
33
|
+
* Tolérant : ne throw jamais — un fichier illisible ne doit pas faire crasher
|
|
34
|
+
* le CLI. L'utilisateur peut toujours passer la config via les flags.
|
|
35
|
+
*/
|
|
36
|
+
export function loadGitwandrcLlmConfig() {
|
|
37
|
+
const repoRoot = findGitRoot();
|
|
38
|
+
if (repoRoot === null)
|
|
39
|
+
return null;
|
|
40
|
+
for (const filename of [".gitwandrc", ".gitwandrc.json"]) {
|
|
41
|
+
const path = join(repoRoot, filename);
|
|
42
|
+
let content;
|
|
43
|
+
try {
|
|
44
|
+
content = readFileSync(path, "utf-8");
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const parsed = parseGitwandrc(content);
|
|
50
|
+
if (parsed === null)
|
|
51
|
+
continue;
|
|
52
|
+
return parsed.llmFallback ?? null;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Localise la racine du repo git courant via `git rev-parse --show-toplevel`.
|
|
58
|
+
* Retourne `null` si on n'est pas dans un repo ou si git est introuvable —
|
|
59
|
+
* dans ce cas le CLI utilisera uniquement les flags + l'environnement.
|
|
60
|
+
*/
|
|
61
|
+
function findGitRoot() {
|
|
62
|
+
try {
|
|
63
|
+
const out = execSync("git rev-parse --show-toplevel", {
|
|
64
|
+
encoding: "utf-8",
|
|
65
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
66
|
+
}).trim();
|
|
67
|
+
return out.length > 0 ? out : null;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Merge `.gitwandrc.llmFallback` (s'il existe) avec les flags CLI.
|
|
75
|
+
*
|
|
76
|
+
* Priorité des sources (de la plus faible à la plus forte) :
|
|
77
|
+
* defaults < `.gitwandrc` < flags CLI
|
|
78
|
+
*
|
|
79
|
+
* Retourne `{ config, fileConfig }` :
|
|
80
|
+
* - `config` : `CliLlmConfig` complet, prêt pour `buildLlmEndpoint()`,
|
|
81
|
+
* - `fileConfig` : la section `.gitwandrc.llmFallback` brute (utile pour
|
|
82
|
+
* propager `minPostMergeScore`, `contextLines`, `minMode` à `resolveAsync`).
|
|
83
|
+
*/
|
|
84
|
+
export function resolveLlmConfig(flags) {
|
|
85
|
+
const fileConfig = loadGitwandrcLlmConfig();
|
|
86
|
+
const flagProvider = typeof flags["llm-provider"] === "string"
|
|
87
|
+
? flags["llm-provider"]
|
|
88
|
+
: undefined;
|
|
89
|
+
const provider = (() => {
|
|
90
|
+
if (flagProvider !== undefined) {
|
|
91
|
+
if (!VALID_PROVIDERS.includes(flagProvider)) {
|
|
92
|
+
throw new Error(`Invalid --llm-provider "${flagProvider}". Expected one of: ${VALID_PROVIDERS.join(", ")}`);
|
|
93
|
+
}
|
|
94
|
+
return flagProvider;
|
|
95
|
+
}
|
|
96
|
+
return "claude";
|
|
97
|
+
})();
|
|
98
|
+
const flagModel = typeof flags["llm-model"] === "string" ? flags["llm-model"] : undefined;
|
|
99
|
+
const model = flagModel ?? fileConfig?.model ?? DEFAULT_MODELS[provider];
|
|
100
|
+
const maxTokens = fileConfig?.maxTokens ?? DEFAULT_LLM_MAX_TOKENS;
|
|
101
|
+
const temperature = fileConfig?.temperature ?? DEFAULT_LLM_TEMPERATURE;
|
|
102
|
+
// Ollama : permet override URL via env OLLAMA_URL (déjà géré dans llm-endpoint).
|
|
103
|
+
const config = {
|
|
104
|
+
provider,
|
|
105
|
+
model,
|
|
106
|
+
maxTokens,
|
|
107
|
+
temperature,
|
|
108
|
+
};
|
|
109
|
+
return { config, fileConfig };
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Construit le bloc `llmFallback` à passer à `resolveAsync()`, en partant de
|
|
113
|
+
* la config fichier (pour `minPostMergeScore`, `contextLines`, `minMode`) et
|
|
114
|
+
* en y attachant les champs essentiels (`enabled: true`, `model`, `maxTokens`,
|
|
115
|
+
* `temperature`).
|
|
116
|
+
*
|
|
117
|
+
* L'`endpoint` lui-même n'est PAS ajouté ici — le caller le branche après
|
|
118
|
+
* via `buildLlmEndpoint(config)`.
|
|
119
|
+
*/
|
|
120
|
+
export function buildResolveLlmOptions(cliConfig, fileConfig) {
|
|
121
|
+
const out = {
|
|
122
|
+
enabled: true,
|
|
123
|
+
model: cliConfig.model,
|
|
124
|
+
maxTokens: cliConfig.maxTokens ?? DEFAULT_LLM_MAX_TOKENS,
|
|
125
|
+
temperature: cliConfig.temperature ?? DEFAULT_LLM_TEMPERATURE,
|
|
126
|
+
};
|
|
127
|
+
if (fileConfig?.contextLines !== undefined)
|
|
128
|
+
out.contextLines = fileConfig.contextLines;
|
|
129
|
+
if (fileConfig?.minPostMergeScore !== undefined)
|
|
130
|
+
out.minPostMergeScore = fileConfig.minPostMergeScore;
|
|
131
|
+
if (fileConfig?.minMode !== undefined)
|
|
132
|
+
out.minMode = fileConfig.minMode;
|
|
133
|
+
return out;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=llm-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-config.js","sourceRoot":"","sources":["../src/llm-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Endpoints LLM Node — wrappers `fetch` natif (Node 20+) pour les 3 providers
|
|
3
|
+
* supportés par le CLI : Claude (Anthropic), OpenAI, Ollama (local).
|
|
4
|
+
*
|
|
5
|
+
* Le `@gitwand/core` ne fait pas de requête HTTP directe : c'est ici, côté
|
|
6
|
+
* consommateur CLI, que l'on construit un `LlmEndpoint` qui implémente
|
|
7
|
+
* l'interface attendue par `resolveAsync()` (v2.5 — opt-in via `--llm-fallback`).
|
|
8
|
+
*
|
|
9
|
+
* Contrat strict :
|
|
10
|
+
* - aucune dep npm (fetch natif Node 20+),
|
|
11
|
+
* - clés API lues uniquement depuis l'environnement (`ANTHROPIC_API_KEY`,
|
|
12
|
+
* `OPENAI_API_KEY`),
|
|
13
|
+
* - timeout dur 30 s par requête (`AbortSignal.timeout(30000)`),
|
|
14
|
+
* - erreurs HTTP / parse explicitement annotées (status + body tronqué 500c),
|
|
15
|
+
* - jamais de log de la clé API ni du prompt complet.
|
|
16
|
+
*/
|
|
17
|
+
import type { LlmEndpoint } from "@gitwand/core";
|
|
18
|
+
/** Provider supportés par le CLI. */
|
|
19
|
+
export type CliLlmProvider = "claude" | "openai" | "ollama";
|
|
20
|
+
/** Configuration d'un endpoint LLM côté CLI. */
|
|
21
|
+
export interface CliLlmConfig {
|
|
22
|
+
provider: CliLlmProvider;
|
|
23
|
+
model: string;
|
|
24
|
+
/** Clé API : ANTHROPIC_API_KEY / OPENAI_API_KEY. Ignorée pour Ollama. */
|
|
25
|
+
apiKey?: string;
|
|
26
|
+
/** Override URL de base (utile pour Ollama distant). */
|
|
27
|
+
baseUrl?: string;
|
|
28
|
+
/** Plafond tokens dans la réponse LLM. Défaut : 4000. */
|
|
29
|
+
maxTokens?: number;
|
|
30
|
+
/** Température (0.0 = déterministe recommandé). Défaut : 0.0. */
|
|
31
|
+
temperature?: number;
|
|
32
|
+
/** Timeout HTTP en ms. Défaut : 30000. */
|
|
33
|
+
timeoutMs?: number;
|
|
34
|
+
}
|
|
35
|
+
/** Timeout par défaut pour un appel LLM (30 secondes). */
|
|
36
|
+
export declare const DEFAULT_LLM_TIMEOUT_MS = 30000;
|
|
37
|
+
/** Plafond par défaut sur les tokens de réponse. */
|
|
38
|
+
export declare const DEFAULT_LLM_MAX_TOKENS = 4000;
|
|
39
|
+
/** Température par défaut (déterministe). */
|
|
40
|
+
export declare const DEFAULT_LLM_TEMPERATURE = 0;
|
|
41
|
+
/** URL Ollama locale par défaut. */
|
|
42
|
+
export declare const DEFAULT_OLLAMA_URL = "http://localhost:11434";
|
|
43
|
+
/**
|
|
44
|
+
* Construit un `LlmEndpoint` à injecter dans `GitWandOptions.llmFallback.endpoint`.
|
|
45
|
+
*
|
|
46
|
+
* Throw au moment de l'appel (pas à la construction) si la clé API requise
|
|
47
|
+
* manque — permet au CLI d'afficher un message ciblé seulement si un hunk
|
|
48
|
+
* `llm_proposed` survient réellement.
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildLlmEndpoint(config: CliLlmConfig): LlmEndpoint;
|
|
51
|
+
//# sourceMappingURL=llm-endpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-endpoint.d.ts","sourceRoot":"","sources":["../src/llm-endpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,qCAAqC;AACrC,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE5D,gDAAgD;AAChD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,0DAA0D;AAC1D,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAC7C,oDAAoD;AACpD,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,6CAA6C;AAC7C,eAAO,MAAM,uBAAuB,IAAM,CAAC;AAC3C,oCAAoC;AACpC,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAE3D;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,CAalE"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Endpoints LLM Node — wrappers `fetch` natif (Node 20+) pour les 3 providers
|
|
3
|
+
* supportés par le CLI : Claude (Anthropic), OpenAI, Ollama (local).
|
|
4
|
+
*
|
|
5
|
+
* Le `@gitwand/core` ne fait pas de requête HTTP directe : c'est ici, côté
|
|
6
|
+
* consommateur CLI, que l'on construit un `LlmEndpoint` qui implémente
|
|
7
|
+
* l'interface attendue par `resolveAsync()` (v2.5 — opt-in via `--llm-fallback`).
|
|
8
|
+
*
|
|
9
|
+
* Contrat strict :
|
|
10
|
+
* - aucune dep npm (fetch natif Node 20+),
|
|
11
|
+
* - clés API lues uniquement depuis l'environnement (`ANTHROPIC_API_KEY`,
|
|
12
|
+
* `OPENAI_API_KEY`),
|
|
13
|
+
* - timeout dur 30 s par requête (`AbortSignal.timeout(30000)`),
|
|
14
|
+
* - erreurs HTTP / parse explicitement annotées (status + body tronqué 500c),
|
|
15
|
+
* - jamais de log de la clé API ni du prompt complet.
|
|
16
|
+
*/
|
|
17
|
+
/** Timeout par défaut pour un appel LLM (30 secondes). */
|
|
18
|
+
export const DEFAULT_LLM_TIMEOUT_MS = 30_000;
|
|
19
|
+
/** Plafond par défaut sur les tokens de réponse. */
|
|
20
|
+
export const DEFAULT_LLM_MAX_TOKENS = 4000;
|
|
21
|
+
/** Température par défaut (déterministe). */
|
|
22
|
+
export const DEFAULT_LLM_TEMPERATURE = 0.0;
|
|
23
|
+
/** URL Ollama locale par défaut. */
|
|
24
|
+
export const DEFAULT_OLLAMA_URL = "http://localhost:11434";
|
|
25
|
+
/**
|
|
26
|
+
* Construit un `LlmEndpoint` à injecter dans `GitWandOptions.llmFallback.endpoint`.
|
|
27
|
+
*
|
|
28
|
+
* Throw au moment de l'appel (pas à la construction) si la clé API requise
|
|
29
|
+
* manque — permet au CLI d'afficher un message ciblé seulement si un hunk
|
|
30
|
+
* `llm_proposed` survient réellement.
|
|
31
|
+
*/
|
|
32
|
+
export function buildLlmEndpoint(config) {
|
|
33
|
+
return {
|
|
34
|
+
async call(prompt) {
|
|
35
|
+
switch (config.provider) {
|
|
36
|
+
case "claude":
|
|
37
|
+
return callClaude(prompt, config);
|
|
38
|
+
case "openai":
|
|
39
|
+
return callOpenAI(prompt, config);
|
|
40
|
+
case "ollama":
|
|
41
|
+
return callOllama(prompt, config);
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// ─── Anthropic Claude ─────────────────────────────────────────
|
|
47
|
+
const CLAUDE_URL = "https://api.anthropic.com/v1/messages";
|
|
48
|
+
async function callClaude(prompt, config) {
|
|
49
|
+
const apiKey = config.apiKey ?? process.env.ANTHROPIC_API_KEY;
|
|
50
|
+
if (!apiKey || apiKey.length === 0) {
|
|
51
|
+
throw new Error("ANTHROPIC_API_KEY is not set. Required for --llm-provider=claude.");
|
|
52
|
+
}
|
|
53
|
+
const body = {
|
|
54
|
+
model: config.model,
|
|
55
|
+
max_tokens: config.maxTokens ?? DEFAULT_LLM_MAX_TOKENS,
|
|
56
|
+
temperature: config.temperature ?? DEFAULT_LLM_TEMPERATURE,
|
|
57
|
+
messages: [{ role: "user", content: prompt }],
|
|
58
|
+
};
|
|
59
|
+
const res = await postJson(CLAUDE_URL, body, {
|
|
60
|
+
"x-api-key": apiKey,
|
|
61
|
+
"anthropic-version": "2023-06-01",
|
|
62
|
+
"content-type": "application/json",
|
|
63
|
+
}, config.timeoutMs);
|
|
64
|
+
const parsed = await parseJsonResponse(res, "claude");
|
|
65
|
+
// Claude API response shape: { content: [ { type: "text", text: "…" } ], … }
|
|
66
|
+
const first = Array.isArray(parsed?.content) ? parsed.content[0] : undefined;
|
|
67
|
+
const text = first && typeof first === "object" && typeof first.text === "string"
|
|
68
|
+
? first.text
|
|
69
|
+
: null;
|
|
70
|
+
if (text === null) {
|
|
71
|
+
throw new Error("Claude response did not contain content[0].text");
|
|
72
|
+
}
|
|
73
|
+
return text;
|
|
74
|
+
}
|
|
75
|
+
// ─── OpenAI ──────────────────────────────────────────────────
|
|
76
|
+
const OPENAI_URL = "https://api.openai.com/v1/chat/completions";
|
|
77
|
+
async function callOpenAI(prompt, config) {
|
|
78
|
+
const apiKey = config.apiKey ?? process.env.OPENAI_API_KEY;
|
|
79
|
+
if (!apiKey || apiKey.length === 0) {
|
|
80
|
+
throw new Error("OPENAI_API_KEY is not set. Required for --llm-provider=openai.");
|
|
81
|
+
}
|
|
82
|
+
const body = {
|
|
83
|
+
model: config.model,
|
|
84
|
+
max_tokens: config.maxTokens ?? DEFAULT_LLM_MAX_TOKENS,
|
|
85
|
+
temperature: config.temperature ?? DEFAULT_LLM_TEMPERATURE,
|
|
86
|
+
messages: [{ role: "user", content: prompt }],
|
|
87
|
+
};
|
|
88
|
+
const res = await postJson(OPENAI_URL, body, {
|
|
89
|
+
Authorization: `Bearer ${apiKey}`,
|
|
90
|
+
"content-type": "application/json",
|
|
91
|
+
}, config.timeoutMs);
|
|
92
|
+
const parsed = await parseJsonResponse(res, "openai");
|
|
93
|
+
// OpenAI chat completions: { choices: [ { message: { content: "…" } } ], … }
|
|
94
|
+
const choice = Array.isArray(parsed?.choices) ? parsed.choices[0] : undefined;
|
|
95
|
+
const text = choice &&
|
|
96
|
+
typeof choice === "object" &&
|
|
97
|
+
choice.message &&
|
|
98
|
+
typeof choice.message.content === "string"
|
|
99
|
+
? choice.message.content
|
|
100
|
+
: null;
|
|
101
|
+
if (text === null) {
|
|
102
|
+
throw new Error("OpenAI response did not contain choices[0].message.content");
|
|
103
|
+
}
|
|
104
|
+
return text;
|
|
105
|
+
}
|
|
106
|
+
// ─── Ollama (local) ──────────────────────────────────────────
|
|
107
|
+
async function callOllama(prompt, config) {
|
|
108
|
+
const baseUrl = (config.baseUrl ?? process.env.OLLAMA_URL ?? DEFAULT_OLLAMA_URL).replace(/\/+$/, "");
|
|
109
|
+
const url = `${baseUrl}/api/chat`;
|
|
110
|
+
const body = {
|
|
111
|
+
model: config.model,
|
|
112
|
+
messages: [{ role: "user", content: prompt }],
|
|
113
|
+
options: {
|
|
114
|
+
temperature: config.temperature ?? DEFAULT_LLM_TEMPERATURE,
|
|
115
|
+
num_predict: config.maxTokens ?? DEFAULT_LLM_MAX_TOKENS,
|
|
116
|
+
},
|
|
117
|
+
stream: false,
|
|
118
|
+
};
|
|
119
|
+
const res = await postJson(url, body, { "content-type": "application/json" }, config.timeoutMs);
|
|
120
|
+
const parsed = await parseJsonResponse(res, "ollama");
|
|
121
|
+
// Ollama /api/chat response: { message: { role: "assistant", content: "…" }, … }
|
|
122
|
+
const text = parsed?.message && typeof parsed.message === "object" && typeof parsed.message.content === "string"
|
|
123
|
+
? parsed.message.content
|
|
124
|
+
: null;
|
|
125
|
+
if (text === null) {
|
|
126
|
+
throw new Error("Ollama response did not contain message.content");
|
|
127
|
+
}
|
|
128
|
+
return text;
|
|
129
|
+
}
|
|
130
|
+
// ─── Helpers HTTP partagés ───────────────────────────────────
|
|
131
|
+
/**
|
|
132
|
+
* POST JSON helper avec timeout via `AbortSignal.timeout`. Renvoie la
|
|
133
|
+
* `Response` brute pour permettre à l'appelant de parser ou inspecter
|
|
134
|
+
* `status` selon ses besoins.
|
|
135
|
+
*
|
|
136
|
+
* @throws Error si la réponse a un status non-2xx ou si le fetch échoue
|
|
137
|
+
* (réseau, timeout). Le corps de réponse est tronqué à 500c
|
|
138
|
+
* dans le message d'erreur — jamais le prompt complet.
|
|
139
|
+
*/
|
|
140
|
+
async function postJson(url, body, headers, timeoutMs) {
|
|
141
|
+
let res;
|
|
142
|
+
try {
|
|
143
|
+
res = await fetch(url, {
|
|
144
|
+
method: "POST",
|
|
145
|
+
headers,
|
|
146
|
+
body: JSON.stringify(body),
|
|
147
|
+
signal: AbortSignal.timeout(timeoutMs ?? DEFAULT_LLM_TIMEOUT_MS),
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
152
|
+
throw new Error(`LLM request to ${url} failed: ${msg}`);
|
|
153
|
+
}
|
|
154
|
+
if (!res.ok) {
|
|
155
|
+
let bodySnippet = "";
|
|
156
|
+
try {
|
|
157
|
+
const text = await res.text();
|
|
158
|
+
bodySnippet = text.length > 500 ? `${text.slice(0, 500)}…` : text;
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
bodySnippet = "<unable to read response body>";
|
|
162
|
+
}
|
|
163
|
+
throw new Error(`LLM request to ${url} returned HTTP ${res.status}: ${bodySnippet}`);
|
|
164
|
+
}
|
|
165
|
+
return res;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Parse le `Response.body` en JSON. Throw un message explicite (avec le nom
|
|
169
|
+
* du provider) si le parse échoue — utile pour distinguer un Ollama down
|
|
170
|
+
* d'un Claude qui renvoie 200 + HTML.
|
|
171
|
+
*/
|
|
172
|
+
async function parseJsonResponse(res, provider) {
|
|
173
|
+
let text;
|
|
174
|
+
try {
|
|
175
|
+
text = await res.text();
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
179
|
+
throw new Error(`Failed to read ${provider} response body: ${msg}`);
|
|
180
|
+
}
|
|
181
|
+
try {
|
|
182
|
+
return JSON.parse(text);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
const snippet = text.length > 500 ? `${text.slice(0, 500)}…` : text;
|
|
186
|
+
throw new Error(`Failed to parse ${provider} response as JSON: ${snippet}`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=llm-endpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-endpoint.js","sourceRoot":"","sources":["../src/llm-endpoint.ts"],"names":[],"mappings":"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"}
|
package/dist/reporting.d.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* des utilisateurs — toute évolution doit être versionnée via le champ
|
|
10
10
|
* `version`.
|
|
11
11
|
*/
|
|
12
|
-
import type { MergeResult } from "@gitwand/core";
|
|
12
|
+
import type { LlmTrace, MergeResult } from "@gitwand/core";
|
|
13
13
|
/** Forme stable du rapport JSON émis par `gitwand resolve --ci`. */
|
|
14
14
|
export interface CIReport {
|
|
15
15
|
version: string;
|
|
@@ -52,6 +52,11 @@ export interface CIReport {
|
|
|
52
52
|
reason: string;
|
|
53
53
|
}>;
|
|
54
54
|
};
|
|
55
|
+
/**
|
|
56
|
+
* v2.5 — Trace LLM, présente uniquement quand `type === "llm_proposed"`.
|
|
57
|
+
* Audit trail intégral : modèle, latence, hash prompt, score validation.
|
|
58
|
+
*/
|
|
59
|
+
llmTrace?: LlmTrace;
|
|
55
60
|
}>;
|
|
56
61
|
pendingHunks: Array<{
|
|
57
62
|
line: number;
|
package/dist/reporting.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporting.d.ts","sourceRoot":"","sources":["../src/reporting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"reporting.d.ts","sourceRoot":"","sources":["../src/reporting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE3D,oEAAoE;AACpE,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE;YACV,OAAO,EAAE,OAAO,CAAC;YACjB,kBAAkB,EAAE,OAAO,CAAC;YAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;SAC5B,CAAC;QACF,WAAW,EAAE,KAAK,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,OAAO,CAAC;YAClB,WAAW,EAAE,MAAM,CAAC;YACpB,UAAU,EAAE;gBACV,OAAO,EAAE,MAAM,CAAC;gBAChB,kBAAkB,EAAE,MAAM,CAAC;gBAC3B,QAAQ,EAAE,MAAM,CAAC;gBACjB,WAAW,EAAE,MAAM,CAAC;aACrB,CAAC;YACF,KAAK,EAAE;gBACL,QAAQ,EAAE,MAAM,CAAC;gBACjB,OAAO,EAAE,OAAO,CAAC;gBACjB,OAAO,EAAE,MAAM,CAAC;gBAChB,KAAK,EAAE,KAAK,CAAC;oBACX,IAAI,EAAE,MAAM,CAAC;oBACb,MAAM,EAAE,OAAO,CAAC;oBAChB,MAAM,EAAE,MAAM,CAAC;iBAChB,CAAC,CAAC;aACJ,CAAC;YACF;;;eAGG;YACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;SACrB,CAAC,CAAC;QACH,YAAY,EAAE,KAAK,CAAC;YAClB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,MAAM,CAAC;YACf,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE;gBACV,OAAO,EAAE,MAAM,CAAC;gBAChB,kBAAkB,EAAE,MAAM,CAAC;gBAC3B,QAAQ,EAAE,MAAM,CAAC;gBACjB,WAAW,EAAE,MAAM,CAAC;aACrB,CAAC;YACF,KAAK,EAAE;gBACL,QAAQ,EAAE,MAAM,CAAC;gBACjB,OAAO,EAAE,OAAO,CAAC;gBACjB,OAAO,EAAE,MAAM,CAAC;gBAChB,KAAK,EAAE,KAAK,CAAC;oBACX,IAAI,EAAE,MAAM,CAAC;oBACb,MAAM,EAAE,OAAO,CAAC;oBAChB,MAAM,EAAE,MAAM,CAAC;iBAChB,CAAC,CAAC;aACJ,CAAC;SACH,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC,GACpD,QAAQ,CAmFV"}
|
package/dist/reporting.js
CHANGED
|
@@ -52,6 +52,8 @@ export function buildCIReport(results) {
|
|
|
52
52
|
reason: s.reason,
|
|
53
53
|
})),
|
|
54
54
|
},
|
|
55
|
+
// v2.5 — clé optionnelle, présente uniquement pour les hunks `llm_proposed`.
|
|
56
|
+
...(r.hunk.trace.llmTrace ? { llmTrace: r.hunk.trace.llmTrace } : {}),
|
|
55
57
|
})),
|
|
56
58
|
pendingHunks: result.resolutions
|
|
57
59
|
.filter((r) => !r.autoResolved)
|
package/dist/reporting.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporting.js","sourceRoot":"","sources":["../src/reporting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"reporting.js","sourceRoot":"","sources":["../src/reporting.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gitwand/cli",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.4",
|
|
4
4
|
"description": "GitWand CLI — resolve Git conflicts from your terminal or CI pipeline",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -34,16 +34,19 @@
|
|
|
34
34
|
"access": "public"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@gitwand/core": "2.8.
|
|
37
|
+
"@gitwand/core": "2.8.4"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/node": "^25.5.0",
|
|
41
|
-
"typescript": "^5.4.0"
|
|
41
|
+
"typescript": "^5.4.0",
|
|
42
|
+
"vitest": "^3.0.0"
|
|
42
43
|
},
|
|
43
44
|
"author": "Laurent Guitton <lb.guitton@gmail.com>",
|
|
44
45
|
"license": "MIT",
|
|
45
46
|
"scripts": {
|
|
46
47
|
"build": "tsc",
|
|
48
|
+
"test": "vitest run",
|
|
49
|
+
"test:watch": "vitest",
|
|
47
50
|
"clean": "rm -rf dist"
|
|
48
51
|
}
|
|
49
52
|
}
|