AI-Native Development Workflow Engine
Project description
Forge — Compliance Agent for AI-Assisted Development
Forge is a compliance agent for teams building software with AI code editors (Claude Code, Cursor, Copilot, Windsurf). It does not write code, plan features, or generate scaffolding — your AI editor already does that better. What Forge does is keep the editor in check: it captures your stack decisions, standards, patterns, and regulatory constraints in one place, and delivers them to the editor through the files it already reads (CLAUDE.md, .claude/skills/, .cursorrules, etc.).
The editor decides what to build and how. Forge enforces the rules that must hold.
⚠️ Alpha (0.x) — commands and file layouts may still change between releases.
What Forge actually does
- Captures project-level decisions in
.forge/context.yaml(cloud, stack, database, auth, IaC, regulatory). - Detects the stack of an existing repo from
package.json,pyproject.toml,main.bicep,docker-compose.yml,.github/workflows/, etc. Anything it can't detect is markedunspecifiedso the AI editor can fill it in. - Ships opinionated standards (security, observability, type-safety, api-first, microservice-packaging) that get injected into
CLAUDE.md. - Generates
CLAUDE.md, a Claude Code skill, and a discovery prompt from all of the above. Every session of your AI editor reads this automatically. - Maintains a
.forge/journal.mdwhere the AI editor appends project-specific learnings across sessions. - Validates everything is internally consistent with a single
forge checkcommand. - Normalizes a requirement document (PRD, user story, conversation) into a structured brief via
forge intake.
What Forge does NOT do
- Plan features or produce implementation plans. That is Claude's job.
- Write or scaffold code, infrastructure, migrations, auth flows, or tests.
- Run code audits by itself. Your editor reads the standards from
CLAUDE.mdand checks files as it edits them. - Call LLMs. Forge is pure Python and file I/O; the intelligence is in your editor.
- Replace
~/.claude/CLAUDE.mdglobal preferences. Forge only owns per-project files.
Installation
Forge is published on PyPI as forge-dev. The recommended way is uv, which manages its own Python and isolates CLI tools automatically:
curl -LsSf https://astral.sh/uv/install.sh | sh # one-time: install uv
uv tool install forge-dev
forge --version
Alternatives: pipx, pip, or from source
pipx install forge-dev
# or
pip install forge-dev
# or
git clone https://github.com/luiskcr/forge.git && cd forge && pip install -e ".[dev]"
Requires Python ≥ 3.11. If you use uv, it will download a compatible Python automatically.
Updating
uv tool upgrade forge-dev # or: pipx upgrade forge-dev / pip install --upgrade forge-dev
Note for macOS users on Tahoe (macOS 26): the Homebrew bottles for
python@3.13/python@3.14currently ship a brokenpyexpatmodule that breakspip,pipx, andvenv. If you hitSymbol not found: _XML_SetAllocTrackerActivationThreshold, useuv— it bundles its own Python and avoids the issue.
The 3 commands
| Command | What it does |
|---|---|
forge init |
Create or refresh the project. Detects stack, generates CLAUDE.md, .claude/skills/forge/SKILL.md, and — if anything is unclear — a .forge/discovery_prompt.md the editor uses to fill in the gaps. |
forge check |
Validate current state. Reports context completeness, brief ↔ context consistency, and registry health. Exits non-zero on critical issues. |
forge intake <file> |
Turn a requirement document into .forge/intake_prompt.md. The prompt tells the AI editor to produce .forge/brief.yaml in the required schema, cross-checking it against .forge/context.yaml. |
That's the whole surface. Everything else is file-based: edit .forge/context.yaml, .forge/brief.yaml, .forge/journal.md, or ~/.forge/user/standards/*.yaml with your editor's Write/Edit tool, then run forge init to refresh CLAUDE.md.
Typical flow
# 1. In a brand-new project
mkdir my-app && cd my-app
forge init
# → asks a few questions (mission, type, cloud, IaC, ...) if this is a greenfield repo
# → creates .forge/, CLAUDE.md, .claude/skills/forge/SKILL.md
# 2. In an existing project
cd existing-repo
forge init
# → detects backend/frontend/cloud/database/auth/IaC/CI-CD from config files
# → writes .forge/discovery_prompt.md listing fields it could not detect
# → open Claude Code / Cursor and ask it to "resolve the Forge discovery prompt"
# the editor reads .forge/discovery_prompt.md, explores the repo, edits
# .forge/context.yaml directly, and runs forge init to refresh CLAUDE.md
# 3. You have a requirement doc
forge intake requirements.md
# → writes .forge/intake_prompt.md for the AI editor
# → the editor produces .forge/brief.yaml (YAML matching the ForgeBrief schema)
# → run forge check to validate it against context
# 4. Before every commit / at the end of a session
forge check
# ✓ context — all fields resolved
# ✓ brief — consistent with context
# ✓ standards — 5 core, 2 user
# All good.
How the editor knows about Forge
When you run forge init, two files are written that your AI editor reads automatically:
CLAUDE.mdat the repo root — contains the full set of standards, stack rules, patterns, journal entries, and self-audit instructions. Claude Code reads this at the start of every session..claude/skills/forge/SKILL.md— a Claude Code skill that fires whenever the editor is about to write or modify code. It tells the editor: readCLAUDE.md, respect every rule, append learnings to.forge/journal.md, and runforge checkbefore declaring work complete.
Your editor does not need any new tool or MCP server to use Forge — it just reads the files Forge writes.
Repository layout Forge creates
project/
├── CLAUDE.md ← editor instructions (do not edit manually)
├── .claude/skills/forge/SKILL.md ← Claude Code skill
└── .forge/
├── context.yaml ← stack, cloud, auth, regulatory decisions
├── brief.yaml ← (optional) normalized requirement
├── journal.md ← project-specific learnings the editor appends
├── discovery_prompt.md ← (appears when fields are unresolved)
├── intake_prompt.md ← (appears after forge intake)
└── overrides/
└── README.md ← drop project-specific standard overrides here
And globally:
~/.forge/
├── core/standards/ ← standards shipped with the installed forge_dev wheel
└── user/
├── config.yaml ← your personal defaults (all `unspecified` until you set them)
├── standards/*.yaml ← standards you've added manually
├── patterns/*.yaml ← approved patterns
├── anti-patterns/*.yaml ← prohibited patterns
└── mcps.yaml ← your MCP registry
MCP server (experimental)
Forge also exposes an MCP server mirroring the CLI, so editors that speak MCP can invoke Forge operations as tools:
python -m mcp_server.server
The MCP surface is currently larger than the CLI (it exposes the old commands too). A minimal 3-tool version matching the CLI surface is on the roadmap.
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file forge_dev-0.2.0.tar.gz.
File metadata
- Download URL: forge_dev-0.2.0.tar.gz
- Upload date:
- Size: 62.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
692c244d8785e54bcde2e84c9cb44e14bea8b504a27625c82fe3ef6094c351a8
|
|
| MD5 |
6576731536fd8f22300be6a947c1ed1d
|
|
| BLAKE2b-256 |
e44dbe6622f165588f819ed298b71efc49f5a62949f925507270c3ffb131ebba
|
Provenance
The following attestation bundles were made for forge_dev-0.2.0.tar.gz:
Publisher:
publish.yml on luiskcr/forge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
forge_dev-0.2.0.tar.gz -
Subject digest:
692c244d8785e54bcde2e84c9cb44e14bea8b504a27625c82fe3ef6094c351a8 - Sigstore transparency entry: 1280429552
- Sigstore integration time:
-
Permalink:
luiskcr/forge@2c15e2c64e01b4b1856a5a60e25696f355256a0b -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/luiskcr
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2c15e2c64e01b4b1856a5a60e25696f355256a0b -
Trigger Event:
release
-
Statement type:
File details
Details for the file forge_dev-0.2.0-py3-none-any.whl.
File metadata
- Download URL: forge_dev-0.2.0-py3-none-any.whl
- Upload date:
- Size: 64.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a0ace8a3323c498e9f2aade875cdbe4641c29f9bdd2ddeaffe75434b70e894d2
|
|
| MD5 |
d258b873e43afff307261fa96d68368a
|
|
| BLAKE2b-256 |
24f8125fa7fb6d8e8527234bd0f6a55823ae98e746660dd21685789deffd839e
|
Provenance
The following attestation bundles were made for forge_dev-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on luiskcr/forge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
forge_dev-0.2.0-py3-none-any.whl -
Subject digest:
a0ace8a3323c498e9f2aade875cdbe4641c29f9bdd2ddeaffe75434b70e894d2 - Sigstore transparency entry: 1280429639
- Sigstore integration time:
-
Permalink:
luiskcr/forge@2c15e2c64e01b4b1856a5a60e25696f355256a0b -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/luiskcr
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2c15e2c64e01b4b1856a5a60e25696f355256a0b -
Trigger Event:
release
-
Statement type: