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.
Files changed (140) hide show
  1. package/.claude/rules/api-patterns.md +98 -0
  2. package/.claude/rules/security-baseline.md +204 -0
  3. package/.claude/rules/testing-standards.md +177 -0
  4. package/.claude/rules/ui-conventions.md +142 -0
  5. package/README.md +261 -0
  6. package/bin/forge.js +14 -0
  7. package/dist/bin/forge.js +14 -0
  8. package/dist/cli/index.d.ts +22 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +116 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/commands/base.d.ts +31 -0
  13. package/dist/commands/base.d.ts.map +1 -0
  14. package/dist/commands/base.js +31 -0
  15. package/dist/commands/base.js.map +1 -0
  16. package/dist/commands/config.d.ts +14 -0
  17. package/dist/commands/config.d.ts.map +1 -0
  18. package/dist/commands/config.js +175 -0
  19. package/dist/commands/config.js.map +1 -0
  20. package/dist/commands/generate.d.ts +17 -0
  21. package/dist/commands/generate.d.ts.map +1 -0
  22. package/dist/commands/generate.js +159 -0
  23. package/dist/commands/generate.js.map +1 -0
  24. package/dist/commands/help.d.ts +11 -0
  25. package/dist/commands/help.d.ts.map +1 -0
  26. package/dist/commands/help.js +65 -0
  27. package/dist/commands/help.js.map +1 -0
  28. package/dist/commands/index.d.ts +8 -0
  29. package/dist/commands/index.d.ts.map +1 -0
  30. package/dist/commands/index.js +8 -0
  31. package/dist/commands/index.js.map +1 -0
  32. package/dist/commands/init.d.ts +10 -0
  33. package/dist/commands/init.d.ts.map +1 -0
  34. package/dist/commands/init.js +22 -0
  35. package/dist/commands/init.js.map +1 -0
  36. package/dist/commands/status.d.ts +13 -0
  37. package/dist/commands/status.d.ts.map +1 -0
  38. package/dist/commands/status.js +101 -0
  39. package/dist/commands/status.js.map +1 -0
  40. package/dist/commands/stubs.d.ts +14 -0
  41. package/dist/commands/stubs.d.ts.map +1 -0
  42. package/dist/commands/stubs.js +30 -0
  43. package/dist/commands/stubs.js.map +1 -0
  44. package/dist/generators/index.d.ts +11 -0
  45. package/dist/generators/index.d.ts.map +1 -0
  46. package/dist/generators/index.js +10 -0
  47. package/dist/generators/index.js.map +1 -0
  48. package/dist/generators/required-fields.d.ts +74 -0
  49. package/dist/generators/required-fields.d.ts.map +1 -0
  50. package/dist/generators/required-fields.js +179 -0
  51. package/dist/generators/required-fields.js.map +1 -0
  52. package/dist/generators/template-engine.d.ts +65 -0
  53. package/dist/generators/template-engine.d.ts.map +1 -0
  54. package/dist/generators/template-engine.js +209 -0
  55. package/dist/generators/template-engine.js.map +1 -0
  56. package/dist/generators/token-validator.d.ts +51 -0
  57. package/dist/generators/token-validator.d.ts.map +1 -0
  58. package/dist/generators/token-validator.js +141 -0
  59. package/dist/generators/token-validator.js.map +1 -0
  60. package/dist/generators/types.d.ts +433 -0
  61. package/dist/generators/types.d.ts.map +1 -0
  62. package/dist/generators/types.js +5 -0
  63. package/dist/generators/types.js.map +1 -0
  64. package/dist/generators/xml-task-generator.d.ts +67 -0
  65. package/dist/generators/xml-task-generator.d.ts.map +1 -0
  66. package/dist/generators/xml-task-generator.js +297 -0
  67. package/dist/generators/xml-task-generator.js.map +1 -0
  68. package/dist/git/__tests__/worktree.test.d.ts +5 -0
  69. package/dist/git/__tests__/worktree.test.d.ts.map +1 -0
  70. package/dist/git/__tests__/worktree.test.js +121 -0
  71. package/dist/git/__tests__/worktree.test.js.map +1 -0
  72. package/dist/git/codeowners.d.ts +101 -0
  73. package/dist/git/codeowners.d.ts.map +1 -0
  74. package/dist/git/codeowners.js +216 -0
  75. package/dist/git/codeowners.js.map +1 -0
  76. package/dist/git/commit.d.ts +135 -0
  77. package/dist/git/commit.d.ts.map +1 -0
  78. package/dist/git/commit.js +223 -0
  79. package/dist/git/commit.js.map +1 -0
  80. package/dist/git/hooks/commit-msg.d.ts +8 -0
  81. package/dist/git/hooks/commit-msg.d.ts.map +1 -0
  82. package/dist/git/hooks/commit-msg.js +34 -0
  83. package/dist/git/hooks/commit-msg.js.map +1 -0
  84. package/dist/git/hooks/pre-commit.d.ts +8 -0
  85. package/dist/git/hooks/pre-commit.d.ts.map +1 -0
  86. package/dist/git/hooks/pre-commit.js +34 -0
  87. package/dist/git/hooks/pre-commit.js.map +1 -0
  88. package/dist/git/pre-commit-hooks.d.ts +117 -0
  89. package/dist/git/pre-commit-hooks.d.ts.map +1 -0
  90. package/dist/git/pre-commit-hooks.js +270 -0
  91. package/dist/git/pre-commit-hooks.js.map +1 -0
  92. package/dist/git/wipe-protocol.d.ts +281 -0
  93. package/dist/git/wipe-protocol.d.ts.map +1 -0
  94. package/dist/git/wipe-protocol.js +237 -0
  95. package/dist/git/wipe-protocol.js.map +1 -0
  96. package/dist/git/worktree.d.ts +69 -0
  97. package/dist/git/worktree.d.ts.map +1 -0
  98. package/dist/git/worktree.js +202 -0
  99. package/dist/git/worktree.js.map +1 -0
  100. package/dist/scripts/install.d.ts +8 -0
  101. package/dist/scripts/install.d.ts.map +1 -0
  102. package/dist/scripts/install.js +161 -0
  103. package/dist/scripts/install.js.map +1 -0
  104. package/dist/types/config.d.ts +30 -0
  105. package/dist/types/config.d.ts.map +1 -0
  106. package/dist/types/config.js +23 -0
  107. package/dist/types/config.js.map +1 -0
  108. package/dist/types/index.d.ts +6 -0
  109. package/dist/types/index.d.ts.map +1 -0
  110. package/dist/types/index.js +6 -0
  111. package/dist/types/index.js.map +1 -0
  112. package/dist/types/state.d.ts +56 -0
  113. package/dist/types/state.d.ts.map +1 -0
  114. package/dist/types/state.js +6 -0
  115. package/dist/types/state.js.map +1 -0
  116. package/dist/utils/config.d.ts +15 -0
  117. package/dist/utils/config.d.ts.map +1 -0
  118. package/dist/utils/config.js +80 -0
  119. package/dist/utils/config.js.map +1 -0
  120. package/dist/utils/errors.d.ts +25 -0
  121. package/dist/utils/errors.d.ts.map +1 -0
  122. package/dist/utils/errors.js +48 -0
  123. package/dist/utils/errors.js.map +1 -0
  124. package/dist/utils/index.d.ts +11 -0
  125. package/dist/utils/index.d.ts.map +1 -0
  126. package/dist/utils/index.js +9 -0
  127. package/dist/utils/index.js.map +1 -0
  128. package/dist/utils/logger.d.ts +34 -0
  129. package/dist/utils/logger.d.ts.map +1 -0
  130. package/dist/utils/logger.js +73 -0
  131. package/dist/utils/logger.js.map +1 -0
  132. package/dist/utils/state-api.d.ts +128 -0
  133. package/dist/utils/state-api.d.ts.map +1 -0
  134. package/dist/utils/state-api.js +170 -0
  135. package/dist/utils/state-api.js.map +1 -0
  136. package/dist/utils/template-client.d.ts +73 -0
  137. package/dist/utils/template-client.d.ts.map +1 -0
  138. package/dist/utils/template-client.js +151 -0
  139. package/dist/utils/template-client.js.map +1 -0
  140. 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
