gameforge-cli 0.1.0 → 0.2.0
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 +81 -41
- 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 +17 -5
- package/dist/agents/core/Architect.d.ts.map +1 -1
- package/dist/agents/core/Architect.js +263 -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/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 +94 -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 +63 -25
- package/dist/agents/specialists/EntitySpecialist.js.map +1 -1
- package/dist/agents/specialists/FeatureSpecialist.d.ts.map +1 -1
- package/dist/agents/specialists/FeatureSpecialist.js +53 -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 +69 -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 +335 -195
- 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 +252 -0
- package/dist/utils/disambiguationHelper.js.map +1 -0
- package/dist/utils/issueReviewer.d.ts +6 -0
- package/dist/utils/issueReviewer.d.ts.map +1 -0
- package/dist/utils/issueReviewer.js +159 -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/package.json +1 -1
- 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
|
@@ -7,38 +7,95 @@ class CreativeSpecialist extends BaseAgent_1.BaseAgent {
|
|
|
7
7
|
constructor(apiKey, costTracker, modelSelector) {
|
|
8
8
|
const config = {
|
|
9
9
|
systemPrompt: `You are a Creative Direction Specialist.
|
|
10
|
-
Generate
|
|
11
|
-
- Art style
|
|
12
|
-
- Audio
|
|
13
|
-
- Asset
|
|
14
|
-
- Pipeline and workflow
|
|
10
|
+
Generate creative vision documentation including:
|
|
11
|
+
- Art style description and mood
|
|
12
|
+
- Audio direction and tone
|
|
13
|
+
- Asset quantity estimates
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
Focus on the creative vision, not production pipeline details.`
|
|
17
16
|
};
|
|
18
17
|
super(apiKey, config, costTracker, modelSelector);
|
|
19
18
|
}
|
|
20
19
|
async execute(bible, onProgress) {
|
|
21
|
-
|
|
20
|
+
if (!bible.creative) {
|
|
21
|
+
return '# Creative Direction\n\n*No creative specifications provided for this design document.*';
|
|
22
|
+
}
|
|
23
|
+
// Per-category MAXIMUM thresholds - only flag if exceeded (not minimums)
|
|
24
|
+
const scope = bible.meta.estimatedScope;
|
|
25
|
+
const assetMaxThresholds = {
|
|
26
|
+
'Prototype': {
|
|
27
|
+
characters: 4, environments: 2, props: 15, ui: 15,
|
|
28
|
+
sfx: 20, music: 5, animations: 20, cards: 30, vehicles: 3
|
|
29
|
+
},
|
|
30
|
+
'Vertical Slice': {
|
|
31
|
+
characters: 6, environments: 3, props: 30, ui: 20,
|
|
32
|
+
sfx: 40, music: 8, animations: 40, cards: 60, vehicles: 5
|
|
33
|
+
},
|
|
34
|
+
'MVP': {
|
|
35
|
+
characters: 10, environments: 5, props: 60, ui: 35,
|
|
36
|
+
sfx: 60, music: 12, animations: 60, cards: 80, vehicles: 10
|
|
37
|
+
},
|
|
38
|
+
'Full Game': {
|
|
39
|
+
characters: 25, environments: 15, props: 200, ui: 75,
|
|
40
|
+
sfx: 150, music: 30, animations: 200, cards: 200, vehicles: 25
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const thresholds = assetMaxThresholds[scope] || assetMaxThresholds['MVP'];
|
|
44
|
+
const reqs = bible.creative.assetRequirements;
|
|
45
|
+
const overages = [];
|
|
46
|
+
// Check each category against its max threshold
|
|
47
|
+
if (reqs.characters > thresholds.characters) {
|
|
48
|
+
overages.push(`characters (${reqs.characters} > ${thresholds.characters} max)`);
|
|
49
|
+
}
|
|
50
|
+
if (reqs.environments > thresholds.environments) {
|
|
51
|
+
overages.push(`environments (${reqs.environments} > ${thresholds.environments} max)`);
|
|
52
|
+
}
|
|
53
|
+
if (reqs.props > thresholds.props) {
|
|
54
|
+
overages.push(`props (${reqs.props} > ${thresholds.props} max)`);
|
|
55
|
+
}
|
|
56
|
+
if (reqs.ui > thresholds.ui) {
|
|
57
|
+
overages.push(`UI elements (${reqs.ui} > ${thresholds.ui} max)`);
|
|
58
|
+
}
|
|
59
|
+
if (reqs.sfx > thresholds.sfx) {
|
|
60
|
+
overages.push(`SFX (${reqs.sfx} > ${thresholds.sfx} max)`);
|
|
61
|
+
}
|
|
62
|
+
if (reqs.music > thresholds.music) {
|
|
63
|
+
overages.push(`music tracks (${reqs.music} > ${thresholds.music} max)`);
|
|
64
|
+
}
|
|
65
|
+
if (reqs.animations && reqs.animations > thresholds.animations) {
|
|
66
|
+
overages.push(`animations (${reqs.animations} > ${thresholds.animations} max)`);
|
|
67
|
+
}
|
|
68
|
+
if (reqs.cards && reqs.cards > thresholds.cards) {
|
|
69
|
+
overages.push(`cards (${reqs.cards} > ${thresholds.cards} max)`);
|
|
70
|
+
}
|
|
71
|
+
if (reqs.vehicles && reqs.vehicles > thresholds.vehicles) {
|
|
72
|
+
overages.push(`vehicles (${reqs.vehicles} > ${thresholds.vehicles} max)`);
|
|
73
|
+
}
|
|
74
|
+
if (overages.length > 0) {
|
|
75
|
+
await this.askClarification(`The following asset categories exceed typical limits for a "${scope}" scope:\n\n${overages.map(o => `- ${o}`).join('\n')}`, bible, 'Asset Scope');
|
|
76
|
+
}
|
|
77
|
+
const prompt = `Generate creative direction documentation focused on vision and mood:
|
|
22
78
|
|
|
23
|
-
Creative Spec: ${JSON.stringify(bible.creative, null, 2)}
|
|
24
79
|
Game: ${bible.meta.title} (${bible.meta.genre.join(', ')})
|
|
80
|
+
Creative Spec: ${JSON.stringify(bible.creative, null, 2)}
|
|
25
81
|
|
|
26
|
-
Create markdown with these sections:
|
|
82
|
+
Create a markdown document with these sections:
|
|
27
83
|
|
|
28
|
-
#
|
|
84
|
+
# Creative Direction
|
|
29
85
|
|
|
30
|
-
## Art Style
|
|
31
|
-
${bible.creative.artStyle}
|
|
86
|
+
## Art Style & Visual Identity
|
|
87
|
+
Expand on: "${bible.creative.artStyle}"
|
|
88
|
+
Describe the visual mood, color palette suggestions, and aesthetic influences in 2-3 paragraphs. Focus on the feeling and tone, not technical specifications like texture resolutions or polygon counts.
|
|
32
89
|
|
|
33
|
-
## Audio
|
|
34
|
-
${bible.creative.audioMood}
|
|
90
|
+
## Audio Direction
|
|
91
|
+
Expand on: "${bible.creative.audioMood}"
|
|
92
|
+
Describe the music style, sound design approach, and audio atmosphere in 2-3 paragraphs. Focus on the emotional impact and player experience.
|
|
35
93
|
|
|
36
|
-
${bible.creative.referenceLinks && bible.creative.referenceLinks.length > 0 ?
|
|
37
|
-
## References
|
|
94
|
+
${bible.creative.referenceLinks && bible.creative.referenceLinks.length > 0 ? `## Visual & Audio References
|
|
38
95
|
${bible.creative.referenceLinks.map(link => `- ${link}`).join('\n')}
|
|
39
96
|
` : ''}
|
|
40
97
|
|
|
41
|
-
## Asset
|
|
98
|
+
## Estimated Asset Counts
|
|
42
99
|
|
|
43
100
|
| Category | Quantity |
|
|
44
101
|
|----------|----------|
|
|
@@ -48,18 +105,30 @@ ${bible.creative.referenceLinks.map(link => `- ${link}`).join('\n')}
|
|
|
48
105
|
| UI Elements | ${bible.creative.assetRequirements.ui} |
|
|
49
106
|
| Sound Effects | ${bible.creative.assetRequirements.sfx} |
|
|
50
107
|
| Music Tracks | ${bible.creative.assetRequirements.music} |
|
|
108
|
+
${bible.creative.assetRequirements.vehicles !== undefined ? `| Vehicles | ${bible.creative.assetRequirements.vehicles} |` : ''}
|
|
109
|
+
${bible.creative.assetRequirements.cards !== undefined ? `| Cards | ${bible.creative.assetRequirements.cards} |` : ''}
|
|
110
|
+
${bible.creative.assetRequirements.animations !== undefined ? `| Animations | ${bible.creative.assetRequirements.animations} |` : ''}
|
|
51
111
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
112
|
+
${bible.creative.visualNovel ? `## Visual Novel Style
|
|
113
|
+
${bible.creative.visualNovel.artStyle2D ? `Art approach: ${bible.creative.visualNovel.artStyle2D}` : ''}
|
|
114
|
+
Describe the visual novel aesthetic and character presentation style.
|
|
115
|
+
` : ''}
|
|
55
116
|
|
|
56
|
-
|
|
117
|
+
${bible.creative.horror ? `## Horror Atmosphere
|
|
118
|
+
${bible.creative.horror.atmosphere ? `Mood: ${bible.creative.horror.atmosphere}` : ''}
|
|
119
|
+
${bible.creative.horror.lighting ? `Lighting approach: ${bible.creative.horror.lighting}` : ''}
|
|
120
|
+
Describe how the visual and audio design creates tension and fear.
|
|
121
|
+
` : ''}
|
|
57
122
|
|
|
58
|
-
|
|
123
|
+
IMPORTANT: Focus on the creative VISION and MOOD. Do NOT include:
|
|
124
|
+
- Production pipeline or workflow details
|
|
125
|
+
- Tool lists or software requirements
|
|
126
|
+
- Technical specifications (texture sizes, poly counts, etc.)
|
|
127
|
+
- File naming conventions or directory structures
|
|
59
128
|
|
|
60
|
-
|
|
61
|
-
const result = await this.callLLMWithAutoRetry(prompt, modelSelector_1.TaskComplexity.
|
|
62
|
-
initialMaxTokens:
|
|
129
|
+
Keep the document concise (2-3 pages max) and focused on inspiring the creative team.`;
|
|
130
|
+
const result = await this.callLLMWithAutoRetry(prompt, modelSelector_1.TaskComplexity.SIMPLE, {
|
|
131
|
+
initialMaxTokens: 6000,
|
|
63
132
|
maxRetries: 2,
|
|
64
133
|
onProgress: onProgress
|
|
65
134
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreativeSpecialist.js","sourceRoot":"","sources":["../../../src/agents/specialists/CreativeSpecialist.ts"],"names":[],"mappings":";;;AAAA,iDAA2D;AAC3D,6DAA2D;AAG3D,MAAa,kBAAmB,SAAQ,qBAAS;IAC/C,YAAY,MAAc,EAAE,WAAgB,EAAE,aAAkB;QAC9D,MAAM,MAAM,GAAgB;YAC1B,YAAY,EAAE
|
|
1
|
+
{"version":3,"file":"CreativeSpecialist.js","sourceRoot":"","sources":["../../../src/agents/specialists/CreativeSpecialist.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntitySpecialist.d.ts","sourceRoot":"","sources":["../../../src/agents/specialists/EntitySpecialist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAU,MAAM,qBAAqB,CAAC;AAExD,qBAAa,gBAAiB,SAAQ,SAAS;gBACjC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG;
|
|
1
|
+
{"version":3,"file":"EntitySpecialist.d.ts","sourceRoot":"","sources":["../../../src/agents/specialists/EntitySpecialist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAU,MAAM,qBAAqB,CAAC;AAExD,qBAAa,gBAAiB,SAAQ,SAAS;gBACjC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG;IAa1D,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;YA8D1E,iBAAiB;CA4ChC"}
|
|
@@ -7,20 +7,51 @@ class EntitySpecialist extends BaseAgent_1.BaseAgent {
|
|
|
7
7
|
constructor(apiKey, costTracker, modelSelector) {
|
|
8
8
|
const config = {
|
|
9
9
|
systemPrompt: `You are an Entity Design Specialist.
|
|
10
|
-
Generate
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
- Balance formulas
|
|
10
|
+
Generate concise game entity descriptions including:
|
|
11
|
+
- What the entity is and its role in the game
|
|
12
|
+
- Key characteristics and behaviors
|
|
13
|
+
- Brief narrative context if relevant
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
Keep descriptions brief and design-focused. Avoid technical implementation details.`
|
|
17
16
|
};
|
|
18
17
|
super(apiKey, config, costTracker, modelSelector);
|
|
19
18
|
}
|
|
20
19
|
async execute(bible, onProgress) {
|
|
21
|
-
const sections = ['#
|
|
22
|
-
//
|
|
23
|
-
const
|
|
20
|
+
const sections = ['# Game Objects & Entities\n'];
|
|
21
|
+
// Per-category MAXIMUM thresholds - only flag if exceeded (not minimums)
|
|
22
|
+
const scope = bible.meta.estimatedScope;
|
|
23
|
+
const entityMaxThresholds = {
|
|
24
|
+
'Prototype': {
|
|
25
|
+
NPC: 5, Monster: 5, Item: 8, Ability: 8, Interactable: 5, Card: 20, Vehicle: 3, Building: 5
|
|
26
|
+
},
|
|
27
|
+
'Vertical Slice': {
|
|
28
|
+
NPC: 8, Monster: 8, Item: 15, Ability: 12, Interactable: 8, Card: 40, Vehicle: 5, Building: 8
|
|
29
|
+
},
|
|
30
|
+
'MVP': {
|
|
31
|
+
NPC: 15, Monster: 15, Item: 30, Ability: 20, Interactable: 15, Card: 60, Vehicle: 10, Building: 15
|
|
32
|
+
},
|
|
33
|
+
'Full Game': {
|
|
34
|
+
NPC: 40, Monster: 40, Item: 80, Ability: 50, Interactable: 40, Card: 150, Vehicle: 25, Building: 40
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const thresholds = entityMaxThresholds[scope] || entityMaxThresholds['MVP'];
|
|
38
|
+
// Count entities by category
|
|
39
|
+
const categoryCounts = {};
|
|
40
|
+
bible.gameObjects.forEach(entity => {
|
|
41
|
+
categoryCounts[entity.category] = (categoryCounts[entity.category] || 0) + 1;
|
|
42
|
+
});
|
|
43
|
+
// Check each category against its max threshold
|
|
44
|
+
const overages = [];
|
|
45
|
+
for (const [category, count] of Object.entries(categoryCounts)) {
|
|
46
|
+
const maxAllowed = thresholds[category];
|
|
47
|
+
if (maxAllowed && count > maxAllowed) {
|
|
48
|
+
overages.push(`${category}s (${count} > ${maxAllowed} max)`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (overages.length > 0) {
|
|
52
|
+
await this.askClarification(`The following entity categories exceed typical limits for a "${scope}" scope:\n\n${overages.map(o => `- ${o}`).join('\n')}`, bible, 'Entity Count');
|
|
53
|
+
}
|
|
54
|
+
const categories = ['NPC', 'Monster', 'Item', 'Interactable', 'Vehicle', 'Card', 'Building', 'Ability'];
|
|
24
55
|
for (const category of categories) {
|
|
25
56
|
const entities = bible.gameObjects.filter(e => e.category === category);
|
|
26
57
|
if (entities.length > 0) {
|
|
@@ -35,35 +66,42 @@ Be specific and create production-ready documentation.`
|
|
|
35
66
|
return sections.join('\n\n');
|
|
36
67
|
}
|
|
37
68
|
async generateEntityDoc(entity, bible, onProgress) {
|
|
38
|
-
const
|
|
69
|
+
const genre = bible.meta.genre.join(', ');
|
|
70
|
+
const prompt = `Generate a brief, design-focused description for this game entity:
|
|
39
71
|
|
|
40
72
|
Entity: ${JSON.stringify(entity, null, 2)}
|
|
41
|
-
Game
|
|
73
|
+
Game: ${bible.meta.title}
|
|
74
|
+
Genre: ${genre}
|
|
42
75
|
|
|
43
|
-
Create markdown
|
|
76
|
+
Create a concise markdown entry:
|
|
44
77
|
|
|
45
78
|
### ${entity.name}
|
|
46
|
-
**ID**: ${entity.id}
|
|
47
|
-
**Category**: ${entity.category}
|
|
48
79
|
|
|
49
|
-
|
|
80
|
+
Write 2-3 sentences describing what this entity is and its role in the game.
|
|
81
|
+
|
|
82
|
+
${entity.narrative?.backstory ? `**Background**: Brief narrative context based on: "${entity.narrative.backstory}"` : ''}
|
|
50
83
|
|
|
51
|
-
|
|
84
|
+
${entity.stats ? `**Key Characteristics**:
|
|
52
85
|
${Object.entries(entity.stats.attributes).map(([key, val]) => `- ${key}: ${val}`).join('\n')}
|
|
86
|
+
` : ''}
|
|
53
87
|
|
|
54
|
-
|
|
55
|
-
${entity.stats.behaviors.map(b => `- ${b}`).join('\n')}
|
|
88
|
+
${entity.stats?.behaviors && entity.stats.behaviors.length > 0 ? `**Behaviors**: ${entity.stats.behaviors.join(', ')}` : ''}
|
|
56
89
|
|
|
57
|
-
${entity.
|
|
58
|
-
|
|
59
|
-
${entity.
|
|
60
|
-
` : ''}
|
|
90
|
+
${entity.cardGame ? `**Card Info**: ${entity.cardGame.cardType || 'Card'}${entity.cardGame.effects && entity.cardGame.effects.length > 0 ? ` - ${entity.cardGame.effects.join(', ')}` : ''}` : ''}
|
|
91
|
+
|
|
92
|
+
${entity.combat ? `**Combat Role**: Describe briefly how this entity participates in combat.` : ''}
|
|
61
93
|
|
|
62
|
-
${entity.
|
|
94
|
+
${entity.social?.questGiver ? `**Quest Giver**: This character offers quests to the player.` : ''}
|
|
63
95
|
|
|
64
|
-
|
|
96
|
+
IMPORTANT - Keep it SHORT and DESIGN-FOCUSED:
|
|
97
|
+
- 1 short paragraph describing the entity
|
|
98
|
+
- Simple list of key characteristics (no RPG stat blocks unless this IS an RPG)
|
|
99
|
+
- NO balance formulas or math
|
|
100
|
+
- NO AI implementation details (behavior trees, detection radius, etc.)
|
|
101
|
+
- NO code references or feature IDs
|
|
102
|
+
- Focus on what this entity MEANS to the player experience`;
|
|
65
103
|
const result = await this.callLLMWithAutoRetry(prompt, modelSelector_1.TaskComplexity.SIMPLE, {
|
|
66
|
-
initialMaxTokens:
|
|
104
|
+
initialMaxTokens: 2000,
|
|
67
105
|
maxRetries: 2,
|
|
68
106
|
onProgress: (msg) => onProgress?.(`${entity.name}: ${msg}`)
|
|
69
107
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntitySpecialist.js","sourceRoot":"","sources":["../../../src/agents/specialists/EntitySpecialist.ts"],"names":[],"mappings":";;;AAAA,iDAA2D;AAC3D,6DAA2D;AAG3D,MAAa,gBAAiB,SAAQ,qBAAS;IAC7C,YAAY,MAAc,EAAE,WAAgB,EAAE,aAAkB;QAC9D,MAAM,MAAM,GAAgB;YAC1B,YAAY,EAAE
|
|
1
|
+
{"version":3,"file":"EntitySpecialist.js","sourceRoot":"","sources":["../../../src/agents/specialists/EntitySpecialist.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureSpecialist.d.ts","sourceRoot":"","sources":["../../../src/agents/specialists/FeatureSpecialist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAW,MAAM,qBAAqB,CAAC;AAEzD,qBAAa,iBAAkB,SAAQ,SAAS;gBAClC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG;
|
|
1
|
+
{"version":3,"file":"FeatureSpecialist.d.ts","sourceRoot":"","sources":["../../../src/agents/specialists/FeatureSpecialist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAW,MAAM,qBAAqB,CAAC;AAEzD,qBAAa,iBAAkB,SAAQ,SAAS;gBAClC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG;IAa1D,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;YA0B1E,kBAAkB;CA8DjC"}
|
|
@@ -7,18 +7,23 @@ class FeatureSpecialist extends BaseAgent_1.BaseAgent {
|
|
|
7
7
|
constructor(apiKey, costTracker, modelSelector) {
|
|
8
8
|
const config = {
|
|
9
9
|
systemPrompt: `You are a Feature Design Specialist.
|
|
10
|
-
Generate
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
- Data structure pseudo-code
|
|
10
|
+
Generate clear feature descriptions including:
|
|
11
|
+
- What the feature does and why it exists
|
|
12
|
+
- How players interact with it (gameplay loop)
|
|
13
|
+
- UI/UX considerations
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
Focus on player experience, not technical implementation.`
|
|
17
16
|
};
|
|
18
17
|
super(apiKey, config, costTracker, modelSelector);
|
|
19
18
|
}
|
|
20
19
|
async execute(bible, onProgress) {
|
|
21
|
-
const sections = ['#
|
|
20
|
+
const sections = ['# Systems & Features\n'];
|
|
21
|
+
// Check for very high complexity features that need clarification
|
|
22
|
+
const veryHighComplexityFeatures = bible.features.filter(f => f.technical.estimatedComplexity === 'Very High');
|
|
23
|
+
if (veryHighComplexityFeatures.length > 0) {
|
|
24
|
+
const feature = veryHighComplexityFeatures[0];
|
|
25
|
+
await this.askClarification(`The feature "${feature.name}" is marked as "Very High" complexity.`, bible, 'Feature Complexity');
|
|
26
|
+
}
|
|
22
27
|
for (const feature of bible.features) {
|
|
23
28
|
onProgress?.(`Processing feature ${feature.name}...`);
|
|
24
29
|
const markdown = await this.generateFeatureDoc(feature, bible, onProgress);
|
|
@@ -27,52 +32,61 @@ Be specific and technical. Use industry-standard notation.`
|
|
|
27
32
|
return sections.join('\n\n---\n\n');
|
|
28
33
|
}
|
|
29
34
|
async generateFeatureDoc(feature, bible, onProgress) {
|
|
30
|
-
const prompt = `Generate
|
|
35
|
+
const prompt = `Generate a clear, player-focused description for this game feature:
|
|
31
36
|
|
|
32
37
|
Feature: ${JSON.stringify(feature, null, 2)}
|
|
33
|
-
Game
|
|
38
|
+
Game: ${bible.meta.title} (${bible.meta.genre.join(', ')})
|
|
34
39
|
|
|
35
|
-
Create markdown documentation
|
|
40
|
+
Create markdown documentation:
|
|
36
41
|
|
|
37
42
|
## ${feature.name}
|
|
38
|
-
**Epic**: ${feature.agile.epic}
|
|
39
|
-
|
|
40
|
-
### Intent
|
|
41
|
-
${feature.intent}
|
|
42
43
|
|
|
43
|
-
###
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
${feature.gameplayLoop.map((step, i) => ` participant Step${i} as ${step}`).join('\n')}
|
|
47
|
-
\`\`\`
|
|
44
|
+
### Purpose
|
|
45
|
+
Explain in 2-3 sentences why this feature exists and what it adds to the player experience.
|
|
46
|
+
Base this on: "${feature.intent}"
|
|
48
47
|
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
${feature.gameplayLoop && feature.gameplayLoop.length > 0 ? `### How It Works
|
|
49
|
+
Describe the gameplay loop in plain language as a numbered list:
|
|
50
|
+
${feature.gameplayLoop.map((step, i) => `${i + 1}. ${step}`).join('\n')}
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
\`\`\`cpp
|
|
55
|
-
${feature.technical.dataStructure}
|
|
56
|
-
\`\`\`
|
|
52
|
+
Expand each step with 1-2 sentences explaining the player's actions and the game's response.
|
|
53
|
+
` : ''}
|
|
57
54
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
`).join('\n') || 'None'}
|
|
55
|
+
${feature.uiRequirements && feature.uiRequirements.length > 0 ? `### User Interface
|
|
56
|
+
What UI elements does this feature need?
|
|
57
|
+
${feature.uiRequirements.map(ui => `- ${ui}`).join('\n')}
|
|
58
|
+
` : ''}
|
|
63
59
|
|
|
64
|
-
|
|
60
|
+
${feature.multiplayer ? `### Multiplayer
|
|
61
|
+
- Supports ${feature.multiplayer.playerCount} players
|
|
62
|
+
${feature.multiplayer.networkModel ? `- Uses ${feature.multiplayer.networkModel} architecture` : ''}
|
|
63
|
+
Briefly describe how multiple players interact with this feature.
|
|
64
|
+
` : ''}
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
${feature.economy ? `### Economy Impact
|
|
67
|
+
${feature.economy.currencies ? `Currencies involved: ${feature.economy.currencies.join(', ')}` : ''}
|
|
68
|
+
Describe how this feature affects the game's economy.
|
|
69
|
+
` : ''}
|
|
67
70
|
|
|
68
|
-
|
|
69
|
-
|
|
71
|
+
${feature.progression ? `### Progression
|
|
72
|
+
Describe how players unlock or advance through this feature.
|
|
73
|
+
${feature.progression.unlockConditions ? `Unlock requirements: ${feature.progression.unlockConditions.join(', ')}` : ''}
|
|
74
|
+
` : ''}
|
|
70
75
|
|
|
71
|
-
${feature.
|
|
76
|
+
${feature.narrative ? `### Story Integration
|
|
77
|
+
How does this feature connect to the game's narrative?
|
|
78
|
+
${feature.narrative.storyBeats && feature.narrative.storyBeats.length > 0 ? `Key story moments: ${feature.narrative.storyBeats.join(', ')}` : ''}
|
|
79
|
+
` : ''}
|
|
72
80
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
81
|
+
IMPORTANT - This is a DESIGN document, not an engineering spec:
|
|
82
|
+
- NO code or pseudo-code
|
|
83
|
+
- NO data structures
|
|
84
|
+
- NO math formulas with variable types
|
|
85
|
+
- NO file paths or complexity ratings
|
|
86
|
+
- Focus on WHAT the player experiences, not HOW it's implemented
|
|
87
|
+
- Keep it concise (half a page per feature max)`;
|
|
88
|
+
const result = await this.callLLMWithAutoRetry(prompt, modelSelector_1.TaskComplexity.SIMPLE, {
|
|
89
|
+
initialMaxTokens: 4000,
|
|
76
90
|
maxRetries: 2,
|
|
77
91
|
onProgress: (msg) => onProgress?.(`${feature.name}: ${msg}`)
|
|
78
92
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureSpecialist.js","sourceRoot":"","sources":["../../../src/agents/specialists/FeatureSpecialist.ts"],"names":[],"mappings":";;;AAAA,iDAA2D;AAC3D,6DAA2D;AAG3D,MAAa,iBAAkB,SAAQ,qBAAS;IAC9C,YAAY,MAAc,EAAE,WAAgB,EAAE,aAAkB;QAC9D,MAAM,MAAM,GAAgB;YAC1B,YAAY,EAAE
|
|
1
|
+
{"version":3,"file":"FeatureSpecialist.js","sourceRoot":"","sources":["../../../src/agents/specialists/FeatureSpecialist.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TechSpecialist.d.ts","sourceRoot":"","sources":["../../../src/agents/specialists/TechSpecialist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,qBAAa,cAAe,SAAQ,SAAS;gBAC/B,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG;
|
|
1
|
+
{"version":3,"file":"TechSpecialist.d.ts","sourceRoot":"","sources":["../../../src/agents/specialists/TechSpecialist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,qBAAa,cAAe,SAAQ,SAAS;gBAC/B,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG;IAc1D,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;CAqFzF"}
|
|
@@ -6,52 +6,89 @@ const modelSelector_1 = require("../../utils/modelSelector");
|
|
|
6
6
|
class TechSpecialist extends BaseAgent_1.BaseAgent {
|
|
7
7
|
constructor(apiKey, costTracker, modelSelector) {
|
|
8
8
|
const config = {
|
|
9
|
-
systemPrompt: `You are a Technical
|
|
10
|
-
Generate
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
Be precise and actionable.`
|
|
9
|
+
systemPrompt: `You are a Technical Overview Specialist.
|
|
10
|
+
Generate a high-level technical summary for stakeholders including:
|
|
11
|
+
- Recommended game engine and why
|
|
12
|
+
- Target platforms
|
|
13
|
+
- Multiplayer approach (if applicable)
|
|
14
|
+
- Accessibility features
|
|
15
|
+
|
|
16
|
+
Keep it brief and non-technical. This is a design document, not an engineering spec.`
|
|
18
17
|
};
|
|
19
18
|
super(apiKey, config, costTracker, modelSelector);
|
|
20
19
|
}
|
|
21
20
|
async execute(bible, onProgress) {
|
|
22
|
-
|
|
21
|
+
if (!bible.technical) {
|
|
22
|
+
return '# Technical Overview\n\n*No technical specifications provided for this design document.*';
|
|
23
|
+
}
|
|
24
|
+
// Check if targeting too many platforms for the scope
|
|
25
|
+
const platformCount = bible.technical.buildTargets.length;
|
|
26
|
+
const scope = bible.meta.estimatedScope;
|
|
27
|
+
if (platformCount > 2 && (scope === 'Prototype' || scope === 'Vertical Slice')) {
|
|
28
|
+
const result = await this.askClarification(`You're targeting ${platformCount} platforms (${bible.technical.buildTargets.join(', ')}) for a "${scope}" scope.`, bible, 'Platform Scope');
|
|
29
|
+
const decision = (result.answer || '').toLowerCase();
|
|
30
|
+
const currentTargets = bible.technical.buildTargets;
|
|
31
|
+
if (decision.includes('focus on primary') || decision.includes('primary platform')) {
|
|
32
|
+
if (currentTargets.length > 0) {
|
|
33
|
+
bible.technical.buildTargets = [currentTargets[0]];
|
|
34
|
+
onProgress?.(`Technical scope updated: focusing on primary platform "${currentTargets[0]}".`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else if (decision.includes('start with fewer') || decision.includes('fewer platform')) {
|
|
38
|
+
if (currentTargets.length > 1) {
|
|
39
|
+
const reducedTargets = currentTargets.slice(0, 2);
|
|
40
|
+
bible.technical.buildTargets = reducedTargets;
|
|
41
|
+
onProgress?.(`Technical scope updated: starting with fewer platforms (${reducedTargets.join(', ')}).`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
onProgress?.('Technical scope: keeping all configured platforms.');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const prompt = `Generate a brief technical overview for stakeholders (not developers):
|
|
23
49
|
|
|
24
|
-
Technical Spec: ${JSON.stringify(bible.technical, null, 2)}
|
|
25
50
|
Game: ${bible.meta.title}
|
|
51
|
+
Technical Info: ${JSON.stringify(bible.technical, null, 2)}
|
|
26
52
|
|
|
27
|
-
Create markdown with these sections:
|
|
53
|
+
Create a concise markdown document with these sections:
|
|
28
54
|
|
|
29
|
-
#
|
|
55
|
+
# Technical Overview
|
|
30
56
|
|
|
31
|
-
## Engine
|
|
32
|
-
|
|
33
|
-
${bible.technical.engine.
|
|
34
|
-
${bible.technical.engine.reasoning ? `**Reasoning**: ${bible.technical.engine.reasoning}` : ''}
|
|
57
|
+
## Game Engine
|
|
58
|
+
Describe the chosen engine (${bible.technical.engine.primary}${bible.technical.engine.version ? ` ${bible.technical.engine.version}` : ''}) and briefly explain why it's a good fit for this project.
|
|
59
|
+
${bible.technical.engine.reasoning ? `Use this reasoning: ${bible.technical.engine.reasoning}` : ''}
|
|
35
60
|
|
|
36
|
-
##
|
|
37
|
-
|
|
61
|
+
## Target Platforms
|
|
62
|
+
List the platforms: ${bible.technical.buildTargets.join(', ')}
|
|
63
|
+
Briefly mention any platform-specific considerations.
|
|
38
64
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
${bible.technical.
|
|
42
|
-
|
|
65
|
+
${bible.technical.networking ? `## Multiplayer
|
|
66
|
+
${bible.technical.networking.architecture ? `Architecture: ${bible.technical.networking.architecture}` : ''}
|
|
67
|
+
${bible.technical.networking.maxPlayers ? `Supports up to ${bible.technical.networking.maxPlayers} players.` : ''}
|
|
68
|
+
Describe the multiplayer approach in 2-3 sentences.
|
|
69
|
+
` : ''}
|
|
43
70
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
${bible.technical.
|
|
47
|
-
|
|
71
|
+
${bible.technical.localization ? `## Localization
|
|
72
|
+
Strategy: ${bible.technical.localization.strategy}
|
|
73
|
+
${bible.technical.localization.languages ? `Languages: ${bible.technical.localization.languages.join(', ')}` : ''}
|
|
74
|
+
` : ''}
|
|
48
75
|
|
|
49
|
-
|
|
50
|
-
|
|
76
|
+
${bible.technical.accessibility ? `## Accessibility Features
|
|
77
|
+
List the planned accessibility features:
|
|
78
|
+
${bible.technical.accessibility.colorblindMode ? '- Colorblind mode support' : ''}
|
|
79
|
+
${bible.technical.accessibility.subtitles ? '- Subtitles for audio' : ''}
|
|
80
|
+
${bible.technical.accessibility.remappableControls ? '- Remappable controls' : ''}
|
|
81
|
+
${bible.technical.accessibility.difficultyOptions ? '- Adjustable difficulty options' : ''}
|
|
82
|
+
` : ''}
|
|
51
83
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
84
|
+
IMPORTANT: Keep this document SHORT (1-2 pages max). This is for stakeholders to understand the technical direction, not a developer specification. Do NOT include:
|
|
85
|
+
- Code or pseudo-code
|
|
86
|
+
- Directory structures
|
|
87
|
+
- Tool lists
|
|
88
|
+
- Performance metrics
|
|
89
|
+
- Implementation details`;
|
|
90
|
+
const result = await this.callLLMWithAutoRetry(prompt, modelSelector_1.TaskComplexity.SIMPLE, {
|
|
91
|
+
initialMaxTokens: 4000,
|
|
55
92
|
maxRetries: 2,
|
|
56
93
|
onProgress: onProgress
|
|
57
94
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TechSpecialist.js","sourceRoot":"","sources":["../../../src/agents/specialists/TechSpecialist.ts"],"names":[],"mappings":";;;AAAA,iDAA2D;AAC3D,6DAA2D;AAG3D,MAAa,cAAe,SAAQ,qBAAS;IAC3C,YAAY,MAAc,EAAE,WAAgB,EAAE,aAAkB;QAC9D,MAAM,MAAM,GAAgB;YAC1B,YAAY,EAAE
|
|
1
|
+
{"version":3,"file":"TechSpecialist.js","sourceRoot":"","sources":["../../../src/agents/specialists/TechSpecialist.ts"],"names":[],"mappings":"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"}
|