aiag-cli 1.5.1 → 1.6.3
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 +11 -11
- package/dist/cli.js +10 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/auto.d.ts +1 -0
- package/dist/commands/auto.d.ts.map +1 -1
- package/dist/commands/auto.js +896 -59
- package/dist/commands/auto.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +21 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/validate.d.ts +10 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +59 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/utils/output.d.ts +1 -0
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +1 -0
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/validation.d.ts +27 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +303 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
const VALID_CATEGORIES = [
|
|
2
|
+
'core',
|
|
3
|
+
'cli',
|
|
4
|
+
'api',
|
|
5
|
+
'ui',
|
|
6
|
+
'auth',
|
|
7
|
+
'data',
|
|
8
|
+
'test',
|
|
9
|
+
'docs',
|
|
10
|
+
'devops',
|
|
11
|
+
'claude',
|
|
12
|
+
'agent',
|
|
13
|
+
'feature',
|
|
14
|
+
];
|
|
15
|
+
const VALID_PRIORITIES = ['critical', 'high', 'medium', 'low'];
|
|
16
|
+
/**
|
|
17
|
+
* Validate a single feature
|
|
18
|
+
*/
|
|
19
|
+
export function validateFeature(feature, allFeatures) {
|
|
20
|
+
const issues = [];
|
|
21
|
+
// 1. ID 검증
|
|
22
|
+
if (!feature.id || feature.id.trim() === '') {
|
|
23
|
+
issues.push({
|
|
24
|
+
featureId: feature.id,
|
|
25
|
+
severity: 'error',
|
|
26
|
+
category: 'structure',
|
|
27
|
+
message: 'Feature ID is required',
|
|
28
|
+
suggestion: 'Add a unique ID like "FEATURE-001"',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
else if (!/^[A-Z]+-\d+$/.test(feature.id)) {
|
|
32
|
+
issues.push({
|
|
33
|
+
featureId: feature.id,
|
|
34
|
+
severity: 'warning',
|
|
35
|
+
category: 'structure',
|
|
36
|
+
message: `Feature ID "${feature.id}" does not follow naming convention`,
|
|
37
|
+
suggestion: 'Use format: CATEGORY-NNN (e.g., AUTH-001, API-042)',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
// 2. Description 검증
|
|
41
|
+
if (!feature.description || feature.description.trim() === '') {
|
|
42
|
+
issues.push({
|
|
43
|
+
featureId: feature.id,
|
|
44
|
+
severity: 'error',
|
|
45
|
+
category: 'content',
|
|
46
|
+
message: 'Feature description is required',
|
|
47
|
+
suggestion: 'Add a clear, concise description of what this feature does',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
else if (feature.description.length < 10) {
|
|
51
|
+
issues.push({
|
|
52
|
+
featureId: feature.id,
|
|
53
|
+
severity: 'warning',
|
|
54
|
+
category: 'content',
|
|
55
|
+
message: 'Feature description is too short',
|
|
56
|
+
suggestion: 'Provide a more detailed description (at least 10 characters)',
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// 3. Category 검증
|
|
60
|
+
if (!feature.category) {
|
|
61
|
+
issues.push({
|
|
62
|
+
featureId: feature.id,
|
|
63
|
+
severity: 'error',
|
|
64
|
+
category: 'structure',
|
|
65
|
+
message: 'Feature category is required',
|
|
66
|
+
suggestion: `Use one of: ${VALID_CATEGORIES.join(', ')}`,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
else if (!VALID_CATEGORIES.includes(feature.category)) {
|
|
70
|
+
issues.push({
|
|
71
|
+
featureId: feature.id,
|
|
72
|
+
severity: 'error',
|
|
73
|
+
category: 'structure',
|
|
74
|
+
message: `Invalid category "${feature.category}"`,
|
|
75
|
+
suggestion: `Use one of: ${VALID_CATEGORIES.join(', ')}`,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// 4. Priority 검증
|
|
79
|
+
if (!feature.priority) {
|
|
80
|
+
issues.push({
|
|
81
|
+
featureId: feature.id,
|
|
82
|
+
severity: 'error',
|
|
83
|
+
category: 'structure',
|
|
84
|
+
message: 'Feature priority is required',
|
|
85
|
+
suggestion: `Use one of: ${VALID_PRIORITIES.join(', ')}`,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
else if (!VALID_PRIORITIES.includes(feature.priority)) {
|
|
89
|
+
issues.push({
|
|
90
|
+
featureId: feature.id,
|
|
91
|
+
severity: 'error',
|
|
92
|
+
category: 'structure',
|
|
93
|
+
message: `Invalid priority "${feature.priority}"`,
|
|
94
|
+
suggestion: `Use one of: ${VALID_PRIORITIES.join(', ')}`,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// 5. Acceptance Criteria 검증
|
|
98
|
+
if (!feature.acceptanceCriteria || feature.acceptanceCriteria.length === 0) {
|
|
99
|
+
issues.push({
|
|
100
|
+
featureId: feature.id,
|
|
101
|
+
severity: 'error',
|
|
102
|
+
category: 'content',
|
|
103
|
+
message: 'At least one acceptance criterion is required',
|
|
104
|
+
suggestion: 'Add specific, testable acceptance criteria',
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// 각 criterion이 비어있지 않은지 확인
|
|
109
|
+
feature.acceptanceCriteria.forEach((criterion, index) => {
|
|
110
|
+
if (!criterion || criterion.trim() === '') {
|
|
111
|
+
issues.push({
|
|
112
|
+
featureId: feature.id,
|
|
113
|
+
severity: 'error',
|
|
114
|
+
category: 'content',
|
|
115
|
+
message: `Acceptance criterion #${index + 1} is empty`,
|
|
116
|
+
suggestion: 'Remove empty criteria or add meaningful content',
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
// 너무 적은 경우 경고
|
|
121
|
+
if (feature.acceptanceCriteria.length < 2) {
|
|
122
|
+
issues.push({
|
|
123
|
+
featureId: feature.id,
|
|
124
|
+
severity: 'info',
|
|
125
|
+
category: 'content',
|
|
126
|
+
message: 'Consider adding more acceptance criteria',
|
|
127
|
+
suggestion: 'Features typically have 2-5 specific criteria',
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// 6. Dependencies 검증
|
|
132
|
+
if (feature.dependsOn && feature.dependsOn.length > 0) {
|
|
133
|
+
feature.dependsOn.forEach((depId) => {
|
|
134
|
+
const depFeature = allFeatures.find((f) => f.id === depId);
|
|
135
|
+
if (!depFeature) {
|
|
136
|
+
issues.push({
|
|
137
|
+
featureId: feature.id,
|
|
138
|
+
severity: 'error',
|
|
139
|
+
category: 'dependency',
|
|
140
|
+
message: `Dependency "${depId}" does not exist`,
|
|
141
|
+
suggestion: 'Check that the dependency ID is correct, or remove it',
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
else if (depFeature.id === feature.id) {
|
|
145
|
+
issues.push({
|
|
146
|
+
featureId: feature.id,
|
|
147
|
+
severity: 'error',
|
|
148
|
+
category: 'dependency',
|
|
149
|
+
message: 'Feature cannot depend on itself',
|
|
150
|
+
suggestion: 'Remove self-dependency',
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
// 순환 의존성 검증 (간단한 체크)
|
|
155
|
+
if (hasCircularDependency(feature, allFeatures)) {
|
|
156
|
+
issues.push({
|
|
157
|
+
featureId: feature.id,
|
|
158
|
+
severity: 'error',
|
|
159
|
+
category: 'dependency',
|
|
160
|
+
message: 'Circular dependency detected',
|
|
161
|
+
suggestion: 'Review dependency chain and break the cycle',
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// 7. Test Command 검증
|
|
166
|
+
if (!feature.testCommand || feature.testCommand.trim() === '') {
|
|
167
|
+
issues.push({
|
|
168
|
+
featureId: feature.id,
|
|
169
|
+
severity: 'info',
|
|
170
|
+
category: 'content',
|
|
171
|
+
message: 'No test command specified',
|
|
172
|
+
suggestion: 'Add a test command (defaults to "bun test")',
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
return issues;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Validate entire feature list
|
|
179
|
+
*/
|
|
180
|
+
export function validateFeatureList(featureList) {
|
|
181
|
+
const allIssues = [];
|
|
182
|
+
// 1. 전체 구조 검증
|
|
183
|
+
if (!featureList.features || !Array.isArray(featureList.features)) {
|
|
184
|
+
allIssues.push({
|
|
185
|
+
severity: 'error',
|
|
186
|
+
category: 'structure',
|
|
187
|
+
message: 'Feature list must have a "features" array',
|
|
188
|
+
suggestion: 'Ensure feature_list.json has correct structure',
|
|
189
|
+
});
|
|
190
|
+
return {
|
|
191
|
+
valid: false,
|
|
192
|
+
issues: allIssues,
|
|
193
|
+
warnings: [],
|
|
194
|
+
infos: [],
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
if (featureList.features.length === 0) {
|
|
198
|
+
allIssues.push({
|
|
199
|
+
severity: 'warning',
|
|
200
|
+
category: 'content',
|
|
201
|
+
message: 'Feature list is empty',
|
|
202
|
+
suggestion: 'Add features to the list',
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// 2. ID 중복 검증
|
|
206
|
+
const idSet = new Set();
|
|
207
|
+
featureList.features.forEach((feature) => {
|
|
208
|
+
if (idSet.has(feature.id)) {
|
|
209
|
+
allIssues.push({
|
|
210
|
+
featureId: feature.id,
|
|
211
|
+
severity: 'error',
|
|
212
|
+
category: 'structure',
|
|
213
|
+
message: `Duplicate feature ID: ${feature.id}`,
|
|
214
|
+
suggestion: 'Each feature must have a unique ID',
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
idSet.add(feature.id);
|
|
218
|
+
});
|
|
219
|
+
// 3. 각 Feature 검증
|
|
220
|
+
featureList.features.forEach((feature) => {
|
|
221
|
+
const featureIssues = validateFeature(feature, featureList.features);
|
|
222
|
+
allIssues.push(...featureIssues);
|
|
223
|
+
});
|
|
224
|
+
// 4. 분류
|
|
225
|
+
const errors = allIssues.filter((i) => i.severity === 'error');
|
|
226
|
+
const warnings = allIssues.filter((i) => i.severity === 'warning');
|
|
227
|
+
const infos = allIssues.filter((i) => i.severity === 'info');
|
|
228
|
+
return {
|
|
229
|
+
valid: errors.length === 0,
|
|
230
|
+
issues: errors,
|
|
231
|
+
warnings,
|
|
232
|
+
infos,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Check for circular dependencies (simple DFS)
|
|
237
|
+
*/
|
|
238
|
+
function hasCircularDependency(feature, allFeatures) {
|
|
239
|
+
const visited = new Set();
|
|
240
|
+
const recursionStack = new Set();
|
|
241
|
+
function dfs(currentId) {
|
|
242
|
+
if (recursionStack.has(currentId)) {
|
|
243
|
+
return true; // Circular dependency found
|
|
244
|
+
}
|
|
245
|
+
if (visited.has(currentId)) {
|
|
246
|
+
return false; // Already checked this path
|
|
247
|
+
}
|
|
248
|
+
visited.add(currentId);
|
|
249
|
+
recursionStack.add(currentId);
|
|
250
|
+
const current = allFeatures.find((f) => f.id === currentId);
|
|
251
|
+
if (current && current.dependsOn) {
|
|
252
|
+
for (const depId of current.dependsOn) {
|
|
253
|
+
if (dfs(depId)) {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
recursionStack.delete(currentId);
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
return dfs(feature.id);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Format validation issues for console output
|
|
265
|
+
*/
|
|
266
|
+
export function formatValidationIssues(result) {
|
|
267
|
+
const lines = [];
|
|
268
|
+
if (result.issues.length > 0) {
|
|
269
|
+
lines.push('❌ Errors:');
|
|
270
|
+
result.issues.forEach((issue) => {
|
|
271
|
+
const prefix = issue.featureId ? ` [${issue.featureId}]` : ' [global]';
|
|
272
|
+
lines.push(`${prefix} ${issue.message}`);
|
|
273
|
+
if (issue.suggestion) {
|
|
274
|
+
lines.push(` 💡 ${issue.suggestion}`);
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
lines.push('');
|
|
278
|
+
}
|
|
279
|
+
if (result.warnings.length > 0) {
|
|
280
|
+
lines.push('⚠️ Warnings:');
|
|
281
|
+
result.warnings.forEach((issue) => {
|
|
282
|
+
const prefix = issue.featureId ? ` [${issue.featureId}]` : ' [global]';
|
|
283
|
+
lines.push(`${prefix} ${issue.message}`);
|
|
284
|
+
if (issue.suggestion) {
|
|
285
|
+
lines.push(` 💡 ${issue.suggestion}`);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
lines.push('');
|
|
289
|
+
}
|
|
290
|
+
if (result.infos.length > 0) {
|
|
291
|
+
lines.push('ℹ️ Info:');
|
|
292
|
+
result.infos.forEach((issue) => {
|
|
293
|
+
const prefix = issue.featureId ? ` [${issue.featureId}]` : ' [global]';
|
|
294
|
+
lines.push(`${prefix} ${issue.message}`);
|
|
295
|
+
if (issue.suggestion) {
|
|
296
|
+
lines.push(` 💡 ${issue.suggestion}`);
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
lines.push('');
|
|
300
|
+
}
|
|
301
|
+
return lines;
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|