Learn project
Scan project code to detect patterns, dependencies, and conventions. Propose domain rules based on what the code actually does.From its SKILL.md
npx -y skills add luiseiman/dotforge --skill learn-projectAssembled 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 1 credential source: `~/.ssh/config`.
- 8 stars8 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 8 commands, including `grep -rh "^import \|^from " --include="*.py" . 2>/dev/null | sed 's/import //;s/from //;s/ .*//' | sort | uniq -c | sort -rn | head -20` and 7 more.
SKILL.md
6.9 KB, ~1.9k tokens by cl100k_base, as published. Nobody here has run it
Learn Project
Scan the current project's source code to detect patterns, classify tooling, and propose domain rules. Unlike /forge domain extract (which reads dotforge's internal memory), this skill reads the CODE directly.
Step 1: Detect dependency files
Read whichever exist (skip missing):
package.json— extractdependencies+devDependencieskeyspyproject.toml— extract[project.dependencies]and[tool.*]sectionsrequirements.txt— read all linesgo.mod— extractrequireblockPodfile— read all linesGemfile— read all linespom.xml/build.gradle/build.gradle.kts— extract dependency declarations
Collect a flat list of dependency names.
Step 2: Scan imports
Find the top 20 most-imported libraries across the codebase:
# Python
grep -rh "^import \|^from " --include="*.py" . 2>/dev/null | sed 's/import //;s/from //;s/ .*//' | sort | uniq -c | sort -rn | head -20
# TypeScript/JavaScript
grep -rh "from ['\"]" --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" . 2>/dev/null | sed "s/.*from ['\"]//;s/['\"].*//" | grep -v '^\.' | sort | uniq -c | sort -rn | head -20
# Go
grep -rh "\"" --include="*.go" . 2>/dev/null | grep -E '^\s+"' | sed 's/.*"//;s/".*//' | sort | uniq -c | sort -rn | head -20
# Swift
grep -rh "^import " --include="*.swift" . 2>/dev/null | sed 's/import //' | sort | uniq -c | sort -rn | head -20
Step 3: Scan project structure
# Directory structure (2 levels deep, ignore hidden/vendor)
find . -maxdepth 2 -type d ! -path '*/\.*' ! -path '*/node_modules*' ! -path '*/.venv*' ! -path '*/vendor*' ! -path '*/__pycache__*' | sort
# Config files present
ls -1 .eslintrc* .prettierrc* ruff.toml pyproject.toml tsconfig.json biome.json jest.config* vitest.config* vite.config* webpack.config* Makefile Dockerfile docker-compose* .env.example 2>/dev/null
Step 4: Classify patterns
From Steps 1-3, classify into categories. Only report categories with HIGH CONFIDENCE (direct evidence in code):
ORM/Database:
- SQLAlchemy (import sqlalchemy, from sqlalchemy)
- Prisma (@prisma/client)
- TypeORM (import { Entity } from "typeorm")
- GORM (gorm.io/gorm)
- Supabase (@supabase/supabase-js, supabase-py)
- Raw SQL (psycopg2, pg, mysql2)
Auth:
- JWT (python-jose, jsonwebtoken, @auth/core)
- OAuth (authlib, passport, next-auth)
- Session-based (express-session, flask-session)
- Supabase Auth (@supabase/auth-helpers)
Test framework:
- pytest, vitest, jest, mocha, go test, XCTest
- Detect test directory: tests/, tests/, spec/, test/
Build system:
- Vite, webpack, esbuild, rollup, turbopack
- setuptools, poetry, hatch
- Make (Makefile targets)
API framework:
- FastAPI, Express, Koa, Fastify, Gin, Echo, Fiber
- REST vs GraphQL (detect graphql imports/schema files)
State management:
- Zustand, Redux, MobX, Recoil, Jotai
- SwiftUI @Observable, @State, @Binding
Deployment:
- Docker (Dockerfile, docker-compose)
- Serverless (serverless.yml, sam template)
- Cloud Run (app.yaml, cloudbuild.yaml)
- Vercel (vercel.json)
- VPS/SSH (grep shell scripts and CI for
ssh/scp/rsynctargeting a host — see Step 4b)
Step 4b: Scan for remote-host usage (SSH/VPS)
Extract remote-host deployment info from shell scripts, Makefiles, and CI:
# Find ssh/scp/rsync invocations in project scripts and CI
grep -rEn "(^|[^a-z])(ssh|scp|rsync) [^|&;]*(@|--[a-z-]+=)" \
--include="*.sh" --include="Makefile" --include="*.mk" \
--include="*.yml" --include="*.yaml" --include="*.toml" \
. 2>/dev/null | head -30
# Also check ~/.ssh/config for host aliases that might match the project
test -f ~/.ssh/config && awk '/^Host /{h=$2} /HostName/{print h" -> "$2}' ~/.ssh/config 2>/dev/null
From the matches, extract:
- Host (alias from
~/.ssh/configor rawuser@host) - User (before
@) - IdentityFile (from
~/.ssh/configor-iflag in the command) - Remote path (argument after
:in scp/rsync, or inside quoted remote command) - Command pattern (what
ssh host '...'runs — deploy, restart, health check, log tail)
If any match found, this project needs the vps-ssh stack. Flag it in the proposal and generate .claude/rules/domain/infra.md with the extracted fields. NEVER paste private key content into the rule — only reference the IdentityFile path.
Naming conventions:
# Function naming: snake_case vs camelCase
grep -rh "def [a-z]" --include="*.py" . 2>/dev/null | head -5 # snake_case
grep -rh "function [a-z]" --include="*.ts" --include="*.js" . 2>/dev/null | head -5 # camelCase
Step 5: Present proposals
Show detected patterns grouped by category. For each, propose a domain rule:
═══ /forge learn — [project-name] ═══
Detected patterns (high confidence only):
1. ORM: SQLAlchemy 2.x (async sessions detected in 8 files)
Proposed rule: .claude/rules/domain/orm-patterns.md
Content: async session lifecycle, model conventions, migration patterns
→ Create? [approve/skip/edit]
2. Auth: Supabase Auth (auth-helpers in 4 files)
Proposed rule: .claude/rules/domain/auth-flow.md
Content: session management, RLS policies, token refresh
→ Create? [approve/skip/edit]
3. Testing: vitest (vitest.config.ts found, 23 test files)
Proposed rule: .claude/rules/domain/testing.md
Content: test patterns, mock conventions, coverage targets
→ Create? [approve/skip/edit]
4. Naming: snake_case (Python), camelCase (TypeScript)
Proposed rule: .claude/rules/domain/naming.md
Content: per-language conventions detected
→ Create? [approve/skip/edit]
Wait for user approval on each before creating files.
Step 6: Generate approved rules
For each approved proposal, create a rule file in .claude/rules/domain/:
---
globs: "<relevant file patterns>"
description: "<what this rule covers>"
domain: "<project-name>"
last_verified: "<today YYYY-MM-DD>"
source: "/forge learn"
---
# <Title>
<Factual observations from the scan — imperative mood, concise>
Rules must be:
- Under 40 lines
- Factual (observed in code, not assumed)
- Actionable (tell Claude what to do, not what exists)
- English only
Step 7: Report summary
═══ Learn complete ═══
Scanned: <N> dependency files, <N> imports, <N> config files
Detected: <N> patterns across <N> categories
Created: <N> domain rules in .claude/rules/domain/
Skipped: <N> proposals
Tip: run /forge domain extract to capture session-learned knowledge too.
What this skill does NOT do
- Does not read dotforge memory, errors, or agent memory (use
/forge domain extractfor that) - Does not modify existing rules (only creates new ones in domain/)
- Does not run any code or install dependencies
- Does not guess — only reports patterns with direct evidence in the codebase
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most learn study skills give in ~1.9k tokens
Counted across 545 of the 593 authors here whose files we hold, read 2026-09-06
- Treat the current directory as a teaching workspacein 20 of 545, across 17 files
- Teach knowledge first then practice skillsin 19 of 545, across 16 files
- Design lessons which build long-term retentionin 15 of 545, across 12 files
- Save each lesson as a self-contained HTML filein 15 of 545, across 12 files
- Question the user on why they want to learn thisin 15 of 545, across 12 files
- Reuse components from the assets directoryin 14 of 545, across 11 files
- Never trust your parametric knowledgein 13 of 545, across 10 files
- Record user preferences in NOTES.mdin 11 of 545, across 8 files
- Ground all teaching in the MISSION.md documentin 11 of 545, across 8 files
- Save each lesson to the lessons directoryin 8 of 545
- Question the user if the mission is unclearin 7 of 545
- Gather primary sources onlyin 7 of 545, across 4 files
Said here and by no other author read
- Scan dependency files for names
- Find top imported libraries
- Scan project structure and configs
- Scan for remote host usage
- Present proposals for domain rules
- Generate approved rule files
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.