hanoman 0.9.8 → 0.9.10
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 +196 -4
- package/dist/server.js +2381 -1523
- package/docs/agent-integration.md +1 -0
- package/package.json +1 -1
- package/web/assets/{ChangelogScreen-BzuBQwxY.js → ChangelogScreen-Da78jnp1.js} +1 -1
- package/web/assets/{DalangHanomanScreen-6Z1RoINb.js → DalangHanomanScreen-B7-Lrqah.js} +1 -1
- package/web/assets/{DocPreviewModal-CIDz4ZzG.js → DocPreviewModal-36yPiHSF.js} +1 -1
- package/web/assets/{DocsWorkspace-CQ_EsxYz.js → DocsWorkspace-BAsW9nkA.js} +1 -1
- package/web/assets/{IdeScreen-C0dHzGLc.js → IdeScreen-6AsXUohg.js} +1 -1
- package/web/assets/{LeadScreen-BHU9MYR1.js → LeadScreen-BhA9UerU.js} +1 -1
- package/web/assets/{ReviewScreen-DZi2r33C.js → ReviewScreen-Xm3iOIi9.js} +1 -1
- package/web/assets/{SchedulerScreen-B5IdNK-B.js → SchedulerScreen-DxIUIubO.js} +1 -1
- package/web/assets/SettingsScreen-CkHaUjQi.js +62 -0
- package/web/assets/{TeamScreen-DV6IwXuC.js → TeamScreen-qV4iNE9e.js} +1 -1
- package/web/assets/{TerminalScreen-DFnBKKa2.js → TerminalScreen-CYn1w73Q.js} +1 -1
- package/web/assets/{TriageScreen-DoHczdu8.js → TriageScreen-CYVHXzmM.js} +1 -1
- package/web/assets/{VpsScreen-CghVzou6.js → VpsScreen-DHHQDqih.js} +1 -1
- package/web/assets/index-B5PoGChp.js +1017 -0
- package/web/assets/{live-fPTkukus.js → live-OOQO9Kac.js} +1 -1
- package/web/index.html +1 -1
- package/web/assets/SettingsScreen-CCGup_hQ.js +0 -62
- package/web/assets/index-B3niUZnk.js +0 -1014
package/dist/build-info.json
CHANGED
package/dist/cli.js
CHANGED
|
@@ -4197,6 +4197,8 @@ var init_method_catalog = __esm({
|
|
|
4197
4197
|
},
|
|
4198
4198
|
// ADR-0170 P2 · `executing-plans` sendiri berkata "If subagents are available, use
|
|
4199
4199
|
// superpowers:subagent-driven-development instead" — agen fase claude punya subagent.
|
|
4200
|
+
// Amandemen: dipakai HANYA bila `Setting.orchestration.<flow>.executeMode === "subagent"`
|
|
4201
|
+
// (default `inline`) — lihat `phaseSkillsFor`.
|
|
4200
4202
|
orchestratedPhaseSkills: {
|
|
4201
4203
|
Execute: [
|
|
4202
4204
|
"superpowers:subagent-driven-development",
|
|
@@ -4588,7 +4590,7 @@ var init_logs = __esm({
|
|
|
4588
4590
|
function phaseAgentName(phase) {
|
|
4589
4591
|
return PHASE_AGENT_PREFIX + phase.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
4590
4592
|
}
|
|
4591
|
-
var ORCHESTRATION_FLOWS, FLOW_PHASES, PHASE_AGENT_PREFIX, isPhaseAgentName, REVIEWER_CELL;
|
|
4593
|
+
var ORCHESTRATION_FLOWS, FLOW_PHASES, PHASE_AGENT_PREFIX, isPhaseAgentName, EXECUTE_MODE_FLOWS, REVIEWER_CELL;
|
|
4592
4594
|
var init_orchestration = __esm({
|
|
4593
4595
|
"../shared/src/orchestration.ts"() {
|
|
4594
4596
|
"use strict";
|
|
@@ -4623,6 +4625,9 @@ var init_orchestration = __esm({
|
|
|
4623
4625
|
};
|
|
4624
4626
|
PHASE_AGENT_PREFIX = "hanoman-fase-";
|
|
4625
4627
|
isPhaseAgentName = (name) => name.startsWith(PHASE_AGENT_PREFIX);
|
|
4628
|
+
EXECUTE_MODE_FLOWS = new Set(
|
|
4629
|
+
ORCHESTRATION_FLOWS.filter((f) => FLOW_PHASES[f].some((p3) => p3 === "Execute" || p3 === "Goal"))
|
|
4630
|
+
);
|
|
4626
4631
|
REVIEWER_CELL = "Review";
|
|
4627
4632
|
}
|
|
4628
4633
|
});
|
|
@@ -4649,7 +4654,7 @@ var init_runtime_defaults = __esm({
|
|
|
4649
4654
|
orchestration: external_exports.record(external_exports.string(), zRuntimeDefaultState).default({})
|
|
4650
4655
|
});
|
|
4651
4656
|
cell = (model, effort) => ({ model, effort });
|
|
4652
|
-
flow = (claude, codex, enabled = true) => ({ enabled, claude, codex });
|
|
4657
|
+
flow = (claude, codex, enabled = true) => ({ enabled, executeMode: "inline", claude, codex });
|
|
4653
4658
|
BUILTIN_ORCHESTRATION_DEFAULTS = {
|
|
4654
4659
|
feature: flow(
|
|
4655
4660
|
{
|
|
@@ -5015,6 +5020,8 @@ var init_entities = __esm({
|
|
|
5015
5020
|
);
|
|
5016
5021
|
zFlowOrchestration = external_exports.object({
|
|
5017
5022
|
enabled: external_exports.boolean().default(true),
|
|
5023
|
+
// Amandemen ADR-0170 P2 · lenient: nilai asing jatuh ke `inline`, bukan Setting gagal parse.
|
|
5024
|
+
executeMode: external_exports.enum(["inline", "subagent"]).catch("inline").default("inline"),
|
|
5018
5025
|
claude: external_exports.record(external_exports.string(), zPhaseCell).default({}),
|
|
5019
5026
|
codex: external_exports.record(external_exports.string(), zPhaseCell).default({})
|
|
5020
5027
|
});
|
|
@@ -5181,6 +5188,10 @@ var init_agent = __esm({
|
|
|
5181
5188
|
// baca tak pernah cukup untuk itu (kelas bug SPEC-405).
|
|
5182
5189
|
"agents:read",
|
|
5183
5190
|
"agents:write",
|
|
5191
|
+
// Skills library · domain TERSENDIRI, MENURUT METHOD: menulis skill mengubah instruksi yang
|
|
5192
|
+
// dibaca SETIAP sesi berikutnya (global hanoman disuntik ke semua project).
|
|
5193
|
+
"skills:read",
|
|
5194
|
+
"skills:write",
|
|
5184
5195
|
// SPEC-476 · ADR-0096 · context/memory/reply/audit kanal Telegram. Aksi produk tetap memakai
|
|
5185
5196
|
// capability domain produk masing-masing; domain ini tidak memberi akses shell atau sesi.
|
|
5186
5197
|
"telegram:read",
|
|
@@ -7498,6 +7509,12 @@ var init_api = __esm({
|
|
|
7498
7509
|
webhookDeliveries: (id) => `${API}/webhooks/${encodeURIComponent(id)}/deliveries`,
|
|
7499
7510
|
webhookDeliveryRetry: (id) => `${API}/webhooks/deliveries/${encodeURIComponent(id)}/retry`,
|
|
7500
7511
|
customAgent: (id) => `${API}/custom-agents/${encodeURIComponent(id)}`,
|
|
7512
|
+
skills: `${API}/skills`,
|
|
7513
|
+
skill: (key) => `${API}/skills/${encodeURIComponent(key)}`,
|
|
7514
|
+
skillTree: (key) => `${API}/skills/${encodeURIComponent(key)}/tree`,
|
|
7515
|
+
skillFile: (key) => `${API}/skills/${encodeURIComponent(key)}/file`,
|
|
7516
|
+
skillEntry: (key) => `${API}/skills/${encodeURIComponent(key)}/entry`,
|
|
7517
|
+
skillFork: (key) => `${API}/skills/${encodeURIComponent(key)}/fork`,
|
|
7501
7518
|
// SPEC-945 · ADR-0150 · papan tim. `members` GLOBAL (bukan per project) — task boleh tanpa
|
|
7502
7519
|
// project, jadi direktori orang tak bisa digantung pada project.
|
|
7503
7520
|
members: `${API}/members`,
|
|
@@ -10381,6 +10398,152 @@ var init_agents = __esm({
|
|
|
10381
10398
|
}
|
|
10382
10399
|
});
|
|
10383
10400
|
|
|
10401
|
+
// ../shared/src/mcp-catalog/skills.ts
|
|
10402
|
+
var SKILLS_TOOLS;
|
|
10403
|
+
var init_skills = __esm({
|
|
10404
|
+
"../shared/src/mcp-catalog/skills.ts"() {
|
|
10405
|
+
"use strict";
|
|
10406
|
+
init_mcp_schema();
|
|
10407
|
+
init_helpers();
|
|
10408
|
+
SKILLS_TOOLS = [
|
|
10409
|
+
{
|
|
10410
|
+
name: "hanoman_skills_list",
|
|
10411
|
+
title: "Daftar skill",
|
|
10412
|
+
description: "Skill dari semua sumber: global hanoman ($HANOMAN_HOME/skills, disuntik ke setiap sesi), user (~/.claude|~/.codex|~/.agents), plugin (baca-saja), dan per project (.claude/.agents/.codex/skills + folder lain berisi SKILL.md). Tanpa `project`: global + satu grup per project. Dengan `project`: global (bertanda shadowedBy bila ditimpa) + skill project itu.",
|
|
10413
|
+
inputSchema: obj({ properties: { project: str("Id project. Kosongkan untuk semua grup.") } }),
|
|
10414
|
+
mode: "read",
|
|
10415
|
+
capability: "skills:read",
|
|
10416
|
+
samplePath: "/skills",
|
|
10417
|
+
sampleMethod: "GET",
|
|
10418
|
+
build: (a) => ({ method: "GET", path: "/skills", query: query(s(a.project) ? { projectId: s(a.project) } : { scope: "all" }) }),
|
|
10419
|
+
shape: (raw) => raw
|
|
10420
|
+
},
|
|
10421
|
+
{
|
|
10422
|
+
name: "hanoman_skill_read",
|
|
10423
|
+
title: "Baca skill",
|
|
10424
|
+
description: "Tanpa `path`: pohon berkas skill. Dengan `path`: isi berkas + `hash` (dipakai sebagai baseHash saat menulis). Berkas biner/>1 MB hanya metadata.",
|
|
10425
|
+
inputSchema: obj({
|
|
10426
|
+
properties: { key: str("Key skill dari hanoman_skills_list."), path: str("Path relatif berkas, mis. SKILL.md.") },
|
|
10427
|
+
required: ["key"]
|
|
10428
|
+
}),
|
|
10429
|
+
mode: "read",
|
|
10430
|
+
capability: "skills:read",
|
|
10431
|
+
samplePath: "/skills/{key}/tree",
|
|
10432
|
+
sampleMethod: "GET",
|
|
10433
|
+
build: (a) => s(a.path) ? { method: "GET", path: `/skills/${enc(String(a.key))}/file`, query: query({ path: s(a.path) }) } : { method: "GET", path: `/skills/${enc(String(a.key))}/tree` },
|
|
10434
|
+
shape: (raw) => raw
|
|
10435
|
+
},
|
|
10436
|
+
{
|
|
10437
|
+
name: "hanoman_skill_write",
|
|
10438
|
+
title: "Tulis berkas skill",
|
|
10439
|
+
description: "Menulis satu berkas di skill. `baseHash` = hash dari hanoman_skill_read (409 bila berkas berubah sejak dibaca); kosongkan untuk berkas baru. Skill plugin \u2192 403. Menyunting skill global hanoman mempengaruhi SETIAP sesi berikutnya di semua project.",
|
|
10440
|
+
inputSchema: obj({
|
|
10441
|
+
properties: {
|
|
10442
|
+
key: str("Key skill."),
|
|
10443
|
+
path: str("Path relatif berkas."),
|
|
10444
|
+
content: str("Isi berkas lengkap."),
|
|
10445
|
+
baseHash: str("Hash saat dibaca; kosongkan untuk berkas baru.")
|
|
10446
|
+
},
|
|
10447
|
+
required: ["key", "path", "content"]
|
|
10448
|
+
}),
|
|
10449
|
+
mode: "write",
|
|
10450
|
+
capability: "skills:write",
|
|
10451
|
+
samplePath: "/skills/{key}/file",
|
|
10452
|
+
sampleMethod: "PUT",
|
|
10453
|
+
build: (a) => ({
|
|
10454
|
+
method: "PUT",
|
|
10455
|
+
path: `/skills/${enc(String(a.key))}/file`,
|
|
10456
|
+
query: query({ path: String(a.path) }),
|
|
10457
|
+
body: { content: String(a.content), baseHash: s(a.baseHash) ?? null }
|
|
10458
|
+
}),
|
|
10459
|
+
shape: (raw) => raw
|
|
10460
|
+
},
|
|
10461
|
+
{
|
|
10462
|
+
name: "hanoman_skill_create",
|
|
10463
|
+
title: "Buat skill",
|
|
10464
|
+
description: "Membuat skill baru berisi kerangka SKILL.md. `layer`: hanoman (global, disuntik ke SETIAP sesi di semua project), user (~/.claude|~/.codex|~/.agents lewat `source`), atau project (`project` wajib; `source` .claude/.agents/.codex). Nama kebab-case maks 64; nama terpakai \u2192 409.",
|
|
10465
|
+
inputSchema: obj({
|
|
10466
|
+
properties: {
|
|
10467
|
+
layer: enumStr(["hanoman", "user", "project"], "Lapis tujuan."),
|
|
10468
|
+
name: str("Nama skill (kebab-case)."),
|
|
10469
|
+
description: str('Deskripsi \u2014 diawali kapan skill dipakai, mis. "Use when \u2026".'),
|
|
10470
|
+
source: enumStr([".claude", ".agents", ".codex"], "Sumber untuk lapis user/project. Default .claude."),
|
|
10471
|
+
project: str("Id project (wajib untuk layer project).")
|
|
10472
|
+
},
|
|
10473
|
+
required: ["layer", "name", "description"]
|
|
10474
|
+
}),
|
|
10475
|
+
mode: "write",
|
|
10476
|
+
capability: "skills:write",
|
|
10477
|
+
samplePath: "/skills",
|
|
10478
|
+
sampleMethod: "POST",
|
|
10479
|
+
build: (a) => ({
|
|
10480
|
+
method: "POST",
|
|
10481
|
+
path: "/skills",
|
|
10482
|
+
body: { layer: String(a.layer), name: String(a.name), description: String(a.description), source: s(a.source), projectId: s(a.project) }
|
|
10483
|
+
}),
|
|
10484
|
+
shape: (raw) => raw
|
|
10485
|
+
},
|
|
10486
|
+
{
|
|
10487
|
+
name: "hanoman_skill_fork",
|
|
10488
|
+
title: "Fork skill",
|
|
10489
|
+
description: "Menyalin skill mana pun (termasuk plugin yang baca-saja) ke global hanoman atau ke project, supaya bisa disunting. `name` default = nama asal.",
|
|
10490
|
+
inputSchema: obj({
|
|
10491
|
+
properties: {
|
|
10492
|
+
key: str("Key skill sumber."),
|
|
10493
|
+
layer: enumStr(["hanoman", "project"], "Tujuan. Default hanoman."),
|
|
10494
|
+
project: str("Id project (wajib untuk layer project)."),
|
|
10495
|
+
source: enumStr([".claude", ".agents", ".codex"], "Sumber tujuan untuk layer project."),
|
|
10496
|
+
name: str("Nama baru (opsional).")
|
|
10497
|
+
},
|
|
10498
|
+
required: ["key"]
|
|
10499
|
+
}),
|
|
10500
|
+
mode: "write",
|
|
10501
|
+
capability: "skills:write",
|
|
10502
|
+
samplePath: "/skills/hanoman~-~hanoman~contoh/fork",
|
|
10503
|
+
sampleMethod: "POST",
|
|
10504
|
+
build: (a) => ({
|
|
10505
|
+
method: "POST",
|
|
10506
|
+
path: `/skills/${enc(String(a.key))}/fork`,
|
|
10507
|
+
body: { layer: s(a.layer) ?? "hanoman", projectId: s(a.project), source: s(a.source), name: s(a.name) }
|
|
10508
|
+
}),
|
|
10509
|
+
shape: (raw) => raw
|
|
10510
|
+
},
|
|
10511
|
+
{
|
|
10512
|
+
name: "hanoman_skill_entry",
|
|
10513
|
+
title: "Buat / hapus berkas atau folder skill",
|
|
10514
|
+
description: "`action` create membuat berkas kosong atau folder (`kind`); delete menghapus berkas/folder (rekursif). SKILL.md tak bisa dihapus \u2014 hapus skill-nya. Skill plugin \u2192 403.",
|
|
10515
|
+
inputSchema: obj({
|
|
10516
|
+
properties: {
|
|
10517
|
+
key: str("Key skill."),
|
|
10518
|
+
path: str("Path relatif, mis. references/api.md."),
|
|
10519
|
+
action: enumStr(["create", "delete"], "Operasi."),
|
|
10520
|
+
kind: enumStr(["file", "dir"], "Untuk create. Default file.")
|
|
10521
|
+
},
|
|
10522
|
+
required: ["key", "path", "action"]
|
|
10523
|
+
}),
|
|
10524
|
+
mode: "write",
|
|
10525
|
+
capability: "skills:write",
|
|
10526
|
+
samplePath: "/skills/hanoman~-~hanoman~contoh/entry",
|
|
10527
|
+
sampleMethod: "POST",
|
|
10528
|
+
build: (a) => a.action === "delete" ? { method: "DELETE", path: `/skills/${enc(String(a.key))}/entry`, query: query({ path: String(a.path) }) } : { method: "POST", path: `/skills/${enc(String(a.key))}/entry`, body: { path: String(a.path), kind: s(a.kind) ?? "file" } },
|
|
10529
|
+
shape: (raw) => raw
|
|
10530
|
+
},
|
|
10531
|
+
{
|
|
10532
|
+
name: "hanoman_skill_delete",
|
|
10533
|
+
title: "Hapus skill (BERBAHAYA)",
|
|
10534
|
+
description: "BERBAHAYA \u2014 menghapus SELURUH folder skill dari disk \u2014 tak ada tempat sampah. Skill plugin \u2192 403. Menghapus skill global hanoman mencabutnya dari setiap sesi berikutnya di semua project. Hanya muncul saat tingkat `--danger` menyala.",
|
|
10535
|
+
inputSchema: obj({ properties: { key: str("Key skill.") }, required: ["key"] }),
|
|
10536
|
+
mode: "danger",
|
|
10537
|
+
capability: "skills:write",
|
|
10538
|
+
samplePath: "/skills/hanoman~-~hanoman~contoh",
|
|
10539
|
+
sampleMethod: "DELETE",
|
|
10540
|
+
build: (a) => ({ method: "DELETE", path: `/skills/${enc(String(a.key))}` }),
|
|
10541
|
+
shape: (raw) => raw
|
|
10542
|
+
}
|
|
10543
|
+
];
|
|
10544
|
+
}
|
|
10545
|
+
});
|
|
10546
|
+
|
|
10384
10547
|
// ../shared/src/mcp-catalog/telegram.ts
|
|
10385
10548
|
var CHAT, TELEGRAM_TOOLS;
|
|
10386
10549
|
var init_telegram2 = __esm({
|
|
@@ -11972,6 +12135,7 @@ var init_mcp_catalog = __esm({
|
|
|
11972
12135
|
init_ide();
|
|
11973
12136
|
init_settings();
|
|
11974
12137
|
init_agents();
|
|
12138
|
+
init_skills();
|
|
11975
12139
|
init_telegram2();
|
|
11976
12140
|
init_vps();
|
|
11977
12141
|
init_sessions();
|
|
@@ -11988,6 +12152,7 @@ var init_mcp_catalog = __esm({
|
|
|
11988
12152
|
...IDE_TOOLS,
|
|
11989
12153
|
...SETTINGS_TOOLS,
|
|
11990
12154
|
...AGENTS_TOOLS,
|
|
12155
|
+
...SKILLS_TOOLS,
|
|
11991
12156
|
...TELEGRAM_TOOLS,
|
|
11992
12157
|
...VPS_TOOLS,
|
|
11993
12158
|
...SESSIONS_TOOLS,
|
|
@@ -12264,6 +12429,13 @@ var init_model_catalog = __esm({
|
|
|
12264
12429
|
}
|
|
12265
12430
|
});
|
|
12266
12431
|
|
|
12432
|
+
// ../shared/src/skills.ts
|
|
12433
|
+
var init_skills2 = __esm({
|
|
12434
|
+
"../shared/src/skills.ts"() {
|
|
12435
|
+
"use strict";
|
|
12436
|
+
}
|
|
12437
|
+
});
|
|
12438
|
+
|
|
12267
12439
|
// ../shared/src/index.ts
|
|
12268
12440
|
var init_src = __esm({
|
|
12269
12441
|
"../shared/src/index.ts"() {
|
|
@@ -12315,6 +12487,7 @@ var init_src = __esm({
|
|
|
12315
12487
|
init_team();
|
|
12316
12488
|
init_model_catalog();
|
|
12317
12489
|
init_runtime_defaults();
|
|
12490
|
+
init_skills2();
|
|
12318
12491
|
}
|
|
12319
12492
|
});
|
|
12320
12493
|
|
|
@@ -12886,7 +13059,7 @@ function scanAgentSkills(agent, env = process.env, osHome = homedir2()) {
|
|
|
12886
13059
|
}
|
|
12887
13060
|
return { agent, home, roots, skills, packages: [...packages] };
|
|
12888
13061
|
}
|
|
12889
|
-
var
|
|
13062
|
+
var init_skills3 = __esm({
|
|
12890
13063
|
"../runner/src/skills.ts"() {
|
|
12891
13064
|
"use strict";
|
|
12892
13065
|
}
|
|
@@ -13112,6 +13285,23 @@ var init_subagent_statusline = __esm({
|
|
|
13112
13285
|
}
|
|
13113
13286
|
});
|
|
13114
13287
|
|
|
13288
|
+
// ../runner/src/skill-library.ts
|
|
13289
|
+
var init_skill_library = __esm({
|
|
13290
|
+
"../runner/src/skill-library.ts"() {
|
|
13291
|
+
"use strict";
|
|
13292
|
+
init_src();
|
|
13293
|
+
init_skills3();
|
|
13294
|
+
}
|
|
13295
|
+
});
|
|
13296
|
+
|
|
13297
|
+
// ../runner/src/skill-files.ts
|
|
13298
|
+
var init_skill_files = __esm({
|
|
13299
|
+
"../runner/src/skill-files.ts"() {
|
|
13300
|
+
"use strict";
|
|
13301
|
+
init_src();
|
|
13302
|
+
}
|
|
13303
|
+
});
|
|
13304
|
+
|
|
13115
13305
|
// ../runner/src/index.ts
|
|
13116
13306
|
var init_src2 = __esm({
|
|
13117
13307
|
"../runner/src/index.ts"() {
|
|
@@ -13134,13 +13324,15 @@ var init_src2 = __esm({
|
|
|
13134
13324
|
init_verify_scope();
|
|
13135
13325
|
init_code_style();
|
|
13136
13326
|
init_paths();
|
|
13137
|
-
|
|
13327
|
+
init_skills3();
|
|
13138
13328
|
init_telegram_operator();
|
|
13139
13329
|
init_spawn_helper();
|
|
13140
13330
|
init_config_env();
|
|
13141
13331
|
init_runtime_profile();
|
|
13142
13332
|
init_sandbox_probe();
|
|
13143
13333
|
init_subagent_statusline();
|
|
13334
|
+
init_skill_library();
|
|
13335
|
+
init_skill_files();
|
|
13144
13336
|
}
|
|
13145
13337
|
});
|
|
13146
13338
|
|