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.
- package/dist/build-info.json +3 -3
- package/dist/cli.js +88 -11
- package/dist/server.js +712 -407
- package/docs/agent-integration.md +9 -2
- package/package.json +1 -1
- package/web/assets/{DalangHanomanScreen-NmpJIcg6.js → DalangHanomanScreen-wpAO0xvb.js} +1 -1
- package/web/assets/{DocPreviewModal-DK597e3s.js → DocPreviewModal-CbhkDUJ2.js} +1 -1
- package/web/assets/{DocsWorkspace-BQX-HlzW.js → DocsWorkspace-CcB0LGFV.js} +1 -1
- package/web/assets/{IdeScreen-LeUPaFsS.js → IdeScreen-DI4v3ZkU.js} +1 -1
- package/web/assets/{LeadScreen-BVCKv46y.js → LeadScreen-BdS_xX_f.js} +1 -1
- package/web/assets/{ReviewScreen-C6NcJChq.js → ReviewScreen-Ddw5U2sM.js} +1 -1
- package/web/assets/{SchedulerScreen-2AH0R3TJ.js → SchedulerScreen-D6LGVrhM.js} +1 -1
- package/web/assets/{SettingsScreen-B4SVzh9m.js → SettingsScreen-CFNcg1T8.js} +1 -1
- package/web/assets/{TeamScreen-6XEfuZUm.js → TeamScreen-BkxPDI5P.js} +1 -1
- package/web/assets/TerminalScreen-CEQFK9Rc.js +2 -0
- package/web/assets/{TriageScreen-BYJxyCar.js → TriageScreen-B-HdZsEt.js} +1 -1
- package/web/assets/{VpsScreen-Df37dgKx.js → VpsScreen-CWp29NL_.js} +2 -2
- package/web/assets/{fields-C94HI0V8.js → fields-BY7SYerd.js} +1 -1
- package/web/assets/{index-C3KwOJxI.css → index-B4b6i2tH.css} +1 -1
- package/web/assets/index-C4Py9MJV.js +1032 -0
- package/web/assets/{live-5ezoV9Fs.js → live-CBa_7-hn.js} +1 -1
- package/web/assets/{sched-lead-shared-BpZu6N2A.js → sched-lead-shared-CQIoYIzG.js} +1 -1
- package/web/assets/{settings-rebase-DaTGgcuO.js → settings-rebase-C3611gs8.js} +1 -1
- package/web/index.html +2 -2
- package/web/assets/TerminalScreen-DubD6vT-.js +0 -2
- package/web/assets/index-BeFSh2Ba.js +0 -1012
package/dist/build-info.json
CHANGED
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
|
-
|
|
4818
|
-
|
|
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-
|
|
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).
|