+ [![npm version](https://badge.fury.io/js/forge-dev-framework.svg)](https://www.npmjs.com/package/forge-dev-framework)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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":";AAEA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,QAAQ;IACJ,OAAO,CAAU;IACjB,MAAM,CAAS;IAEvB;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAEO,KAAK;QACX,mBAAmB;QACnB,IAAI,CAAC,OAAO;aACT,IAAI,CAAC,OAAO,CAAC;aACb,WAAW,CAAC,8CAA8C,CAAC;aAC3D,OAAO,CAAC,OAAO,CAAC;aAChB,MAAM,CAAC,aAAa,EAAE,2BAA2B,CAAC;aAClD,MAAM,CAAC,eAAe,EAAE,uBAAuB,CAAC;aAChD,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAE1C,wBAAwB;QACxB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,0BAA0B;QAC1B,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,EAAE;YACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB;QACtB,gBAAgB;QAChB,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzC,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC3C,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC3C,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC7C,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAEzC,sCAAsC;QACtC,iBAAiB,CAAC,MAAM,EAAE,6CAA6C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvF,iBAAiB,CAAC,iBAAiB,EAAE,gDAAgD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrG,iBAAiB,CAAC,cAAc,EAAE,mCAAmC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrF,iBAAiB,CAAC,gBAAgB,EAAE,2CAA2C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/F,iBAAiB,CAAC,kBAAkB,EAAE,kCAAkC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxF,iBAAiB,CAAC,gBAAgB,EAAE,sCAAsC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1F,iBAAiB,CAAC,MAAM,EAAE,gCAAgC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1E,iBAAiB,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChE,iBAAiB,CAAC,OAAO,EAAE,iCAAiC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5E,iBAAiB,CAAC,QAAQ,EAAE,4BAA4B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxE,iBAAiB,CAAC,OAAO,EAAE,oCAAoC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/E,iBAAiB,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtE,iBAAiB,CAAC,WAAW,EAAE,kCAAkC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjF,iBAAiB,CAAC,kBAAkB,EAAE,8BAA8B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpF,iBAAiB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtE,iBAAiB,CAAC,gBAAgB,EAAE,iCAAiC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrF,iBAAiB,CAAC,OAAO,EAAE,uCAAuC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClF,iBAAiB,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE;YACvB,IAAI,EAAE,UAAU;YAChB,gBAAgB,EAAE,SAAS;YAC3B,cAAc,EAAE,SAAS;SAC1B,CAAC,CACH,CACF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,OAAiB,OAAO,CAAC,IAAI;QACrC,IAAI,CAAC;YACH,mCAAmC;YACnC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;YAED,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACjC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YACjD,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;CACF;AAED,cAAc;AACd,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC3B,GAAG,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -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"}