Add titles to icon buttons #445
Conversation
…TaskTableView components.
WalkthroughAdds explicit Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Poem
✨ Finishing Touches
🧪 Generate unit tests
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
archon-ui-main/src/components/project-tasks/TaskTableView.tsx (1)
367-367: Make action buttons visible on keyboard focusThe action group is opacity-0 unless hovered, which hides controls from keyboard users. Reveal via focus-within.
- <div className="flex justify-center gap-2 opacity-0 group-hover:opacity-100 transition-opacity"> + <div className="flex justify-center gap-2 opacity-0 group-hover:opacity-100 focus-within:opacity-100 transition-opacity">archon-ui-main/src/components/project-tasks/DraggableTaskCard.tsx (1)
147-156: Icon-only buttons need aria-labels; add aria-hidden on SVGs and type="button"Title alone won’t give a robust accessible name. Add aria-label to each button, mark the icons aria-hidden, and set type="button".
- <button + <button + type="button" onClick={(e) => { e.stopPropagation(); onDelete(task); }} className="w-5 h-5 rounded-full flex items-center justify-center bg-red-100/80 dark:bg-red-500/20 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-500/30 hover:shadow-[0_0_10px_rgba(239,68,68,0.3)] transition-all duration-300" title="Delete task" + aria-label="Delete task" > - <Trash2 className="w-3 h-3" /> + <Trash2 className="w-3 h-3" aria-hidden="true" /> </button> - <button + <button + type="button" onClick={(e) => { e.stopPropagation(); onView(); }} className="w-5 h-5 rounded-full flex items-center justify-center bg-cyan-100/80 dark:bg-cyan-500/20 text-cyan-600 dark:text-cyan-400 hover:bg-cyan-200 dark:hover:bg-cyan-500/30 hover:shadow-[0_0_10px_rgba(34,211,238,0.3)] transition-all duration-300" title="Edit task" + aria-label="Edit task" > - <Edit className="w-3 h-3" /> + <Edit className="w-3 h-3" aria-hidden="true" /> </button> - <button + <button + type="button" onClick={toggleFlip} className="w-5 h-5 rounded-full flex items-center justify-center bg-cyan-100/80 dark:bg-cyan-500/20 text-cyan-600 dark:text-cyan-400 hover:bg-cyan-200 dark:hover:bg-cyan-500/30 hover:shadow-[0_0_10px_rgba(34,211,238,0.3)] transition-all duration-300" title="View task details" + aria-label="View task details" > - <RefreshCw className="w-3 h-3" /> + <RefreshCw className="w-3 h-3" aria-hidden="true" /> </button> ... - <button + <button + type="button" onClick={toggleFlip} className="ml-auto w-5 h-5 rounded-full flex items-center justify-center bg-cyan-100/80 dark:bg-cyan-500/20 text-cyan-600 dark:text-cyan-400 hover:bg-cyan-200 dark:hover:bg-cyan-500/30 hover:shadow-[0_0_10px_rgba(34,211,238,0.3)] transition-all duration-300" title="Flip back to front" + aria-label="Flip back to front" > - <RefreshCw className="w-3 h-3" /> + <RefreshCw className="w-3 h-3" aria-hidden="true" /> </button>Also applies to: 157-166, 168-173, 227-233
🧹 Nitpick comments (3)
archon-ui-main/src/components/project-tasks/TaskTableView.tsx (1)
383-386: Confirm label vs action: “Edit task” triggers onTaskViewIf onTaskView opens a read-only details view, the tooltip/aria-label should read “View task details” for consistency with the board card. If it opens an editor, keep “Edit task” and align the card copy.
archon-ui-main/src/components/project-tasks/DraggableTaskCard.tsx (2)
162-164: Align label with action (“Edit task” calls onView)Same note as the table view: confirm whether onView opens an editor or a read-only details view, and align the tooltip copy accordingly across components.
244-244: Remove trailing whitespaceCosmetic, but it avoids lint noise and spurious diffs.
- </div> + </div>
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (3)
archon-ui-main/src/components/project-tasks/DocumentCard.tsx(1 hunks)archon-ui-main/src/components/project-tasks/DraggableTaskCard.tsx(4 hunks)archon-ui-main/src/components/project-tasks/TaskTableView.tsx(1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
{python/**/*.py,archon-ui-main/src/**/*.{ts,tsx,js,jsx}}
📄 CodeRabbit inference engine (CLAUDE.md)
{python/**/*.py,archon-ui-main/src/**/*.{ts,tsx,js,jsx}}: Remove dead code immediately; do not keep legacy/unused functions
Avoid comments that reference change history (e.g., LEGACY, CHANGED, REMOVED); keep comments focused on current functionality
Files:
archon-ui-main/src/components/project-tasks/TaskTableView.tsxarchon-ui-main/src/components/project-tasks/DraggableTaskCard.tsxarchon-ui-main/src/components/project-tasks/DocumentCard.tsx
archon-ui-main/src/components/**
📄 CodeRabbit inference engine (CLAUDE.md)
Place reusable UI components in archon-ui-main/src/components/
Files:
archon-ui-main/src/components/project-tasks/TaskTableView.tsxarchon-ui-main/src/components/project-tasks/DraggableTaskCard.tsxarchon-ui-main/src/components/project-tasks/DocumentCard.tsx
🔇 Additional comments (1)
archon-ui-main/src/components/project-tasks/DocumentCard.tsx (1)
121-121: Good addition; pairs well with existing aria-labelAdding title="Delete document" complements the aria-label and provides a native tooltip without changing behavior. LGTM.
|
Thank you @djankies this is a great contribution. feel free to make a follow up pr or incorporate the code rabbit suggestions in here as well! |
Add type, aria-label, and aria-hidden attributes to action and icon buttons across task and document components to improve accessibility and assistive technology support.
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (7)
archon-ui-main/src/components/project-tasks/DraggableTaskCard.tsx (7)
148-158: Solid accessibility improvements; add a visible keyboard focus style.Nice additions: type="button", aria-label, and aria-hidden on the icon. Add a focus-visible ring so keyboard users can see focus without relying on hover.
Apply:
- className="w-5 h-5 rounded-full flex items-center justify-center bg-red-100/80 dark:bg-red-500/20 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-500/30 hover:shadow-[0_0_10px_rgba(239,68,68,0.3)] transition-all duration-300" + className="w-5 h-5 rounded-full flex items-center justify-center bg-red-100/80 dark:bg-red-500/20 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-500/30 hover:shadow-[0_0_10px_rgba(239,68,68,0.3)] transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-400 dark:focus-visible:ring-red-300"
160-170: Verify action semantics: “Edit task” calls onView().If onView opens an edit modal/view, all good. If it merely opens a read-only view, the label “Edit task” is misleading, impacting a11y. Consider renaming the handler to onEdit (and wiring appropriately) or adjust the label.
Also add a keyboard focus style:
- className="w-5 h-5 rounded-full flex items-center justify-center bg-cyan-100/80 dark:bg-cyan-500/20 text-cyan-600 dark:text-cyan-400 hover:bg-cyan-200 dark:hover:bg-cyan-500/30 hover:shadow-[0_0_10px_rgba(34,211,238,0.3)] transition-all duration-300" + className="w-5 h-5 rounded-full flex items-center justify-center bg-cyan-100/80 dark:bg-cyan-500/20 text-cyan-600 dark:text-cyan-400 hover:bg-cyan-200 dark:hover:bg-cyan-500/30 hover:shadow-[0_0_10px_rgba(34,211,238,0.3)] transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-cyan-400 dark:focus-visible:ring-cyan-300"
172-179: Good “View task details” labeling; add focus-visible styling.The tooltip + aria-label are consistent. Add a visible focus ring for keyboard users.
- className="w-5 h-5 rounded-full flex items-center justify-center bg-cyan-100/80 dark:bg-cyan-500/20 text-cyan-600 dark:text-cyan-400 hover:bg-cyan-200 dark:hover:bg-cyan-500/30 hover:shadow-[0_0_10px_rgba(34,211,238,0.3)] transition-all duration-300" + className="w-5 h-5 rounded-full flex items-center justify-center bg-cyan-100/80 dark:bg-cyan-500/20 text-cyan-600 dark:text-cyan-400 hover:bg-cyan-200 dark:hover:bg-cyan-500/30 hover:shadow-[0_0_10px_rgba(34,211,238,0.3)] transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-cyan-400 dark:focus-visible:ring-cyan-300"
200-218: Avoid innerHTML mutation; handle clipboard failures; add screen-reader feedback.Direct DOM mutation via innerHTML is a React anti-pattern and risks brittle UI. Clipboard writes can fail (permissions, insecure context). Prefer state-driven feedback and an aria-live status for SR users.
Diff in-place:
- onClick={(e) => { + onClick={async (e) => { e.stopPropagation(); - navigator.clipboard.writeText(task.id); - // Optional: Add a small toast or visual feedback here - const button = e.currentTarget; - const originalHTML = button.innerHTML; - button.innerHTML = '<span class="text-green-500">Copied!</span>'; - setTimeout(() => { - button.innerHTML = originalHTML; - }, 2000); + try { + await navigator.clipboard.writeText(task.id); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } catch (err) { + console.error('Failed to copy Task ID:', err); + } }} className="flex items-center gap-1 text-xs text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 transition-colors" title="Copy Task ID to clipboard" aria-label="Copy Task ID to clipboard" > - <Clipboard className="w-3 h-3" aria-hidden="true" /> - <span>Task ID</span> + <Clipboard className="w-3 h-3" aria-hidden="true" /> + <span>Task ID</span> + <span className="sr-only" role="status" aria-live="polite">{copied ? 'Copied to clipboard' : ''}</span> </button>Add the supporting state near Line 61:
const [copied, setCopied] = useState(false);Optionally, add a small visual indicator (e.g., swap label to “Copied!”) conditionally instead of mutating innerHTML. I can provide a follow-up patch if you want that UX tweak as well.
236-243: Back-side flip button: add visible focus style for keyboard users.Consistent with the front-side actions, add a focus-visible ring.
- className="ml-auto w-5 h-5 rounded-full flex items-center justify-center bg-cyan-100/80 dark:bg-cyan-500/20 text-cyan-600 dark:text-cyan-400 hover:bg-cyan-200 dark:hover:bg-cyan-500/30 hover:shadow-[0_0_10px_rgba(34,211,238,0.3)] transition-all duration-300" + className="ml-auto w-5 h-5 rounded-full flex items-center justify-center bg-cyan-100/80 dark:bg-cyan-500/20 text-cyan-600 dark:text-cyan-400 hover:bg-cyan-200 dark:hover:bg-cyan-500/30 hover:shadow-[0_0_10px_rgba(34,211,238,0.3)] transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-cyan-400 dark:focus-visible:ring-cyan-300"
148-158: Consider a reusable IconButton with an accessible tooltip.You’re repeating similar button markup (classes, sizing, aria-label/title/icon). A shared IconButton that:
- Accepts icon, label, tone (red/cyan/etc.), onClick, and tooltip props
- Applies aria-hidden to icons by default, ensures type="button"
- Adds consistent focus-visible ring and hover effects
- Integrates an accessible tooltip that appears on hover and focus (not relying on title)
would DRY this up and keep a11y consistent across the app.Sketch:
type IconButtonProps = { icon: React.ElementType; label: string; // used for aria-label tone?: 'danger' | 'info'; // controls colors title?: string; // for hover tooltip text onClick?: React.MouseEventHandler<HTMLButtonElement>; className?: string; };For tooltips, prefer an a11y-friendly solution that shows on focus and hover (e.g., Radix UI Tooltip or a small custom tooltip using aria-describedby) instead of title alone, which isn’t reliably accessible for keyboard-only users.
Also applies to: 160-170, 172-179, 236-243
160-170: Optional: keep labels consistent.Minor microcopy consistency: you’re using “Edit task”, “View task details”, and “Flip back to front”. Consider aligning tone/case across components (e.g., “Edit task”, “View details”, “Flip to front”) for polish.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (3)
archon-ui-main/src/components/project-tasks/DocumentCard.tsx(2 hunks)archon-ui-main/src/components/project-tasks/DraggableTaskCard.tsx(4 hunks)archon-ui-main/src/components/project-tasks/TaskTableView.tsx(2 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- archon-ui-main/src/components/project-tasks/TaskTableView.tsx
- archon-ui-main/src/components/project-tasks/DocumentCard.tsx
🧰 Additional context used
📓 Path-based instructions (2)
{python/**/*.py,archon-ui-main/src/**/*.{ts,tsx,js,jsx}}
📄 CodeRabbit inference engine (CLAUDE.md)
{python/**/*.py,archon-ui-main/src/**/*.{ts,tsx,js,jsx}}: Remove dead code immediately; do not keep legacy/unused functions
Avoid comments that reference change history (e.g., LEGACY, CHANGED, REMOVED); keep comments focused on current functionality
Files:
archon-ui-main/src/components/project-tasks/DraggableTaskCard.tsx
archon-ui-main/src/components/**
📄 CodeRabbit inference engine (CLAUDE.md)
Place reusable UI components in archon-ui-main/src/components/
Files:
archon-ui-main/src/components/project-tasks/DraggableTaskCard.tsx
| type="button" | ||
| onClick={(e) => { | ||
| e.stopPropagation(); | ||
| onDelete(task); | ||
| }} | ||
| className="w-5 h-5 rounded-full flex items-center justify-center bg-red-100/80 dark:bg-red-500/20 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-500/30 hover:shadow-[0_0_10px_rgba(239,68,68,0.3)] transition-all duration-300" | ||
| title="Delete task" | ||
| aria-label="Delete task" | ||
| > | ||
| <Trash2 className="w-3 h-3" /> | ||
| <Trash2 className="w-3 h-3" aria-hidden="true" /> | ||
| </button> |
There was a problem hiding this comment.
💡 Verification agent
🧩 Analysis chain
Repo-wide consistency check (buttons without explicit type or aria-hidden icons).
If you want quick verification that we didn’t miss any buttons lacking type="button" or icons missing aria-hidden in this folder, run:
Also applies to: 160-170, 172-179, 200-218, 236-243
🏁 Script executed:
#!/bin/bash
# From repo root
# 1) Buttons missing explicit type
rg -nP --type tsx -g 'archon-ui-main/src/**' '<button(?![^>]*\btype=)'
# 2) Icon components inside buttons lacking aria-hidden (heuristic for lucide-react icons)
rg -nP --type tsx -g 'archon-ui-main/src/**' '<button[\s\S]*?>[\s\S]*?<([A-Z][A-Za-z0-9]+)\b(?![^>]*aria-hidden)'Length of output: 244
🏁 Script executed:
#!/bin/bash
# From repo root
# 1) Buttons missing explicit type attribute
rg -nP '<button(?![^>]*\btype=)' -g 'archon-ui-main/src/**/*.tsx'
# 2) Icon components inside buttons lacking aria-hidden (heuristic for lucide-react icons)
rg -nP '<button[\s\S]*?>[\s\S]*?<([A-Z][A-Za-z0-9]+)\b(?![^>]*aria-hidden)' -g 'archon-ui-main/src/**/*.tsx'Length of output: 16718
🏁 Script executed:
#!/bin/bash
# Inspect DraggableTaskCard.tsx around the reported missing type attributes
sed -n '140,260p' archon-ui-main/src/components/project-tasks/DraggableTaskCard.tsxLength of output: 6396
Ensure explicit type on all <button> elements
We ran a ripgrep scan across archon-ui-main/src/**/*.tsx and found numerous <button> tags missing a type attribute (which defaults to submit and can cause unintended form submissions). DraggableTaskCard is correctly using type="button", but many other components need updating.
Action items:
- Add
type="button"to every<button>that is not meant to submit or reset a form. - Reserve
type="submit"/type="reset"only for actual form controls. - Icons inside buttons already include
aria-hidden="true", so no missingaria-hiddenissues were detected in our scan.
Examples of files needing a type attribute (non-exhaustive):
archon-ui-main/src/contexts/ToastContext.tsx:108archon-ui-main/src/pages/SettingsPage.tsx:241archon-ui-main/src/pages/MCPPage.tsxat lines 407, 421, 544, 554, 564, 574, 584, 594archon-ui-main/src/components/ProjectCreationProgressCard.tsx:240archon-ui-main/src/components/BackendStartupError.tsx:60
You can re-run:
rg -nP '<button(?![^>]*\btype=)' -g 'archon-ui-main/src/**/*.tsx'to locate all occurrences and systematically add type="button".
|
@Wirasm Hey there, thanks for taking a look. I've addressed the initial CR notes, however I didnt intend the scope of these changes to include accessibility changes. It looks like CodeRabbit wants me to take it in that direction after my latest push. I'm happy to do a more comprehensive accessibility review and make improvements in another PR. Is there anything specific you wanted me to remediate in this PR that isn't accessibility related? |
|
Looks great @djankies looking to merge today |
* feat: add per-node MCP servers for DAG workflows (#445) Add `mcp: path/to/config.json` field to DAG workflow nodes. At execution time, the executor reads the MCP config JSON, expands $VAR_NAME env references in env/headers values, and passes the loaded servers to the Claude Agent SDK via Options.mcpServers. MCP tool wildcards are auto- added to allowedTools. - Add mcp field to DagNodeBase type and loader validation - Add mcpServers + allowedTools to WorkflowAssistantOptions and AssistantRequestOptions - Pass mcpServers/allowedTools through ClaudeClient to SDK Options - Handle system/init message to detect MCP connection failures - Add Codex warning (per-node MCP not supported) - Add Haiku warning (tool search not supported) - Add MCP config path input in Web UI NodeInspector - Add mcp to WorkflowCanvas reactFlowToDagNodes conversion - Add 12 unit tests for loadMcpConfig and env var expansion * fix: address review findings for per-node MCP servers Type safety: - Use SDK McpServerConfig type in AssistantRequestOptions (eliminates unsafe cast) - Update WorkflowAssistantOptions.mcpServers to proper discriminated union - Remove redundant cast in claude.ts Error handling: - Warn users when MCP config references undefined env vars - Check safeSendMessage return value for MCP connection failures - Check safeSendMessage return value for Haiku MCP warning - Log unhandled system messages at debug level in both claude.ts and dag-executor.ts - Coerce non-string env/header values with warning instead of silent passthrough Code quality: - Fix log event naming: dag_node_mcp_* → dag.mcp_* (domain.action_state format) - Replace IIFE in loader mcp validation with plain if/else - Extract duplicated env expansion logic into expandEnvVarsInRecord helper - Merge split import from ./deps into single statement - Return missingVars from loadMcpConfig/expandEnvVars for caller awareness Documentation: - Add mcp field to Node Fields table in docs/authoring-workflows.md - Add mcp to DAG schema example, allowed_tools section, and summary list - Add mcp to CLAUDE.md DAG feature list - Add per-node MCP servers paragraph to README.md tool restrictions section * docs: add MCP servers guide (docs/mcp-servers.md) Comprehensive guide covering config file format (stdio/HTTP/SSE), env var expansion, automatic tool wildcards, MCP-only nodes, connection failure handling, workflow examples, troubleshooting, and popular server list. Cross-referenced from authoring-workflows.md and CLAUDE.md. * feat: add optional ntfy push notification to smart PR review Add conditional notify node to archon-smart-pr-review workflow that sends a push notification when the review completes. Gated behind a bash node that checks for .archon/mcp/ntfy.json — silently skipped if not configured. - Add check-ntfy bash node + notify MCP node to smart PR review workflow - Add .archon/mcp/ to .gitignore (per-user MCP configs may contain secrets) - Add "Push Notifications" setup guide to docs/mcp-servers.md
…am00#688) * feat: add per-node MCP servers for DAG workflows (coleam00#445) Add `mcp: path/to/config.json` field to DAG workflow nodes. At execution time, the executor reads the MCP config JSON, expands $VAR_NAME env references in env/headers values, and passes the loaded servers to the Claude Agent SDK via Options.mcpServers. MCP tool wildcards are auto- added to allowedTools. - Add mcp field to DagNodeBase type and loader validation - Add mcpServers + allowedTools to WorkflowAssistantOptions and AssistantRequestOptions - Pass mcpServers/allowedTools through ClaudeClient to SDK Options - Handle system/init message to detect MCP connection failures - Add Codex warning (per-node MCP not supported) - Add Haiku warning (tool search not supported) - Add MCP config path input in Web UI NodeInspector - Add mcp to WorkflowCanvas reactFlowToDagNodes conversion - Add 12 unit tests for loadMcpConfig and env var expansion * fix: address review findings for per-node MCP servers Type safety: - Use SDK McpServerConfig type in AssistantRequestOptions (eliminates unsafe cast) - Update WorkflowAssistantOptions.mcpServers to proper discriminated union - Remove redundant cast in claude.ts Error handling: - Warn users when MCP config references undefined env vars - Check safeSendMessage return value for MCP connection failures - Check safeSendMessage return value for Haiku MCP warning - Log unhandled system messages at debug level in both claude.ts and dag-executor.ts - Coerce non-string env/header values with warning instead of silent passthrough Code quality: - Fix log event naming: dag_node_mcp_* → dag.mcp_* (domain.action_state format) - Replace IIFE in loader mcp validation with plain if/else - Extract duplicated env expansion logic into expandEnvVarsInRecord helper - Merge split import from ./deps into single statement - Return missingVars from loadMcpConfig/expandEnvVars for caller awareness Documentation: - Add mcp field to Node Fields table in docs/authoring-workflows.md - Add mcp to DAG schema example, allowed_tools section, and summary list - Add mcp to CLAUDE.md DAG feature list - Add per-node MCP servers paragraph to README.md tool restrictions section * docs: add MCP servers guide (docs/mcp-servers.md) Comprehensive guide covering config file format (stdio/HTTP/SSE), env var expansion, automatic tool wildcards, MCP-only nodes, connection failure handling, workflow examples, troubleshooting, and popular server list. Cross-referenced from authoring-workflows.md and CLAUDE.md. * feat: add optional ntfy push notification to smart PR review Add conditional notify node to archon-smart-pr-review workflow that sends a push notification when the review completes. Gated behind a bash node that checks for .archon/mcp/ntfy.json — silently skipped if not configured. - Add check-ntfy bash node + notify MCP node to smart PR review workflow - Add .archon/mcp/ to .gitignore (per-user MCP configs may contain secrets) - Add "Push Notifications" setup guide to docs/mcp-servers.md
…am00#688) * feat: add per-node MCP servers for DAG workflows (coleam00#445) Add `mcp: path/to/config.json` field to DAG workflow nodes. At execution time, the executor reads the MCP config JSON, expands $VAR_NAME env references in env/headers values, and passes the loaded servers to the Claude Agent SDK via Options.mcpServers. MCP tool wildcards are auto- added to allowedTools. - Add mcp field to DagNodeBase type and loader validation - Add mcpServers + allowedTools to WorkflowAssistantOptions and AssistantRequestOptions - Pass mcpServers/allowedTools through ClaudeClient to SDK Options - Handle system/init message to detect MCP connection failures - Add Codex warning (per-node MCP not supported) - Add Haiku warning (tool search not supported) - Add MCP config path input in Web UI NodeInspector - Add mcp to WorkflowCanvas reactFlowToDagNodes conversion - Add 12 unit tests for loadMcpConfig and env var expansion * fix: address review findings for per-node MCP servers Type safety: - Use SDK McpServerConfig type in AssistantRequestOptions (eliminates unsafe cast) - Update WorkflowAssistantOptions.mcpServers to proper discriminated union - Remove redundant cast in claude.ts Error handling: - Warn users when MCP config references undefined env vars - Check safeSendMessage return value for MCP connection failures - Check safeSendMessage return value for Haiku MCP warning - Log unhandled system messages at debug level in both claude.ts and dag-executor.ts - Coerce non-string env/header values with warning instead of silent passthrough Code quality: - Fix log event naming: dag_node_mcp_* → dag.mcp_* (domain.action_state format) - Replace IIFE in loader mcp validation with plain if/else - Extract duplicated env expansion logic into expandEnvVarsInRecord helper - Merge split import from ./deps into single statement - Return missingVars from loadMcpConfig/expandEnvVars for caller awareness Documentation: - Add mcp field to Node Fields table in docs/authoring-workflows.md - Add mcp to DAG schema example, allowed_tools section, and summary list - Add mcp to CLAUDE.md DAG feature list - Add per-node MCP servers paragraph to README.md tool restrictions section * docs: add MCP servers guide (docs/mcp-servers.md) Comprehensive guide covering config file format (stdio/HTTP/SSE), env var expansion, automatic tool wildcards, MCP-only nodes, connection failure handling, workflow examples, troubleshooting, and popular server list. Cross-referenced from authoring-workflows.md and CLAUDE.md. * feat: add optional ntfy push notification to smart PR review Add conditional notify node to archon-smart-pr-review workflow that sends a push notification when the review completes. Gated behind a bash node that checks for .archon/mcp/ntfy.json — silently skipped if not configured. - Add check-ntfy bash node + notify MCP node to smart PR review workflow - Add .archon/mcp/ to .gitignore (per-user MCP configs may contain secrets) - Add "Push Notifications" setup guide to docs/mcp-servers.md
Adds tooltips to icon buttons
Changes Made
titleattributes to icon buttons in DocumentCard componenttitleattributes to icon buttons (delete, edit, view details) in DraggableTaskCard componenttitleattributes to icon buttons (delete, complete, edit) in TaskTableView componentType of Change
Affected Services
Testing
Test Evidence
Checklist
Breaking Changes
None - this is a non-breaking enhancement that only adds tooltips to existing buttons.
Additional Notes
Summary by CodeRabbit