fleetbo-cockpit-cli 1.0.24 → 1.0.26

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 (2) hide show
  1. package/cli.js +77 -2
  2. package/package.json +1 -1
package/cli.js CHANGED
@@ -17,6 +17,7 @@ const IOS_BUILD_URL = "https://fiosbuild-jqycakhlxa-uc.a.run.app";
17
17
  const UPDATE_NETWORK_URL = 'https://updatedevelopernetwork-jqycakhlxa-uc.a.run.app';
18
18
  const ALEX_ENGINE_URL = "https://generatenativemodule-jqycakhlxa-uc.a.run.app";
19
19
  const INJECT_DEPS_URL = "https://savegeneratedfile-jqycakhlxa-uc.a.run.app";
20
+ const CACHE_URL = "https://getmodulecache-jqycakhlxa-uc.a.run.app";
20
21
  const PORT = 3000;
21
22
 
22
23
  let uplinkProcess = null;
@@ -143,6 +144,38 @@ const showEnergyTransfer = async () => {
143
144
  process.stdout.write('\n');
144
145
  };
145
146
 
147
+ const promptContainsModification = (text) => {
148
+ const keywords = ['modifier', 'update', 'change', 'corrige', 'fix', 'ajoute', 'edit', 'refactor'];
149
+ const lower = text.toLowerCase();
150
+ return keywords.some(k => lower.includes(k));
151
+ };
152
+
153
+ const extractModuleName = (text) => {
154
+ const matchExplicit = text.match(/(?:module|mod)\s+([A-Z][a-zA-Z0-9_]*)/i);
155
+ if (matchExplicit) return matchExplicit[1];
156
+
157
+
158
+ const words = text.split(' ');
159
+ for (let i = 1; i < words.length; i++) {
160
+ const w = words[i].replace(/[^a-zA-Z0-9]/g, '');
161
+ if (/^[A-Z][a-z0-9]+/.test(w) && w.length > 3) return w;
162
+ }
163
+ return null;
164
+ };
165
+
166
+ const getModuleCache = async ({ projectId, moduleName }) => {
167
+ try {
168
+ if (!moduleName) return { found: false };
169
+ const res = await axios.post(CACHE_URL, { projectId, moduleName });
170
+ if (res.data && res.data.found) {
171
+ return { found: true, module: res.data.module };
172
+ }
173
+ return { found: false };
174
+ } catch (e) {
175
+ return { found: false };
176
+ }
177
+ };
178
+
146
179
  // ============================================
147
180
  // COMMAND: alex
148
181
  // ============================================
@@ -156,18 +189,60 @@ if (command === 'alex') {
156
189
  console.log('\x1b[90mAlex prefers concise instructions. Please summarize.\x1b[0m');
157
190
  return;
158
191
  }
159
- process.stdout.write('\x1b[33m🧠 Alex is thinking...\x1b[0m');
192
+ //process.stdout.write('\x1b[33m🧠 Alex is thinking...\x1b[0m');
193
+ console.log('\x1b[33m🧠 Alex is thinking...\x1b[0m');
160
194
 
161
195
  try {
196
+ // --- DÉBUT MODIFICATION : SYSTÈME DE MÉMOIRE (CACHE) ---
197
+ let contextInjection = "";
198
+
199
+ // 1. On détecte si c'est une update
200
+ if (promptContainsModification(prompt)) {
201
+ const moduleName = extractModuleName(prompt);
202
+
203
+ if (moduleName) {
204
+ process.stdout.write(` \x1b[90m🔍 Searching cache for ${moduleName}...\x1b[0m`);
205
+ const cache = await getModuleCache({ projectId, moduleName });
206
+
207
+ if (cache.found) {
208
+ process.stdout.write(` \x1b[32mFOUND\x1b[0m\n`);
209
+ // On prépare le contexte pour Alex
210
+ contextInjection = `
211
+
212
+ --- CONTEXTE : CODE EXISTANT (${moduleName}) ---
213
+ L'utilisateur veut modifier ce module existant.
214
+ Tu DOIS te baser sur ce code et appliquer les changements demandés.
215
+
216
+ [EXISTING KOTLIN]
217
+ ${cache.module.code}
218
+
219
+ [EXISTING MOCK]
220
+ ${cache.module.mockCode}
221
+
222
+ --- FIN DU CONTEXTE ---
223
+ `;
224
+
225
+ // On injecte le contexte AVANT la demande pour qu'il soit traité comme une base de travail
226
+ prompt = contextInjection + "\n\n[INSTRUCTION PILOTE]\n" + prompt;
227
+ } else {
228
+ process.stdout.write(` \x1b[31mNOT FOUND (Creating new)\x1b[0m\n`);
229
+ }
230
+ }
231
+ }
232
+ // --- FIN MODIFICATION ---
233
+
162
234
  const result = await axios.post(ALEX_ENGINE_URL, { prompt, projectType: 'android' }, {
163
235
  headers: { 'x-project-id': projectId }
164
236
  });
237
+
165
238
  let aiData = result.data;
239
+
166
240
  if (typeof aiData === 'string') {
167
241
  try { aiData = JSON.parse(aiData); } catch (_) {}
168
242
  }
169
243
 
170
- process.stdout.write('\r' + ' '.repeat(50) + '\r');
244
+ //process.stdout.write('\r' + ' '.repeat(50) + '\r');
245
+ process.stdout.write('\x1b[A\r' + ' '.repeat(50) + '\r');
171
246
 
172
247
  if (aiData.status === 'quota_exceeded') {
173
248
  console.log(`\n\x1b[31m⛔ ARCHITECT QUOTA REACHED:\x1b[0m ${aiData.message}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fleetbo-cockpit-cli",
3
- "version": "1.0.24",
3
+ "version": "1.0.26",
4
4
  "description": "Fleetbo CLI - Build native mobile apps with React",
5
5
  "author": "Fleetbo",
6
6
  "license": "MIT",