rqwj/oh-my-ticket 预览 preview

rqwj/oh-my-ticket

DSH 的 ticket 管理插件:Epic → Story → [SubStory] → Ticket → [SubTicket] 五级任务体系, SQLite 存元数据与层级关系,Markdown 存正文。ticket 随项目走(.omt/ 目录可直接进 git), 模型通过工具创建/推进,人通过三种可切换的 UI 展现方式浏览与管理; run 机制支持把一批 ticket 交给模型批量执行,全程有状态机、进度与信任策略兜底。

catalog 简介 / catalog descriptioncatalog description:a ticket tool for agent

项目介绍Project Overview

Oh-My-Ticket 是 DSH 的 ticket 管理插件,提供 Epic→Story→SubStory→Ticket→SubTicket 五级任务体系,用 SQLite 存元数据、Markdown 存正文,支持模型工具创建推进、三种 UI 浏览、run 批量执行与状态机兜底。适合需要把任务随项目纳入 git、让模型认领执行一批 ticket 的场景。注意安装或升级后需重启 dsh web 进程,工具与 UI 才生效。

Oh-My-Ticket is a DSH plugin for ticket management. It provides a five-level hierarchy (Epic → Story → SubStory → Ticket → SubTicket), stores metadata in SQLite and content in Markdown, and offers model tools, three switchable UIs, and batch run execution with state machines and trust policies. Use it when tasks should live with the project in git and be claimed and executed by the model in batches. Caveat: restart the dsh web process after install or upgrade for tools and UI to take effect.

或使用命令行安装(适合开发者)Or use CLI install (for developers)

命令行安装CLI Install

dsh plugin --profile web add github:rqwj/oh-my-ticket

rqwj/oh-my-ticket 加入你的 DSH 配置(web profile)即可启用。

READMEREADME

Oh-My-Ticket (OMT)

version tests platform dsh

DSH 的 ticket 管理插件Epic → Story → [SubStory] → Ticket → [SubTicket] 五级任务体系, SQLite 存元数据与层级关系,Markdown 存正文。ticket 随项目走(.omt/ 目录可直接进 git), 模型通过工具创建/推进,人通过三种可切换的 UI 展现方式浏览与管理; run 机制支持把一批 ticket 交给模型批量执行,全程有状态机、进度与信任策略兜底。

image-20260819114848240

✨ 功能特性

三种展现方式,一键切换

同一份 ticket 树,三种外壳共享同一套过滤/排序/搜索交互:

  • 左侧抽屉shell.overlay 浮层,顶部 OMT 按钮开合,宽度可拖拽记忆
  • 浮窗:自由拖拽移动、右下角缩放,位置尺寸持久化;浮窗激活时 OMT Tab 自动隐藏并回退 Chat
  • OMT Tab:注册进会话视图环,与 Chat | Trajectory 并列,可"弹出为浮窗"

完整的树交互

  • 类型徽章(E/S/SS/T/ST)、状态点(归档空心化)、优先级信号条(P1–P3 渐强着色)
  • 搜索、类型/状态/优先级多选过滤、优先级排序、编号显示开关;过滤器状态 自动保存到工作区 .omt/ui-filters.json,刷新自动恢复,面板内一键重置
  • 归档独立维度(与生命周期状态正交,归档只读)、折叠状态跨会话记忆
  • 窄视口适配(<640px 抽屉全宽、拖拽把手退役)、键盘焦点环规范
  • 变更即时推送:自有 SSE 通道(/omt/events),模型改完 UI 立刻刷新

文档详情面板

  • 选中节点即在右侧 details 列打开完整文档(动态遮蔽,关闭自动恢复原工具详情)
  • 标题/状态/优先级/归档操作、追加进度记录、相对时间展示
  • "执行"按钮:把 ticket 引用进输入框提交执行,执行中状态展示并锁定面板操作

模型与 UI 双向联动

  • @ 输入触发器:引用 ticket 进对话(候选排序 + 状态着色)
  • 输入框上方引用条、激活 ticket 状态条
  • 每轮对话末尾自动展示"相关 ticket"列表(来源:@ 引用 ∪ 工具调用 ∪ UI 操作)

