gameforge-cli 0.1.0 → 0.2.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/README.md +117 -44
- package/dist/agents/base/BaseAgent.d.ts +31 -0
- package/dist/agents/base/BaseAgent.d.ts.map +1 -1
- package/dist/agents/base/BaseAgent.js +57 -0
- package/dist/agents/base/BaseAgent.js.map +1 -1
- package/dist/agents/core/Architect.d.ts +21 -5
- package/dist/agents/core/Architect.d.ts.map +1 -1
- package/dist/agents/core/Architect.js +413 -150
- package/dist/agents/core/Architect.js.map +1 -1
- package/dist/agents/core/Chaos.d.ts +4 -0
- package/dist/agents/core/Chaos.d.ts.map +1 -1
- package/dist/agents/core/Chaos.js +46 -11
- package/dist/agents/core/Chaos.js.map +1 -1
- package/dist/agents/core/Consistency.d.ts +1 -0
- package/dist/agents/core/Consistency.d.ts.map +1 -1
- package/dist/agents/core/Consistency.js +86 -11
- package/dist/agents/core/Consistency.js.map +1 -1
- package/dist/agents/core/DocumentUpdater.d.ts +13 -0
- package/dist/agents/core/DocumentUpdater.d.ts.map +1 -0
- package/dist/agents/core/DocumentUpdater.js +165 -0
- package/dist/agents/core/DocumentUpdater.js.map +1 -0
- package/dist/agents/core/Modifier.d.ts +13 -0
- package/dist/agents/core/Modifier.d.ts.map +1 -0
- package/dist/agents/core/Modifier.js +141 -0
- package/dist/agents/core/Modifier.js.map +1 -0
- package/dist/agents/core/Remediation.d.ts +3 -1
- package/dist/agents/core/Remediation.d.ts.map +1 -1
- package/dist/agents/core/Remediation.js +63 -3
- package/dist/agents/core/Remediation.js.map +1 -1
- package/dist/agents/specialists/CreativeSpecialist.d.ts.map +1 -1
- package/dist/agents/specialists/CreativeSpecialist.js +162 -25
- package/dist/agents/specialists/CreativeSpecialist.js.map +1 -1
- package/dist/agents/specialists/EntitySpecialist.d.ts.map +1 -1
- package/dist/agents/specialists/EntitySpecialist.js +79 -25
- package/dist/agents/specialists/EntitySpecialist.js.map +1 -1
- package/dist/agents/specialists/FeatureSpecialist.d.ts +4 -0
- package/dist/agents/specialists/FeatureSpecialist.d.ts.map +1 -1
- package/dist/agents/specialists/FeatureSpecialist.js +114 -39
- package/dist/agents/specialists/FeatureSpecialist.js.map +1 -1
- package/dist/agents/specialists/TechSpecialist.d.ts.map +1 -1
- package/dist/agents/specialists/TechSpecialist.js +169 -32
- package/dist/agents/specialists/TechSpecialist.js.map +1 -1
- package/dist/config/schema.d.ts +1319 -709
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +142 -52
- package/dist/config/schema.js.map +1 -1
- package/dist/config/templates.d.ts.map +1 -1
- package/dist/config/templates.js +6 -66
- package/dist/config/templates.js.map +1 -1
- package/dist/core/Orchestrator.d.ts +17 -3
- package/dist/core/Orchestrator.d.ts.map +1 -1
- package/dist/core/Orchestrator.js +46 -16
- package/dist/core/Orchestrator.js.map +1 -1
- package/dist/index.js +544 -226
- package/dist/index.js.map +1 -1
- package/dist/types/issueReview.d.ts +19 -0
- package/dist/types/issueReview.d.ts.map +1 -0
- package/dist/types/issueReview.js +3 -0
- package/dist/types/issueReview.js.map +1 -0
- package/dist/utils/costTracker.d.ts +28 -0
- package/dist/utils/costTracker.d.ts.map +1 -1
- package/dist/utils/costTracker.js +71 -1
- package/dist/utils/costTracker.js.map +1 -1
- package/dist/utils/disambiguationHelper.d.ts +54 -0
- package/dist/utils/disambiguationHelper.d.ts.map +1 -0
- package/dist/utils/disambiguationHelper.js +262 -0
- package/dist/utils/disambiguationHelper.js.map +1 -0
- package/dist/utils/fileManager.d.ts +7 -0
- package/dist/utils/fileManager.d.ts.map +1 -1
- package/dist/utils/fileManager.js +47 -0
- package/dist/utils/fileManager.js.map +1 -1
- package/dist/utils/issueReviewer.d.ts +10 -0
- package/dist/utils/issueReviewer.d.ts.map +1 -0
- package/dist/utils/issueReviewer.js +206 -0
- package/dist/utils/issueReviewer.js.map +1 -0
- package/dist/utils/issueSelector.d.ts +26 -0
- package/dist/utils/issueSelector.d.ts.map +1 -0
- package/dist/utils/issueSelector.js +132 -0
- package/dist/utils/issueSelector.js.map +1 -0
- package/dist/utils/pdfGenerator.d.ts +12 -0
- package/dist/utils/pdfGenerator.d.ts.map +1 -0
- package/dist/utils/pdfGenerator.js +341 -0
- package/dist/utils/pdfGenerator.js.map +1 -0
- package/package.json +20 -15
- package/dist/core/CheckpointManager.d.ts +0 -16
- package/dist/core/CheckpointManager.d.ts.map +0 -1
- package/dist/core/CheckpointManager.js +0 -52
- package/dist/core/CheckpointManager.js.map +0 -1
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DisambiguationHelper = void 0;
|
|
7
|
+
const enquirer_1 = __importDefault(require("enquirer"));
|
|
8
|
+
const picocolors_1 = __importDefault(require("picocolors"));
|
|
9
|
+
const ora_1 = __importDefault(require("ora"));
|
|
10
|
+
const child_process_1 = require("child_process");
|
|
11
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
13
|
+
const os_1 = __importDefault(require("os"));
|
|
14
|
+
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
15
|
+
/**
|
|
16
|
+
* DisambiguationHelper provides a reusable mechanism for agents to ask
|
|
17
|
+
* clarifying questions when they encounter ambiguity.
|
|
18
|
+
*
|
|
19
|
+
* Features:
|
|
20
|
+
* - Generates 2 AI-powered suggestions based on context
|
|
21
|
+
* - Offers "AI Decide" option with reasoning
|
|
22
|
+
* - Offers "Custom Answer" via text editor
|
|
23
|
+
* - Returns standardized result
|
|
24
|
+
*/
|
|
25
|
+
class DisambiguationHelper {
|
|
26
|
+
client;
|
|
27
|
+
constructor(apiKey) {
|
|
28
|
+
this.client = new sdk_1.default({ apiKey });
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Ask the user a clarifying question with AI-generated options
|
|
32
|
+
* @param question The disambiguation question configuration
|
|
33
|
+
* @returns The user's answer and whether it was AI-generated
|
|
34
|
+
*/
|
|
35
|
+
async ask(question) {
|
|
36
|
+
console.log(picocolors_1.default.cyan(`\n❓ ${question.question}\n`));
|
|
37
|
+
// Generate AI suggestions with a spinner
|
|
38
|
+
const spinner = (0, ora_1.default)('Generating suggestions...').start();
|
|
39
|
+
const suggestions = await this.generateSuggestions(question);
|
|
40
|
+
spinner.stop();
|
|
41
|
+
// Present choices to user
|
|
42
|
+
const choices = [
|
|
43
|
+
...suggestions,
|
|
44
|
+
'✨ AI Decide (Smart Default)',
|
|
45
|
+
'✏️ Custom Answer'
|
|
46
|
+
];
|
|
47
|
+
const response = await enquirer_1.default.prompt({
|
|
48
|
+
type: 'select',
|
|
49
|
+
name: 'choice',
|
|
50
|
+
message: 'Select an option:',
|
|
51
|
+
choices
|
|
52
|
+
});
|
|
53
|
+
// Handle "AI Decide"
|
|
54
|
+
if (response.choice === '✨ AI Decide (Smart Default)') {
|
|
55
|
+
const decisionSpinner = (0, ora_1.default)('AI is deciding...').start();
|
|
56
|
+
const aiDecision = await this.generateAIDecision(question);
|
|
57
|
+
decisionSpinner.stop();
|
|
58
|
+
console.log(picocolors_1.default.yellow(`\n🤖 AI Suggests: ${aiDecision.answer}`));
|
|
59
|
+
console.log(picocolors_1.default.dim(` Reasoning: ${aiDecision.reasoning}\n`));
|
|
60
|
+
const confirm = await enquirer_1.default.prompt({
|
|
61
|
+
type: 'confirm',
|
|
62
|
+
name: 'accept',
|
|
63
|
+
message: 'Accept this suggestion?',
|
|
64
|
+
initial: true
|
|
65
|
+
});
|
|
66
|
+
if (confirm.accept) {
|
|
67
|
+
return { answer: aiDecision.answer, wasAIGenerated: true };
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// Re-ask the question
|
|
71
|
+
return this.ask(question);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Handle "Custom Answer"
|
|
75
|
+
if (response.choice === '✏️ Custom Answer') {
|
|
76
|
+
const answer = await this.openEditor(question.question);
|
|
77
|
+
return { answer, wasAIGenerated: false };
|
|
78
|
+
}
|
|
79
|
+
// Regular choice from suggestions
|
|
80
|
+
return { answer: response.choice, wasAIGenerated: false };
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Generate 2 AI-powered suggestions based on the question and context
|
|
84
|
+
*/
|
|
85
|
+
async generateSuggestions(question) {
|
|
86
|
+
const prompt = `Given this game design context:
|
|
87
|
+
${question.context}
|
|
88
|
+
|
|
89
|
+
Question being asked to the user: ${question.question}
|
|
90
|
+
|
|
91
|
+
Your task: Provide 2 possible ANSWERS to the question above.
|
|
92
|
+
Each answer should be:
|
|
93
|
+
1. A direct response to the specific question being asked
|
|
94
|
+
2. Brief (1-2 sentences or a short phrase)
|
|
95
|
+
3. Practical and consistent with the game context
|
|
96
|
+
4. Different from each other (provide variety)
|
|
97
|
+
|
|
98
|
+
IMPORTANT: Your suggestions must directly answer the question. For example:
|
|
99
|
+
- If the question asks "Who is the target audience?", provide audience descriptions like "Casual mobile gamers aged 25-40" or "Hardcore strategy fans"
|
|
100
|
+
- If the question asks "What is the art style?", provide art style descriptions like "Stylized low-poly 3D" or "Hand-drawn 2D animation"
|
|
101
|
+
- Do NOT provide game feature suggestions unless the question specifically asks about features
|
|
102
|
+
|
|
103
|
+
Respond in JSON format:
|
|
104
|
+
{
|
|
105
|
+
"suggestions": ["answer 1", "answer 2"]
|
|
106
|
+
}`;
|
|
107
|
+
try {
|
|
108
|
+
const response = await this.client.messages.create({
|
|
109
|
+
model: 'claude-haiku-4-5-20251001', // Use cheaper model for quick suggestions
|
|
110
|
+
max_tokens: 1024,
|
|
111
|
+
temperature: 0.8,
|
|
112
|
+
messages: [{ role: 'user', content: prompt }]
|
|
113
|
+
});
|
|
114
|
+
const content = response.content[0].type === 'text' ? response.content[0].text : '';
|
|
115
|
+
// Extract JSON from markdown code blocks if present
|
|
116
|
+
const jsonMatch = content.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
117
|
+
const jsonStr = jsonMatch ? jsonMatch[1].trim() : content;
|
|
118
|
+
const parsed = JSON.parse(jsonStr);
|
|
119
|
+
return parsed.suggestions || ['Option 1', 'Option 2'];
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
console.warn(picocolors_1.default.yellow('Could not generate AI suggestions, using defaults'));
|
|
123
|
+
if (error instanceof Error) {
|
|
124
|
+
console.warn(picocolors_1.default.yellow(`AI suggestion error: ${error.message}`));
|
|
125
|
+
}
|
|
126
|
+
return ['Standard approach', 'Alternative approach'];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Generate a smart default decision with reasoning
|
|
131
|
+
*/
|
|
132
|
+
async generateAIDecision(question) {
|
|
133
|
+
const prompt = `Given this game design context:
|
|
134
|
+
${question.context}
|
|
135
|
+
|
|
136
|
+
Question: ${question.question}
|
|
137
|
+
|
|
138
|
+
Provide a smart default answer that:
|
|
139
|
+
1. Fits the established design and genre
|
|
140
|
+
2. Is technically feasible
|
|
141
|
+
3. Maintains reasonable scope
|
|
142
|
+
4. Is internally consistent
|
|
143
|
+
|
|
144
|
+
Respond in JSON format:
|
|
145
|
+
{
|
|
146
|
+
"answer": "your suggested answer (be specific and concrete)",
|
|
147
|
+
"reasoning": "brief explanation (1-2 sentences)"
|
|
148
|
+
}`;
|
|
149
|
+
try {
|
|
150
|
+
const response = await this.client.messages.create({
|
|
151
|
+
model: 'claude-sonnet-4-5-20250929', // Use smarter model for decisions
|
|
152
|
+
max_tokens: 1024,
|
|
153
|
+
temperature: 0.7,
|
|
154
|
+
messages: [{ role: 'user', content: prompt }]
|
|
155
|
+
});
|
|
156
|
+
const content = response.content[0].type === 'text' ? response.content[0].text : '';
|
|
157
|
+
// Extract JSON from markdown code blocks if present
|
|
158
|
+
const jsonMatch = content.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
159
|
+
const jsonStr = jsonMatch ? jsonMatch[1].trim() : content;
|
|
160
|
+
const parsed = JSON.parse(jsonStr);
|
|
161
|
+
return {
|
|
162
|
+
answer: parsed.answer || 'Standard approach',
|
|
163
|
+
reasoning: parsed.reasoning || 'Based on genre conventions'
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
console.warn(picocolors_1.default.yellow('Could not generate AI decision, using default'));
|
|
168
|
+
if (error instanceof Error) {
|
|
169
|
+
console.warn(picocolors_1.default.yellow(`AI decision error: ${error.message}`));
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
answer: 'Standard approach',
|
|
173
|
+
reasoning: 'Default fallback due to error'
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Open a text editor for the user to write a custom answer
|
|
179
|
+
*/
|
|
180
|
+
async openEditor(question) {
|
|
181
|
+
const tmpDir = os_1.default.tmpdir();
|
|
182
|
+
const tmpFile = path_1.default.join(tmpDir, `gameforge-disambiguation-${Date.now()}.txt`);
|
|
183
|
+
const initialContent = `# ${question}\n# Write your answer below, then save and close the editor\n\n`;
|
|
184
|
+
await fs_extra_1.default.writeFile(tmpFile, initialContent, 'utf-8');
|
|
185
|
+
const editor = process.env.VISUAL || process.env.EDITOR || 'vim';
|
|
186
|
+
// Validate editor path to prevent command injection
|
|
187
|
+
const editorPath = editor.split(' ')[0]; // Get just the command, not arguments
|
|
188
|
+
if (/[;&|`$(){}[\]<>]/.test(editorPath)) {
|
|
189
|
+
console.error(picocolors_1.default.red('Error: Invalid editor path detected'));
|
|
190
|
+
await fs_extra_1.default.remove(tmpFile);
|
|
191
|
+
throw new Error('Invalid editor path - potential security risk');
|
|
192
|
+
}
|
|
193
|
+
console.log(picocolors_1.default.dim(`\nOpening ${editor}... (save and close when done)`));
|
|
194
|
+
try {
|
|
195
|
+
(0, child_process_1.execSync)(`${editor} "${tmpFile}"`, { stdio: 'inherit' });
|
|
196
|
+
let content = await fs_extra_1.default.readFile(tmpFile, 'utf-8');
|
|
197
|
+
// Remove comment lines (lines starting with #)
|
|
198
|
+
content = content
|
|
199
|
+
.split('\n')
|
|
200
|
+
.filter(line => !line.trim().startsWith('#'))
|
|
201
|
+
.join('\n')
|
|
202
|
+
.trim();
|
|
203
|
+
await fs_extra_1.default.remove(tmpFile);
|
|
204
|
+
if (!content) {
|
|
205
|
+
console.log(picocolors_1.default.yellow('No content entered. Please try again.'));
|
|
206
|
+
// Recursive call will create its own temp file
|
|
207
|
+
return this.openEditor(question);
|
|
208
|
+
}
|
|
209
|
+
return content;
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
console.error(picocolors_1.default.red('Error opening editor:'), error);
|
|
213
|
+
// Ensure cleanup even on error
|
|
214
|
+
try {
|
|
215
|
+
await fs_extra_1.default.remove(tmpFile);
|
|
216
|
+
}
|
|
217
|
+
catch (cleanupError) {
|
|
218
|
+
// Ignore cleanup errors
|
|
219
|
+
}
|
|
220
|
+
throw error;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Helper to format game context from a GameBible for disambiguation
|
|
225
|
+
*/
|
|
226
|
+
static formatGameContext(bible) {
|
|
227
|
+
const parts = [];
|
|
228
|
+
if (bible.meta) {
|
|
229
|
+
parts.push(`Title: ${bible.meta.title}`);
|
|
230
|
+
parts.push(`Genre: ${bible.meta.genre?.join(', ') || 'N/A'}`);
|
|
231
|
+
parts.push(`Concept: ${bible.meta.conceptStatement || 'N/A'}`);
|
|
232
|
+
parts.push(`Platform: ${bible.meta.targetPlatform?.join(', ') || 'N/A'}`);
|
|
233
|
+
parts.push(`Scope: ${bible.meta.estimatedScope || 'N/A'}`);
|
|
234
|
+
}
|
|
235
|
+
if (Array.isArray(bible.features) && bible.features.length > 0) {
|
|
236
|
+
parts.push(`\nCore Features (${bible.features.length}):`);
|
|
237
|
+
bible.features.slice(0, 5).forEach((f) => {
|
|
238
|
+
parts.push(` - ${f.name}: ${f.intent || 'N/A'}`);
|
|
239
|
+
});
|
|
240
|
+
if (bible.features.length > 5) {
|
|
241
|
+
parts.push(` ... and ${bible.features.length - 5} more`);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (Array.isArray(bible.gameObjects) && bible.gameObjects.length > 0) {
|
|
245
|
+
parts.push(`\nKey Entities: ${bible.gameObjects.slice(0, 5).map((e) => e.name).join(', ')}`);
|
|
246
|
+
if (bible.gameObjects.length > 5) {
|
|
247
|
+
parts.push(`... and ${bible.gameObjects.length - 5} more`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return parts.join('\n');
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Helper to format transcript context for disambiguation
|
|
254
|
+
*/
|
|
255
|
+
static formatTranscriptContext(transcript) {
|
|
256
|
+
return transcript
|
|
257
|
+
.map(t => `Q: ${t.question}\nA: ${t.answer}`)
|
|
258
|
+
.join('\n\n');
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
exports.DisambiguationHelper = DisambiguationHelper;
|
|
262
|
+
//# sourceMappingURL=disambiguationHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disambiguationHelper.js","sourceRoot":"","sources":["../../src/utils/disambiguationHelper.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,13 @@ export declare class FileManager {
|
|
|
8
8
|
saveGameBible(projectDir: string, bible: GameBible): Promise<void>;
|
|
9
9
|
saveMarkdown(projectDir: string, filename: string, content: string): Promise<void>;
|
|
10
10
|
saveGapAnalysis(projectDir: string, chaosIssues: ChaosIssue[], consistencyIssues: ConsistencyIssue[]): Promise<void>;
|
|
11
|
+
readGDD(projectDir: string): Promise<string | null>;
|
|
12
|
+
saveUpdatedGDD(projectDir: string, content: string): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Update the gap analysis section in an existing GDD document
|
|
15
|
+
* Replaces the existing gap analysis or appends if not found
|
|
16
|
+
*/
|
|
17
|
+
updateGapAnalysisInDocument(document: string, chaosIssues: ChaosIssue[], consistencyIssues: ConsistencyIssue[], sessionId: string): string;
|
|
11
18
|
saveCoverPage(projectDir: string, bible: GameBible): Promise<void>;
|
|
12
19
|
saveCombinedGDD(projectDir: string, bible: GameBible, markdownSections: Map<string, string>, chaosIssues: ChaosIssue[], consistencyIssues: ConsistencyIssue[]): Promise<void>;
|
|
13
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileManager.d.ts","sourceRoot":"","sources":["../../src/utils/fileManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"fileManager.d.ts","sourceRoot":"","sources":["../../src/utils/fileManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG9D,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,GAAE,MAA4B;IAI7C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM9C,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlF,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,UAAU,EAAE,EACzB,iBAAiB,EAAE,gBAAgB,EAAE,GACpC,OAAO,CAAC,IAAI,CAAC;IAkBV,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQnD,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxE;;;OAGG;IACH,2BAA2B,CACzB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,UAAU,EAAE,EACzB,iBAAiB,EAAE,gBAAgB,EAAE,EACrC,SAAS,EAAE,MAAM,GAChB,MAAM;IA2CH,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBlE,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,SAAS,EAChB,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,WAAW,EAAE,UAAU,EAAE,EACzB,iBAAiB,EAAE,gBAAgB,EAAE,GACpC,OAAO,CAAC,IAAI,CAAC;CAyFjB"}
|
|
@@ -32,6 +32,53 @@ class FileManager {
|
|
|
32
32
|
: 'No critical issues found.'}`;
|
|
33
33
|
await this.saveMarkdown(projectDir, '99_Gap_Analysis.md', content);
|
|
34
34
|
}
|
|
35
|
+
async readGDD(projectDir) {
|
|
36
|
+
const filePath = path_1.default.join(projectDir, 'Game_Design_Document.md');
|
|
37
|
+
if (await fs_extra_1.default.pathExists(filePath)) {
|
|
38
|
+
return fs_extra_1.default.readFile(filePath, 'utf-8');
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
async saveUpdatedGDD(projectDir, content) {
|
|
43
|
+
await this.saveMarkdown(projectDir, 'Game_Design_Document.md', content);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Update the gap analysis section in an existing GDD document
|
|
47
|
+
* Replaces the existing gap analysis or appends if not found
|
|
48
|
+
*/
|
|
49
|
+
updateGapAnalysisInDocument(document, chaosIssues, consistencyIssues, sessionId) {
|
|
50
|
+
// Build the new gap analysis section
|
|
51
|
+
const gapContent = `# Gap Analysis & Validation
|
|
52
|
+
|
|
53
|
+
## Consistency Issues
|
|
54
|
+
|
|
55
|
+
${consistencyIssues.length === 0
|
|
56
|
+
? '*No consistency issues found.*'
|
|
57
|
+
: consistencyIssues.map((issue, idx) => `### ${idx + 1}. ${issue.severity}: ${issue.message}\n\n**Location**: ${issue.location}\n\n${issue.suggestion ? `**Suggestion**: ${issue.suggestion}` : ''}`).join('\n\n')}
|
|
58
|
+
|
|
59
|
+
## Critical Design Issues
|
|
60
|
+
|
|
61
|
+
${chaosIssues.length === 0
|
|
62
|
+
? '*No critical design issues found.*'
|
|
63
|
+
: chaosIssues.map((issue, idx) => `### ${idx + 1}. [${issue.severity}] ${issue.category}\n\n**Issue**: ${issue.description}\n\n**Location**: ${issue.location}\n\n**Recommendation**: ${issue.recommendation}`).join('\n\n')}
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
*Game Design Document Generated with GameForge CLI*
|
|
68
|
+
*Session ID: ${sessionId}*
|
|
69
|
+
`;
|
|
70
|
+
// Try to find and replace existing gap analysis section
|
|
71
|
+
// Match patterns like "# N. Gap Analysis" or "# Gap Analysis"
|
|
72
|
+
const gapAnalysisPattern = /^#\s*(\d+\.\s*)?Gap Analysis.*$/m;
|
|
73
|
+
const match = document.match(gapAnalysisPattern);
|
|
74
|
+
if (match && match.index !== undefined) {
|
|
75
|
+
// Found existing gap analysis - replace everything from there to end
|
|
76
|
+
const beforeGap = document.substring(0, match.index).trimEnd();
|
|
77
|
+
return `${beforeGap}\n\n${gapContent}`;
|
|
78
|
+
}
|
|
79
|
+
// No existing gap analysis found - append to end
|
|
80
|
+
return `${document.trimEnd()}\n\n---\n\n${gapContent}`;
|
|
81
|
+
}
|
|
35
82
|
async saveCoverPage(projectDir, bible) {
|
|
36
83
|
const content = `# ${bible.meta.title}
|
|
37
84
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileManager.js","sourceRoot":"","sources":["../../src/utils/fileManager.ts"],"names":[],"mappings":";;;;;;AAAA,wDAA0B;AAC1B,gDAAwB;
|
|
1
|
+
{"version":3,"file":"fileManager.js","sourceRoot":"","sources":["../../src/utils/fileManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ConsistencyIssue } from '../agents/core/Consistency';
|
|
2
|
+
import { ChaosIssue } from '../agents/core/Chaos';
|
|
3
|
+
import { ReviewedIssuesCollection, IssueWithNotes } from '../types/issueReview';
|
|
4
|
+
export declare function reviewIssuesOneByOne(consistencyIssues: ConsistencyIssue[], chaosIssues: ChaosIssue[]): Promise<ReviewedIssuesCollection>;
|
|
5
|
+
export declare function convertToIssuesWithNotes(reviewed: ReviewedIssuesCollection): IssueWithNotes[];
|
|
6
|
+
export declare function filterIssuesForGapAnalysis(originalConsistencyIssues: ConsistencyIssue[], originalChaosIssues: ChaosIssue[], reviewed: ReviewedIssuesCollection, unfixableIssueDescriptions: string[]): {
|
|
7
|
+
consistencyIssues: ConsistencyIssue[];
|
|
8
|
+
chaosIssues: ChaosIssue[];
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=issueReviewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issueReviewer.d.ts","sourceRoot":"","sources":["../../src/utils/issueReviewer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAGL,wBAAwB,EACxB,cAAc,EACf,MAAM,sBAAsB,CAAC;AA0H9B,wBAAsB,oBAAoB,CACxC,iBAAiB,EAAE,gBAAgB,EAAE,EACrC,WAAW,EAAE,UAAU,EAAE,GACxB,OAAO,CAAC,wBAAwB,CAAC,CAiDnC;AAGD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,cAAc,EAAE,CAc7F;AAGD,wBAAgB,0BAA0B,CACxC,yBAAyB,EAAE,gBAAgB,EAAE,EAC7C,mBAAmB,EAAE,UAAU,EAAE,EACjC,QAAQ,EAAE,wBAAwB,EAClC,0BAA0B,EAAE,MAAM,EAAE,GACnC;IAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IAAC,WAAW,EAAE,UAAU,EAAE,CAAA;CAAE,CA2DtE"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.reviewIssuesOneByOne = reviewIssuesOneByOne;
|
|
7
|
+
exports.convertToIssuesWithNotes = convertToIssuesWithNotes;
|
|
8
|
+
exports.filterIssuesForGapAnalysis = filterIssuesForGapAnalysis;
|
|
9
|
+
const picocolors_1 = __importDefault(require("picocolors"));
|
|
10
|
+
const enquirer_1 = __importDefault(require("enquirer"));
|
|
11
|
+
// Type guard for ConsistencyIssue
|
|
12
|
+
function isConsistencyIssue(issue) {
|
|
13
|
+
return 'message' in issue && 'suggestion' in issue;
|
|
14
|
+
}
|
|
15
|
+
// Get color based on severity
|
|
16
|
+
function getSeverityColor(severity) {
|
|
17
|
+
const upperSeverity = severity.toUpperCase();
|
|
18
|
+
if (upperSeverity === 'ERROR' || upperSeverity === 'CRITICAL') {
|
|
19
|
+
return picocolors_1.default.red;
|
|
20
|
+
}
|
|
21
|
+
else if (upperSeverity === 'WARNING' || upperSeverity === 'MAJOR') {
|
|
22
|
+
return picocolors_1.default.yellow;
|
|
23
|
+
}
|
|
24
|
+
return picocolors_1.default.dim;
|
|
25
|
+
}
|
|
26
|
+
// Display full details for a single issue
|
|
27
|
+
function displayIssueDetails(issue, issueType, currentIndex, totalCount) {
|
|
28
|
+
const separator = '═'.repeat(65);
|
|
29
|
+
console.log(picocolors_1.default.cyan(`\n${separator}`));
|
|
30
|
+
console.log(picocolors_1.default.cyan(`Issue ${currentIndex + 1} of ${totalCount}`));
|
|
31
|
+
console.log(picocolors_1.default.cyan(separator));
|
|
32
|
+
if (isConsistencyIssue(issue)) {
|
|
33
|
+
const colorFn = getSeverityColor(issue.severity);
|
|
34
|
+
console.log(`\n${picocolors_1.default.bold('Severity:')} ${colorFn(issue.severity)}`);
|
|
35
|
+
console.log(`${picocolors_1.default.bold('Type:')} Consistency Issue`);
|
|
36
|
+
console.log(`${picocolors_1.default.bold('Message:')} ${issue.message}`);
|
|
37
|
+
console.log(`${picocolors_1.default.bold('Location:')} ${picocolors_1.default.dim(issue.location)}`);
|
|
38
|
+
if (issue.suggestion) {
|
|
39
|
+
console.log(`${picocolors_1.default.bold('Suggestion:')} ${picocolors_1.default.green(issue.suggestion)}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const colorFn = getSeverityColor(issue.severity);
|
|
44
|
+
console.log(`\n${picocolors_1.default.bold('Severity:')} ${colorFn(issue.severity)}`);
|
|
45
|
+
console.log(`${picocolors_1.default.bold('Type:')} ${issue.category} Issue`);
|
|
46
|
+
console.log(`${picocolors_1.default.bold('Description:')} ${issue.description}`);
|
|
47
|
+
console.log(`${picocolors_1.default.bold('Location:')} ${picocolors_1.default.dim(issue.location)}`);
|
|
48
|
+
console.log(`${picocolors_1.default.bold('Recommendation:')} ${picocolors_1.default.green(issue.recommendation)}`);
|
|
49
|
+
}
|
|
50
|
+
console.log('');
|
|
51
|
+
}
|
|
52
|
+
// Prompt user for their decision on an issue
|
|
53
|
+
async function promptIssueDecision() {
|
|
54
|
+
const response = await enquirer_1.default.prompt({
|
|
55
|
+
type: 'select',
|
|
56
|
+
name: 'action',
|
|
57
|
+
message: 'What would you like to do?',
|
|
58
|
+
choices: [
|
|
59
|
+
{ name: 'fix', message: 'A) Have AI fix it' },
|
|
60
|
+
{ name: 'ignore', message: 'B) Ignore this issue' },
|
|
61
|
+
{ name: 'custom', message: 'C) Other (provide custom instructions)' }
|
|
62
|
+
]
|
|
63
|
+
});
|
|
64
|
+
if (response.action === 'custom') {
|
|
65
|
+
const customResponse = await enquirer_1.default.prompt({
|
|
66
|
+
type: 'input',
|
|
67
|
+
name: 'notes',
|
|
68
|
+
message: 'Enter custom instructions for the AI:'
|
|
69
|
+
});
|
|
70
|
+
return {
|
|
71
|
+
decision: 'custom',
|
|
72
|
+
customNotes: customResponse.notes.trim() || undefined
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return { decision: response.action };
|
|
76
|
+
}
|
|
77
|
+
// Sort issues by severity (critical/error first)
|
|
78
|
+
function sortIssuesBySeverity(consistencyIssues, chaosIssues) {
|
|
79
|
+
const allIssues = [];
|
|
80
|
+
// Add consistency issues
|
|
81
|
+
consistencyIssues.forEach((issue) => {
|
|
82
|
+
allIssues.push({ issue, type: 'consistency' });
|
|
83
|
+
});
|
|
84
|
+
// Add chaos issues
|
|
85
|
+
chaosIssues.forEach((issue) => {
|
|
86
|
+
allIssues.push({ issue, type: 'chaos' });
|
|
87
|
+
});
|
|
88
|
+
// Sort by severity priority
|
|
89
|
+
const severityOrder = {
|
|
90
|
+
Critical: 1,
|
|
91
|
+
Error: 1,
|
|
92
|
+
Major: 2,
|
|
93
|
+
Warning: 2,
|
|
94
|
+
Minor: 3,
|
|
95
|
+
Info: 3
|
|
96
|
+
};
|
|
97
|
+
allIssues.sort((a, b) => {
|
|
98
|
+
const aSeverity = isConsistencyIssue(a.issue) ? a.issue.severity : a.issue.severity;
|
|
99
|
+
const bSeverity = isConsistencyIssue(b.issue) ? b.issue.severity : b.issue.severity;
|
|
100
|
+
return (severityOrder[aSeverity] || 4) - (severityOrder[bSeverity] || 4);
|
|
101
|
+
});
|
|
102
|
+
return allIssues;
|
|
103
|
+
}
|
|
104
|
+
// Main function: review all issues one by one
|
|
105
|
+
async function reviewIssuesOneByOne(consistencyIssues, chaosIssues) {
|
|
106
|
+
const result = {
|
|
107
|
+
toFix: [],
|
|
108
|
+
ignored: []
|
|
109
|
+
};
|
|
110
|
+
const totalIssues = consistencyIssues.length + chaosIssues.length;
|
|
111
|
+
if (totalIssues === 0) {
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
// Sort issues by severity (critical first)
|
|
115
|
+
const sortedIssues = sortIssuesBySeverity(consistencyIssues, chaosIssues);
|
|
116
|
+
console.log(picocolors_1.default.yellow(`\nReviewing ${totalIssues} issue${totalIssues > 1 ? 's' : ''}...\n`));
|
|
117
|
+
for (let i = 0; i < sortedIssues.length; i++) {
|
|
118
|
+
const { issue, type } = sortedIssues[i];
|
|
119
|
+
// Display issue details
|
|
120
|
+
displayIssueDetails(issue, type, i, sortedIssues.length);
|
|
121
|
+
// Get user decision
|
|
122
|
+
const { decision, customNotes } = await promptIssueDecision();
|
|
123
|
+
const reviewResult = {
|
|
124
|
+
issue,
|
|
125
|
+
issueType: type,
|
|
126
|
+
decision,
|
|
127
|
+
customNotes
|
|
128
|
+
};
|
|
129
|
+
if (decision === 'fix' || decision === 'custom') {
|
|
130
|
+
result.toFix.push(reviewResult);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
result.ignored.push(reviewResult);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Summary
|
|
137
|
+
console.log(picocolors_1.default.cyan('\n' + '═'.repeat(65)));
|
|
138
|
+
console.log(picocolors_1.default.cyan('Review Summary'));
|
|
139
|
+
console.log(picocolors_1.default.cyan('═'.repeat(65)));
|
|
140
|
+
console.log(`${picocolors_1.default.green('To fix:')} ${result.toFix.length} issue${result.toFix.length !== 1 ? 's' : ''}`);
|
|
141
|
+
console.log(`${picocolors_1.default.dim('Ignored:')} ${result.ignored.length} issue${result.ignored.length !== 1 ? 's' : ''}`);
|
|
142
|
+
console.log('');
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
// Convert reviewed issues to the format Remediation expects
|
|
146
|
+
function convertToIssuesWithNotes(reviewed) {
|
|
147
|
+
return reviewed.toFix.map((result) => {
|
|
148
|
+
const issueWithNotes = {
|
|
149
|
+
customNotes: result.customNotes
|
|
150
|
+
};
|
|
151
|
+
if (result.issueType === 'consistency') {
|
|
152
|
+
issueWithNotes.consistencyIssue = result.issue;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
issueWithNotes.chaosIssue = result.issue;
|
|
156
|
+
}
|
|
157
|
+
return issueWithNotes;
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// Filter issues for gap analysis: only show issues that were marked to fix but couldn't be fixed
|
|
161
|
+
function filterIssuesForGapAnalysis(originalConsistencyIssues, originalChaosIssues, reviewed, unfixableIssueDescriptions) {
|
|
162
|
+
// Create sets for quick lookup
|
|
163
|
+
const ignoredIssues = new Set(reviewed.ignored.map(r => isConsistencyIssue(r.issue)
|
|
164
|
+
? `${r.issue.severity}: ${r.issue.message}`
|
|
165
|
+
: `[${r.issue.severity}] ${r.issue.description}`));
|
|
166
|
+
// Helper to normalize strings for comparison
|
|
167
|
+
const normalize = (str) => {
|
|
168
|
+
return str.toLowerCase().trim().replace(/\s+/g, ' ');
|
|
169
|
+
};
|
|
170
|
+
// Helper to check if an issue description is in unfixable list
|
|
171
|
+
const isUnfixable = (issue) => {
|
|
172
|
+
const issueDescription = isConsistencyIssue(issue)
|
|
173
|
+
? issue.message
|
|
174
|
+
: issue.description;
|
|
175
|
+
const normalizedDescription = normalize(issueDescription);
|
|
176
|
+
const normalizedLocation = normalize(issue.location);
|
|
177
|
+
// Check if any unfixable description matches this issue
|
|
178
|
+
return unfixableIssueDescriptions.some(unfixable => {
|
|
179
|
+
const normalizedUnfixable = normalize(unfixable);
|
|
180
|
+
// Match if unfixable string contains significant part of the issue description
|
|
181
|
+
// or vice versa (bidirectional check with minimum 20 char threshold)
|
|
182
|
+
const descriptionMatch = (normalizedUnfixable.length > 20 && normalizedDescription.includes(normalizedUnfixable)) ||
|
|
183
|
+
(normalizedDescription.length > 20 && normalizedUnfixable.includes(normalizedDescription));
|
|
184
|
+
// Also match if unfixable mentions the location (for better precision)
|
|
185
|
+
const locationMatch = normalizedLocation.length > 10 && normalizedUnfixable.includes(normalizedLocation);
|
|
186
|
+
return descriptionMatch || locationMatch;
|
|
187
|
+
});
|
|
188
|
+
};
|
|
189
|
+
// Filter consistency issues
|
|
190
|
+
const filteredConsistency = originalConsistencyIssues.filter(issue => {
|
|
191
|
+
const issueKey = `${issue.severity}: ${issue.message}`;
|
|
192
|
+
// Only include if NOT ignored AND is unfixable
|
|
193
|
+
return !ignoredIssues.has(issueKey) && isUnfixable(issue);
|
|
194
|
+
});
|
|
195
|
+
// Filter chaos issues
|
|
196
|
+
const filteredChaos = originalChaosIssues.filter(issue => {
|
|
197
|
+
const issueKey = `[${issue.severity}] ${issue.description}`;
|
|
198
|
+
// Only include if NOT ignored AND is unfixable
|
|
199
|
+
return !ignoredIssues.has(issueKey) && isUnfixable(issue);
|
|
200
|
+
});
|
|
201
|
+
return {
|
|
202
|
+
consistencyIssues: filteredConsistency,
|
|
203
|
+
chaosIssues: filteredChaos
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=issueReviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issueReviewer.js","sourceRoot":"","sources":["../../src/utils/issueReviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ConsistencyIssue } from '../agents/core/Consistency';
|
|
2
|
+
import { ChaosIssue } from '../agents/core/Chaos';
|
|
3
|
+
export interface UnifiedIssue {
|
|
4
|
+
id: string;
|
|
5
|
+
type: 'consistency' | 'chaos';
|
|
6
|
+
index: number;
|
|
7
|
+
severity: string;
|
|
8
|
+
priority: 'critical' | 'major' | 'minor';
|
|
9
|
+
message: string;
|
|
10
|
+
location: string;
|
|
11
|
+
}
|
|
12
|
+
export interface SeverityGroup {
|
|
13
|
+
name: string;
|
|
14
|
+
label: string;
|
|
15
|
+
priority: number;
|
|
16
|
+
issues: UnifiedIssue[];
|
|
17
|
+
}
|
|
18
|
+
export declare function mapSeverityToPriority(severity: string, type: 'consistency' | 'chaos'): 'critical' | 'major' | 'minor';
|
|
19
|
+
export declare function groupIssuesBySeverity(consistencyIssues: ConsistencyIssue[], chaosIssues: ChaosIssue[]): SeverityGroup[];
|
|
20
|
+
export declare function buildGroupedChoices(groups: SeverityGroup[]): any[];
|
|
21
|
+
export declare function getAllIssueIds(groups: SeverityGroup[]): string[];
|
|
22
|
+
export declare function parseSelections(selected: string[], consistencyIssues: ConsistencyIssue[], chaosIssues: ChaosIssue[]): {
|
|
23
|
+
selectedConsistency: ConsistencyIssue[];
|
|
24
|
+
selectedChaos: ChaosIssue[];
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=issueSelector.d.ts.map
|