@cleocode/cleo 2026.2.8 → 2026.3.0
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/README.md +14 -13
- package/dist/cli/index.js +22676 -26012
- package/dist/cli/index.js.map +4 -4
- package/dist/mcp/index.js +1651 -802
- package/dist/mcp/index.js.map +4 -4
- package/drizzle/20260301053344_careless_changeling/migration.sql +27 -0
- package/drizzle/20260301053344_careless_changeling/snapshot.json +2598 -0
- package/package.json +3 -4
- package/packages/ct-skills/skills/ct-cleo/SKILL.md +49 -22
- package/templates/CLEO-INJECTION.md +32 -138
- package/templates/cleo-gitignore +66 -49
- package/templates/git-hooks/pre-commit +24 -6
- package/schemas/archive/agent-configs.schema.json +0 -120
- package/schemas/archive/agent-registry.schema.json +0 -132
- package/schemas/archive/archive.schema.json +0 -450
- package/schemas/archive/claudedocs-frontmatter.schema.json +0 -162
- package/schemas/archive/commands-index.schema.json +0 -158
- package/schemas/archive/contribution.schema.json +0 -722
- package/schemas/archive/critical-path.schema.json +0 -246
- package/schemas/archive/deps-cache.schema.json +0 -97
- package/schemas/archive/doctor-output.schema.json +0 -283
- package/schemas/archive/error.schema.json +0 -161
- package/schemas/archive/export-package.schema.json +0 -375
- package/schemas/archive/global-config.schema.json +0 -219
- package/schemas/archive/log.schema.json +0 -250
- package/schemas/archive/metrics.schema.json +0 -328
- package/schemas/archive/migrations.schema.json +0 -150
- package/schemas/archive/nexus-registry.schema.json +0 -90
- package/schemas/archive/output.schema.json +0 -164
- package/schemas/archive/rcsd-consensus-report.schema.json +0 -491
- package/schemas/archive/rcsd-hitl-resolution.schema.json +0 -216
- package/schemas/archive/rcsd-index.schema.json +0 -384
- package/schemas/archive/rcsd-manifest.schema.json +0 -264
- package/schemas/archive/rcsd-research-output.schema.json +0 -564
- package/schemas/archive/rcsd-spec-frontmatter.schema.json +0 -225
- package/schemas/archive/releases.schema.json +0 -267
- package/schemas/archive/skills-manifest.schema.json +0 -91
- package/schemas/archive/skillsmp.schema.json +0 -208
- package/schemas/archive/spec-index.schema.json +0 -196
- package/schemas/archive/todo.schema.json +0 -995
- package/schemas/claudedocs-frontmatter.schema.json +0 -162
- package/schemas/commands-index.schema.json +0 -158
- package/schemas/rcsd-consensus-report.schema.json +0 -494
- package/schemas/rcsd-hitl-resolution.schema.json +0 -219
- package/schemas/rcsd-index.schema.json +0 -387
- package/schemas/rcsd-manifest.schema.json +0 -267
- package/schemas/rcsd-research-output.schema.json +0 -567
- package/schemas/rcsd-spec-frontmatter.schema.json +0 -225
- package/schemas/todo.schema.json +0 -994
- package/skills/_shared/cleo-style-guide.md +0 -84
- package/skills/_shared/manifest-operations.md +0 -810
- package/skills/_shared/placeholders.json +0 -433
- package/skills/_shared/skill-chaining-patterns.md +0 -240
- package/skills/_shared/subagent-protocol-base.md +0 -221
- package/skills/_shared/task-system-integration.md +0 -232
- package/skills/_shared/testing-framework-config.md +0 -110
- package/skills/agentskills-integrate.md +0 -104
- package/skills/agentskills-specs.md +0 -255
- package/skills/agentskills-what-are-skills.md +0 -75
- package/skills/manifest.json +0 -510
- package/templates/AGENT-INJECTION.md +0 -166
- /package/schemas/{research-manifest.schema.json → archive/research-manifest.schema.json} +0 -0
package/schemas/todo.schema.json
DELETED
|
@@ -1,994 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"$id": "https://cleo-dev.com/schemas/v3.1/todo.schema.json",
|
|
4
|
-
"schemaVersion": "2.10.0",
|
|
5
|
-
"title": "CLEO Task Schema",
|
|
6
|
-
"description": "LLM-Agent-First task tracking (Spec v3.1) with hierarchy support (Epic/Task/Subtask), soft-delete cancellation, integrity verification, session tracking, provenance tracking, and anti-hallucination safeguards.",
|
|
7
|
-
"type": "object",
|
|
8
|
-
"required": [
|
|
9
|
-
"version",
|
|
10
|
-
"project",
|
|
11
|
-
"lastUpdated",
|
|
12
|
-
"tasks",
|
|
13
|
-
"_meta"
|
|
14
|
-
],
|
|
15
|
-
"additionalProperties": false,
|
|
16
|
-
"properties": {
|
|
17
|
-
"version": {
|
|
18
|
-
"type": "string",
|
|
19
|
-
"pattern": "^\\d+\\.\\d+\\.\\d+$",
|
|
20
|
-
"description": "Legacy schema version field (deprecated, use _meta.schemaVersion)"
|
|
21
|
-
},
|
|
22
|
-
"project": {
|
|
23
|
-
"type": "object",
|
|
24
|
-
"required": [
|
|
25
|
-
"name",
|
|
26
|
-
"phases"
|
|
27
|
-
],
|
|
28
|
-
"additionalProperties": false,
|
|
29
|
-
"properties": {
|
|
30
|
-
"name": {
|
|
31
|
-
"type": "string",
|
|
32
|
-
"minLength": 1,
|
|
33
|
-
"description": "Project identifier for cross-session context."
|
|
34
|
-
},
|
|
35
|
-
"currentPhase": {
|
|
36
|
-
"type": [
|
|
37
|
-
"string",
|
|
38
|
-
"null"
|
|
39
|
-
],
|
|
40
|
-
"pattern": "^[a-z][a-z0-9-]*$",
|
|
41
|
-
"description": "Slug of currently active phase. Must match a phase with status=active."
|
|
42
|
-
},
|
|
43
|
-
"phases": {
|
|
44
|
-
"type": "object",
|
|
45
|
-
"description": "Phase definitions with lifecycle tracking.",
|
|
46
|
-
"patternProperties": {
|
|
47
|
-
"^[a-z][a-z0-9-]*$": {
|
|
48
|
-
"$ref": "#/definitions/phaseDefinition"
|
|
49
|
-
}
|
|
50
|
-
},
|
|
51
|
-
"additionalProperties": false
|
|
52
|
-
},
|
|
53
|
-
"phaseHistory": {
|
|
54
|
-
"type": "array",
|
|
55
|
-
"description": "Chronological phase transition log for audit trail and progress analysis.",
|
|
56
|
-
"items": {
|
|
57
|
-
"type": "object",
|
|
58
|
-
"required": [
|
|
59
|
-
"phase",
|
|
60
|
-
"transitionType",
|
|
61
|
-
"timestamp",
|
|
62
|
-
"taskCount"
|
|
63
|
-
],
|
|
64
|
-
"additionalProperties": false,
|
|
65
|
-
"properties": {
|
|
66
|
-
"phase": {
|
|
67
|
-
"type": "string",
|
|
68
|
-
"pattern": "^[a-z][a-z0-9-]*$",
|
|
69
|
-
"description": "Phase slug. Must match a key in project.phases."
|
|
70
|
-
},
|
|
71
|
-
"transitionType": {
|
|
72
|
-
"type": "string",
|
|
73
|
-
"enum": [
|
|
74
|
-
"started",
|
|
75
|
-
"completed",
|
|
76
|
-
"rollback"
|
|
77
|
-
],
|
|
78
|
-
"description": "started=phase became active, completed=phase finished, rollback=reverted to previous phase."
|
|
79
|
-
},
|
|
80
|
-
"timestamp": {
|
|
81
|
-
"type": "string",
|
|
82
|
-
"format": "date-time",
|
|
83
|
-
"description": "ISO 8601 timestamp when transition occurred."
|
|
84
|
-
},
|
|
85
|
-
"taskCount": {
|
|
86
|
-
"type": "integer",
|
|
87
|
-
"minimum": 0,
|
|
88
|
-
"description": "Number of tasks in this phase at transition time."
|
|
89
|
-
},
|
|
90
|
-
"fromPhase": {
|
|
91
|
-
"type": [
|
|
92
|
-
"string",
|
|
93
|
-
"null"
|
|
94
|
-
],
|
|
95
|
-
"pattern": "^[a-z][a-z0-9-]*$",
|
|
96
|
-
"description": "Previous phase slug for rollback tracking. Null for initial phase start."
|
|
97
|
-
},
|
|
98
|
-
"reason": {
|
|
99
|
-
"type": "string",
|
|
100
|
-
"maxLength": 500,
|
|
101
|
-
"description": "Optional context for transition (user note, automation trigger)."
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
},
|
|
106
|
-
"releases": {
|
|
107
|
-
"type": "array",
|
|
108
|
-
"default": [],
|
|
109
|
-
"description": "Release tracking for roadmap management. Each release tracks version, status, and associated tasks.",
|
|
110
|
-
"items": {
|
|
111
|
-
"type": "object",
|
|
112
|
-
"required": [
|
|
113
|
-
"version",
|
|
114
|
-
"status"
|
|
115
|
-
],
|
|
116
|
-
"additionalProperties": false,
|
|
117
|
-
"properties": {
|
|
118
|
-
"version": {
|
|
119
|
-
"type": "string",
|
|
120
|
-
"pattern": "^v?[0-9]+\\.[0-9]+\\.[0-9]+",
|
|
121
|
-
"description": "Semantic version (e.g., v0.65.0 or 0.65.0)."
|
|
122
|
-
},
|
|
123
|
-
"status": {
|
|
124
|
-
"type": "string",
|
|
125
|
-
"enum": [
|
|
126
|
-
"planned",
|
|
127
|
-
"active",
|
|
128
|
-
"released"
|
|
129
|
-
],
|
|
130
|
-
"description": "Release lifecycle: planned=future, active=current development, released=shipped."
|
|
131
|
-
},
|
|
132
|
-
"targetDate": {
|
|
133
|
-
"type": [
|
|
134
|
-
"string",
|
|
135
|
-
"null"
|
|
136
|
-
],
|
|
137
|
-
"format": "date",
|
|
138
|
-
"description": "Planned release date (YYYY-MM-DD). Null if not scheduled."
|
|
139
|
-
},
|
|
140
|
-
"releasedAt": {
|
|
141
|
-
"type": [
|
|
142
|
-
"string",
|
|
143
|
-
"null"
|
|
144
|
-
],
|
|
145
|
-
"format": "date-time",
|
|
146
|
-
"description": "Actual release timestamp (ISO 8601). Null until released."
|
|
147
|
-
},
|
|
148
|
-
"tasks": {
|
|
149
|
-
"type": "array",
|
|
150
|
-
"default": [],
|
|
151
|
-
"items": {
|
|
152
|
-
"type": "string",
|
|
153
|
-
"pattern": "^T[0-9]+$"
|
|
154
|
-
},
|
|
155
|
-
"uniqueItems": true,
|
|
156
|
-
"description": "Task IDs included in this release."
|
|
157
|
-
},
|
|
158
|
-
"notes": {
|
|
159
|
-
"type": [
|
|
160
|
-
"string",
|
|
161
|
-
"null"
|
|
162
|
-
],
|
|
163
|
-
"maxLength": 5000,
|
|
164
|
-
"description": "Release notes or changelog summary."
|
|
165
|
-
},
|
|
166
|
-
"changelog": {
|
|
167
|
-
"type": [
|
|
168
|
-
"string",
|
|
169
|
-
"null"
|
|
170
|
-
],
|
|
171
|
-
"description": "Generated CHANGELOG.md content for this release (cached for reuse). Auto-populated by lib/changelog.sh:generate_changelog()."
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
},
|
|
178
|
-
"lastUpdated": {
|
|
179
|
-
"type": "string",
|
|
180
|
-
"format": "date-time",
|
|
181
|
-
"description": "ISO 8601 timestamp of last modification."
|
|
182
|
-
},
|
|
183
|
-
"_meta": {
|
|
184
|
-
"type": "object",
|
|
185
|
-
"description": "System metadata for integrity and session tracking. CRITICAL for anti-hallucination.",
|
|
186
|
-
"required": [
|
|
187
|
-
"schemaVersion",
|
|
188
|
-
"checksum",
|
|
189
|
-
"configVersion"
|
|
190
|
-
],
|
|
191
|
-
"additionalProperties": false,
|
|
192
|
-
"properties": {
|
|
193
|
-
"schemaVersion": {
|
|
194
|
-
"type": "string",
|
|
195
|
-
"pattern": "^\\d+\\.\\d+\\.\\d+$",
|
|
196
|
-
"description": "Schema version for this file (semver). Canonical source for schema version (replaces root version field)."
|
|
197
|
-
},
|
|
198
|
-
"specVersion": {
|
|
199
|
-
"type": "string",
|
|
200
|
-
"pattern": "^\\d+\\.\\d+\\.\\d+$",
|
|
201
|
-
"default": "3.1.0",
|
|
202
|
-
"description": "LLM-Agent-First Spec version this data conforms to. Semantic versioning (major.minor.patch)."
|
|
203
|
-
},
|
|
204
|
-
"checksum": {
|
|
205
|
-
"type": "string",
|
|
206
|
-
"pattern": "^[a-f0-9]{16}$",
|
|
207
|
-
"description": "SHA-256 truncated hash of tasks array. Verify before ANY write operation."
|
|
208
|
-
},
|
|
209
|
-
"configVersion": {
|
|
210
|
-
"type": "string",
|
|
211
|
-
"description": "Version of todo-config.json used. Ensures config compatibility."
|
|
212
|
-
},
|
|
213
|
-
"lastSessionId": {
|
|
214
|
-
"type": [
|
|
215
|
-
"string",
|
|
216
|
-
"null"
|
|
217
|
-
],
|
|
218
|
-
"description": "Session ID that last modified this file. Format: session_YYYYMMDD_HHMMSS_random"
|
|
219
|
-
},
|
|
220
|
-
"activeSession": {
|
|
221
|
-
"type": [
|
|
222
|
-
"string",
|
|
223
|
-
"null"
|
|
224
|
-
],
|
|
225
|
-
"description": "Currently active session (single-session mode). Null if no session active or in multi-session mode."
|
|
226
|
-
},
|
|
227
|
-
"multiSessionEnabled": {
|
|
228
|
-
"type": "boolean",
|
|
229
|
-
"default": false,
|
|
230
|
-
"description": "Whether multi-session mode is active. When true, session state is in sessions.json."
|
|
231
|
-
},
|
|
232
|
-
"activeSessionCount": {
|
|
233
|
-
"type": "integer",
|
|
234
|
-
"minimum": 0,
|
|
235
|
-
"default": 0,
|
|
236
|
-
"description": "Number of active sessions (multi-session mode). Quick check without reading sessions.json."
|
|
237
|
-
},
|
|
238
|
-
"sessionsFile": {
|
|
239
|
-
"type": [
|
|
240
|
-
"string",
|
|
241
|
-
"null"
|
|
242
|
-
],
|
|
243
|
-
"default": "sessions.json",
|
|
244
|
-
"description": "Relative path to sessions registry file. Null if multi-session disabled."
|
|
245
|
-
},
|
|
246
|
-
"generation": {
|
|
247
|
-
"type": "integer",
|
|
248
|
-
"minimum": 0,
|
|
249
|
-
"default": 0,
|
|
250
|
-
"description": "Generation counter for cache invalidation. Incremented on each write to enable dependency graph cache freshness checks."
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
},
|
|
254
|
-
"focus": {
|
|
255
|
-
"type": "object",
|
|
256
|
-
"description": "Session continuity state. CRITICAL for LLM agents to resume work correctly. NOTE: In multi-session mode (_meta.multiSessionEnabled=true), focus state moves to sessions.json. This object is read-only or null in multi-session mode.",
|
|
257
|
-
"additionalProperties": false,
|
|
258
|
-
"properties": {
|
|
259
|
-
"currentTask": {
|
|
260
|
-
"type": [
|
|
261
|
-
"string",
|
|
262
|
-
"null"
|
|
263
|
-
],
|
|
264
|
-
"pattern": "^T\\d{3,}$",
|
|
265
|
-
"description": "Task ID being worked on (single-session mode). MUST match the only task with status='active'. Null if no active task or in multi-session mode."
|
|
266
|
-
},
|
|
267
|
-
"currentPhase": {
|
|
268
|
-
"type": [
|
|
269
|
-
"string",
|
|
270
|
-
"null"
|
|
271
|
-
],
|
|
272
|
-
"pattern": "^[a-z][a-z0-9-]*$",
|
|
273
|
-
"description": "Phase of currently focused task. Cached for quick reference."
|
|
274
|
-
},
|
|
275
|
-
"blockedUntil": {
|
|
276
|
-
"type": [
|
|
277
|
-
"string",
|
|
278
|
-
"null"
|
|
279
|
-
],
|
|
280
|
-
"description": "Global blocker if entire project is blocked."
|
|
281
|
-
},
|
|
282
|
-
"sessionNote": {
|
|
283
|
-
"type": [
|
|
284
|
-
"string",
|
|
285
|
-
"null"
|
|
286
|
-
],
|
|
287
|
-
"maxLength": 2500,
|
|
288
|
-
"description": "Context from last session (single-session mode). In multi-session mode, notes are per-session in sessions.json. DEPRECATED: Use sessionNotes array for append-only history."
|
|
289
|
-
},
|
|
290
|
-
"sessionNotes": {
|
|
291
|
-
"type": "array",
|
|
292
|
-
"items": {
|
|
293
|
-
"type": "object",
|
|
294
|
-
"properties": {
|
|
295
|
-
"note": {
|
|
296
|
-
"type": "string",
|
|
297
|
-
"description": "Session progress note content"
|
|
298
|
-
},
|
|
299
|
-
"timestamp": {
|
|
300
|
-
"type": "string",
|
|
301
|
-
"format": "date-time",
|
|
302
|
-
"description": "When the note was added"
|
|
303
|
-
},
|
|
304
|
-
"conversationId": {
|
|
305
|
-
"type": [
|
|
306
|
-
"string",
|
|
307
|
-
"null"
|
|
308
|
-
],
|
|
309
|
-
"description": "Claude conversation ID for context"
|
|
310
|
-
},
|
|
311
|
-
"agent": {
|
|
312
|
-
"type": [
|
|
313
|
-
"string",
|
|
314
|
-
"null"
|
|
315
|
-
],
|
|
316
|
-
"description": "Agent identifier (opus-1, sonnet-2, etc.)"
|
|
317
|
-
}
|
|
318
|
-
},
|
|
319
|
-
"required": [
|
|
320
|
-
"note",
|
|
321
|
-
"timestamp"
|
|
322
|
-
],
|
|
323
|
-
"additionalProperties": false
|
|
324
|
-
},
|
|
325
|
-
"maxItems": 50,
|
|
326
|
-
"default": [],
|
|
327
|
-
"description": "Append-only session notes preserving conversation context"
|
|
328
|
-
},
|
|
329
|
-
"nextAction": {
|
|
330
|
-
"type": [
|
|
331
|
-
"string",
|
|
332
|
-
"null"
|
|
333
|
-
],
|
|
334
|
-
"maxLength": 500,
|
|
335
|
-
"description": "Specific next step when resuming (e.g., 'Add validation to auth.ts:45')."
|
|
336
|
-
},
|
|
337
|
-
"primarySession": {
|
|
338
|
-
"type": [
|
|
339
|
-
"string",
|
|
340
|
-
"null"
|
|
341
|
-
],
|
|
342
|
-
"pattern": "^session_\\d{8}_\\d{6}_[a-f0-9]{6}$",
|
|
343
|
-
"description": "In multi-session mode: the 'default' session for CLI commands without explicit --session. Null in single-session mode."
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
},
|
|
347
|
-
"tasks": {
|
|
348
|
-
"type": "array",
|
|
349
|
-
"description": "Flat array of all active tasks. Completed tasks archived via archive-todo.sh.",
|
|
350
|
-
"items": {
|
|
351
|
-
"$ref": "#/definitions/task"
|
|
352
|
-
}
|
|
353
|
-
},
|
|
354
|
-
"labels": {
|
|
355
|
-
"type": "object",
|
|
356
|
-
"description": "Computed label-to-task-ID index. Derived from task.labels. Regenerate if stale.",
|
|
357
|
-
"patternProperties": {
|
|
358
|
-
"^[a-z][a-z0-9.-]*$": {
|
|
359
|
-
"type": "array",
|
|
360
|
-
"items": {
|
|
361
|
-
"type": "string",
|
|
362
|
-
"pattern": "^T\\d{3,}$"
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
},
|
|
366
|
-
"additionalProperties": false
|
|
367
|
-
}
|
|
368
|
-
},
|
|
369
|
-
"definitions": {
|
|
370
|
-
"phaseDefinition": {
|
|
371
|
-
"type": "object",
|
|
372
|
-
"required": [
|
|
373
|
-
"order",
|
|
374
|
-
"name",
|
|
375
|
-
"status"
|
|
376
|
-
],
|
|
377
|
-
"additionalProperties": false,
|
|
378
|
-
"properties": {
|
|
379
|
-
"order": {
|
|
380
|
-
"type": "integer",
|
|
381
|
-
"minimum": 1,
|
|
382
|
-
"description": "Display order for phase sequencing."
|
|
383
|
-
},
|
|
384
|
-
"name": {
|
|
385
|
-
"type": "string",
|
|
386
|
-
"minLength": 1,
|
|
387
|
-
"maxLength": 50,
|
|
388
|
-
"description": "Human-readable phase name."
|
|
389
|
-
},
|
|
390
|
-
"description": {
|
|
391
|
-
"type": "string",
|
|
392
|
-
"maxLength": 200,
|
|
393
|
-
"description": "Phase purpose and scope."
|
|
394
|
-
},
|
|
395
|
-
"status": {
|
|
396
|
-
"type": "string",
|
|
397
|
-
"enum": [
|
|
398
|
-
"pending",
|
|
399
|
-
"active",
|
|
400
|
-
"completed"
|
|
401
|
-
],
|
|
402
|
-
"description": "Phase lifecycle state. Only one phase can be active."
|
|
403
|
-
},
|
|
404
|
-
"startedAt": {
|
|
405
|
-
"type": [
|
|
406
|
-
"string",
|
|
407
|
-
"null"
|
|
408
|
-
],
|
|
409
|
-
"format": "date-time",
|
|
410
|
-
"description": "When phase became active."
|
|
411
|
-
},
|
|
412
|
-
"completedAt": {
|
|
413
|
-
"type": [
|
|
414
|
-
"string",
|
|
415
|
-
"null"
|
|
416
|
-
],
|
|
417
|
-
"format": "date-time",
|
|
418
|
-
"description": "When phase was completed."
|
|
419
|
-
}
|
|
420
|
-
},
|
|
421
|
-
"allOf": [
|
|
422
|
-
{
|
|
423
|
-
"if": {
|
|
424
|
-
"properties": {
|
|
425
|
-
"status": {
|
|
426
|
-
"enum": [
|
|
427
|
-
"active",
|
|
428
|
-
"completed"
|
|
429
|
-
]
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
},
|
|
433
|
-
"then": {
|
|
434
|
-
"required": [
|
|
435
|
-
"startedAt"
|
|
436
|
-
]
|
|
437
|
-
}
|
|
438
|
-
},
|
|
439
|
-
{
|
|
440
|
-
"if": {
|
|
441
|
-
"properties": {
|
|
442
|
-
"status": {
|
|
443
|
-
"const": "completed"
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
},
|
|
447
|
-
"then": {
|
|
448
|
-
"required": [
|
|
449
|
-
"completedAt"
|
|
450
|
-
]
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
]
|
|
454
|
-
},
|
|
455
|
-
"task": {
|
|
456
|
-
"type": "object",
|
|
457
|
-
"required": [
|
|
458
|
-
"id",
|
|
459
|
-
"title",
|
|
460
|
-
"status",
|
|
461
|
-
"priority",
|
|
462
|
-
"createdAt"
|
|
463
|
-
],
|
|
464
|
-
"additionalProperties": false,
|
|
465
|
-
"properties": {
|
|
466
|
-
"id": {
|
|
467
|
-
"type": "string",
|
|
468
|
-
"pattern": "^T\\d{3,}$",
|
|
469
|
-
"description": "Unique stable ID (T001, T002). NEVER reuse. NEVER change after creation."
|
|
470
|
-
},
|
|
471
|
-
"title": {
|
|
472
|
-
"type": "string",
|
|
473
|
-
"minLength": 1,
|
|
474
|
-
"maxLength": 120,
|
|
475
|
-
"description": "Actionable title starting with verb: 'Implement X', 'Fix Y', 'Add Z'."
|
|
476
|
-
},
|
|
477
|
-
"status": {
|
|
478
|
-
"type": "string",
|
|
479
|
-
"enum": [
|
|
480
|
-
"pending",
|
|
481
|
-
"active",
|
|
482
|
-
"blocked",
|
|
483
|
-
"done",
|
|
484
|
-
"cancelled"
|
|
485
|
-
],
|
|
486
|
-
"description": "pending=ready, active=working (ONE ONLY), blocked=stuck, done=completed, cancelled=soft-deleted."
|
|
487
|
-
},
|
|
488
|
-
"priority": {
|
|
489
|
-
"type": "string",
|
|
490
|
-
"enum": [
|
|
491
|
-
"critical",
|
|
492
|
-
"high",
|
|
493
|
-
"medium",
|
|
494
|
-
"low"
|
|
495
|
-
],
|
|
496
|
-
"description": "Task priority. critical > high > medium > low."
|
|
497
|
-
},
|
|
498
|
-
"type": {
|
|
499
|
-
"type": "string",
|
|
500
|
-
"enum": [
|
|
501
|
-
"epic",
|
|
502
|
-
"task",
|
|
503
|
-
"subtask"
|
|
504
|
-
],
|
|
505
|
-
"default": "task",
|
|
506
|
-
"description": "Task classification in hierarchy. epic: strategic initiative requiring decomposition. task: primary work unit. subtask: atomic operation. See HIERARCHY-ENHANCEMENT-SPEC.md."
|
|
507
|
-
},
|
|
508
|
-
"parentId": {
|
|
509
|
-
"type": [
|
|
510
|
-
"string",
|
|
511
|
-
"null"
|
|
512
|
-
],
|
|
513
|
-
"pattern": "^T\\d{3,}$",
|
|
514
|
-
"default": null,
|
|
515
|
-
"description": "Parent task ID for hierarchy. Null for root-level tasks. Must reference existing task. Max depth 3 (epic→task→subtask). Max 7 siblings per parent."
|
|
516
|
-
},
|
|
517
|
-
"position": {
|
|
518
|
-
"type": [
|
|
519
|
-
"integer",
|
|
520
|
-
"null"
|
|
521
|
-
],
|
|
522
|
-
"minimum": 1,
|
|
523
|
-
"default": null,
|
|
524
|
-
"description": "Display order within parent scope. 1-indexed, continuous sequence per parent. Null = not yet assigned (will be auto-assigned on next operation). See T805 for positional ordering system."
|
|
525
|
-
},
|
|
526
|
-
"positionVersion": {
|
|
527
|
-
"type": "integer",
|
|
528
|
-
"minimum": 0,
|
|
529
|
-
"default": 0,
|
|
530
|
-
"description": "Optimistic locking version for position changes. Incremented on each position modification."
|
|
531
|
-
},
|
|
532
|
-
"size": {
|
|
533
|
-
"type": [
|
|
534
|
-
"string",
|
|
535
|
-
"null"
|
|
536
|
-
],
|
|
537
|
-
"enum": [
|
|
538
|
-
"small",
|
|
539
|
-
"medium",
|
|
540
|
-
"large",
|
|
541
|
-
null
|
|
542
|
-
],
|
|
543
|
-
"default": null,
|
|
544
|
-
"description": "Scope-based size (NOT time). small: 1-2 files. medium: 3-7 files. large: 8+ files (should decompose). NO TIME ESTIMATES."
|
|
545
|
-
},
|
|
546
|
-
"phase": {
|
|
547
|
-
"type": "string",
|
|
548
|
-
"pattern": "^[a-z][a-z0-9-]*$",
|
|
549
|
-
"description": "Phase slug (must exist in phases object)."
|
|
550
|
-
},
|
|
551
|
-
"description": {
|
|
552
|
-
"type": "string",
|
|
553
|
-
"maxLength": 2000,
|
|
554
|
-
"description": "Detailed requirements, context, and implementation notes."
|
|
555
|
-
},
|
|
556
|
-
"files": {
|
|
557
|
-
"type": "array",
|
|
558
|
-
"items": {
|
|
559
|
-
"type": "string"
|
|
560
|
-
},
|
|
561
|
-
"description": "Files to create/modify. Relative paths from project root."
|
|
562
|
-
},
|
|
563
|
-
"acceptance": {
|
|
564
|
-
"type": "array",
|
|
565
|
-
"items": {
|
|
566
|
-
"type": "string",
|
|
567
|
-
"maxLength": 200
|
|
568
|
-
},
|
|
569
|
-
"minItems": 1,
|
|
570
|
-
"description": "Testable completion criteria. Task is done when ALL are met."
|
|
571
|
-
},
|
|
572
|
-
"depends": {
|
|
573
|
-
"type": "array",
|
|
574
|
-
"items": {
|
|
575
|
-
"type": "string",
|
|
576
|
-
"pattern": "^T\\d{3,}$"
|
|
577
|
-
},
|
|
578
|
-
"uniqueItems": true,
|
|
579
|
-
"description": "Task IDs that must be 'done' before this can start. Validates on activation."
|
|
580
|
-
},
|
|
581
|
-
"epicLifecycle": {
|
|
582
|
-
"type": [
|
|
583
|
-
"string",
|
|
584
|
-
"null"
|
|
585
|
-
],
|
|
586
|
-
"enum": [
|
|
587
|
-
"backlog",
|
|
588
|
-
"planning",
|
|
589
|
-
"active",
|
|
590
|
-
"review",
|
|
591
|
-
"released",
|
|
592
|
-
"archived",
|
|
593
|
-
null
|
|
594
|
-
],
|
|
595
|
-
"default": null,
|
|
596
|
-
"description": "Epic lifecycle state. Only applicable when type=epic. Null for tasks/subtasks."
|
|
597
|
-
},
|
|
598
|
-
"noAutoComplete": {
|
|
599
|
-
"type": [
|
|
600
|
-
"boolean",
|
|
601
|
-
"null"
|
|
602
|
-
],
|
|
603
|
-
"default": null,
|
|
604
|
-
"description": "When true, this task/epic will NOT auto-complete even when all children are done. Use for permanent tracking epics or tasks that require explicit manual completion."
|
|
605
|
-
},
|
|
606
|
-
"blockedBy": {
|
|
607
|
-
"type": "string",
|
|
608
|
-
"maxLength": 300,
|
|
609
|
-
"description": "Blocker reason. REQUIRED when status='blocked'."
|
|
610
|
-
},
|
|
611
|
-
"notes": {
|
|
612
|
-
"type": "array",
|
|
613
|
-
"items": {
|
|
614
|
-
"type": "string",
|
|
615
|
-
"maxLength": 5000
|
|
616
|
-
},
|
|
617
|
-
"description": "Append-only implementation log. NEVER delete entries. Timestamp recommended."
|
|
618
|
-
},
|
|
619
|
-
"labels": {
|
|
620
|
-
"type": "array",
|
|
621
|
-
"items": {
|
|
622
|
-
"type": "string",
|
|
623
|
-
"pattern": "^[a-z][a-z0-9.-]*$"
|
|
624
|
-
},
|
|
625
|
-
"uniqueItems": true,
|
|
626
|
-
"description": "Tags for filtering (bug, feature, security, v0.5.0)."
|
|
627
|
-
},
|
|
628
|
-
"origin": {
|
|
629
|
-
"type": [
|
|
630
|
-
"string",
|
|
631
|
-
"null"
|
|
632
|
-
],
|
|
633
|
-
"enum": [
|
|
634
|
-
"internal",
|
|
635
|
-
"bug-report",
|
|
636
|
-
"feature-request",
|
|
637
|
-
"security",
|
|
638
|
-
"technical-debt",
|
|
639
|
-
"dependency",
|
|
640
|
-
"regression",
|
|
641
|
-
null
|
|
642
|
-
],
|
|
643
|
-
"default": null,
|
|
644
|
-
"description": "Task provenance classification for tracking source of work items."
|
|
645
|
-
},
|
|
646
|
-
"createdAt": {
|
|
647
|
-
"type": "string",
|
|
648
|
-
"format": "date-time",
|
|
649
|
-
"description": "ISO 8601 creation timestamp."
|
|
650
|
-
},
|
|
651
|
-
"updatedAt": {
|
|
652
|
-
"type": [
|
|
653
|
-
"string",
|
|
654
|
-
"null"
|
|
655
|
-
],
|
|
656
|
-
"format": "date-time",
|
|
657
|
-
"description": "Timestamp of last task modification, auto-set on mutations."
|
|
658
|
-
},
|
|
659
|
-
"completedAt": {
|
|
660
|
-
"type": "string",
|
|
661
|
-
"format": "date-time",
|
|
662
|
-
"description": "ISO 8601 completion timestamp. REQUIRED when status='done'."
|
|
663
|
-
},
|
|
664
|
-
"cancelledAt": {
|
|
665
|
-
"type": "string",
|
|
666
|
-
"format": "date-time",
|
|
667
|
-
"description": "ISO 8601 cancellation timestamp. REQUIRED when status='cancelled'."
|
|
668
|
-
},
|
|
669
|
-
"cancellationReason": {
|
|
670
|
-
"type": "string",
|
|
671
|
-
"minLength": 5,
|
|
672
|
-
"maxLength": 300,
|
|
673
|
-
"pattern": "^[^`$;|&<>]*$",
|
|
674
|
-
"description": "Reason for cancellation. REQUIRED when status='cancelled'. 5-300 chars, no shell metacharacters."
|
|
675
|
-
},
|
|
676
|
-
"verification": {
|
|
677
|
-
"type": [
|
|
678
|
-
"object",
|
|
679
|
-
"null"
|
|
680
|
-
],
|
|
681
|
-
"default": null,
|
|
682
|
-
"description": "Implementation verification state. Tracks pass/fail status across validation gates.",
|
|
683
|
-
"additionalProperties": false,
|
|
684
|
-
"properties": {
|
|
685
|
-
"passed": {
|
|
686
|
-
"type": "boolean",
|
|
687
|
-
"default": false,
|
|
688
|
-
"description": "Overall verification status. True only when ALL required gates pass."
|
|
689
|
-
},
|
|
690
|
-
"round": {
|
|
691
|
-
"type": "integer",
|
|
692
|
-
"minimum": 0,
|
|
693
|
-
"default": 0,
|
|
694
|
-
"description": "Current implementation round (0 = not started)."
|
|
695
|
-
},
|
|
696
|
-
"gates": {
|
|
697
|
-
"type": "object",
|
|
698
|
-
"additionalProperties": false,
|
|
699
|
-
"properties": {
|
|
700
|
-
"implemented": {
|
|
701
|
-
"type": [
|
|
702
|
-
"boolean",
|
|
703
|
-
"null"
|
|
704
|
-
],
|
|
705
|
-
"default": null,
|
|
706
|
-
"description": "Coder Agent completed implementation."
|
|
707
|
-
},
|
|
708
|
-
"testsPassed": {
|
|
709
|
-
"type": [
|
|
710
|
-
"boolean",
|
|
711
|
-
"null"
|
|
712
|
-
],
|
|
713
|
-
"default": null,
|
|
714
|
-
"description": "Testing Agent verified all tests pass."
|
|
715
|
-
},
|
|
716
|
-
"qaPassed": {
|
|
717
|
-
"type": [
|
|
718
|
-
"boolean",
|
|
719
|
-
"null"
|
|
720
|
-
],
|
|
721
|
-
"default": null,
|
|
722
|
-
"description": "QA Agent verified acceptance criteria."
|
|
723
|
-
},
|
|
724
|
-
"cleanupDone": {
|
|
725
|
-
"type": [
|
|
726
|
-
"boolean",
|
|
727
|
-
"null"
|
|
728
|
-
],
|
|
729
|
-
"default": null,
|
|
730
|
-
"description": "Cleanup Agent completed refactoring."
|
|
731
|
-
},
|
|
732
|
-
"securityPassed": {
|
|
733
|
-
"type": [
|
|
734
|
-
"boolean",
|
|
735
|
-
"null"
|
|
736
|
-
],
|
|
737
|
-
"default": null,
|
|
738
|
-
"description": "Security Agent found no critical issues."
|
|
739
|
-
},
|
|
740
|
-
"documented": {
|
|
741
|
-
"type": [
|
|
742
|
-
"boolean",
|
|
743
|
-
"null"
|
|
744
|
-
],
|
|
745
|
-
"default": null,
|
|
746
|
-
"description": "Docs Agent completed documentation."
|
|
747
|
-
}
|
|
748
|
-
}
|
|
749
|
-
},
|
|
750
|
-
"lastAgent": {
|
|
751
|
-
"type": [
|
|
752
|
-
"string",
|
|
753
|
-
"null"
|
|
754
|
-
],
|
|
755
|
-
"enum": [
|
|
756
|
-
"planner",
|
|
757
|
-
"coder",
|
|
758
|
-
"testing",
|
|
759
|
-
"qa",
|
|
760
|
-
"cleanup",
|
|
761
|
-
"security",
|
|
762
|
-
"docs",
|
|
763
|
-
null
|
|
764
|
-
],
|
|
765
|
-
"default": null,
|
|
766
|
-
"description": "Last agent to work on this task."
|
|
767
|
-
},
|
|
768
|
-
"lastUpdated": {
|
|
769
|
-
"type": [
|
|
770
|
-
"string",
|
|
771
|
-
"null"
|
|
772
|
-
],
|
|
773
|
-
"format": "date-time",
|
|
774
|
-
"description": "Timestamp of last verification update."
|
|
775
|
-
},
|
|
776
|
-
"failureLog": {
|
|
777
|
-
"type": "array",
|
|
778
|
-
"default": [],
|
|
779
|
-
"items": {
|
|
780
|
-
"type": "object",
|
|
781
|
-
"required": [
|
|
782
|
-
"round",
|
|
783
|
-
"agent",
|
|
784
|
-
"reason",
|
|
785
|
-
"timestamp"
|
|
786
|
-
],
|
|
787
|
-
"additionalProperties": false,
|
|
788
|
-
"properties": {
|
|
789
|
-
"round": {
|
|
790
|
-
"type": "integer",
|
|
791
|
-
"minimum": 1
|
|
792
|
-
},
|
|
793
|
-
"agent": {
|
|
794
|
-
"type": "string"
|
|
795
|
-
},
|
|
796
|
-
"reason": {
|
|
797
|
-
"type": "string",
|
|
798
|
-
"maxLength": 500
|
|
799
|
-
},
|
|
800
|
-
"timestamp": {
|
|
801
|
-
"type": "string",
|
|
802
|
-
"format": "date-time"
|
|
803
|
-
}
|
|
804
|
-
}
|
|
805
|
-
},
|
|
806
|
-
"description": "Log of verification failures for debugging."
|
|
807
|
-
}
|
|
808
|
-
}
|
|
809
|
-
},
|
|
810
|
-
"relates": {
|
|
811
|
-
"type": "array",
|
|
812
|
-
"default": [],
|
|
813
|
-
"description": "Non-blocking relationships to other tasks. Use for cross-references, provenance tracking, and semantic connections.",
|
|
814
|
-
"items": {
|
|
815
|
-
"type": "object",
|
|
816
|
-
"required": [
|
|
817
|
-
"taskId",
|
|
818
|
-
"type"
|
|
819
|
-
],
|
|
820
|
-
"additionalProperties": false,
|
|
821
|
-
"properties": {
|
|
822
|
-
"taskId": {
|
|
823
|
-
"type": "string",
|
|
824
|
-
"pattern": "^T\\d{3,}$",
|
|
825
|
-
"description": "Related task ID."
|
|
826
|
-
},
|
|
827
|
-
"type": {
|
|
828
|
-
"type": "string",
|
|
829
|
-
"enum": [
|
|
830
|
-
"relates-to",
|
|
831
|
-
"spawned-from",
|
|
832
|
-
"deferred-to",
|
|
833
|
-
"supersedes",
|
|
834
|
-
"duplicates"
|
|
835
|
-
],
|
|
836
|
-
"description": "Relationship type: relates-to (general), spawned-from (derived from), deferred-to (postponed to), supersedes (replaces), duplicates (same as)."
|
|
837
|
-
},
|
|
838
|
-
"reason": {
|
|
839
|
-
"type": "string",
|
|
840
|
-
"maxLength": 200,
|
|
841
|
-
"description": "Optional explanation for the relationship."
|
|
842
|
-
}
|
|
843
|
-
}
|
|
844
|
-
}
|
|
845
|
-
},
|
|
846
|
-
"createdBy": {
|
|
847
|
-
"type": [
|
|
848
|
-
"string",
|
|
849
|
-
"null"
|
|
850
|
-
],
|
|
851
|
-
"description": "Agent or user that created this task",
|
|
852
|
-
"pattern": "^(research|consensus|specification|decomposition|implementation|validation|testing|release)-agent-T[0-9]+$|^(user|legacy|system)$",
|
|
853
|
-
"default": null
|
|
854
|
-
},
|
|
855
|
-
"validatedBy": {
|
|
856
|
-
"type": [
|
|
857
|
-
"string",
|
|
858
|
-
"null"
|
|
859
|
-
],
|
|
860
|
-
"description": "Agent that validated this task's implementation",
|
|
861
|
-
"pattern": "^(research|consensus|specification|decomposition|implementation|validation|testing|release)-agent-T[0-9]+$|^(user|legacy|system)$",
|
|
862
|
-
"default": null
|
|
863
|
-
},
|
|
864
|
-
"testedBy": {
|
|
865
|
-
"type": [
|
|
866
|
-
"string",
|
|
867
|
-
"null"
|
|
868
|
-
],
|
|
869
|
-
"description": "Agent that executed tests for this task",
|
|
870
|
-
"pattern": "^(research|consensus|specification|decomposition|implementation|validation|testing|release)-agent-T[0-9]+$|^(user|legacy|system)$",
|
|
871
|
-
"default": null
|
|
872
|
-
},
|
|
873
|
-
"lifecycleState": {
|
|
874
|
-
"type": [
|
|
875
|
-
"string",
|
|
876
|
-
"null"
|
|
877
|
-
],
|
|
878
|
-
"enum": [
|
|
879
|
-
"research",
|
|
880
|
-
"consensus",
|
|
881
|
-
"specification",
|
|
882
|
-
"decomposition",
|
|
883
|
-
"implementation",
|
|
884
|
-
"validation",
|
|
885
|
-
"testing",
|
|
886
|
-
"release",
|
|
887
|
-
null
|
|
888
|
-
],
|
|
889
|
-
"description": "Current RCSD→IVTR pipeline state",
|
|
890
|
-
"default": null
|
|
891
|
-
},
|
|
892
|
-
"validationHistory": {
|
|
893
|
-
"type": "array",
|
|
894
|
-
"description": "Full audit trail of all validation events",
|
|
895
|
-
"items": {
|
|
896
|
-
"type": "object",
|
|
897
|
-
"required": [
|
|
898
|
-
"gate",
|
|
899
|
-
"result",
|
|
900
|
-
"validator",
|
|
901
|
-
"validatedAt"
|
|
902
|
-
],
|
|
903
|
-
"additionalProperties": false,
|
|
904
|
-
"properties": {
|
|
905
|
-
"gate": {
|
|
906
|
-
"type": "string",
|
|
907
|
-
"enum": [
|
|
908
|
-
"implemented",
|
|
909
|
-
"testsPassed",
|
|
910
|
-
"qaPassed",
|
|
911
|
-
"securityPassed",
|
|
912
|
-
"documented"
|
|
913
|
-
]
|
|
914
|
-
},
|
|
915
|
-
"result": {
|
|
916
|
-
"type": "boolean",
|
|
917
|
-
"description": "Validation outcome (true = pass, false = fail)"
|
|
918
|
-
},
|
|
919
|
-
"validator": {
|
|
920
|
-
"type": "string",
|
|
921
|
-
"description": "Agent ID that performed validation",
|
|
922
|
-
"pattern": "^(research|consensus|specification|decomposition|implementation|validation|testing|release)-agent-T[0-9]+$|^(user|legacy|system)$"
|
|
923
|
-
},
|
|
924
|
-
"validatedAt": {
|
|
925
|
-
"type": "string",
|
|
926
|
-
"format": "date-time",
|
|
927
|
-
"description": "ISO 8601 timestamp of validation"
|
|
928
|
-
},
|
|
929
|
-
"circularCheck": {
|
|
930
|
-
"type": "string",
|
|
931
|
-
"enum": [
|
|
932
|
-
"pass",
|
|
933
|
-
"fail",
|
|
934
|
-
"skipped"
|
|
935
|
-
],
|
|
936
|
-
"description": "Circular validation check result"
|
|
937
|
-
},
|
|
938
|
-
"notes": {
|
|
939
|
-
"type": "string",
|
|
940
|
-
"description": "Validation notes (test results, review comments, etc.)"
|
|
941
|
-
}
|
|
942
|
-
}
|
|
943
|
-
},
|
|
944
|
-
"default": []
|
|
945
|
-
}
|
|
946
|
-
},
|
|
947
|
-
"allOf": [
|
|
948
|
-
{
|
|
949
|
-
"if": {
|
|
950
|
-
"properties": {
|
|
951
|
-
"status": {
|
|
952
|
-
"const": "blocked"
|
|
953
|
-
}
|
|
954
|
-
}
|
|
955
|
-
},
|
|
956
|
-
"then": {
|
|
957
|
-
"required": [
|
|
958
|
-
"blockedBy"
|
|
959
|
-
]
|
|
960
|
-
}
|
|
961
|
-
},
|
|
962
|
-
{
|
|
963
|
-
"if": {
|
|
964
|
-
"properties": {
|
|
965
|
-
"status": {
|
|
966
|
-
"const": "done"
|
|
967
|
-
}
|
|
968
|
-
}
|
|
969
|
-
},
|
|
970
|
-
"then": {
|
|
971
|
-
"required": [
|
|
972
|
-
"completedAt"
|
|
973
|
-
]
|
|
974
|
-
}
|
|
975
|
-
},
|
|
976
|
-
{
|
|
977
|
-
"if": {
|
|
978
|
-
"properties": {
|
|
979
|
-
"status": {
|
|
980
|
-
"const": "cancelled"
|
|
981
|
-
}
|
|
982
|
-
}
|
|
983
|
-
},
|
|
984
|
-
"then": {
|
|
985
|
-
"required": [
|
|
986
|
-
"cancelledAt",
|
|
987
|
-
"cancellationReason"
|
|
988
|
-
]
|
|
989
|
-
}
|
|
990
|
-
}
|
|
991
|
-
]
|
|
992
|
-
}
|
|
993
|
-
}
|
|
994
|
-
}
|