@llmtune/cli 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/README.md +206 -181
  2. package/dist/agent/conversation.d.ts.map +1 -0
  3. package/dist/agent/conversation.js.map +1 -0
  4. package/dist/agent/loop.d.ts.map +1 -0
  5. package/dist/agent/loop.js +45 -11
  6. package/dist/agent/loop.js.map +1 -0
  7. package/dist/agent/planner.d.ts.map +1 -0
  8. package/dist/agent/planner.js.map +1 -0
  9. package/dist/auth/client.d.ts.map +1 -0
  10. package/dist/auth/client.js.map +1 -0
  11. package/dist/auth/config.d.ts.map +1 -0
  12. package/dist/auth/config.js.map +1 -0
  13. package/dist/commands/balance.d.ts +2 -0
  14. package/dist/commands/balance.d.ts.map +1 -0
  15. package/dist/commands/balance.js +65 -0
  16. package/dist/commands/balance.js.map +1 -0
  17. package/dist/commands/chat.d.ts.map +1 -0
  18. package/dist/commands/chat.js +15 -11
  19. package/dist/commands/chat.js.map +1 -0
  20. package/dist/commands/config.d.ts.map +1 -0
  21. package/dist/commands/config.js.map +1 -0
  22. package/dist/commands/doctor.d.ts +2 -0
  23. package/dist/commands/doctor.d.ts.map +1 -0
  24. package/dist/commands/doctor.js +212 -0
  25. package/dist/commands/doctor.js.map +1 -0
  26. package/dist/commands/login.d.ts.map +1 -0
  27. package/dist/commands/login.js +3 -1
  28. package/dist/commands/login.js.map +1 -0
  29. package/dist/commands/marketplace.d.ts.map +1 -0
  30. package/dist/commands/marketplace.js.map +1 -0
  31. package/dist/commands/models.d.ts.map +1 -0
  32. package/dist/commands/models.js +9 -15
  33. package/dist/commands/models.js.map +1 -0
  34. package/dist/commands/update.d.ts +6 -0
  35. package/dist/commands/update.d.ts.map +1 -0
  36. package/dist/commands/update.js +115 -0
  37. package/dist/commands/update.js.map +1 -0
  38. package/dist/compact/auto-compact.d.ts.map +1 -0
  39. package/dist/compact/auto-compact.js.map +1 -0
  40. package/dist/compact/budget.d.ts.map +1 -0
  41. package/dist/compact/budget.js +18 -0
  42. package/dist/compact/budget.js.map +1 -0
  43. package/dist/compact/history-store.d.ts.map +1 -0
  44. package/dist/compact/history-store.js.map +1 -0
  45. package/dist/compact/microcompact.d.ts.map +1 -0
  46. package/dist/compact/microcompact.js.map +1 -0
  47. package/dist/compact/service.d.ts.map +1 -0
  48. package/dist/compact/service.js.map +1 -0
  49. package/dist/context/agent-identity.d.ts.map +1 -0
  50. package/dist/context/agent-identity.js +19 -0
  51. package/dist/context/agent-identity.js.map +1 -0
  52. package/dist/context/analyzer.d.ts.map +1 -0
  53. package/dist/context/analyzer.js.map +1 -0
  54. package/dist/context/builder.d.ts.map +1 -0
  55. package/dist/context/builder.js +7 -0
  56. package/dist/context/builder.js.map +1 -0
  57. package/dist/context/cache.d.ts.map +1 -0
  58. package/dist/context/cache.js +110 -0
  59. package/dist/context/cache.js.map +1 -0
  60. package/dist/context/git-context.d.ts.map +1 -0
  61. package/dist/context/git-context.js.map +1 -0
  62. package/dist/context/llmtune-md.d.ts.map +1 -0
  63. package/dist/context/llmtune-md.js.map +1 -0
  64. package/dist/context/project-detect.d.ts +26 -0
  65. package/dist/context/project-detect.d.ts.map +1 -0
  66. package/dist/context/project-detect.js +213 -0
  67. package/dist/context/project-detect.js.map +1 -0
  68. package/dist/context/workspace.d.ts.map +1 -0
  69. package/dist/context/workspace.js +2 -1
  70. package/dist/context/workspace.js.map +1 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +57 -5
  73. package/dist/index.js.map +1 -0
  74. package/dist/marketplace/client.d.ts.map +1 -0
  75. package/dist/marketplace/client.js.map +1 -0
  76. package/dist/memory/files.d.ts.map +1 -0
  77. package/dist/memory/files.js.map +1 -0
  78. package/dist/memory/service.d.ts +2 -1
  79. package/dist/memory/service.d.ts.map +1 -0
  80. package/dist/memory/service.js +1 -0
  81. package/dist/memory/service.js.map +1 -0
  82. package/dist/repl/auto-save.d.ts +14 -0
  83. package/dist/repl/auto-save.d.ts.map +1 -0
  84. package/dist/repl/auto-save.js +101 -0
  85. package/dist/repl/auto-save.js.map +1 -0
  86. package/dist/repl/repl.d.ts +1 -0
  87. package/dist/repl/repl.d.ts.map +1 -0
  88. package/dist/repl/repl.js +296 -34
  89. package/dist/repl/repl.js.map +1 -0
  90. package/dist/skills/args.d.ts.map +1 -0
  91. package/dist/skills/args.js.map +1 -0
  92. package/dist/skills/frontmatter.d.ts.map +1 -0
  93. package/dist/skills/frontmatter.js.map +1 -0
  94. package/dist/skills/loader.d.ts.map +1 -0
  95. package/dist/skills/loader.js.map +1 -0
  96. package/dist/skills/registry.d.ts.map +1 -0
  97. package/dist/skills/registry.js.map +1 -0
  98. package/dist/skills/signing/signer.d.ts.map +1 -0
  99. package/dist/skills/signing/signer.js.map +1 -0
  100. package/dist/skills/trust.d.ts.map +1 -0
  101. package/dist/skills/trust.js.map +1 -0
  102. package/dist/telemetry/logger.d.ts.map +1 -0
  103. package/dist/telemetry/logger.js.map +1 -0
  104. package/dist/tools/permissions.d.ts +2 -0
  105. package/dist/tools/permissions.d.ts.map +1 -0
  106. package/dist/tools/permissions.js +9 -0
  107. package/dist/tools/permissions.js.map +1 -0
  108. package/dist/tools/protocol.d.ts.map +1 -0
  109. package/dist/tools/protocol.js.map +1 -0
  110. package/dist/tools/registry.d.ts.map +1 -0
  111. package/dist/tools/registry.js.map +1 -0
  112. package/dist/tools/sandbox/docker.d.ts.map +1 -0
  113. package/dist/tools/sandbox/docker.js.map +1 -0
  114. package/dist/tools/sandbox/index.d.ts.map +1 -0
  115. package/dist/tools/sandbox/index.js.map +1 -0
  116. package/dist/tools/sanitize.d.ts +10 -0
  117. package/dist/tools/sanitize.d.ts.map +1 -0
  118. package/dist/tools/sanitize.js +87 -0
  119. package/dist/tools/sanitize.js.map +1 -0
  120. package/dist/tools/tools/ask-user.d.ts.map +1 -0
  121. package/dist/tools/tools/ask-user.js.map +1 -0
  122. package/dist/tools/tools/bash.d.ts.map +1 -0
  123. package/dist/tools/tools/bash.js +52 -1
  124. package/dist/tools/tools/bash.js.map +1 -0
  125. package/dist/tools/tools/edit.d.ts.map +1 -0
  126. package/dist/tools/tools/edit.js +9 -2
  127. package/dist/tools/tools/edit.js.map +1 -0
  128. package/dist/tools/tools/glob.d.ts.map +1 -0
  129. package/dist/tools/tools/glob.js.map +1 -0
  130. package/dist/tools/tools/grep.d.ts.map +1 -0
  131. package/dist/tools/tools/grep.js +6 -8
  132. package/dist/tools/tools/grep.js.map +1 -0
  133. package/dist/tools/tools/read.d.ts.map +1 -0
  134. package/dist/tools/tools/read.js +7 -4
  135. package/dist/tools/tools/read.js.map +1 -0
  136. package/dist/tools/tools/web-fetch.d.ts.map +1 -0
  137. package/dist/tools/tools/web-fetch.js +74 -99
  138. package/dist/tools/tools/web-fetch.js.map +1 -0
  139. package/dist/tools/tools/write.d.ts.map +1 -0
  140. package/dist/tools/tools/write.js +13 -7
  141. package/dist/tools/tools/write.js.map +1 -0
  142. package/dist/tools/validation.d.ts.map +1 -0
  143. package/dist/tools/validation.js.map +1 -0
  144. package/dist/ui/banner.d.ts +2 -0
  145. package/dist/ui/banner.d.ts.map +1 -0
  146. package/dist/ui/banner.js +29 -0
  147. package/dist/ui/banner.js.map +1 -0
  148. package/dist/utils/diff.d.ts +38 -0
  149. package/dist/utils/diff.d.ts.map +1 -0
  150. package/dist/utils/diff.js +184 -0
  151. package/dist/utils/diff.js.map +1 -0
  152. package/dist/utils/errors.d.ts +32 -0
  153. package/dist/utils/errors.d.ts.map +1 -0
  154. package/dist/utils/errors.js +72 -0
  155. package/dist/utils/errors.js.map +1 -0
  156. package/dist/utils/ignore.d.ts +22 -0
  157. package/dist/utils/ignore.d.ts.map +1 -0
  158. package/dist/utils/ignore.js +205 -0
  159. package/dist/utils/ignore.js.map +1 -0
  160. package/dist/utils/input-history.d.ts +37 -0
  161. package/dist/utils/input-history.d.ts.map +1 -0
  162. package/dist/utils/input-history.js +142 -0
  163. package/dist/utils/input-history.js.map +1 -0
  164. package/dist/utils/markdown.d.ts.map +1 -0
  165. package/dist/utils/markdown.js.map +1 -0
  166. package/dist/utils/rate-limit.d.ts +36 -0
  167. package/dist/utils/rate-limit.d.ts.map +1 -0
  168. package/dist/utils/rate-limit.js +71 -0
  169. package/dist/utils/rate-limit.js.map +1 -0
  170. package/dist/utils/retry.d.ts +26 -0
  171. package/dist/utils/retry.d.ts.map +1 -0
  172. package/dist/utils/retry.js +96 -0
  173. package/dist/utils/retry.js.map +1 -0
  174. package/dist/utils/spinner.d.ts +12 -0
  175. package/dist/utils/spinner.d.ts.map +1 -0
  176. package/dist/utils/spinner.js +51 -0
  177. package/dist/utils/spinner.js.map +1 -0
  178. package/dist/utils/stats.d.ts +29 -0
  179. package/dist/utils/stats.d.ts.map +1 -0
  180. package/dist/utils/stats.js +95 -0
  181. package/dist/utils/stats.js.map +1 -0
  182. package/dist/utils/streaming.d.ts +6 -3
  183. package/dist/utils/streaming.d.ts.map +1 -0
  184. package/dist/utils/streaming.js +14 -19
  185. package/dist/utils/streaming.js.map +1 -0
  186. package/dist/utils/tokens.d.ts.map +1 -0
  187. package/dist/utils/tokens.js.map +1 -0
  188. package/dist/utils/undo-tracker.d.ts +37 -0
  189. package/dist/utils/undo-tracker.d.ts.map +1 -0
  190. package/dist/utils/undo-tracker.js +118 -0
  191. package/dist/utils/undo-tracker.js.map +1 -0
  192. package/dist/version.d.ts.map +1 -0
  193. package/dist/version.js.map +1 -0
  194. package/package.json +61 -45
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Lightweight "thinking" spinner shown while waiting for LLM responses.
3
+ * Uses only ASCII characters for maximum terminal compatibility.
4
+ */
5
+ export interface Spinner {
6
+ start(label?: string): void;
7
+ update(label: string): void;
8
+ stop(): void;
9
+ isSpinning(): boolean;
10
+ }
11
+ export declare function createSpinner(): Spinner;
12
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/utils/spinner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,OAAO;IACtB,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,IAAI,IAAI,CAAA;IACZ,UAAU,IAAI,OAAO,CAAA;CACtB;AAED,wBAAgB,aAAa,IAAI,OAAO,CA4CvC"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * Lightweight "thinking" spinner shown while waiting for LLM responses.
4
+ * Uses only ASCII characters for maximum terminal compatibility.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.createSpinner = createSpinner;
8
+ const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⦶", "⠧", "⠇", "⠏"];
9
+ const INTERVAL_MS = 80;
10
+ function createSpinner() {
11
+ let frameIndex = 0;
12
+ let timer = null;
13
+ let active = false;
14
+ let currentLabel = "Thinking";
15
+ return {
16
+ start(label) {
17
+ if (active)
18
+ return;
19
+ active = true;
20
+ currentLabel = label ?? "Thinking";
21
+ frameIndex = 0;
22
+ // Hide cursor for cleaner look
23
+ process.stdout.write("\x1B[?25l");
24
+ timer = setInterval(() => {
25
+ const frame = SPINNER_FRAMES[frameIndex % SPINNER_FRAMES.length];
26
+ process.stdout.write(`\r ${frame} ${currentLabel}...`);
27
+ frameIndex++;
28
+ }, INTERVAL_MS);
29
+ },
30
+ update(label) {
31
+ currentLabel = label;
32
+ },
33
+ stop() {
34
+ if (!active)
35
+ return;
36
+ active = false;
37
+ if (timer) {
38
+ clearInterval(timer);
39
+ timer = null;
40
+ }
41
+ // Clear the spinner line
42
+ process.stdout.write("\r" + " ".repeat(currentLabel.length + 20) + "\r");
43
+ // Show cursor again
44
+ process.stdout.write("\x1B[?25h");
45
+ },
46
+ isSpinning() {
47
+ return active;
48
+ },
49
+ };
50
+ }
51
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/utils/spinner.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAYH,sCA4CC;AAtDD,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AACzE,MAAM,WAAW,GAAG,EAAE,CAAA;AAStB,SAAgB,aAAa;IAC3B,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,KAAK,GAA0C,IAAI,CAAA;IACvD,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,IAAI,YAAY,GAAG,UAAU,CAAA;IAE7B,OAAO;QACL,KAAK,CAAC,KAAc;YAClB,IAAI,MAAM;gBAAE,OAAM;YAClB,MAAM,GAAG,IAAI,CAAA;YACb,YAAY,GAAG,KAAK,IAAI,UAAU,CAAA;YAClC,UAAU,GAAG,CAAC,CAAA;YAEd,+BAA+B;YAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;YAEjC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;gBACvB,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;gBAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,YAAY,KAAK,CAAC,CAAA;gBACvD,UAAU,EAAE,CAAA;YACd,CAAC,EAAE,WAAW,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,CAAC,KAAa;YAClB,YAAY,GAAG,KAAK,CAAA;QACtB,CAAC;QAED,IAAI;YACF,IAAI,CAAC,MAAM;gBAAE,OAAM;YACnB,MAAM,GAAG,KAAK,CAAA;YACd,IAAI,KAAK,EAAE,CAAC;gBACV,aAAa,CAAC,KAAK,CAAC,CAAA;gBACpB,KAAK,GAAG,IAAI,CAAA;YACd,CAAC;YACD,yBAAyB;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;YACxE,oBAAoB;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QACnC,CAAC;QAED,UAAU;YACR,OAAO,MAAM,CAAA;QACf,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Session statistics tracker.
3
+ * Tracks token usage, tool calls, timing, and costs for the current session.
4
+ */
5
+ export interface SessionStats {
6
+ startTime: number;
7
+ totalInputTokens: number;
8
+ totalOutputTokens: number;
9
+ totalToolCalls: number;
10
+ toolCallCounts: Record<string, number>;
11
+ llmCalls: number;
12
+ compactCount: number;
13
+ tokensSavedByCompact: number;
14
+ errors: number;
15
+ }
16
+ export declare class StatsTracker {
17
+ private stats;
18
+ constructor();
19
+ recordLLMCall(inputTokens: number, outputTokens: number): void;
20
+ recordToolCall(toolName: string): void;
21
+ recordCompact(tokensSaved: number): void;
22
+ recordError(): void;
23
+ getStats(): Readonly<SessionStats>;
24
+ getElapsedTime(): string;
25
+ getEstimatedCost(): number;
26
+ getSummary(): string;
27
+ reset(): void;
28
+ }
29
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/utils/stats.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,MAAM,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAc;;IAgB3B,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAM9D,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKtC,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAKxC,WAAW,IAAI,IAAI;IAInB,QAAQ,IAAI,QAAQ,CAAC,YAAY,CAAC;IAIlC,cAAc,IAAI,MAAM;IAWxB,gBAAgB,IAAI,MAAM;IAO1B,UAAU,IAAI,MAAM;IA6BpB,KAAK,IAAI,IAAI;CAad"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ /**
3
+ * Session statistics tracker.
4
+ * Tracks token usage, tool calls, timing, and costs for the current session.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.StatsTracker = void 0;
8
+ class StatsTracker {
9
+ stats;
10
+ constructor() {
11
+ this.stats = {
12
+ startTime: Date.now(),
13
+ totalInputTokens: 0,
14
+ totalOutputTokens: 0,
15
+ totalToolCalls: 0,
16
+ toolCallCounts: {},
17
+ llmCalls: 0,
18
+ compactCount: 0,
19
+ tokensSavedByCompact: 0,
20
+ errors: 0,
21
+ };
22
+ }
23
+ recordLLMCall(inputTokens, outputTokens) {
24
+ this.stats.llmCalls++;
25
+ this.stats.totalInputTokens += inputTokens;
26
+ this.stats.totalOutputTokens += outputTokens;
27
+ }
28
+ recordToolCall(toolName) {
29
+ this.stats.totalToolCalls++;
30
+ this.stats.toolCallCounts[toolName] = (this.stats.toolCallCounts[toolName] ?? 0) + 1;
31
+ }
32
+ recordCompact(tokensSaved) {
33
+ this.stats.compactCount++;
34
+ this.stats.tokensSavedByCompact += tokensSaved;
35
+ }
36
+ recordError() {
37
+ this.stats.errors++;
38
+ }
39
+ getStats() {
40
+ return this.stats;
41
+ }
42
+ getElapsedTime() {
43
+ const elapsed = Date.now() - this.stats.startTime;
44
+ const seconds = Math.floor(elapsed / 1000);
45
+ const minutes = Math.floor(seconds / 60);
46
+ const hours = Math.floor(minutes / 60);
47
+ if (hours > 0)
48
+ return `${hours}h ${minutes % 60}m`;
49
+ if (minutes > 0)
50
+ return `${minutes}m ${seconds % 60}s`;
51
+ return `${seconds}s`;
52
+ }
53
+ getEstimatedCost() {
54
+ // Approximate pricing per 1M tokens
55
+ return ((this.stats.totalInputTokens * 3 + this.stats.totalOutputTokens * 15) / 1_000_000);
56
+ }
57
+ getSummary() {
58
+ const lines = [];
59
+ lines.push(` Duration: ${this.getElapsedTime()}`);
60
+ lines.push(` LLM calls: ${this.stats.llmCalls}`);
61
+ lines.push(` Input tokens: ${this.stats.totalInputTokens.toLocaleString()}`);
62
+ lines.push(` Output tokens: ${this.stats.totalOutputTokens.toLocaleString()}`);
63
+ lines.push(` Tool calls: ${this.stats.totalToolCalls}`);
64
+ // Top tools
65
+ const topTools = Object.entries(this.stats.toolCallCounts)
66
+ .sort((a, b) => b[1] - a[1])
67
+ .slice(0, 5);
68
+ if (topTools.length > 0) {
69
+ lines.push(` Top tools: ${topTools.map(([name, count]) => `${name}(${count})`).join(", ")}`);
70
+ }
71
+ if (this.stats.compactCount > 0) {
72
+ lines.push(` Compactions: ${this.stats.compactCount} (${this.stats.tokensSavedByCompact.toLocaleString()} tokens saved)`);
73
+ }
74
+ if (this.stats.errors > 0) {
75
+ lines.push(` Errors: ${this.stats.errors}`);
76
+ }
77
+ lines.push(` Est. cost: $${this.getEstimatedCost().toFixed(4)}`);
78
+ return lines.join("\n");
79
+ }
80
+ reset() {
81
+ this.stats = {
82
+ startTime: Date.now(),
83
+ totalInputTokens: 0,
84
+ totalOutputTokens: 0,
85
+ totalToolCalls: 0,
86
+ toolCallCounts: {},
87
+ llmCalls: 0,
88
+ compactCount: 0,
89
+ tokensSavedByCompact: 0,
90
+ errors: 0,
91
+ };
92
+ }
93
+ }
94
+ exports.StatsTracker = StatsTracker;
95
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/utils/stats.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,13 @@
1
- import { Ora } from "ora";
1
+ /**
2
+ * Streaming display utilities for throttled terminal output.
3
+ * IMPORTANT: Every token is preserved — none are dropped between updates.
4
+ */
2
5
  export declare function createStreamingDisplay(): {
3
6
  onToken(token: string): void;
7
+ /** Call when stream ends to flush any remaining buffered tokens */
4
8
  flush(): void;
5
9
  getBuffer(): string;
6
10
  };
