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,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FORGE Template Client
|
|
3
|
+
* Wrapper for TEMPLATES integration with CLI-ENGINE
|
|
4
|
+
*/
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import fs from 'fs/promises';
|
|
7
|
+
import { createTemplateEngine } from '../generators/index.js';
|
|
8
|
+
import { XmlTaskGenerator } from '../generators/index.js';
|
|
9
|
+
import { REQUIRED_FIELDS, validateRequiredFields } from '../generators/index.js';
|
|
10
|
+
import { logger } from './index.js';
|
|
11
|
+
/**
|
|
12
|
+
* Template Client for FORGE CLI
|
|
13
|
+
*/
|
|
14
|
+
export class TemplateClient {
|
|
15
|
+
engine;
|
|
16
|
+
projectRoot;
|
|
17
|
+
interactive;
|
|
18
|
+
outputDir;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.projectRoot = config.projectRoot;
|
|
21
|
+
this.interactive = config.interactive ?? true;
|
|
22
|
+
this.outputDir = config.outputDir ?? config.projectRoot;
|
|
23
|
+
// Create template engine
|
|
24
|
+
this.engine = createTemplateEngine({
|
|
25
|
+
templatesDir: config.templatesDir ?? path.join(config.projectRoot, 'src/templates'),
|
|
26
|
+
outputDir: this.outputDir,
|
|
27
|
+
tokenLimits: {
|
|
28
|
+
claude: 2000,
|
|
29
|
+
requirements: 4000,
|
|
30
|
+
plan: 6000,
|
|
31
|
+
rules: 1000,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Validate that context has all required fields for a template
|
|
37
|
+
*/
|
|
38
|
+
validateContext(context, fieldSet) {
|
|
39
|
+
return validateRequiredFields(context, fieldSet);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get required fields for a specific template
|
|
43
|
+
*/
|
|
44
|
+
getRequiredFields(fieldSet) {
|
|
45
|
+
return [...REQUIRED_FIELDS[fieldSet]];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Render a template with the given context
|
|
49
|
+
*/
|
|
50
|
+
async renderTemplate(templateName, context) {
|
|
51
|
+
try {
|
|
52
|
+
// Cast to full TemplateContext for the engine
|
|
53
|
+
// Validation should happen before calling this
|
|
54
|
+
const result = await this.engine.render(templateName, context);
|
|
55
|
+
// Handle token limit warnings
|
|
56
|
+
if (!result.withinLimit) {
|
|
57
|
+
this.handleTokenLimitWarning(templateName, result);
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
throw new Error(`Template rendering failed for ${templateName}: ${error}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Render and write a template to disk
|
|
67
|
+
*/
|
|
68
|
+
async generateArtifact(templateName, context, outputFilename) {
|
|
69
|
+
// TODO: Validate context has required fields before rendering
|
|
70
|
+
// For now, cast to full TemplateContext
|
|
71
|
+
const result = await this.renderTemplate(templateName, context);
|
|
72
|
+
const outputPath = path.join(this.outputDir, outputFilename);
|
|
73
|
+
// Backup existing file if it exists
|
|
74
|
+
if (await this.fileExists(outputPath)) {
|
|
75
|
+
await this.backupFile(outputPath);
|
|
76
|
+
}
|
|
77
|
+
// Write the generated artifact
|
|
78
|
+
await fs.writeFile(outputPath, result.content, 'utf-8');
|
|
79
|
+
logger.success(`Generated ${outputFilename} (${result.tokenCount} tokens)`);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Generate XML task specs
|
|
83
|
+
*/
|
|
84
|
+
generateXmlTasks(tasks) {
|
|
85
|
+
// Use XmlTaskGenerator static method directly
|
|
86
|
+
// It's already imported at the top of the file
|
|
87
|
+
return XmlTaskGenerator.generateTasks(tasks);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Handle token limit warnings
|
|
91
|
+
*/
|
|
92
|
+
handleTokenLimitWarning(templateName, result) {
|
|
93
|
+
const limit = this.getTemplateLimit(templateName);
|
|
94
|
+
logger.warning(`Token limit exceeded for ${templateName}`);
|
|
95
|
+
logger.info(`Limit: ${limit}, Actual: ${result.tokenCount}`);
|
|
96
|
+
if (result.warnings.length > 0) {
|
|
97
|
+
logger.info('Suggestions:');
|
|
98
|
+
result.warnings.forEach(w => logger.bullet(w));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get token limit for a template
|
|
103
|
+
*/
|
|
104
|
+
getTemplateLimit(templateName) {
|
|
105
|
+
if (templateName.includes('CLAUDE'))
|
|
106
|
+
return 2000;
|
|
107
|
+
if (templateName.includes('REQUIREMENTS'))
|
|
108
|
+
return 4000;
|
|
109
|
+
if (templateName.includes('PLAN'))
|
|
110
|
+
return 6000;
|
|
111
|
+
return 1000; // Default for rules
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Check if file exists
|
|
115
|
+
*/
|
|
116
|
+
async fileExists(filePath) {
|
|
117
|
+
try {
|
|
118
|
+
await fs.access(filePath);
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Backup existing file
|
|
127
|
+
*/
|
|
128
|
+
async backupFile(filePath) {
|
|
129
|
+
const backupPath = `${filePath}.backup`;
|
|
130
|
+
await fs.copyFile(filePath, backupPath);
|
|
131
|
+
logger.info(`Backed up ${path.basename(filePath)} → ${path.basename(backupPath)}`);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Prompt user to proceed despite warnings
|
|
135
|
+
*/
|
|
136
|
+
async shouldProceed() {
|
|
137
|
+
if (!this.interactive) {
|
|
138
|
+
return true; // Auto-proceed in non-interactive mode
|
|
139
|
+
}
|
|
140
|
+
// TODO: Implement interactive prompt
|
|
141
|
+
// For now, default to true
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Create a template client instance
|
|
147
|
+
*/
|
|
148
|
+
export function createTemplateClient(config) {
|
|
149
|
+
return new TemplateClient(config);
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=template-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-client.js","sourceRoot":"","sources":["../../src/utils/template-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "forge-dev-framework",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Full Orchestration for Rapid Git Engineering - A multi-agent development framework for Claude Code Agent Teams",
|
|
5
|
+
"main": "dist/cli/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"forge": "./dist/bin/forge.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/",
|
|
11
|
+
".claude/",
|
|
12
|
+
"templates/",
|
|
13
|
+
"bin/"
|
|
14
|
+
],
|
|
15
|
+
"type": "module",
|
|
16
|
+
"scripts": {
|
|
17
|
+
"prepublishOnly": "npm run build",
|
|
18
|
+
"build": "npm run build:ts && npm run build:bin",
|
|
19
|
+
"build:ts": "tsc",
|
|
20
|
+
"build:bin": "mkdir -p dist/bin && cp bin/forge.js dist/bin/forge.js && chmod +x dist/bin/forge.js",
|
|
21
|
+
"dev": "tsx src/cli/index.ts",
|
|
22
|
+
"start": "node dist/cli/index.js",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"test:watch": "vitest",
|
|
25
|
+
"test:coverage": "vitest --coverage",
|
|
26
|
+
"test:git": "node --import tsx --test src/git/**/*.test.ts",
|
|
27
|
+
"postinstall": "node dist/scripts/install.js"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"claude",
|
|
31
|
+
"claude-code",
|
|
32
|
+
"agent-teams",
|
|
33
|
+
"ai-development",
|
|
34
|
+
"git-automation",
|
|
35
|
+
"multi-agent",
|
|
36
|
+
"project-management",
|
|
37
|
+
"development-framework",
|
|
38
|
+
"claude-ai"
|
|
39
|
+
],
|
|
40
|
+
"author": "Alzarak <parz@alzarak.dev>",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "git+https://github.com/Alzarak/forge.git"
|
|
45
|
+
},
|
|
46
|
+
"bugs": {
|
|
47
|
+
"url": "https://github.com/Alzarak/forge/issues"
|
|
48
|
+
},
|
|
49
|
+
"homepage": "https://github.com/Alzarak/forge#readme",
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"chalk": "^5.6.2",
|
|
52
|
+
"commander": "^14.0.3",
|
|
53
|
+
"execa": "^9.5.2",
|
|
54
|
+
"figlet": "^1.10.0",
|
|
55
|
+
"handlebars": "^4.7.8",
|
|
56
|
+
"inquirer": "^12.11.1",
|
|
57
|
+
"zod": "^3.24.1"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"@types/figlet": "^1.7.0",
|
|
61
|
+
"@types/handlebars": "^4.1.0",
|
|
62
|
+
"@types/inquirer": "^9.0.9",
|
|
63
|
+
"@types/node": "^25.2.3",
|
|
64
|
+
"@vitest/ui": "^3.2.4",
|
|
65
|
+
"tsx": "^4.21.0",
|
|
66
|
+
"typescript": "^5.9.3",
|
|
67
|
+
"vitest": "^3.2.4"
|
|
68
|
+
},
|
|
69
|
+
"engines": {
|
|
70
|
+
"node": ">=18.0.0"
|
|
71
|
+
}
|
|
72
|
+
}
|