Releases: dahai80/fusion-plugins-ecosystem
Release list
v0.4.1 — 仓库治理补丁 (Repository Hygiene Patch)
v0.4.1 — 仓库治理补丁 (Repository Hygiene Patch)
本补丁版本自 v0.4.0-rc.1 起进行仓库治理收尾,无运行时代码改动(代码冻结于 RC,536 测试全绿、CI 8/8 维持)。
变更
- Issue 清零:关闭 #13(DeskRuntime distributed_state handle)——已由 PR #22
cluster_bridge.py落地(vRAM 跨节点账本 + 插件状态同步 + 节点心跳 failover + 5 个集群查询方法 + 9 项回归测试)。附详细修复说明评论,标注上游依赖 fusion-cowork#79 仍待 cowork 侧 handle wiring。 - 分支清理:删除 13 个已合并的过期远程分支 + 1 个本地分支。远程现仅
origin/main,无残留。 - 版本号:
0.4.0rc1→0.4.1(PEP 440)。
鉴定状态(沿用 RC,无回归)
| 维度 | 状态 |
|---|---|
| 审计 P0-P3 | ✅ 全清零 |
| 测试 | ✅ 536 passed |
| CI | ✅ 8/8 green (main @ 5123e9d) |
| Lint + Format | ✅ ruff clean, 49 files formatted |
| Open Issues | ✅ 0 |
| Open PRs | ✅ 0 |
| 过期分支 | ✅ 0 |
⚠️ 部署前置条件(沿用 RC,ops 侧)
- 多节点 CI 未覆盖(
tests/test_cluster_bridge.py用importorskip("fusion_cowork"),CI 单仓跳过)——生产前须在 monorepo 环境跑一次确认集群桥生效。 - Soak 实测仅 60s——生产前须
scripts/soak_mlx.py --duration 86400跑 24h 确认无慢泄漏。
已知边界(沿用 RC)
- 多节点 HA quorum/脑裂在 fusion-cowork 侧,本仓只桥接状态。
- 系统级吞吐受 fusion-mlx 单引擎约束,多并发需多引擎/多节点分摊。
测试
536 passed, CI 8/8 green on main.
Full Changelog: v0.4.0-rc.1...v0.4.1
v0.4.0-rc.1 — 企业级生产发布候选 (Enterprise Release Candidate)
v0.4.0-rc.1 — 企业级生产发布候选(Enterprise Release Candidate)
本次 RC 在 v0.3.3 基础上落地完整企业级演进路线图(审计 P0-P3 全清零 + 6 步路线图全合并),代码与测试层面具备企业级生产商用发布条件。
RC 说明:代码冻结候选。发布前须 ops 补两项确认(见下方「部署前置条件」),确认后转 v0.4.0 正式版。
鉴定结论
| 维度 | 状态 |
|---|---|
| 审计 P0-P3 | ✅ 全清零(PR #17/#24),无阻断缺陷 |
| 测试 | ✅ 536 全绿,CI 8/8 |
| 企业级路线图 | ✅ 6 步全合并 |
| 发布判定 | 代码层面具备企业级生产商用发布条件 |
路线图(6 步,2026-08-31)
- P2 收尾(PR #17)— 幂等键去重(
_idempotency_keyTTL 600s,防客户端断连重复副作用)+ infra_log 双流汇集(基础层错误桥接至环形缓冲,运维可查)。 - 可观测性(PR #19/#20)— 新增
metrics.py(Prometheus 文本暴露,纯进程内注册表零外部依赖)。计数器plugin_executions_total/plugin_errors_total/mcp_tool_calls_total/mcp_tool_errors_total/sandbox_spawns_total;瞬时 gaugeactive_plugins/active_sessions/vram_used_mb。transport 未鉴权GET /metrics短路(text/plain; version=0.0.4),供 Prometheus/K8s scrape。493 测试,CI 8/8。 - 压测(PR #21)— (a) 确定性并发安全回归
tests/test_load.py(8 项入 CI):50 路并发 execute 无丢失 +max_concurrent限流;指标 8 线程×500 inc 零竞态;token-meter 1000 条高频无丢失;沙箱 spawn 风暴 10 轮零泄漏。(b) live MLX 吞吐基准scripts/bench_mlx_load.py:concurrency 8/16 → 6.25 req/s 持平、延迟线性涨 → 瓶颈在下游单引擎,插件层零开销。501 测试,CI 8/8。 - 多节点(PR #22)— 新增
cluster_bridge.py桥接 fusion-cowork 分布式状态层。插件 enabled/disabled + vRAM 跨节点同步;节点心跳 + 失效 failover(stale 节点 evict 清理状态/vRAM)。降级语义:FUSION_CLUSTER_ENABLED未启用或 cowork 缺失时全 no-op,单机行为不变。9 项回归测试。510 测试,CI 8/8。 - 长时稳定性 soak(PR #23)— (a) 确定性长时回归
tests/test_soak.py(8 项入 CI):token-meter 50k record 容量封顶、日志缓冲 10k 封顶、会话 2000 LRU 封顶、计数器 100k 单调无溢出。(b) live MLX soakscripts/soak_mlx.py(60s):23 调用,RSS 50.0→50.3MB 后半段 plateau delta 0.1MB 无泄漏,exec_total==calls,err_total=0。verdict: STABLE。518 测试,CI 8/8。 - P3 工程化清理(PR #24)— (a) TokenMeter WAL 追加写(JSON Lines O(batch) + 周期压缩 snapshot,
seq单调去重防崩溃恢复重复,旧版 list 向后兼容)。(b)cpu_limit默认 0.0=不限(RLIMIT_CPU 累计秒,1.0 会 SIGXCPU 杀合法计算)。(c) 结构化 JSON 日志logging_setup.py(correlation_idContextVar 全链路关联)+ SSE 队列 maxsize=256 满队丢弃不阻塞 +_enable_with_retry仅 vRAM 暂态重试。18 项回归测试。518→536 测试,CI 8/8。
安全
- Bearer 鉴权 + 非 loopback 绑定强制 token(
FUSION_PLUGIN_AUTH_TOKEN),拒绝对外裸奔 - API 密钥 Fernet 加密存储
- 会话上限 LRU(256),错误响应脱敏截断(300 字符)
- 远程传输鉴权拒绝走 stderr 收窄改动面
运维闭环
- 看门狗心跳判死 + atexit 兜底回收(防子进程孤儿)
- token WAL 崩溃恢复(停机 flush→单文件可恢复)
- 结构化 JSON 日志便于 ELK/Loki 聚合
⚠️ 部署前置条件(ops 侧,非代码阻断)
- 多节点 CI 未覆盖:
tests/test_cluster_bridge.py用pytest.importorskip("fusion_cowork"),CI 单仓环境无 fusion_cowork → 9 项测试静默跳过。生产前须在含 fusion_cowork 的 monorepo 环境跑一次该文件,确认集群桥真实生效(本地已验证 510 绿)。 - Soak 实测仅 60s:生产前须运维延长
scripts/soak_mlx.py --duration 86400跑 24h,确认无慢泄漏(second-half plateau delta 法)。
两项均为「发布前 ops 跑一次确认」,非代码缺陷。确认后转 v0.4.0 正式版。
已知边界
- 多节点 HA 的 quorum/脑裂配置在 fusion-cowork 侧,本仓
cluster_bridge只桥接状态,不解决分布式共识(超本仓范围)。 - 系统级吞吐上限受 fusion-mlx 单引擎约束(吞吐 8→16 并发持平 ~6.25 req/s),多并发场景需多引擎/多节点分摊。
测试
536 passed, CI 8/8 green on main.
Full Changelog: v0.3.3...v0.4.0-rc.1
v0.3.3
v0.3.3 — fusion-desk → fusion-cowork 重命名 + 三个非阻断项落地
关键修复
上游底座实为 fusion-cowork(import fusion_cowork,已装 v0.2.5),不存在 fusion-desk。
旧代码 try: import fusion_desk 始终失败,FUSION_DESK_AVAILABLE 恒为 False,
集成处于静默降级态(隐藏的 P1 集成缺陷)。本次更正后 FUSION_COWORK_AVAILABLE=True,
集成恢复。
三个非阻断项
- server.py 覆盖率 43% → 补 6 个冒烟测试:MCPServer start/stop 生命周期(SSE 真实启停、幂等 start、安全 stop、stdio 信号停止)+ CLI main()(argparse 启停、KeyboardInterrupt 分支)
- PROCESS 沙箱约束文档:CLAUDE.md 入口契约补充——PROCESS 模式下入口必须为模块级可导入属性,闭包/lambda/局部函数(
<locals>)无法在子进程importlib.import_module导入,会在 spawn 时失败 - 全工程 fusion-desk 残留清理:desk_runtime.py / mcp_exporter.py / claude_gateway.py / init.py / pyproject.toml / README.md / README_CN.md / CLAUDE.md 全部 desk → cowork,DeskContext → DeskRuntime,移除已不存在的 desk_context.py / test_desk_context.py
测试稳定性
- 修复
test_mcp_server_stdio_signal_stop在 Linux CI 挂死:SelectorEventLoop 自身实现 add_signal_handler 遮蔽类级 patch → 改实例级 patch + wait_for 兜底 - CI 增加
pytest-timeout --timeout=120兜底,防止未来测试挂起阻塞 CI
验证
pytest tests/ -q→ 420 passed(+6)ruff check --select=F,E711,E712,E721,E741,W无问题ruff format --check全绿- CI:3.11/3.12/3.13 + lint 全绿
Full Changelog: v0.3.2...v0.3.3
v0.3.2 — 生产商用发布阻断修复
补丁版本
修复阻断生产商用发布的全部缺陷,12 项核心特性达到生产可用标准。
P0 阻断级 — 沙箱 worker 侧
- 入口签名对齐 inline 契约
entry(desk, params),desk 为_DeskProxy - 日志改走 stdout IPC,避免 stderr PIPE 写满阻塞子进程
- stdout 输出加锁,心跳线程与主循环不再交错
P0 阻断级 — 沙箱宿主侧
call()增加单次超时,避免永久挂起- 进程退出/kill 时解析所有 pending future
P1 严重
skill_adapter.export_all过滤条件改为CLAUDE_SKILL_transition非法转换拒绝并抛错
P2 配置联动
config.sandbox_default_mode接入 lifecycle 默认沙箱模式
测试
- 411 passed,新增 4 个真实子进程端到端测试
- CI/lint 全绿
🤖 Generated with Claude Code
v0.3.1
v0.3.0
v0.3.0 — Feature Completeness Release
New Features
| Item | Description |
|---|---|
| REG-03 | Dependency topological sort — resolve_load_order() + lifecycle auto-dep loading with cycle detection |
| REG-04 | Version conflict detection — same-id different-version rejected, same version idempotent |
| LIF-02 | Per-plugin config — max_restart and timeout_seconds from manifest override globals |
| LIF-05 | State query API — get_state(), list_by_state() on PluginLifecycle |
| C12 | MCP session management — session tracking, prune, list in MCPHandler |
| C13 | Per-plugin rate limiting — configurable rate_limit_per_minute |
| C14 | outputSchema + mcp_annotations — on PluginManifest, surfaced in tools/list |
| CLD-04 | Agent model selection — agent_model field on manifest for subagent routing |
| CLD-05 | HookAdapter — maps PluginCapability → Claude Code Plugin hooks (PreToolUse/PostToolUse/Notification/Stop/SubagentStop) |
| CLD-07 | MCP namespace — tool names use mcp__plugin__<id> convention |
| B12 | acquire_vram resize semantics — same plugin_id replaces allocation instead of accumulating |
Issues Filed
- fusion-studio #78–84: GUI-01~07 (plugin marketplace, config panel, status monitor, token dashboard, vRAM viz, log viewer, MCP connection mgmt)
Stats
- 407 tests passing (+36 from v0.2.0)
- 17 files changed, 854 insertions
v0.2.0 — Architecture Compliance Refactor
What Changed
Full architecture refactoring of fusion-plugins-ecosystem based on Claude Code Plugin ecosystem deep-dive.
Phase 0: Foundation rebuild
- Frozen
PluginManifest+PluginParam(immutable, hashable) PluginStatestate machine (REGISTERED→LOADED→ENABLED→DISABLED/CRASHED/TIMEOUT)schema.py— shared enums (PluginParamType, SandboxMode, MCPAnnotations)config.pyvalidation + observer pattern
Phase 1: MCP protocol stack
transport.py— StdioTransport, SSETransport, HTTPTransportjsonrpc.py— MCPHandler with JSON-RPC 2.0server.py— MCPServer +fusion-plugin-serverCLI
Phase 2: Plugin sandbox
sandbox.py— PluginSandbox with process isolation- SandboxMode: INLINE / PROCESS
- ResourceLimits + SandboxHealth
Phase 3: Claude Code Plugin adapters
skill_adapter.py,agent_adapter.py,plugin_bundle.py.claude-plugin/directory generation
Phase 4: Token metering + config enhancement
- TokenMeter persistence, EcosystemConfig new fields
Phase 5: Desk Bridge cleanup
- desk_context.py removed (merged into desk_runtime.py)
Phase 6: Test rebuild
- 371 tests, all passing (was 222)
- 12 end-to-end integration flows
Cross-project
to_dict()serialization for Swift/TS consumersfusion-deskmoved to optional[desk]dependency- CI workflow (pytest 3.11/3.12/3.13 + ruff lint + ruff format)
- 8 upstream/downstream GitHub issues filed
Full Changelog: v0.1.0...v0.2.0