7
- export declare function showSpinner(text: string): Ora;
8
- export declare function formatToolCall(name: string, input: Record<string, unknown>): string;
11
+ export declare function getToolLabel(name: string, input: Record<string, unknown>): string;
9
12
  export declare function formatToolResult(name: string, output: unknown): string;
10
13
  //# sourceMappingURL=streaming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/utils/streaming.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,sBAAsB;mBAMnB,MAAM,GAAG,IAAI;IAU5B,mEAAmE;aAC1D,IAAI;iBAOA,MAAM;EAItB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAejF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAKtE"}
@@ -1,8 +1,11 @@
1
1
  "use strict";
2
+ /**
3
+ * Streaming display utilities for throttled terminal output.
4
+ * IMPORTANT: Every token is preserved — none are dropped between updates.
5
+ */
2
6
  Object.defineProperty(exports, "__esModule", { value: true });
3
7
  exports.createStreamingDisplay = createStreamingDisplay;
4
- exports.showSpinner = showSpinner;
5
- exports.formatToolCall = formatToolCall;
8
+ exports.getToolLabel = getToolLabel;
6
9
  exports.formatToolResult = formatToolResult;
7
10
  function createStreamingDisplay() {
8
11
  let buffer = "";
@@ -12,14 +15,16 @@ function createStreamingDisplay() {
12
15
  onToken(token) {
13
16
  buffer += token;
14
17
  const now = Date.now();
15
- if (now - lastUpdateTime > UPDATE_INTERVAL_MS) {
16
- process.stdout.write(token);
18
+ if (now - lastUpdateTime >= UPDATE_INTERVAL_MS) {
19
+ process.stdout.write(buffer);
20
+ buffer = "";
17
21
  lastUpdateTime = now;
18
22
  }
19
23
  },
24
+ /** Call when stream ends to flush any remaining buffered tokens */
20
25
  flush() {
21
26
  if (buffer) {
22
- process.stdout.write("\n");
27
+ process.stdout.write(buffer);
23
28
  buffer = "";
24
29
  }
25
30
  },
@@ -28,20 +33,10 @@ function createStreamingDisplay() {
28
33
  },
29
34
  };
30
35
  }
31
- function showSpinner(text) {
32
- const ora = require("ora");
33
- return ora({ text, color: "cyan" }).start();
34
- }
35
- function formatToolCall(name, input) {
36
- const summary = summarizeToolInput(name, input);
37
- return ` \x1b[33m*\x1b[0m ${name}${summary ? `(${summary})` : ""}`;
38
- }
39
- function summarizeToolInput(name, input) {
40
- switch (name.toLowerCase()) {
41
- case "bash": {
42
- const cmd = String(input.command || "");
43
- return cmd.length > 60 ? cmd.slice(0, 57) + "..." : cmd;
44
- }
36
+ function getToolLabel(name, input) {
37
+ switch (name) {
38
+ case "bash":
39
+ return String(input.command || "");
45
40
  case "read":
46
41
  case "write":
47
42
  case "edit":
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/utils/streaming.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,wDA4BC;AAED,oCAeC;AAED,4CAKC;AApDD,SAAgB,sBAAsB;IACpC,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,IAAI,cAAc,GAAG,CAAC,CAAA;IACtB,MAAM,kBAAkB,GAAG,EAAE,CAAA;IAE7B,OAAO;QACL,OAAO,CAAC,KAAa;YACnB,MAAM,IAAI,KAAK,CAAA;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACtB,IAAI,GAAG,GAAG,cAAc,IAAI,kBAAkB,EAAE,CAAC;gBAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBAC5B,MAAM,GAAG,EAAE,CAAA;gBACX,cAAc,GAAG,GAAG,CAAA;YACtB,CAAC;QACH,CAAC;QAED,mEAAmE;QACnE,KAAK;YACH,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBAC5B,MAAM,GAAG,EAAE,CAAA;YACb,CAAC;QACH,CAAC;QAED,SAAS;YACP,OAAO,MAAM,CAAA;QACf,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,IAAY,EAAE,KAA8B;IACvE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;QACpC,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;QACpD,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;QACpC,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;QACpC;YACE,OAAO,EAAE,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAY,EAAE,MAAe;IAC5D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;IACpE,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAC7C,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,GAClD,MAAM,CAYR;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAQxF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIvD"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,wCAGC;AAED,wDAcC;AAED,4DAQC;AAED,4CAIC;AAnCD,SAAgB,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAA;IACnB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AACnC,CAAC;AAED,SAAgB,sBAAsB,CACpC,QAAmD;IAEnD,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,OAAO,GACX,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;YAC7B,CAAC,CAAC,GAAG,CAAC,OAAO;YACb,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;QACvC,KAAK,IAAI,cAAc,CAAC,OAAO,CAAC,CAAA;QAChC,wDAAwD;QACxD,KAAK,IAAI,CAAC,CAAA;IACZ,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,wBAAwB,CAAC,OAAuC;IAC9E,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAA;QACzD,KAAK,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAA;QAClD,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAA;IACpE,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAAc;IAC7C,IAAI,MAAM,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAA;IACrE,IAAI,MAAM,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAA;IAC7D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;AACvB,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Undo tracker — keeps a stack of file snapshots before destructive edits.
3
+ * Enables /undo command to revert the last file change.
4
+ */
5
+ export interface FileSnapshot {
6
+ filePath: string;
7
+ content: string | null;
8
+ timestamp: number;
9
+ operation: "write" | "edit";
10
+ }
11
+ export declare class UndoTracker {
12
+ private stack;
13
+ /**
14
+ * Save a snapshot of the file before it gets modified.
15
+ * Call this BEFORE performing the write/edit.
16
+ */
17
+ push(filePath: string, operation: "write" | "edit"): void;
18
+ /**
19
+ * Undo the most recent file change. Returns info about what was undone,
20
+ * or null if there's nothing to undo.
21
+ */
22
+ undo(): FileSnapshot | null;
23
+ /**
24
+ * Peek at the most recent snapshot without popping it.
25
+ */
26
+ peek(): FileSnapshot | null;
27
+ /**
28
+ * Get the full undo history.
29
+ */
30
+ getHistory(): readonly FileSnapshot[];
31
+ /**
32
+ * Clear the undo stack.
33
+ */
34
+ clear(): void;
35
+ get size(): number;
36
+ }
37
+ //# sourceMappingURL=undo-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"undo-tracker.d.ts","sourceRoot":"","sources":["../../src/utils/undo-tracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,OAAO,GAAG,MAAM,CAAA;CAC5B;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAqB;IAElC;;;OAGG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAuBzD;;;OAGG;IACH,IAAI,IAAI,YAAY,GAAG,IAAI;IAoB3B;;OAEG;IACH,IAAI,IAAI,YAAY,GAAG,IAAI;IAI3B;;OAEG;IACH,UAAU,IAAI,SAAS,YAAY,EAAE;IAIrC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * Undo tracker — keeps a stack of file snapshots before destructive edits.
4
+ * Enables /undo command to revert the last file change.
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.UndoTracker = void 0;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const MAX_UNDO_STACK = 50;
44
+ class UndoTracker {
45
+ stack = [];
46
+ /**
47
+ * Save a snapshot of the file before it gets modified.
48
+ * Call this BEFORE performing the write/edit.
49
+ */
50
+ push(filePath, operation) {
51
+ const resolved = path.resolve(filePath);
52
+ let content = null;
53
+ try {
54
+ content = fs.readFileSync(resolved, "utf-8");
55
+ }
56
+ catch {
57
+ // File doesn't exist yet — that's fine
58
+ }
59
+ this.stack.push({
60
+ filePath: resolved,
61
+ content,
62
+ timestamp: Date.now(),
63
+ operation,
64
+ });
65
+ // Trim old entries
66
+ if (this.stack.length > MAX_UNDO_STACK) {
67
+ this.stack = this.stack.slice(-MAX_UNDO_STACK);
68
+ }
69
+ }
70
+ /**
71
+ * Undo the most recent file change. Returns info about what was undone,
72
+ * or null if there's nothing to undo.
73
+ */
74
+ undo() {
75
+ const snapshot = this.stack.pop();
76
+ if (!snapshot)
77
+ return null;
78
+ try {
79
+ if (snapshot.content === null) {
80
+ // File was created — delete it
81
+ fs.unlinkSync(snapshot.filePath);
82
+ }
83
+ else {
84
+ // File was modified — restore previous content
85
+ fs.writeFileSync(snapshot.filePath, snapshot.content, "utf-8");
86
+ }
87
+ return snapshot;
88
+ }
89
+ catch (err) {
90
+ // Put it back on the stack if undo failed
91
+ this.stack.push(snapshot);
92
+ throw err;
93
+ }
94
+ }
95
+ /**
96
+ * Peek at the most recent snapshot without popping it.
97
+ */
98
+ peek() {
99
+ return this.stack.length > 0 ? this.stack[this.stack.length - 1] : null;
100
+ }
101
+ /**
102
+ * Get the full undo history.
103
+ */
104
+ getHistory() {
105
+ return this.stack;
106
+ }
107
+ /**
108
+ * Clear the undo stack.
109
+ */
110
+ clear() {
111
+ this.stack = [];
112
+ }
113
+ get size() {
114
+ return this.stack.length;
115
+ }
116
+ }
117
+ exports.UndoTracker = UndoTracker;
118
+ //# sourceMappingURL=undo-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"undo-tracker.js","sourceRoot":"","sources":["../../src/utils/undo-tracker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAwB;AACxB,2CAA4B;AAU5B,MAAM,cAAc,GAAG,EAAE,CAAA;AAEzB,MAAa,WAAW;IACd,KAAK,GAAmB,EAAE,CAAA;IAElC;;;OAGG;IACH,IAAI,CAAC,QAAgB,EAAE,SAA2B;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,OAAO,GAAkB,IAAI,CAAA;QAEjC,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACd,QAAQ,EAAE,QAAQ;YAClB,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS;SACV,CAAC,CAAA;QAEF,mBAAmB;QACnB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAA;QACjC,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAA;QAE1B,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC9B,+BAA+B;gBAC/B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAClC,CAAC;iBAAM,CAAC;gBACN,+CAA+C;gBAC/C,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAChE,CAAC;YACD,OAAO,QAAQ,CAAA;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,0CAA0C;YAC1C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACzB,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACzE,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;IACjB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAA;IAC1B,CAAC;CACF;AA9ED,kCA8EC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,QAAsB,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;;;;;AAAA,mEAAyC;AAE5B,QAAA,WAAW,GAAG,sBAAW,CAAC,OAAO,CAAA"}
package/package.json CHANGED
@@ -1,45 +1,61 @@
1
- {
2
- "name": "@llmtune/cli",
3
- "version": "0.1.8",
4
- "description": "LLMTune CLI -AI CLI Agent powered by llmtune.io",
5
- "main": "dist/index.js",
6
- "bin": {
7
- "llmtune": "dist/index.js"
8
- },
9
- "scripts": {
10
- "build": "tsc",
11
- "dev": "tsx src/index.ts",
12
- "start": "node dist/index.js",
13
- "lint": "tsc --noEmit",
14
- "test": "npm run build && node scripts/smoke-test.js"
15
- },
16
- "keywords": [
17
- "llmtune",
18
- "cli",
19
- "ai",
20
- "agent",
21
- "coding"
22
- ],
23
- "license": "MIT",
24
- "engines": {
25
- "node": ">=18.0.0"
26
- },
27
- "dependencies": {
28
- "commander": "^13.1.0",
29
- "openai": "^4.78.0",
30
- "chalk": "^5.3.0",
31
- "ora": "^8.1.0",
32
- "@inquirer/prompts": "^7.3.0",
33
- "marked": "^15.0.0",
34
- "marked-terminal": "^7.3.0",
35
- "simple-git": "^3.27.0",
36
- "glob": "^11.0.0",
37
- "zod": "^3.24.0",
38
- "yaml": "^2.6.0"
39
- },
40
- "devDependencies": {
41
- "typescript": "^5.7.0",
42
- "tsx": "^4.19.0",
43
- "@types/node": "^22.10.0"
44
- }
45
- }
1
+ {
2
+ "name": "@llmtune/cli",
3
+ "version": "0.2.0",
4
+ "description": "LLMTune CLI - AI CLI Agent powered by llmtune.io",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "llmtune": "dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "tsx src/index.ts",
12
+ "start": "node dist/index.js",
13
+ "lint": "tsc --noEmit",
14
+ "test": "npm run build && node scripts/smoke-test.js"
15
+ },
16
+ "keywords": [
17
+ "llmtune",
18
+ "cli",
19
+ "ai",
20
+ "agent",
21
+ "coding"
22
+ ],
23
+ "author": "LLMTune",
24
+ "license": "MIT",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/llmtune/llmtune-cli.git"
28
+ },
29
+ "homepage": "https://llmtune.io",
30
+ "bugs": {
31
+ "url": "https://github.com/llmtune/llmtune-cli/issues"
32
+ },
33
+ "engines": {
34
+ "node": ">=18.0.0"
35
+ },
36
+ "files": [
37
+ "dist/",
38
+ "README.md"
39
+ ],
40
+ "publishConfig": {
41
+ "access": "public"
42
+ },
43
+ "dependencies": {
44
+ "commander": "^13.1.0",
45
+ "openai": "^4.78.0",
46
+ "chalk": "^5.3.0",
47
+ "ora": "^8.1.0",
48
+ "@inquirer/prompts": "^7.3.0",
49
+ "marked": "^15.0.0",
50
+ "marked-terminal": "^7.3.0",
51
+ "simple-git": "^3.27.0",
52
+ "glob": "^11.0.0",
53
+ "zod": "^3.24.0",
54
+ "yaml": "^2.6.0"
55
+ },
56
+ "devDependencies": {
57
+ "typescript": "^5.7.0",
58
+ "tsx": "^4.19.0",
59
+ "@types/node": "^22.10.0"
60
+ }
61
+ }