faf-cli 3.0.6 → 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.
Files changed (106) hide show
  1. package/README.md +200 -18
  2. package/assets/screenshots/package-json+project-faf.png +0 -0
  3. package/dist/big-orange/compare.d.ts.map +1 -1
  4. package/dist/big-orange/compare.js +14 -16
  5. package/dist/big-orange/compare.js.map +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +137 -1
  8. package/dist/cli.js.map +1 -1
  9. package/dist/commands/auto.d.ts.map +1 -1
  10. package/dist/commands/auto.js +69 -12
  11. package/dist/commands/auto.js.map +1 -1
  12. package/dist/commands/bi-sync.d.ts.map +1 -1
  13. package/dist/commands/bi-sync.js +10 -3
  14. package/dist/commands/bi-sync.js.map +1 -1
  15. package/dist/commands/drift.d.ts +16 -0
  16. package/dist/commands/drift.d.ts.map +1 -0
  17. package/dist/commands/drift.js +517 -0
  18. package/dist/commands/drift.js.map +1 -0
  19. package/dist/commands/git.d.ts +25 -0
  20. package/dist/commands/git.d.ts.map +1 -0
  21. package/dist/commands/git.js +355 -0
  22. package/dist/commands/git.js.map +1 -0
  23. package/dist/commands/init.d.ts.map +1 -1
  24. package/dist/commands/init.js +5 -4
  25. package/dist/commands/init.js.map +1 -1
  26. package/dist/commands/migrate.d.ts +11 -0
  27. package/dist/commands/migrate.d.ts.map +1 -0
  28. package/dist/commands/migrate.js +85 -0
  29. package/dist/commands/migrate.js.map +1 -0
  30. package/dist/commands/rename.d.ts +18 -0
  31. package/dist/commands/rename.d.ts.map +1 -0
  32. package/dist/commands/rename.js +211 -0
  33. package/dist/commands/rename.js.map +1 -0
  34. package/dist/commands/taf-init.d.ts +14 -0
  35. package/dist/commands/taf-init.d.ts.map +1 -0
  36. package/dist/commands/taf-init.js +138 -0
  37. package/dist/commands/taf-init.js.map +1 -0
  38. package/dist/commands/taf-log.d.ts +27 -0
  39. package/dist/commands/taf-log.d.ts.map +1 -0
  40. package/dist/commands/taf-log.js +241 -0
  41. package/dist/commands/taf-log.js.map +1 -0
  42. package/dist/commands/taf-stats.d.ts +8 -0
  43. package/dist/commands/taf-stats.d.ts.map +1 -0
  44. package/dist/commands/taf-stats.js +133 -0
  45. package/dist/commands/taf-stats.js.map +1 -0
  46. package/dist/commands/taf-validate.d.ts +8 -0
  47. package/dist/commands/taf-validate.d.ts.map +1 -0
  48. package/dist/commands/taf-validate.js +108 -0
  49. package/dist/commands/taf-validate.js.map +1 -0
  50. package/dist/commands/taf.d.ts +13 -0
  51. package/dist/commands/taf.d.ts.map +1 -0
  52. package/dist/commands/taf.js +85 -0
  53. package/dist/commands/taf.js.map +1 -0
  54. package/dist/compiler/faf-compiler.d.ts.map +1 -1
  55. package/dist/compiler/faf-compiler.js +18 -0
  56. package/dist/compiler/faf-compiler.js.map +1 -1
  57. package/dist/generators/faf-generator-championship.d.ts.map +1 -1
  58. package/dist/generators/faf-generator-championship.js +1 -0
  59. package/dist/generators/faf-generator-championship.js.map +1 -1
  60. package/dist/github/github-extractor.d.ts +56 -0
  61. package/dist/github/github-extractor.d.ts.map +1 -0
  62. package/dist/github/github-extractor.js +328 -0
  63. package/dist/github/github-extractor.js.map +1 -0
  64. package/dist/github/popular-repos.d.ts +43 -0
  65. package/dist/github/popular-repos.d.ts.map +1 -0
  66. package/dist/github/popular-repos.js +205 -0
  67. package/dist/github/popular-repos.js.map +1 -0
  68. package/dist/github/repo-selector.d.ts +48 -0
  69. package/dist/github/repo-selector.d.ts.map +1 -0
  70. package/dist/github/repo-selector.js +277 -0
  71. package/dist/github/repo-selector.js.map +1 -0
  72. package/dist/taf/index.d.ts +17 -0
  73. package/dist/taf/index.d.ts.map +1 -0
  74. package/dist/taf/index.js +57 -0
  75. package/dist/taf/index.js.map +1 -0
  76. package/dist/taf/logger.d.ts +86 -0
  77. package/dist/taf/logger.d.ts.map +1 -0
  78. package/dist/taf/logger.js +135 -0
  79. package/dist/taf/logger.js.map +1 -0
  80. package/dist/taf/parser.d.ts +32 -0
  81. package/dist/taf/parser.d.ts.map +1 -0
  82. package/dist/taf/parser.js +161 -0
  83. package/dist/taf/parser.js.map +1 -0
  84. package/dist/taf/stats.d.ts +31 -0
  85. package/dist/taf/stats.d.ts.map +1 -0
  86. package/dist/taf/stats.js +182 -0
  87. package/dist/taf/stats.js.map +1 -0
  88. package/dist/taf/types.d.ts +66 -0
  89. package/dist/taf/types.d.ts.map +1 -0
  90. package/dist/taf/types.js +9 -0
  91. package/dist/taf/types.js.map +1 -0
  92. package/dist/taf/validator.d.ts +18 -0
  93. package/dist/taf/validator.d.ts.map +1 -0
  94. package/dist/taf/validator.js +148 -0
  95. package/dist/taf/validator.js.map +1 -0
  96. package/dist/utils/file-utils.d.ts +10 -0
  97. package/dist/utils/file-utils.d.ts.map +1 -1
  98. package/dist/utils/file-utils.js +196 -33
  99. package/dist/utils/file-utils.js.map +1 -1
  100. package/dist/utils/native-file-finder.js +1 -1
  101. package/dist/utils/native-file-finder.js.map +1 -1
  102. package/dist/utils/yaml-generator.d.ts +1 -0
  103. package/dist/utils/yaml-generator.d.ts.map +1 -1
  104. package/dist/utils/yaml-generator.js +1 -0
  105. package/dist/utils/yaml-generator.js.map +1 -1
  106. package/package.json +9 -4
@@ -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;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+DxB;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;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,GAAE,MAAsB,GACjC,OAAO,CAAC,MAAM,CAAC,CA0GjB;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"}
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"}