vibe-forge 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/forge.md +147 -0
- package/.claude/settings.local.json +16 -0
- package/LICENSE +21 -21
- package/README.md +230 -211
- package/agents/forge-master/capabilities.md +144 -144
- package/agents/forge-master/context-template.md +128 -128
- package/bin/cli.js +3 -1
- package/bin/forge-daemon.sh +195 -71
- package/bin/forge-setup.sh +43 -12
- package/bin/forge-spawn.sh +46 -46
- package/bin/forge.sh +76 -127
- package/bin/lib/agents.sh +157 -0
- package/bin/lib/colors.sh +44 -0
- package/bin/lib/config.sh +259 -0
- package/bin/lib/constants.sh +143 -0
- package/config/agents.json +76 -0
- package/config/task-template.md +87 -87
- package/docs/TODO.md +65 -0
- package/docs/npm-publishing.md +95 -0
- package/docs/security.md +144 -0
- package/package.json +11 -2
package/docs/TODO.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Vibe Forge - Future Improvements
|
|
2
|
+
|
|
3
|
+
This document tracks issues identified during code reviews that are deferred for future sessions.
|
|
4
|
+
|
|
5
|
+
## Security (From Aegis Review - Round 2)
|
|
6
|
+
|
|
7
|
+
### Medium Priority
|
|
8
|
+
- **M-1: eval() of external data in load_agents_from_json()**
|
|
9
|
+
- File: `bin/lib/config.sh` line 95
|
|
10
|
+
- Issue: If agents.json is compromised, malicious agent names could execute shell commands via `eval "$agent_data"`
|
|
11
|
+
- Fix: Add input validation in Node.js script to reject agent names containing shell metacharacters
|
|
12
|
+
|
|
13
|
+
### Low Priority
|
|
14
|
+
- **L-1: Windows Terminal command escaping**
|
|
15
|
+
- File: `bin/forge-spawn.sh` lines 55-57
|
|
16
|
+
- Issue: `$display_name` and `$FORGE_ROOT` not escaped for nested shell invocation
|
|
17
|
+
- Fix: Use `printf %q` for proper escaping
|
|
18
|
+
|
|
19
|
+
- **L-2: Terminal escape sequences in task parsing**
|
|
20
|
+
- File: `bin/forge-daemon.sh` lines 147-149
|
|
21
|
+
- Issue: ANSI escape sequences in task files could affect terminal
|
|
22
|
+
- Fix: Add `| tr -d '\033'` to strip escape sequences
|
|
23
|
+
|
|
24
|
+
- **L-3: Workflow version injection**
|
|
25
|
+
- File: `.github/workflows/publish.yml` lines 32-33
|
|
26
|
+
- Issue: Version input not validated before use in npm command
|
|
27
|
+
- Fix: Add semver regex validation
|
|
28
|
+
|
|
29
|
+
## Architecture (From Sage Review - Round 2)
|
|
30
|
+
|
|
31
|
+
### P1 Priority
|
|
32
|
+
- **sed -i incompatibility in forge-setup.sh**
|
|
33
|
+
- Lines: 205, 249, 291, 380, 381, 384, 388
|
|
34
|
+
- Issue: macOS/BSD sed requires `sed -i ''` but script uses `sed -i`
|
|
35
|
+
- Fix: Add platform detection or create `sed_inplace()` helper
|
|
36
|
+
|
|
37
|
+
- **Silent error suppression for JSON loading**
|
|
38
|
+
- Files: `bin/forge.sh` line 44, `bin/forge-spawn.sh` line 34
|
|
39
|
+
- Issue: `2>/dev/null || true` silently ignores JSON parsing errors
|
|
40
|
+
- Fix: Log warning when fallback is used
|
|
41
|
+
|
|
42
|
+
- **Inconsistent exit codes**
|
|
43
|
+
- Issue: All errors exit with code 1, no differentiation
|
|
44
|
+
- Fix: Define exit code constants in `constants.sh`
|
|
45
|
+
|
|
46
|
+
### P2 Priority
|
|
47
|
+
- **Hardcoded agent list in cmd_help()**
|
|
48
|
+
- File: `bin/forge.sh` lines 253-260
|
|
49
|
+
- Fix: Generate dynamically using `show_available_agents()`
|
|
50
|
+
|
|
51
|
+
- **Raw echo -e instead of log_* functions**
|
|
52
|
+
- File: `bin/forge-setup.sh` (multiple lines)
|
|
53
|
+
- Fix: Replace with appropriate `log_*` calls
|
|
54
|
+
|
|
55
|
+
- **Duplicate color definitions in cli.js**
|
|
56
|
+
- File: `bin/cli.js` lines 24-31
|
|
57
|
+
- Fix: Document as intentional or extract to shared config
|
|
58
|
+
|
|
59
|
+
## Testing (From Crucible Review - Round 2)
|
|
60
|
+
|
|
61
|
+
### Low Priority Gaps
|
|
62
|
+
- `show_available_agents()` not tested
|
|
63
|
+
- `setup_windows_env()` not tested (hard to test in CI)
|
|
64
|
+
- `colors.sh` log functions not tested (display-only)
|
|
65
|
+
- CLI `init`/`update` commands not tested (side effects)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# npm Publishing with OIDC Trusted Publishing
|
|
2
|
+
|
|
3
|
+
This document explains how Vibe Forge publishes to npm using GitHub Actions OIDC trusted publishing - no npm tokens required.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
npm's [trusted publishing](https://docs.npmjs.com/trusted-publishers/) uses OpenID Connect (OIDC) to authenticate GitHub Actions workflows directly with npm. This eliminates the need to store npm tokens as secrets.
|
|
8
|
+
|
|
9
|
+
## Requirements
|
|
10
|
+
|
|
11
|
+
1. **npm CLI v11.5.1+** - OIDC support was added in npm 11.5.1
|
|
12
|
+
2. **Public GitHub repository** - Provenance attestation only works with public repos
|
|
13
|
+
3. **Trusted Publisher configured on npmjs.com** - Links your package to your GitHub repo
|
|
14
|
+
|
|
15
|
+
## Setup
|
|
16
|
+
|
|
17
|
+
### 1. Configure Trusted Publisher on npm
|
|
18
|
+
|
|
19
|
+
1. Go to https://www.npmjs.com/package/vibe-forge/access
|
|
20
|
+
2. Under "Trusted Publishers", add a new publisher:
|
|
21
|
+
- **Publisher**: GitHub Actions
|
|
22
|
+
- **Organization/user**: SpasticPalate
|
|
23
|
+
- **Repository**: vibe-forge
|
|
24
|
+
- **Workflow filename**: publish.yml
|
|
25
|
+
- **Environment name**: (leave empty)
|
|
26
|
+
|
|
27
|
+
### 2. GitHub Actions Workflow
|
|
28
|
+
|
|
29
|
+
The workflow requires specific permissions and npm version:
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
jobs:
|
|
33
|
+
publish:
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
permissions:
|
|
36
|
+
contents: read
|
|
37
|
+
id-token: write # Required for OIDC token generation
|
|
38
|
+
steps:
|
|
39
|
+
- uses: actions/checkout@v4
|
|
40
|
+
|
|
41
|
+
- uses: actions/setup-node@v4
|
|
42
|
+
with:
|
|
43
|
+
node-version: '22'
|
|
44
|
+
|
|
45
|
+
# npm 11.5.1+ required for OIDC
|
|
46
|
+
- run: npm install -g npm@latest
|
|
47
|
+
|
|
48
|
+
- run: npm publish --provenance --access public
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Key points:
|
|
52
|
+
- `id-token: write` permission enables OIDC token generation
|
|
53
|
+
- `--provenance` flag enables signed provenance attestation
|
|
54
|
+
- No `NODE_AUTH_TOKEN` or `NPM_TOKEN` needed
|
|
55
|
+
|
|
56
|
+
## Troubleshooting
|
|
57
|
+
|
|
58
|
+
### "Access token expired or revoked" with E404
|
|
59
|
+
|
|
60
|
+
**Cause**: npm CLI version is too old (< 11.5.1)
|
|
61
|
+
|
|
62
|
+
**Fix**: Add `npm install -g npm@latest` before publishing
|
|
63
|
+
|
|
64
|
+
### "Unsupported GitHub Actions source repository visibility: private"
|
|
65
|
+
|
|
66
|
+
**Cause**: Provenance attestation only works with public repositories
|
|
67
|
+
|
|
68
|
+
**Fix**: Either make the repo public, or remove `--provenance` and use a granular npm token instead
|
|
69
|
+
|
|
70
|
+
### "ENEEDAUTH - need auth"
|
|
71
|
+
|
|
72
|
+
**Cause**: OIDC token not being generated/used
|
|
73
|
+
|
|
74
|
+
**Fix**: Ensure `id-token: write` permission is set on the job
|
|
75
|
+
|
|
76
|
+
### 404 on publish despite correct setup
|
|
77
|
+
|
|
78
|
+
**Cause**: Trusted Publisher configuration doesn't match workflow
|
|
79
|
+
|
|
80
|
+
**Fix**: Verify on npmjs.com that:
|
|
81
|
+
- Organization/user matches exactly (case-sensitive)
|
|
82
|
+
- Repository name matches exactly
|
|
83
|
+
- Workflow filename matches exactly (e.g., `publish.yml`)
|
|
84
|
+
|
|
85
|
+
## Benefits
|
|
86
|
+
|
|
87
|
+
- **No secrets to manage** - No npm tokens to rotate or accidentally expose
|
|
88
|
+
- **Provenance attestation** - Packages are cryptographically signed with build info
|
|
89
|
+
- **Audit trail** - Provenance is published to Sigstore transparency log
|
|
90
|
+
|
|
91
|
+
## References
|
|
92
|
+
|
|
93
|
+
- [npm Trusted Publishers](https://docs.npmjs.com/trusted-publishers/)
|
|
94
|
+
- [npm Provenance](https://docs.npmjs.com/generating-provenance-statements/)
|
|
95
|
+
- [GitHub: npm trusted publishing GA](https://github.blog/changelog/2025-07-31-npm-trusted-publishing-with-oidc-is-generally-available/)
|
package/docs/security.md
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# Vibe Forge Security Documentation
|
|
2
|
+
|
|
3
|
+
This document explains security considerations and intentional design decisions in Vibe Forge.
|
|
4
|
+
|
|
5
|
+
## The `--dangerously-skip-permissions` Flag
|
|
6
|
+
|
|
7
|
+
### What It Does
|
|
8
|
+
|
|
9
|
+
When starting agents, Vibe Forge uses Claude Code's `--dangerously-skip-permissions` flag:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
claude --dangerously-skip-permissions --system-prompt "$system_prompt" "startup"
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
This flag disables Claude Code's permission prompts for file operations, command execution, and other actions that would normally require user confirmation.
|
|
16
|
+
|
|
17
|
+
### Why We Use It
|
|
18
|
+
|
|
19
|
+
Vibe Forge is designed for **terminal-native vibe coding** - a workflow where you launch multiple AI agents that work autonomously on your codebase. The typical workflow involves:
|
|
20
|
+
|
|
21
|
+
1. Starting a Planning Hub that coordinates work
|
|
22
|
+
2. Spawning worker agents (frontend, backend, testing, etc.) in separate terminals
|
|
23
|
+
3. Agents working autonomously on assigned tasks
|
|
24
|
+
4. Human review at defined checkpoints
|
|
25
|
+
|
|
26
|
+
With permission prompts enabled, each agent would constantly interrupt for confirmation, breaking the autonomous workflow that makes Vibe Forge effective.
|
|
27
|
+
|
|
28
|
+
### Security Mitigations
|
|
29
|
+
|
|
30
|
+
We implement several security measures to offset the risks:
|
|
31
|
+
|
|
32
|
+
#### 1. Agent Whitelist Validation
|
|
33
|
+
|
|
34
|
+
All agent names go through strict whitelist validation before execution:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# bin/lib/constants.sh
|
|
38
|
+
VALID_AGENTS=("anvil" "furnace" "crucible" ...)
|
|
39
|
+
|
|
40
|
+
# bin/lib/agents.sh
|
|
41
|
+
resolve_agent() {
|
|
42
|
+
local canonical="${AGENT_ALIASES[$normalized]:-}"
|
|
43
|
+
if [[ -n "$canonical" ]]; then
|
|
44
|
+
echo "$canonical"
|
|
45
|
+
return 0
|
|
46
|
+
fi
|
|
47
|
+
return 1 # Reject unknown agents
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
This prevents command injection through agent names.
|
|
52
|
+
|
|
53
|
+
#### 2. Path Traversal Protection
|
|
54
|
+
|
|
55
|
+
Personality file paths are validated to ensure they remain within the expected directory:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
get_agent_personality_path() {
|
|
59
|
+
local real_path=$(cd "$(dirname "$personality_path")" && pwd)/$(basename "$personality_path")
|
|
60
|
+
local agents_dir=$(cd "$forge_root/agents" && pwd)
|
|
61
|
+
|
|
62
|
+
if [[ "$real_path" != "$agents_dir"/* ]]; then
|
|
63
|
+
echo "Security error: Path traversal detected" >&2
|
|
64
|
+
return 1
|
|
65
|
+
fi
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
#### 3. Safe JSON Parsing
|
|
70
|
+
|
|
71
|
+
We use Node.js for JSON parsing instead of `grep`/`cut` which could be vulnerable to injection:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
json_get_string() {
|
|
75
|
+
node -e "
|
|
76
|
+
const fs = require('fs');
|
|
77
|
+
const data = JSON.parse(fs.readFileSync('$file', 'utf8'));
|
|
78
|
+
if (data['$key'] !== undefined) console.log(String(data['$key']));
|
|
79
|
+
"
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
#### 4. Daemon Security
|
|
84
|
+
|
|
85
|
+
The background daemon includes multiple protections:
|
|
86
|
+
|
|
87
|
+
- **Symlink protection**: Skips symlinks to prevent symlink attacks
|
|
88
|
+
- **Path validation**: Verifies destinations are within FORGE_ROOT
|
|
89
|
+
- **Atomic operations**: Uses temp files + move for safe writes
|
|
90
|
+
- **Lock files**: Prevents multiple daemon instances
|
|
91
|
+
- **Log rotation**: Bounded log growth prevents disk exhaustion
|
|
92
|
+
|
|
93
|
+
### Risks to Be Aware Of
|
|
94
|
+
|
|
95
|
+
Even with mitigations, understand these risks:
|
|
96
|
+
|
|
97
|
+
1. **AI agents can modify any file** in your project without confirmation
|
|
98
|
+
2. **AI agents can execute any command** without confirmation
|
|
99
|
+
3. **Malicious prompts** could potentially be injected if context files are compromised
|
|
100
|
+
4. **Network access** is unrestricted - agents could make API calls
|
|
101
|
+
|
|
102
|
+
### Recommendations
|
|
103
|
+
|
|
104
|
+
1. **Use in development environments only** - Don't run on production systems
|
|
105
|
+
2. **Use with version control** - Git makes it easy to review and revert changes
|
|
106
|
+
3. **Review at checkpoints** - Check agent work during task transitions
|
|
107
|
+
4. **Understand the personality files** - They define agent behavior
|
|
108
|
+
5. **Keep project context secure** - Don't include secrets in context files
|
|
109
|
+
6. **Run in isolated environments** - Consider containers for sensitive projects
|
|
110
|
+
|
|
111
|
+
### Alternative: Manual Approval Mode
|
|
112
|
+
|
|
113
|
+
If you prefer permission prompts, you can modify the agent startup in `bin/forge.sh`:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# Change this:
|
|
117
|
+
claude --dangerously-skip-permissions --system-prompt "$system_prompt" "startup"
|
|
118
|
+
|
|
119
|
+
# To this (removes the flag):
|
|
120
|
+
claude --system-prompt "$system_prompt" "startup"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Note: This will significantly impact the autonomous workflow.
|
|
124
|
+
|
|
125
|
+
## Reporting Security Issues
|
|
126
|
+
|
|
127
|
+
If you discover a security vulnerability in Vibe Forge:
|
|
128
|
+
|
|
129
|
+
1. **Do not open a public issue**
|
|
130
|
+
2. Email security concerns to the maintainers
|
|
131
|
+
3. Include steps to reproduce
|
|
132
|
+
4. Allow time for a fix before public disclosure
|
|
133
|
+
|
|
134
|
+
## Security Checklist for Contributors
|
|
135
|
+
|
|
136
|
+
When contributing to Vibe Forge:
|
|
137
|
+
|
|
138
|
+
- [ ] Never pass user input directly to shell commands
|
|
139
|
+
- [ ] Always validate agent names against the whitelist
|
|
140
|
+
- [ ] Use safe JSON parsing (Node.js, not grep/cut)
|
|
141
|
+
- [ ] Validate file paths don't traverse outside expected directories
|
|
142
|
+
- [ ] Use atomic file operations where race conditions are possible
|
|
143
|
+
- [ ] Add tests for security-sensitive functions
|
|
144
|
+
- [ ] Document any new security considerations
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibe-forge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Multi-agent development orchestration system for terminal-native vibe coding",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"vibe-coding",
|
|
@@ -31,8 +31,17 @@
|
|
|
31
31
|
"agents/",
|
|
32
32
|
"config/",
|
|
33
33
|
"context/",
|
|
34
|
-
"tasks/"
|
|
34
|
+
"tasks/",
|
|
35
|
+
".claude/",
|
|
36
|
+
"docs/"
|
|
35
37
|
],
|
|
38
|
+
"scripts": {
|
|
39
|
+
"test": "jest tests/js/",
|
|
40
|
+
"test:js": "jest tests/js/"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"jest": "^29.7.0"
|
|
44
|
+
},
|
|
36
45
|
"engines": {
|
|
37
46
|
"node": ">=16.0.0"
|
|
38
47
|
}
|