@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
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"schemaVersion": "1.0.0",
|
|
4
|
-
"$id": "https://cleo-dev.com/schemas/v1/error.schema.json",
|
|
5
|
-
"title": "CLEO Error Envelope",
|
|
6
|
-
"description": "Standard JSON envelope for all cleo error responses",
|
|
7
|
-
"type": "object",
|
|
8
|
-
"required": ["_meta", "success", "error"],
|
|
9
|
-
"properties": {
|
|
10
|
-
"$schema": {
|
|
11
|
-
"type": "string",
|
|
12
|
-
"description": "Schema URL for validation",
|
|
13
|
-
"const": "https://cleo-dev.com/schemas/v1/error.schema.json"
|
|
14
|
-
},
|
|
15
|
-
"_meta": {
|
|
16
|
-
"type": "object",
|
|
17
|
-
"description": "Response metadata",
|
|
18
|
-
"required": ["command", "timestamp", "version"],
|
|
19
|
-
"properties": {
|
|
20
|
-
"format": {
|
|
21
|
-
"type": "string",
|
|
22
|
-
"const": "json",
|
|
23
|
-
"description": "Output format identifier"
|
|
24
|
-
},
|
|
25
|
-
"version": {
|
|
26
|
-
"type": "string",
|
|
27
|
-
"pattern": "^\\d+\\.\\d+\\.\\d+",
|
|
28
|
-
"description": "cleo version (semver)"
|
|
29
|
-
},
|
|
30
|
-
"command": {
|
|
31
|
-
"type": "string",
|
|
32
|
-
"minLength": 1,
|
|
33
|
-
"description": "Command name that generated this error"
|
|
34
|
-
},
|
|
35
|
-
"timestamp": {
|
|
36
|
-
"type": "string",
|
|
37
|
-
"format": "date-time",
|
|
38
|
-
"description": "ISO-8601 UTC timestamp of error generation"
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
"additionalProperties": false
|
|
42
|
-
},
|
|
43
|
-
"success": {
|
|
44
|
-
"type": "boolean",
|
|
45
|
-
"const": false,
|
|
46
|
-
"description": "Always false for error responses"
|
|
47
|
-
},
|
|
48
|
-
"error": {
|
|
49
|
-
"type": "object",
|
|
50
|
-
"description": "Error details",
|
|
51
|
-
"required": ["code", "message", "exitCode"],
|
|
52
|
-
"properties": {
|
|
53
|
-
"code": {
|
|
54
|
-
"type": "string",
|
|
55
|
-
"pattern": "^E_[A-Z_]+$",
|
|
56
|
-
"description": "Error code (E_ prefix convention)",
|
|
57
|
-
"enum": [
|
|
58
|
-
"E_TASK_NOT_FOUND",
|
|
59
|
-
"E_TASK_ALREADY_EXISTS",
|
|
60
|
-
"E_TASK_INVALID_ID",
|
|
61
|
-
"E_TASK_INVALID_STATUS",
|
|
62
|
-
"E_FILE_NOT_FOUND",
|
|
63
|
-
"E_FILE_READ_ERROR",
|
|
64
|
-
"E_FILE_WRITE_ERROR",
|
|
65
|
-
"E_FILE_PERMISSION",
|
|
66
|
-
"E_VALIDATION_SCHEMA",
|
|
67
|
-
"E_VALIDATION_CHECKSUM",
|
|
68
|
-
"E_VALIDATION_REQUIRED",
|
|
69
|
-
"E_INPUT_MISSING",
|
|
70
|
-
"E_INPUT_INVALID",
|
|
71
|
-
"E_INPUT_FORMAT",
|
|
72
|
-
"E_DEPENDENCY_MISSING",
|
|
73
|
-
"E_DEPENDENCY_VERSION",
|
|
74
|
-
"E_PHASE_NOT_FOUND",
|
|
75
|
-
"E_PHASE_INVALID",
|
|
76
|
-
"E_SESSION_ACTIVE",
|
|
77
|
-
"E_SESSION_NOT_ACTIVE",
|
|
78
|
-
"E_UNKNOWN",
|
|
79
|
-
"E_NOT_INITIALIZED",
|
|
80
|
-
"E_PARENT_NOT_FOUND",
|
|
81
|
-
"E_DEPTH_EXCEEDED",
|
|
82
|
-
"E_SIBLING_LIMIT",
|
|
83
|
-
"E_INVALID_PARENT_TYPE",
|
|
84
|
-
"E_CIRCULAR_REFERENCE",
|
|
85
|
-
"E_ORPHAN_DETECTED",
|
|
86
|
-
"E_HAS_CHILDREN",
|
|
87
|
-
"E_TASK_COMPLETED",
|
|
88
|
-
"E_CASCADE_FAILED",
|
|
89
|
-
"E_CANCEL_REASON_REQUIRED",
|
|
90
|
-
"E_CHECKSUM_MISMATCH",
|
|
91
|
-
"E_CONCURRENT_MODIFICATION",
|
|
92
|
-
"E_ID_COLLISION",
|
|
93
|
-
"E_SESSION_EXISTS",
|
|
94
|
-
"E_SESSION_NOT_FOUND",
|
|
95
|
-
"E_SCOPE_CONFLICT",
|
|
96
|
-
"E_SCOPE_INVALID",
|
|
97
|
-
"E_TASK_NOT_IN_SCOPE",
|
|
98
|
-
"E_TASK_CLAIMED",
|
|
99
|
-
"E_SESSION_REQUIRED",
|
|
100
|
-
"E_SESSION_CLOSE_BLOCKED",
|
|
101
|
-
"E_FOCUS_REQUIRED",
|
|
102
|
-
"E_NOTES_REQUIRED",
|
|
103
|
-
"E_SESSION_DISCOVERY_MODE",
|
|
104
|
-
"E_SESSION_RESUME_ACTIVE",
|
|
105
|
-
"E_ALREADY_INITIALIZED",
|
|
106
|
-
"E_CONFIRMATION_REQUIRED",
|
|
107
|
-
"E_HAS_DEPENDENTS"
|
|
108
|
-
]
|
|
109
|
-
},
|
|
110
|
-
"message": {
|
|
111
|
-
"type": "string",
|
|
112
|
-
"minLength": 1,
|
|
113
|
-
"description": "Human-readable error message"
|
|
114
|
-
},
|
|
115
|
-
"exitCode": {
|
|
116
|
-
"type": "integer",
|
|
117
|
-
"minimum": 1,
|
|
118
|
-
"maximum": 127,
|
|
119
|
-
"description": "Shell exit code for this error"
|
|
120
|
-
},
|
|
121
|
-
"recoverable": {
|
|
122
|
-
"type": "boolean",
|
|
123
|
-
"description": "Whether the error can be recovered from"
|
|
124
|
-
},
|
|
125
|
-
"suggestion": {
|
|
126
|
-
"type": ["string", "null"],
|
|
127
|
-
"description": "Suggested action to resolve the error"
|
|
128
|
-
},
|
|
129
|
-
"fix": {
|
|
130
|
-
"type": ["string", "null"],
|
|
131
|
-
"description": "Concrete command to fix the error (copy-paste ready)"
|
|
132
|
-
},
|
|
133
|
-
"alternatives": {
|
|
134
|
-
"type": "array",
|
|
135
|
-
"description": "Alternative recovery actions with executable commands",
|
|
136
|
-
"items": {
|
|
137
|
-
"type": "object",
|
|
138
|
-
"required": ["action", "command"],
|
|
139
|
-
"properties": {
|
|
140
|
-
"action": {
|
|
141
|
-
"type": "string",
|
|
142
|
-
"description": "Short description of what this alternative does"
|
|
143
|
-
},
|
|
144
|
-
"command": {
|
|
145
|
-
"type": "string",
|
|
146
|
-
"description": "Executable command (copy-paste ready)"
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
},
|
|
151
|
-
"context": {
|
|
152
|
-
"type": "object",
|
|
153
|
-
"description": "Additional error context (varies by error type)",
|
|
154
|
-
"additionalProperties": true
|
|
155
|
-
}
|
|
156
|
-
},
|
|
157
|
-
"additionalProperties": false
|
|
158
|
-
}
|
|
159
|
-
},
|
|
160
|
-
"additionalProperties": false
|
|
161
|
-
}
|
|
@@ -1,375 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"$id": "https://cleo-dev.com/schemas/v1/export-package.schema.json",
|
|
4
|
-
"schemaVersion": "1.0.0",
|
|
5
|
-
"title": "CLEO Export Package Schema",
|
|
6
|
-
"description": "Schema for cleo task import/export packages. Enables cross-project task transfer with ID remapping and relationship preservation.",
|
|
7
|
-
"type": "object",
|
|
8
|
-
"required": ["_meta", "selection", "tasks"],
|
|
9
|
-
"additionalProperties": false,
|
|
10
|
-
|
|
11
|
-
"properties": {
|
|
12
|
-
"$schema": {
|
|
13
|
-
"type": "string",
|
|
14
|
-
"description": "JSON Schema reference"
|
|
15
|
-
},
|
|
16
|
-
|
|
17
|
-
"_meta": {
|
|
18
|
-
"type": "object",
|
|
19
|
-
"description": "Export metadata for validation and provenance tracking",
|
|
20
|
-
"required": ["format", "version", "exportedAt", "source", "taskCount"],
|
|
21
|
-
"additionalProperties": false,
|
|
22
|
-
"properties": {
|
|
23
|
-
"format": {
|
|
24
|
-
"type": "string",
|
|
25
|
-
"const": "cleo-export",
|
|
26
|
-
"description": "Package format identifier"
|
|
27
|
-
},
|
|
28
|
-
"version": {
|
|
29
|
-
"type": "string",
|
|
30
|
-
"pattern": "^\\d+\\.\\d+\\.\\d+$",
|
|
31
|
-
"description": "Export format version (semver)"
|
|
32
|
-
},
|
|
33
|
-
"exportedAt": {
|
|
34
|
-
"type": "string",
|
|
35
|
-
"format": "date-time",
|
|
36
|
-
"description": "ISO 8601 timestamp of export"
|
|
37
|
-
},
|
|
38
|
-
"source": {
|
|
39
|
-
"type": "object",
|
|
40
|
-
"description": "Source project metadata",
|
|
41
|
-
"required": ["project", "cleo_version"],
|
|
42
|
-
"additionalProperties": false,
|
|
43
|
-
"properties": {
|
|
44
|
-
"project": {
|
|
45
|
-
"type": "string",
|
|
46
|
-
"minLength": 1,
|
|
47
|
-
"description": "Source project name"
|
|
48
|
-
},
|
|
49
|
-
"cleo_version": {
|
|
50
|
-
"type": "string",
|
|
51
|
-
"pattern": "^\\d+\\.\\d+\\.\\d+",
|
|
52
|
-
"description": "cleo version used for export"
|
|
53
|
-
},
|
|
54
|
-
"nextId": {
|
|
55
|
-
"type": "integer",
|
|
56
|
-
"minimum": 1,
|
|
57
|
-
"description": "Next available task ID in source project at export time"
|
|
58
|
-
},
|
|
59
|
-
"exportedBy": {
|
|
60
|
-
"type": "string",
|
|
61
|
-
"description": "Optional identifier of who/what performed the export"
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
},
|
|
65
|
-
"checksum": {
|
|
66
|
-
"type": "string",
|
|
67
|
-
"pattern": "^[a-f0-9]{16}$",
|
|
68
|
-
"description": "SHA-256 truncated hash of tasks array for integrity verification"
|
|
69
|
-
},
|
|
70
|
-
"taskCount": {
|
|
71
|
-
"type": "integer",
|
|
72
|
-
"minimum": 0,
|
|
73
|
-
"description": "Number of tasks in export"
|
|
74
|
-
},
|
|
75
|
-
"exportMode": {
|
|
76
|
-
"type": "string",
|
|
77
|
-
"enum": ["single", "subtree", "filter", "interactive", "full"],
|
|
78
|
-
"description": "Mode used for task selection"
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
|
|
83
|
-
"selection": {
|
|
84
|
-
"type": "object",
|
|
85
|
-
"description": "Selection criteria used for export (for documentation/debugging)",
|
|
86
|
-
"additionalProperties": false,
|
|
87
|
-
"properties": {
|
|
88
|
-
"mode": {
|
|
89
|
-
"type": "string",
|
|
90
|
-
"enum": ["single", "subtree", "filter", "interactive", "full"],
|
|
91
|
-
"description": "Selection mode"
|
|
92
|
-
},
|
|
93
|
-
"rootTaskIds": {
|
|
94
|
-
"type": "array",
|
|
95
|
-
"items": {
|
|
96
|
-
"type": "string",
|
|
97
|
-
"pattern": "^T\\d{3,}$"
|
|
98
|
-
},
|
|
99
|
-
"description": "Root task IDs that were explicitly selected"
|
|
100
|
-
},
|
|
101
|
-
"includeChildren": {
|
|
102
|
-
"type": "boolean",
|
|
103
|
-
"default": false,
|
|
104
|
-
"description": "Whether children were auto-included"
|
|
105
|
-
},
|
|
106
|
-
"includeDeps": {
|
|
107
|
-
"type": "boolean",
|
|
108
|
-
"default": false,
|
|
109
|
-
"description": "Whether dependencies were auto-included"
|
|
110
|
-
},
|
|
111
|
-
"filters": {
|
|
112
|
-
"type": "object",
|
|
113
|
-
"description": "Filters applied during selection",
|
|
114
|
-
"additionalProperties": false,
|
|
115
|
-
"properties": {
|
|
116
|
-
"status": {
|
|
117
|
-
"type": ["array", "null"],
|
|
118
|
-
"items": {
|
|
119
|
-
"type": "string",
|
|
120
|
-
"enum": ["pending", "active", "blocked", "done", "cancelled"]
|
|
121
|
-
}
|
|
122
|
-
},
|
|
123
|
-
"phase": {
|
|
124
|
-
"type": ["string", "null"]
|
|
125
|
-
},
|
|
126
|
-
"labels": {
|
|
127
|
-
"type": ["array", "null"],
|
|
128
|
-
"items": { "type": "string" }
|
|
129
|
-
},
|
|
130
|
-
"priority": {
|
|
131
|
-
"type": ["string", "null"],
|
|
132
|
-
"enum": ["critical", "high", "medium", "low", null]
|
|
133
|
-
},
|
|
134
|
-
"type": {
|
|
135
|
-
"type": ["string", "null"],
|
|
136
|
-
"enum": ["epic", "task", "subtask", null]
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
},
|
|
142
|
-
|
|
143
|
-
"idMap": {
|
|
144
|
-
"type": "object",
|
|
145
|
-
"description": "Quick-reference map of task IDs to their key properties. Used for relationship validation without parsing full task objects.",
|
|
146
|
-
"additionalProperties": {
|
|
147
|
-
"type": "object",
|
|
148
|
-
"required": ["title"],
|
|
149
|
-
"additionalProperties": false,
|
|
150
|
-
"properties": {
|
|
151
|
-
"type": {
|
|
152
|
-
"type": "string",
|
|
153
|
-
"enum": ["epic", "task", "subtask"]
|
|
154
|
-
},
|
|
155
|
-
"title": {
|
|
156
|
-
"type": "string"
|
|
157
|
-
},
|
|
158
|
-
"status": {
|
|
159
|
-
"type": "string",
|
|
160
|
-
"enum": ["pending", "active", "blocked", "done", "cancelled"]
|
|
161
|
-
},
|
|
162
|
-
"parentId": {
|
|
163
|
-
"type": ["string", "null"],
|
|
164
|
-
"pattern": "^T\\d{3,}$"
|
|
165
|
-
},
|
|
166
|
-
"depends": {
|
|
167
|
-
"type": "array",
|
|
168
|
-
"items": {
|
|
169
|
-
"type": "string",
|
|
170
|
-
"pattern": "^T\\d{3,}$"
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
},
|
|
176
|
-
|
|
177
|
-
"tasks": {
|
|
178
|
-
"type": "array",
|
|
179
|
-
"description": "Full task objects to be imported",
|
|
180
|
-
"items": { "$ref": "#/definitions/exportedTask" }
|
|
181
|
-
},
|
|
182
|
-
|
|
183
|
-
"relationshipGraph": {
|
|
184
|
-
"type": "object",
|
|
185
|
-
"description": "Pre-computed relationship graph for efficient import ordering",
|
|
186
|
-
"additionalProperties": false,
|
|
187
|
-
"properties": {
|
|
188
|
-
"hierarchy": {
|
|
189
|
-
"type": "object",
|
|
190
|
-
"description": "Map of parent IDs to their children: { 'T001': ['T002', 'T003'] }",
|
|
191
|
-
"additionalProperties": {
|
|
192
|
-
"type": "array",
|
|
193
|
-
"items": {
|
|
194
|
-
"type": "string",
|
|
195
|
-
"pattern": "^T\\d{3,}$"
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
},
|
|
199
|
-
"dependencies": {
|
|
200
|
-
"type": "object",
|
|
201
|
-
"description": "Map of task IDs to their dependencies: { 'T003': ['T002'] }",
|
|
202
|
-
"additionalProperties": {
|
|
203
|
-
"type": "array",
|
|
204
|
-
"items": {
|
|
205
|
-
"type": "string",
|
|
206
|
-
"pattern": "^T\\d{3,}$"
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
},
|
|
210
|
-
"roots": {
|
|
211
|
-
"type": "array",
|
|
212
|
-
"description": "Task IDs with no parent and no dependencies (import entry points)",
|
|
213
|
-
"items": {
|
|
214
|
-
"type": "string",
|
|
215
|
-
"pattern": "^T\\d{3,}$"
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
},
|
|
220
|
-
|
|
221
|
-
"phases": {
|
|
222
|
-
"type": "object",
|
|
223
|
-
"description": "Phase definitions from source project (for reference during import)",
|
|
224
|
-
"additionalProperties": {
|
|
225
|
-
"type": "object",
|
|
226
|
-
"properties": {
|
|
227
|
-
"order": { "type": "integer" },
|
|
228
|
-
"name": { "type": "string" },
|
|
229
|
-
"description": { "type": "string" }
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
},
|
|
233
|
-
|
|
234
|
-
"labels": {
|
|
235
|
-
"type": "array",
|
|
236
|
-
"description": "All unique labels used by exported tasks",
|
|
237
|
-
"items": {
|
|
238
|
-
"type": "string",
|
|
239
|
-
"pattern": "^[a-z][a-z0-9.-]*$"
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
},
|
|
243
|
-
|
|
244
|
-
"definitions": {
|
|
245
|
-
"exportedTask": {
|
|
246
|
-
"type": "object",
|
|
247
|
-
"description": "Task object for export/import. Mirrors todo.schema.json task definition.",
|
|
248
|
-
"required": ["id", "title", "status", "priority", "createdAt"],
|
|
249
|
-
"additionalProperties": false,
|
|
250
|
-
"properties": {
|
|
251
|
-
"id": {
|
|
252
|
-
"type": "string",
|
|
253
|
-
"pattern": "^T\\d{3,}$",
|
|
254
|
-
"description": "Original task ID from source project. Will be remapped on import."
|
|
255
|
-
},
|
|
256
|
-
"title": {
|
|
257
|
-
"type": "string",
|
|
258
|
-
"minLength": 1,
|
|
259
|
-
"maxLength": 120
|
|
260
|
-
},
|
|
261
|
-
"description": {
|
|
262
|
-
"type": "string",
|
|
263
|
-
"maxLength": 2000
|
|
264
|
-
},
|
|
265
|
-
"type": {
|
|
266
|
-
"type": "string",
|
|
267
|
-
"enum": ["epic", "task", "subtask"],
|
|
268
|
-
"default": "task"
|
|
269
|
-
},
|
|
270
|
-
"status": {
|
|
271
|
-
"type": "string",
|
|
272
|
-
"enum": ["pending", "active", "blocked", "done", "cancelled"]
|
|
273
|
-
},
|
|
274
|
-
"priority": {
|
|
275
|
-
"type": "string",
|
|
276
|
-
"enum": ["critical", "high", "medium", "low"]
|
|
277
|
-
},
|
|
278
|
-
"phase": {
|
|
279
|
-
"type": ["string", "null"],
|
|
280
|
-
"pattern": "^[a-z][a-z0-9-]*$"
|
|
281
|
-
},
|
|
282
|
-
"size": {
|
|
283
|
-
"type": ["string", "null"],
|
|
284
|
-
"enum": ["small", "medium", "large", null]
|
|
285
|
-
},
|
|
286
|
-
"labels": {
|
|
287
|
-
"type": "array",
|
|
288
|
-
"items": {
|
|
289
|
-
"type": "string",
|
|
290
|
-
"pattern": "^[a-z][a-z0-9.-]*$"
|
|
291
|
-
},
|
|
292
|
-
"uniqueItems": true
|
|
293
|
-
},
|
|
294
|
-
"parentId": {
|
|
295
|
-
"type": ["string", "null"],
|
|
296
|
-
"pattern": "^T\\d{3,}$",
|
|
297
|
-
"description": "Original parent ID. Will be remapped on import if parent is in export."
|
|
298
|
-
},
|
|
299
|
-
"depends": {
|
|
300
|
-
"type": "array",
|
|
301
|
-
"items": {
|
|
302
|
-
"type": "string",
|
|
303
|
-
"pattern": "^T\\d{3,}$"
|
|
304
|
-
},
|
|
305
|
-
"uniqueItems": true,
|
|
306
|
-
"description": "Original dependency IDs. Will be remapped on import."
|
|
307
|
-
},
|
|
308
|
-
"position": {
|
|
309
|
-
"type": ["integer", "null"],
|
|
310
|
-
"minimum": 1
|
|
311
|
-
},
|
|
312
|
-
"notes": {
|
|
313
|
-
"type": "array",
|
|
314
|
-
"items": {
|
|
315
|
-
"type": "string",
|
|
316
|
-
"maxLength": 5000
|
|
317
|
-
}
|
|
318
|
-
},
|
|
319
|
-
"acceptance": {
|
|
320
|
-
"type": "array",
|
|
321
|
-
"items": {
|
|
322
|
-
"type": "string",
|
|
323
|
-
"maxLength": 200
|
|
324
|
-
}
|
|
325
|
-
},
|
|
326
|
-
"files": {
|
|
327
|
-
"type": "array",
|
|
328
|
-
"items": { "type": "string" }
|
|
329
|
-
},
|
|
330
|
-
"blockedBy": {
|
|
331
|
-
"type": "string",
|
|
332
|
-
"maxLength": 300
|
|
333
|
-
},
|
|
334
|
-
"createdAt": {
|
|
335
|
-
"type": "string",
|
|
336
|
-
"format": "date-time"
|
|
337
|
-
},
|
|
338
|
-
"completedAt": {
|
|
339
|
-
"type": "string",
|
|
340
|
-
"format": "date-time"
|
|
341
|
-
},
|
|
342
|
-
"cancelledAt": {
|
|
343
|
-
"type": "string",
|
|
344
|
-
"format": "date-time"
|
|
345
|
-
},
|
|
346
|
-
"cancellationReason": {
|
|
347
|
-
"type": "string",
|
|
348
|
-
"maxLength": 300
|
|
349
|
-
},
|
|
350
|
-
"epicLifecycle": {
|
|
351
|
-
"type": ["string", "null"],
|
|
352
|
-
"enum": ["backlog", "planning", "active", "review", "released", "archived", null]
|
|
353
|
-
},
|
|
354
|
-
"verification": {
|
|
355
|
-
"type": ["object", "null"],
|
|
356
|
-
"description": "Verification state (preserved but not validated on import)"
|
|
357
|
-
}
|
|
358
|
-
},
|
|
359
|
-
"allOf": [
|
|
360
|
-
{
|
|
361
|
-
"if": { "properties": { "status": { "const": "blocked" } } },
|
|
362
|
-
"then": { "required": ["blockedBy"] }
|
|
363
|
-
},
|
|
364
|
-
{
|
|
365
|
-
"if": { "properties": { "status": { "const": "done" } } },
|
|
366
|
-
"then": { "required": ["completedAt"] }
|
|
367
|
-
},
|
|
368
|
-
{
|
|
369
|
-
"if": { "properties": { "status": { "const": "cancelled" } } },
|
|
370
|
-
"then": { "required": ["cancelledAt", "cancellationReason"] }
|
|
371
|
-
}
|
|
372
|
-
]
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
}
|