@maxanatsko/llm-cli-bridge 3.1.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/LICENSE +26 -0
- package/README.md +203 -0
- package/dist/backends/codex.d.ts +37 -0
- package/dist/backends/codex.d.ts.map +1 -0
- package/dist/backends/codex.js +438 -0
- package/dist/backends/codex.js.map +1 -0
- package/dist/backends/gemini.d.ts +17 -0
- package/dist/backends/gemini.d.ts.map +1 -0
- package/dist/backends/gemini.js +174 -0
- package/dist/backends/gemini.js.map +1 -0
- package/dist/backends/index.d.ts +8 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +9 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/registry.d.ts +33 -0
- package/dist/backends/registry.d.ts.map +1 -0
- package/dist/backends/registry.js +80 -0
- package/dist/backends/registry.js.map +1 -0
- package/dist/backends/types.d.ts +61 -0
- package/dist/backends/types.d.ts.map +1 -0
- package/dist/backends/types.js +5 -0
- package/dist/backends/types.js.map +1 -0
- package/dist/constants.d.ts +223 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +228 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +192 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/ask.tool.d.ts +4 -0
- package/dist/tools/ask.tool.d.ts.map +1 -0
- package/dist/tools/ask.tool.js +113 -0
- package/dist/tools/ask.tool.js.map +1 -0
- package/dist/tools/brainstorm.tool.d.ts +3 -0
- package/dist/tools/brainstorm.tool.d.ts.map +1 -0
- package/dist/tools/brainstorm.tool.js +250 -0
- package/dist/tools/brainstorm.tool.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +13 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +42 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +85 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/review-code.tool.d.ts +3 -0
- package/dist/tools/review-code.tool.d.ts.map +1 -0
- package/dist/tools/review-code.tool.js +279 -0
- package/dist/tools/review-code.tool.js.map +1 -0
- package/dist/tools/test-tool.example.d.ts +13 -0
- package/dist/tools/test-tool.example.d.ts.map +1 -0
- package/dist/tools/test-tool.example.js +32 -0
- package/dist/tools/test-tool.example.js.map +1 -0
- package/dist/tools/timeout-test.tool.d.ts +3 -0
- package/dist/tools/timeout-test.tool.d.ts.map +1 -0
- package/dist/tools/timeout-test.tool.js +38 -0
- package/dist/tools/timeout-test.tool.js.map +1 -0
- package/dist/utils/askSessionManager.d.ts +59 -0
- package/dist/utils/askSessionManager.d.ts.map +1 -0
- package/dist/utils/askSessionManager.js +123 -0
- package/dist/utils/askSessionManager.js.map +1 -0
- package/dist/utils/brainstormSessionManager.d.ts +67 -0
- package/dist/utils/brainstormSessionManager.d.ts.map +1 -0
- package/dist/utils/brainstormSessionManager.js +174 -0
- package/dist/utils/brainstormSessionManager.js.map +1 -0
- package/dist/utils/changeModeInstructions.d.ts +17 -0
- package/dist/utils/changeModeInstructions.d.ts.map +1 -0
- package/dist/utils/changeModeInstructions.js +100 -0
- package/dist/utils/changeModeInstructions.js.map +1 -0
- package/dist/utils/changeModeParser.d.ts +15 -0
- package/dist/utils/changeModeParser.d.ts.map +1 -0
- package/dist/utils/changeModeParser.js +81 -0
- package/dist/utils/changeModeParser.js.map +1 -0
- package/dist/utils/changeModeTranslator.d.ts +4 -0
- package/dist/utils/changeModeTranslator.d.ts.map +1 -0
- package/dist/utils/changeModeTranslator.js +42 -0
- package/dist/utils/changeModeTranslator.js.map +1 -0
- package/dist/utils/commandExecutor.d.ts +2 -0
- package/dist/utils/commandExecutor.d.ts.map +1 -0
- package/dist/utils/commandExecutor.js +76 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/envAllowlist.d.ts +17 -0
- package/dist/utils/envAllowlist.d.ts.map +1 -0
- package/dist/utils/envAllowlist.js +54 -0
- package/dist/utils/envAllowlist.js.map +1 -0
- package/dist/utils/geminiExecutor.d.ts +3 -0
- package/dist/utils/geminiExecutor.d.ts.map +1 -0
- package/dist/utils/geminiExecutor.js +94 -0
- package/dist/utils/geminiExecutor.js.map +1 -0
- package/dist/utils/gitStateDetector.d.ts +32 -0
- package/dist/utils/gitStateDetector.d.ts.map +1 -0
- package/dist/utils/gitStateDetector.js +68 -0
- package/dist/utils/gitStateDetector.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +42 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/reviewFormatter.d.ts +35 -0
- package/dist/utils/reviewFormatter.d.ts.map +1 -0
- package/dist/utils/reviewFormatter.js +201 -0
- package/dist/utils/reviewFormatter.js.map +1 -0
- package/dist/utils/reviewPromptBuilder.d.ts +43 -0
- package/dist/utils/reviewPromptBuilder.d.ts.map +1 -0
- package/dist/utils/reviewPromptBuilder.js +170 -0
- package/dist/utils/reviewPromptBuilder.js.map +1 -0
- package/dist/utils/reviewResponseParser.d.ts +20 -0
- package/dist/utils/reviewResponseParser.d.ts.map +1 -0
- package/dist/utils/reviewResponseParser.js +149 -0
- package/dist/utils/reviewResponseParser.js.map +1 -0
- package/dist/utils/reviewSessionCache.d.ts +81 -0
- package/dist/utils/reviewSessionCache.d.ts.map +1 -0
- package/dist/utils/reviewSessionCache.js +220 -0
- package/dist/utils/reviewSessionCache.js.map +1 -0
- package/dist/utils/reviewSessionManager.d.ts +52 -0
- package/dist/utils/reviewSessionManager.d.ts.map +1 -0
- package/dist/utils/reviewSessionManager.js +65 -0
- package/dist/utils/reviewSessionManager.js.map +1 -0
- package/dist/utils/sessionManager.d.ts +95 -0
- package/dist/utils/sessionManager.d.ts.map +1 -0
- package/dist/utils/sessionManager.js +382 -0
- package/dist/utils/sessionManager.js.map +1 -0
- package/dist/utils/sessionSchemas.d.ts +140 -0
- package/dist/utils/sessionSchemas.d.ts.map +1 -0
- package/dist/utils/sessionSchemas.js +2 -0
- package/dist/utils/sessionSchemas.js.map +1 -0
- package/dist/utils/timeoutManager.d.ts +2 -0
- package/dist/utils/timeoutManager.d.ts.map +1 -0
- package/dist/utils/timeoutManager.js +2 -0
- package/dist/utils/timeoutManager.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envAllowlist.d.ts","sourceRoot":"","sources":["../../src/utils/envAllowlist.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAuClE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Variable Allowlist
|
|
3
|
+
*
|
|
4
|
+
* Only pass a curated set of environment variables to spawned processes.
|
|
5
|
+
* This prevents leaking sensitive credentials and improves security.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Returns an allowlisted subset of environment variables for spawned processes.
|
|
9
|
+
*
|
|
10
|
+
* Includes:
|
|
11
|
+
* - PATH, HOME, LANG, TERM - Basic shell operation
|
|
12
|
+
* - HTTP_PROXY, HTTPS_PROXY, NO_PROXY, http_proxy, https_proxy, no_proxy - Corporate proxy support
|
|
13
|
+
* - GEMINI_API_KEY, OPENAI_API_KEY - CLI-specific auth
|
|
14
|
+
* - XDG_* - Linux standard directories
|
|
15
|
+
*/
|
|
16
|
+
export function getAllowedEnv() {
|
|
17
|
+
const allowlist = [
|
|
18
|
+
// Basic shell operation
|
|
19
|
+
'PATH',
|
|
20
|
+
'HOME',
|
|
21
|
+
'LANG',
|
|
22
|
+
'TERM',
|
|
23
|
+
'USER',
|
|
24
|
+
'SHELL',
|
|
25
|
+
// Windows standard directories
|
|
26
|
+
'USERPROFILE',
|
|
27
|
+
'APPDATA',
|
|
28
|
+
'LOCALAPPDATA',
|
|
29
|
+
// Proxy support (critical for corporate environments)
|
|
30
|
+
'HTTP_PROXY',
|
|
31
|
+
'HTTPS_PROXY',
|
|
32
|
+
'NO_PROXY',
|
|
33
|
+
'http_proxy', // Some tools use lowercase
|
|
34
|
+
'https_proxy',
|
|
35
|
+
'no_proxy',
|
|
36
|
+
// CLI-specific authentication
|
|
37
|
+
'GEMINI_API_KEY',
|
|
38
|
+
'OPENAI_API_KEY',
|
|
39
|
+
// XDG directories (Linux standard)
|
|
40
|
+
'XDG_CONFIG_HOME',
|
|
41
|
+
'XDG_DATA_HOME',
|
|
42
|
+
'XDG_CACHE_HOME',
|
|
43
|
+
// Node.js
|
|
44
|
+
'NODE_ENV',
|
|
45
|
+
];
|
|
46
|
+
const env = {};
|
|
47
|
+
for (const key of allowlist) {
|
|
48
|
+
if (process.env[key] !== undefined) {
|
|
49
|
+
env[key] = process.env[key];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return env;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=envAllowlist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envAllowlist.js","sourceRoot":"","sources":["../../src/utils/envAllowlist.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,SAAS,GAAG;QAChB,wBAAwB;QACxB,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,MAAM;QACN,OAAO;QACP,+BAA+B;QAC/B,aAAa;QACb,SAAS;QACT,cAAc;QACd,sDAAsD;QACtD,YAAY;QACZ,aAAa;QACb,UAAU;QACV,YAAY,EAAG,2BAA2B;QAC1C,aAAa;QACb,UAAU;QACV,8BAA8B;QAC9B,gBAAgB;QAChB,gBAAgB;QAChB,mCAAmC;QACnC,iBAAiB;QACjB,eAAe;QACf,gBAAgB;QAChB,UAAU;QACV,UAAU;KACX,CAAC;IAEF,MAAM,GAAG,GAAuC,EAAE,CAAC;IACnD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACnC,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare function executeGeminiCLI(prompt: string, model?: string, sandbox?: boolean, changeMode?: boolean, onProgress?: (newOutput: string) => void, allowedTools?: string[], cwd?: string): Promise<string>;
|
|
2
|
+
export declare function processChangeModeOutput(rawResult: string): string;
|
|
3
|
+
//# sourceMappingURL=geminiExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geminiExecutor.d.ts","sourceRoot":"","sources":["../../src/utils/geminiExecutor.ts"],"names":[],"mappings":"AAcA,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,EACjB,UAAU,CAAC,EAAE,OAAO,EACpB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,EACxC,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAkEjB;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAwBjE"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { executeCommand } from './commandExecutor.js';
|
|
2
|
+
import { Logger } from './logger.js';
|
|
3
|
+
import { ERROR_MESSAGES, STATUS_MESSAGES, MODELS, CLI, GEMINI_MODEL_ALIASES } from '../constants.js';
|
|
4
|
+
import { parseChangeModeOutput, validateChangeModeEdits } from './changeModeParser.js';
|
|
5
|
+
import { formatChangeModeResponse, summarizeChangeModeEdits } from './changeModeTranslator.js';
|
|
6
|
+
import { getChangeModeInstructions } from './changeModeInstructions.js';
|
|
7
|
+
export async function executeGeminiCLI(prompt, model, sandbox, changeMode, onProgress, allowedTools, cwd) {
|
|
8
|
+
let prompt_processed = prompt;
|
|
9
|
+
const resolvedModel = model ? (GEMINI_MODEL_ALIASES[model] || model) : MODELS.PRO_3;
|
|
10
|
+
if (changeMode) {
|
|
11
|
+
prompt_processed = prompt.replace(/file:(\S+)/g, '@$1');
|
|
12
|
+
prompt_processed = getChangeModeInstructions(prompt_processed);
|
|
13
|
+
}
|
|
14
|
+
const args = [];
|
|
15
|
+
args.push(CLI.FLAGS.MODEL, resolvedModel);
|
|
16
|
+
if (sandbox) {
|
|
17
|
+
args.push(CLI.FLAGS.SANDBOX);
|
|
18
|
+
}
|
|
19
|
+
// Add allowed tools for auto-approval (e.g., run_shell_command for git commands)
|
|
20
|
+
if (allowedTools && allowedTools.length > 0) {
|
|
21
|
+
for (const tool of allowedTools) {
|
|
22
|
+
args.push(CLI.FLAGS.ALLOWED_TOOLS, tool);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Ensure @ symbols work cross-platform by wrapping in quotes if needed
|
|
26
|
+
const finalPrompt = prompt_processed.includes('@') && !prompt_processed.startsWith('"')
|
|
27
|
+
? `"${prompt_processed}"`
|
|
28
|
+
: prompt_processed;
|
|
29
|
+
args.push(CLI.FLAGS.PROMPT, finalPrompt);
|
|
30
|
+
try {
|
|
31
|
+
return await executeCommand(CLI.COMMANDS.GEMINI, args, onProgress, cwd);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
35
|
+
if (errorMessage.includes(ERROR_MESSAGES.QUOTA_EXCEEDED) && resolvedModel !== MODELS.FLASH) {
|
|
36
|
+
Logger.warn(`${ERROR_MESSAGES.QUOTA_EXCEEDED}. Falling back to ${MODELS.FLASH}.`);
|
|
37
|
+
await sendStatusMessage(STATUS_MESSAGES.FLASH_RETRY);
|
|
38
|
+
const fallbackArgs = [];
|
|
39
|
+
fallbackArgs.push(CLI.FLAGS.MODEL, MODELS.FLASH);
|
|
40
|
+
if (sandbox) {
|
|
41
|
+
fallbackArgs.push(CLI.FLAGS.SANDBOX);
|
|
42
|
+
}
|
|
43
|
+
// Include allowed tools in fallback as well
|
|
44
|
+
if (allowedTools && allowedTools.length > 0) {
|
|
45
|
+
for (const tool of allowedTools) {
|
|
46
|
+
fallbackArgs.push(CLI.FLAGS.ALLOWED_TOOLS, tool);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Same @ symbol handling for fallback
|
|
50
|
+
const fallbackPrompt = prompt_processed.includes('@') && !prompt_processed.startsWith('"')
|
|
51
|
+
? `"${prompt_processed}"`
|
|
52
|
+
: prompt_processed;
|
|
53
|
+
fallbackArgs.push(CLI.FLAGS.PROMPT, fallbackPrompt);
|
|
54
|
+
try {
|
|
55
|
+
const result = await executeCommand(CLI.COMMANDS.GEMINI, fallbackArgs, onProgress, cwd);
|
|
56
|
+
Logger.warn(`Successfully executed with ${MODELS.FLASH} fallback.`);
|
|
57
|
+
await sendStatusMessage(STATUS_MESSAGES.FLASH_SUCCESS);
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
catch (fallbackError) {
|
|
61
|
+
const fallbackErrorMessage = fallbackError instanceof Error ? fallbackError.message : String(fallbackError);
|
|
62
|
+
throw new Error(`${resolvedModel} quota exceeded, ${MODELS.FLASH} fallback also failed: ${fallbackErrorMessage}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export function processChangeModeOutput(rawResult) {
|
|
71
|
+
// Parse OLD/NEW format
|
|
72
|
+
const edits = parseChangeModeOutput(rawResult);
|
|
73
|
+
if (edits.length === 0) {
|
|
74
|
+
return `No edits found in Gemini's response. Please ensure Gemini uses the OLD/NEW format.\n\n${rawResult}`;
|
|
75
|
+
}
|
|
76
|
+
// Validate edits
|
|
77
|
+
const validation = validateChangeModeEdits(edits);
|
|
78
|
+
if (!validation.valid) {
|
|
79
|
+
return `Edit validation failed:\n${validation.errors.join('\n')}`;
|
|
80
|
+
}
|
|
81
|
+
// Format the response
|
|
82
|
+
let result = formatChangeModeResponse(edits);
|
|
83
|
+
// Add summary if many edits
|
|
84
|
+
if (edits.length > 5) {
|
|
85
|
+
result = summarizeChangeModeEdits(edits) + '\n\n' + result;
|
|
86
|
+
}
|
|
87
|
+
Logger.debug(`ChangeMode: Parsed ${edits.length} edits`);
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
// Placeholder
|
|
91
|
+
async function sendStatusMessage(message) {
|
|
92
|
+
Logger.debug(`Status: ${message}`);
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=geminiExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geminiExecutor.js","sourceRoot":"","sources":["../../src/utils/geminiExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,cAAc,EACd,eAAe,EACf,MAAM,EACN,GAAG,EACH,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAc,EACd,KAAc,EACd,OAAiB,EACjB,UAAoB,EACpB,UAAwC,EACxC,YAAuB,EACvB,GAAY;IAEZ,IAAI,gBAAgB,GAAG,MAAM,CAAC;IAC9B,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IAEpF,IAAI,UAAU,EAAE,CAAC;QACf,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QACxD,gBAAgB,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAC1C,IAAI,OAAO,EAAE,CAAC;QAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IAE9C,iFAAiF;IACjF,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC;QACrF,CAAC,CAAC,IAAI,gBAAgB,GAAG;QACzB,CAAC,CAAC,gBAAgB,CAAC;IAErB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEzC,IAAI,CAAC;QACH,OAAO,MAAM,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IAC1E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,IAAI,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,aAAa,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;YAC3F,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,cAAc,qBAAqB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;YAClF,MAAM,iBAAiB,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;YACrD,MAAM,YAAY,GAAG,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACjD,IAAI,OAAO,EAAE,CAAC;gBACZ,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;YAED,4CAA4C;YAC5C,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;oBAChC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;YAED,sCAAsC;YACtC,MAAM,cAAc,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC;gBACxF,CAAC,CAAC,IAAI,gBAAgB,GAAG;gBACzB,CAAC,CAAC,gBAAgB,CAAC;YAErB,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YACpD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;gBACxF,MAAM,CAAC,IAAI,CAAC,8BAA8B,MAAM,CAAC,KAAK,YAAY,CAAC,CAAC;gBACpE,MAAM,iBAAiB,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;gBACvD,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,aAAa,EAAE,CAAC;gBACvB,MAAM,oBAAoB,GAAG,aAAa,YAAY,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBAC5G,MAAM,IAAI,KAAK,CAAC,GAAG,aAAa,oBAAoB,MAAM,CAAC,KAAK,0BAA0B,oBAAoB,EAAE,CAAC,CAAC;YACpH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,SAAiB;IACvD,uBAAuB;IACvB,MAAM,KAAK,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAE/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,yFAAyF,SAAS,EAAE,CAAC;IAC9G,CAAC;IAED,iBAAiB;IACjB,MAAM,UAAU,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,4BAA4B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACpE,CAAC;IAED,sBAAsB;IACtB,IAAI,MAAM,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAE7C,4BAA4B;IAC5B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,GAAG,wBAAwB,CAAC,KAAK,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;IAC7D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,sBAAsB,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,cAAc;AACd,KAAK,UAAU,iBAAiB,CAAC,OAAe;IAC9C,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface GitState {
|
|
2
|
+
branch: string;
|
|
3
|
+
commitHash: string;
|
|
4
|
+
workingTreeClean: boolean;
|
|
5
|
+
hasUncommittedChanges: boolean;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Gets the current git state of the repository
|
|
10
|
+
* Executes git commands in parallel for better performance
|
|
11
|
+
* @param cwd Optional working directory to run git commands in
|
|
12
|
+
* @returns GitState object with branch, commit, and status info
|
|
13
|
+
*/
|
|
14
|
+
export declare function getCurrentGitState(cwd?: string): Promise<GitState>;
|
|
15
|
+
/**
|
|
16
|
+
* Generates a session ID from git state
|
|
17
|
+
* Format: review-{branch}-{shortHash}
|
|
18
|
+
* @param gitState The git state to generate ID from
|
|
19
|
+
* @returns Session ID string
|
|
20
|
+
*/
|
|
21
|
+
export declare function generateSessionId(gitState: GitState): string;
|
|
22
|
+
/**
|
|
23
|
+
* Checks if a session can continue based on git state comparison
|
|
24
|
+
* @param currentGitState Current git state
|
|
25
|
+
* @param sessionGitState Git state from existing session
|
|
26
|
+
* @returns Object indicating if continuation is allowed and reason if not
|
|
27
|
+
*/
|
|
28
|
+
export declare function detectSessionContinuation(currentGitState: GitState, sessionGitState: GitState): {
|
|
29
|
+
canContinue: boolean;
|
|
30
|
+
reason?: string;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=gitStateDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitStateDetector.d.ts","sourceRoot":"","sources":["../../src/utils/gitStateDetector.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsBxE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAK5D;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,QAAQ,EACzB,eAAe,EAAE,QAAQ,GACxB;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAsB3C"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { executeCommand } from './commandExecutor.js';
|
|
2
|
+
import { Logger } from './logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Gets the current git state of the repository
|
|
5
|
+
* Executes git commands in parallel for better performance
|
|
6
|
+
* @param cwd Optional working directory to run git commands in
|
|
7
|
+
* @returns GitState object with branch, commit, and status info
|
|
8
|
+
*/
|
|
9
|
+
export async function getCurrentGitState(cwd) {
|
|
10
|
+
try {
|
|
11
|
+
// Execute git commands in parallel for better performance
|
|
12
|
+
const [branch, commitHash, statusOutput] = await Promise.all([
|
|
13
|
+
executeCommand('git', ['rev-parse', '--abbrev-ref', 'HEAD'], undefined, cwd),
|
|
14
|
+
executeCommand('git', ['rev-parse', 'HEAD'], undefined, cwd),
|
|
15
|
+
executeCommand('git', ['status', '--porcelain'], undefined, cwd)
|
|
16
|
+
]);
|
|
17
|
+
const workingTreeClean = statusOutput.trim() === '';
|
|
18
|
+
return {
|
|
19
|
+
branch: branch.trim(),
|
|
20
|
+
commitHash: commitHash.trim(),
|
|
21
|
+
workingTreeClean,
|
|
22
|
+
hasUncommittedChanges: !workingTreeClean,
|
|
23
|
+
timestamp: Date.now()
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
Logger.error(`Failed to get git state: ${error}`);
|
|
28
|
+
throw new Error(`Git state detection failed. Ensure you're in a git repository: ${error}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generates a session ID from git state
|
|
33
|
+
* Format: review-{branch}-{shortHash}
|
|
34
|
+
* @param gitState The git state to generate ID from
|
|
35
|
+
* @returns Session ID string
|
|
36
|
+
*/
|
|
37
|
+
export function generateSessionId(gitState) {
|
|
38
|
+
const shortHash = gitState.commitHash.slice(0, 8);
|
|
39
|
+
// Sanitize branch name for filesystem safety
|
|
40
|
+
const safeBranch = gitState.branch.replace(/[^a-zA-Z0-9-_]/g, '-');
|
|
41
|
+
return `review-${safeBranch}-${shortHash}`;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Checks if a session can continue based on git state comparison
|
|
45
|
+
* @param currentGitState Current git state
|
|
46
|
+
* @param sessionGitState Git state from existing session
|
|
47
|
+
* @returns Object indicating if continuation is allowed and reason if not
|
|
48
|
+
*/
|
|
49
|
+
export function detectSessionContinuation(currentGitState, sessionGitState) {
|
|
50
|
+
// Same branch and commit = auto-continue
|
|
51
|
+
if (currentGitState.branch === sessionGitState.branch &&
|
|
52
|
+
currentGitState.commitHash === sessionGitState.commitHash) {
|
|
53
|
+
return { canContinue: true };
|
|
54
|
+
}
|
|
55
|
+
// Different commit on same branch = warn but allow
|
|
56
|
+
if (currentGitState.branch === sessionGitState.branch) {
|
|
57
|
+
return {
|
|
58
|
+
canContinue: false,
|
|
59
|
+
reason: `Git state changed: commit ${sessionGitState.commitHash.slice(0, 8)} → ${currentGitState.commitHash.slice(0, 8)}`
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Different branch = don't auto-continue
|
|
63
|
+
return {
|
|
64
|
+
canContinue: false,
|
|
65
|
+
reason: `Branch changed: ${sessionGitState.branch} → ${currentGitState.branch}`
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=gitStateDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitStateDetector.js","sourceRoot":"","sources":["../../src/utils/gitStateDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAUrC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAY;IACnD,IAAI,CAAC;QACH,0DAA0D;QAC1D,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC3D,cAAc,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC;YAC5E,cAAc,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC;YAC5D,cAAc,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC;SACjE,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QAEpD,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;YACrB,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE;YAC7B,gBAAgB;YAChB,qBAAqB,EAAE,CAAC,gBAAgB;YACxC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,kEAAkE,KAAK,EAAE,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAkB;IAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,6CAA6C;IAC7C,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACnE,OAAO,UAAU,UAAU,IAAI,SAAS,EAAE,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACvC,eAAyB,EACzB,eAAyB;IAEzB,yCAAyC;IACzC,IACE,eAAe,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM;QACjD,eAAe,CAAC,UAAU,KAAK,eAAe,CAAC,UAAU,EACzD,CAAC;QACD,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,mDAAmD;IACnD,IAAI,eAAe,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM,EAAE,CAAC;QACtD,OAAO;YACL,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,6BAA6B,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;SAC1H,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,OAAO;QACL,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,mBAAmB,eAAe,CAAC,MAAM,MAAM,eAAe,CAAC,MAAM,EAAE;KAChF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class Logger {
|
|
2
|
+
private static formatMessage;
|
|
3
|
+
static log(message: string, ...args: any[]): void;
|
|
4
|
+
static warn(message: string, ...args: any[]): void;
|
|
5
|
+
static error(message: string, ...args: any[]): void;
|
|
6
|
+
static debug(message: string, ...args: any[]): void;
|
|
7
|
+
static toolInvocation(toolName: string, args: any): void;
|
|
8
|
+
static toolParsedArgs(prompt: string, model?: string, sandbox?: boolean, changeMode?: boolean): void;
|
|
9
|
+
static commandExecution(command: string, args: string[], startTime: number): void;
|
|
10
|
+
private static _commandStartTimes;
|
|
11
|
+
static commandComplete(startTime: number, exitCode: number | null, outputLength?: number): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAGA,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,aAAa;IAI5B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIjD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIlD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAInD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAInD,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAIxD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI;IAIpG,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAQjF,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA6E;IAE9G,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;CAUhG"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// WIP
|
|
2
|
+
import { LOG_PREFIX } from "../constants.js";
|
|
3
|
+
export class Logger {
|
|
4
|
+
static formatMessage(message) {
|
|
5
|
+
return `${LOG_PREFIX} ${message}` + "\n";
|
|
6
|
+
}
|
|
7
|
+
static log(message, ...args) {
|
|
8
|
+
console.warn(this.formatMessage(message), ...args);
|
|
9
|
+
}
|
|
10
|
+
static warn(message, ...args) {
|
|
11
|
+
console.warn(this.formatMessage(message), ...args);
|
|
12
|
+
}
|
|
13
|
+
static error(message, ...args) {
|
|
14
|
+
console.error(this.formatMessage(message), ...args);
|
|
15
|
+
}
|
|
16
|
+
static debug(message, ...args) {
|
|
17
|
+
console.warn(this.formatMessage(message), ...args);
|
|
18
|
+
}
|
|
19
|
+
static toolInvocation(toolName, args) {
|
|
20
|
+
this.warn("Raw:", JSON.stringify(args, null, 2));
|
|
21
|
+
}
|
|
22
|
+
static toolParsedArgs(prompt, model, sandbox, changeMode) {
|
|
23
|
+
this.warn(`Parsed prompt: "${prompt}"\nchangeMode: ${changeMode || false}`);
|
|
24
|
+
}
|
|
25
|
+
static commandExecution(command, args, startTime) {
|
|
26
|
+
this.warn(`[${startTime}] Starting: ${command} ${args.map((arg) => `"${arg}"`).join(" ")}`);
|
|
27
|
+
// Store command execution start for timing analysis
|
|
28
|
+
this._commandStartTimes.set(startTime, { command, args, startTime });
|
|
29
|
+
}
|
|
30
|
+
// Track command start times for duration calculation
|
|
31
|
+
static _commandStartTimes = new Map();
|
|
32
|
+
static commandComplete(startTime, exitCode, outputLength) {
|
|
33
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
34
|
+
this.warn(`[${elapsed}s] Process finished with exit code: ${exitCode}`);
|
|
35
|
+
if (outputLength !== undefined) {
|
|
36
|
+
this.warn(`Response: ${outputLength} chars`);
|
|
37
|
+
}
|
|
38
|
+
// Clean up command tracking
|
|
39
|
+
this._commandStartTimes.delete(startTime);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM;AACN,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,OAAO,MAAM;IACT,MAAM,CAAC,aAAa,CAAC,OAAe;QAC1C,OAAO,GAAG,UAAU,IAAI,OAAO,EAAE,GAAG,IAAI,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,OAAe,EAAE,GAAG,IAAW;QACxC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QACzC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QAC1C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QAC1C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,QAAgB,EAAE,IAAS;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,MAAc,EAAE,KAAc,EAAE,OAAiB,EAAE,UAAoB;QAC3F,IAAI,CAAC,IAAI,CAAC,mBAAmB,MAAM,kBAAkB,UAAU,IAAI,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,OAAe,EAAE,IAAc,EAAE,SAAiB;QACxE,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,eAAe,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE5F,oDAAoD;QACpD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,qDAAqD;IAC7C,MAAM,CAAC,kBAAkB,GAAG,IAAI,GAAG,EAAkE,CAAC;IAE9G,MAAM,CAAC,eAAe,CAAC,SAAiB,EAAE,QAAuB,EAAE,YAAqB;QACtF,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,uCAAuC,QAAQ,EAAE,CAAC,CAAC;QACxE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,aAAa,YAAY,QAAQ,CAAC,CAAC;QAC/C,CAAC;QAED,4BAA4B;QAC5B,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ReviewCodeSessionData as CodeReviewSession, ReviewRound, ReviewComment } from './sessionSchemas.js';
|
|
2
|
+
export interface ReviewFormatterConfig {
|
|
3
|
+
session: CodeReviewSession;
|
|
4
|
+
currentRound: ReviewRound;
|
|
5
|
+
newComments: ReviewComment[];
|
|
6
|
+
showHistory: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Formats the review response for Claude
|
|
10
|
+
* @param config Formatter configuration
|
|
11
|
+
* @returns Formatted markdown string
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatReviewResponse(config: ReviewFormatterConfig): string;
|
|
14
|
+
/**
|
|
15
|
+
* Groups comments by file pattern
|
|
16
|
+
* @param comments Array of comments
|
|
17
|
+
* @returns Map of file patterns to comments
|
|
18
|
+
*/
|
|
19
|
+
export declare function groupCommentsByFile(comments: ReviewComment[]): Map<string, ReviewComment[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Formats a message when session expires or is not found
|
|
22
|
+
* @param sessionId The session ID that was requested
|
|
23
|
+
* @param currentGitBranch Current git branch
|
|
24
|
+
* @param currentGitCommit Current git commit hash
|
|
25
|
+
* @returns Formatted error message
|
|
26
|
+
*/
|
|
27
|
+
export declare function formatSessionNotFound(sessionId: string, currentGitBranch: string, currentGitCommit: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Formats a warning message for git state changes
|
|
30
|
+
* @param reason The reason for the warning
|
|
31
|
+
* @param continuing Whether the session is continuing anyway
|
|
32
|
+
* @returns Formatted warning string
|
|
33
|
+
*/
|
|
34
|
+
export declare function formatGitStateWarning(reason: string, continuing: boolean): string;
|
|
35
|
+
//# sourceMappingURL=reviewFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewFormatter.d.ts","sourceRoot":"","sources":["../../src/utils/reviewFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,IAAI,iBAAiB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGlH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,YAAY,EAAE,WAAW,CAAC;IAC1B,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CA+B1E;AAyDD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAgB3F;AA+ED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,EACxB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAkBR;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,CAUjF"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { REVIEW, SESSION } from '../constants.js';
|
|
2
|
+
/**
|
|
3
|
+
* Formats the review response for Claude
|
|
4
|
+
* @param config Formatter configuration
|
|
5
|
+
* @returns Formatted markdown string
|
|
6
|
+
*/
|
|
7
|
+
export function formatReviewResponse(config) {
|
|
8
|
+
const { session, currentRound, newComments, showHistory } = config;
|
|
9
|
+
let output = `# Code Review - Round ${currentRound.roundNumber}\n\n`;
|
|
10
|
+
// Session info
|
|
11
|
+
output += `**Session:** \`${session.sessionId}\`\n`;
|
|
12
|
+
output += `**Branch:** ${session.currentGitState.branch} @ ${session.currentGitState.commitHash.slice(0, 8)}\n`;
|
|
13
|
+
output += `**Files Reviewed:** ${currentRound.filesReviewed.length}\n\n`;
|
|
14
|
+
// Summary
|
|
15
|
+
output += formatSummary(newComments);
|
|
16
|
+
// Comments by file
|
|
17
|
+
if (newComments.length > 0) {
|
|
18
|
+
output += `## Issues Found\n\n`;
|
|
19
|
+
output += formatCommentsByFile(newComments);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
output += `## Result\n\n`;
|
|
23
|
+
output += `✅ No new issues found in this round.\n\n`;
|
|
24
|
+
}
|
|
25
|
+
// Session continuation instructions
|
|
26
|
+
output += formatContinuationInstructions(session);
|
|
27
|
+
// History summary if enabled
|
|
28
|
+
if (showHistory && session.rounds.length > 1) {
|
|
29
|
+
output += formatHistorySummary(session);
|
|
30
|
+
}
|
|
31
|
+
return output;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Formats the summary section with severity counts
|
|
35
|
+
* @param comments Array of comments to summarize
|
|
36
|
+
* @returns Formatted summary string
|
|
37
|
+
*/
|
|
38
|
+
function formatSummary(comments) {
|
|
39
|
+
const criticalCount = comments.filter(c => c.severity === 'critical').length;
|
|
40
|
+
const importantCount = comments.filter(c => c.severity === 'important').length;
|
|
41
|
+
const suggestionCount = comments.filter(c => c.severity === 'suggestion').length;
|
|
42
|
+
const questionCount = comments.filter(c => c.severity === 'question').length;
|
|
43
|
+
let summary = `## Summary\n`;
|
|
44
|
+
summary += `- 🔴 Critical: ${criticalCount}\n`;
|
|
45
|
+
summary += `- 🟠 Important: ${importantCount}\n`;
|
|
46
|
+
summary += `- 🟡 Suggestions: ${suggestionCount}\n`;
|
|
47
|
+
summary += `- 💬 Questions: ${questionCount}\n`;
|
|
48
|
+
summary += `- **Total:** ${comments.length} issues\n\n`;
|
|
49
|
+
return summary;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Formats comments grouped by file
|
|
53
|
+
* @param comments Array of comments to format
|
|
54
|
+
* @returns Formatted comments string
|
|
55
|
+
*/
|
|
56
|
+
function formatCommentsByFile(comments) {
|
|
57
|
+
const commentsByFile = groupCommentsByFile(comments);
|
|
58
|
+
let output = '';
|
|
59
|
+
for (const [file, fileComments] of commentsByFile) {
|
|
60
|
+
output += `### ${file}\n\n`;
|
|
61
|
+
fileComments.forEach((comment, idx) => {
|
|
62
|
+
const severityEmoji = REVIEW.SEVERITY_EMOJI[comment.severity] || '📌';
|
|
63
|
+
output += `#### ${severityEmoji} Issue ${idx + 1}\n`;
|
|
64
|
+
output += `**Comment ID:** \`${comment.id}\`\n`;
|
|
65
|
+
if (comment.lineRange) {
|
|
66
|
+
if (comment.lineRange.start === comment.lineRange.end) {
|
|
67
|
+
output += `**Line:** ${comment.lineRange.start}\n`;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
output += `**Lines:** ${comment.lineRange.start}-${comment.lineRange.end}\n`;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
output += `\n${comment.comment}\n\n`;
|
|
74
|
+
output += `---\n\n`;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return output;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Groups comments by file pattern
|
|
81
|
+
* @param comments Array of comments
|
|
82
|
+
* @returns Map of file patterns to comments
|
|
83
|
+
*/
|
|
84
|
+
export function groupCommentsByFile(comments) {
|
|
85
|
+
const groups = new Map();
|
|
86
|
+
// Sort comments by severity first
|
|
87
|
+
const sortedComments = [...comments].sort((a, b) => {
|
|
88
|
+
const severityOrder = { critical: 0, important: 1, suggestion: 2, question: 3 };
|
|
89
|
+
return severityOrder[a.severity] - severityOrder[b.severity];
|
|
90
|
+
});
|
|
91
|
+
sortedComments.forEach(comment => {
|
|
92
|
+
const existing = groups.get(comment.filePattern) || [];
|
|
93
|
+
existing.push(comment);
|
|
94
|
+
groups.set(comment.filePattern, existing);
|
|
95
|
+
});
|
|
96
|
+
return groups;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Formats continuation instructions
|
|
100
|
+
* @param session The current session
|
|
101
|
+
* @returns Formatted instructions string
|
|
102
|
+
*/
|
|
103
|
+
function formatContinuationInstructions(session) {
|
|
104
|
+
const reviewTtlMs = SESSION.TOOL_CONFIGS['review-code']?.TTL ?? SESSION.DEFAULT_TTL;
|
|
105
|
+
const expiryDate = new Date(session.lastAccessedAt + reviewTtlMs);
|
|
106
|
+
let instructions = `## Continue Review\n\n`;
|
|
107
|
+
instructions += `To continue this review session:\n`;
|
|
108
|
+
instructions += `1. Make your code changes based on the feedback above\n`;
|
|
109
|
+
instructions += `2. Call the \`review-code\` tool again (session auto-detected from git state)\n`;
|
|
110
|
+
instructions += `3. Optionally provide \`commentDecisions\` to track which issues you've addressed\n\n`;
|
|
111
|
+
instructions += `**Example:**\n`;
|
|
112
|
+
instructions += '```json\n';
|
|
113
|
+
instructions += `{
|
|
114
|
+
"name": "review-code",
|
|
115
|
+
"arguments": {
|
|
116
|
+
"prompt": "I've fixed the security issues. Please review.",
|
|
117
|
+
"commentDecisions": [
|
|
118
|
+
{"commentId": "cmt-xxx", "decision": "accepted", "notes": "Fixed"}
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
`;
|
|
123
|
+
instructions += '```\n\n';
|
|
124
|
+
instructions += `**Session Details:**\n`;
|
|
125
|
+
instructions += `- Session ID: \`${session.sessionId}\`\n`;
|
|
126
|
+
instructions += `- Expires: ${expiryDate.toLocaleString()}\n`;
|
|
127
|
+
instructions += `- Git State: ${session.currentGitState.branch} @ ${session.currentGitState.commitHash.slice(0, 8)}\n\n`;
|
|
128
|
+
return instructions;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Formats the history summary
|
|
132
|
+
* @param session The current session
|
|
133
|
+
* @returns Formatted history string
|
|
134
|
+
*/
|
|
135
|
+
function formatHistorySummary(session) {
|
|
136
|
+
let history = `## Review History\n\n`;
|
|
137
|
+
// Exclude current (last) round from history summary
|
|
138
|
+
const previousRounds = session.rounds.slice(0, -1);
|
|
139
|
+
if (previousRounds.length === 0) {
|
|
140
|
+
return '';
|
|
141
|
+
}
|
|
142
|
+
history += `| Round | Files | Issues | Resolved | Pending |\n`;
|
|
143
|
+
history += `|-------|-------|--------|----------|----------|\n`;
|
|
144
|
+
previousRounds.forEach(round => {
|
|
145
|
+
const resolved = round.commentsGenerated.filter(c => c.status !== 'pending').length;
|
|
146
|
+
const pending = round.commentsGenerated.filter(c => c.status === 'pending').length;
|
|
147
|
+
history += `| ${round.roundNumber} | ${round.filesReviewed.length} | ${round.commentsGenerated.length} | ${resolved} | ${pending} |\n`;
|
|
148
|
+
});
|
|
149
|
+
history += `\n`;
|
|
150
|
+
// Overall statistics
|
|
151
|
+
const totalResolved = session.allComments.filter(c => c.status !== 'pending').length;
|
|
152
|
+
const totalPending = session.allComments.filter(c => c.status === 'pending').length;
|
|
153
|
+
history += `**Overall Progress:**\n`;
|
|
154
|
+
history += `- Total Issues: ${session.allComments.length}\n`;
|
|
155
|
+
history += `- Resolved: ${totalResolved}\n`;
|
|
156
|
+
history += `- Pending: ${totalPending}\n`;
|
|
157
|
+
history += `- Files Tracked: ${session.filesTracked.length}\n\n`;
|
|
158
|
+
return history;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Formats a message when session expires or is not found
|
|
162
|
+
* @param sessionId The session ID that was requested
|
|
163
|
+
* @param currentGitBranch Current git branch
|
|
164
|
+
* @param currentGitCommit Current git commit hash
|
|
165
|
+
* @returns Formatted error message
|
|
166
|
+
*/
|
|
167
|
+
export function formatSessionNotFound(sessionId, currentGitBranch, currentGitCommit) {
|
|
168
|
+
const reviewTtlMs = SESSION.TOOL_CONFIGS['review-code']?.TTL ?? SESSION.DEFAULT_TTL;
|
|
169
|
+
const ttlHours = Math.round((reviewTtlMs / (60 * 60 * 1000)) * 10) / 10;
|
|
170
|
+
return `⚠️ **Session Not Found or Expired**
|
|
171
|
+
|
|
172
|
+
The review session \`${sessionId}\` was not found or has expired.
|
|
173
|
+
|
|
174
|
+
**Current Git State:**
|
|
175
|
+
- Branch: ${currentGitBranch}
|
|
176
|
+
- Commit: ${currentGitCommit.slice(0, 8)}
|
|
177
|
+
|
|
178
|
+
**Available Options:**
|
|
179
|
+
1. Start a new review session with \`forceNewSession: true\`
|
|
180
|
+
2. Wait if you just made a commit (session auto-creates based on current git state)
|
|
181
|
+
|
|
182
|
+
**Note:** Review sessions expire after ${ttlHours} hour(s) of inactivity.
|
|
183
|
+
`;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Formats a warning message for git state changes
|
|
187
|
+
* @param reason The reason for the warning
|
|
188
|
+
* @param continuing Whether the session is continuing anyway
|
|
189
|
+
* @returns Formatted warning string
|
|
190
|
+
*/
|
|
191
|
+
export function formatGitStateWarning(reason, continuing) {
|
|
192
|
+
let warning = `⚠️ **Git State Changed**\n\n${reason}\n\n`;
|
|
193
|
+
if (continuing) {
|
|
194
|
+
warning += `Continuing with existing session. Use \`forceNewSession: true\` to start fresh.\n`;
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
warning += `Creating new session for current git state.\n`;
|
|
198
|
+
}
|
|
199
|
+
return warning;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=reviewFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewFormatter.js","sourceRoot":"","sources":["../../src/utils/reviewFormatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ReviewCodeSessionData as CodeReviewSession } from './sessionSchemas.js';
|
|
2
|
+
import { GitState } from './gitStateDetector.js';
|
|
3
|
+
export interface ReviewPromptConfig {
|
|
4
|
+
userPrompt: string;
|
|
5
|
+
session: CodeReviewSession;
|
|
6
|
+
files?: string[];
|
|
7
|
+
reviewType: string;
|
|
8
|
+
severity: string;
|
|
9
|
+
includeHistory: boolean;
|
|
10
|
+
currentGitState: GitState;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Builds a context-aware review prompt for the AI backend
|
|
14
|
+
* @param config Review prompt configuration
|
|
15
|
+
* @returns Formatted prompt string
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildReviewPrompt(config: ReviewPromptConfig): string;
|
|
18
|
+
/**
|
|
19
|
+
* Returns severity-specific instructions so the model does not waste time
|
|
20
|
+
* generating feedback that will be discarded after parsing.
|
|
21
|
+
* @param severity The requested severity scope
|
|
22
|
+
* @returns Formatted instructions string
|
|
23
|
+
*/
|
|
24
|
+
export declare function getSeverityInstructions(severity: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Returns review instructions based on review type
|
|
27
|
+
* @param reviewType The type of review to perform
|
|
28
|
+
* @returns Formatted instructions string
|
|
29
|
+
*/
|
|
30
|
+
export declare function getReviewTypeInstructions(reviewType: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Formats previous review rounds for context inclusion
|
|
33
|
+
* @param session The current review session
|
|
34
|
+
* @returns Formatted history string
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatPreviousRounds(session: CodeReviewSession): string;
|
|
37
|
+
/**
|
|
38
|
+
* Extracts file patterns from a prompt containing @ references
|
|
39
|
+
* @param prompt The prompt to parse
|
|
40
|
+
* @returns Array of file patterns
|
|
41
|
+
*/
|
|
42
|
+
export declare function extractFilesFromPrompt(prompt: string): string[];
|
|
43
|
+
//# sourceMappingURL=reviewPromptBuilder.d.ts.map
|