@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 +342 -389
- package/dist/cli/index.js.map +4 -4
- package/package.json +7 -7
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
|
-
|
|
10840
|
-
|
|
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
|
-
|
|
34459
|
-
|
|
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
|
-
|
|
34463
|
-
|
|
34464
|
-
|
|
34465
|
-
|
|
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
|
-
|
|
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
|
-
|
|
34479
|
-
|
|
34480
|
-
|
|
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
|
-
|
|
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
|
-
|
|
34494
|
-
|
|
34495
|
-
|
|
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:
|
|
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(
|
|
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 (
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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:
|
|
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 =
|
|
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:
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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 =
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
123152
|
-
|
|
123153
|
-
|
|
123154
|
-
|
|
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
|
-
|
|
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").
|
|
123458
|
-
await dispatchFromCli(
|
|
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.
|
|
125121
|
+
"skill.install",
|
|
125158
125122
|
{
|
|
125159
125123
|
name: skillName
|
|
125160
125124
|
},
|
|
125161
|
-
{ command: "skills", operation: "tools.skill.
|
|
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.
|
|
125132
|
+
"skill.uninstall",
|
|
125169
125133
|
{
|
|
125170
125134
|
name: skillName
|
|
125171
125135
|
},
|
|
125172
|
-
{ command: "skills", operation: "tools.skill.
|
|
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").
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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);
|