githolon 0.86.0 → 0.87.0

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 (2) hide show
  1. package/dist/cli.mjs +126 -39
  2. package/package.json +3 -3
package/dist/cli.mjs CHANGED
@@ -5628,16 +5628,17 @@ async function runOfflineLegs(eng, ws, lawHash, legs, frameworkHash, deployUsda)
5628
5628
  lines.push(...v.legs);
5629
5629
  if (!v.ok) return done(false, lines, v.error);
5630
5630
  }
5631
- if (legs.relationBootstrap !== void 0) {
5631
+ const rbLegs = legs.relationBootstraps ?? (legs.relationBootstrap !== void 0 ? [legs.relationBootstrap] : []);
5632
+ for (const rbLeg of rbLegs) {
5632
5633
  let rbWs = ws;
5633
- if (legs.relationBootstrap.bornContext === void 0 && deployUsda !== void 0) {
5634
+ if (rbLeg.bornContext === void 0 && deployUsda !== void 0) {
5634
5635
  rbWs = await mountIsolatedProofWs(eng, ws, lawHash, deployUsda);
5635
5636
  }
5636
- const v = runRelationBootstrapLeg(eng, rbWs, lawHash, legs.relationBootstrap);
5637
+ const v = runRelationBootstrapLeg(eng, rbWs, lawHash, rbLeg);
5637
5638
  lines.push(...v.legs);
5638
5639
  if (!v.ok) return done(false, lines, v.error);
5639
5640
  }
5640
- if (legs.directiveId === void 0 && birthLegs.length === 0 && legs.relationBootstrap === void 0) {
5641
+ if (legs.directiveId === void 0 && birthLegs.length === 0 && rbLegs.length === 0) {
5641
5642
  lines.push(`\u2713 ${legs.domain} \u2014 compile-valid (the law compiled; no standalone create or .births() to prove a write)${kinds.length ? ` [${kinds.join(", ")}]` : ""}`);
5642
5643
  }
5643
5644
  return done(true, lines);
@@ -5873,6 +5874,15 @@ function runRelationBootstrapLeg(eng, ws, lawHash, rb) {
5873
5874
  }
5874
5875
  const seatDesc = speculative ? `replayed the declared seed ${rb.domain}/${rb.grantDirectiveId} (seats [${(rb.seedWritesRelations ?? [grantedRelation]).join(", ")}]) on ${ACTOR} \u2014 deferring to the real gate to authorize "${rb.relation}"` : `${rb.domain}/${rb.grantDirectiveId} granted "${grantedRelation}" to ${ACTOR} (${rb.via})${computed ? ` \u21D2 satisfies "${rb.relation}" via the rewrite` : ``}`;
5875
5876
  lines.push(`\u2713 relation bootstrap (${speculative ? "seed" : "grant"}) \u2014 ${seatDesc}`);
5877
+ for (const setup of rb.preconditionSetups ?? []) {
5878
+ const setupPayload = { ...setup.payload };
5879
+ for (const f of setup.autoStamped) setupPayload[f] = stamp;
5880
+ const setupRes = author(eng, ws, rb.domain, setup.directiveId, setupPayload, lawHash, actorOpts);
5881
+ if (setupRes.ok === false) {
5882
+ return done(false, `relation bootstrap precondition ${rb.domain}/${setup.directiveId} refused: ${setupRes.error ?? "unknown"} \u2014 the parent state ${rb.gatedDirectiveId} requires could not be established (is ${setup.directiveId} gated by a relation not seated by this leg? it needs "${setup.requiresRelation ?? rb.relation}")`);
5883
+ }
5884
+ lines.push(`\u2713 relation bootstrap (precondition) \u2014 ${rb.domain}/${setup.directiveId} established before ${rb.gatedDirectiveId} (real parent state, not a shell)`);
5885
+ }
5876
5886
  const gatedPayload = { ...rb.gatedPayload };
5877
5887
  for (const f of rb.gatedAutoStamped) gatedPayload[f] = stamp;
5878
5888
  if (rb.gatedMintField !== void 0 && rb.gatedAggregateId !== void 0) gatedPayload[rb.gatedMintField] = mintId(eng, rb.gatedAggregateId);
@@ -5984,6 +5994,62 @@ var init_proof_offline = __esm({
5984
5994
  }
5985
5995
  });
5986
5996
 
5997
+ // src/mountability.ts
5998
+ var mountability_exports = {};
5999
+ __export(mountability_exports, {
6000
+ assertCompiledMountable: () => assertCompiledMountable
6001
+ });
6002
+ import { existsSync as existsSync11, readdirSync as readdirSync5, readFileSync as readFileSync13 } from "node:fs";
6003
+ import { join as join13 } from "node:path";
6004
+ async function assertCompiledMountable(cwd, cloud) {
6005
+ const buildDir = join13(cwd, "build");
6006
+ if (!existsSync11(buildDir)) return { ok: true, checked: [] };
6007
+ const deploys = readdirSync5(buildDir).filter((f) => f.endsWith(".deploy.json"));
6008
+ if (deploys.length === 0) return { ok: true, checked: [] };
6009
+ let mount;
6010
+ let engine;
6011
+ try {
6012
+ mount = await Promise.resolve().then(() => (init_local_holon(), local_holon_exports));
6013
+ engine = await Promise.resolve().then(() => (init_engine(), engine_exports));
6014
+ } catch {
6015
+ return { ok: true, checked: [], skipped: "the vendored kernel engine is not present \u2014 mountability gate skipped (compile still emitted the package)" };
6016
+ }
6017
+ const { holonEngine: holonEngine2, mountFresh: mountFresh2 } = mount;
6018
+ const { author: author2, installPayload: installPayload2, sha256hex: sha256hex2 } = engine;
6019
+ const checked = [];
6020
+ for (const f of deploys) {
6021
+ let deploy3;
6022
+ try {
6023
+ deploy3 = JSON.parse(readFileSync13(join13(buildDir, f), "utf8"));
6024
+ } catch {
6025
+ continue;
6026
+ }
6027
+ if (typeof deploy3.packageUsda !== "string" || deploy3.packageUsda.length === 0) continue;
6028
+ const name = deploy3.summary?.name ?? f.replace(/\.deploy\.json$/, "");
6029
+ const ws = `mountcheck-${name}`.replace(/[^A-Za-z0-9_-]/g, "-").slice(0, 100);
6030
+ try {
6031
+ const lh = await sha256hex2(deploy3.packageUsda);
6032
+ const { eng } = await holonEngine2(cloud, deploy3, `${ws}-eng`);
6033
+ await mountFresh2(eng, ws);
6034
+ author2(eng, ws, "bootstrap", "installDomain", installPayload2(eng.hashes.nomos, eng.nomosPkg, `${ws}-eng`), "");
6035
+ const r = author2(eng, ws, "nomos", "installDomain", installPayload2(lh, deploy3.packageUsda, `${ws}-eng`), eng.hashes.nomos);
6036
+ if (r && r.ok === false) {
6037
+ return { ok: false, checked, error: `${name}: the read router REFUSED the compiled law at mount \u2014 ${r.error ?? "install refused"}` };
6038
+ }
6039
+ checked.push(name);
6040
+ } catch (e) {
6041
+ const msg = e instanceof Error ? e.message : String(e);
6042
+ return { ok: false, checked, error: `${name}: the compiled package is NOT mountable on the real kernel \u2014 ${msg}` };
6043
+ }
6044
+ }
6045
+ return { ok: true, checked };
6046
+ }
6047
+ var init_mountability = __esm({
6048
+ "src/mountability.ts"() {
6049
+ "use strict";
6050
+ }
6051
+ });
6052
+
5987
6053
  // src/mcp.ts
5988
6054
  var mcp_exports = {};
5989
6055
  __export(mcp_exports, {
@@ -5996,7 +6062,7 @@ __export(mcp_exports, {
5996
6062
  toolEvolvePreview: () => toolEvolvePreview
5997
6063
  });
5998
6064
  import { spawnSync as spawnSync5 } from "node:child_process";
5999
- import { existsSync as existsSync11 } from "node:fs";
6065
+ import { existsSync as existsSync12 } from "node:fs";
6000
6066
  import { dirname as dirname8, isAbsolute as isAbsolute2, resolve as resolve3 } from "node:path";
6001
6067
  function resolveConfig(config) {
6002
6068
  const arg = config ?? "nomos.package.mjs";
@@ -6075,7 +6141,7 @@ function extractDispositions(humanReport) {
6075
6141
  }
6076
6142
  function toolCheck(args) {
6077
6143
  const { configPath } = resolveConfig(args.config);
6078
- if (!existsSync11(configPath)) {
6144
+ if (!existsSync12(configPath)) {
6079
6145
  return { text: `nomos_check: config not found: ${configPath}`, isError: true };
6080
6146
  }
6081
6147
  const extra = args.against !== void 0 ? ["--against", args.against] : [];
@@ -6092,11 +6158,11 @@ ${JSON.stringify(payload, null, 2)}`, isError: false };
6092
6158
  }
6093
6159
  function toolEvolvePreview(args) {
6094
6160
  const { configPath } = resolveConfig(args.config);
6095
- if (!existsSync11(configPath)) {
6161
+ if (!existsSync12(configPath)) {
6096
6162
  return { text: `nomos_evolve_preview: config not found: ${configPath}`, isError: true };
6097
6163
  }
6098
6164
  const againstPath = isAbsolute2(args.against) ? args.against : resolve3(dirname8(configPath), args.against);
6099
- const priorArg = existsSync11(againstPath) ? againstPath : args.against;
6165
+ const priorArg = existsSync12(againstPath) ? againstPath : args.against;
6100
6166
  const jsonRun = runCheckJson(configPath, ["--against", priorArg]);
6101
6167
  if (jsonRun.error !== void 0) {
6102
6168
  return {
@@ -6259,8 +6325,8 @@ __export(harness_exports, {
6259
6325
  harnessInstall: () => harnessInstall,
6260
6326
  looksLikeStaleRuntime: () => looksLikeStaleRuntime
6261
6327
  });
6262
- import { existsSync as existsSync12, readFileSync as readFileSync13, writeFileSync as writeFileSync8 } from "node:fs";
6263
- import { join as join14 } from "node:path";
6328
+ import { existsSync as existsSync13, readFileSync as readFileSync14, writeFileSync as writeFileSync8 } from "node:fs";
6329
+ import { join as join15 } from "node:path";
6264
6330
  import { randomBytes as randomBytes3 } from "node:crypto";
6265
6331
  function looksLikeStaleRuntime(msg) {
6266
6332
  return /\bbbox param\b|missing.*param|non-numeric|unknown (op|query op)|unsupported op|unexpected (field|key)|no such op/i.test(
@@ -6270,19 +6336,19 @@ function looksLikeStaleRuntime(msg) {
6270
6336
  async function harnessInstall(opts) {
6271
6337
  const { deploy: deployPaths, workspace, out: outPath } = opts;
6272
6338
  if (deployPaths.length === 0) die("no --deploy JSON path(s) given");
6273
- const runtimeDir = opts.runtime || process.env["NOMOS_OFFLINE_RUNTIME"] || join14(configDir(), "runtime");
6339
+ const runtimeDir = opts.runtime || process.env["NOMOS_OFFLINE_RUNTIME"] || join15(configDir(), "runtime");
6274
6340
  const refreshed = await refreshRuntimeDir(cloudBase(), runtimeDir);
6275
6341
  if (refreshed) process.stderr.write(`harness-install: refreshed runtime cache from the cloud \u2192 ${runtimeDir}
6276
6342
  `);
6277
- const wasmFile = join14(runtimeDir, "holon.wasm");
6278
- const pkgsFile = join14(runtimeDir, "packages.json");
6279
- if (!existsSync12(wasmFile) || !existsSync12(pkgsFile)) {
6343
+ const wasmFile = join15(runtimeDir, "holon.wasm");
6344
+ const pkgsFile = join15(runtimeDir, "packages.json");
6345
+ if (!existsSync13(wasmFile) || !existsSync13(pkgsFile)) {
6280
6346
  die(
6281
6347
  `runtime cache missing at ${runtimeDir} (holon.wasm + packages.json). Warm it once with a \`githolon\` run (it fetches + caches the runtime), then re-run offline.`
6282
6348
  );
6283
6349
  }
6284
- const wasm = readFileSync13(wasmFile);
6285
- const pkgs = JSON.parse(readFileSync13(pkgsFile, "utf8"));
6350
+ const wasm = readFileSync14(wasmFile);
6351
+ const pkgs = JSON.parse(readFileSync14(pkgsFile, "utf8"));
6286
6352
  const guarded = async (fn) => {
6287
6353
  try {
6288
6354
  return await fn();
@@ -6304,8 +6370,8 @@ async function harnessInstall(opts) {
6304
6370
  await guarded(() => author(eng, workspace, "bootstrap", "installDomain", installPayload(eng.hashes.nomos, eng.nomosPkg, "nomos-test-harness"), ""));
6305
6371
  const lawHashes = [];
6306
6372
  for (const p of deployPaths) {
6307
- if (!existsSync12(p)) die(`deploy JSON not found: ${p} \u2014 run \`npx githolon compile\` first`);
6308
- const deploy3 = JSON.parse(readFileSync13(p, "utf8"));
6373
+ if (!existsSync13(p)) die(`deploy JSON not found: ${p} \u2014 run \`npx githolon compile\` first`);
6374
+ const deploy3 = JSON.parse(readFileSync14(p, "utf8"));
6309
6375
  const usda = deploy3.packageUsda;
6310
6376
  if (typeof usda !== "string" || !usda.startsWith("#usda")) die(`${p} has no #usda packageUsda`);
6311
6377
  const lawHash = await sha256hex(usda);
@@ -7396,8 +7462,8 @@ var scene_exports = {};
7396
7462
  __export(scene_exports, {
7397
7463
  scene: () => scene
7398
7464
  });
7399
- import { existsSync as existsSync13, mkdirSync as mkdirSync6, writeFileSync as writeFileSync9 } from "node:fs";
7400
- import { join as join15, resolve as resolve4 } from "node:path";
7465
+ import { existsSync as existsSync14, mkdirSync as mkdirSync6, writeFileSync as writeFileSync9 } from "node:fs";
7466
+ import { join as join16, resolve as resolve4 } from "node:path";
7401
7467
  import { createHash as createHash5 } from "node:crypto";
7402
7468
  import git3 from "isomorphic-git";
7403
7469
  async function walkChain2(eng, ws) {
@@ -7418,8 +7484,8 @@ async function projectOnce(cloud, target, isDir, name) {
7418
7484
  const { eng } = await holonEngine(cloud, void 0, "githolon-scene");
7419
7485
  const SOURCE3 = "source";
7420
7486
  if (isDir) {
7421
- const gitDir = existsSync13(join15(target, ".git")) ? join15(target, ".git") : target;
7422
- if (!existsSync13(join15(gitDir, "HEAD"))) throw new Error(`${target} is not a git repo (no HEAD)`);
7487
+ const gitDir = existsSync14(join16(target, ".git")) ? join16(target, ".git") : target;
7488
+ if (!existsSync14(join16(gitDir, "HEAD"))) throw new Error(`${target} is not a git repo (no HEAD)`);
7423
7489
  await mountFresh(eng, SOURCE3);
7424
7490
  eng.preopen.dir.contents.get("ws").contents.get(SOURCE3).contents.set("nomos.git", readTreeFromDisk(gitDir));
7425
7491
  } else {
@@ -7478,7 +7544,7 @@ async function projectOnce(cloud, target, isDir, name) {
7478
7544
  }
7479
7545
  async function scene(target, opts) {
7480
7546
  const cloud = cloudBase(opts.cloud);
7481
- const isDir = existsSync13(target) || target.includes("/") || target.startsWith(".");
7547
+ const isDir = existsSync14(target) || target.includes("/") || target.startsWith(".");
7482
7548
  const name = isDir ? (resolve4(target).split("/").filter(Boolean).pop() ?? "scene").replace(/\.git$/, "") : target;
7483
7549
  out11(`scene \u2014 ${name} (${isDir ? resolve4(target) : `${cloud} :: ${target}`})`);
7484
7550
  let first, second;
@@ -7498,10 +7564,10 @@ async function scene(target, opts) {
7498
7564
  err11(`the emitted stage violates the portable profile: ${violations.join("; ")}`);
7499
7565
  return 1;
7500
7566
  }
7501
- const outDir = resolve4(opts.out ?? join15("scene", name));
7567
+ const outDir = resolve4(opts.out ?? join16("scene", name));
7502
7568
  mkdirSync6(outDir, { recursive: true });
7503
- const usdaPath = join15(outDir, `${name}.usda`);
7504
- const usdzPath = join15(outDir, `${name}.usdz`);
7569
+ const usdaPath = join16(outDir, `${name}.usda`);
7570
+ const usdzPath = join16(outDir, `${name}.usdz`);
7505
7571
  const usdaBytes = new TextEncoder().encode(first.usda);
7506
7572
  writeFileSync9(usdaPath, usdaBytes);
7507
7573
  writeFileSync9(usdzPath, usdzPack([[`${name}.usda`, usdaBytes]]));
@@ -7589,10 +7655,10 @@ var init_dlq = __esm({
7589
7655
  });
7590
7656
 
7591
7657
  // src/cli.ts
7592
- import { existsSync as existsSync14, readdirSync as readdirSync5, readFileSync as readFileSync14 } from "node:fs";
7658
+ import { existsSync as existsSync15, readdirSync as readdirSync6, readFileSync as readFileSync15 } from "node:fs";
7593
7659
  import { spawnSync as spawnSync6 } from "node:child_process";
7594
7660
  import { createRequire as createRequire3 } from "node:module";
7595
- import { dirname as dirname9, join as join16, resolve as resolve5 } from "node:path";
7661
+ import { dirname as dirname9, join as join17, resolve as resolve5 } from "node:path";
7596
7662
  import { pathToFileURL as pathToFileURL5, fileURLToPath } from "node:url";
7597
7663
 
7598
7664
  // src/generate.ts
@@ -9223,20 +9289,20 @@ async function runProof(args) {
9223
9289
  let proofPath;
9224
9290
  if (explicit !== void 0) {
9225
9291
  proofPath = resolve5(process.cwd(), explicit);
9226
- if (!existsSync14(proofPath)) return refuse(`proof not found: ${proofPath} \u2014 run \`githolon compile\` to (re)generate it`);
9292
+ if (!existsSync15(proofPath)) return refuse(`proof not found: ${proofPath} \u2014 run \`githolon compile\` to (re)generate it`);
9227
9293
  } else {
9228
- const buildDir = join16(process.cwd(), "build");
9229
- if (!existsSync14(buildDir)) {
9294
+ const buildDir = join17(process.cwd(), "build");
9295
+ if (!existsSync15(buildDir)) {
9230
9296
  return refuse("no build/ directory here \u2014 run `githolon compile` first (every compile generates build/<name>.proof.mts from your law)");
9231
9297
  }
9232
- const proofs = readdirSync5(buildDir).filter((f) => f.endsWith(".proof.mts"));
9298
+ const proofs = readdirSync6(buildDir).filter((f) => f.endsWith(".proof.mts"));
9233
9299
  if (proofs.length === 0) {
9234
9300
  return refuse("no build/*.proof.mts found \u2014 run `githolon compile` (every compile generates the proof from your law; the compile summary says why when it can't)");
9235
9301
  }
9236
9302
  if (proofs.length > 1) {
9237
9303
  return refuse(`found ${proofs.length} proofs (${proofs.join(", ")}) \u2014 name one: githolon proof build/<name>.proof.mts`);
9238
9304
  }
9239
- proofPath = join16(buildDir, proofs[0]);
9305
+ proofPath = join17(buildDir, proofs[0]);
9240
9306
  }
9241
9307
  if (!live) {
9242
9308
  try {
@@ -9249,14 +9315,14 @@ async function runProof(args) {
9249
9315
  }
9250
9316
  const resolvePkgDir = (name, fromDir) => {
9251
9317
  try {
9252
- return dirname9(createRequire3(pathToFileURL5(join16(fromDir, "noop.js"))).resolve(`${name}/package.json`));
9318
+ return dirname9(createRequire3(pathToFileURL5(join17(fromDir, "noop.js"))).resolve(`${name}/package.json`));
9253
9319
  } catch {
9254
9320
  return void 0;
9255
9321
  }
9256
9322
  };
9257
9323
  const dslDir = (() => {
9258
9324
  try {
9259
- return dirname9(createRequire3(pathToFileURL5(join16(process.cwd(), "noop.js"))).resolve("@githolon/dsl/package.json"));
9325
+ return dirname9(createRequire3(pathToFileURL5(join17(process.cwd(), "noop.js"))).resolve("@githolon/dsl/package.json"));
9260
9326
  } catch {
9261
9327
  try {
9262
9328
  return dirname9(createRequire3(import.meta.url).resolve("@githolon/dsl/package.json"));
@@ -9269,9 +9335,9 @@ async function runProof(args) {
9269
9335
  if (tsxDir === void 0) {
9270
9336
  return refuse("tsx not found \u2014 add @githolon/dsl to your project's dependencies (tsx rides along) and npm install");
9271
9337
  }
9272
- const tsxPkg = JSON.parse(readFileSync14(join16(tsxDir, "package.json"), "utf8"));
9338
+ const tsxPkg = JSON.parse(readFileSync15(join17(tsxDir, "package.json"), "utf8"));
9273
9339
  const tsxBinRel = typeof tsxPkg.bin === "string" ? tsxPkg.bin : tsxPkg.bin?.["tsx"];
9274
- const tsxCli = join16(tsxDir, tsxBinRel ?? "dist/cli.mjs");
9340
+ const tsxCli = join17(tsxDir, tsxBinRel ?? "dist/cli.mjs");
9275
9341
  console.log("githolon proof --live \u2014 the full cloud loop (throwaway workspace, retired on exit" + (keep ? "; --keep: kept" : "") + ")");
9276
9342
  const { wsCreate: wsCreate2, wsRetire: wsRetire2 } = await Promise.resolve().then(() => (init_cloud(), cloud_exports));
9277
9343
  const { resolveGovernancePrincipal: resolveGovernancePrincipal2 } = await Promise.resolve().then(() => (init_governance(), governance_exports));
@@ -9377,7 +9443,28 @@ async function main(argv) {
9377
9443
  return 0;
9378
9444
  }
9379
9445
  if (argv[0] === "compile") {
9380
- return runCompile(argv.slice(1));
9446
+ const status2 = runCompile(argv.slice(1));
9447
+ if (status2 !== 0) return status2;
9448
+ if (argv.includes("--no-mount-check")) return status2;
9449
+ try {
9450
+ const { assertCompiledMountable: assertCompiledMountable2 } = await Promise.resolve().then(() => (init_mountability(), mountability_exports));
9451
+ const { cloudBase: cloudBase2 } = await Promise.resolve().then(() => (init_cloud(), cloud_exports));
9452
+ const v = await assertCompiledMountable2(process.cwd(), cloudBase2());
9453
+ if (v.skipped !== void 0) process.stderr.write(`note: ${v.skipped}
9454
+ `);
9455
+ else if (!v.ok) {
9456
+ process.stderr.write(`
9457
+ \u2717 compile emitted an UNMOUNTABLE package \u2014 ${v.error}
9458
+ (compile-valid must mean mountable; fix the law or re-run with --no-mount-check to emit anyway)
9459
+ `);
9460
+ return 1;
9461
+ } else if (v.checked.length > 0) process.stdout.write(` mountable \u2713 ${v.checked.join(", ")} mount on the real read router
9462
+ `);
9463
+ } catch (e) {
9464
+ process.stderr.write(`note: mountability gate could not run (${e instanceof Error ? e.message : e}) \u2014 package emitted
9465
+ `);
9466
+ }
9467
+ return status2;
9381
9468
  }
9382
9469
  if (argv[0] === "check") {
9383
9470
  return runCheck(argv.slice(1));
@@ -9473,7 +9560,7 @@ usage: githolon cloud dev [--port <n>] [--data <dir>] [--ephemeral]
9473
9560
  resolve5(here, "../../../cloud/dev-server/server.mjs"),
9474
9561
  resolve5(process.cwd(), "cloud/dev-server/server.mjs")
9475
9562
  ];
9476
- const serverPath = candidates.find((p) => existsSync14(p));
9563
+ const serverPath = candidates.find((p) => existsSync15(p));
9477
9564
  if (!serverPath) {
9478
9565
  process.stderr.write("error: dev-server not found \u2014 reinstall `githolon` or run `npm run build` in the cli package\n");
9479
9566
  return 1;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "githolon",
3
- "version": "0.86.0",
3
+ "version": "0.87.0",
4
4
  "type": "module",
5
5
  "description": "githolon — the Nomos developer CLI: Rails-style generators for @githolon/dsl domains + the package compiler. Kernel-independent.",
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -29,8 +29,8 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "@bjorn3/browser_wasi_shim": "0.4.2",
32
- "@githolon/client": "^0.86.0",
33
- "@githolon/dsl": "^0.86.0",
32
+ "@githolon/client": "^0.87.0",
33
+ "@githolon/dsl": "^0.87.0",
34
34
  "isomorphic-git": "^1.38.4"
35
35
  },
36
36
  "devDependencies": {