@sunilp-org/jam-cli 0.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 +21 -0
- package/README.md +625 -0
- package/dist/commands/ask.d.ts +9 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +84 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/auth.d.ts +4 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +44 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/chat.d.ts +10 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +57 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/completion.d.ts +4 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +156 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +6 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +59 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/diff.d.ts +9 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +69 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +86 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/explain.d.ts +7 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +72 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/history.d.ts +3 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +99 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/models.d.ts +3 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +39 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/patch.d.ts +8 -0
- package/dist/commands/patch.d.ts.map +1 -0
- package/dist/commands/patch.js +158 -0
- package/dist/commands/patch.js.map +1 -0
- package/dist/commands/run.d.ts +6 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +241 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/search.d.ts +9 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +128 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/config/defaults.d.ts +3 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +16 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/loader.d.ts +4 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +103 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +104 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +21 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +249 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/base.d.ts +32 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +2 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/factory.d.ts +4 -0
- package/dist/providers/factory.d.ts.map +1 -0
- package/dist/providers/factory.js +13 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/ollama.d.ts +14 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +152 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/storage/history.d.ts +21 -0
- package/dist/storage/history.d.ts.map +1 -0
- package/dist/storage/history.js +103 -0
- package/dist/storage/history.js.map +1 -0
- package/dist/tools/apply_patch.d.ts +3 -0
- package/dist/tools/apply_patch.d.ts.map +1 -0
- package/dist/tools/apply_patch.js +86 -0
- package/dist/tools/apply_patch.js.map +1 -0
- package/dist/tools/git_diff.d.ts +3 -0
- package/dist/tools/git_diff.d.ts.map +1 -0
- package/dist/tools/git_diff.js +49 -0
- package/dist/tools/git_diff.js.map +1 -0
- package/dist/tools/git_status.d.ts +3 -0
- package/dist/tools/git_status.d.ts.map +1 -0
- package/dist/tools/git_status.js +26 -0
- package/dist/tools/git_status.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +10 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list_dir.d.ts +3 -0
- package/dist/tools/list_dir.d.ts.map +1 -0
- package/dist/tools/list_dir.js +61 -0
- package/dist/tools/list_dir.js.map +1 -0
- package/dist/tools/read_file.d.ts +3 -0
- package/dist/tools/read_file.d.ts.map +1 -0
- package/dist/tools/read_file.js +83 -0
- package/dist/tools/read_file.js.map +1 -0
- package/dist/tools/registry.d.ts +12 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +76 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/run_command.d.ts +6 -0
- package/dist/tools/run_command.d.ts.map +1 -0
- package/dist/tools/run_command.js +37 -0
- package/dist/tools/run_command.js.map +1 -0
- package/dist/tools/search_text.d.ts +3 -0
- package/dist/tools/search_text.d.ts.map +1 -0
- package/dist/tools/search_text.js +171 -0
- package/dist/tools/search_text.js.map +1 -0
- package/dist/tools/types.d.ts +25 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/write_file.d.ts +3 -0
- package/dist/tools/write_file.d.ts.map +1 -0
- package/dist/tools/write_file.js +61 -0
- package/dist/tools/write_file.js.map +1 -0
- package/dist/ui/chat.d.ts +10 -0
- package/dist/ui/chat.d.ts.map +1 -0
- package/dist/ui/chat.js +173 -0
- package/dist/ui/chat.js.map +1 -0
- package/dist/ui/logo.d.ts +14 -0
- package/dist/ui/logo.d.ts.map +1 -0
- package/dist/ui/logo.js +76 -0
- package/dist/ui/logo.js.map +1 -0
- package/dist/ui/renderer.d.ts +15 -0
- package/dist/ui/renderer.d.ts.map +1 -0
- package/dist/ui/renderer.js +61 -0
- package/dist/ui/renderer.js.map +1 -0
- package/dist/utils/errors.d.ts +14 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +26 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +17 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +50 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/secrets.d.ts +4 -0
- package/dist/utils/secrets.d.ts.map +1 -0
- package/dist/utils/secrets.js +39 -0
- package/dist/utils/secrets.js.map +1 -0
- package/dist/utils/stream.d.ts +12 -0
- package/dist/utils/stream.d.ts.map +1 -0
- package/dist/utils/stream.js +54 -0
- package/dist/utils/stream.js.map +1 -0
- package/dist/utils/workspace.d.ts +14 -0
- package/dist/utils/workspace.d.ts.map +1 -0
- package/dist/utils/workspace.js +39 -0
- package/dist/utils/workspace.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { loadConfig, getActiveProfile } from '../config/loader.js';
|
|
4
|
+
import { createProvider } from '../providers/factory.js';
|
|
5
|
+
const execFileAsync = promisify(execFile);
|
|
6
|
+
async function check(description, fn) {
|
|
7
|
+
try {
|
|
8
|
+
const detail = (await fn()) ?? '';
|
|
9
|
+
return { ok: true, description, detail: String(detail) };
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
13
|
+
return { ok: false, description, detail };
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function runDoctor(options) {
|
|
17
|
+
const chalk = (await import('chalk')).default;
|
|
18
|
+
const results = await Promise.all([
|
|
19
|
+
// 1. Node.js version check
|
|
20
|
+
check('Node.js version >= 20', () => {
|
|
21
|
+
const version = process.version; // e.g. "v20.0.0"
|
|
22
|
+
const major = parseInt(version.slice(1).split('.')[0] ?? '0', 10);
|
|
23
|
+
if (major < 20) {
|
|
24
|
+
throw new Error(`Node.js ${version} detected — upgrade to v20 or later`);
|
|
25
|
+
}
|
|
26
|
+
return Promise.resolve(version);
|
|
27
|
+
}),
|
|
28
|
+
// 2. Config file parse check
|
|
29
|
+
check('Config file is valid', async () => {
|
|
30
|
+
const config = await loadConfig(process.cwd(), options);
|
|
31
|
+
return `Active profile: "${config.defaultProfile}"`;
|
|
32
|
+
}),
|
|
33
|
+
// 3. Provider connectivity
|
|
34
|
+
check('Provider connectivity', async () => {
|
|
35
|
+
const config = await loadConfig(process.cwd(), options);
|
|
36
|
+
const profile = getActiveProfile(config);
|
|
37
|
+
const adapter = await createProvider(profile);
|
|
38
|
+
await adapter.validateCredentials();
|
|
39
|
+
return `Provider: ${profile.provider}`;
|
|
40
|
+
}),
|
|
41
|
+
// 4. ripgrep availability
|
|
42
|
+
check('ripgrep (rg) is available', async () => {
|
|
43
|
+
const { stdout } = await execFileAsync('rg', ['--version'], { timeout: 5000 });
|
|
44
|
+
const firstLine = stdout.split('\n')[0]?.trim() ?? 'rg';
|
|
45
|
+
return firstLine;
|
|
46
|
+
}),
|
|
47
|
+
// 5. Keytar availability
|
|
48
|
+
check('keytar is available (secure credential storage)', async () => {
|
|
49
|
+
try {
|
|
50
|
+
await import('keytar');
|
|
51
|
+
return 'keytar loaded successfully';
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
throw new Error(`keytar not available — falling back to environment variables. (${err instanceof Error ? err.message : String(err)})`);
|
|
55
|
+
}
|
|
56
|
+
}),
|
|
57
|
+
]);
|
|
58
|
+
process.stdout.write('\nJam Doctor — system diagnostics\n');
|
|
59
|
+
process.stdout.write(chalk.dim('─'.repeat(60) + '\n\n'));
|
|
60
|
+
for (const result of results) {
|
|
61
|
+
const icon = result.ok ? chalk.green('[✓]') : chalk.red('[✗]');
|
|
62
|
+
const label = result.ok ? chalk.green(result.description) : chalk.red(result.description);
|
|
63
|
+
const detail = result.detail ? chalk.dim(` — ${result.detail}`) : '';
|
|
64
|
+
process.stdout.write(`${icon} ${label}${detail}\n`);
|
|
65
|
+
}
|
|
66
|
+
process.stdout.write('\n');
|
|
67
|
+
const failCount = results.filter((r) => !r.ok).length;
|
|
68
|
+
if (failCount === 0) {
|
|
69
|
+
process.stdout.write(chalk.green('All checks passed.\n'));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
process.stdout.write(chalk.yellow(`${failCount} check${failCount === 1 ? '' : 's'} failed or degraded.\n`));
|
|
73
|
+
// Additional guidance for known failures
|
|
74
|
+
const rgFailed = results.find((r) => r.description.includes('ripgrep') && !r.ok);
|
|
75
|
+
if (rgFailed) {
|
|
76
|
+
process.stdout.write(chalk.dim('\nNote: ripgrep is optional — Jam will fall back to a JavaScript-based search.\n' +
|
|
77
|
+
'Install ripgrep for faster search: https://github.com/BurntSushi/ripgrep#installation\n'));
|
|
78
|
+
}
|
|
79
|
+
const keytarFailed = results.find((r) => r.description.includes('keytar') && !r.ok);
|
|
80
|
+
if (keytarFailed) {
|
|
81
|
+
process.stdout.write(chalk.dim('\nNote: Without keytar, API keys must be provided via environment variables.\n' +
|
|
82
|
+
'Example: JAM_API_KEY=<your-key> jam ask "hello"\n'));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CliOverrides } from '../config/schema.js';
|
|
2
|
+
export interface ExplainOptions extends CliOverrides {
|
|
3
|
+
json?: boolean;
|
|
4
|
+
noColor?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function runExplain(filePaths: string[], options: ExplainOptions): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=explain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../src/commands/explain.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AASD,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D5F"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { resolve, relative } from 'node:path';
|
|
3
|
+
import { loadConfig, getActiveProfile } from '../config/loader.js';
|
|
4
|
+
import { createProvider } from '../providers/factory.js';
|
|
5
|
+
import { withRetry } from '../utils/stream.js';
|
|
6
|
+
import { streamToStdout, printJsonResult, printError } from '../ui/renderer.js';
|
|
7
|
+
import { collectStream } from '../utils/stream.js';
|
|
8
|
+
import { JamError } from '../utils/errors.js';
|
|
9
|
+
import { getWorkspaceRoot } from '../utils/workspace.js';
|
|
10
|
+
const MAX_FILE_BYTES = 500_000;
|
|
11
|
+
function addLineNumbers(content) {
|
|
12
|
+
return content
|
|
13
|
+
.split('\n')
|
|
14
|
+
.map((line, i) => `${String(i + 1).padStart(4, ' ')} | ${line}`)
|
|
15
|
+
.join('\n');
|
|
16
|
+
}
|
|
17
|
+
export async function runExplain(filePaths, options) {
|
|
18
|
+
if (filePaths.length === 0) {
|
|
19
|
+
await printError('Provide at least one file path. Usage: jam explain <path> [<path2> ...]');
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const workspaceRoot = await getWorkspaceRoot();
|
|
24
|
+
const config = await loadConfig(process.cwd(), options);
|
|
25
|
+
const profile = getActiveProfile(config);
|
|
26
|
+
const adapter = await createProvider(profile);
|
|
27
|
+
const sections = [];
|
|
28
|
+
for (const filePath of filePaths) {
|
|
29
|
+
const absPath = resolve(filePath);
|
|
30
|
+
const relPath = relative(workspaceRoot, absPath);
|
|
31
|
+
let content;
|
|
32
|
+
try {
|
|
33
|
+
const stats = await stat(absPath);
|
|
34
|
+
if (stats.size > MAX_FILE_BYTES) {
|
|
35
|
+
const raw = await readFile(absPath);
|
|
36
|
+
content = raw.subarray(0, MAX_FILE_BYTES).toString('utf-8');
|
|
37
|
+
sections.push(`# File: ${relPath} (truncated to first ${MAX_FILE_BYTES / 1000}KB)\n\`\`\`\n${addLineNumbers(content)}\n\`\`\``);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
content = await readFile(absPath, 'utf-8');
|
|
41
|
+
sections.push(`# File: ${relPath}\n\`\`\`\n${addLineNumbers(content)}\n\`\`\``);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
throw new JamError(`Cannot read file: ${filePath}`, 'INPUT_FILE_NOT_FOUND', { cause: err });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const prompt = `Please explain the following file${filePaths.length > 1 ? 's' : ''} in detail:\n\n` +
|
|
49
|
+
sections.join('\n\n') +
|
|
50
|
+
'\n\nFocus on: purpose, key logic, important patterns, and anything a new developer should know.';
|
|
51
|
+
const request = {
|
|
52
|
+
messages: [{ role: 'user', content: prompt }],
|
|
53
|
+
model: profile.model,
|
|
54
|
+
temperature: profile.temperature,
|
|
55
|
+
maxTokens: profile.maxTokens,
|
|
56
|
+
systemPrompt: profile.systemPrompt,
|
|
57
|
+
};
|
|
58
|
+
if (options.json) {
|
|
59
|
+
const { text, usage } = await collectStream(withRetry(() => adapter.streamCompletion(request)));
|
|
60
|
+
printJsonResult({ response: text, usage, model: profile.model });
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
await streamToStdout(withRetry(() => adapter.streamCompletion(request)));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const jamErr = JamError.fromUnknown(err);
|
|
68
|
+
await printError(jamErr.message);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=explain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/commands/explain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAmBA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA+BpD;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DrE"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { listSessions, getSession } from '../storage/history.js';
|
|
2
|
+
import { JamError } from '../utils/errors.js';
|
|
3
|
+
function truncateId(id, len = 8) {
|
|
4
|
+
return id.slice(0, len);
|
|
5
|
+
}
|
|
6
|
+
function formatDate(isoString) {
|
|
7
|
+
const d = new Date(isoString);
|
|
8
|
+
return d.toLocaleString('en-US', {
|
|
9
|
+
year: 'numeric',
|
|
10
|
+
month: 'short',
|
|
11
|
+
day: 'numeric',
|
|
12
|
+
hour: '2-digit',
|
|
13
|
+
minute: '2-digit',
|
|
14
|
+
hour12: false,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export async function runHistoryList() {
|
|
18
|
+
const chalk = (await import('chalk')).default;
|
|
19
|
+
try {
|
|
20
|
+
const sessions = await listSessions();
|
|
21
|
+
if (sessions.length === 0) {
|
|
22
|
+
process.stdout.write(chalk.dim('No chat sessions found.\n'));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// Header
|
|
26
|
+
const idHeader = chalk.bold('ID ');
|
|
27
|
+
const nameHeader = chalk.bold('Name ');
|
|
28
|
+
const dateHeader = chalk.bold('Date ');
|
|
29
|
+
const countHeader = chalk.bold('Messages');
|
|
30
|
+
process.stdout.write(`${idHeader} ${nameHeader} ${dateHeader} ${countHeader}\n`);
|
|
31
|
+
process.stdout.write(chalk.dim('─'.repeat(74) + '\n'));
|
|
32
|
+
for (const session of sessions) {
|
|
33
|
+
const id = chalk.cyan(truncateId(session.id).padEnd(8));
|
|
34
|
+
const name = session.name.slice(0, 30).padEnd(30);
|
|
35
|
+
const date = formatDate(session.updatedAt).padEnd(24);
|
|
36
|
+
const count = chalk.yellow(String(session.messageCount).padStart(8));
|
|
37
|
+
process.stdout.write(`${id} ${name} ${date} ${count}\n`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
const jamErr = JamError.fromUnknown(err);
|
|
42
|
+
process.stderr.write(`Error: ${jamErr.message}\n`);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export async function runHistoryShow(sessionId) {
|
|
47
|
+
const chalk = (await import('chalk')).default;
|
|
48
|
+
try {
|
|
49
|
+
// Support partial IDs — find the first session whose ID starts with sessionId
|
|
50
|
+
let resolvedId = sessionId;
|
|
51
|
+
if (sessionId.length < 36) {
|
|
52
|
+
const sessions = await listSessions();
|
|
53
|
+
const match = sessions.find((s) => s.id.startsWith(sessionId));
|
|
54
|
+
if (!match) {
|
|
55
|
+
throw new JamError(`Session "${sessionId}" not found. Use "jam history list" to see available sessions.`, 'CONFIG_NOT_FOUND');
|
|
56
|
+
}
|
|
57
|
+
resolvedId = match.id;
|
|
58
|
+
}
|
|
59
|
+
const session = await getSession(resolvedId);
|
|
60
|
+
if (!session) {
|
|
61
|
+
throw new JamError(`Session "${sessionId}" not found. Use "jam history list" to see available sessions.`, 'CONFIG_NOT_FOUND');
|
|
62
|
+
}
|
|
63
|
+
process.stdout.write(chalk.bold(`Session: ${session.name}\n`));
|
|
64
|
+
process.stdout.write(chalk.dim(`ID: ${session.id}\n`));
|
|
65
|
+
process.stdout.write(chalk.dim(`Workspace: ${session.workspaceRoot}\n`));
|
|
66
|
+
process.stdout.write(chalk.dim(`Created: ${formatDate(session.createdAt)}\n`));
|
|
67
|
+
process.stdout.write(chalk.dim(`Messages: ${session.messageCount}\n`));
|
|
68
|
+
process.stdout.write(chalk.dim('─'.repeat(60) + '\n\n'));
|
|
69
|
+
if (session.messages.length === 0) {
|
|
70
|
+
process.stdout.write(chalk.dim('No messages in this session.\n'));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
for (const message of session.messages) {
|
|
74
|
+
const timestamp = chalk.dim(`[${formatDate(message.timestamp)}]`);
|
|
75
|
+
if (message.role === 'user') {
|
|
76
|
+
process.stdout.write(`${chalk.blue.bold('You')} ${timestamp}\n`);
|
|
77
|
+
process.stdout.write(`${chalk.blue(message.content)}\n\n`);
|
|
78
|
+
}
|
|
79
|
+
else if (message.role === 'assistant') {
|
|
80
|
+
process.stdout.write(`${chalk.green.bold('Jam')} ${timestamp}\n`);
|
|
81
|
+
process.stdout.write(`${chalk.green(message.content)}\n\n`);
|
|
82
|
+
}
|
|
83
|
+
else if (message.role === 'system') {
|
|
84
|
+
process.stdout.write(`${chalk.dim.bold('System')} ${timestamp}\n`);
|
|
85
|
+
process.stdout.write(`${chalk.dim(message.content)}\n\n`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
if (JamError.isJamError(err)) {
|
|
91
|
+
process.stderr.write(`Error: ${err.message}\n`);
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
const jamErr = JamError.fromUnknown(err);
|
|
95
|
+
process.stderr.write(`Error: ${jamErr.message}\n`);
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCxE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { loadConfig, getActiveProfile } from '../config/loader.js';
|
|
2
|
+
import { createProvider } from '../providers/factory.js';
|
|
3
|
+
import { JamError } from '../utils/errors.js';
|
|
4
|
+
export async function runModelsList(options) {
|
|
5
|
+
try {
|
|
6
|
+
const config = await loadConfig(process.cwd(), options);
|
|
7
|
+
const profile = getActiveProfile(config);
|
|
8
|
+
const adapter = await createProvider(profile);
|
|
9
|
+
let models;
|
|
10
|
+
try {
|
|
11
|
+
models = await adapter.listModels();
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
if (JamError.isJamError(err) && err.code === 'PROVIDER_UNAVAILABLE') {
|
|
15
|
+
process.stderr.write(`Cannot reach provider "${profile.provider}". ` +
|
|
16
|
+
`Make sure it is running and reachable.\n\n` +
|
|
17
|
+
`Details: ${err.message}\n`);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
throw err;
|
|
21
|
+
}
|
|
22
|
+
if (models.length === 0) {
|
|
23
|
+
process.stdout.write(`No models found for provider "${profile.provider}".\n\n` +
|
|
24
|
+
`Try pulling a model first. For Ollama: ollama pull llama3.2\n`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
process.stdout.write(`Available models (${profile.provider}):\n\n`);
|
|
28
|
+
for (const model of models) {
|
|
29
|
+
process.stdout.write(` ${model}\n`);
|
|
30
|
+
}
|
|
31
|
+
process.stdout.write('\n');
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
const jamErr = JamError.fromUnknown(err);
|
|
35
|
+
process.stderr.write(`Error: ${jamErr.message}\n`);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAqB;IACvD,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;QACzC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAE9C,IAAI,MAAgB,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;gBACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,0BAA0B,OAAO,CAAC,QAAQ,KAAK;oBAC7C,4CAA4C;oBAC5C,YAAY,GAAG,CAAC,OAAO,IAAI,CAC9B,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iCAAiC,OAAO,CAAC,QAAQ,QAAQ;gBACvD,+DAA+D,CAClE,CAAC;YACF,OAAO;QACT,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,OAAO,CAAC,QAAQ,QAAQ,CAAC,CAAC;QACpE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CliOverrides } from '../config/schema.js';
|
|
2
|
+
export interface PatchOptions extends CliOverrides {
|
|
3
|
+
file?: string[];
|
|
4
|
+
dry?: boolean;
|
|
5
|
+
yes?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function runPatch(instruction: string | undefined, options: PatchOptions): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=patch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../src/commands/patch.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAuED,wBAAsB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFpG"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { writeFile, unlink, readFile } from 'node:fs/promises';
|
|
4
|
+
import { join, relative } from 'node:path';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
import { createInterface } from 'node:readline/promises';
|
|
8
|
+
import { loadConfig, getActiveProfile } from '../config/loader.js';
|
|
9
|
+
import { createProvider } from '../providers/factory.js';
|
|
10
|
+
import { withRetry, collectStream } from '../utils/stream.js';
|
|
11
|
+
import { printError, printSuccess, printWarning } from '../ui/renderer.js';
|
|
12
|
+
import { JamError } from '../utils/errors.js';
|
|
13
|
+
import { getWorkspaceRoot } from '../utils/workspace.js';
|
|
14
|
+
const execFileAsync = promisify(execFile);
|
|
15
|
+
async function collectContext(workspaceRoot, files) {
|
|
16
|
+
if (files && files.length > 0) {
|
|
17
|
+
const parts = [];
|
|
18
|
+
for (const f of files) {
|
|
19
|
+
try {
|
|
20
|
+
const content = await readFile(f, 'utf-8');
|
|
21
|
+
const rel = relative(workspaceRoot, f);
|
|
22
|
+
parts.push(`### ${rel}\n\`\`\`\n${content}\n\`\`\``);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// skip unreadable
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return parts.join('\n\n');
|
|
29
|
+
}
|
|
30
|
+
// Auto-collect small context: git status + changed files
|
|
31
|
+
try {
|
|
32
|
+
const { stdout: status } = await execFileAsync('git', ['status', '--short'], {
|
|
33
|
+
cwd: workspaceRoot,
|
|
34
|
+
});
|
|
35
|
+
const { stdout: diff } = await execFileAsync('git', ['diff', 'HEAD'], { cwd: workspaceRoot });
|
|
36
|
+
const parts = [];
|
|
37
|
+
if (status.trim())
|
|
38
|
+
parts.push(`### git status\n\`\`\`\n${status.trim()}\n\`\`\``);
|
|
39
|
+
if (diff.trim())
|
|
40
|
+
parts.push(`### Current diff\n\`\`\`diff\n${diff.trim()}\n\`\`\``);
|
|
41
|
+
return parts.join('\n\n');
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return '';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function extractDiff(text) {
|
|
48
|
+
// Look for unified diff in code blocks
|
|
49
|
+
const codeBlockMatch = text.match(/```(?:diff)?\n(---[\s\S]+?)\n```/);
|
|
50
|
+
if (codeBlockMatch?.[1])
|
|
51
|
+
return codeBlockMatch[1];
|
|
52
|
+
// Look for raw unified diff
|
|
53
|
+
const rawMatch = text.match(/(---\s+\S+\s*\n\+\+\+\s+\S+[\s\S]+)/);
|
|
54
|
+
if (rawMatch?.[1])
|
|
55
|
+
return rawMatch[1];
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
async function validatePatch(patch, cwd) {
|
|
59
|
+
const tmpFile = join(tmpdir(), `jam-patch-${randomUUID()}.patch`);
|
|
60
|
+
try {
|
|
61
|
+
await writeFile(tmpFile, patch, 'utf-8');
|
|
62
|
+
await execFileAsync('git', ['apply', '--check', tmpFile], { cwd });
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
await unlink(tmpFile).catch(() => undefined);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function applyPatch(patch, cwd) {
|
|
73
|
+
const tmpFile = join(tmpdir(), `jam-patch-${randomUUID()}.patch`);
|
|
74
|
+
try {
|
|
75
|
+
await writeFile(tmpFile, patch, 'utf-8');
|
|
76
|
+
await execFileAsync('git', ['apply', tmpFile], { cwd });
|
|
77
|
+
const { stdout } = await execFileAsync('git', ['diff', '--name-only', 'HEAD'], { cwd }).catch(() => ({ stdout: '' }));
|
|
78
|
+
return stdout.trim() || 'Changes applied.';
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
await unlink(tmpFile).catch(() => undefined);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export async function runPatch(instruction, options) {
|
|
85
|
+
if (!instruction) {
|
|
86
|
+
await printError('Provide a patch instruction. Usage: jam patch "<instruction>"');
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
const workspaceRoot = await getWorkspaceRoot();
|
|
91
|
+
const config = await loadConfig(process.cwd(), options);
|
|
92
|
+
const profile = getActiveProfile(config);
|
|
93
|
+
const adapter = await createProvider(profile);
|
|
94
|
+
const context = await collectContext(workspaceRoot, options.file);
|
|
95
|
+
const prompt = `You are a coding assistant. Generate a unified diff patch to accomplish the following:\n\n` +
|
|
96
|
+
`**Instruction:** ${instruction}\n\n` +
|
|
97
|
+
(context ? `**Current codebase context:**\n${context}\n\n` : '') +
|
|
98
|
+
`**Requirements:**\n` +
|
|
99
|
+
`- Output ONLY a valid unified diff (starting with \`---\` and \`+++\` lines)\n` +
|
|
100
|
+
`- Wrap the diff in a code block: \`\`\`diff ... \`\`\`\n` +
|
|
101
|
+
`- Make minimal changes to accomplish the goal\n` +
|
|
102
|
+
`- Ensure the diff is complete and can be applied with \`git apply\``;
|
|
103
|
+
process.stderr.write('Generating patch...\n');
|
|
104
|
+
const { text } = await collectStream(withRetry(() => adapter.streamCompletion({
|
|
105
|
+
messages: [{ role: 'user', content: prompt }],
|
|
106
|
+
model: profile.model,
|
|
107
|
+
temperature: profile.temperature ?? 0.2,
|
|
108
|
+
maxTokens: profile.maxTokens,
|
|
109
|
+
systemPrompt: profile.systemPrompt,
|
|
110
|
+
})));
|
|
111
|
+
const patch = extractDiff(text);
|
|
112
|
+
if (!patch) {
|
|
113
|
+
await printError('The model did not produce a valid unified diff. Try being more specific in your instruction.');
|
|
114
|
+
process.stderr.write('\nModel response:\n' + text + '\n');
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
process.stdout.write('\n--- Generated Patch ---\n');
|
|
118
|
+
process.stdout.write(patch + '\n');
|
|
119
|
+
process.stdout.write('--- End Patch ---\n\n');
|
|
120
|
+
if (options.dry) {
|
|
121
|
+
process.stderr.write('Dry run — patch not applied.\n');
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const valid = await validatePatch(patch, workspaceRoot);
|
|
125
|
+
if (!valid) {
|
|
126
|
+
await printWarning('Patch does not apply cleanly to the current working tree. It may need manual adjustment.');
|
|
127
|
+
if (!options.yes) {
|
|
128
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
129
|
+
const answer = await rl.question('Apply anyway? [y/N] ');
|
|
130
|
+
rl.close();
|
|
131
|
+
if (answer.toLowerCase() !== 'y') {
|
|
132
|
+
process.stderr.write('Patch discarded.\n');
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else if (!options.yes) {
|
|
138
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
139
|
+
const answer = await rl.question('Apply this patch? [y/N] ');
|
|
140
|
+
rl.close();
|
|
141
|
+
if (answer.toLowerCase() !== 'y') {
|
|
142
|
+
process.stderr.write('Patch discarded.\n');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const changed = await applyPatch(patch, workspaceRoot);
|
|
147
|
+
await printSuccess('Patch applied successfully.');
|
|
148
|
+
if (changed && changed !== 'Changes applied.') {
|
|
149
|
+
process.stderr.write('Changed files:\n' + changed + '\n');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
const jamErr = JamError.fromUnknown(err);
|
|
154
|
+
await printError(jamErr.message);
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=patch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/commands/patch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CliOverrides } from '../config/schema.js';
|
|
2
|
+
export interface RunOptions extends CliOverrides {
|
|
3
|
+
noColor?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function runRun(instruction: string | undefined, options: RunOptions): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,qBAAqB,CAAC;AAGpE,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAiKD,wBAAsB,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAsHhG"}
|