hanoman 0.1.27 → 0.1.28

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.1.27",
3
- "sha": "8a20917",
4
- "builtAt": "2026-08-13T09:09:39.069Z"
2
+ "version": "0.1.28",
3
+ "sha": "c64dd22",
4
+ "builtAt": "2026-08-13T12:43:53.461Z"
5
5
  }
package/dist/cli.js CHANGED
@@ -7381,7 +7381,7 @@ var init_paths = __esm({
7381
7381
 
7382
7382
  // ../runner/src/skills.ts
7383
7383
  import { homedir as homedir2 } from "node:os";
7384
- import { join as join2 } from "node:path";
7384
+ import { basename, dirname as dirname2, join as join2, resolve as resolve2 } from "node:path";
7385
7385
  import { existsSync, readdirSync, readFileSync } from "node:fs";
7386
7386
  function agentSkillHome(agent, env = process.env, osHome = homedir2()) {
7387
7387
  const own = (agent === "codex" ? env.HANOMAN_CODEX_HOME : env.HANOMAN_CLAUDE_HOME)?.trim();
@@ -7392,6 +7392,9 @@ function agentSkillHome(agent, env = process.env, osHome = homedir2()) {
7392
7392
  }
7393
7393
  return join2(osHome, agent === "codex" ? ".codex" : ".claude");
7394
7394
  }
7395
+ function agentsSkillHome(env = process.env, osHome = homedir2()) {
7396
+ return env.HANOMAN_AGENTS_HOME?.trim() || join2(osHome, ".agents");
7397
+ }
7395
7398
  function dirsIn(dir) {
7396
7399
  try {
7397
7400
  return readdirSync(dir, { withFileTypes: true }).filter((e) => (e.isDirectory() || e.isSymbolicLink()) && !e.name.startsWith(".")).map((e) => e.name);
@@ -7406,8 +7409,51 @@ function readJson(file) {
7406
7409
  return null;
7407
7410
  }
7408
7411
  }
7409
- function skillsUnder(dir, pkg) {
7410
- return dirsIn(dir).filter((name) => existsSync(join2(dir, name, "SKILL.md"))).map((name) => ({ id: pkg ? `${pkg}:${name}` : name, name, pkg, dir: join2(dir, name) }));
7412
+ function isSkillDir(dir) {
7413
+ return existsSync(join2(dir, "SKILL.md"));
7414
+ }
7415
+ function asSkill(dir, pkg, name = basename(dir)) {
7416
+ return { id: pkg ? `${pkg}:${name}` : name, name, pkg, dir };
7417
+ }
7418
+ function skillsUnder(dir, pkg, depth = 2) {
7419
+ const out = [];
7420
+ for (const name of dirsIn(dir)) {
7421
+ const sub = join2(dir, name);
7422
+ if (isSkillDir(sub)) out.push(asSkill(sub, pkg, name));
7423
+ else if (depth > 1) out.push(...skillsUnder(sub, pkg, depth - 1));
7424
+ }
7425
+ return out;
7426
+ }
7427
+ function manifestSkills(installPath, pkg) {
7428
+ for (const marker of [".claude-plugin", ".codex-plugin"]) {
7429
+ const j = readJson(join2(installPath, marker, "plugin.json"));
7430
+ const declared = j?.skills;
7431
+ if (!Array.isArray(declared)) continue;
7432
+ const out = [];
7433
+ for (const rel of declared) {
7434
+ if (typeof rel !== "string" || !rel) continue;
7435
+ const p = resolve2(installPath, rel);
7436
+ const dir = basename(p) === "SKILL.md" ? dirname2(p) : p;
7437
+ if (isSkillDir(dir)) out.push(asSkill(dir, pkg));
7438
+ }
7439
+ if (out.length) return out;
7440
+ }
7441
+ return [];
7442
+ }
7443
+ function pluginSkills(installPath, pkg) {
7444
+ const declared = manifestSkills(installPath, pkg);
7445
+ return declared.length ? declared : skillsUnder(join2(installPath, "skills"), pkg);
7446
+ }
7447
+ function lockPluginNames(agentsHome) {
7448
+ const out = /* @__PURE__ */ new Map();
7449
+ const j = readJson(join2(agentsHome, ".skill-lock.json"));
7450
+ const skills = j?.skills;
7451
+ if (!skills || typeof skills !== "object") return out;
7452
+ for (const [name, entry] of Object.entries(skills)) {
7453
+ const pkg = entry?.pluginName;
7454
+ if (typeof pkg === "string" && pkg.trim()) out.set(name, pkg.trim());
7455
+ }
7456
+ return out;
7411
7457
  }
7412
7458
  function splitPluginKey(key) {
7413
7459
  const at = key.lastIndexOf("@");
@@ -7487,11 +7533,23 @@ function scanAgentSkills(agent, env = process.env, osHome = homedir2()) {
7487
7533
  add(userDir, skillsUnder(userDir, null));
7488
7534
  for (const r of [...manifestRoots(home), ...cacheRoots(home)]) {
7489
7535
  if (disabled.has(`${r.pkg}@${r.marketplace}`)) continue;
7490
- const dir = join2(r.dir, "skills");
7491
- const found = skillsUnder(dir, r.pkg);
7536
+ const found = pluginSkills(r.dir, r.pkg);
7492
7537
  if (!found.length) continue;
7493
7538
  packages.add(r.pkg);
7494
- add(dir, found);
7539
+ add(join2(r.dir, "skills"), found);
7540
+ }
7541
+ if (agent === "codex") {
7542
+ const agentsHome = agentsSkillHome(env, osHome);
7543
+ const dir = join2(agentsHome, "skills");
7544
+ const names = lockPluginNames(agentsHome);
7545
+ const flat = skillsUnder(dir, null);
7546
+ const withPkg = flat.flatMap((s2) => {
7547
+ const pkg = names.get(s2.name);
7548
+ if (!pkg) return [s2];
7549
+ packages.add(pkg);
7550
+ return [asSkill(s2.dir, pkg, s2.name), s2];
7551
+ });
7552
+ add(dir, withPkg);
7495
7553
  }
7496
7554
  return { agent, home, roots, skills, packages: [...packages] };
7497
7555
  }
@@ -7531,9 +7589,9 @@ var init_src2 = __esm({
7531
7589
  });
7532
7590
 
7533
7591
  // src/layout.ts
7534
- import { join as join3, resolve as resolve2 } from "node:path";
7592
+ import { join as join3, resolve as resolve3 } from "node:path";
7535
7593
  function resolveLayout(distDir2, exists) {
7536
- const pkg = resolve2(distDir2, "..");
7594
+ const pkg = resolve3(distDir2, "..");
7537
7595
  if (exists(join3(pkg, "prisma", "schema.prisma"))) {
7538
7596
  return {
7539
7597
  root: pkg,
@@ -7542,7 +7600,7 @@ function resolveLayout(distDir2, exists) {
7542
7600
  web: exists(join3(pkg, "web")) ? join3(pkg, "web") : null
7543
7601
  };
7544
7602
  }
7545
- const repo = resolve2(distDir2, "../..");
7603
+ const repo = resolve3(distDir2, "../..");
7546
7604
  if (exists(join3(repo, "server", "prisma", "schema.prisma"))) {
7547
7605
  return {
7548
7606
  root: repo,
@@ -7647,7 +7705,7 @@ __export(start_exports, {
7647
7705
  import { spawn, execFileSync as execFileSync2 } from "node:child_process";
7648
7706
  import { createRequire } from "node:module";
7649
7707
  import { existsSync as existsSync2, mkdirSync, readdirSync as readdirSync2, statSync, chmodSync } from "node:fs";
7650
- import { dirname as dirname2, join as join4, resolve as resolvePath } from "node:path";
7708
+ import { dirname as dirname3, join as join4, resolve as resolvePath } from "node:path";
7651
7709
  import { fileURLToPath } from "node:url";
7652
7710
  function parseStartArgs(argv) {
7653
7711
  const out = { port: null, host: null, db: null, migrate: true };
@@ -7688,7 +7746,7 @@ function parseStartArgs(argv) {
7688
7746
  return out;
7689
7747
  }
7690
7748
  function distDir() {
7691
- return dirname2(fileURLToPath(import.meta.url));
7749
+ return dirname3(fileURLToPath(import.meta.url));
7692
7750
  }
7693
7751
  function runPrisma(args, dbUrl) {
7694
7752
  const prismaCli = prismaCliPath(createRequire(import.meta.url).resolve);
@@ -7760,7 +7818,7 @@ function ensureSpawnHelpersExecutable(paths2, ops) {
7760
7818
  function repairSpawnHelper(ctx) {
7761
7819
  let ptyDir;
7762
7820
  try {
7763
- ptyDir = dirname2(createRequire(import.meta.url).resolve("node-pty/package.json"));
7821
+ ptyDir = dirname3(createRequire(import.meta.url).resolve("node-pty/package.json"));
7764
7822
  } catch {
7765
7823
  return;
7766
7824
  }
@@ -7823,7 +7881,7 @@ async function start(argv, ctx) {
7823
7881
  let dbUrl;
7824
7882
  try {
7825
7883
  layout = resolveLayout(distDir(), existsSync2);
7826
- dbUrl = opts.db ? `file:${resolvePath(opts.db)}` : resolveDbUrl(ctx.env, dirname2(layout.schema));
7884
+ dbUrl = opts.db ? `file:${resolvePath(opts.db)}` : resolveDbUrl(ctx.env, dirname3(layout.schema));
7827
7885
  } catch (e) {
7828
7886
  ctx.stderr(`${e.message}
7829
7887
  `);
@@ -7834,7 +7892,7 @@ async function start(argv, ctx) {
7834
7892
  `);
7835
7893
  const home = resolveHome(ctx.env);
7836
7894
  mkdirSync(home, { recursive: true });
7837
- mkdirSync(dirname2(dbFilePath(dbUrl)), { recursive: true });
7895
+ mkdirSync(dirname3(dbFilePath(dbUrl)), { recursive: true });
7838
7896
  if (!existsSync2(layout.server)) {
7839
7897
  ctx.stderr(`hanoman: bundle server tak ada di ${layout.server} \u2014 jalankan \`pnpm build\` dulu
7840
7898
  `);
@@ -7920,7 +7978,7 @@ __export(doctor_exports, {
7920
7978
  });
7921
7979
  import { execFileSync as execFileSync3 } from "node:child_process";
7922
7980
  import { accessSync, constants, existsSync as existsSync3 } from "node:fs";
7923
- import { dirname as dirname3 } from "node:path";
7981
+ import { dirname as dirname4 } from "node:path";
7924
7982
  function doctorReport(p) {
7925
7983
  const major = Number(/^v?(\d+)/.exec(p.node)?.[1] ?? 0);
7926
7984
  const rows = [
@@ -7965,7 +8023,7 @@ async function doctor(_argv, ctx) {
7965
8023
  let db;
7966
8024
  try {
7967
8025
  layout = resolveLayout(distDir(), existsSync3);
7968
- db = dbFilePath(resolveDbUrl(ctx.env, dirname3(layout.schema)));
8026
+ db = dbFilePath(resolveDbUrl(ctx.env, dirname4(layout.schema)));
7969
8027
  } catch (e) {
7970
8028
  ctx.stderr(`${e.message}
7971
8029
  `);
@@ -7974,7 +8032,7 @@ async function doctor(_argv, ctx) {
7974
8032
  const home = resolveHome(ctx.env);
7975
8033
  let homeWritable = false;
7976
8034
  try {
7977
- accessSync(existsSync3(home) ? home : dirname3(home), constants.W_OK);
8035
+ accessSync(existsSync3(home) ? home : dirname4(home), constants.W_OK);
7978
8036
  homeWritable = true;
7979
8037
  } catch {
7980
8038
  }
@@ -17379,14 +17437,14 @@ function inputRequiredRoundsExceededMessage(method, maxRounds) {
17379
17437
  return `Multi-round-trip request '${method}' still required input after ${maxRounds} rounds (inputRequired.maxRounds)`;
17380
17438
  }
17381
17439
  function sleep(ms, signal) {
17382
- return new Promise((resolve3, reject) => {
17440
+ return new Promise((resolve4, reject) => {
17383
17441
  if (signal?.aborted) {
17384
17442
  reject(signal.reason instanceof SdkError ? signal.reason : new SdkError(SdkErrorCode.RequestTimeout, String(signal.reason)));
17385
17443
  return;
17386
17444
  }
17387
17445
  const timer = setTimeout(() => {
17388
17446
  signal?.removeEventListener("abort", onAbort);
17389
- resolve3();
17447
+ resolve4();
17390
17448
  }, ms);
17391
17449
  const onAbort = () => {
17392
17450
  clearTimeout(timer);
@@ -19197,7 +19255,7 @@ var init_src_CX2iR2pK = __esm({
19197
19255
  const flowStartedAt = Date.now();
19198
19256
  let onAbort;
19199
19257
  let cleanupMessageId;
19200
- return new Promise((resolve3, reject) => {
19258
+ return new Promise((resolve4, reject) => {
19201
19259
  const earlyReject = (error2) => {
19202
19260
  reject(error2);
19203
19261
  };
@@ -19265,7 +19323,7 @@ var init_src_CX2iR2pK = __esm({
19265
19323
  }
19266
19324
  if (decoded.kind === "invalid") return reject(decoded.error);
19267
19325
  if (decoded.kind === "input_required") {
19268
- if (options?.allowInputRequired === true) return resolve3(manualInputRequiredValue(decoded));
19326
+ if (options?.allowInputRequired === true) return resolve4(manualInputRequiredValue(decoded));
19269
19327
  const flow = {
19270
19328
  codec,
19271
19329
  request,
@@ -19277,11 +19335,11 @@ var init_src_CX2iR2pK = __esm({
19277
19335
  params
19278
19336
  }, resultSchema, legOptions)
19279
19337
  };
19280
- return resolve3(this._resolveNonCompleteResult(decoded, flow));
19338
+ return resolve4(this._resolveNonCompleteResult(decoded, flow));
19281
19339
  }
19282
19340
  const result = decoded.result;
19283
19341
  validateStandardSchema(resultSchema, result).then((parseResult) => {
19284
- if (parseResult.success) resolve3(parseResult.data);
19342
+ if (parseResult.success) resolve4(parseResult.data);
19285
19343
  else reject(new SdkError(SdkErrorCode.InvalidResult, `Invalid result for ${request.method}: ${parseResult.error}`));
19286
19344
  }, reject);
19287
19345
  });
@@ -22097,7 +22155,7 @@ var init_ajvProvider_CEoC_sr = __esm({
22097
22155
  ref = (0, resolve_1.resolveUrl)(this.opts.uriResolver, baseId, ref);
22098
22156
  const schOrFunc = root.refs[ref];
22099
22157
  if (schOrFunc) return schOrFunc;
22100
- let _sch = resolve3.call(this, root, ref);
22158
+ let _sch = resolve4.call(this, root, ref);
22101
22159
  if (_sch === void 0) {
22102
22160
  const schema = (_a3 = root.localRefs) === null || _a3 === void 0 ? void 0 : _a3[ref];
22103
22161
  const { schemaId } = this.opts;
@@ -22123,7 +22181,7 @@ var init_ajvProvider_CEoC_sr = __esm({
22123
22181
  function sameSchemaEnv(s1, s2) {
22124
22182
  return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId;
22125
22183
  }
22126
- function resolve3(root, ref) {
22184
+ function resolve4(root, ref) {
22127
22185
  let sch;
22128
22186
  while (typeof (sch = this.refs[ref]) == "string") ref = sch;
22129
22187
  return sch || this.schemas[ref] || resolveSchema.call(this, root, ref);
@@ -22573,7 +22631,7 @@ var init_ajvProvider_CEoC_sr = __esm({
22573
22631
  else if (typeof uri === "object") uri = parse4(serialize(uri, options), options);
22574
22632
  return uri;
22575
22633
  }
22576
- function resolve3(baseURI, relativeURI, options) {
22634
+ function resolve4(baseURI, relativeURI, options) {
22577
22635
  const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
22578
22636
  const resolved = resolveComponent(parse4(baseURI, schemelessOptions), parse4(relativeURI, schemelessOptions), schemelessOptions, true);
22579
22637
  schemelessOptions.skipEscape = true;
@@ -22747,7 +22805,7 @@ var init_ajvProvider_CEoC_sr = __esm({
22747
22805
  const fastUri = {
22748
22806
  SCHEMES,
22749
22807
  normalize,
22750
- resolve: resolve3,
22808
+ resolve: resolve4,
22751
22809
  resolveComponent,
22752
22810
  equal,
22753
22811
  serialize,
@@ -28439,7 +28497,7 @@ var init_stdio = __esm({
28439
28497
  }
28440
28498
  send(message) {
28441
28499
  if (this._closed) return Promise.reject(/* @__PURE__ */ new Error("StdioServerTransport is closed"));
28442
- return new Promise((resolve3, reject) => {
28500
+ return new Promise((resolve4, reject) => {
28443
28501
  const json = serializeMessage(message);
28444
28502
  let settled = false;
28445
28503
  const onError = (error2) => {
@@ -28454,14 +28512,14 @@ var init_stdio = __esm({
28454
28512
  settled = true;
28455
28513
  this._stdout.off("error", onError);
28456
28514
  this._stdout.off("drain", onDrain);
28457
- resolve3();
28515
+ resolve4();
28458
28516
  };
28459
28517
  this._stdout.once("error", onError);
28460
28518
  if (this._stdout.write(json)) {
28461
28519
  if (settled) return;
28462
28520
  settled = true;
28463
28521
  this._stdout.off("error", onError);
28464
- resolve3();
28522
+ resolve4();
28465
28523
  } else if (!settled) this._stdout.once("drain", onDrain);
28466
28524
  });
28467
28525
  }
@@ -28515,14 +28573,14 @@ var init_stdio = __esm({
28515
28573
  */
28516
28574
  async whenRequestsAnswered(timeoutMs) {
28517
28575
  if (this._closed || this._pendingRequests.size === 0) return true;
28518
- return await new Promise((resolve3) => {
28576
+ return await new Promise((resolve4) => {
28519
28577
  const waiter = () => {
28520
28578
  clearTimeout(timer);
28521
- resolve3(true);
28579
+ resolve4(true);
28522
28580
  };
28523
28581
  const timer = setTimeout(() => {
28524
28582
  this._drainWaiters = this._drainWaiters.filter((pending) => pending !== waiter);
28525
- resolve3(false);
28583
+ resolve4(false);
28526
28584
  }, timeoutMs);
28527
28585
  this._drainWaiters.push(waiter);
28528
28586
  });
@@ -28817,9 +28875,9 @@ async function mcp(argv, ctx) {
28817
28875
  await handle.close();
28818
28876
  return 0;
28819
28877
  }
28820
- await new Promise((resolve3) => {
28821
- process.stdin.once("close", resolve3);
28822
- process.stdin.once("end", resolve3);
28878
+ await new Promise((resolve4) => {
28879
+ process.stdin.once("close", resolve4);
28880
+ process.stdin.once("end", resolve4);
28823
28881
  });
28824
28882
  return 0;
28825
28883
  }
@@ -28857,7 +28915,7 @@ __export(migrate_pg_exports, {
28857
28915
  parseMigrateArgs: () => parseMigrateArgs
28858
28916
  });
28859
28917
  import { existsSync as existsSync4 } from "node:fs";
28860
- import { dirname as dirname4, resolve as resolvePath2 } from "node:path";
28918
+ import { dirname as dirname5, resolve as resolvePath2 } from "node:path";
28861
28919
  function coerceInt8(rows, fields, model) {
28862
28920
  const cols = fields.filter((f) => f.dataTypeID === INT8_OID).map((f) => f.name);
28863
28921
  if (!cols.length) return rows;
@@ -28925,7 +28983,7 @@ async function migratePg(argv, ctx) {
28925
28983
  let dbUrl;
28926
28984
  try {
28927
28985
  layout = resolveLayout(distDir(), existsSync4);
28928
- dbUrl = opts.to ? `file:${resolvePath2(opts.to)}` : resolveDbUrl(ctx.env, dirname4(layout.schema));
28986
+ dbUrl = opts.to ? `file:${resolvePath2(opts.to)}` : resolveDbUrl(ctx.env, dirname5(layout.schema));
28929
28987
  } catch (e) {
28930
28988
  ctx.stderr(`${e.message}
28931
28989
  `);
@@ -29392,7 +29450,7 @@ __export(pack_exports, {
29392
29450
  default: () => pack
29393
29451
  });
29394
29452
  import { cpSync, existsSync as existsSync8, mkdirSync as mkdirSync2, readFileSync as readFileSync8, rmSync, writeFileSync as writeFileSync2 } from "node:fs";
29395
- import { dirname as dirname5, join as join12 } from "node:path";
29453
+ import { dirname as dirname6, join as join12 } from "node:path";
29396
29454
  function depVersions(repo) {
29397
29455
  const read = (p) => JSON.parse(readFileSync8(join12(repo, p), "utf8"));
29398
29456
  const server = read("server/package.json"), cli = read("cli/package.json");
@@ -29442,7 +29500,7 @@ async function pack(argv, ctx) {
29442
29500
  return 1;
29443
29501
  }
29444
29502
  const dest = join12(out, item.to);
29445
- mkdirSync2(dirname5(dest), { recursive: true });
29503
+ mkdirSync2(dirname6(dest), { recursive: true });
29446
29504
  cpSync(item.from, dest, item.dir ? { recursive: true } : {});
29447
29505
  }
29448
29506
  writeFileSync2(join12(out, "bin/hanoman.mjs"), BIN_SHIM);