hanoman 0.9.37 → 0.9.38

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 (26) hide show
  1. package/dist/build-info.json +3 -3
  2. package/dist/cli.js +77 -9
  3. package/dist/server.js +669 -395
  4. package/docs/agent-integration.md +5 -2
  5. package/package.json +1 -1
  6. package/web/assets/{DalangHanomanScreen-JE8gkztH.js → DalangHanomanScreen-wpAO0xvb.js} +1 -1
  7. package/web/assets/{DocPreviewModal-B23vI_It.js → DocPreviewModal-CbhkDUJ2.js} +1 -1
  8. package/web/assets/{DocsWorkspace-CbV27H6A.js → DocsWorkspace-CcB0LGFV.js} +1 -1
  9. package/web/assets/{IdeScreen-BY7sm97W.js → IdeScreen-DI4v3ZkU.js} +1 -1
  10. package/web/assets/{LeadScreen-BFwI29zS.js → LeadScreen-BdS_xX_f.js} +1 -1
  11. package/web/assets/{ReviewScreen-pM6zzGZl.js → ReviewScreen-Ddw5U2sM.js} +1 -1
  12. package/web/assets/{SchedulerScreen-BIhqn3X1.js → SchedulerScreen-D6LGVrhM.js} +1 -1
  13. package/web/assets/{SettingsScreen-C_TW3mbs.js → SettingsScreen-CFNcg1T8.js} +1 -1
  14. package/web/assets/{TeamScreen-RT926lDf.js → TeamScreen-BkxPDI5P.js} +1 -1
  15. package/web/assets/TerminalScreen-CEQFK9Rc.js +2 -0
  16. package/web/assets/{TriageScreen-Zp1bdRnl.js → TriageScreen-B-HdZsEt.js} +1 -1
  17. package/web/assets/{VpsScreen-Jnb8C1o2.js → VpsScreen-CWp29NL_.js} +2 -2
  18. package/web/assets/{fields-B_3dIGcG.js → fields-BY7SYerd.js} +1 -1
  19. package/web/assets/{index-C3KwOJxI.css → index-B4b6i2tH.css} +1 -1
  20. package/web/assets/index-C4Py9MJV.js +1032 -0
  21. package/web/assets/{live-CNp86nGW.js → live-CBa_7-hn.js} +1 -1
  22. package/web/assets/{sched-lead-shared-BUcJMfNH.js → sched-lead-shared-CQIoYIzG.js} +1 -1
  23. package/web/assets/{settings-rebase-CYr7W_rB.js → settings-rebase-C3611gs8.js} +1 -1
  24. package/web/index.html +2 -2
  25. package/web/assets/TerminalScreen-fpC5a2jS.js +0 -2
  26. package/web/assets/index-CbX7iwxN.js +0 -1012
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.9.37",
3
- "sha": "f525bd45",
4
- "builtAt": "2026-10-30T09:03:54.676Z"
2
+ "version": "0.9.38",
3
+ "sha": "fb8cc7c9",
4
+ "builtAt": "2026-10-31T04:05:47.472Z"
5
5
  }
