mirror of
https://github.com/FuzzingLabs/fuzzforge_ai.git
synced 2026-03-15 16:56:13 +00:00
Compare commits
1 Commits
fix/module
...
fix/fuzzfo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9e7c56ec09 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -8,8 +8,5 @@
|
|||||||
.vscode
|
.vscode
|
||||||
__pycache__
|
__pycache__
|
||||||
|
|
||||||
# Build artifacts
|
|
||||||
**/build/
|
|
||||||
|
|
||||||
# Podman/Docker container storage artifacts
|
# Podman/Docker container storage artifacts
|
||||||
~/.fuzzforge/
|
~/.fuzzforge/
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Contributing to FuzzForge OSS
|
# Contributing to FuzzForge AI
|
||||||
|
|
||||||
Thank you for your interest in contributing to FuzzForge OSS! We welcome contributions from the community and are excited to collaborate with you.
|
Thank you for your interest in contributing to FuzzForge AI! We welcome contributions from the community and are excited to collaborate with you.
|
||||||
|
|
||||||
**Our Vision**: FuzzForge aims to be a **universal platform for security research** across all cybersecurity domains. Through our modular architecture, any security tool—from fuzzing engines to cloud scanners, from mobile app analyzers to IoT security tools—can be integrated as a containerized module and controlled via AI agents.
|
**Our Vision**: FuzzForge aims to be a **universal platform for security research** across all cybersecurity domains. Through our modular architecture, any security tool—from fuzzing engines to cloud scanners, from mobile app analyzers to IoT security tools—can be integrated as a containerized module and controlled via AI agents.
|
||||||
|
|
||||||
@@ -360,8 +360,8 @@ Beyond modules, you can contribute to FuzzForge's core components.
|
|||||||
|
|
||||||
1. **Clone and Install**
|
1. **Clone and Install**
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/FuzzingLabs/fuzzforge-oss.git
|
git clone https://github.com/FuzzingLabs/fuzzforge-ai.git
|
||||||
cd fuzzforge-oss
|
cd fuzzforge-ai
|
||||||
uv sync --all-extras
|
uv sync --all-extras
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -538,7 +538,7 @@ Before submitting a new module:
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
By contributing to FuzzForge OSS, you agree that your contributions will be licensed under the same license as the project (see [LICENSE](LICENSE)).
|
By contributing to FuzzForge AI, you agree that your contributions will be licensed under the same license as the project (see [LICENSE](LICENSE)).
|
||||||
|
|
||||||
For module contributions:
|
For module contributions:
|
||||||
- Modules you create remain under the project license
|
- Modules you create remain under the project license
|
||||||
|
|||||||
89
Makefile
89
Makefile
@@ -1,17 +1,10 @@
|
|||||||
.PHONY: help install sync format lint typecheck test build-modules build-modules-sdk build-modules-images clean
|
.PHONY: help install sync format lint typecheck test build-modules clean
|
||||||
|
|
||||||
SHELL := /bin/bash
|
SHELL := /bin/bash
|
||||||
|
|
||||||
# Container image configuration
|
|
||||||
SDK_DIR := fuzzforge-modules/fuzzforge-modules-sdk/
|
|
||||||
MODULE_TEMPLATE := fuzzforge-modules/fuzzforge-module-template/
|
|
||||||
SDK_VERSION := $(shell scripts/pyproject-version.sh $(SDK_DIR)pyproject.toml)
|
|
||||||
BASE_IMG_PREFIX := $(if $(filter podman,$(FUZZFORGE_ENGINE)),localhost/,)
|
|
||||||
SDK_IMG := $(BASE_IMG_PREFIX)fuzzforge-modules-sdk:$(SDK_VERSION)
|
|
||||||
|
|
||||||
# Default target
|
# Default target
|
||||||
help:
|
help:
|
||||||
@echo "FuzzForge OSS Development Commands"
|
@echo "FuzzForge AI Development Commands"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo " make install - Install all dependencies"
|
@echo " make install - Install all dependencies"
|
||||||
@echo " make sync - Sync shared packages from upstream"
|
@echo " make sync - Sync shared packages from upstream"
|
||||||
@@ -20,8 +13,6 @@ help:
|
|||||||
@echo " make typecheck - Type check with mypy"
|
@echo " make typecheck - Type check with mypy"
|
||||||
@echo " make test - Run all tests"
|
@echo " make test - Run all tests"
|
||||||
@echo " make build-modules - Build all module container images"
|
@echo " make build-modules - Build all module container images"
|
||||||
@echo " make build-modules-sdk - Build the SDK base image"
|
|
||||||
@echo " make build-modules-images - Build all module images (requires SDK image)"
|
|
||||||
@echo " make clean - Clean build artifacts"
|
@echo " make clean - Clean build artifacts"
|
||||||
@echo ""
|
@echo ""
|
||||||
|
|
||||||
@@ -39,7 +30,7 @@ sync:
|
|||||||
|
|
||||||
# Format all packages
|
# Format all packages
|
||||||
format:
|
format:
|
||||||
@for pkg in packages/fuzzforge-*/; do \
|
@for pkg in fuzzforge-*/; do \
|
||||||
if [ -f "$$pkg/pyproject.toml" ]; then \
|
if [ -f "$$pkg/pyproject.toml" ]; then \
|
||||||
echo "Formatting $$pkg..."; \
|
echo "Formatting $$pkg..."; \
|
||||||
cd "$$pkg" && uv run ruff format . && cd -; \
|
cd "$$pkg" && uv run ruff format . && cd -; \
|
||||||
@@ -48,7 +39,7 @@ format:
|
|||||||
|
|
||||||
# Lint all packages
|
# Lint all packages
|
||||||
lint:
|
lint:
|
||||||
@for pkg in packages/fuzzforge-*/; do \
|
@for pkg in fuzzforge-*/; do \
|
||||||
if [ -f "$$pkg/pyproject.toml" ]; then \
|
if [ -f "$$pkg/pyproject.toml" ]; then \
|
||||||
echo "Linting $$pkg..."; \
|
echo "Linting $$pkg..."; \
|
||||||
cd "$$pkg" && uv run ruff check . && cd -; \
|
cd "$$pkg" && uv run ruff check . && cd -; \
|
||||||
@@ -57,7 +48,7 @@ lint:
|
|||||||
|
|
||||||
# Type check all packages
|
# Type check all packages
|
||||||
typecheck:
|
typecheck:
|
||||||
@for pkg in packages/fuzzforge-*/; do \
|
@for pkg in fuzzforge-*/; do \
|
||||||
if [ -f "$$pkg/pyproject.toml" ] && [ -f "$$pkg/mypy.ini" ]; then \
|
if [ -f "$$pkg/pyproject.toml" ] && [ -f "$$pkg/mypy.ini" ]; then \
|
||||||
echo "Type checking $$pkg..."; \
|
echo "Type checking $$pkg..."; \
|
||||||
cd "$$pkg" && uv run mypy . && cd -; \
|
cd "$$pkg" && uv run mypy . && cd -; \
|
||||||
@@ -66,47 +57,53 @@ typecheck:
|
|||||||
|
|
||||||
# Run all tests
|
# Run all tests
|
||||||
test:
|
test:
|
||||||
@for pkg in packages/fuzzforge-*/; do \
|
@for pkg in fuzzforge-*/; do \
|
||||||
if [ -f "$$pkg/pytest.ini" ]; then \
|
if [ -f "$$pkg/pytest.ini" ]; then \
|
||||||
echo "Testing $$pkg..."; \
|
echo "Testing $$pkg..."; \
|
||||||
cd "$$pkg" && uv run pytest && cd -; \
|
cd "$$pkg" && uv run pytest && cd -; \
|
||||||
fi \
|
fi \
|
||||||
done
|
done
|
||||||
|
|
||||||
# Build all module container images (SDK first, then modules)
|
# Build all module container images
|
||||||
# Uses Docker by default, or Podman if FUZZFORGE_ENGINE=podman
|
# Uses Docker by default, or Podman if FUZZFORGE_ENGINE=podman
|
||||||
build-modules: build-modules-sdk build-modules-images
|
build-modules:
|
||||||
|
@echo "Building FuzzForge module images..."
|
||||||
|
@if [ "$$FUZZFORGE_ENGINE" = "podman" ]; then \
|
||||||
|
if [ -n "$$SNAP" ]; then \
|
||||||
|
echo "Using Podman with isolated storage (Snap detected)"; \
|
||||||
|
CONTAINER_CMD="podman --root ~/.fuzzforge/containers/storage --runroot ~/.fuzzforge/containers/run"; \
|
||||||
|
else \
|
||||||
|
echo "Using Podman"; \
|
||||||
|
CONTAINER_CMD="podman"; \
|
||||||
|
fi; \
|
||||||
|
else \
|
||||||
|
echo "Using Docker"; \
|
||||||
|
CONTAINER_CMD="docker"; \
|
||||||
|
fi; \
|
||||||
|
sdk_version=$$(grep 'version' "fuzzforge-modules/fuzzforge-modules-sdk/pyproject.toml" 2>/dev/null | head -1 | sed 's/.*"\(.*\)".*/\1/' || echo "0.1.0"); \
|
||||||
|
echo "Building fuzzforge-modules-sdk:$$sdk_version (base image)..."; \
|
||||||
|
$$CONTAINER_CMD build \
|
||||||
|
-t "fuzzforge-modules-sdk:$$sdk_version" \
|
||||||
|
-t "localhost/fuzzforge-modules-sdk:$$sdk_version" \
|
||||||
|
"fuzzforge-modules/fuzzforge-modules-sdk/" || exit 1; \
|
||||||
|
for module in fuzzforge-modules/*/; do \
|
||||||
|
if [ -f "$$module/Dockerfile" ] && \
|
||||||
|
[ "$$module" != "fuzzforge-modules/fuzzforge-modules-sdk/" ] && \
|
||||||
|
[ "$$module" != "fuzzforge-modules/fuzzforge-module-template/" ]; then \
|
||||||
|
name=$$(basename $$module); \
|
||||||
|
version=$$(grep 'version' "$$module/pyproject.toml" 2>/dev/null | head -1 | sed 's/.*"\(.*\)".*/\1/' || echo "0.1.0"); \
|
||||||
|
echo "Building $$name:$$version..."; \
|
||||||
|
$$CONTAINER_CMD build -t "fuzzforge-$$name:$$version" "$$module" || exit 1; \
|
||||||
|
fi \
|
||||||
|
done
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "✓ All modules built successfully!"
|
@echo "✓ All modules built successfully!"
|
||||||
|
|
||||||
# Build the SDK base image (also builds its Python wheel)
|
|
||||||
build-modules-sdk:
|
|
||||||
@source scripts/container-env.sh; \
|
|
||||||
echo "Building wheels for fuzzforge-modules-sdk..."; \
|
|
||||||
(cd "$(SDK_DIR)" && uv build --wheel --out-dir .wheels) || exit 1; \
|
|
||||||
echo "Building $(SDK_IMG)..."; \
|
|
||||||
$$CONTAINER_CMD build -t "$(SDK_IMG)" "$(SDK_DIR)" || exit 1
|
|
||||||
|
|
||||||
# Build all module images (requires SDK image to exist)
|
|
||||||
build-modules-images:
|
|
||||||
@source scripts/container-env.sh; \
|
|
||||||
for module in fuzzforge-modules/*/; do \
|
|
||||||
[ "$$module" = "$(SDK_DIR)" ] && continue; \
|
|
||||||
[ "$$module" = "$(MODULE_TEMPLATE)" ] && continue; \
|
|
||||||
[ -f "$$module/Dockerfile" ] || continue; \
|
|
||||||
name=$$(basename "$$module"); \
|
|
||||||
version=$$(scripts/pyproject-version.sh "$$module/pyproject.toml"); \
|
|
||||||
case $$name in \
|
|
||||||
fuzzforge-*) tag="$$name:$$version" ;; \
|
|
||||||
*) tag="fuzzforge-$$name:$$version" ;; \
|
|
||||||
esac; \
|
|
||||||
echo "Building $$tag..."; \
|
|
||||||
$$CONTAINER_CMD build --build-arg BASE_IMAGE="$(SDK_IMG)" -t "$$tag" "$$module" || exit 1; \
|
|
||||||
done
|
|
||||||
|
|
||||||
# Clean build artifacts
|
# Clean build artifacts
|
||||||
clean:
|
clean:
|
||||||
@for dir in __pycache__ .pytest_cache .mypy_cache .ruff_cache "*.egg-info"; do \
|
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
|
||||||
find . -type d -name "$$dir" -exec rm -rf {} + 2>/dev/null || true; \
|
find . -type d -name ".pytest_cache" -exec rm -rf {} + 2>/dev/null || true
|
||||||
done
|
find . -type d -name ".mypy_cache" -exec rm -rf {} + 2>/dev/null || true
|
||||||
@find . -type f -name "*.pyc" -delete 2>/dev/null || true
|
find . -type d -name ".ruff_cache" -exec rm -rf {} + 2>/dev/null || true
|
||||||
|
find . -type d -name "*.egg-info" -exec rm -rf {} + 2>/dev/null || true
|
||||||
|
find . -type f -name "*.pyc" -delete 2>/dev/null || true
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<h1 align="center"> FuzzForge OSS</h1>
|
<h1 align="center"> FuzzForge AI</h1>
|
||||||
<h3 align="center">AI-Powered Security Research Orchestration via MCP</h3>
|
<h3 align="center">AI-Powered Security Research Orchestration via MCP</h3>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@@ -26,13 +26,13 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
> 🚧 **FuzzForge OSS is under active development.** Expect breaking changes and new features!
|
> 🚧 **FuzzForge AI is under active development.** Expect breaking changes and new features!
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🚀 Overview
|
## 🚀 Overview
|
||||||
|
|
||||||
**FuzzForge OSS** is an open-source runtime that enables AI agents (GitHub Copilot, Claude, etc.) to orchestrate security research workflows through the **Model Context Protocol (MCP)**.
|
**FuzzForge AI** is an open-source runtime that enables AI agents (GitHub Copilot, Claude, etc.) to orchestrate security research workflows through the **Model Context Protocol (MCP)**.
|
||||||
|
|
||||||
### The Core: Modules
|
### The Core: Modules
|
||||||
|
|
||||||
@@ -171,7 +171,7 @@ FuzzForge modules are containerized security tools that AI agents can orchestrat
|
|||||||
|
|
||||||
### Module Ecosystem
|
### Module Ecosystem
|
||||||
|
|
||||||
| | FuzzForge OSS | FuzzForge Enterprise Modules |
|
| | FuzzForge AI | FuzzForge Enterprise Modules |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| **What** | Runtime & MCP server | Security research modules |
|
| **What** | Runtime & MCP server | Security research modules |
|
||||||
| **License** | Apache 2.0 | BSL 1.1 (Business Source License) |
|
| **License** | Apache 2.0 | BSL 1.1 (Business Source License) |
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# FuzzForge OSS Roadmap
|
# FuzzForge AI Roadmap
|
||||||
|
|
||||||
This document outlines the planned features and development direction for FuzzForge OSS.
|
This document outlines the planned features and development direction for FuzzForge AI.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
28
USAGE.md
28
USAGE.md
@@ -1,6 +1,6 @@
|
|||||||
# FuzzForge OSS Usage Guide
|
# FuzzForge AI Usage Guide
|
||||||
|
|
||||||
This guide covers everything you need to know to get started with FuzzForge OSS - from installation to running your first security research workflow with AI.
|
This guide covers everything you need to know to get started with FuzzForge AI - from installation to running your first security research workflow with AI.
|
||||||
|
|
||||||
> **FuzzForge is designed to be used with AI agents** (GitHub Copilot, Claude, etc.) via MCP.
|
> **FuzzForge is designed to be used with AI agents** (GitHub Copilot, Claude, etc.) via MCP.
|
||||||
> The CLI is available for advanced users but the primary experience is through natural language interaction with your AI assistant.
|
> The CLI is available for advanced users but the primary experience is through natural language interaction with your AI assistant.
|
||||||
@@ -31,8 +31,8 @@ This guide covers everything you need to know to get started with FuzzForge OSS
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. Clone and install
|
# 1. Clone and install
|
||||||
git clone https://github.com/FuzzingLabs/fuzzforge-oss.git
|
git clone https://github.com/FuzzingLabs/fuzzforge-ai.git
|
||||||
cd fuzzforge-oss
|
cd fuzzforge-ai
|
||||||
uv sync
|
uv sync
|
||||||
|
|
||||||
# 2. Build the module images (one-time setup)
|
# 2. Build the module images (one-time setup)
|
||||||
@@ -57,9 +57,9 @@ uv run fuzzforge mcp install claude-code # For Claude Code CLI
|
|||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
Before installing FuzzForge OSS, ensure you have:
|
Before installing FuzzForge AI, ensure you have:
|
||||||
|
|
||||||
- **Python 3.12+** - [Download Python](https://www.python.org/downloads/)
|
- **Python 3.14+** - [Download Python](https://www.python.org/downloads/)
|
||||||
- **uv** package manager - [Install uv](https://docs.astral.sh/uv/)
|
- **uv** package manager - [Install uv](https://docs.astral.sh/uv/)
|
||||||
- **Docker** - Container runtime ([Install Docker](https://docs.docker.com/get-docker/))
|
- **Docker** - Container runtime ([Install Docker](https://docs.docker.com/get-docker/))
|
||||||
|
|
||||||
@@ -95,8 +95,8 @@ sudo usermod -aG docker $USER
|
|||||||
### 1. Clone the Repository
|
### 1. Clone the Repository
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/FuzzingLabs/fuzzforge-oss.git
|
git clone https://github.com/FuzzingLabs/fuzzforge-ai.git
|
||||||
cd fuzzforge-oss
|
cd fuzzforge-ai
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Install Dependencies
|
### 2. Install Dependencies
|
||||||
@@ -122,14 +122,14 @@ FuzzForge modules are containerized security tools. After cloning, you need to b
|
|||||||
### Build All Modules
|
### Build All Modules
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# From the fuzzforge-oss directory
|
# From the fuzzforge-ai directory
|
||||||
make build-modules
|
make build-modules
|
||||||
```
|
```
|
||||||
|
|
||||||
This builds all available modules:
|
This builds all available modules:
|
||||||
- `fuzzforge-rust-analyzer` - Analyzes Rust code for fuzzable functions
|
- `fuzzforge-rust-analyzer` - Analyzes Rust code for fuzzable functions
|
||||||
- `fuzzforge-cargo-fuzzer` - Runs cargo-fuzz on Rust crates
|
- `fuzzforge-cargo-fuzzer` - Runs cargo-fuzz on Rust crates
|
||||||
- `fuzzforge-harness-validator` - Validates generated fuzzing harnesses
|
- `fuzzforge-harness-tester` - Tests and validates generated fuzzing harnesses
|
||||||
- `fuzzforge-crash-analyzer` - Analyzes crash inputs
|
- `fuzzforge-crash-analyzer` - Analyzes crash inputs
|
||||||
|
|
||||||
### Build a Single Module
|
### Build a Single Module
|
||||||
@@ -169,7 +169,7 @@ uv run fuzzforge mcp install copilot
|
|||||||
|
|
||||||
The command auto-detects everything:
|
The command auto-detects everything:
|
||||||
- **FuzzForge root** - Where FuzzForge is installed
|
- **FuzzForge root** - Where FuzzForge is installed
|
||||||
- **Modules path** - Defaults to `fuzzforge-oss/fuzzforge-modules`
|
- **Modules path** - Defaults to `fuzzforge-ai/fuzzforge-modules`
|
||||||
- **Docker socket** - Auto-detects `/var/run/docker.sock`
|
- **Docker socket** - Auto-detects `/var/run/docker.sock`
|
||||||
|
|
||||||
**Optional overrides** (usually not needed):
|
**Optional overrides** (usually not needed):
|
||||||
@@ -428,14 +428,14 @@ If you prefer Podman:
|
|||||||
uv run fuzzforge mcp install copilot --engine podman
|
uv run fuzzforge mcp install copilot --engine podman
|
||||||
|
|
||||||
# Or set environment variable
|
# Or set environment variable
|
||||||
export FUZZFORGE_ENGINE=podman
|
export FUZZFORGE_ENGINE__TYPE=podman
|
||||||
```
|
```
|
||||||
|
|
||||||
### Check Logs
|
### Check Logs
|
||||||
|
|
||||||
FuzzForge stores execution logs in the storage directory:
|
FuzzForge stores execution results inside your project directory:
|
||||||
```bash
|
```bash
|
||||||
ls -la ~/.fuzzforge/storage/<project-id>/<execution-id>/
|
ls -la <your-project>/.fuzzforge/runs/<execution-id>/
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "fuzzforge-cli"
|
name = "fuzzforge-cli"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
description = "FuzzForge CLI - Command-line interface for FuzzForge OSS."
|
description = "FuzzForge CLI - Command-line interface for FuzzForge AI."
|
||||||
authors = []
|
authors = []
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.14"
|
requires-python = ">=3.14"
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ from fuzzforge_cli.context import Context
|
|||||||
|
|
||||||
application: Typer = Typer(
|
application: Typer = Typer(
|
||||||
name="fuzzforge",
|
name="fuzzforge",
|
||||||
help="FuzzForge OSS - Security research orchestration platform.",
|
help="FuzzForge AI - Security research orchestration platform.",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ def main(
|
|||||||
] = "",
|
] = "",
|
||||||
context: TyperContext = None, # type: ignore[assignment]
|
context: TyperContext = None, # type: ignore[assignment]
|
||||||
) -> None:
|
) -> None:
|
||||||
"""FuzzForge OSS - Security research orchestration platform.
|
"""FuzzForge AI - Security research orchestration platform.
|
||||||
|
|
||||||
Execute security research modules in isolated containers.
|
Execute security research modules in isolated containers.
|
||||||
|
|
||||||
|
|||||||
@@ -129,13 +129,13 @@ def _detect_docker_socket() -> str:
|
|||||||
def _find_fuzzforge_root() -> Path:
|
def _find_fuzzforge_root() -> Path:
|
||||||
"""Find the FuzzForge installation root.
|
"""Find the FuzzForge installation root.
|
||||||
|
|
||||||
:returns: Path to fuzzforge-oss directory.
|
:returns: Path to fuzzforge-ai directory.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
# Try to find from current file location
|
# Try to find from current file location
|
||||||
current = Path(__file__).resolve()
|
current = Path(__file__).resolve()
|
||||||
|
|
||||||
# Walk up to find fuzzforge-oss root
|
# Walk up to find fuzzforge-ai root
|
||||||
for parent in current.parents:
|
for parent in current.parents:
|
||||||
if (parent / "fuzzforge-mcp").is_dir() and (parent / "fuzzforge-runner").is_dir():
|
if (parent / "fuzzforge-mcp").is_dir() and (parent / "fuzzforge-runner").is_dir():
|
||||||
return parent
|
return parent
|
||||||
@@ -152,7 +152,7 @@ def _generate_mcp_config(
|
|||||||
) -> dict:
|
) -> dict:
|
||||||
"""Generate MCP server configuration.
|
"""Generate MCP server configuration.
|
||||||
|
|
||||||
:param fuzzforge_root: Path to fuzzforge-oss installation.
|
:param fuzzforge_root: Path to fuzzforge-ai installation.
|
||||||
:param modules_path: Path to the modules directory.
|
:param modules_path: Path to the modules directory.
|
||||||
:param engine_type: Container engine type (podman or docker).
|
:param engine_type: Container engine type (podman or docker).
|
||||||
:param engine_socket: Container engine socket path.
|
:param engine_socket: Container engine socket path.
|
||||||
@@ -326,7 +326,7 @@ def generate(
|
|||||||
if agent == AIAgent.COPILOT:
|
if agent == AIAgent.COPILOT:
|
||||||
config_path = _get_copilot_mcp_path()
|
config_path = _get_copilot_mcp_path()
|
||||||
elif agent == AIAgent.CLAUDE_CODE:
|
elif agent == AIAgent.CLAUDE_CODE:
|
||||||
config_path = _get_claude_code_mcp_path(fuzzforge_root)
|
config_path = _get_claude_code_user_mcp_path()
|
||||||
else: # Claude Desktop
|
else: # Claude Desktop
|
||||||
config_path = _get_claude_desktop_mcp_path()
|
config_path = _get_claude_desktop_mcp_path()
|
||||||
|
|
||||||
|
|||||||
@@ -45,11 +45,11 @@ For custom setups, you can manually configure the MCP server.
|
|||||||
{
|
{
|
||||||
"mcpServers": {
|
"mcpServers": {
|
||||||
"fuzzforge": {
|
"fuzzforge": {
|
||||||
"command": "/path/to/fuzzforge-oss/.venv/bin/python",
|
"command": "/path/to/fuzzforge-ai/.venv/bin/python",
|
||||||
"args": ["-m", "fuzzforge_mcp"],
|
"args": ["-m", "fuzzforge_mcp"],
|
||||||
"cwd": "/path/to/fuzzforge-oss",
|
"cwd": "/path/to/fuzzforge-ai",
|
||||||
"env": {
|
"env": {
|
||||||
"FUZZFORGE_MODULES_PATH": "/path/to/fuzzforge-oss/fuzzforge-modules",
|
"FUZZFORGE_MODULES_PATH": "/path/to/fuzzforge-ai/fuzzforge-modules",
|
||||||
"FUZZFORGE_ENGINE__TYPE": "docker"
|
"FUZZFORGE_ENGINE__TYPE": "docker"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -64,11 +64,11 @@ For custom setups, you can manually configure the MCP server.
|
|||||||
"servers": {
|
"servers": {
|
||||||
"fuzzforge": {
|
"fuzzforge": {
|
||||||
"type": "stdio",
|
"type": "stdio",
|
||||||
"command": "/path/to/fuzzforge-oss/.venv/bin/python",
|
"command": "/path/to/fuzzforge-ai/.venv/bin/python",
|
||||||
"args": ["-m", "fuzzforge_mcp"],
|
"args": ["-m", "fuzzforge_mcp"],
|
||||||
"cwd": "/path/to/fuzzforge-oss",
|
"cwd": "/path/to/fuzzforge-ai",
|
||||||
"env": {
|
"env": {
|
||||||
"FUZZFORGE_MODULES_PATH": "/path/to/fuzzforge-oss/fuzzforge-modules",
|
"FUZZFORGE_MODULES_PATH": "/path/to/fuzzforge-ai/fuzzforge-modules",
|
||||||
"FUZZFORGE_ENGINE__TYPE": "docker"
|
"FUZZFORGE_ENGINE__TYPE": "docker"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -83,11 +83,11 @@ For custom setups, you can manually configure the MCP server.
|
|||||||
"mcpServers": {
|
"mcpServers": {
|
||||||
"fuzzforge": {
|
"fuzzforge": {
|
||||||
"type": "stdio",
|
"type": "stdio",
|
||||||
"command": "/path/to/fuzzforge-oss/.venv/bin/python",
|
"command": "/path/to/fuzzforge-ai/.venv/bin/python",
|
||||||
"args": ["-m", "fuzzforge_mcp"],
|
"args": ["-m", "fuzzforge_mcp"],
|
||||||
"cwd": "/path/to/fuzzforge-oss",
|
"cwd": "/path/to/fuzzforge-ai",
|
||||||
"env": {
|
"env": {
|
||||||
"FUZZFORGE_MODULES_PATH": "/path/to/fuzzforge-oss/fuzzforge-modules",
|
"FUZZFORGE_MODULES_PATH": "/path/to/fuzzforge-ai/fuzzforge-modules",
|
||||||
"FUZZFORGE_ENGINE__TYPE": "docker"
|
"FUZZFORGE_ENGINE__TYPE": "docker"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "fuzzforge-mcp"
|
name = "fuzzforge-mcp"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
description = "FuzzForge MCP Server - AI agent gateway for FuzzForge OSS."
|
description = "FuzzForge MCP Server - AI agent gateway for FuzzForge AI."
|
||||||
authors = []
|
authors = []
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.14"
|
requires-python = ">=3.14"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""Workflow resources for FuzzForge MCP.
|
"""Workflow resources for FuzzForge MCP.
|
||||||
|
|
||||||
Note: In FuzzForge OSS, workflows are defined at runtime rather than
|
Note: In FuzzForge AI, workflows are defined at runtime rather than
|
||||||
stored. This resource provides documentation about workflow capabilities.
|
stored. This resource provides documentation about workflow capabilities.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@@ -19,7 +19,7 @@ mcp: FastMCP = FastMCP()
|
|||||||
async def get_workflow_help() -> dict[str, Any]:
|
async def get_workflow_help() -> dict[str, Any]:
|
||||||
"""Get help information about creating workflows.
|
"""Get help information about creating workflows.
|
||||||
|
|
||||||
Workflows in FuzzForge OSS are defined at execution time rather
|
Workflows in FuzzForge AI are defined at execution time rather
|
||||||
than stored. Use the execute_workflow tool with step definitions.
|
than stored. Use the execute_workflow tool with step definitions.
|
||||||
|
|
||||||
:return: Workflow documentation.
|
:return: Workflow documentation.
|
||||||
|
|||||||
@@ -49,24 +49,19 @@ async def list_modules() -> dict[str, Any]:
|
|||||||
"image": f"{module.identifier}:{module.version or 'latest'}",
|
"image": f"{module.identifier}:{module.version or 'latest'}",
|
||||||
"available": module.available,
|
"available": module.available,
|
||||||
"description": module.description,
|
"description": module.description,
|
||||||
# New metadata fields from pyproject.toml
|
|
||||||
"category": module.category,
|
|
||||||
"language": module.language,
|
|
||||||
"pipeline_stage": module.pipeline_stage,
|
|
||||||
"pipeline_order": module.pipeline_order,
|
|
||||||
"dependencies": module.dependencies,
|
|
||||||
"continuous_mode": module.continuous_mode,
|
"continuous_mode": module.continuous_mode,
|
||||||
"typical_duration": module.typical_duration,
|
"suggested_predecessors": module.suggested_predecessors,
|
||||||
# AI-discoverable metadata
|
# AI-discoverable metadata
|
||||||
"use_cases": module.use_cases,
|
"use_cases": module.use_cases,
|
||||||
"input_requirements": module.input_requirements,
|
"common_inputs": module.common_inputs,
|
||||||
"output_artifacts": module.output_artifacts,
|
"output_artifacts": module.output_artifacts,
|
||||||
|
"output_treatment": module.output_treatment,
|
||||||
}
|
}
|
||||||
for module in modules
|
for module in modules
|
||||||
]
|
]
|
||||||
|
|
||||||
# Sort by pipeline_order if available
|
# Sort alphabetically by identifier
|
||||||
available_modules.sort(key=lambda m: (m.get("pipeline_order") or 999, m["identifier"]))
|
available_modules.sort(key=lambda m: m["identifier"])
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"modules": available_modules,
|
"modules": available_modules,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
"""MCP tool tests for FuzzForge OSS.
|
"""MCP tool tests for FuzzForge AI.
|
||||||
|
|
||||||
Tests the MCP tools that are available in the OSS version.
|
Tests the MCP tools that are available in the OSS version.
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
ARG BASE_IMAGE=fuzzforge-modules-sdk:0.0.1
|
FROM localhost/fuzzforge-modules-sdk:0.1.0
|
||||||
FROM ${BASE_IMAGE}
|
|
||||||
|
|
||||||
# Module metadata is now read from pyproject.toml [tool.fuzzforge.module] section
|
# Module metadata is now read from pyproject.toml [tool.fuzzforge.module] section
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
ARG BASE_IMAGE=fuzzforge-modules-sdk:0.0.1
|
FROM localhost/fuzzforge-modules-sdk:0.1.0
|
||||||
FROM ${BASE_IMAGE}
|
|
||||||
|
|
||||||
# Module metadata is now read from pyproject.toml [tool.fuzzforge.module] section
|
# Module metadata is now read from pyproject.toml [tool.fuzzforge.module] section
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
ARG BASE_IMAGE=fuzzforge-modules-sdk:0.0.1
|
FROM localhost/fuzzforge-modules-sdk:0.1.0
|
||||||
FROM ${BASE_IMAGE}
|
|
||||||
|
|
||||||
# Module metadata is now read from pyproject.toml [tool.fuzzforge.module] section
|
# Module metadata is now read from pyproject.toml [tool.fuzzforge.module] section
|
||||||
# See MODULE_METADATA.md for documentation on configuring metadata
|
# See MODULE_METADATA.md for documentation on configuring metadata
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ WORKDIR /app
|
|||||||
# Create FuzzForge standard directories
|
# Create FuzzForge standard directories
|
||||||
RUN mkdir -p /fuzzforge/input /fuzzforge/output
|
RUN mkdir -p /fuzzforge/input /fuzzforge/output
|
||||||
|
|
||||||
# Copy wheels directory (built by parent Makefile)
|
# Create wheels directory (populated with pre-built wheels when available)
|
||||||
COPY .wheels /wheels
|
RUN mkdir -p /wheels
|
||||||
|
|
||||||
# Set up uv for the container
|
# Set up uv for the container
|
||||||
ENV UV_SYSTEM_PYTHON=1
|
ENV UV_SYSTEM_PYTHON=1
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
ARG BASE_IMAGE=fuzzforge-modules-sdk:0.0.1
|
FROM localhost/fuzzforge-modules-sdk:0.1.0
|
||||||
FROM ${BASE_IMAGE}
|
|
||||||
|
|
||||||
# Module metadata is now read from pyproject.toml [tool.fuzzforge.module] section
|
# Module metadata is now read from pyproject.toml [tool.fuzzforge.module] section
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
ARG BASE_IMAGE=fuzzforge-modules-sdk:0.0.1
|
FROM localhost/fuzzforge-modules-sdk:0.1.0
|
||||||
FROM ${BASE_IMAGE}
|
|
||||||
|
|
||||||
# Module metadata is now read from pyproject.toml [tool.fuzzforge.module] section
|
# Module metadata is now read from pyproject.toml [tool.fuzzforge.module] section
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# FuzzForge Runner
|
# FuzzForge Runner
|
||||||
|
|
||||||
Direct execution engine for FuzzForge OSS. Provides simplified module and workflow execution without requiring Temporal or external infrastructure.
|
Direct execution engine for FuzzForge AI. Provides simplified module and workflow execution without requiring Temporal or external infrastructure.
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "fuzzforge-runner"
|
name = "fuzzforge-runner"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
description = "FuzzForge Runner - Direct execution engine for FuzzForge OSS."
|
description = "FuzzForge Runner - Direct execution engine for FuzzForge AI."
|
||||||
authors = []
|
authors = []
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.14"
|
requires-python = ">=3.14"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
"""FuzzForge Runner - Direct execution engine for FuzzForge OSS."""
|
"""FuzzForge Runner - Direct execution engine for FuzzForge AI."""
|
||||||
|
|
||||||
from fuzzforge_runner.runner import Runner
|
from fuzzforge_runner.runner import Runner
|
||||||
from fuzzforge_runner.settings import Settings
|
from fuzzforge_runner.settings import Settings
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""FuzzForge Runner - Main runner interface.
|
"""FuzzForge Runner - Main runner interface.
|
||||||
|
|
||||||
This module provides the high-level interface for FuzzForge OSS,
|
This module provides the high-level interface for FuzzForge AI,
|
||||||
coordinating module execution, workflow orchestration, and storage.
|
coordinating module execution, workflow orchestration, and storage.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ def get_logger() -> BoundLogger:
|
|||||||
|
|
||||||
|
|
||||||
class LocalStorage:
|
class LocalStorage:
|
||||||
"""Local filesystem storage backend for FuzzForge OSS.
|
"""Local filesystem storage backend for FuzzForge AI.
|
||||||
|
|
||||||
Provides lightweight storage for execution results while using
|
Provides lightweight storage for execution results while using
|
||||||
direct source mounting (no copying) for input assets.
|
direct source mounting (no copying) for input assets.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "fuzzforge-oss"
|
name = "fuzzforge-ai"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
description = "FuzzForge OSS - AI-driven security research platform for local execution"
|
description = "FuzzForge AI - AI-driven security research platform for local execution"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.14"
|
requires-python = ">=3.14"
|
||||||
authors = [
|
authors = [
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Resolve the container engine based on FUZZFORGE_ENGINE env var.
|
|
||||||
# Usage: source scripts/container-env.sh
|
|
||||||
# Exports: CONTAINER_CMD
|
|
||||||
|
|
||||||
if [ "${FUZZFORGE_ENGINE}" = "podman" ]; then
|
|
||||||
if [ -n "${SNAP}" ]; then
|
|
||||||
echo "Using Podman with isolated storage (Snap detected)"
|
|
||||||
CONTAINER_CMD="podman --root ~/.fuzzforge/containers/storage --runroot ~/.fuzzforge/containers/run"
|
|
||||||
else
|
|
||||||
echo "Using Podman"
|
|
||||||
CONTAINER_CMD="podman"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "Using Docker"
|
|
||||||
CONTAINER_CMD="docker"
|
|
||||||
fi
|
|
||||||
|
|
||||||
export CONTAINER_CMD
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Extract the version from a pyproject.toml file.
|
|
||||||
# Usage: pyproject-version.sh <path/to/pyproject.toml> [default]
|
|
||||||
# Prints the version string, or the default (0.0.1) if not found.
|
|
||||||
|
|
||||||
PYPROJECT="${1:?Usage: pyproject-version.sh <pyproject.toml> [default]}"
|
|
||||||
DEFAULT="${2:-0.0.1}"
|
|
||||||
|
|
||||||
version=$(grep -m1 '^version\s*=' "${PYPROJECT}" 2>/dev/null \
|
|
||||||
| sed 's/^version\s*=\s*//;s/"//g;s/\s*$//')
|
|
||||||
|
|
||||||
echo "${version:-${DEFAULT}}"
|
|
||||||
Reference in New Issue
Block a user