Kelly crm
Personal App-in-Skill CRM operator for contacts, companies, deals, and agent-drafted follow-ups in a local review dashboard. Use when the user invokes $kelly-crm or /kelly-crm, mentions CRM, pipeline, contacts, companies, deals, follow-ups, relationship management, meeting-note capture, outreach drafts, next steps, or wants to review/approve agent-drafted follow-up messages before they are sent through other channels.From its SKILL.md
npx -y skills add mr-kelly/skills --skill kelly-crmAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
3 things to look at
- reads credentialsReads from 2 credential sources: `KELLY_CRM_ENV_FILE` and 1 more.
- 4 stars4 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 3 commands, including `skills/kelly-crm/app/start.sh` and 2 more.
SKILL.md
9.5 KB, ~2.2k tokens by cl100k_base, as published. Nobody here has run it
Kelly CRM
Overview
Use this skill as Kelly's personal CRM operator. It keeps a file-backed App-in-Skill dashboard over contacts, companies, deals, and interactions, plus a review queue of agent-drafted follow-up messages. The skill gathers and updates CRM data from whatever Kelly feeds it — emails, meeting notes, chat asks — drafts follow-ups, and executes approved follow-ups only through other channels (for example kelly-email) after explicit approval.
Default interaction mode: App UI. Unless the user explicitly asks for chat-only handling, check onboarding/config, refresh or regenerate the local CRM snapshot, start/reuse the local app with app/start.sh, and give the actual local URL. Use chat-only mode only when the user says "纯聊天", "chat only", "不要打开 UI", or similar; in that mode present numbered follow-ups (Follow-up #1) and take verdicts in the conversation.
App UI Screenshots
<table> <tr> <td width="50%"><img src="assets/screenshots/overview.webp" alt="Kelly CRM overview"></td> <td width="50%"><img src="assets/screenshots/deals.webp" alt="Kelly CRM deal pipeline"></td> </tr> <tr> <td><strong>Overview</strong><br>CRM command desk with pipeline totals by stage, follow-ups due, recent activity, and network counts.</td> <td><strong>Deals</strong><br>Pipeline table across stages with amounts, probability, next steps, and a per-deal interaction timeline.</td> </tr> <tr> <td width="50%"><img src="assets/screenshots/contacts.webp" alt="Kelly CRM contacts"></td> <td width="50%"><img src="assets/screenshots/followups.webp" alt="Kelly CRM follow-up queue"></td> </tr> <tr> <td><strong>Contacts</strong><br>Contact list with relationship strength, last touch, and per-contact interaction history and open deals.</td> <td><strong>Follow-up queue</strong><br>Agent-drafted follow-up messages with editable drafts, risk badges, and approve/request-changes/block decisions.</td> </tr> </table>Boundary
- The skill may read sources Kelly provides, normalize CRM data, draft follow-up messages, validate schemas, and write local handoff files.
- The app reads and writes local files only. It must never send emails or messages, call external APIs, mutate remote CRMs, or perform any external side effect.
- Outbound follow-up messages are always approval-required. Sending is delegated to other skills (for example
kelly-email) and happens only after the user approves the specific follow-up in the app or in chat.scripts/execute_decisions.tsonly records handoff operations inexecution_report.json; it performs no sending itself. - Treat all contact and deal data as sensitive. Do not commit
config.local.json, env files,app/.data/, exports, or personal contact details.
First Run And Onboarding
On invocation, check app/.data/onboarding.json and private config readiness. If onboarding is absent/incomplete, guide setup before doing real CRM work.
Private config priority:
KELLY_CRM_CONFIG=/absolute/path/to/config.jsonskills/kelly-crm/config.local.json~/.config/kelly-crm/config.jsonskills/kelly-crm/config.example.jsonas template only
Env priority:
- Existing environment variables
KELLY_CRM_ENV_FILE=/absolute/path/to/.env- Repository root
.env skills/kelly-crm/.env.local~/.config/kelly-crm/.env
Ask for non-secret setup details only: operator profile (name, role, company, timezone), pipeline stages, currencies, outbound channels and which skill handles each, style/tone for drafts, and which env var names hold channel tokens. Never ask the user to paste secret values into chat. Secrets belong only in local env files.
When setup is complete and the user confirms, write app/.data/onboarding.json:
{
"completed": true,
"completed_at": "ISO timestamp",
"config_version": "1"
}
Local App
Start the dashboard with:
skills/kelly-crm/app/start.sh
The app uses local HTTP on 127.0.0.1, preferring port 3000 through 4000, or KELLY_CRM_UI_PORT when set. The launcher reuses a running instance only when /api/state proves it is the same app (app: "kelly-crm").
Required app views:
#/overview: CRM command desk. Human-attention counts, pipeline summary by stage (lead → qualified → proposal → negotiation → won/lost) with deal counts and amounts, follow-ups due, recent activity feed, and contact/company totals.#/dealsand#/deals/<deal_id>: pipeline table with stage, company, contact, amount, currency, probability, next step, owner, last activity, and status badges. Detail shows the deal timeline of interactions, notes, linked contacts, and the agent-suggested next action.#/contactsand#/contacts/<contact_id>: contact list with name, company, role, relationship strength, tags, last touch, and next follow-up. Detail shows profile, interaction timeline (email/meeting/social/note entries), open deals, and agent notes.#/followups: review queue over agent-drafted follow-ups in workflow statesneeds_review,changes_requested,approved,done,blocked. Each item shows a stable row ref (Follow-up #1), reason, risk badges, an editablesuggested_replydraft, aReview notetextarea, and decision buttons Approve / Request changes / Block that write todecisions.json. The queue is read-only whileagent.lockexists.#/settings: sanitized config summary. Operator profile, pipeline stages, configured channels, env readiness booleans, data provider name, and onboarding state. Never expose secret values.
Demo mode:
?demo=1opens a deterministic mock CRM for documentation and screenshots.?demo=overview,?demo=deals,?demo=contacts,?demo=followups, and?demo=detailselect named mock scenes;detaildeep-links to a deal detail.lang=enorlang=zhforces UI chrome language for screenshots.- Demo API responses must never read or write files under
app/.data/or any private config.
UI language: support English and Chinese chrome with Auto default. Keep contact names, company names, deal names, notes, and drafts in their original language.
File Contract
Read references/crm-schema.md before editing the app, scripts, or any generated CRM JSON.
Primary local files:
app/.data/crm_snapshot.json: normalized CRM snapshot (contacts, companies, deals, interactions, followups, metrics) generated by the skill/scripts.app/.data/decisions.json: user verdicts and review notes keyed by followup id, written by the app.app/.data/agent_tasks.json: queued agent work — follow-ups inchanges_requestedwith the user's comment. The skill polls this to pick up revisions.app/.data/execution_report.json: latest handoff/execution results written byscripts/execute_decisions.ts.app/.data/onboarding.json: onboarding completion marker.app/.data/agent.lock: temporary lock while the skill is generating or executing. The app rejects decision writes while it exists.config.local.json: private operator configuration, ignored by git.
Use scripts/validate_ui_schema.ts before relying on a snapshot in the UI. The app may show an empty setup state when no snapshot exists.
Normal Workflow
- Detect mode. Default to App UI.
- Load private config through the config helpers. If only
config.example.jsonexists, enter onboarding. - When Kelly feeds new material (emails, meeting notes, chat asks): acquire
app/.data/agent.lock, updatecrm_snapshot.json— upsert contacts/companies/deals by stable ids, append interactions, recompute metrics — draft new follow-ups intofollowups[]withstatus: "needs_review", a clearreason, risk badges, and asuggested_replydraft, validate withscripts/validate_ui_schema.ts, then release the lock. - Start/reuse the UI and report the URL so Kelly can review the pipeline and the follow-up queue.
- Poll
app/.data/agent_tasks.jsonforchanges_requesteditems. Re-draft each one according to the user's comment, set it back toneeds_reviewin the snapshot, and clear the task. - On "execute" / "send approved follow-ups": re-read
decisions.json, re-check the lock, and runscripts/execute_decisions.ts --applyto recordhandoff_to_email(or other channel) operations inexecution_report.json. Then perform the actual sends only through the corresponding skill (for example$kelly-email) with the approved, possibly user-edited draft, one follow-up at a time, and mark eachdonein the snapshot afterwards. - Never send anything for items without an explicit
approvedecision, and never re-send items already markeddonein the execution report.
Safety Defaults
- Treat every outbound message, meeting invitation, introduction, and pricing commitment as approval-required.
- Store only the minimum contact content needed for review; keep raw source emails and documents out of the snapshot.
- Redact tokens and credential-like strings from logs, reports, and UI state; expose only boolean readiness for configured env vars.
- Keep stable ids (
contact_id,deal_id,followup_id) so repeated updates and executions are idempotent. - If decisions and the snapshot disagree (missing followup, stale ref), stop and regenerate rather than guessing.
What ships with it: 46 files
198.2 KB alongside SKILL.md, 19 of them executable
agents/
- openai.yaml225 B
app/
- app/accent-theme.css7.5 KB
- app/accent-theme.jsruns7.3 KB
- app/app.jsruns17.3 KB
- app/connect-gate.css5.3 KB
- app/demo-visuals.css1.4 KB
- app/demo-visuals.jsruns3.3 KB
- app/i18n/messages.jsruns8.0 KB
- app/index.html4.3 KB
- app/js/busabase-client.jsruns226 B
- app/js/config.jsruns7.3 KB
- app/js/connect-gate.jsruns9.1 KB
- app/js/crm-model.jsruns5.8 KB
- app/js/crm-views.jsruns17.6 KB
- app/js/demo-visuals-data.jsruns3.9 KB
- app/js/providers/busabase-provider.jsruns9.5 KB
- app/js/providers/demo-provider.jsruns24.2 KB
- app/js/providers/index.jsruns270 B
- app/js/resource-provisioning.jsruns10.0 KB
- app/styles.css18.9 KB
- package.json881 B
- resource-map.json716 B
- scripts/check.mjsruns1.7 KB
- server.jsruns10.4 KB
- test/crm-model.test.mjsruns2.3 KB
assets/
- screenshots/contacts.webp130 B
- screenshots/contacts-zh-CN.webp130 B
- screenshots/deals.webp131 B
- screenshots/deals-zh-CN.webp130 B
- screenshots/followups.webp130 B
- screenshots/followups-zh-CN.webp130 B
- screenshots/overview.webp130 B
- screenshots/overview-zh-CN.webp130 B
- screenshots/thumbs/contacts.webp130 B
- screenshots/thumbs/contacts-zh-CN.webp130 B
- screenshots/thumbs/deals.webp130 B
- screenshots/thumbs/deals-zh-CN.webp130 B
- screenshots/thumbs/followups.webp130 B
- screenshots/thumbs/followups-zh-CN.webp130 B
- screenshots/thumbs/overview.webp130 B
6 more files not listed here. See all 46 in the repository.
Gives 0 of the 12 instructions most sales audience skills give in ~2.2k tokens
Counted across 401 of the 401 authors here whose files we hold, read 2026-08-07
- Read product marketing context before asking questionsin 21 of 401, across 11 files
- Acknowledge competitor strengths honestlyin 18 of 401, across 7 files
- Start every page with a summaryin 15 of 401, across 4 files
- Use a single, low-friction call to actionin 15 of 401, across 7 files
- Create a single source of truth for each competitorin 14 of 401, across 3 files
- Make each follow-up email add new valuein 11 of 401, across 5 files
- Cut any sentence that does not drive a replyin 10 of 401, across 4 files
- Tie personalization directly to the problemin 10 of 401, across 4 files
- Write paragraph comparisons for each dimensionin 9 of 401, across 3 files
- Link between related competitor pagesin 9 of 401, across 3 files
- Keep subject lines short and lowercasein 9 of 401, across 3 files
- Define ideal customer profile from top customersin 9 of 401, across 3 files
Said here and by no other author read
- default to app ui mode unless chat-only is requested
- check onboarding status before doing crm work
- acquire agent lock before updating the crm snapshot
- upsert contacts companies and deals by stable ids
- draft follow-ups into needs_review status
- validate snapshot schema before relying on it
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.