Files
mcphub/core/templates/dashboard/partials/head_assets.html
airano-ir 788439e377
Some checks failed
Release / Test before release (push) Has been cancelled
Release / Publish to PyPI (push) Has been cancelled
Release / Publish to Docker Hub (push) Has been cancelled
Release / Create GitHub Release (push) Has been cancelled
feat(F.7+F.17): v3.11.0 — Coolify plugin (67 tools) + tool access overhaul
Catch-up sync spanning v3.7.0 → v3.11.0 of the internal repo.

Platform
- Total tools: 565 → 633 (+68) across 10 plugins (Coolify added)
- Tests: 481 → 828 passing

New plugin: Coolify (67 tools, Track F.17)
- Applications (17): CRUD, lifecycle, logs, env vars
- Deployments (5): list/get/cancel/deploy, app history
- Servers (8): CRUD, resources, domains, validation
- Projects (8), Databases (16, 6 DB types + backups), Services (13)

Tool access system (Track F.7 → F.7d)
- Scope → category mapping with per-tool `category` + `sensitivity`
- Schema v7: `site_tool_toggles(site_id)` + `sites.tool_scope` column
- Schema v8: per-site API keys (`api_keys.site_id`)
- Plugin-specific access-level presets (WP / WC / Gitea / OpenPanel /
  Coolify 5-tier)
- Credential-requirement notice tailored per plugin and tier
- Admin Tools count card on service page
- Dropped redundant `write` tier on WP / WP Advanced / WooCommerce
  (admin-scope tool count = 0 → identical to admin tier)

Dashboard
- Unified site manage page (Connection / Tool Access / Connect)
- /dashboard/keys unified (was /api-keys and /connect)
- CSRF interceptor via meta-tag; removed conflicting cookie reader
- Tailwind: pre-built CSS (scripts/build-css.sh) replaces CDN

Docs
- README / DOCKER_README / CLAUDE updated to 633 tools / 10 plugins
- CHANGELOG entries for v3.7.0 → v3.11.0
- FastMCP compatibility note updated to 3.x (post-v3.5 upgrade)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 21:05:07 +02:00

77 lines
2.8 KiB
HTML

<!-- Vazirmatn Font for Persian -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Vazirmatn:wght@100;200;300;400;500;600;700;800;900&display=swap"
rel="stylesheet">
<!-- Tailwind CSS (pre-built) -->
<link rel="stylesheet" href="/static/tailwind.min.css">
<!-- HTMX for dynamic updates -->
<script src="https://unpkg.com/htmx.org@1.9.10"></script>
<!-- Alpine.js for simple interactions -->
<script defer src="https://unpkg.com/alpinejs@3.14.8/dist/cdn.min.js"></script>
<!-- Theme Initialization -->
<script>
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
document.documentElement.classList.add('dark');
} else {
document.documentElement.classList.remove('dark');
}
</script>
<!-- Global CSRF Interceptor -->
<script>
document.addEventListener('DOMContentLoaded', () => {
const getCsrfToken = () => document.querySelector('meta[name="csrf-token"]')?.content;
// Intercept HTMX requests
document.body.addEventListener('htmx:configRequest', (event) => {
const token = getCsrfToken();
if (token && event.detail.verb !== 'get') {
event.detail.headers['X-CSRF-Token'] = token;
}
});
// Intercept standard fetch requests
const originalFetch = window.fetch;
window.fetch = async function (resource, init) {
const token = getCsrfToken();
if (token) {
const url = typeof resource === 'string' ? new URL(resource, window.location.origin) : resource;
if (url.origin === window.location.origin) {
init = init || {};
init.headers = init.headers || {};
const method = (init.method || 'GET').toUpperCase();
if (method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS') {
if (init.headers instanceof Headers) {
init.headers.append('X-CSRF-Token', token);
} else if (Array.isArray(init.headers)) {
init.headers.push(['X-CSRF-Token', token]);
} else {
init.headers['X-CSRF-Token'] = token;
}
}
}
}
return originalFetch.call(this, resource, init);
};
});
</script>
<style>
[x-cloak] {
display: none !important;
}
/* Vazirmatn font for Persian */
html[lang="fa"],
html[lang="fa"] *,
[lang="fa"],
[lang="fa"] * {
font-family: 'Vazirmatn', system-ui, sans-serif !important;
}
</style>