fidelizare-integrate 0.6.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/cli.js +8 -2
- package/src/core/agent-loop.js +45 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fidelizare-integrate",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.2",
|
|
4
4
|
"description": "Asistent de integrare Fidelizare pentru softuri de gestiune si case de marcat. Scaneaza codul, gaseste locul potrivit si propune integrarea API-ului, in siguranta.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
package/src/cli.js
CHANGED
|
@@ -109,8 +109,14 @@ async function main() {
|
|
|
109
109
|
|
|
110
110
|
// No fallback. Clear error + support ticket.
|
|
111
111
|
rule();
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
if (r.reason === 'no_integration') {
|
|
113
|
+
out(' ' + paint('✗ Nu am gasit un loc sigur de integrare.', C.redBright) + '\n');
|
|
114
|
+
if (r.summary && r.summary !== 'oprit') note(r.summary.split('\n')[0].slice(0, 120), C.dim);
|
|
115
|
+
note('Nimic nu a fost scris. Cheia NU a fost salvata.', C.amber);
|
|
116
|
+
} else {
|
|
117
|
+
out(' ' + paint('✗ Integrarea nu a putut rula.', C.redBright) + ' ' + paint('(' + r.reason + ')', C.dim) + '\n');
|
|
118
|
+
if (r.reason === 'no_key') note('Lipseste cheia. Lipeste cheia ta API Fidelizare cand ti-o cere CLI-ul.', C.amber);
|
|
119
|
+
}
|
|
114
120
|
supportNote();
|
|
115
121
|
rl.close();
|
|
116
122
|
}
|
package/src/core/agent-loop.js
CHANGED
|
@@ -35,12 +35,28 @@ Pasi:
|
|
|
35
35
|
3. Creeaza un helper (create_file) care apeleaza API-ul conform documentatiei, cu
|
|
36
36
|
cheia din variabila de mediu FIDELIZARE_API_KEY (NICIODATA in cod), in try/catch
|
|
37
37
|
ce nu blocheaza vanzarea.
|
|
38
|
-
4.
|
|
38
|
+
4. OBLIGATORIU editeaza FISIERUL EXISTENT care gestioneaza vanzarea: cu insert_code
|
|
39
|
+
adaugi (a) import-ul/require helper-ului sus in fisier si (b) apelul helper-ului
|
|
40
|
+
EXACT pe ramura unde se detecteaza cardul de fidelitate. Integrarea nu e completa
|
|
41
|
+
daca ai creat doar fisiere noi; codul care ruleaza la scanare TREBUIE sa cheme
|
|
42
|
+
helper-ul. Reciteste fisierul dupa fiecare insert_code (numerele de linie se
|
|
43
|
+
schimba) inainte de urmatoarea inserare.
|
|
39
44
|
5. Scrie un test cu mock (create_file) care verifica: apelul se face cu fidelity_card
|
|
40
45
|
= codul scanat; o eroare de retea NU arunca si NU blocheaza fluxul. Ruleaza-l cu
|
|
41
46
|
run_test pana trece.
|
|
42
47
|
6. Verifica sintaxa (check_syntax) si apeleaza finish cu un rezumat scurt.
|
|
43
48
|
|
|
49
|
+
Vorbeste cu utilizatorul cand ai nevoie (tool ask_user): cand nu gasesti fisierul
|
|
50
|
+
sau ramura de integrare, cand exista mai multe locuri posibile, sau cand ai o
|
|
51
|
+
nelamurire (o decizie da/nu, ce fisier, ce optiune). Inainte de prima editare a unui
|
|
52
|
+
fisier existent, confirma scurt cu ask_user: "Integrez in <fisier> la <ramura>, e
|
|
53
|
+
corect?". NU ghici cai si NU te opri in tacere: daca nu stii, intreaba.
|
|
54
|
+
|
|
55
|
+
Nu apela finish inainte de a fi inserat apelul helper-ului in fisierul existent de
|
|
56
|
+
vanzare cu insert_code. Daca ai folosit doar create_file, NU ai terminat. Daca,
|
|
57
|
+
dupa ce ai intrebat, chiar nu exista un loc de integrare, apeleaza finish si explica
|
|
58
|
+
clar ca nu s-a putut integra (nu inventa modificari).
|
|
59
|
+
|
|
44
60
|
Reguli: modificari minime, fara refactor; pastreaza stilul si limbajul proiectului;
|
|
45
61
|
nu scrie chei in cod; nu inventa cai de fisier.`;
|
|
46
62
|
|
|
@@ -53,6 +69,7 @@ const TOOLS = [
|
|
|
53
69
|
{ type: 'function', function: { name: 'web_fetch', description: 'Descarca un document de pe web (https), ex. documentatia API.', parameters: { type: 'object', properties: { url: { type: 'string' } }, required: ['url'] } } },
|
|
54
70
|
{ type: 'function', function: { name: 'run_test', description: 'Ruleaza o comanda de test/compilare in proiect (gated, doar runnere cunoscute).', parameters: { type: 'object', properties: { command: { type: 'string' } }, required: ['command'] } } },
|
|
55
71
|
{ type: 'function', function: { name: 'check_syntax', description: 'Verifica sintaxa unui fisier (doar Node).', parameters: { type: 'object', properties: { path: { type: 'string' } }, required: ['path'] } } },
|
|
72
|
+
{ type: 'function', function: { name: 'ask_user', description: 'Intreaba utilizatorul cand nu esti sigur: ce fisier/ramura de integrare, o decizie da/nu, sau o alegere dintr-o lista de optiuni. Foloseste in loc sa ghicesti sau sa te opresti.', parameters: { type: 'object', properties: { question: { type: 'string' }, options: { type: 'array', items: { type: 'string' } } }, required: ['question'] } } },
|
|
56
73
|
{ type: 'function', function: { name: 'finish', description: 'Termina integrarea.', parameters: { type: 'object', properties: { summary: { type: 'string' } }, required: ['summary'] } } },
|
|
57
74
|
];
|
|
58
75
|
|
|
@@ -139,6 +156,23 @@ export async function runAgentLoop({ stack, rootDir, files, askRaw, auto, model,
|
|
|
139
156
|
try { execFileSync('node', ['--check', a], { stdio: 'pipe' }); return 'OK sintaxa valida'; }
|
|
140
157
|
catch (e) { return 'EROARE sintaxa: ' + (e.stderr?.toString() || e.message).slice(0, 300); }
|
|
141
158
|
},
|
|
159
|
+
ask_user: async ({ question, options }) => {
|
|
160
|
+
const q = String(question || '').trim();
|
|
161
|
+
const opts = Array.isArray(options) ? options.filter(Boolean).map(String) : [];
|
|
162
|
+
out('\n ' + paint('? ', C.amber) + paint(q, C.white) + '\n');
|
|
163
|
+
opts.forEach((o, i) => out(' ' + paint(i + 1 + ')', C.dim) + ' ' + paint(o, C.ink) + '\n'));
|
|
164
|
+
if (auto) {
|
|
165
|
+
const def = opts.length ? opts[0] : 'da';
|
|
166
|
+
out(' ' + paint('› ' + def + ' (auto)', C.green) + '\n');
|
|
167
|
+
return def;
|
|
168
|
+
}
|
|
169
|
+
const a = (await askRaw(opts.length ? ' Alege (numar sau text):' : ' Raspuns (da / nu / text):')).trim();
|
|
170
|
+
if (opts.length && /^\d+$/.test(a)) {
|
|
171
|
+
const n = parseInt(a, 10);
|
|
172
|
+
if (n >= 1 && n <= opts.length) return opts[n - 1];
|
|
173
|
+
}
|
|
174
|
+
return a || (opts.length ? opts[0] : 'nu');
|
|
175
|
+
},
|
|
142
176
|
finish: ({ summary }) => { finished = summary || 'gata'; return 'gata'; },
|
|
143
177
|
};
|
|
144
178
|
|
|
@@ -147,8 +181,9 @@ export async function runAgentLoop({ stack, rootDir, files, askRaw, auto, model,
|
|
|
147
181
|
{ role: 'user', content: `Stack: ${stack}. Documentatie API: ${guide}. Proiect cu ${files.length} fisiere sursa. Incepe cu web_fetch pe documentatie, apoi orienteaza-te in cod, integreaza si scrie + ruleaza un test cu mock.` },
|
|
148
182
|
];
|
|
149
183
|
|
|
150
|
-
const NAMES = { list_files: 'List', read_file: 'Read', grep: 'Grep', create_file: 'Write', insert_code: 'Edit', web_fetch: 'Fetch', run_test: 'Test', check_syntax: 'Check', finish: 'Done' };
|
|
184
|
+
const NAMES = { list_files: 'List', read_file: 'Read', grep: 'Grep', create_file: 'Write', insert_code: 'Edit', web_fetch: 'Fetch', run_test: 'Test', check_syntax: 'Check', ask_user: 'Ask', finish: 'Done' };
|
|
151
185
|
const brief = (name, a) => {
|
|
186
|
+
if (name === 'ask_user') return '';
|
|
152
187
|
if (name === 'grep') return a.pattern ? '"' + a.pattern + '"' : '';
|
|
153
188
|
if (name === 'web_fetch') return a.url || '';
|
|
154
189
|
if (name === 'run_test') return a.command ? '`' + a.command + '`' : '';
|
|
@@ -191,5 +226,12 @@ export async function runAgentLoop({ stack, rootDir, files, askRaw, auto, model,
|
|
|
191
226
|
}
|
|
192
227
|
}
|
|
193
228
|
|
|
194
|
-
|
|
229
|
+
// Honest outcome: a finish (or a stall) with zero applied edits is NOT a
|
|
230
|
+
// success. Report it as no_integration so the CLI shows an error + support
|
|
231
|
+
// link instead of a green "done" + writing the key to .env.
|
|
232
|
+
const applied = [...new Set(changes)];
|
|
233
|
+
if (applied.length === 0) {
|
|
234
|
+
return { ok: false, reason: 'no_integration', summary: finished || 'oprit', model: usedModel };
|
|
235
|
+
}
|
|
236
|
+
return { ok: true, changes: applied, summary: finished || 'gata', model: usedModel };
|
|
195
237
|
}
|