npx claudepluginhub kmorebetter/better-software-of-you<contacts | projects | custom description>Generate a specialized HTML view based on $ARGUMENTS. Unlike /dashboard (which has a fixed layout), /view generates flexible, purpose-built pages tailored to what the user asks for. The layout should match the data — a contact directory looks different from a project board looks different from a custom report.
/contacts (tell user: "Generating your Contacts Index...")/email-hub (tell user: "Generating your Email Hub...")/week-view/prep (tell user: "Generating prep brief for your next meeting...")/conversations-view/decision-journal-view/journal-view/notes-view/network-mapQuery ${CLAUDE_PLUGIN_ROOT:-$(pwd)}/data/soy.db:
SELECT c.*,
(SELECT COUNT(*) FROM notes WHERE entity_type='contact' AND entity_id=c.id) as note_count,
(SELECT COUNT(*) FROM projects WHERE client_id=c.id) as project_count,
GROUP_CONCAT(DISTINCT t.name) as tags
FROM contacts c
LEFT JOIN entity_tags et ON et.entity_type='contact' AND et.entity_id=c.id
LEFT JOIN tags t ON t.id=et.tag_id
WHERE c.status = 'active'
GROUP BY c.id ORDER BY c.updated_at DESC;
If CRM installed, also get pending follow-ups per contact.
Layout: Card grid showing each contact with name, company, email, tags, project count, and last activity date. Each contact name links to their entity page if one exists.
Write to: ${CLAUDE_PLUGIN_ROOT:-$(pwd)}/output/contacts.html (always this filename — the sidebar links here)
Register:
INSERT INTO generated_views (view_type, entity_type, entity_id, entity_name, filename)
VALUES ('module_view', 'module', NULL, 'Contacts', 'contacts.html')
ON CONFLICT(filename) DO UPDATE SET updated_at = datetime('now');
Query projects with tasks:
SELECT p.*, c.name as client_name,
(SELECT COUNT(*) FROM tasks WHERE project_id=p.id AND status='todo') as todo_count,
(SELECT COUNT(*) FROM tasks WHERE project_id=p.id AND status='in_progress') as active_count,
(SELECT COUNT(*) FROM tasks WHERE project_id=p.id AND status='done') as done_count,
(SELECT COUNT(*) FROM tasks WHERE project_id=p.id AND status='blocked') as blocked_count
FROM projects p LEFT JOIN contacts c ON p.client_id = c.id
WHERE p.status NOT IN ('completed', 'cancelled')
ORDER BY p.priority DESC;
Layout: Kanban-style columns by status (Planning, Active, Paused) or card list with task progress bars. Each project name links to its project page if one exists.
Write to: ${CLAUDE_PLUGIN_ROOT:-$(pwd)}/output/projects.html (always this filename)
Register:
INSERT INTO generated_views (view_type, entity_type, entity_id, entity_name, filename)
VALUES ('module_view', 'module', NULL, 'Projects', 'projects.html')
ON CONFLICT(filename) DO UPDATE SET updated_at = datetime('now');
For custom descriptions, interpret what the user wants, query the relevant data, and generate an appropriate HTML layout. Use the design system from skills/dashboard-generation/references/, including delight-patterns.md for micro-interactions and copy personality.
Every view must include the sidebar from ${CLAUDE_PLUGIN_ROOT:-$(pwd)}/skills/dashboard-generation/references/navigation-patterns.md. Read it before generating any HTML. The sidebar is consistent across all pages — same sections, same structure, same order.
Read template and patterns from ${CLAUDE_PLUGIN_ROOT:-$(pwd)}/skills/dashboard-generation/references/.
Write HTML to ${CLAUDE_PLUGIN_ROOT:-$(pwd)}/output/{view-name}.html.
Register in generated_views.
Open with open <filepath>.