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.
Files changed (100) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/CLAUDE.md +5 -5
  3. package/README.md +70 -14
  4. package/assets/thumbnail.png +0 -0
  5. package/dist/src/faf-core/commands/agents.d.ts +29 -0
  6. package/dist/src/faf-core/commands/agents.js +140 -0
  7. package/dist/src/faf-core/commands/agents.js.map +1 -0
  8. package/dist/src/faf-core/commands/bi-sync.d.ts +9 -5
  9. package/dist/src/faf-core/commands/bi-sync.js +89 -85
  10. package/dist/src/faf-core/commands/bi-sync.js.map +1 -1
  11. package/dist/src/faf-core/commands/conductor.d.ts +25 -0
  12. package/dist/src/faf-core/commands/conductor.js +157 -0
  13. package/dist/src/faf-core/commands/conductor.js.map +1 -0
  14. package/dist/src/faf-core/commands/cursor.d.ts +29 -0
  15. package/dist/src/faf-core/commands/cursor.js +134 -0
  16. package/dist/src/faf-core/commands/cursor.js.map +1 -0
  17. package/dist/src/faf-core/commands/gemini.d.ts +29 -0
  18. package/dist/src/faf-core/commands/gemini.js +133 -0
  19. package/dist/src/faf-core/commands/gemini.js.map +1 -0
  20. package/dist/src/faf-core/commands/git-context.d.ts +23 -0
  21. package/dist/src/faf-core/commands/git-context.js +66 -0
  22. package/dist/src/faf-core/commands/git-context.js.map +1 -0
  23. package/dist/src/faf-core/commands/human.d.ts +27 -0
  24. package/dist/src/faf-core/commands/human.js +183 -0
  25. package/dist/src/faf-core/commands/human.js.map +1 -0
  26. package/dist/src/faf-core/commands/readme.d.ts +47 -0
  27. package/dist/src/faf-core/commands/readme.js +361 -0
  28. package/dist/src/faf-core/commands/readme.js.map +1 -0
  29. package/dist/src/faf-core/engines/fab-formats-processor.js +3 -3
  30. package/dist/src/faf-core/engines/fab-formats-processor.js.map +1 -1
  31. package/dist/src/faf-core/engines/faf-dna.d.ts +1 -1
  32. package/dist/src/faf-core/engines/faf-dna.js +4 -3
  33. package/dist/src/faf-core/engines/faf-dna.js.map +1 -1
  34. package/dist/src/faf-core/generators/faf-generator-championship.js +9 -8
  35. package/dist/src/faf-core/generators/faf-generator-championship.js.map +1 -1
  36. package/dist/src/faf-core/parsers/agents-parser.d.ts +59 -0
  37. package/dist/src/faf-core/parsers/agents-parser.js +324 -0
  38. package/dist/src/faf-core/parsers/agents-parser.js.map +1 -0
  39. package/dist/src/faf-core/parsers/conductor-parser.d.ts +85 -0
  40. package/dist/src/faf-core/parsers/conductor-parser.js +293 -0
  41. package/dist/src/faf-core/parsers/conductor-parser.js.map +1 -0
  42. package/dist/src/faf-core/parsers/cursorrules-parser.d.ts +57 -0
  43. package/dist/src/faf-core/parsers/cursorrules-parser.js +317 -0
  44. package/dist/src/faf-core/parsers/cursorrules-parser.js.map +1 -0
  45. package/dist/src/faf-core/parsers/faf-git-generator.d.ts +53 -0
  46. package/dist/src/faf-core/parsers/faf-git-generator.js +512 -0
  47. package/dist/src/faf-core/parsers/faf-git-generator.js.map +1 -0
  48. package/dist/src/faf-core/parsers/gemini-parser.d.ts +57 -0
  49. package/dist/src/faf-core/parsers/gemini-parser.js +263 -0
  50. package/dist/src/faf-core/parsers/gemini-parser.js.map +1 -0
  51. package/dist/src/faf-core/parsers/github-extractor.d.ts +61 -0
  52. package/dist/src/faf-core/parsers/github-extractor.js +374 -0
  53. package/dist/src/faf-core/parsers/github-extractor.js.map +1 -0
  54. package/dist/src/faf-core/parsers/index.d.ts +12 -0
  55. package/dist/src/{compiler → faf-core/parsers}/index.js +10 -5
  56. package/dist/src/faf-core/parsers/index.js.map +1 -0
  57. package/dist/src/faf-core/parsers/slot-counter.d.ts +55 -0
  58. package/dist/src/faf-core/parsers/slot-counter.js +100 -0
  59. package/dist/src/faf-core/parsers/slot-counter.js.map +1 -0
  60. package/dist/src/faf-core/utils/balance-visualizer.js +3 -3
  61. package/dist/src/faf-core/utils/balance-visualizer.js.map +1 -1
  62. package/dist/src/handlers/championship-tools.d.ts +10 -5
  63. package/dist/src/handlers/championship-tools.js +259 -232
  64. package/dist/src/handlers/championship-tools.js.map +1 -1
  65. package/dist/src/handlers/engine-adapter.js +238 -5
  66. package/dist/src/handlers/engine-adapter.js.map +1 -1
  67. package/dist/src/handlers/tools.d.ts +61 -0
  68. package/dist/src/handlers/tools.js +2103 -102
  69. package/dist/src/handlers/tools.js.map +1 -1
  70. package/dist/src/index.js +0 -0
  71. package/dist/src/types/tool-visibility.js +51 -10
  72. package/dist/src/types/tool-visibility.js.map +1 -1
  73. package/dist/src/utils/championship-format.js +11 -9
  74. package/dist/src/utils/championship-format.js.map +1 -1
  75. package/dist/src/utils/path-resolver.js +56 -2
  76. package/dist/src/utils/path-resolver.js.map +1 -1
  77. package/dist/src/utils/visual-style.js +7 -5
  78. package/dist/src/utils/visual-style.js.map +1 -1
  79. package/dist/src/version.js +24 -11
  80. package/dist/src/version.js.map +1 -1
  81. package/package.json +5 -3
  82. package/project.faf +14 -18
  83. package/dist/index.json +0 -1
  84. package/dist/src/compiler/index.d.ts +0 -7
  85. package/dist/src/compiler/index.js.map +0 -1
  86. package/dist/src/compiler/scorer.d.ts +0 -53
  87. package/dist/src/compiler/scorer.js +0 -189
  88. package/dist/src/compiler/scorer.js.map +0 -1
  89. package/dist/src/compiler/slot-validator.d.ts +0 -32
  90. package/dist/src/compiler/slot-validator.js +0 -293
  91. package/dist/src/compiler/slot-validator.js.map +0 -1
  92. package/dist/src/compiler/type-detector.d.ts +0 -62
  93. package/dist/src/compiler/type-detector.js +0 -388
  94. package/dist/src/compiler/type-detector.js.map +0 -1
  95. package/dist/src/types/project-types.d.ts +0 -22
  96. package/dist/src/types/project-types.js +0 -85
  97. package/dist/src/types/project-types.js.map +0 -1
  98. package/dist/src/types/slots.d.ts +0 -39
  99. package/dist/src/types/slots.js +0 -162
  100. 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 CHAMPIONSHIP - 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.',
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 - Championship grade',
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: 'Championship 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.',
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 Podium Edition scorecard with detailed metrics' }
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 - Championship speed!',
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 - championship seal',
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 Championship Medal System',
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 championship, more bruv!',
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 championshipSection = skillInstalled
1014
- ? `🏆 **Championship Mode Ready!**\n` +
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 Championship Mode?**\n` +
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
- championshipSection +
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 = 'Championship!';
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
- let statusEmoji = '';
1239
- let statusText = '';
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 = `# 🏎️ FAF Championship Score Card
1221
+ const output = `# FAF Score Card
1258
1222
 
1259
- ## **Project Score: ${score}/100** ${score >= 99 ? '🏆' : ''}
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
- ## 🏁 Race Telemetry
1242
+ ## Context Status
1279
1243
 
1280
1244
  ### **Strengths** 💚
1281
- ${hasFaf && hasClaude ? '- Bi-directional sync: 40ms championship speed\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' : ''}
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
- > "Championship teams measure everything. So does FAF."
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 >= 90 ? 'Championship' : score >= 70 ? 'Podium Ready' : score >= 50 ? 'Qualifying' : score >= 30 ? 'In the Garage' : 'Needs Pit Stop',
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 projectName = path.basename(targetDir);
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 performance = 100; // Static for MCP server itself
1413
- const standalone = 100; // Static for MCP server itself
1376
+ const _performance = 100; // Static for MCP server itself
1377
+ const _standalone = 100; // Static for MCP server itself
1414
1378
  // Determine status tier
1415
- let statusTier = '';
1416
- let statusEmoji = '';
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 += `# 🏎️ FAF AI-Readiness Score: ${score}/100 ${statusTier}\n\n`;
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 += `🏎️ FAF AI-READINESS SCORE: ${score}/100 — ${statusTier}\n`;
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 barCore = `[${('█'.repeat(Math.round(coreIntelligence / 100 * 6)) + '░'.repeat(6 - Math.round(coreIntelligence / 100 * 6)))}] ${coreIntelligence}%`;
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 += `🏆 project.faf score: ${score >= 99 ? 'podium' : score >= 85 ? 'race-ready' : score >= 70 ? 'qualifying' : 'development'}\n`;
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 Championship level!** Run \`faf_bi_sync\` to keep files synchronized.\n\n`;
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 Podium Edition v${version_js_1.VERSION}*\n\n`;
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
- let statusColor = '';
1484
- if (score >= 90) {
1485
- statusEmoji = '🏆';
1486
- statusText = 'CHAMPIONSHIP!';
1487
- statusColor = '🟢';
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 += `### ${statusColor} **Status: ${statusText}**\n\n`;
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
- // Race Telemetry Section
1525
- result += `## 🏁 Race Telemetry\n\n`;
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: 40ms championship speed');
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 += `### **Pit Stop Required** 🔧\n`;
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
- // Championship Quote
1497
+ // FAF Quote
1572
1498
  const quotes = [
1573
- '"In F1, the difference between championship and last place is milliseconds. In FAF, it\'s context."',
1574
- '"Every project deserves a pit crew. FAF is yours."',
1575
- '"Stop FAFfing about - get to 100% and race!"',
1576
- '"Championship teams measure everything. So does FAF."',
1577
- '"The best time to FAF was yesterday. The second best time is now."'
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 Podium Edition v${version_js_1.VERSION}* ⚡\n`;
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
- `• 0-84%: Keep building\n` +
1904
- `• 85-98%: Race ready\n` +
1905
- `• 99%: Maximum technical\n` +
1906
- `• 🏆 100%: TROPHY - Championship Complete!\n` +
1907
- `• 🍊 Big Orange: BADGE (awarded separately)\n\n` +
1908
- `That's it! You're ready to race! 🏎️⚡`;
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 = `⚡ CHAMPIONSHIP PERFORMANCE\n\n` +
1942
- `Our Speed Achievements:\n` +
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
- `🏎️ <10ms = Championship\n` +
1953
- `🚗 10-50ms = Race ready\n` +
1954
- `🚙 50-100ms = Street legal\n` +
1955
- `🐌 >100ms = Large operations\n\n` +
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: 'Target 2 - Silver' };
2167
+ return { medal: '🥈', status: 'Silver' };
2123
2168
  if (score >= 85)
2124
- return { medal: '🥉', status: 'Target 1 - Bronze' };
2169
+ return { medal: '🥉', status: 'Bronze' };
2125
2170
  if (score >= 70)
2126
- return { medal: '🟢', status: 'GO! - Ready for Target 1' };
2171
+ return { medal: '🟢', status: 'Green - Solid foundation' };
2127
2172
  if (score >= 55)
2128
- return { medal: '🟡', status: 'Caution - Getting ready' };
2129
- return { medal: '🔴', status: 'Stop - Needs work' };
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: 'Target 2 - Silver',
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: 'Target 1 - Bronze',
2158
- next: 'Target 2 - Silver',
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: 'GO! - Ready for Target 1',
2166
- next: 'Target 1 - Bronze',
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: 'Caution - Getting ready',
2174
- next: 'GO! - Ready for Target 1',
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: 'Stop - Needs work',
2182
- next: 'Caution - Getting ready',
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