hanoman 0.9.35 → 0.9.37
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 +68 -12
- package/dist/server.js +255 -102
- package/docs/agent-integration.md +4 -0
- package/package.json +1 -1
- package/web/assets/{DalangHanomanScreen-BVu8tGjd.js → DalangHanomanScreen-JE8gkztH.js} +1 -1
- package/web/assets/{DocPreviewModal-DwhXR__7.js → DocPreviewModal-B23vI_It.js} +1 -1
- package/web/assets/{DocsWorkspace-poV6NPLq.js → DocsWorkspace-CbV27H6A.js} +1 -1
- package/web/assets/{IdeScreen-BpGoKqok.js → IdeScreen-BY7sm97W.js} +1 -1
- package/web/assets/{LeadScreen-Bqj27JHC.js → LeadScreen-BFwI29zS.js} +1 -1
- package/web/assets/{ReviewScreen-ykVVM8ir.js → ReviewScreen-pM6zzGZl.js} +1 -1
- package/web/assets/{SchedulerScreen-26uRd--J.js → SchedulerScreen-BIhqn3X1.js} +1 -1
- package/web/assets/{SettingsScreen-D7qZqj-w.js → SettingsScreen-C_TW3mbs.js} +1 -1
- package/web/assets/{TeamScreen-NC9C8iL8.js → TeamScreen-RT926lDf.js} +1 -1
- package/web/assets/TerminalScreen-fpC5a2jS.js +2 -0
- package/web/assets/{TriageScreen-DzKT-O0A.js → TriageScreen-Zp1bdRnl.js} +1 -1
- package/web/assets/{VpsScreen-bVd5YC2y.js → VpsScreen-Jnb8C1o2.js} +2 -2
- package/web/assets/{fields-Cqp-sr6L.js → fields-B_3dIGcG.js} +1 -1
- package/web/assets/{index-BjNlrKWq.js → index-CbX7iwxN.js} +204 -204
- package/web/assets/{live-COTGt6Jw.js → live-CNp86nGW.js} +1 -1
- package/web/assets/{sched-lead-shared-Xe8lxNc_.js → sched-lead-shared-BUcJMfNH.js} +1 -1
- package/web/assets/{settings-rebase-Cp2i2t6-.js → settings-rebase-CYr7W_rB.js} +1 -1
- package/web/index.html +1 -1
- package/web/assets/TerminalScreen-Do49p9t6.js +0 -2
package/dist/build-info.json
CHANGED
package/dist/cli.js
CHANGED
|
@@ -4192,6 +4192,8 @@ var init_method_catalog = __esm({
|
|
|
4192
4192
|
"superpowers:test-driven-development",
|
|
4193
4193
|
VERIFICATION_GATE
|
|
4194
4194
|
],
|
|
4195
|
+
// ADR-0230 · fase Review resmi: audit spec & plan vs diff + gerbang verifikasi.
|
|
4196
|
+
Review: ["superpowers:requesting-code-review", VERIFICATION_GATE],
|
|
4195
4197
|
// SPEC-407 · fase `Goal` sengaja TANPA skill: seluruh inti flow itu membebaskan sesi dari
|
|
4196
4198
|
// proses kaku. Yang tetap dijaga cuma pintu keluarnya.
|
|
4197
4199
|
Verifikasi: [VERIFICATION_GATE]
|
|
@@ -4235,6 +4237,8 @@ var init_method_catalog = __esm({
|
|
|
4235
4237
|
"mattpocock-skills:tdd",
|
|
4236
4238
|
"mattpocock-skills:code-review"
|
|
4237
4239
|
],
|
|
4240
|
+
// ADR-0230 · fase Review resmi: audit spec & plan vs diff + gerbang verifikasi.
|
|
4241
|
+
Review: ["mattpocock-skills:code-review", VERIFICATION_GATE],
|
|
4238
4242
|
Verifikasi: [VERIFICATION_GATE]
|
|
4239
4243
|
},
|
|
4240
4244
|
exitSkills: [VERIFICATION_GATE],
|
|
@@ -4275,6 +4279,8 @@ var init_method_catalog = __esm({
|
|
|
4275
4279
|
"agent-skills:test-driven-development",
|
|
4276
4280
|
"agent-skills:code-review-and-quality"
|
|
4277
4281
|
],
|
|
4282
|
+
// ADR-0230 · fase Review resmi: audit spec & plan vs diff + gerbang verifikasi.
|
|
4283
|
+
Review: ["agent-skills:code-review-and-quality", VERIFICATION_GATE],
|
|
4278
4284
|
Verifikasi: [VERIFICATION_GATE]
|
|
4279
4285
|
},
|
|
4280
4286
|
exitSkills: [VERIFICATION_GATE],
|
|
@@ -4791,7 +4797,7 @@ var init_logs = __esm({
|
|
|
4791
4797
|
function phaseAgentName(phase) {
|
|
4792
4798
|
return PHASE_AGENT_PREFIX + phase.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
4793
4799
|
}
|
|
4794
|
-
var ORCHESTRATION_FLOWS, FLOW_PHASES, PHASE_AGENT_PREFIX, isPhaseAgentName, EXECUTE_MODE_FLOWS, REVIEWER_CELL;
|
|
4800
|
+
var ORCHESTRATION_FLOWS, FLOW_PHASES, PHASE_AGENT_PREFIX, isPhaseAgentName, EXECUTE_MODE_FLOWS, REVIEWER_CELL, REVIEWER_FLOWS;
|
|
4795
4801
|
var init_orchestration = __esm({
|
|
4796
4802
|
"../shared/src/orchestration.ts"() {
|
|
4797
4803
|
"use strict";
|
|
@@ -4807,8 +4813,9 @@ var init_orchestration = __esm({
|
|
|
4807
4813
|
"no_effort"
|
|
4808
4814
|
];
|
|
4809
4815
|
FLOW_PHASES = {
|
|
4810
|
-
|
|
4811
|
-
|
|
4816
|
+
// ADR-0230 · `Review` = fase resmi sesudah Execute (dulu langkah R di dalam Execute, ADR-0170 #4).
|
|
4817
|
+
feature: ["Brainstorm", "Objective", "Spec", "Plan", "Execute", "Review"],
|
|
4818
|
+
qa: ["Audit", "Spec", "Plan", "Execute", "Review"],
|
|
4812
4819
|
scaffold: ["Brainstorm", "Objective", "Doc index"],
|
|
4813
4820
|
reverse: ["Scan", "Docs teknis", "Wawancara", "Konvensi & index", "Serah terima"],
|
|
4814
4821
|
prd: ["Brainstorm", "PRD"],
|
|
@@ -4830,6 +4837,9 @@ var init_orchestration = __esm({
|
|
|
4830
4837
|
ORCHESTRATION_FLOWS.filter((f) => FLOW_PHASES[f].some((p3) => p3 === "Execute" || p3 === "Goal"))
|
|
4831
4838
|
);
|
|
4832
4839
|
REVIEWER_CELL = "Review";
|
|
4840
|
+
REVIEWER_FLOWS = new Set(
|
|
4841
|
+
ORCHESTRATION_FLOWS.filter((f) => FLOW_PHASES[f].includes(REVIEWER_CELL))
|
|
4842
|
+
);
|
|
4833
4843
|
}
|
|
4834
4844
|
});
|
|
4835
4845
|
|
|
@@ -4840,7 +4850,7 @@ var init_runtime_defaults = __esm({
|
|
|
4840
4850
|
"use strict";
|
|
4841
4851
|
init_orchestration();
|
|
4842
4852
|
init_zod();
|
|
4843
|
-
RUNTIME_DEFAULTS_VERSION = "2026-
|
|
4853
|
+
RUNTIME_DEFAULTS_VERSION = "2026-10-25-v1";
|
|
4844
4854
|
zRuntimeDefaultState = external_exports.enum(["seeded", "user"]);
|
|
4845
4855
|
zBuiltinRuntimeDefaults = external_exports.object({
|
|
4846
4856
|
version: external_exports.string().default(RUNTIME_DEFAULTS_VERSION),
|
|
@@ -4873,14 +4883,16 @@ var init_runtime_defaults = __esm({
|
|
|
4873
4883
|
Objective: cell("sonnet", "medium"),
|
|
4874
4884
|
Spec: cell("opus", "high"),
|
|
4875
4885
|
Plan: cell("opus", "high"),
|
|
4876
|
-
Execute: cell("sonnet", "high")
|
|
4886
|
+
Execute: cell("sonnet", "high"),
|
|
4887
|
+
Review: cell("opus", "high")
|
|
4877
4888
|
},
|
|
4878
4889
|
{
|
|
4879
4890
|
Brainstorm: cell("gpt-5.6-terra", "medium"),
|
|
4880
4891
|
Objective: cell("gpt-5.6-terra", "medium"),
|
|
4881
4892
|
Spec: cell("gpt-5.6-sol", "high"),
|
|
4882
4893
|
Plan: cell("gpt-5.6-sol", "high"),
|
|
4883
|
-
Execute: cell("gpt-5.6-terra", "high")
|
|
4894
|
+
Execute: cell("gpt-5.6-terra", "high"),
|
|
4895
|
+
Review: cell("gpt-5.6-sol", "high")
|
|
4884
4896
|
}
|
|
4885
4897
|
),
|
|
4886
4898
|
qa: flow(
|
|
@@ -4888,13 +4900,15 @@ var init_runtime_defaults = __esm({
|
|
|
4888
4900
|
Audit: cell("opus", "high"),
|
|
4889
4901
|
Spec: cell("opus", "high"),
|
|
4890
4902
|
Plan: cell("sonnet", "high"),
|
|
4891
|
-
Execute: cell("sonnet", "high")
|
|
4903
|
+
Execute: cell("sonnet", "high"),
|
|
4904
|
+
Review: cell("opus", "high")
|
|
4892
4905
|
},
|
|
4893
4906
|
{
|
|
4894
4907
|
Audit: cell("gpt-5.6-sol", "high"),
|
|
4895
4908
|
Spec: cell("gpt-5.6-sol", "high"),
|
|
4896
4909
|
Plan: cell("gpt-5.6-terra", "high"),
|
|
4897
|
-
Execute: cell("gpt-5.6-terra", "high")
|
|
4910
|
+
Execute: cell("gpt-5.6-terra", "high"),
|
|
4911
|
+
Review: cell("gpt-5.6-sol", "high")
|
|
4898
4912
|
}
|
|
4899
4913
|
),
|
|
4900
4914
|
scaffold: flow(
|
|
@@ -7220,7 +7234,13 @@ var init_dto = __esm({
|
|
|
7220
7234
|
agent: zAgent.optional(),
|
|
7221
7235
|
model: external_exports.string().optional(),
|
|
7222
7236
|
effort: external_exports.string().optional(),
|
|
7223
|
-
force: external_exports.boolean().optional()
|
|
7237
|
+
force: external_exports.boolean().optional(),
|
|
7238
|
+
// ADR-0232 · opsional: `worktree:true` → sesi lahir di `.worktrees/<id>` pada branch baru
|
|
7239
|
+
// `term/<id>` dari `branchFrom` (kosong → HEAD repo), alih-alih langsung di repoDir. Tanpa
|
|
7240
|
+
// keduanya body-nya byte-identik dengan sebelumnya. `branchFrom` tanpa `worktree` ditolak di
|
|
7241
|
+
// route — ia tak berarti apa-apa di repoDir dan diam-diam mengabaikannya menyesatkan.
|
|
7242
|
+
worktree: external_exports.boolean().optional(),
|
|
7243
|
+
branchFrom: external_exports.string().min(1).max(255).optional()
|
|
7224
7244
|
}),
|
|
7225
7245
|
// SPEC-252 · ADR-0061 — model & effort per SESI: override opsional saat Start; kosong → global.
|
|
7226
7246
|
// SPEC-332 · ADR-0073 — mode goal per SESI: `goal` undefined → ikut Setting.goal.enabled,
|
|
@@ -11641,6 +11661,8 @@ var init_sessions = __esm({
|
|
|
11641
11661
|
} })
|
|
11642
11662
|
},
|
|
11643
11663
|
prdPath: str("flow `breakdown`: jalur PRD yang dipecah. WAJIB untuk alur itu."),
|
|
11664
|
+
worktree: bool("Terminal agen biasa (hanya `project`, tanpa `flow`/`shell`): true = lahir di worktree terpisah pada branch baru `term/<id>`, bukan langsung di repo project. Kosong = di repo project."),
|
|
11665
|
+
branchFrom: str("Bersama `worktree: true`: branch/ref asal worktree (lokal atau origin). Kosong = HEAD repo."),
|
|
11644
11666
|
force: bool("Lewati gerbang dependency. Pakai HANYA sesudah melihat daftar pemblokirnya.")
|
|
11645
11667
|
},
|
|
11646
11668
|
allOf: [
|
|
@@ -11670,7 +11692,8 @@ var init_sessions = __esm({
|
|
|
11670
11692
|
if (flow2 === "breakdown") return { method: "POST", path: "/terminal/sessions", body: { project, flow: flow2, prdPath: String(a.prdPath) } };
|
|
11671
11693
|
if (flow2 === "reverse" || flow2 === "scaffold") return { method: "POST", path: "/terminal/sessions", body: { project, flow: flow2 } };
|
|
11672
11694
|
const body = { project };
|
|
11673
|
-
for (const k of ["agent", "model", "effort"]) if (s(a[k]) !== void 0) body[k] = s(a[k]);
|
|
11695
|
+
for (const k of ["agent", "model", "effort", "branchFrom"]) if (s(a[k]) !== void 0) body[k] = s(a[k]);
|
|
11696
|
+
if (typeof a.worktree === "boolean") body.worktree = a.worktree;
|
|
11674
11697
|
return { method: "POST", path: "/terminal/sessions", body };
|
|
11675
11698
|
},
|
|
11676
11699
|
shape: (raw) => raw
|
|
@@ -15171,7 +15194,11 @@ var init_session_ask = __esm({
|
|
|
15171
15194
|
});
|
|
15172
15195
|
zTurnEnd = external_exports.object({
|
|
15173
15196
|
hook_event_name: external_exports.literal("Stop"),
|
|
15174
|
-
turn_id
|
|
15197
|
+
// ADR-0231 · codex mengirim `turn_id`; Stop claude (sesi bertanya lewat teks) tidak — ia membawa
|
|
15198
|
+
// `prompt_id` dan `background_tasks`.
|
|
15199
|
+
turn_id: external_exports.string().min(1).optional(),
|
|
15200
|
+
prompt_id: external_exports.string().optional(),
|
|
15201
|
+
background_tasks: external_exports.array(external_exports.object({ status: external_exports.string().optional() }).passthrough()).optional(),
|
|
15175
15202
|
last_assistant_message: external_exports.string().optional(),
|
|
15176
15203
|
// Codex menyalakan bendera ini saat Stop dipicu oleh hook Stop lain. Melayani giliran yang
|
|
15177
15204
|
// dibangkitkan gate mode goal (ADR-0074) berarti lead menjawab dirinya sendiri.
|
|
@@ -15404,7 +15431,7 @@ var init_goal_spec = __esm({
|
|
|
15404
15431
|
});
|
|
15405
15432
|
|
|
15406
15433
|
// ../runner/src/prompt.ts
|
|
15407
|
-
var DECIDER, ASK_ROUTE, AMBIGUOUS, AUTONOMY_CLAUSE, AUTONOMY_CLAUSE_FULL, ESCALATION_CONTRACT, PROJECT_METHOD, REVERSE_PHASE_GUIDE, SCAFFOLD_PHASE_GUIDE;
|
|
15434
|
+
var DECIDER, ASK_ROUTE, ASK_ESCALATION_TOOL, ASK_DECISIONS_TOOL, AMBIGUOUS, AUTONOMY_CLAUSE, AUTONOMY_CLAUSE_FULL, ESCALATION_CONTRACT, PROJECT_METHOD, REVERSE_PHASE_GUIDE, SCAFFOLD_PHASE_GUIDE;
|
|
15408
15435
|
var init_prompt = __esm({
|
|
15409
15436
|
"../runner/src/prompt.ts"() {
|
|
15410
15437
|
"use strict";
|
|
@@ -15415,6 +15442,8 @@ var init_prompt = __esm({
|
|
|
15415
15442
|
init_goal_spec();
|
|
15416
15443
|
DECIDER = "hanoman-lead bila aktif untuk project ini, selain itu manusia";
|
|
15417
15444
|
ASK_ROUTE = `ajukan lewat AskUserQuestion bila agenmu punya tool itu (paling banyak 4 pertanyaan per panggilan \u2014 pecah sisanya ke panggilan berikutnya); bila tidak, tanyakan di terminal ini sekaligus, tiap pertanyaan bernomor dan diakhiri \`?\` beserta opsinya, lalu tunggu jawabannya. Tak ada batas jumlah pertanyaan: selama masih ambigu dan akan mempengaruhi hasil, tanyakan. Yang menjawab ditentukan hanoman \u2014 ${DECIDER}; jangan menjawabnya sendiri.`;
|
|
15445
|
+
ASK_ESCALATION_TOOL = "tanyakan lewat AskUserQuestion";
|
|
15446
|
+
ASK_DECISIONS_TOOL = "lewat AskUserQuestion \u2014 tool itu memuat paling banyak 4 pertanyaan per panggilan, jadi pecah sisanya ke panggilan berikutnya sampai semuanya terjawab";
|
|
15418
15447
|
AMBIGUOUS = "hal yang masih ambigu dan akan mempengaruhi hasil (data model, kontrak API, scope, perilaku yang terlihat pengguna, atau asumsi yang terpaksa kamu ambil agar bisa lanjut)";
|
|
15419
15448
|
AUTONOMY_CLAUSE = `Jalankan seluruh pipeline sampai tuntas tanpa berhenti di batas antar-fase. Checkpoint "review"/"approval"/"need review" milik skill superpowers BUKAN titik berhenti di sini \u2014 lanjut saja ke fase berikutnya. Berhenti HANYA untuk ${AMBIGUOUS}: JANGAN memutuskannya sendiri, ${ASK_ROUTE} Selain itu, terus lanjut.`;
|
|
15420
15449
|
AUTONOMY_CLAUSE_FULL = `Kamu diluncurkan scheduler \u2014 mungkin tak ada manusia yang sedang menonton terminal ini. Tembus seluruh pipeline sampai stage \`done\`, lalu commit & push: checkpoint "review"/"approval" milik skill BUKAN titik berhenti dan jangan menunggu persetujuan siapa pun. Tetapi JANGAN memutuskan sendiri ${AMBIGUOUS}: ${ASK_ROUTE} Catat keputusan penting di pesan commit. Merge ke branch utama tetap dilakukan manusia, bukan kamu.`;
|
|
@@ -15530,6 +15559,7 @@ var init_agent_readonly = __esm({
|
|
|
15530
15559
|
});
|
|
15531
15560
|
|
|
15532
15561
|
// ../runner/src/custom-agents.ts
|
|
15562
|
+
var ASK_RELAY_TOOL;
|
|
15533
15563
|
var init_custom_agents = __esm({
|
|
15534
15564
|
"../runner/src/custom-agents.ts"() {
|
|
15535
15565
|
"use strict";
|
|
@@ -15537,6 +15567,31 @@ var init_custom_agents = __esm({
|
|
|
15537
15567
|
init_code_style();
|
|
15538
15568
|
init_prompt();
|
|
15539
15569
|
init_agent_readonly();
|
|
15570
|
+
ASK_RELAY_TOOL = "ajukan semuanya lewat AskUserQuestion (pecah per 4 pertanyaan), lalu teruskan jawabannya lewat SendMessage ke agent ID yang sama";
|
|
15571
|
+
}
|
|
15572
|
+
});
|
|
15573
|
+
|
|
15574
|
+
// ../runner/src/ask-via.ts
|
|
15575
|
+
var NO_TOOL, TEXT_ASK_ROUTE, SWAPS;
|
|
15576
|
+
var init_ask_via = __esm({
|
|
15577
|
+
"../runner/src/ask-via.ts"() {
|
|
15578
|
+
"use strict";
|
|
15579
|
+
init_prompt();
|
|
15580
|
+
init_custom_agents();
|
|
15581
|
+
NO_TOOL = "JANGAN memakai AskUserQuestion (juga bila sebuah skill menyuruhnya)";
|
|
15582
|
+
TEXT_ASK_ROUTE = `${NO_TOOL}: tanyakan di terminal ini sekaligus dalam satu pesan, tiap pertanyaan bernomor dan diakhiri \`?\` beserta opsi, rekomendasi dan alasannya, lalu berhenti dan tunggu jawabannya. Tak ada batas jumlah pertanyaan: selama masih ambigu dan akan mempengaruhi hasil, tanyakan. Yang menjawab ditentukan hanoman \u2014 ${DECIDER}; jangan menjawabnya sendiri.`;
|
|
15583
|
+
SWAPS = [
|
|
15584
|
+
[ASK_ROUTE, TEXT_ASK_ROUTE],
|
|
15585
|
+
[
|
|
15586
|
+
ASK_DECISIONS_TOOL,
|
|
15587
|
+
`di terminal ini sekaligus dalam satu pesan (${NO_TOOL}), tiap pertanyaan bernomor dan diakhiri \`?\` beserta opsi, rekomendasi dan alasannya, lalu berhenti dan tunggu jawaban`
|
|
15588
|
+
],
|
|
15589
|
+
[
|
|
15590
|
+
ASK_RELAY_TOOL,
|
|
15591
|
+
`ajukan semuanya di terminal ini (${NO_TOOL}; bernomor, tiap pertanyaan diakhiri \`?\`), lalu teruskan jawabannya lewat SendMessage ke agent ID yang sama`
|
|
15592
|
+
],
|
|
15593
|
+
[ASK_ESCALATION_TOOL, `tanyakan di terminal ini (${NO_TOOL}) lalu berhenti dan tunggu jawaban`]
|
|
15594
|
+
];
|
|
15540
15595
|
}
|
|
15541
15596
|
});
|
|
15542
15597
|
|
|
@@ -16190,6 +16245,7 @@ var init_src2 = __esm({
|
|
|
16190
16245
|
init_codex_settings();
|
|
16191
16246
|
init_agent_cli();
|
|
16192
16247
|
init_custom_agents();
|
|
16248
|
+
init_ask_via();
|
|
16193
16249
|
init_agent_definition();
|
|
16194
16250
|
init_phase_agents();
|
|
16195
16251
|
init_agent_readonly();
|