package/dist/cli.js CHANGED
@@ -4166,12 +4166,13 @@ var init_spec_source = __esm({
4166
4166
  function resolveMethod(id) {
4167
4167
  return (id ? METHODS[id] : void 0) ?? METHODS[DEFAULT_METHOD];
4168
4168
  }
4169
- var DEFAULT_METHOD, VERIFICATION_GATE, MATT_CLAUSE, AGENT_SKILLS_CLAUSE, METHODS, METHOD_IDS, uniq, PLAN_DIRS, SPEC_DIRS;
4169
+ var DEFAULT_METHOD, VERIFICATION_GATE, MOCKUP_SKILL, MATT_CLAUSE, AGENT_SKILLS_CLAUSE, METHODS, METHOD_IDS, uniq, PLAN_DIRS, SPEC_DIRS;
4170
4170
  var init_method_catalog = __esm({
4171
4171
  "../shared/src/method-catalog.ts"() {
4172
4172
  "use strict";
4173
4173
  DEFAULT_METHOD = "superpowers";
4174
4174
  VERIFICATION_GATE = "superpowers:verification-before-completion";
4175
+ MOCKUP_SKILL = "codex-image";
4175
4176
  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
4177
  AGENT_SKILLS_CLAUSE = "Pakai skill Agent Skills langsung sesuai fase, bukan slash-command atau meta-router `using-agent-skills`. Kontrak fase, instruksi project/pengguna, dan jalur keputusan/review hanoman tetap berlaku: `spec-driven-development` hanya menyusun spec pada fase Spec, jangan menjalankan Plan atau Execute dari fase itu. Simpan spec di `docs/agent-skills/specs/` dan plan beserta SELURUH checklist task `- [ ]` di `docs/agent-skills/plans/`, dengan id backlog pada nama berkas; ini menggantikan default `SPEC.md`, `tasks/plan.md`, dan `tasks/todo.md` upstream. Jangan menimpa plan lain yang belum tuntas atau membuat tiket di tracker eksternal: hanoman adalah issue tracker-nya. Centang task di berkas plan yang sama setelah implementasi dan verifikasi. Hal ambigu yang mempengaruhi hasil mengikuti jalur tanya prompt ini; bila kamu agen fase, daftarkan di `Keputusan terbuka:` laporanmu.";
4177
4178
  METHODS = {
@@ -4186,6 +4187,7 @@ var init_method_catalog = __esm({
4186
4187
  phaseSkills: {
4187
4188
  Brainstorm: ["superpowers:brainstorming"],
4188
4189
  Audit: ["superpowers:systematic-debugging"],
4190
+ Mockup: [MOCKUP_SKILL],
4189
4191
  Plan: ["superpowers:writing-plans"],
4190
4192
  Execute: [
4191
4193
  "superpowers:executing-plans",
@@ -4231,6 +4233,7 @@ var init_method_catalog = __esm({
4231
4233
  phaseSkills: {
4232
4234
  Brainstorm: ["mattpocock-skills:grilling"],
4233
4235
  Audit: ["mattpocock-skills:diagnosing-bugs"],
4236
+ Mockup: [MOCKUP_SKILL],
4234
4237
  Plan: ["mattpocock-skills:to-tickets"],
4235
4238
  Execute: [
4236
4239
  "mattpocock-skills:implement",
@@ -4269,6 +4272,7 @@ var init_method_catalog = __esm({
4269
4272
  phaseSkills: {
4270
4273
  Brainstorm: ["agent-skills:idea-refine"],
4271
4274
  Spec: ["agent-skills:spec-driven-development"],
4275
+ Mockup: [MOCKUP_SKILL],
4272
4276
  Audit: [
4273
4277
  "agent-skills:debugging-and-error-recovery",
4274
4278
  "agent-skills:code-review-and-quality"
@@ -4312,7 +4316,7 @@ var init_method_catalog = __esm({
4312
4316
 
4313
4317
  // ../shared/src/method-status.ts
4314
4318
  function methodSkills(m) {
4315
- return [.../* @__PURE__ */ new Set([...Object.values(m.phaseSkills).flat(), ...m.exitSkills])];
4319
+ return [.../* @__PURE__ */ new Set([...Object.values(m.phaseSkills).flat(), ...m.exitSkills])].filter((id) => !HANOMAN_PROVIDED_SKILLS.has(id));
4316
4320
  }
4317
4321
  function methodStatus(m, agent, installed) {
4318
4322
  const haveSkills = new Set(installed.skills);
@@ -4330,10 +4334,12 @@ function methodStatus(m, agent, installed) {
4330
4334
  install: [...m.install[agent]]
4331
4335
  };
4332
4336
  }
4333
- var ANTIGRAVITY_METHOD_UNAVAILABLE_REASON;
4337
+ var HANOMAN_PROVIDED_SKILLS, ANTIGRAVITY_METHOD_UNAVAILABLE_REASON;
4334
4338
  var init_method_status = __esm({
4335
4339
  "../shared/src/method-status.ts"() {
4336
4340
  "use strict";
4341
+ init_method_catalog();
4342
+ HANOMAN_PROVIDED_SKILLS = /* @__PURE__ */ new Set([MOCKUP_SKILL]);
4337
4343
  ANTIGRAVITY_METHOD_UNAVAILABLE_REASON = "Installer metode Antigravity belum terverifikasi dari upstream";
4338
4344
  }
4339
4345
  });
@@ -4814,8 +4820,10 @@ var init_orchestration = __esm({
4814
4820
  ];
4815
4821
  FLOW_PHASES = {
4816
4822
  // 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"],
4823
+ // ADR-0233 · `Mockup` = fase opsional sesudah Spec: gambar UI disetujui sebelum Plan, dilewati agen
4824
+ // bila backlog tak menyentuh UI.
4825
+ feature: ["Brainstorm", "Objective", "Spec", "Mockup", "Plan", "Execute", "Review"],
4826
+ qa: ["Audit", "Spec", "Mockup", "Plan", "Execute", "Review"],
4819
4827
  scaffold: ["Brainstorm", "Objective", "Doc index"],
4820
4828
  reverse: ["Scan", "Docs teknis", "Wawancara", "Konvensi & index", "Serah terima"],
4821
4829
  prd: ["Brainstorm", "PRD"],
@@ -4850,7 +4858,7 @@ var init_runtime_defaults = __esm({
4850
4858
  "use strict";
4851
4859
  init_orchestration();
4852
4860
  init_zod();
4853
- RUNTIME_DEFAULTS_VERSION = "2026-10-25-v1";
4861
+ RUNTIME_DEFAULTS_VERSION = "2026-10-31-v1";
4854
4862
  zRuntimeDefaultState = external_exports.enum(["seeded", "user"]);
4855
4863
  zBuiltinRuntimeDefaults = external_exports.object({
4856
4864
  version: external_exports.string().default(RUNTIME_DEFAULTS_VERSION),
@@ -4882,6 +4890,7 @@ var init_runtime_defaults = __esm({
4882
4890
  Brainstorm: cell("sonnet", "medium"),
4883
4891
  Objective: cell("sonnet", "medium"),
4884
4892
  Spec: cell("opus", "high"),
4893
+ Mockup: cell("sonnet", "medium"),
4885
4894
  Plan: cell("opus", "high"),
4886
4895
  Execute: cell("sonnet", "high"),
4887
4896
  Review: cell("opus", "high")
@@ -4890,6 +4899,7 @@ var init_runtime_defaults = __esm({
4890
4899
  Brainstorm: cell("gpt-5.6-terra", "medium"),
4891
4900
  Objective: cell("gpt-5.6-terra", "medium"),
4892
4901
  Spec: cell("gpt-5.6-sol", "high"),
4902
+ Mockup: cell("gpt-5.6-terra", "medium"),
4893
4903
  Plan: cell("gpt-5.6-sol", "high"),
4894
4904
  Execute: cell("gpt-5.6-terra", "high"),
4895
4905
  Review: cell("gpt-5.6-sol", "high")
@@ -4899,6 +4909,7 @@ var init_runtime_defaults = __esm({
4899
4909
  {
4900
4910
  Audit: cell("opus", "high"),
4901
4911
  Spec: cell("opus", "high"),
4912
+ Mockup: cell("sonnet", "medium"),
4902
4913
  Plan: cell("sonnet", "high"),
4903
4914
  Execute: cell("sonnet", "high"),
4904
4915
  Review: cell("opus", "high")
@@ -4906,6 +4917,7 @@ var init_runtime_defaults = __esm({
4906
4917
  {
4907
4918
  Audit: cell("gpt-5.6-sol", "high"),
4908
4919
  Spec: cell("gpt-5.6-sol", "high"),
4920
+ Mockup: cell("gpt-5.6-terra", "medium"),
4909
4921
  Plan: cell("gpt-5.6-terra", "high"),
4910
4922
  Execute: cell("gpt-5.6-terra", "high"),
4911
4923
  Review: cell("gpt-5.6-sol", "high")
@@ -6819,7 +6831,7 @@ function parseExitIntent(text) {
6819
6831
  const m = /^(\d+) (\d+)\s*$/.exec(text ?? "");
6820
6832
  return m ? { pid: Number(m[1]), code: Number(m[2]) } : null;
6821
6833
  }
6822
- var zIssueDeviceToken, zSessionResult, zSessionHistory, zCreateProject, zProjectId, zRenameProject, zUpdateProject, zCreateSpec, zPatchSpec, zChangeSpecSource, zMarkSpecDone, zMarkSpecReviewed, zIntegrate, zSessionSummary, zProjectView, zSchedulerQueueItem, zSchedulerSourceView, zSchedulerSessionView, zSchedulerQueueCounts, zSchedulerState, zLeadDecisionView, zLeadFlowView, zLeadAnswer, zLeadProjectStatus, zLeadStatusView, zFlow, zPrdBrief, zPrdDoc, zBreakdownItem, zBreakdownDoc, zBatchCreateSpec, zEscalationTarget, zEscalationPrefill, zAuditEscalation, zAuditEscalationView, zTerminalSession, zDocFileContent, zDocIndexCat, zDocIndex, HOST_RE, USER_RE, zCreateVps, zPatchVps, USER_ROLES, zUserRole, zLogin, zSignup, zSetup, zSetupApply, zChangePassword, zAdminPasswordReset, zCreateClientAccount, zUpdateClientAccount, zVpsCheck, zMarkNa, zMarkNaBulk, zAttest, zRemediate, PROVISION_PROFILES, COMPONENT_IDS, zProvision, UPDATE_RESTART_EXIT, CONFIG_RESTART_EXIT, MANUAL_RESTART_EXIT, EXIT_INTENT_FILE, zUpdateApplyBody, MAX_SUBS, zSubPage, zSubLimit, zTopicParams, zEventsClientMsg, zTicketView, zTicketAttachmentView, zSpecAttachmentView, zTicketDetail, zTicketEditInput, zHelpInfo, zPublicTicketStatus, zCronExpr, zCreateCron, zPatchCron, zSchedulerCron, zSchedulerCronRun;
6834
+ var zIssueDeviceToken, zSessionResult, zSessionHistory, zCreateProject, zProjectId, zRenameProject, zUpdateProject, zCreateSpec, zPatchSpec, zChangeSpecSource, zMarkSpecDone, zMarkSpecReviewed, zIntegrate, zSessionSummary, zProjectView, zSchedulerQueueItem, zSchedulerSourceView, zSchedulerSessionView, zSchedulerQueueCounts, zSchedulerState, zLeadDecisionView, zLeadFlowView, zLeadAnswer, zLeadProjectStatus, zLeadStatusView, zFlow, zPrdBrief, zPrdDoc, zBreakdownItem, zBreakdownDoc, zBatchCreateSpec, zEscalationTarget, zEscalationPrefill, zAuditEscalation, zAuditEscalationView, zTerminalSession, zDocFileContent, zDocIndexCat, zDocIndex, HOST_RE, USER_RE, zCreateVps, zPatchVps, USER_ROLES, zUserRole, zLogin, zSignup, zSetup, zSetupApply, zChangePassword, zAdminPasswordReset, zCreateClientAccount, zUpdateClientAccount, zVpsCheck, zMarkNa, zMarkNaBulk, zAttest, zRemediate, PROVISION_PROFILES, COMPONENT_IDS, zProvision, UPDATE_RESTART_EXIT, CONFIG_RESTART_EXIT, MANUAL_RESTART_EXIT, EXIT_INTENT_FILE, zUpdateApplyBody, MAX_SUBS, zSubPage, zSubLimit, zTopicParams, zEventsClientMsg, zTicketView, zTicketAttachmentView, zSpecAttachmentView, zMockupItem, zSpecMockups, zTicketDetail, zTicketEditInput, zHelpInfo, zPublicTicketStatus, zCronExpr, zCreateCron, zPatchCron, zSchedulerCron, zSchedulerCronRun;
6823
6835
  var init_dto = __esm({
6824
6836
  "../shared/src/dto.ts"() {
6825
6837
  "use strict";
@@ -7442,6 +7454,12 @@ var init_dto = __esm({
7442
7454
  size: external_exports.number().int(),
7443
7455
  createdAt: external_exports.string()
7444
7456
  });
7457
+ zMockupItem = external_exports.object({ name: external_exports.string(), size: external_exports.number().int(), modifiedAt: external_exports.string() });
7458
+ zSpecMockups = external_exports.object({
7459
+ source: external_exports.enum(["worktree", "repo"]).nullable(),
7460
+ dir: external_exports.string().nullable(),
7461
+ items: external_exports.array(zMockupItem)
7462
+ });
7445
7463
  zTicketDetail = zTicketView.extend({
7446
7464
  detail: external_exports.string(),
7447
7465
  attachments: external_exports.array(zTicketAttachmentView),
@@ -7592,6 +7610,9 @@ var init_api = __esm({
7592
7610
  // SPEC-843 · ADR-0124 · lampiran backlog item (multi-berkas per request).
7593
7611
  specAttachments: (id) => `${API}/specs/${id}/attachments`,
7594
7612
  specAttachment: (id, attId) => `${API}/specs/${id}/attachments/${attId}`,
7613
+ // ADR-0233 · mockup UI backlog (docs/mockups/<spec-id>/).
7614
+ specMockups: (id) => `${API}/specs/${id}/mockups`,
7615
+ specMockup: (id, name) => `${API}/specs/${id}/mockups/${encodeURIComponent(name)}`,
7595
7616
  specReview: (id) => `${API}/specs/${id}/review`,
7596
7617
  specReviewFile: (id, path) => `${API}/specs/${id}/review/${path}`,
7597
7618
  // ADR-0213 · hapus worktree satu backlog item (cabang & commit tetap).
@@ -9645,6 +9666,19 @@ var init_backlog = __esm({
9645
9666
  build: (a) => ({ method: "GET", path: `/specs/${enc(String(a.spec))}/attachments` }),
9646
9667
  shape: (raw) => raw
9647
9668
  },
9669
+ // ADR-0233 · mockup UI hasil fase Mockup, dibaca dari worktree sesi atau checkout project.
9670
+ {
9671
+ name: "hanoman_backlog_mockups_list",
9672
+ title: "Daftar mockup backlog",
9673
+ description: "Daftar gambar mockup UI sebuah backlog item (hasil fase Mockup, `docs/mockups/<spec-id>/`): `source` (`worktree` sesi atau `repo` checkout project, null bila belum ada), `dir` (path absolut folder di MESIN SERVER hanoman \u2014 baca langsung bila kamu di mesin yang sama), dan `items` {name, size, modifiedAt}. Unduh satu gambar ke disk klien dengan hanoman_backlog_mockup_download.",
9674
+ inputSchema: obj({ properties: { spec: str(ID_HINT) }, required: ["spec"] }),
9675
+ mode: "read",
9676
+ capability: "backlog:read",
9677
+ samplePath: "/specs/SPEC-1/mockups",
9678
+ sampleMethod: "GET",
9679
+ build: (a) => ({ method: "GET", path: `/specs/${enc(String(a.spec))}/mockups` }),
9680
+ shape: (raw) => raw
9681
+ },
9648
9682
  {
9649
9683
  name: "hanoman_backlog_attachment_delete",
9650
9684
  title: "Hapus lampiran backlog",
@@ -13263,6 +13297,26 @@ var init_transfer = __esm({
13263
13297
  build: (a) => ({ method: "GET", path: `${specOne(a)}/${enc(String(a.attachment))}`, download: dlFile(a, "lampiran") }),
13264
13298
  shape: (raw) => raw
13265
13299
  },
13300
+ // ADR-0233 · mockup UI backlog (`docs/mockups/<spec-id>/`), biner → transfer tool (preseden ADR-0183).
13301
+ {
13302
+ name: "hanoman_backlog_mockup_download",
13303
+ title: "Unduh mockup backlog",
13304
+ description: `Mengunduh SATU gambar mockup UI backlog item ke disk lokal klien MCP. Nama berkas dari hanoman_backlog_mockups_list. ${DOWNLOAD_RESULT}`,
13305
+ inputSchema: obj({
13306
+ properties: { spec: SPEC, name: str("Nama berkas mockup, mis. `01-backlog-detail.png`."), savePath: SAVE_PATH, overwrite: OVERWRITE },
13307
+ required: ["spec", "name"]
13308
+ }),
13309
+ mode: "write",
13310
+ capability: "backlog:read",
13311
+ samplePath: "/specs/SPEC-1/mockups/01-x.png",
13312
+ sampleMethod: "GET",
13313
+ build: (a) => ({
13314
+ method: "GET",
13315
+ path: `/specs/${enc(String(a.spec))}/mockups/${enc(String(a.name))}`,
13316
+ download: dlFile(a, String(a.name ?? "mockup.png"))
13317
+ }),
13318
+ shape: (raw) => raw
13319
+ },
13266
13320
  // ───────────────────────── lampiran tiket ─────────────────────────
13267
13321
  {
13268
13322
  name: "hanoman_ticket_attachment_download",
@@ -15431,7 +15485,7 @@ var init_goal_spec = __esm({
15431
15485
  });
15432
15486
 
15433
15487
  // ../runner/src/prompt.ts
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;
15488
+ var DECIDER, ASK_ROUTE, ASK_ESCALATION_TOOL, ASK_DECISIONS_TOOL, AMBIGUOUS, AUTONOMY_CLAUSE, AUTONOMY_CLAUSE_FULL, mockupGuide, MOCKUP_SINGLE, ESCALATION_CONTRACT, PROJECT_METHOD, REVERSE_PHASE_GUIDE, SCAFFOLD_PHASE_GUIDE;
15435
15489
  var init_prompt = __esm({
15436
15490
  "../runner/src/prompt.ts"() {
15437
15491
  "use strict";
@@ -15447,6 +15501,11 @@ var init_prompt = __esm({
15447
15501
  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)";
15448
15502
  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.`;
15449
15503
  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.`;
15504
+ mockupGuide = (ask, close) => `putuskan dulu dari dokumen spec (qa jalur cepat: dokumen audit) apakah backlog ini mengubah atau membuat UI \u2014 layar, komponen, atau state yang terlihat pengguna. Tidak ada (perbaikan backend, CLI, refactor, docs) \u2192 fase ini dilewati, sebutkan alasannya dalam satu baris; ragu \u2192 anggap ada UI. Ada \u2192 baca design system project bila ada (mis. \`internal/docs/design-system/**\`, \`DESIGN.md\`) dan kode layar yang akan berubah, muat skill \`codex-image\`, lalu hasilkan SATU gambar per layar/state yang berubah, maks 6: desktop \`1536x1024\`, tambah mobile \`1024x1536\` bila layout responsif tersentuh, ke \`docs/mockups/<spec-id>/<NN>-<slug>.png\` (spec-id huruf kecil, NN dua digit urut). Tambahkan bagian \`## Mockup\` di dokumen spec: tiap berkas, layar/state yang ditunjukkannya, dan apa yang berubah. Lalu minta persetujuan ${ask}: sebutkan path absolut setiap gambar dan baris \`Lihat di hanoman: Backlog <SPEC-ID> \u2192 Mockup\`, dengan opsi Setujui \xB7 Revisi (beserta catatan) \xB7 Lewati mockup. Revisi \u2192 buat ulang gambar yang diminta dengan spec gambar LENGKAP ditambah koreksinya (bukan koreksinya saja), timpa berkas yang sama, lalu minta persetujuan lagi. Lewati \u2192 hapus berkas mockup yang belum di-commit. Disetujui \u2192 commit \`docs/mockups/<spec-id>/\` beserta dokumen spec. Bila gambar tak bisa dihasilkan (Codex tak terpasang/belum login, image_gen gagal dua kali), JANGAN membuat pengganti (SVG/CSS/HTML yang dirasterisasi, emoji, atau placeholder bernama sama) \u2014 tanyakan dengan jalur yang sama: tunggu operator menjalankan \`codex login\` lalu lanjut, atau lewati mockup. ${close}`;
15505
+ MOCKUP_SINGLE = "Fase Mockup: " + mockupGuide(
15506
+ "lewat jalur tanya di klausa otonomi prompt ini",
15507
+ "Tulis `Mockup done` sesudah disetujui & di-commit, atau `Mockup skipped` bila dilewati."
15508
+ );
15450
15509
  ESCALATION_CONTRACT = [
15451
15510
  "REKOMENDASI ESKALASI (wajib, terbaca mesin). Di bagian akhir dokumen audit, tulis bagian",
15452
15511
  "`## Rekomendasi eskalasi` berisi penjelasan singkat untuk manusia, LALU tepat SATU blok ```json",
@@ -16695,6 +16754,9 @@ function doctorReport(p3) {
16695
16754
  text: p3.antigravity ? `Antigravity CLI ${p3.antigravity} \u2014 auth manual; ${p3.sandboxRequired ? "sandbox belum didukung" : "host/lab; jalankan agy untuk login; autentikasi belum diverifikasi"}` : p3.sandboxRequired ? "Antigravity CLI \u2014 host/lab saja; sandbox belum didukung; probe/login tidak dijalankan" : "Antigravity CLI \u2014 tak ada (opsional; install/login manual)",
16696
16755
  fatal: false
16697
16756
  },
16757
+ // ADR-0233 · fase Mockup di claude/antigravity menghasilkan gambar lewat `codex exec` (skill
16758
+ // codex-image). Tanpa codex fase itu tak bisa menggambar — sesi tetap jalan, operator ditanya.
16759
+ ...!p3.codex && (p3.claude || p3.antigravity) ? [{ mark: "!", text: "fase Mockup di runtime non-codex butuh codex CLI yang sudah login (`codex login`)", fatal: false }] : [],
16698
16760
  // SPEC-471 · ADR-0095 · `gh` opsional: tanpa dia tarik issue jatuh ke HTTPS + GITHUB_TOKEN.
16699
16761
  {
16700
16762
  mark: p3.gh ? "\u2713" : "\xB7",
@@ -38708,6 +38770,8 @@ function copyPlan(repo) {
38708
38770
  { from: join15(repo, "docs/agent-integration.md"), to: "docs/agent-integration.md" },
38709
38771
  // SPEC-883 · skrip VPS (audit/harden/remediate/provision) dibaca runtime lewat scriptPath().
38710
38772
  { from: join15(repo, "server/scripts/vps"), to: "scripts/vps", dir: true },
38773
+ // ADR-0233 · skill bundel (codex-image), dibaca runtime lewat bundledSkillsDir().
38774
+ { from: join15(repo, "server/skills"), to: "skills", dir: true },
38711
38775
  { from: join15(repo, "LICENSE"), to: "LICENSE" }
38712
38776
  ];
38713
38777
  }
@@ -38749,7 +38813,11 @@ var init_pack = __esm({
38749
38813
  "scripts/vps/audit.sh",
38750
38814
  "scripts/vps/harden.sh",
38751
38815
  "scripts/vps/remediate.sh",
38752
- "scripts/vps/provision.sh"
38816
+ "scripts/vps/provision.sh",
38817
+ // ADR-0233 · skill bundel di-seed ke $HANOMAN_HOME/skills oleh bundledSkillsDir() — tanpa berkas ini
38818
+ // fase Mockup di runtime non-codex kehilangan skill-nya di setiap instalasi npm.
38819
+ "skills/codex-image/SKILL.md",
38820
+ "skills/codex-image/scripts/codex-image.sh"
38753
38821
  ];
38754
38822
  BIN_SHIM = `#!/usr/bin/env node
38755
38823
  // SPEC-398 \xB7 shim tipis: seluruh logika ada di dist/cli.js (bundle esbuild).