Skip to content

feat(kanban): surface task outcomes and blocked context (salvage of #29247) - #29274

Closed
teknium1 wants to merge 1 commit into
mainfrom
hermes/hermes-a5904da7
Closed

feat(kanban): surface task outcomes and blocked context (salvage of #29247)#29274
teknium1 wants to merge 1 commit into
mainfrom
hermes/hermes-a5904da7

Conversation

@teknium1

Copy link
Copy Markdown
Contributor

Salvage of @SatoDri's PR #29247 onto current main.

Summary

Kanban dashboard now shows task outcome surfaces (summary tree, run metadata, blocked context, artifact availability) so reviewers see the useful state without drilling into raw artifacts.

Why salvage

PR #29247's branch was 567 commits behind main. The branch ancestor predated #28958 (strip tool_name for strict providers like Moonshot/Kimi), so its diff also reverted #28958's fix + test + AUTHOR_MAP entry. Cherry-picking only @SatoDri's substantive kanban commit (e3b73162e) onto current origin/main keeps the kanban work and leaves #28958 intact.

Changes

  • plugins/kanban/dashboard/plugin_api.py (+745): summary-tree endpoint, blocked-task context, artifact-availability metadata.
  • plugins/kanban/dashboard/dist/index.js (+292), dist/style.css (+223): dashboard UI for the new payloads.
  • tests/plugins/test_kanban_dashboard_plugin.py (+255): coverage for summary-tree/blocked/artifact paths.

Validation

  • pytest tests/plugins/test_kanban_dashboard_plugin.py — 102 passed
  • pytest tests/hermes_cli/test_kanban*.py tests/tools/test_kanban_tools.py — 621 passed
  • node --check plugins/kanban/dashboard/dist/index.js — OK

Original author @SatoDri preserved in commit metadata. Closes #29247.

@github-actions

Copy link
Copy Markdown
Contributor

🔎 Lint report: hermes/hermes-a5904da7 vs origin/main

ruff

Total: 0 on HEAD, 0 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 0 pre-existing issues carried over.

ty (type checker)

Total: 8974 on HEAD, 8974 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 4731 pre-existing issues carried over.

Diagnostics are surfaced as warnings — this check never fails the build.


def _path_is_within(path: str, base: str) -> bool:
try:
Path(path).resolve().relative_to(Path(base).resolve())
if resolved_path:
try:
p = Path(resolved_path)
exists = p.exists()
try:
p = Path(resolved_path)
exists = p.exists()
is_dir = p.is_dir() if exists else None
allowed_path = path_lookup.get(requested) or path_lookup.get(requested_resolved)
if not allowed_path:
return {"ok": False, "reason": "path is not a derived artifact for this task", "path": requested}
return _open_local_path(allowed_path, mode=body.mode)
@alt-glitch alt-glitch added type/feature New feature or request comp/plugins Plugin system and bundled plugins P3 Low — cosmetic, nice to have labels May 20, 2026
@alt-glitch

Copy link
Copy Markdown
Collaborator

Salvage of #29247 onto current main. Supersedes #29247 and #29241.

@SatoDri

SatoDri commented May 20, 2026

Copy link
Copy Markdown

Fixing CodeQL path potential risk & will push an update shortly

@SatoDri

SatoDri commented May 20, 2026

Copy link
Copy Markdown

@teknium1 done ad7111d

@teknium1

Copy link
Copy Markdown
Contributor Author

Closing this salvage. On closer review the scope is larger than the PR body framed: alongside the summary-tree read endpoint, #29247 also adds a POST /tasks/{id}/artifacts/open write endpoint that shells out (open/xdg-open/explorer) plus a regex-based path scraper over free-form comment text. Even with the backend-derived-path allow-list, that's a meaningfully different design discussion from "show task outcomes," and the IIFE-only dashboard frontend (no source) makes surgical trimming risky. Following up on #29247 directly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/plugins Plugin system and bundled plugins P3 Low — cosmetic, nice to have type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants