hanoman 0.9.36 → 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 +88 -11
  3. package/dist/server.js +712 -407
  4. package/docs/agent-integration.md +9 -2
  5. package/package.json +1 -1
  6. package/web/assets/{DalangHanomanScreen-NmpJIcg6.js → DalangHanomanScreen-wpAO0xvb.js} +1 -1
  7. package/web/assets/{DocPreviewModal-DK597e3s.js → DocPreviewModal-CbhkDUJ2.js} +1 -1
  8. package/web/assets/{DocsWorkspace-BQX-HlzW.js → DocsWorkspace-CcB0LGFV.js} +1 -1
  9. package/web/assets/{IdeScreen-LeUPaFsS.js → IdeScreen-DI4v3ZkU.js} +1 -1
  10. package/web/assets/{LeadScreen-BVCKv46y.js → LeadScreen-BdS_xX_f.js} +1 -1
  11. package/web/assets/{ReviewScreen-C6NcJChq.js → ReviewScreen-Ddw5U2sM.js} +1 -1
  12. package/web/assets/{SchedulerScreen-2AH0R3TJ.js → SchedulerScreen-D6LGVrhM.js} +1 -1
  13. package/web/assets/{SettingsScreen-B4SVzh9m.js → SettingsScreen-CFNcg1T8.js} +1 -1
  14. package/web/assets/{TeamScreen-6XEfuZUm.js → TeamScreen-BkxPDI5P.js} +1 -1
  15. package/web/assets/TerminalScreen-CEQFK9Rc.js +2 -0
  16. package/web/assets/{TriageScreen-BYJxyCar.js → TriageScreen-B-HdZsEt.js} +1 -1
  17. package/web/assets/{VpsScreen-Df37dgKx.js → VpsScreen-CWp29NL_.js} +2 -2
  18. package/web/assets/{fields-C94HI0V8.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-5ezoV9Fs.js → live-CBa_7-hn.js} +1 -1
  22. package/web/assets/{sched-lead-shared-BpZu6N2A.js → sched-lead-shared-CQIoYIzG.js} +1 -1
  23. package/web/assets/{settings-rebase-DaTGgcuO.js → settings-rebase-C3611gs8.js} +1 -1
  24. package/web/index.html +2 -2
  25. package/web/assets/TerminalScreen-DubD6vT-.js +0 -2
  26. package/web/assets/index-BeFSh2Ba.js +0 -1012
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.9.36",
3
- "sha": "40fd09e5",
4
- "builtAt": "2026-10-25T08:39:29.269Z"
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";
@@ -7234,7 +7246,13 @@ var init_dto = __esm({
7234
7246
  agent: zAgent.optional(),
7235
7247
  model: external_exports.string().optional(),
7236
7248
  effort: external_exports.string().optional(),
7237
- force: external_exports.boolean().optional()
7249
+ force: external_exports.boolean().optional(),
7250
+ // ADR-0232 · opsional: `worktree:true` → sesi lahir di `.worktrees/<id>` pada branch baru
7251
+ // `term/<id>` dari `branchFrom` (kosong → HEAD repo), alih-alih langsung di repoDir. Tanpa
7252
+ // keduanya body-nya byte-identik dengan sebelumnya. `branchFrom` tanpa `worktree` ditolak di
7253
+ // route — ia tak berarti apa-apa di repoDir dan diam-diam mengabaikannya menyesatkan.
7254
+ worktree: external_exports.boolean().optional(),
7255
+ branchFrom: external_exports.string().min(1).max(255).optional()
7238
7256
  }),
7239
7257
  // SPEC-252 · ADR-0061 — model & effort per SESI: override opsional saat Start; kosong → global.
7240
7258
  // SPEC-332 · ADR-0073 — mode goal per SESI: `goal` undefined → ikut Setting.goal.enabled,
