fix: harden install target filtering and MCP health probes

This commit is contained in:
Affaan Mustafa
2026-04-05 13:59:42 -07:00
parent 9d718ec66a
commit 8baffb4ad3
7 changed files with 138 additions and 36 deletions

View File

@@ -24,7 +24,7 @@ const DEFAULT_TTL_MS = 2 * 60 * 1000;
const DEFAULT_TIMEOUT_MS = 5000;
const DEFAULT_BACKOFF_MS = 30 * 1000;
const MAX_BACKOFF_MS = 10 * 60 * 1000;
const HEALTHY_HTTP_CODES = new Set([200, 201, 202, 204, 301, 302, 303, 304, 307, 308, 405]);
const HEALTHY_HTTP_CODES = new Set([200, 201, 202, 204, 301, 302, 303, 304, 307, 308, 400, 405]);
const RECONNECT_STATUS_CODES = new Set([401, 403, 429, 503]);
const FAILURE_PATTERNS = [
{ code: 401, pattern: /\b401\b|unauthori[sz]ed|auth(?:entication)?\s+(?:failed|expired|invalid)/i },

View File

@@ -3,6 +3,7 @@ const path = require('path');
const {
createFlatRuleOperations,
createInstallTargetAdapter,
isForeignPlatformPath,
} = require('./helpers');
module.exports = createInstallTargetAdapter({
@@ -30,18 +31,20 @@ module.exports = createInstallTargetAdapter({
return modules.flatMap(module => {
const paths = Array.isArray(module.paths) ? module.paths : [];
return paths.flatMap(sourceRelativePath => {
if (sourceRelativePath === 'rules') {
return createFlatRuleOperations({
moduleId: module.id,
repoRoot,
sourceRelativePath,
destinationDir: path.join(targetRoot, 'rules'),
});
}
return paths
.filter(p => !isForeignPlatformPath(p, adapter.target))
.flatMap(sourceRelativePath => {
if (sourceRelativePath === 'rules') {
return createFlatRuleOperations({
moduleId: module.id,
repoRoot,
sourceRelativePath,
destinationDir: path.join(targetRoot, 'rules'),
});
}
return [adapter.createScaffoldOperation(module.id, sourceRelativePath, planningInput)];
});
return [adapter.createScaffoldOperation(module.id, sourceRelativePath, planningInput)];
});
});
},
});

View File

@@ -3,6 +3,7 @@ const path = require('path');
const {
createFlatRuleOperations,
createInstallTargetAdapter,
isForeignPlatformPath,
} = require('./helpers');
module.exports = createInstallTargetAdapter({
@@ -30,18 +31,20 @@ module.exports = createInstallTargetAdapter({
return modules.flatMap(module => {
const paths = Array.isArray(module.paths) ? module.paths : [];
return paths.flatMap(sourceRelativePath => {
if (sourceRelativePath === 'rules') {
return createFlatRuleOperations({
moduleId: module.id,
repoRoot,
sourceRelativePath,
destinationDir: path.join(targetRoot, 'rules'),
});
}
return paths
.filter(p => !isForeignPlatformPath(p, adapter.target))
.flatMap(sourceRelativePath => {
if (sourceRelativePath === 'rules') {
return createFlatRuleOperations({
moduleId: module.id,
repoRoot,
sourceRelativePath,
destinationDir: path.join(targetRoot, 'rules'),
});
}
return [adapter.createScaffoldOperation(module.id, sourceRelativePath, planningInput)];
});
return [adapter.createScaffoldOperation(module.id, sourceRelativePath, planningInput)];
});
});
},
});

View File

@@ -2,6 +2,15 @@ const fs = require('fs');
const os = require('os');
const path = require('path');
const PLATFORM_SOURCE_PATH_OWNERS = Object.freeze({
'.claude-plugin': 'claude',
'.codex': 'codex',
'.cursor': 'cursor',
'.gemini': 'gemini',
'.opencode': 'opencode',
'.codebuddy': 'codebuddy',
});
function normalizeRelativePath(relativePath) {
return String(relativePath || '')
.replace(/\\/g, '/')
@@ -9,6 +18,18 @@ function normalizeRelativePath(relativePath) {
.replace(/\/+$/, '');
}
function isForeignPlatformPath(sourceRelativePath, adapterTarget) {
const normalizedPath = normalizeRelativePath(sourceRelativePath);
for (const [prefix, ownerTarget] of Object.entries(PLATFORM_SOURCE_PATH_OWNERS)) {
if (normalizedPath === prefix || normalizedPath.startsWith(`${prefix}/`)) {
return ownerTarget !== adapterTarget;
}
}
return false;
}
function resolveBaseRoot(scope, input = {}) {
if (scope === 'home') {
return input.homeDir || os.homedir();
@@ -260,21 +281,25 @@ function createInstallTargetAdapter(config) {
if (Array.isArray(input.modules)) {
return input.modules.flatMap(module => {
const paths = Array.isArray(module.paths) ? module.paths : [];
return paths.map(sourceRelativePath => adapter.createScaffoldOperation(
module.id,
sourceRelativePath,
input
));
return paths
.filter(p => !isForeignPlatformPath(p, config.target))
.map(sourceRelativePath => adapter.createScaffoldOperation(
module.id,
sourceRelativePath,
input
));
});
}
const module = input.module || {};
const paths = Array.isArray(module.paths) ? module.paths : [];
return paths.map(sourceRelativePath => adapter.createScaffoldOperation(
module.id,
sourceRelativePath,
input
));
return paths
.filter(p => !isForeignPlatformPath(p, config.target))
.map(sourceRelativePath => adapter.createScaffoldOperation(
module.id,
sourceRelativePath,
input
));
},
supportsModule(module, input = {}) {
if (typeof config.supportsModule === 'function') {
@@ -310,5 +335,6 @@ module.exports = {
),
createNamespacedFlatRuleOperations,
createRemappedOperation,
isForeignPlatformPath,
normalizeRelativePath,
};