dsh-loopx-plugin
loopx-project/loopxLoopX——面向长周期 Agent 的提供商中立、本地优先状态内核与控制平面:在 DeepSeek Harness 执行层之上持久化 Goal、Todo、门禁、证据、配额、恢复与交接状态;插件负责引导安装 CLI 与技能、准入有界的同会话续跑,并为精确绑定的工作循环提供本地 GoalBar。
DSH 插件:多 agent / subagent 共享的持久任务看板。通过一个 Cordis 服务键 `ctx.teamBoard` 物化
共享状态(不是模块级全局变量),用defineTool暴露task_create/task_claim/task_update/
task_list/task_delete,内置可视化看板面板(Settings → Plugins → Team Board),
快照文件落盘$DSH_HOME/team-board/board.json跨重启恢复。生态位空白:ccteam是独立产品,
没人做成 DSH 原生插件。
DSH plugin: a shared, durable task board for multi-agent / subagent collaboration. Shared state is
materialized as a Cordis service key `ctx.teamBoard` (not a module global), exposed through
defineToolastask_create/task_claim/task_update/task_list/task_delete, with a
visual kanban panel (Settings → Plugins → Team Board) and restart-safe persistence via a
snapshot file at $DSH_HOME/team-board/board.json. A DSH-native board — an empty niche(ccteam is a standalone product, nobody built the DSH-native one).TeamBoardService(ctx.teamBoard),跨会话/subagent 可见;插件闭包里没有全局可变态。
(todo / doing / done),面板内创建任务、点卡片按钮流转状态,改动立即持久化。
$DSH_HOME/team-board/board.json,启动时优先从该文件恢复;board/snapshot 会话事件日志保留为进程内审计轨迹(ctx.sessions 是纯内存存储, 日志会话本身不保证跨进程复活,文件快照才是重启后的真相源)。
defineTool):创建 / 认领 / 状态流转 / 查询 / 删除。ctx.tools.register 注册,卸载自动反注册。TeamBoardService(ctx.teamBoard), visible across sessions/subagents; no module-level mutable state.
(todo / doing / done), create tasks in-panel, click a card to transition; changes persist instantly.
$DSH_HOME/team-board/board.json, which is the source of truth on boot; the board/snapshot session-event journal stays as the in-process audit trail (ctx.sessions is an in-memory store, so the journal alone does not survive a process restart — the file does).
defineTool): create / claim / transition / query / delete.ctx.tools.register and unregister on unload.{ id, subject, status: todo|doing|done, owner?, deps: string[], createdAt, updatedAt }工具 / Tool · 参数 / Params · 行为 / Behavior task_create · subject(必), owner?, deps? · 建任务,状态 todo,生成 id task_claim · id(必), owner? · 认领:状态 → doing,owner 缺省为调用方 agent id task_update · id(必), subject?/status?/owner?/deps? · 只改传入字段 task_list · status?, owner? · 按创建时间排序,可按状态/owner 过滤 task_delete · id(必) · 删除任务
dsh plugin --profile <name> add @dsh-suite/plugin-team-board(本地开发:dsh plugin --profile add ./packages/plugins/plugin-team-board)
无配置项。程序化消费者可用 ctx.teamBoard.createTask/claimTask/updateTask/listTasks 直接调用。
No config. Programmatic consumers call ctx.teamBoard.createTask / claimTask / updateTask / listTasks.
--dsw-alias-* 设计令牌引用(保留暗色字面量仅作 token 缺失时的兜底),亮色主题不再破相; 根节点输出 data-dsh-plugin="plugin-team-board" + data-dsh-surface="settings-modal", 卡片/列/按钮/徽章/输入框标 data-dsh-part(L2 语义属性,供皮肤中心完整换肤)。
修复跨进程重启丢状态:ctx.sessions 实为纯内存存储(持久化插件只 flush 存活会话), 仅靠 board/snapshot 日志在重启后恢复不了看板。现在每次变更同时写 $DSH_HOME/team-board/board.json 快照文件,启动优先从文件恢复(日志保留为进程内审计)。
会带入 undefined 键,跟着 spread 进任务并写进 board/snapshot,使 append-only JSONL 无法序列化、 看板「坏掉」。修法:update() 只合并 undefined 被过滤的字段;snapshot() 对所有任务做 strip-undefined 规范化(历史污染记录重载自愈)。回归于 scripts/board-smoke.mjs(断言缩到 「快照可序列化 + 无 undefined」,不依赖狭义的存储内键集)。
pnpm build)scripts/board-smoke.mjs 15/15 断言(create/claim/update/list/delete/snapshot 回放)dsh plugin add → --dump-config 含 team-board 行 → headless boottask_create listed=true(Service 实例化 + 工具注册成功)
已持久化)、页面重开状态保持;截图 research/team-board-screenshots/
/team-board/list 从 board.json 复原全部任务DEEPSEEK_API_KEY(无 key 时 headless 停在 MISSING_CREDENTIAL)遵守 dsh-plugin-design-principles.md:共享状态物化为协作用键(#2)、长命状态放依赖不放闭包(#10)、 inject 声明依赖(#3)、注册即 effect(#1)、事件走类型化 session/event + declaration merging(#15)。
This plugin follows the DSH Web styling contract (docs/web-styling.md): all colors come from --dsw-alias-* design tokens (dark literals only as fallback), with no per-theme CSS selectors. It also implements the L1 (token coverage) + L2 (semantic attributes) — cards/columns/buttons/badges/inputs emit data-dsh-part, so third-party skins get full coverage without relying on unstable class names.
本插件遵循 DSH Web 样式契约:颜色全部经 --dsw-alias-* 设计令牌引用(暗色字面量仅作兜底),无按主题分支的 CSS 选择器; 并实现 dsh-web 皮肤中心兼容契约 L1(令牌覆盖)+ L2(语义属性)——卡片/列/按钮/徽章/输入框标注 data-dsh-part,第三方皮肤无需依赖不稳定类名即可完整换肤。