faf-cli 3.0.6 → 3.1.1

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 (105) hide show
  1. package/README.md +275 -25
  2. package/dist/big-orange/compare.d.ts.map +1 -1
  3. package/dist/big-orange/compare.js +14 -16
  4. package/dist/big-orange/compare.js.map +1 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +137 -1
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/auto.d.ts.map +1 -1
  9. package/dist/commands/auto.js +69 -12
  10. package/dist/commands/auto.js.map +1 -1
  11. package/dist/commands/bi-sync.d.ts.map +1 -1
  12. package/dist/commands/bi-sync.js +10 -3
  13. package/dist/commands/bi-sync.js.map +1 -1
  14. package/dist/commands/drift.d.ts +16 -0
  15. package/dist/commands/drift.d.ts.map +1 -0
  16. package/dist/commands/drift.js +517 -0
  17. package/dist/commands/drift.js.map +1 -0
  18. package/dist/commands/git.d.ts +25 -0
  19. package/dist/commands/git.d.ts.map +1 -0
  20. package/dist/commands/git.js +355 -0
  21. package/dist/commands/git.js.map +1 -0
  22. package/dist/commands/init.d.ts.map +1 -1
  23. package/dist/commands/init.js +5 -4
  24. package/dist/commands/init.js.map +1 -1
  25. package/dist/commands/migrate.d.ts +11 -0
  26. package/dist/commands/migrate.d.ts.map +1 -0
  27. package/dist/commands/migrate.js +85 -0
  28. package/dist/commands/migrate.js.map +1 -0
  29. package/dist/commands/rename.d.ts +18 -0
  30. package/dist/commands/rename.d.ts.map +1 -0
  31. package/dist/commands/rename.js +211 -0
  32. package/dist/commands/rename.js.map +1 -0
  33. package/dist/commands/taf-init.d.ts +14 -0
  34. package/dist/commands/taf-init.d.ts.map +1 -0
  35. package/dist/commands/taf-init.js +138 -0
  36. package/dist/commands/taf-init.js.map +1 -0
  37. package/dist/commands/taf-log.d.ts +30 -0
  38. package/dist/commands/taf-log.d.ts.map +1 -0
  39. package/dist/commands/taf-log.js +303 -0
  40. package/dist/commands/taf-log.js.map +1 -0
  41. package/dist/commands/taf-stats.d.ts +8 -0
  42. package/dist/commands/taf-stats.d.ts.map +1 -0
  43. package/dist/commands/taf-stats.js +133 -0
  44. package/dist/commands/taf-stats.js.map +1 -0
  45. package/dist/commands/taf-validate.d.ts +8 -0
  46. package/dist/commands/taf-validate.d.ts.map +1 -0
  47. package/dist/commands/taf-validate.js +108 -0
  48. package/dist/commands/taf-validate.js.map +1 -0
  49. package/dist/commands/taf.d.ts +13 -0
  50. package/dist/commands/taf.d.ts.map +1 -0
  51. package/dist/commands/taf.js +97 -0
  52. package/dist/commands/taf.js.map +1 -0
  53. package/dist/compiler/faf-compiler.d.ts.map +1 -1
  54. package/dist/compiler/faf-compiler.js +18 -0
  55. package/dist/compiler/faf-compiler.js.map +1 -1
  56. package/dist/generators/faf-generator-championship.d.ts.map +1 -1
  57. package/dist/generators/faf-generator-championship.js +1 -0
  58. package/dist/generators/faf-generator-championship.js.map +1 -1
  59. package/dist/github/github-extractor.d.ts +56 -0
  60. package/dist/github/github-extractor.d.ts.map +1 -0
  61. package/dist/github/github-extractor.js +328 -0
  62. package/dist/github/github-extractor.js.map +1 -0
  63. package/dist/github/popular-repos.d.ts +43 -0
  64. package/dist/github/popular-repos.d.ts.map +1 -0
  65. package/dist/github/popular-repos.js +205 -0
  66. package/dist/github/popular-repos.js.map +1 -0
  67. package/dist/github/repo-selector.d.ts +48 -0
  68. package/dist/github/repo-selector.d.ts.map +1 -0
  69. package/dist/github/repo-selector.js +277 -0
  70. package/dist/github/repo-selector.js.map +1 -0
  71. package/dist/taf/index.d.ts +17 -0
  72. package/dist/taf/index.d.ts.map +1 -0
  73. package/dist/taf/index.js +57 -0
  74. package/dist/taf/index.js.map +1 -0
  75. package/dist/taf/logger.d.ts +88 -0
  76. package/dist/taf/logger.d.ts.map +1 -0
  77. package/dist/taf/logger.js +137 -0
  78. package/dist/taf/logger.js.map +1 -0
  79. package/dist/taf/parser.d.ts +32 -0
  80. package/dist/taf/parser.d.ts.map +1 -0
  81. package/dist/taf/parser.js +161 -0
  82. package/dist/taf/parser.js.map +1 -0
  83. package/dist/taf/stats.d.ts +31 -0
  84. package/dist/taf/stats.d.ts.map +1 -0
  85. package/dist/taf/stats.js +182 -0
  86. package/dist/taf/stats.js.map +1 -0
  87. package/dist/taf/types.d.ts +77 -0
  88. package/dist/taf/types.d.ts.map +1 -0
  89. package/dist/taf/types.js +9 -0
  90. package/dist/taf/types.js.map +1 -0
  91. package/dist/taf/validator.d.ts +18 -0
  92. package/dist/taf/validator.d.ts.map +1 -0
  93. package/dist/taf/validator.js +148 -0
  94. package/dist/taf/validator.js.map +1 -0
  95. package/dist/utils/file-utils.d.ts +10 -0
  96. package/dist/utils/file-utils.d.ts.map +1 -1
  97. package/dist/utils/file-utils.js +196 -33
  98. package/dist/utils/file-utils.js.map +1 -1
  99. package/dist/utils/native-file-finder.js +1 -1
  100. package/dist/utils/native-file-finder.js.map +1 -1
  101. package/dist/utils/yaml-generator.d.ts +1 -0
  102. package/dist/utils/yaml-generator.d.ts.map +1 -1
  103. package/dist/utils/yaml-generator.js +1 -0
  104. package/dist/utils/yaml-generator.js.map +1 -1
  105. package/package.json +9 -4
