Domain Extract
Analyze existing project sources to propose domain knowledge rules for approval.
Dispatch
Based on $ARGUMENTS after "domain":
domain extract→ Step 1-5 (full extraction)domain list→ Step 6 (list only)domain sync-vault→ Step 7 (vault sync only)
Step 1: Gather sources
Read these project sources (skip any that don't exist):
- CLAUDE.md — sections below
<!-- forge:custom -->(user-written content) - Auto-memory — resolve the project's memory directory:
- Compute project path hash: the memory lives in
~/.claude/projects/-<path-with-dashes>/memory/ - Read MEMORY.md index, then read each linked memory file
- Filter: keep only entries with business/domain content (not purely technical)
- Compute project path hash: the memory lives in
- CLAUDE_ERRORS.md — read all entries. Flag errors where the root cause is "Claude didn't know X about the business"
- Agent memory — read
.claude/agent-memory/implementer/*.mdand.claude/agent-memory/architect/*.md- Filter: keep domain-relevant learnings (business logic, API behavior, deployment procedures)
- Existing rules — read all
.claude/rules/*.md. Identify files that mix domain + technical content - Git log — run
git log --oneline -50to identify domain-related commits (keywords: fix, deploy, API, auth, config)
Step 2: Classify findings
For each piece of domain knowledge found, classify:
- Category: deploy, api-integration, business-logic, data-model, auth-flow, external-service, workflow
- Source: which file(s) it came from
- Confidence: high (explicit in CLAUDE.md/rules), medium (in memory/errors), low (inferred from git)
- Overlap: does it duplicate existing
.claude/rules/domain/*.mdcontent?
Discard:
- Pure technical patterns (import order, test fixtures, lint rules)
- Already covered by existing domain rules
- One-time fixes that won't recur
Step 3: Generate proposals
Group findings by category. For each group, propose a domain rule file:
═══ DOMAIN EXTRACT ═══
Project: {{project_name}}
Sources analyzed: {{count}}
Existing domain rules: {{count in .claude/rules/domain/}}
── PROPOSED DOMAIN RULES ──
{{number}}. {{filename}}.md (from: {{sources}})
globs: {{suggested glob patterns}}
Content preview:
"{{3-5 line summary of what the rule will contain}}"
→ Create? (y/n/edit)
Also propose a Role section if CLAUDE.md doesn't have ## Role yet:
── ROLE SECTION ──
Detected role from project context:
"{{proposed role description}}"
→ Add to CLAUDE.md ## Role? (y/n/edit)
And a Domain section if CLAUDE.md doesn't have ## Domain yet:
── DOMAIN SECTION ──
Detected domain context:
"{{proposed domain summary}}"
→ Add to CLAUDE.md ## Domain? (y/n/edit)
Step 4: Wait for user approval
STOP and WAIT for the user to respond to each proposal (y/n/edit).
If the user says "edit", ask what to change and regenerate that specific proposal. If the user says "all", approve all proposals.
Step 5: Create approved files
For each approved domain rule:
- Create
.claude/rules/domain/directory if not exists - Write the file with frontmatter:
--- globs: "{{patterns}}" description: "{{one-line description}}" domain: {{category}} last_verified: {{today YYYY-MM-DD}} --- - Content: imperative mood, concise facts, <40 lines per file
- All content in English (Claude-consumed content rule)
For approved Role/Domain sections:
- Read current CLAUDE.md
- If
## Rolemarker exists, replace content. If not, add section before## Arquitectura - If
## Domainmarker exists, replace content. If not, add section after## Role
Show summary:
═══ DOMAIN EXTRACT — DONE ═══
Created: {{N}} domain rules in .claude/rules/domain/
Updated: CLAUDE.md (Role: ✓/✗, Domain: ✓/✗)
Total domain knowledge: {{N}} files
Step 6: Domain list (for /forge domain list)
List all files in .claude/rules/domain/ with metadata:
═══ DOMAIN RULES ═══
File Domain Globs Last Verified Status
─────────────────────────────────────────────────────────────────────────────────
ratios.md trading **/*ratio*,**/*price* 2026-03-15 ⚠ stale (>90d)
deploy-vps.md infra **/*deploy*,docker-compose* 2026-03-25 ✓ current
jira-api.md jira **/*jira*,**/*issue* 2026-03-20 ✓ current
Status rules:
✓ current— last_verified within 90 days⚠ stale— last_verified older than 90 days✗ no date— missing last_verified field
If no .claude/rules/domain/ exists: "No domain rules found. Run /forge domain extract to generate from existing sources."
Step 7: Vault sync (for /forge domain sync-vault)
For each file in .claude/rules/domain/ that has domain_source: vault://... in frontmatter:
- Resolve path: replace
vault://with~/vault/ - Read the vault note at that path
- Compare key facts in the vault note vs the domain rule
- If differences found:
══ VAULT SYNC ══ File: ratios.md Source: vault://decisions/ratio-engine.md Changes detected: + New: "ONs use factor 0.001 for sub-peso bonds" ~ Changed: exit ratio now uses mid-price, not ask → Update domain rule? (y/n/edit) - If approved: update the domain rule content, set
last_verifiedto today - If vault note not found: warn and skip
If no files have domain_source: "No vault-linked domain rules found. Add domain_source: vault://path to a domain rule frontmatter to enable sync."
Constraints
- NEVER auto-create files without user approval — always show proposals first
- Domain rules go in
.claude/rules/domain/, never in.claude/rules/root - All generated content must be in English (Claude-consumed)
- Keep each domain rule file under 40 lines
- Frontmatter fields: globs (required), description (required), domain (required), last_verified (required), domain_source (optional)
- If a project has no meaningful domain knowledge in its sources, say so honestly — don't generate empty placeholder files