@@ -7436,6 +7454,12 @@ var init_dto = __esm({
7436
7454
  size: external_exports.number().int(),
7437
7455
  createdAt: external_exports.string()
7438
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
+ });
7439
7463
  zTicketDetail = zTicketView.extend({
7440
7464
  detail: external_exports.string(),
7441
7465
  attachments: external_exports.array(zTicketAttachmentView),
@@ -7586,6 +7610,9 @@ var init_api = __esm({
7586
7610
  // SPEC-843 · ADR-0124 · lampiran backlog item (multi-berkas per request).
7587
7611
  specAttachments: (id) => `${API}/specs/${id}/attachments`,
7588
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)}`,
7589
7616
  specReview: (id) => `${API}/specs/${id}/review`,
7590
7617
  specReviewFile: (id, path) => `${API}/specs/${id}/review/${path}`,
7591
7618
  // ADR-0213 · hapus worktree satu backlog item (cabang & commit tetap).
@@ -9639,6 +9666,19 @@ var init_backlog = __esm({
9639
9666
  build: (a) => ({ method: "GET", path: `/specs/${enc(String(a.spec))}/attachments` }),
9640
9667
  shape: (raw) => raw
9641
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
+ },
9642
9682
  {
9643
9683
  name: "hanoman_backlog_attachment_delete",
9644
9684
  title: "Hapus lampiran backlog",
@@ -11655,6 +11695,8 @@ var init_sessions = __esm({
11655
11695
  } })
11656
11696
  },
11657
11697
  prdPath: str("flow `breakdown`: jalur PRD yang dipecah. WAJIB untuk alur itu."),
11698
+ 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."),
11699
+ branchFrom: str("Bersama `worktree: true`: branch/ref asal worktree (lokal atau origin). Kosong = HEAD repo."),
11658
11700
  force: bool("Lewati gerbang dependency. Pakai HANYA sesudah melihat daftar pemblokirnya.")
11659
11701
  },
11660
11702
  allOf: [
@@ -11684,7 +11726,8 @@ var init_sessions = __esm({
11684
11726
  if (flow2 === "breakdown") return { method: "POST", path: "/terminal/sessions", body: { project, flow: flow2, prdPath: String(a.prdPath) } };
11685
11727
  if (flow2 === "reverse" || flow2 === "scaffold") return { method: "POST", path: "/terminal/sessions", body: { project, flow: flow2 } };
11686
11728
  const body = { project };
11687
- for (const k of ["agent", "model", "effort"]) if (s(a[k]) !== void 0) body[k] = s(a[k]);
11729
+ for (const k of ["agent", "model", "effort", "branchFrom"]) if (s(a[k]) !== void 0) body[k] = s(a[k]);
11730
+ if (typeof a.worktree === "boolean") body.worktree = a.worktree;
11688
11731
  return { method: "POST", path: "/terminal/sessions", body };
11689
11732
  },
11690
11733
  shape: (raw) => raw
@@ -13254,6 +13297,26 @@ var init_transfer = __esm({
13254
13297
  build: (a) => ({ method: "GET", path: `${specOne(a)}/${enc(String(a.attachment))}`, download: dlFile(a, "lampiran") }),
13255
13298
  shape: (raw) => raw
13256
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
+ },
13257
13320
  // ───────────────────────── lampiran tiket ─────────────────────────
13258
13321
  {
13259
13322
  name: "hanoman_ticket_attachment_download",
@@ -15422,7 +15485,7 @@ var init_goal_spec = __esm({
15422
15485
  });
15423
15486
 
15424
15487
  // ../runner/src/prompt.ts
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;
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;
15426
15489
  var init_prompt = __esm({
15427
15490
  "../runner/src/prompt.ts"() {
15428
15491
  "use strict";
@@ -15438,6 +15501,11 @@ var init_prompt = __esm({
15438
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)";
15439
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.`;
15440
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
+ );
15441
15509
  ESCALATION_CONTRACT = [
15442
15510
  "REKOMENDASI ESKALASI (wajib, terbaca mesin). Di bagian akhir dokumen audit, tulis bagian",
15443
15511
  "`## Rekomendasi eskalasi` berisi penjelasan singkat untuk manusia, LALU tepat SATU blok ```json",
@@ -16686,6 +16754,9 @@ function doctorReport(p3) {
16686
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)",
16687
16755
  fatal: false
16688
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 }] : [],
16689
16760
  // SPEC-471 · ADR-0095 · `gh` opsional: tanpa dia tarik issue jatuh ke HTTPS + GITHUB_TOKEN.
16690
16761
  {
16691
16762
  mark: p3.gh ? "\u2713" : "\xB7",
@@ -38699,6 +38770,8 @@ function copyPlan(repo) {
38699
38770
  { from: join15(repo, "docs/agent-integration.md"), to: "docs/agent-integration.md" },
38700
38771
  // SPEC-883 · skrip VPS (audit/harden/remediate/provision) dibaca runtime lewat scriptPath().
38701
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 },
38702
38775
  { from: join15(repo, "LICENSE"), to: "LICENSE" }
38703
38776
  ];
38704
38777
  }
@@ -38740,7 +38813,11 @@ var init_pack = __esm({
38740
38813
  "scripts/vps/audit.sh",
38741
38814
  "scripts/vps/harden.sh",
38742
38815
  "scripts/vps/remediate.sh",
38743
- "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"
38744
38821
  ];
38745
38822
  BIN_SHIM = `#!/usr/bin/env node
38746
38823
  // SPEC-398 \xB7 shim tipis: seluruh logika ada di dist/cli.js (bundle esbuild).