@@ -0,0 +1,303 @@
1
+ "use strict";
2
+ /**
3
+ * faf taf log - Log a test run
4
+ *
5
+ * Appends a test run entry to .taf file
6
+ * Supports both minimal and detailed modes
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.tafLog = tafLog;
43
+ exports.runTAFLog = runTAFLog;
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const taf_1 = require("../taf");
47
+ async function tafLog(options = {}) {
48
+ const tafPath = path.join(process.cwd(), '.taf');
49
+ // Check if .taf exists
50
+ if (!fs.existsSync(tafPath)) {
51
+ console.error('❌ No .taf file found');
52
+ console.log('\nRun: faf taf init');
53
+ process.exit(1);
54
+ }
55
+ // Read and parse
56
+ let taf;
57
+ try {
58
+ const content = fs.readFileSync(tafPath, 'utf-8');
59
+ taf = (0, taf_1.parseTAF)(content);
60
+ }
61
+ catch (error) {
62
+ console.error('❌ Failed to parse .taf file');
63
+ if (error instanceof Error) {
64
+ console.error(`\n${error.message}`);
65
+ }
66
+ process.exit(1);
67
+ }
68
+ // Validate required fields
69
+ if (options.total === undefined || options.passed === undefined || options.failed === undefined) {
70
+ console.error('❌ Missing required test counts');
71
+ console.log('\nRequired: --total, --passed, --failed');
72
+ console.log('Example: faf taf log --total 173 --passed 173 --failed 0');
73
+ process.exit(1);
74
+ }
75
+ // Validate input types and values
76
+ const total = options.total;
77
+ const passed = options.passed;
78
+ const failed = options.failed;
79
+ const skipped = options.skipped || 0;
80
+ // Check for NaN
81
+ if (isNaN(total) || isNaN(passed) || isNaN(failed) || isNaN(skipped)) {
82
+ console.error('❌ Invalid input: test counts must be numbers');
83
+ console.log('\nExample: faf taf log --total 173 --passed 173 --failed 0');
84
+ process.exit(1);
85
+ }
86
+ // Check for negative numbers
87
+ if (total < 0 || passed < 0 || failed < 0 || skipped < 0) {
88
+ console.error('❌ Invalid input: test counts cannot be negative');
89
+ console.log(`\nReceived: total=${total}, passed=${passed}, failed=${failed}, skipped=${skipped}`);
90
+ process.exit(1);
91
+ }
92
+ // Check for integers
93
+ if (!Number.isInteger(total) || !Number.isInteger(passed) || !Number.isInteger(failed) || !Number.isInteger(skipped)) {
94
+ console.error('❌ Invalid input: test counts must be integers');
95
+ console.log(`\nReceived: total=${total}, passed=${passed}, failed=${failed}, skipped=${skipped}`);
96
+ process.exit(1);
97
+ }
98
+ // Check math: passed + failed + skipped should equal total
99
+ const sum = passed + failed + skipped;
100
+ if (sum !== total) {
101
+ console.error('❌ Invalid input: test counts do not add up');
102
+ console.log(`\nPassed (${passed}) + Failed (${failed}) + Skipped (${skipped}) = ${sum}`);
103
+ console.log(`But total is ${total}`);
104
+ console.log('\nThe numbers must add up correctly.');
105
+ process.exit(1);
106
+ }
107
+ // Check logical constraints
108
+ if (passed > total) {
109
+ console.error('❌ Invalid input: passed tests cannot exceed total tests');
110
+ console.log(`\nPassed: ${passed}, Total: ${total}`);
111
+ process.exit(1);
112
+ }
113
+ if (failed > total) {
114
+ console.error('❌ Invalid input: failed tests cannot exceed total tests');
115
+ console.log(`\nFailed: ${failed}, Total: ${total}`);
116
+ process.exit(1);
117
+ }
118
+ // Detect result if not provided
119
+ const previousRun = taf.test_history[taf.test_history.length - 1];
120
+ const result = options.result || (0, taf_1.detectResult)({ passed: options.passed, total: options.total }, previousRun ? { passed: previousRun.tests.passed, total: previousRun.tests.total } : undefined);
121
+ // Build environment info if variance detected
122
+ let environment;
123
+ if (options.env_variance || options.env_notes || options.environment) {
124
+ environment = options.environment || {
125
+ variance: options.env_variance ? [{
126
+ type: options.env_variance,
127
+ description: getVarianceDescription(options.env_variance),
128
+ detected_at: new Date().toISOString(),
129
+ }] : undefined,
130
+ notes: options.env_notes,
131
+ };
132
+ }
133
+ // Create test run entry
134
+ const run = options.minimal
135
+ ? (0, taf_1.createMinimalRun)({
136
+ result,
137
+ total: options.total,
138
+ passed: options.passed,
139
+ failed: options.failed,
140
+ skipped: options.skipped,
141
+ environment,
142
+ })
143
+ : (0, taf_1.createDetailedRun)({
144
+ result,
145
+ command: options.command,
146
+ trigger: options.trigger,
147
+ tests: {
148
+ total: options.total,
149
+ passed: options.passed,
150
+ failed: options.failed,
151
+ skipped: options.skipped,
152
+ },
153
+ issues: options.issues,
154
+ root_cause: options.root_cause,
155
+ resolution: options.resolution,
156
+ environment,
157
+ });
158
+ // Append to TAF
159
+ const updatedTAF = (0, taf_1.appendTestRun)(taf, run);
160
+ // Serialize and format
161
+ const content = (0, taf_1.formatTAF)((0, taf_1.serializeTAF)(updatedTAF));
162
+ // Write back
163
+ fs.writeFileSync(tafPath, content, 'utf-8');
164
+ // Success message
165
+ const resultEmoji = result === 'PASSED' ? '✅' :
166
+ result === 'IMPROVED' ? '📈' :
167
+ result === 'DEGRADED' ? '📉' : '❌';
168
+ console.log(`${resultEmoji} Logged test run: ${result}`);
169
+ console.log(`\n Tests: ${options.passed}/${options.total} passing`);
170
+ // Show environment variance if flagged
171
+ if (environment?.variance && environment.variance.length > 0) {
172
+ console.log(` ⚠️ Environment variance detected:`);
173
+ environment.variance.forEach(v => {
174
+ console.log(` - ${v.type}: ${v.description}`);
175
+ });
176
+ }
177
+ if (environment?.notes) {
178
+ console.log(` 📝 Environment notes: ${environment.notes}`);
179
+ }
180
+ if (result === 'PASSED') {
181
+ const streak = countCurrentStreak(updatedTAF.test_history);
182
+ if (streak > 1) {
183
+ console.log(` 🔥 Streak: ${streak} passing runs`);
184
+ }
185
+ }
186
+ if (options.root_cause) {
187
+ console.log(` Root cause: ${options.root_cause}`);
188
+ }
189
+ if (options.resolution) {
190
+ console.log(` Resolution: ${options.resolution}`);
191
+ }
192
+ console.log(`\nTotal runs: ${updatedTAF.test_history.length}`);
193
+ }
194
+ /**
195
+ * Get human-readable description for variance type
196
+ */
197
+ function getVarianceDescription(type) {
198
+ const descriptions = {
199
+ background_execution: 'Test running in background shell',
200
+ unstable_cwd: 'Working directory changing during test execution',
201
+ missing_dependencies: 'Required dependencies not found',
202
+ parallel_execution: 'Tests running in parallel when sequential expected',
203
+ resource_contention: 'System resources constrained',
204
+ network_unavailable: 'Network-dependent tests without network',
205
+ timing_sensitive: 'Race conditions or timing issues detected',
206
+ other: 'Custom environment variance',
207
+ };
208
+ return descriptions[type];
209
+ }
210
+ /**
211
+ * Count current passing streak
212
+ */
213
+ function countCurrentStreak(history) {
214
+ let streak = 0;
215
+ for (let i = history.length - 1; i >= 0; i--) {
216
+ if (history[i].result === 'PASSED') {
217
+ streak++;
218
+ }
219
+ else {
220
+ break;
221
+ }
222
+ }
223
+ return streak;
224
+ }
225
+ /**
226
+ * CLI wrapper - parse arguments
227
+ */
228
+ async function runTAFLog(args) {
229
+ const options = {
230
+ minimal: args.includes('--minimal') || args.includes('-m'),
231
+ };
232
+ // Parse test counts
233
+ const totalIndex = args.findIndex(arg => arg === '--total' || arg === '-t');
234
+ if (totalIndex !== -1 && args[totalIndex + 1]) {
235
+ options.total = parseInt(args[totalIndex + 1]);
236
+ }
237
+ const passedIndex = args.findIndex(arg => arg === '--passed' || arg === '-p');
238
+ if (passedIndex !== -1 && args[passedIndex + 1]) {
239
+ options.passed = parseInt(args[passedIndex + 1]);
240
+ }
241
+ const failedIndex = args.findIndex(arg => arg === '--failed' || arg === '-f');
242
+ if (failedIndex !== -1 && args[failedIndex + 1]) {
243
+ options.failed = parseInt(args[failedIndex + 1]);
244
+ }
245
+ const skippedIndex = args.findIndex(arg => arg === '--skipped' || arg === '-s');
246
+ if (skippedIndex !== -1 && args[skippedIndex + 1]) {
247
+ options.skipped = parseInt(args[skippedIndex + 1]);
248
+ }
249
+ // Parse result (optional)
250
+ const resultIndex = args.findIndex(arg => arg === '--result' || arg === '-r');
251
+ if (resultIndex !== -1 && args[resultIndex + 1]) {
252
+ const resultStr = args[resultIndex + 1].toUpperCase();
253
+ if (['PASSED', 'FAILED', 'IMPROVED', 'DEGRADED'].includes(resultStr)) {
254
+ options.result = resultStr;
255
+ }
256
+ }
257
+ // Parse detailed fields
258
+ const commandIndex = args.findIndex(arg => arg === '--command' || arg === '-c');
259
+ if (commandIndex !== -1 && args[commandIndex + 1]) {
260
+ options.command = args[commandIndex + 1];
261
+ }
262
+ const triggerIndex = args.findIndex(arg => arg === '--trigger');
263
+ if (triggerIndex !== -1 && args[triggerIndex + 1]) {
264
+ options.trigger = args[triggerIndex + 1];
265
+ }
266
+ const rootCauseIndex = args.findIndex(arg => arg === '--root-cause');
267
+ if (rootCauseIndex !== -1 && args[rootCauseIndex + 1]) {
268
+ options.root_cause = args[rootCauseIndex + 1];
269
+ }
270
+ const resolutionIndex = args.findIndex(arg => arg === '--resolution');
271
+ if (resolutionIndex !== -1 && args[resolutionIndex + 1]) {
272
+ options.resolution = args[resolutionIndex + 1];
273
+ }
274
+ // Parse issues (comma-separated)
275
+ const issuesIndex = args.findIndex(arg => arg === '--issues' || arg === '-i');
276
+ if (issuesIndex !== -1 && args[issuesIndex + 1]) {
277
+ options.issues = args[issuesIndex + 1].split(',').map(s => s.trim());
278
+ }
279
+ // Parse environment variance
280
+ const envVarianceIndex = args.findIndex(arg => arg === '--env-variance');
281
+ if (envVarianceIndex !== -1 && args[envVarianceIndex + 1]) {
282
+ const variance = args[envVarianceIndex + 1];
283
+ const validVariances = [
284
+ 'background_execution',
285
+ 'unstable_cwd',
286
+ 'missing_dependencies',
287
+ 'parallel_execution',
288
+ 'resource_contention',
289
+ 'network_unavailable',
290
+ 'timing_sensitive',
291
+ 'other',
292
+ ];
293
+ if (validVariances.includes(variance)) {
294
+ options.env_variance = variance;
295
+ }
296
+ }
297
+ const envNotesIndex = args.findIndex(arg => arg === '--env-notes');
298
+ if (envNotesIndex !== -1 && args[envNotesIndex + 1]) {
299
+ options.env_notes = args[envNotesIndex + 1];
300
+ }
301
+ await tafLog(options);
302
+ }
303
+ //# sourceMappingURL=taf-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taf-log.js","sourceRoot":"","sources":["../../src/commands/taf-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * faf taf stats - Display testing statistics
3
+ *
4
+ * Shows pass rate, health score, streaks, and trends from .taf file
5
+ */
6
+ export declare function tafStats(): Promise<void>;
7
+ export declare function runTAFStats(): Promise<void>;
8
+ //# sourceMappingURL=taf-stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taf-stats.d.ts","sourceRoot":"","sources":["../../src/commands/taf-stats.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CA4F9C;AAGD,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAEjD"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ /**
3
+ * faf taf stats - Display testing statistics
4
+ *
5
+ * Shows pass rate, health score, streaks, and trends from .taf file
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.tafStats = tafStats;
42
+ exports.runTAFStats = runTAFStats;
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const taf_1 = require("../taf");
46
+ async function tafStats() {
47
+ const tafPath = path.join(process.cwd(), '.taf');
48
+ // Check if .taf exists
49
+ if (!fs.existsSync(tafPath)) {
50
+ console.error('❌ No .taf file found');
51
+ console.log('\nRun: faf taf init');
52
+ process.exit(1);
53
+ }
54
+ // Read and parse
55
+ let taf;
56
+ try {
57
+ const content = fs.readFileSync(tafPath, 'utf-8');
58
+ taf = (0, taf_1.parseTAF)(content);
59
+ }
60
+ catch (error) {
61
+ console.error('❌ Failed to parse .taf file');
62
+ if (error instanceof Error) {
63
+ console.error(`\n${error.message}`);
64
+ }
65
+ process.exit(1);
66
+ }
67
+ // Calculate statistics
68
+ const stats = (0, taf_1.calculateStats)(taf);
69
+ const trend = (0, taf_1.getPassRateTrend)(taf);
70
+ const scoreContribution = (0, taf_1.calculateScoreContribution)(taf);
71
+ // Display header
72
+ console.log('📊 Testing Statistics\n');
73
+ // Project info
74
+ console.log(`Project: ${taf.project}`);
75
+ console.log(`Created: ${new Date(taf.created).toLocaleDateString()}\n`);
76
+ // Core stats
77
+ console.log(`${stats.health_score} Health Score: ${stats.pass_rate}`);
78
+ console.log(` Total runs: ${stats.total_runs}`);
79
+ console.log(` Current streak: ${stats.current_streak} passing`);
80
+ console.log(` Longest streak: ${stats.longest_streak} passing`);
81
+ console.log(` Total failures: ${stats.total_failures}`);
82
+ if (stats.avg_recovery_time_minutes) {
83
+ console.log(` Avg recovery: ${stats.avg_recovery_time_minutes} minutes`);
84
+ }
85
+ // Trend
86
+ const trendEmoji = trend === 'improving' ? '📈' : trend === 'declining' ? '📉' : '➡️';
87
+ console.log(`\n${trendEmoji} Trend: ${trend}`);
88
+ // Last run
89
+ if (stats.last_run) {
90
+ const lastRunDate = new Date(stats.last_run);
91
+ const now = new Date();
92
+ const hoursSince = Math.round((now.getTime() - lastRunDate.getTime()) / 1000 / 60 / 60);
93
+ console.log(`\n⏱️ Last run: ${hoursSince}h ago`);
94
+ }
95
+ // Score contribution (for .faf integration)
96
+ console.log(`\n🏆 .faf Score Contribution:`);
97
+ console.log(` .taf present: +${scoreContribution.taf_present} points`);
98
+ console.log(` .taf validated: +${scoreContribution.taf_validated} points`);
99
+ console.log(` Pass rate bonus: +${scoreContribution.pass_rate_bonus} points`);
100
+ console.log(` Total: +${scoreContribution.total} points`);
101
+ // FAF integration status
102
+ if (taf.faf_associated) {
103
+ console.log(`\n🔗 Native Reference: .faf linked`);
104
+ if (taf.faf_score !== undefined) {
105
+ console.log(` Current .faf score: ${taf.faf_score}/100`);
106
+ const projectedScore = taf.faf_score + scoreContribution.total;
107
+ if (projectedScore > taf.faf_score) {
108
+ console.log(` Projected with .taf: ${projectedScore}/100 (+${scoreContribution.total})`);
109
+ }
110
+ }
111
+ }
112
+ else {
113
+ console.log(`\nℹ️ No .faf link (optional)`);
114
+ console.log(` Run 'faf taf init' in a project with .faf to enable native reference`);
115
+ }
116
+ // Recent runs preview
117
+ if (taf.test_history.length > 0) {
118
+ console.log(`\n📋 Recent Runs (last 5):`);
119
+ const recent = taf.test_history.slice(-5);
120
+ recent.forEach(run => {
121
+ const date = new Date(run.timestamp);
122
+ const resultEmoji = run.result === 'PASSED' ? '✅' :
123
+ run.result === 'IMPROVED' ? '📈' :
124
+ run.result === 'DEGRADED' ? '📉' : '❌';
125
+ console.log(` ${resultEmoji} ${date.toLocaleString()}: ${run.tests.passed}/${run.tests.total} passing`);
126
+ });
127
+ }
128
+ }
129
+ // CLI wrapper
130
+ async function runTAFStats() {
131
+ await tafStats();
132
+ }
133
+ //# sourceMappingURL=taf-stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taf-stats.js","sourceRoot":"","sources":["../../src/commands/taf-stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * faf taf validate - Validate .taf file format
3
+ *
4
+ * Validates .taf file structure and reports errors/warnings
5
+ */
6
+ export declare function tafValidate(): Promise<void>;
7
+ export declare function runTAFValidate(): Promise<void>;
8
+ //# sourceMappingURL=taf-validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taf-validate.d.ts","sourceRoot":"","sources":["../../src/commands/taf-validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA+DjD;AAGD,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpD"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ /**
3
+ * faf taf validate - Validate .taf file format
4
+ *
5
+ * Validates .taf file structure and reports errors/warnings
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.tafValidate = tafValidate;
42
+ exports.runTAFValidate = runTAFValidate;
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const taf_1 = require("../taf");
46
+ async function tafValidate() {
47
+ const tafPath = path.join(process.cwd(), '.taf');
48
+ // Check if .taf exists
49
+ if (!fs.existsSync(tafPath)) {
50
+ console.error('❌ No .taf file found');
51
+ console.log('\nRun: faf taf init');
52
+ process.exit(1);
53
+ }
54
+ // Read and parse
55
+ let taf;
56
+ try {
57
+ const content = fs.readFileSync(tafPath, 'utf-8');
58
+ taf = (0, taf_1.parseTAF)(content);
59
+ }
60
+ catch (error) {
61
+ console.error('❌ Failed to parse .taf file');
62
+ if (error instanceof Error) {
63
+ console.error(`\n${error.message}`);
64
+ }
65
+ process.exit(1);
66
+ }
67
+ // Validate
68
+ const result = (0, taf_1.validateTAF)(taf);
69
+ // Display results
70
+ if (result.valid) {
71
+ console.log('✅ .taf file is valid');
72
+ console.log(`\nFormat version: ${taf.format_version}`);
73
+ console.log(`Project: ${taf.project}`);
74
+ console.log(`Test runs: ${taf.test_history.length}`);
75
+ if (taf.faf_associated) {
76
+ console.log(`\n🔗 Native Reference:`);
77
+ console.log(` .faf location: ${taf.faf_location || '.faf'}`);
78
+ if (taf.faf_score !== undefined) {
79
+ console.log(` .faf score: ${taf.faf_score}/100`);
80
+ }
81
+ }
82
+ if (result.warnings.length > 0) {
83
+ console.log(`\n⚠️ Warnings (${result.warnings.length}):`);
84
+ result.warnings.forEach(warning => {
85
+ console.log(` ${warning}`);
86
+ });
87
+ }
88
+ }
89
+ else {
90
+ console.error('❌ .taf file has errors');
91
+ console.error(`\nErrors (${result.errors.length}):`);
92
+ result.errors.forEach(error => {
93
+ console.error(` ${error}`);
94
+ });
95
+ if (result.warnings.length > 0) {
96
+ console.log(`\n⚠️ Warnings (${result.warnings.length}):`);
97
+ result.warnings.forEach(warning => {
98
+ console.log(` ${warning}`);
99
+ });
100
+ }
101
+ process.exit(1);
102
+ }
103
+ }
104
+ // CLI wrapper
105
+ async function runTAFValidate() {
106
+ await tafValidate();
107
+ }
108
+ //# sourceMappingURL=taf-validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taf-validate.js","sourceRoot":"","sources":["../../src/commands/taf-validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * faf taf - Testing Activity Feed commands
3
+ *
4
+ * Git-friendly testing timeline - automatic test logging
5
+ *
6
+ * Commands:
7
+ * - faf taf init Initialize .taf file
8
+ * - faf taf log Log a test run
9
+ * - faf taf validate Validate .taf format
10
+ * - faf taf stats Show test statistics
11
+ */
12
+ export declare function tafCommand(args: string[]): Promise<void>;
13
+ //# sourceMappingURL=taf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taf.d.ts","sourceRoot":"","sources":["../../src/commands/taf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC9D"}