@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.
Files changed (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +625 -0
  3. package/dist/commands/ask.d.ts +9 -0
  4. package/dist/commands/ask.d.ts.map +1 -0
  5. package/dist/commands/ask.js +84 -0
  6. package/dist/commands/ask.js.map +1 -0
  7. package/dist/commands/auth.d.ts +4 -0
  8. package/dist/commands/auth.d.ts.map +1 -0
  9. package/dist/commands/auth.js +44 -0
  10. package/dist/commands/auth.js.map +1 -0
  11. package/dist/commands/chat.d.ts +10 -0
  12. package/dist/commands/chat.d.ts.map +1 -0
  13. package/dist/commands/chat.js +57 -0
  14. package/dist/commands/chat.js.map +1 -0
  15. package/dist/commands/completion.d.ts +4 -0
  16. package/dist/commands/completion.d.ts.map +1 -0
  17. package/dist/commands/completion.js +156 -0
  18. package/dist/commands/completion.js.map +1 -0
  19. package/dist/commands/config.d.ts +6 -0
  20. package/dist/commands/config.d.ts.map +1 -0
  21. package/dist/commands/config.js +59 -0
  22. package/dist/commands/config.js.map +1 -0
  23. package/dist/commands/diff.d.ts +9 -0
  24. package/dist/commands/diff.d.ts.map +1 -0
  25. package/dist/commands/diff.js +69 -0
  26. package/dist/commands/diff.js.map +1 -0
  27. package/dist/commands/doctor.d.ts +3 -0
  28. package/dist/commands/doctor.d.ts.map +1 -0
  29. package/dist/commands/doctor.js +86 -0
  30. package/dist/commands/doctor.js.map +1 -0
  31. package/dist/commands/explain.d.ts +7 -0
  32. package/dist/commands/explain.d.ts.map +1 -0
  33. package/dist/commands/explain.js +72 -0
  34. package/dist/commands/explain.js.map +1 -0
  35. package/dist/commands/history.d.ts +3 -0
  36. package/dist/commands/history.d.ts.map +1 -0
  37. package/dist/commands/history.js +99 -0
  38. package/dist/commands/history.js.map +1 -0
  39. package/dist/commands/models.d.ts +3 -0
  40. package/dist/commands/models.d.ts.map +1 -0
  41. package/dist/commands/models.js +39 -0
  42. package/dist/commands/models.js.map +1 -0
  43. package/dist/commands/patch.d.ts +8 -0
  44. package/dist/commands/patch.d.ts.map +1 -0
  45. package/dist/commands/patch.js +158 -0
  46. package/dist/commands/patch.js.map +1 -0
  47. package/dist/commands/run.d.ts +6 -0
  48. package/dist/commands/run.d.ts.map +1 -0
  49. package/dist/commands/run.js +241 -0
  50. package/dist/commands/run.js.map +1 -0
  51. package/dist/commands/search.d.ts +9 -0
  52. package/dist/commands/search.d.ts.map +1 -0
  53. package/dist/commands/search.js +128 -0
  54. package/dist/commands/search.js.map +1 -0
  55. package/dist/config/defaults.d.ts +3 -0
  56. package/dist/config/defaults.d.ts.map +1 -0
  57. package/dist/config/defaults.js +16 -0
  58. package/dist/config/defaults.js.map +1 -0
  59. package/dist/config/loader.d.ts +4 -0
  60. package/dist/config/loader.d.ts.map +1 -0
  61. package/dist/config/loader.js +103 -0
  62. package/dist/config/loader.js.map +1 -0
  63. package/dist/config/schema.d.ts +104 -0
  64. package/dist/config/schema.d.ts.map +1 -0
  65. package/dist/config/schema.js +21 -0
  66. package/dist/config/schema.js.map +1 -0
  67. package/dist/index.d.ts +3 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +249 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/providers/base.d.ts +32 -0
  72. package/dist/providers/base.d.ts.map +1 -0
  73. package/dist/providers/base.js +2 -0
  74. package/dist/providers/base.js.map +1 -0
  75. package/dist/providers/factory.d.ts +4 -0
  76. package/dist/providers/factory.d.ts.map +1 -0
  77. package/dist/providers/factory.js +13 -0
  78. package/dist/providers/factory.js.map +1 -0
  79. package/dist/providers/ollama.d.ts +14 -0
  80. package/dist/providers/ollama.d.ts.map +1 -0
  81. package/dist/providers/ollama.js +152 -0
  82. package/dist/providers/ollama.js.map +1 -0
  83. package/dist/storage/history.d.ts +21 -0
  84. package/dist/storage/history.d.ts.map +1 -0
  85. package/dist/storage/history.js +103 -0
  86. package/dist/storage/history.js.map +1 -0
  87. package/dist/tools/apply_patch.d.ts +3 -0
  88. package/dist/tools/apply_patch.d.ts.map +1 -0
  89. package/dist/tools/apply_patch.js +86 -0
  90. package/dist/tools/apply_patch.js.map +1 -0
  91. package/dist/tools/git_diff.d.ts +3 -0
  92. package/dist/tools/git_diff.d.ts.map +1 -0
  93. package/dist/tools/git_diff.js +49 -0
  94. package/dist/tools/git_diff.js.map +1 -0
  95. package/dist/tools/git_status.d.ts +3 -0
  96. package/dist/tools/git_status.d.ts.map +1 -0
  97. package/dist/tools/git_status.js +26 -0
  98. package/dist/tools/git_status.js.map +1 -0
  99. package/dist/tools/index.d.ts +10 -0
  100. package/dist/tools/index.d.ts.map +1 -0
  101. package/dist/tools/index.js +10 -0
  102. package/dist/tools/index.js.map +1 -0
  103. package/dist/tools/list_dir.d.ts +3 -0
  104. package/dist/tools/list_dir.d.ts.map +1 -0
  105. package/dist/tools/list_dir.js +61 -0
  106. package/dist/tools/list_dir.js.map +1 -0
  107. package/dist/tools/read_file.d.ts +3 -0
  108. package/dist/tools/read_file.d.ts.map +1 -0
  109. package/dist/tools/read_file.js +83 -0
  110. package/dist/tools/read_file.js.map +1 -0
  111. package/dist/tools/registry.d.ts +12 -0
  112. package/dist/tools/registry.d.ts.map +1 -0
  113. package/dist/tools/registry.js +76 -0
  114. package/dist/tools/registry.js.map +1 -0
  115. package/dist/tools/run_command.d.ts +6 -0
  116. package/dist/tools/run_command.d.ts.map +1 -0
  117. package/dist/tools/run_command.js +37 -0
  118. package/dist/tools/run_command.js.map +1 -0
  119. package/dist/tools/search_text.d.ts +3 -0
  120. package/dist/tools/search_text.d.ts.map +1 -0
  121. package/dist/tools/search_text.js +171 -0
  122. package/dist/tools/search_text.js.map +1 -0
  123. package/dist/tools/types.d.ts +25 -0
  124. package/dist/tools/types.d.ts.map +1 -0
  125. package/dist/tools/types.js +2 -0
  126. package/dist/tools/types.js.map +1 -0
  127. package/dist/tools/write_file.d.ts +3 -0
  128. package/dist/tools/write_file.d.ts.map +1 -0
  129. package/dist/tools/write_file.js +61 -0
  130. package/dist/tools/write_file.js.map +1 -0
  131. package/dist/ui/chat.d.ts +10 -0
  132. package/dist/ui/chat.d.ts.map +1 -0
  133. package/dist/ui/chat.js +173 -0
  134. package/dist/ui/chat.js.map +1 -0
  135. package/dist/ui/logo.d.ts +14 -0
  136. package/dist/ui/logo.d.ts.map +1 -0
  137. package/dist/ui/logo.js +76 -0
  138. package/dist/ui/logo.js.map +1 -0
  139. package/dist/ui/renderer.d.ts +15 -0
  140. package/dist/ui/renderer.d.ts.map +1 -0
  141. package/dist/ui/renderer.js +61 -0
  142. package/dist/ui/renderer.js.map +1 -0
  143. package/dist/utils/errors.d.ts +14 -0
  144. package/dist/utils/errors.d.ts.map +1 -0
  145. package/dist/utils/errors.js +26 -0
  146. package/dist/utils/errors.js.map +1 -0
  147. package/dist/utils/logger.d.ts +17 -0
  148. package/dist/utils/logger.d.ts.map +1 -0
  149. package/dist/utils/logger.js +50 -0
  150. package/dist/utils/logger.js.map +1 -0
  151. package/dist/utils/secrets.d.ts +4 -0
  152. package/dist/utils/secrets.d.ts.map +1 -0
  153. package/dist/utils/secrets.js +39 -0
  154. package/dist/utils/secrets.js.map +1 -0
  155. package/dist/utils/stream.d.ts +12 -0
  156. package/dist/utils/stream.d.ts.map +1 -0
  157. package/dist/utils/stream.js +54 -0
  158. package/dist/utils/stream.js.map +1 -0
  159. package/dist/utils/workspace.d.ts +14 -0
  160. package/dist/utils/workspace.d.ts.map +1 -0
  161. package/dist/utils/workspace.js +39 -0
  162. package/dist/utils/workspace.js.map +1 -0
  163. package/package.json +84 -0
@@ -0,0 +1,84 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { loadConfig, getActiveProfile } from '../config/loader.js';
3
+ import { createProvider } from '../providers/factory.js';
4
+ import { withRetry, collectStream } from '../utils/stream.js';
5
+ import { streamToStdout, printJsonResult, printError } from '../ui/renderer.js';
6
+ import { JamError } from '../utils/errors.js';
7
+ async function readPromptFromStdin() {
8
+ // Only read from stdin if it's piped (not interactive TTY)
9
+ if (process.stdin.isTTY)
10
+ return null;
11
+ return new Promise((resolve, reject) => {
12
+ const chunks = [];
13
+ process.stdin.on('data', (chunk) => chunks.push(chunk));
14
+ process.stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8').trim()));
15
+ process.stdin.on('error', reject);
16
+ });
17
+ }
18
+ export async function runAsk(inlinePrompt, options) {
19
+ try {
20
+ // Resolve prompt from file, inline arg, or stdin (priority order)
21
+ let prompt;
22
+ if (options.file) {
23
+ try {
24
+ prompt = (await readFile(options.file, 'utf-8')).trim();
25
+ }
26
+ catch (err) {
27
+ throw new JamError(`Cannot read file: ${options.file}`, 'INPUT_FILE_NOT_FOUND', { cause: err });
28
+ }
29
+ }
30
+ else if (inlinePrompt) {
31
+ prompt = inlinePrompt;
32
+ }
33
+ else {
34
+ const stdinContent = await readPromptFromStdin();
35
+ if (!stdinContent) {
36
+ throw new JamError('No prompt provided. Pass a question as an argument, pipe from stdin, or use --file.', 'INPUT_MISSING');
37
+ }
38
+ prompt = stdinContent;
39
+ }
40
+ if (options.noColor) {
41
+ const chalk = await import('chalk');
42
+ chalk.default.level = 0;
43
+ }
44
+ // Load config with CLI overrides
45
+ const cliOverrides = {
46
+ profile: options.profile,
47
+ provider: options.provider,
48
+ model: options.model,
49
+ baseUrl: options.baseUrl,
50
+ };
51
+ const config = await loadConfig(process.cwd(), cliOverrides);
52
+ const profile = getActiveProfile(config);
53
+ // Create provider
54
+ const adapter = await createProvider(profile);
55
+ const request = {
56
+ messages: [{ role: 'user', content: prompt }],
57
+ model: profile.model,
58
+ temperature: profile.temperature,
59
+ maxTokens: profile.maxTokens,
60
+ systemPrompt: options.system ?? profile.systemPrompt,
61
+ };
62
+ if (options.json) {
63
+ // Collect stream then emit JSON
64
+ const stream = withRetry(() => adapter.streamCompletion(request));
65
+ const { text, usage } = await collectStream(stream);
66
+ printJsonResult({
67
+ response: text,
68
+ usage,
69
+ model: profile.model,
70
+ });
71
+ }
72
+ else {
73
+ // Stream directly to stdout
74
+ const stream = withRetry(() => adapter.streamCompletion(request));
75
+ await streamToStdout(stream);
76
+ }
77
+ }
78
+ catch (err) {
79
+ const jamErr = JamError.fromUnknown(err);
80
+ await printError(jamErr.message);
81
+ process.exit(1);
82
+ }
83
+ }
84
+ //# sourceMappingURL=ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CliOverrides } from '../config/schema.js';
2
+ export declare function runAuthLogin(options?: CliOverrides): Promise<void>;
3
+ export declare function runAuthLogout(options?: CliOverrides): Promise<void>;
4
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,wBAAsB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB5E;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB7E"}
@@ -0,0 +1,44 @@
1
+ import { loadConfig, getActiveProfile } from '../config/loader.js';
2
+ import { createProvider } from '../providers/factory.js';
3
+ import { printError, printSuccess, printWarning } from '../ui/renderer.js';
4
+ import { JamError } from '../utils/errors.js';
5
+ export async function runAuthLogin(options = {}) {
6
+ try {
7
+ const config = await loadConfig(process.cwd(), options);
8
+ const profile = getActiveProfile(config);
9
+ const adapter = await createProvider(profile);
10
+ process.stderr.write(`Validating credentials for provider: ${adapter.info.name}\n`);
11
+ await adapter.validateCredentials();
12
+ await printSuccess(`✓ Connected to ${adapter.info.name} at ${profile.baseUrl ?? 'default'}`);
13
+ await printSuccess(` Model: ${profile.model ?? 'default'}`);
14
+ }
15
+ catch (err) {
16
+ const jamErr = JamError.fromUnknown(err);
17
+ await printError(jamErr.message);
18
+ if (jamErr.code === 'PROVIDER_UNAVAILABLE') {
19
+ await printWarning('Make sure Ollama is running: ollama serve');
20
+ }
21
+ process.exit(1);
22
+ }
23
+ }
24
+ export async function runAuthLogout(options = {}) {
25
+ try {
26
+ const config = await loadConfig(process.cwd(), options);
27
+ const profile = getActiveProfile(config);
28
+ const { deleteSecret } = await import('../utils/secrets.js');
29
+ const key = `${profile.provider}-api-key`;
30
+ const deleted = await deleteSecret(key);
31
+ if (deleted) {
32
+ await printSuccess(`Removed stored credentials for ${profile.provider}`);
33
+ }
34
+ else {
35
+ process.stderr.write(`No stored credentials found for ${profile.provider}\n`);
36
+ }
37
+ }
38
+ catch (err) {
39
+ const jamErr = JamError.fromUnknown(err);
40
+ await printError(jamErr.message);
41
+ process.exit(1);
42
+ }
43
+ }
44
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAAwB,EAAE;IAC3D,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,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAEpF,MAAM,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAEpC,MAAM,YAAY,CAAC,kBAAkB,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,OAAO,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;QAC7F,MAAM,YAAY,CAAC,YAAY,OAAO,CAAC,KAAK,IAAI,SAAS,EAAE,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;QAEjC,IAAI,MAAM,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YAC3C,MAAM,YAAY,CAAC,2CAA2C,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,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,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,QAAQ,UAAU,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,YAAY,CAAC,kCAAkC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;QAChF,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,10 @@
1
+ export interface ChatCommandOptions {
2
+ profile?: string;
3
+ provider?: string;
4
+ model?: string;
5
+ baseUrl?: string;
6
+ resume?: string;
7
+ name?: string;
8
+ }
9
+ export declare function runChat(options: ChatCommandOptions): Promise<void>;
10
+ //# sourceMappingURL=chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDxE"}
@@ -0,0 +1,57 @@
1
+ import { loadConfig, getActiveProfile } from '../config/loader.js';
2
+ import { createProvider } from '../providers/factory.js';
3
+ import { createSession, getSession } from '../storage/history.js';
4
+ import { getWorkspaceRoot } from '../utils/workspace.js';
5
+ import { startChat } from '../ui/chat.js';
6
+ import { JamError } from '../utils/errors.js';
7
+ export async function runChat(options) {
8
+ try {
9
+ const config = await loadConfig(process.cwd(), {
10
+ profile: options.profile,
11
+ provider: options.provider,
12
+ model: options.model,
13
+ baseUrl: options.baseUrl,
14
+ });
15
+ const profile = getActiveProfile(config);
16
+ const adapter = await createProvider(profile);
17
+ let sessionId;
18
+ let initialMessages = [];
19
+ if (options.resume) {
20
+ // Load existing session
21
+ const existingSession = await getSession(options.resume);
22
+ if (!existingSession) {
23
+ throw new JamError(`Session "${options.resume}" not found. Use "jam history list" to see available sessions.`, 'CONFIG_NOT_FOUND');
24
+ }
25
+ sessionId = existingSession.id;
26
+ // Convert stored messages back to provider Message format
27
+ initialMessages = existingSession.messages.map((m) => ({
28
+ role: m.role,
29
+ content: m.content,
30
+ }));
31
+ }
32
+ else {
33
+ // Create a new session
34
+ const workspaceRoot = await getWorkspaceRoot(process.cwd());
35
+ const sessionName = options.name ?? `Chat ${new Date().toLocaleString('en-US', { hour12: false })}`;
36
+ const session = await createSession(sessionName, workspaceRoot);
37
+ sessionId = session.id;
38
+ initialMessages = [];
39
+ // Prepend system prompt if configured
40
+ if (profile.systemPrompt) {
41
+ initialMessages = [{ role: 'system', content: profile.systemPrompt }];
42
+ }
43
+ }
44
+ await startChat({
45
+ provider: adapter,
46
+ config,
47
+ sessionId,
48
+ initialMessages,
49
+ });
50
+ }
51
+ catch (err) {
52
+ const jamErr = JamError.fromUnknown(err);
53
+ process.stderr.write(`Error: ${jamErr.message}\n`);
54
+ process.exit(1);
55
+ }
56
+ }
57
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAY9C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAA2B;IACvD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE;YAC7C,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAE9C,IAAI,SAAiB,CAAC;QACtB,IAAI,eAAe,GAAc,EAAE,CAAC;QAEpC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,wBAAwB;YACxB,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACzD,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,MAAM,IAAI,QAAQ,CAChB,YAAY,OAAO,CAAC,MAAM,gEAAgE,EAC1F,kBAAkB,CACnB,CAAC;YACJ,CAAC;YACD,SAAS,GAAG,eAAe,CAAC,EAAE,CAAC;YAC/B,0DAA0D;YAC1D,eAAe,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrD,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;aACnB,CAAC,CAAC,CAAC;QACN,CAAC;aAAM,CAAC;YACN,uBAAuB;YACvB,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5D,MAAM,WAAW,GACf,OAAO,CAAC,IAAI,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAClF,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;YAChE,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;YACvB,eAAe,GAAG,EAAE,CAAC;YAErB,sCAAsC;YACtC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,eAAe,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAED,MAAM,SAAS,CAAC;YACd,QAAQ,EAAE,OAAO;YACjB,MAAM;YACN,SAAS;YACT,eAAe;SAChB,CAAC,CAAC;IACL,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,4 @@
1
+ export declare function runCompletionInstall(options: {
2
+ shell?: string;
3
+ }): void;
4
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AA4HA,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAoCtE"}
@@ -0,0 +1,156 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ const JAM_COMMANDS = [
4
+ 'ask',
5
+ 'chat',
6
+ 'run',
7
+ 'explain',
8
+ 'search',
9
+ 'diff',
10
+ 'patch',
11
+ 'auth',
12
+ 'config',
13
+ 'models',
14
+ 'history',
15
+ 'completion',
16
+ 'doctor',
17
+ ];
18
+ function generateBashCompletion() {
19
+ const commandList = JAM_COMMANDS.join(' ');
20
+ // Use array join to avoid template literal issues with bash ${VAR} syntax
21
+ return [
22
+ '# Bash completion for jam',
23
+ '# Add this to your ~/.bashrc or source it directly.',
24
+ '',
25
+ '_jam_completions() {',
26
+ ' local cur prev words cword',
27
+ ' _init_completion 2>/dev/null || {',
28
+ ' COMPREPLY=()',
29
+ ' cur="${COMP_WORDS[COMP_CWORD]}"',
30
+ ' prev="${COMP_WORDS[COMP_CWORD-1]}"',
31
+ ' }',
32
+ '',
33
+ ` local commands="${commandList}"`,
34
+ '',
35
+ ' case "${prev}" in',
36
+ ' jam)',
37
+ ' COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )',
38
+ ' return 0',
39
+ ' ;;',
40
+ ' auth)',
41
+ ' COMPREPLY=( $(compgen -W "login logout" -- "${cur}") )',
42
+ ' return 0',
43
+ ' ;;',
44
+ ' config)',
45
+ ' COMPREPLY=( $(compgen -W "show init" -- "${cur}") )',
46
+ ' return 0',
47
+ ' ;;',
48
+ ' models)',
49
+ ' COMPREPLY=( $(compgen -W "list" -- "${cur}") )',
50
+ ' return 0',
51
+ ' ;;',
52
+ ' history)',
53
+ ' COMPREPLY=( $(compgen -W "list show" -- "${cur}") )',
54
+ ' return 0',
55
+ ' ;;',
56
+ ' completion)',
57
+ ' COMPREPLY=( $(compgen -W "install" -- "${cur}") )',
58
+ ' return 0',
59
+ ' ;;',
60
+ ' esac',
61
+ '',
62
+ ' COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )',
63
+ ' return 0',
64
+ '}',
65
+ '',
66
+ 'complete -F _jam_completions jam',
67
+ ].join('\n');
68
+ }
69
+ function generateZshCompletion() {
70
+ const commandDefs = JAM_COMMANDS.map((cmd) => ` '${cmd}'`).join('\n');
71
+ return [
72
+ '#compdef jam',
73
+ '# Zsh completion for jam',
74
+ '# Add this file to a directory in your $fpath, or source it in ~/.zshrc.',
75
+ '',
76
+ '_jam() {',
77
+ ' local -a commands',
78
+ ' commands=(',
79
+ commandDefs,
80
+ ' )',
81
+ '',
82
+ ' local -a auth_cmds config_cmds models_cmds history_cmds completion_cmds',
83
+ " auth_cmds=('login' 'logout')",
84
+ " config_cmds=('show' 'init')",
85
+ " models_cmds=('list')",
86
+ " history_cmds=('list' 'show')",
87
+ " completion_cmds=('install')",
88
+ '',
89
+ ' case "$words[1]" in',
90
+ ' auth)',
91
+ " _describe 'auth subcommands' auth_cmds",
92
+ ' ;;',
93
+ ' config)',
94
+ " _describe 'config subcommands' config_cmds",
95
+ ' ;;',
96
+ ' models)',
97
+ " _describe 'models subcommands' models_cmds",
98
+ ' ;;',
99
+ ' history)',
100
+ " _describe 'history subcommands' history_cmds",
101
+ ' ;;',
102
+ ' completion)',
103
+ " _describe 'completion subcommands' completion_cmds",
104
+ ' ;;',
105
+ ' *)',
106
+ " _describe 'jam commands' commands",
107
+ ' ;;',
108
+ ' esac',
109
+ '}',
110
+ '',
111
+ '_jam "$@"',
112
+ ].join('\n');
113
+ }
114
+ function detectShell() {
115
+ const shellEnv = process.env['SHELL'] ?? '';
116
+ if (shellEnv.includes('zsh'))
117
+ return 'zsh';
118
+ if (shellEnv.includes('bash'))
119
+ return 'bash';
120
+ return 'bash';
121
+ }
122
+ export function runCompletionInstall(options) {
123
+ const shell = options.shell ?? detectShell();
124
+ const home = homedir();
125
+ if (shell === 'zsh') {
126
+ const script = generateZshCompletion();
127
+ const completionFile = join(home, '.config', 'jam', 'completions', '_jam');
128
+ const rcFile = join(home, '.zshrc');
129
+ process.stdout.write('Zsh completion script for jam:\n\n');
130
+ process.stdout.write(script + '\n\n');
131
+ process.stdout.write('To install:\n\n');
132
+ process.stdout.write(` mkdir -p ${join(home, '.config', 'jam', 'completions')}\n`);
133
+ process.stdout.write(` jam completion install --shell zsh > ${completionFile}\n`);
134
+ process.stdout.write(` echo 'fpath=(${join(home, '.config', 'jam', 'completions')} $fpath)' >> ${rcFile}\n`);
135
+ process.stdout.write(` echo 'autoload -Uz compinit && compinit' >> ${rcFile}\n`);
136
+ process.stdout.write(` source ${rcFile}\n`);
137
+ }
138
+ else if (shell === 'bash') {
139
+ const script = generateBashCompletion();
140
+ const completionFile = join(home, '.config', 'jam', 'completions', 'jam.bash');
141
+ const rcFile = join(home, '.bashrc');
142
+ process.stdout.write('Bash completion script for jam:\n\n');
143
+ process.stdout.write(script + '\n\n');
144
+ process.stdout.write('To install:\n\n');
145
+ process.stdout.write(` mkdir -p ${join(home, '.config', 'jam', 'completions')}\n`);
146
+ process.stdout.write(` jam completion install --shell bash > ${completionFile}\n`);
147
+ process.stdout.write(` echo 'source ${completionFile}' >> ${rcFile}\n`);
148
+ process.stdout.write(` source ${rcFile}\n`);
149
+ }
150
+ else {
151
+ process.stderr.write(`Unsupported shell: "${shell}". Supported: bash, zsh.\n` +
152
+ `Use --shell bash or --shell zsh.\n`);
153
+ process.exit(1);
154
+ }
155
+ }
156
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CliOverrides } from '../config/schema.js';
2
+ export declare function runConfigShow(options?: CliOverrides): Promise<void>;
3
+ export declare function runConfigInit(options?: {
4
+ global?: boolean;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +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,CAiCrF"}
@@ -0,0 +1,59 @@
1
+ import { loadConfig, getActiveProfile } from '../config/loader.js';
2
+ import { printError, printSuccess } from '../ui/renderer.js';
3
+ import { JamError } from '../utils/errors.js';
4
+ import { writeFile, mkdir } from 'node:fs/promises';
5
+ import { join } from 'node:path';
6
+ import { homedir } from 'node:os';
7
+ import { CONFIG_DEFAULTS } from '../config/defaults.js';
8
+ export async function runConfigShow(options = {}) {
9
+ try {
10
+ const config = await loadConfig(process.cwd(), options);
11
+ const profile = getActiveProfile(config);
12
+ const output = {
13
+ config,
14
+ activeProfile: {
15
+ name: config.defaultProfile,
16
+ ...profile,
17
+ },
18
+ };
19
+ process.stdout.write(JSON.stringify(output, null, 2) + '\n');
20
+ }
21
+ catch (err) {
22
+ const jamErr = JamError.fromUnknown(err);
23
+ await printError(jamErr.message);
24
+ process.exit(1);
25
+ }
26
+ }
27
+ export async function runConfigInit(options = {}) {
28
+ try {
29
+ let configDir;
30
+ let configPath;
31
+ if (options.global) {
32
+ configDir = join(homedir(), '.config', 'jam');
33
+ configPath = join(configDir, 'config.json');
34
+ }
35
+ else {
36
+ configDir = join(process.cwd(), '.jam');
37
+ configPath = join(configDir, 'config.json');
38
+ }
39
+ await mkdir(configDir, { recursive: true });
40
+ const initialConfig = {
41
+ defaultProfile: 'default',
42
+ profiles: {
43
+ default: {
44
+ provider: CONFIG_DEFAULTS.profiles['default']?.provider ?? 'ollama',
45
+ model: CONFIG_DEFAULTS.profiles['default']?.model ?? 'llama3.2',
46
+ baseUrl: CONFIG_DEFAULTS.profiles['default']?.baseUrl ?? 'http://localhost:11434',
47
+ },
48
+ },
49
+ };
50
+ await writeFile(configPath, JSON.stringify(initialConfig, null, 2) + '\n');
51
+ await printSuccess(`Config initialized at: ${configPath}`);
52
+ }
53
+ catch (err) {
54
+ const jamErr = JamError.fromUnknown(err);
55
+ await printError(jamErr.message);
56
+ process.exit(1);
57
+ }
58
+ }
59
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { CliOverrides } from '../config/schema.js';
2
+ export interface DiffOptions extends CliOverrides {
3
+ staged?: boolean;
4
+ path?: string;
5
+ json?: boolean;
6
+ noReview?: boolean;
7
+ }
8
+ export declare function runDiff(options: DiffOptions): Promise<void>;
9
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAmBD,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDjE"}
@@ -0,0 +1,69 @@
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
+ import { withRetry, collectStream } from '../utils/stream.js';
6
+ import { streamToStdout, printJsonResult, printError } from '../ui/renderer.js';
7
+ import { JamError } from '../utils/errors.js';
8
+ import { getWorkspaceRoot } from '../utils/workspace.js';
9
+ const execFileAsync = promisify(execFile);
10
+ async function getGitDiff(cwd, staged, path) {
11
+ const args = ['diff'];
12
+ if (staged)
13
+ args.push('--staged');
14
+ if (path)
15
+ args.push('--', path);
16
+ try {
17
+ const { stdout } = await execFileAsync('git', args, { cwd, maxBuffer: 2 * 1024 * 1024 });
18
+ return stdout.trim();
19
+ }
20
+ catch (err) {
21
+ throw new JamError('Failed to run git diff. Is this a git repository?', 'TOOL_EXEC_ERROR', { cause: err });
22
+ }
23
+ }
24
+ export async function runDiff(options) {
25
+ try {
26
+ const workspaceRoot = await getWorkspaceRoot();
27
+ const diff = await getGitDiff(workspaceRoot, options.staged ?? false, options.path);
28
+ if (!diff) {
29
+ const target = options.staged ? 'staged changes' : 'working tree changes';
30
+ process.stdout.write(`No ${target} found.\n`);
31
+ return;
32
+ }
33
+ if (options.noReview) {
34
+ process.stdout.write(diff + '\n');
35
+ return;
36
+ }
37
+ const config = await loadConfig(process.cwd(), options);
38
+ const profile = getActiveProfile(config);
39
+ const adapter = await createProvider(profile);
40
+ const context = options.staged
41
+ ? 'These are the staged changes (ready to commit).'
42
+ : 'These are the current working tree changes (unstaged).';
43
+ const prompt = `${context} Please review this git diff and provide:\n` +
44
+ `1. A summary of what changed\n` +
45
+ `2. Potential issues, risks, or improvements\n` +
46
+ `3. A suggested commit message (if staged)\n\n` +
47
+ `\`\`\`diff\n${diff}\n\`\`\``;
48
+ const request = {
49
+ messages: [{ role: 'user', content: prompt }],
50
+ model: profile.model,
51
+ temperature: profile.temperature,
52
+ maxTokens: profile.maxTokens,
53
+ systemPrompt: profile.systemPrompt,
54
+ };
55
+ if (options.json) {
56
+ const { text, usage } = await collectStream(withRetry(() => adapter.streamCompletion(request)));
57
+ printJsonResult({ response: text, usage, model: profile.model });
58
+ }
59
+ else {
60
+ await streamToStdout(withRetry(() => adapter.streamCompletion(request)));
61
+ }
62
+ }
63
+ catch (err) {
64
+ const jamErr = JamError.fromUnknown(err);
65
+ await printError(jamErr.message);
66
+ process.exit(1);
67
+ }
68
+ }
69
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CliOverrides } from '../config/schema.js';
2
+ export declare function runDoctor(options: CliOverrides): Promise<void>;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAiBxD,wBAAsB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgGpE"}