faf-cli 2.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 (283) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +227 -0
  3. package/dist/cli.d.ts +8 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +1249 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/ai-analyze.d.ts +18 -0
  8. package/dist/commands/ai-analyze.d.ts.map +1 -0
  9. package/dist/commands/ai-analyze.js +226 -0
  10. package/dist/commands/ai-analyze.js.map +1 -0
  11. package/dist/commands/ai-enhance.d.ts +17 -0
  12. package/dist/commands/ai-enhance.d.ts.map +1 -0
  13. package/dist/commands/ai-enhance.js +278 -0
  14. package/dist/commands/ai-enhance.js.map +1 -0
  15. package/dist/commands/audit.d.ts +11 -0
  16. package/dist/commands/audit.d.ts.map +1 -0
  17. package/dist/commands/audit.js +180 -0
  18. package/dist/commands/audit.js.map +1 -0
  19. package/dist/commands/auto.d.ts +27 -0
  20. package/dist/commands/auto.d.ts.map +1 -0
  21. package/dist/commands/auto.js +106 -0
  22. package/dist/commands/auto.js.map +1 -0
  23. package/dist/commands/bi-sync.d.ts +43 -0
  24. package/dist/commands/bi-sync.d.ts.map +1 -0
  25. package/dist/commands/bi-sync.js +224 -0
  26. package/dist/commands/bi-sync.js.map +1 -0
  27. package/dist/commands/chat.d.ts +6 -0
  28. package/dist/commands/chat.d.ts.map +1 -0
  29. package/dist/commands/chat.js +227 -0
  30. package/dist/commands/chat.js.map +1 -0
  31. package/dist/commands/check.d.ts +15 -0
  32. package/dist/commands/check.d.ts.map +1 -0
  33. package/dist/commands/check.js +58 -0
  34. package/dist/commands/check.js.map +1 -0
  35. package/dist/commands/clear.d.ts +15 -0
  36. package/dist/commands/clear.d.ts.map +1 -0
  37. package/dist/commands/clear.js +167 -0
  38. package/dist/commands/clear.js.map +1 -0
  39. package/dist/commands/commit.d.ts +8 -0
  40. package/dist/commands/commit.d.ts.map +1 -0
  41. package/dist/commands/commit.js +164 -0
  42. package/dist/commands/commit.js.map +1 -0
  43. package/dist/commands/convert.d.ts +19 -0
  44. package/dist/commands/convert.d.ts.map +1 -0
  45. package/dist/commands/convert.js +102 -0
  46. package/dist/commands/convert.js.map +1 -0
  47. package/dist/commands/credit.d.ts +13 -0
  48. package/dist/commands/credit.d.ts.map +1 -0
  49. package/dist/commands/credit.js +149 -0
  50. package/dist/commands/credit.js.map +1 -0
  51. package/dist/commands/edit-helper.d.ts +6 -0
  52. package/dist/commands/edit-helper.d.ts.map +1 -0
  53. package/dist/commands/edit-helper.js +55 -0
  54. package/dist/commands/edit-helper.js.map +1 -0
  55. package/dist/commands/edit.d.ts +14 -0
  56. package/dist/commands/edit.d.ts.map +1 -0
  57. package/dist/commands/edit.js +196 -0
  58. package/dist/commands/edit.js.map +1 -0
  59. package/dist/commands/faf-auth.d.ts +10 -0
  60. package/dist/commands/faf-auth.d.ts.map +1 -0
  61. package/dist/commands/faf-auth.js +162 -0
  62. package/dist/commands/faf-auth.js.map +1 -0
  63. package/dist/commands/faf-dna.d.ts +9 -0
  64. package/dist/commands/faf-dna.d.ts.map +1 -0
  65. package/dist/commands/faf-dna.js +141 -0
  66. package/dist/commands/faf-dna.js.map +1 -0
  67. package/dist/commands/faf-log.d.ts +9 -0
  68. package/dist/commands/faf-log.d.ts.map +1 -0
  69. package/dist/commands/faf-log.js +135 -0
  70. package/dist/commands/faf-log.js.map +1 -0
  71. package/dist/commands/faf-recover.d.ts +3 -0
  72. package/dist/commands/faf-recover.d.ts.map +1 -0
  73. package/dist/commands/faf-recover.js +299 -0
  74. package/dist/commands/faf-recover.js.map +1 -0
  75. package/dist/commands/faf-update.d.ts +9 -0
  76. package/dist/commands/faf-update.d.ts.map +1 -0
  77. package/dist/commands/faf-update.js +68 -0
  78. package/dist/commands/faf-update.js.map +1 -0
  79. package/dist/commands/faq.d.ts +12 -0
  80. package/dist/commands/faq.d.ts.map +1 -0
  81. package/dist/commands/faq.js +84 -0
  82. package/dist/commands/faq.js.map +1 -0
  83. package/dist/commands/flow.d.ts +11 -0
  84. package/dist/commands/flow.d.ts.map +1 -0
  85. package/dist/commands/flow.js +117 -0
  86. package/dist/commands/flow.js.map +1 -0
  87. package/dist/commands/formats.d.ts +12 -0
  88. package/dist/commands/formats.d.ts.map +1 -0
  89. package/dist/commands/formats.js +109 -0
  90. package/dist/commands/formats.js.map +1 -0
  91. package/dist/commands/index.d.ts +14 -0
  92. package/dist/commands/index.d.ts.map +1 -0
  93. package/dist/commands/index.js +443 -0
  94. package/dist/commands/index.js.map +1 -0
  95. package/dist/commands/init.d.ts +14 -0
  96. package/dist/commands/init.d.ts.map +1 -0
  97. package/dist/commands/init.js +202 -0
  98. package/dist/commands/init.js.map +1 -0
  99. package/dist/commands/lint.d.ts +11 -0
  100. package/dist/commands/lint.d.ts.map +1 -0
  101. package/dist/commands/lint.js +269 -0
  102. package/dist/commands/lint.js.map +1 -0
  103. package/dist/commands/mirror.d.ts +7 -0
  104. package/dist/commands/mirror.d.ts.map +1 -0
  105. package/dist/commands/mirror.js +130 -0
  106. package/dist/commands/mirror.js.map +1 -0
  107. package/dist/commands/score.d.ts +11 -0
  108. package/dist/commands/score.d.ts.map +1 -0
  109. package/dist/commands/score.js +192 -0
  110. package/dist/commands/score.js.map +1 -0
  111. package/dist/commands/search.d.ts +16 -0
  112. package/dist/commands/search.d.ts.map +1 -0
  113. package/dist/commands/search.js +174 -0
  114. package/dist/commands/search.js.map +1 -0
  115. package/dist/commands/share.d.ts +17 -0
  116. package/dist/commands/share.d.ts.map +1 -0
  117. package/dist/commands/share.js +260 -0
  118. package/dist/commands/share.js.map +1 -0
  119. package/dist/commands/show.d.ts +10 -0
  120. package/dist/commands/show.d.ts.map +1 -0
  121. package/dist/commands/show.js +167 -0
  122. package/dist/commands/show.js.map +1 -0
  123. package/dist/commands/stacks.d.ts +51 -0
  124. package/dist/commands/stacks.d.ts.map +1 -0
  125. package/dist/commands/stacks.js +180 -0
  126. package/dist/commands/stacks.js.map +1 -0
  127. package/dist/commands/status.d.ts +13 -0
  128. package/dist/commands/status.d.ts.map +1 -0
  129. package/dist/commands/status.js +158 -0
  130. package/dist/commands/status.js.map +1 -0
  131. package/dist/commands/sync.d.ts +11 -0
  132. package/dist/commands/sync.d.ts.map +1 -0
  133. package/dist/commands/sync.js +300 -0
  134. package/dist/commands/sync.js.map +1 -0
  135. package/dist/commands/todo.d.ts +14 -0
  136. package/dist/commands/todo.d.ts.map +1 -0
  137. package/dist/commands/todo.js +279 -0
  138. package/dist/commands/todo.js.map +1 -0
  139. package/dist/commands/trust.d.ts +33 -0
  140. package/dist/commands/trust.d.ts.map +1 -0
  141. package/dist/commands/trust.js +316 -0
  142. package/dist/commands/trust.js.map +1 -0
  143. package/dist/commands/validate.d.ts +11 -0
  144. package/dist/commands/validate.d.ts.map +1 -0
  145. package/dist/commands/validate.js +100 -0
  146. package/dist/commands/validate.js.map +1 -0
  147. package/dist/commands/verify.d.ts +36 -0
  148. package/dist/commands/verify.d.ts.map +1 -0
  149. package/dist/commands/verify.js +194 -0
  150. package/dist/commands/verify.js.map +1 -0
  151. package/dist/commands/version.d.ts +5 -0
  152. package/dist/commands/version.d.ts.map +1 -0
  153. package/dist/commands/version.js +33 -0
  154. package/dist/commands/version.js.map +1 -0
  155. package/dist/commands/vibe.d.ts +7 -0
  156. package/dist/commands/vibe.d.ts.map +1 -0
  157. package/dist/commands/vibe.js +78 -0
  158. package/dist/commands/vibe.js.map +1 -0
  159. package/dist/converters/faf-converters.d.ts +43 -0
  160. package/dist/converters/faf-converters.d.ts.map +1 -0
  161. package/dist/converters/faf-converters.js +186 -0
  162. package/dist/converters/faf-converters.js.map +1 -0
  163. package/dist/engine-bridge.d.ts +35 -0
  164. package/dist/engine-bridge.d.ts.map +1 -0
  165. package/dist/engine-bridge.js +76 -0
  166. package/dist/engine-bridge.js.map +1 -0
  167. package/dist/engines/claude-todo-engine.d.ts +115 -0
  168. package/dist/engines/claude-todo-engine.d.ts.map +1 -0
  169. package/dist/engines/claude-todo-engine.js +346 -0
  170. package/dist/engines/claude-todo-engine.js.map +1 -0
  171. package/dist/engines/drop-coach.d.ts +64 -0
  172. package/dist/engines/drop-coach.d.ts.map +1 -0
  173. package/dist/engines/drop-coach.js +222 -0
  174. package/dist/engines/drop-coach.js.map +1 -0
  175. package/dist/engines/fab-formats-processor.d.ts +167 -0
  176. package/dist/engines/fab-formats-processor.d.ts.map +1 -0
  177. package/dist/engines/fab-formats-processor.js +1274 -0
  178. package/dist/engines/fab-formats-processor.js.map +1 -0
  179. package/dist/engines/faf-dna.d.ts +160 -0
  180. package/dist/engines/faf-dna.d.ts.map +1 -0
  181. package/dist/engines/faf-dna.js +522 -0
  182. package/dist/engines/faf-dna.js.map +1 -0
  183. package/dist/engines/relentless-context-extractor.d.ts +101 -0
  184. package/dist/engines/relentless-context-extractor.d.ts.map +1 -0
  185. package/dist/engines/relentless-context-extractor.js +625 -0
  186. package/dist/engines/relentless-context-extractor.js.map +1 -0
  187. package/dist/fix-once/colors.d.ts +83 -0
  188. package/dist/fix-once/colors.d.ts.map +1 -0
  189. package/dist/fix-once/colors.js +145 -0
  190. package/dist/fix-once/colors.js.map +1 -0
  191. package/dist/fix-once/types.d.ts +258 -0
  192. package/dist/fix-once/types.d.ts.map +1 -0
  193. package/dist/fix-once/types.js +26 -0
  194. package/dist/fix-once/types.js.map +1 -0
  195. package/dist/framework-detector.d.ts +286 -0
  196. package/dist/framework-detector.d.ts.map +1 -0
  197. package/dist/framework-detector.js +782 -0
  198. package/dist/framework-detector.js.map +1 -0
  199. package/dist/generators/faf-generator-championship.d.ts +11 -0
  200. package/dist/generators/faf-generator-championship.d.ts.map +1 -0
  201. package/dist/generators/faf-generator-championship.js +371 -0
  202. package/dist/generators/faf-generator-championship.js.map +1 -0
  203. package/dist/index.d.ts +18 -0
  204. package/dist/index.d.ts.map +1 -0
  205. package/dist/index.js +34 -0
  206. package/dist/index.js.map +1 -0
  207. package/dist/output/experience-manager.d.ts +58 -0
  208. package/dist/output/experience-manager.d.ts.map +1 -0
  209. package/dist/output/experience-manager.js +212 -0
  210. package/dist/output/experience-manager.js.map +1 -0
  211. package/dist/schema/faf-schema.d.ts +92 -0
  212. package/dist/schema/faf-schema.d.ts.map +1 -0
  213. package/dist/schema/faf-schema.js +173 -0
  214. package/dist/schema/faf-schema.js.map +1 -0
  215. package/dist/scoring/championship-scorer.d.ts +114 -0
  216. package/dist/scoring/championship-scorer.d.ts.map +1 -0
  217. package/dist/scoring/championship-scorer.js +380 -0
  218. package/dist/scoring/championship-scorer.js.map +1 -0
  219. package/dist/scoring/score-calculator.d.ts +29 -0
  220. package/dist/scoring/score-calculator.d.ts.map +1 -0
  221. package/dist/scoring/score-calculator.js +520 -0
  222. package/dist/scoring/score-calculator.js.map +1 -0
  223. package/dist/telemetry/analytics.d.ts +74 -0
  224. package/dist/telemetry/analytics.d.ts.map +1 -0
  225. package/dist/telemetry/analytics.js +370 -0
  226. package/dist/telemetry/analytics.js.map +1 -0
  227. package/dist/utils/balance-visualizer.d.ts +38 -0
  228. package/dist/utils/balance-visualizer.d.ts.map +1 -0
  229. package/dist/utils/balance-visualizer.js +196 -0
  230. package/dist/utils/balance-visualizer.js.map +1 -0
  231. package/dist/utils/championship-style.d.ts +110 -0
  232. package/dist/utils/championship-style.d.ts.map +1 -0
  233. package/dist/utils/championship-style.js +213 -0
  234. package/dist/utils/championship-style.js.map +1 -0
  235. package/dist/utils/color-utils.d.ts +17 -0
  236. package/dist/utils/color-utils.d.ts.map +1 -0
  237. package/dist/utils/color-utils.js +96 -0
  238. package/dist/utils/color-utils.js.map +1 -0
  239. package/dist/utils/fab-formats-engine.d.ts +76 -0
  240. package/dist/utils/fab-formats-engine.d.ts.map +1 -0
  241. package/dist/utils/fab-formats-engine.js +424 -0
  242. package/dist/utils/fab-formats-engine.js.map +1 -0
  243. package/dist/utils/fafignore-parser.d.ts +21 -0
  244. package/dist/utils/fafignore-parser.d.ts.map +1 -0
  245. package/dist/utils/fafignore-parser.js +178 -0
  246. package/dist/utils/fafignore-parser.js.map +1 -0
  247. package/dist/utils/file-utils.d.ts +65 -0
  248. package/dist/utils/file-utils.d.ts.map +1 -0
  249. package/dist/utils/file-utils.js +598 -0
  250. package/dist/utils/file-utils.js.map +1 -0
  251. package/dist/utils/platform-detector.d.ts +31 -0
  252. package/dist/utils/platform-detector.d.ts.map +1 -0
  253. package/dist/utils/platform-detector.js +218 -0
  254. package/dist/utils/platform-detector.js.map +1 -0
  255. package/dist/utils/technical-credit.d.ts +36 -0
  256. package/dist/utils/technical-credit.d.ts.map +1 -0
  257. package/dist/utils/technical-credit.js +286 -0
  258. package/dist/utils/technical-credit.js.map +1 -0
  259. package/dist/utils/trust-cache.d.ts +29 -0
  260. package/dist/utils/trust-cache.d.ts.map +1 -0
  261. package/dist/utils/trust-cache.js +123 -0
  262. package/dist/utils/trust-cache.js.map +1 -0
  263. package/dist/utils/turbo-cat-knowledge.d.ts +82 -0
  264. package/dist/utils/turbo-cat-knowledge.d.ts.map +1 -0
  265. package/dist/utils/turbo-cat-knowledge.js +1346 -0
  266. package/dist/utils/turbo-cat-knowledge.js.map +1 -0
  267. package/dist/utils/turbo-cat-pyramid.d.ts +38 -0
  268. package/dist/utils/turbo-cat-pyramid.d.ts.map +1 -0
  269. package/dist/utils/turbo-cat-pyramid.js +287 -0
  270. package/dist/utils/turbo-cat-pyramid.js.map +1 -0
  271. package/dist/utils/turbo-cat.d.ts +92 -0
  272. package/dist/utils/turbo-cat.d.ts.map +1 -0
  273. package/dist/utils/turbo-cat.js +412 -0
  274. package/dist/utils/turbo-cat.js.map +1 -0
  275. package/dist/utils/vibe-sync.d.ts +25 -0
  276. package/dist/utils/vibe-sync.d.ts.map +1 -0
  277. package/dist/utils/vibe-sync.js +169 -0
  278. package/dist/utils/vibe-sync.js.map +1 -0
  279. package/dist/utils/yaml-generator.d.ts +39 -0
  280. package/dist/utils/yaml-generator.d.ts.map +1 -0
  281. package/dist/utils/yaml-generator.js +345 -0
  282. package/dist/utils/yaml-generator.js.map +1 -0
  283. package/package.json +96 -0
