@ridit/lens 0.2.4 → 0.2.6

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 (41) hide show
  1. package/LENS.md +32 -68
  2. package/README.md +91 -0
  3. package/addons/README.md +3 -0
  4. package/addons/run-tests.js +127 -0
  5. package/dist/index.mjs +226459 -2638
  6. package/package.json +13 -4
  7. package/src/colors.ts +5 -0
  8. package/src/commands/commit.tsx +686 -0
  9. package/src/commands/provider.tsx +36 -22
  10. package/src/components/__tests__/Header.test.tsx +9 -0
  11. package/src/components/chat/ChatMessage.tsx +6 -6
  12. package/src/components/chat/ChatOverlays.tsx +20 -10
  13. package/src/components/chat/ChatRunner.tsx +197 -31
  14. package/src/components/provider/ApiKeyStep.tsx +77 -121
  15. package/src/components/provider/ModelStep.tsx +35 -20
  16. package/src/components/{repo → provider}/ProviderPicker.tsx +1 -1
  17. package/src/components/provider/ProviderTypeStep.tsx +12 -5
  18. package/src/components/provider/RemoveProviderStep.tsx +7 -8
  19. package/src/components/repo/RepoAnalysis.tsx +1 -1
  20. package/src/components/task/TaskRunner.tsx +1 -1
  21. package/src/components/timeline/CommitDetail.tsx +2 -4
  22. package/src/components/timeline/CommitList.tsx +2 -14
  23. package/src/components/timeline/TimelineChat.tsx +1 -2
  24. package/src/components/timeline/TimelineRunner.tsx +506 -423
  25. package/src/index.tsx +38 -0
  26. package/src/prompts/fewshot.ts +144 -47
  27. package/src/prompts/system.ts +25 -21
  28. package/src/tools/chart.ts +210 -0
  29. package/src/tools/convert-image.ts +312 -0
  30. package/src/tools/files.ts +1 -9
  31. package/src/tools/git.ts +577 -0
  32. package/src/tools/index.ts +17 -13
  33. package/src/tools/pdf.ts +136 -78
  34. package/src/tools/view-image.ts +335 -0
  35. package/src/tools/web.ts +0 -4
  36. package/src/utils/addons/loadAddons.ts +6 -3
  37. package/src/utils/chat.ts +38 -23
  38. package/src/utils/thinking.tsx +275 -162
  39. package/src/utils/tools/builtins.ts +39 -32
  40. package/src/utils/tools/registry.ts +0 -14
  41. package/tsconfig.json +2 -2
package/src/utils/chat.ts CHANGED
@@ -1,9 +1,3 @@
1
- // ── chat.ts ───────────────────────────────────────────────────────────────────
2
- //
3
- // Response parsing and API calls.
4
- // Tool parsing is now fully driven by the ToolRegistry — adding a new tool
5
- // to the registry automatically makes it parseable here.
6
-
7
1
  export {
8
2
  walkDir,
9
3
  applyPatches,
@@ -43,6 +37,20 @@ export type ParsedResponse =
43
37
  remainder?: string;
44
38
  };
45
39
 
