DSH 输入框下方的 JIRA 任务面板:按工作区配置项目 Key 与可选 JQL,展示指派给当前用户的问题,带状态、优先级与类型标签、总数徽标、收起与刷新、跳转 JIRA,并在设置页卡片配置 JIRA 地址与令牌(含连接测试)。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-jira-tasks
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:liu3734/jira-tasks-dsh-plugin#path:/profile-package
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
中文 · English
在 DSH 会话输入框下方展示当前 JIRA 项目指派给当前用户的「开启 / 重新开启」任务列表。JIRA 地址与令牌在设置 → 插件 → JIRA 中配置(JIRA_BASE_URL / JIRA_API_TOKEN 作为回退);项目 Key 与 JQL 按工作区配置并持久化。
功能
- 📋 新会话与活跃会话的输入框下方均展示任务面板(新会话时与输入框等宽)
- 👤 默认仅显示当前用户(
assignee = currentUser())的「开启 / 重新开启」任务 - ⚙️ 设置 → 插件 → JIRA 配置 JIRA 地址与访问令牌(令牌写入凭据存储,不回传前端)
- 🟢 设置卡片自动探测连接并显示状态灯:绿=可用、红=不可用、灰=未配置;点「测试连接」可用未保存的草稿值即时验证
- ⚙️ 项目 Key 与 JQL 按工作区保存;未配置的工作区显示"未配置"
- 🔄 打开新会话自动查询,面板内支持一键刷新(⟳)
- 🧭 点击标题可收起 / 展开面板;标题徽标显示查询命中的任务总数(列表最多展示 50 条,按更新时间倒序)
- 🏷️ 每条任务附状态徽章(按状态分类着色:新建 / 进行中 / 其他)、优先级与类型标签
- 🔗 任务可点击,在新标签页打开 JIRA 详情
- 🎨 颜色使用 DSH 主题令牌,浅色 / 深色主题自适应
安装
包已发布到公共 npm(dsh-jira-tasks);仓库的发布工作流同时把同一版本发布到 GitHub Packages(作用域包名 @liu3734/dsh-jira-tasks)。从 npm 安装(推荐):
dsh plugin --profile web add dsh-jira-tasks
重启 DSH 后生效。
若改用 GitHub Packages 源:先在 profile 的
.npmrc配置@liu3734:registry=https://npm.pkg.github.com/及读取令牌,再执行dsh plugin --profile web add @liu3734/dsh-jira-tasks。
- 将仓库
profile-package/复制为~/.dsh/profiles/web/packages/dsh-jira-tasks/ - 编辑
~/.dsh/profiles/web/package.json:dependencies增加:"dsh-jira-tasks": "file:./packages/dsh-jira-tasks"dsh.profile.bundles追加:"dsh-jira-tasks"
- 在 profile 目录执行
pnpm install - 重启 DSH
注:
pnpm install会把包复制到node_modules/(非符号链接),改动源码后需同步node_modules/dsh-jira-tasks或重跑 install。
在 DSH 会话中用 Cordis 工具执行:cordis_define(kind: new,idPrefix: "jira",源码见仓库 plugin/host.js / plugin/client.js)→ cordis_run 激活。动态插件只存在于进程内存,重启后消失,仅适合临时试用。
配置
1. JIRA 地址与令牌
打开 设置 → 插件 → 插件配置 → JIRA,填写:
- JIRA 地址:如
http://jira.example.com/(存入用户设置文档,可在界面回读) - 访问令牌 / PAT:写入凭据存储(
$DSH_HOME/.credentials.yaml),前端只显示"已配置",不回传令牌本身
留空并保存会保持已有令牌不变;地址留空并保存则清除设置项,回退到环境变量。认证自动识别:令牌含 : 用 Basic,否则用 Bearer(JIRA PAT)。
连接测试
卡片底部有连接状态灯与 测试连接 按钮:
- 打开卡片时会自动探测一次(请求 JIRA
/rest/api/2/myself),保存后也会自动重测 - 绿 = 地址与令牌可用(并显示当前登录用户);红 = 不可用(显示 JIRA 返回的原因,如 401 认证失败);灰 = 地址或令牌未配置
- 点 测试连接 会用当前输入框里的内容(未保存也可)立即测试,方便改完再存
以下环境变量 / 凭据仍作为回退(设置页未配置时生效,兼容旧部署),热加载无需重启:
JIRA_BASE_URL: "http://jira.example.com/"
JIRA_API_TOKEN: "<PAT 或 user:token>"
- 地址别名:
JIRA_BASE_URL/JIRA_URL - 令牌别名:
JIRA_API_TOKEN/JIRA_TOKEN
2. 项目 Key 与 JQL(按工作区)
- 点击面板标题右侧 ⚙ 打开设置(表单顶部提示当前配置归属的工作区)
- 项目 Key:如
HCPFYH1,保存后立即查询,该工作区后续新会话自动加载 - JQL:留空使用默认查询;也可填写自定义 JQL,
{projectKey}(或{key})会被替换为项目 Key
默认查询:
project = "{projectKey}" AND status in ("开启", "重新开启") AND assignee = currentUser() ORDER BY updated DESC
状态名按中文工作流("开启"/"重新开启")配置;若 JIRA 用英文状态(Open/Reopened),在 ⚙ 中填写自定义 JQL 即可。
卸载
dsh plugin --profile web remove dsh-jira-tasks
常见问题
面板中的提示位于「查询失败:」之后,与下列文案对应:
| 提示 | 处理 |
|---|---|
| 未设置项目 Key | 面板未配置项目,点标题右侧 ⚙ 填写项目 Key |
| 未配置 JIRA 地址(设置 → 插件 → JIRA,或环境变量 JIRA_BASE_URL) | 地址未写入,见上文「配置 1」 |
| 未配置 JIRA 令牌(设置 → 插件 → JIRA,或环境变量 JIRA_API_TOKEN) | 令牌未写入,见上文「配置 1」 |
| 401 … | 令牌无效或认证方式不对;先 curl -H "Authorization: Bearer <token>" <base>/rest/api/2/myself 验证 |
| 无法解析 JIRA 响应:… | 网络 / 代理问题,curl 无输出 |
- 确认已安装并重启 DSH;新会话面板位于输入框下方
- 检查 DSH 启动日志中 profile 插件是否加载成功
架构与实现细节
┌────────────────────────────────────────┐ ┌────────────────────────────────────┐
│ conversation.composer.dock(活跃会话) │ │ webServer 路由 /jira/api/search │
│ conversation.input.dock(新会话) │ │ ↓ │
│ 面板 hero 布局(flex order:99) │ │ settings.get("jira-tasks").baseUrl │
│ ↓ 挂载 / 刷新时 fetch POST │ │ credentials.resolve(JIRA_API_TOKEN) │
│ 渲染:任务列表 / 错误 / 未配置 │ │ subprocess.spawn(curl …) │
│ localStorage 按工作区存取项目 Key/JQL │ │ ↓ stdout JSON │
│ settings.plugin.item(设置页卡片) │ │ 解析 issues → 返回 {ok,issues} │
└────────────────────────────────────────┘ └────────────────────────────────────┘
- Host:注册
settings命名空间jira-tasks(baseUrl,可读)与webServer路由POST /jira/api/search;地址优先读设置文档,令牌经credentials服务解析(设置页写入 / 环境变量 /$DSH_HOME/.credentials.yaml,热加载);查询用subprocess直接spawn curl,认证头经 stdin(--config -)传入,令牌不进入命令行参数。 - Client:
window.__ModuleLoader__.load({ id, factory })标准 web bundle;注册conversation.composer.dock(活跃会话,注册order: 5)与conversation.input.dock(新会话,注册order: 10)。新会话面板走 hero 布局:面板元素自身flex order: 99排在输入框之后下方,并以--dsh-composer-side-clearance/--dsh-composer-card-max-width与输入卡等宽。另注册settings.plugin.item(key: "jira-tasks")作为设置页卡片:地址经settingsScope写入命名空间,令牌经remote.credentials写入凭据存储。 - 为什么不用
shell服务:shell会套sandbox-exec,部分 macOS 上不可用(sandbox_apply: Operation not permitted);subprocess是原始进程缝,无此问题。 - 新会话显示:DSH 壳在 hero(空白会话)阶段不渲染
composer.dock,故额外注册input.dock,并用「会话是否已有消息」去重(新版 DSH 依据SessionSnapshot.blank),避免双份面板。
与动态插件版的差异
| 维度 | 动态插件 | 正式安装(本包) |
|---|---|---|
| 持久性 | 重启丢失 | 重启保留 |
| Client→Host 通信 | host.call / harness.handle |
webServer 路由 + fetch |
| 客户端 bundle | 会话内注入 | /plugins/dsh-jira-tasks/client.js |
| 配置 / 凭据 | 仅环境变量 / .credentials.yaml(无设置页卡片) |
设置页卡片 + 同一 .credentials.yaml 回退 |
License
MIT
链接
同类插件
zhu1090093659/dsh-web#packages/dsh-task-board★ 7488
侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
zhu1090093659/dsh-web#packages/dsh-web-all★ 7488
DSH Web UI 插件与皮肤合集:任务看板、git 图、右侧面板、远程移动端 UI、桌宠、实时 token 统计与皮肤中心。
omdsh-dev/DSH-better-sidebar★ 3555
侧边栏完整工作台:内置文件渲染编辑、终端、Git 与子代理,支持三方插件注册新 Tab。
ccch1mneyyy/dsh-TUI★ 2994
Claude Code 风格全屏终端 UI:像素鲸鱼顶栏、实时工作状态行、思考流式展开。
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 2274
右下角常驻的小鲸鱼余额挂件:显示余额、今日已用、每轮对话消耗与随机台词,带音效与设置菜单。
Devin-AXIS/deepseek-design#deepseek-idesign★ 1072
可视化设计工作室,支持网站、App 原型、海报、信息卡、报告和杂志的模板创建、元素编辑、选区级 AI 草稿衔接与导出。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。