forge-dev-framework 1.0.1
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/rules/api-patterns.md +98 -0
- package/.claude/rules/security-baseline.md +204 -0
- package/.claude/rules/testing-standards.md +177 -0
- package/.claude/rules/ui-conventions.md +142 -0
- package/README.md +261 -0
- package/bin/forge.js +14 -0
- package/dist/bin/forge.js +14 -0
- package/dist/cli/index.d.ts +22 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +116 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/base.d.ts +31 -0
- package/dist/commands/base.d.ts.map +1 -0
- package/dist/commands/base.js +31 -0
- package/dist/commands/base.js.map +1 -0
- package/dist/commands/config.d.ts +14 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +175 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/generate.d.ts +17 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +159 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/help.d.ts +11 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +65 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/index.d.ts +8 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +8 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +10 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +22 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/status.d.ts +13 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +101 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stubs.d.ts +14 -0
- package/dist/commands/stubs.d.ts.map +1 -0
- package/dist/commands/stubs.js +30 -0
- package/dist/commands/stubs.js.map +1 -0
- package/dist/generators/index.d.ts +11 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +10 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/required-fields.d.ts +74 -0
- package/dist/generators/required-fields.d.ts.map +1 -0
- package/dist/generators/required-fields.js +179 -0
- package/dist/generators/required-fields.js.map +1 -0
- package/dist/generators/template-engine.d.ts +65 -0
- package/dist/generators/template-engine.d.ts.map +1 -0
- package/dist/generators/template-engine.js +209 -0
- package/dist/generators/template-engine.js.map +1 -0
- package/dist/generators/token-validator.d.ts +51 -0
- package/dist/generators/token-validator.d.ts.map +1 -0
- package/dist/generators/token-validator.js +141 -0
- package/dist/generators/token-validator.js.map +1 -0
- package/dist/generators/types.d.ts +433 -0
- package/dist/generators/types.d.ts.map +1 -0
- package/dist/generators/types.js +5 -0
- package/dist/generators/types.js.map +1 -0
- package/dist/generators/xml-task-generator.d.ts +67 -0
- package/dist/generators/xml-task-generator.d.ts.map +1 -0
- package/dist/generators/xml-task-generator.js +297 -0
- package/dist/generators/xml-task-generator.js.map +1 -0
- package/dist/git/__tests__/worktree.test.d.ts +5 -0
- package/dist/git/__tests__/worktree.test.d.ts.map +1 -0
- package/dist/git/__tests__/worktree.test.js +121 -0
- package/dist/git/__tests__/worktree.test.js.map +1 -0
- package/dist/git/codeowners.d.ts +101 -0
- package/dist/git/codeowners.d.ts.map +1 -0
- package/dist/git/codeowners.js +216 -0
- package/dist/git/codeowners.js.map +1 -0
- package/dist/git/commit.d.ts +135 -0
- package/dist/git/commit.d.ts.map +1 -0
- package/dist/git/commit.js +223 -0
- package/dist/git/commit.js.map +1 -0
- package/dist/git/hooks/commit-msg.d.ts +8 -0
- package/dist/git/hooks/commit-msg.d.ts.map +1 -0
- package/dist/git/hooks/commit-msg.js +34 -0
- package/dist/git/hooks/commit-msg.js.map +1 -0
- package/dist/git/hooks/pre-commit.d.ts +8 -0
- package/dist/git/hooks/pre-commit.d.ts.map +1 -0
- package/dist/git/hooks/pre-commit.js +34 -0
- package/dist/git/hooks/pre-commit.js.map +1 -0
- package/dist/git/pre-commit-hooks.d.ts +117 -0
- package/dist/git/pre-commit-hooks.d.ts.map +1 -0
- package/dist/git/pre-commit-hooks.js +270 -0
- package/dist/git/pre-commit-hooks.js.map +1 -0
- package/dist/git/wipe-protocol.d.ts +281 -0
- package/dist/git/wipe-protocol.d.ts.map +1 -0
- package/dist/git/wipe-protocol.js +237 -0
- package/dist/git/wipe-protocol.js.map +1 -0
- package/dist/git/worktree.d.ts +69 -0
- package/dist/git/worktree.d.ts.map +1 -0
- package/dist/git/worktree.js +202 -0
- package/dist/git/worktree.js.map +1 -0
- package/dist/scripts/install.d.ts +8 -0
- package/dist/scripts/install.d.ts.map +1 -0
- package/dist/scripts/install.js +161 -0
- package/dist/scripts/install.js.map +1 -0
- package/dist/types/config.d.ts +30 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +23 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/state.d.ts +56 -0
- package/dist/types/state.d.ts.map +1 -0
- package/dist/types/state.js +6 -0
- package/dist/types/state.js.map +1 -0
- package/dist/utils/config.d.ts +15 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +80 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/errors.d.ts +25 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +48 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +11 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +34 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +73 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/state-api.d.ts +128 -0
- package/dist/utils/state-api.d.ts.map +1 -0
- package/dist/utils/state-api.js +170 -0
- package/dist/utils/state-api.js.map +1 -0
- package/dist/utils/template-client.d.ts +73 -0
- package/dist/utils/template-client.d.ts.map +1 -0
- package/dist/utils/template-client.js +151 -0
- package/dist/utils/template-client.js.map +1 -0
- package/package.json +72 -0
package/README.md
ADDED
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# FORGE
|
|
2
|
+
|
|
3
|
+
> **Full Orchestration for Rapid Git Engineering**
|
|
4
|
+
|
|
5
|
+
A multi-agent development framework for Claude Code Agent Teams that forges production-quality code through parallel specialization, adversarial verification, and bulletproof context engineering.
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/forge-dev-framework)
|
|
8
|
+
[](https://opensource.org/licenses/MIT)
|
|
9
|
+
|
|
10
|
+
## Features
|
|
11
|
+
|
|
12
|
+
- 🏗️ **Event-Sourced State Engine** — Append-only event log with single-writer merge
|
|
13
|
+
- 🤖 **Multi-Agent Coordination** — Contract-first protocol for parallel execution
|
|
14
|
+
- 📝 **Template-Based Artifacts** — Generate CLAUDE.md, REQUIREMENTS.md, ROADMAP.md
|
|
15
|
+
- 🌳 **Git Worktree Isolation** — Parallel task execution without conflicts
|
|
16
|
+
- ⚡ **Slash Commands** — Use `/forge:plan`, `/forge:execute` directly in Claude Code
|
|
17
|
+
- 🎯 **5-6 Task Limit** — Enforced atomic task breakdown for optimal LLM performance
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
|
|
21
|
+
### Global Installation (Recommended)
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Install globally via npm
|
|
25
|
+
npm install -g forge-dev-framework
|
|
26
|
+
|
|
27
|
+
# Commands are automatically installed to ~/.claude/commands/forge/
|
|
28
|
+
# Available from any project in Claude Code
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Per-Project Installation
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Install in a specific project
|
|
35
|
+
cd /path/to/your/project
|
|
36
|
+
npm install forge-dev-framework
|
|
37
|
+
|
|
38
|
+
# Commands installed to project .claude/commands/forge/
|
|
39
|
+
# Available only in this project
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Development Installation
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Clone the repository
|
|
46
|
+
git clone https://github.com/Alzarak/forge.git
|
|
47
|
+
cd forge
|
|
48
|
+
|
|
49
|
+
# Install dependencies
|
|
50
|
+
npm install
|
|
51
|
+
|
|
52
|
+
# Build the project
|
|
53
|
+
npm run build
|
|
54
|
+
|
|
55
|
+
# Install commands (global mode)
|
|
56
|
+
node dist/scripts/install.js --mode=global
|
|
57
|
+
|
|
58
|
+
# Or install to current project (project mode)
|
|
59
|
+
node dist/scripts/install.js --mode=project
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Quick Start
|
|
63
|
+
|
|
64
|
+
### Using Slash Commands (Recommended)
|
|
65
|
+
|
|
66
|
+
After installation, FORGE commands are available directly in Claude Code:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Start a new FORGE project
|
|
70
|
+
/forge:new-project my-app
|
|
71
|
+
|
|
72
|
+
# Plan a phase
|
|
73
|
+
/forge:discuss M2-planning-engine
|
|
74
|
+
/forge:plan M2-planning-engine
|
|
75
|
+
|
|
76
|
+
# Execute with agent teams
|
|
77
|
+
/forge:execute M2-planning-engine
|
|
78
|
+
|
|
79
|
+
# Check progress
|
|
80
|
+
/forge:status
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Using CLI
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# Initialize FORGE in current directory
|
|
87
|
+
forge init
|
|
88
|
+
|
|
89
|
+
# Show project status
|
|
90
|
+
forge status
|
|
91
|
+
|
|
92
|
+
# Generate artifacts
|
|
93
|
+
forge generate requirements
|
|
94
|
+
forge generate roadmap
|
|
95
|
+
|
|
96
|
+
# View configuration
|
|
97
|
+
forge config
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Available Commands
|
|
101
|
+
|
|
102
|
+
| Command | Description | Milestone |
|
|
103
|
+
|---------|-------------|-----------|
|
|
104
|
+
| `/forge:new-project` | Initialize a new FORGE project | M1 ✅ |
|
|
105
|
+
| `/forge:init` | Initialize FORGE in current directory | M1 ✅ |
|
|
106
|
+
| `/forge:status` | Show project progress | M1 ✅ |
|
|
107
|
+
| `/forge:config` | View/edit configuration | M1 ✅ |
|
|
108
|
+
| `/forge:discuss` | Capture phase context | M2 🚧 |
|
|
109
|
+
| `/forge:plan` | Generate task breakdown | M2 🚧 |
|
|
110
|
+
| `/forge:verify` | Verify plan against requirements | M2 🚧 |
|
|
111
|
+
| `/forge:execute` | Execute phase with agent teams | M3 📋 |
|
|
112
|
+
| `/forge:generate` | Generate artifacts from templates | M1 ✅ |
|
|
113
|
+
| `/forge:help` | Show command reference | M1 ✅ |
|
|
114
|
+
|
|
115
|
+
Legend: ✅ Complete | 🚧 In Progress | 📋 Planned
|
|
116
|
+
|
|
117
|
+
## Architecture
|
|
118
|
+
|
|
119
|
+
### Event-Sourced State
|
|
120
|
+
|
|
121
|
+
FORGE uses an append-only event log with single-writer state derivation:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
All Agents → state/events/*.json (append-only)
|
|
125
|
+
↓
|
|
126
|
+
State Steward (single writer)
|
|
127
|
+
↓
|
|
128
|
+
state/STATE.json (canonical)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Contract-First Protocol
|
|
132
|
+
|
|
133
|
+
Cross-domain work requires published contracts first:
|
|
134
|
+
|
|
135
|
+
1. Agent needs interface from another domain
|
|
136
|
+
2. Write `REQUEST_CONTRACT` event
|
|
137
|
+
3. Provider publishes contract to `contracts/`
|
|
138
|
+
4. Both agents work against agreed contract
|
|
139
|
+
5. Integration happens at merge time
|
|
140
|
+
|
|
141
|
+
### File Ownership Boundaries
|
|
142
|
+
|
|
143
|
+
Each teammate writes only within their owned paths:
|
|
144
|
+
|
|
145
|
+
| Role | Owned Paths |
|
|
146
|
+
|---|---|
|
|
147
|
+
| ARCHITECT | Root artifacts, `.claude/rules/`, `STATE.json` (single-writer) |
|
|
148
|
+
| STATE-ENGINE | `STATE.schema.json`, event schemas, merge logic |
|
|
149
|
+
| CLI-ENGINE | `src/cli/`, `src/commands/`, `bin/` |
|
|
150
|
+
| TEMPLATES | `src/templates/`, `src/generators/` |
|
|
151
|
+
| GIT-OPS | `src/git/`, `.github/` |
|
|
152
|
+
|
|
153
|
+
### Wipe Protocol
|
|
154
|
+
|
|
155
|
+
Agent context is ephemeral, git is persistent:
|
|
156
|
+
|
|
157
|
+
1. **Hydrate** — Agent reads CLAUDE.md + STATE.json + task + contracts
|
|
158
|
+
2. **Execute** — Agent writes code, runs tests
|
|
159
|
+
3. **Commit** — Atomic git commit (one task = one commit)
|
|
160
|
+
4. **Terminate** — Session ends, context wiped
|
|
161
|
+
5. **Reincarnate** — Next task starts with fresh context
|
|
162
|
+
|
|
163
|
+
## Configuration
|
|
164
|
+
|
|
165
|
+
FORGE configuration is stored in `.planning/forge.config.json`:
|
|
166
|
+
|
|
167
|
+
```json
|
|
168
|
+
{
|
|
169
|
+
"mode": "interactive",
|
|
170
|
+
"depth": "standard",
|
|
171
|
+
"maxTeammates": 5,
|
|
172
|
+
"taskLimit": 6,
|
|
173
|
+
"conventionalCommits": true,
|
|
174
|
+
"worktreeIsolation": true
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Available Settings
|
|
179
|
+
|
|
180
|
+
| Key | Type | Default | Description |
|
|
181
|
+
|-----|------|---------|-------------|
|
|
182
|
+
| mode | enum | interactive | yolo, interactive, standard |
|
|
183
|
+
| depth | enum | standard | quick, standard, comprehensive |
|
|
184
|
+
| maxTeammates | int | 5 | Max agents per phase (2-10) |
|
|
185
|
+
| taskLimit | int | 6 | Max tasks per phase (5-6 recommended) |
|
|
186
|
+
| conventionalCommits | bool | true | Enforce commit format |
|
|
187
|
+
| worktreeIsolation | bool | true | Use worktrees for tasks |
|
|
188
|
+
|
|
189
|
+
## Development
|
|
190
|
+
|
|
191
|
+
### Setup
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
# Clone repository
|
|
195
|
+
git clone https://github.com/Alzarak/forge.git
|
|
196
|
+
cd forge
|
|
197
|
+
|
|
198
|
+
# Install dependencies
|
|
199
|
+
npm install
|
|
200
|
+
|
|
201
|
+
# Build project
|
|
202
|
+
npm run build
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Scripts
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
npm run build # Build TypeScript to dist/
|
|
209
|
+
npm run dev # Run CLI in development mode
|
|
210
|
+
npm test # Run tests
|
|
211
|
+
npm run test:watch # Run tests in watch mode
|
|
212
|
+
npm run test:coverage # Run tests with coverage
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Project Structure
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
forge/
|
|
219
|
+
├── .claude/
|
|
220
|
+
│ ├── commands/ # Slash command definitions
|
|
221
|
+
│ └── rules/ # Scoped rules (api-patterns, etc.)
|
|
222
|
+
├── src/
|
|
223
|
+
│ ├── cli/ # CLI entry point
|
|
224
|
+
│ ├── commands/ # Command implementations
|
|
225
|
+
│ ├── generators/ # Template engine & XML generator
|
|
226
|
+
│ ├── git/ # Git operations (worktrees, hooks)
|
|
227
|
+
│ ├── types/ # TypeScript type definitions
|
|
228
|
+
│ ├── utils/ # Utilities (logger, state-api, etc.)
|
|
229
|
+
│ └── scripts/ # Installation scripts
|
|
230
|
+
├── templates/ # Artifact templates
|
|
231
|
+
├── bin/ # Executable entry point
|
|
232
|
+
├── state/ # State engine (events, STATE.json)
|
|
233
|
+
└── contracts/ # API contracts
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Contributing
|
|
237
|
+
|
|
238
|
+
Contributions are welcome! Please read [CLAUDE.md](./CLAUDE.md) for project patterns and conventions.
|
|
239
|
+
|
|
240
|
+
### Development Workflow
|
|
241
|
+
|
|
242
|
+
1. Make changes following FORGE patterns
|
|
243
|
+
2. Run tests: `npm test`
|
|
244
|
+
3. Build: `npm run build`
|
|
245
|
+
4. Commit: `type(scope): description`
|
|
246
|
+
5. Push: PR review required
|
|
247
|
+
|
|
248
|
+
## License
|
|
249
|
+
|
|
250
|
+
MIT © [Alzarak](https://github.com/Alzarak)
|
|
251
|
+
|
|
252
|
+
## Links
|
|
253
|
+
|
|
254
|
+
- **Documentation**: [CLAUDE.md](./CLAUDE.md)
|
|
255
|
+
- **Requirements**: [REQUIREMENTS.md](./REQUIREMENTS.md)
|
|
256
|
+
- **Roadmap**: [ROADMAP.md](./ROADMAP.md)
|
|
257
|
+
- **Issues**: [GitHub Issues](https://github.com/Alzarak/forge/issues)
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
**Built with ❤️ by the FORGE Agent Team**
|
package/bin/forge.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* FORGE CLI Executable
|
|
5
|
+
* Entry point for the `forge` command
|
|
6
|
+
* This is the compiled version for npm distribution
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { run } from './dist/cli/index.js';
|
|
10
|
+
|
|
11
|
+
run().catch((error) => {
|
|
12
|
+
console.error('FORGE CLI crashed:', error);
|
|
13
|
+
process.exit(1);
|
|
14
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* FORGE CLI Executable
|
|
5
|
+
* Entry point for the `forge` command
|
|
6
|
+
* This is the compiled version for npm distribution
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { run } from './dist/cli/index.js';
|
|
10
|
+
|
|
11
|
+
run().catch((error) => {
|
|
12
|
+
console.error('FORGE CLI crashed:', error);
|
|
13
|
+
process.exit(1);
|
|
14
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* FORGE CLI Entry Point
|
|
4
|
+
* Main command dispatcher and initialization
|
|
5
|
+
*/
|
|
6
|
+
declare class ForgeCLI {
|
|
7
|
+
private program;
|
|
8
|
+
private logger;
|
|
9
|
+
constructor();
|
|
10
|
+
private setup;
|
|
11
|
+
private registerCommands;
|
|
12
|
+
/**
|
|
13
|
+
* Display banner (shown on first run or when explicitly requested)
|
|
14
|
+
*/
|
|
15
|
+
showBanner(): void;
|
|
16
|
+
/**
|
|
17
|
+
* Parse and execute CLI arguments
|
|
18
|
+
*/
|
|
19
|
+
run(argv?: string[]): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export { ForgeCLI };
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAoBH,cAAM,QAAQ;IACZ,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,MAAM,CAAS;;IAQvB,OAAO,CAAC,KAAK;IAqBb,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,UAAU,IAAI,IAAI;IAalB;;OAEG;IACG,GAAG,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CAoBxD;AAQD,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* FORGE CLI Entry Point
|
|
4
|
+
* Main command dispatcher and initialization
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import figlet from 'figlet';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { fileURLToPath } from 'url';
|
|
11
|
+
// Import commands
|
|
12
|
+
import { HelpCommand } from '../commands/help.js';
|
|
13
|
+
import { StatusCommand } from '../commands/status.js';
|
|
14
|
+
import { ConfigCommand } from '../commands/config.js';
|
|
15
|
+
import { InitCommand } from '../commands/init.js';
|
|
16
|
+
import { GenerateCommand } from '../commands/generate.js';
|
|
17
|
+
import { createStubCommand } from '../commands/stubs.js';
|
|
18
|
+
import { Logger } from '../utils/logger.js';
|
|
19
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
20
|
+
const __dirname = path.dirname(__filename);
|
|
21
|
+
class ForgeCLI {
|
|
22
|
+
program;
|
|
23
|
+
logger;
|
|
24
|
+
constructor() {
|
|
25
|
+
this.program = new Command();
|
|
26
|
+
this.logger = new Logger();
|
|
27
|
+
this.setup();
|
|
28
|
+
}
|
|
29
|
+
setup() {
|
|
30
|
+
// Program metadata
|
|
31
|
+
this.program
|
|
32
|
+
.name('forge')
|
|
33
|
+
.description('Full Orchestration for Rapid Git Engineering')
|
|
34
|
+
.version('1.0.0')
|
|
35
|
+
.option('-q, --quiet', 'Suppress non-error output')
|
|
36
|
+
.option('-v, --verbose', 'Enable verbose output')
|
|
37
|
+
.option('--debug', 'Enable debug mode');
|
|
38
|
+
// Register all commands
|
|
39
|
+
this.registerCommands();
|
|
40
|
+
// Handle unknown commands
|
|
41
|
+
this.program.on('command:*', (operands) => {
|
|
42
|
+
this.logger.error(`Unknown command: ${operands[0]}`);
|
|
43
|
+
this.logger.info('Run "forge help" to see available commands.');
|
|
44
|
+
process.exit(1);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
registerCommands() {
|
|
48
|
+
// Core commands
|
|
49
|
+
new InitCommand(this.program).register();
|
|
50
|
+
new StatusCommand(this.program).register();
|
|
51
|
+
new ConfigCommand(this.program).register();
|
|
52
|
+
new GenerateCommand(this.program).register();
|
|
53
|
+
new HelpCommand(this.program).register();
|
|
54
|
+
// Stub commands for future milestones
|
|
55
|
+
createStubCommand('scan', 'Map existing codebase (brownfield projects)')(this.program);
|
|
56
|
+
createStubCommand('discuss <phase>', 'Shape implementation decisions before planning')(this.program);
|
|
57
|
+
createStubCommand('plan <phase>', 'Research-backed atomic task plans')(this.program);
|
|
58
|
+
createStubCommand('deploy <phase>', 'Spawn parallel specialists, execute tasks')(this.program);
|
|
59
|
+
createStubCommand('tribunal <phase>', 'Adversarial security + QA review')(this.program);
|
|
60
|
+
createStubCommand('verify <phase>', 'Human acceptance testing walkthrough')(this.program);
|
|
61
|
+
createStubCommand('ship', 'Archive milestone, tag release')(this.program);
|
|
62
|
+
createStubCommand('next', 'Start next milestone')(this.program);
|
|
63
|
+
createStubCommand('graph', 'Render Mermaid dependency graph')(this.program);
|
|
64
|
+
createStubCommand('events', 'Stream recent state events')(this.program);
|
|
65
|
+
createStubCommand('quick', 'Ad-hoc tasks with FORGE guarantees')(this.program);
|
|
66
|
+
createStubCommand('debug <desc>', 'Spawn debug agents')(this.program);
|
|
67
|
+
createStubCommand('add-phase', 'Add a phase to current milestone')(this.program);
|
|
68
|
+
createStubCommand('insert-phase <N>', 'Insert a phase at position N')(this.program);
|
|
69
|
+
createStubCommand('remove-phase <N>', 'Remove phase N')(this.program);
|
|
70
|
+
createStubCommand('replan <phase>', 'Re-research and re-plan a phase')(this.program);
|
|
71
|
+
createStubCommand('pause', 'Persist state, safe to close terminal')(this.program);
|
|
72
|
+
createStubCommand('resume', 'Hydrate from saved state')(this.program);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Display banner (shown on first run or when explicitly requested)
|
|
76
|
+
*/
|
|
77
|
+
showBanner() {
|
|
78
|
+
console.log(chalk.cyan(figlet.textSync('FORGE', {
|
|
79
|
+
font: 'Standard',
|
|
80
|
+
horizontalLayout: 'default',
|
|
81
|
+
verticalLayout: 'default',
|
|
82
|
+
})));
|
|
83
|
+
console.log(chalk.gray('Full Orchestration for Rapid Git Engineering\n'));
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Parse and execute CLI arguments
|
|
87
|
+
*/
|
|
88
|
+
async run(argv = process.argv) {
|
|
89
|
+
try {
|
|
90
|
+
// Show banner if no args or --help
|
|
91
|
+
if (argv.length <= 2 || argv.includes('--help')) {
|
|
92
|
+
this.showBanner();
|
|
93
|
+
}
|
|
94
|
+
await this.program.parseAsync(argv);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (error instanceof Error) {
|
|
98
|
+
this.logger.error(error.message);
|
|
99
|
+
if (process.env.DEBUG) {
|
|
100
|
+
console.error(error.stack);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
this.logger.error('An unknown error occurred');
|
|
105
|
+
}
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Entry point
|
|
111
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
112
|
+
const cli = new ForgeCLI();
|
|
113
|
+
cli.run();
|
|
114
|
+
}
|
|
115
|
+
export { ForgeCLI };
|
|
116
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { ForgeConfig } from '../types/config.js';
|
|
3
|
+
import { Logger } from '../utils/logger.js';
|
|
4
|
+
/**
|
|
5
|
+
* Base class for all FORGE commands
|
|
6
|
+
* Provides common utilities and configuration access
|
|
7
|
+
*/
|
|
8
|
+
export declare abstract class ForgeCommand {
|
|
9
|
+
protected program: Command;
|
|
10
|
+
protected logger: Logger;
|
|
11
|
+
protected config: ForgeConfig | null;
|
|
12
|
+
constructor(program: Command);
|
|
13
|
+
/**
|
|
14
|
+
* Initialize the command - load config, validate environment
|
|
15
|
+
*/
|
|
16
|
+
protected init(options?: any): void;
|
|
17
|
+
/**
|
|
18
|
+
* Execute the command logic
|
|
19
|
+
* Must be implemented by subclasses
|
|
20
|
+
*/
|
|
21
|
+
abstract execute(...args: any[]): Promise<void> | void;
|
|
22
|
+
/**
|
|
23
|
+
* Register this command with the CLI program
|
|
24
|
+
*/
|
|
25
|
+
abstract register(): void;
|
|
26
|
+
/**
|
|
27
|
+
* Check if we're in a FORGE project
|
|
28
|
+
*/
|
|
29
|
+
protected checkForgeProject(projectRoot?: string): boolean;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/commands/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI5C;;;GAGG;AACH,8BAAsB,YAAY;IAIpB,SAAS,CAAC,OAAO,EAAE,OAAO;IAHtC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAQ;gBAEtB,OAAO,EAAE,OAAO;IAItC;;OAEG;IACH,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,IAAI;IAKnC;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAEtD;;OAEG;IACH,QAAQ,CAAC,QAAQ,IAAI,IAAI;IAEzB;;OAEG;IACH,SAAS,CAAC,iBAAiB,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO;CAI1E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Logger } from '../utils/logger.js';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
/**
|
|
5
|
+
* Base class for all FORGE commands
|
|
6
|
+
* Provides common utilities and configuration access
|
|
7
|
+
*/
|
|
8
|
+
export class ForgeCommand {
|
|
9
|
+
program;
|
|
10
|
+
logger;
|
|
11
|
+
config = null;
|
|
12
|
+
constructor(program) {
|
|
13
|
+
this.program = program;
|
|
14
|
+
this.logger = new Logger();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Initialize the command - load config, validate environment
|
|
18
|
+
*/
|
|
19
|
+
init(options) {
|
|
20
|
+
// Load configuration if needed
|
|
21
|
+
// Base implementation - subclasses can override
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check if we're in a FORGE project
|
|
25
|
+
*/
|
|
26
|
+
checkForgeProject(projectRoot = process.cwd()) {
|
|
27
|
+
const configPath = path.join(projectRoot, '.planning/forge.config.json');
|
|
28
|
+
return fs.existsSync(configPath);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/commands/base.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;GAGG;AACH,MAAM,OAAgB,YAAY;IAIV;IAHZ,MAAM,CAAS;IACf,MAAM,GAAuB,IAAI,CAAC;IAE5C,YAAsB,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACO,IAAI,CAAC,OAAa;QAC1B,+BAA+B;QAC/B,gDAAgD;IAClD,CAAC;IAaD;;OAEG;IACO,iBAAiB,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;QAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,6BAA6B,CAAC,CAAC;QACzE,OAAO,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ForgeCommand } from './base.js';
|
|
2
|
+
/**
|
|
3
|
+
* Config Command - View and edit FORGE configuration
|
|
4
|
+
*/
|
|
5
|
+
export declare class ConfigCommand extends ForgeCommand {
|
|
6
|
+
register(): void;
|
|
7
|
+
execute(options: any): Promise<void>;
|
|
8
|
+
private setConfigValue;
|
|
9
|
+
private getConfigValue;
|
|
10
|
+
private displayConfig;
|
|
11
|
+
private displaySection;
|
|
12
|
+
private runInteractiveEditor;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAQzC;;GAEG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,QAAQ,IAAI,IAAI;IAUV,OAAO,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAoB5B,cAAc;IA2C5B,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,cAAc;YAOR,oBAAoB;CA0DnC"}
|