faf-mcp 1.3.1 → 2.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.
- package/CHANGELOG.md +32 -0
- package/CLAUDE.md +5 -5
- package/README.md +70 -14
- package/assets/thumbnail.png +0 -0
- package/dist/src/faf-core/commands/agents.d.ts +29 -0
- package/dist/src/faf-core/commands/agents.js +140 -0
- package/dist/src/faf-core/commands/agents.js.map +1 -0
- package/dist/src/faf-core/commands/bi-sync.d.ts +9 -5
- package/dist/src/faf-core/commands/bi-sync.js +89 -85
- package/dist/src/faf-core/commands/bi-sync.js.map +1 -1
- package/dist/src/faf-core/commands/conductor.d.ts +25 -0
- package/dist/src/faf-core/commands/conductor.js +157 -0
- package/dist/src/faf-core/commands/conductor.js.map +1 -0
- package/dist/src/faf-core/commands/cursor.d.ts +29 -0
- package/dist/src/faf-core/commands/cursor.js +134 -0
- package/dist/src/faf-core/commands/cursor.js.map +1 -0
- package/dist/src/faf-core/commands/gemini.d.ts +29 -0
- package/dist/src/faf-core/commands/gemini.js +133 -0
- package/dist/src/faf-core/commands/gemini.js.map +1 -0
- package/dist/src/faf-core/commands/git-context.d.ts +23 -0
- package/dist/src/faf-core/commands/git-context.js +66 -0
- package/dist/src/faf-core/commands/git-context.js.map +1 -0
- package/dist/src/faf-core/commands/human.d.ts +27 -0
- package/dist/src/faf-core/commands/human.js +183 -0
- package/dist/src/faf-core/commands/human.js.map +1 -0
- package/dist/src/faf-core/commands/readme.d.ts +47 -0
- package/dist/src/faf-core/commands/readme.js +361 -0
- package/dist/src/faf-core/commands/readme.js.map +1 -0
- package/dist/src/faf-core/engines/fab-formats-processor.js +3 -3
- package/dist/src/faf-core/engines/fab-formats-processor.js.map +1 -1
- package/dist/src/faf-core/engines/faf-dna.d.ts +1 -1
- package/dist/src/faf-core/engines/faf-dna.js +4 -3
- package/dist/src/faf-core/engines/faf-dna.js.map +1 -1
- package/dist/src/faf-core/generators/faf-generator-championship.js +9 -8
- package/dist/src/faf-core/generators/faf-generator-championship.js.map +1 -1
- package/dist/src/faf-core/parsers/agents-parser.d.ts +59 -0
- package/dist/src/faf-core/parsers/agents-parser.js +324 -0
- package/dist/src/faf-core/parsers/agents-parser.js.map +1 -0
- package/dist/src/faf-core/parsers/conductor-parser.d.ts +85 -0
- package/dist/src/faf-core/parsers/conductor-parser.js +293 -0
- package/dist/src/faf-core/parsers/conductor-parser.js.map +1 -0
- package/dist/src/faf-core/parsers/cursorrules-parser.d.ts +57 -0
- package/dist/src/faf-core/parsers/cursorrules-parser.js +317 -0
- package/dist/src/faf-core/parsers/cursorrules-parser.js.map +1 -0
- package/dist/src/faf-core/parsers/faf-git-generator.d.ts +53 -0
- package/dist/src/faf-core/parsers/faf-git-generator.js +512 -0
- package/dist/src/faf-core/parsers/faf-git-generator.js.map +1 -0
- package/dist/src/faf-core/parsers/gemini-parser.d.ts +57 -0
- package/dist/src/faf-core/parsers/gemini-parser.js +263 -0
- package/dist/src/faf-core/parsers/gemini-parser.js.map +1 -0
- package/dist/src/faf-core/parsers/github-extractor.d.ts +61 -0
- package/dist/src/faf-core/parsers/github-extractor.js +374 -0
- package/dist/src/faf-core/parsers/github-extractor.js.map +1 -0
- package/dist/src/faf-core/parsers/index.d.ts +12 -0
- package/dist/src/{compiler → faf-core/parsers}/index.js +10 -5
- package/dist/src/faf-core/parsers/index.js.map +1 -0
- package/dist/src/faf-core/parsers/slot-counter.d.ts +55 -0
- package/dist/src/faf-core/parsers/slot-counter.js +100 -0
- package/dist/src/faf-core/parsers/slot-counter.js.map +1 -0
- package/dist/src/faf-core/utils/balance-visualizer.js +3 -3
- package/dist/src/faf-core/utils/balance-visualizer.js.map +1 -1
- package/dist/src/handlers/championship-tools.d.ts +10 -5
- package/dist/src/handlers/championship-tools.js +259 -232
- package/dist/src/handlers/championship-tools.js.map +1 -1
- package/dist/src/handlers/engine-adapter.js +238 -5
- package/dist/src/handlers/engine-adapter.js.map +1 -1
- package/dist/src/handlers/tools.d.ts +61 -0
- package/dist/src/handlers/tools.js +2103 -102
- package/dist/src/handlers/tools.js.map +1 -1
- package/dist/src/index.js +0 -0
- package/dist/src/types/tool-visibility.js +51 -10
- package/dist/src/types/tool-visibility.js.map +1 -1
- package/dist/src/utils/championship-format.js +11 -9
- package/dist/src/utils/championship-format.js.map +1 -1
- package/dist/src/utils/path-resolver.js +56 -2
- package/dist/src/utils/path-resolver.js.map +1 -1
- package/dist/src/utils/visual-style.js +7 -5
- package/dist/src/utils/visual-style.js.map +1 -1
- package/dist/src/version.js +24 -11
- package/dist/src/version.js.map +1 -1
- package/package.json +5 -3
- package/project.faf +14 -18
- package/dist/index.json +0 -1
- package/dist/src/compiler/index.d.ts +0 -7
- package/dist/src/compiler/index.js.map +0 -1
- package/dist/src/compiler/scorer.d.ts +0 -53
- package/dist/src/compiler/scorer.js +0 -189
- package/dist/src/compiler/scorer.js.map +0 -1
- package/dist/src/compiler/slot-validator.d.ts +0 -32
- package/dist/src/compiler/slot-validator.js +0 -293
- package/dist/src/compiler/slot-validator.js.map +0 -1
- package/dist/src/compiler/type-detector.d.ts +0 -62
- package/dist/src/compiler/type-detector.js +0 -388
- package/dist/src/compiler/type-detector.js.map +0 -1
- package/dist/src/types/project-types.d.ts +0 -22
- package/dist/src/types/project-types.js +0 -85
- package/dist/src/types/project-types.js.map +0 -1
- package/dist/src/types/slots.d.ts +0 -39
- package/dist/src/types/slots.js +0 -162
- package/dist/src/types/slots.js.map +0 -1
|
@@ -223,7 +223,7 @@ Working on REAL filesystem: ${targetDir}
|
|
|
223
223
|
},
|
|
224
224
|
{
|
|
225
225
|
name: 'faf_auto',
|
|
226
|
-
description: '🏆 ONE COMMAND
|
|
226
|
+
description: '🏆 ONE COMMAND SETUP - IMPORTANT: Users work on LOCAL projects. Ask for LOCAL filesystem path (e.g., /Users/username/projects/myapp). DO NOT use containers. Auto-scan, populate, score, sync using real FAF file tools.',
|
|
227
227
|
inputSchema: {
|
|
228
228
|
type: 'object',
|
|
229
229
|
properties: {
|
|
@@ -244,7 +244,7 @@ Working on REAL filesystem: ${targetDir}
|
|
|
244
244
|
},
|
|
245
245
|
{
|
|
246
246
|
name: 'faf_init',
|
|
247
|
-
description: 'Initialize FAF with intelligent project detection
|
|
247
|
+
description: 'Initialize FAF with intelligent project detection',
|
|
248
248
|
inputSchema: {
|
|
249
249
|
type: 'object',
|
|
250
250
|
properties: {
|
|
@@ -267,7 +267,7 @@ Working on REAL filesystem: ${targetDir}
|
|
|
267
267
|
},
|
|
268
268
|
{
|
|
269
269
|
name: 'faf_score',
|
|
270
|
-
description: '
|
|
270
|
+
description: 'AI-Readiness scorecard with actionable insights. CRITICAL: Content between [DISPLAY:REQUIRED] tags MUST be displayed directly to user as formatted markdown. Do NOT summarize. Includes Quick Actions for immediate next steps.',
|
|
271
271
|
inputSchema: {
|
|
272
272
|
type: 'object',
|
|
273
273
|
properties: {
|
|
@@ -278,7 +278,7 @@ Working on REAL filesystem: ${targetDir}
|
|
|
278
278
|
description: 'Output format: markdown (default), html, json, ascii',
|
|
279
279
|
enum: ['markdown', 'html', 'json', 'ascii']
|
|
280
280
|
},
|
|
281
|
-
full: { type: 'boolean', description: 'Show full
|
|
281
|
+
full: { type: 'boolean', description: 'Show full scorecard with detailed metrics' }
|
|
282
282
|
}
|
|
283
283
|
}
|
|
284
284
|
},
|
|
@@ -295,7 +295,7 @@ Working on REAL filesystem: ${targetDir}
|
|
|
295
295
|
},
|
|
296
296
|
{
|
|
297
297
|
name: 'faf_bi_sync',
|
|
298
|
-
description: '40ms bi-directional sync
|
|
298
|
+
description: '40ms bi-directional sync',
|
|
299
299
|
inputSchema: {
|
|
300
300
|
type: 'object',
|
|
301
301
|
properties: {
|
|
@@ -336,7 +336,7 @@ Working on REAL filesystem: ${targetDir}
|
|
|
336
336
|
},
|
|
337
337
|
{
|
|
338
338
|
name: 'faf_trust_validated',
|
|
339
|
-
description: 'Trust validated mode -
|
|
339
|
+
description: 'Trust validated mode - production seal',
|
|
340
340
|
inputSchema: { type: 'object', properties: {} }
|
|
341
341
|
},
|
|
342
342
|
// Revolutionary Psychology Tools
|
|
@@ -427,6 +427,53 @@ Working on REAL filesystem: ${targetDir}
|
|
|
427
427
|
}
|
|
428
428
|
}
|
|
429
429
|
},
|
|
430
|
+
// Human Context (6Ws Builder Integration)
|
|
431
|
+
{
|
|
432
|
+
name: 'faf_human_add',
|
|
433
|
+
description: '🧡 Add human_context to project.faf - Perfect for 6Ws Builder workflow (faf.one/6ws). Merge YAML from web form or set individual fields. Boosts AI-readiness score.',
|
|
434
|
+
inputSchema: {
|
|
435
|
+
type: 'object',
|
|
436
|
+
properties: {
|
|
437
|
+
yaml: {
|
|
438
|
+
type: 'string',
|
|
439
|
+
description: 'Complete human_context YAML from faf.one/6ws (copy-paste the entire human_context section)'
|
|
440
|
+
},
|
|
441
|
+
field: {
|
|
442
|
+
type: 'string',
|
|
443
|
+
description: 'Single field to set (who/what/where/why/when/how)'
|
|
444
|
+
},
|
|
445
|
+
value: {
|
|
446
|
+
type: 'string',
|
|
447
|
+
description: 'Value for the field'
|
|
448
|
+
},
|
|
449
|
+
directory: {
|
|
450
|
+
type: 'string',
|
|
451
|
+
description: 'LOCAL filesystem path to project directory (e.g., /Users/username/projects/myapp)'
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
name: 'faf_readme',
|
|
458
|
+
description: '📄 Extract context from README.md - Instant AI-readiness boost! Automatically finds WHO/WHAT/WHERE/WHY/WHEN/HOW from existing README. Optionally merge into project.faf. Typical +25-35% score boost.',
|
|
459
|
+
inputSchema: {
|
|
460
|
+
type: 'object',
|
|
461
|
+
properties: {
|
|
462
|
+
merge: {
|
|
463
|
+
type: 'boolean',
|
|
464
|
+
description: 'Auto-merge extracted context into project.faf (default: false, just extract)'
|
|
465
|
+
},
|
|
466
|
+
overwrite: {
|
|
467
|
+
type: 'boolean',
|
|
468
|
+
description: 'Overwrite existing fields in project.faf (default: false, only fill empty fields)'
|
|
469
|
+
},
|
|
470
|
+
directory: {
|
|
471
|
+
type: 'string',
|
|
472
|
+
description: 'LOCAL filesystem path to project directory (e.g., /Users/username/projects/myapp)'
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
},
|
|
430
477
|
// Discovery & Navigation
|
|
431
478
|
{
|
|
432
479
|
name: 'faf_index',
|
|
@@ -483,7 +530,7 @@ Working on REAL filesystem: ${targetDir}
|
|
|
483
530
|
// Developer Tools
|
|
484
531
|
{
|
|
485
532
|
name: 'faf_status',
|
|
486
|
-
description: 'Comprehensive project status with
|
|
533
|
+
description: 'Comprehensive project status with Mk3 Tier System',
|
|
487
534
|
inputSchema: {
|
|
488
535
|
type: 'object',
|
|
489
536
|
properties: {
|
|
@@ -601,7 +648,7 @@ Working on REAL filesystem: ${targetDir}
|
|
|
601
648
|
},
|
|
602
649
|
{
|
|
603
650
|
name: 'faf_innit',
|
|
604
|
-
description: '🇬🇧 British version of init - same
|
|
651
|
+
description: '🇬🇧 British version of init - same quality, more bruv!',
|
|
605
652
|
inputSchema: {
|
|
606
653
|
type: 'object',
|
|
607
654
|
properties: {
|
|
@@ -762,67 +809,6 @@ Working on REAL filesystem: ${targetDir}
|
|
|
762
809
|
type: 'object',
|
|
763
810
|
properties: {}
|
|
764
811
|
}
|
|
765
|
-
},
|
|
766
|
-
// ☁️ Cloud Tools (MCPaaS Integration) - NEW in v1.3.0
|
|
767
|
-
{
|
|
768
|
-
name: 'faf_cloud_publish',
|
|
769
|
-
description: '☁️ Upload project.faf to mcpaas.live - Get shareable URL. Share your FAF context globally via edge-deployed service (300+ locations, <1ms cold starts)',
|
|
770
|
-
inputSchema: {
|
|
771
|
-
type: 'object',
|
|
772
|
-
properties: {
|
|
773
|
-
soul_name: { type: 'string', description: 'Unique name for your context (e.g., "my-project")' },
|
|
774
|
-
directory: { type: 'string', description: 'Project directory (defaults to current)' },
|
|
775
|
-
tags: { type: 'array', items: { type: 'string' }, description: 'Optional tags for searchability' },
|
|
776
|
-
public: { type: 'boolean', description: 'Make publicly accessible (default: token-protected)' }
|
|
777
|
-
},
|
|
778
|
-
required: ['soul_name']
|
|
779
|
-
}
|
|
780
|
-
},
|
|
781
|
-
{
|
|
782
|
-
name: 'faf_cloud_fetch',
|
|
783
|
-
description: '📥 Pull context from mcpaas.live into local project.faf - Zero-install sharing. Anyone can fetch your published context.',
|
|
784
|
-
inputSchema: {
|
|
785
|
-
type: 'object',
|
|
786
|
-
properties: {
|
|
787
|
-
soul_name: { type: 'string', description: 'Name of the soul to fetch (e.g., "faf", "grok", "ghost")' },
|
|
788
|
-
directory: { type: 'string', description: 'Project directory (defaults to current)' },
|
|
789
|
-
merge: { type: 'boolean', description: 'Merge with existing .faf (default: false = replace)' }
|
|
790
|
-
},
|
|
791
|
-
required: ['soul_name']
|
|
792
|
-
}
|
|
793
|
-
},
|
|
794
|
-
{
|
|
795
|
-
name: 'faf_cloud_list',
|
|
796
|
-
description: '📋 List available souls on mcpaas.live - Discover published contexts. Filter by tags.',
|
|
797
|
-
inputSchema: {
|
|
798
|
-
type: 'object',
|
|
799
|
-
properties: {
|
|
800
|
-
tags: { type: 'array', items: { type: 'string' }, description: 'Filter by tags (e.g., ["faf", "demo"])' }
|
|
801
|
-
}
|
|
802
|
-
}
|
|
803
|
-
},
|
|
804
|
-
{
|
|
805
|
-
name: 'faf_cloud_search',
|
|
806
|
-
description: '🔍 Search across cloud souls - Full-text search or tag-based filtering across all published contexts on mcpaas.live',
|
|
807
|
-
inputSchema: {
|
|
808
|
-
type: 'object',
|
|
809
|
-
properties: {
|
|
810
|
-
query: { type: 'string', description: 'Search query for full-text search' },
|
|
811
|
-
tag: { type: 'string', description: 'Tag to filter by (alternative to query)' }
|
|
812
|
-
}
|
|
813
|
-
}
|
|
814
|
-
},
|
|
815
|
-
{
|
|
816
|
-
name: 'faf_cloud_share',
|
|
817
|
-
description: '🔗 Generate shareable link for cloud soul - Get URL for instant zero-install access. Served from 300+ Cloudflare edges.',
|
|
818
|
-
inputSchema: {
|
|
819
|
-
type: 'object',
|
|
820
|
-
properties: {
|
|
821
|
-
soul_name: { type: 'string', description: 'Name of the soul to share' },
|
|
822
|
-
expires_in: { type: 'number', description: 'Optional: hours until expiration (requires OAuth)' }
|
|
823
|
-
},
|
|
824
|
-
required: ['soul_name']
|
|
825
|
-
}
|
|
826
812
|
}
|
|
827
813
|
];
|
|
828
814
|
// Apply visibility filtering
|
|
@@ -886,6 +872,11 @@ Working on REAL filesystem: ${targetDir}
|
|
|
886
872
|
return await this.handleAnalyze(_args);
|
|
887
873
|
case 'faf_verify':
|
|
888
874
|
return await this.handleVerify(_args);
|
|
875
|
+
// Human Context (6Ws Builder integration)
|
|
876
|
+
case 'faf_human_add':
|
|
877
|
+
return await this.handleHumanAdd(_args);
|
|
878
|
+
case 'faf_readme':
|
|
879
|
+
return await this.handleReadme(_args);
|
|
889
880
|
// Discovery
|
|
890
881
|
case 'faf_index':
|
|
891
882
|
return await this.handleIndex(_args);
|
|
@@ -955,17 +946,6 @@ Working on REAL filesystem: ${targetDir}
|
|
|
955
946
|
return await this.handleSkills(_args);
|
|
956
947
|
case 'faf_install_skill':
|
|
957
948
|
return await this.handleInstallSkill(_args);
|
|
958
|
-
// ☁️ Cloud Tools (MCPaaS Integration)
|
|
959
|
-
case 'faf_cloud_publish':
|
|
960
|
-
return await this.handleCloudPublish(_args);
|
|
961
|
-
case 'faf_cloud_fetch':
|
|
962
|
-
return await this.handleCloudFetch(_args);
|
|
963
|
-
case 'faf_cloud_list':
|
|
964
|
-
return await this.handleCloudList(_args);
|
|
965
|
-
case 'faf_cloud_search':
|
|
966
|
-
return await this.handleCloudSearch(_args);
|
|
967
|
-
case 'faf_cloud_share':
|
|
968
|
-
return await this.handleCloudShare(_args);
|
|
969
949
|
default:
|
|
970
950
|
throw new Error(`Unknown tool: ${name}`);
|
|
971
951
|
}
|
|
@@ -1010,11 +990,11 @@ Working on REAL filesystem: ${targetDir}
|
|
|
1010
990
|
const homeDir = process.env.HOME || process.env.USERPROFILE || '/';
|
|
1011
991
|
const skillPath = path.join(homeDir, '.claude', 'skills', 'faf-expert', 'SKILL.md');
|
|
1012
992
|
const skillInstalled = await this.fileExists(skillPath);
|
|
1013
|
-
const
|
|
1014
|
-
? `🏆 **
|
|
993
|
+
const skillSection = skillInstalled
|
|
994
|
+
? `🏆 **Expert Mode Ready!**\n` +
|
|
1015
995
|
`• faf-expert skill is installed ✅\n` +
|
|
1016
996
|
`• Invoke it anytime for 99/100 AI-readiness!\n\n`
|
|
1017
|
-
: `🏆 **Want
|
|
997
|
+
: `🏆 **Want Expert Mode?**\n` +
|
|
1018
998
|
`• Install faf-expert skill: Say "Run faf_install_skill"\n` +
|
|
1019
999
|
`• Get 99/100 AI-readiness with world-class guidance!\n\n`;
|
|
1020
1000
|
return await this.formatResult('🧡⚡️ FAF - AI Context, On-Demand', `**DROP | PASTE | CREATE** - Click & Go!\n\n` +
|
|
@@ -1024,7 +1004,7 @@ Working on REAL filesystem: ${targetDir}
|
|
|
1024
1004
|
`• **DROP** any file from your project (I'll find the root!)\n` +
|
|
1025
1005
|
`• **PASTE** your project path: \`faf_auto /path/to/project\`\n` +
|
|
1026
1006
|
`• **CREATE** instantly: Say "Run faf_quick"\n\n` +
|
|
1027
|
-
|
|
1007
|
+
skillSection +
|
|
1028
1008
|
`💡 **Examples:**\n` +
|
|
1029
1009
|
`\`faf_auto ~/Documents/my-app\`\n` +
|
|
1030
1010
|
`\`faf_auto /Users/yourname/cool-project\`\n\n` +
|
|
@@ -1118,7 +1098,7 @@ Claude Desktop needs a target directory:
|
|
|
1118
1098
|
let status = '';
|
|
1119
1099
|
let emoji = '';
|
|
1120
1100
|
if (score >= 99) {
|
|
1121
|
-
status = '
|
|
1101
|
+
status = 'Trophy!';
|
|
1122
1102
|
emoji = '🏆';
|
|
1123
1103
|
}
|
|
1124
1104
|
else if (score >= 90) {
|
|
@@ -1235,28 +1215,12 @@ AI-Readiness: ${score}% ${emoji}
|
|
|
1235
1215
|
score += 14;
|
|
1236
1216
|
// Build CLEAN markdown - no wrappers!
|
|
1237
1217
|
const progressBar = '█'.repeat(Math.floor(score * 24 / 100)) + '░'.repeat(24 - Math.floor(score * 24 / 100));
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
if (score >= 99) {
|
|
1241
|
-
statusEmoji = '🟢';
|
|
1242
|
-
statusText = 'CHAMPIONSHIP!';
|
|
1243
|
-
}
|
|
1244
|
-
else if (score >= 84) {
|
|
1245
|
-
statusEmoji = '⭐';
|
|
1246
|
-
statusText = 'PODIUM READY!';
|
|
1247
|
-
}
|
|
1248
|
-
else if (score >= 69) {
|
|
1249
|
-
statusEmoji = '🟡';
|
|
1250
|
-
statusText = 'QUALIFYING!';
|
|
1251
|
-
}
|
|
1252
|
-
else {
|
|
1253
|
-
statusEmoji = '🔴';
|
|
1254
|
-
statusText = 'PIT LANE';
|
|
1255
|
-
}
|
|
1218
|
+
// Mk3 Canonical Tier System
|
|
1219
|
+
const { medal: statusEmoji, status: statusText } = this.getScoreMedal(score);
|
|
1256
1220
|
// Build clean output - just markdown, no wrappers!
|
|
1257
|
-
const output = `#
|
|
1221
|
+
const output = `# FAF Score Card
|
|
1258
1222
|
|
|
1259
|
-
## **Project Score: ${score}/100** ${
|
|
1223
|
+
## **Project Score: ${score}/100** ${statusEmoji}
|
|
1260
1224
|
|
|
1261
1225
|
${progressBar} ${score}%
|
|
1262
1226
|
|
|
@@ -1275,10 +1239,10 @@ ${progressBar} ${score}%
|
|
|
1275
1239
|
|
|
1276
1240
|
---
|
|
1277
1241
|
|
|
1278
|
-
##
|
|
1242
|
+
## Context Status
|
|
1279
1243
|
|
|
1280
1244
|
### **Strengths** 💚
|
|
1281
|
-
${hasFaf && hasClaude ? '- Bi-directional sync
|
|
1245
|
+
${hasFaf && hasClaude ? '- Bi-directional sync active\n' : ''}${hasClaude ? '- AI-Ready Documentation: Full CLAUDE.md integration\n' : ''}${hasFaf ? '- Core Systems: FAF foundation in place\n' : ''}${hasReadme ? '- Documentation: README.md providing clarity\n' : ''}${hasPackage ? '- Dependencies: package.json tracking enabled' : ''}
|
|
1282
1246
|
|
|
1283
1247
|
---
|
|
1284
1248
|
|
|
@@ -1292,7 +1256,7 @@ faf_score --save # Save this scorecard
|
|
|
1292
1256
|
|
|
1293
1257
|
---
|
|
1294
1258
|
|
|
1295
|
-
> "
|
|
1259
|
+
> "Context is everything. FAF delivers it."
|
|
1296
1260
|
|
|
1297
1261
|
---
|
|
1298
1262
|
|
|
@@ -1369,7 +1333,7 @@ faf_score --save # Save this scorecard
|
|
|
1369
1333
|
project: path.basename(targetDir),
|
|
1370
1334
|
score: score,
|
|
1371
1335
|
percentage: score,
|
|
1372
|
-
status: score
|
|
1336
|
+
status: this.getScoreMedal(score).status,
|
|
1373
1337
|
components: {
|
|
1374
1338
|
faf: { exists: hasFaf, points: hasFaf ? 40 : 0 },
|
|
1375
1339
|
claude: { exists: hasClaude, points: hasClaude ? 30 : 0 },
|
|
@@ -1397,7 +1361,7 @@ faf_score --save # Save this scorecard
|
|
|
1397
1361
|
}
|
|
1398
1362
|
else if (showFull) {
|
|
1399
1363
|
// Podium Edition: Full Championship Scorecard with detailed metrics
|
|
1400
|
-
const
|
|
1364
|
+
const _projectName = path.basename(targetDir);
|
|
1401
1365
|
// Calculate section scores based on files present
|
|
1402
1366
|
const coreIntelligence = Math.round(((hasFaf ? 25 : 0) +
|
|
1403
1367
|
(hasFaf && hasClaude ? 25 : 0) + // Architecture Map (requires both)
|
|
@@ -1409,39 +1373,23 @@ faf_score --save # Save this scorecard
|
|
|
1409
1373
|
25 + // IANA Format (always active)
|
|
1410
1374
|
(hasFaf && hasClaude ? 25 : hasFaf ? 15 : hasClaude ? 10 : 0) // Universal Context
|
|
1411
1375
|
));
|
|
1412
|
-
const
|
|
1413
|
-
const
|
|
1376
|
+
const _performance = 100; // Static for MCP server itself
|
|
1377
|
+
const _standalone = 100; // Static for MCP server itself
|
|
1414
1378
|
// Determine status tier
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
if (score >= 99) {
|
|
1418
|
-
statusTier = 'PODIUM EDITION';
|
|
1419
|
-
statusEmoji = '🏆';
|
|
1420
|
-
}
|
|
1421
|
-
else if (score >= 85) {
|
|
1422
|
-
statusTier = 'RACE READY';
|
|
1423
|
-
statusEmoji = '⭐';
|
|
1424
|
-
}
|
|
1425
|
-
else if (score >= 70) {
|
|
1426
|
-
statusTier = 'QUALIFYING';
|
|
1427
|
-
statusEmoji = '🟪';
|
|
1428
|
-
}
|
|
1429
|
-
else {
|
|
1430
|
-
statusTier = 'IN DEVELOPMENT';
|
|
1431
|
-
statusEmoji = '🔧';
|
|
1432
|
-
}
|
|
1379
|
+
// Mk3 Canonical Tier System
|
|
1380
|
+
const { medal: tierEmoji, status: statusTier } = this.getScoreMedal(score);
|
|
1433
1381
|
result = ``;
|
|
1434
|
-
result += `#
|
|
1382
|
+
result += `# FAF AI-Readiness Score: ${score}/100 ${tierEmoji}\n\n`;
|
|
1435
1383
|
result += `**The closer you get to 100% the better AI can assist you.**\n\n`;
|
|
1436
1384
|
result += `At 55% you are building your project with half a blueprint and basically flipping a coin with AI. .FAF defines, and AI becomes optimized for Context with the project.faf file.\n\n`;
|
|
1437
1385
|
result += `\`\`\`\n`;
|
|
1438
1386
|
result += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;
|
|
1439
|
-
result +=
|
|
1387
|
+
result += `${tierEmoji} FAF AI-READINESS SCORE: ${score}/100 — ${statusTier}\n`;
|
|
1440
1388
|
result += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n`;
|
|
1441
1389
|
// Core Intelligence section
|
|
1442
1390
|
result += `📊 CORE INTELLIGENCE 🎯 CONTEXT DELIVERY\n`;
|
|
1443
1391
|
const bar100 = '[██████] 100%';
|
|
1444
|
-
const
|
|
1392
|
+
const _barCore = `[${('█'.repeat(Math.round(coreIntelligence / 100 * 6)) + '░'.repeat(6 - Math.round(coreIntelligence / 100 * 6)))}] ${coreIntelligence}%`;
|
|
1445
1393
|
const barContext = `[${('█'.repeat(Math.round(contextDelivery / 100 * 6)) + '░'.repeat(6 - Math.round(contextDelivery / 100 * 6)))}] ${contextDelivery}%`;
|
|
1446
1394
|
result += `├─ Project DNA ${hasFaf ? bar100 : '[░░░░░░] 0%'} ├─ MCP Protocol ${bar100}\n`;
|
|
1447
1395
|
result += `├─ Architecture Map ${hasFaf && hasClaude ? bar100 : '[░░░░░░] 0%'} ├─ 50 Native Tools ${bar100}\n`;
|
|
@@ -1453,7 +1401,7 @@ faf_score --save # Save this scorecard
|
|
|
1453
1401
|
result += `├─ 19ms Avg Execution ${bar100} ├─ Bundled Engine ${bar100}\n`;
|
|
1454
1402
|
result += `├─ 50/50 Tools Active ${bar100} ├─ Direct Function ${bar100}\n`;
|
|
1455
1403
|
result += `└─ Zero Memory Leaks ${bar100} └─ 14 Bundled Cmds ${bar100}\n\n`;
|
|
1456
|
-
result +=
|
|
1404
|
+
result += `${tierEmoji} project.faf score: ${statusTier}\n`;
|
|
1457
1405
|
result += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;
|
|
1458
1406
|
result += `\`\`\`\n\n`;
|
|
1459
1407
|
// Next steps
|
|
@@ -1465,10 +1413,10 @@ faf_score --save # Save this scorecard
|
|
|
1465
1413
|
result += `📝 **Generate CLAUDE.md**: Run \`faf_sync\` to create AI documentation (+30 points)\n\n`;
|
|
1466
1414
|
}
|
|
1467
1415
|
if (hasFaf && hasClaude) {
|
|
1468
|
-
result += `🎯 **You're at
|
|
1416
|
+
result += `🎯 **You're at 100%!** Run \`faf_bi_sync\` to keep files synchronized.\n\n`;
|
|
1469
1417
|
}
|
|
1470
1418
|
result += `---\n\n`;
|
|
1471
|
-
result += `*Generated by FAF
|
|
1419
|
+
result += `*Generated by FAF v${version_js_1.VERSION}*\n\n`;
|
|
1472
1420
|
result += `*"It's so logical if it didn't exist, AI would have built it itself" — Claude*`;
|
|
1473
1421
|
}
|
|
1474
1422
|
else {
|
|
@@ -1480,37 +1428,15 @@ faf_score --save # Save this scorecard
|
|
|
1480
1428
|
// Determine status and emoji
|
|
1481
1429
|
let statusEmoji = '';
|
|
1482
1430
|
let statusText = '';
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
else if (score >= 70) {
|
|
1490
|
-
statusEmoji = '⭐';
|
|
1491
|
-
statusText = 'PODIUM READY!';
|
|
1492
|
-
statusColor = '🟢';
|
|
1493
|
-
}
|
|
1494
|
-
else if (score >= 50) {
|
|
1495
|
-
statusEmoji = '🟪';
|
|
1496
|
-
statusText = 'QUALIFYING!';
|
|
1497
|
-
statusColor = '🟡';
|
|
1498
|
-
}
|
|
1499
|
-
else if (score >= 30) {
|
|
1500
|
-
statusEmoji = '🔧';
|
|
1501
|
-
statusText = 'IN THE GARAGE!';
|
|
1502
|
-
statusColor = '🟡';
|
|
1503
|
-
}
|
|
1504
|
-
else {
|
|
1505
|
-
statusEmoji = '🛟';
|
|
1506
|
-
statusText = 'NEEDS PIT STOP!';
|
|
1507
|
-
statusColor = '🔴';
|
|
1508
|
-
}
|
|
1509
|
-
// Build the championship scorecard
|
|
1510
|
-
result = `# 🏎️ FAF Championship Score Card\n\n`;
|
|
1431
|
+
// Mk3 Canonical Tier System
|
|
1432
|
+
const { medal, status } = this.getScoreMedal(score);
|
|
1433
|
+
statusEmoji = medal;
|
|
1434
|
+
statusText = status;
|
|
1435
|
+
// Build the scorecard
|
|
1436
|
+
result = `# FAF Score Card\n\n`;
|
|
1511
1437
|
result += `## **Project Score: ${score}/100** ${statusEmoji}\n\n`;
|
|
1512
1438
|
result += `${progressBar} ${score}%\n\n`;
|
|
1513
|
-
result += `### ${
|
|
1439
|
+
result += `### ${statusEmoji} **Status: ${statusText}**\n\n`;
|
|
1514
1440
|
result += `---\n\n`;
|
|
1515
1441
|
// Performance Breakdown Table
|
|
1516
1442
|
result += `## 📊 Performance Breakdown\n\n`;
|
|
@@ -1521,12 +1447,12 @@ faf_score --save # Save this scorecard
|
|
|
1521
1447
|
result += `| **README.md** | ${hasReadme ? '✅ **READY**' : '⚠️ **MISSING**'} | ${hasReadme ? '15' : '0'}pts | ${hasReadme ? 'Project docs complete' : '*Add for extra points*'} |\n`;
|
|
1522
1448
|
result += `| **package.json** | ${hasPackage ? '✅ **FOUND**' : '⚠️ **MISSING**'} | ${hasPackage ? '14' : '0'}pts | ${hasPackage ? 'Dependencies tracked' : '*Add for full score*'} |\n`;
|
|
1523
1449
|
result += `\n---\n\n`;
|
|
1524
|
-
//
|
|
1525
|
-
result += `##
|
|
1450
|
+
// Context Status Section
|
|
1451
|
+
result += `## Context Status\n\n`;
|
|
1526
1452
|
// Strengths
|
|
1527
1453
|
const strengths = [];
|
|
1528
1454
|
if (hasFaf && hasClaude)
|
|
1529
|
-
strengths.push('Bi-directional sync
|
|
1455
|
+
strengths.push('Bi-directional sync active');
|
|
1530
1456
|
if (hasClaude)
|
|
1531
1457
|
strengths.push('AI-Ready Documentation: Full CLAUDE.md integration');
|
|
1532
1458
|
if (hasFaf)
|
|
@@ -1551,7 +1477,7 @@ faf_score --save # Save this scorecard
|
|
|
1551
1477
|
if (!hasPackage)
|
|
1552
1478
|
improvements.push('Add package.json for +14 points → ${score + 14}% score');
|
|
1553
1479
|
if (improvements.length > 0) {
|
|
1554
|
-
result += `### **
|
|
1480
|
+
result += `### **Improvements Needed** 🔧\n`;
|
|
1555
1481
|
improvements.forEach(i => result += `- ${i}\n`);
|
|
1556
1482
|
result += `\n`;
|
|
1557
1483
|
}
|
|
@@ -1568,20 +1494,20 @@ faf_score --save # Save this scorecard
|
|
|
1568
1494
|
result += `faf_enhance # AI-powered improvements\n`;
|
|
1569
1495
|
result += `faf_score --save # Save this scorecard\n`;
|
|
1570
1496
|
result += `\`\`\`\n\n`;
|
|
1571
|
-
//
|
|
1497
|
+
// FAF Quote
|
|
1572
1498
|
const quotes = [
|
|
1573
|
-
'"
|
|
1574
|
-
'"
|
|
1575
|
-
'"
|
|
1576
|
-
'"
|
|
1577
|
-
'"
|
|
1499
|
+
'"Context is everything. FAF delivers it."',
|
|
1500
|
+
'"Stop FAFfing about - get to 100%!"',
|
|
1501
|
+
'"The best time to FAF was yesterday. The second best time is now."',
|
|
1502
|
+
'"AI without context is just guessing."',
|
|
1503
|
+
'"One file. Complete understanding."'
|
|
1578
1504
|
];
|
|
1579
1505
|
const randomQuote = quotes[Math.floor(Math.random() * quotes.length)];
|
|
1580
1506
|
result += `---\n\n`;
|
|
1581
1507
|
result += `> ${randomQuote}\n\n`;
|
|
1582
1508
|
// Footer
|
|
1583
1509
|
result += `---\n\n`;
|
|
1584
|
-
result += `*Generated by FAF
|
|
1510
|
+
result += `*Generated by FAF v${version_js_1.VERSION}* ⚡\n`;
|
|
1585
1511
|
result += `*${new Date().toISOString()}*`;
|
|
1586
1512
|
// NOTE: AI-Readiness footer is added by formatResult() - don't duplicate!
|
|
1587
1513
|
}
|
|
@@ -1763,6 +1689,123 @@ faf_score --save # Save this scorecard
|
|
|
1763
1689
|
return await this.formatResult('⚡ FAF Quick', `Error: ${error.message}`, duration);
|
|
1764
1690
|
}
|
|
1765
1691
|
}
|
|
1692
|
+
/**
|
|
1693
|
+
* 🧡 Handle human_context add/merge
|
|
1694
|
+
* For 6Ws Builder workflow: user fills faf.one/6ws, pastes YAML here
|
|
1695
|
+
*/
|
|
1696
|
+
async handleHumanAdd(args) {
|
|
1697
|
+
const startTime = Date.now();
|
|
1698
|
+
try {
|
|
1699
|
+
const dir = args.directory || this.currentProjectDir;
|
|
1700
|
+
// Validate input
|
|
1701
|
+
if (!args.yaml && (!args.field || !args.value)) {
|
|
1702
|
+
return await this.formatResult('🧡 Human Context', `**Usage:**\n\n` +
|
|
1703
|
+
`**From 6Ws Builder (faf.one/6ws):**\n` +
|
|
1704
|
+
`1. Visit https://faf.one/6ws\n` +
|
|
1705
|
+
`2. Fill out the 6 questions\n` +
|
|
1706
|
+
`3. Copy the human_context YAML\n` +
|
|
1707
|
+
`4. Use: \`faf_human_add { yaml: "paste here" }\`\n\n` +
|
|
1708
|
+
`**Single field:**\n` +
|
|
1709
|
+
`\`faf_human_add { field: "who", value: "developers" }\`\n\n` +
|
|
1710
|
+
`**Valid fields:** who, what, where, why, when, how`, Date.now() - startTime, dir);
|
|
1711
|
+
}
|
|
1712
|
+
// Prepare engine args
|
|
1713
|
+
const engineArgs = [dir];
|
|
1714
|
+
if (args.yaml) {
|
|
1715
|
+
engineArgs.push(`--yaml=${args.yaml}`);
|
|
1716
|
+
}
|
|
1717
|
+
if (args.field) {
|
|
1718
|
+
engineArgs.push(`--field=${args.field}`);
|
|
1719
|
+
}
|
|
1720
|
+
if (args.value) {
|
|
1721
|
+
engineArgs.push(`--value=${args.value}`);
|
|
1722
|
+
}
|
|
1723
|
+
// Call bundled human command
|
|
1724
|
+
this.fafEngine.setWorkingDirectory(dir);
|
|
1725
|
+
const result = await this.fafEngine.callEngine('human-add', engineArgs);
|
|
1726
|
+
const duration = Date.now() - startTime;
|
|
1727
|
+
if (result.success && result.data) {
|
|
1728
|
+
const fieldsUpdated = result.data.fieldsUpdated || [];
|
|
1729
|
+
const fieldsList = fieldsUpdated.join(', ');
|
|
1730
|
+
return await this.formatResult('🧡 Human Context Added', `${result.data.message}\n\n` +
|
|
1731
|
+
`**Updated fields:** ${fieldsList}\n\n` +
|
|
1732
|
+
`**Next steps:**\n` +
|
|
1733
|
+
`1. Run \`faf_score\` to see your new AI-readiness score\n` +
|
|
1734
|
+
`2. Your context is now available to all AI assistants\n\n` +
|
|
1735
|
+
`💡 **Tip:** Complete all 6 Ws (who, what, where, why, when, how) for maximum score boost!`, duration, dir);
|
|
1736
|
+
}
|
|
1737
|
+
else {
|
|
1738
|
+
return await this.formatResult('🧡 Human Context', result.error || 'Failed to add human context', duration, dir);
|
|
1739
|
+
}
|
|
1740
|
+
}
|
|
1741
|
+
catch (error) {
|
|
1742
|
+
const duration = Date.now() - startTime;
|
|
1743
|
+
return await this.formatResult('🧡 Human Context', `Error: ${error.message}`, duration);
|
|
1744
|
+
}
|
|
1745
|
+
}
|
|
1746
|
+
/**
|
|
1747
|
+
* 📄 Handle README context extraction
|
|
1748
|
+
* Extract 6 Ws from existing README.md and optionally merge into project.faf
|
|
1749
|
+
*/
|
|
1750
|
+
async handleReadme(args) {
|
|
1751
|
+
const startTime = Date.now();
|
|
1752
|
+
try {
|
|
1753
|
+
const dir = args.directory || this.currentProjectDir;
|
|
1754
|
+
// Determine which command to call
|
|
1755
|
+
const command = args.merge ? 'readme-merge' : 'readme-extract';
|
|
1756
|
+
const engineArgs = [dir];
|
|
1757
|
+
if (args.overwrite) {
|
|
1758
|
+
engineArgs.push('--overwrite');
|
|
1759
|
+
}
|
|
1760
|
+
// Call bundled readme command
|
|
1761
|
+
this.fafEngine.setWorkingDirectory(dir);
|
|
1762
|
+
const result = await this.fafEngine.callEngine(command, engineArgs);
|
|
1763
|
+
const duration = Date.now() - startTime;
|
|
1764
|
+
if (result.success && result.data) {
|
|
1765
|
+
const extracted = result.data.extracted;
|
|
1766
|
+
const fieldsExtracted = extracted ? Object.keys(extracted).filter(k => k !== 'confidence' && extracted[k]).length : 0;
|
|
1767
|
+
const confidence = extracted?.confidence?.overall || 0;
|
|
1768
|
+
const confidencePercent = Math.round(confidence * 100);
|
|
1769
|
+
// Build extracted fields display
|
|
1770
|
+
let extractedDisplay = '';
|
|
1771
|
+
if (extracted) {
|
|
1772
|
+
const fields = ['who', 'what', 'where', 'why', 'when', 'how'];
|
|
1773
|
+
for (const field of fields) {
|
|
1774
|
+
if (extracted[field]) {
|
|
1775
|
+
extractedDisplay += `\n**${field.toUpperCase()}:** ${extracted[field]}`;
|
|
1776
|
+
}
|
|
1777
|
+
}
|
|
1778
|
+
}
|
|
1779
|
+
let message = `${result.data.message}\n\n` +
|
|
1780
|
+
`**README:** ${result.data.readmePath}\n` +
|
|
1781
|
+
`**Confidence:** ${confidencePercent}%\n` +
|
|
1782
|
+
`**Fields found:** ${fieldsExtracted}/6\n` +
|
|
1783
|
+
extractedDisplay;
|
|
1784
|
+
if (args.merge) {
|
|
1785
|
+
const fieldsUpdated = result.data.fieldsUpdated || [];
|
|
1786
|
+
message += `\n\n**Merged fields:** ${fieldsUpdated.join(', ')}\n\n` +
|
|
1787
|
+
`**Next steps:**\n` +
|
|
1788
|
+
`1. Run \`faf_score\` to see your new AI-readiness score\n` +
|
|
1789
|
+
`2. Fill any missing fields with \`faf_human_add\` or visit faf.one/6ws\n` +
|
|
1790
|
+
`3. Your context is now available to all AI assistants`;
|
|
1791
|
+
}
|
|
1792
|
+
else {
|
|
1793
|
+
message += `\n\n**Next steps:**\n` +
|
|
1794
|
+
`1. Run \`faf_readme { merge: true }\` to merge into project.faf\n` +
|
|
1795
|
+
`2. Or manually copy the extracted context\n` +
|
|
1796
|
+
`3. Fill any missing fields at faf.one/6ws`;
|
|
1797
|
+
}
|
|
1798
|
+
return await this.formatResult('📄 README Context', message, duration, dir);
|
|
1799
|
+
}
|
|
1800
|
+
else {
|
|
1801
|
+
return await this.formatResult('📄 README Context', result.error || 'Failed to extract context from README', duration, dir);
|
|
1802
|
+
}
|
|
1803
|
+
}
|
|
1804
|
+
catch (error) {
|
|
1805
|
+
const duration = Date.now() - startTime;
|
|
1806
|
+
return await this.formatResult('📄 README Context', `Error: ${error.message}`, duration);
|
|
1807
|
+
}
|
|
1808
|
+
}
|
|
1766
1809
|
async handleShare(args) {
|
|
1767
1810
|
const message = args.sanitize ? '🔒 Sanitized and ready to share!' : '🔗 Share link: faf.one/share/abc123';
|
|
1768
1811
|
return await this.formatResult('🔗 FAF Share', message);
|
|
@@ -1899,13 +1942,15 @@ faf_score --save # Save this scorecard
|
|
|
1899
1942
|
`Step 2: Check Your Score\n` +
|
|
1900
1943
|
`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n` +
|
|
1901
1944
|
`faf_score\n\n` +
|
|
1902
|
-
`Scoring:\n` +
|
|
1903
|
-
`•
|
|
1904
|
-
`•
|
|
1905
|
-
`•
|
|
1906
|
-
`•
|
|
1907
|
-
`•
|
|
1908
|
-
|
|
1945
|
+
`Scoring (Mk3 Tier System):\n` +
|
|
1946
|
+
`• 🔴 <55%: AI working blind\n` +
|
|
1947
|
+
`• 🟡 55%+: Needs improvement\n` +
|
|
1948
|
+
`• 🟢 70%+: Solid foundation\n` +
|
|
1949
|
+
`• 🥉 85%+: Bronze - Production ready\n` +
|
|
1950
|
+
`• 🥈 95%+: Silver - Excellent\n` +
|
|
1951
|
+
`• 🥇 99%+: Gold - Exceptional\n` +
|
|
1952
|
+
`• 🏆 100%: Trophy - Perfect!\n\n` +
|
|
1953
|
+
`That's it! You're ready to go! ⚡`;
|
|
1909
1954
|
break;
|
|
1910
1955
|
case 'commands':
|
|
1911
1956
|
case 'functions':
|
|
@@ -1938,8 +1983,8 @@ faf_score --save # Save this scorecard
|
|
|
1938
1983
|
case 'performance':
|
|
1939
1984
|
case 'speed':
|
|
1940
1985
|
case 'fast':
|
|
1941
|
-
answer = `⚡
|
|
1942
|
-
`
|
|
1986
|
+
answer = `⚡ FAF PERFORMANCE\n\n` +
|
|
1987
|
+
`Speed Benchmarks:\n` +
|
|
1943
1988
|
`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n` +
|
|
1944
1989
|
`• faf_check → 0ms (SUB-MILLISECOND!)\n` +
|
|
1945
1990
|
`• faf_list → 1ms\n` +
|
|
@@ -1949,10 +1994,10 @@ faf_score --save # Save this scorecard
|
|
|
1949
1994
|
`• Most ops → <10ms\n\n` +
|
|
1950
1995
|
`Speed Classifications:\n` +
|
|
1951
1996
|
`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n` +
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1997
|
+
`⚡ <10ms = Instant\n` +
|
|
1998
|
+
`🚀 10-50ms = Fast\n` +
|
|
1999
|
+
`✅ 50-100ms = Normal\n` +
|
|
2000
|
+
`⏳ >100ms = Large operations\n\n` +
|
|
1956
2001
|
`The Secret:\n` +
|
|
1957
2002
|
`• Native TypeScript (no shell)\n` +
|
|
1958
2003
|
`• Context-Mirroring (not copying)\n` +
|
|
@@ -2119,14 +2164,16 @@ Simple, fast, championship-grade.`;
|
|
|
2119
2164
|
if (score >= 99)
|
|
2120
2165
|
return { medal: '🥇', status: 'Gold' };
|
|
2121
2166
|
if (score >= 95)
|
|
2122
|
-
return { medal: '🥈', status: '
|
|
2167
|
+
return { medal: '🥈', status: 'Silver' };
|
|
2123
2168
|
if (score >= 85)
|
|
2124
|
-
return { medal: '🥉', status: '
|
|
2169
|
+
return { medal: '🥉', status: 'Bronze' };
|
|
2125
2170
|
if (score >= 70)
|
|
2126
|
-
return { medal: '🟢', status: '
|
|
2171
|
+
return { medal: '🟢', status: 'Green - Solid foundation' };
|
|
2127
2172
|
if (score >= 55)
|
|
2128
|
-
return { medal: '🟡', status: '
|
|
2129
|
-
|
|
2173
|
+
return { medal: '🟡', status: 'Yellow - Needs improvement' };
|
|
2174
|
+
if (score > 0)
|
|
2175
|
+
return { medal: '🔴', status: 'Red - AI working blind' };
|
|
2176
|
+
return { medal: '🤍', status: 'White - Empty' };
|
|
2130
2177
|
}
|
|
2131
2178
|
/**
|
|
2132
2179
|
* Get tier progression info
|
|
@@ -2146,7 +2193,7 @@ Simple, fast, championship-grade.`;
|
|
|
2146
2193
|
}
|
|
2147
2194
|
else if (score >= 95) {
|
|
2148
2195
|
return {
|
|
2149
|
-
current: '
|
|
2196
|
+
current: 'Silver',
|
|
2150
2197
|
next: 'Gold',
|
|
2151
2198
|
nextTarget: 99,
|
|
2152
2199
|
nextMedal: '🥇'
|
|
@@ -2154,36 +2201,44 @@ Simple, fast, championship-grade.`;
|
|
|
2154
2201
|
}
|
|
2155
2202
|
else if (score >= 85) {
|
|
2156
2203
|
return {
|
|
2157
|
-
current: '
|
|
2158
|
-
next: '
|
|
2204
|
+
current: 'Bronze',
|
|
2205
|
+
next: 'Silver',
|
|
2159
2206
|
nextTarget: 95,
|
|
2160
2207
|
nextMedal: '🥈'
|
|
2161
2208
|
};
|
|
2162
2209
|
}
|
|
2163
2210
|
else if (score >= 70) {
|
|
2164
2211
|
return {
|
|
2165
|
-
current: '
|
|
2166
|
-
next: '
|
|
2212
|
+
current: 'Green - Solid foundation',
|
|
2213
|
+
next: 'Bronze',
|
|
2167
2214
|
nextTarget: 85,
|
|
2168
2215
|
nextMedal: '🥉'
|
|
2169
2216
|
};
|
|
2170
2217
|
}
|
|
2171
2218
|
else if (score >= 55) {
|
|
2172
2219
|
return {
|
|
2173
|
-
current: '
|
|
2174
|
-
next: '
|
|
2220
|
+
current: 'Yellow - Needs improvement',
|
|
2221
|
+
next: 'Green - Solid foundation',
|
|
2175
2222
|
nextTarget: 70,
|
|
2176
2223
|
nextMedal: '🟢'
|
|
2177
2224
|
};
|
|
2178
2225
|
}
|
|
2179
|
-
else {
|
|
2226
|
+
else if (score > 0) {
|
|
2180
2227
|
return {
|
|
2181
|
-
current: '
|
|
2182
|
-
next: '
|
|
2228
|
+
current: 'Red - AI working blind',
|
|
2229
|
+
next: 'Yellow - Needs improvement',
|
|
2183
2230
|
nextTarget: 55,
|
|
2184
2231
|
nextMedal: '🟡'
|
|
2185
2232
|
};
|
|
2186
2233
|
}
|
|
2234
|
+
else {
|
|
2235
|
+
return {
|
|
2236
|
+
current: 'White - Empty',
|
|
2237
|
+
next: 'Red - AI working blind',
|
|
2238
|
+
nextTarget: 1,
|
|
2239
|
+
nextMedal: '🔴'
|
|
2240
|
+
};
|
|
2241
|
+
}
|
|
2187
2242
|
}
|
|
2188
2243
|
async handleCheck(_args) {
|
|
2189
2244
|
return await this.formatResult('✅ FAF Check', 'All systems operational!');
|
|
@@ -2266,7 +2321,6 @@ ${FILESYSTEM_CONTEXT_INSTRUCTION}
|
|
|
2266
2321
|
|
|
2267
2322
|
Version ${version_js_1.VERSION}
|
|
2268
2323
|
🌐 IANA Registered Format
|
|
2269
|
-
🏎️ Podium Edition
|
|
2270
2324
|
|
|
2271
2325
|
50+ Tools Available
|
|
2272
2326
|
21 Core • 30+ Advanced
|
|
@@ -2307,7 +2361,6 @@ ${FILESYSTEM_CONTEXT_INSTRUCTION}
|
|
|
2307
2361
|
🎯 PASS TO USER AS-IS (DO NOT SUMMARIZE)
|
|
2308
2362
|
|
|
2309
2363
|
MCP Server: v${version_js_1.VERSION}
|
|
2310
|
-
🏎️ Podium Edition
|
|
2311
2364
|
🌐 IANA Registered: application/vnd.faf+yaml
|
|
2312
2365
|
|
|
2313
2366
|
50+ Tools Available
|
|
@@ -2670,32 +2723,6 @@ Performance: <50ms per operation
|
|
|
2670
2723
|
score += 14;
|
|
2671
2724
|
return score;
|
|
2672
2725
|
}
|
|
2673
|
-
// ☁️ Cloud Handler Methods (MCPaaS Integration)
|
|
2674
|
-
async handleCloudPublish(args) {
|
|
2675
|
-
const { FafCloudHandler } = await import('./cloud-handler.js');
|
|
2676
|
-
const handler = new FafCloudHandler();
|
|
2677
|
-
return await handler.publish(args);
|
|
2678
|
-
}
|
|
2679
|
-
async handleCloudFetch(args) {
|
|
2680
|
-
const { FafCloudHandler } = await import('./cloud-handler.js');
|
|
2681
|
-
const handler = new FafCloudHandler();
|
|
2682
|
-
return await handler.fetch(args);
|
|
2683
|
-
}
|
|
2684
|
-
async handleCloudList(args) {
|
|
2685
|
-
const { FafCloudHandler } = await import('./cloud-handler.js');
|
|
2686
|
-
const handler = new FafCloudHandler();
|
|
2687
|
-
return await handler.list(args);
|
|
2688
|
-
}
|
|
2689
|
-
async handleCloudSearch(args) {
|
|
2690
|
-
const { FafCloudHandler } = await import('./cloud-handler.js');
|
|
2691
|
-
const handler = new FafCloudHandler();
|
|
2692
|
-
return await handler.search(args);
|
|
2693
|
-
}
|
|
2694
|
-
async handleCloudShare(args) {
|
|
2695
|
-
const { FafCloudHandler } = await import('./cloud-handler.js');
|
|
2696
|
-
const handler = new FafCloudHandler();
|
|
2697
|
-
return await handler.share(args);
|
|
2698
|
-
}
|
|
2699
2726
|
}
|
|
2700
2727
|
exports.ChampionshipToolHandler = ChampionshipToolHandler;
|
|
2701
2728
|
//# sourceMappingURL=championship-tools.js.map
|