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,360 @@
1
+ "use strict";
2
+ /**
3
+ * ⚡ FAF Enhance - MCP-native interactive enhancement
4
+ * Combines auto-detection with intelligent MCP questionnaire
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.enhanceCommand = enhanceCommand;
41
+ exports.enhanceWithAnswers = enhanceWithAnswers;
42
+ const fs_1 = require("fs");
43
+ const path = __importStar(require("path"));
44
+ const yaml_1 = require("../fix-once/yaml");
45
+ const file_utils_1 = require("../utils/file-utils");
46
+ const score_1 = require("./score");
47
+ /**
48
+ * Auto-detect improvements from project files
49
+ */
50
+ async function autoDetectImprovements(projectPath, fafData) {
51
+ const improvements = [];
52
+ const updates = {};
53
+ // Check for package.json
54
+ const packageJsonPath = path.join(projectPath, 'package.json');
55
+ if (await (0, file_utils_1.fileExists)(packageJsonPath)) {
56
+ const pkgContent = await fs_1.promises.readFile(packageJsonPath, 'utf-8');
57
+ const pkg = JSON.parse(pkgContent);
58
+ // Detect version
59
+ if (pkg.version && !fafData.project?.version) {
60
+ updates['project.version'] = pkg.version;
61
+ improvements.push('version');
62
+ }
63
+ // Detect testing
64
+ if (pkg.scripts?.test && !fafData.stack?.testing) {
65
+ updates['stack.testing'] = 'jest/vitest';
66
+ improvements.push('testing');
67
+ }
68
+ // Detect dependencies for framework detection
69
+ if (pkg.dependencies || pkg.devDependencies) {
70
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
71
+ // Frontend frameworks
72
+ if (allDeps.react && !fafData.stack?.frontend) {
73
+ updates['stack.frontend'] = 'React';
74
+ improvements.push('frontend');
75
+ }
76
+ else if (allDeps.vue && !fafData.stack?.frontend) {
77
+ updates['stack.frontend'] = 'Vue';
78
+ improvements.push('frontend');
79
+ }
80
+ else if (allDeps.svelte && !fafData.stack?.frontend) {
81
+ updates['stack.frontend'] = 'Svelte';
82
+ improvements.push('frontend');
83
+ }
84
+ // Backend
85
+ if (allDeps.express && !fafData.stack?.backend) {
86
+ updates['stack.backend'] = 'Express';
87
+ improvements.push('backend');
88
+ }
89
+ // Database
90
+ if (allDeps.mongoose && !fafData.stack?.database) {
91
+ updates['stack.database'] = 'MongoDB';
92
+ improvements.push('database');
93
+ }
94
+ else if (allDeps.pg && !fafData.stack?.database) {
95
+ updates['stack.database'] = 'PostgreSQL';
96
+ improvements.push('database');
97
+ }
98
+ }
99
+ }
100
+ // Detect main language from files
101
+ if (!fafData.project?.main_language) {
102
+ const hasTS = await (0, file_utils_1.fileExists)(path.join(projectPath, 'tsconfig.json'));
103
+ const hasPy = await (0, file_utils_1.fileExists)(path.join(projectPath, 'requirements.txt')) ||
104
+ await (0, file_utils_1.fileExists)(path.join(projectPath, 'setup.py'));
105
+ if (hasTS) {
106
+ updates['project.main_language'] = 'TypeScript';
107
+ improvements.push('mainLanguage');
108
+ }
109
+ else if (hasPy) {
110
+ updates['project.main_language'] = 'Python';
111
+ improvements.push('mainLanguage');
112
+ }
113
+ }
114
+ return { improvements, updates };
115
+ }
116
+ /**
117
+ * Generate questions for missing 6 W's
118
+ */
119
+ function generateQuestions(fafData) {
120
+ const questions = [];
121
+ if (!fafData.human_context?.who) {
122
+ questions.push({
123
+ id: 'who',
124
+ question: 'WHO will use this project?',
125
+ header: 'Target Users',
126
+ description: 'Specify your target audience (developers, data scientists, designers, end users, etc.)',
127
+ defaultValue: 'developers',
128
+ required: true
129
+ });
130
+ }
131
+ if (!fafData.human_context?.what) {
132
+ questions.push({
133
+ id: 'what',
134
+ question: 'WHAT problem does this project solve?',
135
+ header: 'Core Problem',
136
+ description: 'Describe the specific problem or need this project addresses',
137
+ required: true
138
+ });
139
+ }
140
+ if (!fafData.human_context?.why) {
141
+ questions.push({
142
+ id: 'why',
143
+ question: 'WHY is this project important?',
144
+ header: 'Value/Impact',
145
+ description: 'Explain the value or impact this project creates',
146
+ required: true
147
+ });
148
+ }
149
+ if (!fafData.human_context?.where) {
150
+ questions.push({
151
+ id: 'where',
152
+ question: 'WHERE will this project be deployed/used?',
153
+ header: 'Environment',
154
+ description: 'Specify the deployment context (cloud, browser, mobile, on-premise, etc.)',
155
+ defaultValue: 'cloud',
156
+ required: false
157
+ });
158
+ }
159
+ if (!fafData.human_context?.when) {
160
+ questions.push({
161
+ id: 'when',
162
+ question: 'WHEN do you need this completed?',
163
+ header: 'Timeline',
164
+ description: 'Specify the timeline or urgency (now, Q1 2025, ongoing, etc.)',
165
+ defaultValue: 'ongoing',
166
+ required: false
167
+ });
168
+ }
169
+ if (!fafData.human_context?.how) {
170
+ questions.push({
171
+ id: 'how',
172
+ question: 'HOW will you build this?',
173
+ header: 'Approach',
174
+ description: 'Describe your development methodology (agile, iterative, waterfall, etc.)',
175
+ defaultValue: 'agile',
176
+ required: false
177
+ });
178
+ }
179
+ return questions;
180
+ }
181
+ /**
182
+ * Apply answers to project.faf
183
+ */
184
+ function applyAnswers(fafData, answers) {
185
+ const applied = [];
186
+ if (!fafData.human_context) {
187
+ fafData.human_context = {};
188
+ }
189
+ if (answers.who) {
190
+ fafData.human_context.who = answers.who;
191
+ applied.push('who');
192
+ }
193
+ if (answers.what) {
194
+ fafData.human_context.what = answers.what;
195
+ applied.push('what');
196
+ }
197
+ if (answers.why) {
198
+ fafData.human_context.why = answers.why;
199
+ applied.push('why');
200
+ }
201
+ if (answers.where) {
202
+ fafData.human_context.where = answers.where;
203
+ applied.push('where');
204
+ }
205
+ if (answers.when) {
206
+ fafData.human_context.when = answers.when;
207
+ applied.push('when');
208
+ }
209
+ if (answers.how) {
210
+ fafData.human_context.how = answers.how;
211
+ applied.push('how');
212
+ }
213
+ // Apply stack improvements
214
+ if (!fafData.stack) {
215
+ fafData.stack = {};
216
+ }
217
+ if (answers.frontend && !fafData.stack.frontend) {
218
+ fafData.stack.frontend = answers.frontend;
219
+ applied.push('frontend');
220
+ }
221
+ if (answers.backend && !fafData.stack.backend) {
222
+ fafData.stack.backend = answers.backend;
223
+ applied.push('backend');
224
+ }
225
+ if (answers.database && !fafData.stack.database) {
226
+ fafData.stack.database = answers.database;
227
+ applied.push('database');
228
+ }
229
+ if (answers.hosting && !fafData.stack.hosting) {
230
+ fafData.stack.hosting = answers.hosting;
231
+ applied.push('hosting');
232
+ }
233
+ return applied;
234
+ }
235
+ /**
236
+ * Calculate score using real FafCompiler
237
+ */
238
+ async function calculateScore(projectPath) {
239
+ const fafPath = path.join(projectPath, 'project.faf');
240
+ const result = await (0, score_1.scoreFafFile)(fafPath);
241
+ return result.score;
242
+ }
243
+ /**
244
+ * Main enhance command - auto-detect mode
245
+ */
246
+ async function enhanceCommand(projectPath, options = {}) {
247
+ try {
248
+ // Find project.faf
249
+ const fafPath = path.join(projectPath, 'project.faf');
250
+ if (!(await (0, file_utils_1.fileExists)(fafPath))) {
251
+ return {
252
+ success: false,
253
+ initialScore: 0,
254
+ finalScore: 0,
255
+ improvements: [],
256
+ message: 'No project.faf found. Run faf_init first.'
257
+ };
258
+ }
259
+ // Read and parse
260
+ const content = await fs_1.promises.readFile(fafPath, 'utf-8');
261
+ const fafData = (0, yaml_1.parse)(content);
262
+ const initialScore = await calculateScore(projectPath);
263
+ // Auto-detect improvements
264
+ const { improvements, updates } = await autoDetectImprovements(projectPath, fafData);
265
+ // Apply auto-detected updates
266
+ for (const [key, value] of Object.entries(updates)) {
267
+ const keys = key.split('.');
268
+ let target = fafData;
269
+ for (let i = 0; i < keys.length - 1; i++) {
270
+ if (!target[keys[i]]) {
271
+ target[keys[i]] = {};
272
+ }
273
+ target = target[keys[i]];
274
+ }
275
+ target[keys[keys.length - 1]] = value;
276
+ }
277
+ // Check if questions needed
278
+ const questions = generateQuestions(fafData);
279
+ // If auto-fill only or no questions, finish here
280
+ if (options.autoFill || questions.length === 0 || !options.interactive) {
281
+ // Update metadata
282
+ if (!fafData.meta) {
283
+ fafData.meta = {};
284
+ }
285
+ fafData.meta.last_enhanced = new Date().toISOString();
286
+ fafData.meta.enhanced_by = 'faf-enhance-auto';
287
+ // Write back
288
+ const yamlContent = (0, yaml_1.stringify)(fafData);
289
+ await fs_1.promises.writeFile(fafPath, yamlContent, 'utf-8');
290
+ const finalScore = await calculateScore(projectPath);
291
+ return {
292
+ success: true,
293
+ initialScore,
294
+ finalScore,
295
+ improvements,
296
+ message: improvements.length > 0
297
+ ? `Auto-enhanced: ${improvements.join(', ')}. Score: ${initialScore}% → ${finalScore}%`
298
+ : `Already optimized. Score: ${finalScore}%`
299
+ };
300
+ }
301
+ // Return with questions for interactive mode
302
+ return {
303
+ success: true,
304
+ initialScore,
305
+ finalScore: initialScore,
306
+ improvements,
307
+ questionsNeeded: questions,
308
+ message: `Auto-detected ${improvements.length} improvements. ${questions.length} questions needed for full enhancement.`
309
+ };
310
+ }
311
+ catch (error) {
312
+ return {
313
+ success: false,
314
+ initialScore: 0,
315
+ finalScore: 0,
316
+ improvements: [],
317
+ message: error instanceof Error ? error.message : 'Enhancement failed'
318
+ };
319
+ }
320
+ }
321
+ /**
322
+ * Apply interactive answers and finalize enhancement
323
+ */
324
+ async function enhanceWithAnswers(projectPath, answers) {
325
+ try {
326
+ const fafPath = path.join(projectPath, 'project.faf');
327
+ const content = await fs_1.promises.readFile(fafPath, 'utf-8');
328
+ const fafData = (0, yaml_1.parse)(content);
329
+ const initialScore = await calculateScore(projectPath);
330
+ // Apply answers
331
+ const applied = applyAnswers(fafData, answers);
332
+ // Update metadata
333
+ if (!fafData.meta) {
334
+ fafData.meta = {};
335
+ }
336
+ fafData.meta.last_enhanced = new Date().toISOString();
337
+ fafData.meta.enhanced_by = 'faf-enhance-interactive';
338
+ // Write back
339
+ const yamlContent = (0, yaml_1.stringify)(fafData);
340
+ await fs_1.promises.writeFile(fafPath, yamlContent, 'utf-8');
341
+ const finalScore = await calculateScore(projectPath);
342
+ return {
343
+ success: true,
344
+ initialScore,
345
+ finalScore,
346
+ improvements: applied,
347
+ message: `Enhanced with ${applied.length} answers. Score: ${initialScore}% → ${finalScore}%`
348
+ };
349
+ }
350
+ catch (error) {
351
+ return {
352
+ success: false,
353
+ initialScore: 0,
354
+ finalScore: 0,
355
+ improvements: [],
356
+ message: error instanceof Error ? error.message : 'Enhancement failed'
357
+ };
358
+ }
359
+ }
360
+ //# sourceMappingURL=enhance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhance.js","sourceRoot":"","sources":["../../../../src/faf-core/commands/enhance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 🏆 faf formats - TURBO-CAT Format Discovery Command (Mk3 Bundled)
3
+ * Lists all discovered formats in the project
4
+ */
5
+ export interface FormatsOptions {
6
+ export?: boolean;
7
+ json?: boolean;
8
+ category?: boolean;
9
+ }
10
+ export interface FormatsResult {
11
+ success: boolean;
12
+ totalFormats: number;
13
+ stackSignature: string;
14
+ intelligenceScore: number;
15
+ formats: Array<{
16
+ fileName: string;
17
+ category: string;
18
+ confidence: string;
19
+ }>;
20
+ message: string;
21
+ }
22
+ export declare function formatsCommand(projectPath?: string, options?: FormatsOptions): Promise<FormatsResult>;
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ /**
3
+ * 🏆 faf formats - TURBO-CAT Format Discovery Command (Mk3 Bundled)
4
+ * Lists all discovered formats in the project
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.formatsCommand = formatsCommand;
41
+ const path = __importStar(require("path"));
42
+ const file_utils_1 = require("../utils/file-utils");
43
+ async function formatsCommand(projectPath, options = {}) {
44
+ try {
45
+ const projectRoot = projectPath || process.cwd();
46
+ const startTime = Date.now();
47
+ // Simple format detection - check for common files
48
+ const commonFormats = [
49
+ 'package.json',
50
+ 'tsconfig.json',
51
+ 'README.md',
52
+ '.gitignore',
53
+ 'vite.config.ts',
54
+ 'svelte.config.js',
55
+ 'tailwind.config.js',
56
+ 'Dockerfile',
57
+ '.env',
58
+ 'project.faf',
59
+ '.faf'
60
+ ];
61
+ const foundFormats = [];
62
+ for (const format of commonFormats) {
63
+ const filePath = path.join(projectRoot, format);
64
+ if (await (0, file_utils_1.fileExists)(filePath)) {
65
+ foundFormats.push({
66
+ fileName: format,
67
+ category: categorizeFormat(format),
68
+ confidence: 'confirmed'
69
+ });
70
+ }
71
+ }
72
+ const elapsedTime = Date.now() - startTime;
73
+ return {
74
+ success: true,
75
+ totalFormats: foundFormats.length,
76
+ stackSignature: 'Detected',
77
+ intelligenceScore: foundFormats.length * 5,
78
+ formats: foundFormats,
79
+ message: `Found ${foundFormats.length} formats in ${elapsedTime}ms`
80
+ };
81
+ }
82
+ catch (error) {
83
+ return {
84
+ success: false,
85
+ totalFormats: 0,
86
+ stackSignature: 'Unknown',
87
+ intelligenceScore: 0,
88
+ formats: [],
89
+ message: error instanceof Error ? error.message : 'Format discovery failed'
90
+ };
91
+ }
92
+ }
93
+ function categorizeFormat(fileName) {
94
+ if (fileName.includes('json') || fileName.includes('yaml') || fileName.includes('toml')) {
95
+ return 'Config';
96
+ }
97
+ else if (fileName.includes('.ts') || fileName.includes('.js') || fileName.includes('.py')) {
98
+ return 'Code';
99
+ }
100
+ else if (fileName.includes('.md') || fileName.includes('README')) {
101
+ return 'Documentation';
102
+ }
103
+ else if (fileName.includes('test') || fileName.includes('spec')) {
104
+ return 'Testing';
105
+ }
106
+ else if (fileName.includes('workflow') || fileName.includes('jenkins')) {
107
+ return 'CI/CD';
108
+ }
109
+ else if (fileName.includes('docker') || fileName.includes('compose')) {
110
+ return 'Container';
111
+ }
112
+ else if (fileName.includes('.sql') || fileName.includes('migration')) {
113
+ return 'Database';
114
+ }
115
+ return 'Other';
116
+ }
117
+ //# sourceMappingURL=formats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formats.js","sourceRoot":"","sources":["../../../../src/faf-core/commands/formats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * faf init - Programmatic API (MCP-ready)
3
+ * No console output, returns structured data
4
+ */
5
+ export interface InitOptions {
6
+ force?: boolean;
7
+ new?: boolean;
8
+ choose?: boolean;
9
+ template?: string;
10
+ output?: string;
11
+ quiet?: boolean;
12
+ }
13
+ export interface InitResult {
14
+ success: boolean;
15
+ outputPath?: string;
16
+ projectType?: string;
17
+ score?: number;
18
+ duration?: number;
19
+ error?: string;
20
+ alreadyExists?: boolean;
21
+ }
22
+ /**
23
+ * Initialize .faf file - programmatic API
24
+ * Returns structured data, no console output
25
+ */
26
+ export declare function initFafFile(projectPath?: string, options?: InitOptions): Promise<InitResult>;
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ /**
3
+ * faf init - Programmatic API (MCP-ready)
4
+ * No console output, returns structured data
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.initFafFile = initFafFile;
41
+ const fs_1 = require("fs");
42
+ const path = __importStar(require("path"));
43
+ const file_utils_js_1 = require("../utils/file-utils.js");
44
+ const faf_generator_championship_js_1 = require("../generators/faf-generator-championship.js");
45
+ const fafignore_parser_js_1 = require("../utils/fafignore-parser.js");
46
+ const faf_compiler_js_1 = require("../compiler/faf-compiler.js");
47
+ /**
48
+ * Initialize .faf file - programmatic API
49
+ * Returns structured data, no console output
50
+ */
51
+ async function initFafFile(projectPath, options = {}) {
52
+ const startTime = Date.now();
53
+ try {
54
+ const projectRoot = projectPath || process.cwd();
55
+ const homeDir = require('os').homedir();
56
+ // CRITICAL: Prevent running in home or root directory
57
+ if (!projectPath && (projectRoot === homeDir || projectRoot === '/')) {
58
+ return {
59
+ success: false,
60
+ error: 'Cannot run in home or root directory for safety',
61
+ duration: Date.now() - startTime
62
+ };
63
+ }
64
+ // v3.0.0: ONLY supports project.faf (no legacy .faf)
65
+ const outputPath = options.output || `${projectRoot}/project.faf`;
66
+ // Check if project.faf file already exists
67
+ if ((await (0, file_utils_js_1.fileExists)(outputPath)) && !options.force && !options.new && !options.choose) {
68
+ return {
69
+ success: true,
70
+ alreadyExists: true,
71
+ outputPath,
72
+ duration: Date.now() - startTime
73
+ };
74
+ }
75
+ // Check for .fafignore
76
+ const fafIgnorePath = path.join(projectRoot, '.fafignore');
77
+ if (!(await (0, file_utils_js_1.fileExists)(fafIgnorePath))) {
78
+ await (0, fafignore_parser_js_1.createDefaultFafIgnore)(projectRoot);
79
+ }
80
+ // Detect project structure
81
+ const projectType = options.template === 'auto'
82
+ ? await (0, file_utils_js_1.detectProjectType)(projectRoot)
83
+ : options.template || (await (0, file_utils_js_1.detectProjectType)(projectRoot));
84
+ // Generate .faf content
85
+ const fafContent = await (0, faf_generator_championship_js_1.generateFafFromProject)({
86
+ projectType,
87
+ outputPath,
88
+ projectRoot: projectRoot,
89
+ });
90
+ // Write .faf file
91
+ await fs_1.promises.writeFile(outputPath, fafContent, 'utf-8');
92
+ // Score the newly created file
93
+ const compiler = new faf_compiler_js_1.FafCompiler();
94
+ const scoreResult = await compiler.compile(outputPath);
95
+ const duration = Date.now() - startTime;
96
+ return {
97
+ success: true,
98
+ outputPath,
99
+ projectType,
100
+ score: scoreResult.score,
101
+ duration
102
+ };
103
+ }
104
+ catch (error) {
105
+ const duration = Date.now() - startTime;
106
+ const errorMessage = error instanceof Error ? error.message : 'Init failed';
107
+ return {
108
+ success: false,
109
+ error: errorMessage,
110
+ duration
111
+ };
112
+ }
113
+ }
114
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../src/faf-core/commands/init.ts"],"names":[],"mappings":"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"}