@sunilp-org/jam-cli 0.1.0 → 0.1.2
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 +431 -63
- package/dist/commands/ask.d.ts +4 -0
- package/dist/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +202 -10
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/commit.d.ts +12 -0
- package/dist/commands/commit.d.ts.map +1 -0
- package/dist/commands/commit.js +135 -0
- package/dist/commands/commit.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +2 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/context.d.ts +12 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +52 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/review.d.ts +25 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +117 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +1 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +199 -197
- package/dist/commands/run.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +39 -3
- package/dist/config/loader.js.map +1 -1
- package/dist/index.js +63 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/base.d.ts +26 -0
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/embedded.d.ts +20 -0
- package/dist/providers/embedded.d.ts.map +1 -0
- package/dist/providers/embedded.js +302 -0
- package/dist/providers/embedded.js.map +1 -0
- package/dist/providers/factory.d.ts.map +1 -1
- package/dist/providers/factory.js +25 -1
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/groq.d.ts +16 -0
- package/dist/providers/groq.d.ts.map +1 -0
- package/dist/providers/groq.js +23 -0
- package/dist/providers/groq.js.map +1 -0
- package/dist/providers/ollama.d.ts +6 -1
- package/dist/providers/ollama.d.ts.map +1 -1
- package/dist/providers/ollama.js +77 -4
- package/dist/providers/ollama.js.map +1 -1
- package/dist/providers/openai.d.ts +18 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +229 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/tools/all-tools.d.ts +18 -0
- package/dist/tools/all-tools.d.ts.map +1 -0
- package/dist/tools/all-tools.js +95 -0
- package/dist/tools/all-tools.js.map +1 -0
- package/dist/tools/apply_patch.js +1 -1
- package/dist/tools/apply_patch.js.map +1 -1
- package/dist/tools/context-tools.d.ts +14 -0
- package/dist/tools/context-tools.d.ts.map +1 -0
- package/dist/tools/context-tools.js +63 -0
- package/dist/tools/context-tools.js.map +1 -0
- package/dist/tools/git_diff.js +1 -1
- package/dist/tools/git_diff.js.map +1 -1
- package/dist/tools/git_status.js +1 -1
- package/dist/tools/git_status.js.map +1 -1
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +2 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/run_command.d.ts +8 -3
- package/dist/tools/run_command.d.ts.map +1 -1
- package/dist/tools/run_command.js +90 -3
- package/dist/tools/run_command.js.map +1 -1
- package/dist/ui/chat.d.ts.map +1 -1
- package/dist/ui/chat.js +173 -1
- package/dist/ui/chat.js.map +1 -1
- package/dist/ui/logo.d.ts.map +1 -1
- package/dist/ui/logo.js +5 -1
- package/dist/ui/logo.js.map +1 -1
- package/dist/utils/agent.d.ts +130 -0
- package/dist/utils/agent.d.ts.map +1 -0
- package/dist/utils/agent.js +449 -0
- package/dist/utils/agent.js.map +1 -0
- package/dist/utils/cache.d.ts +30 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +62 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/context.d.ts +38 -0
- package/dist/utils/context.d.ts.map +1 -0
- package/dist/utils/context.js +383 -0
- package/dist/utils/context.js.map +1 -0
- package/dist/utils/critic.d.ts +31 -0
- package/dist/utils/critic.d.ts.map +1 -0
- package/dist/utils/critic.js +126 -0
- package/dist/utils/critic.js.map +1 -0
- package/dist/utils/index-builder.d.ts +53 -0
- package/dist/utils/index-builder.d.ts.map +1 -0
- package/dist/utils/index-builder.js +241 -0
- package/dist/utils/index-builder.js.map +1 -0
- package/dist/utils/memory.d.ts +104 -0
- package/dist/utils/memory.d.ts.map +1 -0
- package/dist/utils/memory.js +215 -0
- package/dist/utils/memory.js.map +1 -0
- package/dist/utils/past-sessions.d.ts +31 -0
- package/dist/utils/past-sessions.d.ts.map +1 -0
- package/dist/utils/past-sessions.js +126 -0
- package/dist/utils/past-sessions.js.map +1 -0
- package/dist/utils/tokens.d.ts +53 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +138 -0
- package/dist/utils/tokens.js.map +1 -0
- package/package.json +6 -2
package/dist/commands/ask.js
CHANGED
|
@@ -2,10 +2,19 @@ import { readFile } from 'node:fs/promises';
|
|
|
2
2
|
import { loadConfig, getActiveProfile } from '../config/loader.js';
|
|
3
3
|
import { createProvider } from '../providers/factory.js';
|
|
4
4
|
import { withRetry, collectStream } from '../utils/stream.js';
|
|
5
|
-
import { streamToStdout, printJsonResult, printError } from '../ui/renderer.js';
|
|
5
|
+
import { streamToStdout, printJsonResult, printError, renderMarkdown } from '../ui/renderer.js';
|
|
6
6
|
import { JamError } from '../utils/errors.js';
|
|
7
|
+
import { getWorkspaceRoot } from '../utils/workspace.js';
|
|
8
|
+
import { READ_ONLY_TOOL_SCHEMAS, executeReadOnlyTool } from '../tools/context-tools.js';
|
|
9
|
+
import { ToolCallTracker, loadProjectContext, buildSystemPrompt, enrichUserPrompt, generateSearchPlan, buildSynthesisReminder, formatToolCall, formatToolResult, formatSeparator, formatDuplicateSkip, formatHintInjection, formatUsage, formatPlanBlock, formatInternalStatus, } from '../utils/agent.js';
|
|
10
|
+
import { WorkingMemory } from '../utils/memory.js';
|
|
11
|
+
import { ToolResultCache } from '../utils/cache.js';
|
|
12
|
+
import { criticEvaluate, buildCriticCorrection } from '../utils/critic.js';
|
|
13
|
+
import { searchPastSessions, formatPastExchanges } from '../utils/past-sessions.js';
|
|
14
|
+
import { getOrBuildIndex, searchSymbols, formatSymbolResults } from '../utils/index-builder.js';
|
|
15
|
+
import { updateContextWithUsage } from '../utils/context.js';
|
|
16
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
7
17
|
async function readPromptFromStdin() {
|
|
8
|
-
// Only read from stdin if it's piped (not interactive TTY)
|
|
9
18
|
if (process.stdin.isTTY)
|
|
10
19
|
return null;
|
|
11
20
|
return new Promise((resolve, reject) => {
|
|
@@ -15,6 +24,26 @@ async function readPromptFromStdin() {
|
|
|
15
24
|
process.stdin.on('error', reject);
|
|
16
25
|
});
|
|
17
26
|
}
|
|
27
|
+
// ── Main command ──────────────────────────────────────────────────────────────
|
|
28
|
+
/** Render the final answer (shared by tool-loop exit and synthesis). */
|
|
29
|
+
async function renderFinalAnswer(text, usage, options, profile, noColor, stderrLog) {
|
|
30
|
+
if (options.json) {
|
|
31
|
+
printJsonResult({ response: text, usage, model: profile.model });
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
try {
|
|
35
|
+
const rendered = await renderMarkdown(text);
|
|
36
|
+
process.stdout.write(rendered);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
process.stdout.write(text + '\n');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (usage && !options.json) {
|
|
43
|
+
const u = usage;
|
|
44
|
+
stderrLog(`\n${formatUsage(u.promptTokens, u.completionTokens, u.totalTokens, noColor)}\n`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
18
47
|
export async function runAsk(inlinePrompt, options) {
|
|
19
48
|
try {
|
|
20
49
|
// Resolve prompt from file, inline arg, or stdin (priority order)
|
|
@@ -41,6 +70,8 @@ export async function runAsk(inlinePrompt, options) {
|
|
|
41
70
|
const chalk = await import('chalk');
|
|
42
71
|
chalk.default.level = 0;
|
|
43
72
|
}
|
|
73
|
+
// Quiet mode: suppress all non-essential stderr output
|
|
74
|
+
const stderrLog = options.quiet ? (_msg) => { } : (msg) => process.stderr.write(msg);
|
|
44
75
|
// Load config with CLI overrides
|
|
45
76
|
const cliOverrides = {
|
|
46
77
|
profile: options.profile,
|
|
@@ -52,25 +83,186 @@ export async function runAsk(inlinePrompt, options) {
|
|
|
52
83
|
const profile = getActiveProfile(config);
|
|
53
84
|
// Create provider
|
|
54
85
|
const adapter = await createProvider(profile);
|
|
86
|
+
// ── Agentic context-gathering phase ───────────────────────────────────────
|
|
87
|
+
const useTools = options.tools !== false &&
|
|
88
|
+
typeof adapter.chatWithTools === 'function';
|
|
89
|
+
// Build workspace context for better model reasoning
|
|
90
|
+
const workspaceRoot = useTools ? await getWorkspaceRoot() : '';
|
|
91
|
+
const { jamContext, workspaceCtx } = useTools
|
|
92
|
+
? await loadProjectContext(workspaceRoot)
|
|
93
|
+
: { jamContext: null, workspaceCtx: '' };
|
|
94
|
+
const systemPrompt = options.system ??
|
|
95
|
+
profile.systemPrompt ??
|
|
96
|
+
(useTools ? buildSystemPrompt(jamContext, workspaceCtx) : undefined);
|
|
97
|
+
if (useTools && adapter.chatWithTools) {
|
|
98
|
+
const noColor = options.noColor ?? false;
|
|
99
|
+
const tracker = new ToolCallTracker();
|
|
100
|
+
const memory = new WorkingMemory(adapter, profile.model, systemPrompt);
|
|
101
|
+
const cache = new ToolResultCache();
|
|
102
|
+
// ── Symbol index: pre-load for planner enrichment ───────────────────
|
|
103
|
+
let symbolHint = '';
|
|
104
|
+
try {
|
|
105
|
+
const index = await getOrBuildIndex(workspaceRoot);
|
|
106
|
+
const symbols = searchSymbols(index, prompt, 10);
|
|
107
|
+
symbolHint = formatSymbolResults(symbols);
|
|
108
|
+
}
|
|
109
|
+
catch { /* non-fatal */ }
|
|
110
|
+
// ── Past sessions: find relevant prior Q&A ──────────────────────────
|
|
111
|
+
let pastContext = '';
|
|
112
|
+
try {
|
|
113
|
+
const pastExchanges = await searchPastSessions(prompt, workspaceRoot, 2);
|
|
114
|
+
pastContext = formatPastExchanges(pastExchanges);
|
|
115
|
+
}
|
|
116
|
+
catch { /* non-fatal */ }
|
|
117
|
+
// ── Planning phase: deep reasoning about what to search for ─────────
|
|
118
|
+
stderrLog(formatSeparator('Planning', noColor));
|
|
119
|
+
const projectCtxForPlan = [jamContext ?? workspaceCtx, symbolHint, pastContext].filter(Boolean).join('\n\n');
|
|
120
|
+
const searchPlan = await generateSearchPlan(adapter, prompt, projectCtxForPlan, {
|
|
121
|
+
model: profile.model,
|
|
122
|
+
temperature: profile.temperature,
|
|
123
|
+
maxTokens: profile.maxTokens,
|
|
124
|
+
});
|
|
125
|
+
if (searchPlan) {
|
|
126
|
+
stderrLog(formatPlanBlock(searchPlan, noColor) + '\n');
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
stderrLog(formatInternalStatus('planning skipped — using generic search strategy', noColor) + '\n');
|
|
130
|
+
}
|
|
131
|
+
// Enrich the user's prompt with the search plan
|
|
132
|
+
const enrichedPrompt = enrichUserPrompt(prompt, searchPlan);
|
|
133
|
+
let messages = [{ role: 'user', content: enrichedPrompt }];
|
|
134
|
+
const MAX_TOOL_ROUNDS = 15;
|
|
135
|
+
let synthesisInjected = false;
|
|
136
|
+
stderrLog(formatSeparator('Searching codebase', noColor));
|
|
137
|
+
for (let round = 0; round < MAX_TOOL_ROUNDS; round++) {
|
|
138
|
+
// ── Context window management: compact if approaching limit ───────
|
|
139
|
+
if (memory.shouldCompact(messages)) {
|
|
140
|
+
stderrLog(formatInternalStatus('Compacting context…', noColor) + '\n');
|
|
141
|
+
messages = await memory.compact(messages);
|
|
142
|
+
}
|
|
143
|
+
const response = await adapter.chatWithTools(messages, READ_ONLY_TOOL_SCHEMAS, {
|
|
144
|
+
model: profile.model,
|
|
145
|
+
temperature: profile.temperature,
|
|
146
|
+
maxTokens: profile.maxTokens,
|
|
147
|
+
systemPrompt,
|
|
148
|
+
});
|
|
149
|
+
// No tool calls → model is ready to answer
|
|
150
|
+
if (!response.toolCalls || response.toolCalls.length === 0) {
|
|
151
|
+
const finalText = response.content ?? '';
|
|
152
|
+
// ── Synthesis grounding: remind model of the original question ───
|
|
153
|
+
if (tracker.totalCalls > 0 && !synthesisInjected && round < MAX_TOOL_ROUNDS - 2) {
|
|
154
|
+
synthesisInjected = true;
|
|
155
|
+
// If the model already produced an answer, run critic evaluation
|
|
156
|
+
if (finalText.trim().length > 0) {
|
|
157
|
+
stderrLog(formatInternalStatus('Evaluating answer quality…', noColor) + '\n');
|
|
158
|
+
const verdict = await criticEvaluate(adapter, prompt, finalText, { model: profile.model });
|
|
159
|
+
if (verdict.pass) {
|
|
160
|
+
stderrLog(formatSeparator('Answer', noColor));
|
|
161
|
+
await renderFinalAnswer(finalText, response.usage, options, profile, noColor, stderrLog);
|
|
162
|
+
// Auto-update JAM.md with usage patterns
|
|
163
|
+
const log = memory.getAccessLog();
|
|
164
|
+
updateContextWithUsage(workspaceRoot, log.readFiles, log.searchQueries).catch(() => { });
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
// Critic rejected — use its specific feedback
|
|
168
|
+
stderrLog(formatInternalStatus(`Critic: ${verdict.reason}`, noColor) + '\n');
|
|
169
|
+
messages.push({ role: 'assistant', content: finalText });
|
|
170
|
+
messages.push({ role: 'user', content: buildCriticCorrection(verdict, prompt) });
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
// No answer yet — inject synthesis reminder
|
|
174
|
+
stderrLog(formatInternalStatus('Grounding answer to your question…', noColor) + '\n');
|
|
175
|
+
messages.push({ role: 'assistant', content: finalText });
|
|
176
|
+
messages.push({ role: 'user', content: buildSynthesisReminder(prompt) });
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
// ── Final critic check ──────────────────────────────────────────
|
|
180
|
+
if (tracker.totalCalls > 0 && finalText.trim().length > 30 && round < MAX_TOOL_ROUNDS - 2) {
|
|
181
|
+
const verdict = await criticEvaluate(adapter, prompt, finalText, { model: profile.model });
|
|
182
|
+
if (!verdict.pass) {
|
|
183
|
+
stderrLog(formatInternalStatus(`Critic: ${verdict.reason}`, noColor) + '\n');
|
|
184
|
+
messages.push({ role: 'assistant', content: finalText });
|
|
185
|
+
messages.push({ role: 'user', content: buildCriticCorrection(verdict, prompt) });
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
stderrLog(formatSeparator('Answer', noColor));
|
|
190
|
+
await renderFinalAnswer(finalText, response.usage, options, profile, noColor, stderrLog);
|
|
191
|
+
// Auto-update JAM.md with usage patterns
|
|
192
|
+
const log = memory.getAccessLog();
|
|
193
|
+
updateContextWithUsage(workspaceRoot, log.readFiles, log.searchQueries).catch(() => { });
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
// ── Execute tool calls ────────────────────────────────────────────────
|
|
197
|
+
messages.push({ role: 'assistant', content: response.content ?? '' });
|
|
198
|
+
for (const tc of response.toolCalls) {
|
|
199
|
+
// Duplicate detection — skip and inject guidance
|
|
200
|
+
if (tracker.isDuplicate(tc.name, tc.arguments)) {
|
|
201
|
+
stderrLog(formatDuplicateSkip(tc.name, noColor) + '\n');
|
|
202
|
+
messages.push({
|
|
203
|
+
role: 'user',
|
|
204
|
+
content: `[Tool result: ${tc.name}]\nYou already made this exact call. The result was the same as before. Try a DIFFERENT search query or tool.`,
|
|
205
|
+
});
|
|
206
|
+
tracker.record(tc.name, tc.arguments, true);
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
// Check cache first
|
|
210
|
+
const cached = cache.get(tc.name, tc.arguments);
|
|
211
|
+
if (cached !== null) {
|
|
212
|
+
stderrLog(formatToolCall(tc.name, tc.arguments, noColor) + ' (cached)\n');
|
|
213
|
+
const capped = memory.processToolResult(tc.name, tc.arguments, cached);
|
|
214
|
+
messages.push({ role: 'user', content: `[Tool result: ${tc.name}]\n${capped}` });
|
|
215
|
+
tracker.record(tc.name, tc.arguments, false);
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
stderrLog(formatToolCall(tc.name, tc.arguments, noColor) + '\n');
|
|
219
|
+
let toolOutput;
|
|
220
|
+
let wasError = false;
|
|
221
|
+
try {
|
|
222
|
+
toolOutput = await executeReadOnlyTool(tc.name, tc.arguments, workspaceRoot);
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
toolOutput = `Tool error: ${JamError.fromUnknown(err).message}`;
|
|
226
|
+
wasError = true;
|
|
227
|
+
}
|
|
228
|
+
// Cache the result
|
|
229
|
+
if (!wasError)
|
|
230
|
+
cache.set(tc.name, tc.arguments, toolOutput);
|
|
231
|
+
// Cap the output before injecting into messages
|
|
232
|
+
const cappedOutput = memory.processToolResult(tc.name, tc.arguments, toolOutput);
|
|
233
|
+
stderrLog(formatToolResult(cappedOutput, noColor) + '\n');
|
|
234
|
+
tracker.record(tc.name, tc.arguments, wasError);
|
|
235
|
+
messages.push({ role: 'user', content: `[Tool result: ${tc.name}]\n${cappedOutput}` });
|
|
236
|
+
}
|
|
237
|
+
// ── Scratchpad: periodic working memory checkpoint ─────────────────
|
|
238
|
+
if (memory.shouldScratchpad(round)) {
|
|
239
|
+
stderrLog(formatInternalStatus('Working memory checkpoint…', noColor) + '\n');
|
|
240
|
+
messages.push(memory.scratchpadPrompt());
|
|
241
|
+
}
|
|
242
|
+
// ── Inject correction hints if stuck ──────────────────────────────────
|
|
243
|
+
const hint = tracker.getCorrectionHint();
|
|
244
|
+
if (hint) {
|
|
245
|
+
stderrLog(formatHintInjection(noColor) + '\n');
|
|
246
|
+
messages.push({ role: 'user', content: hint });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// Exceeded round limit — fall through to streaming
|
|
250
|
+
stderrLog(formatSeparator('Max tool rounds reached, generating answer', noColor));
|
|
251
|
+
}
|
|
252
|
+
// ── Standard streaming response ───────────────────────────────────────────
|
|
55
253
|
const request = {
|
|
56
254
|
messages: [{ role: 'user', content: prompt }],
|
|
57
255
|
model: profile.model,
|
|
58
256
|
temperature: profile.temperature,
|
|
59
257
|
maxTokens: profile.maxTokens,
|
|
60
|
-
systemPrompt
|
|
258
|
+
systemPrompt,
|
|
61
259
|
};
|
|
62
260
|
if (options.json) {
|
|
63
|
-
// Collect stream then emit JSON
|
|
64
261
|
const stream = withRetry(() => adapter.streamCompletion(request));
|
|
65
262
|
const { text, usage } = await collectStream(stream);
|
|
66
|
-
printJsonResult({
|
|
67
|
-
response: text,
|
|
68
|
-
usage,
|
|
69
|
-
model: profile.model,
|
|
70
|
-
});
|
|
263
|
+
printJsonResult({ response: text, usage, model: profile.model });
|
|
71
264
|
}
|
|
72
265
|
else {
|
|
73
|
-
// Stream directly to stdout
|
|
74
266
|
const stream = withRetry(() => adapter.streamCompletion(request));
|
|
75
267
|
await streamToStdout(stream);
|
|
76
268
|
}
|
package/dist/commands/ask.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CliOverrides } from '../config/schema.js';
|
|
2
|
+
export interface CommitOptions extends CliOverrides {
|
|
3
|
+
dry?: boolean;
|
|
4
|
+
yes?: boolean;
|
|
5
|
+
amend?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function getStagedDiff(cwd: string): Promise<string>;
|
|
8
|
+
export declare function getLastCommitDiff(cwd: string): Promise<string>;
|
|
9
|
+
/** Strip surrounding whitespace and any accidental markdown fences from the model output. */
|
|
10
|
+
export declare function cleanCommitMessage(raw: string): string;
|
|
11
|
+
export declare function runCommit(options: CommitOptions): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=commit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,MAAM,WAAW,aAAc,SAAQ,YAAY;IACjD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAiBD,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAchE;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAcpE;AAkBD,6FAA6F;AAC7F,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAItD;AAID,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFrE"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { createInterface } from 'node:readline/promises';
|
|
4
|
+
import { loadConfig, getActiveProfile } from '../config/loader.js';
|
|
5
|
+
import { createProvider } from '../providers/factory.js';
|
|
6
|
+
import { withRetry, collectStream } from '../utils/stream.js';
|
|
7
|
+
import { printError, printSuccess } from '../ui/renderer.js';
|
|
8
|
+
import { JamError } from '../utils/errors.js';
|
|
9
|
+
import { getWorkspaceRoot } from '../utils/workspace.js';
|
|
10
|
+
const execFileAsync = promisify(execFile);
|
|
11
|
+
// ── Conventional-commit system prompt ────────────────────────────────────────
|
|
12
|
+
const SYSTEM_PROMPT = `You are an expert software engineer. Given a git diff, generate a concise \
|
|
13
|
+
commit message following the Conventional Commits specification.
|
|
14
|
+
|
|
15
|
+
Rules:
|
|
16
|
+
- Format: <type>(<scope>): <short description>
|
|
17
|
+
- Types: feat, fix, docs, style, refactor, perf, test, chore, ci, build
|
|
18
|
+
- Scope is optional but helpful when it adds clarity
|
|
19
|
+
- Short description: imperative mood, lowercase, no period, ≤72 chars total for the first line
|
|
20
|
+
- If changes are complex, add a blank line followed by a brief body (max 3 lines)
|
|
21
|
+
- Output ONLY the commit message text, nothing else — no markdown, no explanation`;
|
|
22
|
+
// ── Git helpers ───────────────────────────────────────────────────────────────
|
|
23
|
+
export async function getStagedDiff(cwd) {
|
|
24
|
+
try {
|
|
25
|
+
const { stdout } = await execFileAsync('git', ['diff', '--staged'], {
|
|
26
|
+
cwd,
|
|
27
|
+
maxBuffer: 2 * 1024 * 1024,
|
|
28
|
+
});
|
|
29
|
+
return stdout.trim();
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
throw new JamError('Failed to run git diff --staged. Is this a git repository?', 'TOOL_EXEC_ERROR', { cause: err });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function getLastCommitDiff(cwd) {
|
|
36
|
+
try {
|
|
37
|
+
const { stdout } = await execFileAsync('git', ['show', 'HEAD'], {
|
|
38
|
+
cwd,
|
|
39
|
+
maxBuffer: 2 * 1024 * 1024,
|
|
40
|
+
});
|
|
41
|
+
return stdout.trim();
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
throw new JamError('Failed to get the last commit diff. Is there at least one commit in this repository?', 'TOOL_EXEC_ERROR', { cause: err });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function runGitCommit(message, amend, cwd) {
|
|
48
|
+
const args = ['commit', '-m', message];
|
|
49
|
+
if (amend)
|
|
50
|
+
args.push('--amend');
|
|
51
|
+
try {
|
|
52
|
+
await execFileAsync('git', args, { cwd });
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
throw new JamError('git commit failed. Make sure you have staged changes and a valid git identity.', 'TOOL_EXEC_ERROR', { cause: err });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// ── Pure helpers (exported for testing) ──────────────────────────────────────
|
|
59
|
+
/** Strip surrounding whitespace and any accidental markdown fences from the model output. */
|
|
60
|
+
export function cleanCommitMessage(raw) {
|
|
61
|
+
// Remove optional triple-backtick wrappers the model might produce
|
|
62
|
+
const stripped = raw.replace(/^```[^\n]*\n?/m, '').replace(/\n?```\s*$/m, '');
|
|
63
|
+
return stripped.trim();
|
|
64
|
+
}
|
|
65
|
+
// ── Main command ──────────────────────────────────────────────────────────────
|
|
66
|
+
export async function runCommit(options) {
|
|
67
|
+
try {
|
|
68
|
+
const workspaceRoot = await getWorkspaceRoot();
|
|
69
|
+
// Determine which diff to use
|
|
70
|
+
let diff;
|
|
71
|
+
if (options.amend) {
|
|
72
|
+
// For amend: prefer staged changes merged on top of the last commit, else just the last commit
|
|
73
|
+
const staged = await getStagedDiff(workspaceRoot);
|
|
74
|
+
const last = await getLastCommitDiff(workspaceRoot);
|
|
75
|
+
diff = staged || last;
|
|
76
|
+
if (!diff) {
|
|
77
|
+
await printError('No staged changes or previous commit diff found for --amend.');
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
diff = await getStagedDiff(workspaceRoot);
|
|
83
|
+
if (!diff) {
|
|
84
|
+
await printError('No staged changes found. Stage your changes with `git add` first.');
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Load config and create provider
|
|
89
|
+
const config = await loadConfig(process.cwd(), options);
|
|
90
|
+
const profile = getActiveProfile(config);
|
|
91
|
+
const adapter = await createProvider(profile);
|
|
92
|
+
const prompt = `Generate a conventional commit message for the following git diff:\n\n` +
|
|
93
|
+
`\`\`\`diff\n${diff}\n\`\`\``;
|
|
94
|
+
process.stderr.write('Generating commit message...\n');
|
|
95
|
+
const { text } = await collectStream(withRetry(() => adapter.streamCompletion({
|
|
96
|
+
messages: [{ role: 'user', content: prompt }],
|
|
97
|
+
model: profile.model,
|
|
98
|
+
temperature: profile.temperature ?? 0.2,
|
|
99
|
+
maxTokens: 256,
|
|
100
|
+
systemPrompt: SYSTEM_PROMPT,
|
|
101
|
+
})));
|
|
102
|
+
const message = cleanCommitMessage(text);
|
|
103
|
+
if (!message) {
|
|
104
|
+
await printError('The model did not produce a commit message. Please try again.');
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
// Display the generated message
|
|
108
|
+
process.stdout.write('\nGenerated commit message:\n\n');
|
|
109
|
+
process.stdout.write(' ' + message.split('\n').join('\n ') + '\n\n');
|
|
110
|
+
if (options.dry) {
|
|
111
|
+
process.stderr.write('Dry run — no commit was made.\n');
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// Confirm (unless --yes)
|
|
115
|
+
if (!options.yes) {
|
|
116
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
117
|
+
const answer = await rl.question(options.amend
|
|
118
|
+
? 'Amend last commit with this message? [y/N] '
|
|
119
|
+
: 'Commit with this message? [y/N] ');
|
|
120
|
+
rl.close();
|
|
121
|
+
if (answer.toLowerCase() !== 'y') {
|
|
122
|
+
process.stderr.write('Commit cancelled.\n');
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
await runGitCommit(message, options.amend ?? false, workspaceRoot);
|
|
127
|
+
await printSuccess(options.amend ? 'Last commit amended successfully.' : 'Commit created successfully.');
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
const jamErr = JamError.fromUnknown(err);
|
|
131
|
+
await printError(jamErr.message);
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/commands/commit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,wBAAsB,aAAa,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB7E;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,wBAAsB,aAAa,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB7E;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCrF"}
|
package/dist/commands/config.js
CHANGED
|
@@ -29,7 +29,8 @@ export async function runConfigInit(options = {}) {
|
|
|
29
29
|
let configDir;
|
|
30
30
|
let configPath;
|
|
31
31
|
if (options.global) {
|
|
32
|
-
|
|
32
|
+
// Use ~/.jam/config.json as the preferred user-level location
|
|
33
|
+
configDir = join(homedir(), '.jam');
|
|
33
34
|
configPath = join(configDir, 'config.json');
|
|
34
35
|
}
|
|
35
36
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAwB,EAAE;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG;YACb,MAAM;YACN,aAAa,EAAE;gBACb,IAAI,EAAE,MAAM,CAAC,cAAc;gBAC3B,GAAG,OAAO;aACX;SACF,CAAC;QAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAgC,EAAE;IACpE,IAAI,CAAC;QACH,IAAI,SAAiB,CAAC;QACtB,IAAI,UAAkB,CAAC;QAEvB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ContextInitOptions {
|
|
2
|
+
force?: boolean;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* `jam context init` — generate a JAM.md file at the workspace root.
|
|
6
|
+
*/
|
|
7
|
+
export declare function runContextInit(options?: ContextInitOptions): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* `jam context show` — display the current JAM.md contents.
|
|
10
|
+
*/
|
|
11
|
+
export declare function runContextShow(): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBpF;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBpD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { getWorkspaceRoot } from '../utils/workspace.js';
|
|
2
|
+
import { generateContextContent, writeContextFile, loadContextFile, contextFileExists, CONTEXT_FILENAME, } from '../utils/context.js';
|
|
3
|
+
import { printError, printSuccess, renderMarkdown } from '../ui/renderer.js';
|
|
4
|
+
import { JamError } from '../utils/errors.js';
|
|
5
|
+
/**
|
|
6
|
+
* `jam context init` — generate a JAM.md file at the workspace root.
|
|
7
|
+
*/
|
|
8
|
+
export async function runContextInit(options = {}) {
|
|
9
|
+
try {
|
|
10
|
+
const workspaceRoot = await getWorkspaceRoot();
|
|
11
|
+
if (!options.force && await contextFileExists(workspaceRoot)) {
|
|
12
|
+
await printError(`${CONTEXT_FILENAME} already exists. Use --force to overwrite.`);
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const content = await generateContextContent(workspaceRoot);
|
|
16
|
+
const path = await writeContextFile(workspaceRoot, content);
|
|
17
|
+
await printSuccess(`Created ${CONTEXT_FILENAME} at: ${path}`);
|
|
18
|
+
process.stderr.write('\nThis file is automatically read by `jam ask` and `jam chat`.\n' +
|
|
19
|
+
'Edit it to add architecture notes, coding conventions, and project-specific context.\n');
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
const jamErr = JamError.fromUnknown(err);
|
|
23
|
+
await printError(jamErr.message);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* `jam context show` — display the current JAM.md contents.
|
|
29
|
+
*/
|
|
30
|
+
export async function runContextShow() {
|
|
31
|
+
try {
|
|
32
|
+
const workspaceRoot = await getWorkspaceRoot();
|
|
33
|
+
const content = await loadContextFile(workspaceRoot);
|
|
34
|
+
if (!content) {
|
|
35
|
+
await printError(`No ${CONTEXT_FILENAME} found. Run \`jam context init\` to generate one.`);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const rendered = await renderMarkdown(content);
|
|
40
|
+
process.stdout.write(rendered);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
process.stdout.write(content);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
const jamErr = JamError.fromUnknown(err);
|
|
48
|
+
await printError(jamErr.message);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAM9C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAA8B,EAAE;IACnE,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAE/C,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7D,MAAM,UAAU,CACd,GAAG,gBAAgB,4CAA4C,CAChE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,aAAa,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE5D,MAAM,YAAY,CAAC,WAAW,gBAAgB,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kEAAkE;YAClE,wFAAwF,CACzF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;QAErD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,UAAU,CACd,MAAM,gBAAgB,mDAAmD,CAC1E,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;YAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { CliOverrides } from '../config/schema.js';
|
|
2
|
+
export interface ReviewOptions extends CliOverrides {
|
|
3
|
+
base?: string;
|
|
4
|
+
pr?: number;
|
|
5
|
+
json?: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Returns the diff between the current branch and the given base ref.
|
|
9
|
+
* Uses `git diff <base>...HEAD` (three-dot) to show only changes introduced
|
|
10
|
+
* on the current branch since it diverged from base.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getBranchDiff(cwd: string, base: string): Promise<string>;
|
|
13
|
+
export declare function getMergeBase(cwd: string, base: string): Promise<string>;
|
|
14
|
+
/**
|
|
15
|
+
* Returns the diff for a specific PR number using the GitHub CLI (`gh`).
|
|
16
|
+
* Requires `gh` to be installed and authenticated.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getPrDiff(cwd: string, pr: number): Promise<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Returns the current branch name.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getCurrentBranch(cwd: string): Promise<string>;
|
|
23
|
+
export declare function buildReviewPrompt(diff: string, context: string): string;
|
|
24
|
+
export declare function runReview(options?: ReviewOptions): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,MAAM,WAAW,aAAc,SAAQ,YAAY;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAID;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB9E;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe7E;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAexE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAenE;AAID,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CASvE;AAID,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD1E"}
|