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
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { ForgeCommand } from './base.js';
|
|
2
|
+
import { loadConfig, saveConfig, validateConfig } from '../utils/index.js';
|
|
3
|
+
import { ValidationError, formatError } from '../utils/index.js';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import inquirer from 'inquirer';
|
|
6
|
+
/**
|
|
7
|
+
* Config Command - View and edit FORGE configuration
|
|
8
|
+
*/
|
|
9
|
+
export class ConfigCommand extends ForgeCommand {
|
|
10
|
+
register() {
|
|
11
|
+
this.program
|
|
12
|
+
.command('config')
|
|
13
|
+
.description('View or edit FORGE configuration')
|
|
14
|
+
.option('-s, --set <key=value>', 'Set a specific config value')
|
|
15
|
+
.option('-g, --get <key>', 'Get a specific config value')
|
|
16
|
+
.option('-i, --interactive', 'Interactive configuration editor')
|
|
17
|
+
.action((options) => this.execute(options));
|
|
18
|
+
}
|
|
19
|
+
async execute(options) {
|
|
20
|
+
try {
|
|
21
|
+
const projectRoot = process.cwd();
|
|
22
|
+
const config = loadConfig(projectRoot);
|
|
23
|
+
if (options.set) {
|
|
24
|
+
await this.setConfigValue(config, options.set, projectRoot);
|
|
25
|
+
}
|
|
26
|
+
else if (options.get) {
|
|
27
|
+
this.getConfigValue(config, options.get);
|
|
28
|
+
}
|
|
29
|
+
else if (options.interactive) {
|
|
30
|
+
await this.runInteractiveEditor(config, projectRoot);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
this.displayConfig(config);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
this.logger.error(formatError(error));
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async setConfigValue(config, keyValue, projectRoot) {
|
|
42
|
+
const [key, ...valueParts] = keyValue.split('=');
|
|
43
|
+
const value = valueParts.join('=');
|
|
44
|
+
if (!value) {
|
|
45
|
+
throw new ValidationError('Missing value for --set option. Use: --set key=value', []);
|
|
46
|
+
}
|
|
47
|
+
// Parse nested key (e.g., "git.strategy")
|
|
48
|
+
const keys = key.split('.');
|
|
49
|
+
let target = config;
|
|
50
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
51
|
+
if (!(keys[i] in target)) {
|
|
52
|
+
throw new ValidationError(`Invalid config key: ${key}`, []);
|
|
53
|
+
}
|
|
54
|
+
target = target[keys[i]];
|
|
55
|
+
}
|
|
56
|
+
const finalKey = keys[keys.length - 1];
|
|
57
|
+
// Parse value based on type
|
|
58
|
+
if (value === 'true') {
|
|
59
|
+
target[finalKey] = true;
|
|
60
|
+
}
|
|
61
|
+
else if (value === 'false') {
|
|
62
|
+
target[finalKey] = false;
|
|
63
|
+
}
|
|
64
|
+
else if (!isNaN(Number(value))) {
|
|
65
|
+
target[finalKey] = Number(value);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
target[finalKey] = value;
|
|
69
|
+
}
|
|
70
|
+
// Validate
|
|
71
|
+
const errors = validateConfig(config);
|
|
72
|
+
if (errors.length > 0) {
|
|
73
|
+
throw new ValidationError('Configuration validation failed', errors);
|
|
74
|
+
}
|
|
75
|
+
// Save
|
|
76
|
+
saveConfig(config, projectRoot);
|
|
77
|
+
this.logger.success(`Set ${key} = ${chalk.cyan(value)}`);
|
|
78
|
+
}
|
|
79
|
+
getConfigValue(config, key) {
|
|
80
|
+
const keys = key.split('.');
|
|
81
|
+
let value = config;
|
|
82
|
+
for (const k of keys) {
|
|
83
|
+
if (!(k in value)) {
|
|
84
|
+
this.logger.error(`Config key not found: ${key}`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
value = value[k];
|
|
88
|
+
}
|
|
89
|
+
console.log(chalk.cyan(value));
|
|
90
|
+
}
|
|
91
|
+
displayConfig(config) {
|
|
92
|
+
this.logger.header('FORGE Configuration');
|
|
93
|
+
this.displaySection('Core Settings', [
|
|
94
|
+
['Mode', config.mode],
|
|
95
|
+
['Depth', config.depth],
|
|
96
|
+
['Max Teammates', config.maxTeammates.toString()],
|
|
97
|
+
['Task Limit', config.taskLimit.toString()],
|
|
98
|
+
]);
|
|
99
|
+
this.displaySection('Agent Profile', [['Profile', config.agentProfile]]);
|
|
100
|
+
this.displaySection('Workflow', [
|
|
101
|
+
['Research', config.workflow.research.toString()],
|
|
102
|
+
['Plan Check', config.workflow.planCheck.toString()],
|
|
103
|
+
['Tribunal', config.workflow.tribunal.toString()],
|
|
104
|
+
['Contract First', config.workflow.contractFirst.toString()],
|
|
105
|
+
]);
|
|
106
|
+
this.displaySection('Git', [
|
|
107
|
+
['Strategy', config.git.strategy],
|
|
108
|
+
['Branch Template', config.git.branchTemplate],
|
|
109
|
+
['Squash on Ship', config.git.squashOnShip.toString()],
|
|
110
|
+
]);
|
|
111
|
+
}
|
|
112
|
+
displaySection(title, items) {
|
|
113
|
+
console.log(chalk.bold.white(`\n${title}\n`));
|
|
114
|
+
items.forEach(([key, value]) => {
|
|
115
|
+
console.log(chalk.white(key.padEnd(20) + ':'), chalk.cyan(value));
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
async runInteractiveEditor(config, projectRoot) {
|
|
119
|
+
const answers = await inquirer.prompt([
|
|
120
|
+
{
|
|
121
|
+
type: 'list',
|
|
122
|
+
name: 'mode',
|
|
123
|
+
message: 'Execution mode:',
|
|
124
|
+
choices: ['interactive', 'yolo'],
|
|
125
|
+
default: config.mode,
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
type: 'list',
|
|
129
|
+
name: 'depth',
|
|
130
|
+
message: 'Planning depth:',
|
|
131
|
+
choices: ['quick', 'standard', 'comprehensive'],
|
|
132
|
+
default: config.depth,
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
type: 'number',
|
|
136
|
+
name: 'maxTeammates',
|
|
137
|
+
message: 'Maximum parallel teammates (2-6):',
|
|
138
|
+
default: config.maxTeammates,
|
|
139
|
+
validate: (input) => (input >= 2 && input <= 6) || 'Must be between 2 and 6',
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
type: 'number',
|
|
143
|
+
name: 'taskLimit',
|
|
144
|
+
message: 'Task limit per teammate (3-8):',
|
|
145
|
+
default: config.taskLimit,
|
|
146
|
+
validate: (input) => (input >= 3 && input <= 8) || 'Must be between 3 and 8',
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
type: 'list',
|
|
150
|
+
name: 'agentProfile',
|
|
151
|
+
message: 'Agent profile:',
|
|
152
|
+
choices: ['quality', 'balanced', 'budget'],
|
|
153
|
+
default: config.agentProfile,
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
type: 'list',
|
|
157
|
+
name: 'gitStrategy',
|
|
158
|
+
message: 'Git isolation strategy:',
|
|
159
|
+
choices: ['none', 'worktree', 'branch'],
|
|
160
|
+
default: config.git.strategy,
|
|
161
|
+
},
|
|
162
|
+
]);
|
|
163
|
+
// Update config
|
|
164
|
+
config.mode = answers.mode;
|
|
165
|
+
config.depth = answers.depth;
|
|
166
|
+
config.maxTeammates = answers.maxTeammates;
|
|
167
|
+
config.taskLimit = answers.taskLimit;
|
|
168
|
+
config.agentProfile = answers.agentProfile;
|
|
169
|
+
config.git.strategy = answers.gitStrategy;
|
|
170
|
+
// Save
|
|
171
|
+
saveConfig(config, projectRoot);
|
|
172
|
+
this.logger.success('Configuration updated');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ForgeCommand } from './base.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate Command - Manual artifact generation
|
|
4
|
+
*/
|
|
5
|
+
export declare class GenerateCommand extends ForgeCommand {
|
|
6
|
+
register(): void;
|
|
7
|
+
execute(artifact: string, options: any): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Load existing context from STATE.json or other sources
|
|
10
|
+
*/
|
|
11
|
+
private loadContext;
|
|
12
|
+
/**
|
|
13
|
+
* Check if context has a nested field
|
|
14
|
+
*/
|
|
15
|
+
private hasField;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAMzC;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,QAAQ,IAAI,IAAI;IASV,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAyF5D;;OAEG;YACW,WAAW;IA4CzB;;OAEG;IACH,OAAO,CAAC,QAAQ;CAajB"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { ForgeCommand } from './base.js';
|
|
2
|
+
import { createTemplateClient } from '../utils/index.js';
|
|
3
|
+
import { logger } from '../utils/logger.js';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
/**
|
|
6
|
+
* Generate Command - Manual artifact generation
|
|
7
|
+
*/
|
|
8
|
+
export class GenerateCommand extends ForgeCommand {
|
|
9
|
+
register() {
|
|
10
|
+
this.program
|
|
11
|
+
.command('generate <artifact>')
|
|
12
|
+
.description('Generate a specific FORGE artifact')
|
|
13
|
+
.argument('<artifact>', 'Artifact to generate (claude, project, requirements, roadmap, plan, config, rules)')
|
|
14
|
+
.option('-f, --force', 'Overwrite existing files without backup')
|
|
15
|
+
.action((artifact, options) => this.execute(artifact, options));
|
|
16
|
+
}
|
|
17
|
+
async execute(artifact, options) {
|
|
18
|
+
try {
|
|
19
|
+
const projectRoot = process.cwd();
|
|
20
|
+
// Map artifact names to template files
|
|
21
|
+
const artifactMap = {
|
|
22
|
+
claude: {
|
|
23
|
+
template: 'CLAUDE.md.template',
|
|
24
|
+
output: 'CLAUDE.md',
|
|
25
|
+
requiredFields: ['projectName', 'vision', 'techStack'],
|
|
26
|
+
},
|
|
27
|
+
project: {
|
|
28
|
+
template: 'PROJECT.md.template',
|
|
29
|
+
output: 'PROJECT.md',
|
|
30
|
+
requiredFields: ['projectName', 'vision', 'techStack'],
|
|
31
|
+
},
|
|
32
|
+
requirements: {
|
|
33
|
+
template: 'REQUIREMENTS.md.template',
|
|
34
|
+
output: 'REQUIREMENTS.md',
|
|
35
|
+
requiredFields: ['projectName', 'vision', 'features', 'nfrs'],
|
|
36
|
+
},
|
|
37
|
+
roadmap: {
|
|
38
|
+
template: 'ROADMAP.md.template',
|
|
39
|
+
output: 'ROADMAP.md',
|
|
40
|
+
requiredFields: ['projectName', 'milestones', 'phases'],
|
|
41
|
+
},
|
|
42
|
+
plan: {
|
|
43
|
+
template: 'PLAN.md.template',
|
|
44
|
+
output: 'PLAN.md',
|
|
45
|
+
requiredFields: ['tasks', 'dependencyGraph'],
|
|
46
|
+
},
|
|
47
|
+
config: {
|
|
48
|
+
template: 'forge.config.json.template',
|
|
49
|
+
output: '.planning/forge.config.json',
|
|
50
|
+
requiredFields: ['mode', 'depth', 'maxTeammates', 'taskLimit'],
|
|
51
|
+
},
|
|
52
|
+
rules: {
|
|
53
|
+
template: '.claude/rules/*.md.template',
|
|
54
|
+
output: '.claude/rules/',
|
|
55
|
+
requiredFields: ['patterns', 'rules'],
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
const target = artifactMap[artifact];
|
|
59
|
+
if (!target) {
|
|
60
|
+
logger.error(`Unknown artifact: ${artifact}`);
|
|
61
|
+
logger.info('Available artifacts: claude, project, requirements, roadmap, plan, config, rules');
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
// Check if template exists
|
|
65
|
+
const templatePath = path.join(projectRoot, 'src/templates', target.template);
|
|
66
|
+
const fs = await import('fs/promises');
|
|
67
|
+
try {
|
|
68
|
+
await fs.access(templatePath);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
logger.error(`Template not found: ${target.template}`);
|
|
72
|
+
logger.info('Run this command from a FORGE project root');
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
// Load existing context if available
|
|
76
|
+
const partialContext = await this.loadContext(projectRoot);
|
|
77
|
+
// Validate required fields
|
|
78
|
+
const client = createTemplateClient({
|
|
79
|
+
projectRoot,
|
|
80
|
+
interactive: !options.force,
|
|
81
|
+
});
|
|
82
|
+
const missing = target.requiredFields.filter(f => !this.hasField(partialContext, f));
|
|
83
|
+
if (missing.length > 0) {
|
|
84
|
+
logger.error(`Missing required fields for ${artifact}:`);
|
|
85
|
+
missing.forEach(f => logger.bullet(f));
|
|
86
|
+
logger.info('Use "forge init" to create a new project with full context');
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
// Generate the artifact (cast to full TemplateContext since we validated)
|
|
90
|
+
this.logger.header(`Generating ${artifact}`);
|
|
91
|
+
await client.generateArtifact(target.template, partialContext, target.output);
|
|
92
|
+
this.logger.success(`Artifact ${artifact} generated successfully`);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
this.logger.error(error instanceof Error ? error.message : 'Unknown error');
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Load existing context from STATE.json or other sources
|
|
101
|
+
*/
|
|
102
|
+
async loadContext(projectRoot) {
|
|
103
|
+
const fs = await import('fs/promises');
|
|
104
|
+
const path = await import('path');
|
|
105
|
+
// Try to load STATE.json
|
|
106
|
+
const statePath = path.join(projectRoot, 'state/STATE.json');
|
|
107
|
+
try {
|
|
108
|
+
const stateContent = await fs.readFile(statePath, 'utf-8');
|
|
109
|
+
const state = JSON.parse(stateContent);
|
|
110
|
+
return {
|
|
111
|
+
projectName: state.project?.name || '',
|
|
112
|
+
version: '1.0.0',
|
|
113
|
+
timestamp: new Date().toISOString(),
|
|
114
|
+
status: state.project?.status || 'initialized',
|
|
115
|
+
projectStatus: {
|
|
116
|
+
currentMilestone: state.project?.currentMilestone || '',
|
|
117
|
+
currentPhase: state.project?.currentPhase?.toString() || '',
|
|
118
|
+
progress: 0,
|
|
119
|
+
estimatedCompletion: 'TBD',
|
|
120
|
+
},
|
|
121
|
+
tasks: state.tasks?.map((t) => ({
|
|
122
|
+
id: t.id,
|
|
123
|
+
name: t.title,
|
|
124
|
+
description: t.title,
|
|
125
|
+
owner: t.ownerRole,
|
|
126
|
+
type: t.status === 'completed' ? 'completed' : 'pending',
|
|
127
|
+
priority: t.priority.toString(),
|
|
128
|
+
status: t.status,
|
|
129
|
+
dependencies: t.deps?.join(', ') || '',
|
|
130
|
+
acceptance: t.acceptance || [],
|
|
131
|
+
verify: t.verify?.join(', ') || '',
|
|
132
|
+
})) || [],
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// No STATE.json, return minimal context
|
|
137
|
+
return {
|
|
138
|
+
projectName: '',
|
|
139
|
+
version: '1.0.0',
|
|
140
|
+
timestamp: new Date().toISOString(),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Check if context has a nested field
|
|
146
|
+
*/
|
|
147
|
+
hasField(context, field) {
|
|
148
|
+
const parts = field.split('.');
|
|
149
|
+
let current = context;
|
|
150
|
+
for (const part of parts) {
|
|
151
|
+
if (current?.[part] === undefined) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
current = current[part];
|
|
155
|
+
}
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ForgeCommand } from './base.js';
|
|
2
|
+
/**
|
|
3
|
+
* Help Command - Display comprehensive command reference
|
|
4
|
+
*/
|
|
5
|
+
export declare class HelpCommand extends ForgeCommand {
|
|
6
|
+
register(): void;
|
|
7
|
+
execute(): Promise<void>;
|
|
8
|
+
private displayHelp;
|
|
9
|
+
private displaySection;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=help.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC;;GAEG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,QAAQ,IAAI,IAAI;IAOV,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,OAAO,CAAC,WAAW;IAkDnB,OAAO,CAAC,cAAc;CAMvB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { ForgeCommand } from './base.js';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
/**
|
|
4
|
+
* Help Command - Display comprehensive command reference
|
|
5
|
+
*/
|
|
6
|
+
export class HelpCommand extends ForgeCommand {
|
|
7
|
+
register() {
|
|
8
|
+
this.program
|
|
9
|
+
.command('help')
|
|
10
|
+
.description('Show comprehensive command reference')
|
|
11
|
+
.action(() => this.execute());
|
|
12
|
+
}
|
|
13
|
+
async execute() {
|
|
14
|
+
this.displayHelp();
|
|
15
|
+
}
|
|
16
|
+
displayHelp() {
|
|
17
|
+
console.log(chalk.bold.cyan('\n╔════════════════════════════════════════════════════════════╗'));
|
|
18
|
+
console.log(chalk.bold.cyan('║') + chalk.bold.white(' FORGE - Full Orchestration for Rapid Git Engineering ') + chalk.bold.cyan('║'));
|
|
19
|
+
console.log(chalk.bold.cyan('╚════════════════════════════════════════════════════════════╝\n'));
|
|
20
|
+
this.displaySection('Core Workflow', [
|
|
21
|
+
{ cmd: 'forge init', desc: 'Initialize project — interrogate, research, scope, roadmap' },
|
|
22
|
+
{ cmd: 'forge scan', desc: 'Map existing codebase (brownfield projects)' },
|
|
23
|
+
{ cmd: 'forge discuss <phase>', desc: 'Shape implementation decisions before planning' },
|
|
24
|
+
{ cmd: 'forge plan <phase>', desc: 'Research-backed atomic task plans with dependency graph' },
|
|
25
|
+
{ cmd: 'forge deploy <phase>', desc: 'Spawn parallel specialists, execute tasks' },
|
|
26
|
+
{ cmd: 'forge tribunal <phase>', desc: 'Adversarial security + QA review' },
|
|
27
|
+
{ cmd: 'forge verify <phase>', desc: 'Human acceptance testing walkthrough' },
|
|
28
|
+
{ cmd: 'forge ship', desc: 'Archive milestone, tag release, merge branches' },
|
|
29
|
+
{ cmd: 'forge next', desc: 'Start next milestone with full codebase knowledge' },
|
|
30
|
+
]);
|
|
31
|
+
this.displaySection('Navigation & Status', [
|
|
32
|
+
{ cmd: 'forge status', desc: 'Show current progress, active agents, task graph' },
|
|
33
|
+
{ cmd: 'forge graph', desc: 'Render Mermaid dependency graph in terminal' },
|
|
34
|
+
{ cmd: 'forge events', desc: 'Stream recent state events' },
|
|
35
|
+
]);
|
|
36
|
+
this.displaySection('Quick Mode', [
|
|
37
|
+
{ cmd: 'forge quick', desc: 'Ad-hoc tasks with FORGE guarantees (atomic commits, state tracking)' },
|
|
38
|
+
{ cmd: 'forge debug <desc>', desc: 'Spawn debug agents for a specific issue' },
|
|
39
|
+
]);
|
|
40
|
+
this.displaySection('Phase Management', [
|
|
41
|
+
{ cmd: 'forge add-phase', desc: 'Add a phase to current milestone' },
|
|
42
|
+
{ cmd: 'forge insert-phase <N>', desc: 'Insert a phase at position N' },
|
|
43
|
+
{ cmd: 'forge remove-phase <N>', desc: 'Remove phase N' },
|
|
44
|
+
{ cmd: 'forge replan <phase>', desc: 'Re-research and re-plan a phase' },
|
|
45
|
+
]);
|
|
46
|
+
this.displaySection('Session', [
|
|
47
|
+
{ cmd: 'forge pause', desc: 'Persist state, safe to close terminal' },
|
|
48
|
+
{ cmd: 'forge resume', desc: 'Hydrate from saved state, continue where you left off' },
|
|
49
|
+
]);
|
|
50
|
+
this.displaySection('Configuration', [
|
|
51
|
+
{ cmd: 'forge config', desc: 'Interactive configuration editor' },
|
|
52
|
+
{ cmd: 'forge config --set key=value', desc: 'Set specific config value' },
|
|
53
|
+
]);
|
|
54
|
+
console.log(chalk.gray('\n─').repeat(60));
|
|
55
|
+
console.log(chalk.dim(' Documentation: https://github.com/your-org/forge'));
|
|
56
|
+
console.log(chalk.dim(' Report issues: https://github.com/your-org/forge/issues\n'));
|
|
57
|
+
}
|
|
58
|
+
displaySection(title, commands) {
|
|
59
|
+
console.log(chalk.bold.white(`\n${title}\n`));
|
|
60
|
+
commands.forEach(({ cmd, desc }) => {
|
|
61
|
+
console.log(chalk.cyan(' ' + cmd.padEnd(30)) + chalk.gray(desc));
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,YAAY;IAC3C,QAAQ;QACN,IAAI,CAAC,OAAO;aACT,OAAO,CAAC,MAAM,CAAC;aACf,WAAW,CAAC,sCAAsC,CAAC;aACnD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAEO,WAAW;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC,CAAC;QACjG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,0DAA0D,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC,CAAC;QAEjG,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE;YACnC,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,4DAA4D,EAAE;YACzF,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,6CAA6C,EAAE;YAC1E,EAAE,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,gDAAgD,EAAE;YACxF,EAAE,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,yDAAyD,EAAE;YAC9F,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,2CAA2C,EAAE;YAClF,EAAE,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,kCAAkC,EAAE;YAC3E,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,sCAAsC,EAAE;YAC7E,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,gDAAgD,EAAE;YAC7E,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,mDAAmD,EAAE;SACjF,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE;YACzC,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,kDAAkD,EAAE;YACjF,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,6CAA6C,EAAE;YAC3E,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,4BAA4B,EAAE;SAC5D,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;YAChC,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,qEAAqE,EAAE;YACnG,EAAE,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,yCAAyC,EAAE;SAC/E,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,CAAC,kBAAkB,EAAE;YACtC,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,kCAAkC,EAAE;YACpE,EAAE,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,8BAA8B,EAAE;YACvE,EAAE,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,gBAAgB,EAAE;YACzD,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,iCAAiC,EAAE;SACzE,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE;YAC7B,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,uCAAuC,EAAE;YACrE,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,uDAAuD,EAAE;SACvF,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE;YACnC,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,kCAAkC,EAAE;YACjE,EAAE,GAAG,EAAE,8BAA8B,EAAE,IAAI,EAAE,2BAA2B,EAAE;SAC3E,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC,CAAC;IACxF,CAAC;IAEO,cAAc,CAAC,KAAa,EAAE,QAAyC;QAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC;QAC9C,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;YACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ForgeCommand } from './base.js';
|
|
2
|
+
/**
|
|
3
|
+
* Init Command - Initialize FORGE project
|
|
4
|
+
* Full implementation coming in Task 2
|
|
5
|
+
*/
|
|
6
|
+
export declare class InitCommand extends ForgeCommand {
|
|
7
|
+
register(): void;
|
|
8
|
+
execute(options: any): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC;;;GAGG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,QAAQ,IAAI,IAAI;IAQV,OAAO,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CAM3C"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ForgeCommand } from './base.js';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
/**
|
|
4
|
+
* Init Command - Initialize FORGE project
|
|
5
|
+
* Full implementation coming in Task 2
|
|
6
|
+
*/
|
|
7
|
+
export class InitCommand extends ForgeCommand {
|
|
8
|
+
register() {
|
|
9
|
+
this.program
|
|
10
|
+
.command('init')
|
|
11
|
+
.description('Initialize project — interrogate, research, scope, roadmap')
|
|
12
|
+
.option('-q, --quick', 'Quick mode with minimal interrogation')
|
|
13
|
+
.action((options) => this.execute(options));
|
|
14
|
+
}
|
|
15
|
+
async execute(options) {
|
|
16
|
+
this.logger.header('FORGE Project Initialization');
|
|
17
|
+
this.logger.info('The init command will be fully implemented in Task 2.');
|
|
18
|
+
this.logger.info('It will include: interrogation, research, scoping, and roadmap generation.');
|
|
19
|
+
console.log(chalk.dim('\n TODO: Implement Interrogate → Reconnoitre → Extract → Forge Roadmap → Checkpoint\n'));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AACH,MAAM,OAAO,WAAY,SAAQ,YAAY;IAC3C,QAAQ;QACN,IAAI,CAAC,OAAO;aACT,OAAO,CAAC,MAAM,CAAC;aACf,WAAW,CAAC,4DAA4D,CAAC;aACzE,MAAM,CAAC,aAAa,EAAE,uCAAuC,CAAC;aAC9D,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAY;QACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;QAC/F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wFAAwF,CAAC,CAAC,CAAC;IACnH,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ForgeCommand } from './base.js';
|
|
2
|
+
/**
|
|
3
|
+
* Status Command - Show current progress, active agents, task graph
|
|
4
|
+
*/
|
|
5
|
+
export declare class StatusCommand extends ForgeCommand {
|
|
6
|
+
register(): void;
|
|
7
|
+
execute(options?: any): Promise<void>;
|
|
8
|
+
private displayStatus;
|
|
9
|
+
private formatStatus;
|
|
10
|
+
private displayTaskSummary;
|
|
11
|
+
private displayContracts;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAMzC;;GAEG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,QAAQ,IAAI,IAAI;IAQV,OAAO,CAAC,OAAO,GAAE,GAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB/C,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,kBAAkB;IA4B1B,OAAO,CAAC,gBAAgB;CAQzB"}
|