@@ -0,0 +1,370 @@
1
+ "use strict";
2
+ /**
3
+ * 📊 FAF CLI Analytics & Telemetry System
4
+ * F1-inspired performance monitoring and user analytics
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.analytics = exports.FafAnalytics = void 0;
41
+ exports.trackCommand = trackCommand;
42
+ exports.trackError = trackError;
43
+ exports.trackPerformance = trackPerformance;
44
+ exports.trackFeatureUsage = trackFeatureUsage;
45
+ exports.withPerformanceTracking = withPerformanceTracking;
46
+ const os = __importStar(require("os"));
47
+ const path = __importStar(require("path"));
48
+ const fs = __importStar(require("fs/promises"));
49
+ const championship_style_1 = require("../utils/championship-style");
50
+ // Telemetry configuration
51
+ const TELEMETRY_ENABLED = process.env.FAF_TELEMETRY !== 'false';
52
+ const TELEMETRY_ENDPOINT = 'https://telemetry.faf.one/v1/events';
53
+ const SESSION_ID = generateSessionId();
54
+ /**
55
+ * Core Analytics Engine
56
+ */
57
+ class FafAnalytics {
58
+ static instance;
59
+ events = [];
60
+ statsPath;
61
+ constructor() {
62
+ this.statsPath = path.join(os.homedir(), '.faf', 'usage-stats.json');
63
+ }
64
+ static getInstance() {
65
+ if (!FafAnalytics.instance) {
66
+ FafAnalytics.instance = new FafAnalytics();
67
+ }
68
+ return FafAnalytics.instance;
69
+ }
70
+ /**
71
+ * Track command execution
72
+ */
73
+ async trackCommand(command, args, duration, success) {
74
+ if (!TELEMETRY_ENABLED) {
75
+ return;
76
+ }
77
+ const event = {
78
+ event: 'command_executed',
79
+ timestamp: new Date().toISOString(),
80
+ sessionId: SESSION_ID,
81
+ version: await this.getVersion(),
82
+ platform: this.getPlatformInfo(),
83
+ properties: {
84
+ command,
85
+ args: args.filter(arg => !arg.includes('key') && !arg.includes('token')), // Security: filter sensitive args
86
+ success,
87
+ projectType: await this.detectProjectType()
88
+ },
89
+ performance: {
90
+ duration,
91
+ memory: process.memoryUsage(),
92
+ cpu: this.getCpuInfo()
93
+ }
94
+ };
95
+ await this.recordEvent(event);
96
+ await this.updateUsageStats(command, duration, success);
97
+ }
98
+ /**
99
+ * Track errors with context
100
+ */
101
+ async trackError(error, command, args) {
102
+ if (!TELEMETRY_ENABLED) {
103
+ return;
104
+ }
105
+ const event = {
106
+ event: 'error_occurred',
107
+ timestamp: new Date().toISOString(),
108
+ sessionId: SESSION_ID,
109
+ version: await this.getVersion(),
110
+ platform: this.getPlatformInfo(),
111
+ properties: {
112
+ command,
113
+ projectType: await this.detectProjectType()
114
+ },
115
+ error: {
116
+ name: error.name,
117
+ message: error.message,
118
+ stack: error.stack,
119
+ command,
120
+ args: args?.filter(arg => !arg.includes('key') && !arg.includes('token'))
121
+ }
122
+ };
123
+ await this.recordEvent(event);
124
+ }
125
+ /**
126
+ * Track performance milestones
127
+ */
128
+ async trackPerformance(milestone, duration, metadata) {
129
+ if (!TELEMETRY_ENABLED) {
130
+ return;
131
+ }
132
+ const event = {
133
+ event: 'performance_milestone',
134
+ timestamp: new Date().toISOString(),
135
+ sessionId: SESSION_ID,
136
+ version: await this.getVersion(),
137
+ platform: this.getPlatformInfo(),
138
+ properties: {
139
+ milestone,
140
+ ...metadata
141
+ },
142
+ performance: {
143
+ duration,
144
+ memory: process.memoryUsage()
145
+ }
146
+ };
147
+ await this.recordEvent(event);
148
+ }
149
+ /**
150
+ * Track feature usage
151
+ */
152
+ async trackFeatureUsage(feature, context) {
153
+ if (!TELEMETRY_ENABLED) {
154
+ return;
155
+ }
156
+ const event = {
157
+ event: 'feature_used',
158
+ timestamp: new Date().toISOString(),
159
+ sessionId: SESSION_ID,
160
+ version: await this.getVersion(),
161
+ platform: this.getPlatformInfo(),
162
+ properties: {
163
+ feature,
164
+ ...context
165
+ }
166
+ };
167
+ await this.recordEvent(event);
168
+ }
169
+ /**
170
+ * Get usage statistics
171
+ */
172
+ async getUsageStats() {
173
+ try {
174
+ const content = await fs.readFile(this.statsPath, 'utf-8');
175
+ return JSON.parse(content);
176
+ }
177
+ catch {
178
+ return {
179
+ totalCommands: 0,
180
+ favoriteCommands: {},
181
+ averageExecutionTime: 0,
182
+ errorRate: 0,
183
+ lastUsed: new Date().toISOString(),
184
+ projectTypes: {}
185
+ };
186
+ }
187
+ }
188
+ /**
189
+ * Display championship-style analytics summary
190
+ */
191
+ async showAnalyticsSummary() {
192
+ const stats = await this.getUsageStats();
193
+ console.log(`${championship_style_1.FAF_COLORS.fafCyan('📊 FAF CLI Analytics Summary')}`);
194
+ console.log(`${championship_style_1.FAF_COLORS.fafCyan('├─')} Total commands: ${championship_style_1.FAF_COLORS.fafGreen(stats.totalCommands.toString())}`);
195
+ console.log(`${championship_style_1.FAF_COLORS.fafCyan('├─')} Average execution: ${championship_style_1.FAF_COLORS.fafGreen(stats.averageExecutionTime.toFixed(0))}ms`);
196
+ console.log(`${championship_style_1.FAF_COLORS.fafCyan('├─')} Error rate: ${this.formatErrorRate(stats.errorRate)}`);
197
+ console.log(`${championship_style_1.FAF_COLORS.fafCyan('└─')} Last used: ${championship_style_1.FAF_COLORS.fafGreen(new Date(stats.lastUsed).toLocaleDateString())}`);
198
+ if (Object.keys(stats.favoriteCommands).length > 0) {
199
+ console.log();
200
+ console.log(`${championship_style_1.FAF_COLORS.fafCyan('🏆 Top Commands:')}`);
201
+ const topCommands = Object.entries(stats.favoriteCommands)
202
+ .sort(([, a], [, b]) => b - a)
203
+ .slice(0, 3);
204
+ topCommands.forEach(([command, count], index) => {
205
+ const medal = ['🥇', '🥈', '🥉'][index];
206
+ console.log(`${championship_style_1.FAF_COLORS.fafCyan(' ')}${medal} ${command}: ${count} times`);
207
+ });
208
+ }
209
+ }
210
+ /**
211
+ * Privacy controls
212
+ */
213
+ async disableTelemetry() {
214
+ process.env.FAF_TELEMETRY = 'false';
215
+ console.log(`${championship_style_1.FAF_COLORS.fafGreen('☑️')} Telemetry disabled. Analytics collection stopped.`);
216
+ console.log(`${championship_style_1.FAF_COLORS.fafCyan('💡')} Re-enable with: ${championship_style_1.FAF_COLORS.fafOrange('export FAF_TELEMETRY=true')}`);
217
+ }
218
+ async enableTelemetry() {
219
+ process.env.FAF_TELEMETRY = 'true';
220
+ console.log(`${championship_style_1.FAF_COLORS.fafGreen('☑️')} Telemetry enabled. Helping improve FAF for everyone!`);
221
+ console.log(`${championship_style_1.FAF_COLORS.fafCyan('🔒')} All data is anonymized and secure.`);
222
+ }
223
+ // =====================================
224
+ // PRIVATE METHODS
225
+ // =====================================
226
+ async recordEvent(event) {
227
+ this.events.push(event);
228
+ // Batch send events (or queue for later if offline)
229
+ if (this.events.length >= 10) {
230
+ await this.flushEvents();
231
+ }
232
+ }
233
+ async flushEvents() {
234
+ if (this.events.length === 0) {
235
+ return;
236
+ }
237
+ try {
238
+ // In production, this would send to telemetry endpoint
239
+ // For now, we'll just clear the events
240
+ this.events = [];
241
+ }
242
+ catch {
243
+ // Silent fail - telemetry should never break the CLI
244
+ }
245
+ }
246
+ async updateUsageStats(command, duration, success) {
247
+ const stats = await this.getUsageStats();
248
+ stats.totalCommands++;
249
+ stats.favoriteCommands[command] = (stats.favoriteCommands[command] || 0) + 1;
250
+ stats.averageExecutionTime = (stats.averageExecutionTime * (stats.totalCommands - 1) + duration) / stats.totalCommands;
251
+ stats.lastUsed = new Date().toISOString();
252
+ if (!success) {
253
+ stats.errorRate = (stats.errorRate * (stats.totalCommands - 1) + 1) / stats.totalCommands;
254
+ }
255
+ else {
256
+ stats.errorRate = (stats.errorRate * (stats.totalCommands - 1)) / stats.totalCommands;
257
+ }
258
+ const projectType = await this.detectProjectType();
259
+ if (projectType) {
260
+ stats.projectTypes[projectType] = (stats.projectTypes[projectType] || 0) + 1;
261
+ }
262
+ await this.saveUsageStats(stats);
263
+ }
264
+ async saveUsageStats(stats) {
265
+ try {
266
+ await fs.mkdir(path.dirname(this.statsPath), { recursive: true });
267
+ await fs.writeFile(this.statsPath, JSON.stringify(stats, null, 2));
268
+ }
269
+ catch {
270
+ // Silent fail
271
+ }
272
+ }
273
+ async getVersion() {
274
+ try {
275
+ const packagePath = path.join(__dirname, '../../package.json');
276
+ const content = await fs.readFile(packagePath, 'utf-8');
277
+ const pkg = JSON.parse(content);
278
+ return pkg.version;
279
+ }
280
+ catch {
281
+ return 'unknown';
282
+ }
283
+ }
284
+ getPlatformInfo() {
285
+ return `${os.platform()}-${os.arch()}-node${process.version}`;
286
+ }
287
+ getCpuInfo() {
288
+ const cpus = os.cpus();
289
+ return {
290
+ model: cpus[0]?.model || 'unknown',
291
+ speed: cpus[0]?.speed || 0,
292
+ cores: cpus.length
293
+ };
294
+ }
295
+ async detectProjectType() {
296
+ try {
297
+ const cwd = process.cwd();
298
+ const files = await fs.readdir(cwd);
299
+ if (files.includes('package.json')) {
300
+ return 'nodejs';
301
+ }
302
+ if (files.includes('requirements.txt') || files.includes('pyproject.toml')) {
303
+ return 'python';
304
+ }
305
+ if (files.includes('Cargo.toml')) {
306
+ return 'rust';
307
+ }
308
+ if (files.includes('go.mod')) {
309
+ return 'golang';
310
+ }
311
+ if (files.includes('pom.xml') || files.includes('build.gradle')) {
312
+ return 'java';
313
+ }
314
+ return null;
315
+ }
316
+ catch {
317
+ return null;
318
+ }
319
+ }
320
+ formatErrorRate(rate) {
321
+ const percentage = (rate * 100).toFixed(1);
322
+ const color = rate < 0.05 ? championship_style_1.FAF_COLORS.fafGreen :
323
+ rate < 0.15 ? championship_style_1.FAF_COLORS.fafOrange : championship_style_1.FAF_COLORS.fafOrange;
324
+ return color(`${percentage}%`);
325
+ }
326
+ }
327
+ exports.FafAnalytics = FafAnalytics;
328
+ /**
329
+ * Convenience functions for analytics tracking
330
+ */
331
+ exports.analytics = FafAnalytics.getInstance();
332
+ function trackCommand(command, args, duration, success) {
333
+ return exports.analytics.trackCommand(command, args, duration, success);
334
+ }
335
+ function trackError(error, command, args) {
336
+ return exports.analytics.trackError(error, command, args);
337
+ }
338
+ function trackPerformance(milestone, duration, metadata) {
339
+ return exports.analytics.trackPerformance(milestone, duration, metadata);
340
+ }
341
+ function trackFeatureUsage(feature, context) {
342
+ return exports.analytics.trackFeatureUsage(feature, context);
343
+ }
344
+ /**
345
+ * Utility functions
346
+ */
347
+ function generateSessionId() {
348
+ return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
349
+ }
350
+ /**
351
+ * Performance monitoring decorator
352
+ */
353
+ function withPerformanceTracking(fn, name) {
354
+ return (async (...args) => {
355
+ const start = Date.now();
356
+ try {
357
+ const result = await fn(...args);
358
+ const duration = Date.now() - start;
359
+ await trackPerformance(name, duration, { success: true });
360
+ return result;
361
+ }
362
+ catch (error) {
363
+ const duration = Date.now() - start;
364
+ await trackPerformance(name, duration, { success: false });
365
+ await trackError(error, name);
366
+ throw error;
367
+ }
368
+ });
369
+ }
370
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/telemetry/analytics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * 🎯 AI|HUMAN Balance Visualizer
3
+ * Visual-only gamification that drives +144% human context completion
4
+ * The 50/50 eternal truth: AI detects tech (50%), humans provide meaning (50%)
5
+ */
6
+ export interface BalanceData {
7
+ aiPercentage: number;
8
+ humanPercentage: number;
9
+ isBalanced: boolean;
10
+ }
11
+ export declare class BalanceVisualizer {
12
+ private static readonly BAR_WIDTH;
13
+ private static readonly CYAN;
14
+ private static readonly ORANGE;
15
+ private static readonly GREEN;
16
+ /**
17
+ * Calculate balance from FAF data
18
+ * Matches fafdev.tools calculation - INDEPENDENT percentages
19
+ * AI: How complete is technical context (0-100%)
20
+ * HUMAN: How complete is human context (0-100%)
21
+ * Perfect balance when both are high and similar
22
+ */
23
+ static calculateBalance(fafData: any): BalanceData;
24
+ /**
25
+ * Generate the visual balance bar
26
+ * Matches fafdev.tools - single bar showing AI|HUMAN proportion
27
+ */
28
+ static generateBalanceBar(balance: BalanceData): string;
29
+ /**
30
+ * Generate a compact balance indicator for inline display
31
+ */
32
+ static generateCompactBalance(balance: BalanceData): string;
33
+ /**
34
+ * Get balance achievement message for gamification
35
+ */
36
+ static getAchievementMessage(balance: BalanceData): string | null;
37
+ }
38
+ //# sourceMappingURL=balance-visualizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance-visualizer.d.ts","sourceRoot":"","sources":["../../src/utils/balance-visualizer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAM;IACvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAa;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAa;IAC3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAa;IAE1C;;;;;;OAMG;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,GAAG,WAAW;IAqElD;;;OAGG;IACH,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;IAkFvD;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;IAa3D;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;CAalE"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ /**
3
+ * 🎯 AI|HUMAN Balance Visualizer
4
+ * Visual-only gamification that drives +144% human context completion
5
+ * The 50/50 eternal truth: AI detects tech (50%), humans provide meaning (50%)
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.BalanceVisualizer = void 0;
9
+ const colors_1 = require("../fix-once/colors");
10
+ class BalanceVisualizer {
11
+ static BAR_WIDTH = 40;
12
+ static CYAN = '#00FFFF';
13
+ static ORANGE = '#FFA500';
14
+ static GREEN = '#00FF00';
15
+ /**
16
+ * Calculate balance from FAF data
17
+ * Matches fafdev.tools calculation - INDEPENDENT percentages
18
+ * AI: How complete is technical context (0-100%)
19
+ * HUMAN: How complete is human context (0-100%)
20
+ * Perfect balance when both are high and similar
21
+ */
22
+ static calculateBalance(fafData) {
23
+ // AI fields (technical detection) - what AI can detect
24
+ const aiFields = [
25
+ 'stack.frontend',
26
+ 'stack.backend',
27
+ 'stack.database',
28
+ 'stack.runtime',
29
+ 'stack.build',
30
+ 'stack.package_manager',
31
+ 'project.main_language',
32
+ 'project.generated',
33
+ 'ai_instructions',
34
+ 'preferences.quality_bar',
35
+ 'state.version',
36
+ 'state.phase'
37
+ ];
38
+ // HUMAN fields (context meaning) - what humans provide
39
+ const humanFields = [
40
+ 'human_context.who',
41
+ 'human_context.what',
42
+ 'human_context.why',
43
+ 'human_context.where',
44
+ 'human_context.when',
45
+ 'human_context.how',
46
+ 'project.goal',
47
+ 'project.mission',
48
+ 'state.focus',
49
+ 'state.next_milestone',
50
+ 'state.blockers',
51
+ 'preferences.communication'
52
+ ];
53
+ let aiFilledCount = 0;
54
+ let humanFilledCount = 0;
55
+ // Count AI fields
56
+ aiFields.forEach(field => {
57
+ const value = field.split('.').reduce((obj, key) => obj?.[key], fafData);
58
+ if (value && value !== 'None' && value !== 'Not specified' && value !== '') {
59
+ aiFilledCount++;
60
+ }
61
+ });
62
+ // Count HUMAN fields
63
+ humanFields.forEach(field => {
64
+ const value = field.split('.').reduce((obj, key) => obj?.[key], fafData);
65
+ if (value && value !== 'Not specified' && value !== '') {
66
+ humanFilledCount++;
67
+ }
68
+ });
69
+ // Calculate INDEPENDENT percentages (like fafdev.tools)
70
+ const aiPercentage = Math.round((aiFilledCount / aiFields.length) * 100);
71
+ const humanPercentage = Math.round((humanFilledCount / humanFields.length) * 100);
72
+ // Perfect balance when both are high and within 10% of each other
73
+ const isBalanced = Math.abs(aiPercentage - humanPercentage) <= 10 &&
74
+ aiPercentage >= 50 &&
75
+ humanPercentage >= 50;
76
+ return {
77
+ aiPercentage,
78
+ humanPercentage,
79
+ isBalanced
80
+ };
81
+ }
82
+ /**
83
+ * Generate the visual balance bar
84
+ * Matches fafdev.tools - single bar showing AI|HUMAN proportion
85
+ */
86
+ static generateBalanceBar(balance) {
87
+ const { aiPercentage, humanPercentage, isBalanced } = balance;
88
+ // Calculate proportional split (matching fafdev.tools logic)
89
+ const totalContext = aiPercentage + humanPercentage;
90
+ let aiProportion;
91
+ let humanProportion;
92
+ if (totalContext === 0) {
93
+ aiProportion = 50;
94
+ humanProportion = 50;
95
+ }
96
+ else {
97
+ aiProportion = Math.round((aiPercentage / totalContext) * 100);
98
+ humanProportion = 100 - aiProportion;
99
+ }
100
+ // Build the visual bar
101
+ const lines = [];
102
+ // Header matching fafdev.tools style
103
+ lines.push('');
104
+ if (isBalanced) {
105
+ lines.push(colors_1.colors.success(colors_1.colors.bold(' PRD Balance')));
106
+ }
107
+ else {
108
+ lines.push(colors_1.colors.bright(colors_1.colors.bold(' AI|HUMAN CONTEXT BALANCE')));
109
+ }
110
+ lines.push('');
111
+ // Build the single unified bar
112
+ const aiBarWidth = Math.round((aiProportion / 100) * this.BAR_WIDTH);
113
+ const humanBarWidth = this.BAR_WIDTH - aiBarWidth;
114
+ let barLine = ' ';
115
+ // GREEN celebration when perfectly balanced!
116
+ if (isBalanced) {
117
+ // Entire bar turns GREEN for perfect balance
118
+ barLine += colors_1.bars.green(this.BAR_WIDTH);
119
+ }
120
+ else {
121
+ // Normal cyan/orange split when not balanced
122
+ if (aiBarWidth > 0 && humanBarWidth > 0) {
123
+ barLine += colors_1.bars.cyan(aiBarWidth);
124
+ barLine += colors_1.bars.orange(humanBarWidth);
125
+ }
126
+ else if (aiBarWidth > 0) {
127
+ barLine += colors_1.bars.cyan(this.BAR_WIDTH);
128
+ }
129
+ else {
130
+ barLine += colors_1.bars.orange(this.BAR_WIDTH);
131
+ }
132
+ }
133
+ lines.push(barLine);
134
+ // Guidance text
135
+ lines.push('');
136
+ if (isBalanced) {
137
+ lines.push(colors_1.colors.muted(' ⚖️ PERFECT BALANCE!'));
138
+ }
139
+ else {
140
+ lines.push(colors_1.colors.muted(' DROP FILES OR ADD CONTEXT TO SEE AI/HUMAN BALANCE'));
141
+ }
142
+ // Status message
143
+ lines.push('');
144
+ if (isBalanced) {
145
+ lines.push(colors_1.colors.success(' ✅ Your context is perfectly balanced!'));
146
+ lines.push(colors_1.colors.success(' 🏆 AI understands your tech, you provide the meaning'));
147
+ }
148
+ else if (aiPercentage > humanPercentage + 20) {
149
+ lines.push(colors_1.colors.warning(' 📝 Add more human context (who, what, why, etc.)'));
150
+ lines.push(colors_1.colors.muted(' 💡 AI detected your tech, now tell your story'));
151
+ }
152
+ else if (humanPercentage > aiPercentage + 20) {
153
+ lines.push(colors_1.colors.warning(' 🔧 Add more technical details (stack, dependencies)'));
154
+ lines.push(colors_1.colors.muted(' 💡 Great story, now specify the implementation'));
155
+ }
156
+ else if (aiPercentage < 30 && humanPercentage < 30) {
157
+ lines.push(colors_1.colors.error(' ⚠️ Both AI and HUMAN context are low'));
158
+ lines.push(colors_1.colors.muted(' 💡 Start by filling in basic project info'));
159
+ }
160
+ else {
161
+ lines.push(colors_1.colors.primary(' 🎯 Getting closer to balance!'));
162
+ lines.push(colors_1.colors.muted(` 📊 AI: ${aiPercentage}% | HUMAN: ${humanPercentage}%`));
163
+ }
164
+ return lines.join('\n');
165
+ }
166
+ /**
167
+ * Generate a compact balance indicator for inline display
168
+ */
169
+ static generateCompactBalance(balance) {
170
+ const { aiPercentage, humanPercentage, isBalanced } = balance;
171
+ if (isBalanced) {
172
+ return colors_1.colors.success('⚖️ BALANCED');
173
+ }
174
+ const aiColor = colors_1.colors.primary;
175
+ const humanColor = colors_1.colors.secondary;
176
+ return `${aiColor(`AI:${aiPercentage}%`)} | ${humanColor(`HUMAN:${humanPercentage}%`)}`;
177
+ }
178
+ /**
179
+ * Get balance achievement message for gamification
180
+ */
181
+ static getAchievementMessage(balance) {
182
+ const { isBalanced, aiPercentage, humanPercentage } = balance;
183
+ if (isBalanced && aiPercentage >= 80 && humanPercentage >= 80) {
184
+ return colors_1.colors.success(colors_1.colors.bold('🏆 CHAMPION BALANCE - Both AI and HUMAN above 80%!'));
185
+ }
186
+ else if (isBalanced) {
187
+ return colors_1.colors.success('✨ Balance achieved! Keep adding context to reach Champion status');
188
+ }
189
+ else if (Math.abs(aiPercentage - humanPercentage) <= 5) {
190
+ return colors_1.colors.warning('🔥 So close to perfect balance! Just a few more fields...');
191
+ }
192
+ return null;
193
+ }
194
+ }
195
+ exports.BalanceVisualizer = BalanceVisualizer;
196
+ //# sourceMappingURL=balance-visualizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balance-visualizer.js","sourceRoot":"","sources":["../../src/utils/balance-visualizer.ts"],"names":[],"mappings":"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"}