faf-cli 2.3.4 → 2.4.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 (98) hide show
  1. package/README.md +17 -4
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +128 -5
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/about.d.ts +10 -0
  6. package/dist/commands/about.d.ts.map +1 -0
  7. package/dist/commands/about.js +249 -0
  8. package/dist/commands/about.js.map +1 -0
  9. package/dist/commands/art.d.ts +10 -0
  10. package/dist/commands/art.d.ts.map +1 -0
  11. package/dist/commands/art.js +129 -0
  12. package/dist/commands/art.js.map +1 -0
  13. package/dist/commands/chat.d.ts +1 -0
  14. package/dist/commands/chat.d.ts.map +1 -1
  15. package/dist/commands/chat.js +177 -6
  16. package/dist/commands/chat.js.map +1 -1
  17. package/dist/commands/license-config.d.ts +10 -0
  18. package/dist/commands/license-config.d.ts.map +1 -0
  19. package/dist/commands/license-config.js +140 -0
  20. package/dist/commands/license-config.js.map +1 -0
  21. package/dist/commands/license.d.ts +7 -0
  22. package/dist/commands/license.d.ts.map +1 -0
  23. package/dist/commands/license.js +60 -0
  24. package/dist/commands/license.js.map +1 -0
  25. package/dist/commands/quick.d.ts.map +1 -1
  26. package/dist/commands/quick.js +30 -5
  27. package/dist/commands/quick.js.map +1 -1
  28. package/dist/commands/score-v3.d.ts.map +1 -1
  29. package/dist/commands/score-v3.js +14 -7
  30. package/dist/commands/score-v3.js.map +1 -1
  31. package/dist/commands/score.d.ts.map +1 -1
  32. package/dist/commands/score.js +30 -10
  33. package/dist/commands/score.js.map +1 -1
  34. package/dist/commands/submit-art.d.ts +25 -0
  35. package/dist/commands/submit-art.d.ts.map +1 -0
  36. package/dist/commands/submit-art.js +348 -0
  37. package/dist/commands/submit-art.js.map +1 -0
  38. package/dist/compiler/faf-compiler.d.ts.map +1 -1
  39. package/dist/compiler/faf-compiler.js +41 -4
  40. package/dist/compiler/faf-compiler.js.map +1 -1
  41. package/dist/engine/engine-loader.d.ts +24 -0
  42. package/dist/engine/engine-loader.d.ts.map +1 -0
  43. package/dist/engine/engine-loader.js +156 -0
  44. package/dist/engine/engine-loader.js.map +1 -0
  45. package/dist/engine-bridge.d.ts +5 -5
  46. package/dist/engine-bridge.d.ts.map +1 -1
  47. package/dist/engine-bridge.js +20 -7
  48. package/dist/engine-bridge.js.map +1 -1
  49. package/dist/engine-mk2/mk2-core.d.ts +38 -0
  50. package/dist/engine-mk2/mk2-core.d.ts.map +1 -0
  51. package/dist/engine-mk2/mk2-core.js +217 -0
  52. package/dist/engine-mk2/mk2-core.js.map +1 -0
  53. package/dist/generators/faf-generator-championship.d.ts +6 -0
  54. package/dist/generators/faf-generator-championship.d.ts.map +1 -1
  55. package/dist/generators/faf-generator-championship.js +19 -3
  56. package/dist/generators/faf-generator-championship.js.map +1 -1
  57. package/dist/license/license-config.d.ts +59 -0
  58. package/dist/license/license-config.d.ts.map +1 -0
  59. package/dist/license/license-config.js +263 -0
  60. package/dist/license/license-config.js.map +1 -0
  61. package/dist/license/license-controller.d.ts +41 -0
  62. package/dist/license/license-controller.d.ts.map +1 -0
  63. package/dist/license/license-controller.js +243 -0
  64. package/dist/license/license-controller.js.map +1 -0
  65. package/dist/tests/test-chrome-fuzzy.d.ts +5 -0
  66. package/dist/tests/test-chrome-fuzzy.d.ts.map +1 -0
  67. package/dist/tests/test-chrome-fuzzy.js +71 -0
  68. package/dist/tests/test-chrome-fuzzy.js.map +1 -0
  69. package/dist/utils/art-gallery.d.ts +58 -0
  70. package/dist/utils/art-gallery.d.ts.map +1 -0
  71. package/dist/utils/art-gallery.js +275 -0
  72. package/dist/utils/art-gallery.js.map +1 -0
  73. package/dist/utils/championship-style.d.ts +1 -1
  74. package/dist/utils/championship-style.d.ts.map +1 -1
  75. package/dist/utils/championship-style.js +17 -13
  76. package/dist/utils/championship-style.js.map +1 -1
  77. package/dist/utils/chrome-extension-confirmer.d.ts +41 -0
  78. package/dist/utils/chrome-extension-confirmer.d.ts.map +1 -0
  79. package/dist/utils/chrome-extension-confirmer.js +188 -0
  80. package/dist/utils/chrome-extension-confirmer.js.map +1 -0
  81. package/dist/utils/chrome-extension-detector.d.ts +74 -0
  82. package/dist/utils/chrome-extension-detector.d.ts.map +1 -0
  83. package/dist/utils/chrome-extension-detector.js +268 -0
  84. package/dist/utils/chrome-extension-detector.js.map +1 -0
  85. package/dist/utils/score-header.d.ts +22 -0
  86. package/dist/utils/score-header.d.ts.map +1 -0
  87. package/dist/utils/score-header.js +85 -0
  88. package/dist/utils/score-header.js.map +1 -0
  89. package/dist/utils/score-indicators.d.ts +47 -0
  90. package/dist/utils/score-indicators.d.ts.map +1 -0
  91. package/dist/utils/score-indicators.js +197 -0
  92. package/dist/utils/score-indicators.js.map +1 -0
  93. package/dist/utils/universal-fuzzy-detector.d.ts +64 -0
  94. package/dist/utils/universal-fuzzy-detector.d.ts.map +1 -0
  95. package/dist/utils/universal-fuzzy-detector.js +381 -0
  96. package/dist/utils/universal-fuzzy-detector.js.map +1 -0
  97. package/dist/utils/yaml-generator.js +1 -1
  98. package/package.json +9 -4
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ /**
3
+ * 🎯 Chrome Extension Interactive Confirmation
4
+ * Google-style "Did you mean?" with inquirer
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.ChromeExtensionConfirmer = void 0;
11
+ const inquirer_1 = __importDefault(require("inquirer"));
12
+ const chalk_1 = __importDefault(require("chalk"));
13
+ const chrome_extension_detector_1 = require("./chrome-extension-detector");
14
+ class ChromeExtensionConfirmer {
15
+ /**
16
+ * Ask user to confirm Chrome Extension detection
17
+ */
18
+ static async confirmDetection(text, confidence) {
19
+ const messages = {
20
+ medium: `🎯 Detected possible Chrome Extension from: "${chalk_1.default.yellow(text)}"`,
21
+ low: `💭 Found extension-related terms in: "${chalk_1.default.gray(text)}"`
22
+ };
23
+ const questions = {
24
+ medium: 'Did you mean to create a Chrome Extension?',
25
+ low: 'Is this a Chrome Extension project?'
26
+ };
27
+ console.log();
28
+ console.log(messages[confidence]);
29
+ const { confirmed } = await inquirer_1.default.prompt([
30
+ {
31
+ type: 'confirm',
32
+ name: 'confirmed',
33
+ message: questions[confidence],
34
+ default: confidence === 'medium'
35
+ }
36
+ ]);
37
+ return confirmed;
38
+ }
39
+ /**
40
+ * Show suggestions for common variations
41
+ */
42
+ static async selectFromSuggestions(input) {
43
+ const suggestions = this.generateSuggestions(input);
44
+ if (suggestions.length === 0) {
45
+ return null;
46
+ }
47
+ console.log();
48
+ console.log(chalk_1.default.cyan('🔍 Did you mean one of these?'));
49
+ const { selection } = await inquirer_1.default.prompt([
50
+ {
51
+ type: 'list',
52
+ name: 'selection',
53
+ message: 'Select project type:',
54
+ choices: [
55
+ ...suggestions.map(s => ({
56
+ name: s.display,
57
+ value: s.value
58
+ })),
59
+ new inquirer_1.default.Separator(),
60
+ {
61
+ name: 'None of these (continue as-is)',
62
+ value: null
63
+ }
64
+ ]
65
+ }
66
+ ]);
67
+ return selection;
68
+ }
69
+ /**
70
+ * Generate smart suggestions based on input
71
+ */
72
+ static generateSuggestions(input) {
73
+ const normalized = input.toLowerCase();
74
+ const suggestions = [];
75
+ // Check for Chrome Extension indicators
76
+ const ceDetection = chrome_extension_detector_1.ChromeExtensionDetector.detect(normalized);
77
+ if (ceDetection.confidence !== 'none') {
78
+ suggestions.push({
79
+ display: '🧩 Chrome Extension - Browser extension for Chrome/Edge',
80
+ value: 'chrome-extension'
81
+ });
82
+ }
83
+ // Check for related types
84
+ if (normalized.includes('browser') || normalized.includes('web')) {
85
+ if (!suggestions.find(s => s.value === 'chrome-extension')) {
86
+ suggestions.push({
87
+ display: '🌐 Web Application - Traditional web app',
88
+ value: 'web-app'
89
+ });
90
+ }
91
+ }
92
+ if (normalized.includes('ext') || normalized.includes('plugin')) {
93
+ suggestions.push({
94
+ display: '🔌 Browser Plugin/Extension',
95
+ value: 'browser-extension'
96
+ });
97
+ }
98
+ if (normalized.includes('popup') || normalized.includes('toolbar')) {
99
+ suggestions.push({
100
+ display: '📱 Chrome Extension with Popup UI',
101
+ value: 'chrome-extension-popup'
102
+ });
103
+ }
104
+ if (normalized.includes('script') || normalized.includes('inject')) {
105
+ suggestions.push({
106
+ display: '💉 Content Script Extension',
107
+ value: 'chrome-extension-content'
108
+ });
109
+ }
110
+ return suggestions;
111
+ }
112
+ /**
113
+ * Interactive project type selector with fuzzy search
114
+ */
115
+ static async selectProjectType(currentInput) {
116
+ const projectTypes = [
117
+ { name: '🧩 Chrome Extension', value: 'chrome-extension' },
118
+ { name: '🌐 Web Application', value: 'web-app' },
119
+ { name: '📱 Mobile App', value: 'mobile' },
120
+ { name: '⚙️ CLI Tool', value: 'cli' },
121
+ { name: '📚 Library/Package', value: 'library' },
122
+ { name: '🔧 API/Backend', value: 'api' },
123
+ { name: '🎮 Game', value: 'game' },
124
+ { name: '🤖 Bot/Automation', value: 'bot' },
125
+ { name: '📊 Data Science', value: 'data-science' },
126
+ { name: '🎨 Other/Custom', value: 'other' }
127
+ ];
128
+ // If we have input, check for matches
129
+ if (currentInput) {
130
+ const detection = chrome_extension_detector_1.ChromeExtensionDetector.detect(currentInput);
131
+ if (detection.confidence === 'high') {
132
+ console.log(chalk_1.default.green('✅ Chrome Extension detected automatically!'));
133
+ return 'chrome-extension';
134
+ }
135
+ if (detection.confidence === 'medium' || detection.confidence === 'low') {
136
+ const confirmed = await this.confirmDetection(currentInput, detection.confidence);
137
+ if (confirmed) {
138
+ return 'chrome-extension';
139
+ }
140
+ }
141
+ }
142
+ const { projectType } = await inquirer_1.default.prompt([
143
+ {
144
+ type: 'list',
145
+ name: 'projectType',
146
+ message: 'What type of project is this?',
147
+ choices: projectTypes,
148
+ default: currentInput ? this.guessDefault(currentInput) : 'web-app'
149
+ }
150
+ ]);
151
+ return projectType;
152
+ }
153
+ /**
154
+ * Guess the most likely default based on input
155
+ */
156
+ static guessDefault(input) {
157
+ const normalized = input.toLowerCase();
158
+ if (chrome_extension_detector_1.ChromeExtensionDetector.detect(normalized).confidence !== 'none') {
159
+ return 'chrome-extension';
160
+ }
161
+ if (normalized.includes('api') || normalized.includes('backend')) {
162
+ return 'api';
163
+ }
164
+ if (normalized.includes('cli') || normalized.includes('command')) {
165
+ return 'cli';
166
+ }
167
+ if (normalized.includes('library') || normalized.includes('package')) {
168
+ return 'library';
169
+ }
170
+ return 'web-app';
171
+ }
172
+ }
173
+ exports.ChromeExtensionConfirmer = ChromeExtensionConfirmer;
174
+ /**
175
+ * Example usage:
176
+ *
177
+ * Input: "chr ext for managing tabs"
178
+ * → Shows: "🎯 Detected possible Chrome Extension"
179
+ * → Asks: "Did you mean to create a Chrome Extension?" [Y/n]
180
+ *
181
+ * Input: "c e"
182
+ * → Shows suggestions list with Chrome Extension highlighted
183
+ *
184
+ * Input: "extension"
185
+ * → Shows: "💭 Found extension-related terms"
186
+ * → Asks: "Is this a Chrome Extension project?" [y/N]
187
+ */
188
+ //# sourceMappingURL=chrome-extension-confirmer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome-extension-confirmer.js","sourceRoot":"","sources":["../../src/utils/chrome-extension-confirmer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAEH,wDAAgC;AAChC,kDAA0B;AAC1B,2EAAsE;AAEtE,MAAa,wBAAwB;IAEnC;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAC3B,IAAY,EACZ,UAA4B;QAG5B,MAAM,QAAQ,GAAG;YACf,MAAM,EAAE,gDAAgD,eAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG;YAC7E,GAAG,EAAE,yCAAyC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;SAClE,CAAC;QAEF,MAAM,SAAS,GAAG;YAChB,MAAM,EAAE,4CAA4C;YACpD,GAAG,EAAE,qCAAqC;SAC3C,CAAC;QAEF,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QAElC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;YAC1C;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC;gBAC9B,OAAO,EAAE,UAAU,KAAK,QAAQ;aACjC;SACF,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,KAAa;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAEpD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAEzD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;YAC1C;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,sBAAsB;gBAC/B,OAAO,EAAE;oBACP,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBACvB,IAAI,EAAE,CAAC,CAAC,OAAO;wBACf,KAAK,EAAE,CAAC,CAAC,KAAK;qBACf,CAAC,CAAC;oBACH,IAAI,kBAAQ,CAAC,SAAS,EAAE;oBACxB;wBACE,IAAI,EAAE,gCAAgC;wBACtC,KAAK,EAAE,IAAI;qBACZ;iBACF;aACF;SACF,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,mBAAmB,CAAC,KAAa;QAC9C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,EAAE,CAAC;QAEvB,wCAAwC;QACxC,MAAM,WAAW,GAAG,mDAAuB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC/D,IAAI,WAAW,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;YACtC,WAAW,CAAC,IAAI,CAAC;gBACf,OAAO,EAAE,yDAAyD;gBAClE,KAAK,EAAE,kBAAkB;aAC1B,CAAC,CAAC;QACL,CAAC;QAED,0BAA0B;QAC1B,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACjE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,kBAAkB,CAAC,EAAE,CAAC;gBAC3D,WAAW,CAAC,IAAI,CAAC;oBACf,OAAO,EAAE,0CAA0C;oBACnD,KAAK,EAAE,SAAS;iBACjB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChE,WAAW,CAAC,IAAI,CAAC;gBACf,OAAO,EAAE,6BAA6B;gBACtC,KAAK,EAAE,mBAAmB;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACnE,WAAW,CAAC,IAAI,CAAC;gBACf,OAAO,EAAE,mCAAmC;gBAC5C,KAAK,EAAE,wBAAwB;aAChC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnE,WAAW,CAAC,IAAI,CAAC;gBACf,OAAO,EAAE,6BAA6B;gBACtC,KAAK,EAAE,0BAA0B;aAClC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,YAAqB;QAClD,MAAM,YAAY,GAAG;YACnB,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,kBAAkB,EAAE;YAC1D,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE;YAChD,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE;YAC1C,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE;YACrC,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE;YAChD,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE;YACxC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;YAClC,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE;YAC3C,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,cAAc,EAAE;YAClD,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE;SAC5C,CAAC;QAEF,sCAAsC;QACtC,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,mDAAuB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC/D,IAAI,SAAS,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;gBACvE,OAAO,kBAAkB,CAAC;YAC5B,CAAC;YACD,IAAI,SAAS,CAAC,UAAU,KAAK,QAAQ,IAAI,SAAS,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;gBACxE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;gBAClF,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO,kBAAkB,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;YAC5C;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,+BAA+B;gBACxC,OAAO,EAAE,YAAY;gBACrB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;aACpE;SACF,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,YAAY,CAAC,KAAa;QACvC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAEvC,IAAI,mDAAuB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;YACrE,OAAO,kBAAkB,CAAC;QAC5B,CAAC;QACD,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACjE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACjE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACrE,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AA1LD,4DA0LC;AAED;;;;;;;;;;;;;GAaG"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * 🎯 Chrome Extension Fuzzy Detection - Google-style intelligence
3
+ * "Did you mean Chrome Extension?"
4
+ */
5
+ interface DetectionResult {
6
+ detected: boolean;
7
+ confidence: 'high' | 'medium' | 'low' | 'none';
8
+ suggestion?: string;
9
+ needsConfirmation: boolean;
10
+ }
11
+ /**
12
+ * Google-style fuzzy matching for Chrome Extension detection
13
+ * Handles typos, abbreviations, and variations
14
+ */
15
+ export declare class ChromeExtensionDetector {
16
+ private static readonly HIGH_CONFIDENCE;
17
+ private static readonly MEDIUM_CONFIDENCE;
18
+ private static readonly LOW_CONFIDENCE;
19
+ private static readonly TYPO_CORRECTIONS;
20
+ /**
21
+ * Detect if text refers to a Chrome Extension with Google-style intelligence
22
+ */
23
+ static detect(text: string): DetectionResult;
24
+ /**
25
+ * Correct common typos
26
+ */
27
+ private static correctTypos;
28
+ /**
29
+ * Fuzzy match with Levenshtein distance
30
+ */
31
+ private static fuzzyMatch;
32
+ /**
33
+ * Calculate Levenshtein distance between two strings
34
+ */
35
+ private static levenshteinDistance;
36
+ /**
37
+ * Check for extension-related context
38
+ */
39
+ private static hasExtensionContext;
40
+ /**
41
+ * Check for spaced patterns like "c e" or "ch ext"
42
+ */
43
+ private static hasSpacedPattern;
44
+ /**
45
+ * Get user-friendly confirmation message
46
+ */
47
+ static getConfirmationMessage(result: DetectionResult): string | null;
48
+ /**
49
+ * Check if project has Chrome Extension files (for validation)
50
+ */
51
+ static hasExtensionFiles(files: string[]): boolean;
52
+ }
53
+ export {};
54
+ /**
55
+ * Examples of detection:
56
+ *
57
+ * HIGH confidence (auto-accept):
58
+ * - "chrome extension" → ✅
59
+ * - "browser extension" → ✅
60
+ *
61
+ * MEDIUM confidence (needs confirmation):
62
+ * - "chr ext" → "Did you mean Chrome Extension?"
63
+ * - "c ext" → "Did you mean Chrome Extension?"
64
+ * - "CE" → "Did you mean Chrome Extension?"
65
+ *
66
+ * TYPO correction (auto-fix):
67
+ * - "chrom extention" → ✅ (corrected)
68
+ * - "chrome extnsion" → ✅ (corrected)
69
+ *
70
+ * LOW confidence (suggest if context):
71
+ * - "extension for managing tabs" → "Possible Chrome Extension?"
72
+ * - "popup manager" → "Possible Chrome Extension?"
73
+ */
74
+ //# sourceMappingURL=chrome-extension-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome-extension-detector.d.ts","sourceRoot":"","sources":["../../src/utils/chrome-extension-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,eAAe;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED;;;GAGG;AACH,qBAAa,uBAAuB;IAGlC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAQrC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAYvC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAYpC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAiBtC;IAEF;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe;IAuE5C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAgB3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAazB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IA4BlC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAUlC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAY/B;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI;IAgBrE;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;CAenD;;AAED;;;;;;;;;;;;;;;;;;;GAmBG"}
@@ -0,0 +1,268 @@
1
+ "use strict";
2
+ /**
3
+ * 🎯 Chrome Extension Fuzzy Detection - Google-style intelligence
4
+ * "Did you mean Chrome Extension?"
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ChromeExtensionDetector = void 0;
8
+ /**
9
+ * Google-style fuzzy matching for Chrome Extension detection
10
+ * Handles typos, abbreviations, and variations
11
+ */
12
+ class ChromeExtensionDetector {
13
+ // High confidence patterns (exact matches)
14
+ static HIGH_CONFIDENCE = [
15
+ 'chrome extension',
16
+ 'browser extension',
17
+ 'chrome addon',
18
+ 'chrome plugin',
19
+ 'web extension',
20
+ 'manifest v3',
21
+ 'manifest v2'
22
+ ];
23
+ // Medium confidence patterns (close matches, abbreviations)
24
+ static MEDIUM_CONFIDENCE = [
25
+ 'chrome ext',
26
+ 'chr ext',
27
+ 'chrome-ext',
28
+ 'chr extension',
29
+ 'extension for chrome',
30
+ 'chrome browser extension',
31
+ 'google chrome extension',
32
+ 'chromium extension',
33
+ 'edge extension', // Edge uses same APIs
34
+ 'browser addon',
35
+ 'browser plug-in'
36
+ ];
37
+ // Low confidence patterns (needs confirmation)
38
+ static LOW_CONFIDENCE = [
39
+ 'extension',
40
+ 'ext',
41
+ 'addon',
42
+ 'plugin',
43
+ 'chrome',
44
+ 'browser',
45
+ 'popup',
46
+ 'content script',
47
+ 'background script',
48
+ 'browser action',
49
+ 'page action'
50
+ ];
51
+ // Common typos and their corrections
52
+ static TYPO_CORRECTIONS = {
53
+ 'chrom extension': 'chrome extension',
54
+ 'chrome extention': 'chrome extension',
55
+ 'chrome exension': 'chrome extension',
56
+ 'chrome extenstion': 'chrome extension',
57
+ 'crome extension': 'chrome extension',
58
+ 'chrome extnsion': 'chrome extension',
59
+ 'chorme extension': 'chrome extension',
60
+ 'chrome etension': 'chrome extension',
61
+ 'chormeextension': 'chrome extension',
62
+ 'chromeext': 'chrome extension',
63
+ 'c-ext': 'chrome extension',
64
+ 'c.ext': 'chrome extension',
65
+ 'ch ext': 'chrome extension',
66
+ 'chr-ext': 'chrome extension',
67
+ 'chrome-extension': 'chrome extension',
68
+ 'chrome_extension': 'chrome extension'
69
+ };
70
+ /**
71
+ * Detect if text refers to a Chrome Extension with Google-style intelligence
72
+ */
73
+ static detect(text) {
74
+ if (!text) {
75
+ return { detected: false, confidence: 'none', needsConfirmation: false };
76
+ }
77
+ const normalized = text.toLowerCase().trim();
78
+ // Step 1: Check for typos and auto-correct
79
+ const corrected = this.correctTypos(normalized);
80
+ if (corrected !== normalized) {
81
+ // We auto-corrected a typo
82
+ return {
83
+ detected: true,
84
+ confidence: 'medium',
85
+ suggestion: `Chrome Extension (auto-corrected from "${text}")`,
86
+ needsConfirmation: false
87
+ };
88
+ }
89
+ // Step 2: Check high confidence patterns
90
+ for (const pattern of this.HIGH_CONFIDENCE) {
91
+ if (normalized.includes(pattern)) {
92
+ return {
93
+ detected: true,
94
+ confidence: 'high',
95
+ needsConfirmation: false
96
+ };
97
+ }
98
+ }
99
+ // Step 3: Check medium confidence patterns
100
+ for (const pattern of this.MEDIUM_CONFIDENCE) {
101
+ if (normalized.includes(pattern) ||
102
+ this.fuzzyMatch(normalized, pattern)) {
103
+ return {
104
+ detected: true,
105
+ confidence: 'medium',
106
+ suggestion: 'Chrome Extension',
107
+ needsConfirmation: true // "Did you mean Chrome Extension?"
108
+ };
109
+ }
110
+ }
111
+ // Step 4: Check low confidence patterns
112
+ for (const pattern of this.LOW_CONFIDENCE) {
113
+ if (normalized.includes(pattern)) {
114
+ // Only suggest if there's additional context
115
+ if (this.hasExtensionContext(normalized)) {
116
+ return {
117
+ detected: false,
118
+ confidence: 'low',
119
+ suggestion: 'Chrome Extension',
120
+ needsConfirmation: true
121
+ };
122
+ }
123
+ }
124
+ }
125
+ // Step 5: Check for split/spaced variations
126
+ if (this.hasSpacedPattern(normalized)) {
127
+ return {
128
+ detected: true,
129
+ confidence: 'medium',
130
+ suggestion: 'Chrome Extension',
131
+ needsConfirmation: true
132
+ };
133
+ }
134
+ return { detected: false, confidence: 'none', needsConfirmation: false };
135
+ }
136
+ /**
137
+ * Correct common typos
138
+ */
139
+ static correctTypos(text) {
140
+ // Direct typo lookup
141
+ if (this.TYPO_CORRECTIONS[text]) {
142
+ return this.TYPO_CORRECTIONS[text];
143
+ }
144
+ // Check if any typo pattern is in the text
145
+ for (const [typo, correction] of Object.entries(this.TYPO_CORRECTIONS)) {
146
+ if (text.includes(typo)) {
147
+ return text.replace(typo, correction);
148
+ }
149
+ }
150
+ return text;
151
+ }
152
+ /**
153
+ * Fuzzy match with Levenshtein distance
154
+ */
155
+ static fuzzyMatch(text, pattern, threshold = 3) {
156
+ // Check if text contains something close to pattern
157
+ const words = text.split(/\s+/);
158
+ for (const word of words) {
159
+ if (this.levenshteinDistance(word, pattern) <= threshold) {
160
+ return true;
161
+ }
162
+ }
163
+ // Check the whole phrase
164
+ return this.levenshteinDistance(text, pattern) <= threshold;
165
+ }
166
+ /**
167
+ * Calculate Levenshtein distance between two strings
168
+ */
169
+ static levenshteinDistance(a, b) {
170
+ const matrix = [];
171
+ for (let i = 0; i <= b.length; i++) {
172
+ matrix[i] = [i];
173
+ }
174
+ for (let j = 0; j <= a.length; j++) {
175
+ matrix[0][j] = j;
176
+ }
177
+ for (let i = 1; i <= b.length; i++) {
178
+ for (let j = 1; j <= a.length; j++) {
179
+ if (b.charAt(i - 1) === a.charAt(j - 1)) {
180
+ matrix[i][j] = matrix[i - 1][j - 1];
181
+ }
182
+ else {
183
+ matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
184
+ matrix[i][j - 1] + 1, // insertion
185
+ matrix[i - 1][j] + 1 // deletion
186
+ );
187
+ }
188
+ }
189
+ }
190
+ return matrix[b.length][a.length];
191
+ }
192
+ /**
193
+ * Check for extension-related context
194
+ */
195
+ static hasExtensionContext(text) {
196
+ const contextWords = [
197
+ 'tab', 'popup', 'browser', 'chrome', 'manifest',
198
+ 'content', 'background', 'inject', 'page', 'action',
199
+ 'storage', 'permissions', 'google', 'store'
200
+ ];
201
+ return contextWords.some(word => text.includes(word));
202
+ }
203
+ /**
204
+ * Check for spaced patterns like "c e" or "ch ext"
205
+ */
206
+ static hasSpacedPattern(text) {
207
+ const spacedPatterns = [
208
+ /c\s+e\s+x?\s*t/, // c e, c e x t
209
+ /ch\s+ext/, // ch ext
210
+ /chr\s+ext/, // chr ext
211
+ /ext\s+for\s+chr/, // ext for chr
212
+ /chrome\s+ex\b/ // chrome ex
213
+ ];
214
+ return spacedPatterns.some(pattern => pattern.test(text));
215
+ }
216
+ /**
217
+ * Get user-friendly confirmation message
218
+ */
219
+ static getConfirmationMessage(result) {
220
+ if (!result.needsConfirmation) {
221
+ return null;
222
+ }
223
+ if (result.confidence === 'medium') {
224
+ return `Did you mean: Chrome Extension? (detected "${result.suggestion}")`;
225
+ }
226
+ if (result.confidence === 'low') {
227
+ return `Possible Chrome Extension detected. Did you mean to create a Chrome Extension?`;
228
+ }
229
+ return null;
230
+ }
231
+ /**
232
+ * Check if project has Chrome Extension files (for validation)
233
+ */
234
+ static hasExtensionFiles(files) {
235
+ const extensionFiles = [
236
+ 'manifest.json',
237
+ 'popup.html',
238
+ 'popup.js',
239
+ 'background.js',
240
+ 'content.js',
241
+ 'options.html',
242
+ 'service-worker.js'
243
+ ];
244
+ return files.some(file => extensionFiles.some(extFile => file.endsWith(extFile)));
245
+ }
246
+ }
247
+ exports.ChromeExtensionDetector = ChromeExtensionDetector;
248
+ /**
249
+ * Examples of detection:
250
+ *
251
+ * HIGH confidence (auto-accept):
252
+ * - "chrome extension" → ✅
253
+ * - "browser extension" → ✅
254
+ *
255
+ * MEDIUM confidence (needs confirmation):
256
+ * - "chr ext" → "Did you mean Chrome Extension?"
257
+ * - "c ext" → "Did you mean Chrome Extension?"
258
+ * - "CE" → "Did you mean Chrome Extension?"
259
+ *
260
+ * TYPO correction (auto-fix):
261
+ * - "chrom extention" → ✅ (corrected)
262
+ * - "chrome extnsion" → ✅ (corrected)
263
+ *
264
+ * LOW confidence (suggest if context):
265
+ * - "extension for managing tabs" → "Possible Chrome Extension?"
266
+ * - "popup manager" → "Possible Chrome Extension?"
267
+ */
268
+ //# sourceMappingURL=chrome-extension-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome-extension-detector.js","sourceRoot":"","sources":["../../src/utils/chrome-extension-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 🏆 Score Header Display - Always visible at top
3
+ * Shows current score + birth score in a clean box
4
+ */
5
+ export interface ScoreData {
6
+ currentScore: number;
7
+ birthScore?: number;
8
+ aiPredictive?: number;
9
+ dna?: {
10
+ birthWeight?: number;
11
+ currentWeight?: number;
12
+ };
13
+ }
14
+ /**
15
+ * Generate the score header box (always shown unless --quiet)
16
+ */
17
+ export declare function generateScoreHeader(data: ScoreData): string;
18
+ /**
19
+ * Minimal score line (for when art is disabled)
20
+ */
21
+ export declare function generateScoreLine(data: ScoreData): string;
22
+ //# sourceMappingURL=score-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score-header.d.ts","sourceRoot":"","sources":["../../src/utils/score-header.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE;QACJ,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CA8C3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAsBzD"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ /**
3
+ * 🏆 Score Header Display - Always visible at top
4
+ * Shows current score + birth score in a clean box
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.generateScoreHeader = generateScoreHeader;
11
+ exports.generateScoreLine = generateScoreLine;
12
+ const chalk_1 = __importDefault(require("chalk"));
13
+ const championship_style_1 = require("./championship-style");
14
+ /**
15
+ * Generate the score header box (always shown unless --quiet)
16
+ */
17
+ function generateScoreHeader(data) {
18
+ const { currentScore, birthScore, aiPredictive, dna } = data;
19
+ // Determine score color based on percentage
20
+ const getScoreColor = (score) => {
21
+ if (score >= 99)
22
+ return championship_style_1.FAF_COLORS.fafOrange; // Big Orange territory!
23
+ if (score >= 85)
24
+ return championship_style_1.FAF_COLORS.fafGreen;
25
+ if (score >= 70)
26
+ return championship_style_1.FAF_COLORS.fafCyan;
27
+ return championship_style_1.FAF_COLORS.fafWhite;
28
+ };
29
+ const scoreColor = getScoreColor(currentScore);
30
+ // Build the score display
31
+ let scoreDisplay = `${scoreColor(currentScore + '%')}`;
32
+ // Add birth score if available
33
+ if (birthScore !== undefined && birthScore !== currentScore) {
34
+ const improvement = currentScore - birthScore;
35
+ if (improvement > 0) {
36
+ scoreDisplay += chalk_1.default.gray(` (↑${improvement}% from birth: ${birthScore}%)`);
37
+ }
38
+ else if (improvement < 0) {
39
+ scoreDisplay += chalk_1.default.gray(` (↓${Math.abs(improvement)}% from birth: ${birthScore}%)`);
40
+ }
41
+ }
42
+ // Add DNA weight info if available
43
+ let dnaDisplay = '';
44
+ if (dna?.currentWeight) {
45
+ dnaDisplay = chalk_1.default.gray(` | Weight: ${dna.currentWeight.toFixed(1)}KB`);
46
+ if (dna.birthWeight && dna.birthWeight !== dna.currentWeight) {
47
+ const growth = ((dna.currentWeight - dna.birthWeight) / dna.birthWeight * 100).toFixed(0);
48
+ dnaDisplay += chalk_1.default.gray(` (+${growth}%)`);
49
+ }
50
+ }
51
+ // AI Predictive (only show if higher than current)
52
+ let aiDisplay = '';
53
+ if (aiPredictive && aiPredictive > currentScore) {
54
+ aiDisplay = chalk_1.default.gray(` > AI-Predictive: ${championship_style_1.FAF_COLORS.fafCyan(aiPredictive + '%')}`);
55
+ }
56
+ // Create the box
57
+ return `╔════════════════════════════════════════════════════════════╗
58
+ ║ 🏆 FAF Score: ${scoreDisplay}${dnaDisplay}
59
+ ${aiDisplay ? `║ ${aiDisplay}\n` : ''}╚════════════════════════════════════════════════════════════╝`;
60
+ }
61
+ /**
62
+ * Minimal score line (for when art is disabled)
63
+ */
64
+ function generateScoreLine(data) {
65
+ const { currentScore, birthScore } = data;
66
+ const getScoreColor = (score) => {
67
+ if (score >= 99)
68
+ return championship_style_1.FAF_COLORS.fafOrange;
69
+ if (score >= 85)
70
+ return championship_style_1.FAF_COLORS.fafGreen;
71
+ if (score >= 70)
72
+ return championship_style_1.FAF_COLORS.fafCyan;
73
+ return championship_style_1.FAF_COLORS.fafWhite;
74
+ };
75
+ const scoreColor = getScoreColor(currentScore);
76
+ let line = `🏆 Score: ${scoreColor(currentScore + '%')}`;
77
+ if (birthScore !== undefined && birthScore !== currentScore) {
78
+ const improvement = currentScore - birthScore;
79
+ if (improvement > 0) {
80
+ line += chalk_1.default.gray(` (Birth: ${birthScore}% ↑${improvement}%)`);
81
+ }
82
+ }
83
+ return line;
84
+ }
85
+ //# sourceMappingURL=score-header.js.map