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.
Files changed (24) hide show
  1. package/dist/build-info.json +3 -3
  2. package/dist/cli.js +68 -12
  3. package/dist/server.js +255 -102
  4. package/docs/agent-integration.md +4 -0
  5. package/package.json +1 -1
  6. package/web/assets/{DalangHanomanScreen-BVu8tGjd.js → DalangHanomanScreen-JE8gkztH.js} +1 -1
  7. package/web/assets/{DocPreviewModal-DwhXR__7.js → DocPreviewModal-B23vI_It.js} +1 -1
  8. package/web/assets/{DocsWorkspace-poV6NPLq.js → DocsWorkspace-CbV27H6A.js} +1 -1
  9. package/web/assets/{IdeScreen-BpGoKqok.js → IdeScreen-BY7sm97W.js} +1 -1
  10. package/web/assets/{LeadScreen-Bqj27JHC.js → LeadScreen-BFwI29zS.js} +1 -1
  11. package/web/assets/{ReviewScreen-ykVVM8ir.js → ReviewScreen-pM6zzGZl.js} +1 -1
  12. package/web/assets/{SchedulerScreen-26uRd--J.js → SchedulerScreen-BIhqn3X1.js} +1 -1
  13. package/web/assets/{SettingsScreen-D7qZqj-w.js → SettingsScreen-C_TW3mbs.js} +1 -1
  14. package/web/assets/{TeamScreen-NC9C8iL8.js → TeamScreen-RT926lDf.js} +1 -1
  15. package/web/assets/TerminalScreen-fpC5a2jS.js +2 -0
  16. package/web/assets/{TriageScreen-DzKT-O0A.js → TriageScreen-Zp1bdRnl.js} +1 -1
  17. package/web/assets/{VpsScreen-bVd5YC2y.js → VpsScreen-Jnb8C1o2.js} +2 -2
  18. package/web/assets/{fields-Cqp-sr6L.js → fields-B_3dIGcG.js} +1 -1
  19. package/web/assets/{index-BjNlrKWq.js → index-CbX7iwxN.js} +204 -204
  20. package/web/assets/{live-COTGt6Jw.js → live-CNp86nGW.js} +1 -1
  21. package/web/assets/{sched-lead-shared-Xe8lxNc_.js → sched-lead-shared-BUcJMfNH.js} +1 -1
  22. package/web/assets/{settings-rebase-Cp2i2t6-.js → settings-rebase-CYr7W_rB.js} +1 -1
  23. package/web/index.html +1 -1
  24. package/web/assets/TerminalScreen-Do49p9t6.js +0 -2
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.9.35",
3
- "sha": "30c1066b",
4
- "builtAt": "2026-10-25T01:25:29.794Z"
2
+ "version": "0.9.37",
3
+ "sha": "f525bd45",
4
+ "builtAt": "2026-10-30T09:03:54.676Z"
5
5
  }
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
- feature: ["Brainstorm", "Objective", "Spec", "Plan", "Execute"],
4811
- qa: ["Audit", "Spec", "Plan", "Execute"],
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-09-23-v2";
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: external_exports.string().min(1),
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();