From career
One-shot migration between CRM backends. Markdown → Airtable, markdown → Attio, Airtable → markdown, Attio → markdown, or Airtable ↔ Attio. Use when first adopting an external CRM, when leaving one, or when swapping providers. Snapshot-style, not incremental.
npx claudepluginhub danielrosehill/claude-code-plugins --plugin careerThis skill is limited to using the following tools:
The migration tool. The adapter skills (`crm-adapter-airtable`, `crm-adapter-attio`) are for ongoing two-way sync — this skill is the one-time copy. Always snapshots the source and writes a migration log.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
The migration tool. The adapter skills (crm-adapter-airtable, crm-adapter-attio) are for ongoing two-way sync — this skill is the one-time copy. Always snapshots the source and writes a migration log.
$ARGUMENTS:
--from=<markdown|airtable|attio> and --to=<markdown|airtable|attio>.--dry-run.--object=<companies|opportunities|outreach|all> — default all./career:crm-migrate --from=markdown --to=airtable
/career:crm-migrate --from=attio --to=markdown # leaving Attio
/career:crm-migrate --from=airtable --to=attio # swap providers
Always copy the source state first.
crm/ → ${WORKING_FOLDER}/cache/crm-snapshot-<date>.tar.${WORKING_FOLDER}/cache/<source>-snapshot-<date>.json.Use the field mappings from the relevant adapter SKILL.md. For unmappable fields (e.g. moving from Attio's free-form Notes to markdown row notes column), concatenate with \n---\n and put in a single column.
Show:
--dry-run stops here.
Write to destination. For external CRMs, prefer the adapter's create-by-slug path so re-running is idempotent.
For markdown destinations: write tables in the canonical layout. Preserve any existing rows the migration didn't touch (don't clobber a markdown CRM the user was already curating).
Write ${WORKING_FOLDER}/crm/.migration-<date>.md:
# CRM migration — {{date}}
- from: {{source}}
- to: {{dest}}
- objects: {{which}}
- snapshot: cache/<...>
- migrated: {{counts}}
- skipped: {{counts + reasons}}
- lossy fields: {{list}}
migrated: companies=<n> opportunities=<n> outreach=<n>
skipped: <n> (see log)
snapshot: cache/<source>-snapshot-<date>.<ext>
log: crm/.migration-<date>.md