Skip to content

Commit 28ad446

Browse files
committed
Merge branch 'master' into dev for v0.7.0 release
Resolved conflicts: - Kept monitor.py (dev version - required for live monitoring) - Kept workflow_exec.py (dev version - includes worker management, --live, --fail-on, --export-sarif) - Kept main.py (dev version - includes new command structure) All conflicts resolved in favor of dev branch features for 0.7.0 release.
2 parents 746699e + 4ad4433 commit 28ad446

File tree

7 files changed

+149
-116
lines changed

7 files changed

+149
-116
lines changed

.github/workflows/ci-python.yml

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
name: Python CI
2+
3+
# This is a dumb Ci to ensure that the python client and backend builds correctly
4+
# It could be optimized to run faster, building, testing and linting only changed code
5+
# but for now it is good enough. It runs on every push and PR to any branch.
6+
# It also runs on demand.
7+
8+
on:
9+
workflow_dispatch:
10+
11+
push:
12+
paths:
13+
- "ai/**"
14+
- "backend/**"
15+
- "cli/**"
16+
- "sdk/**"
17+
- "src/**"
18+
pull_request:
19+
paths:
20+
- "ai/**"
21+
- "backend/**"
22+
- "cli/**"
23+
- "sdk/**"
24+
- "src/**"
25+
26+
jobs:
27+
ci:
28+
name: ci
29+
runs-on: ubuntu-latest
30+
31+
steps:
32+
- uses: actions/checkout@v5
33+
34+
- name: Setup uv
35+
uses: astral-sh/setup-uv@v6
36+
with:
37+
enable-cache: true
38+
39+
- name: Set up Python
40+
run: uv python install
41+
42+
# Validate no obvious issues
43+
# Quick hack because CLI returns non-zero exit code when no args are provided
44+
- name: Run base command
45+
run: |
46+
set +e
47+
uv run ff
48+
if [ $? -ne 2 ]; then
49+
echo "Expected exit code 2 from 'uv run ff', got $?"
50+
exit 1
51+
fi
52+
53+
- name: Build fuzzforge_ai package
54+
run: uv build
55+
56+
- name: Build ai package
57+
working-directory: ai
58+
run: uv build
59+
60+
- name: Build cli package
61+
working-directory: cli
62+
run: uv build
63+
64+
- name: Build sdk package
65+
working-directory: sdk
66+
run: uv build
67+
68+
- name: Build backend package
69+
working-directory: backend
70+
run: uv build

.github/workflows/docs-deploy.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
name: Deploy Docusaurus to GitHub Pages
22

33
on:
4+
workflow_dispatch:
5+
46
push:
57
branches:
68
- master
7-
workflow_dispatch:
9+
paths:
10+
- "docs/**"
811

912
jobs:
1013
build:

.github/workflows/docs-test-deploy.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
name: Docusaurus test deployment
22

33
on:
4+
workflow_dispatch:
5+
6+
push:
7+
paths:
8+
- "docs/**"
49
pull_request:
5-
branches:
6-
- master
10+
paths:
11+
- "docs/**"
712

813
jobs:
914
test-deploy:

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<p align="center"><strong>AI-powered workflow automation and AI Agents for AppSec, Fuzzing & Offensive Security</strong></p>
77

88
<p align="center">
9-
<a href="https://discord.com/invite/acqv9FVG"><img src="https://img.shields.io/discord/1420767905255133267?logo=discord&label=Discord" alt="Discord"></a>
9+
<a href="https://discord.gg/8XEX33UUwZ/"><img src="https://img.shields.io/discord/1420767905255133267?logo=discord&label=Discord" alt="Discord"></a>
1010
<a href="LICENSE"><img src="https://img.shields.io/badge/license-BSL%20%2B%20Apache-orange" alt="License: BSL + Apache"></a>
1111
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.11%2B-blue" alt="Python 3.11+"/></a>
1212
<a href="https://fuzzforge.ai"><img src="https://img.shields.io/badge/Website-fuzzforge.ai-blue" alt="Website"/></a>
@@ -165,7 +165,7 @@ _AI agents automatically analyzing code and providing security insights_
165165

