Kanban:补齐任务操作链路,明确能力边界 (#615)

* [verified] fix(kanban): harden WUI parity bridge

- Align board slug normalization with canonical underscore/lowercase/64-char rules
- Validate malformed Kanban action bodies before CLI shell-out
- Narrow task log no-log handling and expose phase-1 capabilities
- Extend client/server regression coverage for parity actions

* fix(kanban): guard archived task detail actions

---------

Co-authored-by: ekko <152005280+EKKOLearnAI@users.noreply.github.com>
This commit is contained in:
Zhicheng Han
2026-05-11 15:26:24 +02:00
committed by GitHub
parent 3a1893d401
commit 6ff1c18ee2
12 changed files with 1079 additions and 91 deletions
+14
View File
@@ -16,6 +16,13 @@ const handlers = {
unblock: vi.fn(async (ctx: any) => { ctx.body = { ok: true } }),
block: vi.fn(async (ctx: any) => { ctx.body = { ok: true } }),
assign: vi.fn(async (ctx: any) => { ctx.body = { ok: true } }),
addComment: vi.fn(async (ctx: any) => { ctx.body = { ok: true } }),
taskLog: vi.fn(async (ctx: any) => { ctx.body = { log: '' } }),
diagnostics: vi.fn(async (ctx: any) => { ctx.body = { diagnostics: [] } }),
reclaim: vi.fn(async (ctx: any) => { ctx.body = { ok: true } }),
reassign: vi.fn(async (ctx: any) => { ctx.body = { ok: true } }),
specify: vi.fn(async (ctx: any) => { ctx.body = { results: [] } }),
dispatch: vi.fn(async (ctx: any) => { ctx.body = { result: {} } }),
}
vi.mock('../../packages/server/src/controllers/hermes/kanban', () => handlers)
@@ -36,6 +43,8 @@ describe('kanban routes', () => {
'/api/hermes/kanban/capabilities',
'/api/hermes/kanban/stats',
'/api/hermes/kanban/assignees',
'/api/hermes/kanban/diagnostics',
'/api/hermes/kanban/dispatch',
'/api/hermes/kanban/artifact',
'/api/hermes/kanban/search-sessions',
'/api/hermes/kanban',
@@ -44,6 +53,11 @@ describe('kanban routes', () => {
'/api/hermes/kanban/unblock',
'/api/hermes/kanban/:id/block',
'/api/hermes/kanban/:id/assign',
'/api/hermes/kanban/:id/comments',
'/api/hermes/kanban/:id/log',
'/api/hermes/kanban/:id/reclaim',
'/api/hermes/kanban/:id/reassign',
'/api/hermes/kanban/:id/specify',
]))
})