@cleocode/cleo 2026.5.11 → 2026.5.13

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/cli/index.js CHANGED
@@ -9608,6 +9608,363 @@ var init_registry = __esm({
9608
9608
  description: "Task ID whose worktree should be pruned (omit for bulk prune)"
9609
9609
  }
9610
9610
  ]
9611
+ },
9612
+ // ---------------------------------------------------------------------------
9613
+ // Sentient domain — T1726 SDK surface parity
9614
+ //
9615
+ // Sentient ops were dispatched via SentientHandler (registered under 'sentient'
9616
+ // in the DomainHandler map) but absent from OPERATIONS, making them invisible
9617
+ // to public SDK consumers using @cleocode/core. Adding all 10 ops here.
9618
+ // ---------------------------------------------------------------------------
9619
+ // sentient query: propose.list
9620
+ {
9621
+ gateway: "query",
9622
+ domain: "sentient",
9623
+ operation: "propose.list",
9624
+ description: "sentient.propose.list (query) \u2014 list all pending Tier-2 proposals (status=proposed)",
9625
+ tier: 2,
9626
+ idempotent: true,
9627
+ sessionRequired: false,
9628
+ requiredParams: [],
9629
+ params: [
9630
+ {
9631
+ name: "limit",
9632
+ type: "number",
9633
+ required: false,
9634
+ description: "Maximum number of proposals to return (default: 50)"
9635
+ }
9636
+ ]
9637
+ },
9638
+ // sentient query: propose.diff
9639
+ {
9640
+ gateway: "query",
9641
+ domain: "sentient",
9642
+ operation: "propose.diff",
9643
+ description: "sentient.propose.diff (query) \u2014 show what a proposal would change (Tier-3 stub)",
9644
+ tier: 2,
9645
+ idempotent: true,
9646
+ sessionRequired: false,
9647
+ requiredParams: ["id"],
9648
+ params: [
9649
+ {
9650
+ name: "id",
9651
+ type: "string",
9652
+ required: true,
9653
+ description: "Proposal task ID",
9654
+ cli: { positional: true }
9655
+ }
9656
+ ]
9657
+ },
9658
+ // sentient query: allowlist.list
9659
+ {
9660
+ gateway: "query",
9661
+ domain: "sentient",
9662
+ operation: "allowlist.list",
9663
+ description: "sentient.allowlist.list (query) \u2014 list owner pubkeys in the sentient allowlist",
9664
+ tier: 2,
9665
+ idempotent: true,
9666
+ sessionRequired: false,
9667
+ requiredParams: [],
9668
+ params: []
9669
+ },
9670
+ // sentient mutate: propose.accept
9671
+ {
9672
+ gateway: "mutate",
9673
+ domain: "sentient",
9674
+ operation: "propose.accept",
9675
+ description: "sentient.propose.accept (mutate) \u2014 accept a Tier-2 proposal, transitioning proposed \u2192 pending",
9676
+ tier: 2,
9677
+ idempotent: false,
9678
+ sessionRequired: false,
9679
+ requiredParams: ["id"],
9680
+ params: [
9681
+ {
9682
+ name: "id",
9683
+ type: "string",
9684
+ required: true,
9685
+ description: "Proposal task ID to accept",
9686
+ cli: { positional: true }
9687
+ }
9688
+ ]
9689
+ },
9690
+ // sentient mutate: propose.reject
9691
+ {
9692
+ gateway: "mutate",
9693
+ domain: "sentient",
9694
+ operation: "propose.reject",
9695
+ description: "sentient.propose.reject (mutate) \u2014 reject a Tier-2 proposal, transitioning proposed \u2192 cancelled",
9696
+ tier: 2,
9697
+ idempotent: false,
9698
+ sessionRequired: false,
9699
+ requiredParams: ["id"],
9700
+ params: [
9701
+ {
9702
+ name: "id",
9703
+ type: "string",
9704
+ required: true,
9705
+ description: "Proposal task ID to reject",
9706
+ cli: { positional: true }
9707
+ },
9708
+ {
9709
+ name: "reason",
9710
+ type: "string",
9711
+ required: false,
9712
+ description: "Human-readable reason for rejection"
9713
+ }
9714
+ ]
9715
+ },
9716
+ // sentient mutate: propose.run
9717
+ {
9718
+ gateway: "mutate",
9719
+ domain: "sentient",
9720
+ operation: "propose.run",
9721
+ description: "sentient.propose.run (mutate) \u2014 manually trigger a single Tier-2 propose tick in-process",
9722
+ tier: 2,
9723
+ idempotent: false,
9724
+ sessionRequired: false,
9725
+ requiredParams: [],
9726
+ params: []
9727
+ },
9728
+ // sentient mutate: propose.enable
9729
+ {
9730
+ gateway: "mutate",
9731
+ domain: "sentient",
9732
+ operation: "propose.enable",
9733
+ description: "sentient.propose.enable (mutate) \u2014 enable Tier-2 autonomous proposal generation (M7 gate)",
9734
+ tier: 2,
9735
+ idempotent: true,
9736
+ sessionRequired: false,
9737
+ requiredParams: [],
9738
+ params: []
9739
+ },
9740
+ // sentient mutate: propose.disable
9741
+ {
9742
+ gateway: "mutate",
9743
+ domain: "sentient",
9744
+ operation: "propose.disable",
9745
+ description: "sentient.propose.disable (mutate) \u2014 disable Tier-2 autonomous proposal generation",
9746
+ tier: 2,
9747
+ idempotent: true,
9748
+ sessionRequired: false,
9749
+ requiredParams: [],
9750
+ params: []
9751
+ },
9752
+ // sentient mutate: allowlist.add
9753
+ {
9754
+ gateway: "mutate",
9755
+ domain: "sentient",
9756
+ operation: "allowlist.add",
9757
+ description: "sentient.allowlist.add (mutate) \u2014 add a base64-encoded owner pubkey to the sentient allowlist",
9758
+ tier: 2,
9759
+ idempotent: true,
9760
+ sessionRequired: false,
9761
+ requiredParams: ["pubkey"],
9762
+ params: [
9763
+ {
9764
+ name: "pubkey",
9765
+ type: "string",
9766
+ required: true,
9767
+ description: "Base64-encoded public key to add"
9768
+ }
9769
+ ]
9770
+ },
9771
+ // sentient mutate: allowlist.remove
9772
+ {
9773
+ gateway: "mutate",
9774
+ domain: "sentient",
9775
+ operation: "allowlist.remove",
9776
+ description: "sentient.allowlist.remove (mutate) \u2014 remove a base64-encoded owner pubkey from the sentient allowlist",
9777
+ tier: 2,
9778
+ idempotent: true,
9779
+ sessionRequired: false,
9780
+ requiredParams: ["pubkey"],
9781
+ params: [
9782
+ {
9783
+ name: "pubkey",
9784
+ type: "string",
9785
+ required: true,
9786
+ description: "Base64-encoded public key to remove"
9787
+ }
9788
+ ]
9789
+ },
9790
+ // ---------------------------------------------------------------------------
9791
+ // Release domain — T1726 SDK surface parity
9792
+ //
9793
+ // Release ops dispatched via ReleaseHandler (registered under 'release' in
9794
+ // the DomainHandler map) were absent from OPERATIONS. Adding gate +
9795
+ // ivtr-suggest (the two ops ReleaseHandler serves) plus the canonical
9796
+ // 4-step pipeline ops (start, verify, publish, reconcile) introduced by
9797
+ // T1597 / ADR-063 that route through the core release module directly.
9798
+ // ---------------------------------------------------------------------------
9799
+ // release query: gate
9800
+ {
9801
+ gateway: "query",
9802
+ domain: "release",
9803
+ operation: "gate",
9804
+ description: "release.gate (query) \u2014 check all IVTR loops in a release epic have reached the released phase before allowing release.ship (T820 RELEASE-03)",
9805
+ tier: 1,
9806
+ idempotent: true,
9807
+ sessionRequired: false,
9808
+ requiredParams: ["epicId"],
9809
+ params: [
9810
+ {
9811
+ name: "epicId",
9812
+ type: "string",
9813
+ required: true,
9814
+ description: "Epic ID whose child tasks should be inspected"
9815
+ },
9816
+ {
9817
+ name: "force",
9818
+ type: "boolean",
9819
+ required: false,
9820
+ description: "Bypass the IVTR gate \u2014 requires explicit owner confirmation"
9821
+ }
9822
+ ]
9823
+ },
9824
+ // release mutate: gate
9825
+ {
9826
+ gateway: "mutate",
9827
+ domain: "release",
9828
+ operation: "gate",
9829
+ description: "release.gate (mutate) \u2014 same IVTR gate check as query.gate; safe in both gateways (no DB writes)",
9830
+ tier: 1,
9831
+ idempotent: true,
9832
+ sessionRequired: false,
9833
+ requiredParams: ["epicId"],
9834
+ params: [
9835
+ {
9836
+ name: "epicId",
9837
+ type: "string",
9838
+ required: true,
9839
+ description: "Epic ID whose child tasks should be inspected"
9840
+ },
9841
+ {
9842
+ name: "force",
9843
+ type: "boolean",
9844
+ required: false,
9845
+ description: "Bypass the IVTR gate \u2014 requires explicit owner confirmation"
9846
+ }
9847
+ ]
9848
+ },
9849
+ // release query: ivtr-suggest
9850
+ {
9851
+ gateway: "query",
9852
+ domain: "release",
9853
+ operation: "ivtr-suggest",
9854
+ description: "release.ivtr-suggest (query) \u2014 check if all epic tasks are released and suggest cleo release ship (T820 RELEASE-07)",
9855
+ tier: 1,
9856
+ idempotent: true,
9857
+ sessionRequired: false,
9858
+ requiredParams: ["taskId"],
9859
+ params: [
9860
+ {
9861
+ name: "taskId",
9862
+ type: "string",
9863
+ required: true,
9864
+ description: "Task ID that just reached the released phase"
9865
+ }
9866
+ ]
9867
+ },
9868
+ // release mutate: ivtr-suggest
9869
+ {
9870
+ gateway: "mutate",
9871
+ domain: "release",
9872
+ operation: "ivtr-suggest",
9873
+ description: "release.ivtr-suggest (mutate) \u2014 same auto-suggest as query.ivtr-suggest; safe in both gateways (no DB writes)",
9874
+ tier: 1,
9875
+ idempotent: true,
9876
+ sessionRequired: false,
9877
+ requiredParams: ["taskId"],
9878
+ params: [
9879
+ {
9880
+ name: "taskId",
9881
+ type: "string",
9882
+ required: true,
9883
+ description: "Task ID that just reached the released phase"
9884
+ }
9885
+ ]
9886
+ },
9887
+ // release mutate: start (T1597 / ADR-063 canonical step 1)
9888
+ {
9889
+ gateway: "mutate",
9890
+ domain: "release",
9891
+ operation: "start",
9892
+ description: "release.start (mutate) \u2014 Step 1 of 4: validate version, capture branch, persist release handle (T1597 / ADR-063)",
9893
+ tier: 1,
9894
+ idempotent: false,
9895
+ sessionRequired: false,
9896
+ requiredParams: ["version"],
9897
+ params: [
9898
+ {
9899
+ name: "version",
9900
+ type: "string",
9901
+ required: true,
9902
+ description: "Version to release (e.g. 2026.5.4)",
9903
+ cli: { positional: true }
9904
+ },
9905
+ {
9906
+ name: "epicId",
9907
+ type: "string",
9908
+ required: false,
9909
+ description: "Epic ID this release ships"
9910
+ },
9911
+ {
9912
+ name: "branch",
9913
+ type: "string",
9914
+ required: false,
9915
+ description: "Override detected branch"
9916
+ }
9917
+ ]
9918
+ },
9919
+ // release query: verify (T1597 / ADR-063 canonical step 2)
9920
+ {
9921
+ gateway: "query",
9922
+ domain: "release",
9923
+ operation: "verify",
9924
+ description: "release.verify (query) \u2014 Step 2 of 4: run gates + audit child tasks of the active release epic (T1597 / ADR-063)",
9925
+ tier: 1,
9926
+ idempotent: true,
9927
+ sessionRequired: false,
9928
+ requiredParams: [],
9929
+ params: []
9930
+ },
9931
+ // release mutate: publish (T1597 / ADR-063 canonical step 3)
9932
+ {
9933
+ gateway: "mutate",
9934
+ domain: "release",
9935
+ operation: "publish",
9936
+ description: "release.publish (mutate) \u2014 Step 3 of 4: invoke project-context publish.command to publish the release artifact (T1597 / ADR-063)",
9937
+ tier: 1,
9938
+ idempotent: false,
9939
+ sessionRequired: false,
9940
+ requiredParams: [],
9941
+ params: [
9942
+ {
9943
+ name: "dryRun",
9944
+ type: "boolean",
9945
+ required: false,
9946
+ description: "Print command without executing"
9947
+ }
9948
+ ]
9949
+ },
9950
+ // release mutate: reconcile (T1597 / ADR-063 canonical step 4)
9951
+ {
9952
+ gateway: "mutate",
9953
+ domain: "release",
9954
+ operation: "reconcile",
9955
+ description: "release.reconcile (mutate) \u2014 Step 4 of 4: run post-release invariants, auto-complete tasks for the active release (T1597 / ADR-063)",
9956
+ tier: 1,
9957
+ idempotent: false,
9958
+ sessionRequired: false,
9959
+ requiredParams: [],
9960
+ params: [
9961
+ {
9962
+ name: "dryRun",
9963
+ type: "boolean",
9964
+ required: false,
9965
+ description: "Preview without mutations"
9966
+ }
9967
+ ]
9611
9968
  }
