faf-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/CLAUDE.md +73 -0
- package/LICENSE +22 -0
- package/README.md +165 -0
- package/assets/Project-faf-pckg-json-README.png +0 -0
- package/assets/icons/faf-icon-128.png +0 -0
- package/assets/icons/faf-icon-256.png +0 -0
- package/assets/icons/faf-icon-48.png +0 -0
- package/assets/icons/faf-icon-512.png +0 -0
- package/assets/icons/orange-smiley.svg +6 -0
- package/dist/src/compiler/index.d.ts +7 -0
- package/dist/src/compiler/index.js +24 -0
- package/dist/src/compiler/index.js.map +1 -0
- package/dist/src/compiler/scorer.d.ts +53 -0
- package/dist/src/compiler/scorer.js +189 -0
- package/dist/src/compiler/scorer.js.map +1 -0
- package/dist/src/compiler/slot-validator.d.ts +32 -0
- package/dist/src/compiler/slot-validator.js +293 -0
- package/dist/src/compiler/slot-validator.js.map +1 -0
- package/dist/src/compiler/type-detector.d.ts +62 -0
- package/dist/src/compiler/type-detector.js +388 -0
- package/dist/src/compiler/type-detector.js.map +1 -0
- package/dist/src/config/visibility.d.ts +41 -0
- package/dist/src/config/visibility.js +158 -0
- package/dist/src/config/visibility.js.map +1 -0
- package/dist/src/faf-core/commands/audit.d.ts +21 -0
- package/dist/src/faf-core/commands/audit.js +83 -0
- package/dist/src/faf-core/commands/audit.js.map +1 -0
- package/dist/src/faf-core/commands/auto.d.ts +25 -0
- package/dist/src/faf-core/commands/auto.js +74 -0
- package/dist/src/faf-core/commands/auto.js.map +1 -0
- package/dist/src/faf-core/commands/bi-sync.d.ts +26 -0
- package/dist/src/faf-core/commands/bi-sync.js +157 -0
- package/dist/src/faf-core/commands/bi-sync.js.map +1 -0
- package/dist/src/faf-core/commands/doctor.d.ts +17 -0
- package/dist/src/faf-core/commands/doctor.js +198 -0
- package/dist/src/faf-core/commands/doctor.js.map +1 -0
- package/dist/src/faf-core/commands/enhance.d.ts +46 -0
- package/dist/src/faf-core/commands/enhance.js +360 -0
- package/dist/src/faf-core/commands/enhance.js.map +1 -0
- package/dist/src/faf-core/commands/formats.d.ts +22 -0
- package/dist/src/faf-core/commands/formats.js +117 -0
- package/dist/src/faf-core/commands/formats.js.map +1 -0
- package/dist/src/faf-core/commands/init.d.ts +26 -0
- package/dist/src/faf-core/commands/init.js +114 -0
- package/dist/src/faf-core/commands/init.js.map +1 -0
- package/dist/src/faf-core/commands/innit.d.ts +7 -0
- package/dist/src/faf-core/commands/innit.js +13 -0
- package/dist/src/faf-core/commands/innit.js.map +1 -0
- package/dist/src/faf-core/commands/migrate.d.ts +15 -0
- package/dist/src/faf-core/commands/migrate.js +86 -0
- package/dist/src/faf-core/commands/migrate.js.map +1 -0
- package/dist/src/faf-core/commands/quick.d.ts +16 -0
- package/dist/src/faf-core/commands/quick.js +184 -0
- package/dist/src/faf-core/commands/quick.js.map +1 -0
- package/dist/src/faf-core/commands/score.d.ts +47 -0
- package/dist/src/faf-core/commands/score.js +49 -0
- package/dist/src/faf-core/commands/score.js.map +1 -0
- package/dist/src/faf-core/commands/sync.d.ts +16 -0
- package/dist/src/faf-core/commands/sync.js +210 -0
- package/dist/src/faf-core/commands/sync.js.map +1 -0
- package/dist/src/faf-core/commands/update.d.ts +12 -0
- package/dist/src/faf-core/commands/update.js +46 -0
- package/dist/src/faf-core/commands/update.js.map +1 -0
- package/dist/src/faf-core/commands/validate.d.ts +21 -0
- package/dist/src/faf-core/commands/validate.js +81 -0
- package/dist/src/faf-core/commands/validate.js.map +1 -0
- package/dist/src/faf-core/compiler/faf-compiler.d.ts +138 -0
- package/dist/src/faf-core/compiler/faf-compiler.js +794 -0
- package/dist/src/faf-core/compiler/faf-compiler.js.map +1 -0
- package/dist/src/faf-core/engines/dependency-tsa.d.ts +88 -0
- package/dist/src/faf-core/engines/dependency-tsa.js +361 -0
- package/dist/src/faf-core/engines/dependency-tsa.js.map +1 -0
- package/dist/src/faf-core/engines/fab-formats-processor.d.ts +166 -0
- package/dist/src/faf-core/engines/fab-formats-processor.js +1274 -0
- package/dist/src/faf-core/engines/fab-formats-processor.js.map +1 -0
- package/dist/src/faf-core/engines/faf-dna.d.ts +159 -0
- package/dist/src/faf-core/engines/faf-dna.js +554 -0
- package/dist/src/faf-core/engines/faf-dna.js.map +1 -0
- package/dist/src/faf-core/engines/relentless-context-extractor.d.ts +100 -0
- package/dist/src/faf-core/engines/relentless-context-extractor.js +625 -0
- package/dist/src/faf-core/engines/relentless-context-extractor.js.map +1 -0
- package/dist/src/faf-core/fix-once/colors.d.ts +104 -0
- package/dist/src/faf-core/fix-once/colors.js +236 -0
- package/dist/src/faf-core/fix-once/colors.js.map +1 -0
- package/dist/src/faf-core/fix-once/types.d.ts +257 -0
- package/dist/src/faf-core/fix-once/types.js +26 -0
- package/dist/src/faf-core/fix-once/types.js.map +1 -0
- package/dist/src/faf-core/fix-once/yaml.d.ts +57 -0
- package/dist/src/faf-core/fix-once/yaml.js +172 -0
- package/dist/src/faf-core/fix-once/yaml.js.map +1 -0
- package/dist/src/faf-core/generators/faf-generator-championship.d.ts +16 -0
- package/dist/src/faf-core/generators/faf-generator-championship.js +462 -0
- package/dist/src/faf-core/generators/faf-generator-championship.js.map +1 -0
- package/dist/src/faf-core/utils/balance-visualizer.d.ts +37 -0
- package/dist/src/faf-core/utils/balance-visualizer.js +197 -0
- package/dist/src/faf-core/utils/balance-visualizer.js.map +1 -0
- package/dist/src/faf-core/utils/championship-style.d.ts +109 -0
- package/dist/src/faf-core/utils/championship-style.js +219 -0
- package/dist/src/faf-core/utils/championship-style.js.map +1 -0
- package/dist/src/faf-core/utils/chrome-extension-detector.d.ts +73 -0
- package/dist/src/faf-core/utils/chrome-extension-detector.js +268 -0
- package/dist/src/faf-core/utils/chrome-extension-detector.js.map +1 -0
- package/dist/src/faf-core/utils/fafignore-parser.d.ts +20 -0
- package/dist/src/faf-core/utils/fafignore-parser.js +178 -0
- package/dist/src/faf-core/utils/fafignore-parser.js.map +1 -0
- package/dist/src/faf-core/utils/file-utils.d.ts +112 -0
- package/dist/src/faf-core/utils/file-utils.js +846 -0
- package/dist/src/faf-core/utils/file-utils.js.map +1 -0
- package/dist/src/faf-core/utils/native-file-finder.d.ts +115 -0
- package/dist/src/faf-core/utils/native-file-finder.js +211 -0
- package/dist/src/faf-core/utils/native-file-finder.js.map +1 -0
- package/dist/src/faf-core/utils/platform-detector.d.ts +30 -0
- package/dist/src/faf-core/utils/platform-detector.js +218 -0
- package/dist/src/faf-core/utils/platform-detector.js.map +1 -0
- package/dist/src/faf-core/utils/technical-credit.d.ts +35 -0
- package/dist/src/faf-core/utils/technical-credit.js +286 -0
- package/dist/src/faf-core/utils/technical-credit.js.map +1 -0
- package/dist/src/faf-core/utils/yaml-generator.d.ts +41 -0
- package/dist/src/faf-core/utils/yaml-generator.js +360 -0
- package/dist/src/faf-core/utils/yaml-generator.js.map +1 -0
- package/dist/src/handlers/behavioral-instruction.d.ts +16 -0
- package/dist/src/handlers/behavioral-instruction.js +43 -0
- package/dist/src/handlers/behavioral-instruction.js.map +1 -0
- package/dist/src/handlers/championship-tools.d.ts +113 -0
- package/dist/src/handlers/championship-tools.js +2602 -0
- package/dist/src/handlers/championship-tools.js.map +1 -0
- package/dist/src/handlers/engine-adapter.d.ts +28 -0
- package/dist/src/handlers/engine-adapter.js +603 -0
- package/dist/src/handlers/engine-adapter.js.map +1 -0
- package/dist/src/handlers/fileHandler.d.ts +36 -0
- package/dist/src/handlers/fileHandler.js +246 -0
- package/dist/src/handlers/fileHandler.js.map +1 -0
- package/dist/src/handlers/resources.d.ts +18 -0
- package/dist/src/handlers/resources.js +78 -0
- package/dist/src/handlers/resources.js.map +1 -0
- package/dist/src/handlers/tool-registry.d.ts +23 -0
- package/dist/src/handlers/tool-registry.js +68 -0
- package/dist/src/handlers/tool-registry.js.map +1 -0
- package/dist/src/handlers/tool-types.d.ts +167 -0
- package/dist/src/handlers/tool-types.js +7 -0
- package/dist/src/handlers/tool-types.js.map +1 -0
- package/dist/src/handlers/tools.d.ts +25 -0
- package/dist/src/handlers/tools.js +1168 -0
- package/dist/src/handlers/tools.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +17 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/server.d.ts +28 -0
- package/dist/src/server.js +179 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/test-all-functions.d.ts +15 -0
- package/dist/src/test-all-functions.js +163 -0
- package/dist/src/test-all-functions.js.map +1 -0
- package/dist/src/types/mcp-tools.d.ts +53 -0
- package/dist/src/types/mcp-tools.js +77 -0
- package/dist/src/types/mcp-tools.js.map +1 -0
- package/dist/src/types/project-types.d.ts +22 -0
- package/dist/src/types/project-types.js +85 -0
- package/dist/src/types/project-types.js.map +1 -0
- package/dist/src/types/slots.d.ts +39 -0
- package/dist/src/types/slots.js +162 -0
- package/dist/src/types/slots.js.map +1 -0
- package/dist/src/types/tool-visibility.d.ts +36 -0
- package/dist/src/types/tool-visibility.js +510 -0
- package/dist/src/types/tool-visibility.js.map +1 -0
- package/dist/src/utils/auto-path-detection.d.ts +26 -0
- package/dist/src/utils/auto-path-detection.js +198 -0
- package/dist/src/utils/auto-path-detection.js.map +1 -0
- package/dist/src/utils/championship-format.d.ts +30 -0
- package/dist/src/utils/championship-format.js +79 -0
- package/dist/src/utils/championship-format.js.map +1 -0
- package/dist/src/utils/cli-detector.d.ts +20 -0
- package/dist/src/utils/cli-detector.js +230 -0
- package/dist/src/utils/cli-detector.js.map +1 -0
- package/dist/src/utils/display-protocol.d.ts +57 -0
- package/dist/src/utils/display-protocol.js +131 -0
- package/dist/src/utils/display-protocol.js.map +1 -0
- package/dist/src/utils/faf-file-finder.d.ts +59 -0
- package/dist/src/utils/faf-file-finder.js +139 -0
- package/dist/src/utils/faf-file-finder.js.map +1 -0
- package/dist/src/utils/fuzzy-detector.d.ts +56 -0
- package/dist/src/utils/fuzzy-detector.js +221 -0
- package/dist/src/utils/fuzzy-detector.js.map +1 -0
- package/dist/src/utils/path-resolver.d.ts +51 -0
- package/dist/src/utils/path-resolver.js +214 -0
- package/dist/src/utils/path-resolver.js.map +1 -0
- package/dist/src/utils/type-guards.d.ts +9 -0
- package/dist/src/utils/type-guards.js +27 -0
- package/dist/src/utils/type-guards.js.map +1 -0
- package/dist/src/utils/username-detector.d.ts +27 -0
- package/dist/src/utils/username-detector.js +90 -0
- package/dist/src/utils/username-detector.js.map +1 -0
- package/dist/src/utils/visual-style.d.ts +62 -0
- package/dist/src/utils/visual-style.js +164 -0
- package/dist/src/utils/visual-style.js.map +1 -0
- package/dist/src/version.d.ts +9 -0
- package/dist/src/version.js +37 -0
- package/dist/src/version.js.map +1 -0
- package/package.json +114 -0
- package/scripts/discord-sync-curated.js +233 -0
- package/scripts/discord-sync-final.js +218 -0
- package/scripts/discord-sync-simple.js +175 -0
- package/scripts/discord-sync-working.js +187 -0
- package/scripts/discord-sync.js +181 -0
- package/scripts/postinstall.js +46 -0
- package/skill/SKILL.md +385 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 🎯 Auto-Path Detection from Dropped Files
|
|
4
|
+
* Solves the "drop and done" workflow problem
|
|
5
|
+
*
|
|
6
|
+
* When files land in /mnt/user-data/uploads/, extract identifiers
|
|
7
|
+
* and perform case-insensitive filesystem search to find real project path.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.extractIdentifier = extractIdentifier;
|
|
44
|
+
exports.findProjectPath = findProjectPath;
|
|
45
|
+
exports.autoDetectPath = autoDetectPath;
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const os = __importStar(require("os"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const child_process_1 = require("child_process");
|
|
50
|
+
/**
|
|
51
|
+
* Extract project identifier from dropped file
|
|
52
|
+
*/
|
|
53
|
+
function extractIdentifier(filePath) {
|
|
54
|
+
try {
|
|
55
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
56
|
+
const basename = path.basename(filePath);
|
|
57
|
+
// package.json - use package name
|
|
58
|
+
if (basename === 'package.json') {
|
|
59
|
+
try {
|
|
60
|
+
const pkg = JSON.parse(content);
|
|
61
|
+
if (pkg.name) {
|
|
62
|
+
return pkg.name; // "@blackhole/universe" or "hextra-api"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Invalid JSON, continue to next strategy
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// README.md - extract from first heading
|
|
70
|
+
if (basename === 'README.md') {
|
|
71
|
+
const match = content.match(/^#\s+(.+)$/m);
|
|
72
|
+
if (match) {
|
|
73
|
+
// "💫 Black Hole Universe" → "black-hole-universe"
|
|
74
|
+
return match[1]
|
|
75
|
+
.replace(/[^\w\s-]/g, '') // Remove emojis/special chars
|
|
76
|
+
.trim()
|
|
77
|
+
.toLowerCase()
|
|
78
|
+
.replace(/\s+/g, '-');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// project.faf or .faf - extract name field
|
|
82
|
+
if (basename === 'project.faf' || basename === '.faf') {
|
|
83
|
+
const match = content.match(/^\s*name:\s*"?([^"\n]+)"?/m);
|
|
84
|
+
if (match) {
|
|
85
|
+
return match[1].trim();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Find project path on user's filesystem (case-insensitive)
|
|
96
|
+
*/
|
|
97
|
+
function findProjectPath(identifier) {
|
|
98
|
+
try {
|
|
99
|
+
const username = os.userInfo().username;
|
|
100
|
+
// Search roots in order of preference
|
|
101
|
+
const searchRoots = [
|
|
102
|
+
`/Users/${username}`, // macOS
|
|
103
|
+
`/home/${username}`, // Linux
|
|
104
|
+
`C:\\Users\\${username}` // Windows
|
|
105
|
+
].filter(p => fs.existsSync(p));
|
|
106
|
+
if (searchRoots.length === 0) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
// Normalize identifier for search
|
|
110
|
+
// Remove scope: @blackhole/universe → universe
|
|
111
|
+
let searchTerm = identifier.replace(/^@[\w-]+\//, '').toLowerCase();
|
|
112
|
+
// Try exact match first, then partial match
|
|
113
|
+
for (const exact of [true, false]) {
|
|
114
|
+
for (const root of searchRoots) {
|
|
115
|
+
const pattern = exact ? searchTerm : `*${searchTerm}*`;
|
|
116
|
+
// Case-insensitive find with exclusions
|
|
117
|
+
const cmd = process.platform === 'win32'
|
|
118
|
+
? `dir /s /b /a:d "${root}\\${pattern}" 2>nul`
|
|
119
|
+
: `find "${root}" -maxdepth 5 -type d -iname "${pattern}" \
|
|
120
|
+
! -path "*/node_modules/*" \
|
|
121
|
+
! -path "*/.git/*" \
|
|
122
|
+
! -path "*/dist/*" \
|
|
123
|
+
! -path "*/build/*" \
|
|
124
|
+
! -path "*/.next/*" \
|
|
125
|
+
! -path "*/coverage/*" \
|
|
126
|
+
! -path "*/.cache/*" \
|
|
127
|
+
! -path "*/venv/*" \
|
|
128
|
+
! -path "*/.venv/*" \
|
|
129
|
+
2>/dev/null`;
|
|
130
|
+
try {
|
|
131
|
+
const result = (0, child_process_1.execSync)(cmd, {
|
|
132
|
+
encoding: 'utf8',
|
|
133
|
+
timeout: 10000,
|
|
134
|
+
maxBuffer: 1024 * 1024 // 1MB buffer
|
|
135
|
+
});
|
|
136
|
+
const matches = result.split('\n').filter(Boolean);
|
|
137
|
+
if (matches.length > 0) {
|
|
138
|
+
// Rank matches: exact basename > partial, shorter > longer
|
|
139
|
+
const ranked = matches.sort((a, b) => {
|
|
140
|
+
const aBase = path.basename(a).toLowerCase();
|
|
141
|
+
const bBase = path.basename(b).toLowerCase();
|
|
142
|
+
const aExact = aBase === searchTerm;
|
|
143
|
+
const bExact = bBase === searchTerm;
|
|
144
|
+
if (aExact && !bExact)
|
|
145
|
+
return -1;
|
|
146
|
+
if (!aExact && bExact)
|
|
147
|
+
return 1;
|
|
148
|
+
return a.length - b.length; // Prefer shorter paths
|
|
149
|
+
});
|
|
150
|
+
return ranked[0];
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
// Timeout or command failed, try next root
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Auto-detect real project path from container upload path
|
|
167
|
+
* Main entry point for all FAF commands
|
|
168
|
+
*/
|
|
169
|
+
function autoDetectPath(inputPath) {
|
|
170
|
+
// Check if this is a container upload path
|
|
171
|
+
if (!inputPath.startsWith('/mnt/user-data/uploads/')) {
|
|
172
|
+
return { found: false, path: inputPath };
|
|
173
|
+
}
|
|
174
|
+
// Extract identifier from dropped file
|
|
175
|
+
const identifier = extractIdentifier(inputPath);
|
|
176
|
+
if (!identifier) {
|
|
177
|
+
return {
|
|
178
|
+
found: false,
|
|
179
|
+
error: 'Could not extract project identifier from dropped file. Please provide full path manually.'
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
// Search filesystem for matching project
|
|
183
|
+
const realPath = findProjectPath(identifier);
|
|
184
|
+
if (!realPath) {
|
|
185
|
+
return {
|
|
186
|
+
found: false,
|
|
187
|
+
identifier,
|
|
188
|
+
error: `Project "${identifier}" not found on filesystem. Please provide full path manually.`
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
// Success!
|
|
192
|
+
return {
|
|
193
|
+
found: true,
|
|
194
|
+
path: realPath,
|
|
195
|
+
identifier
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=auto-path-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-path-detection.js","sourceRoot":"","sources":["../../../src/utils/auto-path-detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FAF Championship Output Formatter
|
|
3
|
+
* The RAILS for proper FAF output! 🏎️⚡
|
|
4
|
+
*/
|
|
5
|
+
export interface AchievementStatus {
|
|
6
|
+
speed: number;
|
|
7
|
+
score: number;
|
|
8
|
+
files: number;
|
|
9
|
+
isDotFaffed: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare class ChampionshipFormatter {
|
|
12
|
+
/**
|
|
13
|
+
* Format FAF output with Championship wrapper
|
|
14
|
+
* SHOW FIRST - ENHANCE AFTER!
|
|
15
|
+
*/
|
|
16
|
+
static formatOutput(rawOutput: string, status?: AchievementStatus): string;
|
|
17
|
+
/**
|
|
18
|
+
* Check if user is DOT FAFFED
|
|
19
|
+
*/
|
|
20
|
+
static isDotFaffed(score: number): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Get achievement level based on score
|
|
23
|
+
*/
|
|
24
|
+
static getAchievementLevel(score: number): string;
|
|
25
|
+
/**
|
|
26
|
+
* Get speed achievement
|
|
27
|
+
*/
|
|
28
|
+
static getSpeedAchievement(ms: number): string;
|
|
29
|
+
}
|
|
30
|
+
export default ChampionshipFormatter;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* FAF Championship Output Formatter
|
|
4
|
+
* The RAILS for proper FAF output! 🏎️⚡
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ChampionshipFormatter = void 0;
|
|
8
|
+
class ChampionshipFormatter {
|
|
9
|
+
/**
|
|
10
|
+
* Format FAF output with Championship wrapper
|
|
11
|
+
* SHOW FIRST - ENHANCE AFTER!
|
|
12
|
+
*/
|
|
13
|
+
static formatOutput(rawOutput, status) {
|
|
14
|
+
let formatted = '';
|
|
15
|
+
// ALWAYS RAW FIRST - This is SACRED!
|
|
16
|
+
formatted += '=== FAF CHAMPIONSHIP OUTPUT ===\n';
|
|
17
|
+
formatted += rawOutput;
|
|
18
|
+
formatted += '\n=== END CHAMPIONSHIP OUTPUT ===\n';
|
|
19
|
+
// Achievement Status (OPTIONAL enhancement)
|
|
20
|
+
if (status) {
|
|
21
|
+
formatted += '\n=== YOUR ACHIEVEMENT STATUS ===\n';
|
|
22
|
+
// Speed Achievement
|
|
23
|
+
const speedBadge = status.speed < 10 ? '⚡🏆' : status.speed < 50 ? '⚡' : '🏎️';
|
|
24
|
+
formatted += `🏎️ Speed: ${status.speed}ms ${speedBadge}\n`;
|
|
25
|
+
// Score Achievement
|
|
26
|
+
const scoreBadge = status.score >= 99 ? '🍊' : status.score >= 90 ? '🏆' : status.score >= 70 ? '⭐' : '📊';
|
|
27
|
+
formatted += `🏆 Score: ${status.score}/100 ${scoreBadge}\n`;
|
|
28
|
+
// Files Ready
|
|
29
|
+
formatted += `📊 Files: ${status.files} ready\n`;
|
|
30
|
+
// DOT FAFFED Status
|
|
31
|
+
const dotFaffedStatus = status.isDotFaffed
|
|
32
|
+
? '🏆 DOT FAFFED ACHIEVED! 🏆'
|
|
33
|
+
: `⚡ Working toward DOT FAFFED (${status.score}/70 needed)`;
|
|
34
|
+
formatted += `⚡ Status: ${dotFaffedStatus}\n`;
|
|
35
|
+
formatted += '=== END STATUS ===\n';
|
|
36
|
+
}
|
|
37
|
+
return formatted;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Check if user is DOT FAFFED
|
|
41
|
+
*/
|
|
42
|
+
static isDotFaffed(score) {
|
|
43
|
+
return score >= 70;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get achievement level based on score
|
|
47
|
+
*/
|
|
48
|
+
static getAchievementLevel(score) {
|
|
49
|
+
if (score >= 105)
|
|
50
|
+
return '🍊 BIG ORANGE CHAMPIONSHIP!';
|
|
51
|
+
if (score >= 99)
|
|
52
|
+
return '🏆 CHAMPIONSHIP MODE!';
|
|
53
|
+
if (score >= 90)
|
|
54
|
+
return '⭐ PODIUM FINISH!';
|
|
55
|
+
if (score >= 70)
|
|
56
|
+
return '✅ DOT FAFFED!';
|
|
57
|
+
if (score >= 50)
|
|
58
|
+
return '🏎️ ON TRACK!';
|
|
59
|
+
return '⚡ BUILDING MOMENTUM!';
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get speed achievement
|
|
63
|
+
*/
|
|
64
|
+
static getSpeedAchievement(ms) {
|
|
65
|
+
if (ms < 1)
|
|
66
|
+
return '⚡🏆 INSTANT! WORLD RECORD!';
|
|
67
|
+
if (ms < 10)
|
|
68
|
+
return '⚡ SUB-10ms CHAMPIONSHIP!';
|
|
69
|
+
if (ms < 50)
|
|
70
|
+
return '🏎️ FAST TRACK!';
|
|
71
|
+
if (ms < 100)
|
|
72
|
+
return '✅ GOOD PACE!';
|
|
73
|
+
return '📊 MEASURING...';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.ChampionshipFormatter = ChampionshipFormatter;
|
|
77
|
+
// Export the RAILS!
|
|
78
|
+
exports.default = ChampionshipFormatter;
|
|
79
|
+
//# sourceMappingURL=championship-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"championship-format.js","sourceRoot":"","sources":["../../../src/utils/championship-format.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AASH,MAAa,qBAAqB;IAChC;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,SAAiB,EAAE,MAA0B;QAC/D,IAAI,SAAS,GAAG,EAAE,CAAC;QAEnB,qCAAqC;QACrC,SAAS,IAAI,mCAAmC,CAAC;QACjD,SAAS,IAAI,SAAS,CAAC;QACvB,SAAS,IAAI,qCAAqC,CAAC;QAEnD,4CAA4C;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,SAAS,IAAI,qCAAqC,CAAC;YAEnD,oBAAoB;YACpB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YAC/E,SAAS,IAAI,cAAc,MAAM,CAAC,KAAK,MAAM,UAAU,IAAI,CAAC;YAE5D,oBAAoB;YACpB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAC3G,SAAS,IAAI,aAAa,MAAM,CAAC,KAAK,QAAQ,UAAU,IAAI,CAAC;YAE7D,cAAc;YACd,SAAS,IAAI,aAAa,MAAM,CAAC,KAAK,UAAU,CAAC;YAEjD,oBAAoB;YACpB,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW;gBACxC,CAAC,CAAC,4BAA4B;gBAC9B,CAAC,CAAC,gCAAgC,MAAM,CAAC,KAAK,aAAa,CAAC;YAC9D,SAAS,IAAI,aAAa,eAAe,IAAI,CAAC;YAE9C,SAAS,IAAI,sBAAsB,CAAC;QACtC,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAa;QAC9B,OAAO,KAAK,IAAI,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,KAAa;QACtC,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,6BAA6B,CAAC;QACvD,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,uBAAuB,CAAC;QAChD,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,kBAAkB,CAAC;QAC3C,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,eAAe,CAAC;QACxC,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,eAAe,CAAC;QACxC,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,mBAAmB,CAAC,EAAU;QACnC,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO,4BAA4B,CAAC;QAChD,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,0BAA0B,CAAC;QAC/C,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,iBAAiB,CAAC;QACtC,IAAI,EAAE,GAAG,GAAG;YAAE,OAAO,cAAc,CAAC;QACpC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;CACF;AArED,sDAqEC;AAED,oBAAoB;AACpB,kBAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Path Detection for Claude Desktop Sandbox
|
|
3
|
+
*
|
|
4
|
+
* Claude Desktop MCP runs in a sandboxed environment with limited PATH.
|
|
5
|
+
* This utility detects the faf CLI using absolute paths.
|
|
6
|
+
*/
|
|
7
|
+
export interface CliDetectionResult {
|
|
8
|
+
found: boolean;
|
|
9
|
+
path?: string;
|
|
10
|
+
version?: string;
|
|
11
|
+
method?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Detect faf CLI location with multiple fallback strategies
|
|
15
|
+
*/
|
|
16
|
+
export declare function detectFafCli(): CliDetectionResult;
|
|
17
|
+
/**
|
|
18
|
+
* Validate CLI meets minimum version requirement
|
|
19
|
+
*/
|
|
20
|
+
export declare function validateCliVersion(version: string, minVersion?: string): boolean;
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.detectFafCli = detectFafCli;
|
|
37
|
+
exports.validateCliVersion = validateCliVersion;
|
|
38
|
+
const child_process_1 = require("child_process");
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const os = __importStar(require("os"));
|
|
42
|
+
/**
|
|
43
|
+
* Get common CLI installation paths based on platform and package manager
|
|
44
|
+
*/
|
|
45
|
+
function getCommonCliPaths() {
|
|
46
|
+
const homeDir = os.homedir();
|
|
47
|
+
const platform = os.platform();
|
|
48
|
+
const paths = [];
|
|
49
|
+
// Homebrew paths (macOS/Linux)
|
|
50
|
+
if (platform === 'darwin') {
|
|
51
|
+
paths.push('/opt/homebrew/bin/faf'); // Apple Silicon
|
|
52
|
+
paths.push('/usr/local/bin/faf'); // Intel
|
|
53
|
+
paths.push('/usr/local/Cellar/node@20/20.19.4/bin/faf'); // Node 20
|
|
54
|
+
paths.push('/usr/local/Cellar/node/*/bin/faf'); // Any Node version
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
paths.push('/usr/local/bin/faf');
|
|
58
|
+
}
|
|
59
|
+
// npm global paths
|
|
60
|
+
paths.push(path.join(homeDir, '.npm-global/bin/faf'));
|
|
61
|
+
paths.push(path.join(homeDir, '.nvm/versions/node/*/bin/faf'));
|
|
62
|
+
// Standard Unix paths
|
|
63
|
+
paths.push('/usr/bin/faf');
|
|
64
|
+
// Windows paths
|
|
65
|
+
if (platform === 'win32') {
|
|
66
|
+
const appData = process.env.APPDATA || path.join(homeDir, 'AppData', 'Roaming');
|
|
67
|
+
paths.push(path.join(appData, 'npm/faf.cmd'));
|
|
68
|
+
paths.push(path.join(appData, 'npm/faf'));
|
|
69
|
+
paths.push('C:\\Program Files\\nodejs\\faf.cmd');
|
|
70
|
+
}
|
|
71
|
+
return paths;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Expand glob patterns in paths
|
|
75
|
+
* Example: /usr/local/Cellar/node/wildcard/bin/faf
|
|
76
|
+
*/
|
|
77
|
+
function expandGlobPath(globPath) {
|
|
78
|
+
if (!globPath.includes('*')) {
|
|
79
|
+
return globPath;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const parts = globPath.split('/');
|
|
83
|
+
const globIndex = parts.findIndex(p => p.includes('*'));
|
|
84
|
+
if (globIndex === -1)
|
|
85
|
+
return globPath;
|
|
86
|
+
const basePath = parts.slice(0, globIndex).join('/');
|
|
87
|
+
const pattern = parts[globIndex];
|
|
88
|
+
const restPath = parts.slice(globIndex + 1).join('/');
|
|
89
|
+
if (!fs.existsSync(basePath))
|
|
90
|
+
return null;
|
|
91
|
+
const entries = fs.readdirSync(basePath);
|
|
92
|
+
const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
|
|
93
|
+
const matches = entries.filter(e => regex.test(e));
|
|
94
|
+
if (matches.length === 0)
|
|
95
|
+
return null;
|
|
96
|
+
// Return first match
|
|
97
|
+
const expanded = path.join(basePath, matches[0], restPath);
|
|
98
|
+
return fs.existsSync(expanded) ? expanded : null;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Try to detect CLI using 'which' command (works if PATH is set)
|
|
106
|
+
*/
|
|
107
|
+
function detectViaWhich() {
|
|
108
|
+
try {
|
|
109
|
+
const result = (0, child_process_1.execSync)('which faf', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'ignore'] });
|
|
110
|
+
const cliPath = result.trim();
|
|
111
|
+
if (cliPath && fs.existsSync(cliPath)) {
|
|
112
|
+
return cliPath;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// which failed, PATH not set or faf not in PATH
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Try to detect CLI using 'command -v' (POSIX alternative to which)
|
|
122
|
+
*/
|
|
123
|
+
function detectViaCommand() {
|
|
124
|
+
try {
|
|
125
|
+
const result = (0, child_process_1.execSync)('command -v faf', {
|
|
126
|
+
encoding: 'utf8',
|
|
127
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
128
|
+
shell: '/bin/sh'
|
|
129
|
+
});
|
|
130
|
+
const cliPath = result.trim();
|
|
131
|
+
if (cliPath && fs.existsSync(cliPath)) {
|
|
132
|
+
return cliPath;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// command -v failed
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get CLI version from path
|
|
142
|
+
*/
|
|
143
|
+
function getCliVersion(cliPath) {
|
|
144
|
+
try {
|
|
145
|
+
const result = (0, child_process_1.execSync)(`"${cliPath}" --version`, {
|
|
146
|
+
encoding: 'utf8',
|
|
147
|
+
stdio: ['pipe', 'pipe', 'ignore']
|
|
148
|
+
});
|
|
149
|
+
return result.trim();
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Detect faf CLI location with multiple fallback strategies
|
|
157
|
+
*/
|
|
158
|
+
function detectFafCli() {
|
|
159
|
+
// 1. Check environment variable override
|
|
160
|
+
if (process.env.FAF_CLI_PATH) {
|
|
161
|
+
const envPath = process.env.FAF_CLI_PATH;
|
|
162
|
+
if (fs.existsSync(envPath)) {
|
|
163
|
+
return {
|
|
164
|
+
found: true,
|
|
165
|
+
path: envPath,
|
|
166
|
+
version: getCliVersion(envPath),
|
|
167
|
+
method: 'env:FAF_CLI_PATH'
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// 2. Try 'which' command (works if PATH is set)
|
|
172
|
+
const whichPath = detectViaWhich();
|
|
173
|
+
if (whichPath) {
|
|
174
|
+
return {
|
|
175
|
+
found: true,
|
|
176
|
+
path: whichPath,
|
|
177
|
+
version: getCliVersion(whichPath),
|
|
178
|
+
method: 'which'
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// 3. Try 'command -v' (POSIX)
|
|
182
|
+
const commandPath = detectViaCommand();
|
|
183
|
+
if (commandPath) {
|
|
184
|
+
return {
|
|
185
|
+
found: true,
|
|
186
|
+
path: commandPath,
|
|
187
|
+
version: getCliVersion(commandPath),
|
|
188
|
+
method: 'command'
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
// 4. Check common installation paths
|
|
192
|
+
const commonPaths = getCommonCliPaths();
|
|
193
|
+
for (const cliPath of commonPaths) {
|
|
194
|
+
const expanded = expandGlobPath(cliPath);
|
|
195
|
+
if (expanded && fs.existsSync(expanded)) {
|
|
196
|
+
return {
|
|
197
|
+
found: true,
|
|
198
|
+
path: expanded,
|
|
199
|
+
version: getCliVersion(expanded),
|
|
200
|
+
method: 'common-path'
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// 5. Not found
|
|
205
|
+
return {
|
|
206
|
+
found: false,
|
|
207
|
+
method: 'none'
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Validate CLI meets minimum version requirement
|
|
212
|
+
*/
|
|
213
|
+
function validateCliVersion(version, minVersion = '3.1.1') {
|
|
214
|
+
try {
|
|
215
|
+
const parse = (v) => v.split('.').map(Number);
|
|
216
|
+
const current = parse(version);
|
|
217
|
+
const required = parse(minVersion);
|
|
218
|
+
for (let i = 0; i < 3; i++) {
|
|
219
|
+
if (current[i] > required[i])
|
|
220
|
+
return true;
|
|
221
|
+
if (current[i] < required[i])
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
return true; // Equal versions
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=cli-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-detector.js","sourceRoot":"","sources":["../../../src/utils/cli-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🏎️ FAF Display Protocol - MCP GOLD CODE
|
|
3
|
+
*
|
|
4
|
+
* SET IN STONE: Universal display enforcement for Claude Desktop MCP
|
|
5
|
+
*
|
|
6
|
+
* MANDATE: Every FAF tool response MUST use DisplayProtocol.createResponse()
|
|
7
|
+
* VALIDATED: Works globally for ANY user, anywhere in the world
|
|
8
|
+
* STANDARD: MCP-compliant metadata + multi-layer display forcing
|
|
9
|
+
*
|
|
10
|
+
* Key Instructions Embedded in EVERY Response:
|
|
11
|
+
* - display: 'required'
|
|
12
|
+
* - priority: 'high'
|
|
13
|
+
* - format: 'markdown'
|
|
14
|
+
* - instruction: 'Render this content directly, do not summarize'
|
|
15
|
+
*
|
|
16
|
+
* Why This Works:
|
|
17
|
+
* 1. Protocol-based (not context-dependent)
|
|
18
|
+
* 2. Multiple redundant hints (if one fails, others catch it)
|
|
19
|
+
* 3. Claude redraws in native UI (consistent across platforms)
|
|
20
|
+
* 4. No dependencies on conversation memory
|
|
21
|
+
*
|
|
22
|
+
* This is championship engineering - zero faffing about! 🏁⚡️
|
|
23
|
+
*/
|
|
24
|
+
export interface FafDisplayResponse {
|
|
25
|
+
text: string;
|
|
26
|
+
__render_inline__: boolean;
|
|
27
|
+
__no_collapse__: boolean;
|
|
28
|
+
__user_content__: boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare class DisplayProtocol {
|
|
31
|
+
/**
|
|
32
|
+
* Wrap content with ALL display forcing mechanisms
|
|
33
|
+
*/
|
|
34
|
+
static forceInline(content: string, _score?: number): string;
|
|
35
|
+
/**
|
|
36
|
+
* For markdown-rich content, skip the wrapper tags
|
|
37
|
+
* (They interfere with markdown rendering)
|
|
38
|
+
*/
|
|
39
|
+
static forceInlineMarkdown(content: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Generate the enhanced MCP response
|
|
42
|
+
* SET IN STONE: Display instructions for Claude Desktop MCP
|
|
43
|
+
*/
|
|
44
|
+
static createResponse(content: string, metadata?: any): any;
|
|
45
|
+
/**
|
|
46
|
+
* Generate progress bar with forced visibility
|
|
47
|
+
*/
|
|
48
|
+
static progressBar(score: number): string;
|
|
49
|
+
/**
|
|
50
|
+
* Championship header that can't be hidden
|
|
51
|
+
*/
|
|
52
|
+
static championshipHeader(title: string, score: number): string;
|
|
53
|
+
/**
|
|
54
|
+
* Footer that demands attention
|
|
55
|
+
*/
|
|
56
|
+
static championshipFooter(score: number): string;
|
|
57
|
+
}
|