hanoman 0.9.34 → 0.9.36

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 (22) hide show
  1. package/dist/build-info.json +3 -3
  2. package/dist/cli.js +79 -13
  3. package/dist/server.js +235 -94
  4. package/package.json +1 -1
  5. package/web/assets/{DalangHanomanScreen-BwBpu2_P.js → DalangHanomanScreen-NmpJIcg6.js} +1 -1
  6. package/web/assets/{DocPreviewModal-z4u5bA7e.js → DocPreviewModal-DK597e3s.js} +1 -1
  7. package/web/assets/{DocsWorkspace-CtD3uuCo.js → DocsWorkspace-BQX-HlzW.js} +1 -1
  8. package/web/assets/{IdeScreen-D-jOfQ5p.js → IdeScreen-LeUPaFsS.js} +1 -1
  9. package/web/assets/{LeadScreen-BzauaH1t.js → LeadScreen-BVCKv46y.js} +1 -1
  10. package/web/assets/{ReviewScreen-CMhrSnaH.js → ReviewScreen-C6NcJChq.js} +1 -1
  11. package/web/assets/{SchedulerScreen-h9C8CMSA.js → SchedulerScreen-2AH0R3TJ.js} +1 -1
  12. package/web/assets/{SettingsScreen-DrV1eN2q.js → SettingsScreen-B4SVzh9m.js} +3 -3
  13. package/web/assets/{TeamScreen-DQ7DBfil.js → TeamScreen-6XEfuZUm.js} +1 -1
  14. package/web/assets/{TerminalScreen-BecrzSkO.js → TerminalScreen-DubD6vT-.js} +1 -1
  15. package/web/assets/{TriageScreen-jtTZsaK5.js → TriageScreen-BYJxyCar.js} +1 -1
  16. package/web/assets/{VpsScreen-v5UmXGHF.js → VpsScreen-Df37dgKx.js} +1 -1
  17. package/web/assets/{fields-B0XXQmkb.js → fields-C94HI0V8.js} +1 -1
  18. package/web/assets/{index-kLq09yz-.js → index-BeFSh2Ba.js} +207 -207
  19. package/web/assets/{live-wjfa6DIz.js → live-5ezoV9Fs.js} +1 -1
  20. package/web/assets/{sched-lead-shared-BfF2ZYfo.js → sched-lead-shared-BpZu6N2A.js} +1 -1
  21. package/web/assets/{settings-rebase-BMeQSp64.js → settings-rebase-DaTGgcuO.js} +1 -1
  22. package/web/index.html +1 -1
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.9.34",
3
- "sha": "b5eb6b97",
4
- "builtAt": "2026-10-20T14:03:19.363Z"
2
+ "version": "0.9.36",
3
+ "sha": "40fd09e5",
4
+ "builtAt": "2026-10-25T08:39:29.269Z"
5
5
  }
package/dist/cli.js CHANGED
@@ -4137,7 +4137,7 @@ var init_enums = __esm({
4137
4137
  zSeverity = external_exports.enum(["critical", "major", "minor"]);
4138
4138
  zTicketCategory = external_exports.enum(["bug", "fitur", "pertanyaan", "lainnya"]);
4139
4139
  zTicketStatus = external_exports.enum(["new", "accepted", "rejected"]);
4140
- VERIFY_SCOPES = ["changed", "full"];
4140
+ VERIFY_SCOPES = ["changed", "full", "none"];
4141
4141
  zVerifyScope = external_exports.enum(VERIFY_SCOPES);
4142
4142
  }
4143
4143
  });
