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.
- package/README.md +2 -0
- package/bin/beast-agent.js +12 -0
- package/package.json +1 -1
- package/src/agent/engine.js +19 -10
- package/src/agent/llm.js +46 -34
- package/src/agent/mcp.js +427 -0
- package/src/agent/scripts/stealthsearch.py +30 -0
- package/src/agent/searxng.js +325 -0
- package/src/agent/seeds/brainstorming/SKILL.md +90 -0
- package/src/agent/seeds/dispatching-parallel-agents/SKILL.md +120 -0
- package/src/agent/seeds/executing-plans/SKILL.md +60 -0
- package/src/agent/seeds/subagent-driven-development/SKILL.md +167 -0
- package/src/agent/seeds/systematic-debugging/SKILL.md +131 -0
- package/src/agent/seeds/test-driven-development/SKILL.md +152 -0
- package/src/agent/seeds/verification-before-completion/SKILL.md +63 -0
- package/src/agent/seeds/writing-plans/SKILL.md +162 -0
- package/src/agent/seeds/writing-skills/SKILL.md +229 -0
- package/src/agent/skills.js +41 -10
- package/src/agent/tools.js +2340 -2273
- package/src/main.js +7085 -7106
- package/src/preload.js +192 -192
- package/src/renderer/i18n.js +1220 -1226
- package/src/renderer/index.html +2 -6
- package/src/renderer/renderer.js +7461 -7480
- package/src/renderer/style.css +3388 -3430
- package/src/agent/obscura.js +0 -292
|
@@ -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
|