From fbf1b6f2deca61205245cc2eb5b5d35f663e8e95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AI=E4=BA=A7=E5=93=81=E9=BB=84=E5=8F=94?= Date: Sun, 2 Aug 2026 11:35:01 +0800 Subject: [PATCH 01/15] chore: establish SkillManager release baseline --- .github/workflows/ci.yml | 31 + .gitignore | 2 + LICENSE | 21 + README.md | 114 +- bin/cli.js | 2 +- bin/prepare.js | 6 +- dist/server/index.js | 163 -- dist/server/routes/manage.js | 205 --- dist/server/routes/similarity.js | 69 - dist/server/routes/skills.js | 99 - dist/server/routes/trash.js | 41 - dist/server/routes/versions.js | 60 - dist/server/scanner/discovery.js | 421 ----- dist/server/scanner/parser.js | 26 - dist/server/scanner/similarity.js | 227 --- dist/server/scanner/symlink.js | 24 - dist/server/scanner/watcher.js | 45 - dist/server/trash/store.js | 335 ---- dist/server/types.js | 1 - dist/server/versioning/store.js | 343 ---- dist/web/index.html | 45 - eslint.config.js | 33 + package-lock.json | 2285 ++++++++++++++++++------ package.json | 66 +- release/claude-skill-hub.tgz | Bin 228798 -> 0 bytes scripts/audit-release.mjs | 36 + scripts/run-tests.mjs | 45 + scripts/verify-package.mjs | 163 ++ scripts/write-build-manifest.mjs | 112 ++ server/config/paths.ts | 43 + server/index.ts | 10 +- server/routes/manage.ts | 4 +- server/routes/similarity.ts | 4 +- server/routes/skills.ts | 2 +- server/scanner/discovery.ts | 64 +- server/scanner/symlink.ts | 1 - server/scanner/watcher.ts | 8 +- server/sync/export.ts | 8 +- server/sync/layout.ts | 11 +- server/trash/store.ts | 8 +- server/versioning/store.ts | 10 +- tests/integration/fixture-scan.test.ts | 40 + tests/integration/trash.test.ts | 25 + tests/unit/nlp.test.ts | 23 + tsconfig.json | 2 +- vite.config.ts | 4 + web/index.html | 6 +- web/src/App.tsx | 2 +- web/src/components/AboutModal.tsx | 10 +- web/src/components/ErrorBoundary.tsx | 4 +- web/src/components/Footer.tsx | 4 +- web/src/components/SyncView.tsx | 4 +- web/src/components/VersionHistory.tsx | 2 +- web/src/hooks/useWebSocket.ts | 2 +- web/src/main.tsx | 6 +- web/src/vite-env.d.ts | 3 + 56 files changed, 2555 insertions(+), 2775 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 LICENSE delete mode 100644 dist/server/index.js delete mode 100644 dist/server/routes/manage.js delete mode 100644 dist/server/routes/similarity.js delete mode 100644 dist/server/routes/skills.js delete mode 100644 dist/server/routes/trash.js delete mode 100644 dist/server/routes/versions.js delete mode 100644 dist/server/scanner/discovery.js delete mode 100644 dist/server/scanner/parser.js delete mode 100644 dist/server/scanner/similarity.js delete mode 100644 dist/server/scanner/symlink.js delete mode 100644 dist/server/scanner/watcher.js delete mode 100644 dist/server/trash/store.js delete mode 100644 dist/server/types.js delete mode 100644 dist/server/versioning/store.js delete mode 100644 dist/web/index.html create mode 100644 eslint.config.js delete mode 100644 release/claude-skill-hub.tgz create mode 100644 scripts/audit-release.mjs create mode 100644 scripts/run-tests.mjs create mode 100644 scripts/verify-package.mjs create mode 100644 scripts/write-build-manifest.mjs create mode 100644 server/config/paths.ts create mode 100644 tests/integration/fixture-scan.test.ts create mode 100644 tests/integration/trash.test.ts create mode 100644 tests/unit/nlp.test.ts create mode 100644 web/src/vite-env.d.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..74dfcf3 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,31 @@ +name: ci + +on: + push: + pull_request: + +permissions: + contents: read + +jobs: + verify: + strategy: + fail-fast: false + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + node: [20, 22] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + cache: npm + - run: npm ci + - run: npm run lint + - run: npm run typecheck + - run: npm run test + - run: npm run test:integration + - run: npm run build + - run: npm run pack:verify + - run: npm run audit:release diff --git a/.gitignore b/.gitignore index d5706ae..a73329b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ node_modules/ dist/ +release/*.tgz +coverage/ .DS_Store *.log .env diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..db8700f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Backtthefuture + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 9dcdbff..a42fde1 100644 --- a/README.md +++ b/README.md @@ -1,87 +1,87 @@ -# Skill Hub +# SkillManager -> 黄叔的 Claude Skill 可视化管理器 — 一键扫描并管理你机器上所有 Claude Agent Skills。 +> 本地优先的 Agent Skill 管理与诊断工作台。 -## 它解决了什么问题 +SkillManager 扫描本机和当前项目中的 Agent Skills,集中展示安装位置、作用域、冲突、相似项、健康诊断、版本与回收站。Web 服务只监听 `127.0.0.1`;Skill 内容默认留在本机。 -当你装了几十个 Skill 后,你会遇到: +当前仓库正在开发 `0.4.0`:产品名和主命令已统一为 SkillManager;Codex Plugin、生命周期 CLI 与安全写入流程会按里程碑逐步合入。公开 release 完成前,请以源码安装和本仓库验收结果为准,不要继续使用历史 `huangshu/tools/skill-hub` tarball。 -- 同名 Skill 散落在不同目录(`~/.claude/skills/`、插件、各个项目的 `.claude/skills/`) -- 想改个 Skill 得手动翻目录 -- 不知道哪些是全局、哪些是项目私有、哪些来自插件、哪些重复了 -- 改坏了想回滚,没有版本历史 +## 从源码运行 -Skill Hub 是一个本地 Web UI:扫描全盘、聚合展示、可视化编辑、自动版本快照。 - -## 快速开始(一行命令) +要求:Node.js 20 或 22、Git。 ```bash -npm install -g https://github.com/Backtthefuture/huangshu/raw/main/tools/skill-hub/release/claude-skill-hub.tgz && skill-hub +git clone https://github.com/Backtthefuture/skillmanager.git +cd skillmanager +npm ci +npm run build +npm install -g . +skillmanager ``` -首次运行会自动: -1. 下载预构建的 tarball 并全局安装 -2. 安装运行期依赖 -3. 启动服务并打开浏览器到 `http://localhost:3456` - -**之后每次启动只要敲 `skill-hub` 就行**,不用再打这串长命令。 - -要求:Node.js ≥ 20。 +兼容命令 `skill-hub` 和 `claude-skill-hub` 仍会保留至少一个大版本。 -> **为什么用 tarball URL 而不是 `github:user/repo`**:npm 11 + node 24 在 macOS 上通过 `npm install -g github:...` 全局安装时,会把包软链到 `~/.npm/_cacache/tmp/` 里的临时克隆目录,随后临时目录被清理、留下悬空符号链接导致 `skill-hub` 无法运行。直接装预构建 tarball 走的是真正的文件拷贝路径,完全绕开这个 bug。 -> -> **更新到最新版**:再跑一次同样的命令即可。 -> -> **卸载**:`npm uninstall -g claude-skill-hub`。 +卸载: -## 扫描覆盖的位置 +```bash +npm uninstall -g skillmanager +``` -- `~/.claude/skills/` — 全局 skill -- `~/.claude/plugins/**/skills/` — Claude Code 插件附带的 skill(递归扫描) -- `~/.claude/projects/*` 里注册过的项目 `.claude/skills/` -- 常见开发目录:`~/Documents`、`~/Projects`、`~/Developer`、`~/Code`、`~/code`、`~/workspace`、`~/dev`、`~/work`、`~/repos`、`~/src` 下一层的项目 -- 当前工作目录及其向上 3 级目录的 `.claude/skills/` -- 环境变量 `SKILL_HUB_EXTRA_PATHS=/path/a:/path/b` 指定的额外路径 +## 当前能力 -## 排查问题 +- 扫描多种 Agent 的全局、项目与已启用插件 Skill。 +- 搜索、筛选、分类、同名冲突与语义相似检测。 +- 本地编辑、自动快照、版本对比与回滚。 +- 回收站删除与恢复。 +- 可选的 GitHub 私有仓库备份和恢复。 +- React Web UI、Fastify 本地服务与 WebSocket 实时刷新。 -如果发现扫到的 skill 数量不对、或者页面打开是白屏,访问: - -``` -http://localhost:3456/api/debug -``` - -返回 JSON 包含:node 版本、cwd、homedir、所有被扫的路径及每个路径的命中数、耗时、错误。报 bug 时发这份 JSON 即可快速定位。 +Codex 用户应优先把个人共享 Skill 放在 `~/.agents/skills/`,项目共享 Skill 放在 `/.agents/skills/`。`~/.codex/skills/` 只作为兼容/历史位置展示。 ## 本地开发 ```bash -git clone https://github.com/Backtthefuture/huangshu.git -cd huangshu/tools/skill-hub - -npm install -npm run dev # 开发模式:前端 5173 + 后端 3456 +npm ci +npm run dev ``` -生产模式: +发布前门禁: ```bash +npm run lint +npm run typecheck +npm run test +npm run test:integration npm run build -npm start +npm run pack:verify +npm run audit:release ``` -## 可选环境变量 +`pack:verify` 会连续构建两次,生成带 commit/source hash 的 manifest,再把 tarball 安装到全新的临时目录并启动包内服务。测试只允许使用 `SKILLMANAGER_FIXTURE_ROOT` 与 `SKILLMANAGER_DATA_DIR`,不得读写真实用户 Skill。 + +## 开发环境变量 + +- `PORT`:当前前台服务的起始端口,默认 `3456`。 +- `SKILLMANAGER_NO_OPEN=1`:启动时不自动打开系统浏览器。 +- `SKILLMANAGER_EXTRA_PATHS`:额外扫描目录;兼容旧名 `SKILL_HUB_EXTRA_PATHS`。 +- `SKILLMANAGER_FIXTURE_ROOT`:测试专用的虚拟用户目录,必须是绝对路径。 +- `SKILLMANAGER_DATA_DIR`:显式数据目录,必须是绝对路径。 +- `SKILLMANAGER_PROJECT_ROOT`:显式当前项目目录,必须是绝对路径。 + +不要把服务暴露到 `0.0.0.0`,也不要提交 GitHub token、Skill 私有内容或本地数据目录。 + +## 构建与发布物 -- `PORT` — 自定义起始端口(默认 3456;占用时自动向上尝试到 3460) -- `SKILL_HUB_NO_OPEN=1` — 启动时不自动打开浏览器 -- `SKILL_HUB_EXTRA_PATHS` — 额外的扫描路径,冒号或逗号分隔 +`dist/` 和 `release/*.tgz` 都是生成物,不进入源码版本控制。`npm pack` 会先执行严格构建,并在 `dist/build-manifest.json` 写入包版本、Git commit、源码树哈希与每个产物哈希,避免源码、构建物和安装包漂移。 -## 目录结构 +## 目录 -- `server/` — Fastify 后端(API + WebSocket + 文件监听 + 扫描器) -- `web/` — React + Vite + Tailwind 前端(含 ErrorBoundary) -- `bin/` — CLI 入口与首次安装构建脚本 +- `server/`:扫描、诊断、版本、回收站、同步与本地 API。 +- `web/`:React + Vite + Tailwind 工作台。 +- `bin/`:CLI 入口。 +- `scripts/`:测试、构建 manifest、依赖审计和打包验证。 +- `tests/`:单元与隔离文件系统集成测试。 -## 许可 +## License -MIT +[MIT](LICENSE) diff --git a/bin/cli.js b/bin/cli.js index f085578..b94990f 100755 --- a/bin/cli.js +++ b/bin/cli.js @@ -10,7 +10,7 @@ const pkgRoot = path.resolve(__dirname, '..') const serverEntry = path.join(pkgRoot, 'dist', 'server', 'index.js') if (!fs.existsSync(serverEntry)) { - console.error('\x1b[31m[claude-skill-hub] Build output missing.\x1b[0m') + console.error('\x1b[31m[SkillManager] Build output missing.\x1b[0m') console.error('Expected:', serverEntry) console.error('Run `npm run build` in the package directory, or reinstall.') process.exit(1) diff --git a/bin/prepare.js b/bin/prepare.js index 54e34b5..577e361 100755 --- a/bin/prepare.js +++ b/bin/prepare.js @@ -15,14 +15,14 @@ if (fs.existsSync(built)) { } // Skip in CI/publish contexts where devDeps may be unavailable -if (process.env.SKILL_HUB_SKIP_BUILD === '1') { +if (process.env.SKILLMANAGER_SKIP_BUILD === '1' || process.env.SKILL_HUB_SKIP_BUILD === '1') { process.exit(0) } -console.log('[claude-skill-hub] Building frontend and server (first run)...') +console.log('[SkillManager] Building frontend and server (first run)...') try { execSync('npm run build', { cwd: root, stdio: 'inherit' }) } catch (err) { - console.error('[claude-skill-hub] Build failed:', err.message) + console.error('[SkillManager] Build failed:', err.message) process.exit(1) } diff --git a/dist/server/index.js b/dist/server/index.js deleted file mode 100644 index f4ca7dd..0000000 --- a/dist/server/index.js +++ /dev/null @@ -1,163 +0,0 @@ -import Fastify from 'fastify'; -import cors from '@fastify/cors'; -import websocket from '@fastify/websocket'; -import fastifyStatic from '@fastify/static'; -import path from 'path'; -import { fileURLToPath } from 'url'; -import fs from 'fs'; -import { skillRoutes } from './routes/skills.js'; -import { manageRoutes } from './routes/manage.js'; -import { versionRoutes } from './routes/versions.js'; -import { similarityRoutes } from './routes/similarity.js'; -import { trashRoutes } from './routes/trash.js'; -import { syncRoutes } from './routes/sync.js'; -import { startWatcher } from './scanner/watcher.js'; -import { invalidateCache } from './routes/skills.js'; -import { fullScan } from './scanner/discovery.js'; -import { purgeExpired as purgeExpiredTrash } from './trash/store.js'; -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); -const app = Fastify({ logger: false }); -await app.register(cors, { origin: true }); -await app.register(websocket); -await app.register(skillRoutes); -await app.register(manageRoutes); -await app.register(versionRoutes); -await app.register(similarityRoutes); -await app.register(trashRoutes); -await app.register(syncRoutes); -// Health check -app.get('/api/health', async () => ({ status: 'ok' })); -// WebSocket for real-time updates -const wsClients = new Set(); -app.register(async function (fastify) { - fastify.get('/ws', { websocket: true }, (socket) => { - wsClients.add(socket); - socket.on('close', () => wsClients.delete(socket)); - }); -}); -function broadcast(data) { - const msg = JSON.stringify(data); - for (const ws of wsClients) { - if (ws.readyState === 1) { - ws.send(msg); - } - } -} -// Start file watcher -let debounceTimer = null; -startWatcher((event) => { - if (debounceTimer) - clearTimeout(debounceTimer); - debounceTimer = setTimeout(() => { - invalidateCache(); - broadcast({ type: 'change', event }); - }, 500); -}); -// Serve built frontend static files (production mode) -// Try several possible locations for the dist/web directory. Must check both -// index.html AND assets/ so we don't accidentally pick the source web/ dir in -// dev mode — the source index.html references /src/main.tsx which only works -// under vite, and serving it from fastify leaves the page blank. -const candidates = [ - path.resolve(__dirname, '../web'), // dist/server/ → dist/web/ (production layout) - path.resolve(__dirname, '../../dist/web'), // server/ (dev) → project/dist/web/ - path.resolve(process.cwd(), 'dist/web'), // cwd/dist/web/ -]; -const staticRoot = candidates.find((p) => { - try { - return (fs.existsSync(path.join(p, 'index.html')) && - fs.existsSync(path.join(p, 'assets'))); - } - catch { - return false; - } -}); -if (staticRoot) { - await app.register(fastifyStatic, { - root: staticRoot, - prefix: '/', - wildcard: false, - }); - // SPA fallback: any non-/api, non-/ws route → serve index.html - app.setNotFoundHandler((req, reply) => { - if (req.url.startsWith('/api') || req.url.startsWith('/ws')) { - reply.status(404).send({ error: 'Not found' }); - return; - } - reply.sendFile('index.html'); - }); -} -// Startup self-check: warn loudly if frontend is missing -if (!staticRoot) { - console.warn('\n\x1b[33m⚠️ Frontend build not found. Running in API-only mode.\x1b[0m'); - console.warn(' Looked in:\n - ' + candidates.join('\n - ')); - console.warn(' Run `npm run build` in the package directory.\n'); -} -// Try a range of ports on EADDRINUSE so a stale process doesn't brick startup. -async function listenWithRetry(startPort) { - const maxAttempts = 5; - for (let i = 0; i < maxAttempts; i++) { - const port = startPort + i; - try { - await app.listen({ port, host: '127.0.0.1' }); - return port; - } - catch (err) { - if (err?.code === 'EADDRINUSE' && i < maxAttempts - 1) { - console.warn(`\x1b[33m⚠️ Port ${port} in use, trying ${port + 1}...\x1b[0m`); - continue; - } - throw err; - } - } - throw new Error(`All ports ${startPort}-${startPort + maxAttempts - 1} in use`); -} -const basePort = parseInt(process.env.PORT || '3456'); -try { - const actualPort = await listenWithRetry(basePort); - const url = `http://localhost:${actualPort}`; - // Purge expired trash entries on startup (best-effort, non-blocking failures) - try { - const removed = await purgeExpiredTrash(); - if (removed > 0) { - console.log(`\x1b[90m🗑 Purged ${removed} expired trash entr${removed === 1 ? 'y' : 'ies'}\x1b[0m`); - } - } - catch { } - // Run an initial scan so the banner shows real numbers - let scanSummary = ''; - try { - const result = await fullScan(); - const paths = result.scannedPaths; - const foundPaths = paths.filter((p) => p.count > 0); - scanSummary = - `\x1b[32m✅ Found ${result.stats.total} skills\x1b[0m ` + - `(${foundPaths.length}/${paths.length} locations, ${result.durationMs}ms)`; - if (result.stats.total === 0) { - scanSummary += '\n\x1b[33m⚠️ No skills found. Run `curl ' + url + '/api/debug` to see scanned paths.\x1b[0m'; - } - } - catch (e) { - scanSummary = `\x1b[31m❌ Initial scan failed: ${e?.message || e}\x1b[0m`; - } - console.log(`\n🚀 Claude Skill Hub running at \x1b[36m${url}\x1b[0m`); - if (staticRoot) { - console.log(`🌐 Web UI: \x1b[36m${url}\x1b[0m`); - } - console.log(`🔍 Debug: \x1b[36m${url}/api/debug\x1b[0m`); - console.log(scanSummary); - console.log(`👀 File watcher active`); - console.log(`\x1b[90m💡 下次启动直接敲: \x1b[0m\x1b[36mskill-hub\x1b[0m\x1b[90m (或访问 ${url})\x1b[0m\n`); - if (staticRoot && process.env.SKILL_HUB_NO_OPEN !== '1') { - const { exec } = await import('child_process'); - const cmd = process.platform === 'darwin' ? 'open' - : process.platform === 'win32' ? 'start' - : 'xdg-open'; - exec(`${cmd} ${url}`, () => { }); - } -} -catch (err) { - console.error('\x1b[31m❌ Failed to start server:\x1b[0m', err); - process.exit(1); -} diff --git a/dist/server/routes/manage.js b/dist/server/routes/manage.js deleted file mode 100644 index e04c0e5..0000000 --- a/dist/server/routes/manage.js +++ /dev/null @@ -1,205 +0,0 @@ -import fs from 'fs/promises'; -import path from 'path'; -import os from 'os'; -import { invalidateCache } from './skills.js'; -import { createSnapshot } from '../versioning/store.js'; -import { moveToTrash } from '../trash/store.js'; -const homedir = os.homedir(); -const settingsPath = path.join(homedir, '.claude', 'settings.json'); -async function readSettings() { - try { - const raw = await fs.readFile(settingsPath, 'utf-8'); - return JSON.parse(raw); - } - catch { - return {}; - } -} -async function writeSettings(settings) { - await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2), 'utf-8'); -} -export async function manageRoutes(app) { - // Toggle skill enabled/disabled - app.put('/api/skills/:id/toggle', async (req) => { - const { enabled, skillName } = req.body; - const settings = await readSettings(); - if (!settings.permissions) - settings.permissions = {}; - if (!settings.permissions.deny) - settings.permissions.deny = []; - const rule = `Skill(${skillName})`; - const idx = settings.permissions.deny.indexOf(rule); - if (enabled && idx >= 0) { - // Remove from deny list to enable - settings.permissions.deny.splice(idx, 1); - } - else if (!enabled && idx < 0) { - // Add to deny list to disable - settings.permissions.deny.push(rule); - } - await writeSettings(settings); - invalidateCache(); - return { ok: true, enabled }; - }); - // Update SKILL.md content - app.put('/api/skills/:id/content', async (req) => { - const { realPath, content } = req.body; - const skillMdPath = path.join(realPath, 'SKILL.md'); - // Verify the file exists - try { - await fs.access(skillMdPath); - } - catch { - return { ok: false, error: 'SKILL.md not found' }; - } - // Auto-snapshot before overwriting (save the old version) - const skillName = path.basename(realPath); - try { - await createSnapshot(realPath, skillName, '编辑前自动备份', 'auto'); - } - catch { } - await fs.writeFile(skillMdPath, content, 'utf-8'); - // Snapshot the new version - try { - await createSnapshot(realPath, skillName, '通过编辑器保存', 'auto'); - } - catch { } - invalidateCache(); - return { ok: true }; - }); - // Copy skill to another location - app.post('/api/skills/copy', async (req) => { - const { sourcePath, targetScope, projectPath, skillName } = req.body; - let targetDir; - if (targetScope === 'global') { - targetDir = path.join(homedir, '.claude', 'skills', skillName); - } - else if (projectPath) { - targetDir = path.join(projectPath, '.claude', 'skills', skillName); - } - else { - return { ok: false, error: 'Project path required for project scope' }; - } - // Resolve source if symlink - let realSource; - try { - realSource = await fs.realpath(sourcePath); - } - catch { - realSource = sourcePath; - } - // Check if target already exists - try { - await fs.access(targetDir); - return { ok: false, error: '目标位置已存在同名 Skill' }; - } - catch { - // Good — doesn't exist - } - // Copy directory recursively - await copyDir(realSource, targetDir); - invalidateCache(); - return { ok: true, targetDir }; - }); - // Move skill (copy + delete source) - app.post('/api/skills/move', async (req) => { - const { sourcePath, targetScope, projectPath, skillName } = req.body; - let targetDir; - if (targetScope === 'global') { - targetDir = path.join(homedir, '.claude', 'skills', skillName); - } - else if (projectPath) { - targetDir = path.join(projectPath, '.claude', 'skills', skillName); - } - else { - return { ok: false, error: 'Project path required for project scope' }; - } - let realSource; - try { - realSource = await fs.realpath(sourcePath); - } - catch { - realSource = sourcePath; - } - try { - await fs.access(targetDir); - return { ok: false, error: '目标位置已存在同名 Skill' }; - } - catch { } - await copyDir(realSource, targetDir); - // Remove the source (if symlink, just remove the link; if dir, remove recursively) - const stat = await fs.lstat(sourcePath); - if (stat.isSymbolicLink()) { - await fs.unlink(sourcePath); - } - else { - await fs.rm(sourcePath, { recursive: true }); - } - invalidateCache(); - return { ok: true, targetDir }; - }); - // Delete skill (soft delete → recycle bin; 7-day TTL) - app.delete('/api/skills/:id', async (req, reply) => { - const skillPath = req.body.path; - const skillName = req.body.skillName; - try { - const meta = await moveToTrash(skillPath, skillName); - invalidateCache(); - return { ok: true, trashId: meta.id, expiresAt: meta.expiresAt }; - } - catch (err) { - reply.status(500); - return { ok: false, error: err?.message || '删除失败' }; - } - }); - // Batch delete — move many skills to trash in one call - app.post('/api/skills/batch/delete', async (req, reply) => { - const items = Array.isArray(req.body?.items) ? req.body.items : []; - if (items.length === 0) { - reply.status(400); - return { ok: false, error: '未提供要删除的 skill' }; - } - const results = []; - for (const item of items) { - if (!item || typeof item.path !== 'string') { - results.push({ id: item?.id || '(unknown)', ok: false, error: '参数不完整' }); - continue; - } - try { - const meta = await moveToTrash(item.path, item.skillName); - results.push({ - id: item.id, - skillName: item.skillName, - ok: true, - trashId: meta.id, - }); - } - catch (err) { - results.push({ - id: item.id, - skillName: item.skillName, - ok: false, - error: err?.message || '删除失败', - }); - } - } - invalidateCache(); - const okCount = results.filter((r) => r.ok).length; - const failCount = results.length - okCount; - return { ok: failCount === 0, okCount, failCount, results }; - }); -} -async function copyDir(src, dest) { - await fs.mkdir(dest, { recursive: true }); - const entries = await fs.readdir(src, { withFileTypes: true }); - for (const entry of entries) { - const srcPath = path.join(src, entry.name); - const destPath = path.join(dest, entry.name); - if (entry.isDirectory()) { - await copyDir(srcPath, destPath); - } - else { - await fs.copyFile(srcPath, destPath); - } - } -} diff --git a/dist/server/routes/similarity.js b/dist/server/routes/similarity.js deleted file mode 100644 index c55528b..0000000 --- a/dist/server/routes/similarity.js +++ /dev/null @@ -1,69 +0,0 @@ -import fs from 'fs/promises'; -import path from 'path'; -import os from 'os'; -import { detectSimilarSkills } from '../scanner/similarity.js'; -import { getCachedResult } from './skills.js'; -import { fullScan } from '../scanner/discovery.js'; -const STORE_DIR = path.join(os.homedir(), '.claude', 'skill-hub'); -const IGNORED_FILE = path.join(STORE_DIR, 'ignored-pairs.json'); -async function loadIgnored() { - try { - const raw = await fs.readFile(IGNORED_FILE, 'utf-8'); - const parsed = JSON.parse(raw); - return Array.isArray(parsed) ? parsed : []; - } - catch { - return []; - } -} -async function saveIgnored(list) { - await fs.mkdir(STORE_DIR, { recursive: true }); - await fs.writeFile(IGNORED_FILE, JSON.stringify(list, null, 2), 'utf-8'); -} -export async function similarityRoutes(app) { - app.get('/api/similar', async (req) => { - let result = getCachedResult(); - if (!result) - result = await fullScan(); - const ignored = await loadIgnored(); - const threshold = req.query.threshold ? parseFloat(req.query.threshold) : 0.25; - const groups = detectSimilarSkills(result.skills, { - threshold, - ignoredPairs: ignored.map((p) => [p.a, p.b]), - }); - return { - threshold, - ignoredCount: ignored.length, - groups, - }; - }); - app.post('/api/similar/ignore', async (req, reply) => { - const { a, b } = req.body || {}; - if (!a || !b) { - return reply.status(400).send({ error: 'Missing skill ids (a, b)' }); - } - const list = await loadIgnored(); - // Normalize so (a,b) and (b,a) are the same record - const [x, y] = a < b ? [a, b] : [b, a]; - if (!list.some((p) => p.a === x && p.b === y)) { - list.push({ a: x, b: y, ignoredAt: new Date().toISOString() }); - await saveIgnored(list); - } - return { ok: true, ignoredCount: list.length }; - }); - app.post('/api/similar/unignore', async (req, reply) => { - const { a, b } = req.body || {}; - if (!a || !b) { - return reply.status(400).send({ error: 'Missing skill ids (a, b)' }); - } - const list = await loadIgnored(); - const [x, y] = a < b ? [a, b] : [b, a]; - const next = list.filter((p) => !(p.a === x && p.b === y)); - if (next.length !== list.length) - await saveIgnored(next); - return { ok: true, ignoredCount: next.length }; - }); - app.get('/api/similar/ignored', async () => { - return { ignored: await loadIgnored() }; - }); -} diff --git a/dist/server/routes/skills.js b/dist/server/routes/skills.js deleted file mode 100644 index ab7a963..0000000 --- a/dist/server/routes/skills.js +++ /dev/null @@ -1,99 +0,0 @@ -import os from 'os'; -import { fullScan } from '../scanner/discovery.js'; -import { AGENTS } from '../scanner/agents.js'; -let cachedResult = null; -export function getCachedResult() { - return cachedResult; -} -export async function skillRoutes(app) { - // Trigger full scan - app.get('/api/scan', async () => { - cachedResult = await fullScan(); - return cachedResult; - }); - // Get all skills (with optional filters) - app.get('/api/skills', async (req) => { - if (!cachedResult) { - cachedResult = await fullScan(); - } - let skills = [...cachedResult.skills]; - const { scope, source, agent, search } = req.query; - if (scope && scope !== 'all') { - skills = skills.filter((s) => s.scope === scope); - } - if (source && source !== 'all') { - skills = skills.filter((s) => s.source === source); - } - if (agent && agent !== 'all') { - skills = skills.filter((s) => s.agent === agent); - } - if (search) { - const q = search.toLowerCase(); - skills = skills.filter((s) => s.name.toLowerCase().includes(q) || - s.description.toLowerCase().includes(q)); - } - return { skills, stats: cachedResult.stats }; - }); - // Get single skill detail - app.get('/api/skills/:id', async (req, reply) => { - if (!cachedResult) { - cachedResult = await fullScan(); - } - const skill = cachedResult.skills.find((s) => s.id === req.params.id); - if (!skill) { - return reply.status(404).send({ error: 'Skill not found' }); - } - return skill; - }); - // Get the agent registry (id/name/icon) — used by the frontend filter UI - app.get('/api/agents', async () => { - return AGENTS.map((a) => ({ id: a.id, name: a.name, icon: a.icon })); - }); - // Get discovered projects - app.get('/api/projects', async () => { - if (!cachedResult) { - cachedResult = await fullScan(); - } - return cachedResult.projects; - }); - // Get conflicts - app.get('/api/conflicts', async () => { - if (!cachedResult) { - cachedResult = await fullScan(); - } - return cachedResult.conflicts; - }); - // Get stats - app.get('/api/stats', async () => { - if (!cachedResult) { - cachedResult = await fullScan(); - } - return cachedResult.stats; - }); - // Diagnostic endpoint — useful for debugging "only found 1 skill" reports - app.get('/api/debug', async () => { - if (!cachedResult) { - cachedResult = await fullScan(); - } - return { - version: '0.3.0', - node: process.version, - platform: process.platform, - cwd: process.cwd(), - homedir: os.homedir(), - env: { - SKILL_HUB_EXTRA_PATHS: process.env.SKILL_HUB_EXTRA_PATHS || null, - PORT: process.env.PORT || null, - }, - scan: { - durationMs: cachedResult.durationMs, - totalSkills: cachedResult.stats.total, - scannedPaths: cachedResult.scannedPaths, - }, - stats: cachedResult.stats, - }; - }); -} -export function invalidateCache() { - cachedResult = null; -} diff --git a/dist/server/routes/trash.js b/dist/server/routes/trash.js deleted file mode 100644 index 95ba95c..0000000 --- a/dist/server/routes/trash.js +++ /dev/null @@ -1,41 +0,0 @@ -import { listTrash, restoreFromTrash, purgeOne, purgeExpired, TrashConflictError, TrashNotFoundError, } from '../trash/store.js'; -import { invalidateCache } from './skills.js'; -export async function trashRoutes(app) { - // List trash entries (also purges expired as a side effect) - app.get('/api/trash', async () => { - const items = await listTrash(); - return { ok: true, items }; - }); - // Restore a trash entry back to its original location - app.post('/api/trash/:id/restore', async (req, reply) => { - const { id } = req.params; - const force = req.query.force === 'true' || req.query.force === '1'; - try { - const meta = await restoreFromTrash(id, force); - invalidateCache(); - return { ok: true, meta }; - } - catch (err) { - if (err instanceof TrashConflictError) { - reply.status(409); - return { ok: false, error: err.message, code: 'CONFLICT', targetPath: err.targetPath }; - } - if (err instanceof TrashNotFoundError) { - reply.status(404); - return { ok: false, error: err.message, code: 'NOT_FOUND' }; - } - reply.status(500); - return { ok: false, error: err?.message || '还原失败' }; - } - }); - // Permanently delete a single trash entry - app.delete('/api/trash/:id', async (req) => { - const ok = await purgeOne(req.params.id); - return { ok }; - }); - // Manual purge of expired entries - app.post('/api/trash/purge-expired', async () => { - const removed = await purgeExpired(); - return { ok: true, removed }; - }); -} diff --git a/dist/server/routes/versions.js b/dist/server/routes/versions.js deleted file mode 100644 index 9a8ce28..0000000 --- a/dist/server/routes/versions.js +++ /dev/null @@ -1,60 +0,0 @@ -import { createSnapshot, getHistory, getVersion, diffVersions, diffWithCurrent, rollback, deleteVersion, } from '../versioning/store.js'; -import { invalidateCache } from './skills.js'; -export async function versionRoutes(app) { - // 创建快照 - app.post('/api/versions/snapshot', async (req) => { - const { skillPath, skillName, message } = req.body; - try { - const meta = await createSnapshot(skillPath, skillName, message, 'manual'); - return { ok: true, version: meta }; - } - catch (e) { - return { ok: false, error: e.message }; - } - }); - // 获取版本历史 - app.get('/api/versions/history', async (req) => { - const { skillPath } = req.query; - const history = await getHistory(skillPath); - return { history }; - }); - // 获取某个版本的完整内容 - app.get('/api/versions/detail', async (req) => { - const { skillPath, versionId } = req.query; - const version = await getVersion(skillPath, versionId); - if (!version) - return { ok: false, error: 'Version not found' }; - return { ok: true, version }; - }); - // 对比两个版本 - app.get('/api/versions/diff', async (req) => { - const { skillPath, oldId, newId } = req.query; - const diff = await diffVersions(skillPath, oldId, newId); - if (!diff) - return { ok: false, error: 'Diff failed' }; - return { ok: true, diff }; - }); - // 对比某个版本和当前文件 - app.get('/api/versions/diff-current', async (req) => { - const { skillPath, versionId } = req.query; - const diff = await diffWithCurrent(skillPath, versionId); - if (!diff) - return { ok: false, error: 'Diff failed' }; - return { ok: true, diff }; - }); - // 回滚到指定版本 - app.post('/api/versions/rollback', async (req) => { - const { skillPath, versionId } = req.body; - const success = await rollback(skillPath, versionId); - if (!success) - return { ok: false, error: 'Rollback failed' }; - invalidateCache(); - return { ok: true }; - }); - // 删除版本 - app.delete('/api/versions', async (req) => { - const { skillPath, versionId } = req.query; - const success = await deleteVersion(skillPath, versionId); - return { ok: success }; - }); -} diff --git a/dist/server/scanner/discovery.js b/dist/server/scanner/discovery.js deleted file mode 100644 index 182c807..0000000 --- a/dist/server/scanner/discovery.js +++ /dev/null @@ -1,421 +0,0 @@ -import fs from 'fs/promises'; -import path from 'path'; -import os from 'os'; -import crypto from 'crypto'; -import { parseSkillMd, listSkillFiles, getSkillMdPath } from './parser.js'; -import { resolveSymlink, identifySource } from './symlink.js'; -import { AGENTS, allAgentGlobalAbsPaths, allAgentProjectRelPaths, isValidAgentId, } from './agents.js'; -const homedir = os.homedir(); -function makeId(p) { - return crypto.createHash('md5').update(p).digest('hex').slice(0, 12); -} -/** - * YAML frontmatter can legitimately parse `name` / `description` / `model` - * fields as non-string values (numbers, booleans, objects, arrays). If we let - * those through, React renders them and throws error #31. Force-coerce every - * value that the UI is going to render. - */ -function toSafeString(v) { - if (v == null) - return ''; - if (typeof v === 'string') - return v; - if (typeof v === 'number' || typeof v === 'boolean') - return String(v); - if (Array.isArray(v)) - return v.map(toSafeString).join(', '); - if (typeof v === 'object') { - try { - return JSON.stringify(v); - } - catch { - return '[object]'; - } - } - return String(v); -} -function sanitizeFrontmatter(fm) { - const out = {}; - for (const [k, v] of Object.entries(fm)) { - // Keep arrays/objects as-is for fields the UI treats as data (e.g. `paths`), - // but coerce the ones we know get rendered as plain text. - if (k === 'name' || k === 'description' || k === 'model' || k === 'effort' || k === 'agent' || k === 'context') { - out[k] = toSafeString(v); - } - else { - out[k] = v; - } - } - return out; -} -async function dirExists(p) { - try { - const s = await fs.stat(p); - return s.isDirectory(); - } - catch { - return false; - } -} -async function scanSkillDir(skillDir, scope, agent, projectName, projectPath, disabledSkills) { - const skills = []; - let entries; - try { - entries = await fs.readdir(skillDir, { withFileTypes: true }); - } - catch { - return skills; - } - for (const entry of entries) { - const entryPath = path.join(skillDir, entry.name); - const symlinkInfo = await resolveSymlink(entryPath); - const realPath = symlinkInfo.realPath; - let isDir = false; - try { - const stat = await fs.stat(realPath); - isDir = stat.isDirectory(); - } - catch { - continue; - } - if (!isDir) - continue; - const skillMdPath = getSkillMdPath(realPath); - let skillMdExists = false; - try { - await fs.access(skillMdPath); - skillMdExists = true; - } - catch { } - if (!skillMdExists) { - const files = await listSkillFiles(realPath); - if (files.length === 0) - continue; - } - let frontmatter = {}; - let content = ''; - let rawContent = ''; - if (skillMdExists) { - try { - const parsed = await parseSkillMd(skillMdPath); - frontmatter = parsed.frontmatter; - content = parsed.content; - rawContent = parsed.rawContent; - } - catch { } - } - const files = await listSkillFiles(realPath); - const source = symlinkInfo.isSymlink - ? identifySource(realPath, homedir) - : 'local'; - let lastModified = new Date().toISOString(); - try { - const stat = await fs.stat(skillMdExists ? skillMdPath : realPath); - lastModified = stat.mtime.toISOString(); - } - catch { } - const safeFrontmatter = sanitizeFrontmatter(frontmatter); - const skillName = toSafeString(safeFrontmatter.name) || entry.name; - const description = toSafeString(safeFrontmatter.description); - // Frontmatter `agent:` overrides the path-based guess when it's a known id. - const fmAgent = toSafeString(safeFrontmatter.agent).toLowerCase().trim(); - const resolvedAgent = fmAgent && isValidAgentId(fmAgent) ? fmAgent : agent; - skills.push({ - id: makeId(entryPath), - name: skillName, - description, - scope, - agent: resolvedAgent, - source, - path: entryPath, - realPath, - symlinkTarget: symlinkInfo.isSymlink ? symlinkInfo.target : undefined, - projectName, - projectPath, - frontmatter: safeFrontmatter, - content: toSafeString(rawContent || content), - files, - enabled: disabledSkills ? !disabledSkills.has(skillName) : true, - hasConflict: false, - lastModified, - }); - } - return skills; -} -async function getDisabledSkills() { - const disabled = new Set(); - const settingsPath = path.join(homedir, '.claude', 'settings.json'); - try { - const raw = await fs.readFile(settingsPath, 'utf-8'); - const settings = JSON.parse(raw); - const deny = settings?.permissions?.deny || []; - for (const rule of deny) { - const match = rule.match(/^Skill\((.+)\)$/); - if (match) - disabled.add(match[1]); - } - } - catch { } - return disabled; -} -async function hasAnyAgentSkills(projectRoot) { - for (const rel of allAgentProjectRelPaths()) { - if (await dirExists(path.join(projectRoot, rel))) - return true; - } - return false; -} -async function discoverProjects() { - const projects = []; - // 1. ~/.claude/projects/ (mangled path dirs — Claude tracks projects it's been opened in) - const projectsDir = path.join(homedir, '.claude', 'projects'); - try { - const entries = await fs.readdir(projectsDir, { withFileTypes: true }); - for (const entry of entries) { - if (!entry.isDirectory()) - continue; - const projectPath = entry.name.replace(/^-/, '/').replace(/-/g, '/'); - if (await dirExists(projectPath)) { - if (projectPath === homedir) - continue; - if (await hasAnyAgentSkills(projectPath)) { - projects.push({ - name: path.basename(projectPath), - path: projectPath, - }); - } - } - } - } - catch { } - // 2. Common project root dirs — expanded list - const commonDirs = [ - path.join(homedir, 'Documents'), - path.join(homedir, 'Projects'), - path.join(homedir, 'Developer'), - path.join(homedir, 'Code'), - path.join(homedir, 'code'), - path.join(homedir, 'workspace'), - path.join(homedir, 'dev'), - path.join(homedir, 'Dev'), - path.join(homedir, 'work'), - path.join(homedir, 'repos'), - path.join(homedir, 'src'), - ]; - for (const dir of commonDirs) { - try { - const entries = await fs.readdir(dir, { withFileTypes: true }); - for (const entry of entries) { - if (!entry.isDirectory()) - continue; - const projectPath = path.join(dir, entry.name); - if (await hasAnyAgentSkills(projectPath)) { - if (!projects.some((p) => p.path === projectPath)) { - projects.push({ name: entry.name, path: projectPath }); - } - } - } - } - catch { } - } - // 3. CWD + walk up 3 levels — skip the user's home directory, whose - // `.claude/skills/` etc. are the *global* paths, not project paths. - // Running `skill-hub` from home otherwise causes every global skill to - // be double-counted as "lhc (cwd)/" in the scan report. - let cwd = process.cwd(); - for (let i = 0; i < 4; i++) { - if (cwd !== homedir && (await hasAnyAgentSkills(cwd))) { - if (!projects.some((p) => p.path === cwd)) { - projects.push({ name: path.basename(cwd) + ' (cwd)', path: cwd }); - } - } - const parent = path.dirname(cwd); - if (parent === cwd) - break; - cwd = parent; - } - return projects; -} -/** - * Find every `skills/` directory that belongs to a plugin the user has - * actually enabled. - * - * Claude Code tracks enabled plugins in ~/.claude/plugins/config.json under - * `repositories`. Anything living only under ~/.claude/plugins/marketplaces/ - * is a *candidate* from a marketplace — Claude Code does not load those, they - * are just the source catalog. Earlier versions of this scanner walked the - * entire plugins/ tree and reported those candidates as installed plugin - * skills, which was very confusing for users who had never enabled a plugin. - */ -async function discoverPluginSkillDirs() { - const result = []; - const pluginsRoot = path.join(homedir, '.claude', 'plugins'); - const configPath = path.join(pluginsRoot, 'config.json'); - // Extract installLocation of every enabled plugin. - const installLocations = []; - try { - const raw = await fs.readFile(configPath, 'utf-8'); - const config = JSON.parse(raw); - const repos = config?.repositories || {}; - for (const meta of Object.values(repos)) { - if (meta && typeof meta === 'object') { - const loc = meta.installLocation; - if (typeof loc === 'string' && loc.length > 0) { - installLocations.push(loc); - } - } - } - } - catch { } - // No plugins enabled → nothing to scan. Skip the marketplace catalog entirely. - if (installLocations.length === 0) - return result; - async function walk(dir, depth) { - if (depth > 4) - return; - let entries; - try { - entries = await fs.readdir(dir, { withFileTypes: true }); - } - catch { - return; - } - for (const entry of entries) { - if (!entry.isDirectory()) - continue; - if (entry.name === 'node_modules' || entry.name.startsWith('.git')) - continue; - const sub = path.join(dir, entry.name); - if (entry.name === 'skills') { - result.push(sub); - continue; - } - await walk(sub, depth + 1); - } - } - // Only walk inside each enabled plugin's install location, not the whole - // plugins/ tree. - for (const loc of installLocations) { - if (await dirExists(loc)) { - await walk(loc, 0); - } - } - return result; -} -function detectConflicts(skills) { - const byName = new Map(); - for (const skill of skills) { - const existing = byName.get(skill.name) || []; - existing.push(skill); - byName.set(skill.name, existing); - } - const conflicts = []; - for (const [name, group] of byName) { - if (group.length > 1) { - group.forEach((s) => (s.hasConflict = true)); - conflicts.push({ name, skills: group }); - } - } - return conflicts; -} -function parseExtraPaths() { - const raw = process.env.SKILL_HUB_EXTRA_PATHS; - if (!raw) - return []; - return raw - .split(/[:,]/) - .map((p) => p.trim()) - .filter(Boolean) - .map((p) => (p.startsWith('~') ? path.join(homedir, p.slice(1)) : p)); -} -export async function fullScan() { - const start = Date.now(); - const disabledSkills = await getDisabledSkills(); - const allSkills = []; - const scannedPaths = []; - async function scanAndReport(label, dir, scope, agent, projectName, projectPath) { - const exists = await dirExists(dir); - if (!exists) { - scannedPaths.push({ label, path: dir, exists: false, count: 0 }); - return []; - } - try { - const skills = await scanSkillDir(dir, scope, agent, projectName, projectPath, disabledSkills); - scannedPaths.push({ label, path: dir, exists: true, count: skills.length }); - return skills; - } - catch (e) { - scannedPaths.push({ - label, - path: dir, - exists: true, - count: 0, - error: e?.message || String(e), - }); - return []; - } - } - // 1. Global skills — loop over every agent's global paths - for (const { agent, path: globalDir } of allAgentGlobalAbsPaths(homedir)) { - allSkills.push(...(await scanAndReport(`global:${agent.id}`, globalDir, 'global', agent.id))); - } - // 2. Plugin skills — Claude Code only for now - const pluginSkillDirs = await discoverPluginSkillDirs(); - for (const pluginDir of pluginSkillDirs) { - const pluginName = path.relative(path.join(homedir, '.claude', 'plugins'), pluginDir); - allSkills.push(...(await scanAndReport(`plugin:${pluginName}`, pluginDir, 'plugin', 'claude-code'))); - } - // 3. Project skills — for each project, scan every agent's project paths - const discoveredProjects = await discoverProjects(); - const projects = []; - for (const proj of discoveredProjects) { - let projectTotal = 0; - for (const agent of AGENTS) { - for (const rel of agent.projectPaths) { - const skillsDir = path.join(proj.path, rel); - const projectSkills = await scanAndReport(`project:${proj.name}:${agent.id}`, skillsDir, 'project', agent.id, proj.name, proj.path); - allSkills.push(...projectSkills); - projectTotal += projectSkills.length; - } - } - projects.push({ - name: proj.name, - path: proj.path, - skillCount: projectTotal, - }); - } - // 4. Extra paths from SKILL_HUB_EXTRA_PATHS — agent unknown - for (const extra of parseExtraPaths()) { - allSkills.push(...(await scanAndReport(`extra:${path.basename(extra)}`, extra, 'project', 'unknown'))); - } - // Deduplicate by realPath (symlinks can point to the same skill from multiple roots) - const seen = new Set(); - const dedupedSkills = []; - for (const s of allSkills) { - if (seen.has(s.realPath)) - continue; - seen.add(s.realPath); - dedupedSkills.push(s); - } - const conflicts = detectConflicts(dedupedSkills); - const bySource = {}; - const byAgent = {}; - for (const s of dedupedSkills) { - bySource[s.source] = (bySource[s.source] || 0) + 1; - byAgent[s.agent] = (byAgent[s.agent] || 0) + 1; - } - return { - skills: dedupedSkills, - projects, - conflicts, - stats: { - total: dedupedSkills.length, - global: dedupedSkills.filter((s) => s.scope === 'global').length, - project: dedupedSkills.filter((s) => s.scope === 'project').length, - bySource, - byAgent, - }, - scannedPaths, - durationMs: Date.now() - start, - }; -} diff --git a/dist/server/scanner/parser.js b/dist/server/scanner/parser.js deleted file mode 100644 index 7ca6d57..0000000 --- a/dist/server/scanner/parser.js +++ /dev/null @@ -1,26 +0,0 @@ -import fs from 'fs/promises'; -import path from 'path'; -import matter from 'gray-matter'; -export async function parseSkillMd(skillMdPath) { - const raw = await fs.readFile(skillMdPath, 'utf-8'); - const { data, content } = matter(raw); - return { - frontmatter: data, - content: content.trim(), - rawContent: raw, - }; -} -export async function listSkillFiles(skillDir) { - try { - const entries = await fs.readdir(skillDir, { withFileTypes: true }); - return entries - .filter((e) => e.isFile()) - .map((e) => e.name); - } - catch { - return []; - } -} -export function getSkillMdPath(skillDir) { - return path.join(skillDir, 'SKILL.md'); -} diff --git a/dist/server/scanner/similarity.js b/dist/server/scanner/similarity.js deleted file mode 100644 index 7b40f6a..0000000 --- a/dist/server/scanner/similarity.js +++ /dev/null @@ -1,227 +0,0 @@ -// Built-in synonyms — extend via ~/.claude/skill-hub/synonyms.json if needed. -const BUILTIN_SYNONYMS = { - 小红书: ['xhs', 'rednote', '种草', '小红薯', 'xiaohongshu'], - 视频: ['video', 'vlog', 'movie', 'mp4'], - 图片: ['image', 'img', 'picture', 'pic', 'photo'], - 飞书: ['lark', 'feishu'], - 公众号: ['wechat', 'mp', 'gzh', 'wx'], - 推特: ['twitter', 'x', 'tweet'], - 邮件: ['email', 'mail', 'gmail'], - 日报: ['daily', 'report', 'digest'], - 会议: ['meeting', 'minutes', '纪要'], - 文档: ['doc', 'document', 'markdown', 'md'], - 表格: ['sheet', 'spreadsheet', 'excel', 'xlsx', 'csv'], - 幻灯片: ['ppt', 'pptx', 'slide', 'presentation'], - 翻译: ['translate', 'translation', 'i18n'], - 生成: ['generate', 'create', 'make', '制作', '创建'], - 抓取: ['fetch', 'scrape', 'crawl', '爬取'], - 发布: ['publish', 'post', 'deploy', '推送'], - 分析: ['analyze', 'analysis', 'analytics', '拆解'], - 测试: ['test', 'testing', 'qa'], - 代码: ['code', 'coding', 'program'], - 设计: ['design', 'designer', 'ui'], - 人格: ['personality', 'mbti', 'sbti', 'persona'], - 访谈: ['interview', '采访'], - 发票: ['invoice', 'receipt', '收据'], -}; -// Stop words — too common to be useful as similarity signal. -const STOP_WORDS = new Set([ - // Chinese stop tokens - '使用', '当用', '用户', '提到', '触发', '支持', '需要', '可以', '自动', '一个', '这个', '进行', - '工具', '技能', '功能', '场景', '命令', '文件', '内容', '数据', '信息', '结果', - '或者', '按照', '根据', '然后', '基于', '提供', '我们', '所以', '因此', '以及', - // English stop tokens - 'skill', 'use', 'used', 'using', 'usage', 'when', 'user', 'users', 'the', 'and', 'for', 'with', - 'from', 'this', 'that', 'these', 'those', 'can', 'any', 'all', 'auto', 'support', 'supports', - 'tool', 'tools', 'create', 'creates', 'creating', 'generate', 'generates', 'make', 'makes', - 'do', 'does', 'get', 'gets', 'set', 'sets', 'should', 'would', 'could', 'will', 'want', - 'add', 'adds', 'added', 'adding', 'need', 'needs', 'needed', 'guidance', 'guide', 'guides', - 'help', 'helps', 'helper', 'ensure', 'allow', 'allows', 'asks', 'ask', 'asked', - 'mention', 'mentions', 'mentioned', 'provide', 'provides', 'provided', 'request', 'requests', - 'requested', 'include', 'includes', 'included', 'contains', 'content', 'text', 'task', - 'tasks', 'file', 'files', 'code', 'new', 'each', 'also', 'other', 'over', 'into', 'more', - 'most', 'some', 'such', 'than', 'only', 'very', 'like', 'just', 'between', 'based', - 'handle', 'handles', 'handled', 'process', 'processing', 'processed', 'system', 'systems', -]); -/** - * Normalize a raw token into its canonical form using the synonym table. - * Everything is lowercased; Chinese is left as-is. - */ -function buildSynonymIndex(synonyms) { - const index = new Map(); - for (const [canonical, aliases] of Object.entries(synonyms)) { - index.set(canonical.toLowerCase(), canonical.toLowerCase()); - for (const a of aliases) { - index.set(a.toLowerCase(), canonical.toLowerCase()); - } - } - return index; -} -/** - * Tokenize a string into a set of normalized tokens. - * - English: split on non-word; drop short/stopword - * - Chinese (CJK range): generate character bigrams so "小红书" contributes - * "小红" + "红书" tokens that can match against the "小红书" synonym key after merging. - * Also emit the full 3-gram when possible. - */ -export function tokenize(text, synonymIndex) { - const out = new Set(); - if (!text) - return out; - const lower = text.toLowerCase(); - // 1. English / ASCII words - const words = lower.match(/[a-z][a-z0-9_-]{1,}/g) || []; - for (const w of words) { - if (STOP_WORDS.has(w)) - continue; - if (w.length < 3) - continue; - out.add(synonymIndex.get(w) || w); - } - // 2. Chinese n-grams (bigram + trigram on CJK spans) - const cjkSpans = lower.match(/[\u4e00-\u9fff]+/g) || []; - for (const span of cjkSpans) { - // Try to match synonym keys first by sliding full length - for (const key of synonymIndex.keys()) { - if (/^[\u4e00-\u9fff]+$/.test(key) && span.includes(key)) { - out.add(synonymIndex.get(key)); - } - } - // Bigrams - for (let i = 0; i < span.length - 1; i++) { - const bg = span.slice(i, i + 2); - if (STOP_WORDS.has(bg)) - continue; - out.add(bg); - } - } - return out; -} -function jaccard(a, b) { - if (a.size === 0 || b.size === 0) - return 0; - let intersect = 0; - for (const x of a) - if (b.has(x)) - intersect++; - const union = a.size + b.size - intersect; - return union === 0 ? 0 : intersect / union; -} -/** - * Build a skill → signature token set, using name + description + frontmatter.keywords. - */ -function signatureFor(skill, synonymIndex) { - const parts = []; - parts.push(skill.name); - if (skill.description) - parts.push(skill.description); - const kw = skill.frontmatter?.keywords; - if (Array.isArray(kw)) - parts.push(kw.join(' ')); - return tokenize(parts.join(' '), synonymIndex); -} -/** - * Cluster skills into similarity groups via single-linkage clustering over - * pairs whose Jaccard similarity exceeds the threshold. - */ -export function detectSimilarSkills(skills, options = {}) { - const threshold = options.threshold ?? 0.25; - const synonyms = { ...BUILTIN_SYNONYMS, ...(options.extraSynonyms || {}) }; - const synonymIndex = buildSynonymIndex(synonyms); - const ignored = new Set(); - for (const [a, b] of options.ignoredPairs || []) { - ignored.add(a < b ? `${a}|${b}` : `${b}|${a}`); - } - // 1. Compute signatures - const sigs = new Map(); - for (const s of skills) { - sigs.set(s.id, signatureFor(s, synonymIndex)); - } - // 2. Collect pairs above threshold. Skip exact-name duplicates (already shown as conflicts). - const pairs = []; - for (let i = 0; i < skills.length; i++) { - for (let j = i + 1; j < skills.length; j++) { - const a = skills[i]; - const b = skills[j]; - if (a.name === b.name) - continue; // covered by conflict detection - const pairKey = a.id < b.id ? `${a.id}|${b.id}` : `${b.id}|${a.id}`; - if (ignored.has(pairKey)) - continue; - const sa = sigs.get(a.id); - const sb = sigs.get(b.id); - const score = jaccard(sa, sb); - if (score >= threshold) { - const shared = []; - for (const t of sa) - if (sb.has(t)) - shared.push(t); - pairs.push({ a, b, score, sharedTokens: shared }); - } - } - } - // 3. Union-Find to cluster via single linkage - const parent = new Map(); - const find = (x) => { - if (parent.get(x) !== x) - parent.set(x, find(parent.get(x))); - return parent.get(x); - }; - const union = (a, b) => { - const ra = find(a); - const rb = find(b); - if (ra !== rb) - parent.set(ra, rb); - }; - for (const s of skills) - parent.set(s.id, s.id); - for (const p of pairs) - union(p.a.id, p.b.id); - // 4. Gather clusters that have ≥ 2 members - const clusters = new Map(); - for (const s of skills) { - const r = find(s.id); - const arr = clusters.get(r) || []; - arr.push(s); - clusters.set(r, arr); - } - const groups = []; - for (const [rootId, members] of clusters) { - if (members.length < 2) - continue; - // Compute shared token intersection + avg similarity for display - const memberSigs = members.map((m) => sigs.get(m.id)); - let sharedTokens = new Set(memberSigs[0]); - for (let i = 1; i < memberSigs.length; i++) { - const next = new Set(); - for (const t of sharedTokens) - if (memberSigs[i].has(t)) - next.add(t); - sharedTokens = next; - } - // Avg of all pairwise similarities within the cluster - let sum = 0; - let count = 0; - for (let i = 0; i < members.length; i++) { - for (let j = i + 1; j < members.length; j++) { - sum += jaccard(memberSigs[i], memberSigs[j]); - count++; - } - } - const avg = count === 0 ? 0 : sum / count; - groups.push({ - id: rootId, - skills: members.sort((a, b) => a.name.localeCompare(b.name)), - sharedTokens: Array.from(sharedTokens).slice(0, 8), - averageSimilarity: Math.round(avg * 100) / 100, - }); - } - // Sort: highest similarity first, then largest group - groups.sort((x, y) => { - if (y.averageSimilarity !== x.averageSimilarity) { - return y.averageSimilarity - x.averageSimilarity; - } - return y.skills.length - x.skills.length; - }); - return groups; -} diff --git a/dist/server/scanner/symlink.js b/dist/server/scanner/symlink.js deleted file mode 100644 index 95e3048..0000000 --- a/dist/server/scanner/symlink.js +++ /dev/null @@ -1,24 +0,0 @@ -import fs from 'fs/promises'; -export async function resolveSymlink(filePath) { - try { - const stat = await fs.lstat(filePath); - if (stat.isSymbolicLink()) { - const target = await fs.readlink(filePath); - const realPath = await fs.realpath(filePath); - return { isSymlink: true, target, realPath }; - } - return { isSymlink: false, realPath: filePath }; - } - catch { - return { isSymlink: false, realPath: filePath }; - } -} -export function identifySource(realPath, homedir) { - if (realPath.includes('.newmax/skills')) - return 'newmax'; - if (realPath.includes('.agents/skills')) - return 'agents'; - if (realPath.startsWith(homedir)) - return 'local'; - return 'unknown'; -} diff --git a/dist/server/scanner/watcher.js b/dist/server/scanner/watcher.js deleted file mode 100644 index 11e02a7..0000000 --- a/dist/server/scanner/watcher.js +++ /dev/null @@ -1,45 +0,0 @@ -import chokidar from 'chokidar'; -import fs from 'fs'; -import path from 'path'; -import os from 'os'; -import { allAgentGlobalAbsPaths } from './agents.js'; -const homedir = os.homedir(); -let watcher = null; -export function startWatcher(callback) { - if (watcher) - return; - const watchPaths = [ - ...allAgentGlobalAbsPaths(homedir).map((x) => x.path), - path.join(homedir, '.newmax', 'skills'), - ]; - // Only watch paths that exist - const validPaths = watchPaths.filter((p) => { - try { - fs.statSync(p); - return true; - } - catch { - return false; - } - }); - if (validPaths.length === 0) - return; - watcher = chokidar.watch(validPaths, { - depth: 2, - ignoreInitial: true, - persistent: true, - followSymlinks: true, - }); - watcher - .on('add', (p) => callback({ type: 'add', path: p })) - .on('change', (p) => callback({ type: 'change', path: p })) - .on('unlink', (p) => callback({ type: 'unlink', path: p })) - .on('addDir', (p) => callback({ type: 'addDir', path: p })) - .on('unlinkDir', (p) => callback({ type: 'unlinkDir', path: p })); -} -export function stopWatcher() { - if (watcher) { - watcher.close(); - watcher = null; - } -} diff --git a/dist/server/trash/store.js b/dist/server/trash/store.js deleted file mode 100644 index 5adc1a4..0000000 --- a/dist/server/trash/store.js +++ /dev/null @@ -1,335 +0,0 @@ -/** - * Skill Trash (Recycle Bin) - * - * 设计:软删除 → ~/.skill-hub/trash// - * - 普通目录:整个 skill 目录被 rename 进 trash//payload/ - * - 符号链接:不搬运实际文件,只在 meta 里记录 target,还原时重建 symlink - * - meta: trash//.trash-meta.json - * - 过期策略:7 天 TTL,懒清理(列表接口和启动时触发 purge) - */ -import fs from 'fs/promises'; -import path from 'path'; -import os from 'os'; -import crypto from 'crypto'; -function trashRoot() { - // Read HOME lazily so tests can override process.env.HOME between calls. - const home = process.env.HOME || process.env.USERPROFILE || os.homedir(); - return path.join(home, '.skill-hub', 'trash'); -} -export const TRASH_TTL_MS = 7 * 24 * 60 * 60 * 1000; -function newId() { - const now = Date.now().toString(36); - const rand = crypto.randomBytes(4).toString('hex'); - return `${now}-${rand}`; -} -async function ensureRoot() { - await fs.mkdir(trashRoot(), { recursive: true }); -} -function entryDir(id) { - return path.join(trashRoot(), id); -} -function metaPath(id) { - return path.join(entryDir(id), '.trash-meta.json'); -} -function payloadPath(id) { - return path.join(entryDir(id), 'payload'); -} -/** - * Move a directory into the trash (or restore one back) with Windows-aware - * fallbacks. Node's `fs.rename` surfaces EPERM/EBUSY/EACCES on Windows any - * time the source directory contains a file held open by another process — - * Claude Code watching ~/.claude/skills/, OneDrive syncing, antivirus - * scanning, VS Code previewing. These locks are typically transient - * (< 1 second), so we retry with backoff, then fall back to a recursive - * copy + remove which only needs read access on the source and doesn't - * need exclusive handles. - * - * Error messages on final failure include a hint list so Windows users - * don't see a bare `EPERM` with no direction. - */ -const RETRYABLE_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']); -async function sleep(ms) { - return new Promise((r) => setTimeout(r, ms)); -} -function windowsHint() { - if (process.platform !== 'win32') - return ''; - return ('\n\n提示:Windows 上通常是文件被其他进程占用。常见原因:\n' + - ' 1. Claude Code / Codex / Cursor 客户端仍在运行 — 请在任务管理器里彻底退出\n' + - ' 2. VS Code 打开了这个 skill 的文件\n' + - ' 3. OneDrive / 坚果云 正在同步 — 请暂停同步后重试\n' + - ' 4. 360 / 火绒 / Windows Defender 正在扫描目录\n' + - ' 5. Windows Search 索引服务持有文件句柄\n' + - '关闭相关软件后再试一次;如果仍然失败,可以在资源管理器里手动删除。'); -} -async function renameWithFallback(src, dest) { - // Fast path: plain rename with retries for transient Windows locks. - const delays = [0, 80, 200, 450]; // ms; total ~730ms worst case - let lastErr = null; - for (let i = 0; i < delays.length; i++) { - if (delays[i] > 0) - await sleep(delays[i]); - try { - await fs.rename(src, dest); - return; - } - catch (err) { - lastErr = err; - if (err?.code === 'EXDEV') - break; // cross-device — skip retries, go straight to fallback - if (!RETRYABLE_RENAME_CODES.has(err?.code)) - throw err; - } - } - // Fallback: recursive copy + remove. Works across devices and doesn't - // need exclusive access to the source directory. - try { - await copyDir(src, dest); - } - catch (err) { - const base = lastErr?.message || err?.message || 'copy failed'; - throw new Error(`${base}${windowsHint()}`); - } - try { - // maxRetries lets fs.rm itself handle short-lived Windows locks during cleanup - await fs.rm(src, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 }); - } - catch (err) { - // Source copy succeeded but cleanup failed — surface a specific message so - // the user knows the file was copied (data is safe) but the original - // still exists and needs manual cleanup. - throw new Error(`文件已复制到回收站,但原路径清理失败: ${err?.message || err}\n` + - `源路径:${src}\n` + - `请在资源管理器里手动删除上面这个目录。${windowsHint()}`); - } -} -async function readMeta(id) { - try { - const raw = await fs.readFile(metaPath(id), 'utf-8'); - return JSON.parse(raw); - } - catch { - return null; - } -} -async function writeMeta(meta) { - await fs.writeFile(metaPath(meta.id), JSON.stringify(meta, null, 2), 'utf-8'); -} -async function dirSize(dir) { - let total = 0; - try { - const entries = await fs.readdir(dir, { withFileTypes: true }); - for (const e of entries) { - const full = path.join(dir, e.name); - if (e.isDirectory()) { - total += await dirSize(full); - } - else if (e.isFile()) { - try { - const st = await fs.stat(full); - total += st.size; - } - catch { } - } - } - } - catch { } - return total; -} -function inferScope(skillPath) { - const home = os.homedir(); - const globalRoot = path.join(home, '.claude', 'skills'); - if (skillPath.startsWith(globalRoot + path.sep) || skillPath === globalRoot) { - return { scope: 'global' }; - } - // Project skills live at /.claude/skills/ - const marker = path.sep + '.claude' + path.sep + 'skills' + path.sep; - const idx = skillPath.indexOf(marker); - if (idx >= 0) { - return { scope: 'project', projectPath: skillPath.slice(0, idx) }; - } - return { scope: 'unknown' }; -} -/** - * 将 skill 移入回收站。返回 trash 条目元信息。 - */ -export async function moveToTrash(skillPath, skillName) { - await ensureRoot(); - const stat = await fs.lstat(skillPath); - const id = newId(); - const dir = entryDir(id); - await fs.mkdir(dir, { recursive: true }); - const now = new Date(); - const expires = new Date(now.getTime() + TRASH_TTL_MS); - const { scope, projectPath } = inferScope(skillPath); - const name = skillName || path.basename(skillPath); - if (stat.isSymbolicLink()) { - const target = await fs.readlink(skillPath); - // 先写 meta,成功后再 unlink 原链接,避免中途失败丢信息 - const meta = { - id, - skillName: name, - originalPath: skillPath, - scope, - projectPath, - isSymlink: true, - symlinkTarget: target, - deletedAt: now.toISOString(), - expiresAt: expires.toISOString(), - }; - await writeMeta(meta); - await fs.unlink(skillPath); - return meta; - } - // 普通目录:rename 到 payload/。Windows 上需要重试 + cp 兜底(见 renameWithFallback) - const dest = payloadPath(id); - await renameWithFallback(skillPath, dest); - const size = await dirSize(dest).catch(() => 0); - const meta = { - id, - skillName: name, - originalPath: skillPath, - scope, - projectPath, - isSymlink: false, - deletedAt: now.toISOString(), - expiresAt: expires.toISOString(), - sizeBytes: size, - }; - await writeMeta(meta); - return meta; -} -/** - * 列出回收站条目(顺便触发过期清理) - */ -export async function listTrash() { - await ensureRoot(); - await purgeExpired(); - const entries = []; - let dirs = []; - try { - dirs = await fs.readdir(trashRoot()); - } - catch { - return entries; - } - const nowMs = Date.now(); - for (const id of dirs) { - const meta = await readMeta(id); - if (!meta) - continue; - const expiresMs = new Date(meta.expiresAt).getTime(); - const daysRemaining = Math.max(0, Math.ceil((expiresMs - nowMs) / (24 * 60 * 60 * 1000))); - entries.push({ ...meta, daysRemaining }); - } - entries.sort((a, b) => new Date(b.deletedAt).getTime() - new Date(a.deletedAt).getTime()); - return entries; -} -/** - * 还原一个条目到原位置。 - * - 若目标已存在且 force=false → 抛 TrashConflictError - * - 若 force=true → 先把目标移进新 trash 条目(保底),再还原 - */ -export class TrashConflictError extends Error { - targetPath; - constructor(targetPath) { - super(`目标位置已存在:${targetPath}`); - this.targetPath = targetPath; - this.name = 'TrashConflictError'; - } -} -export class TrashNotFoundError extends Error { - constructor(id) { - super(`回收站条目不存在:${id}`); - this.name = 'TrashNotFoundError'; - } -} -export async function restoreFromTrash(id, force = false) { - const meta = await readMeta(id); - if (!meta) - throw new TrashNotFoundError(id); - // 检查目标路径冲突 - let targetExists = false; - try { - await fs.lstat(meta.originalPath); - targetExists = true; - } - catch { } - if (targetExists) { - if (!force) - throw new TrashConflictError(meta.originalPath); - // force:把目标先扔进回收站作为保底 - await moveToTrash(meta.originalPath, meta.skillName); - } - // 确保父目录存在 - await fs.mkdir(path.dirname(meta.originalPath), { recursive: true }); - if (meta.isSymlink && meta.symlinkTarget) { - await fs.symlink(meta.symlinkTarget, meta.originalPath); - } - else { - const src = payloadPath(id); - await renameWithFallback(src, meta.originalPath); - } - // 清理 trash 条目目录 - await fs.rm(entryDir(id), { recursive: true, force: true }); - return meta; -} -/** - * 永久删除一个条目 - */ -export async function purgeOne(id) { - const dir = entryDir(id); - try { - await fs.rm(dir, { recursive: true, force: true }); - return true; - } - catch { - return false; - } -} -/** - * 扫描并删除所有已过期条目 - */ -export async function purgeExpired() { - await ensureRoot(); - let dirs = []; - try { - dirs = await fs.readdir(trashRoot()); - } - catch { - return 0; - } - const now = Date.now(); - let removed = 0; - for (const id of dirs) { - const meta = await readMeta(id); - if (!meta) { - // 坏掉的条目(没 meta)直接清理 - await fs.rm(entryDir(id), { recursive: true, force: true }).catch(() => { }); - continue; - } - if (new Date(meta.expiresAt).getTime() <= now) { - await fs.rm(entryDir(id), { recursive: true, force: true }).catch(() => { }); - removed++; - } - } - return removed; -} -async function copyDir(src, dest) { - await fs.mkdir(dest, { recursive: true }); - const entries = await fs.readdir(src, { withFileTypes: true }); - for (const entry of entries) { - const s = path.join(src, entry.name); - const d = path.join(dest, entry.name); - if (entry.isSymbolicLink()) { - const target = await fs.readlink(s); - await fs.symlink(target, d); - } - else if (entry.isDirectory()) { - await copyDir(s, d); - } - else if (entry.isFile()) { - await fs.copyFile(s, d); - } - } -} diff --git a/dist/server/types.js b/dist/server/types.js deleted file mode 100644 index cb0ff5c..0000000 --- a/dist/server/types.js +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/dist/server/versioning/store.js b/dist/server/versioning/store.js deleted file mode 100644 index 7bbb5cd..0000000 --- a/dist/server/versioning/store.js +++ /dev/null @@ -1,343 +0,0 @@ -/** - * Skill Version Store - * - * 设计思路:类 Git 的轻量级版本管理 - * - 每个 Skill 的版本存储在 ~/.skill-hub/versions// - * - 每个版本是一个 JSON 文件,包含完整快照 + 元数据 - * - 支持:创建快照、查看历史、对比 diff、回滚 - */ -import fs from 'fs/promises'; -import path from 'path'; -import os from 'os'; -import crypto from 'crypto'; -const STORE_ROOT = path.join(os.homedir(), '.skill-hub', 'versions'); -// --- Helpers --- -function skillHash(skillPath) { - return crypto.createHash('md5').update(skillPath).digest('hex').slice(0, 12); -} -function versionId() { - const now = Date.now().toString(36); - const rand = crypto.randomBytes(3).toString('hex'); - return `${now}-${rand}`; -} -function contentHash(content) { - return crypto.createHash('sha256').update(content).digest('hex').slice(0, 16); -} -function storeDir(skillPath) { - return path.join(STORE_ROOT, skillHash(skillPath)); -} -// --- File helpers --- -/** - * 递归读取目录下所有文本文件,key 为相对路径 - */ -async function readDirRecursive(baseDir, currentDir, result) { - let entries; - try { - entries = await fs.readdir(currentDir, { withFileTypes: true }); - } - catch { - return; - } - for (const entry of entries) { - const fullPath = path.join(currentDir, entry.name); - const relPath = path.relative(baseDir, fullPath); - if (entry.isDirectory()) { - // 跳过 .git 等隐藏目录 - if (entry.name.startsWith('.')) - continue; - await readDirRecursive(baseDir, fullPath, result); - } - else if (entry.isFile() && relPath !== 'SKILL.md') { - try { - const buf = await fs.readFile(fullPath); - // 简单判断是否为文本:检查前 8KB 有无 NULL 字节 - const sample = buf.subarray(0, 8192); - if (!sample.includes(0)) { - result[relPath] = buf.toString('utf-8'); - } - } - catch { - // 跳过无法读取的文件 - } - } - } -} -/** - * 递归恢复文件,key 为相对路径(含子目录) - */ -async function restoreFiles(baseDir, files) { - for (const [relPath, fileContent] of Object.entries(files)) { - const fullPath = path.join(baseDir, relPath); - // 确保父目录存在 - await fs.mkdir(path.dirname(fullPath), { recursive: true }); - await fs.writeFile(fullPath, fileContent, 'utf-8'); - } -} -// --- Core API --- -export async function initStore() { - await fs.mkdir(STORE_ROOT, { recursive: true }); -} -/** - * 创建一个版本快照 - */ -export async function createSnapshot(skillPath, skillName, message, source = 'manual') { - await initStore(); - const dir = storeDir(skillPath); - await fs.mkdir(dir, { recursive: true }); - // 读取当前 SKILL.md - let realPath; - try { - realPath = await fs.realpath(skillPath); - } - catch { - realPath = skillPath; - } - const skillMdPath = path.join(realPath, 'SKILL.md'); - let content = ''; - try { - content = await fs.readFile(skillMdPath, 'utf-8'); - } - catch { - throw new Error('SKILL.md not found'); - } - // 递归读取整个目录下所有文本文件 - const files = {}; - await readDirRecursive(realPath, realPath, files); - const cHash = contentHash(content + JSON.stringify(files)); - // 检查是否和最新版本相同(避免重复快照) - const history = await getHistory(skillPath); - if (history.length > 0 && history[0].contentHash === cHash) { - return history[0]; // 内容没变,返回最新版本 - } - const id = versionId(); - const version = { - id, - skillPath, - skillName, - timestamp: new Date().toISOString(), - message, - source, - contentHash: cHash, - content, - files, - }; - await fs.writeFile(path.join(dir, `${id}.json`), JSON.stringify(version, null, 2), 'utf-8'); - return { - id: version.id, - skillPath: version.skillPath, - skillName: version.skillName, - timestamp: version.timestamp, - message: version.message, - source: version.source, - contentHash: version.contentHash, - }; -} -/** - * 获取版本历史(按时间倒序) - */ -export async function getHistory(skillPath) { - const dir = storeDir(skillPath); - let entries; - try { - entries = await fs.readdir(dir); - } - catch { - return []; - } - const versions = []; - for (const file of entries) { - if (!file.endsWith('.json')) - continue; - try { - const raw = await fs.readFile(path.join(dir, file), 'utf-8'); - const v = JSON.parse(raw); - versions.push({ - id: v.id, - skillPath: v.skillPath, - skillName: v.skillName, - timestamp: v.timestamp, - message: v.message, - source: v.source, - contentHash: v.contentHash, - }); - } - catch { } - } - return versions.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()); -} -/** - * 获取某个版本的完整内容 - */ -export async function getVersion(skillPath, versionId) { - const dir = storeDir(skillPath); - const filePath = path.join(dir, `${versionId}.json`); - try { - const raw = await fs.readFile(filePath, 'utf-8'); - return JSON.parse(raw); - } - catch { - return null; - } -} -/** - * 对比两个版本的 diff - */ -export async function diffVersions(skillPath, oldId, newId) { - const oldVer = await getVersion(skillPath, oldId); - const newVer = await getVersion(skillPath, newId); - if (!oldVer || !newVer) - return null; - const lines = computeDiff(oldVer.content, newVer.content); - const stats = { - additions: lines.filter((l) => l.type === 'add').length, - deletions: lines.filter((l) => l.type === 'remove').length, - unchanged: lines.filter((l) => l.type === 'same').length, - }; - return { - oldVersion: { id: oldVer.id, skillPath: oldVer.skillPath, skillName: oldVer.skillName, timestamp: oldVer.timestamp, message: oldVer.message, source: oldVer.source, contentHash: oldVer.contentHash }, - newVersion: { id: newVer.id, skillPath: newVer.skillPath, skillName: newVer.skillName, timestamp: newVer.timestamp, message: newVer.message, source: newVer.source, contentHash: newVer.contentHash }, - lines, - stats, - }; -} -/** - * 对比当前文件和某个版本的 diff - */ -export async function diffWithCurrent(skillPath, versionId) { - const ver = await getVersion(skillPath, versionId); - if (!ver) - return null; - let realPath; - try { - realPath = await fs.realpath(skillPath); - } - catch { - realPath = skillPath; - } - let currentContent = ''; - try { - currentContent = await fs.readFile(path.join(realPath, 'SKILL.md'), 'utf-8'); - } - catch { - return null; - } - const lines = computeDiff(ver.content, currentContent); - const stats = { - additions: lines.filter((l) => l.type === 'add').length, - deletions: lines.filter((l) => l.type === 'remove').length, - unchanged: lines.filter((l) => l.type === 'same').length, - }; - return { - oldVersion: { id: ver.id, skillPath: ver.skillPath, skillName: ver.skillName, timestamp: ver.timestamp, message: ver.message, source: ver.source, contentHash: ver.contentHash }, - newVersion: { id: 'current', skillPath, skillName: ver.skillName, timestamp: new Date().toISOString(), message: '当前版本', source: 'auto', contentHash: contentHash(currentContent) }, - lines, - stats, - }; -} -/** - * 回滚到指定版本 - */ -export async function rollback(skillPath, versionId) { - const ver = await getVersion(skillPath, versionId); - if (!ver) - return false; - let realPath; - try { - realPath = await fs.realpath(skillPath); - } - catch { - realPath = skillPath; - } - // 先对当前状态创建一个自动快照(回滚前的安全网) - try { - await createSnapshot(skillPath, ver.skillName, `回滚前自动备份 (回滚目标: ${versionId})`, 'auto'); - } - catch { } - // 恢复 SKILL.md - await fs.writeFile(path.join(realPath, 'SKILL.md'), ver.content, 'utf-8'); - // 恢复其他文件(含子目录) - await restoreFiles(realPath, ver.files); - // 创建回滚后的快照 - await createSnapshot(skillPath, ver.skillName, `回滚到版本 ${versionId}`, 'auto'); - return true; -} -/** - * 删除某个版本 - */ -export async function deleteVersion(skillPath, versionId) { - const dir = storeDir(skillPath); - try { - await fs.unlink(path.join(dir, `${versionId}.json`)); - return true; - } - catch { - return false; - } -} -// --- Diff Algorithm (Myers-like simplified) --- -function computeDiff(oldText, newText) { - const oldLines = oldText.split('\n'); - const newLines = newText.split('\n'); - const result = []; - // LCS-based diff - const lcs = longestCommonSubsequence(oldLines, newLines); - let oi = 0; - let ni = 0; - let li = 0; - while (oi < oldLines.length || ni < newLines.length) { - if (li < lcs.length && oi < oldLines.length && ni < newLines.length && oldLines[oi] === lcs[li] && newLines[ni] === lcs[li]) { - result.push({ type: 'same', lineNumber: { old: oi + 1, new: ni + 1 }, content: oldLines[oi] }); - oi++; - ni++; - li++; - } - else if (oi < oldLines.length && (li >= lcs.length || oldLines[oi] !== lcs[li])) { - result.push({ type: 'remove', lineNumber: { old: oi + 1 }, content: oldLines[oi] }); - oi++; - } - else if (ni < newLines.length && (li >= lcs.length || newLines[ni] !== lcs[li])) { - result.push({ type: 'add', lineNumber: { new: ni + 1 }, content: newLines[ni] }); - ni++; - } - } - return result; -} -function longestCommonSubsequence(a, b) { - const m = a.length; - const n = b.length; - // Optimize for large files: limit to first 2000 lines - const maxLen = 2000; - const aa = a.slice(0, maxLen); - const bb = b.slice(0, maxLen); - const mm = aa.length; - const nn = bb.length; - const dp = Array.from({ length: mm + 1 }, () => Array(nn + 1).fill(0)); - for (let i = 1; i <= mm; i++) { - for (let j = 1; j <= nn; j++) { - if (aa[i - 1] === bb[j - 1]) { - dp[i][j] = dp[i - 1][j - 1] + 1; - } - else { - dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); - } - } - } - // Backtrack - const result = []; - let i = mm; - let j = nn; - while (i > 0 && j > 0) { - if (aa[i - 1] === bb[j - 1]) { - result.unshift(aa[i - 1]); - i--; - j--; - } - else if (dp[i - 1][j] > dp[i][j - 1]) { - i--; - } - else { - j--; - } - } - return result; -} diff --git a/dist/web/index.html b/dist/web/index.html deleted file mode 100644 index 9d70b66..0000000 --- a/dist/web/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - Skill Hub - - - - - - -
-
-
-
正在加载 Skill Hub...
-
如果这个画面持续不消失,打开 DevTools Console 查看错误,或访问 /api/debug
-
- - - diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..05d11fb --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,33 @@ +import js from '@eslint/js' +import globals from 'globals' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { + ignores: [ + 'dist/**', + 'node_modules/**', + 'release/**', + 'coverage/**', + ], + }, + js.configs.recommended, + tseslint.configs.recommended, + { + languageOptions: { + globals: { + ...globals.node, + ...globals.browser, + }, + }, + rules: { + 'no-empty': ['error', { allowEmptyCatch: true }], + 'no-console': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unused-vars': [ + 'error', + { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, + ], + }, + }, +) diff --git a/package-lock.json b/package-lock.json index a83336f..2aff7df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,52 +1,58 @@ { - "name": "claude-skill-hub", - "version": "0.3.0", + "name": "skillmanager", + "version": "0.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "claude-skill-hub", - "version": "0.3.0", + "name": "skillmanager", + "version": "0.4.0", + "license": "MIT", "dependencies": { - "@fastify/cors": "^11.0.1", - "@fastify/static": "^8.1.0", - "@fastify/websocket": "^11.0.2", + "@fastify/cors": "^11.3.0", + "@fastify/static": "^10.1.2", + "@fastify/websocket": "^11.3.0", "chokidar": "^4.0.3", - "fastify": "^5.3.3", - "glob": "^11.0.2", + "fastify": "^5.11.0", "gray-matter": "^4.0.3" }, "bin": { "claude-skill-hub": "bin/cli.js", - "skill-hub": "bin/cli.js" + "skill-hub": "bin/cli.js", + "skillmanager": "bin/cli.js" }, "devDependencies": { - "@tailwindcss/vite": "^4.1.4", - "@types/node": "^22.15.3", - "@types/react": "^19.1.2", - "@types/react-dom": "^19.1.2", + "@eslint/js": "^9.39.5", + "@tailwindcss/vite": "^4.3.3", + "@types/node": "^22.20.1", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@types/ws": "^8.18.1", "@vitejs/plugin-react": "^4.4.1", - "concurrently": "^9.1.2", + "concurrently": "^9.2.4", + "eslint": "^9.39.5", + "globals": "^17.8.0", "lucide-react": "^0.509.0", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "tailwindcss": "^4.1.4", - "tsx": "^4.19.4", - "typescript": "^5.8.3", - "vite": "^6.3.4" + "react": "^19.2.8", + "react-dom": "^19.2.8", + "tailwindcss": "^4.3.3", + "tsx": "^4.23.1", + "typescript": "^5.9.3", + "typescript-eslint": "^8.65.0", + "vite": "^6.4.3" }, "engines": { "node": ">=20" } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -55,9 +61,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "engines": { @@ -65,21 +71,21 @@ } }, "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -96,14 +102,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -113,14 +119,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -130,9 +136,9 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { @@ -140,29 +146,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -182,9 +188,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { @@ -192,9 +198,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -202,9 +208,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { @@ -212,27 +218,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -274,33 +280,33 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -308,23 +314,23 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", "cpu": [ "ppc64" ], @@ -339,9 +345,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", "cpu": [ "arm" ], @@ -356,9 +362,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], @@ -373,9 +379,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", "cpu": [ "x64" ], @@ -390,9 +396,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "cpu": [ "arm64" ], @@ -407,9 +413,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], @@ -424,9 +430,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", "cpu": [ "arm64" ], @@ -441,9 +447,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "cpu": [ "x64" ], @@ -458,9 +464,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "cpu": [ "arm" ], @@ -475,9 +481,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "cpu": [ "arm64" ], @@ -492,9 +498,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "cpu": [ "ia32" ], @@ -509,9 +515,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "cpu": [ "loong64" ], @@ -526,9 +532,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ "mips64el" ], @@ -543,9 +549,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "cpu": [ "ppc64" ], @@ -560,9 +566,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ "riscv64" ], @@ -577,9 +583,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", "cpu": [ "s390x" ], @@ -594,9 +600,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", "cpu": [ "x64" ], @@ -611,9 +617,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", "cpu": [ "arm64" ], @@ -628,9 +634,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "cpu": [ "x64" ], @@ -645,9 +651,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", "cpu": [ "arm64" ], @@ -662,9 +668,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", "cpu": [ "x64" ], @@ -679,9 +685,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "cpu": [ "arm64" ], @@ -696,9 +702,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", "cpu": [ "x64" ], @@ -713,9 +719,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", "cpu": [ "arm64" ], @@ -730,9 +736,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", "cpu": [ "ia32" ], @@ -747,9 +753,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", "cpu": [ "x64" ], @@ -763,6 +769,279 @@ "node": ">=18" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.3.0", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@fastify/accept-negotiator": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-2.0.1.tgz", @@ -801,9 +1080,9 @@ } }, "node_modules/@fastify/cors": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-11.2.0.tgz", - "integrity": "sha512-LbLHBuSAdGdSFZYTLVA3+Ch2t+sA6nq3Ejc6XLAKiQ6ViS2qFnvicpj0htsx03FyYeLs04HfRNBsz/a8SvbcUw==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-11.3.0.tgz", + "integrity": "sha512-ggQGua+xHv1MvePbPr0v//xLYEsCXbWspquXCJS9Ot5YoRXq8J8ZWzHnxDBVnbtXosvistXo6LtNzOJswf64Fw==", "funding": [ { "type": "github", @@ -816,7 +1095,7 @@ ], "license": "MIT", "dependencies": { - "fastify-plugin": "^5.0.0", + "fastify-plugin": "^6.0.0", "toad-cache": "^3.7.0" } }, @@ -934,9 +1213,9 @@ } }, "node_modules/@fastify/static": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@fastify/static/-/static-8.3.0.tgz", - "integrity": "sha512-yKxviR5PH1OKNnisIzZKmgZSus0r2OZb8qCSbqmw34aolT4g3UlzYfeBRym+HJ1J471CR8e2ldNub4PubD1coA==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/@fastify/static/-/static-10.1.2.tgz", + "integrity": "sha512-G/g18cG9tLutT/OVyN1AIsHIl9L1UwmJ+S3dkyhVpplIx0nEMicd7RGQ+uJLyhKKF4a3tTcQydccn3Mop1fX+Q==", "funding": [ { "type": "github", @@ -950,17 +1229,35 @@ "license": "MIT", "dependencies": { "@fastify/accept-negotiator": "^2.0.0", + "@fastify/error": "^4.0.0", "@fastify/send": "^4.0.0", - "content-disposition": "^0.5.4", - "fastify-plugin": "^5.0.0", + "content-disposition": "^2.0.1", + "fastify-plugin": "^6.0.0", "fastq": "^1.17.1", - "glob": "^11.0.0" + "glob": "^13.0.0" + } + }, + "node_modules/@fastify/static/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@fastify/websocket": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@fastify/websocket/-/websocket-11.2.0.tgz", - "integrity": "sha512-3HrDPbAG1CzUCqnslgJxppvzaAZffieOVbLp1DAy1huCSynUWPifSvfdEDUR8HlJLp3sp1A36uOM2tJogADS8w==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@fastify/websocket/-/websocket-11.3.0.tgz", + "integrity": "sha512-g89ag4BCcD9YP5wBZXixzoLnuf5j89p/sXFcfpCiv2pdEkYYukBEoK3heVzqsp0EAtszVDc2BBZG0KZqeAShIA==", "funding": [ { "type": "github", @@ -974,17 +1271,74 @@ "license": "MIT", "dependencies": { "duplexify": "^4.1.3", - "fastify-plugin": "^5.0.0", + "fastify-plugin": "^6.0.0", "ws": "^8.16.0" } }, - "node_modules/@isaacs/cliui": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", - "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", - "license": "BlueOak-1.0.0", + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { - "node": ">=18" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@jridgewell/gen-mapping": { @@ -1410,49 +1764,49 @@ ] }, "node_modules/@tailwindcss/node": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", - "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "^5.19.0", - "jiti": "^2.6.1", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.2.2" + "tailwindcss": "4.3.3" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", - "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", "dev": true, "license": "MIT", "engines": { "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.2.2", - "@tailwindcss/oxide-darwin-arm64": "4.2.2", - "@tailwindcss/oxide-darwin-x64": "4.2.2", - "@tailwindcss/oxide-freebsd-x64": "4.2.2", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", - "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", - "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", - "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", - "@tailwindcss/oxide-linux-x64-musl": "4.2.2", - "@tailwindcss/oxide-wasm32-wasi": "4.2.2", - "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", - "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", - "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", "cpu": [ "arm64" ], @@ -1467,9 +1821,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", - "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", "cpu": [ "arm64" ], @@ -1484,9 +1838,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", - "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", "cpu": [ "x64" ], @@ -1501,9 +1855,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", - "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", "cpu": [ "x64" ], @@ -1518,9 +1872,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", - "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", "cpu": [ "arm" ], @@ -1535,9 +1889,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", - "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", "cpu": [ "arm64" ], @@ -1552,9 +1906,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", - "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", "cpu": [ "arm64" ], @@ -1569,9 +1923,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", - "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", "cpu": [ "x64" ], @@ -1586,9 +1940,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", - "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", "cpu": [ "x64" ], @@ -1603,9 +1957,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", - "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -1621,11 +1975,11 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.8.1", - "@emnapi/runtime": "^1.8.1", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.1.1", - "@tybys/wasm-util": "^0.10.1", + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "engines": { @@ -1633,9 +1987,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", - "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", "cpu": [ "arm64" ], @@ -1650,9 +2004,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", - "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", "cpu": [ "x64" ], @@ -1667,15 +2021,15 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz", - "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", "dev": true, "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.2.2", - "@tailwindcss/oxide": "4.2.2", - "tailwindcss": "4.2.2" + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" @@ -1733,10 +2087,17 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { - "version": "22.19.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.17.tgz", - "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==", + "version": "22.20.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1744,9 +2105,9 @@ } }, "node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "dev": true, "license": "MIT", "dependencies": { @@ -1754,68 +2115,357 @@ } }, "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" } }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz", + "integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/type-utils": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + "@typescript-eslint/parser": "^8.65.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/abstract-logging": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", - "license": "MIT" + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } }, - "node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "node_modules/@typescript-eslint/parser": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz", + "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", + "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", + "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", + "dev": true, "license": "MIT", "dependencies": { - "ajv": "^8.0.0" + "@typescript-eslint/tsconfig-utils": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", + "debug": "^4.4.3" }, - "peerDependencies": { - "ajv": "^8.0.0" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", + "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", + "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz", + "integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", + "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", + "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.65.0", + "@typescript-eslint/tsconfig-utils": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz", + "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", + "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" }, "peerDependenciesMeta": { "ajv": { @@ -1897,9 +2547,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.17", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.17.tgz", - "integrity": "sha512-HdrkN8eVG2CXxeifv/VdJ4A4RSra1DTW8dc/hdxzhGHN8QePs6gKaWM9pHPcpCoxYZJuOZ8drHmbdpLHjCYjLA==", + "version": "2.11.10", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.10.tgz", + "integrity": "sha512-35JEvJ5/KKlbCHjMCsONI2w6HE88STjVdHk+C7d8LtcFxUjZR1KeLP9izofn2qs0KUxX5r4z73bwH/rd+JHacw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -1910,21 +2560,21 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", "dev": true, "funding": [ { @@ -1942,10 +2592,10 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { @@ -1955,10 +2605,20 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001787", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz", - "integrity": "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==", + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", "dev": true, "funding": [ { @@ -2056,16 +2716,23 @@ "dev": true, "license": "MIT" }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, "node_modules/concurrently": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", - "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.4.tgz", + "integrity": "sha512-TZ0CEhyzvFjgtAvHTusDMgj7wNdihCh7LLLrzdUOXIhdlnL2JBBGA9eJxR24rtqgmdjh3OA3hrN1rCHj6HM8qA==", "dev": true, "license": "MIT", "dependencies": { "chalk": "4.1.2", "rxjs": "7.8.2", - "shell-quote": "1.8.3", + "shell-quote": "1.9.0", "supports-color": "8.1.1", "tree-kill": "1.2.2", "yargs": "17.7.2" @@ -2082,15 +2749,16 @@ } }, "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-2.0.1.tgz", + "integrity": "sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==", "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/convert-source-map": { @@ -2117,6 +2785,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -2152,6 +2821,13 @@ } } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -2193,9 +2869,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.334", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.334.tgz", - "integrity": "sha512-mgjZAz7Jyx1SRCwEpy9wefDS7GvNPazLthHg8eQMJ76wBdGQQDW33TCrUTvQ4wzpmOrv2zrFoD3oNufMdyMpog==", + "version": "1.5.399", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.399.tgz", + "integrity": "sha512-lEcqhErbHjXRvd41rnWLpzbyU/IXfIYo7QwaFWmxGeLiLyY2TBCdHnWY88vB+p3ubnihRypDm66panXl7TylLA==", "dev": true, "license": "ISC" }, @@ -2216,23 +2892,23 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", - "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" } }, "node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2243,32 +2919,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" } }, "node_modules/escalade": { @@ -2287,6 +2963,182 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -2300,6 +3152,52 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -2324,6 +3222,13 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-json-stringify": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.3.0.tgz", @@ -2348,6 +3253,13 @@ "rfdc": "^1.2.0" } }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-querystring": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", @@ -2358,9 +3270,9 @@ } }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "funding": [ { "type": "github", @@ -2374,9 +3286,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastify": { - "version": "5.8.4", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.4.tgz", - "integrity": "sha512-sa42J1xylbBAYUWALSBoyXKPDUvM3OoNOibIefA+Oha57FryXKKCZarA1iDntOCWp3O35voZLuDg2mdODXtPzQ==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.11.0.tgz", + "integrity": "sha512-Y/Ecx1yt0hYzrQR+QVLbxaUN8wCX+MQzMevh29r5RRvlOIArmi4+WAXXaGl5Hw5gBr2wduZpZaT3gRCnXoyVgA==", "funding": [ { "type": "github", @@ -2395,8 +3307,8 @@ "@fastify/proxy-addr": "^5.0.0", "abstract-logging": "^2.0.1", "avvio": "^9.0.0", - "fast-json-stringify": "^6.0.0", - "find-my-way": "^9.0.0", + "fast-json-stringify": "^7.0.0", + "find-my-way": "^9.6.0", "light-my-request": "^6.0.0", "pino": "^9.14.0 || ^10.1.0", "process-warning": "^5.0.0", @@ -2407,9 +3319,9 @@ } }, "node_modules/fastify-plugin": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", - "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-6.0.0.tgz", + "integrity": "sha512-fZOty7z3O7vOliF6d8bHE3wiEh1KcNnKEQensSgTk9C1DvN6nRLS++XVd86v33Hw/8u9Un8A1zDrQ8ujcQDHEg==", "funding": [ { "type": "github", @@ -2422,6 +3334,46 @@ ], "license": "MIT" }, + "node_modules/fastify/node_modules/fast-json-stringify": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-7.0.1.tgz", + "integrity": "sha512-eRSayARSbbwlBjpP4vnTTIRD5QPcIrmihPxDeN1DtKnHPg66UuJLx+8hlK1kaFdjvzyQ/dzALoi4vwAQ+T+iZA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/merge-json-schemas": "^0.2.0", + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^4.0.0", + "json-schema-ref-resolver": "^3.0.0", + "rfdc": "^1.2.0" + } + }, + "node_modules/fastify/node_modules/fast-uri": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-4.1.2.tgz", + "integrity": "sha512-TyGmBcbDTZXcb2cj5MV89DrF42DKvb3y5DDUNh95iO+IMeAzMkVSxK1PZRrRIpc9yg8U2GhGdbofNa0LS/a4Bw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastify/node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", @@ -2461,10 +3413,23 @@ } } }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/find-my-way": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.5.0.tgz", - "integrity": "sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.7.0.tgz", + "integrity": "sha512-f2JHn75x2JlwUwLenZypgczR7YWMb/uO9BvUXtus+JMgkbIkLADd38cI4EiV+OQqrGo1Zlq6V8wnqMJ8e62wUQ==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -2475,22 +3440,44 @@ "node": ">=20" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" } }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2526,41 +3513,30 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-tsconfig": { - "version": "4.13.7", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.7.tgz", - "integrity": "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "is-glob": "^4.0.3" }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "engines": { + "node": ">=10.13.0" } }, - "node_modules/glob": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", - "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "BlueOak-1.0.0", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, + "node_modules/globals": { + "version": "17.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.8.0.tgz", + "integrity": "sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ==", + "dev": true, + "license": "MIT", "engines": { - "node": "20 || >=22" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/graceful-fs": { @@ -2615,6 +3591,43 @@ "url": "https://opencollective.com/express" } }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -2639,6 +3652,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -2649,31 +3672,30 @@ "node": ">=8" } }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, "license": "ISC" }, - "node_modules/jackspeak": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", - "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^9.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", "dev": true, "license": "MIT", "bin": { @@ -2688,9 +3710,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -2713,6 +3735,13 @@ "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-ref-resolver": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", @@ -2738,6 +3767,13 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -2751,6 +3787,16 @@ "node": ">=6" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -2760,6 +3806,20 @@ "node": ">=0.10.0" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/light-my-request": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", @@ -3058,6 +4118,29 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3132,9 +4215,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", "dev": true, "funding": [ { @@ -3150,13 +4233,23 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/node-releases": { - "version": "2.0.37", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", - "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, + "node_modules/node-releases": { + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/on-exit-leak-free": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", @@ -3175,16 +4268,84 @@ "wrappy": "1" } }, - "node_modules/package-json-from-dist": { + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -3273,9 +4434,9 @@ "license": "MIT" }, "node_modules/postcss": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", - "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", + "version": "8.5.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", + "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", "dev": true, "funding": [ { @@ -3293,7 +4454,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -3301,6 +4462,16 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/process-warning": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", @@ -3317,6 +4488,16 @@ ], "license": "MIT" }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", @@ -3324,9 +4505,9 @@ "license": "MIT" }, "node_modules/react": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", - "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", "dev": true, "license": "MIT", "engines": { @@ -3334,16 +4515,16 @@ } }, "node_modules/react-dom": { - "version": "19.2.5", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", - "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", "dev": true, "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.5" + "react": "^19.2.8" } }, "node_modules/react-refresh": { @@ -3411,14 +4592,14 @@ "node": ">=0.10.0" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "engines": { + "node": ">=4" } }, "node_modules/ret": { @@ -3522,9 +4703,9 @@ "license": "MIT" }, "node_modules/safe-regex2": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.0.tgz", - "integrity": "sha512-pNHAuBW7TrcleFHsxBr5QMi/Iyp0ENjUKz7GCcX1UO7cMh+NmVK6HxQckNL1tJp1XAJVjG6B8OKIPqodqj9rtw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.1.tgz", + "integrity": "sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==", "funding": [ { "type": "github", @@ -3614,6 +4795,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -3626,15 +4808,16 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", + "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", "dev": true, "license": "MIT", "engines": { @@ -3644,18 +4827,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/sonic-boom": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", @@ -3751,6 +4922,19 @@ "node": ">=0.10.0" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -3768,16 +4952,16 @@ } }, "node_modules/tailwindcss": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", - "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", "dev": true, "license": "MIT" }, "node_modules/tapable": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", - "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "engines": { @@ -3845,6 +5029,19 @@ "tree-kill": "cli.js" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -3853,14 +5050,13 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.1.tgz", + "integrity": "sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" + "esbuild": "~0.28.0" }, "bin": { "tsx": "dist/cli.mjs" @@ -3872,6 +5068,19 @@ "fsevents": "~2.3.3" } }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -3886,6 +5095,30 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.65.0.tgz", + "integrity": "sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.65.0", + "@typescript-eslint/parser": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -3924,6 +5157,16 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -3931,9 +5174,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", - "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", "dev": true, "license": "MIT", "dependencies": { @@ -4493,6 +5736,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -4504,6 +5748,16 @@ "node": ">= 8" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -4529,9 +5783,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", - "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -4594,6 +5848,19 @@ "engines": { "node": ">=12" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index d978072..26b47d5 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,18 @@ { - "name": "claude-skill-hub", - "version": "0.3.0", - "description": "Claude Code Skill Manager - 一键扫描并管理所有 Claude Agent Skills", + "name": "skillmanager", + "version": "0.4.0", + "description": "SkillManager - local-first management and diagnostics for Agent Skills", + "license": "MIT", "type": "module", "bin": { + "skillmanager": "bin/cli.js", "claude-skill-hub": "bin/cli.js", "skill-hub": "bin/cli.js" }, "files": [ "bin", "dist", + "scripts", "server", "web", "tsconfig.json", @@ -20,34 +23,53 @@ "dev": "concurrently \"npm run dev:server\" \"npm run dev:web\"", "dev:server": "tsx watch server/index.ts", "dev:web": "vite", - "build": "vite build && tsc -p tsconfig.server.json --noCheck", - "start": "node dist/server/index.js" + "lint": "eslint .", + "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.server.json --noEmit", + "test": "node scripts/run-tests.mjs unit", + "test:integration": "node scripts/run-tests.mjs integration", + "build": "npm run typecheck && vite build && tsc -p tsconfig.server.json && node scripts/write-build-manifest.mjs", + "prepack": "npm run build", + "start": "node dist/server/index.js", + "pack:verify": "node scripts/verify-package.mjs", + "audit:release": "node scripts/audit-release.mjs" }, "dependencies": { - "fastify": "^5.3.3", - "@fastify/static": "^8.1.0", - "@fastify/cors": "^11.0.1", - "@fastify/websocket": "^11.0.2", + "fastify": "^5.11.0", + "@fastify/static": "^10.1.2", + "@fastify/cors": "^11.3.0", + "@fastify/websocket": "^11.3.0", "gray-matter": "^4.0.3", - "chokidar": "^4.0.3", - "glob": "^11.0.2" + "chokidar": "^4.0.3" }, "devDependencies": { - "typescript": "^5.8.3", - "tsx": "^4.19.4", - "concurrently": "^9.1.2", - "vite": "^6.3.4", + "@eslint/js": "^9.39.5", + "@types/ws": "^8.18.1", + "eslint": "^9.39.5", + "globals": "^17.8.0", + "typescript-eslint": "^8.65.0", + "typescript": "^5.9.3", + "tsx": "^4.23.1", + "concurrently": "^9.2.4", + "vite": "^6.4.3", "@vitejs/plugin-react": "^4.4.1", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "@types/react": "^19.1.2", - "@types/react-dom": "^19.1.2", - "@types/node": "^22.15.3", - "tailwindcss": "^4.1.4", - "@tailwindcss/vite": "^4.1.4", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@types/node": "^22.20.1", + "tailwindcss": "^4.3.3", + "@tailwindcss/vite": "^4.3.3", "lucide-react": "^0.509.0" }, "engines": { "node": ">=20" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Backtthefuture/skillmanager.git" + }, + "homepage": "https://github.com/Backtthefuture/skillmanager#readme", + "bugs": { + "url": "https://github.com/Backtthefuture/skillmanager/issues" } } diff --git a/release/claude-skill-hub.tgz b/release/claude-skill-hub.tgz deleted file mode 100644 index 548e1a6ff9d85e6f0ea787f97f7bc29d9bca32dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228798 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

-Xo+cXV{I@YM0})CpdyapueBsk`9lPk}bj`~Uv@ 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

Mj3hN9# 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 va{$zlcR1} item.isDirect && (item.severity === 'high' || item.severity === 'critical'), +) + +console.log(JSON.stringify({ + ok: blocking === 0 && directBlocking.length === 0, + vulnerabilities: counts, + directBlocking: directBlocking.map((item) => item.name), +}, null, 2)) + +if (blocking > 0 || directBlocking.length > 0) process.exit(1) diff --git a/scripts/run-tests.mjs b/scripts/run-tests.mjs new file mode 100644 index 0000000..27e7c01 --- /dev/null +++ b/scripts/run-tests.mjs @@ -0,0 +1,45 @@ +import fs from 'fs/promises' +import path from 'path' +import { spawnSync } from 'child_process' +import { fileURLToPath } from 'url' + +const scriptDir = path.dirname(fileURLToPath(import.meta.url)) +const repoRoot = path.resolve(scriptDir, '..') +const suite = process.argv[2] + +if (suite !== 'unit' && suite !== 'integration') { + console.error('Usage: node scripts/run-tests.mjs ') + process.exit(2) +} + +const suiteRoot = path.join(repoRoot, 'tests', suite) + +async function collect(dir) { + const result = [] + const entries = await fs.readdir(dir, { withFileTypes: true }) + for (const entry of entries) { + const target = path.join(dir, entry.name) + if (entry.isDirectory()) result.push(...(await collect(target))) + if (entry.isFile() && /\.test\.(?:ts|js|mjs)$/.test(entry.name)) result.push(target) + } + return result +} + +const files = (await collect(suiteRoot)).sort() +if (files.length === 0) { + console.error(`No ${suite} test files found in ${suiteRoot}`) + process.exit(1) +} + +const child = spawnSync( + process.execPath, + ['--import', 'tsx', '--test', ...files], + { + cwd: repoRoot, + env: { ...process.env, SKILLMANAGER_TEST_MODE: '1' }, + stdio: 'inherit', + }, +) + +if (child.error) throw child.error +process.exit(child.status ?? 1) diff --git a/scripts/verify-package.mjs b/scripts/verify-package.mjs new file mode 100644 index 0000000..6ab00d5 --- /dev/null +++ b/scripts/verify-package.mjs @@ -0,0 +1,163 @@ +import fs from 'fs/promises' +import path from 'path' +import os from 'os' +import net from 'net' +import crypto from 'crypto' +import { spawn, spawnSync } from 'child_process' +import { fileURLToPath } from 'url' + +const scriptDir = path.dirname(fileURLToPath(import.meta.url)) +const repoRoot = path.resolve(scriptDir, '..') +const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm' +const temporaryRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'skillmanager-pack-')) + +function run(command, args, options = {}) { + const result = spawnSync(command, args, { + cwd: repoRoot, + encoding: 'utf8', + stdio: options.capture ? 'pipe' : 'inherit', + ...options, + }) + if (result.error) throw result.error + if (result.status !== 0) { + throw new Error( + `${command} ${args.join(' ')} failed with exit ${result.status}\n${result.stdout || ''}\n${result.stderr || ''}`, + ) + } + return result +} + +async function freePort() { + const server = net.createServer() + await new Promise((resolve, reject) => { + server.once('error', reject) + server.listen(0, '127.0.0.1', resolve) + }) + const address = server.address() + const port = typeof address === 'object' && address ? address.port : 0 + await new Promise((resolve) => server.close(resolve)) + return port +} + +async function waitForHealth(port, child) { + const deadline = Date.now() + 15_000 + while (Date.now() < deadline) { + if (child.exitCode !== null) throw new Error(`Packaged server exited early (${child.exitCode})`) + try { + const response = await fetch(`http://127.0.0.1:${port}/api/health`) + if (response.ok) return await response.json() + } catch {} + await new Promise((resolve) => setTimeout(resolve, 150)) + } + throw new Error('Timed out waiting for packaged /api/health') +} + +async function verifyArtifacts(packageRoot, manifest) { + for (const [relative, expectedHash] of Object.entries(manifest.artifacts)) { + const content = await fs.readFile(path.join(packageRoot, 'dist', relative)) + const actualHash = crypto.createHash('sha256').update(content).digest('hex') + if (actualHash !== expectedHash) { + throw new Error(`Artifact hash mismatch: dist/${relative}`) + } + } +} + +let serverChild = null +let serverOutput = '' +try { + run(npmCommand, ['run', 'build']) + const firstManifest = await fs.readFile( + path.join(repoRoot, 'dist', 'build-manifest.json'), + 'utf8', + ) + + const packDir = path.join(temporaryRoot, 'pack') + await fs.mkdir(packDir, { recursive: true }) + const packed = run(npmCommand, ['pack', '--json', '--pack-destination', packDir], { capture: true }) + const secondManifest = await fs.readFile( + path.join(repoRoot, 'dist', 'build-manifest.json'), + 'utf8', + ) + if (firstManifest !== secondManifest) { + throw new Error('Two consecutive builds produced different build manifests') + } + const jsonMatch = packed.stdout.match(/\[\s*\{[\s\S]*\}\s*\]\s*$/) + if (!jsonMatch) throw new Error('npm pack did not return a JSON package manifest') + const packResult = JSON.parse(jsonMatch[0]) + const tarball = path.join(packDir, packResult[0].filename) + + const installRoot = path.join(temporaryRoot, 'install') + await fs.mkdir(installRoot, { recursive: true }) + run(npmCommand, [ + 'install', + '--ignore-scripts', + '--no-audit', + '--no-fund', + '--prefix', + installRoot, + tarball, + ]) + + const packageRoot = path.join(installRoot, 'node_modules', 'skillmanager') + const required = [ + 'bin/cli.js', + 'dist/server/index.js', + 'dist/web/index.html', + 'dist/build-manifest.json', + ] + for (const relative of required) { + await fs.access(path.join(packageRoot, relative)) + } + + const installedPackage = JSON.parse( + await fs.readFile(path.join(packageRoot, 'package.json'), 'utf8'), + ) + const manifest = JSON.parse( + await fs.readFile(path.join(packageRoot, 'dist', 'build-manifest.json'), 'utf8'), + ) + if (manifest.packageName !== installedPackage.name || manifest.version !== installedPackage.version) { + throw new Error('Package metadata does not match dist/build-manifest.json') + } + for (const alias of ['skillmanager', 'skill-hub', 'claude-skill-hub']) { + if (installedPackage.bin?.[alias] !== 'bin/cli.js') { + throw new Error(`Missing compatible CLI alias: ${alias}`) + } + } + await verifyArtifacts(packageRoot, manifest) + + const fixtureRoot = path.join(temporaryRoot, 'fixture') + const dataDir = path.join(temporaryRoot, 'data') + await fs.mkdir(fixtureRoot, { recursive: true }) + const port = await freePort() + serverChild = spawn(process.execPath, [path.join(packageRoot, 'dist', 'server', 'index.js')], { + cwd: packageRoot, + env: { + ...process.env, + PORT: String(port), + SKILLMANAGER_FIXTURE_ROOT: fixtureRoot, + SKILLMANAGER_DATA_DIR: dataDir, + SKILLMANAGER_NO_OPEN: '1', + SKILL_HUB_NO_OPEN: '1', + SKILLMANAGER_TEST_MODE: '1', + }, + stdio: ['ignore', 'pipe', 'pipe'], + }) + serverChild.stdout.on('data', (chunk) => { serverOutput += chunk.toString() }) + serverChild.stderr.on('data', (chunk) => { serverOutput += chunk.toString() }) + const health = await waitForHealth(port, serverChild) + if (health.status !== 'ok') throw new Error('Packaged server returned an invalid health response') + + console.log(JSON.stringify({ + ok: true, + package: `${installedPackage.name}@${installedPackage.version}`, + entryCount: packResult[0].entryCount, + sourceDirty: manifest.sourceDirty, + packagedServer: 'healthy', + }, null, 2)) +} catch (error) { + if (serverOutput) console.error(serverOutput) + throw error +} finally { + if (serverChild && serverChild.exitCode === null) serverChild.kill('SIGTERM') + await fs.rm(temporaryRoot, { recursive: true, force: true }) +} diff --git a/scripts/write-build-manifest.mjs b/scripts/write-build-manifest.mjs new file mode 100644 index 0000000..fc404ce --- /dev/null +++ b/scripts/write-build-manifest.mjs @@ -0,0 +1,112 @@ +import fs from 'fs/promises' +import path from 'path' +import crypto from 'crypto' +import { spawnSync } from 'child_process' +import { fileURLToPath } from 'url' + +const scriptDir = path.dirname(fileURLToPath(import.meta.url)) +const repoRoot = path.resolve(scriptDir, '..') +const distRoot = path.join(repoRoot, 'dist') +const manifestPath = path.join(distRoot, 'build-manifest.json') + +async function exists(target) { + try { + await fs.access(target) + return true + } catch { + return false + } +} + +async function filesUnder(target, relativeBase = repoRoot) { + if (!(await exists(target))) return [] + const stat = await fs.stat(target) + if (stat.isFile()) return [path.relative(relativeBase, target)] + + const result = [] + const entries = await fs.readdir(target, { withFileTypes: true }) + for (const entry of entries) { + const child = path.join(target, entry.name) + if (entry.isDirectory()) result.push(...(await filesUnder(child, relativeBase))) + if (entry.isFile()) result.push(path.relative(relativeBase, child)) + } + return result +} + +async function hashFiles(relativeFiles, base = repoRoot) { + const digest = crypto.createHash('sha256') + for (const relative of [...relativeFiles].sort()) { + digest.update(relative.replaceAll(path.sep, '/')) + digest.update('\0') + digest.update(await fs.readFile(path.join(base, relative))) + digest.update('\0') + } + return digest.digest('hex') +} + +async function artifactMap() { + const relativeFiles = (await filesUnder(distRoot, distRoot)) + .filter((relative) => relative !== 'build-manifest.json') + .sort() + const artifacts = {} + for (const relative of relativeFiles) { + artifacts[relative.replaceAll(path.sep, '/')] = crypto + .createHash('sha256') + .update(await fs.readFile(path.join(distRoot, relative))) + .digest('hex') + } + return artifacts +} + +const sourceEntries = [ + 'bin', + 'scripts', + 'server', + 'web', + 'skills', + '.codex-plugin', + '.mcp.json', + 'package.json', + 'package-lock.json', + 'tsconfig.json', + 'tsconfig.server.json', + 'vite.config.ts', + 'eslint.config.js', +] +const sourceFiles = [] +for (const entry of sourceEntries) { + sourceFiles.push(...(await filesUnder(path.join(repoRoot, entry)))) +} + +const pkg = JSON.parse(await fs.readFile(path.join(repoRoot, 'package.json'), 'utf8')) +const commitResult = spawnSync('git', ['rev-parse', 'HEAD'], { + cwd: repoRoot, + encoding: 'utf8', +}) +const statusResult = spawnSync('git', ['status', '--porcelain', '--untracked-files=all'], { + cwd: repoRoot, + encoding: 'utf8', +}) +const sourceStatus = (statusResult.stdout || '') + .split(/\r?\n/) + .filter(Boolean) + .filter((line) => { + const name = line.slice(3).replace(/^"|"$/g, '') + return !name.startsWith('dist/') && !name.startsWith('release/') + }) + +const manifest = { + schemaVersion: 1, + packageName: pkg.name, + version: pkg.version, + gitCommit: commitResult.status === 0 ? commitResult.stdout.trim() : null, + sourceDirty: sourceStatus.length > 0, + sourceTreeHash: await hashFiles(sourceFiles), + artifacts: await artifactMap(), +} + +await fs.mkdir(distRoot, { recursive: true }) +const temporaryPath = manifestPath + '.tmp' +await fs.writeFile(temporaryPath, JSON.stringify(manifest, null, 2) + '\n', 'utf8') +await fs.rename(temporaryPath, manifestPath) +console.log(`Wrote ${path.relative(repoRoot, manifestPath)}`) diff --git a/server/config/paths.ts b/server/config/paths.ts new file mode 100644 index 0000000..fc8abd6 --- /dev/null +++ b/server/config/paths.ts @@ -0,0 +1,43 @@ +import os from 'os' +import path from 'path' + +function optionalAbsolutePath(name: string): string | null { + const value = process.env[name]?.trim() + if (!value) return null + if (!path.isAbsolute(value)) { + throw new Error(`${name} must be an absolute path`) + } + return path.resolve(value) +} + +export const fixtureRoot = optionalAbsolutePath('SKILLMANAGER_FIXTURE_ROOT') +export const userHome = fixtureRoot ?? os.homedir() +export const explicitProjectRoot = optionalAbsolutePath('SKILLMANAGER_PROJECT_ROOT') + +function defaultDataDir(): string { + if (fixtureRoot) return path.join(fixtureRoot, 'data') + + if (process.platform === 'darwin') { + return path.join(userHome, 'Library', 'Application Support', 'SkillManager') + } + + if (process.platform === 'win32') { + const appData = process.env.APPDATA?.trim() + return path.join(appData || path.join(userHome, 'AppData', 'Roaming'), 'SkillManager') + } + + const xdgDataHome = process.env.XDG_DATA_HOME?.trim() + return path.join(xdgDataHome || path.join(userHome, '.local', 'share'), 'skillmanager') +} + +export const dataDir = optionalAbsolutePath('SKILLMANAGER_DATA_DIR') ?? defaultDataDir() +export const isFixtureMode = fixtureRoot !== null + +export function assertFixturePath(targetPath: string): void { + if (!fixtureRoot) return + const relative = path.relative(fixtureRoot, path.resolve(targetPath)) + if (relative === '' || (!relative.startsWith('..' + path.sep) && relative !== '..' && !path.isAbsolute(relative))) { + return + } + throw new Error(`Fixture mode blocked path outside SKILLMANAGER_FIXTURE_ROOT: ${targetPath}`) +} diff --git a/server/index.ts b/server/index.ts index 15e0f9c..50ccd86 100644 --- a/server/index.ts +++ b/server/index.ts @@ -163,16 +163,20 @@ try { scanSummary = `\x1b[31m❌ Initial scan failed: ${e?.message || e}\x1b[0m` } - console.log(`\n🚀 Claude Skill Hub running at \x1b[36m${url}\x1b[0m`) + console.log(`\n🚀 SkillManager running at \x1b[36m${url}\x1b[0m`) if (staticRoot) { console.log(`🌐 Web UI: \x1b[36m${url}\x1b[0m`) } console.log(`🔍 Debug: \x1b[36m${url}/api/debug\x1b[0m`) console.log(scanSummary) console.log(`👀 File watcher active`) - console.log(`\x1b[90m💡 下次启动直接敲: \x1b[0m\x1b[36mskill-hub\x1b[0m\x1b[90m (或访问 ${url})\x1b[0m\n`) + console.log(`\x1b[90m💡 下次启动直接敲: \x1b[0m\x1b[36mskillmanager\x1b[0m\x1b[90m (或访问 ${url})\x1b[0m\n`) - if (staticRoot && process.env.SKILL_HUB_NO_OPEN !== '1') { + if ( + staticRoot && + process.env.SKILLMANAGER_NO_OPEN !== '1' && + process.env.SKILL_HUB_NO_OPEN !== '1' + ) { const { exec } = await import('child_process') const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' diff --git a/server/routes/manage.ts b/server/routes/manage.ts index c10b3fb..0f65086 100644 --- a/server/routes/manage.ts +++ b/server/routes/manage.ts @@ -1,12 +1,12 @@ import type { FastifyInstance } from 'fastify' import fs from 'fs/promises' import path from 'path' -import os from 'os' import { invalidateCache } from './skills.js' import { createSnapshot } from '../versioning/store.js' import { moveToTrash } from '../trash/store.js' +import { userHome } from '../config/paths.js' -const homedir = os.homedir() +const homedir = userHome const settingsPath = path.join(homedir, '.claude', 'settings.json') async function readSettings(): Promise { diff --git a/server/routes/similarity.ts b/server/routes/similarity.ts index fa0a9ff..d2d61c5 100644 --- a/server/routes/similarity.ts +++ b/server/routes/similarity.ts @@ -1,12 +1,12 @@ import type { FastifyInstance } from 'fastify' import fs from 'fs/promises' import path from 'path' -import os from 'os' import { detectSimilarSkills } from '../scanner/similarity.js' import { getCachedResult } from './skills.js' import { fullScan } from '../scanner/discovery.js' +import { dataDir } from '../config/paths.js' -const STORE_DIR = path.join(os.homedir(), '.claude', 'skill-hub') +const STORE_DIR = path.join(dataDir, 'diagnostics') const IGNORED_FILE = path.join(STORE_DIR, 'ignored-pairs.json') interface IgnoredPair { diff --git a/server/routes/skills.ts b/server/routes/skills.ts index 81e8504..eff7e85 100644 --- a/server/routes/skills.ts +++ b/server/routes/skills.ts @@ -99,7 +99,7 @@ export async function skillRoutes(app: FastifyInstance) { cachedResult = await fullScan() } return { - version: '0.3.0', + version: '0.4.0', node: process.version, platform: process.platform, cwd: process.cwd(), diff --git a/server/scanner/discovery.ts b/server/scanner/discovery.ts index 2eef1e3..995310b 100644 --- a/server/scanner/discovery.ts +++ b/server/scanner/discovery.ts @@ -1,6 +1,6 @@ import fs from 'fs/promises' +import type { Dirent } from 'fs' import path from 'path' -import os from 'os' import crypto from 'crypto' import { parseSkillMd, listSkillFiles, getSkillMdPath } from './parser.js' import { resolveSymlink, identifySource } from './symlink.js' @@ -15,8 +15,9 @@ import { classifyAll } from './taxonomy.js' import { detectSimilarSkills } from './similarity.js' import { computeHealth } from './health.js' import type { Skill, Project, ConflictGroup, ScanResult, ScanPathReport } from '../types.js' +import { explicitProjectRoot, fixtureRoot, userHome } from '../config/paths.js' -const homedir = os.homedir() +const homedir = userHome function makeId(p: string): string { return crypto.createHash('md5').update(p).digest('hex').slice(0, 12) @@ -76,7 +77,7 @@ async function scanSkillDir( ): Promise { const skills: Skill[] = [] - let entries: Awaited> + let entries: Dirent[] try { entries = await fs.readdir(skillDir, { withFileTypes: true }) } catch { @@ -213,19 +214,21 @@ async function discoverProjects(): Promise<{ name: string; path: string }[]> { } catch {} // 2. Common project root dirs — expanded list - const commonDirs = [ - path.join(homedir, 'Documents'), - path.join(homedir, 'Projects'), - path.join(homedir, 'Developer'), - path.join(homedir, 'Code'), - path.join(homedir, 'code'), - path.join(homedir, 'workspace'), - path.join(homedir, 'dev'), - path.join(homedir, 'Dev'), - path.join(homedir, 'work'), - path.join(homedir, 'repos'), - path.join(homedir, 'src'), - ] + const commonDirs = fixtureRoot + ? [path.join(homedir, 'projects')] + : [ + path.join(homedir, 'Documents'), + path.join(homedir, 'Projects'), + path.join(homedir, 'Developer'), + path.join(homedir, 'Code'), + path.join(homedir, 'code'), + path.join(homedir, 'workspace'), + path.join(homedir, 'dev'), + path.join(homedir, 'Dev'), + path.join(homedir, 'work'), + path.join(homedir, 'repos'), + path.join(homedir, 'src'), + ] for (const dir of commonDirs) { try { @@ -246,16 +249,25 @@ async function discoverProjects(): Promise<{ name: string; path: string }[]> { // `.claude/skills/` etc. are the *global* paths, not project paths. // Running `skill-hub` from home otherwise causes every global skill to // be double-counted as "lhc (cwd)/" in the scan report. - let cwd = process.cwd() - for (let i = 0; i < 4; i++) { - if (cwd !== homedir && (await hasAnyAgentSkills(cwd))) { - if (!projects.some((p) => p.path === cwd)) { - projects.push({ name: path.basename(cwd) + ' (cwd)', path: cwd }) + if (explicitProjectRoot) { + if (await hasAnyAgentSkills(explicitProjectRoot)) { + projects.push({ + name: path.basename(explicitProjectRoot) + ' (current)', + path: explicitProjectRoot, + }) + } + } else if (!fixtureRoot) { + let cwd = process.cwd() + for (let i = 0; i < 4; i++) { + if (cwd !== homedir && (await hasAnyAgentSkills(cwd))) { + if (!projects.some((p) => p.path === cwd)) { + projects.push({ name: path.basename(cwd) + ' (cwd)', path: cwd }) + } } + const parent = path.dirname(cwd) + if (parent === cwd) break + cwd = parent } - const parent = path.dirname(cwd) - if (parent === cwd) break - cwd = parent } return projects @@ -298,7 +310,7 @@ async function discoverPluginSkillDirs(): Promise { async function walk(dir: string, depth: number) { if (depth > 4) return - let entries: Awaited> + let entries: Dirent[] try { entries = await fs.readdir(dir, { withFileTypes: true }) } catch { @@ -350,7 +362,7 @@ function detectConflicts(skills: Skill[]): ConflictGroup[] { } function parseExtraPaths(): string[] { - const raw = process.env.SKILL_HUB_EXTRA_PATHS + const raw = process.env.SKILLMANAGER_EXTRA_PATHS || process.env.SKILL_HUB_EXTRA_PATHS if (!raw) return [] return raw .split(/[:,]/) diff --git a/server/scanner/symlink.ts b/server/scanner/symlink.ts index bcdaa80..b70bda8 100644 --- a/server/scanner/symlink.ts +++ b/server/scanner/symlink.ts @@ -1,5 +1,4 @@ import fs from 'fs/promises' -import path from 'path' export interface SymlinkInfo { isSymlink: boolean diff --git a/server/scanner/watcher.ts b/server/scanner/watcher.ts index 2a491e4..9079f32 100644 --- a/server/scanner/watcher.ts +++ b/server/scanner/watcher.ts @@ -1,14 +1,14 @@ -import chokidar from 'chokidar' +import chokidar, { type FSWatcher } from 'chokidar' import fs from 'fs' import path from 'path' -import os from 'os' import { allAgentGlobalAbsPaths } from './agents.js' +import { userHome } from '../config/paths.js' -const homedir = os.homedir() +const homedir = userHome export type WatchCallback = (event: { type: string; path: string }) => void -let watcher: chokidar.FSWatcher | null = null +let watcher: FSWatcher | null = null export function startWatcher(callback: WatchCallback): void { if (watcher) return diff --git a/server/sync/export.ts b/server/sync/export.ts index 926aedf..213f5c9 100644 --- a/server/sync/export.ts +++ b/server/sync/export.ts @@ -18,10 +18,10 @@ import { isSyncableSkill, materializeSkill, buildManifest, DEFAULT_GITIGNORE } f * 5. Clean up staging. */ -const README_CONTENT = `# Skill Hub Backup +const README_CONTENT = `# SkillManager Backup This archive is an offline backup of your Claude / Codex / universal skills, -created by Skill Hub (https://github.com/Backtthefuture/huangshu). +created by SkillManager (https://github.com/Backtthefuture/skillmanager). Layout: //SKILL.md @@ -34,7 +34,7 @@ agent skills directory on your machine: - codex → ~/.codex/skills/ - universal → ~/.agents/skills/ -Or: set up Skill Hub + connect a GitHub repo, push this content there, then +Or: set up SkillManager + connect a GitHub repo, push this content there, then use the "从 GitHub 下载" feature on your new machine. ` @@ -57,7 +57,7 @@ export async function buildExportTarball(skills: Skill[]): Promise { + const code = character.charCodeAt(0) + return character === '/' || character === '\\' || code <= 31 ? '_' : character + }).join('').trim() cleaned = cleaned.replace(/\.\.+/g, '_') // collapse any `..` or longer runs if (cleaned.startsWith('.')) cleaned = '_' + cleaned.slice(1) return cleaned || 'unnamed' @@ -161,7 +164,7 @@ function looksLikeText(buf: Buffer): boolean { * things that are almost never intentionally checked in, but keeps images and * docs since many skills have templates with them. */ -export const DEFAULT_GITIGNORE = `# Skill Hub — default ignore patterns +export const DEFAULT_GITIGNORE = `# SkillManager — default ignore patterns # Local caches node_modules/ __pycache__/ @@ -188,7 +191,7 @@ Thumbs.db */ export interface VaultManifest { schemaVersion: 1 - generator: 'skill-hub' + generator: 'skillmanager' lastUploadAt: string lastUploadHostname: string } @@ -196,7 +199,7 @@ export interface VaultManifest { export function buildManifest(hostname: string): VaultManifest { return { schemaVersion: 1, - generator: 'skill-hub', + generator: 'skillmanager', lastUploadAt: new Date().toISOString(), lastUploadHostname: hostname, } diff --git a/server/trash/store.ts b/server/trash/store.ts index 572d4d2..9d8ee6f 100644 --- a/server/trash/store.ts +++ b/server/trash/store.ts @@ -9,13 +9,11 @@ */ import fs from 'fs/promises' import path from 'path' -import os from 'os' import crypto from 'crypto' +import { dataDir, userHome } from '../config/paths.js' function trashRoot(): string { - // Read HOME lazily so tests can override process.env.HOME between calls. - const home = process.env.HOME || process.env.USERPROFILE || os.homedir() - return path.join(home, '.skill-hub', 'trash') + return path.join(dataDir, 'trash') } export const TRASH_TTL_MS = 7 * 24 * 60 * 60 * 1000 @@ -164,7 +162,7 @@ async function dirSize(dir: string): Promise { } function inferScope(skillPath: string): { scope: TrashMeta['scope']; projectPath?: string } { - const home = os.homedir() + const home = userHome const globalRoot = path.join(home, '.claude', 'skills') if (skillPath.startsWith(globalRoot + path.sep) || skillPath === globalRoot) { return { scope: 'global' } diff --git a/server/versioning/store.ts b/server/versioning/store.ts index 10e55d5..7a397f9 100644 --- a/server/versioning/store.ts +++ b/server/versioning/store.ts @@ -7,11 +7,12 @@ * - 支持:创建快照、查看历史、对比 diff、回滚 */ import fs from 'fs/promises' +import type { Dirent } from 'fs' import path from 'path' -import os from 'os' import crypto from 'crypto' +import { dataDir } from '../config/paths.js' -const STORE_ROOT = path.join(os.homedir(), '.skill-hub', 'versions') +const STORE_ROOT = path.join(dataDir, 'versions') export interface VersionMeta { id: string // 短 hash,类似 git commit id @@ -71,7 +72,7 @@ async function readDirRecursive( currentDir: string, result: Record, ): Promise { - let entries: Awaited> + let entries: Dirent[] try { entries = await fs.readdir(currentDir, { withFileTypes: true }) } catch { @@ -382,9 +383,6 @@ function computeDiff(oldText: string, newText: string): DiffLine[] { } function longestCommonSubsequence(a: string[], b: string[]): string[] { - const m = a.length - const n = b.length - // Optimize for large files: limit to first 2000 lines const maxLen = 2000 const aa = a.slice(0, maxLen) diff --git a/tests/integration/fixture-scan.test.ts b/tests/integration/fixture-scan.test.ts new file mode 100644 index 0000000..3134d68 --- /dev/null +++ b/tests/integration/fixture-scan.test.ts @@ -0,0 +1,40 @@ +import test from 'node:test' +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' + +test('fullScan reads only the explicit fixture and project roots', async (t) => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), 'skillmanager-scan-')) + t.after(async () => fs.rm(root, { recursive: true, force: true })) + + const projectRoot = path.join(root, 'projects', 'demo') + const skills = [ + [path.join(root, '.agents', 'skills', 'shared-skill'), 'Shared Skill'], + [path.join(root, '.codex', 'skills', 'legacy-codex'), 'Legacy Codex'], + [path.join(projectRoot, '.agents', 'skills', 'project-skill'), 'Project Skill'], + ] as const + for (const [dir, name] of skills) { + await fs.mkdir(dir, { recursive: true }) + await fs.writeFile( + path.join(dir, 'SKILL.md'), + `---\nname: ${name}\ndescription: fixture\n---\nFixture only.\n`, + 'utf8', + ) + } + + process.env.SKILLMANAGER_FIXTURE_ROOT = root + process.env.SKILLMANAGER_DATA_DIR = path.join(root, 'data') + process.env.SKILLMANAGER_PROJECT_ROOT = projectRoot + const { fullScan } = await import('../../server/scanner/discovery.js') + const result = await fullScan() + + assert.deepEqual( + result.skills.map((skill) => skill.name).sort(), + ['Legacy Codex', 'Project Skill', 'Shared Skill'], + ) + for (const report of result.scannedPaths) { + const relative = path.relative(root, report.path) + assert.equal(relative === '..' || relative.startsWith('..' + path.sep), false) + } +}) diff --git a/tests/integration/trash.test.ts b/tests/integration/trash.test.ts new file mode 100644 index 0000000..7346c3b --- /dev/null +++ b/tests/integration/trash.test.ts @@ -0,0 +1,25 @@ +import test from 'node:test' +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' + +test('trash move and restore stay inside the isolated data directory', async (t) => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), 'skillmanager-trash-')) + t.after(async () => fs.rm(root, { recursive: true, force: true })) + process.env.SKILLMANAGER_FIXTURE_ROOT = root + process.env.SKILLMANAGER_DATA_DIR = path.join(root, 'data') + + const skillDir = path.join(root, '.agents', 'skills', 'recoverable') + await fs.mkdir(skillDir, { recursive: true }) + await fs.writeFile(path.join(skillDir, 'SKILL.md'), '# Recoverable\n', 'utf8') + + const { listTrash, moveToTrash, restoreFromTrash } = await import('../../server/trash/store.js') + const entry = await moveToTrash(skillDir, 'recoverable') + await assert.rejects(fs.access(skillDir)) + assert.equal((await listTrash()).some((item) => item.id === entry.id), true) + + await restoreFromTrash(entry.id) + assert.equal(await fs.readFile(path.join(skillDir, 'SKILL.md'), 'utf8'), '# Recoverable\n') + assert.equal((await listTrash()).length, 0) +}) diff --git a/tests/unit/nlp.test.ts b/tests/unit/nlp.test.ts new file mode 100644 index 0000000..17b382b --- /dev/null +++ b/tests/unit/nlp.test.ts @@ -0,0 +1,23 @@ +import test from 'node:test' +import assert from 'node:assert/strict' +import { + BUILTIN_SYNONYMS, + buildSynonymIndex, + jaccard, + tokenize, +} from '../../server/scanner/nlp.js' + +test('tokenize normalizes aliases to the same canonical concept', () => { + const index = buildSynonymIndex(BUILTIN_SYNONYMS) + const english = tokenize('Create a Xiaohongshu image', index) + const chinese = tokenize('生成小红书图片', index) + assert.equal(english.has('小红书'), true) + assert.equal(chinese.has('小红书'), true) + assert.equal(english.has('图片'), true) + assert.equal(chinese.has('图片'), true) +}) + +test('jaccard returns a stable similarity ratio', () => { + assert.equal(jaccard(new Set(['a', 'b']), new Set(['b', 'c'])), 1 / 3) + assert.equal(jaccard(new Set(), new Set(['a'])), 0) +}) diff --git a/tsconfig.json b/tsconfig.json index 86baeee..ffed97a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,5 +17,5 @@ "@server/*": ["server/*"] } }, - "include": ["web/src", "server", "vite.config.ts"] + "include": ["web/src", "server", "tests", "vite.config.ts"] } diff --git a/vite.config.ts b/vite.config.ts index 8cbbba8..6232ed6 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -2,8 +2,12 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' import path from 'path' +import packageJson from './package.json' export default defineConfig({ + define: { + __SKILLMANAGER_VERSION__: JSON.stringify(packageJson.version), + }, plugins: [react(), tailwindcss()], root: 'web', resolve: { diff --git a/web/index.html b/web/index.html index 5020603..965b0d6 100644 --- a/web/index.html +++ b/web/index.html @@ -3,7 +3,7 @@ - Skill Hub + SkillManager + + + + + diff --git a/tests/integration/action-transfer.test.ts b/tests/integration/action-transfer.test.ts index f1412c1..8ab8d77 100644 --- a/tests/integration/action-transfer.test.ts +++ b/tests/integration/action-transfer.test.ts @@ -41,6 +41,8 @@ test('copy and move use authorized target IDs and reject nested symlinks', async skillId: skill.id, targetRootId: claudeTarget.id, }) + assert.equal(copyPlan.advisories?.[0]?.code, 'EXACT_COPY_WOULD_BE_CREATED') + assert.equal(copyPlan.advisories?.[0]?.recommendedAction, 'share-existing') const copied = await service.apply(copyPlan.id) assert.equal(copied.action, 'copy') assert.match( diff --git a/tests/integration/convergence-api.test.ts b/tests/integration/convergence-api.test.ts new file mode 100644 index 0000000..94ec2f9 --- /dev/null +++ b/tests/integration/convergence-api.test.ts @@ -0,0 +1,157 @@ +import test from 'node:test' +import assert from 'node:assert/strict' +import Fastify from 'fastify' +import fs from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' + +test('convergence API exposes structured state and requires explicit apply confirmation', async (t) => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), 'skillmanager-convergence-api-')) + t.after(async () => fs.rm(root, { recursive: true, force: true })) + process.env.SKILLMANAGER_FIXTURE_ROOT = root + process.env.SKILLMANAGER_DATA_DIR = path.join(root, 'data') + + const paths = [ + path.join(root, '.agents', 'skills', 'api-copy'), + path.join(root, '.codex', 'skills', 'api-copy'), + ] + const batchPaths = [ + path.join(root, '.agents', 'skills', 'api-batch'), + path.join(root, '.codex', 'skills', 'api-batch'), + ] + for (const target of [...paths, ...batchPaths]) { + const isBatch = target.endsWith('api-batch') + await fs.mkdir(target, { recursive: true }) + await fs.writeFile( + path.join(target, 'SKILL.md'), + `---\nname: ${isBatch ? 'API Batch' : 'API Copy'}\ndescription: exact fixture\n---\nSame.\n`, + 'utf8', + ) + await fs.writeFile(path.join(target, 'reference.md'), 'same\n', 'utf8') + } + + const { skillRoutes } = await import('../../server/routes/skills.js') + const { actionRoutes } = await import('../../server/routes/actions.js') + const app = Fastify() + await skillRoutes(app) + await actionRoutes(app) + await app.ready() + t.after(() => app.close()) + + const scanResponse = await app.inject({ method: 'GET', url: '/api/scan' }) + assert.equal(scanResponse.statusCode, 200) + const group = scanResponse.json().convergenceGroups.find( + (entry: any) => entry.kind === 'exact-copy' && entry.name === 'API Copy', + ) + assert.ok(group) + assert.match(group.id, /^group_[a-f0-9]{20}$/) + assert.ok(group.recommendedCanonicalSkillId) + + const stateResponse = await app.inject({ method: 'GET', url: '/api/v1/convergence' }) + assert.equal(stateResponse.statusCode, 200) + assert.equal(stateResponse.json().schemaVersion, 1) + assert.equal(stateResponse.json().ok, true) + assert.ok(Array.isArray(stateResponse.json().agentDetections)) + assert.ok(Array.isArray(stateResponse.json().projectionIssues)) + + const previewResponse = await app.inject({ + method: 'POST', + url: '/api/v1/actions/converge/preview', + payload: { + canonicalSkillId: group.recommendedCanonicalSkillId, + duplicateSkillIds: group.skillIds.filter( + (skillId: string) => skillId !== group.recommendedCanonicalSkillId, + ), + }, + }) + assert.equal(previewResponse.statusCode, 200, previewResponse.body) + const plan = previewResponse.json().plan + assert.equal(plan.action, 'converge') + assert.equal(plan.requiresExplicitConfirmation, true) + assert.ok(plan.changes.every((change: any) => change.operation === 'link')) + + const refused = await app.inject({ + method: 'POST', + url: `/api/v1/actions/${plan.id}/apply`, + payload: { confirm: false }, + }) + assert.equal(refused.statusCode, 400) + assert.equal(refused.json().code, 'EXPLICIT_CONFIRMATION_REQUIRED') + + const applied = await app.inject({ + method: 'POST', + url: `/api/v1/actions/${plan.id}/apply`, + payload: { confirm: true }, + }) + assert.equal(applied.statusCode, 200, applied.body) + assert.equal(applied.json().verification.projectionCount, 1) + assert.match(applied.json().recovery.transactionId, /^convergence_/) + + const afterState = await app.inject({ method: 'GET', url: '/api/v1/convergence' }) + const transaction = afterState.json().transactions.find( + (entry: any) => entry.id === applied.json().recovery.transactionId, + ) + assert.equal(transaction.status, 'applied') + assert.equal(transaction.projectionCount, 1) + assert.equal(transaction.rollbackAvailable, true) + assert.equal(transaction.reason, 'available') + assert.match(transaction.recoveryExpiresAt, /^\d{4}-\d{2}-\d{2}T/) + assert.ok(transaction.daysRemaining >= 1) + + const rollbackPreview = await app.inject({ + method: 'POST', + url: '/api/v1/actions/converge-rollback/preview', + payload: { transactionId: transaction.id }, + }) + assert.equal(rollbackPreview.statusCode, 200, rollbackPreview.body) + const rollback = await app.inject({ + method: 'POST', + url: `/api/v1/actions/${rollbackPreview.json().plan.id}/apply`, + payload: { confirm: true }, + }) + assert.equal(rollback.statusCode, 200, rollback.body) + assert.equal(rollback.json().verification.rolledBack, true) + assert.equal((await fs.lstat(paths[1])).isSymbolicLink(), false) + + const refreshed = await app.inject({ method: 'GET', url: '/api/scan' }) + const safeGroups = refreshed.json().convergenceGroups.filter( + (entry: any) => entry.kind === 'exact-copy' && entry.eligible && ['API Copy', 'API Batch'].includes(entry.name), + ) + assert.equal(safeGroups.length, 2) + const batchPreview = await app.inject({ + method: 'POST', + url: '/api/v1/actions/converge-batch/preview', + payload: { + groups: safeGroups.map((entry: any) => ({ + canonicalSkillId: entry.recommendedCanonicalSkillId, + duplicateSkillIds: entry.skillIds.filter( + (skillId: string) => skillId !== entry.recommendedCanonicalSkillId, + ), + })), + }, + }) + assert.equal(batchPreview.statusCode, 200, batchPreview.body) + assert.equal(batchPreview.json().plan.groupCount, 2) + assert.equal(batchPreview.json().plan.permanentDeleteCount, 0) + assert.equal(batchPreview.json().plan.recoveryDays, 7) + + const refusedBatch = await app.inject({ + method: 'POST', + url: `/api/v1/actions/converge-batch/${batchPreview.json().plan.id}/apply`, + payload: { confirm: false }, + }) + assert.equal(refusedBatch.statusCode, 400) + assert.equal(refusedBatch.json().code, 'EXPLICIT_CONFIRMATION_REQUIRED') + + const appliedBatch = await app.inject({ + method: 'POST', + url: `/api/v1/actions/converge-batch/${batchPreview.json().plan.id}/apply`, + payload: { confirm: true }, + }) + assert.equal(appliedBatch.statusCode, 200, appliedBatch.body) + assert.equal(appliedBatch.json().status, 'complete') + assert.equal(appliedBatch.json().successes.length, 2) + assert.equal(appliedBatch.json().failures.length, 0) + assert.equal((await fs.lstat(paths[1])).isSymbolicLink(), true) + assert.equal((await fs.lstat(batchPaths[1])).isSymbolicLink(), true) +}) diff --git a/tests/integration/convergence.test.ts b/tests/integration/convergence.test.ts new file mode 100644 index 0000000..dc2f5ec --- /dev/null +++ b/tests/integration/convergence.test.ts @@ -0,0 +1,430 @@ +import test from 'node:test' +import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' + +async function writeSkill( + root: string, + agentRoot: string, + directory: string, + name: string, + body: string, + extra = 'same support file\n', +) { + const target = path.join(root, agentRoot, 'skills', directory) + await fs.mkdir(target, { recursive: true }) + await fs.writeFile( + path.join(target, 'SKILL.md'), + `---\nname: ${name}\ndescription: convergence fixture\n---\n${body}\n`, + 'utf8', + ) + await fs.writeFile(path.join(target, 'support.txt'), extra, 'utf8') + return target +} + +test('convergence is exact-copy only, transactional, verifiable, and recoverable', async (t) => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), 'skillmanager-convergence-')) + t.after(async () => fs.rm(root, { recursive: true, force: true })) + process.env.SKILLMANAGER_FIXTURE_ROOT = root + process.env.SKILLMANAGER_DATA_DIR = path.join(root, 'data') + process.env.SKILLMANAGER_PROJECT_ROOT = path.join(root, 'projects', 'demo') + + const happyCanonical = await writeSkill(root, '.agents', 'happy', 'Happy', 'same package') + const happyDuplicate = await writeSkill(root, '.codex', 'happy', 'Happy', 'same package') + await writeSkill(root, '.agents', 'conflict-a', 'Conflict', 'version A') + await writeSkill(root, '.codex', 'conflict-b', 'Conflict', 'version B') + const failureCanonical = await writeSkill(root, '.agents', 'failure', 'Failure', 'same failure package') + const failureCodex = await writeSkill(root, '.codex', 'failure', 'Failure', 'same failure package') + const failureClaude = await writeSkill(root, '.claude', 'failure', 'Failure', 'same failure package') + const batchOneCanonical = await writeSkill(root, '.agents', 'batch-one', 'Batch One', 'same batch one') + const batchOneDuplicate = await writeSkill(root, '.codex', 'batch-one', 'Batch One', 'same batch one') + const batchTwoCanonical = await writeSkill(root, '.agents', 'batch-two', 'Batch Two', 'same batch two') + const batchTwoDuplicate = await writeSkill(root, '.codex', 'batch-two', 'Batch Two', 'same batch two') + const deleteRaceCanonical = await writeSkill(root, '.agents', 'delete-race', 'Delete Race', 'same delete race') + const deleteRaceDuplicate = await writeSkill(root, '.codex', 'delete-race', 'Delete Race', 'same delete race') + const moveRaceCanonical = await writeSkill(root, '.agents', 'move-race', 'Move Race', 'same move race') + const moveRaceDuplicate = await writeSkill(root, '.codex', 'move-race', 'Move Race', 'same move race') + await fs.writeFile(path.join(root, '.claude', 'settings.json'), '{}\n', 'utf8') + await writeSkill(root, '.agents', 'extra-drift', 'Extra Drift', 'same SKILL.md', 'support A\n') + await writeSkill(root, '.codex', 'extra-drift', 'Extra Drift', 'same SKILL.md', 'support B\n') + const unsafeCanonical = await writeSkill(root, '.agents', 'unsafe', 'Unsafe', 'same unsafe package') + await writeSkill(root, '.codex', 'unsafe', 'Unsafe', 'same unsafe package') + await writeSkill(root, '.agents', 'cross-scope', 'Cross Scope', 'same scoped package') + const projectCrossScope = path.join(root, 'projects', 'demo', '.agents', 'skills', 'cross-scope') + await fs.mkdir(projectCrossScope, { recursive: true }) + await fs.writeFile( + path.join(projectCrossScope, 'SKILL.md'), + '---\nname: Cross Scope\ndescription: convergence fixture\n---\nsame scoped package\n', + 'utf8', + ) + await fs.writeFile(path.join(projectCrossScope, 'support.txt'), 'same support file\n', 'utf8') + + const outside = path.join(root, 'outside') + await fs.mkdir(outside, { recursive: true }) + await fs.writeFile(path.join(outside, 'secret.txt'), 'must never be projected', 'utf8') + for (const target of [unsafeCanonical, path.join(root, '.codex', 'skills', 'unsafe')]) { + await fs.symlink(path.relative(target, outside), path.join(target, 'external')) + } + await fs.mkdir(path.join(root, '.cursor', 'skills'), { recursive: true }) + await fs.symlink( + path.join(root, 'missing-target'), + path.join(root, '.cursor', 'skills', 'broken'), + ) + + const { getCatalog } = await import('../../server/core/catalog.js') + const { ActionPlanError, ActionPlanService } = await import('../../server/core/action-plans.js') + const { hashSkillDirectory } = await import('../../server/scanner/package-hash.js') + const { + getConvergenceRecoveryStatus, + getConvergenceTransaction, + } = await import('../../server/projections/store.js') + + const service = new ActionPlanService() + let catalog = await getCatalog(true) + const happyGroup = catalog.convergenceGroups.find( + (group) => group.kind === 'exact-copy' && group.name === 'Happy', + ) + assert.ok(happyGroup) + assert.equal(happyGroup.eligible, true) + assert.equal(happyGroup.skills.length, 2) + assert.ok(happyGroup.recommendedCanonicalSkillId) + assert.ok(happyGroup.canonicalCandidateSkillIds.includes(happyGroup.recommendedCanonicalSkillId)) + + const conflictGroup = catalog.convergenceGroups.find( + (group) => group.kind === 'name-conflict' && group.name === 'Conflict', + ) + assert.ok(conflictGroup) + assert.equal(conflictGroup.eligible, false) + assert.equal(catalog.convergenceGroups.some( + (group) => group.kind === 'exact-copy' && group.name === 'Conflict', + ), false) + assert.equal(catalog.convergenceGroups.some( + (group) => group.kind === 'exact-copy' && group.name === 'Extra Drift', + ), false) + assert.ok(catalog.convergenceGroups.some( + (group) => group.kind === 'name-conflict' && group.name === 'Extra Drift', + )) + await assert.rejects( + service.previewConverge({ + canonicalSkillId: conflictGroup.skills[0].id, + duplicateSkillIds: [conflictGroup.skills[1].id], + }), + (error: unknown) => error instanceof ActionPlanError && error.code === 'PACKAGE_HASH_MISMATCH', + ) + + const unsafeGroup = catalog.convergenceGroups.find( + (group) => group.kind === 'exact-copy' && group.name === 'Unsafe', + ) + assert.ok(unsafeGroup) + await assert.rejects( + service.previewConverge({ + canonicalSkillId: unsafeGroup.recommendedCanonicalSkillId!, + duplicateSkillIds: unsafeGroup.skillIds.filter( + (skillId) => skillId !== unsafeGroup.recommendedCanonicalSkillId, + ), + }), + (error: unknown) => error instanceof ActionPlanError && error.code === 'UNSAFE_PACKAGE_LINK', + ) + assert.equal((await fs.lstat(unsafeCanonical)).isDirectory(), true) + assert.equal(await fs.readFile(path.join(outside, 'secret.txt'), 'utf8'), 'must never be projected') + + const crossScopeGroup = catalog.convergenceGroups.find( + (group) => group.kind === 'exact-copy' && group.name === 'Cross Scope', + ) + assert.ok(crossScopeGroup) + assert.equal(crossScopeGroup.eligible, false) + assert.deepEqual(crossScopeGroup.canonicalCandidateSkillIds, []) + assert.match(crossScopeGroup.reason, /全局与项目作用域/) + const globalCrossScope = crossScopeGroup.skills.find((skill) => ( + skill.installations.some((installation) => installation.scope === 'global') + )) + const scopedCrossScope = crossScopeGroup.skills.find((skill) => ( + skill.installations.some((installation) => installation.scope === 'project') + )) + assert.ok(globalCrossScope && scopedCrossScope) + await assert.rejects( + service.previewConverge({ + canonicalSkillId: globalCrossScope.id, + duplicateSkillIds: [scopedCrossScope.id], + }), + (error: unknown) => error instanceof ActionPlanError && error.code === 'SCOPE_BOUNDARY', + ) + await assert.rejects( + service.previewConvergeBatch({ + groups: [{ + canonicalSkillId: globalCrossScope.id, + duplicateSkillIds: [scopedCrossScope.id], + }], + }), + (error: unknown) => error instanceof ActionPlanError && error.code === 'BATCH_GROUP_NOT_ELIGIBLE', + ) + await assert.rejects( + service.previewConvergeBatch({ + groups: [{ + canonicalSkillId: conflictGroup.skills[0].id, + duplicateSkillIds: [conflictGroup.skills[1].id], + }], + }), + (error: unknown) => error instanceof ActionPlanError && error.code === 'BATCH_GROUP_NOT_ELIGIBLE', + ) + + assert.ok(catalog.projectionIssues.some((issue) => ( + issue.status === 'broken' && issue.targetPath.endsWith(path.join('skills', 'broken')) + ))) + assert.equal( + catalog.agentDetections.find((entry) => entry.agentId === 'codex')?.status, + 'residue', + ) + assert.equal( + catalog.agentDetections.find((entry) => entry.agentId === 'claude-code')?.status, + 'installed', + ) + assert.equal( + catalog.agentDetections.find((entry) => entry.agentId === 'universal')?.status, + 'shared-standard', + ) + + const canonicalId = happyGroup.recommendedCanonicalSkillId! + const convergePlan = await service.previewConverge({ + canonicalSkillId: canonicalId, + duplicateSkillIds: happyGroup.skillIds.filter((skillId) => skillId !== canonicalId), + }) + assert.equal(convergePlan.action, 'converge') + assert.ok(convergePlan.changes.every((change) => change.operation === 'link')) + const applied = await service.apply(convergePlan.id) + assert.equal(applied.action, 'converge') + assert.equal(applied.verification.projectionCount, 1) + assert.ok(applied.recovery.transactionId) + assert.equal((await fs.lstat(happyDuplicate)).isSymbolicLink(), true) + assert.equal(await fs.realpath(happyDuplicate), await fs.realpath(happyCanonical)) + + catalog = await getCatalog(true) + const converged = catalog.skills.find((skill) => skill.name === 'Happy') + assert.ok(converged) + assert.equal(converged.installations.length, 2) + const managedProjection = converged.installations.find( + (installation) => path.resolve(installation.path) === path.resolve(happyDuplicate), + ) + assert.equal(managedProjection?.managedBy, 'skillmanager') + assert.equal(managedProjection?.status, 'valid') + assert.equal(managedProjection?.canUnlinkProjection, true) + + const canonicalInstallation = converged.installations.find( + (installation) => path.resolve(installation.path) === path.resolve(happyCanonical), + ) + assert.ok(canonicalInstallation) + await assert.rejects( + service.previewDelete({ + skillId: converged.id, + installationId: canonicalInstallation.id, + }), + (error: unknown) => error instanceof ActionPlanError && error.code === 'CANONICAL_IN_USE', + ) + const claudeRoot = catalog.authorizedRoots.find((candidate) => ( + candidate.agent === 'claude-code' && candidate.scope === 'global' + )) + assert.ok(claudeRoot) + await assert.rejects( + service.previewTransfer('move', { + skillId: converged.id, + installationId: canonicalInstallation.id, + targetRootId: claudeRoot.id, + }), + (error: unknown) => error instanceof ActionPlanError && error.code === 'CANONICAL_IN_USE', + ) + + const activeTransaction = await getConvergenceTransaction(applied.recovery.transactionId!) + assert.ok(activeTransaction?.recoveryExpiresAt) + const recovery = await getConvergenceRecoveryStatus(activeTransaction!) + assert.equal(recovery.rollbackAvailable, true) + assert.equal(recovery.reason, 'available') + assert.ok(recovery.daysRemaining >= 1) + const afterExpiry = await getConvergenceRecoveryStatus( + activeTransaction!, + new Date(activeTransaction!.recoveryExpiresAt!).getTime() + 1, + ) + assert.equal(afterExpiry.rollbackAvailable, false) + assert.equal(afterExpiry.reason, 'expired') + + const rollbackPlan = await service.previewConvergeRollback(applied.recovery.transactionId!) + assert.equal(rollbackPlan.action, 'converge-rollback') + const rolledBack = await service.apply(rollbackPlan.id) + assert.equal(rolledBack.verification.rolledBack, true) + assert.equal((await fs.lstat(happyDuplicate)).isSymbolicLink(), false) + assert.equal( + await hashSkillDirectory(happyDuplicate), + await hashSkillDirectory(happyCanonical), + ) + + catalog = await getCatalog(true) + const happyAgain = catalog.convergenceGroups.find( + (group) => group.kind === 'exact-copy' && group.name === 'Happy', + ) + assert.ok(happyAgain?.recommendedCanonicalSkillId) + const secondPlan = await service.previewConverge({ + canonicalSkillId: happyAgain.recommendedCanonicalSkillId, + duplicateSkillIds: happyAgain.skillIds.filter( + (skillId) => skillId !== happyAgain.recommendedCanonicalSkillId, + ), + }) + const secondApplied = await service.apply(secondPlan.id) + await fs.unlink(happyDuplicate) + await fs.mkdir(happyDuplicate) + await fs.writeFile(path.join(happyDuplicate, 'SKILL.md'), 'DO NOT DELETE\n', 'utf8') + await assert.rejects( + service.previewConvergeRollback(secondApplied.recovery.transactionId!), + (error: unknown) => error instanceof ActionPlanError && error.code === 'PROJECTION_WRONG_TARGET', + ) + assert.equal(await fs.readFile(path.join(happyDuplicate, 'SKILL.md'), 'utf8'), 'DO NOT DELETE\n') + catalog = await getCatalog(true) + assert.ok(catalog.projectionIssues.some((issue) => ( + issue.status === 'wrong-target' && path.resolve(issue.targetPath) === path.resolve(happyDuplicate) + ))) + + const failureGroup = catalog.convergenceGroups.find( + (group) => group.kind === 'exact-copy' && group.name === 'Failure', + ) + assert.ok(failureGroup?.recommendedCanonicalSkillId) + let createCalls = 0 + const failingService = new ActionPlanService({ + createDirectoryProjection: async (canonicalPath, targetPath) => { + createCalls += 1 + if (createCalls === 2) throw new Error('injected projection failure') + if (process.platform === 'win32') { + await fs.symlink(canonicalPath, targetPath, 'junction') + return 'junction' + } + await fs.symlink(canonicalPath, targetPath, 'dir') + return 'symlink' + }, + }) + const failingPlan = await failingService.previewConverge({ + canonicalSkillId: failureGroup.recommendedCanonicalSkillId, + duplicateSkillIds: failureGroup.skillIds.filter( + (skillId) => skillId !== failureGroup.recommendedCanonicalSkillId, + ), + }) + await assert.rejects( + failingService.apply(failingPlan.id), + (error: unknown) => error instanceof ActionPlanError && error.code === 'CONVERGENCE_FAILED', + ) + for (const target of [failureCodex, failureClaude]) { + assert.equal((await fs.lstat(target)).isSymbolicLink(), false) + assert.equal( + await hashSkillDirectory(target), + await hashSkillDirectory(failureCanonical), + ) + } + + catalog = await getCatalog(true) + const batchOneGroup = catalog.convergenceGroups.find( + (group) => group.kind === 'exact-copy' && group.name === 'Batch One', + ) + const batchTwoGroup = catalog.convergenceGroups.find( + (group) => group.kind === 'exact-copy' && group.name === 'Batch Two', + ) + assert.ok(batchOneGroup?.recommendedCanonicalSkillId) + assert.ok(batchTwoGroup?.recommendedCanonicalSkillId) + const partialService = new ActionPlanService({ + createDirectoryProjection: async (canonicalPath, targetPath) => { + if (targetPath.includes('batch-two')) throw new Error('injected batch group failure') + if (process.platform === 'win32') { + await fs.symlink(canonicalPath, targetPath, 'junction') + return 'junction' + } + await fs.symlink(canonicalPath, targetPath, 'dir') + return 'symlink' + }, + }) + const batchPlan = await partialService.previewConvergeBatch({ + groups: [batchOneGroup, batchTwoGroup].map((group) => ({ + canonicalSkillId: group!.recommendedCanonicalSkillId!, + duplicateSkillIds: group!.skillIds.filter( + (skillId) => skillId !== group!.recommendedCanonicalSkillId, + ), + })), + }) + assert.equal(batchPlan.groupCount, 2) + assert.equal(batchPlan.permanentDeleteCount, 0) + assert.equal(batchPlan.recoveryDays, 7) + const batchResult = await partialService.applyConvergeBatch(batchPlan.id) + assert.equal(batchResult.status, 'partial') + assert.equal(batchResult.successes.length, 1) + assert.equal(batchResult.failures.length, 1) + assert.equal((await fs.lstat(batchOneDuplicate)).isSymbolicLink(), true) + assert.equal(await fs.realpath(batchOneDuplicate), await fs.realpath(batchOneCanonical)) + assert.equal((await fs.lstat(batchTwoDuplicate)).isSymbolicLink(), false) + assert.equal( + await hashSkillDirectory(batchTwoDuplicate), + await hashSkillDirectory(batchTwoCanonical), + ) + const batchRollback = await partialService.previewConvergeRollback( + batchResult.successes[0].transactionId, + ) + await partialService.apply(batchRollback.id) + assert.equal((await fs.lstat(batchOneDuplicate)).isSymbolicLink(), false) + + catalog = await getCatalog(true) + const deleteRaceGroup = catalog.convergenceGroups.find( + (group) => group.kind === 'exact-copy' && group.name === 'Delete Race', + ) + assert.ok(deleteRaceGroup?.recommendedCanonicalSkillId) + const deleteCanonical = deleteRaceGroup.skills.find( + (skill) => skill.id === deleteRaceGroup.recommendedCanonicalSkillId, + )! + const deleteCanonicalInstallation = deleteCanonical.installations.find( + (installation) => !installation.isSymlink && installation.canDeleteCanonical, + )! + const staleDeletePlan = await service.previewDelete({ + skillId: deleteCanonical.id, + installationId: deleteCanonicalInstallation.id, + }) + const deleteConvergePlan = await service.previewConverge({ + canonicalSkillId: deleteRaceGroup.recommendedCanonicalSkillId, + duplicateSkillIds: deleteRaceGroup.skillIds.filter( + (skillId) => skillId !== deleteRaceGroup.recommendedCanonicalSkillId, + ), + }) + const deleteConverged = await service.apply(deleteConvergePlan.id) + await assert.rejects( + service.apply(staleDeletePlan.id), + (error: unknown) => error instanceof ActionPlanError && error.code === 'CANONICAL_IN_USE', + ) + assert.equal((await fs.lstat(deleteRaceCanonical)).isDirectory(), true) + assert.equal((await fs.lstat(deleteRaceDuplicate)).isSymbolicLink(), true) + const deleteRollback = await service.previewConvergeRollback(deleteConverged.recovery.transactionId!) + await service.apply(deleteRollback.id) + + catalog = await getCatalog(true) + const moveRaceGroup = catalog.convergenceGroups.find( + (group) => group.kind === 'exact-copy' && group.name === 'Move Race', + ) + assert.ok(moveRaceGroup?.recommendedCanonicalSkillId) + const moveCanonical = moveRaceGroup.skills.find( + (skill) => skill.id === moveRaceGroup.recommendedCanonicalSkillId, + )! + const moveCanonicalInstallation = moveCanonical.installations.find( + (installation) => !installation.isSymlink && installation.canDeleteCanonical, + )! + const staleMovePlan = await service.previewTransfer('move', { + skillId: moveCanonical.id, + installationId: moveCanonicalInstallation.id, + targetRootId: claudeRoot.id, + }) + const moveConvergePlan = await service.previewConverge({ + canonicalSkillId: moveRaceGroup.recommendedCanonicalSkillId, + duplicateSkillIds: moveRaceGroup.skillIds.filter( + (skillId) => skillId !== moveRaceGroup.recommendedCanonicalSkillId, + ), + }) + const moveConverged = await service.apply(moveConvergePlan.id) + await assert.rejects( + service.apply(staleMovePlan.id), + (error: unknown) => error instanceof ActionPlanError && error.code === 'CANONICAL_IN_USE', + ) + assert.equal((await fs.lstat(moveRaceCanonical)).isDirectory(), true) + assert.equal((await fs.lstat(moveRaceDuplicate)).isSymbolicLink(), true) + const moveRollback = await service.previewConvergeRollback(moveConverged.recovery.transactionId!) + await service.apply(moveRollback.id) +}) diff --git a/tests/integration/dashboard-context.test.ts b/tests/integration/dashboard-context.test.ts index fdcbcde..1dd9b75 100644 --- a/tests/integration/dashboard-context.test.ts +++ b/tests/integration/dashboard-context.test.ts @@ -14,6 +14,8 @@ test('Dashboard context resolves current and opaque targets without path leakage [path.join(root, '.agents', 'skills', 'main-skill'), 'Main Fixture', 'Use when testing dashboard links.'], [path.join(root, '.claude', 'skills', 'conflict-one'), 'Same Name', 'short'], [path.join(root, '.claude', 'skills', 'conflict-two'), 'Same Name', 'tiny'], + [path.join(root, '.agents', 'skills', 'exact-copy'), 'Exact Copy', 'same package'], + [path.join(root, '.codex', 'skills', 'exact-copy'), 'Exact Copy', 'same package'], [path.join(projectRoot, '.agents', 'skills', 'project-skill'), 'Project Fixture', 'Use when testing current projects.'], ] as const for (const [dir, name, description] of fixtures) { @@ -39,15 +41,20 @@ test('Dashboard context resolves current and opaque targets without path leakage const skill = catalog.skills.find((candidate: any) => candidate.name === 'Main Fixture') const finding = catalog.health.diagnostics[0] const group = catalog.conflicts[0] + const convergence = catalog.convergenceGroups.find( + (candidate: any) => candidate.kind === 'exact-copy' && candidate.name === 'Exact Copy', + ) assert.match(skill.id, /^skill_[a-f0-9]{24}$/) assert.match(finding.id, /^finding_[a-f0-9]{20}$/) assert.match(group.id, /^group_[a-f0-9]{20}$/) + assert.match(convergence.id, /^group_[a-f0-9]{20}$/) const cases = [ `/api/v1/dashboard-context?view=skills&skill=${skill.id}`, `/api/v1/dashboard-context?view=versions&skill=${skill.id}`, `/api/v1/dashboard-context?view=doctor&finding=${finding.id}`, `/api/v1/dashboard-context?view=conflicts&group=${group.id}`, + `/api/v1/dashboard-context?view=convergence&group=${convergence.id}`, '/api/v1/dashboard-context?view=current-project', ] for (const url of cases) { @@ -69,6 +76,7 @@ test('Dashboard context resolves current and opaque targets without path leakage `/api/v1/dashboard-context?view=skills&skill=skill_${'0'.repeat(24)}`, `/api/v1/dashboard-context?view=doctor&finding=finding_${'0'.repeat(20)}`, `/api/v1/dashboard-context?view=conflicts&group=group_${'0'.repeat(20)}`, + `/api/v1/dashboard-context?view=convergence&group=group_${'0'.repeat(20)}`, ]) { const stale = await app.inject({ method: 'GET', url }) assert.equal(stale.statusCode, 404) diff --git a/tests/integration/mcp-tools.test.ts b/tests/integration/mcp-tools.test.ts index ffa942c..d0f27df 100644 --- a/tests/integration/mcp-tools.test.ts +++ b/tests/integration/mcp-tools.test.ts @@ -180,6 +180,13 @@ test('P0 MCP tools are structured, redacted, paginated, and browser-safe', async } assert.equal(openedOutput.target, `/?view=skills&skill=${listing.items[0].id}`) assert.equal(openedOutput.expiresInSeconds, 60) + const dashboardLink = opened.content.find((item) => item.type === 'resource_link') + assert.equal(dashboardLink?.type, 'resource_link') + if (dashboardLink?.type === 'resource_link') { + assert.equal(dashboardLink.uri, openedOutput.launchUrl) + assert.equal(dashboardLink.name, 'skillmanager-dashboard') + assert.equal(dashboardLink.mimeType, 'text/html') + } const launch = await fetch(openedOutput.launchUrl, { redirect: 'manual' }) assert.equal(launch.status, 303) assert.equal(launch.headers.get('location'), openedOutput.target) diff --git a/tests/unit/dashboard-context.test.ts b/tests/unit/dashboard-context.test.ts index 688595a..b2b32c2 100644 --- a/tests/unit/dashboard-context.test.ts +++ b/tests/unit/dashboard-context.test.ts @@ -30,6 +30,10 @@ test('Dashboard routes build only valid opaque deep links', () => { dashboardTarget({ view: 'conflicts', groupId }), `/?view=conflicts&group=${groupId}`, ) + assert.equal( + dashboardTarget({ view: 'convergence', groupId }), + `/?view=convergence&group=${groupId}`, + ) assert.throws( () => dashboardTarget({ view: 'versions' }), diff --git a/tests/unit/frontend-routing.test.ts b/tests/unit/frontend-routing.test.ts index be692d7..553acf6 100644 --- a/tests/unit/frontend-routing.test.ts +++ b/tests/unit/frontend-routing.test.ts @@ -7,6 +7,7 @@ import { const skillId = `skill_${'a'.repeat(24)}` const findingId = `finding_${'b'.repeat(20)}` +const groupId = `group_${'c'.repeat(20)}` test('frontend routes survive refresh-safe parsing and reject ambiguous links', () => { assert.deepEqual(parseDashboardLocation(''), { @@ -23,6 +24,14 @@ test('frontend routes survive refresh-safe parsing and reject ambiguous links', buildDashboardLocation({ view: 'doctor', findingId }), `/?view=doctor&finding=${findingId}`, ) + assert.equal( + buildDashboardLocation({ view: 'convergence', groupId }), + `/?view=convergence&group=${groupId}`, + ) + assert.equal( + parseDashboardLocation(`?view=convergence&group=${groupId}`).route.view, + 'convergence', + ) assert.equal(parseDashboardLocation('?view=versions').error?.code, 'MISSING_TARGET') assert.equal( parseDashboardLocation(`?view=doctor&skill=${skillId}`).error?.code, diff --git a/tests/unit/sync-download-plan.test.ts b/tests/unit/sync-download-plan.test.ts index 5b59ef0..bf6ef28 100644 --- a/tests/unit/sync-download-plan.test.ts +++ b/tests/unit/sync-download-plan.test.ts @@ -1,5 +1,8 @@ import test from 'node:test' import assert from 'node:assert/strict' +import fs from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' import type { ScanResult } from '../../server/types.js' import type { DownloadListing } from '../../server/sync/download.js' import type { SyncConfig } from '../../server/sync/config.js' @@ -79,3 +82,36 @@ test('sync plan becomes stale when the remote row signature changes', async () = error instanceof SyncDownloadPlanError && error.code === 'STALE_PLAN', ) }) + +test('sync download preview advises reusing an exact local main version', async (t) => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), 'skillmanager-sync-advice-')) + t.after(async () => fs.rm(root, { recursive: true, force: true })) + const remoteDir = path.join(root, 'vault', 'codex', 'demo') + await fs.mkdir(remoteDir, { recursive: true }) + await fs.writeFile( + path.join(remoteDir, 'SKILL.md'), + '---\nname: Demo\ndescription: exact remote\n---\nSame.\n', + 'utf8', + ) + const { hashSkillDirectory } = await import('../../server/scanner/package-hash.js') + const packageHash = await hashSkillDirectory(remoteDir) + assert.ok(packageHash) + const existing = { + id: 'skill_aaaaaaaaaaaaaaaaaaaaaaaa', + name: 'Existing Demo', + packageHash, + scope: 'global', + installations: [{ scope: 'global' }], + } + const fixtureScan = { skills: [existing] } as unknown as ScanResult + const service = new SyncDownloadPlanService({ + scan: async () => fixtureScan, + listing: async () => ({ ok: true, listing: listing() }), + apply: async () => ({ ok: true, applied: [] }), + vaultDir: () => path.join(root, 'vault'), + }) + const plan = await service.preview(config, ['codex/demo']) + assert.equal(plan.advisories.length, 1) + assert.equal(plan.advisories[0].code, 'EXACT_COPY_AVAILABLE') + assert.equal(plan.advisories[0].canonicalSkillId, existing.id) +}) diff --git a/web/index.html b/web/index.html index 23b7641..c1de071 100644 --- a/web/index.html +++ b/web/index.html @@ -4,7 +4,7 @@ SkillManager - + + +

+
SkillManager / identity study / 2026
+

One source.
Every agent.

+

不是给“AI”再画一个闪光图标,而是把 SkillManager 的真实工作画出来:把散落在不同 Agent 目录里的 Skills,安全地汇到一个可追踪的主版本。

+
+
01

Canonical Link

两个端点共享同一个链接中心。直白,但更像通用链接工具。

+
02

Shared Spine

多个 Agent 挂到一条主干,强调“共享而非复制”。

+
SELECTED03

Convergence Rails

三处安装汇入一个主版本。最贴合产品,也最容易形成独立识别。

+
04

One Source

中心源服务多个端点,结构完整,但小尺寸节点较多。

+
05

Safe Loop

把预览、确认、回滚画成闭环,安全感强,管理含义稍弱。

+
06

Agent Mesh

多 Agent 网络结构,适合生态叙事,但没有突出唯一主版本。

+
+
Selected mark / scale check
+
diff --git a/branding/logo-variants/01-canonical-link.svg b/branding/logo-variants/01-canonical-link.svg new file mode 100644 index 0000000..7076153 --- /dev/null +++ b/branding/logo-variants/01-canonical-link.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/branding/logo-variants/02-shared-spine.svg b/branding/logo-variants/02-shared-spine.svg new file mode 100644 index 0000000..2d06c37 --- /dev/null +++ b/branding/logo-variants/02-shared-spine.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/branding/logo-variants/03-convergence-rails.svg b/branding/logo-variants/03-convergence-rails.svg new file mode 100644 index 0000000..0831749 --- /dev/null +++ b/branding/logo-variants/03-convergence-rails.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/branding/logo-variants/04-one-source.svg b/branding/logo-variants/04-one-source.svg new file mode 100644 index 0000000..29caecf --- /dev/null +++ b/branding/logo-variants/04-one-source.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branding/logo-variants/05-safe-loop.svg b/branding/logo-variants/05-safe-loop.svg new file mode 100644 index 0000000..c2453eb --- /dev/null +++ b/branding/logo-variants/05-safe-loop.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/branding/logo-variants/06-agent-mesh.svg b/branding/logo-variants/06-agent-mesh.svg new file mode 100644 index 0000000..f9c0536 --- /dev/null +++ b/branding/logo-variants/06-agent-mesh.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branding/skillmanager-mark-light.svg b/branding/skillmanager-mark-light.svg new file mode 100644 index 0000000..66d29e7 --- /dev/null +++ b/branding/skillmanager-mark-light.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branding/skillmanager-mark.svg b/branding/skillmanager-mark.svg new file mode 100644 index 0000000..311b61f --- /dev/null +++ b/branding/skillmanager-mark.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/codex-plugin-release.md b/docs/codex-plugin-release.md new file mode 100644 index 0000000..0361a31 --- /dev/null +++ b/docs/codex-plugin-release.md @@ -0,0 +1,46 @@ +# SkillManager Codex Plugin 发布手册 + +## 发布目标 + +`release/codex-marketplace/` 本身就是 Marketplace 根目录: + +- `.agents/plugins/marketplace.json`:Marketplace `backtthefuture`。 +- `plugins/skillmanager/`:可独立运行的插件。 +- `plugins/skillmanager/release-manifest.json`:源码、版本、目标平台、原生二进制与内容哈希证明。 + +插件运行时不依赖源码仓库的 `dist/`、`node_modules/`,也不依赖全局安装的 `skillmanager`。服务端和 MCP 被构建成两个 Node.js bundle;前端作为静态文件随包分发;同一发布物携带 `@napi-rs/keyring` 声明的 12 个官方原生绑定,并在运行时按操作系统、CPU 与 Linux libc 自动选择。 + +## 构建与门禁 + +```bash +npm ci +npm run plugin:pack:verify +python3 /scripts/validate_plugin.py release/codex-marketplace/plugins/skillmanager +``` + +`plugin:pack:verify` 必须在隔离临时目录完成以下检查: + +1. Marketplace、Plugin、Skill 与 MCP 配置合法且互相一致。 +2. MCP 完成初始化、工具发现、`get_status`、`list_skills` 和 `open_dashboard`。 +3. Dashboard 链接只使用 `127.0.0.1`,60 秒过期且只能消费一次。 +4. 本地服务健康、版本一致、可停止;发布物包含全部锁定原生绑定,且当前系统对应的绑定能够真实加载。 +5. 发布物不含软链、开发依赖、源码绝对路径或常见凭据。 + +所有文件系统测试必须设置 `SKILLMANAGER_FIXTURE_ROOT` 和 `SKILLMANAGER_DATA_DIR`,不得扫描或改写真实用户 Skills。 + +## 用户安装路径 + +将 `release/codex-marketplace/` 作为下载目录或独立发布分支的仓库根目录后: + +```bash +codex plugin marketplace add +codex plugin add skillmanager@backtthefuture +``` + +用户需要新建 Codex 对话,再点击推荐提示或输入“打开 SkillManager”。Codex 调用插件 MCP,MCP 启动或复用本地服务,并返回一个可点击的一次性链接;不要引导用户打开任何 `file://` 页面。 + +## 发布边界 + +- 发布物是通用包;源码 CI 在 macOS、Ubuntu、Windows 的 Node.js 20/22 上分别执行同一隔离门禁。FreeBSD、Linux ARM/RISC-V 与 musl 目标只完成锁定制品和哈希的静态校验,不能表述为真实运行验收。 +- 本地验收必须使用测试隔离目录。公开 Git Marketplace 的最终验收可以临时安装远程插件,但要先记录并保留用户现有的个人插件状态。 +- 对外发布时应把 `release/codex-marketplace/` 放在 Marketplace 来源根目录;不要把开发仓库根目录误当成 Marketplace 根目录。 diff --git a/package-lock.json b/package-lock.json index eee2f67..1989a43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,12 +33,14 @@ "@types/ws": "^8.18.1", "@vitejs/plugin-react": "^4.4.1", "concurrently": "^9.2.4", + "esbuild": "^0.28.1", "eslint": "^9.39.5", "globals": "^17.8.0", "lucide-react": "^0.509.0", "react": "^19.2.8", "react-dom": "^19.2.8", "tailwindcss": "^4.3.3", + "tar": "^7.5.22", "tsx": "^4.23.1", "typescript": "^5.9.3", "typescript-eslint": "^8.65.0", @@ -1324,6 +1326,19 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -2232,6 +2247,72 @@ "node": ">=14.0.0" } }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", @@ -2927,6 +3008,16 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -4486,6 +4577,19 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5261,6 +5365,33 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/tar": { + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/thread-stream": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz", diff --git a/package.json b/package.json index 95ae3f2..864dd92 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,8 @@ "prepack": "npm run build", "start": "node dist/server/index.js", "pack:verify": "node scripts/verify-package.mjs", + "plugin:build": "npm run build && node scripts/build-codex-plugin.mjs", + "plugin:pack:verify": "npm run plugin:build && node scripts/verify-codex-plugin.mjs", "audit:release": "node scripts/audit-release.mjs" }, "dependencies": { @@ -57,12 +59,14 @@ "@types/ws": "^8.18.1", "@vitejs/plugin-react": "^4.4.1", "concurrently": "^9.2.4", + "esbuild": "^0.28.1", "eslint": "^9.39.5", "globals": "^17.8.0", "lucide-react": "^0.509.0", "react": "^19.2.8", "react-dom": "^19.2.8", "tailwindcss": "^4.3.3", + "tar": "^7.5.22", "tsx": "^4.23.1", "typescript": "^5.9.3", "typescript-eslint": "^8.65.0", diff --git a/public-marketplace/SECURITY.md b/public-marketplace/SECURITY.md new file mode 100644 index 0000000..91b25a1 --- /dev/null +++ b/public-marketplace/SECURITY.md @@ -0,0 +1,11 @@ +# Security policy + +## Supported version + +The latest published SkillManager Plugin version receives security fixes. + +## Reporting a vulnerability + +Please open a minimal GitHub issue asking for a private contact path. Do not post tokens, cookies, private Skill contents, local control credentials, full home-directory paths, or exploit details in a public issue. + +SkillManager binds its Dashboard to `127.0.0.1`, uses short-lived single-use launch links, stores optional GitHub credentials in the operating-system credential store, and requires preview/confirmation for filesystem mutations. A report should state which boundary can be bypassed and include a redacted reproduction. diff --git a/public-marketplace/docs/.nojekyll b/public-marketplace/docs/.nojekyll new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/public-marketplace/docs/.nojekyll @@ -0,0 +1 @@ + diff --git a/public-marketplace/docs/assets/dashboard-convergence.png b/public-marketplace/docs/assets/dashboard-convergence.png new file mode 100644 index 0000000000000000000000000000000000000000..354e83734b5e4a54f743bec8f98d35e3d2c1e564 GIT binary patch literal 329622 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

$j$t!l^~Z=iZXrN(9^t4!Z&Fj8tJv0 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 literal 0 HcmV?d00001 diff --git a/public-marketplace/docs/assets/skillmanager-mark.svg b/public-marketplace/docs/assets/skillmanager-mark.svg new file mode 100644 index 0000000..311b61f --- /dev/null +++ b/public-marketplace/docs/assets/skillmanager-mark.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/public-marketplace/docs/index.html b/public-marketplace/docs/index.html new file mode 100644 index 0000000..158b3d4 --- /dev/null +++ b/public-marketplace/docs/index.html @@ -0,0 +1,58 @@ + + + + + + + SkillManager — One source. Every agent. + + + + +

+ SkillManager + +
+
+
+
+
Codex Plugin · Local-first
+

把散落的 Skills,
收回一个主版本。

+

SkillManager 在 Codex 内盘点本机 Skills,解释它们在哪些 Agent 中可用,并用“预览 → 确认 → 执行 → 回滚”整理重复副本。你的文件仍在你的电脑上。

+ +
+
+
+ +

整理建议

可回滚
+
Svideo-transcript3 处安装重复副本
+
Sskill-creator2 个 Agent共享主版本
+
Sdaily-reviewCodex + Claude Code已收敛
+
+
+
+
+
+

不是“一键乱改”,
而是四步可核对。

默认小白模式只说人话:哪个是主版本、哪些是重复副本、整理后会影响谁。真正写入前必须生成计划,检查文件是否变化,并保留恢复入口。

+
+
01 / DISCOVER

发现

扫描已存在的 Agent 目录,不把“支持某 Agent”误说成“已安装该 Agent”。

+
02 / PREVIEW

预览

列出唯一主版本、将替换的副本和将建立的共享链接。

+
03 / APPLY

确认

只有用户确认后才执行,并用陈旧状态检查阻止误覆盖。

+
04 / ROLLBACK

回滚

保留快照或废纸篓记录,整理不满意可以恢复。

+
+
+
+

在 Codex 里说人话,
在本机完成整理。

这是隔离演示数据上的真实 SkillManager Dashboard,不是概念图。简单模式会把“可以安全整理”和“需要你决定”分开,默认不覆盖有分歧的副本。

+
SkillManager Skill 整理中心真实界面
+

REAL PRODUCT UI / ISOLATED FIXTURE DATA / NO PERSONAL SKILLS

+
+
+
Public Git Marketplace

两条命令,装进 Codex。

要求 Node.js 20 或更高版本。安装完成后新建 Codex 任务,输入“打开 SkillManager”。不要再打开本地 file:// 页面。

+
TERMINAL
$codex plugin marketplace add Backtthefuture/skillmanager-plugin
$codex plugin add skillmanager@backtthefuture
+
12个锁定的原生钥匙串目标
3 × 2macOS / Ubuntu / Windows,Node 20 / 22 CI
127.0.0.1Dashboard 只监听本机回环地址
+

本地优先,不等于含糊其辞。

SkillManager 不运行托管数据收集服务。只有你主动使用 GitHub 同步时才访问 GitHub;令牌存进系统凭据库,本地配置只保留引用。

阅读隐私说明
+
+ + + + diff --git a/public-marketplace/docs/privacy.html b/public-marketplace/docs/privacy.html new file mode 100644 index 0000000..ac37491 --- /dev/null +++ b/public-marketplace/docs/privacy.html @@ -0,0 +1,14 @@ + +隐私说明 — SkillManager +
+ ← 返回 SkillManager +

隐私说明

生效日期:2026 年 8 月 2 日 · 适用于 SkillManager v0.4.0

+
一句话版本:SkillManager 是本地优先软件,不运行托管数据收集服务;网络访问只发生在你主动调用的功能中。
+

1. 本机读取的数据

SkillManager 会读取你授权范围内的 Agent Skill 目录,用于识别名称、描述、文件结构、安装位置、重复关系和软链状态。MCP 默认只返回必要的元数据与诊断摘要,不返回 Skill 全文、绝对主目录路径、本地控制凭据或会话 Cookie。

+

2. 本地保存的数据

配置、操作计划、恢复快照和废纸篓记录保存在你的电脑上。Dashboard 只监听 127.0.0.1;打开链接带有短时、单次使用的本地会话保护。

+

3. 凭据

如果你配置 GitHub 同步,GitHub Token 会写入操作系统凭据库;普通配置文件只保存凭据引用。诊断输出会排除 Token、Cookie 和本地控制密钥。

+

4. 网络访问

盘点和本地整理不需要访问 SkillManager 托管服务器,因为不存在该类服务器。只有你主动使用 GitHub 仓库检查、上传或下载时,软件才会连接 GitHub API。GitHub 对数据的处理受其自身政策约束。

+

5. 遥测与广告

v0.4.0 不包含产品分析 SDK、广告 SDK 或后台遥测上报。公开网页由 GitHub Pages 托管,访问网页时 GitHub 可能按其政策处理常规访问日志;这与本地插件运行相互独立。

+

6. 删除与控制

你可以停止本地服务、删除插件、移除本地配置和恢复记录,或撤销 GitHub Token。SkillManager 不持有可替你删除的云端用户数据库。

+

7. 联系

隐私问题请通过 公开仓库 Issues 提交;请先删去路径、Token、Cookie、私有 Skill 正文和其他敏感信息。

+
diff --git a/public-marketplace/docs/site.js b/public-marketplace/docs/site.js new file mode 100644 index 0000000..9596316 --- /dev/null +++ b/public-marketplace/docs/site.js @@ -0,0 +1,27 @@ +document.querySelectorAll('[data-copy]').forEach((button) => { + button.addEventListener('click', async () => { + const target = document.querySelector(button.dataset.copy) + if (!target) return + const text = Array.from(target.querySelectorAll('.command span:last-child')) + .map((element) => element.textContent.trim()) + .join('\n') + let copied = false + try { + await navigator.clipboard.writeText(text) + copied = true + } catch { + const textarea = document.createElement('textarea') + textarea.value = text + textarea.setAttribute('readonly', '') + textarea.style.position = 'fixed' + textarea.style.opacity = '0' + document.body.appendChild(textarea) + textarea.select() + copied = document.execCommand('copy') + textarea.remove() + } + const previous = button.textContent + button.textContent = copied ? '已复制' : '请手动复制' + window.setTimeout(() => { button.textContent = previous }, 1400) + }) +}) diff --git a/public-marketplace/docs/styles.css b/public-marketplace/docs/styles.css new file mode 100644 index 0000000..134d3bf --- /dev/null +++ b/public-marketplace/docs/styles.css @@ -0,0 +1,21 @@ +:root{--ink:#0b1020;--paper:#f6f3ea;--yellow:#facc15;--muted:#62697a;--line:rgba(11,16,32,.14);--white:#fff;--green:#31c48d} +*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--paper);color:var(--ink);font-family:"Avenir Next","Segoe UI","Helvetica Neue",Arial,sans-serif;-webkit-font-smoothing:antialiased} +a{color:inherit}.shell{width:min(1180px,calc(100% - 40px));margin-inline:auto}.topbar{display:flex;align-items:center;gap:28px;height:84px;border-bottom:1px solid var(--line)} +.brand{display:flex;align-items:center;gap:12px;text-decoration:none;font-weight:800;letter-spacing:-.03em}.brand img{width:36px;height:36px}.nav{display:flex;align-items:center;gap:24px;margin-left:auto;font-size:14px}.nav a{text-decoration:none;color:var(--muted)}.nav a:hover{color:var(--ink)} +.button{display:inline-flex;align-items:center;justify-content:center;min-height:46px;padding:0 18px;border:1px solid var(--ink);border-radius:999px;background:var(--ink);color:white;text-decoration:none;font-weight:750}.button.alt{background:transparent;color:var(--ink)} +.hero{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(380px,.9fr);gap:76px;align-items:center;padding:94px 0 86px}.kicker,.mono{font-family:ui-monospace,"SFMono-Regular",Consolas,monospace}.kicker{display:flex;align-items:center;gap:10px;font-size:12px;font-weight:800;letter-spacing:.14em;text-transform:uppercase}.kicker::before{content:"";width:28px;height:8px;border-radius:99px;background:var(--yellow)} +h1{margin:22px 0 24px;font:800 clamp(52px,7.2vw,92px)/.93 Georgia,"Times New Roman",serif;letter-spacing:-.065em}.hero-copy{max-width:640px;color:var(--muted);font-size:19px;line-height:1.7}.actions{display:flex;flex-wrap:wrap;gap:12px;margin-top:34px} +.stage{position:relative;padding:18px;border:1px solid rgba(255,255,255,.12);border-radius:30px;background:var(--ink);color:white;box-shadow:0 28px 80px rgba(11,16,32,.22)}.stage::after{content:"LOCAL ONLY";position:absolute;right:24px;top:24px;color:var(--yellow);font:800 10px/1 ui-monospace,monospace;letter-spacing:.12em} +.window{overflow:hidden;border-radius:18px;background:#11182d}.window-top{display:flex;align-items:center;gap:7px;height:48px;padding:0 17px;border-bottom:1px solid rgba(255,255,255,.08)}.window-top i{width:8px;height:8px;border-radius:50%;background:#303a55}.window-top i:first-child{background:var(--yellow)} +.window-body{display:grid;grid-template-columns:112px 1fr;min-height:380px}.rail{padding:20px 12px;background:#0d1427}.rail span{display:block;margin-bottom:7px;padding:10px;border-radius:9px;color:#8790aa;font-size:11px}.rail span.active{background:rgba(250,204,21,.13);color:var(--yellow)} +.panel{padding:27px 24px}.panel-head{display:flex;justify-content:space-between;align-items:center}.panel h3{margin:0;font-size:22px}.status{padding:6px 9px;border:1px solid rgba(49,196,141,.35);border-radius:999px;color:var(--green);font-size:10px}.skill-row{display:grid;grid-template-columns:32px 1fr auto;gap:12px;align-items:center;margin-top:18px;padding:14px;border:1px solid rgba(255,255,255,.08);border-radius:13px}.skill-icon{display:grid;place-items:center;width:32px;height:32px;border-radius:9px;background:var(--yellow);color:var(--ink);font-weight:900}.skill-row strong{display:block;font-size:13px}.skill-row small{color:#7d879f}.link-state{color:#a7b0c3;font:10px/1.3 ui-monospace,monospace}.link-state.good{color:var(--green)} +.section{padding:92px 0;border-top:1px solid var(--line)}.section-head{display:grid;grid-template-columns:.8fr 1.2fr;gap:48px;margin-bottom:44px}.section h2,.legal h1{margin:0;font:800 clamp(38px,5vw,64px)/1 Georgia,serif;letter-spacing:-.045em}.section-head p{margin:0;color:var(--muted);font-size:18px;line-height:1.7} +.steps{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.step{min-height:250px;padding:24px;border:1px solid var(--line);border-radius:20px;background:rgba(255,255,255,.48)}.step .num{color:#9a7b00;font:800 12px/1 ui-monospace,monospace}.step h3{margin:58px 0 10px;font-size:22px}.step p{margin:0;color:var(--muted);line-height:1.55} +.install{display:grid;grid-template-columns:.72fr 1.28fr;gap:44px;align-items:start}.install h2{font-size:52px}.code-stack{overflow:hidden;border-radius:22px;background:var(--ink);color:white}.code-head{display:flex;align-items:center;justify-content:space-between;padding:15px 18px;border-bottom:1px solid rgba(255,255,255,.1);color:#8993ac;font:11px/1 ui-monospace,monospace}.copy{border:0;background:none;color:var(--yellow);font:inherit;cursor:pointer}.command{display:flex;gap:14px;padding:22px 20px;border-bottom:1px solid rgba(255,255,255,.08);font:13px/1.7 ui-monospace,monospace;overflow:auto}.command:last-child{border:0}.prompt{color:var(--yellow)} +.proof{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:46px}.proof article{padding:22px;border-left:3px solid var(--yellow);background:rgba(255,255,255,.45)}.proof strong{display:block;font-size:30px}.proof span{color:var(--muted)} +.product-frame{overflow:hidden;padding:12px;border-radius:28px;background:var(--ink);box-shadow:0 24px 70px rgba(11,16,32,.18)}.product-frame img{display:block;width:100%;height:auto;border-radius:17px}.caption{margin-top:14px;color:var(--muted);font:12px/1.5 ui-monospace,monospace} +.privacy-band{margin:0 auto 90px;padding:38px;border-radius:26px;background:var(--yellow);display:grid;grid-template-columns:1fr auto;gap:30px;align-items:center}.privacy-band h2{margin:0 0 8px;font:800 36px/1.05 Georgia,serif}.privacy-band p{margin:0;max-width:720px;line-height:1.6}.privacy-band .button{background:var(--ink)} +footer{display:flex;gap:24px;align-items:center;padding:28px 0 42px;border-top:1px solid var(--line);color:var(--muted);font-size:13px}footer .brand{color:var(--ink);margin-right:auto}footer a{text-decoration:none} +.legal{width:min(800px,calc(100% - 40px));margin:0 auto;padding:80px 0 110px}.legal .back{display:inline-block;margin-bottom:52px;color:var(--muted);text-decoration:none}.legal .meta{margin:20px 0 58px;color:var(--muted)}.legal h2{margin:45px 0 12px;font-size:24px}.legal p,.legal li{color:#4f5668;line-height:1.75}.legal code{padding:2px 6px;border-radius:6px;background:rgba(11,16,32,.07);font-family:ui-monospace,monospace}.legal pre{overflow:auto;padding:20px;border-radius:15px;background:var(--ink);color:white;line-height:1.6}.notice{margin:34px 0;padding:22px;border-left:4px solid var(--yellow);background:white} +@media(max-width:900px){.hero{grid-template-columns:1fr;gap:48px;padding-top:64px}.stage{max-width:620px}.section-head,.install{grid-template-columns:1fr}.steps{grid-template-columns:1fr 1fr}.proof{grid-template-columns:1fr}.nav a:not(.button){display:none}} +@media(max-width:560px){.shell{width:min(100% - 24px,1180px)}.topbar{height:70px}.nav{gap:8px}.hero{padding:48px 0 62px}.hero-copy{font-size:17px}.window-body{grid-template-columns:82px 1fr}.rail{padding:14px 7px}.rail span{padding:8px 6px}.panel{padding:20px 12px}.skill-row{grid-template-columns:28px 1fr}.link-state{display:none}.steps{grid-template-columns:1fr}.step{min-height:200px}.step h3{margin-top:35px}.privacy-band{grid-template-columns:1fr;padding:26px}.section{padding:64px 0}footer{flex-wrap:wrap}footer .brand{width:100%}} diff --git a/public-marketplace/docs/support.html b/public-marketplace/docs/support.html new file mode 100644 index 0000000..5cd9ba4 --- /dev/null +++ b/public-marketplace/docs/support.html @@ -0,0 +1,20 @@ + +支持 — SkillManager +
+ ← 返回 SkillManager +

支持与排错

SkillManager Public Git Marketplace · v0.4.0

+

安装

+
codex plugin marketplace add Backtthefuture/skillmanager-plugin
+codex plugin add skillmanager@backtthefuture
+

安装后请新建 Codex 任务,输入“打开 SkillManager”。插件会返回一个 60 秒内有效、只能使用一次的本地链接。

+

一直加载或打开了 file://

+
  1. 关闭旧的 file://.../web/index.html 标签页。
  2. 在 Codex 新任务中输入“打开 SkillManager”。
  3. 确认返回地址以 http://127.0.0.1: 开头。
  4. 仍失败时,让 Codex“诊断 SkillManager 本地服务”,不要公开粘贴 Cookie 或控制凭据。
+

确认安装状态

+
codex plugin marketplace list --json
+codex plugin list --json
+

如果仓库有新版本,先执行 Marketplace 更新,再重新安装对应插件版本:

+
codex plugin marketplace upgrade backtthefuture
+

提交问题

请到 skillmanager-plugin Issues。建议附上操作系统、CPU、Node.js 版本、Codex 版本、复现步骤和已脱敏的错误信息。

+
发布前请脱敏:删除 Token、Cookie、私有 Skill 正文、用户名、完整主目录路径和私有仓库地址。
+

源码与许可证

开发源码位于 Backtthefuture/skillmanager,发布仓库只保存经验证的通用 Plugin 包。许可证为 MIT。

+
diff --git a/public-marketplace/docs/terms.html b/public-marketplace/docs/terms.html new file mode 100644 index 0000000..eeb64dd --- /dev/null +++ b/public-marketplace/docs/terms.html @@ -0,0 +1,14 @@ + +使用条款 — SkillManager +
+ ← 返回 SkillManager +

使用条款

生效日期:2026 年 8 月 2 日 · 适用于 SkillManager v0.4.0

+

1. 软件许可

SkillManager 以 MIT License 发布。你可以在该许可证范围内使用、复制、修改和分发软件;源码仓库中的 LICENSE 是权威文本。

+

2. 本地操作责任

SkillManager 会在你确认后修改、移动或链接本机 Skill 文件。软件提供预览、陈旧状态检查和恢复机制,但你仍应核对操作范围,并对重要目录保留独立备份。

+

3. 可用性

软件按“现状”提供,不承诺无错误、不间断或适合所有 Agent、文件系统和组织策略。预览结果是基于扫描时状态生成的;外部程序同时改动文件可能使计划失效。

+

4. 第三方服务

可选 GitHub 同步依赖 GitHub 服务、API、账户权限与平台政策。SkillManager 不控制第三方服务的可用性、价格或数据处理。

+

5. 禁止滥用

你不得使用 SkillManager 未经授权访问、复制或修改他人的文件、仓库或凭据,也不得绕过系统和组织的访问控制。

+

6. 责任限制

在适用法律允许的范围内,作者不对因使用或无法使用本软件产生的间接、附带、特殊或后果性损失承担责任。MIT License 中的免责声明仍然适用。

+

7. 更新

功能与条款可能随新版本调整。页面会标出生效日期;继续使用更新版本前,请检查对应发布说明。

+

8. 支持

请通过 支持页 排查问题或提交 Issue。不要在公开 Issue 中粘贴凭据、私有仓库内容或完整本机路径。

+
diff --git a/scripts/build-codex-plugin.mjs b/scripts/build-codex-plugin.mjs new file mode 100644 index 0000000..a25749a --- /dev/null +++ b/scripts/build-codex-plugin.mjs @@ -0,0 +1,531 @@ +import crypto from 'node:crypto' +import fs from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { builtinModules } from 'node:module' +import { spawnSync } from 'node:child_process' +import { fileURLToPath } from 'node:url' +import { build } from 'esbuild' +import { x as extractTar } from 'tar' +import { KEYRING_TARGETS } from './keyring-targets.mjs' + +const scriptDirectory = path.dirname(fileURLToPath(import.meta.url)) +const repoRoot = path.resolve(scriptDirectory, '..') +const releaseRoot = path.join(repoRoot, 'release', 'codex-marketplace') +const pluginRoot = path.join(releaseRoot, 'plugins', 'skillmanager') +const marketplacePath = path.join(releaseRoot, '.agents', 'plugins', 'marketplace.json') + +function assertSafeReleaseRoot() { + const expected = path.join(repoRoot, 'release', 'codex-marketplace') + if (releaseRoot !== expected || !releaseRoot.startsWith(path.join(repoRoot, 'release') + path.sep)) { + throw new Error(`Refusing to clean unexpected release path: ${releaseRoot}`) + } +} + +async function readJson(target) { + return JSON.parse(await fs.readFile(target, 'utf8')) +} + +async function exists(target) { + try { + await fs.access(target) + return true + } catch { + return false + } +} + +async function walkFiles(root, base = root) { + const entries = await fs.readdir(root, { withFileTypes: true }) + const files = [] + for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) { + const absolute = path.join(root, entry.name) + if (entry.isSymbolicLink()) throw new Error(`Release source contains a symlink: ${absolute}`) + if (entry.isDirectory()) files.push(...(await walkFiles(absolute, base))) + if (entry.isFile()) files.push(path.relative(base, absolute).replaceAll(path.sep, '/')) + } + return files +} + +async function hashFile(target) { + return crypto.createHash('sha256').update(await fs.readFile(target)).digest('hex') +} + +async function contentInventory(root, excluded = new Set()) { + const files = (await walkFiles(root)).filter((relative) => !excluded.has(relative)) + const digest = crypto.createHash('sha256') + let totalBytes = 0 + const hashes = {} + for (const relative of files) { + const content = await fs.readFile(path.join(root, relative)) + totalBytes += content.length + hashes[relative] = crypto.createHash('sha256').update(content).digest('hex') + digest.update(relative) + digest.update('\0') + digest.update(content) + digest.update('\0') + } + return { + fileCount: files.length, + totalBytes, + sha256: digest.digest('hex'), + hashes, + } +} + +function runNpmPack(specs, destination) { + const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm' + const result = spawnSync(npmCommand, [ + 'pack', + '--json', + '--ignore-scripts', + '--pack-destination', + destination, + ...specs, + ], { + cwd: repoRoot, + encoding: 'utf8', + stdio: 'pipe', + }) + if (result.error) throw result.error + if (result.status !== 0) { + throw new Error(`npm pack failed (${result.status})\n${result.stdout || ''}\n${result.stderr || ''}`) + } + try { + return JSON.parse(result.stdout) + } catch { + throw new Error(`npm pack did not return JSON:\n${result.stdout}`) + } +} + +async function writeNativeKeyringBindings(outputRoot) { + const packageRoot = path.join(repoRoot, 'node_modules', '@napi-rs', 'keyring') + const packageJson = await readJson(path.join(packageRoot, 'package.json')) + const lock = await readJson(path.join(repoRoot, 'package-lock.json')) + const temporaryRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'skillmanager-keyring-pack-')) + const descriptors = [] + try { + const specs = KEYRING_TARGETS.map(({ packageName }) => { + const expectedVersion = packageJson.optionalDependencies?.[packageName] + if (!expectedVersion) throw new Error(`Keyring loader does not declare ${packageName}`) + return `${packageName}@${expectedVersion}` + }) + const packs = runNpmPack(specs, temporaryRoot) + const packsByName = new Map(packs.map((item) => [item.name, item])) + + await fs.mkdir(outputRoot, { recursive: true }) + for (const target of KEYRING_TARGETS) { + const lockMetadata = lock.packages?.[`node_modules/${target.packageName}`] + const packed = packsByName.get(target.packageName) + if (!lockMetadata?.version || !lockMetadata.integrity || !packed) { + throw new Error(`Missing locked package metadata for ${target.packageName}`) + } + if (packed.version !== lockMetadata.version || packed.integrity !== lockMetadata.integrity) { + throw new Error(`Registry artifact does not match package-lock.json for ${target.packageName}`) + } + const extractionRoot = path.join(temporaryRoot, target.key) + await fs.mkdir(extractionRoot, { recursive: true }) + await extractTar({ + file: path.join(temporaryRoot, packed.filename), + cwd: extractionRoot, + strip: 1, + }) + const nativePackage = await readJson(path.join(extractionRoot, 'package.json')) + if (nativePackage.name !== target.packageName || nativePackage.version !== lockMetadata.version) { + throw new Error(`Extracted metadata mismatch for ${target.packageName}`) + } + const nativeFiles = (await walkFiles(extractionRoot)).filter((relative) => relative.endsWith('.node')) + if (nativeFiles.length !== 1) { + throw new Error(`Expected one native binary in ${target.packageName}; found ${nativeFiles.length}`) + } + const filename = path.basename(nativeFiles[0]) + const destination = path.join(outputRoot, filename) + await fs.copyFile(path.join(extractionRoot, nativeFiles[0]), destination) + descriptors.push({ + key: target.key, + path: `runtime/keyring/${filename}`, + sha256: await hashFile(destination), + package: target.packageName, + packageVersion: nativePackage.version, + integrity: packed.integrity, + license: nativePackage.license || packageJson.license || 'UNKNOWN', + }) + } + } finally { + await fs.rm(temporaryRoot, { recursive: true, force: true }) + } + return { bindings: descriptors, loaderVersion: packageJson.version } +} + +function keyringShim(relativeBindingPaths) { + return { + name: 'skillmanager-native-keyring', + setup(context) { + context.onResolve({ filter: /^@napi-rs\/keyring$/ }, () => ({ + path: 'skillmanager-native-keyring', + namespace: 'skillmanager-release', + })) + context.onLoad( + { filter: /^skillmanager-native-keyring$/, namespace: 'skillmanager-release' }, + () => ({ + loader: 'js', + contents: [ + "import { createRequire } from 'node:module'", + "import { readFileSync } from 'node:fs'", + 'const nativeRequire = createRequire(import.meta.url)', + `const bindingPaths = ${JSON.stringify(relativeBindingPaths)}`, + "function isMusl() {", + " if (process.platform !== 'linux') return false", + " try { return readFileSync('/usr/bin/ldd', 'utf8').includes('musl') } catch {}", + " try {", + " if (typeof process.report?.getReport === 'function') {", + " process.report.excludeNetwork = true", + " const report = process.report.getReport()", + " if (report?.header?.glibcVersionRuntime) return false", + " if (Array.isArray(report?.sharedObjects)) return report.sharedObjects.some((entry) => entry.includes('libc.musl-') || entry.includes('ld-musl-'))", + " }", + " } catch {}", + " return false", + "}", + "function targetKey() {", + " if (process.platform === 'darwin' && ['arm64', 'x64'].includes(process.arch)) return `darwin-${process.arch}`", + " if (process.platform === 'win32' && ['arm64', 'ia32', 'x64'].includes(process.arch)) return `win32-${process.arch}-msvc`", + " if (process.platform === 'freebsd' && process.arch === 'x64') return 'freebsd-x64'", + " if (process.platform === 'linux') {", + " if (process.arch === 'arm') return 'linux-arm-gnueabihf'", + " if (process.arch === 'riscv64') return 'linux-riscv64-gnu'", + " if (['arm64', 'x64'].includes(process.arch)) return `linux-${process.arch}-${isMusl() ? 'musl' : 'gnu'}`", + " }", + " throw new Error(`Unsupported SkillManager keyring target: ${process.platform}-${process.arch}`)", + "}", + "const selectedTarget = targetKey()", + "const selectedPath = bindingPaths[selectedTarget]", + "if (!selectedPath) throw new Error(`SkillManager release is missing keyring binding for ${selectedTarget}`)", + 'const binding = nativeRequire(selectedPath)', + 'export const Entry = binding.Entry', + ].join('\n'), + }), + ) + }, + } +} + +async function bundleEntry(entryPoint, outfile, relativeBindingPaths) { + const result = await build({ + entryPoints: [entryPoint], + outfile, + bundle: true, + platform: 'node', + format: 'esm', + target: 'node20', + legalComments: 'external', + metafile: true, + logLevel: 'info', + banner: { + js: 'import { createRequire as __skillmanagerCreateRequire } from "node:module"; const require = __skillmanagerCreateRequire(import.meta.url);', + }, + plugins: [keyringShim(relativeBindingPaths)], + }) + const unexpectedExternal = Object.values(result.metafile.outputs) + .flatMap((output) => output.imports) + .filter((item) => item.external) + .filter((item) => ( + !item.path.startsWith('node:') && + !builtinModules.includes(item.path) && + !['bufferutil', 'utf-8-validate'].includes(item.path) + )) + if (unexpectedExternal.length > 0) { + throw new Error(`Bundled entry has unexpected external imports: ${unexpectedExternal.map((item) => item.path).join(', ')}`) + } +} + +function packageNameFromLockPath(lockPath) { + const marker = 'node_modules/' + const index = lockPath.lastIndexOf(marker) + return index === -1 ? lockPath : lockPath.slice(index + marker.length) +} + +function safeLicenseDirectory(name, version) { + return `${name.replace(/^@/, '').replaceAll('/', '__')}@${version || 'unknown'}` +} + +async function writeThirdPartyLicenses(nativeBindings) { + const lock = await readJson(path.join(repoRoot, 'package-lock.json')) + const outputRoot = path.join(pluginRoot, 'third-party-licenses') + const notices = [] + const noticed = new Set() + await fs.mkdir(outputRoot, { recursive: true }) + + for (const [lockPath, metadata] of Object.entries(lock.packages || {})) { + if (!lockPath.includes('node_modules/') || metadata.dev === true) continue + const sourceRoot = path.join(repoRoot, lockPath) + if (!(await exists(sourceRoot))) continue + const name = metadata.name || packageNameFromLockPath(lockPath) + const version = metadata.version || 'unknown' + const license = metadata.license || 'SEE PACKAGE' + const destination = path.join(outputRoot, safeLicenseDirectory(name, version)) + const entries = await fs.readdir(sourceRoot, { withFileTypes: true }) + const licenseFiles = entries + .filter((entry) => entry.isFile() && /^(licen[cs]e|copying|notice)(\..*)?$/i.test(entry.name)) + .map((entry) => entry.name) + .sort() + if (licenseFiles.length > 0) { + await fs.mkdir(destination, { recursive: true }) + for (const filename of licenseFiles) { + await fs.copyFile(path.join(sourceRoot, filename), path.join(destination, filename)) + } + } + notices.push(`- ${name}@${version} — ${license}${licenseFiles.length ? ` — ${licenseFiles.join(', ')}` : ''}`) + noticed.add(`${name}@${version}`) + } + + for (const binding of nativeBindings) { + const id = `${binding.package}@${binding.packageVersion}` + if (!noticed.has(id)) notices.push(`- ${id} — ${binding.license}`) + } + + notices.sort() + await fs.writeFile( + path.join(pluginRoot, 'THIRD_PARTY_NOTICES.md'), + [ + '# Third-party notices', + '', + 'SkillManager 的发布 bundle 包含下列生产依赖。对应许可证文本位于 `third-party-licenses/`。', + '', + ...notices, + '', + ].join('\n'), + ) +} + +async function writeJson(target, value) { + await fs.mkdir(path.dirname(target), { recursive: true }) + await fs.writeFile(target, JSON.stringify(value, null, 2) + '\n') +} + +assertSafeReleaseRoot() + +const sourcePackage = await readJson(path.join(repoRoot, 'package.json')) +const sourcePlugin = await readJson(path.join(repoRoot, '.codex-plugin', 'plugin.json')) +const sourceBuild = await readJson(path.join(repoRoot, 'dist', 'build-manifest.json')) +if (sourceBuild.packageName !== sourcePackage.name || sourceBuild.version !== sourcePackage.version) { + throw new Error('Run `npm run build` before building the Codex Plugin release') +} +if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(sourcePlugin.version)) { + throw new Error('Public Plugin version must be stable SemVer without build metadata') +} +if (sourcePlugin.version !== sourcePackage.version) { + throw new Error('Plugin version must match package.json') +} + +await fs.rm(releaseRoot, { recursive: true, force: true }) +await fs.mkdir(pluginRoot, { recursive: true }) + +for (const [source, destination] of [ + ['.codex-plugin', '.codex-plugin'], + ['assets', 'assets'], + ['skills', 'skills'], + ['dist/web', 'dist/web'], +]) { + await fs.cp(path.join(repoRoot, source), path.join(pluginRoot, destination), { + recursive: true, + dereference: false, + }) +} +for (const relative of [ + '.mcp.json', + 'LICENSE', + 'PRIVACY.md', + 'bin/cli.js', + 'bin/skillmanager-mcp.js', +]) { + const destination = path.join(pluginRoot, relative) + await fs.mkdir(path.dirname(destination), { recursive: true }) + await fs.copyFile(path.join(repoRoot, relative), destination) +} +await fs.chmod(path.join(pluginRoot, 'bin', 'cli.js'), 0o755) +await fs.chmod(path.join(pluginRoot, 'bin', 'skillmanager-mcp.js'), 0o755) + +const runtimeKeyringRoot = path.join(pluginRoot, 'runtime', 'keyring') +const nativeRuntime = await writeNativeKeyringBindings(runtimeKeyringRoot) +const bindingPathsForServer = Object.fromEntries(nativeRuntime.bindings.map((binding) => [ + binding.key, + `../../${binding.path}`, +])) +const bindingPathsForMcp = Object.fromEntries(nativeRuntime.bindings.map((binding) => [ + binding.key, + `../../../${binding.path}`, +])) + +await bundleEntry( + path.join(repoRoot, 'server', 'index.ts'), + path.join(pluginRoot, 'dist', 'server', 'index.js'), + bindingPathsForServer, +) +await bundleEntry( + path.join(repoRoot, 'server', 'mcp', 'index.ts'), + path.join(pluginRoot, 'dist', 'server', 'mcp', 'index.js'), + bindingPathsForMcp, +) + +const runtimePackage = { + name: sourcePackage.name, + version: sourcePlugin.version, + description: sourcePackage.description, + license: sourcePackage.license, + type: 'module', + private: true, + bin: sourcePackage.bin, + engines: sourcePackage.engines, + repository: sourcePackage.repository, + homepage: sourcePackage.homepage, +} +await writeJson(path.join(pluginRoot, 'package.json'), runtimePackage) +await writeThirdPartyLicenses(nativeRuntime.bindings) + +const distInventory = await contentInventory(path.join(pluginRoot, 'dist')) +await writeJson(path.join(pluginRoot, 'dist', 'build-manifest.json'), { + schemaVersion: 2, + packageName: sourcePackage.name, + version: sourcePlugin.version, + sourcePackageVersion: sourcePackage.version, + gitCommit: sourceBuild.gitCommit, + sourceDirty: sourceBuild.sourceDirty, + sourceTreeHash: sourceBuild.sourceTreeHash, + target: { + kind: 'universal-node20', + supported: KEYRING_TARGETS.map((target) => target.key), + builtOn: `${process.platform}-${process.arch}`, + node: process.versions.node, + }, + artifacts: distInventory.hashes, +}) + +await writeJson(marketplacePath, { + name: 'backtthefuture', + interface: { + displayName: 'Backtthefuture', + }, + plugins: [{ + name: 'skillmanager', + source: { + source: 'local', + path: './plugins/skillmanager', + }, + policy: { + installation: 'AVAILABLE', + authentication: 'ON_INSTALL', + }, + category: 'Productivity', + }], +}) + +await fs.cp( + path.join(repoRoot, 'public-marketplace', 'docs'), + path.join(releaseRoot, 'docs'), + { recursive: true, dereference: false }, +) +await fs.copyFile(path.join(repoRoot, 'LICENSE'), path.join(releaseRoot, 'LICENSE')) +await fs.copyFile( + path.join(repoRoot, 'public-marketplace', 'SECURITY.md'), + path.join(releaseRoot, 'SECURITY.md'), +) + +await fs.writeFile( + path.join(releaseRoot, 'README.md'), + [ + '

SkillManager

', + '

SkillManager for Codex

', + '', + '

把散落在不同 Agent 目录里的 Skills,安全整理成一个可追踪的主版本。

', + '', + '## 安装', + '', + '```bash', + 'codex plugin marketplace add Backtthefuture/skillmanager-plugin', + 'codex plugin add skillmanager@backtthefuture', + '```', + '', + '安装后新建 Codex 任务,输入 **“打开 SkillManager”**。插件会启动或复用只监听 `127.0.0.1` 的本地服务,并返回 60 秒内有效、仅可使用一次的安全链接。不要打开源码中的 `file://web/index.html`。', + '', + '## 能做什么', + '', + '- 区分“Agent 已安装”和“某个 Skill 支持该 Agent”,避免虚假的安装数量。', + '- 发现重复副本,选择唯一主版本,把其他 Agent 位置整理为共享链接。', + '- 所有写入遵循预览、确认、陈旧状态检查、恢复快照或废纸篓记录。', + '- MCP 只暴露诊断和打开入口,不默认返回 Skill 正文或本机绝对路径。', + '', + '## 平台', + '', + '发布物要求 Node.js 20+,内含 `@napi-rs/keyring` 锁定的 12 个官方目标:macOS ARM/Intel、Windows ARM64/x64/ia32、Linux x64/ARM64 的 glibc/musl、Linux ARM/RISC-V 与 FreeBSD x64。源码 CI 在 macOS、Ubuntu、Windows 的 Node.js 20/22 上分别运行隔离验收;其余目标为制品完整性静态校验。', + '', + '## 安全与隐私', + '', + '- Dashboard 仅监听 `127.0.0.1`。', + '- GitHub 同步是可选功能,只有用户主动预览并确认后执行。', + '- GitHub Token 存放在操作系统凭据库,本地配置只保存引用。', + '- SkillManager 不运行托管数据收集服务。', + '', + '[产品页](https://backtthefuture.github.io/skillmanager-plugin/) · [隐私说明](https://backtthefuture.github.io/skillmanager-plugin/privacy.html) · [使用条款](https://backtthefuture.github.io/skillmanager-plugin/terms.html) · [支持](https://backtthefuture.github.io/skillmanager-plugin/support.html)', + '', + '## 开发与验证', + '', + '开发源码位于 [Backtthefuture/skillmanager](https://github.com/Backtthefuture/skillmanager)。本仓库是经验证的 Public Git Marketplace 发布物。发布证明见 `plugins/skillmanager/release-manifest.json`。', + '', + '同一发布物内含 macOS、Windows、Linux 与 FreeBSD 的官方钥匙串绑定,启动时会自动选择。源码 CI 会在 macOS、Ubuntu、Windows 的 Node.js 20/22 上分别执行隔离验收。', + '', + '## License', + '', + 'MIT', + '', + ].join('\n'), +) + +const releaseContents = await contentInventory(pluginRoot, new Set(['release-manifest.json'])) +await writeJson(path.join(pluginRoot, 'release-manifest.json'), { + schemaVersion: 1, + marketplace: 'backtthefuture', + plugin: 'skillmanager', + version: sourcePlugin.version, + builtAt: new Date().toISOString(), + source: { + packageVersion: sourcePackage.version, + gitCommit: sourceBuild.gitCommit, + dirty: sourceBuild.sourceDirty, + treeHash: sourceBuild.sourceTreeHash, + }, + target: { + kind: 'universal-node20', + supported: KEYRING_TARGETS.map((target) => target.key), + builtOn: `${process.platform}-${process.arch}`, + node: process.versions.node, + }, + runtime: { + strategy: 'esbuild-bundle-with-universal-native-keyring', + nodeModulesIncluded: false, + loaderVersion: nativeRuntime.loaderVersion, + bindings: Object.fromEntries(nativeRuntime.bindings.map((binding) => [binding.key, binding])), + }, + security: { + bindHost: '127.0.0.1', + launchTtlSeconds: 60, + launchSingleUse: true, + secretsIncluded: false, + }, + contents: { + fileCount: releaseContents.fileCount, + totalBytes: releaseContents.totalBytes, + sha256: releaseContents.sha256, + }, +}) + +console.log(JSON.stringify({ + ok: true, + marketplace: marketplacePath, + plugin: pluginRoot, + version: sourcePlugin.version, + target: 'universal-node20', + nativeTargets: nativeRuntime.bindings.length, + bytes: releaseContents.totalBytes, + files: releaseContents.fileCount + 1, +}, null, 2)) diff --git a/scripts/keyring-targets.mjs b/scripts/keyring-targets.mjs new file mode 100644 index 0000000..72433c8 --- /dev/null +++ b/scripts/keyring-targets.mjs @@ -0,0 +1,57 @@ +import fs from 'node:fs' + +export const KEYRING_TARGETS = Object.freeze([ + { key: 'darwin-arm64', packageName: '@napi-rs/keyring-darwin-arm64' }, + { key: 'darwin-x64', packageName: '@napi-rs/keyring-darwin-x64' }, + { key: 'freebsd-x64', packageName: '@napi-rs/keyring-freebsd-x64' }, + { key: 'linux-arm-gnueabihf', packageName: '@napi-rs/keyring-linux-arm-gnueabihf' }, + { key: 'linux-arm64-gnu', packageName: '@napi-rs/keyring-linux-arm64-gnu' }, + { key: 'linux-arm64-musl', packageName: '@napi-rs/keyring-linux-arm64-musl' }, + { key: 'linux-riscv64-gnu', packageName: '@napi-rs/keyring-linux-riscv64-gnu' }, + { key: 'linux-x64-gnu', packageName: '@napi-rs/keyring-linux-x64-gnu' }, + { key: 'linux-x64-musl', packageName: '@napi-rs/keyring-linux-x64-musl' }, + { key: 'win32-arm64-msvc', packageName: '@napi-rs/keyring-win32-arm64-msvc' }, + { key: 'win32-ia32-msvc', packageName: '@napi-rs/keyring-win32-ia32-msvc' }, + { key: 'win32-x64-msvc', packageName: '@napi-rs/keyring-win32-x64-msvc' }, +]) + +function reportSuggestsMusl() { + try { + if (typeof process.report?.getReport !== 'function') return null + process.report.excludeNetwork = true + const report = process.report.getReport() + if (report?.header?.glibcVersionRuntime) return false + if (Array.isArray(report?.sharedObjects)) { + return report.sharedObjects.some((entry) => entry.includes('libc.musl-') || entry.includes('ld-musl-')) + } + } catch {} + return null +} + +export function isMuslRuntime() { + if (process.platform !== 'linux') return false + try { + return fs.readFileSync('/usr/bin/ldd', 'utf8').includes('musl') + } catch {} + return reportSuggestsMusl() ?? false +} + +export function currentKeyringTarget() { + if (process.platform === 'darwin' && ['arm64', 'x64'].includes(process.arch)) { + return `darwin-${process.arch}` + } + if (process.platform === 'win32' && ['arm64', 'ia32', 'x64'].includes(process.arch)) { + return `win32-${process.arch}-msvc` + } + if (process.platform === 'freebsd' && process.arch === 'x64') { + return 'freebsd-x64' + } + if (process.platform === 'linux') { + if (process.arch === 'arm') return 'linux-arm-gnueabihf' + if (process.arch === 'riscv64') return 'linux-riscv64-gnu' + if (['arm64', 'x64'].includes(process.arch)) { + return `linux-${process.arch}-${isMuslRuntime() ? 'musl' : 'gnu'}` + } + } + throw new Error(`Unsupported SkillManager keyring target: ${process.platform}-${process.arch}`) +} diff --git a/scripts/verify-codex-plugin.mjs b/scripts/verify-codex-plugin.mjs new file mode 100644 index 0000000..9c94b50 --- /dev/null +++ b/scripts/verify-codex-plugin.mjs @@ -0,0 +1,352 @@ +import crypto from 'node:crypto' +import fs from 'node:fs/promises' +import net from 'node:net' +import os from 'node:os' +import path from 'node:path' +import { spawnSync } from 'node:child_process' +import { fileURLToPath } from 'node:url' +import { Client } from '@modelcontextprotocol/client' +import { StdioClientTransport } from '@modelcontextprotocol/client/stdio' +import { KEYRING_TARGETS, currentKeyringTarget } from './keyring-targets.mjs' + +const scriptDirectory = path.dirname(fileURLToPath(import.meta.url)) +const repoRoot = path.resolve(scriptDirectory, '..') +const releaseRoot = path.join(repoRoot, 'release', 'codex-marketplace') +const sourcePluginRoot = path.join(releaseRoot, 'plugins', 'skillmanager') +const temporaryRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'skillmanager-plugin-verify-')) + +async function readJson(target) { + return JSON.parse(await fs.readFile(target, 'utf8')) +} + +async function walk(root, base = root) { + const result = [] + const entries = await fs.readdir(root, { withFileTypes: true }) + for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) { + const absolute = path.join(root, entry.name) + const relative = path.relative(base, absolute).replaceAll(path.sep, '/') + const stat = await fs.lstat(absolute) + if (stat.isSymbolicLink()) throw new Error(`Release contains a symlink: ${relative}`) + if (stat.isDirectory()) result.push(...(await walk(absolute, base))) + if (stat.isFile()) result.push(relative) + } + return result +} + +async function inventory(root, excluded = new Set()) { + const files = (await walk(root)).filter((relative) => !excluded.has(relative)) + const digest = crypto.createHash('sha256') + let totalBytes = 0 + for (const relative of files) { + const content = await fs.readFile(path.join(root, relative)) + totalBytes += content.length + digest.update(relative) + digest.update('\0') + digest.update(content) + digest.update('\0') + } + return { fileCount: files.length, totalBytes, sha256: digest.digest('hex') } +} + +function run(command, args, options = {}) { + const result = spawnSync(command, args, { + encoding: 'utf8', + stdio: options.capture === false ? 'inherit' : 'pipe', + ...options, + }) + if (result.error) throw result.error + if (result.status !== 0) { + throw new Error(`${command} ${args.join(' ')} failed (${result.status})\n${result.stdout || ''}\n${result.stderr || ''}`) + } + return result +} + +async function freePort() { + const server = net.createServer() + await new Promise((resolve, reject) => { + server.once('error', reject) + server.listen(0, '127.0.0.1', resolve) + }) + const address = server.address() + const port = typeof address === 'object' && address ? address.port : 0 + await new Promise((resolve) => server.close(resolve)) + return port +} + +function assert(condition, message) { + if (!condition) throw new Error(message) +} + +function parseCliJson(result) { + try { + return JSON.parse(result.stdout.trim()) + } catch { + throw new Error(`CLI did not return JSON: ${result.stdout}`) + } +} + +async function auditTextFiles(pluginRoot, files) { + const textExtensions = new Set(['.css', '.html', '.js', '.json', '.md', '.txt', '.yaml', '.yml']) + const forbiddenSecrets = [ + /-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/, + /\bgh[pousr]_[A-Za-z0-9_]{30,}\b/, + /\bsk-[A-Za-z0-9_-]{24,}\b/, + /\bAKIA[0-9A-Z]{16}\b/, + ] + for (const relative of files) { + if (!textExtensions.has(path.extname(relative).toLowerCase())) continue + const content = await fs.readFile(path.join(pluginRoot, relative), 'utf8') + assert(!content.includes(repoRoot), `Release leaks its source repository path in ${relative}`) + assert(!/file:\/\/\/(?:Users|home|private|var\/folders)\//.test(content), `Release embeds a local file URL in ${relative}`) + for (const pattern of forbiddenSecrets) { + assert(!pattern.test(content), `Release may contain a secret in ${relative}`) + } + } +} + +async function assertPng(relative, expectedWidth, expectedHeight) { + const content = await fs.readFile(path.join(sourcePluginRoot, relative)) + const signature = content.subarray(0, 8).toString('hex') + assert(signature === '89504e470d0a1a0a', `${relative} is not a PNG file`) + assert(content.readUInt32BE(16) === expectedWidth, `${relative} width is invalid`) + assert(content.readUInt32BE(20) === expectedHeight, `${relative} height is invalid`) +} + +const marketplace = await readJson(path.join(releaseRoot, '.agents', 'plugins', 'marketplace.json')) +assert(marketplace.name === 'backtthefuture', 'Marketplace name must be backtthefuture') +assert(marketplace.interface?.displayName === 'Backtthefuture', 'Marketplace display name is missing') +assert(Array.isArray(marketplace.plugins) && marketplace.plugins.length === 1, 'Marketplace must contain exactly one plugin') +const marketplacePlugin = marketplace.plugins[0] +assert(marketplacePlugin.name === 'skillmanager', 'Marketplace plugin name is invalid') +assert(marketplacePlugin.source?.source === 'local', 'Marketplace source must be local') +assert(marketplacePlugin.source?.path === './plugins/skillmanager', 'Marketplace plugin path is invalid') +assert(marketplacePlugin.policy?.installation === 'AVAILABLE', 'Marketplace installation policy is invalid') +assert(marketplacePlugin.policy?.authentication === 'ON_INSTALL', 'Marketplace authentication policy is invalid') +assert(marketplacePlugin.category === 'Productivity', 'Marketplace category is invalid') + +const pluginManifest = await readJson(path.join(sourcePluginRoot, '.codex-plugin', 'plugin.json')) +assert(pluginManifest.name === 'skillmanager', 'Plugin manifest name is invalid') +assert(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(pluginManifest.version), 'Plugin version must be stable SemVer') +assert(Array.isArray(pluginManifest.interface?.defaultPrompt), 'Plugin prompts are missing') +assert(pluginManifest.interface.defaultPrompt.every((prompt) => /[\u3400-\u9fff]/.test(prompt)), 'Every default prompt must be Chinese') +assert(pluginManifest.skills === './skills/', 'Plugin Skill path is invalid') +assert(pluginManifest.mcpServers === './.mcp.json', 'Plugin MCP path is invalid') +assert(JSON.stringify(pluginManifest.interface?.screenshots) === JSON.stringify(['./assets/screenshots/dashboard-convergence.png']), 'Plugin screenshot metadata is invalid') + +const mcpConfig = await readJson(path.join(sourcePluginRoot, '.mcp.json')) +assert(mcpConfig.mcpServers?.skillmanager?.command === './bin/skillmanager-mcp.js', 'MCP command must be plugin-relative') +assert(mcpConfig.mcpServers?.skillmanager?.cwd === '.', 'MCP cwd must be plugin-relative') + +const runtimePackage = await readJson(path.join(sourcePluginRoot, 'package.json')) +assert(runtimePackage.version === pluginManifest.version, 'Runtime and plugin versions differ') +assert(runtimePackage.devDependencies === undefined, 'Release package must not include devDependencies') +assert(runtimePackage.dependencies === undefined, 'Bundled release must not require npm dependencies') + +const releaseManifest = await readJson(path.join(sourcePluginRoot, 'release-manifest.json')) +assert(releaseManifest.marketplace === 'backtthefuture', 'Release provenance marketplace is invalid') +assert(releaseManifest.version === pluginManifest.version, 'Release provenance version is invalid') +assert(releaseManifest.target?.kind === 'universal-node20', 'Release target must be universal Node.js 20+') +const expectedTargets = KEYRING_TARGETS.map((target) => target.key) +assert(JSON.stringify(releaseManifest.target?.supported) === JSON.stringify(expectedTargets), 'Release target matrix is incomplete') +assert(releaseManifest.runtime?.nodeModulesIncluded === false, 'Release must not include node_modules') +assert(releaseManifest.security?.bindHost === '127.0.0.1', 'Release bind policy is invalid') +assert(releaseManifest.security?.launchTtlSeconds === 60, 'Release launch TTL is invalid') +assert(releaseManifest.security?.launchSingleUse === true, 'Release launch links must be single-use') + +const sourceFiles = await walk(sourcePluginRoot) +assert(!sourceFiles.some((relative) => relative.startsWith('node_modules/')), 'Release includes node_modules') +assert(!sourceFiles.some((relative) => relative.startsWith('server/') || relative.startsWith('web/')), 'Release includes development source trees') +for (const required of [ + '.codex-plugin/plugin.json', + '.mcp.json', + 'assets/icon.png', + 'assets/logo.png', + 'assets/logo-dark.png', + 'assets/screenshots/dashboard-convergence.png', + 'skills/skillmanager/SKILL.md', + 'skills/skillmanager/agents/openai.yaml', + 'bin/cli.js', + 'bin/skillmanager-mcp.js', + 'dist/server/index.js', + 'dist/server/mcp/index.js', + 'dist/web/index.html', + 'dist/build-manifest.json', + 'THIRD_PARTY_NOTICES.md', + 'release-manifest.json', +]) { + assert(sourceFiles.includes(required), `Release is missing ${required}`) +} +assert(releaseManifest.contents.totalBytes < 40 * 1024 * 1024, 'Release runtime exceeds the 40 MB budget') +const currentInventory = await inventory(sourcePluginRoot, new Set(['release-manifest.json'])) +assert(currentInventory.fileCount === releaseManifest.contents.fileCount, 'Release file count does not match provenance') +assert(currentInventory.totalBytes === releaseManifest.contents.totalBytes, 'Release byte count does not match provenance') +assert(currentInventory.sha256 === releaseManifest.contents.sha256, 'Release content hash does not match provenance') +await auditTextFiles(sourcePluginRoot, sourceFiles) +await assertPng('assets/icon.png', 256, 256) +await assertPng('assets/logo.png', 1024, 1024) +await assertPng('assets/logo-dark.png', 1024, 1024) +await assertPng('assets/screenshots/dashboard-convergence.png', 1274, 717) + +const sourceLock = await readJson(path.join(repoRoot, 'package-lock.json')) +const bindings = releaseManifest.runtime?.bindings +assert(bindings && typeof bindings === 'object', 'Release native binding map is missing') +assert(JSON.stringify(Object.keys(bindings)) === JSON.stringify(expectedTargets), 'Release native binding map is incomplete') +for (const target of KEYRING_TARGETS) { + const binding = bindings[target.key] + assert(binding?.key === target.key, `Release binding identity mismatch for ${target.key}`) + assert(binding?.package === target.packageName, `Release package mismatch for ${target.key}`) + assert(sourceFiles.includes(binding.path), `Release native keyring binding is missing for ${target.key}`) + const nativeAbsolute = path.join(sourcePluginRoot, binding.path) + const nativeHash = crypto.createHash('sha256').update(await fs.readFile(nativeAbsolute)).digest('hex') + assert(nativeHash === binding.sha256, `Native keyring hash mismatch for ${target.key}`) + const lockMetadata = sourceLock.packages?.[`node_modules/${target.packageName}`] + assert(lockMetadata?.version === binding.packageVersion, `Locked native version mismatch for ${target.key}`) + assert(lockMetadata?.integrity === binding.integrity, `Locked native integrity mismatch for ${target.key}`) +} + +const currentNativeTarget = currentKeyringTarget() +const currentBinding = bindings[currentNativeTarget] +assert(currentBinding, `Release lacks the current native target ${currentNativeTarget}`) +const nativeAbsolute = path.join(sourcePluginRoot, currentBinding.path) +run(process.execPath, [ + '--input-type=module', + '--eval', + `import { createRequire } from 'node:module'; const require = createRequire(import.meta.url); const binding = require(${JSON.stringify(nativeAbsolute)}); if (typeof binding.Entry !== 'function') process.exit(1)`, +], { cwd: temporaryRoot }) + +const isolatedMarketplace = path.join(temporaryRoot, 'marketplace') +await fs.cp(releaseRoot, isolatedMarketplace, { recursive: true, dereference: false }) +const isolatedPlugin = path.join(isolatedMarketplace, 'plugins', 'skillmanager') +const fixtureRoot = path.join(temporaryRoot, 'fixture') +const dataDirectory = path.join(temporaryRoot, 'data') +await fs.mkdir(path.join(fixtureRoot, '.agents', 'skills', 'release-fixture'), { recursive: true }) +await fs.writeFile( + path.join(fixtureRoot, '.agents', 'skills', 'release-fixture', 'SKILL.md'), + '---\nname: Release Fixture\ndescription: Use when validating the isolated Codex Plugin release.\n---\nPRIVATE_RELEASE_BODY\n', +) +const port = await freePort() +const environment = Object.fromEntries( + Object.entries({ + ...process.env, + SKILLMANAGER_FIXTURE_ROOT: fixtureRoot, + SKILLMANAGER_DATA_DIR: dataDirectory, + SKILLMANAGER_PORT: String(port), + SKILLMANAGER_NO_OPEN: '1', + SKILL_HUB_NO_OPEN: '1', + SKILLMANAGER_TEST_MODE: '1', + }).filter((entry) => typeof entry[1] === 'string'), +) + +let client = null +let lifecycleStarted = false +try { + const transport = new StdioClientTransport({ + command: process.execPath, + args: [path.join(isolatedPlugin, 'bin', 'skillmanager-mcp.js')], + cwd: isolatedPlugin, + env: environment, + stderr: 'pipe', + }) + client = new Client({ name: 'skillmanager-codex-plugin-verifier', version: '1.0.0' }) + await client.connect(transport) + const tools = await client.listTools() + const expectedTools = [ + 'diagnose_library', + 'diagnose_skill', + 'get_deep_link', + 'get_skill_summary', + 'get_status', + 'list_skills', + 'open_dashboard', + ] + assert(JSON.stringify(tools.tools.map((tool) => tool.name).sort()) === JSON.stringify(expectedTools), 'Isolated MCP tool list is incomplete') + + const status = await client.callTool({ + name: 'get_status', + arguments: { response_format: 'json' }, + }) + assert(status.structuredContent?.status === 'stopped', 'Isolated MCP status should initially be stopped') + + const listing = await client.callTool({ + name: 'list_skills', + arguments: { agent: 'codex', limit: 10, offset: 0, response_format: 'json' }, + }) + const listingText = JSON.stringify(listing.structuredContent) + assert(!listing.isError && listingText.includes('Release Fixture'), 'Isolated MCP could not scan its fixture') + assert(!listingText.includes(fixtureRoot) && !listingText.includes('PRIVATE_RELEASE_BODY'), 'Isolated MCP leaked private fixture data') + + const opened = await client.callTool({ + name: 'open_dashboard', + arguments: { view: 'skills', response_format: 'json' }, + }) + lifecycleStarted = true + assert(!opened.isError, 'Isolated MCP open_dashboard failed') + const openedOutput = opened.structuredContent + assert(openedOutput.expiresInSeconds === 60, 'Isolated launch TTL is invalid') + assert(openedOutput.target === '/?view=skills', 'Isolated launch target is invalid') + const launchUrl = new URL(openedOutput.launchUrl) + assert(launchUrl.protocol === 'http:' && launchUrl.hostname === '127.0.0.1', 'Launch URL is not loopback-only HTTP') + const resourceLink = opened.content.find((item) => item.type === 'resource_link') + assert(resourceLink?.uri === openedOutput.launchUrl, 'MCP response lacks a matching clickable resource link') + + const launch = await fetch(openedOutput.launchUrl, { redirect: 'manual' }) + assert(launch.status === 303, 'One-time launch did not redirect') + assert(launch.headers.get('location') === '/?view=skills', 'One-time launch redirected to an unexpected target') + assert(/HttpOnly/i.test(launch.headers.get('set-cookie') || ''), 'One-time launch did not set an HttpOnly session') + const replay = await fetch(openedOutput.launchUrl, { redirect: 'manual' }) + assert(replay.status === 410, 'One-time launch could be replayed') + + const healthResponse = await fetch(`http://127.0.0.1:${port}/api/v1/health`) + const health = await healthResponse.json() + assert(healthResponse.ok && health.status === 'ok' && health.product === 'SkillManager', 'Isolated release health check failed') + assert(health.version === pluginManifest.version, 'Isolated runtime version does not match plugin version') + + const runningStatus = await client.callTool({ + name: 'get_status', + arguments: { response_format: 'json' }, + }) + assert(runningStatus.structuredContent?.status === 'running', 'MCP did not reuse the isolated runtime') + + const doctor = parseCliJson(run( + process.execPath, + [path.join(isolatedPlugin, 'bin', 'cli.js'), 'doctor', '--json'], + { cwd: isolatedPlugin, env: environment }, + )) + assert(doctor.ok === true, 'Isolated release doctor reported a failure') + + const stopped = parseCliJson(run( + process.execPath, + [path.join(isolatedPlugin, 'bin', 'cli.js'), 'stop', '--json'], + { cwd: isolatedPlugin, env: environment }, + )) + lifecycleStarted = false + assert(stopped.status === 'stopped' && stopped.stopped === true, 'Isolated release did not stop cleanly') + + console.log(JSON.stringify({ + ok: true, + marketplace: 'backtthefuture', + plugin: `skillmanager@${pluginManifest.version}`, + releaseBytes: releaseManifest.contents.totalBytes, + sourcePathLeak: false, + secretLeak: false, + symlinks: false, + developmentDependencies: false, + nativeKeyring: `loadable:${currentNativeTarget}`, + packagedNativeTargets: expectedTargets.length, + mcpInitialize: 'verified', + mcpTools: 'verified', + lifecycle: 'verified', + launchRedirect: 'single-use', + health: 'verified', + }, null, 2)) +} finally { + if (client) await client.close().catch(() => {}) + if (lifecycleStarted) { + spawnSync(process.execPath, [path.join(isolatedPlugin, 'bin', 'cli.js'), 'stop', '--json'], { + cwd: isolatedPlugin, + env: environment, + stdio: 'ignore', + }) + } + await fs.rm(temporaryRoot, { recursive: true, force: true }) +} From b1394dd2b450656efa87dfd081a579360660f180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AI=E4=BA=A7=E5=93=81=E9=BB=84=E5=8F=94?= Date: Sun, 2 Aug 2026 21:57:49 +0800 Subject: [PATCH 13/15] fix: preserve generated release text verbatim --- public-marketplace/.gitattributes | 5 +++++ scripts/build-codex-plugin.mjs | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 public-marketplace/.gitattributes diff --git a/public-marketplace/.gitattributes b/public-marketplace/.gitattributes new file mode 100644 index 0000000..ca81744 --- /dev/null +++ b/public-marketplace/.gitattributes @@ -0,0 +1,5 @@ +plugins/skillmanager/dist/** -whitespace +plugins/skillmanager/third-party-licenses/** -whitespace +plugins/skillmanager/runtime/** -diff +*.node -diff +*.png -diff diff --git a/scripts/build-codex-plugin.mjs b/scripts/build-codex-plugin.mjs index a25749a..e8417cb 100644 --- a/scripts/build-codex-plugin.mjs +++ b/scripts/build-codex-plugin.mjs @@ -426,6 +426,10 @@ await fs.cp( { recursive: true, dereference: false }, ) await fs.copyFile(path.join(repoRoot, 'LICENSE'), path.join(releaseRoot, 'LICENSE')) +await fs.copyFile( + path.join(repoRoot, 'public-marketplace', '.gitattributes'), + path.join(releaseRoot, '.gitattributes'), +) await fs.copyFile( path.join(repoRoot, 'public-marketplace', 'SECURITY.md'), path.join(releaseRoot, 'SECURITY.md'), From c130ed1820a20189cc7ccb7564f9983e30745b62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AI=E4=BA=A7=E5=93=81=E9=BB=84=E5=8F=94?= Date: Sun, 2 Aug 2026 22:03:46 +0800 Subject: [PATCH 14/15] fix: invoke npm portably in release gates --- scripts/audit-release.mjs | 7 ++++--- scripts/build-codex-plugin.mjs | 7 ++++--- scripts/npm-invocation.d.mts | 15 +++++++++++++++ scripts/npm-invocation.mjs | 20 ++++++++++++++++++++ scripts/verify-package.mjs | 13 +++++++++---- tests/unit/npm-invocation.test.ts | 31 +++++++++++++++++++++++++++++++ 6 files changed, 83 insertions(+), 10 deletions(-) create mode 100644 scripts/npm-invocation.d.mts create mode 100644 scripts/npm-invocation.mjs create mode 100644 tests/unit/npm-invocation.test.ts diff --git a/scripts/audit-release.mjs b/scripts/audit-release.mjs index 87e51c8..fb500be 100644 --- a/scripts/audit-release.mjs +++ b/scripts/audit-release.mjs @@ -1,13 +1,14 @@ import { spawnSync } from 'child_process' import path from 'path' import { fileURLToPath } from 'url' +import { npmInvocation } from './npm-invocation.mjs' const scriptDir = path.dirname(fileURLToPath(import.meta.url)) const repoRoot = path.resolve(scriptDir, '..') -const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm' +const invocation = npmInvocation(['audit', '--json', '--audit-level=high']) const result = spawnSync( - npmCommand, - ['audit', '--json', '--audit-level=high'], + invocation.command, + invocation.args, { cwd: repoRoot, encoding: 'utf8' }, ) diff --git a/scripts/build-codex-plugin.mjs b/scripts/build-codex-plugin.mjs index e8417cb..70f9a69 100644 --- a/scripts/build-codex-plugin.mjs +++ b/scripts/build-codex-plugin.mjs @@ -8,6 +8,7 @@ import { fileURLToPath } from 'node:url' import { build } from 'esbuild' import { x as extractTar } from 'tar' import { KEYRING_TARGETS } from './keyring-targets.mjs' +import { npmInvocation } from './npm-invocation.mjs' const scriptDirectory = path.dirname(fileURLToPath(import.meta.url)) const repoRoot = path.resolve(scriptDirectory, '..') @@ -74,15 +75,15 @@ async function contentInventory(root, excluded = new Set()) { } function runNpmPack(specs, destination) { - const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm' - const result = spawnSync(npmCommand, [ + const invocation = npmInvocation([ 'pack', '--json', '--ignore-scripts', '--pack-destination', destination, ...specs, - ], { + ]) + const result = spawnSync(invocation.command, invocation.args, { cwd: repoRoot, encoding: 'utf8', stdio: 'pipe', diff --git a/scripts/npm-invocation.d.mts b/scripts/npm-invocation.d.mts new file mode 100644 index 0000000..0885593 --- /dev/null +++ b/scripts/npm-invocation.d.mts @@ -0,0 +1,15 @@ +export interface NpmInvocationOptions { + npmExecPath?: string | null + nodeExecPath?: string + platform?: NodeJS.Platform +} + +export interface NpmInvocation { + command: string + args: string[] +} + +export declare function npmInvocation( + args: string[], + options?: NpmInvocationOptions, +): NpmInvocation diff --git a/scripts/npm-invocation.mjs b/scripts/npm-invocation.mjs new file mode 100644 index 0000000..d38af2f --- /dev/null +++ b/scripts/npm-invocation.mjs @@ -0,0 +1,20 @@ +export function npmInvocation(args, options = {}) { + const npmExecPath = Object.hasOwn(options, 'npmExecPath') + ? options.npmExecPath + : process.env.npm_execpath + const nodeExecPath = options.nodeExecPath || process.execPath + const platform = options.platform || process.platform + + if (typeof npmExecPath === 'string' && npmExecPath.trim()) { + return { + command: nodeExecPath, + args: [npmExecPath.trim(), ...args], + } + } + + if (platform === 'win32') { + throw new Error('npm_execpath is required on Windows; run this verifier through an npm script') + } + + return { command: 'npm', args } +} diff --git a/scripts/verify-package.mjs b/scripts/verify-package.mjs index c9c3045..18ef402 100644 --- a/scripts/verify-package.mjs +++ b/scripts/verify-package.mjs @@ -7,10 +7,10 @@ import { spawnSync } from 'child_process' import { fileURLToPath } from 'url' import { Client } from '@modelcontextprotocol/client' import { StdioClientTransport } from '@modelcontextprotocol/client/stdio' +import { npmInvocation } from './npm-invocation.mjs' const scriptDir = path.dirname(fileURLToPath(import.meta.url)) const repoRoot = path.resolve(scriptDir, '..') -const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm' const temporaryRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'skillmanager-pack-')) function run(command, args, options = {}) { @@ -29,6 +29,11 @@ function run(command, args, options = {}) { return result } +function runNpm(args, options = {}) { + const invocation = npmInvocation(args) + return run(invocation.command, invocation.args, options) +} + async function freePort() { const server = net.createServer() await new Promise((resolve, reject) => { @@ -56,7 +61,7 @@ let lifecycleEnv = null let lifecycleStarted = false let mcpClient = null try { - run(npmCommand, ['run', 'build']) + runNpm(['run', 'build']) const firstManifest = await fs.readFile( path.join(repoRoot, 'dist', 'build-manifest.json'), 'utf8', @@ -64,7 +69,7 @@ try { const packDir = path.join(temporaryRoot, 'pack') await fs.mkdir(packDir, { recursive: true }) - const packed = run(npmCommand, ['pack', '--json', '--pack-destination', packDir], { capture: true }) + const packed = runNpm(['pack', '--json', '--pack-destination', packDir], { capture: true }) const secondManifest = await fs.readFile( path.join(repoRoot, 'dist', 'build-manifest.json'), 'utf8', @@ -79,7 +84,7 @@ try { const installRoot = path.join(temporaryRoot, 'install') await fs.mkdir(installRoot, { recursive: true }) - run(npmCommand, [ + runNpm([ 'install', '--ignore-scripts', '--no-audit', diff --git a/tests/unit/npm-invocation.test.ts b/tests/unit/npm-invocation.test.ts new file mode 100644 index 0000000..cf7d1eb --- /dev/null +++ b/tests/unit/npm-invocation.test.ts @@ -0,0 +1,31 @@ +import test from 'node:test' +import assert from 'node:assert/strict' +import { npmInvocation } from '../../scripts/npm-invocation.mjs' + +test('npm child processes use Node plus npm_execpath on Windows', () => { + assert.deepEqual( + npmInvocation(['run', 'build'], { + platform: 'win32', + nodeExecPath: 'C:\\nodejs\\node.exe', + npmExecPath: 'C:\\nodejs\\node_modules\\npm\\bin\\npm-cli.js', + }), + { + command: 'C:\\nodejs\\node.exe', + args: [ + 'C:\\nodejs\\node_modules\\npm\\bin\\npm-cli.js', + 'run', + 'build', + ], + }, + ) +}) + +test('npm child processes retain the POSIX fallback outside npm', () => { + assert.deepEqual( + npmInvocation(['audit', '--json'], { + platform: 'linux', + npmExecPath: null, + }), + { command: 'npm', args: ['audit', '--json'] }, + ) +}) From f4a19511ee05cf69869f3995773f55b195c12e23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?AI=E4=BA=A7=E5=93=81=E9=BB=84=E5=8F=94?= Date: Sun, 2 Aug 2026 22:54:18 +0800 Subject: [PATCH 15/15] fix: add Skill entry icons --- .codex-plugin/plugin.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- public-marketplace/docs/index.html | 4 ++-- public-marketplace/docs/privacy.html | 4 ++-- public-marketplace/docs/support.html | 4 +++- public-marketplace/docs/terms.html | 2 +- scripts/verify-codex-plugin.mjs | 29 +++++++++++++++++++++++++ skills/skillmanager/agents/openai.yaml | 3 +++ skills/skillmanager/assets/icon.png | Bin 0 -> 8994 bytes skills/skillmanager/assets/logo.png | Bin 0 -> 40913 bytes 11 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 skills/skillmanager/assets/icon.png create mode 100644 skills/skillmanager/assets/logo.png diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 79565aa..9a42434 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "skillmanager", - "version": "0.4.0", + "version": "0.4.1", "description": "Inspect, organize, and safely converge local Agent Skills from Codex.", "author": { "name": "Backtthefuture", diff --git a/package-lock.json b/package-lock.json index 1989a43..673a2a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "skillmanager", - "version": "0.4.0", + "version": "0.4.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "skillmanager", - "version": "0.4.0", + "version": "0.4.1", "license": "MIT", "dependencies": { "@fastify/static": "^10.1.2", diff --git a/package.json b/package.json index 864dd92..c453258 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "skillmanager", - "version": "0.4.0", + "version": "0.4.1", "description": "SkillManager - local-first management and diagnostics for Agent Skills", "license": "MIT", "type": "module", diff --git a/public-marketplace/docs/index.html b/public-marketplace/docs/index.html index 158b3d4..e469a0f 100644 --- a/public-marketplace/docs/index.html +++ b/public-marketplace/docs/index.html @@ -11,7 +11,7 @@
SkillManager - +
@@ -52,7 +52,7 @@

把散落的 Skills,
收回一个主版本。

12个锁定的原生钥匙串目标
3 × 2macOS / Ubuntu / Windows,Node 20 / 22 CI
127.0.0.1Dashboard 只监听本机回环地址

本地优先,不等于含糊其辞。

SkillManager 不运行托管数据收集服务。只有你主动使用 GitHub 同步时才访问 GitHub;令牌存进系统凭据库,本地配置只保留引用。

阅读隐私说明
- + diff --git a/public-marketplace/docs/privacy.html b/public-marketplace/docs/privacy.html index ac37491..1313cef 100644 --- a/public-marketplace/docs/privacy.html +++ b/public-marketplace/docs/privacy.html @@ -2,13 +2,13 @@ 隐私说明 — SkillManager
← 返回 SkillManager -

隐私说明

生效日期:2026 年 8 月 2 日 · 适用于 SkillManager v0.4.0

+

隐私说明

生效日期:2026 年 8 月 2 日 · 适用于 SkillManager v0.4.1

一句话版本:SkillManager 是本地优先软件,不运行托管数据收集服务;网络访问只发生在你主动调用的功能中。

1. 本机读取的数据

SkillManager 会读取你授权范围内的 Agent Skill 目录,用于识别名称、描述、文件结构、安装位置、重复关系和软链状态。MCP 默认只返回必要的元数据与诊断摘要,不返回 Skill 全文、绝对主目录路径、本地控制凭据或会话 Cookie。

2. 本地保存的数据

配置、操作计划、恢复快照和废纸篓记录保存在你的电脑上。Dashboard 只监听 127.0.0.1;打开链接带有短时、单次使用的本地会话保护。

3. 凭据

如果你配置 GitHub 同步,GitHub Token 会写入操作系统凭据库;普通配置文件只保存凭据引用。诊断输出会排除 Token、Cookie 和本地控制密钥。

4. 网络访问

盘点和本地整理不需要访问 SkillManager 托管服务器,因为不存在该类服务器。只有你主动使用 GitHub 仓库检查、上传或下载时,软件才会连接 GitHub API。GitHub 对数据的处理受其自身政策约束。

-

5. 遥测与广告

v0.4.0 不包含产品分析 SDK、广告 SDK 或后台遥测上报。公开网页由 GitHub Pages 托管,访问网页时 GitHub 可能按其政策处理常规访问日志;这与本地插件运行相互独立。

+

5. 遥测与广告

v0.4.1 不包含产品分析 SDK、广告 SDK 或后台遥测上报。公开网页由 GitHub Pages 托管,访问网页时 GitHub 可能按其政策处理常规访问日志;这与本地插件运行相互独立。

6. 删除与控制

你可以停止本地服务、删除插件、移除本地配置和恢复记录,或撤销 GitHub Token。SkillManager 不持有可替你删除的云端用户数据库。

7. 联系

隐私问题请通过 公开仓库 Issues 提交;请先删去路径、Token、Cookie、私有 Skill 正文和其他敏感信息。

diff --git a/public-marketplace/docs/support.html b/public-marketplace/docs/support.html index 5cd9ba4..11d94a7 100644 --- a/public-marketplace/docs/support.html +++ b/public-marketplace/docs/support.html @@ -2,7 +2,7 @@ 支持 — SkillManager
← 返回 SkillManager -

支持与排错

SkillManager Public Git Marketplace · v0.4.0

+

支持与排错

SkillManager Public Git Marketplace · v0.4.1

安装

codex plugin marketplace add Backtthefuture/skillmanager-plugin
 codex plugin add skillmanager@backtthefuture
@@ -14,6 +14,8 @@

确认安装状态

codex plugin list --json

如果仓库有新版本,先执行 Marketplace 更新,再重新安装对应插件版本:

codex plugin marketplace upgrade backtthefuture
+

安装后图标为空

+
  1. 升级 Marketplace,并重新安装 SkillManager。
  2. 完全退出并重新打开 Codex,再新建一个任务。
  3. 仍为空时,确认安装版本至少为 0.4.1;该版本同时声明 Plugin 与 Skill 两级图标。

提交问题

请到 skillmanager-plugin Issues。建议附上操作系统、CPU、Node.js 版本、Codex 版本、复现步骤和已脱敏的错误信息。

发布前请脱敏:删除 Token、Cookie、私有 Skill 正文、用户名、完整主目录路径和私有仓库地址。

源码与许可证

开发源码位于 Backtthefuture/skillmanager,发布仓库只保存经验证的通用 Plugin 包。许可证为 MIT。

diff --git a/public-marketplace/docs/terms.html b/public-marketplace/docs/terms.html index eeb64dd..79a99d5 100644 --- a/public-marketplace/docs/terms.html +++ b/public-marketplace/docs/terms.html @@ -2,7 +2,7 @@ 使用条款 — SkillManager
← 返回 SkillManager -

使用条款

生效日期:2026 年 8 月 2 日 · 适用于 SkillManager v0.4.0

+

使用条款

生效日期:2026 年 8 月 2 日 · 适用于 SkillManager v0.4.1

1. 软件许可

SkillManager 以 MIT License 发布。你可以在该许可证范围内使用、复制、修改和分发软件;源码仓库中的 LICENSE 是权威文本。

2. 本地操作责任

SkillManager 会在你确认后修改、移动或链接本机 Skill 文件。软件提供预览、陈旧状态检查和恢复机制,但你仍应核对操作范围,并对重要目录保留独立备份。

3. 可用性

软件按“现状”提供,不承诺无错误、不间断或适合所有 Agent、文件系统和组织策略。预览结果是基于扫描时状态生成的;外部程序同时改动文件可能使计划失效。

diff --git a/scripts/verify-codex-plugin.mjs b/scripts/verify-codex-plugin.mjs index 9c94b50..74ec5a1 100644 --- a/scripts/verify-codex-plugin.mjs +++ b/scripts/verify-codex-plugin.mjs @@ -77,6 +77,11 @@ function assert(condition, message) { if (!condition) throw new Error(message) } +function quotedYamlValue(content, key) { + const match = content.match(new RegExp(`^\\s*${key}:\\s*"([^"]+)"\\s*$`, 'm')) + return match?.[1] ?? null +} + function parseCliJson(result) { try { return JSON.parse(result.stdout.trim()) @@ -133,6 +138,28 @@ assert(pluginManifest.skills === './skills/', 'Plugin Skill path is invalid') assert(pluginManifest.mcpServers === './.mcp.json', 'Plugin MCP path is invalid') assert(JSON.stringify(pluginManifest.interface?.screenshots) === JSON.stringify(['./assets/screenshots/dashboard-convergence.png']), 'Plugin screenshot metadata is invalid') +const skillRoot = path.join(sourcePluginRoot, 'skills', 'skillmanager') +const skillInterface = await fs.readFile(path.join(skillRoot, 'agents', 'openai.yaml'), 'utf8') +const skillIconSmall = quotedYamlValue(skillInterface, 'icon_small') +const skillIconLarge = quotedYamlValue(skillInterface, 'icon_large') +assert(skillIconSmall === './assets/icon.png', 'Skill small icon metadata is invalid') +assert(skillIconLarge === './assets/logo.png', 'Skill large icon metadata is invalid') +assert(quotedYamlValue(skillInterface, 'brand_color') === '#FACC15', 'Skill brand color is invalid') +assert(quotedYamlValue(skillInterface, 'default_prompt')?.includes('$skillmanager'), 'Skill default prompt must mention $skillmanager') +for (const [label, relative] of [['small', skillIconSmall], ['large', skillIconLarge]]) { + const absolute = path.resolve(skillRoot, relative) + assert(absolute.startsWith(`${skillRoot}${path.sep}`), `Skill ${label} icon escapes the Skill root`) + assert((await fs.stat(absolute)).isFile(), `Skill ${label} icon does not resolve to a file`) +} +assert( + (await fs.readFile(path.join(skillRoot, 'assets', 'icon.png'))).equals(await fs.readFile(path.join(sourcePluginRoot, 'assets', 'icon.png'))), + 'Skill small icon differs from the Plugin icon', +) +assert( + (await fs.readFile(path.join(skillRoot, 'assets', 'logo.png'))).equals(await fs.readFile(path.join(sourcePluginRoot, 'assets', 'logo.png'))), + 'Skill large icon differs from the Plugin logo', +) + const mcpConfig = await readJson(path.join(sourcePluginRoot, '.mcp.json')) assert(mcpConfig.mcpServers?.skillmanager?.command === './bin/skillmanager-mcp.js', 'MCP command must be plugin-relative') assert(mcpConfig.mcpServers?.skillmanager?.cwd === '.', 'MCP cwd must be plugin-relative') @@ -165,6 +192,8 @@ for (const required of [ 'assets/screenshots/dashboard-convergence.png', 'skills/skillmanager/SKILL.md', 'skills/skillmanager/agents/openai.yaml', + 'skills/skillmanager/assets/icon.png', + 'skills/skillmanager/assets/logo.png', 'bin/cli.js', 'bin/skillmanager-mcp.js', 'dist/server/index.js', diff --git a/skills/skillmanager/agents/openai.yaml b/skills/skillmanager/agents/openai.yaml index 8b190a2..005c769 100644 --- a/skills/skillmanager/agents/openai.yaml +++ b/skills/skillmanager/agents/openai.yaml @@ -1,4 +1,7 @@ interface: display_name: "SkillManager" short_description: "检查、诊断并整理本机 Agent Skills" + icon_small: "./assets/icon.png" + icon_large: "./assets/logo.png" + brand_color: "#FACC15" default_prompt: "使用 $skillmanager 检查我的 Skills,并打开本地管理界面。" diff --git a/skills/skillmanager/assets/icon.png b/skills/skillmanager/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..dbdc22647308f6acc821cc167d69e5417695866d GIT binary patch literal 8994 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 literal 0 HcmV?d00001 diff --git a/skills/skillmanager/assets/logo.png b/skills/skillmanager/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..38953d13d32ad111275b25fbe68cc7b51b6ec02a GIT binary patch literal 40913 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 literal 0 HcmV?d00001