ghagga 2.0.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -19
- package/dist/commands/hooks/index.d.ts +9 -0
- package/dist/commands/hooks/index.d.ts.map +1 -0
- package/dist/commands/hooks/index.js +16 -0
- package/dist/commands/hooks/index.js.map +1 -0
- package/dist/commands/hooks/install.d.ts +13 -0
- package/dist/commands/hooks/install.d.ts.map +1 -0
- package/dist/commands/hooks/install.js +64 -0
- package/dist/commands/hooks/install.js.map +1 -0
- package/dist/commands/hooks/install.test.d.ts +11 -0
- package/dist/commands/hooks/install.test.d.ts.map +1 -0
- package/dist/commands/hooks/install.test.js +157 -0
- package/dist/commands/hooks/install.test.js.map +1 -0
- package/dist/commands/hooks/status.d.ts +12 -0
- package/dist/commands/hooks/status.d.ts.map +1 -0
- package/dist/commands/hooks/status.js +38 -0
- package/dist/commands/hooks/status.js.map +1 -0
- package/dist/commands/hooks/status.test.d.ts +11 -0
- package/dist/commands/hooks/status.test.d.ts.map +1 -0
- package/dist/commands/hooks/status.test.js +123 -0
- package/dist/commands/hooks/status.test.js.map +1 -0
- package/dist/commands/hooks/uninstall.d.ts +12 -0
- package/dist/commands/hooks/uninstall.d.ts.map +1 -0
- package/dist/commands/hooks/uninstall.js +44 -0
- package/dist/commands/hooks/uninstall.js.map +1 -0
- package/dist/commands/hooks/uninstall.test.d.ts +10 -0
- package/dist/commands/hooks/uninstall.test.d.ts.map +1 -0
- package/dist/commands/hooks/uninstall.test.js +120 -0
- package/dist/commands/hooks/uninstall.test.js.map +1 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +17 -14
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/login.test.d.ts +9 -0
- package/dist/commands/login.test.d.ts.map +1 -0
- package/dist/commands/login.test.js +138 -0
- package/dist/commands/login.test.js.map +1 -0
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +4 -3
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/logout.test.d.ts +8 -0
- package/dist/commands/logout.test.d.ts.map +1 -0
- package/dist/commands/logout.test.js +61 -0
- package/dist/commands/logout.test.js.map +1 -0
- package/dist/commands/memory/clear.d.ts +11 -0
- package/dist/commands/memory/clear.d.ts.map +1 -0
- package/dist/commands/memory/clear.js +45 -0
- package/dist/commands/memory/clear.js.map +1 -0
- package/dist/commands/memory/clear.test.d.ts +11 -0
- package/dist/commands/memory/clear.test.d.ts.map +1 -0
- package/dist/commands/memory/clear.test.js +178 -0
- package/dist/commands/memory/clear.test.js.map +1 -0
- package/dist/commands/memory/delete.d.ts +11 -0
- package/dist/commands/memory/delete.d.ts.map +1 -0
- package/dist/commands/memory/delete.js +38 -0
- package/dist/commands/memory/delete.js.map +1 -0
- package/dist/commands/memory/delete.test.d.ts +11 -0
- package/dist/commands/memory/delete.test.d.ts.map +1 -0
- package/dist/commands/memory/delete.test.js +176 -0
- package/dist/commands/memory/delete.test.js.map +1 -0
- package/dist/commands/memory/index.d.ts +10 -0
- package/dist/commands/memory/index.d.ts.map +1 -0
- package/dist/commands/memory/index.js +23 -0
- package/dist/commands/memory/index.js.map +1 -0
- package/dist/commands/memory/list.d.ts +11 -0
- package/dist/commands/memory/list.d.ts.map +1 -0
- package/dist/commands/memory/list.js +47 -0
- package/dist/commands/memory/list.js.map +1 -0
- package/dist/commands/memory/list.test.d.ts +10 -0
- package/dist/commands/memory/list.test.d.ts.map +1 -0
- package/dist/commands/memory/list.test.js +135 -0
- package/dist/commands/memory/list.test.js.map +1 -0
- package/dist/commands/memory/search.d.ts +12 -0
- package/dist/commands/memory/search.d.ts.map +1 -0
- package/dist/commands/memory/search.js +44 -0
- package/dist/commands/memory/search.js.map +1 -0
- package/dist/commands/memory/search.test.d.ts +11 -0
- package/dist/commands/memory/search.test.d.ts.map +1 -0
- package/dist/commands/memory/search.test.js +122 -0
- package/dist/commands/memory/search.test.js.map +1 -0
- package/dist/commands/memory/show.d.ts +10 -0
- package/dist/commands/memory/show.d.ts.map +1 -0
- package/dist/commands/memory/show.js +51 -0
- package/dist/commands/memory/show.js.map +1 -0
- package/dist/commands/memory/show.test.d.ts +11 -0
- package/dist/commands/memory/show.test.d.ts.map +1 -0
- package/dist/commands/memory/show.test.js +156 -0
- package/dist/commands/memory/show.test.js.map +1 -0
- package/dist/commands/memory/stats.d.ts +11 -0
- package/dist/commands/memory/stats.d.ts.map +1 -0
- package/dist/commands/memory/stats.js +63 -0
- package/dist/commands/memory/stats.js.map +1 -0
- package/dist/commands/memory/stats.test.d.ts +10 -0
- package/dist/commands/memory/stats.test.d.ts.map +1 -0
- package/dist/commands/memory/stats.test.js +122 -0
- package/dist/commands/memory/stats.test.js.map +1 -0
- package/dist/commands/memory/utils.d.ts +44 -0
- package/dist/commands/memory/utils.d.ts.map +1 -0
- package/dist/commands/memory/utils.js +90 -0
- package/dist/commands/memory/utils.js.map +1 -0
- package/dist/commands/memory/utils.test.d.ts +10 -0
- package/dist/commands/memory/utils.test.d.ts.map +1 -0
- package/dist/commands/memory/utils.test.js +93 -0
- package/dist/commands/memory/utils.test.js.map +1 -0
- package/dist/commands/review-commit-msg.d.ts +28 -0
- package/dist/commands/review-commit-msg.d.ts.map +1 -0
- package/dist/commands/review-commit-msg.js +126 -0
- package/dist/commands/review-commit-msg.js.map +1 -0
- package/dist/commands/review-commit-msg.test.d.ts +11 -0
- package/dist/commands/review-commit-msg.test.d.ts.map +1 -0
- package/dist/commands/review-commit-msg.test.js +126 -0
- package/dist/commands/review-commit-msg.test.js.map +1 -0
- package/dist/commands/review.d.ts +7 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +138 -103
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/review.test.js +267 -1
- package/dist/commands/review.test.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +12 -11
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/status.test.d.ts +8 -0
- package/dist/commands/status.test.d.ts.map +1 -0
- package/dist/commands/status.test.js +106 -0
- package/dist/commands/status.test.js.map +1 -0
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +48 -16
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/config.test.d.ts +9 -0
- package/dist/lib/config.test.d.ts.map +1 -0
- package/dist/lib/config.test.js +181 -0
- package/dist/lib/config.test.js.map +1 -0
- package/dist/lib/git-hooks.d.ts +19 -0
- package/dist/lib/git-hooks.d.ts.map +1 -0
- package/dist/lib/git-hooks.js +129 -0
- package/dist/lib/git-hooks.js.map +1 -0
- package/dist/lib/git-hooks.test.d.ts +11 -0
- package/dist/lib/git-hooks.test.d.ts.map +1 -0
- package/dist/lib/git-hooks.test.js +178 -0
- package/dist/lib/git-hooks.test.js.map +1 -0
- package/dist/lib/git.d.ts +33 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +85 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/git.test.d.ts +2 -0
- package/dist/lib/git.test.d.ts.map +1 -0
- package/dist/lib/git.test.js +65 -0
- package/dist/lib/git.test.js.map +1 -0
- package/dist/lib/hook-templates.d.ts +12 -0
- package/dist/lib/hook-templates.d.ts.map +1 -0
- package/dist/lib/hook-templates.js +52 -0
- package/dist/lib/hook-templates.js.map +1 -0
- package/dist/lib/hook-templates.test.d.ts +11 -0
- package/dist/lib/hook-templates.test.d.ts.map +1 -0
- package/dist/lib/hook-templates.test.js +76 -0
- package/dist/lib/hook-templates.test.js.map +1 -0
- package/dist/lib/hooks-types.d.ts +30 -0
- package/dist/lib/hooks-types.d.ts.map +1 -0
- package/dist/lib/hooks-types.js +9 -0
- package/dist/lib/hooks-types.js.map +1 -0
- package/dist/lib/oauth.test.d.ts +8 -0
- package/dist/lib/oauth.test.d.ts.map +1 -0
- package/dist/lib/oauth.test.js +212 -0
- package/dist/lib/oauth.test.js.map +1 -0
- package/dist/ui/__tests__/format.test.d.ts +7 -0
- package/dist/ui/__tests__/format.test.d.ts.map +1 -0
- package/dist/ui/__tests__/format.test.js +220 -0
- package/dist/ui/__tests__/format.test.js.map +1 -0
- package/dist/ui/__tests__/theme.test.d.ts +7 -0
- package/dist/ui/__tests__/theme.test.d.ts.map +1 -0
- package/dist/ui/__tests__/theme.test.js +79 -0
- package/dist/ui/__tests__/theme.test.js.map +1 -0
- package/dist/ui/__tests__/tui.test.d.ts +9 -0
- package/dist/ui/__tests__/tui.test.d.ts.map +1 -0
- package/dist/ui/__tests__/tui.test.js +222 -0
- package/dist/ui/__tests__/tui.test.js.map +1 -0
- package/dist/ui/format.d.ts +38 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +136 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/theme.d.ts +26 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +63 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/tui.d.ts +44 -0
- package/dist/ui/tui.d.ts.map +1 -0
- package/dist/ui/tui.js +121 -0
- package/dist/ui/tui.js.map +1 -0
- package/package.json +4 -2
package/dist/commands/review.js
CHANGED
|
@@ -8,15 +8,64 @@
|
|
|
8
8
|
import { execSync } from 'node:child_process';
|
|
9
9
|
import { readFileSync, existsSync } from 'node:fs';
|
|
10
10
|
import { resolve, join } from 'node:path';
|
|
11
|
-
import { reviewPipeline, DEFAULT_SETTINGS, } from 'ghagga-core';
|
|
11
|
+
import { reviewPipeline, DEFAULT_SETTINGS, SqliteMemoryStorage, EngramMemoryStorage, } from 'ghagga-core';
|
|
12
|
+
import { resolveProjectId, getStagedDiff } from '../lib/git.js';
|
|
13
|
+
import { getConfigDir } from '../lib/config.js';
|
|
14
|
+
import { reviewCommitMessage } from './review-commit-msg.js';
|
|
15
|
+
import * as tui from '../ui/tui.js';
|
|
16
|
+
import { formatMarkdownResult } from '../ui/format.js';
|
|
17
|
+
import { resolveStepIcon } from '../ui/theme.js';
|
|
12
18
|
// ─── Main Command ───────────────────────────────────────────────
|
|
13
19
|
export async function reviewCommand(targetPath, options) {
|
|
14
20
|
const repoPath = resolve(targetPath);
|
|
21
|
+
let memoryStorage;
|
|
15
22
|
try {
|
|
16
|
-
//
|
|
17
|
-
|
|
23
|
+
// ── Mutual exclusivity check: --staged and --commit-msg ──
|
|
24
|
+
if (options.staged && options.commitMsg) {
|
|
25
|
+
tui.log.error('❌ --staged and --commit-msg are mutually exclusive. Use one or the other.');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
// ── Commit message review path (bypasses file-based pipeline) ──
|
|
29
|
+
if (options.commitMsg) {
|
|
30
|
+
const commitMsgFile = resolve(options.commitMsg);
|
|
31
|
+
if (!existsSync(commitMsgFile)) {
|
|
32
|
+
tui.log.error(`❌ Commit message file not found: ${commitMsgFile}`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
const message = readFileSync(commitMsgFile, 'utf-8');
|
|
36
|
+
if (options.format !== 'json') {
|
|
37
|
+
tui.intro('🤖 GHAGGA Commit Message Review');
|
|
38
|
+
}
|
|
39
|
+
const result = await reviewCommitMessage({
|
|
40
|
+
message,
|
|
41
|
+
provider: options.provider,
|
|
42
|
+
model: options.model,
|
|
43
|
+
apiKey: options.apiKey,
|
|
44
|
+
quick: options.quick,
|
|
45
|
+
});
|
|
46
|
+
// Output the result
|
|
47
|
+
if (options.format === 'json') {
|
|
48
|
+
console.log(JSON.stringify(result, null, 2));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
tui.log.message(formatMarkdownResult(result));
|
|
52
|
+
}
|
|
53
|
+
// Exit code: --exit-on-issues overrides default behavior
|
|
54
|
+
const exitCode = resolveExitCode(result, options.exitOnIssues ?? false);
|
|
55
|
+
if (options.format !== 'json') {
|
|
56
|
+
tui.outro('Commit message review complete');
|
|
57
|
+
}
|
|
58
|
+
process.exit(exitCode);
|
|
59
|
+
}
|
|
60
|
+
// ── Step 1: Get the git diff ─────────────────────────────
|
|
61
|
+
const diff = options.staged
|
|
62
|
+
? getStagedDiff(repoPath)
|
|
63
|
+
: getGitDiff(repoPath);
|
|
18
64
|
if (!diff || diff.trim().length === 0) {
|
|
19
|
-
|
|
65
|
+
const msg = options.staged
|
|
66
|
+
? 'ℹ️ No staged changes found. Stage files with `git add` first.'
|
|
67
|
+
: 'ℹ️ No changes detected. Stage some changes or make commits to review.';
|
|
68
|
+
tui.log.info(msg);
|
|
20
69
|
process.exit(0);
|
|
21
70
|
}
|
|
22
71
|
// Step 2: Load optional config file
|
|
@@ -24,9 +73,59 @@ export async function reviewCommand(targetPath, options) {
|
|
|
24
73
|
// Step 3: Merge settings (CLI options take priority over config file)
|
|
25
74
|
const settings = mergeSettings(options, fileConfig);
|
|
26
75
|
// Step 4: Show progress
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
76
|
+
if (options.format !== 'json') {
|
|
77
|
+
tui.intro('🤖 GHAGGA Code Review');
|
|
78
|
+
tui.log.message(` Mode: ${options.mode} | Provider: ${options.provider} | Model: ${options.model}`);
|
|
79
|
+
if (options.staged) {
|
|
80
|
+
tui.log.step(' Reviewing staged changes...\n');
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
tui.log.step(' Analyzing...\n');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Step 4.5: Initialize memory storage
|
|
87
|
+
const repoFullName = resolveProjectId(repoPath);
|
|
88
|
+
if (options.memory) {
|
|
89
|
+
// Determine backend: CLI flag > env var > default ('sqlite')
|
|
90
|
+
const memoryBackend = options.memoryBackend
|
|
91
|
+
?? process.env['GHAGGA_MEMORY_BACKEND']
|
|
92
|
+
?? 'sqlite';
|
|
93
|
+
// Validate backend value
|
|
94
|
+
const validBackends = ['sqlite', 'engram'];
|
|
95
|
+
if (!validBackends.includes(memoryBackend)) {
|
|
96
|
+
tui.log.error(`❌ Invalid memory backend "${memoryBackend}". Choose from: ${validBackends.join(', ')}`);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const dbPath = join(getConfigDir(), 'memory.db');
|
|
101
|
+
if (memoryBackend === 'engram') {
|
|
102
|
+
// Try Engram; fall back to SQLite if unavailable
|
|
103
|
+
const engramHost = process.env['GHAGGA_ENGRAM_HOST'] ?? 'http://localhost:7437';
|
|
104
|
+
const engramTimeout = process.env['GHAGGA_ENGRAM_TIMEOUT']
|
|
105
|
+
? Number(process.env['GHAGGA_ENGRAM_TIMEOUT']) * 1000
|
|
106
|
+
: undefined;
|
|
107
|
+
const engramStorage = await EngramMemoryStorage.create({
|
|
108
|
+
host: engramHost,
|
|
109
|
+
...(engramTimeout != null ? { timeout: engramTimeout } : {}),
|
|
110
|
+
});
|
|
111
|
+
if (engramStorage) {
|
|
112
|
+
memoryStorage = engramStorage;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
tui.log.warn('⚠️ Engram not available, falling back to SQLite memory');
|
|
116
|
+
memoryStorage = await SqliteMemoryStorage.create(dbPath);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
memoryStorage = await SqliteMemoryStorage.create(dbPath);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
125
|
+
tui.log.warn(`⚠️ Failed to initialize memory: ${msg}`);
|
|
126
|
+
memoryStorage = undefined;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
30
129
|
// Step 5: Run the review pipeline
|
|
31
130
|
const onProgress = options.verbose
|
|
32
131
|
? createProgressHandler()
|
|
@@ -39,28 +138,37 @@ export async function reviewCommand(targetPath, options) {
|
|
|
39
138
|
apiKey: options.apiKey,
|
|
40
139
|
settings,
|
|
41
140
|
context: {
|
|
42
|
-
repoFullName
|
|
141
|
+
repoFullName,
|
|
43
142
|
prNumber: 0,
|
|
44
143
|
commitMessages: [],
|
|
45
144
|
fileList: [],
|
|
46
145
|
},
|
|
47
|
-
|
|
146
|
+
memoryStorage,
|
|
48
147
|
onProgress,
|
|
148
|
+
// --quick: disable AI review, use static analysis only
|
|
149
|
+
...(options.quick ? { aiReviewEnabled: false } : {}),
|
|
49
150
|
});
|
|
151
|
+
// Step 5.5: Persist memory to disk
|
|
152
|
+
await memoryStorage?.close();
|
|
50
153
|
// Step 6: Output the result
|
|
51
154
|
if (options.format === 'json') {
|
|
52
155
|
console.log(JSON.stringify(result, null, 2));
|
|
53
156
|
}
|
|
54
157
|
else {
|
|
55
|
-
|
|
158
|
+
tui.log.message(formatMarkdownResult(result));
|
|
159
|
+
}
|
|
160
|
+
// Step 7: Exit code — --exit-on-issues overrides default behavior
|
|
161
|
+
const exitCode = resolveExitCode(result, options.exitOnIssues ?? false);
|
|
162
|
+
if (options.format !== 'json') {
|
|
163
|
+
tui.outro('Review complete');
|
|
56
164
|
}
|
|
57
|
-
// Step 7: Exit code based on status
|
|
58
|
-
const exitCode = getExitCode(result.status);
|
|
59
165
|
process.exit(exitCode);
|
|
60
166
|
}
|
|
61
167
|
catch (error) {
|
|
168
|
+
// Ensure memory is persisted even on error
|
|
169
|
+
await memoryStorage?.close().catch(() => { });
|
|
62
170
|
const message = error instanceof Error ? error.message : String(error);
|
|
63
|
-
|
|
171
|
+
tui.log.error(`\n❌ Review failed: ${message}`);
|
|
64
172
|
process.exit(1);
|
|
65
173
|
}
|
|
66
174
|
}
|
|
@@ -117,7 +225,7 @@ function loadConfigFile(repoPath, configPath) {
|
|
|
117
225
|
}
|
|
118
226
|
catch (error) {
|
|
119
227
|
const message = error instanceof Error ? error.message : String(error);
|
|
120
|
-
|
|
228
|
+
tui.log.warn(`⚠️ Could not parse config file: ${message}`);
|
|
121
229
|
return {};
|
|
122
230
|
}
|
|
123
231
|
}
|
|
@@ -131,29 +239,13 @@ function mergeSettings(options, fileConfig) {
|
|
|
131
239
|
enableSemgrep: options.semgrep ?? fileConfig.enableSemgrep ?? DEFAULT_SETTINGS.enableSemgrep,
|
|
132
240
|
enableTrivy: options.trivy ?? fileConfig.enableTrivy ?? DEFAULT_SETTINGS.enableTrivy,
|
|
133
241
|
enableCpd: options.cpd ?? fileConfig.enableCpd ?? DEFAULT_SETTINGS.enableCpd,
|
|
134
|
-
enableMemory:
|
|
242
|
+
enableMemory: options.memory ?? true, // Memory enabled by default, --no-memory disables
|
|
135
243
|
customRules: fileConfig.customRules ?? DEFAULT_SETTINGS.customRules,
|
|
136
244
|
ignorePatterns: fileConfig.ignorePatterns ?? DEFAULT_SETTINGS.ignorePatterns,
|
|
137
245
|
reviewLevel: fileConfig.reviewLevel ?? DEFAULT_SETTINGS.reviewLevel,
|
|
138
246
|
};
|
|
139
247
|
}
|
|
140
248
|
// ─── Verbose Progress ───────────────────────────────────────────
|
|
141
|
-
/** Step-to-emoji mapping for verbose output. */
|
|
142
|
-
const STEP_ICON = {
|
|
143
|
-
'validate': '🔍',
|
|
144
|
-
'parse-diff': '📄',
|
|
145
|
-
'detect-stacks': '🧩',
|
|
146
|
-
'token-budget': '📊',
|
|
147
|
-
'static-analysis': '🛡️',
|
|
148
|
-
'static-results': '📋',
|
|
149
|
-
'agent-start': '🤖',
|
|
150
|
-
'simple-call': '💬',
|
|
151
|
-
'simple-done': '✅',
|
|
152
|
-
'workflow-start': '🔄',
|
|
153
|
-
'workflow-synthesis': '🧬',
|
|
154
|
-
'consensus-start': '🗳️',
|
|
155
|
-
'consensus-voting': '🏛️',
|
|
156
|
-
};
|
|
157
249
|
/**
|
|
158
250
|
* Create a progress callback that prints real-time verbose output.
|
|
159
251
|
* Each step prints a single line with an icon, step name, and message.
|
|
@@ -161,92 +253,35 @@ const STEP_ICON = {
|
|
|
161
253
|
*/
|
|
162
254
|
function createProgressHandler() {
|
|
163
255
|
return (event) => {
|
|
164
|
-
const icon =
|
|
165
|
-
?? (event.step.startsWith('specialist-') ? '👤' : undefined)
|
|
166
|
-
?? (event.step.startsWith('vote-') ? '🗳️' : undefined)
|
|
167
|
-
?? '▸';
|
|
256
|
+
const icon = resolveStepIcon(event.step);
|
|
168
257
|
const prefix = ` ${icon} [${event.step}]`;
|
|
169
|
-
|
|
258
|
+
tui.log.step(`${prefix} ${event.message}`);
|
|
170
259
|
if (event.detail) {
|
|
171
260
|
// Indent detail lines for readability
|
|
172
261
|
const indented = event.detail
|
|
173
262
|
.split('\n')
|
|
174
263
|
.map((line) => ` ${line}`)
|
|
175
264
|
.join('\n');
|
|
176
|
-
|
|
265
|
+
tui.log.message(indented);
|
|
177
266
|
}
|
|
178
267
|
};
|
|
179
268
|
}
|
|
180
|
-
// ───
|
|
181
|
-
const STATUS_EMOJI = {
|
|
182
|
-
PASSED: '\u2705 PASSED',
|
|
183
|
-
FAILED: '\u274c FAILED',
|
|
184
|
-
NEEDS_HUMAN_REVIEW: '\u26a0\ufe0f NEEDS HUMAN REVIEW',
|
|
185
|
-
SKIPPED: '\u23ed\ufe0f SKIPPED',
|
|
186
|
-
};
|
|
187
|
-
const SEVERITY_EMOJI = {
|
|
188
|
-
critical: '\ud83d\udd34',
|
|
189
|
-
high: '\ud83d\udfe0',
|
|
190
|
-
medium: '\ud83d\udfe1',
|
|
191
|
-
low: '\ud83d\udfe2',
|
|
192
|
-
info: '\ud83d\udfe3',
|
|
193
|
-
};
|
|
269
|
+
// ─── Exit Code ──────────────────────────────────────────────────
|
|
194
270
|
/**
|
|
195
|
-
*
|
|
271
|
+
* Resolve the exit code for the review process.
|
|
272
|
+
*
|
|
273
|
+
* When `exitOnIssues` is true (hook mode), checks findings for
|
|
274
|
+
* critical/high severity — returns 1 if any found, 0 otherwise.
|
|
275
|
+
* When false, delegates to the default status-based exit code.
|
|
196
276
|
*/
|
|
197
|
-
function
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
// Header
|
|
202
|
-
lines.push('---');
|
|
203
|
-
lines.push(`\ud83e\udd16 GHAGGA Code Review | ${status}`);
|
|
204
|
-
lines.push(`Mode: ${result.metadata.mode} | Model: ${result.metadata.model} | Time: ${timeSeconds}s | Tokens: ${result.metadata.tokensUsed}`);
|
|
205
|
-
lines.push('---');
|
|
206
|
-
lines.push('');
|
|
207
|
-
// Summary
|
|
208
|
-
lines.push('## Summary');
|
|
209
|
-
lines.push(result.summary);
|
|
210
|
-
lines.push('');
|
|
211
|
-
// Findings
|
|
212
|
-
if (result.findings.length > 0) {
|
|
213
|
-
lines.push(`## Findings (${result.findings.length})`);
|
|
214
|
-
lines.push('');
|
|
215
|
-
for (const finding of result.findings) {
|
|
216
|
-
const emoji = SEVERITY_EMOJI[finding.severity] ?? '';
|
|
217
|
-
const location = finding.line
|
|
218
|
-
? `${finding.file}:${finding.line}`
|
|
219
|
-
: finding.file;
|
|
220
|
-
lines.push(`${emoji} [${finding.severity.toUpperCase()}] ${finding.category}`);
|
|
221
|
-
lines.push(` ${location}`);
|
|
222
|
-
lines.push(` ${finding.message}`);
|
|
223
|
-
if (finding.suggestion) {
|
|
224
|
-
lines.push(` \ud83d\udca1 ${finding.suggestion}`);
|
|
225
|
-
}
|
|
226
|
-
lines.push('');
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
lines.push('No findings. Nice work! \ud83c\udf89');
|
|
231
|
-
lines.push('');
|
|
232
|
-
}
|
|
233
|
-
// Static analysis summary
|
|
234
|
-
const { toolsRun, toolsSkipped } = result.metadata;
|
|
235
|
-
if (toolsRun.length > 0 || toolsSkipped.length > 0) {
|
|
236
|
-
lines.push('## Static Analysis');
|
|
237
|
-
if (toolsRun.length > 0) {
|
|
238
|
-
lines.push(`\u2705 Tools run: ${toolsRun.join(', ')}`);
|
|
239
|
-
}
|
|
240
|
-
if (toolsSkipped.length > 0) {
|
|
241
|
-
lines.push(`\u23ed\ufe0f Tools skipped: ${toolsSkipped.join(', ')}`);
|
|
242
|
-
}
|
|
243
|
-
lines.push('');
|
|
277
|
+
function resolveExitCode(result, exitOnIssues) {
|
|
278
|
+
if (exitOnIssues) {
|
|
279
|
+
const hasBlockingIssues = result.findings.some((f) => f.severity === 'critical' || f.severity === 'high');
|
|
280
|
+
return hasBlockingIssues ? 1 : 0;
|
|
244
281
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
return lines.join('\n');
|
|
282
|
+
// Default behavior: use status-based exit code
|
|
283
|
+
return getExitCode(result.status);
|
|
248
284
|
}
|
|
249
|
-
// ─── Exit Code ──────────────────────────────────────────────────
|
|
250
285
|
/**
|
|
251
286
|
* Map review status to process exit code.
|
|
252
287
|
* PASSED and SKIPPED = 0, everything else = 1.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,cAAc,EACd,gBAAgB,
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}
|