Thank you for your interest in contributing to Forge! This guide covers general development workflow and skill contribution.
- Getting Started
- Project Structure
- Development Workflow
- Contributing a Skill
- Security Rules
- Pull Request Process
- Code Style
- Go 1.25 or later
- golangci-lint v2.10+
- Git
git clone https://github.com/initializ/forge.git
cd forge
cd forge-cli && go build ./... && cd ..cd forge-core && go test ./... && cd ..
cd forge-cli && go test ./... && cd ..
cd forge-plugins && go test ./... && cd ..
cd forge-skills && go test ./... && cd ..Forge is a multi-module Go workspace:
| Module | Purpose |
|---|---|
forge-core/ |
Core library — registry, tools, security, channels, LLM |
forge-cli/ |
CLI commands, TUI wizard, runtime |
forge-plugins/ |
Channel plugins (Telegram, Slack), markdown converter |
forge-skills/ |
Skill parser, compiler, analyzer, trust, embedded skills |
Skills live in two locations:
- Embedded skills —
forge-skills/local/embedded/(bundled in the binary) - Project skills —
skills/in the user's working directory
- Fork the repository and clone your fork
- Create a feature branch from
main:git checkout -b feature/my-feature main
- Make your changes in the relevant module(s)
- Format and lint:
gofmt -w forge-core/ forge-cli/ forge-plugins/ forge-skills/ golangci-lint run ./forge-core/... golangci-lint run ./forge-cli/... golangci-lint run ./forge-plugins/... golangci-lint run ./forge-skills/...
- Run tests for affected modules
- Commit with a clear message and open a pull request against
main
cp -r forge-skills/local/embedded/_template skills/my-skillOpen skills/my-skill/SKILL.md and fill in:
name— Kebab-case identifier matching the directory namedescription— One-line summary of what the skill doescategory(optional) — e.g.sre,research,ops,dev,securitytags(optional) — Discovery keywordsrequires.bins— Binaries that must be in PATHrequires.env— Environment variables (required, one_of, optional)egress_domains— Network domains the skill contacts (supports$VARsubstitution)denied_tools(optional) — Tools the skill must NOT usetimeout_hint(optional) — Suggested timeout in seconds
Add ## Tool: tool_name sections documenting each tool with input/output tables.
If your skill is script-backed, add executable scripts to scripts/. Tool name underscores become hyphens in the filename: tool my_search maps to scripts/my-search.sh.
If your skill is binary-backed, delete the scripts/ directory and list the binary in requires.bins.
forge skills validate
forge skills auditFix any errors or warnings before submitting.
Run your skill locally and verify:
- Tools execute correctly with expected input
- Output matches the documented format
- Error cases are handled gracefully
- Egress domains are accurate and minimal
Follow the Pull Request Process below.
All contributions must follow these security requirements:
- Egress allowlist — Every network domain a skill contacts must be listed in
egress_domains. No wildcard domains. - Minimal permissions — Request only the environment variables and binaries actually needed.
- No secrets in code — Never hardcode API keys, tokens, or credentials. Use
requires.envto declare them. - Read-only by default — Skills should avoid mutating external state unless explicitly required and documented.
- Tool restrictions — If a skill should not use certain tools (e.g.
http_requestwhen usingcli_execute), declare them indenied_tools.
Use forge skills audit to check your skill against the default security policy. Use forge skills trust-report <name> to review full metadata.
- Branch from
main— never push directly tomain - Ensure all tests pass for affected modules
- Run
gofmtandgolangci-lintwith no errors - For skill contributions, include
forge skills validateandforge skills auditoutput - Fill out the PR template completely
- Request review from a maintainer
Use clear, descriptive commit messages:
Add tavily-research skill with async polling
Fix egress domain validation for env var substitution
- Follow standard Go conventions (
gofmt,go vet) - Use
golangci-lintwith the project configuration - Keep functions focused and testable
- Add tests for new functionality
- Document exported types and functions