9612
9969
  ];
9613
9970
  counts = getCounts();
@@ -9957,6 +10314,7 @@ __export(engine_exports, {
9957
10314
  lifecycleReset: () => lifecycleReset,
9958
10315
  lifecycleSkip: () => lifecycleSkip,
9959
10316
  lifecycleStatus: () => lifecycleStatus,
10317
+ loadActiveReleaseHandle: () => loadActiveReleaseHandle,
9960
10318
  mapCodebase: () => mapCodebase,
9961
10319
  memoryBrainStats: () => memoryBrainStats,
9962
10320
  memoryContradictions: () => memoryContradictions,
@@ -10035,12 +10393,16 @@ __export(engine_exports, {
10035
10393
  releaseIvtrAutoSuggest: () => releaseIvtrAutoSuggest,
10036
10394
  releaseList: () => releaseList,
10037
10395
  releasePrepare: () => releasePrepare,
10396
+ releasePublish: () => releasePublish,
10038
10397
  releasePush: () => releasePush,
10398
+ releaseReconcile: () => releaseReconcile,
10039
10399
  releaseRollback: () => releaseRollback,
10040
10400
  releaseRollbackFull: () => releaseRollbackFull,
10041
10401
  releaseShip: () => releaseShip,
10042
10402
  releaseShow: () => releaseShow,
10403
+ releaseStart: () => releaseStart,
10043
10404
  releaseTag: () => releaseTag,
10405
+ releaseVerify: () => releaseVerify,
10044
10406
  sessionArchive: () => sessionArchive,
10045
10407
  sessionBriefing: () => sessionBriefing,
10046
10408
  sessionChainShow: () => sessionChainShow,
@@ -10165,6 +10527,7 @@ import {
10165
10527
  lifecycleReset,
10166
10528
  lifecycleSkip,
10167
10529
  lifecycleStatus,
10530
+ loadActiveReleaseHandle,
10168
10531
  mapCodebase,
10169
10532
  orchestrateAnalyze,
10170
10533
  orchestrateBootstrap,
@@ -10212,12 +10575,16 @@ import {
10212
10575
  releaseIvtrAutoSuggest,
10213
10576
  releaseList,
10214
10577
  releasePrepare,
10578
+ releasePublish,
10215
10579
  releasePush,
10580
+ releaseReconcile,
10216
10581
  releaseRollback,
10217
10582
  releaseRollbackFull,
10218
10583
  releaseShip,
10219
10584
  releaseShow,
10585
+ releaseStart,
10220
10586
  releaseTag,
10587
+ releaseVerify,
10221
10588
  sessionArchive,
10222
10589
  sessionBriefing,
10223
10590
  sessionChainShow,
@@ -23986,6 +24353,7 @@ var init_release2 = __esm({
23986
24353
  "use strict";
23987
24354
  init_engine();
23988
24355
  init_base();
24356
+ init_meta2();
23989
24357
  log2 = getLogger11("domain:release");
23990
24358
  coreOps3 = {
23991
24359
  gate: releaseGateOp,
@@ -24001,6 +24369,7 @@ var init_release2 = __esm({
24001
24369
  * Supported operations:
24002
24370
  * - `gate` — check IVTR phase state for all tasks in a release epic
24003
24371
  * - `ivtr-suggest` — check if all epic tasks are released and suggest `release ship`
24372
+ * - `verify` — Step 2 of 4: run gates + audit child tasks (T1597 / ADR-063)
24004
24373
  */
24005
24374
  async query(operation, params) {
24006
24375
  const startTime = Date.now();
@@ -24043,6 +24412,16 @@ var init_release2 = __esm({
24043
24412
  startTime
24044
24413
  );
24045
24414
  }
24415
+ // release.verify — Step 2 of 4: run gates + audit child tasks (T1597 / ADR-063)
24416
+ case "verify": {
24417
+ const handle = loadActiveReleaseHandle(getProjectRoot11());
24418
+ const result = await releaseVerify(handle);
24419
+ return {
24420
+ success: true,
24421
+ data: result,
24422
+ meta: dispatchMeta("query", "release", operation, startTime)
24423
+ };
24424
+ }
24046
24425
  default:
24047
24426
  return unsupportedOp("query", "release", operation, startTime);
24048
24427
  }
@@ -24064,6 +24443,9 @@ var init_release2 = __esm({
24064
24443
  * Supported operations:
24065
24444
  * - `gate` — same IVTR gate check as query.gate (no DB writes)
24066
24445
  * - `ivtr-suggest` — same auto-suggest as query.ivtr-suggest (no DB writes)
24446
+ * - `start` — Step 1 of 4: validate version, capture branch, persist handle
24447
+ * - `publish` — Step 3 of 4: invoke project-context publish.command
24448
+ * - `reconcile` — Step 4 of 4: run post-release invariants, auto-complete tasks
24067
24449
  */
24068
24450
  async mutate(operation, params) {
24069
24451
  const startTime = Date.now();
@@ -24106,6 +24488,52 @@ var init_release2 = __esm({
24106
24488
  startTime
24107
24489
  );
24108
24490
  }
24491
+ // release.start — Step 1 of 4 (T1597 / ADR-063)
24492
+ case "start": {
24493
+ const version = typeof params?.version === "string" ? params.version : void 0;
24494
+ if (!version)
24495
+ return errorResult(
24496
+ "mutate",
24497
+ "release",
24498
+ operation,
24499
+ "E_INVALID_INPUT",
24500
+ "version is required",
24501
+ startTime
24502
+ );
24503
+ const result = await releaseStart(version, {
24504
+ epicId: typeof params?.epicId === "string" ? params.epicId : void 0,
24505
+ branch: typeof params?.branch === "string" ? params.branch : void 0
24506
+ });
24507
+ return {
24508
+ success: true,
24509
+ data: result,
24510
+ meta: dispatchMeta("mutate", "release", operation, startTime)
24511
+ };
24512
+ }
24513
+ // release.publish — Step 3 of 4 (T1597 / ADR-063)
24514
+ case "publish": {
24515
+ const handle = loadActiveReleaseHandle(getProjectRoot11());
24516
+ const result = await releasePublish(handle, {
24517
+ dryRun: typeof params?.dryRun === "boolean" ? params.dryRun : false
24518
+ });
24519
+ return {
24520
+ success: true,
24521
+ data: result,
24522
+ meta: dispatchMeta("mutate", "release", operation, startTime)
24523
+ };
24524
+ }
24525
+ // release.reconcile — Step 4 of 4 (T1597 / ADR-063)
24526
+ case "reconcile": {
24527
+ const handle = loadActiveReleaseHandle(getProjectRoot11());
24528
+ const result = await releaseReconcile(handle, {
24529
+ dryRun: typeof params?.dryRun === "boolean" ? params.dryRun : false
24530
+ });
24531
+ return {
24532
+ success: true,
24533
+ data: result,
24534
+ meta: dispatchMeta("mutate", "release", operation, startTime)
24535
+ };
24536
+ }
24109
24537
  default:
24110
24538
  return unsupportedOp("mutate", "release", operation, startTime);
24111
24539
  }
@@ -24120,8 +24548,8 @@ var init_release2 = __esm({
24120
24548
  /** Return declared operations for introspection and registry validation. */
24121
24549
  getSupportedOperations() {
24122
24550
  return {
24123
- query: ["gate", "ivtr-suggest"],
24124
- mutate: ["gate", "ivtr-suggest"]
24551
+ query: ["gate", "ivtr-suggest", "verify"],
24552
+ mutate: ["gate", "ivtr-suggest", "start", "publish", "reconcile"]
24125
24553
  };
24126
24554
  }
24127
24555
  };
@@ -42353,7 +42781,7 @@ var analyzeCommand3 = defineCommand({
42353
42781
  try {
42354
42782
  const { runGitLogTaskLinker } = await import("@cleocode/core/nexus");
42355
42783
  const sweeperResult = await runGitLogTaskLinker(repoPath);
42356
- if (ctx.format !== "json" && sweeperResult.commitsProcessed > 0) {
42784
+ if (sweeperResult.commitsProcessed > 0) {
42357
42785
  process.stderr.write(
42358
42786
  `[nexus] Task-symbol sweep: ${sweeperResult.commitsProcessed} commit(s), ${sweeperResult.tasksFound} task(s), ${sweeperResult.linked} edge(s) linked.
42359
42787
  `