@vint.tri/report_gen_mcp 1.0.32 → 1.0.34
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 +18 -5
- package/demonstrate-reports-dir-feature.js +70 -0
- package/detailed-file-opening-test.js +212 -0
- package/dist/index.js +9 -4
- package/dist/utils/reportGenerator.js +9 -1
- package/dollar_to_ruble_report.html +15 -0
- package/http_test_reports/http_test.html +15 -0
- package/manual-file-url-test.js +89 -0
- package/package/cwd-report.html +18 -0
- package/package/debug-report.html +15 -0
- package/package/demonstrate-reports-dir-feature.js +70 -0
- package/package/demonstration.js +200 -0
- package/package/detailed-debug.js +36 -0
- package/package/dist/charts/bar.js +43 -0
- package/package/dist/charts/line.js +43 -0
- package/package/dist/charts/pie.js +42 -0
- package/package/dist/index.js +233 -0
- package/package/dist/utils/reportGenerator.js +59 -0
- package/package/dollar_to_ruble_report.html +15 -0
- package/package/final-verification-test.js +139 -0
- package/package/fix-verification-report.html +18 -0
- package/package/package.json +35 -0
- package/package/random_report.html +19 -0
- package/package/simple-file-test.js +60 -0
- package/package/src/charts/bar.ts +43 -0
- package/package/src/charts/line.ts +43 -0
- package/package/src/charts/pie.ts +42 -0
- package/package/src/index.ts +242 -0
- package/package/src/utils/reportGenerator.ts +60 -0
- package/package/tsconfig.json +14 -0
- package/package.json +1 -2
- package/problematic-file-test.js +105 -0
- package/random_report.html +19 -0
- package/simple-file-test.js +60 -0
- package/src/index.ts +11 -4
- package/src/utils/reportGenerator.ts +11 -1
- package/test-install/package-lock.json +2265 -0
- package/test-install/package.json +15 -0
- package/test_reports/cli_test.html +14 -0
- package/test_reports/comprehensive-test.html +14 -0
- package/test_reports/test-report-final.html +13 -0
- package/test_reports/test-report-fixed.html +13 -0
- package/test_reports/test-report-improved.html +14 -0
- package/test_reports/test-report-literal-fix.html +14 -0
- package/test-reports/test-file-url-report.html +0 -15
package/README.md
CHANGED
|
@@ -17,23 +17,25 @@ A powerful CLI tool for generating HTML reports with embedded charts, designed t
|
|
|
17
17
|
### Global Installation (Recommended)
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
npm install -g @vint.tri/report_gen_mcp@1.0.
|
|
20
|
+
npm install -g @vint.tri/report_gen_mcp@1.0.32
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
### Direct Execution with npx
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
|
-
REPORTS_DIR=./reports npx @vint.tri/report_gen_mcp@1.0.
|
|
26
|
+
REPORTS_DIR=./reports npx @vint.tri/report_gen_mcp@1.0.32
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
## Usage
|
|
30
30
|
|
|
31
31
|
### Command Line Interface
|
|
32
32
|
|
|
33
|
+
The CLI mode now requires the `REPORTS_DIR` environment variable to be set to specify where reports should be generated.
|
|
34
|
+
|
|
33
35
|
#### Start Server Mode
|
|
34
36
|
|
|
35
37
|
```bash
|
|
36
|
-
report_gen_mcp
|
|
38
|
+
REPORTS_DIR=./reports report_gen_mcp start-server
|
|
37
39
|
```
|
|
38
40
|
|
|
39
41
|
Starts an HTTP server for generating reports via REST API.
|
|
@@ -41,7 +43,7 @@ Starts an HTTP server for generating reports via REST API.
|
|
|
41
43
|
#### Generate Report Directly
|
|
42
44
|
|
|
43
45
|
```bash
|
|
44
|
-
report_gen_mcp
|
|
46
|
+
REPORTS_DIR=./reports report_gen_mcp generate \
|
|
45
47
|
--document "path/to/document.md" \
|
|
46
48
|
--charts '{"chart1":{"type":"bar","config":{...}}}' \
|
|
47
49
|
--output "report.html"
|
|
@@ -49,6 +51,17 @@ report_gen_mcp --directory ./reports generate \
|
|
|
49
51
|
|
|
50
52
|
Generates a report directly from command line arguments.
|
|
51
53
|
|
|
54
|
+
**Note:** If you run the CLI commands without setting the `REPORTS_DIR` environment variable, you will get an error message with instructions on how to set it:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
Error: REPORTS_DIR environment variable is required.
|
|
58
|
+
Please set the REPORTS_DIR environment variable to specify where reports should be generated.
|
|
59
|
+
Example:
|
|
60
|
+
export REPORTS_DIR=/path/to/reports && npx @vint.tri/report_gen_mcp@latest
|
|
61
|
+
Or:
|
|
62
|
+
REPORTS_DIR=/path/to/reports npx @vint.tri/report_gen_mcp@latest
|
|
63
|
+
```
|
|
64
|
+
|
|
52
65
|
### Claude Desktop Integration
|
|
53
66
|
|
|
54
67
|
To use this tool with Claude Desktop, add the following configuration to your Claude Desktop settings:
|
|
@@ -67,7 +80,7 @@ To use this tool with Claude Desktop, add the following configuration to your Cl
|
|
|
67
80
|
"REPORTS_DIR": "./reports"
|
|
68
81
|
},
|
|
69
82
|
"args": [
|
|
70
|
-
"@vint.tri/report_gen_mcp@1.0.
|
|
83
|
+
"@vint.tri/report_gen_mcp@1.0.32"
|
|
71
84
|
]
|
|
72
85
|
}
|
|
73
86
|
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { spawn } = require('child_process');
|
|
4
|
+
const fs = require('fs-extra');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
|
|
7
|
+
console.log('Demonstrating the mandatory REPORTS_DIR parameter feature...\n');
|
|
8
|
+
|
|
9
|
+
// Test 1: Show error when REPORTS_DIR is not set for CLI commands
|
|
10
|
+
console.log('=== Test 1: CLI without REPORTS_DIR (should show error) ===');
|
|
11
|
+
const cliWithoutReportsDir = spawn('node', [
|
|
12
|
+
'dist/index.js',
|
|
13
|
+
'generate',
|
|
14
|
+
'--document', '# Test Report',
|
|
15
|
+
'--charts', JSON.stringify({}),
|
|
16
|
+
'--output', 'test-report.html'
|
|
17
|
+
], {
|
|
18
|
+
env: { ...process.env, REPORTS_DIR: '' }
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
cliWithoutReportsDir.stderr.on('data', (data) => {
|
|
22
|
+
console.log(data.toString());
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
cliWithoutReportsDir.on('close', (code) => {
|
|
26
|
+
console.log(`Exit code: ${code}\n`);
|
|
27
|
+
|
|
28
|
+
// Test 2: Show success when REPORTS_DIR is set for CLI commands
|
|
29
|
+
console.log('=== Test 2: CLI with REPORTS_DIR (should succeed) ===');
|
|
30
|
+
const testDir = path.join(process.cwd(), 'demo-reports');
|
|
31
|
+
fs.ensureDirSync(testDir);
|
|
32
|
+
|
|
33
|
+
const cliWithReportsDir = spawn('node', [
|
|
34
|
+
'dist/index.js',
|
|
35
|
+
'generate',
|
|
36
|
+
'--document', '# Demo Report\n\nThis demonstrates the REPORTS_DIR feature.',
|
|
37
|
+
'--charts', JSON.stringify({}),
|
|
38
|
+
'--output', 'demo-report.html'
|
|
39
|
+
], {
|
|
40
|
+
env: { ...process.env, REPORTS_DIR: testDir }
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
cliWithReportsDir.stdout.on('data', (data) => {
|
|
44
|
+
console.log(data.toString());
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
cliWithReportsDir.stderr.on('data', (data) => {
|
|
48
|
+
console.log(data.toString());
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
cliWithReportsDir.on('close', (code) => {
|
|
52
|
+
console.log(`Exit code: ${code}`);
|
|
53
|
+
|
|
54
|
+
// Check if report was created
|
|
55
|
+
const reportPath = path.join(testDir, 'demo-report.html');
|
|
56
|
+
if (fs.existsSync(reportPath)) {
|
|
57
|
+
console.log('\n✅ Report was successfully created in the specified directory!');
|
|
58
|
+
console.log(`Report location: ${reportPath}`);
|
|
59
|
+
|
|
60
|
+
// Show first few lines of the report
|
|
61
|
+
const content = fs.readFileSync(reportPath, 'utf8');
|
|
62
|
+
console.log('\nFirst 200 characters of the report:');
|
|
63
|
+
console.log(content.substring(0, 200) + '...');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Clean up
|
|
67
|
+
fs.removeSync(testDir);
|
|
68
|
+
console.log('\n✅ Demo completed and cleaned up.');
|
|
69
|
+
});
|
|
70
|
+
});
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { spawn } = require('child_process');
|
|
4
|
+
const fs = require('fs-extra');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const { pathToFileURL } = require('url');
|
|
7
|
+
const { exec } = require('child_process');
|
|
8
|
+
|
|
9
|
+
console.log('Testing file generation and opening with detailed error checking...\n');
|
|
10
|
+
|
|
11
|
+
// Create a test reports directory
|
|
12
|
+
const testDir = path.join(process.cwd(), 'test-opening-detailed');
|
|
13
|
+
fs.ensureDirSync(testDir);
|
|
14
|
+
|
|
15
|
+
// Test generating a report
|
|
16
|
+
const child = spawn('node', [
|
|
17
|
+
'dist/index.js',
|
|
18
|
+
'generate',
|
|
19
|
+
'--document', '# Test Report\n\nThis is a test report to check file opening.\n\n[[chart:test]]',
|
|
20
|
+
'--charts', JSON.stringify({
|
|
21
|
+
test: {
|
|
22
|
+
type: "bar",
|
|
23
|
+
config: {
|
|
24
|
+
labels: ["A", "B", "C"],
|
|
25
|
+
datasets: [{
|
|
26
|
+
label: "Test Data",
|
|
27
|
+
data: [1, 2, 3],
|
|
28
|
+
backgroundColor: ["red", "green", "blue"]
|
|
29
|
+
}]
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}),
|
|
33
|
+
'--output', 'detailed-test-report.html'
|
|
34
|
+
], {
|
|
35
|
+
env: {
|
|
36
|
+
...process.env,
|
|
37
|
+
REPORTS_DIR: testDir
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
let stdout = '';
|
|
42
|
+
let stderr = '';
|
|
43
|
+
|
|
44
|
+
child.stdout.on('data', (data) => {
|
|
45
|
+
stdout += data.toString();
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
child.stderr.on('data', (data) => {
|
|
49
|
+
stderr += data.toString();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
child.on('close', (code) => {
|
|
53
|
+
console.log('Report generation exited with code:', code);
|
|
54
|
+
console.log('stdout:', stdout);
|
|
55
|
+
console.log('stderr:', stderr);
|
|
56
|
+
|
|
57
|
+
if (code === 0) {
|
|
58
|
+
try {
|
|
59
|
+
const result = JSON.parse(stdout);
|
|
60
|
+
console.log('\nGenerated report info:');
|
|
61
|
+
console.log('- File path:', result.filePath);
|
|
62
|
+
console.log('- File URL:', result.fileUrl);
|
|
63
|
+
|
|
64
|
+
// Check if file exists
|
|
65
|
+
if (fs.existsSync(result.filePath)) {
|
|
66
|
+
console.log('\n✅ File exists');
|
|
67
|
+
|
|
68
|
+
// Check file permissions
|
|
69
|
+
try {
|
|
70
|
+
const stats = fs.statSync(result.filePath);
|
|
71
|
+
console.log('- File size:', stats.size, 'bytes');
|
|
72
|
+
console.log('- File permissions:', stats.mode.toString(8));
|
|
73
|
+
console.log('- Is file:', stats.isFile());
|
|
74
|
+
console.log('- Is readable:', stats.mode & 0o400 ? 'Yes' : 'No');
|
|
75
|
+
console.log('- Is writable:', stats.mode & 0o200 ? 'Yes' : 'No');
|
|
76
|
+
|
|
77
|
+
// Try to read the file
|
|
78
|
+
const content = fs.readFileSync(result.filePath, 'utf8');
|
|
79
|
+
console.log('- File can be read: Yes');
|
|
80
|
+
console.log('- Content length:', content.length);
|
|
81
|
+
|
|
82
|
+
// Show first 200 characters of content
|
|
83
|
+
console.log('- Content preview:', content.substring(0, 200) + (content.length > 200 ? '...' : ''));
|
|
84
|
+
|
|
85
|
+
// Try to open the file with the default application
|
|
86
|
+
console.log('\nTrying to open file with default application...');
|
|
87
|
+
exec(`open "${result.filePath}"`, (error, stdout, stderr) => {
|
|
88
|
+
if (error) {
|
|
89
|
+
console.log('- Open command error:', error.message);
|
|
90
|
+
console.log('- Open command error code:', error.code);
|
|
91
|
+
console.log('- Open command signal:', error.signal);
|
|
92
|
+
} else {
|
|
93
|
+
console.log('- Open command stdout:', stdout);
|
|
94
|
+
console.log('- Open command stderr:', stderr);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Try opening with file URL
|
|
98
|
+
console.log('\nTrying to open file URL...');
|
|
99
|
+
exec(`open "${result.fileUrl}"`, (error, stdout, stderr) => {
|
|
100
|
+
if (error) {
|
|
101
|
+
console.log('- Open URL command error:', error.message);
|
|
102
|
+
console.log('- Open URL command error code:', error.code);
|
|
103
|
+
console.log('- Open URL command signal:', error.signal);
|
|
104
|
+
|
|
105
|
+
// Try with -R flag to reveal in Finder
|
|
106
|
+
console.log('\nTrying to reveal file in Finder...');
|
|
107
|
+
exec(`open -R "${result.filePath}"`, (revealError, revealStdout, revealStderr) => {
|
|
108
|
+
if (revealError) {
|
|
109
|
+
console.log('- Reveal command error:', revealError.message);
|
|
110
|
+
console.log('- Reveal command error code:', revealError.code);
|
|
111
|
+
} else {
|
|
112
|
+
console.log('- Reveal command stdout:', revealStdout);
|
|
113
|
+
console.log('- Reveal command stderr:', revealStderr);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Try with -a Safari to force opening with Safari
|
|
117
|
+
console.log('\nTrying to open with Safari...');
|
|
118
|
+
exec(`open -a Safari "${result.fileUrl}"`, (safariError, safariStdout, safariStderr) => {
|
|
119
|
+
if (safariError) {
|
|
120
|
+
console.log('- Safari open error:', safariError.message);
|
|
121
|
+
console.log('- Safari open error code:', safariError.code);
|
|
122
|
+
} else {
|
|
123
|
+
console.log('- Safari open stdout:', safariStdout);
|
|
124
|
+
console.log('- Safari open stderr:', safariStderr);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Check file type
|
|
128
|
+
console.log('\nChecking file type...');
|
|
129
|
+
exec(`file "${result.filePath}"`, (fileError, fileStdout, fileStderr) => {
|
|
130
|
+
if (fileError) {
|
|
131
|
+
console.log('- File type check error:', fileError.message);
|
|
132
|
+
} else {
|
|
133
|
+
console.log('- File type:', fileStdout.trim());
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Check MIME type
|
|
137
|
+
console.log('\nChecking MIME type...');
|
|
138
|
+
exec(`file --mime-type "${result.filePath}"`, (mimeError, mimeStdout, mimeStderr) => {
|
|
139
|
+
if (mimeError) {
|
|
140
|
+
console.log('- MIME type check error:', mimeError.message);
|
|
141
|
+
} else {
|
|
142
|
+
console.log('- MIME type:', mimeStdout.trim());
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Clean up
|
|
146
|
+
try {
|
|
147
|
+
fs.removeSync(testDir);
|
|
148
|
+
console.log('\nCleaned up test directory');
|
|
149
|
+
} catch (err) {
|
|
150
|
+
console.log('Failed to clean up test directory:', err.message);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
} else {
|
|
157
|
+
console.log('- Open URL command stdout:', stdout);
|
|
158
|
+
console.log('- Open URL command stderr:', stderr);
|
|
159
|
+
|
|
160
|
+
// Clean up
|
|
161
|
+
try {
|
|
162
|
+
fs.removeSync(testDir);
|
|
163
|
+
console.log('\nCleaned up test directory');
|
|
164
|
+
} catch (err) {
|
|
165
|
+
console.log('Failed to clean up test directory:', err.message);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
} catch (err) {
|
|
171
|
+
console.log('- File access error:', err.message);
|
|
172
|
+
|
|
173
|
+
// Clean up
|
|
174
|
+
try {
|
|
175
|
+
fs.removeSync(testDir);
|
|
176
|
+
console.log('\nCleaned up test directory');
|
|
177
|
+
} catch (cleanupErr) {
|
|
178
|
+
console.log('Failed to clean up test directory:', cleanupErr.message);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
} else {
|
|
182
|
+
console.log('\n❌ File does not exist');
|
|
183
|
+
|
|
184
|
+
// Clean up
|
|
185
|
+
try {
|
|
186
|
+
fs.removeSync(testDir);
|
|
187
|
+
console.log('\nCleaned up test directory');
|
|
188
|
+
} catch (err) {
|
|
189
|
+
console.log('Failed to clean up test directory:', err.message);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
} catch (err) {
|
|
193
|
+
console.log('Error parsing result:', err.message);
|
|
194
|
+
|
|
195
|
+
// Clean up
|
|
196
|
+
try {
|
|
197
|
+
fs.removeSync(testDir);
|
|
198
|
+
console.log('\nCleaned up test directory');
|
|
199
|
+
} catch (cleanupErr) {
|
|
200
|
+
console.log('Failed to clean up test directory:', cleanupErr.message);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
} else {
|
|
204
|
+
// Clean up
|
|
205
|
+
try {
|
|
206
|
+
fs.removeSync(testDir);
|
|
207
|
+
console.log('\nCleaned up test directory');
|
|
208
|
+
} catch (err) {
|
|
209
|
+
console.log('Failed to clean up test directory:', err.message);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
});
|
package/dist/index.js
CHANGED
|
@@ -83,16 +83,21 @@ commander_1.program
|
|
|
83
83
|
}
|
|
84
84
|
// This command only runs in non-stdio mode where reportsDir is guaranteed to be defined
|
|
85
85
|
const result = await (0, reportGenerator_1.generateReport)(documentContent, charts, path_1.default.resolve(reportsDir, opts.output));
|
|
86
|
-
|
|
86
|
+
// Generate proper file URL for CLI mode
|
|
87
|
+
const fileUrl = (0, url_1.pathToFileURL)(result.filePath).href;
|
|
88
|
+
const resultWithUrl = {
|
|
89
|
+
...result,
|
|
90
|
+
fileUrl: fileUrl
|
|
91
|
+
};
|
|
92
|
+
console.log(JSON.stringify(resultWithUrl));
|
|
87
93
|
});
|
|
88
94
|
// Handle stdio mode for Claude Desktop integration
|
|
89
95
|
if (process.argv.length === 2) {
|
|
90
96
|
// No command specified, run in stdio mode using MCP SDK
|
|
91
97
|
const mcpServer = new mcp_js_1.McpServer({
|
|
92
98
|
name: "report_gen_mcp",
|
|
93
|
-
version: "1.0.
|
|
99
|
+
version: "1.0.33",
|
|
94
100
|
}, {
|
|
95
|
-
// Disable health check to prevent automatic calls
|
|
96
101
|
capabilities: {
|
|
97
102
|
tools: {}
|
|
98
103
|
}
|
|
@@ -214,7 +219,7 @@ if (process.argv.length === 2) {
|
|
|
214
219
|
async function main() {
|
|
215
220
|
const transport = new stdio_js_1.StdioServerTransport();
|
|
216
221
|
await mcpServer.connect(transport);
|
|
217
|
-
|
|
222
|
+
// Don't print to stdout as it interferes with JSON communication protocol
|
|
218
223
|
}
|
|
219
224
|
main().catch((error) => {
|
|
220
225
|
console.error("Server error:", error);
|
|
@@ -36,8 +36,16 @@ async function generateReport(document, charts, outputFile) {
|
|
|
36
36
|
for (const [id, htmlImg] of Object.entries(renderedCharts)) {
|
|
37
37
|
mdWithCharts = mdWithCharts.replace(new RegExp(`\\[\\[chart:${id}\\]\\]`, 'g'), htmlImg);
|
|
38
38
|
}
|
|
39
|
+
// Configure marked to handle newlines properly
|
|
40
|
+
marked_1.marked.setOptions({
|
|
41
|
+
breaks: true,
|
|
42
|
+
gfm: true
|
|
43
|
+
});
|
|
39
44
|
// Convert Markdown to HTML
|
|
40
|
-
|
|
45
|
+
let htmlContent = await (0, marked_1.marked)(mdWithCharts);
|
|
46
|
+
// Post-process to convert any remaining literal \n characters to <br> tags
|
|
47
|
+
// This handles cases where marked doesn't convert all newlines
|
|
48
|
+
htmlContent = htmlContent.replace(/\\n/g, '<br>');
|
|
41
49
|
// Wrap in full HTML template
|
|
42
50
|
const template = `
|
|
43
51
|
<!DOCTYPE html>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
|
|
2
|
+
<!DOCTYPE html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<title>Report</title>
|
|
7
|
+
<style> body { font-family: Arial, sans-serif; } img { max-width: 100%; } </style>
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<h1>Курсы доллара к рублю за последнюю неделю</h1>
|
|
11
|
+
<p>Ниже представлен график изменения курса доллара к рублю за последние 7 дней.</p>
|
|
12
|
+
<img src="data:image/png;base64,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G5A2GltabgZwjFNuzYnF7nYzDxERERFRJmEDkmRUff1RAH6ya0DkpudHjNjqXiIiIiIioszCBiSJHY8/BqAnAEBkzRnDhj3hbiIiIiIioszCBsRRWld3AVQvdkpb4/EplSK2q6GIiIiIiDIMGxAAFWvX5hrA44lagHlLS0pedTMTEREREVEmYgMCoGHz5usVOMEpt8UN4xZXAxERERERZaisb0DKX3ppkIjcmqhF9Y7aYcO2uJmJiIiIiChTZX0Doh7PwwB6OeXaHcAcN/MQEREREWWyrG5ARoXD5wG4PFGL6tQ6ny/mYiQiIiIiooyWtQ1IxYIFHltkJgABAKg+WePz1bkaioiIiIgow2VtA9J02GFTAQxxyh1i2ze5mYeIiIiIKBtkZQNy4apV/VW1MlELcE/N8OHrXIxERERERJQVsrIByYlG7wfQzynfjTc2PupmHiIiIiKibJF1DUhpODwUwJhEbQPX1paWNruXiIiIiIgoe2RVA1KpaojILOx+3M/XFhfXupmJiIiIiCibZFUD8nokMh7AmU7ZZIjc4GYeIiIiIqJskzUNSNnKlYUK3JuoVeTBxUVFH7iZiYiIiIgo22RNAyKx2D0ADnXKjzwFBb9wMw8RERERUTbKigakLBw+WUUCidpQvXbx0KGNbmYiIiIiIspGmd+AqIoaxkwAXmfkxcU+3yI3IxERERERZSvv3hdJb2V1dVdCpMgpW+K2Pc3VQEREREREWSyj94CMrq/vDZEHdw2oznihpOQdFyMREREREWW1jG5A4vH4HQAGOuVGOz//PjfzEBERERFlu4xtQMojkeOhuutwKwWurz377M/czERERERElO0ytgFR1ccA5Dll/dKiomfczENERERERBnagJRFIt8H8F2njIttT4WIupmJiIiIiIgysAGpWL06H6oPJ2oBZtWUlLzpZiYiIiIiImqVcQ1IY0vLzQCOAQABNntV73Q5EhEREREROTKqARlVX38UgJ8kahW5ZZHPt93FSERERERElCSjGhA7Hn8MQE8AgMiaM4YNe8LdRERERERElCxjGpDSuroLoHqxU9oaj0+pFLFdDUVERERERF+QEQ1Ixdq1uQbweKIWYN7SkpJX3cxERERERERflhENSMPmzdcrcIJTbosbxi2uBiIiIiIioj1K+wak/KWXBonIrYlaVO+oHTZsi5uZiIiI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" alt="Chart" />
|
|
13
|
+
</body>
|
|
14
|
+
</html>
|
|
15
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
|
|
2
|
+
<!DOCTYPE html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<title>Report</title>
|
|
7
|
+
<style> body { font-family: Arial, sans-serif; } img { max-width: 100%; } </style>
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<h1>HTTP Test Report</h1>
|
|
11
|
+
<p>This is a test via HTTP API.</p>
|
|
12
|
+
|
|
13
|
+
</body>
|
|
14
|
+
</html>
|
|
15
|
+
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs-extra');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const { pathToFileURL } = require('url');
|
|
6
|
+
const { exec } = require('child_process');
|
|
7
|
+
|
|
8
|
+
console.log('Manual file URL test to reproduce the -120 error...\n');
|
|
9
|
+
|
|
10
|
+
// Create a test reports directory
|
|
11
|
+
const testDir = path.join(process.cwd(), 'manual-test');
|
|
12
|
+
fs.ensureDirSync(testDir);
|
|
13
|
+
|
|
14
|
+
// Create a simple HTML file
|
|
15
|
+
const testFilePath = path.join(testDir, 'manual-test-report.html');
|
|
16
|
+
const testContent = `
|
|
17
|
+
<!DOCTYPE html>
|
|
18
|
+
<html>
|
|
19
|
+
<head>
|
|
20
|
+
<title>Manual Test Report</title>
|
|
21
|
+
</head>
|
|
22
|
+
<body>
|
|
23
|
+
<h1>Manual Test Report</h1>
|
|
24
|
+
<p>This is a manually created test report to check file opening.</p>
|
|
25
|
+
</body>
|
|
26
|
+
</html>
|
|
27
|
+
`;
|
|
28
|
+
|
|
29
|
+
fs.writeFileSync(testFilePath, testContent);
|
|
30
|
+
|
|
31
|
+
console.log('Created test file:', testFilePath);
|
|
32
|
+
|
|
33
|
+
// Generate file URL using pathToFileURL
|
|
34
|
+
const fileUrl = pathToFileURL(testFilePath).href;
|
|
35
|
+
console.log('Generated file URL:', fileUrl);
|
|
36
|
+
|
|
37
|
+
// Check file properties
|
|
38
|
+
const stats = fs.statSync(testFilePath);
|
|
39
|
+
console.log('File size:', stats.size, 'bytes');
|
|
40
|
+
console.log('File permissions:', stats.mode.toString(8));
|
|
41
|
+
|
|
42
|
+
// Try to read the file
|
|
43
|
+
const content = fs.readFileSync(testFilePath, 'utf8');
|
|
44
|
+
console.log('Content length:', content.length);
|
|
45
|
+
|
|
46
|
+
// Try opening with file URL - this should reproduce the error
|
|
47
|
+
console.log('\nTrying to open file URL...');
|
|
48
|
+
exec(`open "${fileUrl}"`, (error, stdout, stderr) => {
|
|
49
|
+
if (error) {
|
|
50
|
+
console.log('- Open URL command error:', error.message);
|
|
51
|
+
console.log('- Open URL command error code:', error.code);
|
|
52
|
+
console.log('- Open URL command signal:', error.signal);
|
|
53
|
+
} else {
|
|
54
|
+
console.log('- Open URL command stdout:', stdout);
|
|
55
|
+
console.log('- Open URL command stderr:', stderr);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Try with -a Safari to force opening with Safari
|
|
59
|
+
console.log('\nTrying to open with Safari...');
|
|
60
|
+
exec(`open -a Safari "${fileUrl}"`, (safariError, safariStdout, safariStderr) => {
|
|
61
|
+
if (safariError) {
|
|
62
|
+
console.log('- Safari open error:', safariError.message);
|
|
63
|
+
console.log('- Safari open error code:', safariError.code);
|
|
64
|
+
} else {
|
|
65
|
+
console.log('- Safari open stdout:', safariStdout);
|
|
66
|
+
console.log('- Safari open stderr:', safariStderr);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Try revealing in Finder
|
|
70
|
+
console.log('\nTrying to reveal file in Finder...');
|
|
71
|
+
exec(`open -R "${testFilePath}"`, (revealError, revealStdout, revealStderr) => {
|
|
72
|
+
if (revealError) {
|
|
73
|
+
console.log('- Reveal command error:', revealError.message);
|
|
74
|
+
console.log('- Reveal command error code:', revealError.code);
|
|
75
|
+
} else {
|
|
76
|
+
console.log('- Reveal command stdout:', revealStdout);
|
|
77
|
+
console.log('- Reveal command stderr:', revealStderr);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Clean up
|
|
81
|
+
try {
|
|
82
|
+
fs.removeSync(testDir);
|
|
83
|
+
console.log('\nCleaned up test directory');
|
|
84
|
+
} catch (err) {
|
|
85
|
+
console.log('Failed to clean up test directory:', err.message);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
});
|