faf-cli 3.0.5 → 3.1.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 +238 -24
- package/assets/screenshots/package-json+project-faf.png +0 -0
- package/dist/big-orange/bigo-push.d.ts +18 -0
- package/dist/big-orange/bigo-push.d.ts.map +1 -0
- package/dist/big-orange/bigo-push.js +88 -0
- package/dist/big-orange/bigo-push.js.map +1 -0
- package/dist/big-orange/compare.d.ts +11 -0
- package/dist/big-orange/compare.d.ts.map +1 -0
- package/dist/big-orange/compare.js +172 -0
- package/dist/big-orange/compare.js.map +1 -0
- package/dist/big-orange/faf-generator.d.ts +22 -0
- package/dist/big-orange/faf-generator.d.ts.map +1 -0
- package/dist/big-orange/faf-generator.js +215 -0
- package/dist/big-orange/faf-generator.js.map +1 -0
- package/dist/big-orange/index.d.ts +7 -0
- package/dist/big-orange/index.d.ts.map +1 -0
- package/dist/big-orange/index.js +96 -0
- package/dist/big-orange/index.js.map +1 -0
- package/dist/big-orange/types.d.ts +62 -0
- package/dist/big-orange/types.d.ts.map +1 -0
- package/dist/big-orange/types.js +7 -0
- package/dist/big-orange/types.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +137 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/auto.d.ts.map +1 -1
- package/dist/commands/auto.js +69 -12
- package/dist/commands/auto.js.map +1 -1
- package/dist/commands/bi-sync.d.ts.map +1 -1
- package/dist/commands/bi-sync.js +10 -3
- package/dist/commands/bi-sync.js.map +1 -1
- package/dist/commands/drift.d.ts +16 -0
- package/dist/commands/drift.d.ts.map +1 -0
- package/dist/commands/drift.js +517 -0
- package/dist/commands/drift.js.map +1 -0
- package/dist/commands/git.d.ts +25 -0
- package/dist/commands/git.d.ts.map +1 -0
- package/dist/commands/git.js +355 -0
- package/dist/commands/git.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +5 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate.d.ts +11 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +85 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/rename.d.ts +18 -0
- package/dist/commands/rename.d.ts.map +1 -0
- package/dist/commands/rename.js +211 -0
- package/dist/commands/rename.js.map +1 -0
- package/dist/commands/taf-init.d.ts +14 -0
- package/dist/commands/taf-init.d.ts.map +1 -0
- package/dist/commands/taf-init.js +138 -0
- package/dist/commands/taf-init.js.map +1 -0
- package/dist/commands/taf-log.d.ts +27 -0
- package/dist/commands/taf-log.d.ts.map +1 -0
- package/dist/commands/taf-log.js +241 -0
- package/dist/commands/taf-log.js.map +1 -0
- package/dist/commands/taf-stats.d.ts +8 -0
- package/dist/commands/taf-stats.d.ts.map +1 -0
- package/dist/commands/taf-stats.js +133 -0
- package/dist/commands/taf-stats.js.map +1 -0
- package/dist/commands/taf-validate.d.ts +8 -0
- package/dist/commands/taf-validate.d.ts.map +1 -0
- package/dist/commands/taf-validate.js +108 -0
- package/dist/commands/taf-validate.js.map +1 -0
- package/dist/commands/taf.d.ts +13 -0
- package/dist/commands/taf.d.ts.map +1 -0
- package/dist/commands/taf.js +85 -0
- package/dist/commands/taf.js.map +1 -0
- package/dist/compiler/faf-compiler.d.ts.map +1 -1
- package/dist/compiler/faf-compiler.js +18 -0
- package/dist/compiler/faf-compiler.js.map +1 -1
- package/dist/generators/faf-generator-championship.d.ts.map +1 -1
- package/dist/generators/faf-generator-championship.js +1 -0
- package/dist/generators/faf-generator-championship.js.map +1 -1
- package/dist/github/github-extractor.d.ts +56 -0
- package/dist/github/github-extractor.d.ts.map +1 -0
- package/dist/github/github-extractor.js +328 -0
- package/dist/github/github-extractor.js.map +1 -0
- package/dist/github/popular-repos.d.ts +43 -0
- package/dist/github/popular-repos.d.ts.map +1 -0
- package/dist/github/popular-repos.js +205 -0
- package/dist/github/popular-repos.js.map +1 -0
- package/dist/github/repo-selector.d.ts +48 -0
- package/dist/github/repo-selector.d.ts.map +1 -0
- package/dist/github/repo-selector.js +277 -0
- package/dist/github/repo-selector.js.map +1 -0
- package/dist/taf/index.d.ts +17 -0
- package/dist/taf/index.d.ts.map +1 -0
- package/dist/taf/index.js +57 -0
- package/dist/taf/index.js.map +1 -0
- package/dist/taf/logger.d.ts +86 -0
- package/dist/taf/logger.d.ts.map +1 -0
- package/dist/taf/logger.js +135 -0
- package/dist/taf/logger.js.map +1 -0
- package/dist/taf/parser.d.ts +32 -0
- package/dist/taf/parser.d.ts.map +1 -0
- package/dist/taf/parser.js +161 -0
- package/dist/taf/parser.js.map +1 -0
- package/dist/taf/stats.d.ts +31 -0
- package/dist/taf/stats.d.ts.map +1 -0
- package/dist/taf/stats.js +182 -0
- package/dist/taf/stats.js.map +1 -0
- package/dist/taf/types.d.ts +66 -0
- package/dist/taf/types.d.ts.map +1 -0
- package/dist/taf/types.js +9 -0
- package/dist/taf/types.js.map +1 -0
- package/dist/taf/validator.d.ts +18 -0
- package/dist/taf/validator.d.ts.map +1 -0
- package/dist/taf/validator.js +148 -0
- package/dist/taf/validator.js.map +1 -0
- package/dist/utils/file-utils.d.ts +10 -0
- package/dist/utils/file-utils.d.ts.map +1 -1
- package/dist/utils/file-utils.js +196 -33
- package/dist/utils/file-utils.js.map +1 -1
- package/dist/utils/native-file-finder.js +1 -1
- package/dist/utils/native-file-finder.js.map +1 -1
- package/dist/utils/yaml-generator.d.ts +1 -0
- package/dist/utils/yaml-generator.d.ts.map +1 -1
- package/dist/utils/yaml-generator.js +1 -0
- package/dist/utils/yaml-generator.js.map +1 -1
- package/package.json +12 -4
- package/dist/commands/create.d.ts +0 -13
- package/dist/commands/create.d.ts.map +0 -1
- package/dist/commands/create.js +0 -78
- package/dist/commands/create.js.map +0 -1
- package/dist/core/platform-adapters.d.ts +0 -76
- package/dist/core/platform-adapters.d.ts.map +0 -1
- package/dist/core/platform-adapters.js +0 -407
- package/dist/core/platform-adapters.js.map +0 -1
- package/dist/core/universal-intelligence-generator.d.ts +0 -156
- package/dist/core/universal-intelligence-generator.d.ts.map +0 -1
- package/dist/core/universal-intelligence-generator.js +0 -352
- package/dist/core/universal-intelligence-generator.js.map +0 -1
- package/dist/enrichment/auto-corrector.d.ts +0 -28
- package/dist/enrichment/auto-corrector.d.ts.map +0 -1
- package/dist/enrichment/auto-corrector.js +0 -106
- package/dist/enrichment/auto-corrector.js.map +0 -1
- package/dist/enrichment/n8n-analyzer.d.ts +0 -259
- package/dist/enrichment/n8n-analyzer.d.ts.map +0 -1
- package/dist/enrichment/n8n-analyzer.js +0 -346
- package/dist/enrichment/n8n-analyzer.js.map +0 -1
- package/dist/enrichment/n8n-faf-generator.d.ts +0 -68
- package/dist/enrichment/n8n-faf-generator.d.ts.map +0 -1
- package/dist/enrichment/n8n-faf-generator.js +0 -354
- package/dist/enrichment/n8n-faf-generator.js.map +0 -1
- package/dist/enrichment/question-asker.d.ts +0 -22
- package/dist/enrichment/question-asker.d.ts.map +0 -1
- package/dist/enrichment/question-asker.js +0 -113
- package/dist/enrichment/question-asker.js.map +0 -1
- package/dist/enrichment/slot-filler.d.ts +0 -73
- package/dist/enrichment/slot-filler.d.ts.map +0 -1
- package/dist/enrichment/slot-filler.js +0 -253
- package/dist/enrichment/slot-filler.js.map +0 -1
- package/dist/scoring/championship-scorer.d.ts +0 -114
- package/dist/scoring/championship-scorer.d.ts.map +0 -1
- package/dist/scoring/championship-scorer.js +0 -380
- package/dist/scoring/championship-scorer.js.map +0 -1
- package/dist/scoring/score-calculator.d.ts +0 -29
- package/dist/scoring/score-calculator.d.ts.map +0 -1
- package/dist/scoring/score-calculator.js +0 -520
- package/dist/scoring/score-calculator.js.map +0 -1
- package/dist/tests/manual-validation.d.ts +0 -8
- package/dist/tests/manual-validation.d.ts.map +0 -1
- package/dist/tests/manual-validation.js +0 -114
- package/dist/tests/manual-validation.js.map +0 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TAF Stats Calculator - MCP-portable statistics
|
|
4
|
+
*
|
|
5
|
+
* Pure functions for calculating test statistics
|
|
6
|
+
* Ready for MCP extraction
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.calculateStats = calculateStats;
|
|
10
|
+
exports.calculateScoreContribution = calculateScoreContribution;
|
|
11
|
+
exports.getPassRateTrend = getPassRateTrend;
|
|
12
|
+
exports.getFailurePatterns = getFailurePatterns;
|
|
13
|
+
/**
|
|
14
|
+
* Calculate statistics from TAF file
|
|
15
|
+
* MCP-portable: pure function
|
|
16
|
+
*/
|
|
17
|
+
function calculateStats(taf) {
|
|
18
|
+
const runs = taf.test_history;
|
|
19
|
+
const total_runs = runs.length;
|
|
20
|
+
if (total_runs === 0) {
|
|
21
|
+
return {
|
|
22
|
+
total_runs: 0,
|
|
23
|
+
pass_rate: '0%',
|
|
24
|
+
health_score: '🤍',
|
|
25
|
+
current_streak: 0,
|
|
26
|
+
longest_streak: 0,
|
|
27
|
+
total_failures: 0,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// Calculate pass rate
|
|
31
|
+
const passes = runs.filter(r => r.result === 'PASSED').length;
|
|
32
|
+
const pass_rate_decimal = passes / total_runs;
|
|
33
|
+
const pass_rate = `${Math.round(pass_rate_decimal * 100)}%`;
|
|
34
|
+
// Calculate health score (podium emoji)
|
|
35
|
+
const health_score = getHealthScore(pass_rate_decimal);
|
|
36
|
+
// Calculate streaks
|
|
37
|
+
let current_streak = 0;
|
|
38
|
+
let longest_streak = 0;
|
|
39
|
+
let temp_streak = 0;
|
|
40
|
+
for (let i = runs.length - 1; i >= 0; i--) {
|
|
41
|
+
if (runs[i].result === 'PASSED') {
|
|
42
|
+
temp_streak++;
|
|
43
|
+
if (i === runs.length - 1) {
|
|
44
|
+
current_streak = temp_streak;
|
|
45
|
+
}
|
|
46
|
+
longest_streak = Math.max(longest_streak, temp_streak);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
if (i < runs.length - 1) {
|
|
50
|
+
break; // Stop counting current streak
|
|
51
|
+
}
|
|
52
|
+
temp_streak = 0;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Count total failures
|
|
56
|
+
const total_failures = runs.filter(r => r.result === 'FAILED').length;
|
|
57
|
+
// Calculate average recovery time
|
|
58
|
+
const recovery_times = [];
|
|
59
|
+
for (const run of runs) {
|
|
60
|
+
if (run.recovery?.time_to_fix_minutes) {
|
|
61
|
+
recovery_times.push(run.recovery.time_to_fix_minutes);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const avg_recovery_time_minutes = recovery_times.length > 0
|
|
65
|
+
? Math.round(recovery_times.reduce((sum, t) => sum + t, 0) / recovery_times.length)
|
|
66
|
+
: undefined;
|
|
67
|
+
// Last run timestamp
|
|
68
|
+
const last_run = runs[runs.length - 1]?.timestamp;
|
|
69
|
+
return {
|
|
70
|
+
total_runs,
|
|
71
|
+
pass_rate,
|
|
72
|
+
health_score,
|
|
73
|
+
last_run,
|
|
74
|
+
current_streak,
|
|
75
|
+
longest_streak,
|
|
76
|
+
total_failures,
|
|
77
|
+
avg_recovery_time_minutes,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Calculate .taf contribution to .faf AI-readiness score
|
|
82
|
+
* MCP-portable: pure function
|
|
83
|
+
*/
|
|
84
|
+
function calculateScoreContribution(taf) {
|
|
85
|
+
let taf_present = 5; // File exists
|
|
86
|
+
let taf_validated = 0;
|
|
87
|
+
let pass_rate_bonus = 0;
|
|
88
|
+
// Validate structure
|
|
89
|
+
if (taf.format_version && taf.project && taf.created && Array.isArray(taf.test_history)) {
|
|
90
|
+
taf_validated = 5;
|
|
91
|
+
}
|
|
92
|
+
// Check pass rate
|
|
93
|
+
if (taf.test_history.length > 0) {
|
|
94
|
+
const stats = calculateStats(taf);
|
|
95
|
+
const pass_rate_num = parseInt(stats.pass_rate.replace('%', ''));
|
|
96
|
+
if (pass_rate_num > 80) {
|
|
97
|
+
pass_rate_bonus = 5;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
taf_present,
|
|
102
|
+
taf_validated,
|
|
103
|
+
pass_rate_bonus,
|
|
104
|
+
total: taf_present + taf_validated + pass_rate_bonus,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get health score emoji based on pass rate
|
|
109
|
+
* MCP-portable: pure function
|
|
110
|
+
*/
|
|
111
|
+
function getHealthScore(pass_rate) {
|
|
112
|
+
if (pass_rate >= 0.95)
|
|
113
|
+
return '🏆'; // Trophy: 95%+
|
|
114
|
+
if (pass_rate >= 0.85)
|
|
115
|
+
return '🥇'; // Gold: 85%+
|
|
116
|
+
if (pass_rate >= 0.70)
|
|
117
|
+
return '🥈'; // Silver: 70%+
|
|
118
|
+
if (pass_rate >= 0.50)
|
|
119
|
+
return '🥉'; // Bronze: 50%+
|
|
120
|
+
return '🤍'; // White heart: <50%
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get pass rate trend (improving/declining/stable)
|
|
124
|
+
* MCP-portable: pure function
|
|
125
|
+
*/
|
|
126
|
+
function getPassRateTrend(taf, window = 10) {
|
|
127
|
+
const runs = taf.test_history;
|
|
128
|
+
if (runs.length < 2)
|
|
129
|
+
return 'stable';
|
|
130
|
+
const recent = runs.slice(-window);
|
|
131
|
+
const older = runs.slice(-window * 2, -window);
|
|
132
|
+
if (older.length === 0)
|
|
133
|
+
return 'stable';
|
|
134
|
+
const recentPassRate = recent.filter(r => r.result === 'PASSED').length / recent.length;
|
|
135
|
+
const olderPassRate = older.filter(r => r.result === 'PASSED').length / older.length;
|
|
136
|
+
const diff = recentPassRate - olderPassRate;
|
|
137
|
+
if (diff > 0.1)
|
|
138
|
+
return 'improving';
|
|
139
|
+
if (diff < -0.1)
|
|
140
|
+
return 'declining';
|
|
141
|
+
return 'stable';
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get failure patterns for WJTTC analysis
|
|
145
|
+
* MCP-portable: pure function
|
|
146
|
+
*/
|
|
147
|
+
function getFailurePatterns(taf) {
|
|
148
|
+
const issues = {};
|
|
149
|
+
const hourCounts = {};
|
|
150
|
+
for (const run of taf.test_history) {
|
|
151
|
+
// Count issues
|
|
152
|
+
if (run.issues) {
|
|
153
|
+
for (const issue of run.issues) {
|
|
154
|
+
issues[issue] = (issues[issue] || 0) + 1;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Count failures by hour
|
|
158
|
+
const hour = new Date(run.timestamp).getHours();
|
|
159
|
+
if (!hourCounts[hour]) {
|
|
160
|
+
hourCounts[hour] = { total: 0, failures: 0 };
|
|
161
|
+
}
|
|
162
|
+
hourCounts[hour].total++;
|
|
163
|
+
if (run.result === 'FAILED') {
|
|
164
|
+
hourCounts[hour].failures++;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Sort issues by frequency
|
|
168
|
+
const most_common_issues = Object.entries(issues)
|
|
169
|
+
.sort((a, b) => b[1] - a[1])
|
|
170
|
+
.slice(0, 5)
|
|
171
|
+
.map(([issue]) => issue);
|
|
172
|
+
// Calculate failure rate by hour
|
|
173
|
+
const failure_rate_by_hour = {};
|
|
174
|
+
for (const [hour, counts] of Object.entries(hourCounts)) {
|
|
175
|
+
failure_rate_by_hour[parseInt(hour)] = counts.failures / counts.total;
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
most_common_issues,
|
|
179
|
+
failure_rate_by_hour,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/taf/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TAF (Testing Activity Feed) Core Types
|
|
3
|
+
*
|
|
4
|
+
* MCP-portable type definitions for .taf format
|
|
5
|
+
* Used by: faf-cli, claude-faf-mcp, claude-taf-mcp (future)
|
|
6
|
+
*/
|
|
7
|
+
export interface TAFFile {
|
|
8
|
+
format_version: string;
|
|
9
|
+
project: string;
|
|
10
|
+
created: string;
|
|
11
|
+
last_updated?: string;
|
|
12
|
+
faf_associated?: boolean;
|
|
13
|
+
faf_location?: string;
|
|
14
|
+
faf_score?: number;
|
|
15
|
+
test_history: TestRun[];
|
|
16
|
+
}
|
|
17
|
+
export interface TestRun {
|
|
18
|
+
timestamp: string;
|
|
19
|
+
run_id?: string;
|
|
20
|
+
command?: string;
|
|
21
|
+
trigger?: string;
|
|
22
|
+
result: TestResult;
|
|
23
|
+
suites?: TestCounts;
|
|
24
|
+
tests: TestCounts;
|
|
25
|
+
duration_ms?: number;
|
|
26
|
+
exit_code?: number;
|
|
27
|
+
issues?: string[];
|
|
28
|
+
root_cause?: string;
|
|
29
|
+
resolution?: string;
|
|
30
|
+
changes_since_last?: string[];
|
|
31
|
+
recovery?: RecoveryInfo;
|
|
32
|
+
}
|
|
33
|
+
export interface TestCounts {
|
|
34
|
+
total: number;
|
|
35
|
+
passed: number;
|
|
36
|
+
failed: number;
|
|
37
|
+
skipped?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface RecoveryInfo {
|
|
40
|
+
previous_result?: TestResult;
|
|
41
|
+
time_to_fix_minutes?: number;
|
|
42
|
+
fix_summary?: string;
|
|
43
|
+
}
|
|
44
|
+
export type TestResult = 'PASSED' | 'FAILED' | 'IMPROVED' | 'DEGRADED';
|
|
45
|
+
export interface TAFStats {
|
|
46
|
+
total_runs: number;
|
|
47
|
+
pass_rate: string;
|
|
48
|
+
health_score: string;
|
|
49
|
+
last_run?: string;
|
|
50
|
+
current_streak: number;
|
|
51
|
+
longest_streak: number;
|
|
52
|
+
total_failures: number;
|
|
53
|
+
avg_recovery_time_minutes?: number;
|
|
54
|
+
}
|
|
55
|
+
export interface TAFValidationResult {
|
|
56
|
+
valid: boolean;
|
|
57
|
+
errors: string[];
|
|
58
|
+
warnings: string[];
|
|
59
|
+
}
|
|
60
|
+
export interface TAFScoreContribution {
|
|
61
|
+
taf_present: number;
|
|
62
|
+
taf_validated: number;
|
|
63
|
+
pass_rate_bonus: number;
|
|
64
|
+
total: number;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/taf/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,OAAO;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,YAAY,EAAE,OAAO,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IAGnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAGlB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IAGnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG9B,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,eAAe,CAAC,EAAE,UAAU,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AAEvE,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TAF (Testing Activity Feed) Core Types
|
|
4
|
+
*
|
|
5
|
+
* MCP-portable type definitions for .taf format
|
|
6
|
+
* Used by: faf-cli, claude-faf-mcp, claude-taf-mcp (future)
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/taf/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TAF Validator - MCP-portable validation logic
|
|
3
|
+
*
|
|
4
|
+
* Pure validation functions with no external dependencies
|
|
5
|
+
* Ready for MCP extraction
|
|
6
|
+
*/
|
|
7
|
+
import { TAFFile, TAFValidationResult } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Validate TAF file structure and content
|
|
10
|
+
* MCP-portable: pure function
|
|
11
|
+
*/
|
|
12
|
+
export declare function validateTAF(taf: TAFFile): TAFValidationResult;
|
|
13
|
+
/**
|
|
14
|
+
* Quick validation check (for MCP tools)
|
|
15
|
+
* Returns true if .taf file is valid, false otherwise
|
|
16
|
+
*/
|
|
17
|
+
export declare function isTAFValid(taf: TAFFile): boolean;
|
|
18
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/taf/validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAW,MAAM,SAAS,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,mBAAmB,CA6D7D;AA0ED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAGhD"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TAF Validator - MCP-portable validation logic
|
|
4
|
+
*
|
|
5
|
+
* Pure validation functions with no external dependencies
|
|
6
|
+
* Ready for MCP extraction
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.validateTAF = validateTAF;
|
|
10
|
+
exports.isTAFValid = isTAFValid;
|
|
11
|
+
/**
|
|
12
|
+
* Validate TAF file structure and content
|
|
13
|
+
* MCP-portable: pure function
|
|
14
|
+
*/
|
|
15
|
+
function validateTAF(taf) {
|
|
16
|
+
const errors = [];
|
|
17
|
+
const warnings = [];
|
|
18
|
+
// Required fields
|
|
19
|
+
if (!taf.format_version) {
|
|
20
|
+
errors.push('Missing required field: format_version');
|
|
21
|
+
}
|
|
22
|
+
else if (taf.format_version !== '1.0.0') {
|
|
23
|
+
warnings.push(`Unknown format_version: ${taf.format_version}`);
|
|
24
|
+
}
|
|
25
|
+
if (!taf.project) {
|
|
26
|
+
errors.push('Missing required field: project');
|
|
27
|
+
}
|
|
28
|
+
if (!taf.created) {
|
|
29
|
+
errors.push('Missing required field: created');
|
|
30
|
+
}
|
|
31
|
+
else if (!isValidISO8601(taf.created)) {
|
|
32
|
+
errors.push(`Invalid ISO8601 timestamp: created = ${taf.created}`);
|
|
33
|
+
}
|
|
34
|
+
if (taf.last_updated && !isValidISO8601(taf.last_updated)) {
|
|
35
|
+
errors.push(`Invalid ISO8601 timestamp: last_updated = ${taf.last_updated}`);
|
|
36
|
+
}
|
|
37
|
+
// FAF integration fields
|
|
38
|
+
if (taf.faf_associated === true) {
|
|
39
|
+
if (!taf.faf_location) {
|
|
40
|
+
warnings.push('faf_associated is true but faf_location not specified');
|
|
41
|
+
}
|
|
42
|
+
if (taf.faf_score !== undefined && (taf.faf_score < 0 || taf.faf_score > 100)) {
|
|
43
|
+
errors.push(`Invalid faf_score: ${taf.faf_score} (must be 0-100)`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Test history
|
|
47
|
+
if (!taf.test_history) {
|
|
48
|
+
errors.push('Missing required field: test_history');
|
|
49
|
+
}
|
|
50
|
+
else if (!Array.isArray(taf.test_history)) {
|
|
51
|
+
errors.push('test_history must be an array');
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
taf.test_history.forEach((run, index) => {
|
|
55
|
+
const runErrors = validateTestRun(run, index);
|
|
56
|
+
errors.push(...runErrors);
|
|
57
|
+
});
|
|
58
|
+
// Check chronological order
|
|
59
|
+
for (let i = 1; i < taf.test_history.length; i++) {
|
|
60
|
+
const prev = new Date(taf.test_history[i - 1].timestamp);
|
|
61
|
+
const curr = new Date(taf.test_history[i].timestamp);
|
|
62
|
+
if (curr < prev) {
|
|
63
|
+
warnings.push(`Test run ${i} timestamp is before previous run (not chronological)`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
valid: errors.length === 0,
|
|
69
|
+
errors,
|
|
70
|
+
warnings,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Validate individual test run
|
|
75
|
+
* MCP-portable: pure function
|
|
76
|
+
*/
|
|
77
|
+
function validateTestRun(run, index) {
|
|
78
|
+
const errors = [];
|
|
79
|
+
if (!run.timestamp) {
|
|
80
|
+
errors.push(`Test run ${index}: missing timestamp`);
|
|
81
|
+
}
|
|
82
|
+
else if (!isValidISO8601(run.timestamp)) {
|
|
83
|
+
errors.push(`Test run ${index}: invalid ISO8601 timestamp`);
|
|
84
|
+
}
|
|
85
|
+
if (!run.result) {
|
|
86
|
+
errors.push(`Test run ${index}: missing result`);
|
|
87
|
+
}
|
|
88
|
+
else if (!['PASSED', 'FAILED', 'IMPROVED', 'DEGRADED'].includes(run.result)) {
|
|
89
|
+
errors.push(`Test run ${index}: invalid result "${run.result}"`);
|
|
90
|
+
}
|
|
91
|
+
if (!run.tests) {
|
|
92
|
+
errors.push(`Test run ${index}: missing tests field`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
if (typeof run.tests.total !== 'number' || run.tests.total < 0) {
|
|
96
|
+
errors.push(`Test run ${index}: invalid tests.total`);
|
|
97
|
+
}
|
|
98
|
+
if (typeof run.tests.passed !== 'number' || run.tests.passed < 0) {
|
|
99
|
+
errors.push(`Test run ${index}: invalid tests.passed`);
|
|
100
|
+
}
|
|
101
|
+
if (typeof run.tests.failed !== 'number' || run.tests.failed < 0) {
|
|
102
|
+
errors.push(`Test run ${index}: invalid tests.failed`);
|
|
103
|
+
}
|
|
104
|
+
// Check consistency
|
|
105
|
+
const sum = run.tests.passed + run.tests.failed + (run.tests.skipped || 0);
|
|
106
|
+
if (sum !== run.tests.total) {
|
|
107
|
+
errors.push(`Test run ${index}: tests counts don't add up (${sum} !== ${run.tests.total})`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (run.suites) {
|
|
111
|
+
if (typeof run.suites.total !== 'number' || run.suites.total < 0) {
|
|
112
|
+
errors.push(`Test run ${index}: invalid suites.total`);
|
|
113
|
+
}
|
|
114
|
+
if (typeof run.suites.passed !== 'number' || run.suites.passed < 0) {
|
|
115
|
+
errors.push(`Test run ${index}: invalid suites.passed`);
|
|
116
|
+
}
|
|
117
|
+
if (typeof run.suites.failed !== 'number' || run.suites.failed < 0) {
|
|
118
|
+
errors.push(`Test run ${index}: invalid suites.failed`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (run.duration_ms !== undefined && (typeof run.duration_ms !== 'number' || run.duration_ms < 0)) {
|
|
122
|
+
errors.push(`Test run ${index}: invalid duration_ms`);
|
|
123
|
+
}
|
|
124
|
+
return errors;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Validate ISO8601 timestamp format
|
|
128
|
+
* MCP-portable: pure function
|
|
129
|
+
*/
|
|
130
|
+
function isValidISO8601(timestamp) {
|
|
131
|
+
try {
|
|
132
|
+
const date = new Date(timestamp);
|
|
133
|
+
// Check if it's a valid date and roughly ISO8601 format
|
|
134
|
+
return !isNaN(date.getTime()) && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(timestamp);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Quick validation check (for MCP tools)
|
|
142
|
+
* Returns true if .taf file is valid, false otherwise
|
|
143
|
+
*/
|
|
144
|
+
function isTAFValid(taf) {
|
|
145
|
+
const result = validateTAF(taf);
|
|
146
|
+
return result.valid;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/taf/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
/**
|
|
6
6
|
* Find .faf file in current directory or parent directories
|
|
7
|
+
*
|
|
8
|
+
* v1.2.0: Prioritizes project.faf (standard) over .faf (legacy)
|
|
7
9
|
*/
|
|
8
10
|
export declare function findFafFile(startDir?: string): Promise<string | null>;
|
|
9
11
|
/**
|
|
@@ -86,6 +88,14 @@ export declare function findOpalMiniApps(projectDir?: string): Promise<string[]>
|
|
|
86
88
|
export declare function findOpenAIAssistants(projectDir?: string): Promise<string[]>;
|
|
87
89
|
/**
|
|
88
90
|
* Detect project type from files and structure
|
|
91
|
+
*
|
|
92
|
+
* CHAMPIONSHIP DETECTION STRATEGY:
|
|
93
|
+
* 1. 😽 TURBO-CAT: Format discovery (finds config files)
|
|
94
|
+
* 2. 🛂 TSA: Dependency intelligence (analyzes actual usage)
|
|
95
|
+
* 3. Cross-reference both engines for definitive answer
|
|
96
|
+
* 4. Fallback to file patterns if engines unavailable
|
|
97
|
+
*
|
|
98
|
+
* Goal: Championship-grade detection using existing engines
|
|
89
99
|
*/
|
|
90
100
|
export declare function detectProjectType(projectDir?: string): Promise<string>;
|
|
91
101
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH
|
|
1
|
+
{"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqExB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAO3E;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAiCnC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe,EAAE,OAAO,GAAG,QAAQ,GAAG,cAAc,GAAG,aAAa,CAAC;IACrE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,EAAE,MAAM,EAAE,CAAC;IACnC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kBAAkB,EAAE,UAAU,GAAG,cAAc,GAAG,aAAa,CAAC;CACjE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,GAAE,MAAsB,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,GAAE,MAAsB,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BnB;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,GAAE,MAAsB,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BnB;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,GAAE,MAAsB,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,GAAE,MAAsB,GACjC,OAAO,CAAC,MAAM,CAAC,CAqPjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAIpD;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAejB;AA+CD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,MAAM,CAAC,CAwDjB"}
|