skills/crm-builder/SKILL.md
Customer Relationship Management (CRM) vertical skill for the Customware SPA. Defines the section layout, entity views, and mapping rules for transforming a DOMAIN.md into a CRM tool. Use this skill when the Builder Agent classifies a customer's domain as contact management, sales pipeline, deal tracking, or customer relationship workflows. Trigger signals: contacts, leads, deals, pipeline, follow-ups, opportunities, accounts, customer data everywhere, can't track who talked to whom, sales process, referrals.
npx skillsauth add customware-ai/skills crm-builderInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill defines how to build a CRM tool — a system for managing contacts, companies, deals, and the relationships between them.
CRM is structurally different from CPQ and trades-builder:
The left sidebar uses a navigator pattern (Contacts, Companies, Deals, Pipeline, Activities) — NOT a stepper. Users switch between entity views, not sequential stages.
Common verticals: sales teams, consulting firms, agencies, professional services, real estate, recruiting, B2B services, any business that tracks relationships and deals.
The builder reads this skill, reads the DOMAIN.md for the specific business terminology and pipeline stages, and generates a working prototype with the customer's actual entities, fields, and workflow.
Use this skill when the transcript or DOMAIN.md contains these signals:
| Signal | Examples | |---|---| | Contact/people tracking | "customer data is everywhere," "can't find who we talked to," "contacts in spreadsheets" | | Sales pipeline | "deals," "opportunities," "pipeline," "stages," "won/lost" | | Follow-up tracking | "follow-ups fall through the cracks," "no one knows who called last" | | Relationship management | "referrals," "who knows who," "account management" | | Lead management | "leads from website," "inbound inquiries," "lead source tracking" |
Do NOT use this skill for:
Before you start building, understand what the template gives you and what this skill adds. This is the contract:
The template (app/layouts/MainLayout.tsx) ships with:
SidebarProvider, Sidebar, SidebarContent, SidebarInset, SidebarTrigger — already wiredSidebarContent is empty — this is your landing zoneModeToggle and user menu in the header's right clusterThis skill fills:
SidebarContent — with entity navigation (Pipeline, Contacts, Companies, Deals, Activities), quick filters, and recent records (see Layout Pattern below)DropdownMenu before the existing user menu, plus a global search input if there's room<Outlet /> in <main> — via route components for each entity view (Pipeline is default)This skill does NOT:
Sidebar component. There is one sidebar.SidebarContent. Brand lives in the header only.SidebarProvider or replace the collapsible behavior. Use what's there.If you find yourself wanting to restructure MainLayout.tsx, stop — the answer is almost always to fill SidebarContent instead.
The CRM tool has FIVE sections. Unlike CPQ/trades-builder, these are NOT sequential stages — they are parallel entity views. Users navigate between them freely.
What it does: Visual board view of deals moving through stages.
Display:
If no pipeline stages exist in DOMAIN.md, use the defaults above. The customer refines them after seeing the prototype.
What it does: List/detail view of people.
List view:
Detail view (clicking a contact):
Fields from DOMAIN.md:
What it does: List/detail view of organizations.
List view:
Detail view (clicking a company):
Fields from DOMAIN.md:
What it does: List/detail view of deals/opportunities.
List view:
Detail view (clicking a deal):
Stage progression:
Select dropdown populated from DOMAIN.md pipeline stagesWhat it does: Chronological feed of all activities across the CRM.
Display:
Activity types: Call, Email, Meeting, Note, Task. Use icons to distinguish.
The CRM tool uses a two-panel layout (left sidebar + main content) by default. A right sidebar appears contextually when viewing a record detail.
This is NOT a stepper layout. The left sidebar is entity navigation, not sequential stages.
The template ships SidebarProvider, Sidebar, SidebarContent, and SidebarTrigger already wired in app/layouts/MainLayout.tsx. SidebarContent is empty — that's the slot this skill fills with entity navigation. Do not re-wire the sidebar, do not add a second Sidebar component, and do not put a brand tile inside it. Brand identity lives in the header only (see Template Contract above).
Sidebar heading: Use a contextual label like "CRM" or the business name + "CRM" — not a workflow description. If the business name is short, "[Business] CRM" reads naturally; if it's long, just "CRM" is fine. The heading describes what the navigation IS.
| Component | Content |
|---|---|
| Entity navigation | A VERTICAL nav list inside SidebarContent with the five sections: Pipeline, Contacts, Companies, Deals, Activities. Each nav item shows: icon, label, and record count badge. Clicking navigates to that entity's view. This is a navigator, NOT a stepper — no step numbers, no completion states, no sequential flow. |
| Quick filters | Below the nav, show saved filters or views if the user creates them. E.g., "My deals," "Hot leads," "This week's follow-ups." |
| Recent records | Below filters, show the 3-5 most recently accessed records (any entity type) for quick navigation. Each shows name and entity type badge. Pin this section near the bottom of the sidebar so it's always visible without scrolling. |
The active section renders based on the selected nav item. Only one section visible at a time.
{activeSection === "pipeline" && <PipelineView />}
{activeSection === "contacts" && <ContactsView />}
{activeSection === "companies" && <CompaniesView />}
{activeSection === "deals" && <DealsView />}
{activeSection === "activities" && <ActivitiesView />}
List/detail pattern within each section:
When viewing a record detail (contact, company, or deal), a right sidebar can show:
This sidebar is optional for the prototype. If the main content area has enough space, the detail view can be single-panel. Add the right sidebar only if the record detail benefits from simultaneous context.
DropdownMenu dropdown in the header bar.Treat cards as an exception, not the default layout primitive. Inline content into the page body whenever possible. Use cards only when something truly needs emphasis, separation, repetition, or dialog/detail framing. Do not build card-heavy dashboards, cards inside cards, or generic grids of floating panels.
| CRM Element | shadcn Component | Usage Notes |
|---|---|---|
| Entity nav items | Button variant="ghost" in vertical stack | Inside SidebarContent. Active item gets accent background. Icon + label + count badge. |
| Pipeline columns | Column sections, ScrollArea if many deals | Column header shows stage name + deal count + total value. Use cards only if items need strong separation. |
| Deal items (pipeline) | Compact clickable rows or subtle item blocks | Deal name, company, value, assigned avatar. |
| Contact/Company list | Table | Sortable columns, search input above. |
| Record detail | Full-width sections with Separator | Keep details inline in the main page body. |
| Activity timeline | Custom list with icons | Each item: type icon, description, date, linked record. Use Avatar for person. |
| Stage badges | Badge | Color-coded by stage: lead=gray, qualified=blue, proposal=amber, negotiation=purple, won=green, lost=red. |
| Deal value | text-lg font-semibold | Prominent on pipeline items and detail views. |
| Assignment dropdowns | Select | Populated from DOMAIN.md stakeholder names. NOT free text. |
| Activity type selector | Select or RadioGroup | Call, Email, Meeting, Note, Task. |
| Search inputs | Input with search icon | At top of every list view. |
| Action buttons | Button | Primary: "Add contact," "Log activity." Destructive: "Delete," "Mark as Lost." |
| Linked record chips | Badge variant="outline" | Clickable — navigates to the linked record. |
| Quick add forms | Dialog or inline form | Modal for adding a contact/deal quickly without leaving the current view. |
| Empty states | Inline empty block with centered text + action | "No contacts yet. Add your first contact." |
| Confirmation dialogs | AlertDialog | Delete record, mark deal as lost. |
| Toast notifications | Sonner / toast() | After create, update, delete, log activity. |
| DOMAIN.md entity pattern | Maps to | In section | |---|---|---| | Contact / Person / Lead / Customer | Contact record | Contacts | | Company / Account / Organization / Business | Company record | Companies | | Deal / Opportunity / Sale / Prospect | Deal record | Deals + Pipeline | | Activity / Call / Meeting / Email / Note | Activity entry | Activities + record timelines | | Pipeline / Stage / Status | Pipeline stage columns | Pipeline | | Referral / Source / Lead source | Source field on Contact or Deal | Contact/Deal detail |
| DOMAIN.md relationship | Implementation | |---|---| | Contact belongs to Company | Contact has a Company field (Select dropdown). Company detail shows linked contacts. | | Deal has a Contact | Deal has a Contact field (Select dropdown). Contact detail shows linked deals. | | Deal has a Company | Deal has a Company field (auto-populated from contact's company, editable). | | Activity tied to Contact/Deal | Activity has Contact and Deal fields (Select dropdowns). |
| DOMAIN.md rule pattern | Implementation | |---|---| | "pipeline stages: X, Y, Z" | Pipeline columns use those exact names | | "only [role] can close deals" | RBAC gate on "Mark as Won/Lost" buttons | | "follow up within X days" | Show overdue badge on contacts/deals without recent activity | | "deals over $X need approval" | Show approval requirement note on high-value deals | | "referral source tracking" | Source field on contacts with defined dropdown values | | Currency/tax/terms | Display on deal values and any invoicing views |
If DOMAIN.md does not define pipeline stages, use these:
| Stage | Color | Meaning | |---|---|---| | Lead | Gray | New unqualified inquiry | | Qualified | Blue | Confirmed as a real opportunity | | Proposal | Amber | Proposal or quote sent | | Negotiation | Purple | In discussion, terms being worked out | | Closed Won | Green | Deal signed, revenue booked | | Closed Lost | Red | Deal did not close |
These defaults can be overridden by DOMAIN.md state models.
These patterns are drawn from Salesforce, HubSpot, Pipedrive, and Freshsales. Follow them for a prototype that feels familiar to CRM users:
Contacts link to companies. Deals link to contacts and companies. Activities link to contacts and deals. Every linked name is clickable — clicking navigates to that record's detail view.
Every record (contact, company, deal) shows an activity timeline. The most recent interaction matters most. "When did we last talk to this person?" should be answerable at a glance.
The Pipeline board view is the default landing page. Sales teams live here. Total pipeline value per stage is visible at the top.
"Log a call" and "Add a deal" should be accessible from any view — either via a floating action button or a persistent "Quick add" in the header. Users shouldn't have to navigate away to log an interaction.
One search bar that finds contacts, companies, and deals by name. Results grouped by entity type.
When a section has no records, show a helpful empty state: "No deals yet. Add your first deal to start tracking your pipeline." Include a primary action button.
This skill expects these files to exist:
| File | Purpose |
|---|---|
| DOMAIN.md or .tasks/domain.md | Business terminology, entities, pipeline stages, roles, brand data |
The builder should read DOMAIN.md or .tasks/domain.md before writing any code.
development
This skill is strict implementation instruction, not advisory reference text. The skill treats the HTML as discovery-only input, forces interactive Playwright route/state capture, then moves through scored gates for source acceptance, implementation planning, authored UI reproduction, implementation integrity, visual verification, and adversarial proof before signoff.
development
Use this skill for Customware existing-project migration tasks that move uploaded customer apps from other builders into the standard Customware stack while preserving the source product's routes, workflows, UI, UX, and styling with no intentional user-facing changes while replacing only the runtime foundation. This skill covers both `Migration build` and `Migration verify` and includes self-grading quality gates that must pass before the task can complete.
development
Primary Playwright governance skill for sandbox browser verification and deterministic end-to-end authoring or rewrite work.
development
Universal visual quality skill for every Customware build. Encodes layout philosophy, hierarchy, restraint, rhythm, brand theming mechanics, the template contract, BrandMark rendering, archetype catalog, component recipes, and aesthetic anti-patterns. Read on every UI build. The first task agent (mitb-initial-agent) runs the vision pass once; this skill is the implementation contract that turns vision into a coherent app. Trigger signals: any UI build, improving visual quality, aesthetic balance, polished design, hierarchy, restraint, taste, component design, layout principles, premium feel, brand theming, template contract, light-mode default, BrandMark.