@cleocode/cleo 2026.5.28 → 2026.5.29

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
@@ -468,6 +468,7 @@ var init_exit_codes = __esm({
468
468
  ExitCode2[ExitCode2["TESTS_SKIPPED"] = 103] = "TESTS_SKIPPED";
469
469
  ExitCode2[ExitCode2["DUPLICATE_TASK_LIKELY"] = 105] = "DUPLICATE_TASK_LIKELY";
470
470
  ExitCode2[ExitCode2["LAFS_VIOLATION"] = 104] = "LAFS_VIOLATION";
471
+ ExitCode2[ExitCode2["DECISION_VALIDATOR_FAILED"] = 106] = "DECISION_VALIDATOR_FAILED";
471
472
  return ExitCode2;
472
473
  })(ExitCode || {});
473
474
  }
@@ -562,6 +563,13 @@ var init_facade = __esm({
562
563
  }
563
564
  });
564
565
 
566
+ // packages/contracts/src/graph.ts
567
+ var init_graph = __esm({
568
+ "packages/contracts/src/graph.ts"() {
569
+ "use strict";
570
+ }
571
+ });
572
+
565
573
  // packages/contracts/src/lafs.ts
566
574
  var init_lafs = __esm({
567
575
  "packages/contracts/src/lafs.ts"() {
@@ -1010,6 +1018,7 @@ var init_src = __esm({
1010
1018
  init_evidence_record_schema();
1011
1019
  init_exit_codes();
1012
1020
  init_facade();
1021
+ init_graph();
1013
1022
  init_lafs();
1014
1023
  init_operations();
1015
1024
  init_params();
@@ -3538,6 +3547,54 @@ var init_registry = __esm({
3538
3547
  requiredParams: [],
3539
3548
  params: []
3540
3549
  },
3550
+ {
3551
+ gateway: "query",
3552
+ domain: "tasks",
3553
+ operation: "deps.validate",
3554
+ description: "tasks.deps.validate (query) \u2014 validate dependency graph integrity for an epic or all tasks",
3555
+ tier: 1,
3556
+ idempotent: true,
3557
+ sessionRequired: false,
3558
+ requiredParams: [],
3559
+ params: [
3560
+ {
3561
+ name: "epicId",
3562
+ type: "string",
3563
+ required: false,
3564
+ description: "Scope validation to direct children of this epic (optional)"
3565
+ },
3566
+ {
3567
+ name: "scope",
3568
+ type: "string",
3569
+ required: false,
3570
+ description: "Which tasks to include: 'all', 'open', or 'critical' (default: 'all')"
3571
+ }
3572
+ ]
3573
+ },
3574
+ {
3575
+ gateway: "query",
3576
+ domain: "tasks",
3577
+ operation: "deps.tree",
3578
+ description: "tasks.deps.tree (query) \u2014 render dependency tree for an epic in text, mermaid, or json format",
3579
+ tier: 1,
3580
+ idempotent: true,
3581
+ sessionRequired: false,
3582
+ requiredParams: ["epicId"],
3583
+ params: [
3584
+ {
3585
+ name: "epicId",
3586
+ type: "string",
3587
+ required: true,
3588
+ description: "Epic ID to visualize (required)"
3589
+ },
3590
+ {
3591
+ name: "format",
3592
+ type: "string",
3593
+ required: false,
3594
+ description: "Output format: 'text', 'mermaid', or 'json' (default: 'text')"
3595
+ }
3596
+ ]
3597
+ },
3541
3598
  {
3542
3599
  gateway: "query",
3543
3600
  domain: "tasks",
@@ -10581,6 +10638,8 @@ __export(engine_exports, {
10581
10638
  taskDeps: () => taskDeps,
10582
10639
  taskDepsCycles: () => taskDepsCycles,
10583
10640
  taskDepsOverview: () => taskDepsOverview,
10641
+ taskDepsTree: () => taskDepsTree,
10642
+ taskDepsValidate: () => taskDepsValidate,
10584
10643
  taskExists: () => taskExists,
10585
10644
  taskExport: () => taskExport,
10586
10645
  taskFind: () => taskFind,
@@ -10763,6 +10822,8 @@ import {
10763
10822
  taskDeps,
10764
10823
  taskDepsCycles,
10765
10824
  taskDepsOverview,
10825
+ taskDepsTree,
10826
+ taskDepsValidate,
10766
10827
  taskExists,
10767
10828
  taskExport,
10768
10829
  taskFind,
@@ -14720,7 +14781,9 @@ var init_memory2 = __esm({
14720
14781
  {
14721
14782
  query: paramString(params, "query"),
14722
14783
  taskId: paramString(params, "taskId"),
14723
- limit: paramNumber(params, "limit")
14784
+ limit: paramNumber(params, "limit"),
14785
+ // T1830: opt-in to AGT-* dispatch rows; excluded by default
14786
+ includeAgentDispatch: paramBool(params, "includeAgentDispatch") ?? false
14724
14787
  },
14725
14788
  projectRoot
14726
14789
  );
@@ -22481,7 +22544,9 @@ async function orchestrateNextOp(params) {
22481
22544
  return orchestrateNext(params.epicId, getProjectRoot9());
22482
22545
  }
22483
22546
  async function orchestrateReadyOp(params) {
22484
- return orchestrateReady(params.epicId, getProjectRoot9());
22547
+ return orchestrateReady(params.epicId, getProjectRoot9(), {
22548
+ ignoreDepsValidate: params.ignoreDepsValidate
22549
+ });
22485
22550
  }
22486
22551
  async function orchestrateAnalyzeOp(params) {
22487
22552
  if (params.mode === "parallel-safety") {
@@ -23179,7 +23244,10 @@ var init_orchestrate2 = __esm({
23179
23244
  "epicId is required",
23180
23245
  startTime
23181
23246
  );
23182
- const p = { epicId: params.epicId };
23247
+ const p = {
23248
+ epicId: params.epicId,
23249
+ ignoreDepsValidate: params.ignoreDepsValidate
23250
+ };
23183
23251
  return wrapResult(await coreOps.ready(p), "query", "orchestrate", operation, startTime);
23184
23252
  }
23185
23253
  case "analyze": {
@@ -25683,6 +25751,23 @@ var init_tasks3 = __esm({
25683
25751
  "depends"
25684
25752
  );
25685
25753
  },
25754
+ "deps.validate": async (params) => {
25755
+ const projectRoot = getProjectRoot15();
25756
+ return wrapCoreResult(
25757
+ await taskDepsValidate(projectRoot, params.epicId, params.scope),
25758
+ "deps.validate"
25759
+ );
25760
+ },
25761
+ "deps.tree": async (params) => {
25762
+ const projectRoot = getProjectRoot15();
25763
+ if (!params.epicId) {
25764
+ return lafsError("E_INVALID_INPUT", "epicId is required for deps.tree", "deps.tree");
25765
+ }
25766
+ return wrapCoreResult(
25767
+ await taskDepsTree(projectRoot, params.epicId, params.format),
25768
+ "deps.tree"
25769
+ );
25770
+ },
25686
25771
  analyze: async (params) => {
25687
25772
  const projectRoot = getProjectRoot15();
25688
25773
  return wrapCoreResult(
@@ -25943,6 +26028,8 @@ var init_tasks3 = __esm({
25943
26028
  "tree",
25944
26029
  "blockers",
25945
26030
  "depends",
26031
+ "deps.validate",
26032
+ "deps.tree",
25946
26033
  "analyze",
25947
26034
  "impact",
25948
26035
  "next",
@@ -26054,6 +26141,8 @@ var init_tasks3 = __esm({
26054
26141
  "tree",
26055
26142
  "blockers",
26056
26143
  "depends",
26144
+ "deps.validate",
26145
+ "deps.tree",
26057
26146
  "analyze",
26058
26147
  "impact",
26059
26148
  "next",
@@ -36105,6 +36194,71 @@ var cyclesCommand = defineCommand({
36105
36194
  );
36106
36195
  }
36107
36196
  });
36197
+ var validateCommand5 = defineCommand({
36198
+ meta: {
36199
+ name: "validate",
36200
+ description: "Validate dep graph \u2014 orphan, circular, cross-epic gap, stale-dep detection"
36201
+ },
36202
+ args: {
36203
+ epic: {
36204
+ type: "string",
36205
+ description: "Scope validation to direct children of this epic ID"
36206
+ },
36207
+ scope: {
36208
+ type: "string",
36209
+ description: "Which tasks to include: all (default), open, or critical",
36210
+ default: "all"
36211
+ }
36212
+ },
36213
+ async run({ args }) {
36214
+ await dispatchFromCli(
36215
+ "query",
36216
+ "tasks",
36217
+ "deps.validate",
36218
+ {
36219
+ epicId: args.epic,
36220
+ scope: args.scope
36221
+ },
36222
+ { command: "deps", operation: "tasks.deps.validate" }
36223
+ );
36224
+ }
36225
+ });
36226
+ var depsTreeCommand = defineCommand({
36227
+ meta: {
36228
+ name: "tree",
36229
+ description: "Render the dep-graph tree for an epic (text/mermaid/json)"
36230
+ },
36231
+ args: {
36232
+ epic: {
36233
+ type: "string",
36234
+ description: "Epic ID to visualize",
36235
+ required: true
36236
+ },
36237
+ json: {
36238
+ type: "boolean",
36239
+ description: "Emit machine-readable JSON tree",
36240
+ default: false
36241
+ },
36242
+ mermaid: {
36243
+ type: "boolean",
36244
+ description: "Emit Mermaid graph TD block",
36245
+ default: false
36246
+ }
36247
+ },
36248
+ async run({ args }) {
36249
+ const format = args.json ? "json" : args.mermaid ? "mermaid" : "text";
36250
+ await dispatchFromCli(
36251
+ "query",
36252
+ "tasks",
36253
+ "deps.tree",
36254
+ {
36255
+ epicId: args.epic,
36256
+ format
36257
+ },
36258
+ { command: "deps", operation: "tasks.deps.tree" }
36259
+ );
36260
+ }
36261
+ });
36108
36262
  var depsCommand = defineCommand({
36109
36263
  meta: { name: "deps", description: "Dependency visualization and analysis" },
36110
36264
  subCommands: {
@@ -36113,7 +36267,9 @@ var depsCommand = defineCommand({
36113
36267
  waves: wavesCommand,
36114
36268
  "critical-path": criticalPathCommand,
36115
36269
  impact: impactCommand,
36116
- cycles: cyclesCommand
36270
+ cycles: cyclesCommand,
36271
+ validate: validateCommand5,
36272
+ tree: depsTreeCommand
36117
36273
  },
36118
36274
  async run({ cmd, rawArgs }) {
36119
36275
  const firstArg = rawArgs?.find((a) => !a.startsWith("-"));
@@ -40306,6 +40462,10 @@ var decisionFindCommand = defineCommand({
40306
40462
  type: "string",
40307
40463
  description: "Maximum results"
40308
40464
  },
40465
+ "include-agent-dispatch": {
40466
+ type: "boolean",
40467
+ description: "Include AGT-* agent dispatch rows (excluded by default \u2014 use to surface execution history)"
40468
+ },
40309
40469
  json: {
40310
40470
  type: "boolean",
40311
40471
  description: "Output as JSON"
@@ -40318,7 +40478,9 @@ var decisionFindCommand = defineCommand({
40318
40478
  "decision.find",
40319
40479
  {
40320
40480
  query: args.query ?? "",
40321
- limit: args.limit !== void 0 ? parseInt(args.limit, 10) : void 0
40481
+ limit: args.limit !== void 0 ? parseInt(args.limit, 10) : void 0,
40482
+ // T1830: pass flag so the engine can filter by decision_category
40483
+ includeAgentDispatch: args["include-agent-dispatch"] === true
40322
40484
  },
40323
40485
  { command: "memory", operation: "memory.decision.find" }
40324
40486
  );
@@ -44777,6 +44939,10 @@ var readyCommand = defineCommand({
44777
44939
  type: "positional",
44778
44940
  description: "Epic ID to query",
44779
44941
  required: true
44942
+ },
44943
+ "ignore-deps-validate": {
44944
+ type: "boolean",
44945
+ description: "Skip dep-graph validation and proceed even if issues exist (audit-logged bypass). CLI-only \u2014 sentient mode does not support this flag."
44780
44946
  }
44781
44947
  },
44782
44948
  async run({ args }) {
@@ -44784,7 +44950,10 @@ var readyCommand = defineCommand({
44784
44950
  "query",
44785
44951
  "orchestrate",
44786
44952
  "ready",
44787
- { epicId: args.epicId },
44953
+ {
44954
+ epicId: args.epicId,
44955
+ ignoreDepsValidate: args["ignore-deps-validate"] === true
44956
+ },
44788
44957
  { command: "orchestrate" }
44789
44958
  );
44790
44959
  }
@@ -44897,7 +45066,7 @@ var spawnCommand2 = defineCommand({
44897
45066
  );
44898
45067
  }
44899
45068
  });
44900
- var validateCommand5 = defineCommand({
45069
+ var validateCommand6 = defineCommand({
44901
45070
  meta: { name: "validate", description: "Validate subagent output" },
44902
45071
  args: {
44903
45072
  taskId: {
@@ -45462,7 +45631,7 @@ var orchestrateCommand = defineCommand({
45462
45631
  waves: wavesCommand2,
45463
45632
  plan: planCommand,
45464
45633
  spawn: spawnCommand2,
45465
- validate: validateCommand5,
45634
+ validate: validateCommand6,
45466
45635
  context: contextCommand4,
45467
45636
  ivtr: ivtrCommand,
45468
45637
  parallel: parallelCommand,
@@ -46060,7 +46229,7 @@ var listCommand13 = defineCommand({
46060
46229
  );
46061
46230
  }
46062
46231
  });
46063
- var validateCommand6 = defineCommand({
46232
+ var validateCommand7 = defineCommand({
46064
46233
  meta: {
46065
46234
  name: "validate",
46066
46235
  description: "Parse and validate a .cantbook file \u2014 exit 0 on success, exit 70 on parse error (T1261)"
@@ -46094,7 +46263,7 @@ var playbookCommand = defineCommand({
46094
46263
  resume: resumeCommand,
46095
46264
  list: listCommand13,
46096
46265
  create: createCommand2,
46097
- validate: validateCommand6
46266
+ validate: validateCommand7
46098
46267
  },
46099
46268
  async run({ cmd, rawArgs }) {
46100
46269
  const firstArg = rawArgs?.find((a) => !a.startsWith("-"));
@@ -50115,7 +50284,7 @@ var searchCommand3 = defineCommand({
50115
50284
  );
50116
50285
  }
50117
50286
  });
50118
- var validateCommand7 = defineCommand({
50287
+ var validateCommand8 = defineCommand({
50119
50288
  meta: { name: "validate", description: "Validate skill against protocol" },
50120
50289
  args: {
50121
50290
  "skill-name": {
@@ -50382,7 +50551,7 @@ var skillsCommand2 = defineCommand({
50382
50551
  subCommands: {
50383
50552
  list: listCommand20,
50384
50553
  search: searchCommand3,
50385
- validate: validateCommand7,
50554
+ validate: validateCommand8,
50386
50555
  info: infoCommand,
50387
50556
  install: installCommand3,
50388
50557
  uninstall: uninstallCommand2,
@@ -51004,7 +51173,7 @@ var syncCommand5 = defineCommand({
51004
51173
 
51005
51174
  // packages/cleo/src/cli/commands/testing.ts
51006
51175
  init_cli();
51007
- var validateCommand8 = defineCommand({
51176
+ var validateCommand9 = defineCommand({
51008
51177
  meta: { name: "validate", description: "Validate testing protocol compliance for a task" },
51009
51178
  args: {
51010
51179
  taskId: {
@@ -51104,7 +51273,7 @@ var runCommand4 = defineCommand({
51104
51273
  var testingCommand = defineCommand({
51105
51274
  meta: { name: "testing", description: "Validate testing protocol compliance" },
51106
51275
  subCommands: {
51107
- validate: validateCommand8,
51276
+ validate: validateCommand9,
51108
51277
  check: checkCommand7,
51109
51278
  status: statusCommand12,
51110
51279
  coverage: coverageCommand,