faf-cli 4.2.2 → 4.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +266 -90
- package/assets/project-faf-screenshot.png +0 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +40 -22
- package/dist/cli.js.map +1 -1
- package/dist/commands/git.d.ts.map +1 -1
- package/dist/commands/git.js +9 -7
- package/dist/commands/git.js.map +1 -1
- package/dist/commands/readme.d.ts +11 -6
- package/dist/commands/readme.d.ts.map +1 -1
- package/dist/commands/readme.js +167 -120
- package/dist/commands/readme.js.map +1 -1
- package/dist/commands/show.d.ts.map +1 -1
- package/dist/commands/show.js +22 -7
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/sixws.d.ts +6 -0
- package/dist/commands/sixws.d.ts.map +1 -0
- package/dist/commands/sixws.js +154 -0
- package/dist/commands/sixws.js.map +1 -0
- package/dist/github/current-score-calculator.d.ts +15 -0
- package/dist/github/current-score-calculator.d.ts.map +1 -0
- package/dist/github/current-score-calculator.js +125 -0
- package/dist/github/current-score-calculator.js.map +1 -0
- package/dist/github/faf-git-generator.d.ts +58 -0
- package/dist/github/faf-git-generator.d.ts.map +1 -0
- package/dist/github/faf-git-generator.js +557 -0
- package/dist/github/faf-git-generator.js.map +1 -0
- package/dist/github/github-extractor.d.ts +4 -0
- package/dist/github/github-extractor.d.ts.map +1 -1
- package/dist/github/github-extractor.js +27 -0
- package/dist/github/github-extractor.js.map +1 -1
- package/dist/github/repo-selector.d.ts +2 -2
- package/dist/github/repo-selector.d.ts.map +1 -1
- package/dist/github/repo-selector.js +30 -23
- package/dist/github/repo-selector.js.map +1 -1
- package/dist/utils/file-utils.d.ts.map +1 -1
- package/dist/utils/file-utils.js +1 -4
- package/dist/utils/file-utils.js.map +1 -1
- package/dist/utils/slot-counter.d.ts +56 -0
- package/dist/utils/slot-counter.d.ts.map +1 -0
- package/dist/utils/slot-counter.js +100 -0
- package/dist/utils/slot-counter.js.map +1 -0
- package/dist/utils/yaml-generator.d.ts.map +1 -1
- package/dist/utils/yaml-generator.js +3 -7
- package/dist/utils/yaml-generator.js.map +1 -1
- package/package.json +7 -2
- package/project.faf +5 -9
- package/scripts/ANTHROPIC-DEMO.sh +203 -0
- package/scripts/boris-ready.sh +169 -0
- package/scripts/bundle-yaml.js +87 -0
- package/scripts/check-version.js +88 -0
- package/scripts/clean-build.js +34 -0
- package/scripts/cleanup-unused.sh +54 -0
- package/scripts/debug-django.txt +9 -0
- package/scripts/debug-mongo.txt +9 -0
- package/scripts/debug-react.txt +9 -0
- package/scripts/debug-rust.txt +9 -0
- package/scripts/debug-whisper.cpp.txt +9 -0
- package/scripts/evaluate-family-member.ts +300 -0
- package/scripts/generate-docs.ts +358 -0
- package/scripts/generate-drift-reports.sh +111 -0
- package/scripts/industry-showcase.json +122 -0
- package/scripts/mcp-ecosystem-research.sh +58 -0
- package/scripts/migrate-yaml-imports.sh +55 -0
- package/scripts/migrate-yaml.ts +132 -0
- package/scripts/performance-validation.ts +460 -0
- package/scripts/postinstall.js +30 -0
- package/scripts/prepare-release.ts +421 -0
- package/scripts/run-industry-showcase.ts +237 -0
- package/scripts/run-test-showcase.ts +244 -0
- package/scripts/setup-github-watch.sh +43 -0
- package/scripts/sync-version.js +35 -0
- package/scripts/test-integration-detection.ts +93 -0
- package/scripts/test-integration-simple.js +93 -0
- package/scripts/test-medal-progression.sh +143 -0
- package/scripts/test-showcase-results.json +109 -0
- package/scripts/test-showcase.json +32 -0
- package/scripts/update-version.js +148 -0
- package/scripts/verify-build.js +343 -0
- package/scripts/version-check.js +78 -0
- package/scripts/watch-discussions.sh +86 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
#!/usr/bin/env ts-node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 📚 Documentation Generator - F1-Inspired Championship Docs
|
|
5
|
+
* Auto-generates command reference from FAF_INDEX
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as fs from 'fs/promises';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import { FAF_INDEX } from '../src/commands/index';
|
|
11
|
+
import { FAF_COLORS, FAF_ICONS } from '../src/utils/championship-style';
|
|
12
|
+
|
|
13
|
+
const DOCS_DIR = path.join(__dirname, '..', 'docs-site');
|
|
14
|
+
|
|
15
|
+
interface GenerationStats {
|
|
16
|
+
commandPages: number;
|
|
17
|
+
conceptPages: number;
|
|
18
|
+
totalPages: number;
|
|
19
|
+
errors: string[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Main documentation generation function
|
|
24
|
+
*/
|
|
25
|
+
async function generateDocs(): Promise<void> {
|
|
26
|
+
console.log(`${FAF_COLORS.fafCyan('🏗️ Generating FAF CLI Documentation...')}`);
|
|
27
|
+
|
|
28
|
+
const stats: GenerationStats = {
|
|
29
|
+
commandPages: 0,
|
|
30
|
+
conceptPages: 0,
|
|
31
|
+
totalPages: 0,
|
|
32
|
+
errors: []
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
// Ensure docs directory exists
|
|
37
|
+
await ensureDocsDirectory();
|
|
38
|
+
|
|
39
|
+
// Generate command reference pages
|
|
40
|
+
await generateCommandPages(stats);
|
|
41
|
+
|
|
42
|
+
// Generate concept pages
|
|
43
|
+
await generateConceptPages(stats);
|
|
44
|
+
|
|
45
|
+
// Generate index pages
|
|
46
|
+
await generateIndexPages(stats);
|
|
47
|
+
|
|
48
|
+
// Generate navigation config
|
|
49
|
+
await generateNavigation();
|
|
50
|
+
|
|
51
|
+
// Show results
|
|
52
|
+
console.log();
|
|
53
|
+
console.log(`${FAF_COLORS.fafGreen('✅ Documentation Generation Complete!')}`);
|
|
54
|
+
console.log(`${FAF_COLORS.fafCyan('├─')} Command pages: ${stats.commandPages}`);
|
|
55
|
+
console.log(`${FAF_COLORS.fafCyan('├─')} Concept pages: ${stats.conceptPages}`);
|
|
56
|
+
console.log(`${FAF_COLORS.fafCyan('├─')} Total pages: ${stats.totalPages}`);
|
|
57
|
+
|
|
58
|
+
if (stats.errors.length > 0) {
|
|
59
|
+
console.log(`${FAF_COLORS.fafOrange('└─')} Errors: ${stats.errors.length}`);
|
|
60
|
+
stats.errors.forEach(error => {
|
|
61
|
+
console.log(` ${FAF_COLORS.fafOrange('⚠️')} ${error}`);
|
|
62
|
+
});
|
|
63
|
+
} else {
|
|
64
|
+
console.log(`${FAF_COLORS.fafGreen('└─')} No errors! 🏆`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.error(`${FAF_COLORS.fafOrange('❌ Generation failed:')} ${error}`);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Ensure docs directory structure exists
|
|
75
|
+
*/
|
|
76
|
+
async function ensureDocsDirectory(): Promise<void> {
|
|
77
|
+
const dirs = [
|
|
78
|
+
path.join(DOCS_DIR, 'pages'),
|
|
79
|
+
path.join(DOCS_DIR, 'pages', 'commands'),
|
|
80
|
+
path.join(DOCS_DIR, 'pages', 'concepts'),
|
|
81
|
+
path.join(DOCS_DIR, 'pages', 'examples'),
|
|
82
|
+
path.join(DOCS_DIR, 'components'),
|
|
83
|
+
path.join(DOCS_DIR, 'public', 'screenshots'),
|
|
84
|
+
path.join(DOCS_DIR, 'public', 'examples')
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
for (const dir of dirs) {
|
|
88
|
+
await fs.mkdir(dir, { recursive: true });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Generate command reference pages
|
|
94
|
+
*/
|
|
95
|
+
async function generateCommandPages(stats: GenerationStats): Promise<void> {
|
|
96
|
+
const commands = Object.entries(FAF_INDEX).filter(([_, entry]) => entry.type === 'command');
|
|
97
|
+
|
|
98
|
+
for (const [key, entry] of commands) {
|
|
99
|
+
try {
|
|
100
|
+
const content = generateCommandPageContent(key, entry);
|
|
101
|
+
const filePath = path.join(DOCS_DIR, 'pages', 'commands', `${key}.mdx`);
|
|
102
|
+
await fs.writeFile(filePath, content);
|
|
103
|
+
stats.commandPages++;
|
|
104
|
+
stats.totalPages++;
|
|
105
|
+
} catch (error) {
|
|
106
|
+
stats.errors.push(`Command ${key}: ${error}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Generate concept pages
|
|
113
|
+
*/
|
|
114
|
+
async function generateConceptPages(stats: GenerationStats): Promise<void> {
|
|
115
|
+
const concepts = Object.entries(FAF_INDEX).filter(([_, entry]) => entry.type === 'concept');
|
|
116
|
+
|
|
117
|
+
for (const [key, entry] of concepts) {
|
|
118
|
+
try {
|
|
119
|
+
const content = generateConceptPageContent(key, entry);
|
|
120
|
+
const filePath = path.join(DOCS_DIR, 'pages', 'concepts', `${key}.mdx`);
|
|
121
|
+
await fs.writeFile(filePath, content);
|
|
122
|
+
stats.conceptPages++;
|
|
123
|
+
stats.totalPages++;
|
|
124
|
+
} catch (error) {
|
|
125
|
+
stats.errors.push(`Concept ${key}: ${error}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Generate index pages
|
|
132
|
+
*/
|
|
133
|
+
async function generateIndexPages(stats: GenerationStats): Promise<void> {
|
|
134
|
+
// Commands index
|
|
135
|
+
const commandsIndex = generateCommandsIndexContent();
|
|
136
|
+
await fs.writeFile(
|
|
137
|
+
path.join(DOCS_DIR, 'pages', 'commands', 'index.mdx'),
|
|
138
|
+
commandsIndex
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
// Concepts index
|
|
142
|
+
const conceptsIndex = generateConceptsIndexContent();
|
|
143
|
+
await fs.writeFile(
|
|
144
|
+
path.join(DOCS_DIR, 'pages', 'concepts', 'index.mdx'),
|
|
145
|
+
conceptsIndex
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
// Main index
|
|
149
|
+
const mainIndex = generateMainIndexContent();
|
|
150
|
+
await fs.writeFile(
|
|
151
|
+
path.join(DOCS_DIR, 'pages', 'index.mdx'),
|
|
152
|
+
mainIndex
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
stats.totalPages += 3;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Generate command page content
|
|
160
|
+
*/
|
|
161
|
+
function generateCommandPageContent(key: string, entry: any): string {
|
|
162
|
+
return `# ${key}
|
|
163
|
+
|
|
164
|
+
${entry.description}
|
|
165
|
+
|
|
166
|
+
## Usage
|
|
167
|
+
|
|
168
|
+
\`\`\`bash
|
|
169
|
+
${entry.usage || `faf ${key}`}
|
|
170
|
+
\`\`\`
|
|
171
|
+
|
|
172
|
+
${entry.examples ? `
|
|
173
|
+
## Examples
|
|
174
|
+
|
|
175
|
+
${entry.examples.map((example: string) => `\`\`\`bash
|
|
176
|
+
${example}
|
|
177
|
+
\`\`\`\n`).join('')}
|
|
178
|
+
` : ''}
|
|
179
|
+
|
|
180
|
+
${entry.related ? `
|
|
181
|
+
## Related Commands
|
|
182
|
+
|
|
183
|
+
${entry.related.map((rel: string) => `- [${rel}](./${rel})`).join('\n')}
|
|
184
|
+
` : ''}
|
|
185
|
+
|
|
186
|
+
## Category
|
|
187
|
+
|
|
188
|
+
**${entry.category}** - ${getCategoryDescription(entry.category)}
|
|
189
|
+
`;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Generate concept page content
|
|
194
|
+
*/
|
|
195
|
+
function generateConceptPageContent(key: string, entry: any): string {
|
|
196
|
+
return `# ${key}
|
|
197
|
+
|
|
198
|
+
${entry.description}
|
|
199
|
+
|
|
200
|
+
${entry.related ? `
|
|
201
|
+
## Related
|
|
202
|
+
|
|
203
|
+
${entry.related.map((rel: string) => `- [${rel}](../${getRelatedType(rel)}/${rel})`).join('\n')}
|
|
204
|
+
` : ''}
|
|
205
|
+
|
|
206
|
+
## Category
|
|
207
|
+
|
|
208
|
+
**${entry.category}** - ${getCategoryDescription(entry.category)}
|
|
209
|
+
`;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Generate commands index content
|
|
214
|
+
*/
|
|
215
|
+
function generateCommandsIndexContent(): string {
|
|
216
|
+
const commands = Object.entries(FAF_INDEX).filter(([_, entry]) => entry.type === 'command');
|
|
217
|
+
|
|
218
|
+
return `# Commands Reference
|
|
219
|
+
|
|
220
|
+
Complete reference for all FAF CLI commands.
|
|
221
|
+
|
|
222
|
+
## Core Commands
|
|
223
|
+
|
|
224
|
+
${commands.filter(([_, entry]) => entry.category === 'core').map(([key, entry]) =>
|
|
225
|
+
`### [${key}](./${key})
|
|
226
|
+
${entry.description}
|
|
227
|
+
\`\`\`bash
|
|
228
|
+
${entry.usage || `faf ${key}`}
|
|
229
|
+
\`\`\`
|
|
230
|
+
`).join('\n')}
|
|
231
|
+
|
|
232
|
+
## All Commands
|
|
233
|
+
|
|
234
|
+
${commands.map(([key, entry]) => `- **[${key}](./${key})** - ${entry.description}`).join('\n')}
|
|
235
|
+
`;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Generate concepts index content
|
|
240
|
+
*/
|
|
241
|
+
function generateConceptsIndexContent(): string {
|
|
242
|
+
const concepts = Object.entries(FAF_INDEX).filter(([_, entry]) => entry.type === 'concept');
|
|
243
|
+
|
|
244
|
+
return `# Core Concepts
|
|
245
|
+
|
|
246
|
+
Understanding the fundamentals of FAF CLI and AI context management.
|
|
247
|
+
|
|
248
|
+
${concepts.map(([key, entry]) => `## [${key}](./${key})
|
|
249
|
+
|
|
250
|
+
${entry.description}
|
|
251
|
+
`).join('\n')}
|
|
252
|
+
`;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Generate main index content
|
|
257
|
+
*/
|
|
258
|
+
function generateMainIndexContent(): string {
|
|
259
|
+
return `---
|
|
260
|
+
title: FAF CLI Documentation
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
# 🏎️ FAF CLI Documentation
|
|
264
|
+
|
|
265
|
+
Welcome to the **Championship-grade AI context management** documentation!
|
|
266
|
+
|
|
267
|
+
## Quick Start
|
|
268
|
+
|
|
269
|
+
\`\`\`bash
|
|
270
|
+
# Install FAF CLI
|
|
271
|
+
npm install -g @faf/cli
|
|
272
|
+
|
|
273
|
+
# Initialize your project
|
|
274
|
+
faf init
|
|
275
|
+
|
|
276
|
+
# Check your AI context score
|
|
277
|
+
faf score
|
|
278
|
+
|
|
279
|
+
# Build trust with AI
|
|
280
|
+
faf trust
|
|
281
|
+
\`\`\`
|
|
282
|
+
|
|
283
|
+
## What is FAF?
|
|
284
|
+
|
|
285
|
+
FAF (Foundational AI-Context Format) transforms developer psychology from **hope-driven** to **trust-driven** AI development. In 30 seconds, FAF replaces 20 minutes of questions.
|
|
286
|
+
|
|
287
|
+
## Core Features
|
|
288
|
+
|
|
289
|
+
- 🚀 **Universal AI Context** - Works with Claude, ChatGPT, Gemini
|
|
290
|
+
- ⚡ **F1-Inspired Performance** - Championship speed (<40ms status)
|
|
291
|
+
- 🎯 **Trust-Driven Development** - Eliminate AI anxiety
|
|
292
|
+
- 💎 **Technical Credit System** - Psychology revolution vs debt
|
|
293
|
+
|
|
294
|
+
## Documentation Sections
|
|
295
|
+
|
|
296
|
+
- **[Commands](/commands)** - Complete CLI reference
|
|
297
|
+
- **[Concepts](/concepts)** - Core concepts and principles
|
|
298
|
+
- **[Examples](/examples)** - Real-world usage patterns
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
**🏁 Making AI development better for everyone!**
|
|
303
|
+
`;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Generate navigation configuration
|
|
308
|
+
*/
|
|
309
|
+
async function generateNavigation(): Promise<void> {
|
|
310
|
+
const navConfig = `export default {
|
|
311
|
+
logo: <span>🏎️ FAF CLI</span>,
|
|
312
|
+
project: {
|
|
313
|
+
link: 'https://github.com/faf-org/cli'
|
|
314
|
+
},
|
|
315
|
+
docsRepositoryBase: 'https://github.com/faf-org/cli/tree/main/docs',
|
|
316
|
+
sidebar: {
|
|
317
|
+
defaultMenuCollapseLevel: 1
|
|
318
|
+
},
|
|
319
|
+
footer: {
|
|
320
|
+
text: '🏁 Making AI development better for everyone!'
|
|
321
|
+
}
|
|
322
|
+
}`;
|
|
323
|
+
|
|
324
|
+
await fs.writeFile(
|
|
325
|
+
path.join(DOCS_DIR, 'theme.config.tsx'),
|
|
326
|
+
navConfig
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Helper functions
|
|
332
|
+
*/
|
|
333
|
+
function getCategoryDescription(category: string): string {
|
|
334
|
+
const descriptions: Record<string, string> = {
|
|
335
|
+
core: 'Essential FAF functionality',
|
|
336
|
+
ai: 'AI integration and compatibility',
|
|
337
|
+
trust: 'Trust and confidence management',
|
|
338
|
+
utilities: 'Helper tools and utilities',
|
|
339
|
+
improvement: 'Context improvement tools',
|
|
340
|
+
psychology: 'Developer psychology enhancement',
|
|
341
|
+
concepts: 'Fundamental concepts',
|
|
342
|
+
discovery: 'Technology discovery and analysis'
|
|
343
|
+
};
|
|
344
|
+
return descriptions[category] || 'FAF functionality';
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
function getRelatedType(key: string): string {
|
|
348
|
+
const entry = FAF_INDEX[key as keyof typeof FAF_INDEX];
|
|
349
|
+
if (!entry) return 'commands';
|
|
350
|
+
return entry.type === 'command' ? 'commands' : 'concepts';
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Run the generator
|
|
354
|
+
if (require.main === module) {
|
|
355
|
+
generateDocs().catch(console.error);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
export { generateDocs };
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# 📊 Generate Real Drift Reports for Social Media
|
|
3
|
+
# Championship-grade proof of context-drift impact
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
echo "🍊 FAF DRIFT REPORT GENERATOR"
|
|
8
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
9
|
+
echo ""
|
|
10
|
+
|
|
11
|
+
# Output directory for reports
|
|
12
|
+
REPORT_DIR="/tmp/faf-drift-reports"
|
|
13
|
+
mkdir -p "$REPORT_DIR"
|
|
14
|
+
|
|
15
|
+
echo "📁 Reports will be saved to: $REPORT_DIR"
|
|
16
|
+
echo ""
|
|
17
|
+
|
|
18
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
19
|
+
# Report 1: FAF CLI itself
|
|
20
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
21
|
+
|
|
22
|
+
echo "🏎️ REPORT 1: FAF CLI (Self-Analysis)"
|
|
23
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
24
|
+
echo ""
|
|
25
|
+
|
|
26
|
+
cd "$(dirname "$0")/.."
|
|
27
|
+
node dist/cli.js drift --export "$REPORT_DIR/faf-cli-drift.json" | tee "$REPORT_DIR/faf-cli-drift.txt"
|
|
28
|
+
|
|
29
|
+
echo ""
|
|
30
|
+
echo "✅ Report saved:"
|
|
31
|
+
echo " - JSON: $REPORT_DIR/faf-cli-drift.json"
|
|
32
|
+
echo " - Text: $REPORT_DIR/faf-cli-drift.txt"
|
|
33
|
+
echo ""
|
|
34
|
+
|
|
35
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
36
|
+
# Report 2: Other FAF projects (if available)
|
|
37
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
38
|
+
|
|
39
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
40
|
+
echo "🔍 Scanning for other FAF projects..."
|
|
41
|
+
echo ""
|
|
42
|
+
|
|
43
|
+
# Check if faf-dev-tools exists
|
|
44
|
+
if [ -d "/Users/wolfejam/FAF/faf-dev-tools" ]; then
|
|
45
|
+
echo "🌐 REPORT 2: faf-dev-tools"
|
|
46
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
47
|
+
echo ""
|
|
48
|
+
|
|
49
|
+
cd /Users/wolfejam/FAF/faf-dev-tools
|
|
50
|
+
node /Users/wolfejam/FAF/cli/dist/cli.js drift --export "$REPORT_DIR/faf-dev-tools-drift.json" | tee "$REPORT_DIR/faf-dev-tools-drift.txt"
|
|
51
|
+
|
|
52
|
+
echo ""
|
|
53
|
+
echo "✅ Report saved:"
|
|
54
|
+
echo " - JSON: $REPORT_DIR/faf-dev-tools-drift.json"
|
|
55
|
+
echo " - Text: $REPORT_DIR/faf-dev-tools-drift.txt"
|
|
56
|
+
echo ""
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
# Check if claude-faf-mcp exists
|
|
60
|
+
if [ -d "/Users/wolfejam/FAF/claude-faf-mcp" ]; then
|
|
61
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
62
|
+
echo "🔌 REPORT 3: claude-faf-mcp"
|
|
63
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
64
|
+
echo ""
|
|
65
|
+
|
|
66
|
+
cd /Users/wolfejam/FAF/claude-faf-mcp
|
|
67
|
+
node /Users/wolfejam/FAF/cli/dist/cli.js drift --export "$REPORT_DIR/claude-faf-mcp-drift.json" | tee "$REPORT_DIR/claude-faf-mcp-drift.txt"
|
|
68
|
+
|
|
69
|
+
echo ""
|
|
70
|
+
echo "✅ Report saved:"
|
|
71
|
+
echo " - JSON: $REPORT_DIR/claude-faf-mcp-drift.json"
|
|
72
|
+
echo " - Text: $REPORT_DIR/claude-faf-mcp-drift.txt"
|
|
73
|
+
echo ""
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
77
|
+
# Generate Summary
|
|
78
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
79
|
+
|
|
80
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
81
|
+
echo "📊 SUMMARY"
|
|
82
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
83
|
+
echo ""
|
|
84
|
+
echo "All reports saved to: $REPORT_DIR"
|
|
85
|
+
echo ""
|
|
86
|
+
echo "Reports generated:"
|
|
87
|
+
ls -lh "$REPORT_DIR"
|
|
88
|
+
echo ""
|
|
89
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
90
|
+
echo "🎯 READY FOR SOCIAL MEDIA"
|
|
91
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
92
|
+
echo ""
|
|
93
|
+
echo "Text reports (ready to copy/paste):"
|
|
94
|
+
for file in "$REPORT_DIR"/*.txt; do
|
|
95
|
+
if [ -f "$file" ]; then
|
|
96
|
+
echo " 📄 $(basename "$file")"
|
|
97
|
+
fi
|
|
98
|
+
done
|
|
99
|
+
echo ""
|
|
100
|
+
echo "JSON reports (for web visualization):"
|
|
101
|
+
for file in "$REPORT_DIR"/*.json; do
|
|
102
|
+
if [ -f "$file" ]; then
|
|
103
|
+
echo " 📊 $(basename "$file")"
|
|
104
|
+
fi
|
|
105
|
+
done
|
|
106
|
+
echo ""
|
|
107
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
108
|
+
echo "Context-drift makes you pay."
|
|
109
|
+
echo ".faf keeps you drift-free."
|
|
110
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
111
|
+
echo ""
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "FAF Industry Showcase",
|
|
3
|
+
"description": "Proof that FAF works across every language, framework, and project type",
|
|
4
|
+
"updated": "2026-02-08",
|
|
5
|
+
"categories": [
|
|
6
|
+
{
|
|
7
|
+
"name": "JavaScript/TypeScript",
|
|
8
|
+
"repos": [
|
|
9
|
+
"facebook/react",
|
|
10
|
+
"vuejs/core",
|
|
11
|
+
"angular/angular",
|
|
12
|
+
"sveltejs/svelte",
|
|
13
|
+
"vercel/next.js",
|
|
14
|
+
"nuxt/nuxt",
|
|
15
|
+
"microsoft/TypeScript",
|
|
16
|
+
"nodejs/node",
|
|
17
|
+
"denoland/deno",
|
|
18
|
+
"oven-sh/bun",
|
|
19
|
+
"expressjs/express",
|
|
20
|
+
"nestjs/nest"
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "Python",
|
|
25
|
+
"repos": [
|
|
26
|
+
"python/cpython",
|
|
27
|
+
"django/django",
|
|
28
|
+
"pallets/flask",
|
|
29
|
+
"tiangolo/fastapi",
|
|
30
|
+
"huggingface/transformers",
|
|
31
|
+
"openai/whisper",
|
|
32
|
+
"pytorch/pytorch",
|
|
33
|
+
"tensorflow/tensorflow",
|
|
34
|
+
"scikit-learn/scikit-learn",
|
|
35
|
+
"jupyter/notebook"
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"name": "Systems/Low-level",
|
|
40
|
+
"repos": [
|
|
41
|
+
"ggml-org/whisper.cpp",
|
|
42
|
+
"rust-lang/rust",
|
|
43
|
+
"golang/go",
|
|
44
|
+
"ziglang/zig",
|
|
45
|
+
"redis/redis",
|
|
46
|
+
"nginx/nginx",
|
|
47
|
+
"curl/curl",
|
|
48
|
+
"git/git"
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"name": "Mobile",
|
|
53
|
+
"repos": [
|
|
54
|
+
"facebook/react-native",
|
|
55
|
+
"flutter/flutter",
|
|
56
|
+
"ionic-team/ionic-framework",
|
|
57
|
+
"expo/expo",
|
|
58
|
+
"realm/realm-swift",
|
|
59
|
+
"square/okhttp"
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"name": "Databases",
|
|
64
|
+
"repos": [
|
|
65
|
+
"postgres/postgres",
|
|
66
|
+
"mongodb/mongo",
|
|
67
|
+
"elastic/elasticsearch",
|
|
68
|
+
"clickhouse/clickhouse",
|
|
69
|
+
"cockroachdb/cockroach",
|
|
70
|
+
"supabase/supabase"
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"name": "DevOps/Cloud",
|
|
75
|
+
"repos": [
|
|
76
|
+
"kubernetes/kubernetes",
|
|
77
|
+
"docker/cli",
|
|
78
|
+
"hashicorp/terraform",
|
|
79
|
+
"ansible/ansible",
|
|
80
|
+
"prometheus/prometheus",
|
|
81
|
+
"grafana/grafana",
|
|
82
|
+
"vercel/vercel",
|
|
83
|
+
"netlify/cli"
|
|
84
|
+
]
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"name": "Web Frameworks",
|
|
88
|
+
"repos": [
|
|
89
|
+
"rails/rails",
|
|
90
|
+
"laravel/laravel",
|
|
91
|
+
"spring-projects/spring-boot",
|
|
92
|
+
"phoenixframework/phoenix",
|
|
93
|
+
"gin-gonic/gin",
|
|
94
|
+
"actix/actix-web"
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"name": "Developer Tools",
|
|
99
|
+
"repos": [
|
|
100
|
+
"neovim/neovim",
|
|
101
|
+
"prettier/prettier",
|
|
102
|
+
"eslint/eslint",
|
|
103
|
+
"webpack/webpack",
|
|
104
|
+
"vitejs/vite",
|
|
105
|
+
"vercel/turborepo",
|
|
106
|
+
"changesets/changesets",
|
|
107
|
+
"jestjs/jest"
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"name": "AI/ML Infrastructure",
|
|
112
|
+
"repos": [
|
|
113
|
+
"openai/openai-python",
|
|
114
|
+
"anthropics/anthropic-sdk-python",
|
|
115
|
+
"langchain-ai/langchain",
|
|
116
|
+
"run-llama/llama_index",
|
|
117
|
+
"chroma-core/chroma",
|
|
118
|
+
"pinecone-io/pinecone-python-client"
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
]
|
|
122
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# MCP Ecosystem Research - Get stats for all major MCP servers
|
|
3
|
+
|
|
4
|
+
echo "🔍 MCP ECOSYSTEM RESEARCH"
|
|
5
|
+
echo "========================="
|
|
6
|
+
echo ""
|
|
7
|
+
|
|
8
|
+
packages=(
|
|
9
|
+
"@modelcontextprotocol/sdk"
|
|
10
|
+
"@playwright/mcp"
|
|
11
|
+
"chrome-devtools-mcp"
|
|
12
|
+
"@mastra/mcp"
|
|
13
|
+
"n8n-mcp"
|
|
14
|
+
"mcp-proxy"
|
|
15
|
+
"@langchain/mcp-adapters"
|
|
16
|
+
"mcp-handler"
|
|
17
|
+
"tavily-mcp"
|
|
18
|
+
"n8n-nodes-mcp"
|
|
19
|
+
"@supabase/mcp-utils"
|
|
20
|
+
"@upstash/context7-mcp"
|
|
21
|
+
"mcp-framework"
|
|
22
|
+
"@hono/mcp"
|
|
23
|
+
"gemini-mcp-tool"
|
|
24
|
+
"@expo/mcp-tunnel"
|
|
25
|
+
"@browsermcp/mcp"
|
|
26
|
+
"@agent-infra/mcp-server-browser"
|
|
27
|
+
"@mobilenext/mobile-mcp"
|
|
28
|
+
"mcp-hello-world"
|
|
29
|
+
"@mzxrai/mcp-webresearch"
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
for pkg in "${packages[@]}"; do
|
|
33
|
+
echo "📦 $pkg"
|
|
34
|
+
|
|
35
|
+
# Get package info
|
|
36
|
+
info=$(npm view "$pkg" version description 2>/dev/null)
|
|
37
|
+
if [ $? -eq 0 ]; then
|
|
38
|
+
echo " $info" | sed 's/^/ /'
|
|
39
|
+
|
|
40
|
+
# Get download stats
|
|
41
|
+
downloads=$(curl -s "https://api.npmjs.org/downloads/point/last-week/$pkg" 2>/dev/null)
|
|
42
|
+
if [ $? -eq 0 ]; then
|
|
43
|
+
dl_count=$(echo "$downloads" | grep -o '"downloads":[0-9]*' | cut -d: -f2)
|
|
44
|
+
if [ -n "$dl_count" ]; then
|
|
45
|
+
# Format with commas
|
|
46
|
+
formatted=$(printf "%'d" $dl_count 2>/dev/null || echo $dl_count)
|
|
47
|
+
echo " 📊 Weekly downloads: $formatted"
|
|
48
|
+
fi
|
|
49
|
+
fi
|
|
50
|
+
else
|
|
51
|
+
echo " ⚠️ Package not found"
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
echo ""
|
|
55
|
+
sleep 0.2 # Rate limit
|
|
56
|
+
done
|
|
57
|
+
|
|
58
|
+
echo "✅ Research complete!"
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# 🔥 ROCK SOLID YAML FIX - Migrate all files to use fix-once/yaml
|
|
3
|
+
# FIX ONCE, DONE FOREVER
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
echo "🔧 Migrating all YAML imports to fix-once/yaml..."
|
|
8
|
+
echo ""
|
|
9
|
+
|
|
10
|
+
# Find all TypeScript files with yaml imports
|
|
11
|
+
FILES=$(grep -r "import.*yaml" src/ --include="*.ts" -l || true)
|
|
12
|
+
|
|
13
|
+
COUNT=0
|
|
14
|
+
for file in $FILES; do
|
|
15
|
+
# Skip the fix-once/yaml.ts file itself
|
|
16
|
+
if [[ "$file" == *"fix-once/yaml.ts"* ]]; then
|
|
17
|
+
continue
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
echo "📝 Processing: $file"
|
|
21
|
+
|
|
22
|
+
# Pattern 1: import * as YAML from 'yaml'
|
|
23
|
+
sed -i '' "s|import \* as YAML from ['\"]yaml['\"]|import { parse as parseYAML, stringify as stringifyYAML } from '../fix-once/yaml'|g" "$file"
|
|
24
|
+
sed -i '' "s|import \* as YAML from ['\"]yaml['\"]|import { parse as parseYAML, stringify as stringifyYAML } from '../../fix-once/yaml'|g" "$file"
|
|
25
|
+
sed -i '' "s|import \* as YAML from ['\"]yaml['\"]|import { parse as parseYAML, stringify as stringifyYAML } from '../../../fix-once/yaml'|g" "$file"
|
|
26
|
+
|
|
27
|
+
# Pattern 2: import * as yaml from 'yaml'
|
|
28
|
+
sed -i '' "s|import \* as yaml from ['\"]yaml['\"]|import { parse as parseYAML, stringify as stringifyYAML } from '../fix-once/yaml'|g" "$file"
|
|
29
|
+
sed -i '' "s|import \* as yaml from ['\"]yaml['\"]|import { parse as parseYAML, stringify as stringifyYAML } from '../../fix-once/yaml'|g" "$file"
|
|
30
|
+
sed -i '' "s|import \* as yaml from ['\"]yaml['\"]|import { parse as parseYAML, stringify as stringifyYAML } from '../../../fix-once/yaml'|g" "$file"
|
|
31
|
+
|
|
32
|
+
# Pattern 3: import yaml from 'yaml'
|
|
33
|
+
sed -i '' "s|import yaml from ['\"]yaml['\"]|import { parse as parseYAML, stringify as stringifyYAML } from '../fix-once/yaml'|g" "$file"
|
|
34
|
+
sed -i '' "s|import yaml from ['\"]yaml['\"]|import { parse as parseYAML, stringify as stringifyYAML } from '../../fix-once/yaml'|g" "$file"
|
|
35
|
+
sed -i '' "s|import yaml from ['\"]yaml['\"]|import { parse as parseYAML, stringify as stringifyYAML } from '../../../fix-once/yaml'|g" "$file"
|
|
36
|
+
|
|
37
|
+
# Pattern 4: import { parse, stringify } from 'yaml'
|
|
38
|
+
sed -i '' "s|import { parse, stringify } from ['\"]yaml['\"]|import { parse as parseYAML, stringify as stringifyYAML } from '../fix-once/yaml'|g" "$file"
|
|
39
|
+
sed -i '' "s|import { parse, stringify } from ['\"]yaml['\"]|import { parse as parseYAML, stringify as stringifyYAML } from '../../fix-once/yaml'|g" "$file"
|
|
40
|
+
sed -i '' "s|import { parse, stringify } from ['\"]yaml['\"]|import { parse as parseYAML, stringify as stringifyYAML } from '../../../fix-once/yaml'|g" "$file"
|
|
41
|
+
|
|
42
|
+
COUNT=$((COUNT + 1))
|
|
43
|
+
done
|
|
44
|
+
|
|
45
|
+
echo ""
|
|
46
|
+
echo "✅ Migrated $COUNT files to use fix-once/yaml"
|
|
47
|
+
echo ""
|
|
48
|
+
echo "⚠️ MANUAL STEP REQUIRED:"
|
|
49
|
+
echo " Replace all instances of:"
|
|
50
|
+
echo " - YAML.parse(x) → parseYAML(x, { filepath: path })"
|
|
51
|
+
echo " - yaml.parse(x) → parseYAML(x, { filepath: path })"
|
|
52
|
+
echo " - YAML.stringify(x) → stringifyYAML(x)"
|
|
53
|
+
echo " - yaml.stringify(x) → stringifyYAML(x)"
|
|
54
|
+
echo ""
|
|
55
|
+
echo "🏎️ YAML is now ROCK SOLID - FIX ONCE, DONE FOREVER"
|