Workspace 归属

  • 工作区根目录存在 .omt/ 时 ticket 随项目走(可进 git),否则回退全局 home (插件 config > OMT_HOME > ~/.omt
  • 创建 Epic 时弹窗选择归属;id 跨 home 全局唯一
  • 树跟随当前会话的工作区自动切换

Run 批量执行

把一批 Ticket/SubTicket 快照成有序 run,交给模型逐项认领、执行、如实报告:

  • item 状态机pending → running → done / failed / blocked / skipped / interrupted, 另有信任策略态 awaiting_confirmation——非 report 的裸 done 需人在 run 详情确认或打回
  • 续跑:run 可 pause/resume,interrupted 项 retry 后重新入队;idle 续跑 nudge 自动提醒
  • UI 联动:Runs 区块展示列表/详情/进度统计,树行"▸▸"一键加入 run; 从 UI 触发「开始执行」会自动唤醒执行会话进入 claim 循环
  • 执行上下文注入:claim 成功即时读取祖先链(Epic → Story → SubStory → 父 Ticket) 正文作为只读背景返回,16 KiB 预算内最近父级优先,截断显式标记,单点读取失败降级不阻塞
  • 祖先激活:ticket 开工(置 in_progress 或 claim 成功)自动点亮仍为 open 的 祖先链;done/blocked/skipped 祖先永不重开,归档祖先静默跳过

🤖 模型工具

工具 用途
omt_create 创建节点(Epic/Story/SubStory/Ticket/SubTicket),层级合法性校验
omt_list 列出节点(类型/状态过滤,关键词搜索)
omt_show 节点详情(元信息、正文、父子清单),toolview 渲染为 Markdown 文档
omt_update 标题/状态/优先级/归档,替换正文或追加进度记录
omt_move 移动节点(连同子树)
omt_reindex 磁盘 markdown 手工修改后重建 SQLite 索引
omt_run_create 创建 run:按顺序快照 Ticket/SubTicket 为执行批次
omt_run_list 列出 run(状态过滤 + 成员进度统计)
omt_run_show 查看 run 详情:配置、成员状态、执行者谱系、attempts、last_error
omt_run_control start / pause / resume / cancel / retry(nodeId) / remove(nodeId)
omt_run_claim 原子认领下一项并绑定执行者;返回只读祖先上下文,激活 open 祖先
omt_run_report 报告单项结果(done/failed/blocked/skipped),note 记入 ticket 进度

内嵌两个 skill:omt 教 ticket 体系操作规范与状态流转约定,omt-runs 教 run 批次纪律(创建/认领/报告/续跑响应)。

📦 安装

# 本仓库构建并打包(首次需先链接 DSH checkout,见「开发」一节):
pnpm install && pnpm build && npm pack    # → oh-my-ticket-0.4.1.tgz

# 安装进目标 DSH profile(profile 的 dsh.profile.bundles 依次为):
#   @deepseek-ai/dsh-base, @deepseek-ai/dsh-web-app, oh-my-ticket
pnpm dsh plugin --profile <profile> add /path/to/oh-my-ticket-0.4.1.tgz

在工作区根目录 mkdir .omt 即可让该项目拥有独立的 ticket 库(随项目进 git)。 安装/升级后需重启 dsh web 进程,新版本的工具与 UI 才会生效。

🛠 开发

首次设置:链接本地 DSH checkout

@deepseek-ai/* 依赖未发布到 npm,package.json 通过 link:./.dsh-checkout/... 引用本机的 deepseek-harness 源码。克隆仓库后,先运行 setup 脚本创建符号链接:

# 方式一:参数传入 DSH checkout 路径
pnpm run setup /path/to/deepseek-harness

# 方式二:环境变量
DSH_CHECKOUT=/path/to/deepseek-harness pnpm run setup

# 然后正常安装依赖
pnpm install

脚本会校验目标目录确实是 deepseek-harness checkout(检查 vendor/cordispackages/* 等子目录是否存在),然后在仓库根目录创建 .dsh-checkout 符号链接。该链接已 gitignore,只存在于本机,不含任何机器特定路径。

日常开发

pnpm build        # lib/index.js(host 半)+ lib/client.js(浏览器半)
pnpm watch        # 增量重建
pnpm typecheck    # tsc --noEmit
pnpm test         # vitest(344 例)

仓库结构

├── package.json          # dsh.bundle + dsh.client 双 manifest
├── cordis.patch.yml      # 组合层:insert omt 行
├── tsdown.config.ts      # host 半 + client bundle 构建
├── src/
│   ├── index.ts          # host 插件入口(home 解析 + core 装配 + 工具/skill/hook 注册)
│   ├── host/
│   │   ├── core/store/markdown/files/pool   # 数据核心:SQLite + Markdown 双写、多 home 池
│   │   ├── rpc/events/changes               # 浏览器通道:RPC 端点 + SSE 变更推送
│   │   ├── tools/skill                      # omt_* 工具面 + omt / omt-runs skill
│   │   ├── running/recent/idle-hook/disposed-hook/notify-hook   # 执行态与提醒
│   │   └── ui-state.ts                      # 过滤器持久化(ui-filters.json)
│   └── client/
│       ├── index.ts      # 浏览器半入口(slot 注册装配)
│       ├── controller.ts # snapshot stores 与全部异步流
│       └── components/   # TicketPanel(共享树面板)+ Drawer/FloatWindow/TicketTab 三壳
│                         # + DocPanel/RunsView/RunPicker/TurnTickets 等
├── tests/                # vitest 单测(27 文件 / 344 例)
└── .omt/tickets/         # 本项目的 ticket 库(SQLite 索引已 gitignore,可 omt_reindex 重建)

📚 设计文档

License

MIT

上一个 Prev dsh-plugin-reading-pipeline 下一个 Next dsh-message-edit