neonelemental/claude-code-board-mods/tree/main/board
board
一个显示 GitHub 项目看板(Projects v2)的面板,可按 Status 列显示全部或指定看板,通过 gh 使用 REST 读取
关于这个 mod
Claude Code 的 fleet 和 board 面板
两个 Claude Code 外挂,各自在对话旁边显示一个面板,由 GitHub Projects(v2)看板驱动。
fleet
本工作阶段的代理,按看板上的史诗任务和工单分组。
- 史诗任务是带有子工单的 issue。它会显示完成情况(所有子工单中已关闭的部分,排除未计划和重复项)、已有代理的工单,以及还没有代理处理的开放工单。
- 工单会显示其看板列和代理:先列负责人,再把子代理折叠在负责人下方。已完成的工单默认折叠,并显示代理数量。
- 直接点名史诗任务本身的代理会并排列在史诗任务下,不会互相指定负责人。
- 工作阶段不再列出的代理会标记为
stopped。 - 不属于任何史诗任务的工单会列在“Not in an epic”下,未点名任何工单的代理会列在“on no ticket”下。
/fleet 打开面板。
board
按 Status 列显示一个或多个看板:每张卡片的 id 和标题,史诗任务排在前面;在 In progress 和 In review 列中,还会显示卡片移动到该列的时间。看板达到两个或更多时,每个看板都有一个按钮(快捷键 1..9),另有一个 All 按钮(快捷键 a)选择显示内容;在 All 视图中,同一张卡片出现在多个看板时只绘制一次。选择会在工作阶段之间保留。
/board 打开面板,/board <number> 打开指定看板,/board all 打开所有看板。
需求
- 需要启用函数钩子外挂的 Claude Code。这些外挂针对 2.1.286 构建和测试。如果面板没有显示,运行
claude --debug,它会说明哪个外挂未加载以及原因;函数钩子关闭时,在 Claude Code 环境中设置CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1可将其启用。 - GitHub CLI
gh,并已登录read:project权限范围:gh auth refresh -s read:project。面板通过gh使用 REST 读取 GitHub,从不使用 GraphQL。 - GitHub Projects(v2)看板,可以由一个用户或组织拥有。对 fleet 来说,子工单会让一个工单成为史诗任务。
安装
git clone https://github.com/neonelemental/claude-code-board-mods.git
claude --plugin-dir /path/to/claude-code-board-mods/fleet --plugin-dir /path/to/claude-code-board-mods/board
桌面应用不接受标志;改为在 ~/.claude/settings.json 的 env 区块中填写文件夹,并用平台的路径分隔符分开(macOS 和 Linux 上是 :):
{
"env": {
"CLAUDE_CODE_PLUGIN_DIRS": "/path/to/claude-code-board-mods/fleet:/path/to/claude-code-board-mods/board"
}
}
设置
每项设置都是 /config 中的一行,或者放在 ~/.claude/settings.json 的 pluginConfigs 下,以外挂名称为键:
{
"pluginConfigs": {
"fleet": { "options": { "owner": "acme", "boards": "3,4", "leadPattern": "^run\\b" } },
"board": { "options": { "owner": "acme", "boards": "3,4" } }
}
}
两个外挂都支持:
| 设置 | 默认值 | 说明 |
| --- | --- | --- |
| owner | none | 拥有看板的 GitHub 用户或组织。在设置 owner 和 boards 之前,面板会说明如何设置。 |
| boards | none | 以逗号分隔的项目编号:3,4。编号就是看板 URL 中的编号。 |
| statusField | Status | 单选字段;它的选项就是按看板顺序排列的列。 |
| ticketPattern | [A-Z][A-Z0-9]*-\d+ | 用于匹配 issue 标题开头工单 id 的正则表达式:ABC-12 Fix login 会得到 ABC-12。没有 id 的 issue 会命名为 #<number>。无法编译的模式会退回默认值,面板也会说明这一点。 |
仅 fleet:
| 设置 | 默认值 | 说明 |
| --- | --- | --- |
| leadPattern | empty | 不区分大小写地匹配代理描述的正则表达式:如果代理处理的工单符合它,该代理就是工单负责人。为空时,第一个点名该工单的代理负责。 |
| tagsFile | .claude/fleet-tags.json | 手工映射文件,相对于工作阶段所在目录。 |
仅 board:
| 设置 | 默认值 | 说明 |
| --- | --- | --- |
| folded | Backlog,Done | 启动时默认折叠的列,以逗号分隔。 |
| doneColumn | Done | 按最近关闭优先排列的列,显示其中最新的 25 张卡片。 |
列名比较时会忽略大小写和空格。In progress、In review、Ready、Todo、Backlog 和 Done 各自有专属标记和颜色,其他列使用普通圆点。
代理如何加入工单
如果代理的描述中点名了某个工单,它就属于该工单,可以使用标题 id(ABC-12)或 issue 编号(#12;该编号也能找到带标题 id 的 issue)。如果没有这样做,则取其提示前 400 个字符中的第一个标题 id。由另一个代理启动的代理属于父代理的工单。没有出现在看板上的 id 会保留为自己的工单,并标记为“Not on a board”。
标签文件可以手动确定代理归属,并优先于其他规则。它只会读取,不会写入:
{ "<agent id>": "ABC-12" }
fleet 会在外挂自己的存储中记住它见过的代理,每个工作阶段目录一条记录,因此在史诗任务关闭前,代理会一直归在该史诗任务下。史诗任务之外已完成的工作会继续列出 12 小时。不会向你的项目写入任何内容。
测试
从克隆的目录运行:
claude plugin validate fleet
claude plugin validate board
claude plugin test fleet
claude plugin test board
测试会通过 gh 让外挂对引擎运行,并由工作阶段的代理凭记忆回答;测试不会访问网络。
安装
请先查看作者 README 确认 marketplace 和插件名称;命令可能随仓库结构改变。
claude plugin marketplace add neonelemental/claude-code-board-mods claude plugin install board
原文 / README
Fleet and board panes for Claude Code
Two Claude Code plugins, each a pane beside the conversation, driven by GitHub Projects (v2) boards.
fleet
This session's agents, grouped by the epics and tickets on your boards.
- An epic is an issue with sub-issues. It shows its completion (closed sub-issues of all, not-planned and duplicates left out), its tickets that have agents, and its open tickets no agent has touched yet.
- A ticket shows its board column and its agents: the lead, then its sub-agents folded under it. A finished ticket starts folded, with its agent count.
- Agents that name the epic itself are listed under it side by side, none leading the others.
- An agent the session no longer lists is marked
stopped. - Tickets in no epic are listed under "Not in an epic", agents that name no ticket under "on no ticket".
/fleet opens the pane.
board
One or more boards, by Status column: each card's id and title, epics first with their sub-issue count, and in the In progress and In review columns how long ago the card moved. With two or more boards, a button per board (hotkeys 1..9) and All (hotkey a) pick what is shown; on All, a card on several boards is drawn once. The pick is kept between sessions.
/board opens the pane, /board <number> opens it on one board, /board all on every board.
Requirements
- Claude Code with function-hook plugins. These were built and tested against 2.1.286. If a pane does not show, run
claude --debug, which names a plugin that did not load and why; where function hooks are switched off,CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1in Claude Code's environment turns them on. - The GitHub CLI,
gh, signed in with theread:projectscope:gh auth refresh -s read:project. The panes read GitHub over REST throughghand never use GraphQL. - GitHub Projects (v2) boards owned by one user or organization. For fleet, sub-issues make a ticket an epic.
Install
git clone https://github.com/neonelemental/claude-code-board-mods.git
claude --plugin-dir /path/to/claude-code-board-mods/fleet --plugin-dir /path/to/claude-code-board-mods/board
The desktop app takes no flags; name the folders in the env block of ~/.claude/settings.json instead, separated by the platform's path separator (: on macOS and Linux):
{
"env": {
"CLAUDE_CODE_PLUGIN_DIRS": "/path/to/claude-code-board-mods/fleet:/path/to/claude-code-board-mods/board"
}
}
Settings
Each setting is a row in /config, or goes under pluginConfigs in ~/.claude/settings.json, keyed by the plugin's name:
{
"pluginConfigs": {
"fleet": { "options": { "owner": "acme", "boards": "3,4", "leadPattern": "^run\\b" } },
"board": { "options": { "owner": "acme", "boards": "3,4" } }
}
}
Both plugins:
| Setting | Default | What it is |
| --- | --- | --- |
| owner | none | The GitHub user or organization that owns the boards. Until it and boards are set, the pane says how to set them. |
| boards | none | Project numbers, comma-separated: 3,4. The number is the one in the board's URL. |
| statusField | Status | The single-select field whose options are the columns, in the board's order. |
| ticketPattern | [A-Z][A-Z0-9]*-\d+ | A regular expression for a ticket id at the start of an issue title: ABC-12 Fix login is ABC-12. An issue without one is named #<number>. A pattern that does not compile falls back to the default, and the pane says so. |
fleet only:
| Setting | Default | What it is |
| --- | --- | --- |
| leadPattern | empty | A regular expression matched against agent descriptions, ignoring case: an agent on a ticket that matches it leads the ticket. Empty: the first agent to name the ticket leads it. |
| tagsFile | .claude/fleet-tags.json | The hand-mapping file, relative to the session's directory. |
board only:
| Setting | Default | What it is |
| --- | --- | --- |
| folded | Backlog,Done | Columns that start folded, comma-separated. |
| doneColumn | Done | The column listed newest-closed first, its latest 25 cards. |
Column names are compared ignoring case and spaces. In progress, In review, Ready, Todo, Backlog and Done get their own marks and colours; any other column gets a plain dot.
How agents join tickets
An agent belongs to a ticket when its description names it, by title id (ABC-12) or issue number (#12; the number also finds an issue that has a title id). Failing that, the first title id in the first 400 characters of its prompt counts. An agent started by another agent belongs to its parent's ticket. An id on no board stays a ticket of its own, marked "Not on a board".
The tags file settles an agent by hand and wins over the rest. It is read, never written:
{ "<agent id>": "ABC-12" }
fleet remembers the agents it has seen in the plugin's own store, one record per session directory, so an agent stays under its epic until the epic is closed. Finished work outside an epic stays listed for 12 hours. Nothing is written into your project.
Tests
From the clone:
claude plugin validate fleet
claude plugin validate board
claude plugin test fleet
claude plugin test board
The tests run the plugins against the engine with gh and the session's agents answered from memory; they reach no network.