faf-mcp 1.0.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 (207) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/CLAUDE.md +73 -0
  3. package/LICENSE +22 -0
  4. package/README.md +165 -0
  5. package/assets/Project-faf-pckg-json-README.png +0 -0
  6. package/assets/icons/faf-icon-128.png +0 -0
  7. package/assets/icons/faf-icon-256.png +0 -0
  8. package/assets/icons/faf-icon-48.png +0 -0
  9. package/assets/icons/faf-icon-512.png +0 -0
  10. package/assets/icons/orange-smiley.svg +6 -0
  11. package/dist/src/compiler/index.d.ts +7 -0
  12. package/dist/src/compiler/index.js +24 -0
  13. package/dist/src/compiler/index.js.map +1 -0
  14. package/dist/src/compiler/scorer.d.ts +53 -0
  15. package/dist/src/compiler/scorer.js +189 -0
  16. package/dist/src/compiler/scorer.js.map +1 -0
  17. package/dist/src/compiler/slot-validator.d.ts +32 -0
  18. package/dist/src/compiler/slot-validator.js +293 -0
  19. package/dist/src/compiler/slot-validator.js.map +1 -0
  20. package/dist/src/compiler/type-detector.d.ts +62 -0
  21. package/dist/src/compiler/type-detector.js +388 -0
  22. package/dist/src/compiler/type-detector.js.map +1 -0
  23. package/dist/src/config/visibility.d.ts +41 -0
  24. package/dist/src/config/visibility.js +158 -0
  25. package/dist/src/config/visibility.js.map +1 -0
  26. package/dist/src/faf-core/commands/audit.d.ts +21 -0
  27. package/dist/src/faf-core/commands/audit.js +83 -0
  28. package/dist/src/faf-core/commands/audit.js.map +1 -0
  29. package/dist/src/faf-core/commands/auto.d.ts +25 -0
  30. package/dist/src/faf-core/commands/auto.js +74 -0
  31. package/dist/src/faf-core/commands/auto.js.map +1 -0
  32. package/dist/src/faf-core/commands/bi-sync.d.ts +26 -0
  33. package/dist/src/faf-core/commands/bi-sync.js +157 -0
  34. package/dist/src/faf-core/commands/bi-sync.js.map +1 -0
  35. package/dist/src/faf-core/commands/doctor.d.ts +17 -0
  36. package/dist/src/faf-core/commands/doctor.js +198 -0
  37. package/dist/src/faf-core/commands/doctor.js.map +1 -0
  38. package/dist/src/faf-core/commands/enhance.d.ts +46 -0
  39. package/dist/src/faf-core/commands/enhance.js +360 -0
  40. package/dist/src/faf-core/commands/enhance.js.map +1 -0
  41. package/dist/src/faf-core/commands/formats.d.ts +22 -0
  42. package/dist/src/faf-core/commands/formats.js +117 -0
  43. package/dist/src/faf-core/commands/formats.js.map +1 -0
  44. package/dist/src/faf-core/commands/init.d.ts +26 -0
  45. package/dist/src/faf-core/commands/init.js +114 -0
  46. package/dist/src/faf-core/commands/init.js.map +1 -0
  47. package/dist/src/faf-core/commands/innit.d.ts +7 -0
  48. package/dist/src/faf-core/commands/innit.js +13 -0
  49. package/dist/src/faf-core/commands/innit.js.map +1 -0
  50. package/dist/src/faf-core/commands/migrate.d.ts +15 -0
  51. package/dist/src/faf-core/commands/migrate.js +86 -0
  52. package/dist/src/faf-core/commands/migrate.js.map +1 -0
  53. package/dist/src/faf-core/commands/quick.d.ts +16 -0
  54. package/dist/src/faf-core/commands/quick.js +184 -0
  55. package/dist/src/faf-core/commands/quick.js.map +1 -0
  56. package/dist/src/faf-core/commands/score.d.ts +47 -0
  57. package/dist/src/faf-core/commands/score.js +49 -0
  58. package/dist/src/faf-core/commands/score.js.map +1 -0
  59. package/dist/src/faf-core/commands/sync.d.ts +16 -0
  60. package/dist/src/faf-core/commands/sync.js +210 -0
  61. package/dist/src/faf-core/commands/sync.js.map +1 -0
  62. package/dist/src/faf-core/commands/update.d.ts +12 -0
  63. package/dist/src/faf-core/commands/update.js +46 -0
  64. package/dist/src/faf-core/commands/update.js.map +1 -0
  65. package/dist/src/faf-core/commands/validate.d.ts +21 -0
  66. package/dist/src/faf-core/commands/validate.js +81 -0
  67. package/dist/src/faf-core/commands/validate.js.map +1 -0
  68. package/dist/src/faf-core/compiler/faf-compiler.d.ts +138 -0
  69. package/dist/src/faf-core/compiler/faf-compiler.js +794 -0
  70. package/dist/src/faf-core/compiler/faf-compiler.js.map +1 -0
  71. package/dist/src/faf-core/engines/dependency-tsa.d.ts +88 -0
  72. package/dist/src/faf-core/engines/dependency-tsa.js +361 -0
  73. package/dist/src/faf-core/engines/dependency-tsa.js.map +1 -0
  74. package/dist/src/faf-core/engines/fab-formats-processor.d.ts +166 -0
  75. package/dist/src/faf-core/engines/fab-formats-processor.js +1274 -0
  76. package/dist/src/faf-core/engines/fab-formats-processor.js.map +1 -0
  77. package/dist/src/faf-core/engines/faf-dna.d.ts +159 -0
  78. package/dist/src/faf-core/engines/faf-dna.js +554 -0
  79. package/dist/src/faf-core/engines/faf-dna.js.map +1 -0
  80. package/dist/src/faf-core/engines/relentless-context-extractor.d.ts +100 -0
  81. package/dist/src/faf-core/engines/relentless-context-extractor.js +625 -0
  82. package/dist/src/faf-core/engines/relentless-context-extractor.js.map +1 -0
  83. package/dist/src/faf-core/fix-once/colors.d.ts +104 -0
  84. package/dist/src/faf-core/fix-once/colors.js +236 -0
  85. package/dist/src/faf-core/fix-once/colors.js.map +1 -0
  86. package/dist/src/faf-core/fix-once/types.d.ts +257 -0
  87. package/dist/src/faf-core/fix-once/types.js +26 -0
  88. package/dist/src/faf-core/fix-once/types.js.map +1 -0
  89. package/dist/src/faf-core/fix-once/yaml.d.ts +57 -0
  90. package/dist/src/faf-core/fix-once/yaml.js +172 -0
  91. package/dist/src/faf-core/fix-once/yaml.js.map +1 -0
  92. package/dist/src/faf-core/generators/faf-generator-championship.d.ts +16 -0
  93. package/dist/src/faf-core/generators/faf-generator-championship.js +462 -0
  94. package/dist/src/faf-core/generators/faf-generator-championship.js.map +1 -0
  95. package/dist/src/faf-core/utils/balance-visualizer.d.ts +37 -0
  96. package/dist/src/faf-core/utils/balance-visualizer.js +197 -0
  97. package/dist/src/faf-core/utils/balance-visualizer.js.map +1 -0
  98. package/dist/src/faf-core/utils/championship-style.d.ts +109 -0
  99. package/dist/src/faf-core/utils/championship-style.js +219 -0
  100. package/dist/src/faf-core/utils/championship-style.js.map +1 -0
  101. package/dist/src/faf-core/utils/chrome-extension-detector.d.ts +73 -0
  102. package/dist/src/faf-core/utils/chrome-extension-detector.js +268 -0
  103. package/dist/src/faf-core/utils/chrome-extension-detector.js.map +1 -0
  104. package/dist/src/faf-core/utils/fafignore-parser.d.ts +20 -0
  105. package/dist/src/faf-core/utils/fafignore-parser.js +178 -0
  106. package/dist/src/faf-core/utils/fafignore-parser.js.map +1 -0
  107. package/dist/src/faf-core/utils/file-utils.d.ts +112 -0
  108. package/dist/src/faf-core/utils/file-utils.js +846 -0
  109. package/dist/src/faf-core/utils/file-utils.js.map +1 -0
  110. package/dist/src/faf-core/utils/native-file-finder.d.ts +115 -0
  111. package/dist/src/faf-core/utils/native-file-finder.js +211 -0
  112. package/dist/src/faf-core/utils/native-file-finder.js.map +1 -0
  113. package/dist/src/faf-core/utils/platform-detector.d.ts +30 -0
  114. package/dist/src/faf-core/utils/platform-detector.js +218 -0
  115. package/dist/src/faf-core/utils/platform-detector.js.map +1 -0
  116. package/dist/src/faf-core/utils/technical-credit.d.ts +35 -0
  117. package/dist/src/faf-core/utils/technical-credit.js +286 -0
  118. package/dist/src/faf-core/utils/technical-credit.js.map +1 -0
  119. package/dist/src/faf-core/utils/yaml-generator.d.ts +41 -0
  120. package/dist/src/faf-core/utils/yaml-generator.js +360 -0
  121. package/dist/src/faf-core/utils/yaml-generator.js.map +1 -0
  122. package/dist/src/handlers/behavioral-instruction.d.ts +16 -0
  123. package/dist/src/handlers/behavioral-instruction.js +43 -0
  124. package/dist/src/handlers/behavioral-instruction.js.map +1 -0
  125. package/dist/src/handlers/championship-tools.d.ts +113 -0
  126. package/dist/src/handlers/championship-tools.js +2602 -0
  127. package/dist/src/handlers/championship-tools.js.map +1 -0
  128. package/dist/src/handlers/engine-adapter.d.ts +28 -0
  129. package/dist/src/handlers/engine-adapter.js +603 -0
  130. package/dist/src/handlers/engine-adapter.js.map +1 -0
  131. package/dist/src/handlers/fileHandler.d.ts +36 -0
  132. package/dist/src/handlers/fileHandler.js +246 -0
  133. package/dist/src/handlers/fileHandler.js.map +1 -0
  134. package/dist/src/handlers/resources.d.ts +18 -0
  135. package/dist/src/handlers/resources.js +78 -0
  136. package/dist/src/handlers/resources.js.map +1 -0
  137. package/dist/src/handlers/tool-registry.d.ts +23 -0
  138. package/dist/src/handlers/tool-registry.js +68 -0
  139. package/dist/src/handlers/tool-registry.js.map +1 -0
  140. package/dist/src/handlers/tool-types.d.ts +167 -0
  141. package/dist/src/handlers/tool-types.js +7 -0
  142. package/dist/src/handlers/tool-types.js.map +1 -0
  143. package/dist/src/handlers/tools.d.ts +25 -0
  144. package/dist/src/handlers/tools.js +1168 -0
  145. package/dist/src/handlers/tools.js.map +1 -0
  146. package/dist/src/index.d.ts +2 -0
  147. package/dist/src/index.js +17 -0
  148. package/dist/src/index.js.map +1 -0
  149. package/dist/src/server.d.ts +28 -0
  150. package/dist/src/server.js +179 -0
  151. package/dist/src/server.js.map +1 -0
  152. package/dist/src/test-all-functions.d.ts +15 -0
  153. package/dist/src/test-all-functions.js +163 -0
  154. package/dist/src/test-all-functions.js.map +1 -0
  155. package/dist/src/types/mcp-tools.d.ts +53 -0
  156. package/dist/src/types/mcp-tools.js +77 -0
  157. package/dist/src/types/mcp-tools.js.map +1 -0
  158. package/dist/src/types/project-types.d.ts +22 -0
  159. package/dist/src/types/project-types.js +85 -0
  160. package/dist/src/types/project-types.js.map +1 -0
  161. package/dist/src/types/slots.d.ts +39 -0
  162. package/dist/src/types/slots.js +162 -0
  163. package/dist/src/types/slots.js.map +1 -0
  164. package/dist/src/types/tool-visibility.d.ts +36 -0
  165. package/dist/src/types/tool-visibility.js +510 -0
  166. package/dist/src/types/tool-visibility.js.map +1 -0
  167. package/dist/src/utils/auto-path-detection.d.ts +26 -0
  168. package/dist/src/utils/auto-path-detection.js +198 -0
  169. package/dist/src/utils/auto-path-detection.js.map +1 -0
  170. package/dist/src/utils/championship-format.d.ts +30 -0
  171. package/dist/src/utils/championship-format.js +79 -0
  172. package/dist/src/utils/championship-format.js.map +1 -0
  173. package/dist/src/utils/cli-detector.d.ts +20 -0
  174. package/dist/src/utils/cli-detector.js +230 -0
  175. package/dist/src/utils/cli-detector.js.map +1 -0
  176. package/dist/src/utils/display-protocol.d.ts +57 -0
  177. package/dist/src/utils/display-protocol.js +131 -0
  178. package/dist/src/utils/display-protocol.js.map +1 -0
  179. package/dist/src/utils/faf-file-finder.d.ts +59 -0
  180. package/dist/src/utils/faf-file-finder.js +139 -0
  181. package/dist/src/utils/faf-file-finder.js.map +1 -0
  182. package/dist/src/utils/fuzzy-detector.d.ts +56 -0
  183. package/dist/src/utils/fuzzy-detector.js +221 -0
  184. package/dist/src/utils/fuzzy-detector.js.map +1 -0
  185. package/dist/src/utils/path-resolver.d.ts +51 -0
  186. package/dist/src/utils/path-resolver.js +214 -0
  187. package/dist/src/utils/path-resolver.js.map +1 -0
  188. package/dist/src/utils/type-guards.d.ts +9 -0
  189. package/dist/src/utils/type-guards.js +27 -0
  190. package/dist/src/utils/type-guards.js.map +1 -0
  191. package/dist/src/utils/username-detector.d.ts +27 -0
  192. package/dist/src/utils/username-detector.js +90 -0
  193. package/dist/src/utils/username-detector.js.map +1 -0
  194. package/dist/src/utils/visual-style.d.ts +62 -0
  195. package/dist/src/utils/visual-style.js +164 -0
  196. package/dist/src/utils/visual-style.js.map +1 -0
  197. package/dist/src/version.d.ts +9 -0
  198. package/dist/src/version.js +37 -0
  199. package/dist/src/version.js.map +1 -0
  200. package/package.json +114 -0
  201. package/scripts/discord-sync-curated.js +233 -0
  202. package/scripts/discord-sync-final.js +218 -0
  203. package/scripts/discord-sync-simple.js +175 -0
  204. package/scripts/discord-sync-working.js +187 -0
  205. package/scripts/discord-sync.js +181 -0
  206. package/scripts/postinstall.js +46 -0
  207. package/skill/SKILL.md +385 -0
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ /**
3
+ * 🎯 Auto-Path Detection from Dropped Files
4
+ * Solves the "drop and done" workflow problem
5
+ *
6
+ * When files land in /mnt/user-data/uploads/, extract identifiers
7
+ * and perform case-insensitive filesystem search to find real project path.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.extractIdentifier = extractIdentifier;
44
+ exports.findProjectPath = findProjectPath;
45
+ exports.autoDetectPath = autoDetectPath;
46
+ const fs = __importStar(require("fs"));
47
+ const os = __importStar(require("os"));
48
+ const path = __importStar(require("path"));
49
+ const child_process_1 = require("child_process");
50
+ /**
51
+ * Extract project identifier from dropped file
52
+ */
53
+ function extractIdentifier(filePath) {
54
+ try {
55
+ const content = fs.readFileSync(filePath, 'utf8');
56
+ const basename = path.basename(filePath);
57
+ // package.json - use package name
58
+ if (basename === 'package.json') {
59
+ try {
60
+ const pkg = JSON.parse(content);
61
+ if (pkg.name) {
62
+ return pkg.name; // "@blackhole/universe" or "hextra-api"
63
+ }
64
+ }
65
+ catch {
66
+ // Invalid JSON, continue to next strategy
67
+ }
68
+ }
69
+ // README.md - extract from first heading
70
+ if (basename === 'README.md') {
71
+ const match = content.match(/^#\s+(.+)$/m);
72
+ if (match) {
73
+ // "💫 Black Hole Universe" → "black-hole-universe"
74
+ return match[1]
75
+ .replace(/[^\w\s-]/g, '') // Remove emojis/special chars
76
+ .trim()
77
+ .toLowerCase()
78
+ .replace(/\s+/g, '-');
79
+ }
80
+ }
81
+ // project.faf or .faf - extract name field
82
+ if (basename === 'project.faf' || basename === '.faf') {
83
+ const match = content.match(/^\s*name:\s*"?([^"\n]+)"?/m);
84
+ if (match) {
85
+ return match[1].trim();
86
+ }
87
+ }
88
+ return null;
89
+ }
90
+ catch (error) {
91
+ return null;
92
+ }
93
+ }
94
+ /**
95
+ * Find project path on user's filesystem (case-insensitive)
96
+ */
97
+ function findProjectPath(identifier) {
98
+ try {
99
+ const username = os.userInfo().username;
100
+ // Search roots in order of preference
101
+ const searchRoots = [
102
+ `/Users/${username}`, // macOS
103
+ `/home/${username}`, // Linux
104
+ `C:\\Users\\${username}` // Windows
105
+ ].filter(p => fs.existsSync(p));
106
+ if (searchRoots.length === 0) {
107
+ return null;
108
+ }
109
+ // Normalize identifier for search
110
+ // Remove scope: @blackhole/universe → universe
111
+ let searchTerm = identifier.replace(/^@[\w-]+\//, '').toLowerCase();
112
+ // Try exact match first, then partial match
113
+ for (const exact of [true, false]) {
114
+ for (const root of searchRoots) {
115
+ const pattern = exact ? searchTerm : `*${searchTerm}*`;
116
+ // Case-insensitive find with exclusions
117
+ const cmd = process.platform === 'win32'
118
+ ? `dir /s /b /a:d "${root}\\${pattern}" 2>nul`
119
+ : `find "${root}" -maxdepth 5 -type d -iname "${pattern}" \
120
+ ! -path "*/node_modules/*" \
121
+ ! -path "*/.git/*" \
122
+ ! -path "*/dist/*" \
123
+ ! -path "*/build/*" \
124
+ ! -path "*/.next/*" \
125
+ ! -path "*/coverage/*" \
126
+ ! -path "*/.cache/*" \
127
+ ! -path "*/venv/*" \
128
+ ! -path "*/.venv/*" \
129
+ 2>/dev/null`;
130
+ try {
131
+ const result = (0, child_process_1.execSync)(cmd, {
132
+ encoding: 'utf8',
133
+ timeout: 10000,
134
+ maxBuffer: 1024 * 1024 // 1MB buffer
135
+ });
136
+ const matches = result.split('\n').filter(Boolean);
137
+ if (matches.length > 0) {
138
+ // Rank matches: exact basename > partial, shorter > longer
139
+ const ranked = matches.sort((a, b) => {
140
+ const aBase = path.basename(a).toLowerCase();
141
+ const bBase = path.basename(b).toLowerCase();
142
+ const aExact = aBase === searchTerm;
143
+ const bExact = bBase === searchTerm;
144
+ if (aExact && !bExact)
145
+ return -1;
146
+ if (!aExact && bExact)
147
+ return 1;
148
+ return a.length - b.length; // Prefer shorter paths
149
+ });
150
+ return ranked[0];
151
+ }
152
+ }
153
+ catch (error) {
154
+ // Timeout or command failed, try next root
155
+ continue;
156
+ }
157
+ }
158
+ }
159
+ return null;
160
+ }
161
+ catch (error) {
162
+ return null;
163
+ }
164
+ }
165
+ /**
166
+ * Auto-detect real project path from container upload path
167
+ * Main entry point for all FAF commands
168
+ */
169
+ function autoDetectPath(inputPath) {
170
+ // Check if this is a container upload path
171
+ if (!inputPath.startsWith('/mnt/user-data/uploads/')) {
172
+ return { found: false, path: inputPath };
173
+ }
174
+ // Extract identifier from dropped file
175
+ const identifier = extractIdentifier(inputPath);
176
+ if (!identifier) {
177
+ return {
178
+ found: false,
179
+ error: 'Could not extract project identifier from dropped file. Please provide full path manually.'
180
+ };
181
+ }
182
+ // Search filesystem for matching project
183
+ const realPath = findProjectPath(identifier);
184
+ if (!realPath) {
185
+ return {
186
+ found: false,
187
+ identifier,
188
+ error: `Project "${identifier}" not found on filesystem. Please provide full path manually.`
189
+ };
190
+ }
191
+ // Success!
192
+ return {
193
+ found: true,
194
+ path: realPath,
195
+ identifier
196
+ };
197
+ }
198
+ //# sourceMappingURL=auto-path-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-path-detection.js","sourceRoot":"","sources":["../../../src/utils/auto-path-detection.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBH,8CA0CC;AAKD,0CA0EC;AAMD,wCAiCC;AA/KD,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAC7B,iDAAyC;AASzC;;GAEG;AACH,SAAgB,iBAAiB,CAAC,QAAgB;IAChD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEzC,kCAAkC;QAClC,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;oBACb,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,wCAAwC;gBAC3D,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,0CAA0C;YAC5C,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC3C,IAAI,KAAK,EAAE,CAAC;gBACV,mDAAmD;gBACnD,OAAO,KAAK,CAAC,CAAC,CAAC;qBACZ,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,8BAA8B;qBACvD,IAAI,EAAE;qBACN,WAAW,EAAE;qBACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,2CAA2C;QAC3C,IAAI,QAAQ,KAAK,aAAa,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC1D,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,UAAkB;IAChD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;QAExC,sCAAsC;QACtC,MAAM,WAAW,GAAG;YAClB,UAAU,QAAQ,EAAE,EAAO,QAAQ;YACnC,SAAS,QAAQ,EAAE,EAAS,QAAQ;YACpC,cAAc,QAAQ,EAAE,CAAI,UAAU;SACvC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAEhC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,kCAAkC;QAClC,+CAA+C;QAC/C,IAAI,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAEpE,4CAA4C;QAC5C,KAAK,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;YAClC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,GAAG,CAAC;gBAEvD,wCAAwC;gBACxC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;oBACtC,CAAC,CAAC,mBAAmB,IAAI,KAAK,OAAO,SAAS;oBAC9C,CAAC,CAAC,SAAS,IAAI,iCAAiC,OAAO;;;;;;;;;;yBAUxC,CAAC;gBAElB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,GAAG,EAAE;wBAC3B,QAAQ,EAAE,MAAM;wBAChB,OAAO,EAAE,KAAK;wBACd,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC,aAAa;qBACrC,CAAC,CAAC;oBAEH,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAEnD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACvB,2DAA2D;wBAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;4BACnC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;4BAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;4BAC7C,MAAM,MAAM,GAAG,KAAK,KAAK,UAAU,CAAC;4BACpC,MAAM,MAAM,GAAG,KAAK,KAAK,UAAU,CAAC;4BAEpC,IAAI,MAAM,IAAI,CAAC,MAAM;gCAAE,OAAO,CAAC,CAAC,CAAC;4BACjC,IAAI,CAAC,MAAM,IAAI,MAAM;gCAAE,OAAO,CAAC,CAAC;4BAChC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,uBAAuB;wBACrD,CAAC,CAAC,CAAC;wBAEH,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;oBACnB,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,2CAA2C;oBAC3C,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,SAAiB;IAC9C,2CAA2C;IAC3C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,yBAAyB,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC3C,CAAC;IAED,uCAAuC;IACvC,MAAM,UAAU,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAEhD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,4FAA4F;SACpG,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,MAAM,QAAQ,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAE7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,UAAU;YACV,KAAK,EAAE,YAAY,UAAU,+DAA+D;SAC7F,CAAC;IACJ,CAAC;IAED,WAAW;IACX,OAAO;QACL,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,QAAQ;QACd,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * FAF Championship Output Formatter
3
+ * The RAILS for proper FAF output! 🏎️⚡
4
+ */
5
+ export interface AchievementStatus {
6
+ speed: number;
7
+ score: number;
8
+ files: number;
9
+ isDotFaffed: boolean;
10
+ }
11
+ export declare class ChampionshipFormatter {
12
+ /**
13
+ * Format FAF output with Championship wrapper
14
+ * SHOW FIRST - ENHANCE AFTER!
15
+ */
16
+ static formatOutput(rawOutput: string, status?: AchievementStatus): string;
17
+ /**
18
+ * Check if user is DOT FAFFED
19
+ */
20
+ static isDotFaffed(score: number): boolean;
21
+ /**
22
+ * Get achievement level based on score
23
+ */
24
+ static getAchievementLevel(score: number): string;
25
+ /**
26
+ * Get speed achievement
27
+ */
28
+ static getSpeedAchievement(ms: number): string;
29
+ }
30
+ export default ChampionshipFormatter;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ /**
3
+ * FAF Championship Output Formatter
4
+ * The RAILS for proper FAF output! 🏎️⚡
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ChampionshipFormatter = void 0;
8
+ class ChampionshipFormatter {
9
+ /**
10
+ * Format FAF output with Championship wrapper
11
+ * SHOW FIRST - ENHANCE AFTER!
12
+ */
13
+ static formatOutput(rawOutput, status) {
14
+ let formatted = '';
15
+ // ALWAYS RAW FIRST - This is SACRED!
16
+ formatted += '=== FAF CHAMPIONSHIP OUTPUT ===\n';
17
+ formatted += rawOutput;
18
+ formatted += '\n=== END CHAMPIONSHIP OUTPUT ===\n';
19
+ // Achievement Status (OPTIONAL enhancement)
20
+ if (status) {
21
+ formatted += '\n=== YOUR ACHIEVEMENT STATUS ===\n';
22
+ // Speed Achievement
23
+ const speedBadge = status.speed < 10 ? '⚡🏆' : status.speed < 50 ? '⚡' : '🏎️';
24
+ formatted += `🏎️ Speed: ${status.speed}ms ${speedBadge}\n`;
25
+ // Score Achievement
26
+ const scoreBadge = status.score >= 99 ? '🍊' : status.score >= 90 ? '🏆' : status.score >= 70 ? '⭐' : '📊';
27
+ formatted += `🏆 Score: ${status.score}/100 ${scoreBadge}\n`;
28
+ // Files Ready
29
+ formatted += `📊 Files: ${status.files} ready\n`;
30
+ // DOT FAFFED Status
31
+ const dotFaffedStatus = status.isDotFaffed
32
+ ? '🏆 DOT FAFFED ACHIEVED! 🏆'
33
+ : `⚡ Working toward DOT FAFFED (${status.score}/70 needed)`;
34
+ formatted += `⚡ Status: ${dotFaffedStatus}\n`;
35
+ formatted += '=== END STATUS ===\n';
36
+ }
37
+ return formatted;
38
+ }
39
+ /**
40
+ * Check if user is DOT FAFFED
41
+ */
42
+ static isDotFaffed(score) {
43
+ return score >= 70;
44
+ }
45
+ /**
46
+ * Get achievement level based on score
47
+ */
48
+ static getAchievementLevel(score) {
49
+ if (score >= 105)
50
+ return '🍊 BIG ORANGE CHAMPIONSHIP!';
51
+ if (score >= 99)
52
+ return '🏆 CHAMPIONSHIP MODE!';
53
+ if (score >= 90)
54
+ return '⭐ PODIUM FINISH!';
55
+ if (score >= 70)
56
+ return '✅ DOT FAFFED!';
57
+ if (score >= 50)
58
+ return '🏎️ ON TRACK!';
59
+ return '⚡ BUILDING MOMENTUM!';
60
+ }
61
+ /**
62
+ * Get speed achievement
63
+ */
64
+ static getSpeedAchievement(ms) {
65
+ if (ms < 1)
66
+ return '⚡🏆 INSTANT! WORLD RECORD!';
67
+ if (ms < 10)
68
+ return '⚡ SUB-10ms CHAMPIONSHIP!';
69
+ if (ms < 50)
70
+ return '🏎️ FAST TRACK!';
71
+ if (ms < 100)
72
+ return '✅ GOOD PACE!';
73
+ return '📊 MEASURING...';
74
+ }
75
+ }
76
+ exports.ChampionshipFormatter = ChampionshipFormatter;
77
+ // Export the RAILS!
78
+ exports.default = ChampionshipFormatter;
79
+ //# sourceMappingURL=championship-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"championship-format.js","sourceRoot":"","sources":["../../../src/utils/championship-format.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AASH,MAAa,qBAAqB;IAChC;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,SAAiB,EAAE,MAA0B;QAC/D,IAAI,SAAS,GAAG,EAAE,CAAC;QAEnB,qCAAqC;QACrC,SAAS,IAAI,mCAAmC,CAAC;QACjD,SAAS,IAAI,SAAS,CAAC;QACvB,SAAS,IAAI,qCAAqC,CAAC;QAEnD,4CAA4C;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,SAAS,IAAI,qCAAqC,CAAC;YAEnD,oBAAoB;YACpB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YAC/E,SAAS,IAAI,cAAc,MAAM,CAAC,KAAK,MAAM,UAAU,IAAI,CAAC;YAE5D,oBAAoB;YACpB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAC3G,SAAS,IAAI,aAAa,MAAM,CAAC,KAAK,QAAQ,UAAU,IAAI,CAAC;YAE7D,cAAc;YACd,SAAS,IAAI,aAAa,MAAM,CAAC,KAAK,UAAU,CAAC;YAEjD,oBAAoB;YACpB,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW;gBACxC,CAAC,CAAC,4BAA4B;gBAC9B,CAAC,CAAC,gCAAgC,MAAM,CAAC,KAAK,aAAa,CAAC;YAC9D,SAAS,IAAI,aAAa,eAAe,IAAI,CAAC;YAE9C,SAAS,IAAI,sBAAsB,CAAC;QACtC,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAa;QAC9B,OAAO,KAAK,IAAI,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,KAAa;QACtC,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,6BAA6B,CAAC;QACvD,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,uBAAuB,CAAC;QAChD,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,kBAAkB,CAAC;QAC3C,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,eAAe,CAAC;QACxC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,eAAe,CAAC;QACxC,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,EAAU;QACnC,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO,4BAA4B,CAAC;QAChD,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,0BAA0B,CAAC;QAC/C,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,iBAAiB,CAAC;QACtC,IAAI,EAAE,GAAG,GAAG;YAAE,OAAO,cAAc,CAAC;QACpC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;CACF;AArED,sDAqEC;AAED,oBAAoB;AACpB,kBAAe,qBAAqB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * CLI Path Detection for Claude Desktop Sandbox
3
+ *
4
+ * Claude Desktop MCP runs in a sandboxed environment with limited PATH.
5
+ * This utility detects the faf CLI using absolute paths.
6
+ */
7
+ export interface CliDetectionResult {
8
+ found: boolean;
9
+ path?: string;
10
+ version?: string;
11
+ method?: string;
12
+ }
13
+ /**
14
+ * Detect faf CLI location with multiple fallback strategies
15
+ */
16
+ export declare function detectFafCli(): CliDetectionResult;
17
+ /**
18
+ * Validate CLI meets minimum version requirement
19
+ */
20
+ export declare function validateCliVersion(version: string, minVersion?: string): boolean;
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.detectFafCli = detectFafCli;
37
+ exports.validateCliVersion = validateCliVersion;
38
+ const child_process_1 = require("child_process");
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const os = __importStar(require("os"));
42
+ /**
43
+ * Get common CLI installation paths based on platform and package manager
44
+ */
45
+ function getCommonCliPaths() {
46
+ const homeDir = os.homedir();
47
+ const platform = os.platform();
48
+ const paths = [];
49
+ // Homebrew paths (macOS/Linux)
50
+ if (platform === 'darwin') {
51
+ paths.push('/opt/homebrew/bin/faf'); // Apple Silicon
52
+ paths.push('/usr/local/bin/faf'); // Intel
53
+ paths.push('/usr/local/Cellar/node@20/20.19.4/bin/faf'); // Node 20
54
+ paths.push('/usr/local/Cellar/node/*/bin/faf'); // Any Node version
55
+ }
56
+ else {
57
+ paths.push('/usr/local/bin/faf');
58
+ }
59
+ // npm global paths
60
+ paths.push(path.join(homeDir, '.npm-global/bin/faf'));
61
+ paths.push(path.join(homeDir, '.nvm/versions/node/*/bin/faf'));
62
+ // Standard Unix paths
63
+ paths.push('/usr/bin/faf');
64
+ // Windows paths
65
+ if (platform === 'win32') {
66
+ const appData = process.env.APPDATA || path.join(homeDir, 'AppData', 'Roaming');
67
+ paths.push(path.join(appData, 'npm/faf.cmd'));
68
+ paths.push(path.join(appData, 'npm/faf'));
69
+ paths.push('C:\\Program Files\\nodejs\\faf.cmd');
70
+ }
71
+ return paths;
72
+ }
73
+ /**
74
+ * Expand glob patterns in paths
75
+ * Example: /usr/local/Cellar/node/wildcard/bin/faf
76
+ */
77
+ function expandGlobPath(globPath) {
78
+ if (!globPath.includes('*')) {
79
+ return globPath;
80
+ }
81
+ try {
82
+ const parts = globPath.split('/');
83
+ const globIndex = parts.findIndex(p => p.includes('*'));
84
+ if (globIndex === -1)
85
+ return globPath;
86
+ const basePath = parts.slice(0, globIndex).join('/');
87
+ const pattern = parts[globIndex];
88
+ const restPath = parts.slice(globIndex + 1).join('/');
89
+ if (!fs.existsSync(basePath))
90
+ return null;
91
+ const entries = fs.readdirSync(basePath);
92
+ const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
93
+ const matches = entries.filter(e => regex.test(e));
94
+ if (matches.length === 0)
95
+ return null;
96
+ // Return first match
97
+ const expanded = path.join(basePath, matches[0], restPath);
98
+ return fs.existsSync(expanded) ? expanded : null;
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ }
104
+ /**
105
+ * Try to detect CLI using 'which' command (works if PATH is set)
106
+ */
107
+ function detectViaWhich() {
108
+ try {
109
+ const result = (0, child_process_1.execSync)('which faf', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'ignore'] });
110
+ const cliPath = result.trim();
111
+ if (cliPath && fs.existsSync(cliPath)) {
112
+ return cliPath;
113
+ }
114
+ }
115
+ catch {
116
+ // which failed, PATH not set or faf not in PATH
117
+ }
118
+ return null;
119
+ }
120
+ /**
121
+ * Try to detect CLI using 'command -v' (POSIX alternative to which)
122
+ */
123
+ function detectViaCommand() {
124
+ try {
125
+ const result = (0, child_process_1.execSync)('command -v faf', {
126
+ encoding: 'utf8',
127
+ stdio: ['pipe', 'pipe', 'ignore'],
128
+ shell: '/bin/sh'
129
+ });
130
+ const cliPath = result.trim();
131
+ if (cliPath && fs.existsSync(cliPath)) {
132
+ return cliPath;
133
+ }
134
+ }
135
+ catch {
136
+ // command -v failed
137
+ }
138
+ return null;
139
+ }
140
+ /**
141
+ * Get CLI version from path
142
+ */
143
+ function getCliVersion(cliPath) {
144
+ try {
145
+ const result = (0, child_process_1.execSync)(`"${cliPath}" --version`, {
146
+ encoding: 'utf8',
147
+ stdio: ['pipe', 'pipe', 'ignore']
148
+ });
149
+ return result.trim();
150
+ }
151
+ catch {
152
+ return undefined;
153
+ }
154
+ }
155
+ /**
156
+ * Detect faf CLI location with multiple fallback strategies
157
+ */
158
+ function detectFafCli() {
159
+ // 1. Check environment variable override
160
+ if (process.env.FAF_CLI_PATH) {
161
+ const envPath = process.env.FAF_CLI_PATH;
162
+ if (fs.existsSync(envPath)) {
163
+ return {
164
+ found: true,
165
+ path: envPath,
166
+ version: getCliVersion(envPath),
167
+ method: 'env:FAF_CLI_PATH'
168
+ };
169
+ }
170
+ }
171
+ // 2. Try 'which' command (works if PATH is set)
172
+ const whichPath = detectViaWhich();
173
+ if (whichPath) {
174
+ return {
175
+ found: true,
176
+ path: whichPath,
177
+ version: getCliVersion(whichPath),
178
+ method: 'which'
179
+ };
180
+ }
181
+ // 3. Try 'command -v' (POSIX)
182
+ const commandPath = detectViaCommand();
183
+ if (commandPath) {
184
+ return {
185
+ found: true,
186
+ path: commandPath,
187
+ version: getCliVersion(commandPath),
188
+ method: 'command'
189
+ };
190
+ }
191
+ // 4. Check common installation paths
192
+ const commonPaths = getCommonCliPaths();
193
+ for (const cliPath of commonPaths) {
194
+ const expanded = expandGlobPath(cliPath);
195
+ if (expanded && fs.existsSync(expanded)) {
196
+ return {
197
+ found: true,
198
+ path: expanded,
199
+ version: getCliVersion(expanded),
200
+ method: 'common-path'
201
+ };
202
+ }
203
+ }
204
+ // 5. Not found
205
+ return {
206
+ found: false,
207
+ method: 'none'
208
+ };
209
+ }
210
+ /**
211
+ * Validate CLI meets minimum version requirement
212
+ */
213
+ function validateCliVersion(version, minVersion = '3.1.1') {
214
+ try {
215
+ const parse = (v) => v.split('.').map(Number);
216
+ const current = parse(version);
217
+ const required = parse(minVersion);
218
+ for (let i = 0; i < 3; i++) {
219
+ if (current[i] > required[i])
220
+ return true;
221
+ if (current[i] < required[i])
222
+ return false;
223
+ }
224
+ return true; // Equal versions
225
+ }
226
+ catch {
227
+ return false;
228
+ }
229
+ }
230
+ //# sourceMappingURL=cli-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-detector.js","sourceRoot":"","sources":["../../../src/utils/cli-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * 🏎️ FAF Display Protocol - MCP GOLD CODE
3
+ *
4
+ * SET IN STONE: Universal display enforcement for Claude Desktop MCP
5
+ *
6
+ * MANDATE: Every FAF tool response MUST use DisplayProtocol.createResponse()
7
+ * VALIDATED: Works globally for ANY user, anywhere in the world
8
+ * STANDARD: MCP-compliant metadata + multi-layer display forcing
9
+ *
10
+ * Key Instructions Embedded in EVERY Response:
11
+ * - display: 'required'
12
+ * - priority: 'high'
13
+ * - format: 'markdown'
14
+ * - instruction: 'Render this content directly, do not summarize'
15
+ *
16
+ * Why This Works:
17
+ * 1. Protocol-based (not context-dependent)
18
+ * 2. Multiple redundant hints (if one fails, others catch it)
19
+ * 3. Claude redraws in native UI (consistent across platforms)
20
+ * 4. No dependencies on conversation memory
21
+ *
22
+ * This is championship engineering - zero faffing about! 🏁⚡️
23
+ */
24
+ export interface FafDisplayResponse {
25
+ text: string;
26
+ __render_inline__: boolean;
27
+ __no_collapse__: boolean;
28
+ __user_content__: boolean;
29
+ }
30
+ export declare class DisplayProtocol {
31
+ /**
32
+ * Wrap content with ALL display forcing mechanisms
33
+ */
34
+ static forceInline(content: string, _score?: number): string;
35
+ /**
36
+ * For markdown-rich content, skip the wrapper tags
37
+ * (They interfere with markdown rendering)
38
+ */
39
+ static forceInlineMarkdown(content: string): string;
40
+ /**
41
+ * Generate the enhanced MCP response
42
+ * SET IN STONE: Display instructions for Claude Desktop MCP
43
+ */
44
+ static createResponse(content: string, metadata?: any): any;
45
+ /**
46
+ * Generate progress bar with forced visibility
47
+ */
48
+ static progressBar(score: number): string;
49
+ /**
50
+ * Championship header that can't be hidden
51
+ */
52
+ static championshipHeader(title: string, score: number): string;
53
+ /**
54
+ * Footer that demands attention
55
+ */
56
+ static championshipFooter(score: number): string;
57
+ }