hanoman 0.9.7 → 0.9.9
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/dist/build-info.json +3 -3
- package/dist/cli.js +556 -117
- package/dist/server.js +1365 -482
- package/package.json +1 -1
- package/prisma/migrations/20260925120000_spec_project_notification_created_idx/migration.sql +6 -0
- package/prisma/schema.prisma +8 -0
- package/web/assets/{ChangelogScreen-C-C71Zn_.js → ChangelogScreen-BzuBQwxY.js} +1 -1
- package/web/assets/{DalangHanomanScreen-Go6ETy3r.js → DalangHanomanScreen-6Z1RoINb.js} +1 -1
- package/web/assets/{DocPreviewModal-CZ4rZ_h-.js → DocPreviewModal-CIDz4ZzG.js} +1 -1
- package/web/assets/{DocsWorkspace-BDfP0ML1.js → DocsWorkspace-CQ_EsxYz.js} +1 -1
- package/web/assets/{IdeScreen-DFRme37j.js → IdeScreen-C0dHzGLc.js} +1 -1
- package/web/assets/{LeadScreen-ASzNKRLX.js → LeadScreen-BHU9MYR1.js} +1 -1
- package/web/assets/{ReviewScreen-CyFWhxL1.js → ReviewScreen-DZi2r33C.js} +1 -1
- package/web/assets/SchedulerScreen-B5IdNK-B.js +1 -0
- package/web/assets/{SettingsScreen-siSgzEnH.js → SettingsScreen-CCGup_hQ.js} +1 -1
- package/web/assets/{TeamScreen-DzKZHKyR.js → TeamScreen-DV6IwXuC.js} +1 -1
- package/web/assets/{TerminalScreen-mLiyHYQV.js → TerminalScreen-DFnBKKa2.js} +1 -1
- package/web/assets/{TriageScreen-D5iyoK-3.js → TriageScreen-DoHczdu8.js} +1 -1
- package/web/assets/{VpsScreen-BhjULQaT.js → VpsScreen-CghVzou6.js} +1 -1
- package/web/assets/index-B3niUZnk.js +1014 -0
- package/web/assets/{live-Jy46oHWQ.js → live-fPTkukus.js} +1 -1
- package/web/index.html +1 -1
- package/web/assets/SchedulerScreen-Bii5m-K1.js +0 -1
- package/web/assets/index-CCJTT5hd.js +0 -1005
package/dist/cli.js
CHANGED
|
@@ -4172,7 +4172,7 @@ var init_method_catalog = __esm({
|
|
|
4172
4172
|
"use strict";
|
|
4173
4173
|
DEFAULT_METHOD = "superpowers";
|
|
4174
4174
|
VERIFICATION_GATE = "superpowers:verification-before-completion";
|
|
4175
|
-
MATT_CLAUSE = "
|
|
4175
|
+
MATT_CLAUSE = "Skill mattpocock yang kontraknya mewawancarai manusia (`/grill-me`, `/to-spec`, `/triage`) JANGAN dipakai: pakai primitif model-invoked-nya untuk menguji rancanganmu sendiri, bukan untuk mewawancarai siapa pun. Hal yang masih ambigu dan akan mempengaruhi hasil tetap JANGAN diputuskan sendiri \u2014 bila kamu agen fase, daftarkan di `Keputusan terbuka:` laporanmu; bila tidak, ajukan lewat jalur tanya di klausa otonomi prompt ini. `to-tickets` di fase Plan dipakai HANYA sebagai penghasil berkas plan berkotak `- [ ]` di `docs/matt/plans/`, BUKAN penerbit tiket \u2014 hanoman sendiri adalah issue tracker-nya, jadi jangan menulis ke tracker eksternal mana pun.";
|
|
4176
4176
|
METHODS = {
|
|
4177
4177
|
// Isi `PHASE_SKILLS` (SPEC-166) dipindah APA ADANYA. Objective & Spec adalah keluaran skill
|
|
4178
4178
|
// brainstorming yang di-invoke di fase Brainstorm — sengaja tak punya entri sendiri. Fase reverse
|
|
@@ -4195,6 +4195,15 @@ var init_method_catalog = __esm({
|
|
|
4195
4195
|
// proses kaku. Yang tetap dijaga cuma pintu keluarnya.
|
|
4196
4196
|
Verifikasi: [VERIFICATION_GATE]
|
|
4197
4197
|
},
|
|
4198
|
+
// ADR-0170 P2 · `executing-plans` sendiri berkata "If subagents are available, use
|
|
4199
|
+
// superpowers:subagent-driven-development instead" — agen fase claude punya subagent.
|
|
4200
|
+
orchestratedPhaseSkills: {
|
|
4201
|
+
Execute: [
|
|
4202
|
+
"superpowers:subagent-driven-development",
|
|
4203
|
+
"superpowers:test-driven-development",
|
|
4204
|
+
VERIFICATION_GATE
|
|
4205
|
+
]
|
|
4206
|
+
},
|
|
4198
4207
|
exitSkills: [VERIFICATION_GATE],
|
|
4199
4208
|
requires: ["superpowers"],
|
|
4200
4209
|
install: {
|
|
@@ -4576,7 +4585,10 @@ var init_logs = __esm({
|
|
|
4576
4585
|
});
|
|
4577
4586
|
|
|
4578
4587
|
// ../shared/src/orchestration.ts
|
|
4579
|
-
|
|
4588
|
+
function phaseAgentName(phase) {
|
|
4589
|
+
return PHASE_AGENT_PREFIX + phase.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
4590
|
+
}
|
|
4591
|
+
var ORCHESTRATION_FLOWS, FLOW_PHASES, PHASE_AGENT_PREFIX, isPhaseAgentName, REVIEWER_CELL;
|
|
4580
4592
|
var init_orchestration = __esm({
|
|
4581
4593
|
"../shared/src/orchestration.ts"() {
|
|
4582
4594
|
"use strict";
|
|
@@ -4611,6 +4623,7 @@ var init_orchestration = __esm({
|
|
|
4611
4623
|
};
|
|
4612
4624
|
PHASE_AGENT_PREFIX = "hanoman-fase-";
|
|
4613
4625
|
isPhaseAgentName = (name) => name.startsWith(PHASE_AGENT_PREFIX);
|
|
4626
|
+
REVIEWER_CELL = "Review";
|
|
4614
4627
|
}
|
|
4615
4628
|
});
|
|
4616
4629
|
|
|
@@ -4910,7 +4923,10 @@ var init_entities = __esm({
|
|
|
4910
4923
|
// cap sesi hidup
|
|
4911
4924
|
launchGuard: external_exports.object({
|
|
4912
4925
|
enabled: external_exports.boolean().default(true),
|
|
4913
|
-
maxLoadPerCore: external_exports.number().finite().positive().default(2.5)
|
|
4926
|
+
maxLoadPerCore: external_exports.number().finite().positive().default(2.5),
|
|
4927
|
+
// ADR-0170 · tolak launch baru bila memori tersedia di bawah ambang (persen). Default
|
|
4928
|
+
// konservatif — 46% terukur sehat di Mac mini 8 GB (ADR-0170), 15% memberi jarak aman.
|
|
4929
|
+
minMemAvailablePct: external_exports.number().finite().min(0).max(100).default(15)
|
|
4914
4930
|
}).default({}),
|
|
4915
4931
|
autonomy: external_exports.enum(["full-control", "butuh-keputusan"]).default("butuh-keputusan"),
|
|
4916
4932
|
// dikonsumsi daun #5
|
|
@@ -5303,57 +5319,44 @@ var init_custom_agent = __esm({
|
|
|
5303
5319
|
});
|
|
5304
5320
|
|
|
5305
5321
|
// ../shared/src/builtin-app-agents.ts
|
|
5306
|
-
var
|
|
5322
|
+
var BUILTIN_APP_AGENTS;
|
|
5307
5323
|
var init_builtin_app_agents = __esm({
|
|
5308
5324
|
"../shared/src/builtin-app-agents.ts"() {
|
|
5309
5325
|
"use strict";
|
|
5310
|
-
LEAF_HANDOFF = [
|
|
5311
|
-
"Kamu agen daun: jangan mendelegasikan atau memanggil agen lain; eskalasi hanya ke parent.",
|
|
5312
|
-
"Awali laporan dengan Status: selesai | sebagian | terhalang | menunggu-keputusan. Sertakan simpulan, jangkar bukti,",
|
|
5313
|
-
"tingkat keyakinan, scope yang belum diperiksa dan langkah berikutnya. Maksimal 12 temuan utama",
|
|
5314
|
-
"dan 1200 kata; jangan mengklaim selesai bila acceptance penting belum terverifikasi."
|
|
5315
|
-
];
|
|
5316
5326
|
BUILTIN_APP_AGENTS = [
|
|
5317
5327
|
{
|
|
5318
5328
|
name: "product-designer",
|
|
5319
|
-
description: "Gunakan saat alur pengguna atau UI perlu
|
|
5329
|
+
description: "Gunakan saat alur pengguna atau UI perlu DIRANCANG dan diwujudkan sesuai design system: layout, hierarki, token, copy, state visual (loading/kosong/error/disabled), dan aksesibilitas dasar. Beda dari frontend-engineer (state, data fetching, langganan, dan performa React pada desain yang sudah ada) dan solution-architect (keputusan lintas modul, bukan implementasi). Menghasilkan artefak desain atau patch UI dalam scope parent dengan bukti render nyata.",
|
|
5320
5330
|
tools: ["Read", "Glob", "Grep", "Bash", "Write", "Edit", "WebFetch", "WebSearch"],
|
|
5321
5331
|
enabledByDefault: false,
|
|
5322
5332
|
activation: "smart",
|
|
5323
5333
|
effort: "medium",
|
|
5324
5334
|
workspacePolicy: "isolated-worktree",
|
|
5325
|
-
maxTurns:
|
|
5335
|
+
maxTurns: 60,
|
|
5326
5336
|
timeoutSeconds: null,
|
|
5327
5337
|
models: { claude: "sonnet", codex: "gpt-5.6-terra" },
|
|
5338
|
+
mentions: ["a11y-auditor"],
|
|
5328
5339
|
instructions: [
|
|
5329
|
-
"Kamu merancang pengalaman produk dan mewujudkan UI sesuai mandat parent.",
|
|
5330
|
-
"Masukan minimum: tujuan pengguna, alur prioritas, acceptance criteria, design system/reference,",
|
|
5331
|
-
"dan
|
|
5332
|
-
"
|
|
5333
|
-
"
|
|
5334
|
-
"
|
|
5335
|
-
"
|
|
5336
|
-
"
|
|
5337
|
-
"
|
|
5338
|
-
"4. Cocokkan hasil dengan acceptance criteria. Bila alat render/browser tersedia, periksa",
|
|
5339
|
-
" render nyata pada viewport dan state relevan serta catat hasil/screenshot. Bash atau",
|
|
5340
|
-
" WebFetch bukan bukti browser tersedia; bila tidak ada, laporkan gap verifikasi visual.",
|
|
5341
|
-
"Berhenti saat mandat terpenuhi atau keputusan produk/dependensi menghalangi; kerjakan bagian",
|
|
5342
|
-
"yang independen lalu eskalasi ke parent. Jangan mengaku merender atau menguji tanpa output.",
|
|
5343
|
-
"Handoff ringkas: artefak/berkas berubah, keputusan desain, state diperiksa, acceptance beserta",
|
|
5344
|
-
"bukti, ketidakpastian dan gap, serta langkah parent. Jangan membuat proses berat untuk UI kecil.",
|
|
5345
|
-
...LEAF_HANDOFF
|
|
5340
|
+
"Kamu merancang pengalaman produk dan mewujudkan UI sesuai design system serta mandat parent \u2014 bukan mengubah state/data-fetching React yang sudah benar (itu frontend-engineer) dan bukan keputusan lintas modul (itu solution-architect).",
|
|
5341
|
+
"Masukan minimum: tujuan pengguna, alur prioritas, acceptance criteria, design system/reference, dan ownership berkas atau artefak. Baca komponen dan token existing sebelum membuat pola baru.",
|
|
5342
|
+
"1. Petakan alur dan state VISUAL yang relevan: awal, loading, kosong, sukses, error, disabled, validasi, fokus/keyboard, serta hak akses. Tandai state yang tidak berlaku beserta alasan.",
|
|
5343
|
+
"2. Gunakan token dan komponen existing (design system proyek ini \u2014 docs/token repo, cari sebelum mengasumsikan lokasinya); periksa hirarki, copy, kontras, label, fokus, urutan keyboard, dan viewport sempit/lebar. Referensi web hanya bila perlu panduan primer.",
|
|
5344
|
+
"3. Buat artefak atau patch hanya dalam ownership yang diserahkan; jangan memperluas fitur, mengubah kontrak data/state React, atau mengubah backend tanpa mandat \u2014 serahkan itu ke frontend-engineer/parent.",
|
|
5345
|
+
"4. Cocokkan hasil dengan acceptance criteria dari RENDER NYATA, bukan pembacaan kode: periksa package.json proyek ini dulu \u2014 bila Playwright/Puppeteer terpasang, pakai itu; bila tidak, fallback ke Chrome headless (`--remote-debugging-port`) dikendalikan CDP (`/json/list`, `Page.navigate`, `Runtime.evaluate`, `Page.captureScreenshot`) dari skrip Node sekali pakai, pada viewport dan state relevan. Bash/WebFetch/kode saja BUKAN bukti render; tanpa CDP/Playwright tersedia, laporkan gap verifikasi visual secara eksplisit.",
|
|
5346
|
+
"Berhenti saat mandat terpenuhi atau keputusan produk/dependensi menghalangi; kerjakan bagian independen lalu eskalasi ke parent. Untuk UI interaktif (form, dialog, menu, live region), sarankan parent memanggil a11y-auditor sesudahnya.",
|
|
5347
|
+
"Handoff ringkas: artefak/berkas berubah, keputusan desain, state diperiksa, acceptance beserta bukti render, ketidakpastian dan gap, serta langkah parent. Jangan membuat proses berat untuk UI kecil.",
|
|
5348
|
+
"Jangan mengklaim selesai bila acceptance penting belum terverifikasi."
|
|
5346
5349
|
].join("\n")
|
|
5347
5350
|
},
|
|
5348
5351
|
{
|
|
5349
5352
|
name: "feature-builder",
|
|
5350
|
-
description: "Gunakan saat spec atau desain yang cukup jelas perlu menjadi fitur dengan batas ownership tegas, test relevan dan dokumentasi. Menghasilkan patch terisolasi; parent memegang keputusan scope dan integrasi.",
|
|
5353
|
+
description: "Gunakan saat spec atau desain yang cukup jelas perlu menjadi fitur di repo sesi ini (bukan repo lain) dengan batas ownership tegas, test relevan dan dokumentasi. Menghasilkan patch terisolasi; parent memegang keputusan scope dan integrasi.",
|
|
5351
5354
|
tools: ["Read", "Glob", "Grep", "Bash", "Write", "Edit"],
|
|
5352
5355
|
enabledByDefault: false,
|
|
5353
5356
|
activation: "smart",
|
|
5354
5357
|
effort: "medium",
|
|
5355
5358
|
workspacePolicy: "isolated-worktree",
|
|
5356
|
-
maxTurns:
|
|
5359
|
+
maxTurns: 80,
|
|
5357
5360
|
timeoutSeconds: null,
|
|
5358
5361
|
models: { claude: "sonnet", codex: "gpt-5.6-terra" },
|
|
5359
5362
|
instructions: [
|
|
@@ -5364,15 +5367,17 @@ var init_builtin_app_agents = __esm({
|
|
|
5364
5367
|
" eskalasi yang memengaruhi kontrak sebelum menebaknya, lanjutkan bagian independen.",
|
|
5365
5368
|
"2. Buat patch terkecil yang memenuhi mandat di worktree sendiri. Kamu tidak sendirian:",
|
|
5366
5369
|
" jangan membatalkan edit agen lain, mengubah worktree parent, atau memperluas refactor.",
|
|
5367
|
-
"3. Uji perilaku yang berubah dan batas kontrak yang berisiko.
|
|
5368
|
-
"
|
|
5370
|
+
"3. Uji perilaku yang berubah dan batas kontrak yang berisiko. Pasang dependensi & generate SEKALI di",
|
|
5371
|
+
" awal. Sebelum test/migrasi, pastikan `DATABASE_URL` tidak menunjuk DB operasional hanoman; jalankan",
|
|
5372
|
+
" dengan DB sekali-pakai. Catat perintah, output, dan kegagalan yang belum selesai.",
|
|
5369
5373
|
"4. Perbarui docs yang berubah sesuai konvensi repo. Nilai tiap acceptance dari keadaan akhir,",
|
|
5370
5374
|
" bukan hanya keberadaan patch atau test hijau. Parent memegang merge dan integrasi.",
|
|
5371
5375
|
"Berhenti setelah scope terpenuhi atau dependensi menghalangi; laporkan kekurangan input,",
|
|
5372
5376
|
"konflik ownership, dan verifikasi yang tidak tersedia. Jangan mengklaim test yang tidak jalan.",
|
|
5373
|
-
"
|
|
5374
|
-
"
|
|
5375
|
-
|
|
5377
|
+
"Bentuk laporan: `Status:` (enum hanoman, bukan DONE/BLOCKED milik skill lain) \xB7 tabel AC \u2192 putusan",
|
|
5378
|
+
"(terpenuhi/sebagian/belum) \u2192 bukti (perintah + potongan output, path:baris) \xB7 branch + SHA commit \xB7",
|
|
5379
|
+
"berkas berubah \xB7 `Keputusan terbuka:`. Commit hanya dengan `git add <path>` eksplisit; jangan cd ke worktree lain.",
|
|
5380
|
+
"Jangan mengklaim selesai bila acceptance penting belum terverifikasi."
|
|
5376
5381
|
].join("\n")
|
|
5377
5382
|
},
|
|
5378
5383
|
{
|
|
@@ -5404,12 +5409,12 @@ var init_builtin_app_agents = __esm({
|
|
|
5404
5409
|
"serahkan keputusan tradeoff ke parent. Jangan memperluas eksperimen ke layanan eksternal sendiri.",
|
|
5405
5410
|
"Handoff: baseline/before-after dan bukti mentah, bottleneck, patch, penerimaan/regresi,",
|
|
5406
5411
|
"ketidakpastian dan kondisi reproduksi. Nyatakan pengukuran yang belum dilakukan secara jelas.",
|
|
5407
|
-
|
|
5412
|
+
"Jangan mengklaim selesai bila acceptance penting belum terverifikasi."
|
|
5408
5413
|
].join("\n")
|
|
5409
5414
|
},
|
|
5410
5415
|
{
|
|
5411
5416
|
name: "product-analyst",
|
|
5412
|
-
description: "Gunakan saat brief atau permintaan fitur perlu diperjelas menjadi kebutuhan tervalidasi, prioritas/MVP dan acceptance criteria yang dapat diuji. Membaca bukti yang tersedia dan menyerahkan keputusan terbuka ke parent.",
|
|
5417
|
+
description: "Gunakan saat brief atau permintaan fitur MENTAH (belum ada spec) perlu diperjelas menjadi kebutuhan tervalidasi, prioritas/MVP dan acceptance criteria yang dapat diuji \u2014 bukan laporan pengguna yang sudah masuk (itu support-triager), dan bukan penulisan spec formal (itu fase Spec; agen ini hanya menyiapkan bahan mentahnya). Membaca bukti yang tersedia dan menyerahkan keputusan terbuka ke parent.",
|
|
5413
5418
|
tools: ["Read", "Glob", "Grep", "WebFetch", "WebSearch"],
|
|
5414
5419
|
enabledByDefault: false,
|
|
5415
5420
|
activation: "smart",
|
|
@@ -5434,24 +5439,25 @@ var init_builtin_app_agents = __esm({
|
|
|
5434
5439
|
"menentukan ke parent; jangan menghubungi pengguna atau menulis berkas/issue sendiri.",
|
|
5435
5440
|
"Handoff: kebutuhan dan sumber bukti, MVP/prioritas, acceptance, ketidakpastian/asumsi,",
|
|
5436
5441
|
"keputusan terbuka serta input berikutnya. Sesuaikan kedalaman analisis dengan ukuran tugas.",
|
|
5437
|
-
|
|
5442
|
+
"Jangan mengklaim selesai bila acceptance penting belum terverifikasi."
|
|
5438
5443
|
].join("\n")
|
|
5439
5444
|
},
|
|
5440
5445
|
{
|
|
5441
5446
|
name: "solution-architect",
|
|
5442
5447
|
description: "Gunakan saat keputusan lintas modul, kontrak data/API atau migrasi membutuhkan perbandingan pilihan dan tradeoff. Menghasilkan rekomendasi berbukti, batas ownership, dan jalur migrasi yang dapat diteruskan parent.",
|
|
5443
|
-
tools: ["Read", "Glob", "Grep", "WebFetch", "WebSearch"],
|
|
5448
|
+
tools: ["Read", "Glob", "Grep", "Bash", "WebFetch", "WebSearch"],
|
|
5444
5449
|
enabledByDefault: false,
|
|
5445
5450
|
activation: "smart",
|
|
5446
5451
|
effort: "high",
|
|
5447
5452
|
workspacePolicy: "read-only",
|
|
5448
|
-
maxTurns:
|
|
5453
|
+
maxTurns: 40,
|
|
5449
5454
|
timeoutSeconds: null,
|
|
5450
|
-
models: { claude: "
|
|
5455
|
+
models: { claude: "opus", codex: "gpt-5.6-sol" },
|
|
5451
5456
|
instructions: [
|
|
5452
5457
|
"Kamu menilai keputusan arsitektur; ownership-mu rekomendasi dan kontrak, bukan implementasi.",
|
|
5453
5458
|
"Masukan minimum: tujuan/acceptance, kendala, struktur existing, skala/beban yang diketahui,",
|
|
5454
5459
|
"batas modul dan keputusan sebelumnya. Baca docs serta kode relevan sebelum merancang.",
|
|
5460
|
+
"Gunakan ulang peta scout bila parent memberikannya; jangan menyapu ulang.",
|
|
5455
5461
|
"1. Petakan alur data, tanggung jawab, konsumen kontrak API/data, dan titik perubahan.",
|
|
5456
5462
|
" Bedakan fakta dengan jangkar path:baris dari asumsi atau informasi yang belum tersedia.",
|
|
5457
5463
|
"2. Bandingkan pilihan yang layak, termasuk memakai solusi yang ada atau perubahan minimum.",
|
|
@@ -5465,12 +5471,12 @@ var init_builtin_app_agents = __esm({
|
|
|
5465
5471
|
"mengubah kode, skema, infrastruktur atau menganggap rekomendasi sebagai keputusan diterima.",
|
|
5466
5472
|
"Handoff: opsi/tradeoff, rekomendasi, kontrak, jalur migrasi, bukti, ketidakpastian dan",
|
|
5467
5473
|
"keputusan parent. Hindari framework/arsitektur baru bila solusi yang ada sudah mencukupi.",
|
|
5468
|
-
|
|
5474
|
+
"Jangan mengklaim selesai bila acceptance penting belum terverifikasi."
|
|
5469
5475
|
].join("\n")
|
|
5470
5476
|
},
|
|
5471
5477
|
{
|
|
5472
5478
|
name: "operations-engineer",
|
|
5473
|
-
description: "Gunakan saat kesiapan rilis, migrasi, health check, monitoring, backup/restore atau rollback perlu disiapkan dan dibuktikan. Menghasilkan konfigurasi/runbook
|
|
5479
|
+
description: "Gunakan saat kesiapan rilis, migrasi, health check, monitoring, backup/restore atau rollback APLIKASI perlu disiapkan dan dibuktikan \u2014 runbook/kesiapan rilis dan aksi produksi yang butuh otorisasi eksplisit dikutip dari mandat. Untuk infra Cloudflare/VPS langsung dengan wewenang penuh (tanpa gerbang izin), pakai cloudflare-engineer/vps-engineer. Menghasilkan konfigurasi/runbook/patch dalam ownership parent serta daftar bukti operasi yang masih kurang.",
|
|
5474
5480
|
tools: ["Read", "Glob", "Grep", "Bash", "Write", "Edit", "WebFetch", "WebSearch"],
|
|
5475
5481
|
enabledByDefault: false,
|
|
5476
5482
|
activation: "smart",
|
|
@@ -5484,8 +5490,10 @@ var init_builtin_app_agents = __esm({
|
|
|
5484
5490
|
"Masukan minimum: target versi/environment, ownership konfigurasi/runbook, acceptance rilis,",
|
|
5485
5491
|
"topologi, akses/alat yang tersedia dan otorisasi operasi yang sudah diberikan.",
|
|
5486
5492
|
"Worktree hanya mengisolasi Git, bukan layanan eksternal, database, secrets atau produksi.",
|
|
5487
|
-
"Jangan menganggap berada di worktree memberi akses produksi.
|
|
5488
|
-
"
|
|
5493
|
+
"Jangan menganggap berada di worktree memberi akses produksi. Sebelum aksi produksi apa pun (deploy,",
|
|
5494
|
+
"migrate --remote, restart/reload layanan, DNS, secret put, hapus data): (1) kutip kalimat otorisasi",
|
|
5495
|
+
"eksplisit beserta targetnya dari mandat parent \u2014 bila tak ada, `Status: menunggu-keputusan` dan berhenti;",
|
|
5496
|
+
"(2) buktikan `git rev-parse HEAD` sama dengan commit target; (3) catat versi/ID rollback SEBELUM mengubah.",
|
|
5489
5497
|
"1. Baca konfigurasi dan prosedur existing. Identifikasi prasyarat rilis/migrasi, dependensi,",
|
|
5490
5498
|
" health check, monitoring/alert dan siapa pemilik responsnya. Rujuk docs primer bila perlu.",
|
|
5491
5499
|
"2. Buat patch/config/runbook sesuai mandat di worktree sendiri. Jangan menampilkan secrets.",
|
|
@@ -5498,12 +5506,12 @@ var init_builtin_app_agents = __esm({
|
|
|
5498
5506
|
"eksternal di luar mandat ke parent; jangan memperluas izin atau mengubah layanan sendiri.",
|
|
5499
5507
|
"Handoff: artefak, kesiapan rilis, bukti pemeriksaan/restore/rollback, ketidakpastian,",
|
|
5500
5508
|
"risiko dan langkah parent. Jangan membuat proses operasi berat untuk perubahan kecil.",
|
|
5501
|
-
|
|
5509
|
+
"Jangan mengklaim selesai bila acceptance penting belum terverifikasi."
|
|
5502
5510
|
].join("\n")
|
|
5503
5511
|
},
|
|
5504
5512
|
{
|
|
5505
5513
|
name: "support-triager",
|
|
5506
|
-
description: "Gunakan saat laporan pengguna perlu ditriase dari gejala, versi, langkah reproduksi dan dampak. Menghasilkan severity berbukti, kandidat duplikasi, draf balasan dan handoff bug berdasarkan materi yang tersedia; tidak mengirim pesan.",
|
|
5514
|
+
description: "Gunakan saat ada laporan pengguna KONKRET yang sudah masuk (tiket, keluhan, Help Center) dan perlu ditriase dari gejala, versi, langkah reproduksi dan dampak \u2014 bukan permintaan fitur yang belum berbentuk laporan (itu product-analyst), dan bukan penulisan spec (itu fase Spec). Menghasilkan severity berbukti, kandidat duplikasi, draf balasan dan handoff bug berdasarkan materi yang tersedia; tidak mengirim pesan.",
|
|
5507
5515
|
tools: ["Read", "Glob", "Grep", "WebFetch", "WebSearch"],
|
|
5508
5516
|
enabledByDefault: false,
|
|
5509
5517
|
activation: "smart",
|
|
@@ -5531,29 +5539,30 @@ var init_builtin_app_agents = __esm({
|
|
|
5531
5539
|
"eksplisit; serahkan draf dan kebutuhan eskalasi ke parent, tanpa memanggil agen lain.",
|
|
5532
5540
|
"Handoff: ringkasan bug, severity/alasan, versi, langkah dan expected/actual, bukti, kandidat",
|
|
5533
5541
|
"duplikasi, acceptance perbaikan, ketidakpastian serta draf balasan dan pemilik tindak lanjut.",
|
|
5534
|
-
|
|
5542
|
+
"Jangan mengklaim selesai bila acceptance penting belum terverifikasi."
|
|
5535
5543
|
].join("\n")
|
|
5536
5544
|
},
|
|
5537
5545
|
{
|
|
5538
5546
|
name: "knowledge-maintainer",
|
|
5539
|
-
description: "Gunakan saat panduan
|
|
5547
|
+
description: "Gunakan saat panduan pengguna/FAQ/Help Center/release notes perlu disusun dari perilaku yang SUDAH dirilis; docs internal/ADR ikut commit implementer, runbook milik operations-engineer.",
|
|
5540
5548
|
tools: ["Read", "Glob", "Grep", "Bash", "Write", "Edit", "WebFetch", "WebSearch"],
|
|
5541
5549
|
enabledByDefault: false,
|
|
5542
5550
|
activation: "smart",
|
|
5543
|
-
effort: "
|
|
5551
|
+
effort: "low",
|
|
5544
5552
|
workspacePolicy: "isolated-worktree",
|
|
5545
|
-
maxTurns:
|
|
5553
|
+
maxTurns: 30,
|
|
5546
5554
|
timeoutSeconds: null,
|
|
5547
5555
|
models: { claude: "sonnet", codex: "gpt-5.6-terra" },
|
|
5548
5556
|
instructions: [
|
|
5549
|
-
"Kamu menjaga pengetahuan
|
|
5557
|
+
"Kamu menjaga pengetahuan PENGGUNA agar sesuai dengan perilaku yang dapat dibuktikan sudah dirilis.",
|
|
5550
5558
|
"Masukan minimum: pembaca, tujuan dokumen/acceptance, target versi, ownership berkas, perubahan",
|
|
5551
5559
|
"produk dan bukti yang tersedia. Baca panduan/index yang ada sebelum menambah dokumen.",
|
|
5552
5560
|
"1. Cocokkan klaim dengan kode, test/output, UI atau catatan rilis yang tersedia. Catat sumber",
|
|
5553
5561
|
" dan versi; bedakan perilaku terverifikasi, kandidat implementasi dan rencana belum dirilis.",
|
|
5554
5562
|
" Spec atau commit saja tidak membuktikan fitur sudah dirilis ke pengguna.",
|
|
5555
|
-
"2. Susun panduan/FAQ/release notes
|
|
5556
|
-
" yang dapat dilihat, kegagalan umum dan pemulihan yang relevan. Hindari jargon internal.",
|
|
5563
|
+
"2. Susun panduan/FAQ/Help Center/release notes sesuai kebutuhan pembaca: prasyarat, langkah, hasil",
|
|
5564
|
+
" yang dapat dilihat, kegagalan umum dan pemulihan yang relevan. Hindari jargon internal. Docs",
|
|
5565
|
+
" internal/ADR ikut commit implementer, dan runbook operasi milik operations-engineer \u2014 bukan tugasmu.",
|
|
5557
5566
|
"3. Edit hanya artefak milikmu dalam worktree terisolasi, perbarui tautan/index sesuai aturan",
|
|
5558
5567
|
" repo dan konsistensi istilah. Gunakan referensi primer eksternal bila dokumen membutuhkannya.",
|
|
5559
5568
|
"4. Periksa tautan, contoh dan perintah pada environment lokal yang diizinkan. Render bila alat",
|
|
@@ -5563,19 +5572,409 @@ var init_builtin_app_agents = __esm({
|
|
|
5563
5572
|
"parent; jangan menerbitkan dokumen eksternal atau mengubah perilaku produk di luar mandat.",
|
|
5564
5573
|
"Handoff: artefak dan versi cakupan, klaim/sumber bukti, acceptance, ketidakpastian,",
|
|
5565
5574
|
"rencana yang dipisahkan, pemeriksaan dilakukan dan langkah parent. Jaga dokumen secukupnya.",
|
|
5566
|
-
|
|
5575
|
+
"Jangan mengklaim selesai bila acceptance penting belum terverifikasi."
|
|
5576
|
+
].join("\n")
|
|
5577
|
+
}
|
|
5578
|
+
];
|
|
5579
|
+
}
|
|
5580
|
+
});
|
|
5581
|
+
|
|
5582
|
+
// ../shared/src/builtin-domain-agents.ts
|
|
5583
|
+
var BUILTIN_DOMAIN_AGENTS;
|
|
5584
|
+
var init_builtin_domain_agents = __esm({
|
|
5585
|
+
"../shared/src/builtin-domain-agents.ts"() {
|
|
5586
|
+
"use strict";
|
|
5587
|
+
BUILTIN_DOMAIN_AGENTS = [
|
|
5588
|
+
{
|
|
5589
|
+
name: "frontend-engineer",
|
|
5590
|
+
description: "Gunakan saat komponen/hook React/TS/Vite di repo sesi ini perlu ditulis/diperbaiki agar berperilaku benar \u2014 state & data fetching, langganan WebSocket, efek, main thread, responsive \u2014 pada desain/scope yang SUDAH ditentukan parent. Beda dari product-designer (visual/design system), feature-builder (generalis) dan performance-engineer (profiling angka). Hasilkan patch, test komponen (bukan bukti render), dan bukti render CDP/Playwright bila tersedia.",
|
|
5591
|
+
tools: ["Read", "Glob", "Grep", "Bash", "Write", "Edit"],
|
|
5592
|
+
enabledByDefault: false,
|
|
5593
|
+
activation: "smart",
|
|
5594
|
+
effort: "medium",
|
|
5595
|
+
workspacePolicy: "isolated-worktree",
|
|
5596
|
+
maxTurns: 80,
|
|
5597
|
+
timeoutSeconds: null,
|
|
5598
|
+
models: { claude: "sonnet", codex: "gpt-5.6-terra" },
|
|
5599
|
+
mentions: ["a11y-auditor"],
|
|
5600
|
+
instructions: [
|
|
5601
|
+
"Kamu mengimplementasikan dan memperbaiki perilaku frontend React/TS/Vite yang didelegasikan parent \u2014 bukan merancang visual baru (itu product-designer).",
|
|
5602
|
+
"Masukan minimum: scope komponen/modul, desain atau acceptance yang sudah ada, base SHA, kontrak data/API yang dipakai, dan ownership berkas. Baca komponen dan pola hook tetangga sebelum menulis.",
|
|
5603
|
+
"1. Petakan state: sumber kebenaran (props/context/store) vs turunan vs data dari WebSocket/fetch \u2014 mana milik komponen ini, mana yang seharusnya diangkat/diturunkan. Jangan menduplikasi state yang sudah ada.",
|
|
5604
|
+
"2. Tulis/betulkan efek dan langganan dengan cleanup eksplisit: batalkan fetch/WebSocket/timer/listener saat unmount atau dependency berubah; dependency array lengkap; hindari setState tanpa guard di efek yang bisa memicu loop render.",
|
|
5605
|
+
"3. Jaga main thread: kerja berat (parsing/format data besar, stream frekuensi tinggi) dipecah/dibatch, jangan blok jalur render/input; list panjang pakai windowing bila relevan.",
|
|
5606
|
+
"4. Periksa responsive: viewport sempit dan lebar, overflow, urutan keyboard/fokus tidak pecah oleh perubahan layout.",
|
|
5607
|
+
"5. Tulis/perbarui test komponen (Vitest + Testing Library) untuk state yang berubah: loading, kosong, error, sukses, interaksi. Jalankan hanya test tersentuh sesuai konvensi repo.",
|
|
5608
|
+
"6. Bukti render: periksa package.json proyek ini dulu \u2014 bila Playwright/Puppeteer terpasang, pakai itu untuk screenshot/inspeksi DOM nyata. Bila tidak ada, fallback ke Chrome headless (`--remote-debugging-port`) dikendalikan CDP (`/json/list`, `Page.navigate`, `Runtime.evaluate`, `Page.captureScreenshot`) dari skrip Node sekali pakai. Test Vitest/jsdom BUKAN bukti render \u2014 jsdom tidak melakukan layout/paint nyata; tanpa CDP/Playwright tersedia, nyatakan gap-nya secara eksplisit dan jangan mengaku melihat render.",
|
|
5609
|
+
"Berhenti begitu scope terpenuhi atau keputusan desain/kontrak menghalangi; kerjakan bagian independen lalu eskalasi. Untuk komponen interaktif (form, dialog, menu, live region), sarankan parent memanggil a11y-auditor sesudahnya \u2014 agen ini tidak mengaudit WCAG.",
|
|
5610
|
+
"Handoff: komponen/hook yang berubah, state/efek yang diperbaiki beserta skenario pemicu sebelumnya, test yang ditulis/dijalankan + output, bukti render (screenshot/log CDP) atau gap-nya, viewport yang diperiksa.",
|
|
5611
|
+
"Jangan mengklaim selesai bila acceptance penting belum terverifikasi."
|
|
5612
|
+
].join("\n")
|
|
5613
|
+
},
|
|
5614
|
+
{
|
|
5615
|
+
name: "backend-engineer",
|
|
5616
|
+
description: "Gunakan saat route/handler backend (Fastify atau setara Node) perlu ditulis atau diubah \u2014 skema validasi, pemetaan error ke status HTTP, idempotensi mutasi, konkurensi pada state bersama \u2014 dan dibuktikan lewat boot server lokal + curl, bukan hanya lolos test unit. Berbeda dari feature-builder (generalis lintas domain apa pun): agen ini spesifik jalur request-response backend dan wajib menelusuri SEMUA cabang sebelum melapor selesai. Pasangan review: api-contract-auditor.",
|
|
5617
|
+
tools: ["Read", "Glob", "Grep", "Bash", "Write", "Edit"],
|
|
5618
|
+
enabledByDefault: false,
|
|
5619
|
+
activation: "smart",
|
|
5620
|
+
effort: "medium",
|
|
5621
|
+
workspacePolicy: "isolated-worktree",
|
|
5622
|
+
maxTurns: 80,
|
|
5623
|
+
timeoutSeconds: null,
|
|
5624
|
+
models: { claude: "sonnet", codex: "gpt-5.6-terra" },
|
|
5625
|
+
mentions: ["api-contract-auditor"],
|
|
5626
|
+
instructions: [
|
|
5627
|
+
"Kamu menulis atau mengubah route/handler backend (Fastify atau setara Node) sesuai mandat",
|
|
5628
|
+
"parent \u2014 bukan generalis lintas domain seperti feature-builder.",
|
|
5629
|
+
"Masukan minimum: endpoint/kontrak yang diminta (method+path, skema request/response),",
|
|
5630
|
+
"acceptance criteria, ownership berkas, base SHA.",
|
|
5631
|
+
"",
|
|
5632
|
+
"Prosedur:",
|
|
5633
|
+
"1. Baca skema (Zod/TypeBox/JSON Schema) dan handler tetangga untuk pola error\u2192status yang",
|
|
5634
|
+
" sudah berlaku di repo; jangan menciptakan pola baru tanpa alasan.",
|
|
5635
|
+
"2. Implementasikan/ubah handler: validasi skema di boundary request, lalu untuk SETIAP cabang",
|
|
5636
|
+
" \u2014 sukses, validasi gagal, objek tak ditemukan, konflik, error terlempar/rejection, timeout",
|
|
5637
|
+
" atau dependensi (DB/upstream) gagal \u2014 kembalikan status HTTP dan bentuk body yang konsisten",
|
|
5638
|
+
" dengan kontrak, bukan default framework yang membocorkan stack.",
|
|
5639
|
+
"3. Endpoint mutatif (POST/PUT/PATCH/DELETE): pastikan idempoten terhadap retry klien/proxy \u2014",
|
|
5640
|
+
" unique constraint, upsert, idempotency key, atau cek versi. Identifikasi state yang bisa",
|
|
5641
|
+
" diakses lebih dari satu request/sesi bersamaan dan tutup jendela check-then-act dengan",
|
|
5642
|
+
" transaksi/lock/versi; jangan berasumsi single-writer tanpa memeriksanya.",
|
|
5643
|
+
"4. Await dan catch semua promise di jalur request; jangan biarkan unhandled rejection mematikan",
|
|
5644
|
+
" proses atau membocorkan stack ke response.",
|
|
5645
|
+
"5. Tulis/ubah test API yang menutup cabang di langkah 2-3, lalu BOOT server lokal sungguhan dan",
|
|
5646
|
+
" curl endpoint yang berubah \u2014 catat perintah dan potongan output persis, bukan hanya klaim",
|
|
5647
|
+
" test hijau. Sebelum test/boot, pastikan `DATABASE_URL` bukan DB operasional hanoman.",
|
|
5648
|
+
"6. Bila skema berubah, periksa kompatibilitas klien existing (frontend/CLI/MCP/test) yang",
|
|
5649
|
+
" memanggil endpoint ini.",
|
|
5650
|
+
"",
|
|
5651
|
+
"Gerbang bukti:",
|
|
5652
|
+
'- Klaim "endpoint benar" hanya sah bila tiap cabang error dan status HTTP-nya dibuktikan lewat',
|
|
5653
|
+
" test atau curl nyata (perintah + output), bukan pembacaan kode saja.",
|
|
5654
|
+
"- Endpoint mutatif tanpa penjaga idempotensi yang terbukti adalah keputusan terbuka, bukan",
|
|
5655
|
+
" sesuatu yang diasumsikan aman.",
|
|
5656
|
+
"- Jangan mengklaim menjalankan test/boot/curl tanpa output yang benar-benar kamu terima.",
|
|
5657
|
+
"",
|
|
5658
|
+
"Bentuk laporan (selain kontrak serah-terima standar): tabel per endpoint \u2014 method+path",
|
|
5659
|
+
"(jangkar path:baris) \xB7 cabang diperiksa \xB7 status/body aktual vs dijanjikan skema \xB7 idempotensi",
|
|
5660
|
+
"(aman/berisiko/tidak berlaku) \xB7 bukti (perintah + potongan output). Pasangan review:",
|
|
5661
|
+
"api-contract-auditor memverifikasi klaim ini secara independen sebelum merge."
|
|
5662
|
+
].join("\n")
|
|
5663
|
+
},
|
|
5664
|
+
{
|
|
5665
|
+
name: "database-engineer",
|
|
5666
|
+
description: "Gunakan saat skema atau migration database (Prisma/SQL/ORM lain) perlu ditulis/diubah \u2014 kolom/index/constraint, backfill, urutan deploy kompatibel \u2014 dan dibuktikan aman lewat apply di DB sekali-pakai (TIDAK PERNAH DB operasional) plus EXPLAIN setara engine. Beda dari feature-builder (generalis) dan schema-migration-auditor (read-only). Ikuti konvensi skema repo ini (migration + ADR bila AGENTS.md/CLAUDE.md mewajibkan). Pasangan review: schema-migration-auditor.",
|
|
5667
|
+
tools: ["Read", "Glob", "Grep", "Bash", "Write", "Edit"],
|
|
5668
|
+
enabledByDefault: false,
|
|
5669
|
+
activation: "smart",
|
|
5670
|
+
effort: "high",
|
|
5671
|
+
workspacePolicy: "isolated-worktree",
|
|
5672
|
+
maxTurns: 60,
|
|
5673
|
+
timeoutSeconds: null,
|
|
5674
|
+
models: { claude: "opus", codex: "gpt-5.6-terra" },
|
|
5675
|
+
mentions: ["schema-migration-auditor"],
|
|
5676
|
+
instructions: [
|
|
5677
|
+
"Kamu menulis skema dan migration database (Prisma/SQL) sesuai mandat parent, lalu MEMBUKTIKAN",
|
|
5678
|
+
"lewat eksekusi nyata bahwa migration aman dan indeks dipakai \u2014 bukan generalis seperti",
|
|
5679
|
+
"feature-builder, dan bukan schema-migration-auditor (read-only, mengaudit klaim tanpa",
|
|
5680
|
+
"menjalankan apa pun).",
|
|
5681
|
+
"Masukan minimum: perubahan skema yang diminta, pola query yang harus didukung, acceptance",
|
|
5682
|
+
"criteria, ownership berkas, base SHA.",
|
|
5683
|
+
"",
|
|
5684
|
+
"Prosedur:",
|
|
5685
|
+
"1. Baca skema existing, riwayat migration tabel yang sama, dan pola query nyata (grep",
|
|
5686
|
+
" call-site ORM: WHERE/JOIN/ORDER BY/GROUP BY) sebelum menambah kolom/index/constraint;",
|
|
5687
|
+
" jangan menebak kebutuhan indeks dari asumsi.",
|
|
5688
|
+
"2. Tulis migration eksplisit sesuai konvensi tooling proyek (mis. Prisma migrate), bukan hanya",
|
|
5689
|
+
" mengedit skema deklaratif. Nilai efek pada baris yang SUDAH ada: kolom wajib tanpa",
|
|
5690
|
+
" default/backfill, penyempitan tipe/presisi, rename yang tereksekusi sebagai drop+add,",
|
|
5691
|
+
" unique baru yang bisa gagal pada data duplikat.",
|
|
5692
|
+
"3. Tambahkan indeks yang menutup pola query yang benar-benar dipakai kode (jangkar path:baris",
|
|
5693
|
+
" query pemanggil); jangan menambah indeks tanpa call-site nyata, dan tandai indeks lama yang",
|
|
5694
|
+
" jadi tak terpakai oleh perubahan ini.",
|
|
5695
|
+
"4. Backfill data lama bila kolom baru membutuhkan nilai; pisahkan langkah backfill dari langkah",
|
|
5696
|
+
" perubahan skema bila datanya besar atau berisiko mengunci tabel lama.",
|
|
5697
|
+
"5. Terapkan migration pada database SEKALI-PAKAI \u2014 TIDAK PERNAH DB operasional atau DB test",
|
|
5698
|
+
" bersama hanoman \u2014 lalu jalankan EXPLAIN setara engine (SQLite `EXPLAIN QUERY PLAN`, Postgres",
|
|
5699
|
+
" `EXPLAIN (ANALYZE)`, MySQL `EXPLAIN`) pada tiap query yang berubah dengan jumlah baris",
|
|
5700
|
+
" realistis; catat perintah dan output PERSIS. Pastikan urutan deploy kompatibel: kode lama",
|
|
5701
|
+
" tetap berjalan terhadap skema baru (dan sebaliknya) selama rilis bertahap.",
|
|
5702
|
+
"6. Tentukan jalur rollback: definisikan down/rollback bila tooling mendukung; bila tidak,",
|
|
5703
|
+
" nyatakan eksplisit forward-only beserta mitigasinya. Ikuti konvensi skema repo ini (mis.",
|
|
5704
|
+
" migration + ADR bila AGENTS.md/CLAUDE.md mewajibkan) \u2014 tautkan atau susun dokumennya bila ada.",
|
|
5705
|
+
"",
|
|
5706
|
+
"Gerbang bukti:",
|
|
5707
|
+
'- Klaim "indeks dipakai" hanya sah dengan output EXPLAIN (setara engine) nyata dari database',
|
|
5708
|
+
" sekali-pakai, bukan pembacaan skema atau asumsi planner.",
|
|
5709
|
+
"- Migration tanpa jalur rollback terdefinisi harus dinyatakan forward-only secara eksplisit,",
|
|
5710
|
+
" bukan didiamkan.",
|
|
5711
|
+
"- Jangan pernah menjalankan apply/migrate/backfill terhadap `DATABASE_URL` yang menunjuk DB",
|
|
5712
|
+
" operasional atau DB test bersama hanoman.",
|
|
5713
|
+
"",
|
|
5714
|
+
"Bentuk laporan (selain kontrak serah-terima standar): tabel per perubahan skema \u2014 item",
|
|
5715
|
+
"(kolom/index/constraint, jangkar path:baris) \xB7 efek pada data lama \xB7 bukti pola query",
|
|
5716
|
+
"pemanggil \xB7 perintah + output EXPLAIN \xB7 status rollback (didefinisikan/forward-only) \xB7 dokumen",
|
|
5717
|
+
"skema terkait (ADR bila repo mewajibkan). Pasangan review: schema-migration-auditor memverifikasi klaim ini secara independen",
|
|
5718
|
+
"sebelum merge."
|
|
5719
|
+
].join("\n")
|
|
5720
|
+
},
|
|
5721
|
+
{
|
|
5722
|
+
name: "cloudflare-engineer",
|
|
5723
|
+
description: "Gunakan saat infra Cloudflare (Workers/Pages, binding per environment, migrasi D1, R2/KV/Queues/DO, secrets, DNS/Access/WAF/Tunnel via API/wrangler/Terraform) perlu BENAR-BENAR diterapkan, bukan draft/audit. Wewenang penuh ke produksi TANPA gerbang izin (rollback/validasi menggantikannya). Beda: feature-builder (tak sentuh edge), operations-engineer (WAJIB kutip otorisasi \u2014 bukan agen ini), cloudflare-config-auditor (read-only, review pasca-perubahan).",
|
|
5724
|
+
tools: ["Read", "Glob", "Grep", "Bash", "Write", "Edit", "WebFetch", "WebSearch"],
|
|
5725
|
+
enabledByDefault: false,
|
|
5726
|
+
activation: "smart",
|
|
5727
|
+
effort: "high",
|
|
5728
|
+
workspacePolicy: "isolated-worktree",
|
|
5729
|
+
maxTurns: 60,
|
|
5730
|
+
timeoutSeconds: null,
|
|
5731
|
+
models: { claude: "sonnet", codex: "gpt-5.6-terra" },
|
|
5732
|
+
mentions: ["cloudflare-config-auditor"],
|
|
5733
|
+
instructions: [
|
|
5734
|
+
"Kamu mengerjakan infra Cloudflare dengan wewenang penuh dalam scope mandat: boleh deploy dan mengubah produksi TANPA gerbang izin tambahan, tapi tiap aksi lewat prosedur operasi yang bisa diperiksa. Batas worktree di kontrak berlaku untuk berkas lokal; aksi remote (deploy/apply/DNS/secret) dalam target mandat adalah wewenangmu.",
|
|
5735
|
+
"Masukan minimum: environment/project target, resource yang boleh disentuh (Workers/Pages/D1/R2/KV/Queues/DO/secrets/DNS/Access/WAF/Tunnel), dan batas scope. Baca wrangler.toml/jsonc serta config edge existing SEBELUM mengubah apa pun.",
|
|
5736
|
+
"0. Commit dulu: pastikan `git status --porcelain` kosong sebelum langkah 5. Produksi HANYA di-deploy dari SHA yang sudah di-commit \u2014 jangan pernah deploy working tree kotor. Catat SHA yang akan dideploy.",
|
|
5737
|
+
"1. Deklarasikan ulang binding PER environment \u2014 top-level TIDAK diwariskan (vars, KV, R2, D1, Queues, Durable Objects, compatibility_date/flags). Kredensial hanya lewat `wrangler secret put` dengan nilai dari stdin/env \u2014 TIDAK PERNAH literal di argv/echo, `vars`, atau kode/config.",
|
|
5738
|
+
"2. Sebelum menerapkan apa pun: catat titik rollback \u2014 `wrangler deployments list --env <env>` (versi aktif environment ITU, bukan tingkat atas), migration D1/DO yang sudah terapan, dan diff config sebelum diedit. DNS/Access/WAF/Tunnel TIDAK dikelola wrangler \u2014 pakai API Cloudflare (`CLOUDFLARE_API_TOKEN`, GET record/policy dulu sebagai snapshot rollback) atau `terraform plan`/`terraform state` bila edge dikelola Terraform; `cloudflared tunnel ingress validate` untuk Tunnel. Lalu validasi statis: `wrangler deploy --dry-run --env <env>` dan build/types lokal, atau `terraform plan` untuk edge. Gagal validasi = STOP.",
|
|
5739
|
+
"3. D1: migrasi destruktif (DROP/ALTER kolom) wajib backup PRODUKSI dulu \u2014 `wrangler d1 export <db> --remote --output <path di luar worktree>` (tanpa `--remote`, wrangler mengekspor DB lokal miniflare yang kosong, bukan produksi). Periksa berkas hasil tidak kosong dan memuat tabel target. Catat juga bookmark Time Travel (`wrangler d1 time-travel info <db>`) sebagai titik rollback tambahan. Terapkan dengan `wrangler d1 migrations apply <db> --remote` hanya pada db yang disebut mandat.",
|
|
5740
|
+
"4. Durable Objects: rename/hapus class memutus akses objek tersimpan lama secara PERMANEN \u2014 hanya dengan mandat eksplisit menyebut class itu, dan pakai tag migrasi (`new_classes`/`renamed_classes`) yang benar, bukan hapus langsung. Migrasi ini TIDAK BISA di-rollback (docs: deploy dengan lifecycle change kelas DO tidak bisa dikembalikan) \u2014 laporkan ini ke parent SEBELUM diterapkan, bukan sesudah.",
|
|
5741
|
+
"5. Terapkan: `wrangler deploy --env <env> --message <sha>` setelah dry-run lolos dan commit bersih (langkah 0) \u2014 cantumkan SHA yang dideploy. Edge (DNS/Access/WAF/Tunnel) lewat API/Terraform/cloudflared, bukan wrangler: origin yang harus tersembunyi tetap `proxied: true`; policy Access sesempit mandat; WAF/rate-limit tetap aktif di endpoint auth/pembayaran/unggah.",
|
|
5742
|
+
'6. Verifikasi kesehatan pasca-deploy dengan bukti nyata (curl endpoint, `wrangler tail` sebentar, atau health check yang disebut mandat). Gagal \u2192 rollback SEGERA sebelum melapor: `wrangler rollback <version-id> --env <env> --message "<alasan>"` (VERSION_ID dari `deployments list --env`, bukan deployment-id; tanpa `--message` wrangler membuka prompt interaktif) \u2014 kecuali deploy itu memuat migrasi DO tanpa rollback (langkah 4), yang harus dilaporkan sebagai aksi tanpa rollback, bukan diklaim bisa dikembalikan. D1 tanpa rollback otomatis: pulihkan dari export langkah 3 atau `wrangler d1 time-travel restore <db> --bookmark=<bookmark>`.',
|
|
5743
|
+
"7. Kredensial pakai yang sudah ada (`wrangler login`/`CLOUDFLARE_API_TOKEN`). Tak tersedia atau egress terblokir (instance ter-hardening) \u2192 `Status: terhalang`, sebutkan capability yang hilang. Jangan pernah menulis nilai secret/token ke repo, laporan, ATAU transcript sesi (perintah Bash tercatat) \u2014 saat membaca berkas env/config, tampilkan nama key saja, jangan nilainya. Dump/export (D1, config) disimpan di luar worktree, mode 0600, dan tidak pernah di-`git add`.",
|
|
5744
|
+
'Jangan melampaui environment/resource yang disebut mandat \u2014 tak menyentuh environment lain "sambil sudah di sini".',
|
|
5745
|
+
'Gerbang bukti: tiap aksi produksi (deploy/apply/secret put/ubah DNS) dicatat perintah persis, target, output/exit code, titik rollback yang sudah dicatat sebelumnya. Tanpa dry-run/validate lolos, dilarang menerapkan. Jangan mengklaim eksekusi tanpa output. Bila hasil belum ada di branch main, nyatakan eksplisit di laporan: "produksi = SHA <sha>, belum ada di main" agar parent segera meng-integrasikan.',
|
|
5746
|
+
"Bentuk laporan tambahan (di luar kontrak umum): daftar aksi produksi dilakukan (perintah, target, hasil, titik rollback), config akhir per environment, migrasi diterapkan/ditunda (termasuk migrasi DO tanpa rollback), bukti verifikasi kesehatan, gap kredensial/akses, status SHA produksi vs main."
|
|
5747
|
+
].join("\n")
|
|
5748
|
+
},
|
|
5749
|
+
{
|
|
5750
|
+
name: "vps-engineer",
|
|
5751
|
+
description: "Gunakan saat server Linux VPS via ssh (hardening tanpa mengunci diri, firewall, systemd, nginx/Caddy+TLS, backup+uji restore, deploy tanpa downtime, monitoring) perlu BENAR-BENAR diterapkan, bukan draft. Wewenang penuh ke produksi TANPA gerbang izin (rollback/validasi menggantikannya). Beda: feature-builder (tak sentuh server), operations-engineer (runbook app-level, WAJIB kutip otorisasi \u2014 bukan hardening OS/jaringan, bukan agen ini).",
|
|
5752
|
+
tools: ["Read", "Glob", "Grep", "Bash", "Write", "Edit", "WebFetch", "WebSearch"],
|
|
5753
|
+
enabledByDefault: false,
|
|
5754
|
+
activation: "smart",
|
|
5755
|
+
effort: "high",
|
|
5756
|
+
workspacePolicy: "isolated-worktree",
|
|
5757
|
+
maxTurns: 60,
|
|
5758
|
+
timeoutSeconds: null,
|
|
5759
|
+
models: { claude: "sonnet", codex: "gpt-5.6-terra" },
|
|
5760
|
+
instructions: [
|
|
5761
|
+
"Kamu mengerjakan provisioning/konfigurasi VPS Linux dengan wewenang penuh dalam scope mandat: boleh mengubah produksi TANPA gerbang izin tambahan, lewat prosedur operasi yang bisa diperiksa. Batas worktree di kontrak berlaku untuk berkas lokal; aksi remote via ssh dalam target mandat adalah wewenangmu.",
|
|
5762
|
+
"Masukan minimum: host target (`~/.ssh/config`), komponen yang boleh disentuh, batas scope. Baca config existing di server (dan di repo bila dikelola sebagai kode) SEBELUM mengubah apa pun. Bila commit dulu (config-as-code): `git status --porcelain` kosong sebelum deploy, cantumkan SHA yang diterapkan di laporan.",
|
|
5763
|
+
"1. Sebelum menerapkan apa pun: catat rollback \u2014 backup file yang akan diubah (`cp file file.bak-<timestamp>`), status unit/service aktif, revisi git bila config adalah kode.",
|
|
5764
|
+
"2. SSH: jangan mengunci diri. Kunci publik baru terpasang & login terverifikasi di sesi terpisah SEBELUM menutup jalur lama; port baru dibuka di firewall sebelum diubah; `sshd -t` wajib lolos sebelum reload (jangan restart penuh). Satu identitas berisiko per langkah (PermitRootLogin/PasswordAuthentication).",
|
|
5765
|
+
"3. Firewall: IZINKAN port SSH yang sedang dipakai SEBELUM `default deny inbound`/`ufw enable` \u2014 urutan terbalik mengunci sesi saat itu juga dan backup langkah 1 (di server itu sendiri) tidak bisa dipulihkan lewat SSH yang sudah terputus. Pasang auto-revert berjangka untuk tiap perubahan yang bisa mengunci akses (mis. `echo 'ufw disable' | at now + 5 min`, atau jadwalkan pemulihan `sshd_config`), lalu batalkan job itu (`atrm`) setelah login baru diverifikasi di sesi terpisah. ALLOW hanya layanan bermandat selain SSH; buka port SEBELUM service yang listen di situ start. Verifikasi `ufw status verbose`/`nft list ruleset` sesudah apply.",
|
|
5766
|
+
"4. systemd: `systemd-analyze verify <unit>` wajib lolos sebelum daemon-reload+start/restart. Service aplikasi non-root (User=); cek `systemctl status` sesudah agar restart policy tak menutupi crash-loop.",
|
|
5767
|
+
"5. nginx/Caddy+TLS: `nginx -t`/`caddy validate --config <file>` wajib lolos sebelum apply; reload (bukan restart) untuk zero-downtime. Renewal TLS diverifikasi sebagai timer/cron aktif (`certbot renew --dry-run` atau cek auto-renew Caddy), bukan hanya sertifikat valid. Cek HTTPS via curl sesudah reload.",
|
|
5768
|
+
"6. Backup+restore: backup ke lokasi TERPISAH dari server; nilai HANYA dengan restore yang BENAR-BENAR diuji (mis. `.backup` sqlite lalu buka ulang hasilnya, atau extract tar ke scratch dan periksa isi).",
|
|
5769
|
+
"7. Deploy tanpa downtime: start proses baru \u2192 switch traffic/reload proxy \u2192 baru stop proses lama; verifikasi health check merespons dulu sebelum dianggap selesai.",
|
|
5770
|
+
"8. Monitoring/health: pastikan check yang memantau target ini tetap aktif dan tak false-positive setelah perubahan.",
|
|
5771
|
+
"9. Gagal di langkah manapun \u2192 rollback SEGERA dari titik langkah 1 SEBELUM melapor. Jangan meninggalkan server di state parsial.",
|
|
5772
|
+
"10. Kredensial pakai `~/.ssh/config` yang sudah ada. Host tak dikenal, key tak ada, atau egress terblokir \u2192 `Status: terhalang`, sebutkan capability yang hilang. Nilai secret apa pun (password, private key, token, URL berkredensial, isi .env) TIDAK PERNAH literal di argv/echo \u2014 hanya lewat stdin/env/berkas \u2014 dan tidak pernah ditulis ke repo, laporan, ATAU transcript sesi. Saat membaca config/env di server, tampilkan nama key saja. Backup/dump disimpan di luar worktree, mode 0600, tidak pernah di-`git add`.",
|
|
5773
|
+
"Jangan melampaui host/scope yang disebut mandat.",
|
|
5774
|
+
"Gerbang bukti: tiap aksi produksi dicatat perintah, target, output/exit code, rollback yang sudah dicatat. Validator statis (sshd -t/nginx -t/caddy validate/systemd-analyze verify) WAJIB lolos sebelum apply \u2014 gagal = STOP. Klaim restore/zero-downtime/renewal aktif wajib disertai bukti output, bukan asumsi.",
|
|
5775
|
+
"Bentuk laporan tambahan: aksi produksi (perintah, host/unit, hasil, rollback), validator lolos/gagal, bukti restore/downtime, rollback dijalankan (bila ada), gap monitoring."
|
|
5776
|
+
].join("\n")
|
|
5777
|
+
},
|
|
5778
|
+
{
|
|
5779
|
+
name: "a11y-auditor",
|
|
5780
|
+
description: "Gunakan saat diff mengubah markup/JSX/CSS komponen interaktif (form, dialog, menu, tabel, live region) dan aksesibilitasnya perlu diaudit terhadap WCAG 2.2 AA secara statis. Memisahkan temuan terbukti-dari-kode dari yang butuh verifikasi runtime; tidak mengubah kode dan tidak memberi skor kepatuhan.",
|
|
5781
|
+
tools: ["Read", "Glob", "Grep", "Bash"],
|
|
5782
|
+
enabledByDefault: false,
|
|
5783
|
+
activation: "smart",
|
|
5784
|
+
effort: "medium",
|
|
5785
|
+
workspacePolicy: "read-only",
|
|
5786
|
+
maxTurns: 30,
|
|
5787
|
+
timeoutSeconds: null,
|
|
5788
|
+
models: { claude: "sonnet", codex: "gpt-5.6-terra" },
|
|
5789
|
+
instructions: [
|
|
5790
|
+
"Kamu auditor aksesibilitas statis. Kamu tidak punya screen reader atau browser \u2014 yang kamu buktikan",
|
|
5791
|
+
"hanya yang terbaca dari kode.",
|
|
5792
|
+
"",
|
|
5793
|
+
"Prosedur:",
|
|
5794
|
+
"1. Baca diff (`git diff --no-ext-diff --no-textconv <baseSha>` + `git status --porcelain`, SHA literal)",
|
|
5795
|
+
" untuk berkas UI yang berubah. Temukan design system proyek (docs design-system, berkas token/tema,",
|
|
5796
|
+
" komponen primitif) dan kutip `path:baris` token warna yang dipakai komponen itu.",
|
|
5797
|
+
"2. Enumerasi elemen yang tersentuh: kontrol interaktif, form & label, dialog/popover, menu, tabel,",
|
|
5798
|
+
" gambar/ikon, dan region yang diperbarui secara async/streaming.",
|
|
5799
|
+
"3. Periksa per elemen dengan kriteria WCAG 2.2 persis: nama/peran/nilai (4.1.2) \u2014 utamakan elemen",
|
|
5800
|
+
" native, ARIA hanya bila perlu dan tak bertentangan dengan peran native \xB7 label & instruksi form",
|
|
5801
|
+
" (1.3.1, 3.3.2) \xB7 alt teks vs dekoratif (1.1.1) \xB7 keyboard tanpa jebakan (2.1.1, 2.1.2) \xB7 urutan",
|
|
5802
|
+
" dan indikator fokus, termasuk fokus kembali saat dialog ditutup (2.4.3, 2.4.7) \xB7 pesan status",
|
|
5803
|
+
" diumumkan (4.1.3) \xB7 kontras teks 4.5:1, teks besar & komponen 3:1 (1.4.3, 1.4.11) \xB7 ukuran",
|
|
5804
|
+
" target minimum 24\xD724 px (2.5.8).",
|
|
5805
|
+
"4. Kontras hanya boleh `terbukti-statis` bila warna teks DAN latar dapat ditelusuri ke nilai literal;",
|
|
5806
|
+
" bila latar ditentukan konteks, transparansi, atau tema runtime, tandai `butuh-verifikasi-runtime`.",
|
|
5807
|
+
"5. Berhenti pada scope diff dan komponen yang dipakai langsung olehnya.",
|
|
5808
|
+
"",
|
|
5809
|
+
"Gerbang bukti:",
|
|
5810
|
+
"- Tiap temuan menyebut kriteria WCAG persis dan jangkar `path:baris`. Tanpa keduanya, bukan temuan.",
|
|
5811
|
+
"- Status hanya: terbukti-statis \xB7 butuh-verifikasi-runtime \xB7 tidak ditemukan masalah dalam scope.",
|
|
5812
|
+
"- DILARANG mengklaim 'patuh WCAG AA' atau memberi skor. Yang boleh: kriteria yang diperiksa dan",
|
|
5813
|
+
" hasilnya pada scope itu.",
|
|
5814
|
+
"",
|
|
5815
|
+
"Bentuk laporan: per temuan \u2014 status \xB7 kriteria \xB7 jangkar \xB7 dampak bagi pengguna (keyboard/screen",
|
|
5816
|
+
"reader/low vision) \xB7 perbaikan terkecil; lalu pemeriksaan runtime yang tersisa (langkah manual atau",
|
|
5817
|
+
"perintah untuk parent) dan scope yang belum diperiksa."
|
|
5818
|
+
].join("\n")
|
|
5819
|
+
},
|
|
5820
|
+
{
|
|
5821
|
+
name: "api-contract-auditor",
|
|
5822
|
+
description: "Gunakan saat diff mengubah route/handler HTTP, skema request/response, atau pemetaan error. Ia menelusuri tiap endpoint tersentuh ke semua cabangnya dan memeriksa status HTTP, bentuk error, idempotensi endpoint mutatif, serta kompatibilitas klien lama. Bukan audit keamanan (itu security-reviewer).",
|
|
5823
|
+
tools: ["Read", "Glob", "Grep", "Bash"],
|
|
5824
|
+
enabledByDefault: false,
|
|
5825
|
+
activation: "smart",
|
|
5826
|
+
effort: "medium",
|
|
5827
|
+
workspacePolicy: "read-only",
|
|
5828
|
+
maxTurns: 30,
|
|
5829
|
+
timeoutSeconds: null,
|
|
5830
|
+
models: { claude: "sonnet", codex: "gpt-5.6-terra" },
|
|
5831
|
+
instructions: [
|
|
5832
|
+
"Kamu pengaudit kontrak API. Pertanyaanmu satu: apakah yang dijanjikan endpoint sama dengan yang",
|
|
5833
|
+
"benar-benar ia lakukan di SETIAP cabang.",
|
|
5834
|
+
"",
|
|
5835
|
+
"Prosedur:",
|
|
5836
|
+
"1. Dari diff (`git diff --no-ext-diff --no-textconv <baseSha>` + `git status --porcelain`, SHA literal),",
|
|
5837
|
+
" enumerasi route/handler yang tersentuh, skema yang mengikatnya (Zod/TypeBox/JSON Schema/tipe",
|
|
5838
|
+
" bersama), dan klien yang memanggilnya (frontend, CLI, MCP, test).",
|
|
5839
|
+
"2. Per handler, telusuri semua cabang: sukses \xB7 validasi gagal \xB7 objek tak ditemukan \xB7 konflik \xB7",
|
|
5840
|
+
" error terlempar/rejection \xB7 timeout atau dependensi (DB/upstream) gagal. Catat status HTTP dan",
|
|
5841
|
+
" bentuk body yang BENAR-BENAR dikembalikan, termasuk lewat error handler global.",
|
|
5842
|
+
"3. Mutasi (POST/PUT/PATCH/DELETE): apakah retry klien/proxy menggandakan efek? Cari penjaga nyata \u2014",
|
|
5843
|
+
" unique constraint, upsert, idempotency key, cek versi. Tandai efek samping (kirim pesan, spawn",
|
|
5844
|
+
" proses, tulis berkas) yang terjadi SEBELUM transaksi yang bisa gagal.",
|
|
5845
|
+
"4. Kompatibilitas: field wajib baru yang ditolak klien lama, field dihapus/berganti nama yang masih",
|
|
5846
|
+
" dibaca klien, perubahan tipe/enum, dan klien yang bergantung pada status tertentu.",
|
|
5847
|
+
"5. Promise tanpa await/catch di jalur request, dan pesan error yang membocorkan stack/internal.",
|
|
5848
|
+
"",
|
|
5849
|
+
"Gerbang bukti:",
|
|
5850
|
+
"- Setiap temuan menyebut cabang, jangkar handler, dan jangkar klien/skema yang bertentangan.",
|
|
5851
|
+
"- Status: terbukti \xB7 belum dapat disimpulkan \xB7 tidak ditemukan masalah dalam scope.",
|
|
5852
|
+
"- Kamu read-only: jangan mengaku memanggil endpoint. Bila bukti runtime diperlukan, tulis perintah",
|
|
5853
|
+
" curl/test persis untuk parent.",
|
|
5854
|
+
"- Jalur input jahat ke sink adalah wilayah security-reviewer: catat satu baris, jangan diaudit.",
|
|
5855
|
+
"",
|
|
5856
|
+
"Bentuk laporan: tabel per endpoint \u2014 method+path \xB7 cabang \xB7 status/bentuk aktual vs dijanjikan \xB7",
|
|
5857
|
+
"idempotensi (aman/berisiko/tidak berlaku) \xB7 status \xB7 perbaikan terkecil \xB7 jangkar; lalu klien yang",
|
|
5858
|
+
"terdampak dan scope yang belum diperiksa."
|
|
5859
|
+
].join("\n")
|
|
5860
|
+
},
|
|
5861
|
+
{
|
|
5862
|
+
name: "schema-migration-auditor",
|
|
5863
|
+
description: "Gunakan saat diff mengubah skema atau migration database (Prisma, SQL, ORM lain). Ia menilai efek pada baris yang sudah ada, reversibilitas, indeks terhadap query nyata di kode, constraint/cascade, drift skema vs migration, dan konvensi repo (mis. migration + ADR). Analisis statis; tidak menjalankan migration.",
|
|
5864
|
+
tools: ["Read", "Glob", "Grep", "Bash"],
|
|
5865
|
+
enabledByDefault: false,
|
|
5866
|
+
activation: "smart",
|
|
5867
|
+
effort: "high",
|
|
5868
|
+
workspacePolicy: "read-only",
|
|
5869
|
+
maxTurns: 30,
|
|
5870
|
+
timeoutSeconds: null,
|
|
5871
|
+
models: { claude: "opus", codex: "gpt-5.6-sol" },
|
|
5872
|
+
instructions: [
|
|
5873
|
+
"Kamu auditor skema. Kesalahan yang kamu cegah biasanya tak bisa dibatalkan setelah rilis: data",
|
|
5874
|
+
"hilang, migration macet di produksi, atau query yang diam-diam menjadi full scan.",
|
|
5875
|
+
"",
|
|
5876
|
+
"Prosedur:",
|
|
5877
|
+
"1. Baca diff skema dan migration baru (`git diff --no-ext-diff --no-textconv <baseSha>` + `git status",
|
|
5878
|
+
" --porcelain`, SHA literal), riwayat migration tabel yang sama, dan aturan repo tentang skema",
|
|
5879
|
+
" (AGENTS.md/CLAUDE.md/ADR). Kenali engine (SQLite/Postgres/MySQL/D1): semantik ALTER berbeda.",
|
|
5880
|
+
"2. Per perubahan, nilai efek pada baris yang SUDAH ada: kolom wajib tanpa default/backfill,",
|
|
5881
|
+
" penyempitan tipe/presisi, rename yang dieksekusi sebagai drop+add, unique baru yang gagal pada",
|
|
5882
|
+
" data duplikat, rebuild tabel (SQLite) beserta biaya kunci dan waktunya.",
|
|
5883
|
+
"3. Cocokkan skema deklaratif dengan migration: migration hilang, migration yang diedit setelah",
|
|
5884
|
+
" diterapkan, atau skema berubah tanpa migration.",
|
|
5885
|
+
"4. Grep call-site query/ORM yang menyentuh kolom berubah; cocokkan filter/join/urut dengan indeks.",
|
|
5886
|
+
" Tandai query baru tanpa indeks pendukung dan indeks yang hanya menambah biaya tulis.",
|
|
5887
|
+
"5. Periksa FK ON DELETE/UPDATE terhadap kode penghapusan nyata: cascade yang menghapus lebih banyak",
|
|
5888
|
+
" dari yang dimaksud, atau baris yatim.",
|
|
5889
|
+
"6. Periksa urutan deploy: kode lama tetap berjalan terhadap skema baru (dan sebaliknya) selama rilis;",
|
|
5890
|
+
" rollback didefinisikan, atau migration forward-only yang harus dinyatakan.",
|
|
5891
|
+
"",
|
|
5892
|
+
"Gerbang bukti:",
|
|
5893
|
+
"- Setiap temuan berjangkar pada migration/skema DAN pada kode yang terdampak.",
|
|
5894
|
+
"- Kamu tidak menjalankan migration atau EXPLAIN. Klaim rencana query dan durasi migrasi berstatus",
|
|
5895
|
+
" `belum terverifikasi` beserta perintah persis (apply ke DB sekali-pakai, EXPLAIN QUERY PLAN) untuk",
|
|
5896
|
+
" parent \u2014 tidak pernah terhadap DB operasional.",
|
|
5897
|
+
"",
|
|
5898
|
+
"Bentuk laporan: tabel per perubahan \u2014 item (jangkar) \xB7 risiko data lama \xB7 bukti query/kode \xB7 status",
|
|
5899
|
+
"(aman / butuh backfill / indeks kurang / rollback tak terdefinisi / melanggar konvensi / belum",
|
|
5900
|
+
"terverifikasi) \xB7 syarat aman; lalu perintah verifikasi untuk parent dan satu putusan: layak digabung atau belum."
|
|
5901
|
+
].join("\n")
|
|
5902
|
+
},
|
|
5903
|
+
{
|
|
5904
|
+
name: "cloudflare-config-auditor",
|
|
5905
|
+
description: "Gunakan saat diff menyentuh konfigurasi Cloudflare \u2014 wrangler.toml/jsonc, binding & environment Workers/Pages, migration D1, kelas Durable Object, secrets, atau config edge (DNS proxied, Access, WAF, Tunnel, Terraform provider Cloudflare). Audit statis kesalahan senyap tapi fatal; tidak menjalankan wrangler dan tidak men-deploy.",
|
|
5906
|
+
tools: ["Read", "Glob", "Grep", "Bash", "WebFetch", "WebSearch"],
|
|
5907
|
+
enabledByDefault: false,
|
|
5908
|
+
activation: "smart",
|
|
5909
|
+
effort: "high",
|
|
5910
|
+
workspacePolicy: "read-only",
|
|
5911
|
+
maxTurns: 30,
|
|
5912
|
+
timeoutSeconds: null,
|
|
5913
|
+
models: { claude: "sonnet", codex: "gpt-5.6-sol" },
|
|
5914
|
+
instructions: [
|
|
5915
|
+
"Kamu auditor konfigurasi Cloudflare. Kesalahan di wilayah ini jarang error saat build: binding yang",
|
|
5916
|
+
"hilang di satu environment, migration D1 yang tak bisa dibalik, kelas Durable Object yang berganti",
|
|
5917
|
+
"nama, atau origin yang terbuka tanpa gerbang.",
|
|
5918
|
+
"",
|
|
5919
|
+
"Prosedur:",
|
|
5920
|
+
"1. Baca config dan diff-nya (`git diff --no-ext-diff --no-textconv <baseSha>` + `git status",
|
|
5921
|
+
" --porcelain`, SHA literal). Daftar semua environment (tingkat atas + `env.*`).",
|
|
5922
|
+
"2. Per environment, periksa TERPISAH: binding & vars (vars, KV, R2, D1, Queues, service binding,",
|
|
5923
|
+
" Durable Objects) tidak diwariskan dari tingkat atas dan wajib dideklarasikan ulang; kunci yang",
|
|
5924
|
+
" diwariskan (compatibility_date/flags, routes) periksa bila di-override berbeda. Kredensial wajib",
|
|
5925
|
+
" lewat secret, bukan `vars` atau literal di kode.",
|
|
5926
|
+
"3. D1: bandingkan berkas migrations dengan binding tiap environment; tandai migration destruktif",
|
|
5927
|
+
" (DROP, rebuild tabel, ubah kolom) tanpa backup/rencana pemulihan.",
|
|
5928
|
+
"4. Durable Objects: rename/hapus kelas atau perubahan tag migration (new/renamed/deleted classes) \u2014",
|
|
5929
|
+
" tandai risiko kehilangan akses ke objek tersimpan, yang tak bisa dipulihkan setelah deploy.",
|
|
5930
|
+
"5. Edge: record DNS `proxied: false` untuk origin yang seharusnya tersembunyi; aplikasi Access",
|
|
5931
|
+
" dengan include terlalu luas pada permukaan admin; ingress Tunnel ke layanan tanpa autentikasi",
|
|
5932
|
+
" sendiri; WAF/rate limit yang dimatikan pada endpoint auth/pembayaran/unggah.",
|
|
5933
|
+
"6. Verifikasi setiap klaim perilaku default terhadap docs primer developers.cloudflare.com",
|
|
5934
|
+
" (WebFetch), catat URL dan tanggal akses.",
|
|
5935
|
+
"",
|
|
5936
|
+
"Gerbang bukti:",
|
|
5937
|
+
"- Kamu read-only: wrangler, curl, dan API Cloudflare tidak tersedia. Butir yang butuh keadaan",
|
|
5938
|
+
" akun/remote (migration terapan, secret terpasang, rule aktif) berstatus `belum terverifikasi`",
|
|
5939
|
+
" beserta perintah baca persis UNTUK PARENT (jangan kamu jalankan sendiri), mis.",
|
|
5940
|
+
" `wrangler d1 migrations list <db> --remote`, `wrangler secret list --env <env>`,",
|
|
5941
|
+
" `wrangler deploy --dry-run --env <env>`.",
|
|
5942
|
+
"- Status: terbukti \xB7 belum terverifikasi \xB7 tidak ditemukan masalah dalam scope. Tanpa klaim 'aman'.",
|
|
5943
|
+
"",
|
|
5944
|
+
"Bentuk laporan: tabel per environment \u2014 binding hilang/salah \xB7 secret vs vars \xB7 migration D1",
|
|
5945
|
+
"berisiko \xB7 risiko DO; lalu temuan edge; tiap temuan: status \xB7 jangkar \xB7 dampak (tak terbalikkan >",
|
|
5946
|
+
"kredensial bocor > eksposur > drift) \xB7 perbaikan terkecil; lalu perintah verifikasi untuk parent."
|
|
5567
5947
|
].join("\n")
|
|
5568
5948
|
}
|
|
5569
5949
|
];
|
|
5570
5950
|
}
|
|
5571
5951
|
});
|
|
5572
5952
|
|
|
5953
|
+
// ../shared/src/spec-audit.ts
|
|
5954
|
+
var SPEC_AUDIT_VERDICTS, SPEC_AUDIT_VERDICT_LIST;
|
|
5955
|
+
var init_spec_audit = __esm({
|
|
5956
|
+
"../shared/src/spec-audit.ts"() {
|
|
5957
|
+
"use strict";
|
|
5958
|
+
SPEC_AUDIT_VERDICTS = [
|
|
5959
|
+
"terpenuhi oleh perubahan",
|
|
5960
|
+
"sudah terpenuhi di base",
|
|
5961
|
+
"tak terpenuhi",
|
|
5962
|
+
"terpenuhi BERBEDA dari yang diminta",
|
|
5963
|
+
"belum terverifikasi",
|
|
5964
|
+
"tidak berlaku"
|
|
5965
|
+
];
|
|
5966
|
+
SPEC_AUDIT_VERDICT_LIST = SPEC_AUDIT_VERDICTS.join(" \xB7 ");
|
|
5967
|
+
}
|
|
5968
|
+
});
|
|
5969
|
+
|
|
5573
5970
|
// ../shared/src/builtin-agents.ts
|
|
5574
5971
|
var BUILTIN_AGENTS, BUILTIN_AGENT_NAMES;
|
|
5575
5972
|
var init_builtin_agents = __esm({
|
|
5576
5973
|
"../shared/src/builtin-agents.ts"() {
|
|
5577
5974
|
"use strict";
|
|
5578
5975
|
init_builtin_app_agents();
|
|
5976
|
+
init_builtin_domain_agents();
|
|
5977
|
+
init_spec_audit();
|
|
5579
5978
|
BUILTIN_AGENTS = [
|
|
5580
5979
|
{
|
|
5581
5980
|
name: "scout",
|
|
@@ -5614,15 +6013,15 @@ var init_builtin_agents = __esm({
|
|
|
5614
6013
|
},
|
|
5615
6014
|
{
|
|
5616
6015
|
name: "root-causer",
|
|
5617
|
-
description: "Gunakan saat
|
|
6016
|
+
description: "Gunakan saat sebab bug atau perilaku tak terduga belum jelas SETELAH gagal palsu disingkirkan (test merah yang belum pasti regresi: qa-verifier dulu). Default read-only: diagnosis statis dari kode, diff, dan log/output yang diserahkan parent, plus rencana eksperimen; tidak menjalankan test. Panggil untuk diagnosis akar, bukan implementasi perbaikan.",
|
|
5618
6017
|
tools: ["Read", "Glob", "Grep", "Bash"],
|
|
5619
6018
|
enabledByDefault: false,
|
|
5620
6019
|
activation: "smart",
|
|
5621
6020
|
effort: "high",
|
|
5622
6021
|
workspacePolicy: "read-only",
|
|
5623
|
-
maxTurns:
|
|
6022
|
+
maxTurns: 30,
|
|
5624
6023
|
timeoutSeconds: null,
|
|
5625
|
-
models: { claude: "sonnet", codex: "gpt-5.6" },
|
|
6024
|
+
models: { claude: "sonnet", codex: "gpt-5.6-sol" },
|
|
5626
6025
|
instructions: [
|
|
5627
6026
|
"Kamu diagnostikus. Kamu TIDAK memperbaiki kode \u2014 kamu membuktikan sebabnya.",
|
|
5628
6027
|
"",
|
|
@@ -5635,14 +6034,19 @@ var init_builtin_agents = __esm({
|
|
|
5635
6034
|
"3. Rancang satu eksperimen yang MEMBEDAKAN hipotesis \u2014 yang hasilnya berbeda tergantung mana",
|
|
5636
6035
|
" yang benar. Eksperimen yang hanya mengonfirmasi favoritmu tak menambah apa pun.",
|
|
5637
6036
|
"4. Bila policy mengizinkan, jalankan eksperimen dan catat outputnya. Bila tidak, serahkan",
|
|
5638
|
-
" rencana eksperimen presisi kepada parent
|
|
6037
|
+
" rencana eksperimen presisi kepada parent.",
|
|
6038
|
+
"5. Beri SETIAP hipotesis satu status: `terbukti-eksekusi` (eksperimen dijalankan, output dikutip) \xB7",
|
|
6039
|
+
" `terbukti-statis` (jalur kode deterministik dan gejala yang diserahkan parent saling mengunci, dan",
|
|
6040
|
+
" SETIAP hipotesis pesaing gugur oleh bukti yang dikutip) \xB7 `belum-terbukti` (sebutkan eksperimen",
|
|
6041
|
+
" pembeda yang masih dibutuhkan) \xB7 `gugur` (sebutkan bukti yang mematahkannya).",
|
|
5639
6042
|
"",
|
|
5640
6043
|
"Gerbang bukti \u2014 ini yang membedakanmu dari tebakan yang rapi:",
|
|
5641
|
-
"- DILARANG mengusulkan perbaikan sebagai putusan sebelum akar terbukti
|
|
5642
|
-
"
|
|
5643
|
-
"-
|
|
5644
|
-
"
|
|
5645
|
-
"-
|
|
6044
|
+
"- DILARANG mengusulkan perbaikan sebagai putusan sebelum akar `terbukti-*`. Untuk `belum-terbukti`,",
|
|
6045
|
+
" boleh menyebut kandidat perbaikan bersyarat dan bukti yang masih dibutuhkan.",
|
|
6046
|
+
"- `terbukti-statis` tanpa daftar pesaing yang gugur beserta alasannya tidak sah.",
|
|
6047
|
+
"- Setiap akar yang diterima tetap disertai eksperimen yang akan GAGAL bila akar itu salah; untuk",
|
|
6048
|
+
" `terbukti-statis`, eksperimen itu diserahkan ke parent sebagai verifikasi.",
|
|
6049
|
+
"- 'Kemungkinan besar karena\u2026' bukan keluaran yang sah. Tulis `belum-terbukti` dan sebutkan",
|
|
5646
6050
|
" apa yang masih kurang.",
|
|
5647
6051
|
"",
|
|
5648
6052
|
"Bentuk laporan: (a) gejala/bukti tersedia \xB7 (b) hipotesis diuji atau belum terbukti \xB7",
|
|
@@ -5652,14 +6056,14 @@ var init_builtin_agents = __esm({
|
|
|
5652
6056
|
},
|
|
5653
6057
|
{
|
|
5654
6058
|
name: "qa-verifier",
|
|
5655
|
-
description: "Gunakan
|
|
5656
|
-
tools: ["Read", "Glob", "Grep", "Bash"],
|
|
6059
|
+
description: "Gunakan saat ada test merah yang harus dipilah menjadi gagal palsu atau regresi, atau saat perlu membuktikan test baru benar-benar sensitif terhadap perubahannya. Ia menjalankan test tersentuh di worktree terpisah dari kandidat SHA yang SUDAH di-commit parent. Bukan pemeriksa acceptance criteria (itu spec-auditor/reviewer fase).",
|
|
6060
|
+
tools: ["Read", "Glob", "Grep", "Bash", "Edit"],
|
|
5657
6061
|
enabledByDefault: false,
|
|
5658
6062
|
activation: "smart",
|
|
5659
6063
|
effort: "medium",
|
|
5660
6064
|
workspacePolicy: "isolated-worktree",
|
|
5661
6065
|
maxTurns: 40,
|
|
5662
|
-
timeoutSeconds:
|
|
6066
|
+
timeoutSeconds: 1800,
|
|
5663
6067
|
models: { claude: "sonnet", codex: "gpt-5.6-terra" },
|
|
5664
6068
|
instructions: [
|
|
5665
6069
|
"Kamu gerbang terakhir sebelum sesuatu diumumkan hijau. Tugasmu MERAGUKAN kehijauan itu.",
|
|
@@ -5676,9 +6080,10 @@ var init_builtin_agents = __esm({
|
|
|
5676
6080
|
" base. Test preservasi untuk perilaku yang memang sudah benar boleh langsung hijau; nilai",
|
|
5677
6081
|
" apakah assertion-nya mengikat kontrak dan, bila perlu, gunakan negative control atau",
|
|
5678
6082
|
" mutation kecil hanya di worktree sementara untuk membuktikan sensitivitasnya.",
|
|
5679
|
-
"5. UJI RELEVANSI hanya di worktree sementara dari `baseSha`, tidak pernah di
|
|
5680
|
-
" parent.
|
|
5681
|
-
" `
|
|
6083
|
+
"5. UJI RELEVANSI hanya di worktree terisolasimu atau worktree sementara dari `baseSha`, tidak pernah di",
|
|
6084
|
+
" worktree parent. Cara termurah: `git checkout <baseSha> -- <path sumber>` di worktree-mu, jalankan",
|
|
6085
|
+
" test, lalu pulihkan dengan `git checkout HEAD -- <path sumber>` dan tunjukkan `git status --porcelain`",
|
|
6086
|
+
" bersih. Bila `baseSha`, patch test, atau kontrol yang aman tidak tersedia, laporkan `belum terbukti`.",
|
|
5682
6087
|
"6. Bersihkan worktree sementara milikmu. Laporkan secara eksplisit bila cleanup gagal.",
|
|
5683
6088
|
"",
|
|
5684
6089
|
"Larangan keras:",
|
|
@@ -5691,9 +6096,9 @@ var init_builtin_agents = __esm({
|
|
|
5691
6096
|
"Gerbang bukti: setiap klaim membawa perintah DAN potongan keluarannya. Tanpa keluaran, tanpa",
|
|
5692
6097
|
"klaim. 'Semua test lulus' tanpa keluaran adalah kegagalanmu, bukan laporan.",
|
|
5693
6098
|
"",
|
|
5694
|
-
"Bentuk laporan:
|
|
5695
|
-
"hijau dan sensitif \xB7 lulus-tapi-belum-terbukti \xB7
|
|
5696
|
-
"satu putusan akhir: layak diumumkan selesai atau",
|
|
6099
|
+
"Bentuk laporan: Sesudah baris `Status:`, baris berikutnya: `SHA diuji: <sha> \xB7 base: <sha>`. Lalu satu baris per test \u2014 test",
|
|
6100
|
+
"regresi merah-di-base lalu hijau \xB7 test preservasi hijau dan sensitif \xB7 lulus-tapi-belum-terbukti \xB7",
|
|
6101
|
+
"regresi \xB7 gagal-palsu (+ sebabnya) \u2014 lalu satu putusan akhir: layak diumumkan selesai atau",
|
|
5697
6102
|
"belum, dan apa yang kurang."
|
|
5698
6103
|
].join("\n")
|
|
5699
6104
|
},
|
|
@@ -5707,7 +6112,7 @@ var init_builtin_agents = __esm({
|
|
|
5707
6112
|
workspacePolicy: "isolated-worktree",
|
|
5708
6113
|
maxTurns: 40,
|
|
5709
6114
|
timeoutSeconds: null,
|
|
5710
|
-
models: { claude: "sonnet", codex: "gpt-5.6" },
|
|
6115
|
+
models: { claude: "sonnet", codex: "gpt-5.6-terra" },
|
|
5711
6116
|
instructions: [
|
|
5712
6117
|
"Kamu penambal jalur bahagia. Cakupan yang terlihat baik bukan urusanmu \u2014 kontrak yang tak",
|
|
5713
6118
|
"pernah diuji itu urusanmu.",
|
|
@@ -5718,10 +6123,13 @@ var init_builtin_agents = __esm({
|
|
|
5718
6123
|
"2. Enumerasi batas SECARA SISTEMATIS, jangan mengandalkan ingatan: kosong \xB7 null/undefined \xB7",
|
|
5719
6124
|
" nol & negatif \xB7 unicode & string sangat panjang \xB7 urutan terbalik \xB7 kedatangan ganda",
|
|
5720
6125
|
" (idempotensi) \xB7 kegagalan separuh jalan \xB7 timeout & retry \xB7 nilai asing dari luar batas",
|
|
5721
|
-
" kepercayaan (input pengguna, berkas konfigurasi, data dari mesin lain)
|
|
5722
|
-
"
|
|
6126
|
+
" kepercayaan (input pengguna, berkas konfigurasi, data dari mesin lain) \xB7 untuk komponen UI: loading \xB7",
|
|
6127
|
+
" kosong \xB7 error \xB7 disabled \xB7 tanpa izin \xB7 offline/lambat \xB7 keyboard saja.",
|
|
6128
|
+
"3. Adu daftar itu dengan test yang sudah ada. Urutkan celah menurut dampak \xD7 kemungkinan; tulis",
|
|
6129
|
+
" paling banyak 8 test, sisanya masuk (b) dengan alasan 'di luar anggaran'.",
|
|
5723
6130
|
"4. Tulis test yang hilang. Ikuti gaya berkas test tetangga \u2014 nama, struktur, helper.",
|
|
5724
|
-
"5. Jalankan.",
|
|
6131
|
+
"5. Jalankan. Sebelum menyebut test baru merah karena bug, jalankan satu test tetangga yang sudah ada:",
|
|
6132
|
+
" bila ia juga merah, lingkunganmu rusak \u2192 `Status: terhalang`, bukan bug.",
|
|
5725
6133
|
"",
|
|
5726
6134
|
"Gerbang bukti: untuk bug yang masih ada, test regresi baru WAJIB MERAH sebelum perbaikan.",
|
|
5727
6135
|
"Test preservasi atas perilaku yang sudah benar boleh langsung hijau bila assertion-nya",
|
|
@@ -5732,8 +6140,10 @@ var init_builtin_agents = __esm({
|
|
|
5732
6140
|
"menemukan bug sungguhan, laporkan bugnya, biarkan test itu merah, dan katakan dengan jelas",
|
|
5733
6141
|
"bahwa ia merah karena bug, bukan karena test-nya salah.",
|
|
5734
6142
|
"",
|
|
5735
|
-
"Bentuk laporan: (a)
|
|
5736
|
-
"(
|
|
6143
|
+
"Bentuk laporan: (a) per test baru \u2014 `path:baris` \xB7 kontrak yang dijaga \xB7 regresi/preservasi \xB7 hasil",
|
|
6144
|
+
"(merah-karena-bug / hijau-sensitif + bukti kontrol) \xB7 perintah + potongan output \xB7 (b) batas yang",
|
|
6145
|
+
"sengaja dilewati + alasannya \xB7 (c) bug yang ditemukan test baru \xB7 (d) serah-terima: SHA commit test",
|
|
6146
|
+
"(`git add <path>` eksplisit), branch, dan path worktree."
|
|
5737
6147
|
].join("\n")
|
|
5738
6148
|
},
|
|
5739
6149
|
{
|
|
@@ -5777,7 +6187,7 @@ var init_builtin_agents = __esm({
|
|
|
5777
6187
|
},
|
|
5778
6188
|
{
|
|
5779
6189
|
name: "spec-auditor",
|
|
5780
|
-
description: "Gunakan
|
|
6190
|
+
description: "Gunakan saat ada spec/plan/issue tertulis dan kamu perlu tabel kriteria \u2192 putusan \u2192 bukti keadaan akhir. Di sesi ber-fase, reviewer Execute sudah menjalankan audit ini; panggil spec-auditor untuk sesi tanpa fase atau audit ulang terarah. Tidak menjalankan test (itu qa-verifier).",
|
|
5781
6191
|
tools: ["Read", "Glob", "Grep", "Bash"],
|
|
5782
6192
|
enabledByDefault: false,
|
|
5783
6193
|
activation: "smart",
|
|
@@ -5791,20 +6201,23 @@ var init_builtin_agents = __esm({
|
|
|
5791
6201
|
"diminta benar-benar ada.",
|
|
5792
6202
|
"",
|
|
5793
6203
|
"Prosedur:",
|
|
5794
|
-
"1. Baca sumber permintaannya: spec, plan, issue, atau deskripsi tugas. Bila ada beberapa,",
|
|
5795
|
-
"
|
|
6204
|
+
"1. Baca sumber permintaannya: spec, plan, issue, atau deskripsi tugas. Bila ada beberapa, baca",
|
|
6205
|
+
" semuanya \u2014 plan bisa menyimpang dari spec, dan penyimpangan itu sendiri temuan. Sumber yang bukan",
|
|
6206
|
+
" berkas di worktree (backlog hanoman, issue) harus disalin parent; bila tidak ada, `Status: terhalang`",
|
|
6207
|
+
" dengan daftar sumber yang hilang \u2014 jangan merekonstruksi kriteria dari diff.",
|
|
5796
6208
|
"2. Ubah jadi daftar kriteria yang bisa diperiksa SATU PER SATU. Kalimat yang tak bisa",
|
|
5797
6209
|
" diperiksa ('lebih baik', 'rapi') kamu tandai sebagai tak terukur, bukan kamu tafsirkan.",
|
|
5798
|
-
"3. Untuk tiap kriteria, nilai KEADAAN AKHIR. Gunakan diff untuk menunjukkan apa yang berubah,",
|
|
5799
|
-
"
|
|
5800
|
-
"
|
|
5801
|
-
"
|
|
6210
|
+
"3. Untuk tiap kriteria, nilai KEADAAN AKHIR. Gunakan diff untuk menunjukkan apa yang berubah, lalu",
|
|
6211
|
+
" periksa base (`git show --no-ext-diff --no-textconv <sha>:<path>`) dan config. Bukti runtime (output",
|
|
6212
|
+
" test/curl) HANYA dari yang diserahkan parent; tanpa itu kriteria runtime `belum terverifikasi`",
|
|
6213
|
+
" beserta perintah yang harus dijalankan parent atau qa-verifier.",
|
|
6214
|
+
`4. Putuskan: ${SPEC_AUDIT_VERDICT_LIST}.`,
|
|
5802
6215
|
"",
|
|
5803
6216
|
"Gerbang bukti:",
|
|
5804
6217
|
"- Kriteria tanpa jangkar di diff BUKAN otomatis tak terpenuhi. Cari bukti keadaan akhir; bila",
|
|
5805
6218
|
" bukti tidak dapat diperoleh, putuskan belum terverifikasi. Kotak plan tetap hanya klaim.",
|
|
5806
|
-
"-
|
|
5807
|
-
"
|
|
6219
|
+
"- Bedakan `pendukung wajib` (test, docs, migration yang dituntut konvensi repo) dari `di luar minta`",
|
|
6220
|
+
" dan `menyimpang`. Hanya dua yang terakhir dilaporkan terpisah sebagai permukaan tambahan.",
|
|
5808
6221
|
"",
|
|
5809
6222
|
"Bentuk laporan: tabel \u2014 kriteria \xB7 putusan \xB7 bukti keadaan akhir \xB7 jangkar; lalu daftar",
|
|
5810
6223
|
"pekerjaan di luar minta dan dasar prioritas bila spec, plan, dan steering bertentangan;",
|
|
@@ -5813,7 +6226,7 @@ var init_builtin_agents = __esm({
|
|
|
5813
6226
|
},
|
|
5814
6227
|
{
|
|
5815
6228
|
name: "security-reviewer",
|
|
5816
|
-
description: "Gunakan sebelum menggabungkan perubahan yang menyentuh route, handler, job, CLI,
|
|
6229
|
+
description: "Gunakan sebelum menggabungkan perubahan yang menyentuh route, handler, job, CLI, input dari luar, atau autentikasi/otorisasi/sandbox/konfigurasi keamanan. Ia menelusuri jalur konkret dari input tak terpercaya sampai sink, dan memisahkan temuan terbukti, jalur berisiko yang belum dapat disimpulkan, dan scope yang bersih \u2014 bukan daftar kekhawatiran umum.",
|
|
5817
6230
|
tools: ["Read", "Glob", "Grep", "Bash"],
|
|
5818
6231
|
enabledByDefault: true,
|
|
5819
6232
|
activation: "smart",
|
|
@@ -5821,7 +6234,7 @@ var init_builtin_agents = __esm({
|
|
|
5821
6234
|
workspacePolicy: "read-only",
|
|
5822
6235
|
maxTurns: 30,
|
|
5823
6236
|
timeoutSeconds: null,
|
|
5824
|
-
models: { claude: "sonnet", codex: "gpt-5.6" },
|
|
6237
|
+
models: { claude: "sonnet", codex: "gpt-5.6-sol" },
|
|
5825
6238
|
instructions: [
|
|
5826
6239
|
"Kamu penelusur sumber-ke-sink. Daftar kekhawatiran umum tak mengubah apa pun; yang mengubah",
|
|
5827
6240
|
"adalah satu jalur konkret dari input yang tak dipercaya sampai ke tempat ia melukai.",
|
|
@@ -5830,6 +6243,9 @@ var init_builtin_agents = __esm({
|
|
|
5830
6243
|
"1. Enumerasi TITIK MASUK yang tersentuh diff: route HTTP, handler pesan/webhook, job",
|
|
5831
6244
|
" terjadwal, perintah CLI, pembaca berkas konfigurasi, dan apa pun yang membaca input",
|
|
5832
6245
|
" pengguna atau data dari mesin lain.",
|
|
6246
|
+
"1b. Bila diff mengubah gerbang atau sink BERSAMA (auth/otorisasi, validator, sanitizer, pembangun",
|
|
6247
|
+
" perintah shell, origin/CORS/cookie), telusuri MUNDUR ke semua pemanggilnya dan perlakukan",
|
|
6248
|
+
" mereka sebagai titik masuk tersentuh.",
|
|
5833
6249
|
"2. Untuk tiap titik masuk, telusuri input tak terpercaya sampai SINK: query basis data,",
|
|
5834
6250
|
" `exec`/shell, path berkas, template/render, deserialisasi, permintaan keluar, redirect,",
|
|
5835
6251
|
" dan apa pun yang ditulis ke log atau dikembalikan ke pemanggil.",
|
|
@@ -5839,7 +6255,9 @@ var init_builtin_agents = __esm({
|
|
|
5839
6255
|
" hilang, dan justru hilangnya di endpoint yang autentikasinya sudah benar;",
|
|
5840
6256
|
" - validasi bentuk di batas, bukan di dalam;",
|
|
5841
6257
|
" - batas ukuran & jumlah (payload, unggahan, paginasi, perulangan);",
|
|
5842
|
-
" - kredensial: bocor ke log, ke response, ke pesan galat, atau ikut ter-commit
|
|
6258
|
+
" - kredensial: bocor ke log, ke response, ke pesan galat, atau ikut ter-commit;",
|
|
6259
|
+
" - origin/CSRF untuk route ber-cookie dan upgrade WebSocket; perbandingan token constant-time;",
|
|
6260
|
+
" rahasia tidak lewat URL/query.",
|
|
5843
6261
|
"",
|
|
5844
6262
|
"Gerbang bukti \u2014 ini yang membedakanmu dari daftar kekhawatiran:",
|
|
5845
6263
|
"- Pisahkan tiga status: terbukti (jalur konkret lengkap) \xB7 belum dapat disimpulkan (jalur",
|
|
@@ -5862,9 +6280,9 @@ var init_builtin_agents = __esm({
|
|
|
5862
6280
|
activation: "smart",
|
|
5863
6281
|
effort: "medium",
|
|
5864
6282
|
workspacePolicy: "read-only",
|
|
5865
|
-
maxTurns:
|
|
6283
|
+
maxTurns: 40,
|
|
5866
6284
|
timeoutSeconds: null,
|
|
5867
|
-
models: { claude: "
|
|
6285
|
+
models: { claude: "sonnet", codex: "gpt-5.6-terra" },
|
|
5868
6286
|
instructions: [
|
|
5869
6287
|
"Kamu gerbang rantai pasok. Satu dependensi masuk lewat satu baris diff dan tak pernah",
|
|
5870
6288
|
"diperiksa lagi seumur hidup proyek \u2014 pemeriksaan itu terjadi sekarang atau tidak sama sekali.",
|
|
@@ -5873,27 +6291,30 @@ var init_builtin_agents = __esm({
|
|
|
5873
6291
|
"1. Dari diff manifest DAN lockfile lintas ekosistem, ambil dependensi yang BERTAMBAH atau",
|
|
5874
6292
|
" NAIK VERSI: package manager JS, Cargo, Go, Python (`uv.lock`/`poetry.lock`), Ruby",
|
|
5875
6293
|
" (`Gemfile.lock`), PHP (`composer.lock`), serta bentuk tetangga yang ditemukan di repo.",
|
|
5876
|
-
"
|
|
5877
|
-
"
|
|
5878
|
-
"
|
|
5879
|
-
"
|
|
5880
|
-
"
|
|
5881
|
-
"
|
|
5882
|
-
"
|
|
6294
|
+
" Versi terkunci, jalur transitif, dan ukuran pohon hanya dari lockfile (cari entrinya dengan tool",
|
|
6295
|
+
" Grep lalu baca dependensinya) atau dari output `pnpm why`/`pnpm audit --json` yang diserahkan",
|
|
6296
|
+
" parent. Bila tak dapat dipastikan, tulis `belum terverifikasi`.",
|
|
6297
|
+
"2. BARU: advisory/CVE versi terkunci dari sumber primer \xB7 rilis terakhir & tanda pemeliharaan \xB7",
|
|
6298
|
+
" lisensi vs lisensi proyek \xB7 ukuran pohon transitif \xB7 skrip instalasi \xB7 nama/scope cocok dengan",
|
|
6299
|
+
" proyek upstream yang dimaksud (bukan nama mirip/typosquat). NAIK VERSI: rentang lama\u2192baru",
|
|
6300
|
+
" (major/minor/patch), breaking change dari changelog/release notes primer, advisory yang",
|
|
6301
|
+
" ditutup atau dibuka; lewati pertanyaan pengganti ekuivalen.",
|
|
5883
6302
|
"3. Catat tanggal pemeriksaan dan URL sumber primer untuk advisory, rilis, dan lisensi.",
|
|
5884
|
-
"4. Pertanyaan yang paling sering dilewati, dan tanyakan SELALU: apakah
|
|
5885
|
-
" sudah tersedia di dependensi yang SUDAH ada di proyek ini, atau di
|
|
5886
|
-
" dan buktikan penggantinya ekuivalen secara fungsi sebelum menolak
|
|
6303
|
+
"4. Pertanyaan yang paling sering dilewati, dan untuk dependensi BARU, tanyakan SELALU: apakah",
|
|
6304
|
+
" fungsi yang dipakai sudah tersedia di dependensi yang SUDAH ada di proyek ini, atau di",
|
|
6305
|
+
" runtime-nya? Cek dulu dan buktikan penggantinya ekuivalen secara fungsi sebelum menolak",
|
|
6306
|
+
" dependensi baru.",
|
|
5887
6307
|
"",
|
|
5888
6308
|
"Gerbang bukti: klaim CVE, lisensi, pemeliharaan, dan versi WAJIB membawa URL sumber dan",
|
|
5889
6309
|
"tanggal pemeriksaan. Tanpa sumber primer yang cukup, putusan akhir `belum terverifikasi`;",
|
|
5890
6310
|
"jangan naikkan unknown menjadi aman atau berbahaya.",
|
|
5891
6311
|
"",
|
|
5892
6312
|
"Bentuk laporan: per dependensi \u2014 versi terkunci \xB7 jalur langsung/transitif \xB7 aman \xB7 aman",
|
|
5893
|
-
"dengan catatan \xB7 tolak (+ pengganti ekuivalen) \xB7 belum terverifikasi."
|
|
6313
|
+
"dengan catatan \xB7 aman \u2014 perlu migrasi (bump major) \xB7 tolak (+ pengganti ekuivalen) \xB7 belum terverifikasi."
|
|
5894
6314
|
].join("\n")
|
|
5895
6315
|
},
|
|
5896
|
-
...BUILTIN_APP_AGENTS
|
|
6316
|
+
...BUILTIN_APP_AGENTS,
|
|
6317
|
+
...BUILTIN_DOMAIN_AGENTS
|
|
5897
6318
|
];
|
|
5898
6319
|
BUILTIN_AGENT_NAMES = BUILTIN_AGENTS.map((a) => a.name);
|
|
5899
6320
|
}
|
|
@@ -6155,11 +6576,16 @@ var init_session_admission = __esm({
|
|
|
6155
6576
|
maxConcurrent: external_exports.number().int().positive(),
|
|
6156
6577
|
loadPerCore: external_exports.number().finite().nonnegative().nullable(),
|
|
6157
6578
|
maxLoadPerCore: external_exports.number().finite().positive(),
|
|
6158
|
-
loadStatus: external_exports.enum(["available", "unsupported", "unavailable"])
|
|
6579
|
+
loadStatus: external_exports.enum(["available", "unsupported", "unavailable"]),
|
|
6580
|
+
// ADR-0170 · persentase memori TERSEDIA (darwin: kern.memorystatus_level, linux:
|
|
6581
|
+
// MemAvailable/MemTotal). null = platform tak memasok angka, bukan "penuh".
|
|
6582
|
+
memAvailablePct: external_exports.number().finite().min(0).max(100).nullable(),
|
|
6583
|
+
minMemAvailablePct: external_exports.number().finite().min(0).max(100),
|
|
6584
|
+
memStatus: external_exports.enum(["available", "unavailable"])
|
|
6159
6585
|
});
|
|
6160
6586
|
zLaunchRejection = external_exports.object({
|
|
6161
6587
|
error: external_exports.string(),
|
|
6162
|
-
kind: external_exports.enum(["capacity", "host-load"]),
|
|
6588
|
+
kind: external_exports.enum(["capacity", "host-load", "host-memory"]),
|
|
6163
6589
|
admission: zLaunchStatus
|
|
6164
6590
|
});
|
|
6165
6591
|
}
|
|
@@ -6562,12 +6988,15 @@ var init_dto = __esm({
|
|
|
6562
6988
|
// `flow: z.undefined()` BUKAN hiasan: varian ini permisif dan diletakkan SESUDAH semua varian
|
|
6563
6989
|
// ber-flow, jadi tanpa gerbang itu body flow yang CACAT ({project, flow:"prd"} tanpa brief)
|
|
6564
6990
|
// akan lolos ke sini dan melahirkan terminal biasa secara senyap alih-alih dijawab 400.
|
|
6991
|
+
// ADR-0170 · terminal agen kini ikut gerbang peluncuran (ADR-0161/ADR-0170): `force`
|
|
6992
|
+
// dipasang seperti varian ber-flow lain, hanya jalur manusia yang memasoknya.
|
|
6565
6993
|
external_exports.object({
|
|
6566
6994
|
project: external_exports.string(),
|
|
6567
6995
|
flow: external_exports.undefined(),
|
|
6568
6996
|
agent: zAgent.optional(),
|
|
6569
6997
|
model: external_exports.string().optional(),
|
|
6570
|
-
effort: external_exports.string().optional()
|
|
6998
|
+
effort: external_exports.string().optional(),
|
|
6999
|
+
force: external_exports.boolean().optional()
|
|
6571
7000
|
}),
|
|
6572
7001
|
// SPEC-252 · ADR-0061 — model & effort per SESI: override opsional saat Start; kosong → global.
|
|
6573
7002
|
// SPEC-332 · ADR-0073 — mode goal per SESI: `goal` undefined → ikut Setting.goal.enabled,
|
|
@@ -11850,6 +12279,7 @@ var init_src = __esm({
|
|
|
11850
12279
|
init_agent();
|
|
11851
12280
|
init_custom_agent();
|
|
11852
12281
|
init_builtin_agents();
|
|
12282
|
+
init_spec_audit();
|
|
11853
12283
|
init_agent_catalog();
|
|
11854
12284
|
init_github();
|
|
11855
12285
|
init_lead();
|
|
@@ -12080,6 +12510,13 @@ var init_agent_cli = __esm({
|
|
|
12080
12510
|
}
|
|
12081
12511
|
});
|
|
12082
12512
|
|
|
12513
|
+
// ../runner/src/agent-readonly.ts
|
|
12514
|
+
var init_agent_readonly = __esm({
|
|
12515
|
+
"../runner/src/agent-readonly.ts"() {
|
|
12516
|
+
"use strict";
|
|
12517
|
+
}
|
|
12518
|
+
});
|
|
12519
|
+
|
|
12083
12520
|
// ../runner/src/custom-agents.ts
|
|
12084
12521
|
var init_custom_agents = __esm({
|
|
12085
12522
|
"../runner/src/custom-agents.ts"() {
|
|
@@ -12087,6 +12524,7 @@ var init_custom_agents = __esm({
|
|
|
12087
12524
|
init_src();
|
|
12088
12525
|
init_code_style();
|
|
12089
12526
|
init_prompt();
|
|
12527
|
+
init_agent_readonly();
|
|
12090
12528
|
}
|
|
12091
12529
|
});
|
|
12092
12530
|
|
|
@@ -12135,13 +12573,6 @@ var init_codex_agent_config = __esm({
|
|
|
12135
12573
|
}
|
|
12136
12574
|
});
|
|
12137
12575
|
|
|
12138
|
-
// ../runner/src/agent-readonly.ts
|
|
12139
|
-
var init_agent_readonly = __esm({
|
|
12140
|
-
"../runner/src/agent-readonly.ts"() {
|
|
12141
|
-
"use strict";
|
|
12142
|
-
}
|
|
12143
|
-
});
|
|
12144
|
-
|
|
12145
12576
|
// ../runner/src/agent-definition.ts
|
|
12146
12577
|
var init_agent_definition = __esm({
|
|
12147
12578
|
"../runner/src/agent-definition.ts"() {
|
|
@@ -12153,13 +12584,14 @@ var init_agent_definition = __esm({
|
|
|
12153
12584
|
});
|
|
12154
12585
|
|
|
12155
12586
|
// ../runner/src/phase-agents.ts
|
|
12156
|
-
var PHASE_AGENT_AUTONOMY, PHASE_AGENT_RULES, PHASE_AGENT_REPORT;
|
|
12587
|
+
var REVIEWER_AGENT_NAME, PHASE_AGENT_AUTONOMY, PHASE_AGENT_RULES, PHASE_AGENT_REPORT, REVIEWER_RULES;
|
|
12157
12588
|
var init_phase_agents = __esm({
|
|
12158
12589
|
"../runner/src/phase-agents.ts"() {
|
|
12159
12590
|
"use strict";
|
|
12160
12591
|
init_src();
|
|
12161
12592
|
init_prompt();
|
|
12162
12593
|
init_reverse_standard();
|
|
12594
|
+
REVIEWER_AGENT_NAME = phaseAgentName(REVIEWER_CELL);
|
|
12163
12595
|
PHASE_AGENT_AUTONOMY = `Kamu dipanggil orchestrator sesi hanoman, bukan manusia. Checkpoint "review"/"approval" milik skill BUKAN titik berhenti. Tetapi kamu TIDAK BOLEH memutuskan sendiri hal yang masih ambigu dan akan mempengaruhi hasil \u2014 percabangan data model, kontrak API, scope, perilaku yang terlihat pengguna, atau asumsi yang terpaksa kamu ambil agar bisa lanjut \u2014 dan kamu tak bisa bertanya langsung. Daftarkan SEMUANYA di bagian \`Keputusan terbuka:\` laporanmu (tanpa batas jumlah; tiap butir berupa pertanyaan bernomor diakhiri \`?\` beserta opsi dan rekomendasimu), begitu juga bila panduan fase menyuruhmu bertanya ke manusia, lalu tulis \`Status: menunggu-keputusan\` dan berhenti. Jawabannya datang sebagai pesan susulan ke agen yang sama \u2014 lanjutkan dari sana; bila jawaban itu memunculkan ambiguitas baru, laporkan lagi dengan cara yang sama. Yang menjawab ditentukan hanoman \u2014 ${DECIDER}.`;
|
|
12164
12596
|
PHASE_AGENT_RULES = [
|
|
12165
12597
|
"Batas peran fase:",
|
|
@@ -12181,6 +12613,13 @@ var init_phase_agents = __esm({
|
|
|
12181
12613
|
"- `Rekomendasi fase:` (opsional) mis. `jalur-cepat` sesudah Audit qa.",
|
|
12182
12614
|
"Klaim tanpa bukti bukan bukti. Maksimal 1200 kata."
|
|
12183
12615
|
].join("\n");
|
|
12616
|
+
REVIEWER_RULES = [
|
|
12617
|
+
"Batas peran reviewer:",
|
|
12618
|
+
"- JANGAN mengubah, membuat, atau menghapus berkas apa pun di worktree, JANGAN commit, JANGAN `git push`/`git stash`/`git checkout`/`git reset`. Kamu membaca dan menjalankan perintah verifikasi saja.",
|
|
12619
|
+
"- JANGAN menulis `$HANOMAN_PHASE_FILE` dan JANGAN memperbaiki temuanmu sendiri \u2014 perbaikan milik agen Execute, marker milik orchestrator.",
|
|
12620
|
+
`- JANGAN memanggil agen berawalan \`${PHASE_AGENT_PREFIX}\`.`,
|
|
12621
|
+
"- JANGAN mengakhiri giliran atau melapor selama masih menunggu proses/tugas latar milikmu sendiri (test yang kamu jalankan di latar): tunggu sampai selesai dan baca hasilnya, lalu tulis laporan lengkap berawalan `Status:`."
|
|
12622
|
+
].join("\n");
|
|
12184
12623
|
}
|
|
12185
12624
|
});
|
|
12186
12625
|
|