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
@@ -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
+ }