planfs-core 1.2.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 +125 -0
- package/dist/ai.d.ts +98 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +265 -0
- package/dist/ai.js.map +1 -0
- package/dist/backlog.d.ts +40 -0
- package/dist/backlog.d.ts.map +1 -0
- package/dist/backlog.js +206 -0
- package/dist/backlog.js.map +1 -0
- package/dist/bulk.d.ts +29 -0
- package/dist/bulk.d.ts.map +1 -0
- package/dist/bulk.js +206 -0
- package/dist/bulk.js.map +1 -0
- package/dist/files.d.ts +38 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +179 -0
- package/dist/files.js.map +1 -0
- package/dist/git.d.ts +74 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +426 -0
- package/dist/git.js.map +1 -0
- package/dist/graph.d.ts +56 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +188 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +26 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +248 -0
- package/dist/loader.js.map +1 -0
- package/dist/milestone.d.ts +23 -0
- package/dist/milestone.d.ts.map +1 -0
- package/dist/milestone.js +60 -0
- package/dist/milestone.js.map +1 -0
- package/dist/next-work.d.ts +34 -0
- package/dist/next-work.d.ts.map +1 -0
- package/dist/next-work.js +239 -0
- package/dist/next-work.js.map +1 -0
- package/dist/parser.d.ts +37 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +132 -0
- package/dist/parser.js.map +1 -0
- package/dist/pull-request.d.ts +38 -0
- package/dist/pull-request.d.ts.map +1 -0
- package/dist/pull-request.js +147 -0
- package/dist/pull-request.js.map +1 -0
- package/dist/references.d.ts +10 -0
- package/dist/references.d.ts.map +1 -0
- package/dist/references.js +30 -0
- package/dist/references.js.map +1 -0
- package/dist/repository.d.ts +85 -0
- package/dist/repository.d.ts.map +1 -0
- package/dist/repository.js +495 -0
- package/dist/repository.js.map +1 -0
- package/dist/search.d.ts +25 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +150 -0
- package/dist/search.js.map +1 -0
- package/dist/types.d.ts +119 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/validator.d.ts +24 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +540 -0
- package/dist/validator.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Validation module
|
|
4
|
+
* Validates entities against schemas
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.validateEntity = validateEntity;
|
|
11
|
+
exports.validateRepository = validateRepository;
|
|
12
|
+
exports.validateAll = validateAll;
|
|
13
|
+
const ajv_1 = __importDefault(require("ajv"));
|
|
14
|
+
const planfs_schema_1 = require("planfs-schema");
|
|
15
|
+
const references_1 = require("./references");
|
|
16
|
+
const ajv = new ajv_1.default({ strict: false, validateFormats: false });
|
|
17
|
+
const schemaValidators = {
|
|
18
|
+
task: ajv.compile(planfs_schema_1.taskSchema),
|
|
19
|
+
epic: ajv.compile(planfs_schema_1.epicSchema),
|
|
20
|
+
milestone: ajv.compile(planfs_schema_1.milestoneSchema),
|
|
21
|
+
decision: ajv.compile(planfs_schema_1.decisionSchema)
|
|
22
|
+
};
|
|
23
|
+
const ALLOWED_METADATA_FIELDS = {
|
|
24
|
+
task: new Set([
|
|
25
|
+
'id',
|
|
26
|
+
'title',
|
|
27
|
+
'status',
|
|
28
|
+
'priority',
|
|
29
|
+
'assignee',
|
|
30
|
+
'epic',
|
|
31
|
+
'milestone',
|
|
32
|
+
'dependsOn',
|
|
33
|
+
'tags',
|
|
34
|
+
'dueDate',
|
|
35
|
+
'estimate',
|
|
36
|
+
'refinementState',
|
|
37
|
+
'backlogOrder',
|
|
38
|
+
'links',
|
|
39
|
+
'archive',
|
|
40
|
+
'createdAt',
|
|
41
|
+
'updatedAt'
|
|
42
|
+
]),
|
|
43
|
+
epic: new Set([
|
|
44
|
+
'id',
|
|
45
|
+
'title',
|
|
46
|
+
'status',
|
|
47
|
+
'priority',
|
|
48
|
+
'owner',
|
|
49
|
+
'description',
|
|
50
|
+
'targetDate',
|
|
51
|
+
'tags',
|
|
52
|
+
'links',
|
|
53
|
+
'archive',
|
|
54
|
+
'createdAt',
|
|
55
|
+
'updatedAt'
|
|
56
|
+
]),
|
|
57
|
+
milestone: new Set([
|
|
58
|
+
'id',
|
|
59
|
+
'title',
|
|
60
|
+
'status',
|
|
61
|
+
'targetDate',
|
|
62
|
+
'description',
|
|
63
|
+
'owner',
|
|
64
|
+
'links',
|
|
65
|
+
'createdAt',
|
|
66
|
+
'updatedAt'
|
|
67
|
+
]),
|
|
68
|
+
decision: new Set([
|
|
69
|
+
'id',
|
|
70
|
+
'title',
|
|
71
|
+
'status',
|
|
72
|
+
'date',
|
|
73
|
+
'context',
|
|
74
|
+
'decision',
|
|
75
|
+
'consequences',
|
|
76
|
+
'author',
|
|
77
|
+
'supersedes',
|
|
78
|
+
'supersededBy',
|
|
79
|
+
'createdAt',
|
|
80
|
+
'updatedAt'
|
|
81
|
+
])
|
|
82
|
+
};
|
|
83
|
+
const STALE_UPDATED_AT_DAYS = 180;
|
|
84
|
+
/**
|
|
85
|
+
* Validate a single entity
|
|
86
|
+
*/
|
|
87
|
+
function validateEntity(entity) {
|
|
88
|
+
const errors = [...entity.diagnostics ?? []];
|
|
89
|
+
const validateSchema = schemaValidators[entity.type];
|
|
90
|
+
if (validateSchema && !validateSchema(entity)) {
|
|
91
|
+
errors.push(...formatSchemaErrors(entity, validateSchema.errors ?? []));
|
|
92
|
+
}
|
|
93
|
+
errors.push(...validateSupportedMetadata(entity));
|
|
94
|
+
// Check required fields
|
|
95
|
+
if (!entity.id) {
|
|
96
|
+
errors.push({
|
|
97
|
+
path: entity.filePath,
|
|
98
|
+
message: `Missing required field 'id' in ${entity.filePath || 'entity'}. Repair by adding an id that matches the file name to YAML frontmatter.`,
|
|
99
|
+
severity: 'error'
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (!entity.title) {
|
|
103
|
+
errors.push({
|
|
104
|
+
id: entity.id,
|
|
105
|
+
path: entity.filePath,
|
|
106
|
+
message: `Missing required field 'title' in ${entity.filePath || entity.id}. Repair by adding title: <short summary> to YAML frontmatter.`,
|
|
107
|
+
severity: 'error'
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
errors.push(...validateTimestamps(entity));
|
|
111
|
+
errors.push(...validateArchiveMetadata(entity));
|
|
112
|
+
// Type-specific validation
|
|
113
|
+
switch (entity.type) {
|
|
114
|
+
case 'task':
|
|
115
|
+
errors.push(...validateTask(entity));
|
|
116
|
+
break;
|
|
117
|
+
case 'epic':
|
|
118
|
+
errors.push(...validateEpic(entity));
|
|
119
|
+
break;
|
|
120
|
+
case 'milestone':
|
|
121
|
+
errors.push(...validateMilestone(entity));
|
|
122
|
+
break;
|
|
123
|
+
case 'decision':
|
|
124
|
+
errors.push(...validateDecision(entity));
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
return errors;
|
|
128
|
+
}
|
|
129
|
+
function validateArchiveMetadata(entity) {
|
|
130
|
+
if (!entity.archive && entity.metadata.archive === undefined) {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
const archive = entity.archive ?? entity.metadata.archive;
|
|
134
|
+
if (typeof archive !== 'object' || archive === null) {
|
|
135
|
+
return [{
|
|
136
|
+
id: entity.id,
|
|
137
|
+
path: entity.filePath,
|
|
138
|
+
message: 'Archive metadata must be an object',
|
|
139
|
+
severity: 'error'
|
|
140
|
+
}];
|
|
141
|
+
}
|
|
142
|
+
const record = archive;
|
|
143
|
+
const errors = [];
|
|
144
|
+
if (typeof record.archivedAt !== 'string' || parseDate(record.archivedAt) === undefined) {
|
|
145
|
+
errors.push({
|
|
146
|
+
id: entity.id,
|
|
147
|
+
path: entity.filePath,
|
|
148
|
+
message: 'Archive metadata archivedAt must be an ISO 8601 timestamp',
|
|
149
|
+
severity: 'error'
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
if (typeof record.originalPath !== 'string' || !record.originalPath.trim()) {
|
|
153
|
+
errors.push({
|
|
154
|
+
id: entity.id,
|
|
155
|
+
path: entity.filePath,
|
|
156
|
+
message: 'Archive metadata originalPath is required',
|
|
157
|
+
severity: 'error'
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
return errors;
|
|
161
|
+
}
|
|
162
|
+
function formatSchemaErrors(entity, schemaErrors) {
|
|
163
|
+
return schemaErrors.map(error => {
|
|
164
|
+
const field = error.instancePath
|
|
165
|
+
? error.instancePath.replace(/^\//, '').replace(/\//g, '.')
|
|
166
|
+
: error.params && 'missingProperty' in error.params
|
|
167
|
+
? String(error.params.missingProperty)
|
|
168
|
+
: 'entity';
|
|
169
|
+
return {
|
|
170
|
+
id: entity.id,
|
|
171
|
+
path: entity.filePath,
|
|
172
|
+
message: `Schema validation failed for ${field}: ${error.message ?? 'invalid value'}`,
|
|
173
|
+
severity: 'error'
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
function validateSupportedMetadata(entity) {
|
|
178
|
+
const allowed = ALLOWED_METADATA_FIELDS[entity.type];
|
|
179
|
+
return Object.keys(entity.metadata ?? {})
|
|
180
|
+
.filter(field => !allowed.has(field))
|
|
181
|
+
.map(field => ({
|
|
182
|
+
id: entity.id,
|
|
183
|
+
path: entity.filePath,
|
|
184
|
+
message: `Unsupported ${entity.type} metadata field: ${field}`,
|
|
185
|
+
severity: 'warning'
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
function validateTimestamps(entity) {
|
|
189
|
+
const errors = [];
|
|
190
|
+
const createdAt = parseDate(entity.createdAt);
|
|
191
|
+
const updatedAt = parseDate(entity.updatedAt);
|
|
192
|
+
if (entity.createdAt && createdAt === undefined) {
|
|
193
|
+
errors.push({
|
|
194
|
+
id: entity.id,
|
|
195
|
+
message: `Invalid createdAt format: ${entity.createdAt}. Must be ISO 8601`,
|
|
196
|
+
severity: 'warning'
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
if (entity.updatedAt && updatedAt === undefined) {
|
|
200
|
+
errors.push({
|
|
201
|
+
id: entity.id,
|
|
202
|
+
message: `Invalid updatedAt format: ${entity.updatedAt}. Must be ISO 8601`,
|
|
203
|
+
severity: 'warning'
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
if (createdAt !== undefined && updatedAt !== undefined && updatedAt < createdAt) {
|
|
207
|
+
errors.push({
|
|
208
|
+
id: entity.id,
|
|
209
|
+
message: `Stale updatedAt: ${entity.updatedAt} is earlier than createdAt ${entity.createdAt}`,
|
|
210
|
+
severity: 'warning'
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
if (entity.type === 'task'
|
|
214
|
+
&& entity.status !== 'done'
|
|
215
|
+
&& entity.updatedAt
|
|
216
|
+
&& isStaleDate(updatedAt, STALE_UPDATED_AT_DAYS)) {
|
|
217
|
+
errors.push({
|
|
218
|
+
id: entity.id,
|
|
219
|
+
message: `Stale updatedAt: open task has not been updated in ${STALE_UPDATED_AT_DAYS} days`,
|
|
220
|
+
severity: 'warning'
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
return errors;
|
|
224
|
+
}
|
|
225
|
+
function validateTask(task) {
|
|
226
|
+
const errors = [];
|
|
227
|
+
// Validate task status
|
|
228
|
+
const validStatuses = ['todo', 'in-progress', 'review', 'done'];
|
|
229
|
+
if (task.status && !validStatuses.includes(task.status)) {
|
|
230
|
+
errors.push({
|
|
231
|
+
id: task.id,
|
|
232
|
+
message: `Invalid task status: ${task.status}. Must be one of: ${validStatuses.join(', ')}`,
|
|
233
|
+
severity: 'error'
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
// Validate priority
|
|
237
|
+
if (task.priority) {
|
|
238
|
+
const validPriorities = ['low', 'medium', 'high', 'critical'];
|
|
239
|
+
if (!validPriorities.includes(task.priority)) {
|
|
240
|
+
errors.push({
|
|
241
|
+
id: task.id,
|
|
242
|
+
message: `Invalid task priority: ${task.priority}. Must be one of: ${validPriorities.join(', ')}`,
|
|
243
|
+
severity: 'error'
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (task.refinementState) {
|
|
248
|
+
const validRefinementStates = ['captured', 'needs-refinement', 'ready', 'deferred', 'discarded'];
|
|
249
|
+
if (!validRefinementStates.includes(task.refinementState)) {
|
|
250
|
+
errors.push({
|
|
251
|
+
id: task.id,
|
|
252
|
+
message: `Invalid refinementState: ${task.refinementState}. Must be one of: ${validRefinementStates.join(', ')}`,
|
|
253
|
+
severity: 'error'
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (task.backlogOrder !== undefined && typeof task.backlogOrder !== 'number') {
|
|
258
|
+
errors.push({
|
|
259
|
+
id: task.id,
|
|
260
|
+
message: 'Task backlogOrder must be a number',
|
|
261
|
+
severity: 'error'
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
// Validate dependencies format
|
|
265
|
+
if (task.dependsOn) {
|
|
266
|
+
if (!Array.isArray(task.dependsOn)) {
|
|
267
|
+
errors.push({
|
|
268
|
+
id: task.id,
|
|
269
|
+
message: 'Task dependsOn must be an array',
|
|
270
|
+
severity: 'error'
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Validate tags format
|
|
275
|
+
if (task.tags) {
|
|
276
|
+
if (!Array.isArray(task.tags)) {
|
|
277
|
+
errors.push({
|
|
278
|
+
id: task.id,
|
|
279
|
+
message: 'Task tags must be an array',
|
|
280
|
+
severity: 'error'
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Validate date format
|
|
285
|
+
if (task.dueDate && !isValidISODate(task.dueDate)) {
|
|
286
|
+
errors.push({
|
|
287
|
+
id: task.id,
|
|
288
|
+
message: `Invalid dueDate format: ${task.dueDate}. Must be ISO 8601`,
|
|
289
|
+
severity: 'warning'
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
return errors;
|
|
293
|
+
}
|
|
294
|
+
function validateEpic(epic) {
|
|
295
|
+
const errors = [];
|
|
296
|
+
// Validate epic status
|
|
297
|
+
const validStatuses = ['active', 'completed', 'on-hold', 'archived'];
|
|
298
|
+
if (epic.status && !validStatuses.includes(epic.status)) {
|
|
299
|
+
errors.push({
|
|
300
|
+
id: epic.id,
|
|
301
|
+
message: `Invalid epic status: ${epic.status}. Must be one of: ${validStatuses.join(', ')}`,
|
|
302
|
+
severity: 'error'
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
// Validate priority
|
|
306
|
+
if (epic.priority) {
|
|
307
|
+
const validPriorities = ['low', 'medium', 'high', 'critical'];
|
|
308
|
+
if (!validPriorities.includes(epic.priority)) {
|
|
309
|
+
errors.push({
|
|
310
|
+
id: epic.id,
|
|
311
|
+
message: `Invalid epic priority: ${epic.priority}. Must be one of: ${validPriorities.join(', ')}`,
|
|
312
|
+
severity: 'error'
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return errors;
|
|
317
|
+
}
|
|
318
|
+
function validateMilestone(milestone) {
|
|
319
|
+
const errors = [];
|
|
320
|
+
// Validate milestone status
|
|
321
|
+
const validStatuses = ['active', 'completed', 'delayed'];
|
|
322
|
+
if (milestone.status && !validStatuses.includes(milestone.status)) {
|
|
323
|
+
errors.push({
|
|
324
|
+
id: milestone.id,
|
|
325
|
+
message: `Invalid milestone status: ${milestone.status}. Must be one of: ${validStatuses.join(', ')}`,
|
|
326
|
+
severity: 'error'
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
// Validate target date
|
|
330
|
+
if (!milestone.targetDate) {
|
|
331
|
+
errors.push({
|
|
332
|
+
id: milestone.id,
|
|
333
|
+
message: 'Milestone targetDate is required',
|
|
334
|
+
severity: 'error'
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
else if (!isValidISODate(milestone.targetDate)) {
|
|
338
|
+
errors.push({
|
|
339
|
+
id: milestone.id,
|
|
340
|
+
message: `Invalid targetDate format: ${milestone.targetDate}. Must be ISO 8601`,
|
|
341
|
+
severity: 'error'
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
return errors;
|
|
345
|
+
}
|
|
346
|
+
function validateDecision(decision) {
|
|
347
|
+
const errors = [];
|
|
348
|
+
// Validate decision status
|
|
349
|
+
const validStatuses = ['proposed', 'accepted', 'rejected', 'superseded'];
|
|
350
|
+
if (decision.status && !validStatuses.includes(decision.status)) {
|
|
351
|
+
errors.push({
|
|
352
|
+
id: decision.id,
|
|
353
|
+
message: `Invalid decision status: ${decision.status}. Must be one of: ${validStatuses.join(', ')}`,
|
|
354
|
+
severity: 'error'
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
return errors;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Validate a collection of entities for global constraints.
|
|
361
|
+
*
|
|
362
|
+
* referenceEntities can satisfy references without participating in duplicate
|
|
363
|
+
* ID or circular dependency checks for the active collection.
|
|
364
|
+
*/
|
|
365
|
+
function validateRepository(entities, options = {}) {
|
|
366
|
+
const errors = [];
|
|
367
|
+
const idMap = new Map((options.referenceEntities ?? []).map(entity => [entity.id, entity]));
|
|
368
|
+
// Check for duplicate IDs
|
|
369
|
+
const seenIds = new Set();
|
|
370
|
+
for (const entity of entities) {
|
|
371
|
+
if (seenIds.has(entity.id)) {
|
|
372
|
+
errors.push({
|
|
373
|
+
id: entity.id,
|
|
374
|
+
path: entity.filePath,
|
|
375
|
+
message: `Duplicate entity ID: ${entity.id}`,
|
|
376
|
+
severity: 'error'
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
seenIds.add(entity.id);
|
|
380
|
+
idMap.set(entity.id, entity);
|
|
381
|
+
}
|
|
382
|
+
// Check references
|
|
383
|
+
for (const entity of entities) {
|
|
384
|
+
const refErrors = checkEntityReferences(entity, idMap);
|
|
385
|
+
errors.push(...refErrors);
|
|
386
|
+
}
|
|
387
|
+
// Check for circular dependencies
|
|
388
|
+
const circularDeps = findCircularDependencies(entities);
|
|
389
|
+
for (const [id, chain] of circularDeps) {
|
|
390
|
+
errors.push({
|
|
391
|
+
id,
|
|
392
|
+
message: `Circular dependency detected: ${chain.join(' -> ')} -> ${id}`,
|
|
393
|
+
severity: 'error'
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
return errors;
|
|
397
|
+
}
|
|
398
|
+
function checkEntityReferences(entity, idMap) {
|
|
399
|
+
const errors = [];
|
|
400
|
+
if (entity.type === 'task') {
|
|
401
|
+
const task = entity;
|
|
402
|
+
// Check epic reference
|
|
403
|
+
if (task.epic && !idMap.has(task.epic)) {
|
|
404
|
+
errors.push({
|
|
405
|
+
id: task.id,
|
|
406
|
+
message: `Referenced epic not found: ${task.epic}`,
|
|
407
|
+
severity: 'error'
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
else if (task.epic) {
|
|
411
|
+
const epic = idMap.get(task.epic);
|
|
412
|
+
if ((0, references_1.isArchivedReference)(epic)) {
|
|
413
|
+
errors.push({
|
|
414
|
+
id: task.id,
|
|
415
|
+
message: `Task references archived epic: ${task.epic}`,
|
|
416
|
+
severity: 'warning'
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
else if (epic.status === 'completed' || epic.status === 'archived') {
|
|
420
|
+
errors.push({
|
|
421
|
+
id: task.id,
|
|
422
|
+
message: `Task references ${epic.status} epic: ${task.epic}`,
|
|
423
|
+
severity: 'warning'
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
// Check milestone reference
|
|
428
|
+
if (task.milestone && !idMap.has(task.milestone)) {
|
|
429
|
+
errors.push({
|
|
430
|
+
id: task.id,
|
|
431
|
+
message: `Referenced milestone not found: ${task.milestone}`,
|
|
432
|
+
severity: 'error'
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
else if (task.milestone) {
|
|
436
|
+
const milestone = idMap.get(task.milestone);
|
|
437
|
+
if (milestone.status === 'completed' || milestone.status === 'delayed') {
|
|
438
|
+
errors.push({
|
|
439
|
+
id: task.id,
|
|
440
|
+
message: `Task references ${milestone.status} milestone: ${task.milestone}`,
|
|
441
|
+
severity: 'warning'
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
// Check dependencies
|
|
446
|
+
if (task.dependsOn) {
|
|
447
|
+
for (const dep of task.dependsOn) {
|
|
448
|
+
const dependency = idMap.get(dep);
|
|
449
|
+
if (!dependency) {
|
|
450
|
+
errors.push({
|
|
451
|
+
id: task.id,
|
|
452
|
+
message: `Referenced task not found: ${dep}`,
|
|
453
|
+
severity: 'error'
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
else if ((0, references_1.isArchivedReference)(dependency)) {
|
|
457
|
+
errors.push({
|
|
458
|
+
id: task.id,
|
|
459
|
+
message: `Task depends on archived task: ${dep}`,
|
|
460
|
+
severity: 'warning'
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
return errors;
|
|
467
|
+
}
|
|
468
|
+
function findCircularDependencies(entities) {
|
|
469
|
+
const circularDeps = new Map();
|
|
470
|
+
const taskMap = new Map();
|
|
471
|
+
// Build task map
|
|
472
|
+
for (const entity of entities) {
|
|
473
|
+
if (entity.type === 'task') {
|
|
474
|
+
taskMap.set(entity.id, entity);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
// DFS to find cycles
|
|
478
|
+
for (const taskId of taskMap.keys()) {
|
|
479
|
+
const cycle = findCycle(taskId, taskMap, new Set(), []);
|
|
480
|
+
if (cycle) {
|
|
481
|
+
circularDeps.set(taskId, cycle);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
return circularDeps;
|
|
485
|
+
}
|
|
486
|
+
function findCycle(nodeId, taskMap, visiting, path) {
|
|
487
|
+
if (visiting.has(nodeId)) {
|
|
488
|
+
const cycleStart = path.indexOf(nodeId);
|
|
489
|
+
return cycleStart >= 0 ? path.slice(cycleStart) : path;
|
|
490
|
+
}
|
|
491
|
+
const task = taskMap.get(nodeId);
|
|
492
|
+
if (!task) {
|
|
493
|
+
return undefined;
|
|
494
|
+
}
|
|
495
|
+
visiting.add(nodeId);
|
|
496
|
+
path.push(nodeId);
|
|
497
|
+
for (const dep of task.dependsOn ?? []) {
|
|
498
|
+
const cycle = findCycle(dep, taskMap, new Set(visiting), [...path]);
|
|
499
|
+
if (cycle) {
|
|
500
|
+
return cycle;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
return undefined;
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* Check if a string is a valid ISO 8601 date
|
|
507
|
+
*/
|
|
508
|
+
function isValidISODate(dateString) {
|
|
509
|
+
return parseDate(dateString) !== undefined;
|
|
510
|
+
}
|
|
511
|
+
function parseDate(dateString) {
|
|
512
|
+
if (!dateString) {
|
|
513
|
+
return undefined;
|
|
514
|
+
}
|
|
515
|
+
const date = new Date(dateString);
|
|
516
|
+
return isNaN(date.getTime()) ? undefined : date.getTime();
|
|
517
|
+
}
|
|
518
|
+
function isStaleDate(value, staleAfterDays) {
|
|
519
|
+
if (value === undefined) {
|
|
520
|
+
return true;
|
|
521
|
+
}
|
|
522
|
+
return Date.now() - value >= staleAfterDays * 86400000;
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Validate all entities and return comprehensive result
|
|
526
|
+
*/
|
|
527
|
+
function validateAll(entities) {
|
|
528
|
+
const errors = [];
|
|
529
|
+
// Validate individual entities
|
|
530
|
+
for (const entity of entities) {
|
|
531
|
+
errors.push(...validateEntity(entity));
|
|
532
|
+
}
|
|
533
|
+
// Validate repository constraints
|
|
534
|
+
errors.push(...validateRepository(entities));
|
|
535
|
+
return {
|
|
536
|
+
valid: !errors.some(e => e.severity === 'error'),
|
|
537
|
+
errors
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "planfs-core",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Core parsing and validation library for PlanFS",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md",
|
|
10
|
+
"LICENSE*"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"build:watch": "tsc --watch",
|
|
15
|
+
"build:types": "tsc --emitDeclarationOnly",
|
|
16
|
+
"test": "jest",
|
|
17
|
+
"test:watch": "jest --watch",
|
|
18
|
+
"test:coverage": "jest --coverage",
|
|
19
|
+
"lint": "eslint src --ext .ts",
|
|
20
|
+
"clean": "rm -rf dist coverage"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"planfs",
|
|
24
|
+
"parsing",
|
|
25
|
+
"validation",
|
|
26
|
+
"yaml",
|
|
27
|
+
"markdown"
|
|
28
|
+
],
|
|
29
|
+
"author": "",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"ajv": "^8.12.0",
|
|
33
|
+
"planfs-schema": "1.2.0",
|
|
34
|
+
"yaml": "^2.3.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/jest": "^30.0.0",
|
|
38
|
+
"@types/node": "^18.16.0",
|
|
39
|
+
"@typescript-eslint/eslint-plugin": "^8.61.1",
|
|
40
|
+
"@typescript-eslint/parser": "^8.61.1",
|
|
41
|
+
"eslint": "^8.57.0",
|
|
42
|
+
"jest": "^30.4.2",
|
|
43
|
+
"ts-jest": "^29.4.11",
|
|
44
|
+
"typescript": "^5.0.0"
|
|
45
|
+
}
|
|
46
|
+
}
|