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 @@
|
|
|
1
|
+
{"version":3,"file":"issueSelector.d.ts","sourceRoot":"","sources":["../../src/utils/issueSelector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAGD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,aAAa,GAAG,OAAO,GAC5B,UAAU,GAAG,OAAO,GAAG,OAAO,CAwBhC;AAGD,wBAAgB,qBAAqB,CACnC,iBAAiB,EAAE,gBAAgB,EAAE,EACrC,WAAW,EAAE,UAAU,EAAE,GACxB,aAAa,EAAE,CAuCjB;AAyBD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,GAAG,EAAE,CAUlE;AAGD,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE,CAEhE;AAGD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAAE,EAClB,iBAAiB,EAAE,gBAAgB,EAAE,EACrC,WAAW,EAAE,UAAU,EAAE,GACxB;IAAE,mBAAmB,EAAE,gBAAgB,EAAE,CAAC;IAAC,aAAa,EAAE,UAAU,EAAE,CAAA;CAAE,CAmB1E"}
|
|
@@ -0,0 +1,132 @@
|
|
|
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.mapSeverityToPriority = mapSeverityToPriority;
|
|
7
|
+
exports.groupIssuesBySeverity = groupIssuesBySeverity;
|
|
8
|
+
exports.buildGroupedChoices = buildGroupedChoices;
|
|
9
|
+
exports.getAllIssueIds = getAllIssueIds;
|
|
10
|
+
exports.parseSelections = parseSelections;
|
|
11
|
+
const picocolors_1 = __importDefault(require("picocolors"));
|
|
12
|
+
// Map severity strings to unified priority levels
|
|
13
|
+
function mapSeverityToPriority(severity, type) {
|
|
14
|
+
if (type === 'consistency') {
|
|
15
|
+
switch (severity) {
|
|
16
|
+
case 'Error':
|
|
17
|
+
return 'critical';
|
|
18
|
+
case 'Warning':
|
|
19
|
+
return 'major';
|
|
20
|
+
case 'Info':
|
|
21
|
+
return 'minor';
|
|
22
|
+
default:
|
|
23
|
+
return 'minor';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
switch (severity) {
|
|
28
|
+
case 'Critical':
|
|
29
|
+
return 'critical';
|
|
30
|
+
case 'Major':
|
|
31
|
+
return 'major';
|
|
32
|
+
case 'Minor':
|
|
33
|
+
return 'minor';
|
|
34
|
+
default:
|
|
35
|
+
return 'minor';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Group issues by severity for display
|
|
40
|
+
function groupIssuesBySeverity(consistencyIssues, chaosIssues) {
|
|
41
|
+
const groups = new Map([
|
|
42
|
+
['critical', { name: 'critical', label: 'Critical/Error', priority: 1, issues: [] }],
|
|
43
|
+
['major', { name: 'major', label: 'Major/Warning', priority: 2, issues: [] }],
|
|
44
|
+
['minor', { name: 'minor', label: 'Minor/Info', priority: 3, issues: [] }]
|
|
45
|
+
]);
|
|
46
|
+
// Add consistency issues
|
|
47
|
+
consistencyIssues.forEach((issue, index) => {
|
|
48
|
+
const priority = mapSeverityToPriority(issue.severity, 'consistency');
|
|
49
|
+
groups.get(priority).issues.push({
|
|
50
|
+
id: `consistency-${index}`,
|
|
51
|
+
type: 'consistency',
|
|
52
|
+
index,
|
|
53
|
+
severity: issue.severity,
|
|
54
|
+
priority,
|
|
55
|
+
message: issue.message,
|
|
56
|
+
location: issue.location
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
// Add chaos issues
|
|
60
|
+
chaosIssues.forEach((issue, index) => {
|
|
61
|
+
const priority = mapSeverityToPriority(issue.severity, 'chaos');
|
|
62
|
+
groups.get(priority).issues.push({
|
|
63
|
+
id: `chaos-${index}`,
|
|
64
|
+
type: 'chaos',
|
|
65
|
+
index,
|
|
66
|
+
severity: issue.severity,
|
|
67
|
+
priority,
|
|
68
|
+
message: issue.description,
|
|
69
|
+
location: issue.location
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
// Return sorted groups (critical first), filter empty
|
|
73
|
+
return Array.from(groups.values())
|
|
74
|
+
.filter((g) => g.issues.length > 0)
|
|
75
|
+
.sort((a, b) => a.priority - b.priority);
|
|
76
|
+
}
|
|
77
|
+
// Get color function based on priority
|
|
78
|
+
function getSeverityColor(priority) {
|
|
79
|
+
switch (priority) {
|
|
80
|
+
case 'critical':
|
|
81
|
+
return picocolors_1.default.red;
|
|
82
|
+
case 'major':
|
|
83
|
+
return picocolors_1.default.yellow;
|
|
84
|
+
case 'minor':
|
|
85
|
+
return picocolors_1.default.dim;
|
|
86
|
+
default:
|
|
87
|
+
return (s) => s;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Format a single issue for display
|
|
91
|
+
function formatIssueMessage(issue) {
|
|
92
|
+
const colorFn = getSeverityColor(issue.priority);
|
|
93
|
+
const truncatedMessage = issue.message.length > 70 ? issue.message.substring(0, 67) + '...' : issue.message;
|
|
94
|
+
return `${colorFn(`[${issue.severity}]`)} ${truncatedMessage}`;
|
|
95
|
+
}
|
|
96
|
+
// Build enquirer choice structure with groups
|
|
97
|
+
function buildGroupedChoices(groups) {
|
|
98
|
+
return groups.map((group) => ({
|
|
99
|
+
name: group.name,
|
|
100
|
+
message: picocolors_1.default.bold(`${group.label} (${group.issues.length})`),
|
|
101
|
+
choices: group.issues.map((issue) => ({
|
|
102
|
+
name: issue.id,
|
|
103
|
+
message: formatIssueMessage(issue),
|
|
104
|
+
hint: picocolors_1.default.dim(issue.location)
|
|
105
|
+
}))
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
// Get all issue IDs for initial selection
|
|
109
|
+
function getAllIssueIds(groups) {
|
|
110
|
+
return groups.flatMap((g) => g.issues.map((i) => i.id));
|
|
111
|
+
}
|
|
112
|
+
// Parse selected IDs back to original issue arrays
|
|
113
|
+
function parseSelections(selected, consistencyIssues, chaosIssues) {
|
|
114
|
+
const selectedConsistency = [];
|
|
115
|
+
const selectedChaos = [];
|
|
116
|
+
for (const id of selected) {
|
|
117
|
+
if (id.startsWith('consistency-')) {
|
|
118
|
+
const index = parseInt(id.replace('consistency-', ''), 10);
|
|
119
|
+
if (index >= 0 && index < consistencyIssues.length) {
|
|
120
|
+
selectedConsistency.push(consistencyIssues[index]);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else if (id.startsWith('chaos-')) {
|
|
124
|
+
const index = parseInt(id.replace('chaos-', ''), 10);
|
|
125
|
+
if (index >= 0 && index < chaosIssues.length) {
|
|
126
|
+
selectedChaos.push(chaosIssues[index]);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return { selectedConsistency, selectedChaos };
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=issueSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issueSelector.js","sourceRoot":"","sources":["../../src/utils/issueSelector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface PDFGeneratorOptions {
|
|
2
|
+
title?: string;
|
|
3
|
+
margins?: {
|
|
4
|
+
top: number;
|
|
5
|
+
bottom: number;
|
|
6
|
+
left: number;
|
|
7
|
+
right: number;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export declare function generatePDF(markdownPath: string, outputPath: string, options?: PDFGeneratorOptions): Promise<void>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=pdfGenerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdfGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/pdfGenerator.ts"],"names":[],"mappings":"AAIA,UAAU,mBAAmB;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACxE;AAwBD,wBAAsB,WAAW,CAC/B,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAyCf"}
|
|
@@ -0,0 +1,341 @@
|
|
|
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.generatePDF = generatePDF;
|
|
7
|
+
const pdfkit_1 = __importDefault(require("pdfkit"));
|
|
8
|
+
const marked_1 = require("marked");
|
|
9
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
|
+
const COLORS = {
|
|
11
|
+
h1: '#2c3e50',
|
|
12
|
+
h2: '#34495e',
|
|
13
|
+
h3: '#7f8c8d',
|
|
14
|
+
text: '#333333',
|
|
15
|
+
code: '#c0392b',
|
|
16
|
+
codeBg: '#f4f4f4',
|
|
17
|
+
link: '#3498db',
|
|
18
|
+
tableBorder: '#dddddd',
|
|
19
|
+
tableHeader: '#3498db',
|
|
20
|
+
tableHeaderText: '#ffffff',
|
|
21
|
+
hr: '#eeeeee',
|
|
22
|
+
};
|
|
23
|
+
const FONTS = {
|
|
24
|
+
regular: 'Helvetica',
|
|
25
|
+
bold: 'Helvetica-Bold',
|
|
26
|
+
italic: 'Helvetica-Oblique',
|
|
27
|
+
boldItalic: 'Helvetica-BoldOblique',
|
|
28
|
+
mono: 'Courier',
|
|
29
|
+
};
|
|
30
|
+
async function generatePDF(markdownPath, outputPath, options = {}) {
|
|
31
|
+
const markdown = await fs_extra_1.default.readFile(markdownPath, 'utf-8');
|
|
32
|
+
const tokens = marked_1.marked.lexer(markdown);
|
|
33
|
+
const margins = options.margins || { top: 50, bottom: 50, left: 50, right: 50 };
|
|
34
|
+
const doc = new pdfkit_1.default({
|
|
35
|
+
size: 'A4',
|
|
36
|
+
margins,
|
|
37
|
+
bufferPages: true,
|
|
38
|
+
});
|
|
39
|
+
const writeStream = fs_extra_1.default.createWriteStream(outputPath);
|
|
40
|
+
doc.pipe(writeStream);
|
|
41
|
+
const pageWidth = doc.page.width - margins.left - margins.right;
|
|
42
|
+
// Process tokens
|
|
43
|
+
for (const token of tokens) {
|
|
44
|
+
renderToken(doc, token, pageWidth, margins);
|
|
45
|
+
}
|
|
46
|
+
// Add page numbers
|
|
47
|
+
const pageCount = doc.bufferedPageRange().count;
|
|
48
|
+
for (let i = 0; i < pageCount; i++) {
|
|
49
|
+
doc.switchToPage(i);
|
|
50
|
+
doc
|
|
51
|
+
.fontSize(9)
|
|
52
|
+
.fillColor('#999999')
|
|
53
|
+
.text(`Page ${i + 1} of ${pageCount}`, margins.left, doc.page.height - 30, {
|
|
54
|
+
width: pageWidth,
|
|
55
|
+
align: 'center',
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
doc.end();
|
|
59
|
+
return new Promise((resolve, reject) => {
|
|
60
|
+
writeStream.on('finish', resolve);
|
|
61
|
+
writeStream.on('error', reject);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function renderToken(doc, token, pageWidth, margins) {
|
|
65
|
+
switch (token.type) {
|
|
66
|
+
case 'heading':
|
|
67
|
+
renderHeading(doc, token, pageWidth);
|
|
68
|
+
break;
|
|
69
|
+
case 'paragraph':
|
|
70
|
+
renderParagraph(doc, token, pageWidth);
|
|
71
|
+
break;
|
|
72
|
+
case 'list':
|
|
73
|
+
renderList(doc, token, pageWidth);
|
|
74
|
+
break;
|
|
75
|
+
case 'code':
|
|
76
|
+
renderCodeBlock(doc, token, pageWidth);
|
|
77
|
+
break;
|
|
78
|
+
case 'blockquote':
|
|
79
|
+
renderBlockquote(doc, token, pageWidth);
|
|
80
|
+
break;
|
|
81
|
+
case 'hr':
|
|
82
|
+
renderHorizontalRule(doc, pageWidth, margins);
|
|
83
|
+
break;
|
|
84
|
+
case 'table':
|
|
85
|
+
renderTable(doc, token, pageWidth);
|
|
86
|
+
break;
|
|
87
|
+
case 'space':
|
|
88
|
+
doc.moveDown(0.5);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function renderHeading(doc, token, pageWidth) {
|
|
93
|
+
const sizes = { 1: 24, 2: 20, 3: 16, 4: 14, 5: 12, 6: 11 };
|
|
94
|
+
const colors = {
|
|
95
|
+
1: COLORS.h1,
|
|
96
|
+
2: COLORS.h2,
|
|
97
|
+
3: COLORS.h3,
|
|
98
|
+
4: COLORS.h3,
|
|
99
|
+
5: COLORS.h3,
|
|
100
|
+
6: COLORS.h3,
|
|
101
|
+
};
|
|
102
|
+
doc.moveDown(0.5);
|
|
103
|
+
const fontSize = sizes[token.depth] || 12;
|
|
104
|
+
const color = colors[token.depth] || COLORS.text;
|
|
105
|
+
doc.fontSize(fontSize).font(FONTS.bold).fillColor(color);
|
|
106
|
+
const text = stripMarkdown(token.text);
|
|
107
|
+
doc.text(text, { width: pageWidth });
|
|
108
|
+
// Add underline for h1
|
|
109
|
+
if (token.depth === 1) {
|
|
110
|
+
doc.moveDown(0.2);
|
|
111
|
+
const y = doc.y;
|
|
112
|
+
doc
|
|
113
|
+
.strokeColor(COLORS.link)
|
|
114
|
+
.lineWidth(2)
|
|
115
|
+
.moveTo(doc.x, y)
|
|
116
|
+
.lineTo(doc.x + pageWidth, y)
|
|
117
|
+
.stroke();
|
|
118
|
+
doc.moveDown(0.3);
|
|
119
|
+
}
|
|
120
|
+
doc.moveDown(0.5);
|
|
121
|
+
doc.font(FONTS.regular).fillColor(COLORS.text);
|
|
122
|
+
}
|
|
123
|
+
function renderParagraph(doc, token, pageWidth) {
|
|
124
|
+
doc.fontSize(11).font(FONTS.regular).fillColor(COLORS.text);
|
|
125
|
+
renderInlineTokens(doc, token.tokens || [], pageWidth);
|
|
126
|
+
doc.moveDown(0.8);
|
|
127
|
+
}
|
|
128
|
+
function renderInlineTokens(doc, tokens, pageWidth) {
|
|
129
|
+
for (const token of tokens) {
|
|
130
|
+
switch (token.type) {
|
|
131
|
+
case 'text':
|
|
132
|
+
doc.font(FONTS.regular).text(token.text, { continued: true, width: pageWidth });
|
|
133
|
+
break;
|
|
134
|
+
case 'strong':
|
|
135
|
+
doc.font(FONTS.bold);
|
|
136
|
+
if ('tokens' in token && token.tokens) {
|
|
137
|
+
for (const t of token.tokens) {
|
|
138
|
+
if ('text' in t)
|
|
139
|
+
doc.text(t.text, { continued: true });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else if ('text' in token) {
|
|
143
|
+
doc.text(token.text, { continued: true });
|
|
144
|
+
}
|
|
145
|
+
doc.font(FONTS.regular);
|
|
146
|
+
break;
|
|
147
|
+
case 'em':
|
|
148
|
+
doc.font(FONTS.italic);
|
|
149
|
+
if ('tokens' in token && token.tokens) {
|
|
150
|
+
for (const t of token.tokens) {
|
|
151
|
+
if ('text' in t)
|
|
152
|
+
doc.text(t.text, { continued: true });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else if ('text' in token) {
|
|
156
|
+
doc.text(token.text, { continued: true });
|
|
157
|
+
}
|
|
158
|
+
doc.font(FONTS.regular);
|
|
159
|
+
break;
|
|
160
|
+
case 'codespan':
|
|
161
|
+
doc.font(FONTS.mono).fillColor(COLORS.code);
|
|
162
|
+
if ('text' in token)
|
|
163
|
+
doc.text(token.text, { continued: true });
|
|
164
|
+
doc.font(FONTS.regular).fillColor(COLORS.text);
|
|
165
|
+
break;
|
|
166
|
+
case 'link':
|
|
167
|
+
doc.fillColor(COLORS.link);
|
|
168
|
+
if ('text' in token)
|
|
169
|
+
doc.text(token.text, { continued: true, link: token.href });
|
|
170
|
+
doc.fillColor(COLORS.text);
|
|
171
|
+
break;
|
|
172
|
+
case 'br':
|
|
173
|
+
doc.text('', { continued: false });
|
|
174
|
+
break;
|
|
175
|
+
default:
|
|
176
|
+
if ('text' in token) {
|
|
177
|
+
doc.text(token.text, { continued: true, width: pageWidth });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// End the continued text
|
|
182
|
+
doc.text('', { continued: false });
|
|
183
|
+
}
|
|
184
|
+
function renderList(doc, token, pageWidth, indent = 0) {
|
|
185
|
+
const bulletIndent = 20;
|
|
186
|
+
const textIndent = indent + bulletIndent;
|
|
187
|
+
token.items.forEach((item, index) => {
|
|
188
|
+
const bullet = token.ordered ? `${index + 1}.` : '•';
|
|
189
|
+
doc.fontSize(11).font(FONTS.regular).fillColor(COLORS.text);
|
|
190
|
+
// Draw bullet
|
|
191
|
+
doc.text(bullet, doc.x + indent, doc.y, { continued: false });
|
|
192
|
+
// Get text content from item tokens
|
|
193
|
+
const itemText = item.tokens
|
|
194
|
+
.map((t) => {
|
|
195
|
+
if (t.type === 'text')
|
|
196
|
+
return t.text;
|
|
197
|
+
if (t.type === 'paragraph' && 'text' in t)
|
|
198
|
+
return t.text;
|
|
199
|
+
return '';
|
|
200
|
+
})
|
|
201
|
+
.join('');
|
|
202
|
+
// Move up to align text with bullet and draw item text
|
|
203
|
+
doc.moveUp();
|
|
204
|
+
doc.text(stripMarkdown(itemText), doc.x + textIndent, doc.y, {
|
|
205
|
+
width: pageWidth - textIndent,
|
|
206
|
+
});
|
|
207
|
+
// Handle nested lists
|
|
208
|
+
for (const subToken of item.tokens) {
|
|
209
|
+
if (subToken.type === 'list') {
|
|
210
|
+
renderList(doc, subToken, pageWidth, indent + bulletIndent);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
doc.moveDown(0.5);
|
|
215
|
+
}
|
|
216
|
+
function renderCodeBlock(doc, token, pageWidth) {
|
|
217
|
+
const padding = 10;
|
|
218
|
+
const code = token.text;
|
|
219
|
+
const lines = code.split('\n');
|
|
220
|
+
doc.fontSize(9).font(FONTS.mono);
|
|
221
|
+
// Calculate height needed
|
|
222
|
+
const lineHeight = 12;
|
|
223
|
+
const blockHeight = lines.length * lineHeight + padding * 2;
|
|
224
|
+
// Check if we need a new page
|
|
225
|
+
if (doc.y + blockHeight > doc.page.height - 50) {
|
|
226
|
+
doc.addPage();
|
|
227
|
+
}
|
|
228
|
+
// Draw background
|
|
229
|
+
const startY = doc.y;
|
|
230
|
+
doc
|
|
231
|
+
.rect(doc.x, startY, pageWidth, blockHeight)
|
|
232
|
+
.fill(COLORS.codeBg);
|
|
233
|
+
// Draw code
|
|
234
|
+
doc.fillColor(COLORS.text);
|
|
235
|
+
let currentY = startY + padding;
|
|
236
|
+
for (const line of lines) {
|
|
237
|
+
doc.text(line, doc.x + padding, currentY, { width: pageWidth - padding * 2 });
|
|
238
|
+
currentY += lineHeight;
|
|
239
|
+
}
|
|
240
|
+
doc.y = startY + blockHeight;
|
|
241
|
+
doc.moveDown(0.8);
|
|
242
|
+
doc.font(FONTS.regular);
|
|
243
|
+
}
|
|
244
|
+
function renderBlockquote(doc, token, pageWidth) {
|
|
245
|
+
const quoteIndent = 20;
|
|
246
|
+
const lineX = doc.x + 5;
|
|
247
|
+
// Draw quote line
|
|
248
|
+
const startY = doc.y;
|
|
249
|
+
doc.fontSize(11).font(FONTS.italic).fillColor('#666666');
|
|
250
|
+
for (const subToken of token.tokens) {
|
|
251
|
+
if (subToken.type === 'paragraph' && 'text' in subToken) {
|
|
252
|
+
doc.text(stripMarkdown(subToken.text), doc.x + quoteIndent, doc.y, {
|
|
253
|
+
width: pageWidth - quoteIndent,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const endY = doc.y;
|
|
258
|
+
// Draw the quote line
|
|
259
|
+
doc
|
|
260
|
+
.strokeColor(COLORS.link)
|
|
261
|
+
.lineWidth(3)
|
|
262
|
+
.moveTo(lineX, startY)
|
|
263
|
+
.lineTo(lineX, endY)
|
|
264
|
+
.stroke();
|
|
265
|
+
doc.moveDown(0.8);
|
|
266
|
+
doc.font(FONTS.regular).fillColor(COLORS.text);
|
|
267
|
+
}
|
|
268
|
+
function renderHorizontalRule(doc, pageWidth, margins) {
|
|
269
|
+
doc.moveDown(0.5);
|
|
270
|
+
const y = doc.y;
|
|
271
|
+
doc
|
|
272
|
+
.strokeColor(COLORS.hr)
|
|
273
|
+
.lineWidth(1)
|
|
274
|
+
.moveTo(margins.left, y)
|
|
275
|
+
.lineTo(margins.left + pageWidth, y)
|
|
276
|
+
.stroke();
|
|
277
|
+
doc.moveDown(1);
|
|
278
|
+
}
|
|
279
|
+
function renderTable(doc, token, pageWidth) {
|
|
280
|
+
const cellPadding = 5;
|
|
281
|
+
const colCount = token.header.length;
|
|
282
|
+
const colWidth = pageWidth / colCount;
|
|
283
|
+
const rowHeight = 25;
|
|
284
|
+
let currentY = doc.y;
|
|
285
|
+
// Check if we need a new page
|
|
286
|
+
const estimatedHeight = (token.rows.length + 1) * rowHeight;
|
|
287
|
+
if (currentY + estimatedHeight > doc.page.height - 50) {
|
|
288
|
+
doc.addPage();
|
|
289
|
+
currentY = doc.y;
|
|
290
|
+
}
|
|
291
|
+
// Draw header
|
|
292
|
+
doc.fontSize(10).font(FONTS.bold);
|
|
293
|
+
for (let i = 0; i < colCount; i++) {
|
|
294
|
+
const x = doc.x + i * colWidth;
|
|
295
|
+
// Header background
|
|
296
|
+
doc.rect(x, currentY, colWidth, rowHeight).fill(COLORS.tableHeader);
|
|
297
|
+
// Header text
|
|
298
|
+
const headerText = token.header[i].tokens
|
|
299
|
+
.map((t) => ('text' in t ? t.text : ''))
|
|
300
|
+
.join('');
|
|
301
|
+
doc.fillColor(COLORS.tableHeaderText);
|
|
302
|
+
doc.text(stripMarkdown(headerText), x + cellPadding, currentY + cellPadding, {
|
|
303
|
+
width: colWidth - cellPadding * 2,
|
|
304
|
+
height: rowHeight - cellPadding * 2,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
currentY += rowHeight;
|
|
308
|
+
// Draw rows
|
|
309
|
+
doc.font(FONTS.regular).fillColor(COLORS.text);
|
|
310
|
+
for (const row of token.rows) {
|
|
311
|
+
// Check for page break
|
|
312
|
+
if (currentY + rowHeight > doc.page.height - 50) {
|
|
313
|
+
doc.addPage();
|
|
314
|
+
currentY = doc.y;
|
|
315
|
+
}
|
|
316
|
+
for (let i = 0; i < colCount; i++) {
|
|
317
|
+
const x = doc.x + i * colWidth;
|
|
318
|
+
const cell = row[i];
|
|
319
|
+
// Cell border
|
|
320
|
+
doc.rect(x, currentY, colWidth, rowHeight).stroke(COLORS.tableBorder);
|
|
321
|
+
// Cell text
|
|
322
|
+
const cellText = cell.tokens.map((t) => ('text' in t ? t.text : '')).join('');
|
|
323
|
+
doc.text(stripMarkdown(cellText), x + cellPadding, currentY + cellPadding, {
|
|
324
|
+
width: colWidth - cellPadding * 2,
|
|
325
|
+
height: rowHeight - cellPadding * 2,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
currentY += rowHeight;
|
|
329
|
+
}
|
|
330
|
+
doc.y = currentY;
|
|
331
|
+
doc.moveDown(1);
|
|
332
|
+
}
|
|
333
|
+
function stripMarkdown(text) {
|
|
334
|
+
return text
|
|
335
|
+
.replace(/\*\*(.*?)\*\*/g, '$1') // bold
|
|
336
|
+
.replace(/\*(.*?)\*/g, '$1') // italic
|
|
337
|
+
.replace(/`(.*?)`/g, '$1') // code
|
|
338
|
+
.replace(/\[(.*?)\]\(.*?\)/g, '$1') // links
|
|
339
|
+
.replace(/~~(.*?)~~/g, '$1'); // strikethrough
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=pdfGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdfGenerator.js","sourceRoot":"","sources":["../../src/utils/pdfGenerator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gameforge-cli",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "AI-powered Game Design Document generator",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -12,31 +12,36 @@
|
|
|
12
12
|
"test": "vitest",
|
|
13
13
|
"lint": "eslint src/**/*.ts"
|
|
14
14
|
},
|
|
15
|
-
"keywords": [
|
|
15
|
+
"keywords": [
|
|
16
|
+
"game-design",
|
|
17
|
+
"gdd",
|
|
18
|
+
"ai",
|
|
19
|
+
"cli"
|
|
20
|
+
],
|
|
16
21
|
"author": "",
|
|
17
22
|
"license": "MIT",
|
|
18
23
|
"dependencies": {
|
|
19
24
|
"@anthropic-ai/sdk": "^0.30.0",
|
|
20
|
-
"
|
|
25
|
+
"cli-table3": "^0.6.3",
|
|
26
|
+
"commander": "^12.0.0",
|
|
27
|
+
"dotenv": "^16.4.0",
|
|
21
28
|
"enquirer": "^2.4.0",
|
|
22
|
-
"picocolors": "^1.0.0",
|
|
23
|
-
"ora": "^8.0.0",
|
|
24
29
|
"fs-extra": "^11.2.0",
|
|
25
|
-
"p-queue": "^8.0.0",
|
|
26
30
|
"handlebars": "^4.7.8",
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
31
|
+
"ora": "^5.4.1",
|
|
32
|
+
"p-queue": "^8.0.0",
|
|
33
|
+
"picocolors": "^1.0.0",
|
|
34
|
+
"zod": "^3.22.0"
|
|
30
35
|
},
|
|
31
36
|
"devDependencies": {
|
|
32
|
-
"@types/node": "^20.0.0",
|
|
33
37
|
"@types/fs-extra": "^11.0.0",
|
|
34
|
-
"
|
|
35
|
-
"tsx": "^4.7.0",
|
|
36
|
-
"vitest": "^1.2.0",
|
|
37
|
-
"eslint": "^8.56.0",
|
|
38
|
+
"@types/node": "^20.0.0",
|
|
38
39
|
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
39
|
-
"@typescript-eslint/parser": "^6.0.0"
|
|
40
|
+
"@typescript-eslint/parser": "^6.0.0",
|
|
41
|
+
"eslint": "^8.56.0",
|
|
42
|
+
"tsx": "^4.7.0",
|
|
43
|
+
"typescript": "^5.3.0",
|
|
44
|
+
"vitest": "^1.2.0"
|
|
40
45
|
},
|
|
41
46
|
"files": [
|
|
42
47
|
"dist/**/*",
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { GameForgeState } from './StateMachine';
|
|
2
|
-
export declare class CheckpointManager {
|
|
3
|
-
private checkpointDir;
|
|
4
|
-
private projectId;
|
|
5
|
-
constructor(projectId: string, checkpointDir?: string);
|
|
6
|
-
saveCheckpoint(state: GameForgeState, label: string): Promise<string>;
|
|
7
|
-
loadCheckpoint(checkpointId: string): Promise<GameForgeState>;
|
|
8
|
-
listCheckpoints(): Promise<Array<{
|
|
9
|
-
id: string;
|
|
10
|
-
label: string;
|
|
11
|
-
timestamp: string;
|
|
12
|
-
}>>;
|
|
13
|
-
rollback(checkpointId: string): Promise<GameForgeState>;
|
|
14
|
-
deleteCheckpoint(checkpointId: string): Promise<void>;
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=CheckpointManager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CheckpointManager.d.ts","sourceRoot":"","sources":["../../src/core/CheckpointManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,MAAM,EAAE,aAAa,GAAE,MAAiC;IAMzE,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcrE,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAM7D,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAanF,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAIvD,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAI5D"}
|
|
@@ -1,52 +0,0 @@
|
|
|
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.CheckpointManager = void 0;
|
|
7
|
-
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
class CheckpointManager {
|
|
10
|
-
checkpointDir;
|
|
11
|
-
projectId;
|
|
12
|
-
constructor(projectId, checkpointDir = '.gameforge/checkpoints') {
|
|
13
|
-
this.projectId = projectId;
|
|
14
|
-
this.checkpointDir = path_1.default.resolve(checkpointDir);
|
|
15
|
-
fs_extra_1.default.ensureDirSync(this.checkpointDir);
|
|
16
|
-
}
|
|
17
|
-
async saveCheckpoint(state, label) {
|
|
18
|
-
const checkpointId = `${this.projectId}_${label}_${Date.now()}`;
|
|
19
|
-
const filePath = path_1.default.join(this.checkpointDir, `${checkpointId}.json`);
|
|
20
|
-
await fs_extra_1.default.writeJson(filePath, {
|
|
21
|
-
id: checkpointId,
|
|
22
|
-
label,
|
|
23
|
-
timestamp: new Date().toISOString(),
|
|
24
|
-
state
|
|
25
|
-
}, { spaces: 2 });
|
|
26
|
-
return checkpointId;
|
|
27
|
-
}
|
|
28
|
-
async loadCheckpoint(checkpointId) {
|
|
29
|
-
const filePath = path_1.default.join(this.checkpointDir, `${checkpointId}.json`);
|
|
30
|
-
const data = await fs_extra_1.default.readJson(filePath);
|
|
31
|
-
return data.state;
|
|
32
|
-
}
|
|
33
|
-
async listCheckpoints() {
|
|
34
|
-
const files = await fs_extra_1.default.readdir(this.checkpointDir);
|
|
35
|
-
const checkpoints = await Promise.all(files
|
|
36
|
-
.filter(f => f.startsWith(this.projectId) && f.endsWith('.json'))
|
|
37
|
-
.map(async (file) => {
|
|
38
|
-
const data = await fs_extra_1.default.readJson(path_1.default.join(this.checkpointDir, file));
|
|
39
|
-
return { id: data.id, label: data.label, timestamp: data.timestamp };
|
|
40
|
-
}));
|
|
41
|
-
return checkpoints.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
|
|
42
|
-
}
|
|
43
|
-
async rollback(checkpointId) {
|
|
44
|
-
return this.loadCheckpoint(checkpointId);
|
|
45
|
-
}
|
|
46
|
-
async deleteCheckpoint(checkpointId) {
|
|
47
|
-
const filePath = path_1.default.join(this.checkpointDir, `${checkpointId}.json`);
|
|
48
|
-
await fs_extra_1.default.remove(filePath);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
exports.CheckpointManager = CheckpointManager;
|
|
52
|
-
//# sourceMappingURL=CheckpointManager.js.map
|