feat: add data plugin with inline dashboard rendering plan#92
Conversation
…ds and skills Integrates the Anthropic data plugin (from anthropics/knowledge-work-plugins) into the sidecar, providing slash commands (/data:analyze, /data:write-query, etc.) and skills (sql-queries, data-exploration, data-visualization, etc.). - Bundle plugin at plugins/data/ with neutralized .mcp.json - Configure sidecar to load the plugin via SDK plugins array - Mount plugins/ read-only into Docker containers - Update skill allowlist hook and system prompt to allow plugin-namespaced skills - Pre-create /app/plugins in Dockerfile for bind-mount compatibility - Update README with Plugins section, env vars, and architecture docs Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Entire-Checkpoint: 4c001114e073
Add implementation plan for rendering data plugin dashboards inline in the chat UI via a render_dashboard MCP tool and sandboxed iframe. Document the current limitation that /data:build-dashboard generates HTML in the sidecar but it is not yet visible to users. Also includes docker-compose plugin volume mount changes from the data plugin integration. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Entire-Checkpoint: 4f17de0996a0
|
Claude finished @cyyeh's task in 2m 46s —— View job Code Review
This PR integrates the Anthropic data plugin with Docker volume mounts and lays out a detailed plan for inline dashboard rendering. The overall approach is sound and well-documented. Here's a detailed review: Security1. Overly broad plugin skill bypass ( if (skillName && skillName.includes(":")) {
return {};
}The allowlist hook bypasses validation for any skill name containing a colon — not just const ALLOWED_PLUGIN_NAMESPACES = new Set(["data"]);
const [namespace] = skillName.split(":");
if (namespace && ALLOWED_PLUGIN_NAMESPACES.has(namespace)) {
return {};
}2. Memory leak in proposed The "Open in new tab" button creates a blob URL but never calls const blob = new Blob([html], { type: 'text/html' });
const url = URL.createObjectURL(blob);
window.open(url, '_blank');
// Missing: URL.revokeObjectURL(url)The download button (just above) correctly revokes. The "open in tab" case should too. Note this for when implementing Task 5. Fix this → 3. Iframe sandbox notes (plan Task 5) The Code Quality4. Hardcoded plugin skill names in system prompt ( const pluginSkillNote = " You may also invoke any plugin-namespaced skills ... such as 'data:sql-queries', 'data:analyze', 'data:write-query', 'data:create-viz', 'data:explore-data', 'data:build-dashboard', 'data:validate', etc."This hardcodes the data plugin's skill names inline. If the plugin adds/renames skills, this string requires a manual update. Since the plugin directory is accessible, consider dynamically reading skill names from 5. Path dependency on PLUGINS_HOST_PATH: ${PLUGINS_HOST_PATH:-${PWD}/plugins}
6. The Performance7.
Testing8. No test coverage for new functionality The PR adds no tests for:
Given the existing test pattern in Documentation9. README Dashboard limitation ( The limitation is clearly stated:
This is exactly the right pattern — acknowledging the limitation and pointing to the plan. Well done. 10. The placeholder MCP servers (Snowflake, Databricks) are clearly marked with 11. Implementation plan quality ✅ The plan in Minor Nits
Summary
The PR is well-structured as a foundation for the dashboard feature. The most actionable items before implementing the dashboard plan are: tightening the plugin namespace allowlist and adding the |
Summary
plugins/data/) with Docker volume mounts for sidecar containersrender_dashboardMCP tool + sandboxed iframe/data:build-dashboardgenerates HTML but cannot display it in the UI yetTest plan
docker compose buildcompletes with plugin volume mount changes/data:analyze,/data:write-query, etc.) work in the sidecardocs/plans/2026-03-03-inline-dashboard-rendering.md🤖 Generated with Claude Code