-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathvalidate-sequence.js
More file actions
136 lines (116 loc) · 4.57 KB
/
validate-sequence.js
File metadata and controls
136 lines (116 loc) · 4.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/usr/bin/env node
/**
* Simple validation script to check if sequence JSON is well-formed
*/
const fs = require('fs');
const path = require('path');
try {
// Load schema
const schemaPath = path.join(__dirname, 'schemas', 'musical-sequence.schema.json');
const schema = JSON.parse(fs.readFileSync(schemaPath, 'utf8'));
console.log('✓ Schema loaded successfully');
// Load sequence
const sequencePath = path.join(__dirname, 'sequences', 'hybrid-resume-generation.sequence.json');
const sequence = JSON.parse(fs.readFileSync(sequencePath, 'utf8'));
console.log('✓ Sequence loaded successfully');
// Basic validation
console.log('\n=== Sequence Information ===');
console.log('ID:', sequence.id);
console.log('Domain:', sequence.domainId);
console.log('Name:', sequence.name);
console.log('Status:', sequence.status);
console.log('Movements:', sequence.movements.length);
// Count beats
let totalBeats = 0;
sequence.movements.forEach((movement, i) => {
console.log(` Movement ${i+1}: ${movement.name} (${movement.beats.length} beats)`);
totalBeats += movement.beats.length;
});
console.log('Total beats:', totalBeats);
// Check required fields
console.log('\n=== Required Field Validation ===');
const requiredFields = ['domainId', 'id', 'name', 'movements', 'userStory'];
const missingFields = requiredFields.filter(f => !(f in sequence));
if (missingFields.length === 0) {
console.log('✓ All required top-level fields present');
} else {
console.error('✗ Missing required fields:', missingFields);
process.exit(1);
}
// Validate movements
console.log('\n=== Movement Validation ===');
const requiredMovementFields = ['name', 'beats', 'userStory'];
let movementErrors = [];
sequence.movements.forEach((movement, i) => {
const missing = requiredMovementFields.filter(f => !(f in movement));
if (missing.length > 0) {
movementErrors.push(`Movement ${i+1} (${movement.name || 'unnamed'}) missing: ${missing.join(', ')}`);
}
});
if (movementErrors.length === 0) {
console.log('✓ All movements have required fields');
} else {
console.error('✗ Movement errors:');
movementErrors.forEach(e => console.error(' -', e));
process.exit(1);
}
// Validate beats
console.log('\n=== Beat Validation ===');
const requiredBeatFields = ['event', 'userStory', 'acceptanceCriteria', 'testFile'];
let beatErrors = [];
sequence.movements.forEach((movement, mIdx) => {
movement.beats.forEach((beat, bIdx) => {
const missing = requiredBeatFields.filter(f => !(f in beat));
if (missing.length > 0) {
beatErrors.push(
`Movement "${movement.name}" -> Beat ${bIdx+1} (${beat.name || 'unnamed'}) missing: ${missing.join(', ')}`
);
}
});
});
if (beatErrors.length === 0) {
console.log('✓ All beats have required fields');
} else {
console.error('✗ Beat errors:');
beatErrors.forEach(e => console.error(' -', e));
process.exit(1);
}
// Validate user stories
console.log('\n=== User Story Validation ===');
const userStoryFields = ['persona', 'goal', 'benefit'];
let userStoryErrors = [];
// Check sequence-level user story
const seqStoryMissing = userStoryFields.filter(f => !(f in (sequence.userStory || {})));
if (seqStoryMissing.length > 0) {
userStoryErrors.push(`Sequence-level userStory missing: ${seqStoryMissing.join(', ')}`);
}
// Check movement user stories
sequence.movements.forEach((movement, mIdx) => {
const movStoryMissing = userStoryFields.filter(f => !(f in (movement.userStory || {})));
if (movStoryMissing.length > 0) {
userStoryErrors.push(`Movement "${movement.name}" userStory missing: ${movStoryMissing.join(', ')}`);
}
// Check beat user stories
movement.beats.forEach((beat, bIdx) => {
const beatStoryMissing = userStoryFields.filter(f => !(f in (beat.userStory || {})));
if (beatStoryMissing.length > 0) {
userStoryErrors.push(
`Movement "${movement.name}" -> Beat "${beat.name}" userStory missing: ${beatStoryMissing.join(', ')}`
);
}
});
});
if (userStoryErrors.length === 0) {
console.log('✓ All user stories have required fields (persona, goal, benefit)');
} else {
console.error('✗ User story errors:');
userStoryErrors.forEach(e => console.error(' -', e));
process.exit(1);
}
console.log('\n✓✓✓ All validations passed! ✓✓✓\n');
process.exit(0);
} catch (error) {
console.error('\n✗✗✗ Validation failed! ✗✗✗');
console.error('Error:', error.message);
process.exit(1);
}