97 Commits

Author SHA1 Message Date
chahinebrini
f0c7be25f4 feat(agenthub): TSK-0118 — Ask primitive for autonomous decision-routing
- New Ask entity (ASK-####): schema + counter + paths(EntityType 'asks') +
  events(AgentHubEventType 'ask') + fsWatch(WATCHED + toEvent). Generic entities
  table, no migration.
- askService: createAsk routes to config.roles.architect.preferredAgent, NEVER
  the CEO (a to='ceo' is rerouted); answerAsk / escalateAsk (escalatedTo='ceo',
  single channel) / getAsk / listAsks. Authority-policy JSDoc.
- Asks kept OUT of FTS5: Index.upsert gains a { fts?: boolean } option; askService
  upserts with fts:false, so 'memory search' never returns asks.
- routes: POST/GET /asks, GET /asks/:id, POST /asks/:id/{answer,escalate}, each
  emitChange type:'ask'.
- CLI 'ask <q> --from [--task][--wait][--timeout]' (SSE reconnect wait until
  status!=pending) + ask list/answer/escalate; remoteClient ask methods.
- MCP agenthub_ask (wait via waitForTask, now woken by 'ask' events) +
  agenthub_ask_list/answer/escalate; agenthub_work architect branch surfaces
  pending asks ({reviews,asks,messages}).
- Unattended mode (invocation flag): work.ts ctx + CLI 'work --unattended' +
  agenthub_work schema + LOOP reminder ('call agenthub_ask instead of pausing').
- tests: +askService.test.ts (routing/answer/escalate/list/FTS-exclusion),
  +ask-wait.test.ts (routes roundtrip + SSE wait: answer resolves, no-answer
  times out cleanly)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 01:19:42 +02:00
chahinebrini
941c20d12a fix(agenthub): TSK-0119 — implementer stays reachable after a review submit (dormancy fix)
- work.ts: the CLI work loop now wakes on architect follow-up MESSAGES, not just
  tasks. drainAgentMessages() surfaces + marks-read the agent's inbox; wired into
  waitAndClaim (SSE message events) and as an upfront check in workAgent. reopen +
  next-assign already wake via task events; a plain message no longer leaves the
  re-armed loop dormant.
- mcp/server.ts: implementer agenthub_work LOOP reminder now explicitly instructs
  re-arming after agenthub_task_review so the architect's approval/reopen/message
  wakes it (waitForTask already wakes on task+message).
- tests: work.test.ts +message-wake +reopen-wake

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 01:08:59 +02:00
chahinebrini
2c2193ec55 feat(agenthub): TSK-0074 — automatic agent progress logging to a task live console
- routes PATCH /tasks/🆔 uniformly appendTaskLog + publishLog for every status
  transition (claim/review/done/cancel/reopen) and on assign; best-effort, never
  fails the mutation. No double-emission (log rides the 'log' channel; fsWatch
  only watches .md so the .log append is not re-emitted).
- MCP agenthub_task_log tool + remoteClient.appendTaskLog + CLI 'task log <id>
  --text [--agent][--level]'
- agenthub_work LOOP reminder: 'Report meaningful progress with agenthub_task_log'
- taskDetail: Live Console panel — historic lines via readTaskLog + live tail via
  the named task-log SSE event filtered to this task id
- tests: +taskLog-live.test.ts (PATCH->one log event, no double change, historic
  render, POST /log, remoteClient)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 01:02:04 +02:00
chahinebrini
3f1fb76a84 feat(agenthub): TSK-0120 — split messaging from /activity into a /messages conversation view
- MessageSchema: status enum unread|delivered|read|acked + replyTo (additive, RW-compatible)
- messageService: listInbox transitions unread->delivered on fetch (agent-scoped);
  markMessageDelivered (idempotent, never downgrades); ackMessage(cwd,id,by?)
- routes: GET /messages HTML branch -> renderMessagesHtml; GET /messages/:id;
  POST /messages/:id/ack (mirror of /read, emits message/updated status=acked)
- server/messages.ts: 2-column conversation view (list grouped by pair + unread badge,
  thread bubbles aligned by ?as=, replyTo indentation, TSK pill, live via /events)
- activity.ts: drop message rows (tasks-only hard separation)
- ui-shared: HeaderPage +messages + nav link
- CLI: message ack <id> [--by], message reply <parentId> --from --text [--task];
  remoteClient ackMessage + getMessage
- tests: +message-receipts.test.ts, server.test.ts activity/messages/receipt-chain

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 00:56:16 +02:00
chahinebrini
7922eeb8e8 chore(agenthub): snapshot pre-existing orphaned WIP (single-instance/mDNS + claimedBy + message-read) as batch baseline 2026-07-12 00:46:47 +02:00
chahinebrini
2fb9db15b1 feat(board): v3 kanban + animated Lottie KPI icons
Board-v3 (TSK-0099, codex, architect-reviewed 7/7):
- kanban columns fill viewport height, scroll inside the column (no page scroll)
- padding/margin between task cards
- bar-chart HTML-escape bug fixed (est marker inserted raw, not esc())
- half-donut center text centered
- task detail opens in a modal (title/description/activity, empty sections hidden)
  instead of navigating to /tasks
- header-jitter on page switch fixed via scrollbar-gutter: stable
- SSE connection-leak/freeze fixed (EventSource closed on pagehide/beforeunload)

Animated KPI icons (architect):
- vendored lottie-web player + Lottie card icons under assets/, served via a
  path-traversal-guarded /card-assets/* route (offline-safe, no CDN)
- state-driven: loop-while-active (open/in_progress/review), pulse-on-change
  (active/done/agents); light KPI card bg so the black-line icons read clearly

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QMN96FH9rJDY2bZnEBdPfA
2026-07-09 00:09:55 +02:00
chahinebrini
1749f1c58c feat(board): v2 — drop handoffs/decisions panels, tabbed+throttled company donut, real-vs-estimated agent bars with FLIP reorder, session/total reset, fixed-height scrollable columns
codex TSK-0097 board redesign v2.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 21:11:38 +02:00
chahinebrini
0884032db1 feat(board): session batch — delete + unified fixed header + in-card live console + reviewer field + 3/4 kanban token-insights redesign
Delete endpoint + trash UI, shared header across all pages, task-log SSE + in-card console, reviewer separate from assignee (board+team), codex board redesign (3/4 kanban + company half-donuts + per-agent bars + square cards).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 20:43:42 +02:00
chahinebrini
1bb18d96b5 fix(team): clean single traveling pulse + delegations start at the architect
- The pulse is now one dash with an effectively infinite gap, animated
  origin→target→off with fill:forwards — no wrap-around second bar and no
  snap-back to origin when it arrives (fixes the ghost bar). Slower, ease-in-out
  so it eases out of the origin card and into the target's last branch.
- Real delegation/review pulses now originate at the ARCHITECT (the root's
  single child), not the CEO above it — so a task assigned to an agent no longer
  visibly starts from the CEO. Cuts a 3-edge cascade to 2 for a PO-level agent.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 06:24:21 +02:00
chahinebrini
c2939966b5 feat(org): agenthub org sync — CLAUDE.md is the team-structure source
Add an org service + CLI: parse a fenced ```agenthub-org YAML block from
CLAUDE.md (or AGENTS.md), validate it (one root, resolvable parents, unique
ids) and write it to .agenthub/agenthub.config.json. So the human-readable doc
drives /team: edit the block, run `agenthub org sync`, the chart adapts. Can be
wired into a post-commit hook to sync automatically when CLAUDE.md changes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 06:12:25 +02:00
chahinebrini
0f11714873 feat(team): architect is the hub — flow ends with a final report to the CEO
Reflects the org move (CI/CD + Strategist now report to the architect, not the
CEO): architect coordinates them directly, and the demo flow adds a closing
'architect → CEO final report' step. The CEO is only touched at the very end.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 06:03:37 +02:00
chahinebrini
55efae028a fix(team): kill done-twitch (glow on ::after) + only final node flashes
- Move the arrival/completion glow onto a dedicated ::after overlay animated by
  opacity only, so it no longer collides with the node's box-shadow transition
  — the card stays put on done (transform verified identity throughout).
- A pulse now lights only its FINAL destination; waypoint nodes it merely passes
  through (e.g. the CEO on an architect→strategist peer handoff) are no longer
  flashed as 'involved'.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 05:52:20 +02:00
chahinebrini
b097ad71de fix(team): drop redundant 'active'/'in review' word from the status line
The badge chip already says Active/Review, so the status line now shows just
the task id + relative time (e.g. 'TSK-0059 · 2h') instead of repeating it.
2026-07-08 05:45:57 +02:00
chahinebrini
38bea3b594 feat(team): active border sweep, white chip, slower flow, gentle done
- Active card: a green highlight sweeps along the border left→right while the
  task runs (masked gradient ::before), signalling live work.
- Status chip: white background (green/amber text), Paperclip-style.
- Slower, more readable animation (edge 1500ms, stagger 680ms, longer flow gaps).
- Arrival and task-completion are now soft glow fades with NO transform, so the
  card no longer twitches on done; a dedicated doneFade plays when a task the
  agent held goes done/cancelled.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 05:43:31 +02:00
chahinebrini
92a5b63954 feat(team): floating status chip + clean node header (Paperclip-style)
- 'Active'/'Review' badge is now a floating pill straddling the card's top-right
  edge (light green / amber) instead of an inline tag — keeps the card uncluttered.
- Move info + rename buttons out of the text row into an absolute top-right
  cluster so short names (Chahine, backyard, CI/CD) fit without truncating;
  smaller name font (12px); slightly wider node (182px) + matching grid.
- Rename is discoverable: a pencil appears on node hover (still double-click too).
Role labels for org-only / function nodes come from config.org 'role' (CEO,
Product Owner, CI/CD, Strategist, Release) so they no longer show 'Implementer'.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 05:37:32 +02:00
chahinebrini
2140a293ed feat(team): flow-demo playback + org-node role label (CEO/PO)
- OrgNode gains an optional 'role' field so org-only nodes (CEO, Product
  Owners) show a role under their name; agents still fall back to their roster
  role. Fixes the missing CEO label on the root.
- New 'Flow' button plays a choreographed delegation lifecycle as directional
  pulses with step captions: claude defines → PO Native → agent → back to PO →
  review at architect → CI/CD → ahmed test → back to architect (approve/push),
  plus architect→strategist for some tasks. pulseBetween() walks any two nodes
  via their lowest common ancestor, colouring each edge by its real direction
  (down=green delegation, up=amber return), so the animation always shows the
  direction.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 05:28:32 +02:00
chahinebrini
0d79e8fbd6 feat(team): wrap wide leaf rows into a grid + fit-to-screen button
Compact the tree so upper levels stay close together:
- a parent with >4 leaf children now lays them out in a square-ish grid
  (cols = ceil(sqrt(n))) instead of one wide row; connectors drop from a fixed
  bus Y so the elbows stay clean across grid rows;
- a 'Fit' toolbar button scales the whole chart to the viewport width via CSS
  zoom (reflows, so scroll shrinks) and toggles back to 100%.
Cuts the rebreak org width ~2400px→~1830px, and Fit shows the entire tree at once.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 05:16:39 +02:00
chahinebrini
722c8598e9 feat(team): sharp org-chart elbow connectors + fit text in cards
Match the Paperclip look: connectors are now right-angle elbows (parent → shared
horizontal bus → drop to each child) instead of bezier curves; siblings share a
bus Y so it reads as a clean org chart. The traveling pulse follows the elbow
path. Role/model line truncates with ellipsis inside the card (no more text
spilling past the edge); nodes clip overflow. Slightly more compact nodes/gaps.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 05:10:49 +02:00
chahinebrini
ab35389f9c feat(team): multi-level org chart from config.org + info + inline rename
Replace the flat 2-tier team view with an arbitrary-depth org chart driven by
a new config.org hierarchy (OrgNodeSchema: id/label/title/agent/parentId).
Nodes render recursively (nested subtrees); SVG connectors are measured
parent→child; the event-driven pulse now travels the full path root→agent
(down = delegation/green, up = review/amber), lighting each node it passes.
Org-only nodes (a human CEO, product owners) sit in the tree without a linked
agent. Each node has an info button (its job description) and an inline-
editable name persisted via PATCH /org/:id. Live active/reviewing state is
rendered server-side and kept fresh over SSE. Compact layout + auto-centered
horizontal scroll. Falls back to a synthesised architect→workers tree when no
org is configured (keeps existing behaviour + tests).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 04:59:09 +02:00
chahinebrini
ef957bc2f6 feat(team): event-driven delegation pulse (meaningful, not decorative)
The green pulse now visualises real task flow instead of looping randomly:
- delegation (task → in_progress/reassigned) fires a green pulse architect→agent
  and the agent card turns 'active' (green ring + badge);
- review submission (→ review) fires an amber pulse agent→architect and the
  card enters the 'reviewing' state.
Pulses are one-shot, created per transition (SSE-driven, deduped against a
baseline snapshot) and removed on arrival, which lights the destination node.
At rest only the connectors breathe faintly. Active state recoloured green to
match the pulse. Verified: delegation→down+active, review→up+reviewing.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 04:19:36 +02:00
chahinebrini
49bc39d42d feat(team): Paperclip-style org chart with traveling-pulse connectors
Rebuild /team as a real org chart: architect at the root, workers below,
with an SVG connector layer whose edges carry a traveling green pulse
(getTotalLength + WAAPI stroke-dash motion) that flows from the architect
down each edge and lights up the node it reaches (onArrive → .arrive glow),
looping. Live busy state (SSE) keeps working agents lit blue; edges + nodes
re-layout on resize. Node cards restyled (icon box + name + role·model +
status). Kept data-agent / agent-card / claimed markers for the live sync.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 03:58:02 +02:00
chahinebrini
8dbbd0d10c fix(server): no-store Cache-Control on hub HTML pages
Browsers were caching /board and /team, so a stale page kept showing old
markup and didn't reflect live task/agent state (looked like the pre-redesign
team page + tasks appearing unclaimed though the server had them claimed).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 03:37:25 +02:00
chahinebrini
7ca6c859f2 feat(board+team): interactive board, animated team tree, token budget, mDNS, realtime architect review + codex/kimi autostart
Board (/board):
- Drag an AGENT chip onto a task card to (re)assign it (realtime-notified).
- Drag a task card to a column to change status; open→in_progress auto-assigns
  from the title's "<agent>:" prefix — no manual agent picking.
- "+ New task" composer (agent dropdown removed; agent comes from the title).
- Live Cost & Budget panel.

Team (/team): live SSE sync of busy state + always-on ambient animation
(connector shimmer, idle glow) that brightens to a busy pulse when an agent
works. Org-chart hierarchy stays.

Token accounting: new budgetService/rosterService + GET /budget and /agents.
Real doneTokens + time-on-task estimate capped at 45 min/task (avoids the
wall-clock overcount that produced multi-million-token totals), blended
per-model EUR cost + optional budget bars. All estimates flagged "~".

Autostart: `agent setup` writes deterministic SessionStart hooks for Codex
(~/.codex/config.toml) and Kimi (~/.kimi-code/config.toml), not just Claude
Code. Verified: both auto-enter the agenthub_work loop.

Realtime architect review: agenthub_work is role-aware — architect/reviewer
blocks on SSE and wakes when a task hits review (no manual watcher re-arm).

mDNS: server advertises agenthub.local (bonjour-service) so the hub is
reachable in a browser on the LAN without an IP.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 03:23:48 +02:00
chahinebrini
1e29a7b9b9 feat(watch): --new-only for --await-review — re-armable architect review-notifier without backlog spin
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 01:53:11 +02:00
chahinebrini
caf60ea939 fix(memory): FTS5-safe search-term quoting — "TSK-0037"-style queries no longer crash (TSK-0043)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 01:52:57 +02:00
chahinebrini
8b17baae96 fix(sse): /events keepalive heartbeat — keeps idle agenthub_work alive across short MCP client timeouts (TSK-0042)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 01:52:46 +02:00
chahinebrini
10f3184ea2 feat(board): task-detail transparency — activity log + decisions & reasoning + token/duration badges; cards stay slim (TSK-0041)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 01:52:32 +02:00
chahinebrini
caa009b66a feat(board): lean board + /activity page (TSK-0032 rework, realtime folded in)
codex reworked the board per the user's "keep it simple": /board now shows only
the compact KPI cards + the kanban (half-donut removed), with realtime SSE folded
in (TSK-0030). Recent Activity + Done Archive moved to a new /activity page; nav is
Board · Team · Activity · Decisions. team.ts / ui-shared.ts touched for nav + a
tier data-role hook. Tests green (133). The /team + /activity 500s seen on review
were a local better-sqlite3 ABI mismatch (native module rebuilt for Node 24), not a
code bug — all pages 200 after rebuild.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 05:43:25 +02:00
chahinebrini
996f988f11 feat(autostart): self-perpetuating work loop — stay reachable
The recurring "agent doesn't read messages in realtime / isn't triggered for the
next task" problem: agents weren't STAYING in the agenthub_work loop, so they went
dormant after each task. Two reinforcements:

- agenthub_work now ends every response with a LOOP directive: "the instant you
  finish, call agenthub_work again (in the background) so the next task/message
  reaches you in realtime — never end your turn without relaunching it."
- The auto-start hook-context now stresses the BACKGROUND loop + relaunch pattern,
  so a Claude Code session is woken on each event instead of blocking.

Layer 1 (auto-start) gets agents INTO the loop; this keeps them IN it. Honest
limit: turn-based agents still rely on obeying the relaunch nudge — there's no
100% always-on without a supervisor. Bump 0.9.0 -> 0.9.1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 05:23:05 +02:00
chahinebrini
844db1fd2b feat(board): dashboard — KPI cards + half-donut + activity + /decisions + /archive (TSK-0032)
codex built the dashboard redesign (TSK-0032): KPI metric cards, half-donut status
distribution, recent-activity feed, /decisions page, /archive page, task-detail
handoffs. Architect follow-up: the KPI cards were oversized (stretched to the side
panel height) — reworked to a compact full-width top row (auto-fit, fixed ~84px
height, label over value, small status-colored icon) per the user's reference.

Committed together to lock TSK-0032 in before TSK-0030 (realtime) touches the same files.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 05:05:02 +02:00
chahinebrini
d00f2812f9 feat(autostart): agenthub agent setup — SessionStart hook enters the work loop
Closes the dormancy gap: an agent no longer needs to be told "call agenthub_work".
`agenthub agent setup --agent <name> --role <role>` writes a verified Claude Code
SessionStart hook (.claude/settings.json) whose command runs `agenthub hook-context`,
which prints the work-loop instruction injected into every new session — so the
agent claims tasks AND surfaces messages from the first turn, no manual trigger.

- agentSetup.ts: agentSetup() (idempotent hook write, project or --user scope) +
  hookContext() (the injected instruction).
- Honest limit (per Claude Code docs): SessionStart context is a strong nudge the
  model reads, not a hard directive; the guide reinforces it. Can't block startup.
- Codex/Kimi aren't Claude Code — their guide already nudges agenthub_work first.

Run once per agent machine. Bump 0.8.1 -> 0.9.0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 04:57:30 +02:00
chahinebrini
ed6c5b01d0 feat(messaging): read receipts + ack convention
Closes the fire-and-forget gap the user hit: the sender now sees when a message
is read. When markMessageRead fires, the read event carries the reader, and the
watch stream renders it as a receipt:

  AgentHub: ✓ Read         MSG-0002  read by windows-claude

Plus an ack convention in the implementer guide: when you act on a message-
request, send a brief "on it …" + a result message — so the sender sees progress,
not silence. (Board-side activity feed with messages is folded into TSK-0032.)

Bump 0.8.0 -> 0.8.1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 04:04:04 +02:00
chahinebrini
07afa717ac feat(messaging): agent messaging — agenthub_message / agenthub_inbox (cross-agent via MCP)
Direct messages between agents through the hub — architect↔agent and agent↔agent
questions, clarifications and pings that handoffs/memories don't cover. Built as
MCP tools so kimi + codex get it too (not Claude-only), plus REST + CLI.

- Message entity (MSG-NNNN): schema, counter, messages/ dir, messageService
  (createMessage / listInbox / listMessages / markMessageRead).
- REST: POST /messages, GET /messages[?agent&unread], POST /messages/:id/read,
  with SSE emit. fsWatch + statusRefresh wired ('message' events; status skips them).
- MCP: agenthub_message {from,to,text,taskId?} + agenthub_inbox {agent,unreadOnly?}.
  agenthub_work now surfaces + drains unread messages and wakes on message events,
  so an agent sees messages inside its work loop. (18 tools total.)
- CLI: `agenthub message <to> <text> --from <agent>` + `agenthub inbox --agent`.
  watch stream shows "Message" events (architect-visible).
- Architect-visible by design: the hub stays the coordination point.

Bump 0.7.5 -> 0.8.0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 03:20:38 +02:00
chahinebrini
4672677bf5 feat(team): roster-driven team page — provider grouping + brand logos (TSK-0028)
Architect implementation of the reopened TSK-0028 (option B). The team page now
reads config.agents (the roster) as the source of truth instead of inferring
role/identity from tasks:
- one fixed role per agent (fixes "codex in architect+implementer+tester")
- implementers grouped by provider with official Simple Icons brand logos
  (Anthropic / OpenAI / Moonshot) + the model behind each agent (Opus 4.8,
  Sonnet 4.6, GPT-5 Codex, Kimi K2)
- demo/throwaway agents gone (not in the roster)
- architect tier (claude) on top, implementer provider columns, tester tier
  (ahmed); free/busy + live timer from in-progress tasks
- ui-shared: providerLogo()/providerMeta() with verified brand SVG paths

Bump 0.7.4 -> 0.7.5.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 02:24:00 +02:00
chahinebrini
b004e9fbb4 feat(mcp): agenthub mcp install writes .mcp.json (auto-register)
One command, no hand-editing: `agenthub mcp install` writes/merges a project
.mcp.json (the standard config Claude Code and other .mcp.json-aware clients
auto-discover) with the hub URL filled in — so those agents register
automatically. Prints the global-config snippet for Codex/Kimi as fallback.
`--print` is a dry run. Bump 0.7.3 -> 0.7.4.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 01:56:24 +02:00
chahinebrini
eec2050a32 feat(mcp): agenthub mcp install — print per-CLI registration config
Removes the registration friction: `agenthub mcp install` prints ready-to-paste
MCP config for Claude Code, Codex and Kimi, with the hub URL filled in from the
project config. `agenthub mcp` (no action) still starts the stdio server, so the
MCP-client spawn command is unchanged. Bump 0.7.2 -> 0.7.3.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 01:47:14 +02:00
chahinebrini
96fdf0dbd4 Fix board card expansion layout 2026-06-29 01:31:45 +02:00
chahinebrini
c0ac093f46 docs(templates): MCP-first implementer guides (CLI fallback)
Implementer onboarding now points at the MCP tools first (agenthub_work ->
implement -> agenthub_task_review -> loop), with the CLI as the fallback when
the MCP server isn't registered. Reflects the MCP pivot. Bump 0.7.1 -> 0.7.2.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 01:28:27 +02:00
chahinebrini
2d89f808b8 feat(config): named agent roster (config.agents)
Adds an optional `agents` roster to the project config: agent name -> role +
model + provider (kind). The team view can now show named agents (claude,
codex, kimi, windows-claude, backyard, mo, zied, …) with a FIXED role and the
model behind them, instead of inferring role/identity from whichever tasks an
agent happened to touch (which made one agent appear under several roles).

Bump 0.7.0 -> 0.7.1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 01:16:49 +02:00
chahinebrini
15f139429e Polish AgentHub board UI 2026-06-29 00:55:55 +02:00
chahinebrini
5586f2c15b feat(mcp): MCP server — agenthub hub tools over stdio
Solid-collaboration foundation: agents invoke STRUCTURED tools instead of
shelling out to the CLI — so a tool can't be narrated away, hallucinated as
"doesn't exist", or mistyped. Confirmed working for Claude / Codex / Kimi
(all speak MCP).

- src/mcp/server.ts: `agenthub mcp` starts a stdio MCP server exposing 16
  tools (work, task_list/show/create/assign/claim/review/reopen/done,
  memory_add/search, handoff_read/create, decision_create, hello, status).
  Thin layer over the SAME core: proxies through the REST API (remoteClient)
  when a hub is configured — so board, SSE, status auto-refresh and CLI keep
  working unchanged — else local services. agenthub_work blocks on SSE until
  a task addressed to the agent is claimable, then returns it + its handoff.
- `agenthub mcp` command; excluded from the update-notify (stdio purity).
- Verified: initialize + tools/list (16) + tools/call (status, task_list)
  proxy to the live hub.

Does NOT change the dormant-agent reality (agents still loop agenthub_work);
it makes every interaction reliable. Bump 0.6.1 -> 0.7.0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 00:52:13 +02:00
chahinebrini
986639a5f3 TSK-0028: AgentHub UI foundation + /team page
- Add src/server/ui-shared.ts: design tokens, agentAvatar(), statusPill(),
  escapeHtml(), liveTimerJs(), pageHeader(). No emojis, no deps.
- Add src/server/team.ts: role hierarchy renderer (architect -> implementer/
  reviewer/tester) with per-agent free/busy state derived from in-progress tasks.
- Wire GET /team route in src/server/routes.ts.
- Add tests/team.test.ts and tests/ui-shared.test.ts.

Build: npm run build clean. Tests: 132 passed (was 122).
2026-06-29 00:24:39 +02:00
chahinebrini
b5f75c6c65 fix(update): harden auto-update — fire agenthub update directly on tick
The old auto path checked `HEAD..origin/branch` right after kicking off a
background fetch, so it read a stale origin ref and only fired on the SECOND
invocation (and never if the agent sat in one long-running `work`).

Now: when AGENTHUB_AUTO_UPDATE is set, a throttled tick (≤1h) spawns
`agenthub update` directly in the background. update does its OWN fresh fetch
+ reset + build and no-ops when current — so it self-heals on the FIRST
invocation, no stale-ref lag. Notify-only path (no flag) unchanged.

Removed the now-unused cooldown const. 122/122 green. Bump 0.6.0 -> 0.6.1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 00:29:59 +02:00
chahinebrini
78bbebf435 feat(task): agenthub task assign — architect addresses an open task to an agent
Closes the addressing gap that left a waiting `agenthub work` blocked: the
remaining Win tasks were titled "Win L2: …" / unassigned, so they matched
no agent and the daemon waited forever.

`agenthub task assign <id> --agent <name>` sets assignedTo WITHOUT claiming
(status stays open) and fires task/updated — so an agent's blocked `work`
re-checks, matches via assignedTo, and auto-claims it. The architect can now
route a specific open task to a specific agent and have its daemon pick it up.

- taskService.assignTask; PATCH /tasks/:id handles assignedTo-without-status;
  remoteClient.assignTask; CLI `task assign`.
- test: assign keeps status open + sets assignedTo; start/work then claims it
  via the assignedTo match. 122/122 green.

Bump 0.5.0 -> 0.6.0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 00:12:50 +02:00
chahinebrini
ec378131e4 feat(watch): --await-review — architect review-queue notifier
Closes the architect-side gap: the auto-claim daemon wakes implementers on
new tasks, but the architect had no signal when an implementer submitted.

`agenthub watch --await-review` exits (after printing) the moment a task
enters `review` — including any task already in review on connect (initial
check) — so the architect can run it in the background and be re-invoked by
the harness the instant a submission needs a verdict.

- watch.ts: awaitReview option, initial fetchReviewTasks() check + SSE exit
  on task→review.
- index.ts: --await-review flag.
- tests: returns immediately on already-pending review; exits on a review
  transition while watching. 121/121 green.

Bump 0.4.0 -> 0.5.0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 18:53:40 +02:00
chahinebrini
d2b26cc64c feat: agenthub work — auto-claim daemon (TSK-0018)
The missing autonomy step: an implementer no longer needs a human prompt
per task. `agenthub work --agent <name> --role <role>` announces, then:
  - claims an already-open task addressed to the agent immediately, or
  - blocks on the SSE stream until one appears (newly delegated OR
    reopened after review), then claims + prints it.

Loop: work → implement → `task review` → work. New/reopened tasks are
picked up automatically; run it in the background so the wait doesn't tie
up the turn.

- src/cli/commands/start.ts: extracted announceAgent / findAddressedOpenTask
  / claimAndPrintTask (shared by start + work); addressed-match now also
  covers assignedTo (reopened tasks coming back for rework).
- src/cli/commands/work.ts: wait-and-claim via /events, with a gap-close
  re-check after subscribing and an optional --timeout.
- index.ts: `agenthub work` command.
- templates: implementer guides lead with `work` (the autonomous loop),
  keep `start` as the one-shot.
- tests: immediate claim (local) + wait-then-claim (server SSE). 119/119.

Bump 0.3.1 -> 0.4.0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 18:18:47 +02:00
chahinebrini
961675ac40 fix(server): auto-regenerate status snapshot on every change
The status snapshot (.agenthub/status/latest.md) was only refreshed on an
explicit `status --update`, so it drifted stale and misled agents that
follow golden rule #2 ("read status/latest.md") — e.g. an implementer
seeing an old task list and picking the wrong task.

- src/server/statusRefresh.ts: subscribe to the event bus and regenerate
  the snapshot on every task/handoff/decision/memory change (REST and
  filesystem-watch paths), debounced 300 ms. Presence ('agent') events
  are skipped; the snapshot lives outside the watched dirs so it can't
  feed back into the watcher.
- wired into startServer lifecycle (start + stop on close).
- test: status/latest.md reflects a new task shortly after POST /tasks.
  117/117 green.

Bump 0.3.0 -> 0.3.1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 17:27:19 +02:00
chahinebrini
7723360054 feat: agenthub start — one-command onboarding (no copy-paste prompts)
An agent runs ONE command and is working: it announces presence, claims
the open task addressed to it, and prints the task + its handoff + the
next step. Removes the per-agent kickoff copy-paste.

- src/cli/commands/start.ts: `agenthub start --agent <name> --role <role>`.
  "Addressed to <agent>" = task title starts with "<agent>:" OR a handoff
  has toAgent=<agent>. Claims it, prints task body + handoff + the review
  gate reminder. No addressed task → lists open role tasks to pick.
  Works on local + --server paths.
- templates: implementer guides (AGENTS/CODEX/KIMI.md) now lead with
  "On your first turn, RUN `agenthub start …` — do not just summarize",
  so a fresh session self-onboards from one trigger word.
- tests: start auto-claims the addressed task, ignores others, no-ops on
  empty queue; templates test updated for the new commands. 116/116 green.

Bump 0.2.2 -> 0.3.0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 17:15:25 +02:00
chahinebrini
b0973a878c feat(update): opt-in background auto-update (AGENTHUB_AUTO_UPDATE)
Set AGENTHUB_AUTO_UPDATE=1 and the install keeps itself current with no
manual `agenthub update` — ideal for the Windows client.

maybeNotifyUpdate now:
- auto mode: refreshes the behind-count hourly (vs 24h) and, when behind,
  spawns a detached `agenthub update` (fetch → reset → install → build)
  that doesn't block the current command; the next invocation runs the
  new version. A 10-min cooldown stamp prevents a second build spawning
  while one is in flight.
- otherwise: unchanged "run `agenthub update`" hint.

Safe to enable anywhere: `update` no-ops when current and refuses to
discard unpushed local commits, so the authoring machine is protected.
Cross-platform (no OS scheduler needed). Bump 0.2.1 -> 0.2.2.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 17:00:31 +02:00
chahinebrini
353c139796 feat: review-gate (task review/reopen) + autonomous role guides
Implements the architect-controlled workflow: implementers submit work
for review, only the architect closes tasks.

- CLI: `agenthub task review <id>` (implementer submits → status review)
  and `agenthub task reopen <id>` (architect re-triggers → status open).
  Server already supported both statuses; now exposed on local + --server
  paths, with remoteClient.reviewTask/reopenTask.
- templates: AGENTS.md + role guides rewritten so agents self-drive the
  CLI on open (hello → claim → implement → task review → wait), with the
  hard rule that ONLY the architect runs `task done`. Implementer guides
  (codex/kimi) never call done; architect guide documents done/reopen.
- tests: review/reopen SSE events + formatEvent "Task review"/"Task
  reopened" lines. 113/113 green.

Bump 0.2.0 -> 0.2.1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 16:48:42 +02:00