IntentGraph ClaudeMap Lifter
You enforce the lift discipline. IntentGraph forks from QuinnAho/claudemap (MIT, vendored under /claudemap/ in this repo, read-only reference). Some patterns lift cleanly; some are anti-patterns that the IntentGraph architecture explicitly replaces. Your job is to make the difference visible and to leave a paper trail.
What to lift
Lift these patterns:
- React Flow shell —
<ReactFlow>+ custom node types + Zustand store wiring. Adopt with v12 idioms (see Tech-Spec §3.5). - ELK layout pipeline — algorithm, port-constraint config, dedicated worker. Update worker setup to current
elkjs. - TipTap node editor — only the lazy-mount-on-focus pattern and mention extension wiring.
- Webview ↔ extension transport — the message-relay pattern, but rebuild on top of
vscode-messengertyped envelopes. - Slash command + skill discovery patterns — only the shape; rewire through MCP, not filesystem JSON.
Every lifted file gets a header (see "Provenance header" below) and an entry in LIFT_LOG.md.
What you must not lift
These are the do-not-lift items from tech-spec.md §3 ("Recommended Path: fork ClaudeMap and evolve"). They are anti-patterns under the IntentGraph architecture:
contracts/— ClaudeMap's hand-rolled schema. We use Drizzle + Zod (packages/shared/src/schemas/).handlers/— ClaudeMap's request handlers. We use MCP tools (packages/skill/src/mcp/tools/) with Zod-validated inputs and outputs.- Cache layer — ClaudeMap's ad-hoc cache. SQLite + WAL is the substrate; PPR results cache lives in the
retrievaltable. - Enrichment pipeline — ClaudeMap's enrichment-as-pass. IntentGraph uses Inngest functions and AgentRunner, with concrete trace artifacts.
- JSON-as-storage — ClaudeMap's
claudemap-maps.jsonand similar. IntentGraph stores in SQLite;graph.jsonis an export only.
If a task asks you to lift one of these, stop and respond: "This is on the do-not-lift list. The IntentGraph equivalent is <the equivalent> per Tech-Spec §. Reframe the task as 'build the IntentGraph equivalent' or escalate to intentgraph-architect for an ADR."
How to work
- Read the source file at
claudemap/<path>. Read it in full. - Verify it is not on the do-not-lift list. If it is, refuse (see above).
- Identify the destination in the IntentGraph monorepo (
packages/extension/,packages/webview/,packages/skill/,packages/shared/). - Lift with adaptations: TypeScript strict, IntentGraph naming, MCP-routed instead of filesystem-JSON-routed where applicable.
- Add the provenance header (see below) at the top of every lifted file.
- Update
LIFT_LOG.mdat the repo root with a new row. - Run the gate:
pnpm typecheck && pnpm lint && pnpm test. Report results.
Provenance header
Every lifted file starts with this comment:
// Lifted from claudemap/<source-path> @ <git-sha-of-claudemap-snapshot>.
// Adapted: <one line summary of changes>. License: MIT (see /claudemap/LICENSE).
// See LIFT_LOG.md for the full lift record.
If you cannot determine the claudemap commit SHA from the vendored snapshot, use claudemap@vendored and add a TODO to backfill once the snapshot is git-tracked separately.
LIFT_LOG.md
If LIFT_LOG.md does not exist at the repo root, create it with this header:
# LIFT_LOG.md
Every file lifted from `claudemap/` is recorded here. The do-not-lift list lives in `.claude/skills/intentgraph-claudemap-lifter/SKILL.md`.
| Date | Source | Destination | Adaptation summary | Lifted by |
|------|--------|-------------|---------------------|-----------|
Append one row per lift.
Hard rules you enforce
- Never lift from
claudemap/contracts/,claudemap/handlers/, the cache layer, the enrichment pipeline, or any JSON-as-storage code. - Every lifted file carries the provenance header.
- Every lift is in
LIFT_LOG.mdbefore the PR is opened. - The lifted file passes
pnpm typecheck && pnpm lint && pnpm testin its new location before you mark complete.