@cleocode/cleo 2026.4.21 → 2026.4.23

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
@@ -10836,8 +10836,9 @@ function getProjectRoot(cwd) {
10836
10836
  if (scope !== void 0) {
10837
10837
  return scope.worktreeRoot;
10838
10838
  }
10839
- if (process.env["CLEO_ROOT"]) {
10840
- return process.env["CLEO_ROOT"];
10839
+ const envRoot = process.env["CLEO_ROOT"] ?? process.env["CLEO_PROJECT_ROOT"];
10840
+ if (envRoot) {
10841
+ return envRoot;
10841
10842
  }
10842
10843
  const cleoDirEnv = process.env["CLEO_DIR"];
10843
10844
  if (cleoDirEnv && isAbsolutePath(cleoDirEnv)) {
@@ -34311,6 +34312,31 @@ function validatePhaseFormat(phase) {
34311
34312
  );
34312
34313
  }
34313
34314
  }
34315
+ function throwCombinedValidationError(issues, options) {
34316
+ const summary = issues.length === 1 ? issues[0].message : `${issues.length} validation issues found:
34317
+ ${issues.map((i, n) => ` ${n + 1}. ${i.message}`).join("\n")}`;
34318
+ const fixes = issues.map((i) => i.fix).filter(Boolean);
34319
+ const fixSummary = fixes.length === 0 ? void 0 : fixes.length === 1 ? fixes[0] : fixes.map((f2, n) => `${n + 1}. ${f2}`).join("\n");
34320
+ const submittedParams = { title: options.title };
34321
+ if (options.parentId) submittedParams.parent = options.parentId;
34322
+ if (options.type) submittedParams.type = options.type;
34323
+ if (options.priority) submittedParams.priority = options.priority;
34324
+ if (options.size) submittedParams.size = options.size;
34325
+ if (options.description) submittedParams.description = "(provided)";
34326
+ if (options.acceptance?.length)
34327
+ submittedParams.acceptance = `${options.acceptance.length} criteria`;
34328
+ if (options.depends?.length) submittedParams.depends = options.depends;
34329
+ if (options.phase) submittedParams.phase = options.phase;
34330
+ if (options.labels?.length) submittedParams.labels = options.labels;
34331
+ throw new CleoError(6 /* VALIDATION_ERROR */, summary, {
34332
+ fix: fixSummary,
34333
+ details: {
34334
+ field: issues.length === 1 ? issues[0].field : "multiple",
34335
+ issues,
34336
+ submittedParams
34337
+ }
34338
+ });
34339
+ }
34314
34340
  function validateDepends(depends, tasks2) {
34315
34341
  const existingIds = new Set(tasks2.map((t) => t.id));
34316
34342
  for (const depId of depends) {
@@ -34438,46 +34464,69 @@ function findRecentDuplicate(title, phase, tasks2, windowSeconds = 60) {
34438
34464
  }
34439
34465
  async function addTask(options, cwd, accessor) {
34440
34466
  validateTitle(options.title);
34441
- if (options.description && options.title.trim().toLowerCase() === options.description.trim().toLowerCase()) {
34442
- throw new CleoError(
34443
- 6 /* VALIDATION_ERROR */,
34444
- "Title and description must be different (anti-hallucination rule)",
34445
- {
34446
- fix: "Provide --desc with a description different from the title",
34447
- details: { field: "description" }
34448
- }
34449
- );
34450
- }
34451
34467
  if (!options.dryRun) {
34452
34468
  await requireActiveSession("tasks.add", cwd);
34453
34469
  }
34470
+ const issues = [];
34471
+ const warnings = [];
34472
+ if (options.description && options.title.trim().toLowerCase() === options.description.trim().toLowerCase()) {
34473
+ issues.push({
34474
+ field: "description",
34475
+ message: "Title and description must be different (anti-hallucination rule)",
34476
+ fix: "Provide --desc with a description different from the title"
34477
+ });
34478
+ }
34454
34479
  const parentId = options.parentId ?? null;
34455
34480
  if (!options.dryRun && !parentId && options.type !== "epic") {
34456
34481
  const lifecycleMode = await getLifecycleMode(cwd);
34457
34482
  if (lifecycleMode === "strict") {
34458
- throw new CleoError(
34459
- 6 /* VALIDATION_ERROR */,
34460
- 'Tasks must have a parent (epic or task) in strict mode. Use --parent <epicId>, --type epic for a root-level epic, or set lifecycle.mode to "advisory".',
34461
- {
34462
- fix: 'cleo add "Task title" --parent T### --acceptance "AC1|AC2|AC3"',
34463
- alternatives: [
34464
- {
34465
- action: "Create as epic",
34466
- command: 'cleo add "Epic title" --type epic --priority high'
34467
- }
34468
- ]
34469
- }
34483
+ issues.push({
34484
+ field: "parentId",
34485
+ message: 'Tasks must have a parent (epic or task) in strict mode. Use --parent <epicId>, --type epic for a root-level epic, or set lifecycle.mode to "advisory".',
34486
+ fix: 'cleo add "Task title" --parent T### --acceptance "AC1|AC2|AC3"'
34487
+ });
34488
+ } else {
34489
+ warnings.push(
34490
+ "Task created without a parent. Use --parent <epicId> to assign to an epic hierarchy."
34470
34491
  );
34471
34492
  }
34472
34493
  }
34473
34494
  const dataAccessor = accessor ?? await (await Promise.resolve().then(() => (init_data_accessor(), data_accessor_exports))).getAccessor(cwd);
34474
34495
  const status = options.status ?? "pending";
34475
- const priority = normalizePriority(options.priority ?? "medium");
34496
+ let priority;
34497
+ try {
34498
+ priority = normalizePriority(options.priority ?? "medium");
34499
+ } catch (err) {
34500
+ if (err instanceof CleoError) {
34501
+ issues.push({ field: "priority", message: err.message, fix: err.fix });
34502
+ }
34503
+ priority = "medium";
34504
+ }
34476
34505
  const size = options.size ?? "medium";
34477
34506
  let taskType = options.type;
34478
- validateStatus(status);
34479
- validateSize(size);
34480
- if (options.labels?.length) validateLabels(options.labels);
34507
+ try {
34508
+ validateStatus(status);
34509
+ } catch (err) {
34510
+ if (err instanceof CleoError) {
34511
+ issues.push({ field: "status", message: err.message, fix: err.fix });
34512
+ }
34513
+ }
34514
+ try {
34515
+ validateSize(size);
34516
+ } catch (err) {
34517
+ if (err instanceof CleoError) {
34518
+ issues.push({ field: "size", message: err.message, fix: err.fix });
34519
+ }
34520
+ }
34521
+ if (options.labels?.length) {
34522
+ try {
34523
+ validateLabels(options.labels);
34524
+ } catch (err) {
34525
+ if (err instanceof CleoError) {
34526
+ issues.push({ field: "labels", message: err.message, fix: err.fix });
34527
+ }
34528
+ }
34529
+ }
34481
34530
  if (!options.dryRun) {
34482
34531
  const enforcement = await createAcceptanceEnforcement(cwd);
34483
34532
  const acValidation = enforcement.validateCreation({
@@ -34485,17 +34534,28 @@ async function addTask(options, cwd, accessor) {
34485
34534
  priority
34486
34535
  });
34487
34536
  if (!acValidation.valid) {
34488
- throw new CleoError(acValidation.exitCode ?? 6 /* VALIDATION_ERROR */, acValidation.error, {
34537
+ issues.push({
34538
+ field: "acceptance",
34539
+ message: acValidation.error,
34489
34540
  fix: acValidation.fix
34490
34541
  });
34491
34542
  }
34492
34543
  if (options.type === "epic") {
34493
- await validateEpicCreation(
34494
- { acceptance: options.acceptance, description: options.description },
34495
- cwd
34496
- );
34544
+ try {
34545
+ await validateEpicCreation(
34546
+ { acceptance: options.acceptance, description: options.description },
34547
+ cwd
34548
+ );
34549
+ } catch (err) {
34550
+ if (err instanceof CleoError) {
34551
+ issues.push({ field: "epic", message: err.message, fix: err.fix });
34552
+ }
34553
+ }
34497
34554
  }
34498
34555
  }
34556
+ if (issues.length > 0) {
34557
+ throwCombinedValidationError(issues, options);
34558
+ }
34499
34559
  if (options.depends?.length) {
34500
34560
  for (const depId of options.depends) {
34501
34561
  const trimmed = depId.trim();
@@ -34794,7 +34854,7 @@ async function addTask(options, cwd, accessor) {
34794
34854
  after: { title: options.title, status, priority }
34795
34855
  });
34796
34856
  });
34797
- return { task };
34857
+ return { task, ...warnings.length > 0 && { warnings } };
34798
34858
  }
34799
34859
  var NUMERIC_PRIORITY_MAP, VALID_PRIORITIES;
34800
34860
  var init_add = __esm({
@@ -38729,10 +38789,10 @@ async function readProjectMeta(projectPath) {
38729
38789
  }
38730
38790
  async function readProjectId(projectPath) {
38731
38791
  try {
38732
- const { readFileSync: readFileSync101, existsSync: existsSync131 } = await import("node:fs");
38792
+ const { readFileSync: readFileSync102, existsSync: existsSync131 } = await import("node:fs");
38733
38793
  const infoPath = join64(projectPath, ".cleo", "project-info.json");
38734
38794
  if (!existsSync131(infoPath)) return "";
38735
- const data = JSON.parse(readFileSync101(infoPath, "utf-8"));
38795
+ const data = JSON.parse(readFileSync102(infoPath, "utf-8"));
38736
38796
  return typeof data.projectId === "string" ? data.projectId : "";
38737
38797
  } catch {
38738
38798
  return "";
@@ -54949,7 +55009,7 @@ function fuzzyScore(query, text3) {
54949
55009
  return 0;
54950
55010
  }
54951
55011
  async function findTasks(options, cwd, accessor) {
54952
- if (!options.query && !options.id) {
55012
+ if (options.query == null && !options.id) {
54953
55013
  throw new CleoError(2 /* INVALID_INPUT */, "Search query or --id is required", {
54954
55014
  fix: 'cleo find "<query>"',
54955
55015
  details: { field: "query" }
@@ -54986,6 +55046,8 @@ async function findTasks(options, cwd, accessor) {
54986
55046
  priority: t.priority,
54987
55047
  type: t.type,
54988
55048
  parentId: t.parentId,
55049
+ depends: t.depends ?? [],
55050
+ size: t.size ?? void 0,
54989
55051
  score: t.id.toUpperCase() === idQuery ? 100 : t.id.toUpperCase().startsWith(idQuery) ? 80 : 50
54990
55052
  }));
54991
55053
  } else if (options.exact) {
@@ -54998,6 +55060,8 @@ async function findTasks(options, cwd, accessor) {
54998
55060
  priority: t.priority,
54999
55061
  type: t.type,
55000
55062
  parentId: t.parentId,
55063
+ depends: t.depends ?? [],
55064
+ size: t.size ?? void 0,
55001
55065
  score: 100
55002
55066
  }));
55003
55067
  } else {
@@ -55016,6 +55080,8 @@ async function findTasks(options, cwd, accessor) {
55016
55080
  priority: t.priority,
55017
55081
  type: t.type,
55018
55082
  parentId: t.parentId,
55083
+ depends: t.depends ?? [],
55084
+ size: t.size ?? void 0,
55019
55085
  score: Math.round(score)
55020
55086
  });
55021
55087
  }
@@ -55179,35 +55245,6 @@ var init_show3 = __esm({
55179
55245
  });
55180
55246
 
55181
55247
  // packages/core/src/tasks/index.ts
55182
- var tasks_exports = {};
55183
- __export(tasks_exports, {
55184
- VALID_PRIORITIES: () => VALID_PRIORITIES,
55185
- addTask: () => addTask,
55186
- archiveTasks: () => archiveTasks,
55187
- buildDefaultVerification: () => buildDefaultVerification,
55188
- completeTask: () => completeTask,
55189
- deleteTask: () => deleteTask,
55190
- findRecentDuplicate: () => findRecentDuplicate,
55191
- findTasks: () => findTasks,
55192
- fuzzyScore: () => fuzzyScore,
55193
- getNextPosition: () => getNextPosition,
55194
- getTaskDepth: () => getTaskDepth,
55195
- inferTaskType: () => inferTaskType,
55196
- listTasks: () => listTasks,
55197
- logOperation: () => logOperation,
55198
- normalizePriority: () => normalizePriority,
55199
- showTask: () => showTask,
55200
- updateTask: () => updateTask,
55201
- validateDepends: () => validateDepends,
55202
- validateLabels: () => validateLabels,
55203
- validateParent: () => validateParent,
55204
- validatePhaseFormat: () => validatePhaseFormat,
55205
- validatePriority: () => validatePriority,
55206
- validateSize: () => validateSize,
55207
- validateStatus: () => validateStatus,
55208
- validateTaskType: () => validateTaskType,
55209
- validateTitle: () => validateTitle
55210
- });
55211
55248
  var init_tasks2 = __esm({
55212
55249
  "packages/core/src/tasks/index.ts"() {
55213
55250
  "use strict";
@@ -75151,258 +75188,6 @@ var init_cleo = __esm({
75151
75188
  });
75152
75189
 
75153
75190
  // packages/core/src/index.ts
75154
- var src_exports = {};
75155
- __export(src_exports, {
75156
- ADR_STATUSES: () => ADR_STATUSES,
75157
- AGENT_INSTANCE_STATUSES: () => AGENT_INSTANCE_STATUSES,
75158
- AGENT_TYPES: () => AGENT_TYPES,
75159
- AdapterManager: () => AdapterManager,
75160
- BRAIN_OBSERVATION_TYPES: () => BRAIN_OBSERVATION_TYPES,
75161
- CORE_PROTECTED_FILES: () => CORE_PROTECTED_FILES,
75162
- Cleo: () => Cleo,
75163
- CleoError: () => CleoError,
75164
- ERROR_CATALOG: () => ERROR_CATALOG,
75165
- ExitCode: () => ExitCode,
75166
- GATE_STATUSES: () => GATE_STATUSES,
75167
- HookRegistry: () => HookRegistry,
75168
- LIFECYCLE_PIPELINE_STATUSES: () => LIFECYCLE_PIPELINE_STATUSES,
75169
- LIFECYCLE_STAGE_STATUSES: () => LIFECYCLE_STAGE_STATUSES,
75170
- MANIFEST_STATUSES: () => MANIFEST_STATUSES,
75171
- MINIMUM_NODE_MAJOR: () => MINIMUM_NODE_MAJOR,
75172
- OrchestrationLevel: () => OrchestrationLevel,
75173
- PIPELINE_STATUS_ICONS: () => PIPELINE_STATUS_ICONS,
75174
- PLATFORM: () => PLATFORM,
75175
- SESSION_STATUSES: () => SESSION_STATUSES,
75176
- STAGE_STATUS_ICONS: () => STAGE_STATUS_ICONS,
75177
- STATUS_REGISTRY: () => STATUS_REGISTRY,
75178
- STRICTNESS_PRESETS: () => STRICTNESS_PRESETS,
75179
- SessionView: () => SessionView,
75180
- TASK_STATUSES: () => TASK_STATUSES,
75181
- TASK_STATUS_SYMBOLS_ASCII: () => TASK_STATUS_SYMBOLS_ASCII,
75182
- TASK_STATUS_SYMBOLS_UNICODE: () => TASK_STATUS_SYMBOLS_UNICODE,
75183
- TERMINAL_PIPELINE_STATUSES: () => TERMINAL_PIPELINE_STATUSES,
75184
- TERMINAL_STAGE_STATUSES: () => TERMINAL_STAGE_STATUSES,
75185
- TERMINAL_TASK_STATUSES: () => TERMINAL_TASK_STATUSES,
75186
- adapters: () => adapters_exports,
75187
- addTask: () => addTask,
75188
- admin: () => admin_exports,
75189
- adrStatusSchema: () => adrStatusSchema,
75190
- adrs: () => adrs_exports,
75191
- agentInstanceStatusSchema: () => agentInstanceStatusSchema,
75192
- agentTypeSchema: () => agentTypeSchema,
75193
- agents: () => agents_exports,
75194
- applyStrictnessPreset: () => applyStrictnessPreset,
75195
- archiveTasks: () => archiveTasks,
75196
- bootstrapGlobalCleo: () => bootstrapGlobalCleo,
75197
- brainConfidenceLevelSchema: () => brainConfidenceLevelSchema,
75198
- brainDecisionTypeSchema: () => brainDecisionTypeSchema,
75199
- brainEdgeTypeSchema: () => brainEdgeTypeSchema,
75200
- brainImpactLevelSchema: () => brainImpactLevelSchema,
75201
- brainLinkTypeSchema: () => brainLinkTypeSchema,
75202
- brainMemoryTypeSchema: () => brainMemoryTypeSchema,
75203
- brainNodeTypeSchema: () => brainNodeTypeSchema,
75204
- brainObservationSourceTypeSchema: () => brainObservationSourceTypeSchema,
75205
- brainObservationTypeSchema: () => brainObservationTypeSchema,
75206
- brainOutcomeTypeSchema: () => brainOutcomeTypeSchema,
75207
- brainPatternTypeSchema: () => brainPatternTypeSchema,
75208
- brainStickyColorSchema: () => brainStickyColorSchema,
75209
- brainStickyPrioritySchema: () => brainStickyPrioritySchema,
75210
- brainStickyStatusSchema: () => brainStickyStatusSchema,
75211
- caamp: () => caamp_exports,
75212
- checkSchema: () => checkSchema,
75213
- checkStorageMigration: () => checkStorageMigration,
75214
- classifyProject: () => classifyProject,
75215
- closeLogger: () => closeLogger,
75216
- code: () => code_exports,
75217
- codebaseMap: () => codebase_map_exports,
75218
- compareSemver: () => compareSemver,
75219
- completeTask: () => completeTask,
75220
- compliance: () => compliance_exports,
75221
- conduit: () => conduit_exports,
75222
- context: () => context_exports,
75223
- coreHooks: () => hooks_exports,
75224
- createDataAccessor: () => createDataAccessor,
75225
- createErrorResult: () => createErrorResult,
75226
- createPage: () => createPage,
75227
- createSuccessResult: () => createSuccessResult,
75228
- currentTask: () => currentTask,
75229
- deleteTask: () => deleteTask,
75230
- detectPlatform: () => detectPlatform,
75231
- detectVersion: () => detectVersion,
75232
- endSession: () => endSession,
75233
- ensureCleoOsHub: () => ensureCleoOsHub,
75234
- ensureCleoStructure: () => ensureCleoStructure,
75235
- ensureGlobalHome: () => ensureGlobalHome,
75236
- ensureGlobalScaffold: () => ensureGlobalScaffold,
75237
- ensureInitialized: () => ensureInitialized,
75238
- ensureSqliteDb: () => ensureSqliteDb,
75239
- externalLinkTypeSchema: () => externalLinkTypeSchema,
75240
- fetchBrainEntries: () => fetchBrainEntries,
75241
- fileExists: () => fileExists,
75242
- findTasks: () => findTasks,
75243
- formatError: () => formatError3,
75244
- formatOutput: () => formatOutput,
75245
- formatSuccess: () => formatSuccess,
75246
- gateStatusSchema: () => gateStatusSchema,
75247
- getAccessor: () => getAccessor,
75248
- getAllErrorDefinitions: () => getAllErrorDefinitions,
75249
- getCleoCacheDir: () => getCleoCacheDir,
75250
- getCleoCantWorkflowsDir: () => getCleoCantWorkflowsDir,
75251
- getCleoConfigDir: () => getCleoConfigDir,
75252
- getCleoDir: () => getCleoDir,
75253
- getCleoDirAbsolute: () => getCleoDirAbsolute,
75254
- getCleoErrorRegistry: () => getCleoErrorRegistry,
75255
- getCleoGlobalAgentsDir: () => getCleoGlobalAgentsDir,
75256
- getCleoGlobalJustfilePath: () => getCleoGlobalJustfilePath,
75257
- getCleoGlobalRecipesDir: () => getCleoGlobalRecipesDir,
75258
- getCleoHome: () => getCleoHome,
75259
- getCleoLogDir: () => getCleoLogDir,
75260
- getCleoPiExtensionsDir: () => getCleoPiExtensionsDir,
75261
- getCleoTempDir: () => getCleoTempDir,
75262
- getCleoTemplatesTildePath: () => getCleoTemplatesTildePath,
75263
- getCleoVersion: () => getCleoVersion,
75264
- getConfigPath: () => getConfigPath,
75265
- getConfigValue: () => getConfigValue,
75266
- getErrorDefinition: () => getErrorDefinition,
75267
- getErrorDefinitionByLafsCode: () => getErrorDefinitionByLafsCode,
75268
- getErrorMessage: () => getErrorMessage,
75269
- getExitCodeName: () => getExitCodeName,
75270
- getGlobalConfigPath: () => getGlobalConfigPath,
75271
- getIsoTimestamp: () => getIsoTimestamp,
75272
- getLogDir: () => getLogDir,
75273
- getLogger: () => getLogger,
75274
- getMigrationStatus: () => getMigrationStatus,
75275
- getPackageRoot: () => getPackageRoot,
75276
- getProjectInfo: () => getProjectInfo,
75277
- getProjectInfoSync: () => getProjectInfoSync,
75278
- getProjectRoot: () => getProjectRoot,
75279
- getRawConfig: () => getRawConfig,
75280
- getRawConfigValue: () => getRawConfigValue,
75281
- getRegistryEntry: () => getRegistryEntry,
75282
- getRegistryEntryByLafsCode: () => getRegistryEntryByLafsCode,
75283
- getSystemInfo: () => getSystemInfo2,
75284
- getSystemMigrationStatus: () => getMigrationStatus2,
75285
- getVersion: () => getVersion2,
75286
- hooks: () => hooks,
75287
- initLogger: () => initLogger,
75288
- initProject: () => initProject,
75289
- inject: () => inject_exports,
75290
- insertAgentErrorLogSchema: () => insertAgentErrorLogSchema,
75291
- insertAgentInstanceSchema: () => insertAgentInstanceSchema,
75292
- insertExternalTaskLinkSchema: () => insertExternalTaskLinkSchema,
75293
- insertPipelineManifestSchema: () => insertPipelineManifestSchema,
75294
- insertReleaseManifestSchema: () => insertReleaseManifestSchema,
75295
- insertSessionSchema: () => insertSessionSchema,
75296
- insertTaskSchema: () => insertTaskSchema,
75297
- intelligence: () => intelligence_exports,
75298
- isCleoRegisteredCode: () => isCleoRegisteredCode,
75299
- isErrorCode: () => isErrorCode,
75300
- isErrorResult: () => isErrorResult,
75301
- isErrorType: () => isErrorType,
75302
- isGatewayEnvelope: () => isGatewayEnvelope,
75303
- isLafsError: () => isLafsError,
75304
- isLafsSuccess: () => isLafsSuccess,
75305
- isNoChangeCode: () => isNoChangeCode,
75306
- isProjectInitialized: () => isProjectInitialized,
75307
- isRecoverableCode: () => isRecoverableCode,
75308
- isSuccessCode: () => isSuccessCode,
75309
- isValidStatus: () => isValidStatus,
75310
- issue: () => issue_exports,
75311
- lib: () => lib_exports,
75312
- lifecycle: () => lifecycle_exports,
75313
- lifecycleEvidenceTypeSchema: () => lifecycleEvidenceTypeSchema,
75314
- lifecycleGateResultSchema: () => lifecycleGateResultSchema,
75315
- lifecyclePipelineStatusSchema: () => lifecyclePipelineStatusSchema,
75316
- lifecycleStageNameSchema: () => lifecycleStageNameSchema,
75317
- lifecycleStageStatusSchema: () => lifecycleStageStatusSchema,
75318
- lifecycleTransitionTypeSchema: () => lifecycleTransitionTypeSchema,
75319
- listSessions: () => listSessions,
75320
- listStrictnessPresets: () => listStrictnessPresets,
75321
- listTasks: () => listTasks,
75322
- loadConfig: () => loadConfig,
75323
- manifestStatusSchema: () => manifestStatusSchema,
75324
- memory: () => memory_exports,
75325
- memoryFindHitNext: () => memoryFindHitNext,
75326
- metrics: () => metrics_exports,
75327
- migration: () => migration_exports,
75328
- nexus: () => nexus_exports,
75329
- normalizeError: () => normalizeError,
75330
- normalizeTaskId: () => normalizeTaskId,
75331
- observability: () => observability_exports,
75332
- observeBrain: () => observeBrain,
75333
- ops: () => operations_exports,
75334
- orchestration: () => orchestration_exports,
75335
- otel: () => otel_exports,
75336
- paginate: () => paginate,
75337
- parseConfigValue: () => parseConfigValue,
75338
- phases: () => phases_exports,
75339
- pipeline: () => pipeline_exports2,
75340
- populateEmbeddings: () => populateEmbeddings,
75341
- pruneAuditLog: () => pruneAuditLog,
75342
- pushWarning: () => pushWarning,
75343
- queryAudit: () => queryAudit,
75344
- reconcile: () => reconcile,
75345
- reconciliation: () => reconciliation_exports,
75346
- release: () => release_exports,
75347
- remote: () => remote_exports,
75348
- research: () => research_exports,
75349
- resolveProjectPath: () => resolveProjectPath,
75350
- restoreSession: () => restoreSession,
75351
- resumeSession: () => resumeSession,
75352
- roadmap: () => roadmap_exports,
75353
- routing: () => routing_exports,
75354
- runAllMigrations: () => runAllMigrations,
75355
- runMigration: () => runMigration,
75356
- searchBrain: () => searchBrain,
75357
- searchBrainCompact: () => searchBrainCompact,
75358
- security: () => security_exports,
75359
- selectAgentErrorLogSchema: () => selectAgentErrorLogSchema,
75360
- selectAgentInstanceSchema: () => selectAgentInstanceSchema,
75361
- selectExternalTaskLinkSchema: () => selectExternalTaskLinkSchema,
75362
- selectPipelineManifestSchema: () => selectPipelineManifestSchema,
75363
- selectReleaseManifestSchema: () => selectReleaseManifestSchema,
75364
- selectSessionSchema: () => selectSessionSchema,
75365
- selectTaskSchema: () => selectTaskSchema,
75366
- sequence: () => sequence_exports,
75367
- serializeSession: () => serializeSession,
75368
- sessionListItemNext: () => sessionListItemNext,
75369
- sessionStartNext: () => sessionStartNext,
75370
- sessionStatus: () => sessionStatus,
75371
- sessionStatusSchema: () => sessionStatusSchema,
75372
- sessions: () => sessions_exports,
75373
- setConfigValue: () => setConfigValue,
75374
- sha256: () => sha256,
75375
- showTask: () => showTask,
75376
- skills: () => skills_exports,
75377
- snapshot: () => snapshot_exports,
75378
- spawn: () => spawn_exports,
75379
- startSession: () => startSession,
75380
- startTask: () => startTask,
75381
- stats: () => stats_exports,
75382
- sticky: () => sticky_exports,
75383
- stopTask: () => stopTask,
75384
- syncDirectionSchema: () => syncDirectionSchema,
75385
- system: () => system_exports,
75386
- taskListItemNext: () => taskListItemNext,
75387
- taskPrioritySchema: () => taskPrioritySchema,
75388
- taskRelationTypeSchema: () => taskRelationTypeSchema,
75389
- taskShowNext: () => taskShowNext,
75390
- taskSizeSchema: () => taskSizeSchema,
75391
- taskStatusSchema: () => taskStatusSchema,
75392
- taskTypeSchema: () => taskTypeSchema,
75393
- taskWork: () => task_work_exports,
75394
- tasks: () => tasks_exports,
75395
- templates: () => templates_exports,
75396
- timelineBrain: () => timelineBrain,
75397
- tokenUsageConfidenceSchema: () => tokenUsageConfidenceSchema,
75398
- tokenUsageMethodSchema: () => tokenUsageMethodSchema,
75399
- tokenUsageTransportSchema: () => tokenUsageTransportSchema,
75400
- ui: () => ui_exports,
75401
- updateProjectName: () => updateProjectName,
75402
- updateTask: () => updateTask,
75403
- validateAgainstSchema: () => validateAgainstSchema,
75404
- validation: () => validation_exports
75405
- });
75406
75191
  var init_src2 = __esm({
75407
75192
  "packages/core/src/index.ts"() {
75408
75193
  init_src();
@@ -107695,6 +107480,11 @@ var init_system_engine = __esm({
107695
107480
 
107696
107481
  // packages/cleo/src/dispatch/engines/task-engine.ts
107697
107482
  function taskToRecord(task) {
107483
+ const relates = task.relates?.map((r) => ({
107484
+ taskId: r.taskId,
107485
+ type: r.type,
107486
+ ...r.reason && { reason: r.reason }
107487
+ }));
107698
107488
  return {
107699
107489
  id: task.id,
107700
107490
  title: task.title,
@@ -107711,7 +107501,7 @@ function taskToRecord(task) {
107711
107501
  position: task.position,
107712
107502
  positionVersion: task.positionVersion,
107713
107503
  depends: task.depends,
107714
- relates: task.relates,
107504
+ relates,
107715
107505
  files: task.files,
107716
107506
  acceptance: task.acceptance,
107717
107507
  notes: task.notes,
@@ -107789,14 +107579,33 @@ async function taskFind(projectRoot, query, limit, options) {
107789
107579
  projectRoot,
107790
107580
  accessor
107791
107581
  );
107582
+ if (options?.verbose) {
107583
+ const fullResults = [];
107584
+ for (const r of findResult.results) {
107585
+ const task = await accessor.loadSingleTask(r.id);
107586
+ if (task) fullResults.push(taskToRecord(task));
107587
+ }
107588
+ return { success: true, data: { results: fullResults, total: findResult.total } };
107589
+ }
107590
+ if (options?.fields) {
107591
+ const fullResults = [];
107592
+ for (const r of findResult.results) {
107593
+ const task = await accessor.loadSingleTask(r.id);
107594
+ if (task) fullResults.push(taskToRecord(task));
107595
+ }
107596
+ return { success: true, data: { results: fullResults, total: findResult.total } };
107597
+ }
107792
107598
  const results = findResult.results.map((r) => ({
107793
107599
  id: r.id,
107794
107600
  title: r.title,
107795
107601
  status: r.status,
107796
107602
  priority: r.priority,
107797
- parentId: r.parentId
107603
+ parentId: r.parentId,
107604
+ depends: r.depends,
107605
+ type: r.type,
107606
+ size: r.size
107798
107607
  }));
107799
- return { success: true, data: { results, total: results.length } };
107608
+ return { success: true, data: { results, total: findResult.total } };
107800
107609
  } catch (err) {
107801
107610
  return cleoErrorToEngineError(err, "E_NOT_INITIALIZED", "Task database not initialized");
107802
107611
  }
@@ -107804,11 +107613,37 @@ async function taskFind(projectRoot, query, limit, options) {
107804
107613
  async function taskCreate(projectRoot, params) {
107805
107614
  try {
107806
107615
  const accessor = await getAccessor(projectRoot);
107616
+ let resolvedParent = params.parent || null;
107617
+ if (!resolvedParent && params.parentSearch) {
107618
+ const searchResult = await findTasks(
107619
+ { query: params.parentSearch, limit: 1 },
107620
+ projectRoot,
107621
+ accessor
107622
+ );
107623
+ if (searchResult.results.length > 0) {
107624
+ resolvedParent = searchResult.results[0].id;
107625
+ } else {
107626
+ return cleoErrorToEngineError(
107627
+ new Error(`No task found matching --parent-search "${params.parentSearch}"`),
107628
+ "E_NOT_FOUND",
107629
+ `No task found matching "${params.parentSearch}"`
107630
+ );
107631
+ }
107632
+ }
107633
+ if (!resolvedParent && params.type !== "epic") {
107634
+ try {
107635
+ const session = await getActiveSession(projectRoot);
107636
+ if (session?.scope?.type === "epic" && session.scope.epicId) {
107637
+ resolvedParent = session.scope.epicId;
107638
+ }
107639
+ } catch {
107640
+ }
107641
+ }
107807
107642
  const result = await addTask(
107808
107643
  {
107809
107644
  title: params.title,
107810
107645
  description: params.description,
107811
- parentId: params.parent || null,
107646
+ parentId: resolvedParent,
107812
107647
  depends: params.depends,
107813
107648
  priority: params.priority || "medium",
107814
107649
  labels: params.labels,
@@ -107828,7 +107663,8 @@ async function taskCreate(projectRoot, params) {
107828
107663
  data: {
107829
107664
  task: taskToRecord(result.task),
107830
107665
  duplicate: result.duplicate ?? false,
107831
- dryRun: params.dryRun
107666
+ dryRun: params.dryRun,
107667
+ ...result.warnings?.length && { warnings: result.warnings }
107832
107668
  }
107833
107669
  };
107834
107670
  } catch (err) {
@@ -111605,7 +111441,7 @@ var init_nexus2 = __esm({
111605
111441
  async function orchestrateClassify(request, context, projectRoot) {
111606
111442
  try {
111607
111443
  const { getCleoCantWorkflowsDir: getCleoCantWorkflowsDir2 } = await Promise.resolve().then(() => (init_internal(), internal_exports));
111608
- const { readFileSync: readFileSync101, readdirSync: readdirSync42, existsSync: existsSync131 } = await import("node:fs");
111444
+ const { readFileSync: readFileSync102, readdirSync: readdirSync42, existsSync: existsSync131 } = await import("node:fs");
111609
111445
  const { join: join131 } = await import("node:path");
111610
111446
  const workflowsDir = getCleoCantWorkflowsDir2();
111611
111447
  const combined = `${request} ${context ?? ""}`.toLowerCase();
@@ -111614,7 +111450,7 @@ async function orchestrateClassify(request, context, projectRoot) {
111614
111450
  const files = readdirSync42(workflowsDir).filter((f2) => f2.endsWith(".cant"));
111615
111451
  for (const file2 of files) {
111616
111452
  try {
111617
- const src = readFileSync101(join131(workflowsDir, file2), "utf-8");
111453
+ const src = readFileSync102(join131(workflowsDir, file2), "utf-8");
111618
111454
  const teamMatch = /^team\s+(\S+):/m.exec(src);
111619
111455
  if (!teamMatch) continue;
111620
111456
  const teamName = teamMatch[1];
@@ -111634,7 +111470,7 @@ async function orchestrateClassify(request, context, projectRoot) {
111634
111470
  const files = readdirSync42(localCantDir).filter((f2) => f2.endsWith(".cant"));
111635
111471
  for (const file2 of files) {
111636
111472
  try {
111637
- const src = readFileSync101(join131(localCantDir, file2), "utf-8");
111473
+ const src = readFileSync102(join131(localCantDir, file2), "utf-8");
111638
111474
  const teamMatch = /^team\s+(\S+):/m.exec(src);
111639
111475
  if (!teamMatch) continue;
111640
111476
  const teamName = teamMatch[1];
@@ -113916,7 +113752,9 @@ var init_tasks4 = __esm({
113916
113752
  exact: params?.exact,
113917
113753
  status: params?.status,
113918
113754
  includeArchive: params?.includeArchive,
113919
- offset: params?.offset
113755
+ offset: params?.offset,
113756
+ fields: params?.fields,
113757
+ verbose: params?.verbose
113920
113758
  }
113921
113759
  );
113922
113760
  return wrapResult(result, "query", "tasks", operation, startTime);
@@ -114067,7 +113905,8 @@ var init_tasks4 = __esm({
114067
113905
  size: params?.size,
114068
113906
  notes: params?.notes,
114069
113907
  files: params?.files,
114070
- dryRun: params?.dryRun
113908
+ dryRun: params?.dryRun,
113909
+ parentSearch: params?.parentSearch
114071
113910
  });
114072
113911
  return wrapResult(result, "mutate", "tasks", operation, startTime);
114073
113912
  }
@@ -116151,7 +115990,7 @@ var init_cli = __esm({
116151
115990
 
116152
115991
  // packages/cleo/src/cli/index.ts
116153
115992
  init_internal();
116154
- import { readFileSync as readFileSync100 } from "node:fs";
115993
+ import { readFileSync as readFileSync101 } from "node:fs";
116155
115994
  import { dirname as dirname28, join as join130 } from "node:path";
116156
115995
  import { fileURLToPath as fileURLToPath5 } from "node:url";
116157
115996
 
@@ -117156,6 +116995,13 @@ var ADD_PARAMS = [
117156
116995
  required: false,
117157
116996
  description: "Position within sibling group",
117158
116997
  cli: { flag: "position", parse: parseInt }
116998
+ },
116999
+ {
117000
+ name: "parentSearch",
117001
+ type: "string",
117002
+ required: false,
117003
+ description: "Resolve parent by title substring instead of exact ID (T090)",
117004
+ cli: { flag: "parent-search" }
117159
117005
  }
117160
117006
  ];
117161
117007
  function registerAddCommand(program) {
@@ -117179,18 +117025,37 @@ function registerAddCommand(program) {
117179
117025
  params["labels"] = opts["labels"].split(",").map((s3) => s3.trim());
117180
117026
  if (opts["files"])
117181
117027
  params["files"] = opts["files"].split(",").map((s3) => s3.trim());
117182
- if (opts["acceptance"])
117183
- params["acceptance"] = opts["acceptance"].split("|").map((s3) => s3.trim()).filter(Boolean);
117028
+ if (opts["acceptance"]) {
117029
+ const raw = opts["acceptance"];
117030
+ if (raw.trimStart().startsWith("[")) {
117031
+ try {
117032
+ const parsed = JSON.parse(raw);
117033
+ params["acceptance"] = Array.isArray(parsed) ? parsed.map((s3) => String(s3).trim()).filter(Boolean) : [raw];
117034
+ } catch {
117035
+ params["acceptance"] = raw.split("|").map((s3) => s3.trim()).filter(Boolean);
117036
+ }
117037
+ } else {
117038
+ params["acceptance"] = raw.split("|").map((s3) => s3.trim()).filter(Boolean);
117039
+ }
117040
+ }
117184
117041
  if (opts["depends"])
117185
117042
  params["depends"] = opts["depends"].split(",").map((s3) => s3.trim());
117186
117043
  if (opts["notes"] !== void 0) params["notes"] = opts["notes"];
117187
117044
  if (opts["position"] !== void 0) params["position"] = opts["position"];
117188
117045
  if (opts["dryRun"] !== void 0) params["dryRun"] = opts["dryRun"];
117046
+ if (opts["parentSearch"] !== void 0) params["parentSearch"] = opts["parentSearch"];
117189
117047
  const response = await dispatchRaw("mutate", "tasks", "add", params);
117190
117048
  if (!response.success) {
117191
117049
  handleRawError(response, { command: "add", operation: "tasks.add" });
117192
117050
  }
117193
117051
  const data = response.data;
117052
+ const dataWarnings = data?.warnings;
117053
+ if (dataWarnings?.length) {
117054
+ for (const w2 of dataWarnings) {
117055
+ process.stderr.write(`\u26A0 ${w2}
117056
+ `);
117057
+ }
117058
+ }
117194
117059
  if (data?.duplicate) {
117195
117060
  cliOutput(data, {
117196
117061
  command: "add",
@@ -117209,6 +117074,93 @@ function registerAddCommand(program) {
117209
117074
  });
117210
117075
  }
117211
117076
 
117077
+ // packages/cleo/src/cli/commands/add-batch.ts
117078
+ init_cli();
117079
+ init_renderers();
117080
+ import { readFileSync as readFileSync96 } from "node:fs";
117081
+ function registerAddBatchCommand(program) {
117082
+ program.command("add-batch").description("Create multiple tasks atomically from a JSON file").option("--file <path>", "Path to JSON file (array of task objects). Use - for stdin.").option("--parent <parentId>", "Default parent for all tasks (overridden by per-task parent)").option("--dry-run", "Preview what would be created without making changes").action(async (opts) => {
117083
+ const filePath = opts["file"];
117084
+ const defaultParent = opts["parent"];
117085
+ const dryRun = opts["dryRun"];
117086
+ let raw;
117087
+ if (!filePath || filePath === "-") {
117088
+ const chunks = [];
117089
+ for await (const chunk of process.stdin) {
117090
+ chunks.push(chunk);
117091
+ }
117092
+ raw = Buffer.concat(chunks).toString("utf-8");
117093
+ } else {
117094
+ raw = readFileSync96(filePath, "utf-8");
117095
+ }
117096
+ let tasks2;
117097
+ try {
117098
+ const parsed = JSON.parse(raw);
117099
+ tasks2 = Array.isArray(parsed) ? parsed : [parsed];
117100
+ } catch {
117101
+ process.stderr.write("Error: Invalid JSON input. Expected an array of task objects.\n");
117102
+ process.exit(2);
117103
+ return;
117104
+ }
117105
+ if (tasks2.length === 0) {
117106
+ process.stderr.write("Error: No tasks in input.\n");
117107
+ process.exit(2);
117108
+ return;
117109
+ }
117110
+ const results = [];
117111
+ let failed = 0;
117112
+ for (const task of tasks2) {
117113
+ const params = {
117114
+ title: task.title,
117115
+ ...task.description && { description: task.description },
117116
+ parent: task.parent ?? defaultParent,
117117
+ ...task.type && { type: task.type },
117118
+ ...task.priority && { priority: task.priority },
117119
+ ...task.size && { size: task.size },
117120
+ ...task.acceptance?.length && { acceptance: task.acceptance },
117121
+ ...task.depends?.length && { depends: task.depends },
117122
+ ...task.labels?.length && { labels: task.labels },
117123
+ ...task.phase && { phase: task.phase },
117124
+ ...task.notes && { notes: task.notes },
117125
+ ...task.files?.length && { files: task.files },
117126
+ ...dryRun && { dryRun: true }
117127
+ };
117128
+ const response = await dispatchRaw("mutate", "tasks", "add", params);
117129
+ if (response.success) {
117130
+ const data = response.data;
117131
+ const taskData = data?.task;
117132
+ results.push({ title: task.title, id: taskData?.id });
117133
+ } else {
117134
+ failed++;
117135
+ results.push({
117136
+ title: task.title,
117137
+ error: response.error?.message ?? "Unknown error"
117138
+ });
117139
+ }
117140
+ }
117141
+ const output = {
117142
+ total: tasks2.length,
117143
+ created: tasks2.length - failed,
117144
+ failed,
117145
+ dryRun: dryRun ?? false,
117146
+ results
117147
+ };
117148
+ if (failed > 0) {
117149
+ cliOutput(output, {
117150
+ command: "add-batch",
117151
+ message: `${failed} of ${tasks2.length} tasks failed`,
117152
+ operation: "tasks.add-batch"
117153
+ });
117154
+ process.exit(1);
117155
+ } else {
117156
+ cliOutput(output, {
117157
+ command: "add-batch",
117158
+ operation: "tasks.add-batch"
117159
+ });
117160
+ }
117161
+ });
117162
+ }
117163
+
117212
117164
  // packages/cleo/src/cli/commands/admin.ts
117213
117165
  init_cli();
117214
117166
  function registerAdminCommand(program) {
@@ -117496,7 +117448,7 @@ agent ${agentId}:
117496
117448
  try {
117497
117449
  const { AgentRegistryAccessor: AgentRegistryAccessor2, getDb: getDb4 } = await Promise.resolve().then(() => (init_internal(), internal_exports));
117498
117450
  const { createRuntime } = await import("@cleocode/runtime");
117499
- const { existsSync: existsSync131, readFileSync: readFileSync101 } = await import("node:fs");
117451
+ const { existsSync: existsSync131, readFileSync: readFileSync102 } = await import("node:fs");
117500
117452
  const { join: join131 } = await import("node:path");
117501
117453
  await getDb4();
117502
117454
  const registry2 = new AgentRegistryAccessor2(process.cwd());
@@ -117519,7 +117471,7 @@ agent ${agentId}:
117519
117471
  let cantValidation = null;
117520
117472
  const cantPath = opts["cant"] ?? join131(".cleo", "agents", `${agentId}.cant`);
117521
117473
  if (existsSync131(cantPath)) {
117522
- profile = readFileSync101(cantPath, "utf-8");
117474
+ profile = readFileSync102(cantPath, "utf-8");
117523
117475
  try {
117524
117476
  const cantModule = await import("@cleocode/cant");
117525
117477
  const validate = "validate" in cantModule ? cantModule.validate : null;
@@ -118559,7 +118511,7 @@ Task ${taskId} reassigned to you by ${active.agentId}. Run: cleo show ${taskId}
118559
118511
  });
118560
118512
  agent.command("install <path>").description("Install an agent from a .cantz archive or agent directory").option("--global", "Install to global tier (~/.local/share/cleo/cant/agents/)").action(async (sourcePath, opts) => {
118561
118513
  try {
118562
- const { existsSync: existsSync131, mkdirSync: mkdirSync31, cpSync, readFileSync: readFileSync101, rmSync: rmSync3, statSync: statSync22 } = await import("node:fs");
118514
+ const { existsSync: existsSync131, mkdirSync: mkdirSync31, cpSync, readFileSync: readFileSync102, rmSync: rmSync3, statSync: statSync22 } = await import("node:fs");
118563
118515
  const { join: join131, basename: basename19, resolve: resolve16 } = await import("node:path");
118564
118516
  const { homedir: homedir7 } = await import("node:os");
118565
118517
  const { tmpdir: tmpdir3 } = await import("node:os");
@@ -118678,7 +118630,7 @@ Task ${taskId} reassigned to you by ${active.agentId}. Run: cleo show ${taskId}
118678
118630
  }
118679
118631
  let registered = false;
118680
118632
  try {
118681
- const persona = readFileSync101(join131(targetDir, "persona.cant"), "utf-8");
118633
+ const persona = readFileSync102(join131(targetDir, "persona.cant"), "utf-8");
118682
118634
  const descMatch = persona.match(/description:\s*"([^"]+)"/);
118683
118635
  const displayName = descMatch?.[1] ?? agentName;
118684
118636
  const { AgentRegistryAccessor: AgentRegistryAccessor2, getDb: getDb4 } = await Promise.resolve().then(() => (init_internal(), internal_exports));
@@ -120277,7 +120229,7 @@ function registerBugCommand(program) {
120277
120229
 
120278
120230
  // packages/cleo/src/cli/commands/cant.ts
120279
120231
  init_renderers();
120280
- import { existsSync as existsSync128, mkdirSync as mkdirSync29, readFileSync as readFileSync96, writeFileSync as writeFileSync23 } from "node:fs";
120232
+ import { existsSync as existsSync128, mkdirSync as mkdirSync29, readFileSync as readFileSync97, writeFileSync as writeFileSync23 } from "node:fs";
120281
120233
  import { dirname as dirname25, isAbsolute as isAbsolute3, join as join124, resolve as resolve15 } from "node:path";
120282
120234
  function registerCantCommand(program) {
120283
120235
  const cant = program.command("cant").description("CANT DSL tooling");
@@ -120355,7 +120307,7 @@ function registerCantCommand(program) {
120355
120307
  }
120356
120308
  try {
120357
120309
  const mod = await loadMigrateEngine();
120358
- const content = readFileSync96(filePath, "utf-8");
120310
+ const content = readFileSync97(filePath, "utf-8");
120359
120311
  const result = mod.migrateMarkdown(content, filePath, {
120360
120312
  write: isWrite,
120361
120313
  verbose: isVerbose,
@@ -121150,7 +121102,7 @@ function registerDetectCommand(program) {
121150
121102
  // packages/cleo/src/cli/commands/detect-drift.ts
121151
121103
  init_src();
121152
121104
  init_renderers();
121153
- import { existsSync as existsSync129, readdirSync as readdirSync41, readFileSync as readFileSync97 } from "node:fs";
121105
+ import { existsSync as existsSync129, readdirSync as readdirSync41, readFileSync as readFileSync98 } from "node:fs";
121154
121106
  import { dirname as dirname26, join as join125 } from "node:path";
121155
121107
  function findProjectRoot() {
121156
121108
  let currentDir = process.cwd();
@@ -121170,7 +121122,7 @@ function registerDetectDriftCommand(program) {
121170
121122
  const isCleoRepo = existsSync129(join125(projectRoot, "src", "cli", "commands")) || existsSync129(join125(projectRoot, "packages", "cleo", "src"));
121171
121123
  const safeRead = (filePath) => {
121172
121124
  try {
121173
- return readFileSync97(filePath, "utf-8");
121125
+ return readFileSync98(filePath, "utf-8");
121174
121126
  } catch {
121175
121127
  return "";
121176
121128
  }
@@ -122088,6 +122040,20 @@ var FIND_PARAMS = [
122088
122040
  required: false,
122089
122041
  description: "Skip first N results",
122090
122042
  cli: { flag: "offset", parse: parseInt }
122043
+ },
122044
+ {
122045
+ name: "fields",
122046
+ type: "string",
122047
+ required: false,
122048
+ description: "Comma-separated additional fields to include (e.g. labels,acceptance,notes,description)",
122049
+ cli: { flag: "fields" }
122050
+ },
122051
+ {
122052
+ name: "verbose",
122053
+ type: "boolean",
122054
+ required: false,
122055
+ description: "Include all task fields (same as cleo list output)",
122056
+ cli: { flag: "verbose", short: "-v" }
122091
122057
  }
122092
122058
  ];
122093
122059
  function registerFindCommand(program) {
@@ -122107,6 +122073,8 @@ function registerFindCommand(program) {
122107
122073
  if (opts["includeArchive"] !== void 0) params["includeArchive"] = opts["includeArchive"];
122108
122074
  if (limit !== void 0) params["limit"] = limit;
122109
122075
  if (offset !== void 0) params["offset"] = offset;
122076
+ if (opts["fields"] !== void 0) params["fields"] = opts["fields"];
122077
+ if (opts["verbose"] !== void 0) params["verbose"] = opts["verbose"];
122110
122078
  const response = await dispatchRaw("query", "tasks", "find", params);
122111
122079
  if (!response.success) {
122112
122080
  handleRawError(response, { command: "find", operation: "tasks.find" });
@@ -122134,12 +122102,12 @@ init_src();
122134
122102
  init_src2();
122135
122103
  init_renderers();
122136
122104
  import { execFileSync as execFileSync16 } from "node:child_process";
122137
- import { existsSync as existsSync130, mkdirSync as mkdirSync30, readFileSync as readFileSync98, writeFileSync as writeFileSync24 } from "node:fs";
122105
+ import { existsSync as existsSync130, mkdirSync as mkdirSync30, readFileSync as readFileSync99, writeFileSync as writeFileSync24 } from "node:fs";
122138
122106
  import { dirname as dirname27, join as join127 } from "node:path";
122139
122107
  function getChangelogSource(cwd) {
122140
122108
  const configPath = getConfigPath(cwd);
122141
122109
  try {
122142
- const config2 = JSON.parse(readFileSync98(configPath, "utf-8"));
122110
+ const config2 = JSON.parse(readFileSync99(configPath, "utf-8"));
122143
122111
  return config2?.release?.changelog?.source ?? "CHANGELOG.md";
122144
122112
  } catch {
122145
122113
  return "CHANGELOG.md";
@@ -122148,7 +122116,7 @@ function getChangelogSource(cwd) {
122148
122116
  function getEnabledPlatforms(cwd) {
122149
122117
  const configPath = getConfigPath(cwd);
122150
122118
  try {
122151
- const config2 = JSON.parse(readFileSync98(configPath, "utf-8"));
122119
+ const config2 = JSON.parse(readFileSync99(configPath, "utf-8"));
122152
122120
  const outputs = config2?.release?.changelog?.outputs ?? [];
122153
122121
  return outputs.filter((o) => o.enabled);
122154
122122
  } catch {
@@ -122277,7 +122245,7 @@ function registerGenerateChangelogCommand(program) {
122277
122245
  if (!existsSync130(sourcePath)) {
122278
122246
  throw new CleoError(4 /* NOT_FOUND */, `Changelog source not found: ${sourcePath}`);
122279
122247
  }
122280
- const sourceContent = readFileSync98(sourcePath, "utf-8");
122248
+ const sourceContent = readFileSync99(sourcePath, "utf-8");
122281
122249
  const repoSlug = getGitHubRepoSlug();
122282
122250
  const results = [];
122283
122251
  if (targetPlatform) {
@@ -122576,7 +122544,7 @@ function registerLabelsCommand(program) {
122576
122544
  await dispatchFromCli("query", "tasks", "label.list", {}, { command: "labels" });
122577
122545
  });
122578
122546
  labels.command("show <label>").description("Show tasks with specific label").action(async (label) => {
122579
- await dispatchFromCli("query", "tasks", "label.show", { label }, { command: "labels" });
122547
+ await dispatchFromCli("query", "tasks", "label.list", { label }, { command: "labels" });
122580
122548
  });
122581
122549
  labels.command("stats").description("Show detailed label statistics").action(async () => {
122582
122550
  await dispatchFromCli("query", "tasks", "label.list", {}, { command: "labels" });
@@ -123141,34 +123109,24 @@ function registerNexusCommand(program) {
123141
123109
  }
123142
123110
 
123143
123111
  // packages/cleo/src/cli/commands/observe.ts
123144
- init_src2();
123145
- init_renderers();
123112
+ init_cli();
123146
123113
  function registerObserveCommand(program) {
123147
123114
  program.command("observe <text>").description("Save an observation to brain.db").option("-t, --title <title>", "Optional title (defaults to first 120 chars of text)").option(
123148
123115
  "--type <type>",
123149
123116
  "Observation type (discovery, decision, bugfix, refactor, feature, change, pattern, session_summary)"
123150
123117
  ).action(async (text3, opts) => {
123151
- const projectDir = getProjectRoot();
123152
- const { observeBrain: observeBrain2 } = await Promise.resolve().then(() => (init_src2(), src_exports));
123153
- try {
123154
- const result = await observeBrain2(projectDir, {
123118
+ await dispatchFromCli(
123119
+ "mutate",
123120
+ "memory",
123121
+ "observe",
123122
+ {
123155
123123
  text: text3,
123156
123124
  title: opts.title,
123157
- type: opts.type,
123125
+ ...opts.type !== void 0 && { type: opts.type },
123158
123126
  sourceType: "manual"
123159
- });
123160
- cliOutput(
123161
- {
123162
- id: result.id,
123163
- type: result.type,
123164
- createdAt: result.createdAt
123165
- },
123166
- { command: "observe", operation: "memory.observe" }
123167
- );
123168
- } catch (err) {
123169
- cliError(err instanceof Error ? err.message : String(err), 1);
123170
- process.exitCode = 1;
123171
- }
123127
+ },
123128
+ { command: "observe", operation: "memory.observe" }
123129
+ );
123172
123130
  });
123173
123131
  }
123174
123132
 
@@ -123454,8 +123412,14 @@ function registerPlanCommand(program) {
123454
123412
  // packages/cleo/src/cli/commands/promote.ts
123455
123413
  init_cli();
123456
123414
  function registerPromoteCommand(program) {
123457
- program.command("promote <task-id>").description("Remove parent from task, making it root-level").option("--no-type-update", "Skip auto-updating type from subtask to task").action(async (taskId) => {
123458
- await dispatchFromCli("mutate", "tasks", "promote", { taskId }, { command: "promote" });
123415
+ program.command("promote <task-id>").description("Remove parent from task, making it root-level").action(async (taskId) => {
123416
+ await dispatchFromCli(
123417
+ "mutate",
123418
+ "tasks",
123419
+ "reparent",
123420
+ { taskId, newParentId: null },
123421
+ { command: "promote" }
123422
+ );
123459
123423
  });
123460
123424
  }
123461
123425
 
@@ -125150,38 +125114,26 @@ function registerSkillsCommand(program) {
125150
125114
  { command: "skills", operation: "tools.skill.uninstall" }
125151
125115
  );
125152
125116
  });
125153
- skillsCmd.command("enable <skill-name>").description("Enable a skill").action(async (skillName) => {
125117
+ skillsCmd.command("enable <skill-name>").description("Enable a skill (alias for install)").action(async (skillName) => {
125154
125118
  await dispatchFromCli(
125155
125119
  "mutate",
125156
125120
  "tools",
125157
- "skill.enable",
125121
+ "skill.install",
125158
125122
  {
125159
125123
  name: skillName
125160
125124
  },
125161
- { command: "skills", operation: "tools.skill.enable" }
125125
+ { command: "skills", operation: "tools.skill.install" }
125162
125126
  );
125163
125127
  });
125164
- skillsCmd.command("disable <skill-name>").description("Disable a skill").action(async (skillName) => {
125128
+ skillsCmd.command("disable <skill-name>").description("Disable a skill (alias for uninstall)").action(async (skillName) => {
125165
125129
  await dispatchFromCli(
125166
125130
  "mutate",
125167
125131
  "tools",
125168
- "skill.disable",
125132
+ "skill.uninstall",
125169
125133
  {
125170
125134
  name: skillName
125171
125135
  },
125172
- { command: "skills", operation: "tools.skill.disable" }
125173
- );
125174
- });
125175
- skillsCmd.command("configure <skill-name>").description("Configure a skill").option("--set <key=value>", "Set configuration value").action(async (skillName, opts) => {
125176
- await dispatchFromCli(
125177
- "mutate",
125178
- "tools",
125179
- "skill.configure",
125180
- {
125181
- name: skillName,
125182
- config: opts["set"]
125183
- },
125184
- { command: "skills", operation: "tools.skill.configure" }
125136
+ { command: "skills", operation: "tools.skill.uninstall" }
125185
125137
  );
125186
125138
  });
125187
125139
  skillsCmd.command("refresh").description("Refresh skills cache").action(async () => {
@@ -125333,7 +125285,7 @@ init_src2();
125333
125285
  init_cli();
125334
125286
  init_renderers();
125335
125287
  function registerStickyCommand(program) {
125336
- const sticky = program.command("sticky").alias("note").description("Manage sticky notes - quick project-wide ephemeral captures");
125288
+ const sticky = program.command("sticky").description("Manage sticky notes - quick project-wide ephemeral captures");
125337
125289
  sticky.command("add <content>").alias("jot").description("Create a new sticky note").option("--tag <tag>", "Add a tag (can be used multiple times)", collect, []).option("--color <color>", "Sticky color: yellow|blue|green|red|purple", "yellow").option("--priority <priority>", "Priority: low|medium|high", "medium").action(async (content, opts) => {
125338
125290
  try {
125339
125291
  await dispatchFromCli(
@@ -125369,7 +125321,7 @@ function registerStickyCommand(program) {
125369
125321
  return;
125370
125322
  }
125371
125323
  const data = response.data;
125372
- if (!data || !data.stickies || data.stickies.length === 0) {
125324
+ if (!data?.stickies || data.stickies.length === 0) {
125373
125325
  cliOutput(
125374
125326
  { stickies: [], total: 0 },
125375
125327
  { command: "sticky list", message: "No sticky notes found", operation: "sticky.list" }
@@ -125581,11 +125533,11 @@ function registerTestingCommand(program) {
125581
125533
  init_internal();
125582
125534
  init_cli();
125583
125535
  init_renderers();
125584
- import { readFileSync as readFileSync99 } from "node:fs";
125536
+ import { readFileSync as readFileSync100 } from "node:fs";
125585
125537
  function readPayload(opts, textKey, fileKey) {
125586
125538
  const text3 = opts[textKey];
125587
125539
  const file2 = opts[fileKey];
125588
- if (file2) return readFileSync99(file2, "utf-8");
125540
+ if (file2) return readFileSync100(file2, "utf-8");
125589
125541
  return text3;
125590
125542
  }
125591
125543
  function registerTokenCommand(program) {
@@ -126171,7 +126123,7 @@ var codeCommand = defineCommand({
126171
126123
  // packages/cleo/src/cli/index.ts
126172
126124
  function getPackageVersion() {
126173
126125
  const pkgPath = join130(dirname28(fileURLToPath5(import.meta.url)), "../../package.json");
126174
- const pkg = JSON.parse(readFileSync100(pkgPath, "utf-8"));
126126
+ const pkg = JSON.parse(readFileSync101(pkgPath, "utf-8"));
126175
126127
  return pkg.version;
126176
126128
  }
126177
126129
  var CLI_VERSION = getPackageVersion();
@@ -126179,6 +126131,7 @@ var rootShim = new ShimCommand();
126179
126131
  registerAgentCommand(rootShim);
126180
126132
  registerAgentsCommand(rootShim);
126181
126133
  registerAddCommand(rootShim);
126134
+ registerAddBatchCommand(rootShim);
126182
126135
  registerListCommand(rootShim);
126183
126136
  registerShowCommand(rootShim);
126184
126137
  registerFindCommand(rootShim);