166166
- 🌐 [Website](https://fuzzforge.ai)
167167
- 📖 [Documentation](https://docs.fuzzforge.ai)
168-
- 💬 [Community Discord](https://discord.com/invite/acqv9FVG)
168+
- 💬 [Community Discord](https://discord.gg/8XEX33UUwZ)
169169
- 🎓 [FuzzingLabs Academy](https://academy.fuzzinglabs.com/?coupon=GITHUB_FUZZFORGE)
170170

171171
---
@@ -194,7 +194,7 @@ Planned features and improvements:
194194
- ☁️ Multi-tenant SaaS platform with team collaboration
195195
- 📊 Advanced reporting & analytics
196196

197-
👉 Follow updates in the [GitHub issues](../../issues) and [Discord](https://discord.com/invite/acqv9FVG).
197+
👉 Follow updates in the [GitHub issues](../../issues) and [Discord](https://discord.gg/8XEX33UUwZ)
198198

199199
---
200200

cli/README.md

Lines changed: 1 addition & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,6 @@ fuzzforge workflows info security_assessment
8080
# Submit a workflow for analysis
8181
fuzzforge workflow security_assessment /path/to/your/code
8282

83-
# Monitor progress in real-time
84-
fuzzforge monitor live <execution-id>
8583

8684
# View findings when complete
8785
fuzzforge finding <execution-id>
@@ -222,7 +220,6 @@ $ ff workflow security_assessment ./my-project
222220
- `--timeout, -t` - Execution timeout in seconds
223221
- `--interactive/--no-interactive, -i/-n` - Interactive parameter input
224222
- `--wait, -w` - Wait for execution to complete
225-
- `--live, -l` - Show live monitoring during execution
226223

227224
**Worker Lifecycle Options (v0.7.0):**
228225
- `--auto-start/--no-auto-start` - Auto-start required worker (default: from config)
@@ -320,39 +317,6 @@ fuzzforge finding export abc123def456 --format csv --output report.csv
320317
fuzzforge finding export --format html --output report.html
321318
```
322319

323-
### Real-time Monitoring
324-
325-
#### `fuzzforge monitor stats <execution-id>`
326-
Show current fuzzing statistics.
327-
328-
```bash
329-
# Show stats once
330-
fuzzforge monitor stats abc123def456 --once
331-
332-
# Live updating stats (default)
333-
fuzzforge monitor stats abc123def456 --refresh 5
334-
```
335-
336-
#### `fuzzforge monitor crashes <run-id>`
337-
Display crash reports for a fuzzing run.
338-
339-
```bash
340-
fuzzforge monitor crashes abc123def456 --limit 50
341-
```
342-
343-
#### `fuzzforge monitor live <run-id>`
344-
Real-time monitoring dashboard with live updates.
345-
346-
```bash
347-
fuzzforge monitor live abc123def456 --refresh 3
348-
```
349-
350-
Features:
351-
- Live updating statistics
352-
- Progress indicators and bars
353-
- Run status monitoring
354-
- Automatic completion detection
355-
356320
### Configuration Management
357321

358322
#### `fuzzforge config show`
@@ -560,7 +524,6 @@ cli/
560524
│ ├── workflows.py # Workflow management
561525
│ ├── runs.py # Run management
562526
│ ├── findings.py # Findings management
563-
│ ├── monitor.py # Real-time monitoring
564527
│ ├── config.py # Configuration commands
565528
│ └── status.py # Status information
566529
├── pyproject.toml # Project configuration
@@ -641,7 +604,6 @@ fuzzforge --help
641604
# Command-specific help
642605
ff workflows --help
643606
ff workflow run --help
644-
ff monitor live --help
645607

646608
# Show version
647609
fuzzforge --version
@@ -683,4 +645,4 @@ Contributions are welcome! Please see the main FuzzForge repository for contribu
683645

684646
---
685647

686-
**FuzzForge CLI** - Making security testing workflows accessible and efficient from the command line.
648+
**FuzzForge CLI** - Making security testing workflows accessible and efficient from the command line.

cli/src/fuzzforge_cli/commands/init.py

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,10 @@
1010
#
1111
# Additional attribution and requirements are provided in the NOTICE file.
1212

13-
1413
from __future__ import annotations
1514

16-
from pathlib import Path
1715
import os
16+
from pathlib import Path
1817
from textwrap import dedent
1918
from typing import Optional
2019

@@ -32,17 +31,20 @@
3231
@app.command()
3332
def project(
3433
name: Optional[str] = typer.Option(
35-
None, "--name", "-n",
36-
help="Project name (defaults to current directory name)"
34+
None, "--name", "-n", help="Project name (defaults to current directory name)"
3735
),
3836
api_url: Optional[str] = typer.Option(
39-
None, "--api-url", "-u",
40-
help="FuzzForge API URL (defaults to http://localhost:8000)"
37+
None,
38+
"--api-url",
39+
"-u",
40+
help="FuzzForge API URL (defaults to http://localhost:8000)",
4141
),
4242
force: bool = typer.Option(
43-
False, "--force", "-f",
44-
help="Force initialization even if project already exists"
45-
)
43+
False,
44+
"--force",
45+
"-f",
46+
help="Force initialization even if project already exists",
47+
),
4648
):
4749
"""
4850
📁 Initialize a new FuzzForge project in the current directory.
@@ -58,24 +60,20 @@ def project(
5860
# Check if project already exists
5961
if fuzzforge_dir.exists() and not force:
6062
if fuzzforge_dir.is_dir() and any(fuzzforge_dir.iterdir()):
61-
console.print("❌ FuzzForge project already exists in this directory", style="red")
63+
console.print(
64+
"❌ FuzzForge project already exists in this directory", style="red"
65+
)
6266
console.print("Use --force to reinitialize", style="dim")
6367
raise typer.Exit(1)
6468

6569
# Get project name
6670
if not name:
67-
name = Prompt.ask(
68-
"Project name",
69-
default=current_dir.name,
70-
console=console
71-
)
71+
name = Prompt.ask("Project name", default=current_dir.name, console=console)
7272

7373
# Get API URL
7474
if not api_url:
7575
api_url = Prompt.ask(
76-
"FuzzForge API URL",
77-
default="http://localhost:8000",
78-
console=console
76+
"FuzzForge API URL", default="http://localhost:8000", console=console
7977
)
8078

8179
# Confirm initialization
@@ -117,15 +115,15 @@ def project(
117115
]
118116

119117
if gitignore_path.exists():
120-
with open(gitignore_path, 'r') as f:
118+
with open(gitignore_path, "r") as f:
121119
existing_content = f.read()
122120

123121
if "# FuzzForge CLI" not in existing_content:
124-
with open(gitignore_path, 'a') as f:
122+
with open(gitignore_path, "a") as f:
125123
f.write(f"\n{chr(10).join(gitignore_entries)}\n")
126124
console.print("📝 Updated .gitignore with FuzzForge entries")
127125
else:
128-
with open(gitignore_path, 'w') as f:
126+
with open(gitignore_path, "w") as f:
129127
f.write(f"{chr(10).join(gitignore_entries)}\n")
130128
console.print("📝 Created .gitignore")
131129

@@ -145,9 +143,6 @@ def project(
145143
# Submit a workflow for analysis
146144
fuzzforge workflow <workflow-name> /path/to/target
147145
148-
# Monitor run progress
149-
fuzzforge monitor live <run-id>
150-
151146
# View findings
152147
fuzzforge finding <run-id>
153148
```
@@ -159,7 +154,7 @@ def project(
159154
- `.fuzzforge/findings.db` - Local database for runs and findings
160155
"""
161156

162-
with open(readme_path, 'w') as f:
157+
with open(readme_path, "w") as f:
163158
f.write(readme_content)
164159
console.print("📚 Created README.md")
165160

0 commit comments

Comments
 (0)