40
+ const MAX_HISTORY = 30;
41
+
42
+ function buildFewShotMessages(): { role: string; content: string }[] {
43
+ const messages = [...FEW_SHOT_MESSAGES];
44
+ for (const tool of registry.all()) {
45
+ if (!tool.fewShots?.length) continue;
46
+ for (const shot of tool.fewShots) {
47
+ messages.push({ role: "user", content: shot.user });
48
+ messages.push({ role: "assistant", content: shot.assistant });
49
+ }
50
+ }
51
+ return messages;
52
+ }
53
+
46
54
  export function parseResponse(text: string): ParsedResponse {
47
55
  const scanText = text.replace(/```[\s\S]*?```/g, (m) => " ".repeat(m.length));
48
56
 
@@ -56,7 +64,6 @@ export function parseResponse(text: string): ParsedResponse {
56
64
  for (const toolName of registry.names()) {
57
65
  const escaped = toolName.replace(/[-]/g, "\\-");
58
66
 
59
- // XML tag
60
67
  const xmlRe = new RegExp(`<${escaped}>([\\s\\S]*?)<\\/${escaped}>`, "g");
61
68
  xmlRe.lastIndex = 0;
62
69
  const xmlM = xmlRe.exec(scanText);
@@ -78,7 +85,6 @@ export function parseResponse(text: string): ParsedResponse {
78
85
  }
79
86
  }
80
87
 
81
- // Fenced code block fallback
82
88
  const fencedRe = new RegExp(
83
89
  `\`\`\`${escaped}\\r?\\n([\\s\\S]*?)\\r?\\n\`\`\``,
84
90
  "g",
@@ -114,7 +120,6 @@ export function parseResponse(text: string): ParsedResponse {
114
120
  const afterMatch = text.slice(match.index + match[0].length).trim();
115
121
  const remainder = afterMatch.length > 0 ? afterMatch : undefined;
116
122
 
117
- // Special UI variants
118
123
  if (toolName === "changes") {
119
124
  try {
120
125
  const parsed = JSON.parse(body) as {
@@ -128,7 +133,9 @@ export function parseResponse(text: string): ParsedResponse {
128
133
  patches: parsed.patches,
129
134
  remainder,
130
135
  };
131
- } catch {
136
+ } catch (e) {
137
+ console.error("[parseResponse] failed to parse changes JSON:", e);
138
+ console.error("[parseResponse] body was:", body.slice(0, 200));
132
139
  return { kind: "text", content: text.trim() };
133
140
  }
134
141
  }
@@ -142,12 +149,21 @@ export function parseResponse(text: string): ParsedResponse {
142
149
  };
143
150
  }
144
151
 
145
- // Generic tool
146
152
  const tool = registry.get(toolName);
147
- if (!tool) return { kind: "text", content: text.trim() };
153
+ if (!tool) {
154
+ console.error("[parseResponse] unknown tool:", toolName);
155
+ return { kind: "text", content: text.trim() };
156
+ }
148
157
 
149
158
  const input = tool.parseInput(body);
150
- if (input === null) return { kind: "text", content: text.trim() };
159
+ if (input === null) {
160
+ console.error(
161
+ "[parseResponse] parseInput returned null for tool:",
162
+ toolName,
163
+ );
164
+ console.error("[parseResponse] body was:", body.slice(0, 200));
165
+ return { kind: "text", content: text.trim() };
166
+ }
151
167
 
152
168
  return {
153
169
  kind: "tool",
@@ -159,15 +175,11 @@ export function parseResponse(text: string): ParsedResponse {
159
175
  };
160
176
  }
161
177
 
162
- // ── Clone tag helper ──────────────────────────────────────────────────────────
163
-
164
178
  export function parseCloneTag(text: string): string | null {
165
179
  const m = text.match(/<clone>([\s\S]*?)<\/clone>/);
166
180
  return m ? m[1]!.trim() : null;
167
181
  }
168
182
 
169
- // ── GitHub URL detection ──────────────────────────────────────────────────────
170
-
171
183
  export function extractGithubUrl(text: string): string | null {
172
184
  const match = text.match(/https?:\/\/github\.com\/[\w.-]+\/[\w.-]+/);
173
185
  return match ? match[0]! : null;
@@ -178,12 +190,12 @@ export function toCloneUrl(url: string): string {
178
190
  return clean.endsWith(".git") ? clean : `${clean}.git`;
179
191
  }
180
192
 
181
- // ── API call ──────────────────────────────────────────────────────────────────
182
-
183
193
  function buildApiMessages(
184
194
  messages: Message[],
185
195
  ): { role: string; content: string }[] {
186
- return messages.map((m) => {
196
+ const recent = messages.slice(-MAX_HISTORY);
197
+
198
+ return recent.map((m) => {
187
199
  if (m.type === "tool") {
188
200
  if (!m.approved) {
189
201
  return {
@@ -207,7 +219,10 @@ export async function callChat(
207
219
  messages: Message[],
208
220
  abortSignal?: AbortSignal,
209
221
  ): Promise<string> {
210
- const apiMessages = [...FEW_SHOT_MESSAGES, ...buildApiMessages(messages)];
222
+ const apiMessages = [
223
+ ...buildFewShotMessages(),
224
+ ...buildApiMessages(messages),
225
+ ];
211
226
 
212
227
  let url: string;
213
228
  let headers: Record<string, string>;
@@ -222,7 +237,7 @@ export async function callChat(
222
237
  };
223
238
  body = {
224
239
  model: provider.model,
225
- max_tokens: 4096,
240
+ max_tokens: 16384,
226
241
  system: systemPrompt,
227
242
  messages: apiMessages,
228
243
  };
@@ -235,7 +250,7 @@ export async function callChat(
235
250
  };
236
251
  body = {
237
252
  model: provider.model,
238
- max_tokens: 4096,
253
+ max_tokens: 16384,
239
254
  messages: [{ role: "system", content: systemPrompt }, ...apiMessages],
240
255
  };
241
256
  }
@@ -2,182 +2,295 @@ import { useEffect, useState } from "react";
2
2
 
3
3
  const PHRASES: Record<string, string[]> = {
4
4
  general: [
5
- // ── cooking ──────────────────────────────────────────────────
6
- "marinating on that...",
7
- "letting it simmer...",
8
- "preheating the brain...",
9
- "seasoning the response...",
10
- "slow cooking an answer...",
11
- "whisking it together...",
12
- "folding in the context...",
13
- "reducing the codebase...",
14
- "deglazing with tokens...",
15
- "plating the thoughts...",
16
-
17
- // ── dev ──────────────────────────────────────────────────────
18
- "shipping neurons...",
19
- "diffing the vibes...",
20
- "grepping the matrix...",
21
- "pushing to brainstem...",
22
- "rebasing thoughts...",
23
- "compiling feelings...",
24
- "hot reloading ideas...",
25
- "touching grass mentally...",
26
- "npm install wisdom...",
27
- "resolving merge conflicts in head...",
28
- "squashing dumb thoughts...",
29
- "git blame on myself...",
30
- "yarn linking synapses...",
31
- "type checking the universe...",
32
- "tree shaking nonsense...",
33
-
34
- // ── gen z ────────────────────────────────────────────────────
35
- "no cap, thinking hard...",
36
- "lowkey computing...",
37
- "in my bag rn...",
38
- "it's giving... processing...",
39
- "understood the assignment...",
40
- "era of thinking...",
41
- "main character moment...",
42
- "this is the way...",
43
- "based response incoming...",
44
- "big brain time...",
45
- "galaxy brained...",
46
- "cooked something up...",
47
- "chefkiss incoming...",
48
- "slay mode: on...",
49
- "rizzing up an answer...",
50
- "rizzing up a baddie answer...",
51
- "sigma grindset: activated...",
52
- "NPC behavior: disabled...",
53
- "unaliving my writer's block...",
54
- "caught in 4K thinking...",
55
- "delulu but make it accurate...",
56
- "ate and left no crumbs...",
57
- "rent free in the codebase...",
58
- "understood the assignment (fr fr)...",
59
- "giving main character energy...",
60
- "no thoughts, head full...",
61
- "built different response incoming...",
62
- "chronically online and loving it...",
63
- "touch grass? not yet...",
64
- "this response is bussin...",
65
- "lowkey highkey computing...",
66
- "it's giving Einstein...",
67
- "we do a little thinking...",
68
- "gigachad analysis mode...",
69
- "the audacity to be this smart...",
70
-
71
- "consulting the void...",
72
- "asking my other personalities...",
73
- "reading the codebase tea leaves...",
74
- "vibing with your files...",
75
- "channeling senior engineer energy...",
76
- "pretending i know what i'm doing...",
77
- "staring at the wall (productively)...",
78
- "definitely not making this up...",
5
+ "marinating on that... 🍖",
6
+ "letting it simmer... 🍲",
7
+ "preheating the brain... 🔥",
8
+ "seasoning the response... 🧂",
9
+ "slow cooking an answer... 🐢",
10
+ "whisking it together... 🥄",
11
+ "folding in the context... 📄",
12
+ "reducing the codebase... 🧠",
13
+ "deglazing with tokens...",
14
+ "plating the thoughts... 🍽️",
15
+ // new additions
16
+ "blending the chaos... 🌀",
17
+ "tasting the logic... 👅",
18
+ "kneading the ideas... 🥖",
19
+ "sautéing thoughts... 🍳",
20
+ "folding in extra brainpower... 🧠",
21
+ "caramelizing the mistakes... 🍯",
22
+ "letting it chill... ❄️",
23
+ "flambéing the bugs... 🔥",
24
+ "mixing code and chaos... 🥣",
25
+ "plating the hot take... 🔥🍽️",
26
+ "simmering existential dread... 🫠",
27
+ "tempering the output... ",
28
+ "basting with logic... 🧂",
29
+ "drizzling insight... 🌧️",
30
+ "sprinkling genius... ",
31
+ "slow roasting complexity... 🐢🔥",
32
+ "blending the universe... 🌌",
33
+ "whipping up brilliance... 🥄💡",
34
+ "folding in main character energy... 🌟",
35
+ "checking internal temperatures... 🌡️",
79
36
  ],
80
37
 
81
38
  cloning: [
82
- "cloning at the speed of git...",
83
- "negotiating with github...",
84
- "untangling the object graph...",
85
- "counting commits like sheep...",
86
- "shallow clone, deep thoughts...",
87
- "fetching the whole iceberg...",
88
- "packing objects...",
89
- "resolving deltas...",
90
- "checking out the vibes...",
91
- "recursing into submodules...",
92
- "buffering the bits...",
93
- "git is being git...",
94
- "praying to the network gods...",
95
- "downloading the internet (just your repo)...",
39
+ "cloning at the speed of git... 🚀",
40
+ "negotiating with github... 🤝",
41
+ "untangling the object graph... 🧶",
42
+ "counting commits like sheep... 🐑",
43
+ "shallow clone, deep thoughts... 🌊",
44
+ "fetching the whole iceberg... 🧊",
45
+ "packing objects... 📦",
46
+ "resolving deltas... 🔄",
47
+ "checking out the vibes... 😎",
48
+ "recursing into submodules... 🔁",
49
+ "buffering the bits... 💾",
50
+ "git is being git... 🤷",
51
+ "praying to the network gods... 🙏",
52
+ "downloading the internet (just your repo)... 🌐",
53
+ // new additions
54
+ "forking in style... 🍴",
55
+ "pulling commits aggressively... 🏃‍♂️",
56
+ "syncing the vibes... 🌊",
57
+ "deep cloning existential crises... 😵",
58
+ "cherry-picking brilliance... 🍒",
59
+ "rewriting history (just a little)... 📝",
60
+ "fast-forwarding thoughts... ⏩",
61
+ "merging with the multiverse... 🌌",
62
+ "rebasing reality... 🔄",
63
+ "checking out chaos... 😎",
64
+ "cloning like a pro... 👑",
65
+ "replicating the vibes... 🔁",
66
+ "buffer overflow in progress... 💾",
67
+ "pull request to sanity... 🤯",
68
+ "diverging the timeline... ⏳",
69
+ "squashing git guilt... 🪓",
70
+ "fetching inspiration... 📡",
71
+ "pruning branches... 🌿",
72
+ "syncing neurons... 🧠",
73
+ "shallow clone, deep existential dread... 🌊😵",
96
74
  ],
97
75
 
98
76
  analyzing: [
99
- "reading every file (skimming)...",
100
- "building a mental model...",
101
- "reverse engineering intent...",
102
- "parsing the chaos...",
103
- "connecting the dots...",
104
- "finding the load-bearing files...",
105
- "mapping the dependency graph...",
106
- "absorbing the architecture...",
107
- "noticing things...",
108
- "judging your folder structure...",
109
- "appreciating the tech debt...",
110
- "counting your TODOs...",
111
- "reading between the lines...",
112
- "anthropic-ifying your codebase...",
113
- "following the import trail...",
114
- "speed-reading your life's work...",
115
- "pretending to understand your monorepo...",
77
+ "reading every file (skimming)... 📖",
78
+ "building a mental model... 🧠",
79
+ "reverse engineering intent... 🔍",
80
+ "parsing the chaos... 🌀",
81
+ "connecting the dots... 🔗",
82
+ "finding the load-bearing files... 🏗️",
83
+ "mapping the dependency graph... 🗺️",
84
+ "absorbing the architecture... 🧱",
85
+ "noticing things... 👀",
86
+ "judging your folder structure... 😭",
87
+ "appreciating the tech debt... 💳",
88
+ "counting your TODOs... 📋",
89
+ "reading between the lines... ✍️",
90
+ "anthropic-ifying your codebase... 🤖",
91
+ "following the import trail... 🧭",
92
+ "speed-reading your life's work...",
93
+ "pretending to understand your monorepo... 🏢",
94
+ // new additions
95
+ "debugging the cosmos... 🌌",
96
+ "profiling your thoughts... 📊",
97
+ "mapping mental threads... 🧵",
98
+ "sifting through the noise... 🌪️",
99
+ "predicting your next move... 🔮",
100
+ "annotating life... ✍️",
101
+ "absorbing the vibes... 🧘",
102
+ "peering into recursion... 🔁",
103
+ "modeling chaos... 🧩",
104
+ "counting edge cases... ⚠️",
105
+ "tracking call stacks... 🧗",
106
+ "parsing your aura... 🌈",
107
+ "reading the README of life... 📖",
108
+ "analyzing existential types... 🤯",
109
+ "observing folder hierarchies... 📂",
110
+ "profiling main character energy... 🎬",
111
+ "absorbing every commit... 💾",
112
+ "studying the architecture... 🏛️",
113
+ "checking for ghost functions... 👻",
114
+ "validating vibes... ✅",
116
115
  ],
117
116
 
118
117
  model: [
119
- "deciding which files matter...",
120
- "picking the important ones...",
121
- "triaging your codebase...",
122
- "figuring out where to look...",
123
- "consulting the file oracle...",
124
- "narrowing it down...",
125
- "skimming the directory...",
126
- "choosing wisely...",
127
- "not reading everything (smart)...",
128
- "filtering the noise...",
129
- "asking the oracle...",
130
- "pinging the motherbrain...",
131
- "waiting on the neurons...",
132
- "tokens incoming...",
133
- "model is cooking...",
134
- "inference in progress...",
135
- "the GPU is thinking...",
136
- "attention is all we need...",
137
- "cross-attending to your vibes...",
138
- "softmaxing the options...",
139
- "sampling from the distribution...",
140
- "temperature: just right...",
141
- "context window: not full yet...",
142
- "next token any second now...",
143
- "beaming thoughts from the datacenter...",
144
- "anthropic servers sweating...",
145
- "matrix multiply in progress...",
118
+ "deciding which files matter... 🧠",
119
+ "picking the important ones... 🎯",
120
+ "triaging your codebase... 🚑",
121
+ "figuring out where to look... 👀",
122
+ "consulting the file oracle... 🔮",
123
+ "narrowing it down... 🔍",
124
+ "skimming the directory... 📂",
125
+ "choosing wisely... 🧠",
126
+ "not reading everything (smart)... 😎",
127
+ "filtering the noise... 🔇",
128
+ "asking the oracle... 🔮",
129
+ "pinging the motherbrain... 🧠",
130
+ "waiting on the neurons...",
131
+ "tokens incoming... 📥",
132
+ "model is cooking... 🍳",
133
+ "inference in progress... ⚙️",
134
+ "the GPU is thinking... 💻",
135
+ "attention is all we need... 🎯",
136
+ "cross-attending to your vibes... 🔄",
137
+ "softmaxing the options... 📊",
138
+ "sampling from the distribution... 🎲",
139
+ "temperature: just right... 🌡️",
140
+ "context window: not full yet... 🪟",
141
+ "next token any second now...",
142
+ "beaming thoughts from the datacenter... 📡",
143
+ "anthropic servers sweating... 💦",
144
+ "matrix multiply in progress...",
145
+ // new additions
146
+ "initializing hype mode... 🚀",
147
+ "compiling neurons... 🧠",
148
+ "loading chaotic energy... ⚡",
149
+ "predicting your mood... 😏",
150
+ "sampling absurdity... 🎲",
151
+ "normalizing brainwaves... 🌊",
152
+ "cross-validating genius... 🧪",
153
+ "activating main character module... 🎬",
154
+ "warming up GPU... 💻🔥",
155
+ "spooling synapses... 🧵",
156
+ "calculating cringe factor... 🤡",
157
+ "preprocessing drama... 📦",
158
+ "injecting chaos vectors... ⚡",
159
+ "softmaxing life choices... 🧠",
160
+ "attention heads online... 👀",
161
+ "broadcasting vibes... 📡",
162
+ "loading meme embeddings... 🗿",
163
+ "quantizing mood... 🔢",
164
+ "clipping gradients of patience... ✂️",
165
+ "inferring main plot points... 📖",
146
166
  ],
167
+
147
168
  summary: [
148
- "synthesizing the chaos...",
149
- "forming an opinion...",
150
- "writing the verdict...",
151
- "digesting everything...",
152
- "putting it all together...",
153
- "crafting the overview...",
154
- "making sense of it all...",
155
- "distilling the essence...",
156
- "summarizing your life's work...",
157
- "turning files into feelings...",
158
- "extracting signal from noise...",
159
- "generating hot takes...",
160
- "cooking up the analysis...",
161
- "almost done judging your code...",
162
- "writing the report card...",
169
+ "synthesizing the chaos... 🧠",
170
+ "forming an opinion... 💭",
171
+ "writing the verdict... 📝",
172
+ "digesting everything... 🍽️",
173
+ "putting it all together... 🧩",
174
+ "crafting the overview...",
175
+ "making sense of it all... 🤔",
176
+ "distilling the essence... 🧪",
177
+ "summarizing your life's work... 📚",
178
+ "turning files into feelings... 💔",
179
+ "extracting signal from noise... 📡",
180
+ "generating hot takes... 🔥",
181
+ "cooking up the analysis... 🍳",
182
+ "almost done judging your code... 👀",
183
+ "writing the report card... 📊",
184
+ // new additions
185
+ "digesting chaos into art... 🎨",
186
+ "compressing existential dread... 🫠",
187
+ "executing life summary... 📝",
188
+ "extracting hot takes... 🔥",
189
+ "packaging thoughts nicely... 📦",
190
+ "synthesizing main character energy... 🌟",
191
+ "boiling down code spaghetti... 🍝",
192
+ "condensing into brilliance... ✨",
193
+ "drawing the final diagram... 📊",
194
+ "reporting on universal logic... 🌌",
195
+ "giving verdict with style... 😎",
196
+ "folding in chaos gracefully... 🌀",
197
+ "capturing essence... 📸",
198
+ "writing the epic conclusion... 📜",
199
+ "connecting all dots... 🔗",
200
+ "rendering summary in HD... 📺",
201
+ "wrapping thoughts in elegance... 🎁",
202
+ "making insights bussin... 🥵",
203
+ "compressing noise... 🔇",
204
+ "finishing the mental buffet... 🍽️",
163
205
  ],
164
206
 
165
207
  task: [
166
- "thinking about your ask...",
167
- "processing the request...",
168
- "on it...",
169
- "got it, working...",
170
- "considering the angles...",
171
- "thinking this through...",
172
- "working on it...",
173
- "cooking up a plan...",
174
- "breaking it down...",
175
- "figuring out the approach...",
176
- "strategizing...",
177
- "mapping out the steps...",
178
- "scoping the work...",
179
- "locking in...",
180
- "challenge accepted...",
208
+ "thinking about your ask... 🤔",
209
+ "processing the request... ⚙️",
210
+ "on it... 🫡",
211
+ "got it, working... 💻",
212
+ "considering the angles... 🔺",
213
+ "thinking this through... 🧠",
214
+ "working on it... 🔧",
215
+ "cooking up a plan... 🍳",
216
+ "breaking it down... 🧩",
217
+ "figuring out the approach... 🧭",
218
+ "strategizing... 📊",
219
+ "mapping out the steps... 🗺️",
220
+ "scoping the work... 📏",
221
+ "locking in... 🔒",
222
+ "challenge accepted... ⚔️",
223
+ // new additions
224
+ "igniting the thinking engines... 🔥",
225
+ "prioritizing chaos... 📝",
226
+ "breaking down mental blocks... 🧱",
227
+ "assembling the mental toolkit... 🛠️",
228
+ "deploying logic... 🚀",
229
+ "strategizing with style... 💅",
230
+ "mapping the mental maze... 🗺️",
231
+ "executing plan... ⚙️",
232
+ "optimizing approach... 🧠",
233
+ "thinking outside the semicolon... ;",
234
+ "iterating on brilliance... 🔄",
235
+ "analyzing all angles... 🔺",
236
+ "tracking progress... 📊",
237
+ "debugging plan... 🐞",
238
+ "brainstorming in HD... 💭",
239
+ "navigating chaos... 🧭",
240
+ "forming master plan... 🏗️",
241
+ "locking in focus... 🔒",
242
+ "assembling neural units... 🧩",
243
+ "finalizing strategy... ✅",
244
+ ],
245
+
246
+ commit: [
247
+ "sniffing the diff... 👃",
248
+ "reading your crimes... 😭",
249
+ "git add -A (the audacity)... 😤",
250
+ "crafting the perfect lie^H^H^H message... 📝",
251
+ "summoning commit message energy... ✨",
252
+ "writing words that will haunt the git log... 👻",
253
+ "pretending this was intentional all along... 😎",
254
+ "making it sound like a feature... 🚀",
255
+ "staging your changes (and your career)... 📦",
256
+ "turning chaos into conventional commits... 🧠",
257
+ "making history. literally... 📜",
258
+ "git blame: not it... 🫣",
259
+ "this commit brought to you by AI... 🤖",
260
+ "imperative mood activated... ⚡",
261
+ "72 chars or bust... 📏",
262
+ "no WIP commits on my watch... 🚫",
263
+ "writing the commit future-you will thank me for... 🙏",
264
+ "touching the object store... 🗄️",
265
+ "packing your changes real tight... 📦",
266
+ "signing off mentally... 🧠",
267
+ "squash? no. this one deserves to live... 🧬",
268
+ "git log will remember this... 📖",
269
+ "diffing the vibe before committing... 🔍",
270
+ "committing to the bit. and also the repo... 💾",
271
+ "generating a message with zero typos (probably)... 😅",
272
+ "making main proud... 🏆",
273
+ // new additions
274
+ "annotating history with chaos... 📝",
275
+ "staging brilliance... 🌟",
276
+ "blaming the compiler... 🤖",
277
+ "git commit -m 'oops'... 😅",
278
+ "crafting legendary messages... 🏆",
279
+ "squashing typos... ✂️",
280
+ "documenting chaos... 📜",
281
+ "ghostwriting commit energy... 👻",
282
+ "pushing existential code... 🚀",
283
+ "reviewing self-inflicted bugs... 😭",
284
+ "summoning git spirits... 👻",
285
+ "committing main character vibes... 🎬",
286
+ "annotating universal truths... 🌌",
287
+ "logging brain activity... 🧠",
288
+ "staging memes... 🗿",
289
+ "locking in brilliance... 🔒",
290
+ "quantifying audacity... 😤",
291
+ "making history, one commit at a time... 📖",
292
+ "git blame: me again... 😎",
293
+ "finalizing legendary diff... ✨",
181
294
  ],
182
295
  };
183
296