@@ -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(
@@ -11628,7 +11642,7 @@ var init_sessions = __esm({
11628
11642
  effort: str("Effort. Kosong = default global."),
11629
11643
  goal: bool("Mode goal per-sesi. Kosong = ikut setelan global."),
11630
11644
  goalCondition: str("Kondisi selesai mode goal (maks 4000 karakter)."),
11631
- verifyScope: enumStr(["changed", "full"], "Scope verifikasi. Kosong = ikut setelan global."),
11645
+ verifyScope: enumStr(["changed", "full", "none"], "Scope verifikasi: changed = hanya yang berubah, full = seluruh project, none = jangan jalankan test. Kosong = ikut setelan global."),
11632
11646
  method: str("Metode workflow. Id tak dikenal jatuh ke default, bukan ditolak."),
11633
11647
  phaseOverrides: {
11634
11648
  type: "object",
@@ -15171,7 +15185,11 @@ var init_session_ask = __esm({
15171
15185
  });
15172
15186
  zTurnEnd = external_exports.object({
15173
15187
  hook_event_name: external_exports.literal("Stop"),
15174
- turn_id: external_exports.string().min(1),
15188
+ // ADR-0231 · codex mengirim `turn_id`; Stop claude (sesi bertanya lewat teks) tidak — ia membawa
15189
+ // `prompt_id` dan `background_tasks`.
15190
+ turn_id: external_exports.string().min(1).optional(),
15191
+ prompt_id: external_exports.string().optional(),
15192
+ background_tasks: external_exports.array(external_exports.object({ status: external_exports.string().optional() }).passthrough()).optional(),
15175
15193
  last_assistant_message: external_exports.string().optional(),
15176
15194
  // Codex menyalakan bendera ini saat Stop dipicu oleh hook Stop lain. Melayani giliran yang
15177
15195
  // dibangkitkan gate mode goal (ADR-0074) berarti lead menjawab dirinya sendiri.
@@ -15314,7 +15332,7 @@ var init_reverse_standard = __esm({
15314
15332
  });
15315
15333
 
15316
15334
  // ../runner/src/verify-scope.ts
15317
- var CHANGED;
15335
+ var CHANGED, NONE;
15318
15336
  var init_verify_scope = __esm({
15319
15337
  "../runner/src/verify-scope.ts"() {
15320
15338
  "use strict";
@@ -15355,6 +15373,25 @@ var init_verify_scope = __esm({
15355
15373
  "tipe/kontrak bersama, skema, atau berkas yang diimpor banyak modul), perluas scope seperlunya",
15356
15374
  "dan katakan alasannya. Ini panduan biaya, bukan larangan."
15357
15375
  ].join("\n");
15376
+ NONE = [
15377
+ "Scope verifikasi: TANPA menjalankan test. Operator memilih mode ini karena perangkatnya tak",
15378
+ "kuat menjalankan test \u2014 run sebelumnya membuat mesin tersendat.",
15379
+ "",
15380
+ "- JANGAN menjalankan test apa pun: `pnpm test`, `vitest` (termasuk `--changed`/`related`),",
15381
+ " `jest`, `pytest`, `go test`, Playwright/e2e, maupun skrip yang memanggilnya. Aturan ini",
15382
+ ' MENIMPA instruksi skill/metode (mis. TDD "jalankan test, lihat merah lalu hijau"), instruksi',
15383
+ " fase Verifikasi/review, dan Definition of Done repo target.",
15384
+ "- Menulis atau memperbarui berkas test tetap boleh \u2014 hanya jangan menjalankannya.",
15385
+ "- JANGAN build, lint seluruh repo, boot server + curl, atau smoke end-to-end.",
15386
+ "- Typecheck: paling banyak SEKALI di akhir, hanya untuk paket yang tersentuh",
15387
+ " (mis. `pnpm --filter ./server typecheck`). JANGAN `pnpm -r typecheck`.",
15388
+ '- Verifikasi dengan MEMBACA: telusuri diff-mu (`git diff "$HANOMAN_BASE_SHA"...HEAD`,',
15389
+ " `git status --porcelain`), periksa pemanggil, tipe, dan cabang error dengan grep/baca berkas.",
15390
+ "- Laporan: nyatakan terang bahwa test TIDAK dijalankan (scope verifikasi `none`) dan sebut berkas",
15391
+ " test yang perlu dijalankan manusia. Jangan pernah mengklaim test hijau.",
15392
+ "",
15393
+ "Menjalankan test adalah tugas MANUSIA sebelum merge, bukan tugas sesi."
15394
+ ].join("\n");
15358
15395
  }
15359
15396
  });
15360
15397
 
@@ -15385,7 +15422,7 @@ var init_goal_spec = __esm({
15385
15422
  });
15386
15423
 
15387
15424
  // ../runner/src/prompt.ts
15388
- var DECIDER, ASK_ROUTE, AMBIGUOUS, AUTONOMY_CLAUSE, AUTONOMY_CLAUSE_FULL, ESCALATION_CONTRACT, PROJECT_METHOD, REVERSE_PHASE_GUIDE, SCAFFOLD_PHASE_GUIDE;
15425
+ 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;
15389
15426
  var init_prompt = __esm({
15390
15427
  "../runner/src/prompt.ts"() {
15391
15428
  "use strict";
@@ -15396,6 +15433,8 @@ var init_prompt = __esm({
15396
15433
  init_goal_spec();
15397
15434
  DECIDER = "hanoman-lead bila aktif untuk project ini, selain itu manusia";
15398
15435
  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.`;
15436
+ ASK_ESCALATION_TOOL = "tanyakan lewat AskUserQuestion";
15437
+ ASK_DECISIONS_TOOL = "lewat AskUserQuestion \u2014 tool itu memuat paling banyak 4 pertanyaan per panggilan, jadi pecah sisanya ke panggilan berikutnya sampai semuanya terjawab";
15399
15438
  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)";
15400
15439
  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.`;
15401
15440
  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.`;
@@ -15511,6 +15550,7 @@ var init_agent_readonly = __esm({
15511
15550
  });
15512
15551
 
15513
15552
  // ../runner/src/custom-agents.ts
15553
+ var ASK_RELAY_TOOL;
15514
15554
  var init_custom_agents = __esm({
15515
15555
  "../runner/src/custom-agents.ts"() {
15516
15556
  "use strict";
@@ -15518,6 +15558,31 @@ var init_custom_agents = __esm({
15518
15558
  init_code_style();
15519
15559
  init_prompt();
15520
15560
  init_agent_readonly();
15561
+ ASK_RELAY_TOOL = "ajukan semuanya lewat AskUserQuestion (pecah per 4 pertanyaan), lalu teruskan jawabannya lewat SendMessage ke agent ID yang sama";
15562
+ }
15563
+ });
15564
+
15565
+ // ../runner/src/ask-via.ts
15566
+ var NO_TOOL, TEXT_ASK_ROUTE, SWAPS;
15567
+ var init_ask_via = __esm({
15568
+ "../runner/src/ask-via.ts"() {
15569
+ "use strict";
15570
+ init_prompt();
15571
+ init_custom_agents();
15572
+ NO_TOOL = "JANGAN memakai AskUserQuestion (juga bila sebuah skill menyuruhnya)";
15573
+ 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.`;
15574
+ SWAPS = [
15575
+ [ASK_ROUTE, TEXT_ASK_ROUTE],
15576
+ [
15577
+ ASK_DECISIONS_TOOL,
15578
+ `di terminal ini sekaligus dalam satu pesan (${NO_TOOL}), tiap pertanyaan bernomor dan diakhiri \`?\` beserta opsi, rekomendasi dan alasannya, lalu berhenti dan tunggu jawaban`
15579
+ ],
15580
+ [
15581
+ ASK_RELAY_TOOL,
15582
+ `ajukan semuanya di terminal ini (${NO_TOOL}; bernomor, tiap pertanyaan diakhiri \`?\`), lalu teruskan jawabannya lewat SendMessage ke agent ID yang sama`
15583
+ ],
15584
+ [ASK_ESCALATION_TOOL, `tanyakan di terminal ini (${NO_TOOL}) lalu berhenti dan tunggu jawaban`]
15585
+ ];
15521
15586
  }
15522
15587
  });
15523
15588
 
@@ -16171,6 +16236,7 @@ var init_src2 = __esm({
16171
16236
  init_codex_settings();
16172
16237
  init_agent_cli();
16173
16238
  init_custom_agents();
16239
+ init_ask_via();
16174
16240
  init_agent_definition();
16175
16241
  init_phase_agents();
16176
16242
  init_agent_readonly();