@cleocode/core 2026.4.21 → 2026.4.22
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/index.js +101 -35
- package/dist/index.js.map +2 -2
- package/dist/paths.d.ts.map +1 -1
- package/dist/tasks/add.d.ts +2 -0
- package/dist/tasks/add.d.ts.map +1 -1
- package/dist/tasks/find.d.ts +4 -0
- package/dist/tasks/find.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/paths.ts +5 -3
- package/src/tasks/add.ts +141 -39
- package/src/tasks/find.ts +11 -1
package/dist/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAYrD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,aAAa,kCAAyC,CAAC;AAEpE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAIlE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAYrD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,aAAa,kCAAyC,CAAC;AAEpE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAIlE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAgEnD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAS7E;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAQD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAgCvD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAM5D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBpD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAI3D;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQpD;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CASlD;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
|
package/dist/tasks/add.d.ts
CHANGED
|
@@ -36,6 +36,8 @@ export interface AddTaskResult {
|
|
|
36
36
|
task: Task;
|
|
37
37
|
duplicate?: boolean;
|
|
38
38
|
dryRun?: boolean;
|
|
39
|
+
/** Non-blocking warnings emitted during validation. @task T089 */
|
|
40
|
+
warnings?: string[];
|
|
39
41
|
}
|
|
40
42
|
/**
|
|
41
43
|
* Build the default verification metadata applied to every new task.
|
package/dist/tasks/add.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/tasks/add.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAEV,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAO7B,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,2BAA2B,CAAC;AAWnF;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,+BAA+B;AAC/B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/tasks/add.ts"],"names":[],"mappings":"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"}
|
package/dist/tasks/find.d.ts
CHANGED
|
@@ -14,6 +14,10 @@ export interface FindResult {
|
|
|
14
14
|
priority: string;
|
|
15
15
|
type?: string;
|
|
16
16
|
parentId?: string | null;
|
|
17
|
+
/** Dependency IDs — essential for agents to determine task readiness. @task T091 */
|
|
18
|
+
depends?: string[];
|
|
19
|
+
/** Scope size estimate. @task T091 */
|
|
20
|
+
size?: string;
|
|
17
21
|
score: number;
|
|
18
22
|
/** Progressive disclosure directives for follow-up operations. */
|
|
19
23
|
_next?: NextDirectives;
|
package/dist/tasks/find.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../src/tasks/find.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAA0B,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAG9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG9D,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,+BAA+B;AAC/B,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAqC9D;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,EACzB,GAAG,CAAC,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,YAAY,GACtB,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../src/tasks/find.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAA0B,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAG9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG9D,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,KAAK,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,+BAA+B;AAC/B,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAqC9D;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,gBAAgB,EACzB,GAAG,CAAC,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,YAAY,GACtB,OAAO,CAAC,eAAe,CAAC,CAsH1B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cleocode/core",
|
|
3
|
-
"version": "2026.4.
|
|
3
|
+
"version": "2026.4.22",
|
|
4
4
|
"description": "CLEO core business logic kernel — tasks, sessions, memory, orchestration, lifecycle, with bundled SQLite store",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -36,12 +36,12 @@
|
|
|
36
36
|
"write-file-atomic": "^7.0.1",
|
|
37
37
|
"yaml": "^2.8.3",
|
|
38
38
|
"zod": "^4.3.6",
|
|
39
|
-
"@cleocode/adapters": "2026.4.
|
|
40
|
-
"@cleocode/
|
|
41
|
-
"@cleocode/
|
|
42
|
-
"@cleocode/lafs": "2026.4.
|
|
43
|
-
"@cleocode/
|
|
44
|
-
"@cleocode/skills": "2026.4.
|
|
39
|
+
"@cleocode/adapters": "2026.4.22",
|
|
40
|
+
"@cleocode/caamp": "2026.4.22",
|
|
41
|
+
"@cleocode/contracts": "2026.4.22",
|
|
42
|
+
"@cleocode/lafs": "2026.4.22",
|
|
43
|
+
"@cleocode/agents": "2026.4.22",
|
|
44
|
+
"@cleocode/skills": "2026.4.22"
|
|
45
45
|
},
|
|
46
46
|
"optionalDependencies": {
|
|
47
47
|
"tree-sitter-c": "^0.24.1",
|
package/src/paths.ts
CHANGED
|
@@ -288,9 +288,11 @@ export function getProjectRoot(cwd?: string): string {
|
|
|
288
288
|
return scope.worktreeRoot;
|
|
289
289
|
}
|
|
290
290
|
|
|
291
|
-
// 1. Honour CLEO_ROOT env var — bypass walk entirely
|
|
292
|
-
|
|
293
|
-
|
|
291
|
+
// 1. Honour CLEO_ROOT / CLEO_PROJECT_ROOT env var — bypass walk entirely.
|
|
292
|
+
// CLEO_PROJECT_ROOT is the agent-friendly alias (T090).
|
|
293
|
+
const envRoot = process.env['CLEO_ROOT'] ?? process.env['CLEO_PROJECT_ROOT'];
|
|
294
|
+
if (envRoot) {
|
|
295
|
+
return envRoot;
|
|
294
296
|
}
|
|
295
297
|
|
|
296
298
|
// 2. If CLEO_DIR is an absolute path, derive the project root from it.
|
package/src/tasks/add.ts
CHANGED
|
@@ -63,6 +63,8 @@ export interface AddTaskResult {
|
|
|
63
63
|
task: Task;
|
|
64
64
|
duplicate?: boolean;
|
|
65
65
|
dryRun?: boolean;
|
|
66
|
+
/** Non-blocking warnings emitted during validation. @task T089 */
|
|
67
|
+
warnings?: string[];
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
/**
|
|
@@ -275,6 +277,65 @@ export function validatePhaseFormat(phase: string): void {
|
|
|
275
277
|
}
|
|
276
278
|
}
|
|
277
279
|
|
|
280
|
+
/**
|
|
281
|
+
* Individual validation issue for all-at-once error reporting.
|
|
282
|
+
* Instead of throwing on the first validation failure, issues are collected
|
|
283
|
+
* and reported together so agents can fix all problems in a single retry.
|
|
284
|
+
* @task T089
|
|
285
|
+
*/
|
|
286
|
+
interface ValidationIssue {
|
|
287
|
+
/** The field that failed validation. */
|
|
288
|
+
field: string;
|
|
289
|
+
/** Human-readable error message. */
|
|
290
|
+
message: string;
|
|
291
|
+
/** Suggested fix command or instruction. */
|
|
292
|
+
fix?: string;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Throw a combined CleoError with all collected validation issues.
|
|
297
|
+
* Includes the original submitted params in the error details so agents
|
|
298
|
+
* can see which flags they provided and preserve them on retry.
|
|
299
|
+
* @task T089
|
|
300
|
+
*/
|
|
301
|
+
function throwCombinedValidationError(issues: ValidationIssue[], options: AddTaskOptions): never {
|
|
302
|
+
const summary =
|
|
303
|
+
issues.length === 1
|
|
304
|
+
? issues[0].message
|
|
305
|
+
: `${issues.length} validation issues found:\n${issues.map((i, n) => ` ${n + 1}. ${i.message}`).join('\n')}`;
|
|
306
|
+
|
|
307
|
+
const fixes = issues.map((i) => i.fix).filter(Boolean) as string[];
|
|
308
|
+
const fixSummary =
|
|
309
|
+
fixes.length === 0
|
|
310
|
+
? undefined
|
|
311
|
+
: fixes.length === 1
|
|
312
|
+
? fixes[0]
|
|
313
|
+
: fixes.map((f, n) => `${n + 1}. ${f}`).join('\n');
|
|
314
|
+
|
|
315
|
+
// Include original params so agents can see what was submitted and preserve flags on retry.
|
|
316
|
+
// This prevents the common failure mode where agents drop --parent when retrying after AC errors.
|
|
317
|
+
const submittedParams: Record<string, unknown> = { title: options.title };
|
|
318
|
+
if (options.parentId) submittedParams.parent = options.parentId;
|
|
319
|
+
if (options.type) submittedParams.type = options.type;
|
|
320
|
+
if (options.priority) submittedParams.priority = options.priority;
|
|
321
|
+
if (options.size) submittedParams.size = options.size;
|
|
322
|
+
if (options.description) submittedParams.description = '(provided)';
|
|
323
|
+
if (options.acceptance?.length)
|
|
324
|
+
submittedParams.acceptance = `${options.acceptance.length} criteria`;
|
|
325
|
+
if (options.depends?.length) submittedParams.depends = options.depends;
|
|
326
|
+
if (options.phase) submittedParams.phase = options.phase;
|
|
327
|
+
if (options.labels?.length) submittedParams.labels = options.labels;
|
|
328
|
+
|
|
329
|
+
throw new CleoError(ExitCode.VALIDATION_ERROR, summary, {
|
|
330
|
+
fix: fixSummary,
|
|
331
|
+
details: {
|
|
332
|
+
field: issues.length === 1 ? issues[0].field : 'multiple',
|
|
333
|
+
issues,
|
|
334
|
+
submittedParams,
|
|
335
|
+
},
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
|
|
278
339
|
/**
|
|
279
340
|
* Validate dependency IDs exist.
|
|
280
341
|
* @task T4460
|
|
@@ -470,27 +531,30 @@ export async function addTask(
|
|
|
470
531
|
cwd?: string,
|
|
471
532
|
accessor?: DataAccessor,
|
|
472
533
|
): Promise<AddTaskResult> {
|
|
473
|
-
// Validate title
|
|
534
|
+
// Validate title (early-exit — can't proceed without a title)
|
|
474
535
|
validateTitle(options.title);
|
|
475
536
|
|
|
537
|
+
// Skip session enforcement for dry-run — no data is written
|
|
538
|
+
if (!options.dryRun) {
|
|
539
|
+
await requireActiveSession('tasks.add', cwd);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
// === Collect all validation issues before throwing (T089) ===
|
|
543
|
+
// This ensures agents see ALL problems in one response and only need one retry,
|
|
544
|
+
// preventing the common failure mode where agents drop flags like --parent.
|
|
545
|
+
const issues: ValidationIssue[] = [];
|
|
546
|
+
const warnings: string[] = [];
|
|
547
|
+
|
|
476
548
|
// Anti-hallucination: title and description must be different (T5698)
|
|
477
549
|
if (
|
|
478
550
|
options.description &&
|
|
479
551
|
options.title.trim().toLowerCase() === options.description.trim().toLowerCase()
|
|
480
552
|
) {
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
'Title and description must be different (anti-hallucination rule)',
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
details: { field: 'description' },
|
|
487
|
-
},
|
|
488
|
-
);
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
// Skip session enforcement for dry-run — no data is written
|
|
492
|
-
if (!options.dryRun) {
|
|
493
|
-
await requireActiveSession('tasks.add', cwd);
|
|
553
|
+
issues.push({
|
|
554
|
+
field: 'description',
|
|
555
|
+
message: 'Title and description must be different (anti-hallucination rule)',
|
|
556
|
+
fix: 'Provide --desc with a description different from the title',
|
|
557
|
+
});
|
|
494
558
|
}
|
|
495
559
|
|
|
496
560
|
// Orphan prevention (T101): non-epic tasks must have a parent in strict mode.
|
|
@@ -500,18 +564,16 @@ export async function addTask(
|
|
|
500
564
|
if (!options.dryRun && !parentId && options.type !== 'epic') {
|
|
501
565
|
const lifecycleMode = await getLifecycleMode(cwd);
|
|
502
566
|
if (lifecycleMode === 'strict') {
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
],
|
|
514
|
-
},
|
|
567
|
+
issues.push({
|
|
568
|
+
field: 'parentId',
|
|
569
|
+
message:
|
|
570
|
+
'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".',
|
|
571
|
+
fix: 'cleo add "Task title" --parent T### --acceptance "AC1|AC2|AC3"',
|
|
572
|
+
});
|
|
573
|
+
} else {
|
|
574
|
+
// Advisory mode: warn about parentless task creation (T089)
|
|
575
|
+
warnings.push(
|
|
576
|
+
'Task created without a parent. Use --parent <epicId> to assign to an epic hierarchy.',
|
|
515
577
|
);
|
|
516
578
|
}
|
|
517
579
|
}
|
|
@@ -520,17 +582,44 @@ export async function addTask(
|
|
|
520
582
|
const dataAccessor =
|
|
521
583
|
accessor ?? (await (await import('../store/data-accessor.js')).getAccessor(cwd));
|
|
522
584
|
|
|
523
|
-
// Resolve defaults
|
|
585
|
+
// Resolve defaults — wrap normalizePriority to collect instead of throwing
|
|
524
586
|
const status = options.status ?? 'pending';
|
|
525
|
-
|
|
587
|
+
let priority: TaskPriority;
|
|
588
|
+
try {
|
|
589
|
+
priority = normalizePriority(options.priority ?? 'medium');
|
|
590
|
+
} catch (err) {
|
|
591
|
+
if (err instanceof CleoError) {
|
|
592
|
+
issues.push({ field: 'priority', message: err.message, fix: err.fix });
|
|
593
|
+
}
|
|
594
|
+
priority = 'medium'; // fallback so subsequent AC checks use a valid priority
|
|
595
|
+
}
|
|
526
596
|
const size = options.size ?? 'medium';
|
|
527
597
|
let taskType = options.type;
|
|
528
598
|
|
|
529
|
-
// Validate inputs
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
599
|
+
// Validate inputs — collect instead of throwing (T089)
|
|
600
|
+
try {
|
|
601
|
+
validateStatus(status);
|
|
602
|
+
} catch (err) {
|
|
603
|
+
if (err instanceof CleoError) {
|
|
604
|
+
issues.push({ field: 'status', message: err.message, fix: err.fix });
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
try {
|
|
608
|
+
validateSize(size);
|
|
609
|
+
} catch (err) {
|
|
610
|
+
if (err instanceof CleoError) {
|
|
611
|
+
issues.push({ field: 'size', message: err.message, fix: err.fix });
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
if (options.labels?.length) {
|
|
615
|
+
try {
|
|
616
|
+
validateLabels(options.labels);
|
|
617
|
+
} catch (err) {
|
|
618
|
+
if (err instanceof CleoError) {
|
|
619
|
+
issues.push({ field: 'labels', message: err.message, fix: err.fix });
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
}
|
|
534
623
|
|
|
535
624
|
// Skip enforcement checks for dry-run — no data is written
|
|
536
625
|
if (!options.dryRun) {
|
|
@@ -541,20 +630,33 @@ export async function addTask(
|
|
|
541
630
|
priority: priority,
|
|
542
631
|
});
|
|
543
632
|
if (!acValidation.valid) {
|
|
544
|
-
|
|
633
|
+
issues.push({
|
|
634
|
+
field: 'acceptance',
|
|
635
|
+
message: acValidation.error!,
|
|
545
636
|
fix: acValidation.fix,
|
|
546
637
|
});
|
|
547
638
|
}
|
|
548
639
|
|
|
549
640
|
// Epic-specific creation enforcement (T062): min 5 AC + non-empty description.
|
|
550
641
|
if (options.type === 'epic') {
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
642
|
+
try {
|
|
643
|
+
await validateEpicCreation(
|
|
644
|
+
{ acceptance: options.acceptance, description: options.description },
|
|
645
|
+
cwd,
|
|
646
|
+
);
|
|
647
|
+
} catch (err) {
|
|
648
|
+
if (err instanceof CleoError) {
|
|
649
|
+
issues.push({ field: 'epic', message: err.message, fix: err.fix });
|
|
650
|
+
}
|
|
651
|
+
}
|
|
555
652
|
}
|
|
556
653
|
}
|
|
557
654
|
|
|
655
|
+
// === Throw combined error if any pre-creation issues found (T089) ===
|
|
656
|
+
if (issues.length > 0) {
|
|
657
|
+
throwCombinedValidationError(issues, options);
|
|
658
|
+
}
|
|
659
|
+
|
|
558
660
|
// Validate dependency IDs exist using targeted queries
|
|
559
661
|
if (options.depends?.length) {
|
|
560
662
|
for (const depId of options.depends) {
|
|
@@ -936,5 +1038,5 @@ export async function addTask(
|
|
|
936
1038
|
});
|
|
937
1039
|
});
|
|
938
1040
|
|
|
939
|
-
return { task };
|
|
1041
|
+
return { task, ...(warnings.length > 0 && { warnings }) };
|
|
940
1042
|
}
|
package/src/tasks/find.ts
CHANGED
|
@@ -20,6 +20,10 @@ export interface FindResult {
|
|
|
20
20
|
priority: string;
|
|
21
21
|
type?: string;
|
|
22
22
|
parentId?: string | null;
|
|
23
|
+
/** Dependency IDs — essential for agents to determine task readiness. @task T091 */
|
|
24
|
+
depends?: string[];
|
|
25
|
+
/** Scope size estimate. @task T091 */
|
|
26
|
+
size?: string;
|
|
23
27
|
score: number;
|
|
24
28
|
/** Progressive disclosure directives for follow-up operations. */
|
|
25
29
|
_next?: NextDirectives;
|
|
@@ -99,7 +103,7 @@ export async function findTasks(
|
|
|
99
103
|
cwd?: string,
|
|
100
104
|
accessor?: DataAccessor,
|
|
101
105
|
): Promise<FindTasksResult> {
|
|
102
|
-
if (
|
|
106
|
+
if (options.query == null && !options.id) {
|
|
103
107
|
throw new CleoError(ExitCode.INVALID_INPUT, 'Search query or --id is required', {
|
|
104
108
|
fix: 'cleo find "<query>"',
|
|
105
109
|
details: { field: 'query' },
|
|
@@ -146,6 +150,8 @@ export async function findTasks(
|
|
|
146
150
|
priority: t.priority,
|
|
147
151
|
type: t.type,
|
|
148
152
|
parentId: t.parentId,
|
|
153
|
+
depends: t.depends ?? [],
|
|
154
|
+
size: t.size ?? undefined,
|
|
149
155
|
score:
|
|
150
156
|
t.id.toUpperCase() === idQuery ? 100 : t.id.toUpperCase().startsWith(idQuery) ? 80 : 50,
|
|
151
157
|
}));
|
|
@@ -162,6 +168,8 @@ export async function findTasks(
|
|
|
162
168
|
priority: t.priority,
|
|
163
169
|
type: t.type,
|
|
164
170
|
parentId: t.parentId,
|
|
171
|
+
depends: t.depends ?? [],
|
|
172
|
+
size: t.size ?? undefined,
|
|
165
173
|
score: 100,
|
|
166
174
|
}));
|
|
167
175
|
} else {
|
|
@@ -183,6 +191,8 @@ export async function findTasks(
|
|
|
183
191
|
priority: t.priority,
|
|
184
192
|
type: t.type,
|
|
185
193
|
parentId: t.parentId,
|
|
194
|
+
depends: t.depends ?? [],
|
|
195
|
+
size: t.size ?? undefined,
|
|
186
196
|
score: Math.round(score),
|
|
187
197
|
});
|
|
188
198
|
}
|