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.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.9.8",
3
- "sha": "6b9cbf85",
4
- "builtAt": "2026-09-25T10:55:27.555Z"
2
+ "version": "0.9.10",
3
+ "sha": "a92773d5",
4
+ "builtAt": "2026-09-26T05:42:47.090Z"
5
5
  }
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 init_skills = __esm({
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
- init_skills();
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