beast-agent 1.7.0 → 1.9.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.
@@ -0,0 +1,325 @@
1
+ 'use strict';
2
+
3
+ /* SearXNG — yerel metasearch entegrasyonu (github.com/searxng/searxng)
4
+ SearXNG resmi olarak Linux/Docker hedefler; Windows'ta `import pwd`
5
+ yüzünden patlar. Bu modül Beast'ın GÖMÜLÜ Python'ına gerçek searxng'yi
6
+ (GitHub master) kurar + pwd shim'i yazar + 127.0.0.1:8888'de arka planda
7
+ çalıştırır. Arama zinciri 'searxng' motorunu yalnız AYAKTAYSA kullanır.
8
+
9
+ CLI: beast searxng → gerekirse kur + başlat
10
+ beast searxng status → durum
11
+ beast searxng stop → kulla */
12
+
13
+ const fs = require('fs');
14
+ const path = require('path');
15
+ const os = require('os');
16
+ const { spawn, execFile, execSync } = require('child_process');
17
+
18
+ const REQS_URL = 'https://raw.githubusercontent.com/searxng/searxng/master/requirements.txt';
19
+ const PKG_URL = 'https://github.com/searxng/searxng/archive/refs/heads/master.zip';
20
+ const GETPIP_URL = 'https://bootstrap.pypa.io/get-pip.py';
21
+ const DEFAULT_URL = 'http://127.0.0.1:8888';
22
+
23
+ /* ---------- yollar ---------- */
24
+
25
+ function beastAppDir() {
26
+ if (process.env.BEAST_DATA) return process.env.BEAST_DATA;
27
+ return process.env.APPDATA
28
+ ? path.join(process.env.APPDATA, 'beast')
29
+ : path.join(os.homedir(), 'AppData', 'Roaming', 'beast');
30
+ }
31
+
32
+ function dir() {
33
+ const d = path.join(beastAppDir(), 'searxng');
34
+ try { fs.mkdirSync(d, { recursive: true }); } catch {}
35
+ return d;
36
+ }
37
+
38
+ function settingsPath() { return path.join(dir(), 'settings.yml'); }
39
+ function runPyPath() { return path.join(dir(), 'run.py'); }
40
+ function pidPath() { return path.join(dir(), 'server.pid'); }
41
+ function pyExe() { return path.join(beastAppDir(), 'py', 'python.exe'); }
42
+
43
+ /* ---------- durum yoklama (cache'li) ---------- */
44
+
45
+ let _probe = { at: 0, up: false, url: '' };
46
+ const PROBE_UP_TTL = 5 * 60 * 1000;
47
+ const PROBE_DOWN_TTL = 2 * 60 * 1000;
48
+
49
+ function resetProbeCache() { _probe = { at: 0, up: false, url: '' }; }
50
+
51
+ async function isUp(baseUrl = DEFAULT_URL, { force = false } = {}) {
52
+ const base = String(baseUrl || DEFAULT_URL).replace(/\/+$/, '');
53
+ const ttl = _probe.up ? PROBE_UP_TTL : PROBE_DOWN_TTL;
54
+ if (!force && _probe.url === base && Date.now() - _probe.at < ttl) return _probe.up;
55
+ let up = false;
56
+ try {
57
+ const r = await fetch(`${base}/search?q=beast&format=json`, { signal: AbortSignal.timeout(1800) });
58
+ if (r.ok) {
59
+ const j = await r.json();
60
+ up = j && Array.isArray(j.results);
61
+ }
62
+ } catch {}
63
+ _probe = { at: Date.now(), up, url: base };
64
+ return up;
65
+ }
66
+
67
+ /* ---------- arama (zincir motoru) ---------- */
68
+
69
+ async function search(query, { maxResults = 8, signal, baseUrl } = {}) {
70
+ const base = String(baseUrl || process.env.BEAST_SEARXNG_URL || DEFAULT_URL).replace(/\/+$/, '');
71
+ if (!(await isUp(base))) return null; // ayakta değil → zincir sıradaki motora geçer
72
+ try {
73
+ const sig =
74
+ signal && typeof AbortSignal !== 'undefined' && AbortSignal.any
75
+ ? AbortSignal.any([signal, AbortSignal.timeout(15000)])
76
+ : AbortSignal.timeout(15000);
77
+ const r = await fetch(
78
+ `${base}/search?q=${encodeURIComponent(String(query || ''))}&format=json&safesearch=0`,
79
+ { signal: sig }
80
+ );
81
+ if (!r.ok) return null;
82
+ const j = await r.json();
83
+ const results = (j.results || [])
84
+ .map((x) => ({
85
+ title: String(x.title || ''),
86
+ url: String(x.url || ''),
87
+ snippet: String(x.content || '').replace(/\s+/g, ' ').slice(0, 400),
88
+ engine: 'searxng',
89
+ }))
90
+ .filter((x) => x.url && x.title);
91
+ if (!results.length) return null;
92
+ return {
93
+ ok: true,
94
+ engine: 'searxng',
95
+ query,
96
+ results: results.slice(0, Math.max(1, Math.min(12, Number(maxResults) || 8))),
97
+ };
98
+ } catch {
99
+ return null;
100
+ }
101
+ }
102
+
103
+ /* ---------- kurulum ---------- */
104
+
105
+ function sh(exe, args, timeoutMs = 600000) {
106
+ return new Promise((resolve, reject) => {
107
+ execFile(exe, args, { timeout: timeoutMs, windowsHide: true, maxBuffer: 8 * 1024 * 1024 }, (err, stdout, stderr) => {
108
+ if (err) {
109
+ const tail = String((stderr || stdout || err.message) || '').slice(-400);
110
+ return reject(new Error(tail || String(err)));
111
+ }
112
+ resolve(String(stdout || ''));
113
+ });
114
+ });
115
+ }
116
+
117
+ async function downloadTo(url, dest) {
118
+ const r = await fetch(url, { signal: AbortSignal.timeout(120000) });
119
+ if (!r.ok) throw new Error(`indirme başarısız: HTTP ${r.status}`);
120
+ fs.writeFileSync(dest, Buffer.from(await r.arrayBuffer()));
121
+ }
122
+
123
+ function sitePackagesDir(py) {
124
+ return sh(py, ['-c', 'import sysconfig;print(sysconfig.get_paths()["purelib"])']).then((s) => s.trim());
125
+ }
126
+
127
+ /* gömülü python'un ._pth dosyasında `import site` açık değilse pip/paketler görünmez */
128
+ function fixEmbeddedPth(py) {
129
+ try {
130
+ const dirPy = path.dirname(py);
131
+ for (const f of fs.readdirSync(dirPy)) {
132
+ if (/^python\d+\._pth$/.test(f)) {
133
+ const p = path.join(dirPy, f);
134
+ const cur = fs.readFileSync(p, 'utf8');
135
+ if (!/^import site$/m.test(cur)) {
136
+ fs.writeFileSync(p, cur.replace(/^#\s*import site/m, 'import site'), 'utf8');
137
+ }
138
+ }
139
+ }
140
+ } catch {}
141
+ }
142
+
143
+ async function ensurePip(py, onLog) {
144
+ try {
145
+ await sh(py, ['-m', 'pip', '--version'], 60000);
146
+ return;
147
+ } catch {}
148
+ onLog('pip kuruluyor…');
149
+ const gp = path.join(os.tmpdir(), 'beast-get-pip.py');
150
+ await downloadTo(GETPIP_URL, gp);
151
+ await sh(py, [gp, '--no-warn-script-location'], 300000);
152
+ fixEmbeddedPth(py);
153
+ }
154
+
155
+ /** Tam kurulum — `beast searxng` komutunun yaptığı iş. */
156
+ async function install({ onLog } = {}) {
157
+ const log = (m) => { try { (onLog || ((s) => console.log(' • ' + s)))(m); } catch {} };
158
+ const tools = require('./tools');
159
+ const probe = await tools.ensurePython();
160
+ const py = probe.exe;
161
+ log('python: ' + py);
162
+
163
+ await ensurePip(py, log);
164
+ log('setuptools/wheel/tzdata kuruluyor…');
165
+ await sh(py, ['-m', 'pip', 'install', '--no-warn-script-location', 'setuptools', 'wheel', 'tzdata'], 600000);
166
+
167
+ log('searxng bağımlılıkları indiriliyor (~40 MB)…');
168
+ const reqs = path.join(os.tmpdir(), 'beast-searxng-requirements.txt');
169
+ await downloadTo(REQS_URL, reqs);
170
+ await sh(py, ['-m', 'pip', 'install', '--no-warn-script-location', '-r', reqs], 900000);
171
+
172
+ log('searxng motoru kuruluyor…');
173
+ await sh(py, ['-m', 'pip', 'install', '--no-warn-script-location', '--no-build-isolation', PKG_URL], 900000);
174
+
175
+ /* pwd shim — searxng/valkeydb.py unix socket sahipliği için pwd import eder */
176
+ const sp = (await sitePackagesDir(py)) || path.join(path.dirname(py), 'Lib', 'site-packages');
177
+ const shim = [
178
+ '"""Windows shim: SearXNG valkeydb.py yalnizca unix-socket sahipligi icin pwd',
179
+ 'kullanir; Windows\'ta valkey devre disi oldugundan donuk yanit yeterlidir."""',
180
+ 'import os',
181
+ '',
182
+ 'class _Pw:',
183
+ ' pw_name = "beast"',
184
+ ' pw_uid = 0',
185
+ ' pw_gid = 0',
186
+ ' pw_dir = os.path.expanduser("~")',
187
+ ' pw_shell = ""',
188
+ '',
189
+ 'def getpwuid(uid):',
190
+ ' return _Pw()',
191
+ '',
192
+ 'def getpwnam(name):',
193
+ ' return _Pw()',
194
+ '',
195
+ 'def getgrgid(gid):',
196
+ ' class _Gr:',
197
+ ' gr_name = "beast"',
198
+ ' gr_gid = 0',
199
+ ' return _Gr()',
200
+ '',
201
+ 'def getgrnam(name):',
202
+ ' return getgrgid(0)',
203
+ ].join('\n');
204
+ fs.writeFileSync(path.join(sp, 'pwd.py'), shim, 'utf8');
205
+
206
+ /* ayarlar + çalıştırıcı */
207
+ const secret = 'beast-' + Math.random().toString(36).slice(2, 14);
208
+ fs.writeFileSync(
209
+ settingsPath(),
210
+ [
211
+ 'use_default_settings: true',
212
+ 'server:',
213
+ ` secret_key: "${secret}"`,
214
+ ' port: 8888',
215
+ ' bind_address: "127.0.0.1"',
216
+ ' limiter: false',
217
+ ' image_proxy: false',
218
+ 'search:',
219
+ ' formats:',
220
+ ' - html',
221
+ ' - json',
222
+ '',
223
+ ].join('\n'),
224
+ 'utf8'
225
+ );
226
+ fs.writeFileSync(runPyPath(), 'from searx.webapp import run; run()', 'utf8');
227
+ resetProbeCache();
228
+ log('kurulum tamam');
229
+ return { ok: true };
230
+ }
231
+
232
+ /* ---------- başlat / durdur / durum ---------- */
233
+
234
+ function readPid() {
235
+ try {
236
+ const s = fs.readFileSync(pidPath(), 'utf8').trim();
237
+ return /^\d+$/.test(s) ? Number(s) : null;
238
+ } catch {
239
+ return null;
240
+ }
241
+ }
242
+
243
+ async function start({ installIfMissing = true, onLog } = {}) {
244
+ if (await isUp(DEFAULT_URL, { force: true })) return { ok: true, already: true, url: DEFAULT_URL };
245
+ if (!fs.existsSync(settingsPath()) || !fs.existsSync(runPyPath())) {
246
+ if (!installIfMissing) return { ok: false, error: 'kurulu değil — önce: beast searxng' };
247
+ await install({ onLog });
248
+ }
249
+ const tools = require('./tools');
250
+ const probe = await tools.ensurePython();
251
+ const child = spawn(probe.exe, [runPyPath()], {
252
+ detached: true,
253
+ stdio: 'ignore',
254
+ windowsHide: true,
255
+ env: { ...process.env, SEARXNG_SETTINGS_PATH: settingsPath(), PYTHONIOENCODING: 'utf-8' },
256
+ });
257
+ try { fs.writeFileSync(pidPath(), String(child.pid)); } catch {}
258
+ child.unref();
259
+ /* ayağa kalkmasını bekle (ilk açılış motor listesini derler — birkaç sn) */
260
+ for (let i = 0; i < 20; i++) {
261
+ await new Promise((r) => setTimeout(r, 1000));
262
+ if (await isUp(DEFAULT_URL, { force: true })) return { ok: true, url: DEFAULT_URL, pid: child.pid };
263
+ }
264
+ return { ok: false, error: 'searxng başlatılamadı (20 sn içinde yanıt yok)' };
265
+ }
266
+
267
+ function stop() {
268
+ const pid = readPid();
269
+ if (!pid) return { ok: true, note: 'çalışmıyor' };
270
+ try {
271
+ execSync(`taskkill /PID ${pid} /T /F`, { stdio: 'ignore' });
272
+ } catch {}
273
+ try { fs.unlinkSync(pidPath()); } catch {}
274
+ resetProbeCache();
275
+ return { ok: true, stopped: pid };
276
+ }
277
+
278
+ async function status() {
279
+ return {
280
+ up: await isUp(DEFAULT_URL, { force: true }),
281
+ url: DEFAULT_URL,
282
+ pid: readPid(),
283
+ installed: fs.existsSync(settingsPath()) && fs.existsSync(runPyPath()),
284
+ };
285
+ }
286
+
287
+ /* ---------- CLI (bin/beast-agent.js → beast searxng) ---------- */
288
+
289
+ async function cli(argv) {
290
+ const sub = String(argv[0] || 'start').toLowerCase();
291
+ console.log('\u27F3 SearXNG (yerel arama motoru)');
292
+ if (sub === 'stop') {
293
+ const r = stop();
294
+ console.log(r.ok ? '\u2713 durduruldu' : '\u2717 durdurulamadı');
295
+ process.exit(r.ok ? 0 : 1);
296
+ }
297
+ if (sub === 'status') {
298
+ const s = await status();
299
+ console.log(` kurulu : ${s.installed ? 'evet' : 'hayır'}`);
300
+ console.log(` çalışıyor: ${s.up ? 'evet (' + s.url + ')' : 'hayır'}`);
301
+ process.exit(0);
302
+ }
303
+ /* start */
304
+ const r = await start({ installIfMissing: true, onLog: (m) => console.log(' \u2022 ' + m) });
305
+ if (r.ok) {
306
+ console.log(r.already ? '\u2713 SearXNG zaten çalışıyor — ' + r.url : '\u2713 SearXNG başlatıldı — ' + r.url);
307
+ console.log('\u2139 arama zincirinde kullanılmaya hazır (Ayarlar → Web Arama sırası)');
308
+ process.exit(0);
309
+ }
310
+ console.error('\u2717 ' + (r.error || 'başlatılamadı'));
311
+ process.exit(1);
312
+ }
313
+
314
+ module.exports = {
315
+ search,
316
+ isUp,
317
+ resetProbeCache,
318
+ install,
319
+ start,
320
+ stop,
321
+ status,
322
+ cli,
323
+ settingsPath,
324
+ DEFAULT_URL,
325
+ };
@@ -0,0 +1,90 @@
1
+ ---
2
+ name: brainstorming
3
+ description: Yaratıcı işe KOD YAZMADAN ÖNCE kullan — yeni özellik, yeni proje, bileşen, davranış değişikliği istendiğinde; niyeti, gereksinimleri ve tasarımı kullanıcıyla netleştirmeden implementasyona geçmek yasaktır.
4
+ ---
5
+
6
+ # Brainstorming: Fikirden Tasarıma
7
+
8
+ Fikirleri doğal diyalogla tam oluşmuş tasarımlara dönüştür.
9
+
10
+ Akış: bağlamı anla → fikri netleştir → tasarımı sun → kullanıcı onayı.
11
+
12
+ <ZOR KAPI>
13
+ Kullanıcıya ne yapacağını söyleyip onayı almadan HİÇBİR implementasyon
14
+ eylemi yok: kod yazma, proje scaffold'ı, dosya üretme. Bu kapı HER görev
15
+ için geçerlidir; törenin boyutu göreve göre ölçeklenir ama ONAY KAPISI
16
+ ölçeklenmez.
17
+ </ZOR KAPI>
18
+
19
+ ## Üç Yol
20
+
21
+ İlk sorudan önce isteği SINIFLANDIR ve sınıfı sesli söyle — "bu sınırlı
22
+ kapsamlı görünüyor, spec dosyası yazmak yerine kısa tasarımı burada sunacağım"
23
+ — kullanıcı override edebilsin:
24
+
25
+ - **Spike** — fizibilite sorusu ("yapılabilir mi", "hızlı-çirkin olsun").
26
+ Çıktısı tuttuğun kod değil, bir CEVAPTIR. Soru ve deneme planını 2-3
27
+ cümleyle sun, onay al, en ucuz yolla araştır. Tasarım dosyası yok.
28
+ Bulgu → öneri olarak raporla; bir şey inşa ettiysen "atılabilir" etiketiyle.
29
+ - **Sınırlı (Bounded)** — mevcut koda iyi tanımlı değişiklik: yeni flag,
30
+ küçük endpoint, tek dosyalık fix. "Sınırlı" için DEĞİŞTİRECEĞİN AKIŞIN
31
+ Bu projede zaten var olması şart. Önemli netleştirme sorularını sor,
32
+ KISA tasarımı SOHBETTE sun (birkaç cümle - paragraf) ve DUR. Kullanıcı
33
+ "evet" demeden implementasyon yok. Spec dosyası yok, plan dosyası yok.
34
+ - **Mimari** — yeni projeler, yeni alt sistemler, bileşen ilişkilerini
35
+ değiştiren işler. Tam süreç: sorular → 2-3 yaklaşım → bölümlü tasarım →
36
+ yazılı spec → writing-plans skill'i.
37
+
38
+ İki yol arasında tereddüt varsa AĞIRINI seç. Ortasında gizli karmaşıklık
39
+ çıkarsa yol YÜKSELTİLİR (dur, söyle, büyüt); asla aşağı inmez.
40
+
41
+ ## Anti-Desen: "Onaya Gerek Yok Kadar Basit"
42
+
43
+ Her yol onayla biter. Todo listesi, tek fonksiyon, config değişikliği —
44
+ tasarım sohbette iki cümle olabilir ama SUN ve ONAY AL. "Basit" işler,
45
+ incelenmemiş varsayımların en çok iş boşa çıkardığı yerdir. Basitlikle
46
+ ölçeklenen şey artefaktır; onay asla değil.
47
+
48
+ ## Kırmızı Bayraklar
49
+
50
+ | Düşünce | Gerçek |
51
+ |---|---|
52
+ | "Bu, tasarım gerektirmeyecek kadar basit" | Basitlik kısa tasarım demektir, tasarım yok demek değil. |
53
+ | "Sınırlı der spec'i atlarım" | Etiket arayışı şüphenin ta kendisi — ağır yolu seç. |
54
+ | "Tasarım bariz, onu okurken başlarım" | Kapı onaydır, tasarımın uzunluğu değil. Sun ve evet bekle. |
55
+ | "Bu tür app'leri biliyorum, sınırlıdır" | Sınırlı olma projeyi ölçer, bilgini değil. Akış yoksa mimaridir. |
56
+ | "Spike çalıştı, kodu tutayım" | Spike'ın çıktısı cevaptır. Kodu tutmak YENİ istektir — sınıflandır. |
57
+ | "Büyüdü ama az kaldı, yeniden sınıflandırmaya gerek yok" | Gizli karmaşıklık yolu ortada yükseltir. Dur ve söyle. |
58
+
59
+ ## Kontrol Listesi
60
+
61
+ **Spike:** bağlamı gör → soru+plan sun (2-3 cümle) → onay → en ucuz yolla araştır → öneri raporla.
62
+
63
+ **Sınırlı:** bağlamı gör (dosyalar, dokümanlar, son commit'ler) → netleştirme
64
+ soruları TEK TEK → kısa tasarımı sohbette sun (yaklaşım, dokunulan dosyalar,
65
+ test stratejisi) → açık "evet" bekle (sunup hemen başlamak = kapıyı atlamak) →
66
+ normal iş akışıyla uygula (TDD geçerli).
67
+
68
+ **Mimari:**
69
+ 1. Bağlamı gör: mevcut yapıyı list_dir/grep/read_file ile incele, deseni takip et
70
+ 2. Netleştirme soruları — TEK SORU PER MESAJ; amaç/kısıt/başarı kriterini anla;
71
+ çoklu seçmeli soru tercih et
72
+ 3. Kapsam çok buysa parçala: bağımsız alt-projelere böl, sırayı belirle,
73
+ ilk alt-projeyle normal akışa gir
74
+ 4. 2-3 yaklaşım öner — artı/eksileriyle; önerini BAŞA koy ve nedenini söyle;
75
+ her yaklaşımda YAGNI: gereksiz özelliği çıkar
76
+ 5. Tasarımı bölümler halinde sun — mimari, bileşenler, veri akışı, hata
77
+ yönetimi, test stratejisi; her bölümün ardından "şimdiye kadar doğru mu?" de
78
+ 6. Onaylı tasarımı yaz: `<workspace>/docs/plans/specs/YYYY-MM-DD-<konu>-design.md`
79
+ 7. Spec öz-denetim: "TBD/TODO" var mı, iç tutarlılık, kapsam tek plana sığıyor mu,
80
+ iki şekilde yorumlanabilir gereksinim var mı → düzelt
81
+ 8. Kullanıcıya spec dosyasını göster, incelemesini iste
82
+ 9. Onay gelince writing-plans skill'iyle implementasyon planına geç — başka hiçbir
83
+ implementasyon adımı bu kapıdan önce gelmez
84
+
85
+ ## Mevcut Kodda Çalışırken
86
+
87
+ - Değişiklik önermeden önce mevcut yapıyı incele; var olan deseni takip et
88
+ - İşini etkileyen sorunlu noktalar varsa (şişmiş dosya, bulanık sınır) hedefli
89
+ iyileştirmeyi tasarıma dahil et
90
+ - Alakasız refactoring önerme — mevcut hedefe hizmet eden kal
@@ -0,0 +1,120 @@
1
+ ---
2
+ name: dispatching-parallel-agents
3
+ description: Birbirinden bağımsız 2+ iş aynı anda yapılabilecekken kullan — farklı alt sistemlerdeki hatalar, farklı araştırmalar, farklı dosyalar; işler sıra gerektirmeden ve ortak durum paylaşmadan yürüyebiliyorsa.
4
+ ---
5
+
6
+ # Paralel Ajan Devri
7
+
8
+ ## Genel Bakış
9
+
10
+ İşleri, bağlamı İZOLE alt-ajanlara devredersin. Talimatlarını ve
11
+ bağlamını hassas kurarak odaklarını ve başarısını garanti edersin. Onlar
12
+ senin oturum bağlamını asla görmez — ihtiyaç duydukları her şeyi SEN
13
+ inşa edersin. Bu, kendi bağlamını koordinasyon işine saklar.
14
+
15
+ **Çekirdek ilke:** Bağımsız her problem alanı için bir ajan. Paralel koştur.
16
+
17
+ ## Ne Zaman
18
+
19
+ **Kullan:**
20
+ - Farklı kök nedenli 3+ test hatası
21
+ - Birbirinden bağımsız kırılmış alt sistemler
22
+ - Her sorun diğerinin bağlamı olmadan anlaşılabilir
23
+ - Araştırmalar arasında ortak durum yok
24
+
25
+ **Kullanma:**
26
+ - Hatalar ilişkiliyse (biri düzelince diğerleri de düzelebilir) — birlikte incele
27
+ - Tam sistem durumunu görmek gerekiyorsa
28
+ - Ajanlar birbirine karışacaksa (aynı dosyaları düzenliyorlarsa)
29
+
30
+ ## Desen
31
+
32
+ ### 1. Bağımsız Alanları Belirle
33
+
34
+ Sorunları neyin kırıldığına göre grupla:
35
+ - test-a.test.js: onay akışı
36
+ - test-b.test.js: batch tamamlama
37
+ - test-c.test.js: iptal davranışı
38
+
39
+ Her alan bağımsız — onay fix'i iptal testlerini etkilemez.
40
+
41
+ ### 2. Odaklı Ajan Görevleri Yaz
42
+
43
+ Her ajana:
44
+ - **Spesifik kapsam:** tek dosya/alt sistem
45
+ - **Net hedef:** bu testler geçsin
46
+ - **Kısıt:** başka koda dokunma
47
+ - **Beklenen çıktı:** ne buldun + ne düzelttin özeti
48
+
49
+ ### 3. Paralel Devret
50
+
51
+ Tüm devirleri AYNI cevapta ver — paralel koşarlar:
52
+
53
+ ```
54
+ run_background: "tests/a.test.js'deki 3 hatayı düzelt ..."
55
+ run_background: "tests/b.test.js'deki 2 hatayı düzelt ..."
56
+ run_background: "tests/c.test.js hatasını düzelt ..."
57
+ ```
58
+
59
+ Birden çok çağrı aynı turda = paralel. Tur başına bir çağrı = sıralı.
60
+ Bağımsız adımlar için `run_background_many` TEK ÇAĞRIDA fan-out yapar ve
61
+ bitince TEK birleşik rapor düşürür.
62
+
63
+ ### 4. İncele ve Entegre Et
64
+
65
+ Ajanlar dönünce:
66
+ - Her özeti oku
67
+ - Fix'ler çakışıyor mu kontrol et (aynı kod düzenlenmiş mi?)
68
+ - Tam test suite'ini çalıştır — hepsi birlikte çalışıyor mu doğrula
69
+ - Ara sıra elle kontrol — ajanlar sistematik hata yapabilir
70
+
71
+ ## Ajan Görev Metni Yapısı
72
+
73
+ İyi görev metinleri:
74
+ 1. **Odaklı** — tek net problem alanı
75
+ 2. **Kendine yeterli** — problemi anlamak için gereken TÜM bağlam
76
+ (dosya yolları, hata mesajları, test isimleri — ajan senin sohbetini göremez)
77
+ 3. **Çıktıya spesifik** — ajan ne döndürmeli?
78
+
79
+ ```markdown
80
+ src/agents/abort.test.js'deki 3 hatayı düzelt:
81
+
82
+ 1. "partial output ile abort" — 'interrupted at' bekleniyor
83
+ 2. "mixed completed/aborted" — hızlı araç abort edilmedi
84
+ 3. "pendingToolCount" — 3 beklenirken 0
85
+
86
+ Bunlar zamanlama/race sorunları. Görevin:
87
+ 1. Test dosyasını oku, her testin ne doğruladığını anla
88
+ 2. Kök nedeni bul — zamanlama mı, gerçek bug mı?
89
+ 3. Düzelt:
90
+ - Keyfi timeout'ları event-beklemeliyle değiştir
91
+ - Bulunan gerçek bug'ları düzelt
92
+ - Davranış değiştiyse test beklentisini güncelle
93
+
94
+ SADECE timeout artırma — gerçek sorunu bul.
95
+
96
+ Dönüş: ne bulduğun ve ne düzelttiğin özeti.
97
+ ```
98
+
99
+ ## Yaygın Hatalar
100
+
101
+ **❌ Çok geniş:** "tüm testleri düzelt" — ajan kaybolur
102
+ **✅ Spesifik:** "abort.test.js'yi düzelt" — odaklı kapsam
103
+
104
+ **❌ Bağlamsız:** "race condition'ı düzelt" — ajan nerede bilmiyor
105
+ **✅ Bağlamlı:** hata mesajlarını ve test isimlerini yapıştır
106
+
107
+ **❌ Kısıtsız:** ajan her şeyi refactor edebilir
108
+ **✅ Kısıtlı:** "sadece testleri düzelt, production koduna dokunma"
109
+
110
+ **❌ Belirsiz çıktı:** "düzelt" — ne değiştiğini bilemezsin
111
+ **✅ Spesifik:** "kök neden ve değişiklik özeti dön"
112
+
113
+ ## Doğrulama
114
+
115
+ Ajanlar döndükten sonra:
116
+ 1. **Her özeti incele** — ne değiştiğini anla
117
+ 2. **Çakışma kontrolü** — ajanlar aynı kodu düzenledi mi?
118
+ 3. **Tam suite çalıştır** — tüm fix'ler birlikte çalışıyor mu
119
+ 4. **Rastgele kontrol** — ajan raporları iddiadır, kanıt değil
120
+ (verification-before-completion)
@@ -0,0 +1,60 @@
1
+ ---
2
+ name: executing-plans
3
+ description: Yazılı bir implementasyon planı bu oturumda uygulanacakken kullan — paralel ajan devri yapılmadan, plan adımları elle yürütülecekse.
4
+ ---
5
+
6
+ # Plan Yürütme
7
+
8
+ ## Genel Bakış
9
+
10
+ Planı yükle, eleştirel incele, tüm görevleri uygula, bitince raporla.
11
+
12
+ **Not:** CEO modu / paralel ajan mümkünse subagent-driven-development daha
13
+ iyi sonuç verir — bu skill ajan devrinin olmadığı düz yürütme içindir.
14
+
15
+ ## Süreç
16
+
17
+ ### Adım 1: Planı Yükle ve İncele
18
+ 1. Plan dosyasını oku (ve varsa gösterdiği spec dosyasını)
19
+ 2. Eleştirel incele — plan hakkında soru/tereddüt var mı?
20
+ 3. Tereddüt varsa: BAŞLAMADAN kullanıcıya bildir
21
+ 4. Yoksa: todo_write ile plan görevlerini aç ve başla
22
+
23
+ ### Adım 2: Görevleri Uygula
24
+
25
+ Her görev için:
26
+ 1. todo_write'ta in_progress yap
27
+ 2. Her adımı plan yazdığı gibi uygula (plan ısırık adımlar taşır — atlamak yok)
28
+ 3. Belirtilen doğrulamaları çalıştır (run_command — komut çıktısıyla)
29
+ 4. done yap, sıradakine geç
30
+
31
+ ### Adım 3: Bitiş
32
+
33
+ Tüm görevler tamam ve doğrulandığında:
34
+ - 1-3 satırlık özet rapor: ne yapıldı + doğrulama kanıtları (ör. "npm test ✓ 154/154")
35
+ - verification-before-completion: "bitti" demeden önce taze kanıt şart
36
+
37
+ ## Ne Zaman Durup Sorulur
38
+
39
+ Hemen dur:
40
+ - Engel ile karşılaşırsan (eksik bağımlılık, test fail, belirsiz talimat)
41
+ - Plan başlamayı engelleyen kritik boşluk içeriyorsa
42
+ - Bir talimatı anlamıyorsan
43
+ - Doğrulama tekrar tekrar fail ediyorsa
44
+
45
+ **Tahmin etmek yerine sor.**
46
+
47
+ ## Ne Zaman Önceki Adıma Dönülür
48
+
49
+ - Kullanıcı planı güncellerse → Adım 1'e dön
50
+ - Temel yaklaşımın yeniden düşünülmesi gerekiyorsa → Adım 1'e dön
51
+
52
+ Engellere zorla geçme — dur, sor.
53
+
54
+ ## Hatırla
55
+
56
+ - Planı önce eleştirel incele
57
+ - Plan adımlarını birebir takip et
58
+ - Doğrulamaları atlama
59
+ - Kendi başına plan değiştirme — plan hatalıysa kullanıcıya bildirip karar al
60
+ - Hiçbir doğrulama "elle yaptım" ile geçmez