
Security News
Axios Maintainer Confirms Social Engineering Attack Behind npm Compromise
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.
@fwdslsh/pace
Advanced tools
A Bun/TypeScript implementation that orchestrates continuous coding agent sessions using multiple agent SDKs for maximum visibility and flexibility. Supports both the Claude Agent SDK and OpenCode SDK.
Install the latest version using the installation script:
# Install system-wide (requires sudo)
curl -fsSL https://raw.githubusercontent.com/fwdslsh/pace/main/install.sh | bash
# Install to user directory (~/.local/bin)
curl -fsSL https://raw.githubusercontent.com/fwdslsh/pace/main/install.sh | bash -s -- --user
# Install specific version
curl -fsSL https://raw.githubusercontent.com/fwdslsh/pace/main/install.sh | bash -s -- --version v0.1.0
# Global installation
npm install -g @fwdslsh/pace
# Or use npx (no installation required)
npx @fwdslsh/pace --help
For development or building from source:
git clone https://github.com/fwdslsh/pace.git
cd pace
bun install
bun run cli.ts --help
To create standalone executables:
# Build for current platform
bun run build
# Build for all platforms
bun run build:all
For Claude SDK (default):
export ANTHROPIC_API_KEY=your-api-key-here
For OpenCode SDK:
# Optional - defaults to http://localhost:4096
export OPENCODE_SERVER_URL=http://localhost:4096
The orchestrator provides multiple commands for different tasks:
bun run cli.ts [COMMAND] [OPTIONS]
Available Commands:
run - Run the orchestrator (default)status - Show project status and progressvalidate - Validate feature_list.json structureupdate - Update a feature's pass/fail statushelp - Show help messageRun the orchestrator:
bun run cli.ts
# or explicitly
bun run cli.ts run --max-sessions 10
Check project status:
bun run cli.ts status
bun run cli.ts status --verbose
bun run cli.ts status --json # JSON output for scripting
Validate feature list:
bun run cli.ts validate
bun run cli.ts validate --json # JSON output
Update feature status:
bun run cli.ts update F001 pass
bun run cli.ts update F002 fail
bun run cli.ts update F001 pass --json # JSON output
Using OpenCode SDK:
bun run cli.ts run --sdk opencode
Override SDK home directory:
# Useful for testing or multi-environment setups
bun run cli.ts run --home-dir /custom/path/.claude
bun run cli.ts run --home-dir ~/.config/opencode-test
Run until all features pass:
bun run cli.ts --until-complete
# or
npm run cli:complete
Run a specific number of sessions:
bun run cli.ts --max-sessions 20
Adjust failure tolerance:
bun run cli.ts --max-failures 5
Preview without executing:
bun run cli.ts --dry-run --max-sessions 5
Run Command:
--sdk SDK Agent SDK to use: 'claude' or 'opencode' (default: claude)
--project-dir, -d DIR Project directory (default: current directory)
--home-dir DIR Override SDK home directory (~/.claude or ~/.config/opencode)
--max-sessions, -n N Maximum number of sessions to run (default: 10)
--max-failures, -f N Stop after N consecutive failures (default: 3)
--delay SECONDS Seconds to wait between sessions (default: 5)
--until-complete Run until all features pass (implies unlimited sessions)
--dry-run Show what would be done without executing
--json Output results in JSON format
--help, -h Show this help message
Status Command:
--verbose, -v Show detailed breakdown by category
--json Output results in JSON format
--project-dir, -d DIR Project directory (default: current directory)
Validate Command:
--json Output results in JSON format
--project-dir, -d DIR Project directory (default: current directory)
Update Command:
bun run cli.ts update <feature-id> <pass|fail>
--json Output results in JSON format
--project-dir, -d DIR Project directory (default: current directory)
feature_list.json and claude-progress.txtfeature_list.jsonThe orchestrator stops when:
System Initialization:
📋 Session initialized:
- Model: claude-sonnet-4-5-20250929
- CWD: /path/to/project
- Tools: Read, Write, Edit, Bash, Grep, Glob, ...
- Permission mode: acceptEdits
Tool Execution:
🔧 Tool: Read
Input: {
"file_path": "/path/to/file.ts",
"offset": 1,
"limit": 50
}
✅ Tool result: [file contents...]
Session Result:
🎯 Session Result
============================================================
Status: success
Turns: 12
Duration: 45.32s
API Time: 38.21s
Cost: $0.0234
Tokens: 15234 in / 2891 out
Cache: 12890 read / 0 created
Result: Feature AUTH-001 implemented successfully
============================================================
All commands support --json flag for machine-readable output, perfect for scripting and CI/CD integration.
bun run cli.ts status --json
{
"progress": {
"passing": 5,
"failing": 3,
"total": 8,
"percentage": 62.5
},
"projectName": "My Project",
"nextFeatures": [
{
"id": "F001",
"description": "Feature description",
"priority": "high",
"category": "core"
}
],
"workingDirectory": "/path/to/project"
}
bun run cli.ts validate --json
{
"valid": true,
"errorCount": 0,
"errors": [],
"stats": {
"total": 8,
"passing": 5,
"failing": 3,
"byCategory": {
"core": 3,
"ui": 2,
"api": 3
},
"byPriority": {
"critical": 1,
"high": 3,
"medium": 3,
"low": 1
}
}
}
bun run cli.ts update F001 pass --json
{
"success": true,
"featureId": "F001",
"oldStatus": "failing",
"newStatus": "passing",
"description": "Feature description",
"category": "core",
"progress": {
"passing": 6,
"total": 8,
"percentage": 75
}
}
bun run cli.ts run --json --max-sessions 5
{
"sdk": "claude",
"sessionsRun": 5,
"featuresCompleted": 2,
"finalProgress": "7/8",
"completionPercentage": 87.5,
"elapsedTime": "5m 32s",
"isComplete": false,
"progress": {
"passing": 7,
"total": 8
}
}
#!/bin/bash
# ci-test.sh - Run orchestrator and check exit code
# Run orchestrator
bun run cli.ts run --max-sessions 10 --json > results.json
EXIT_CODE=$?
# Parse results
PASSING=$(jq '.progress.passing' results.json)
TOTAL=$(jq '.progress.total' results.json)
echo "Test Results: $PASSING/$TOTAL features passing"
# Exit with orchestrator's exit code (0 if complete, 1 if incomplete)
exit $EXIT_CODE
The default SDK provides rich integration with Anthropic's Claude:
CLAUDE.md and project settingsUsage:
bun run cli.ts --sdk claude --max-sessions 10
Requirements:
ANTHROPIC_API_KEY environment variableAlternative SDK for OpenCode-powered agent sessions:
Usage:
# Local OpenCode server (default)
bun run cli.ts --sdk opencode
# Remote OpenCode server
OPENCODE_SERVER_URL=http://your-server:4096 bun run cli.ts --sdk opencode
Requirements:
http://localhost:4096)OPENCODE_SERVER_URL| Feature | Claude SDK | OpenCode SDK |
|---|---|---|
| Cost Tracking | ✅ | ❌ |
| Tool Call Details | ✅ | ✅ |
| Streaming Events | ✅ | ✅ |
| Local Execution | ❌ | ✅ |
| Multiple Providers | ❌ | ✅ |
| Built-in Permissions | ✅ | ❌ |
| Requires API Key | ✅ | Varies |
The orchestrator expects a feature_list.json file in the project directory with this structure:
{
"features": [
{
"id": "AUTH-001",
"description": "Implement user authentication",
"priority": "critical",
"passes": false
},
{
"id": "UI-002",
"description": "Add dark mode toggle",
"priority": "medium",
"passes": true
}
],
"metadata": {
"lastUpdated": "2025-11-28T10:30:00Z"
}
}
Agent SDK not found:
bun install @anthropic-ai/claude-agent-sdk
API key not set:
export ANTHROPIC_API_KEY=your-api-key-here
Permission errors:
The orchestrator uses permissionMode: 'acceptEdits' to auto-accept file edits. Adjust in the code if you need different behavior.
OpenCode SDK not found:
bun install @opencode-ai/sdk
Cannot connect to OpenCode server:
Make sure OpenCode server is running:
# Check if server is accessible
curl http://localhost:4096/health
Set custom server URL if needed:
export OPENCODE_SERVER_URL=http://your-server:4096
Session events not streaming:
No features progressing: Check that:
feature_list.jsoninit.sh)| Feature | Python Version | TypeScript (Bun) Version |
|---|---|---|
| Runtime | Python 3 | Bun |
| API | Subprocess to Claude CLI | Claude Agent SDK |
| Visibility | Command output only | Full message streaming |
| Tool Tracking | None | Complete with inputs/outputs |
| Cost Tracking | None | Built-in per session |
| Performance | Subprocess overhead | Direct SDK calls |
| Debugging | Limited | Rich event stream |
The codebase is organized into modular components for better maintainability:
pace/
├── cli.ts # Main CLI entry point
├── src/
│ ├── types.ts # Shared TypeScript type definitions
│ ├── feature-manager.ts # Feature list operations (load, save, query)
│ ├── validators.ts # Feature list validation logic
│ ├── status-reporter.ts # Status display and reporting
│ ├── orchestrator.ts # Main orchestration logic
│ └── sdk/
│ ├── base.ts # SDK abstraction interface
│ ├── claude.ts # Claude Agent SDK implementation
│ └── opencode.ts # OpenCode SDK implementation
├── tests/ # Comprehensive test suite (90+ tests)
│ ├── feature-manager.test.ts
│ ├── validators.test.ts
│ ├── status-reporter.test.ts
│ ├── orchestrator.test.ts
│ └── cli.test.ts
├── examples/
│ ├── show_status.py # Python reference implementation
│ ├── update_feature.py # Python reference implementation
│ └── validate_features.py # Python reference implementation
└── package.json
The project includes a comprehensive test suite with 90+ tests covering all functionality.
# Run all tests
bun test
# Run tests in watch mode
bun test --watch
# Run specific test file
bun test tests/feature-manager.test.ts
# Run with verbose output
bun test --verbose
The test suite includes:
Unit Tests:
tests/feature-manager.test.ts - Feature list operations (41 tests)tests/validators.test.ts - Validation logic (13 tests)tests/status-reporter.test.ts - Status reporting (13 tests)tests/orchestrator.test.ts - Orchestration logic (14 tests)Integration Tests:
tests/cli.test.ts - End-to-end CLI testing (20 tests)tests/
├── feature-manager.test.ts # Feature CRUD operations
├── validators.test.ts # Feature list validation
├── status-reporter.test.ts # Status display and JSON output
├── orchestrator.test.ts # Session orchestration
└── cli.test.ts # CLI integration tests
Tests use Bun's built-in test runner:
import { describe, it, expect, beforeEach, afterEach } from 'bun:test';
describe('MyFeature', () => {
beforeEach(() => {
// Setup code
});
afterEach(() => {
// Cleanup code
});
it('should do something', () => {
expect(1 + 1).toBe(2);
});
});
Use --home-dir to test with different SDK configurations without affecting your main setup:
# Test with a temporary Claude config
bun run cli.ts run --home-dir /tmp/test-claude --dry-run
# Test with a separate OpenCode config
bun run cli.ts run --sdk opencode --home-dir /tmp/test-opencode --dry-run
Key areas to customize:
src/orchestrator.ts - buildCodingPrompt() methodsrc/feature-manager.ts - getNextFeature() methodsrc/orchestrator.ts - runCodingSession() after executionsrc/sdk/claude.ts or src/sdk/opencode.ts - message handlingsrc/sdk/ (e.g., src/sdk/myai.ts)AgentSessionRunner interface from src/sdk/base.tsSDKChoice type in src/types.tsOrchestrator.getSessionRunner() in src/orchestrator.tsParsedArgs['command'] union in cli.tshandle<Command>() functionswitch statement in main()printHelp() with command documentationPACE uses automated GitHub Actions for building and releasing:
Tag a version:
git tag v0.2.0
git push origin v0.2.0
Automated workflow:
@fwdslsh/paceYou can also trigger releases manually from GitHub Actions:
Actions → Release → Run workflow → Enter tag (e.g., v0.2.0)
Each release includes standalone executables:
pace-linux-x64 - Linux x86_64pace-linux-arm64 - Linux ARM64pace-darwin-x64 - macOS Intelpace-darwin-arm64 - macOS Apple Siliconpace-windows-x64.exe - Windows x86_64Users can install PACE via:
Installation script (recommended):
curl -fsSL https://raw.githubusercontent.com/fwdslsh/pace/main/install.sh | bash
NPM (for Node.js/Bun projects):
npm install -g @fwdslsh/pace
Direct download from GitHub releases:
wget https://github.com/fwdslsh/pace/releases/latest/download/pace-linux-x64
chmod +x pace-linux-x64
mv pace-linux-x64 /usr/local/bin/pace
MIT License - see LICENSE file for details.
FAQs
Project Autonomous Coding Environment - Long-running agent orchestrator
We found that @fwdslsh/pace demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.