diff --git a/skill/scripts/live-server.mjs b/skill/scripts/live-server.mjs index ebdb8f4d8..546b668ad 100644 --- a/skill/scripts/live-server.mjs +++ b/skill/scripts/live-server.mjs @@ -768,7 +768,7 @@ function createRequestHandler({ detectScript, liveScriptParts }) { }), }); res.writeHead(200, { - 'Content-Type': 'application/javascript', + 'Content-Type': 'application/javascript; charset=utf-8', 'Cache-Control': 'no-store, no-cache, must-revalidate, max-age=0', 'Pragma': 'no-cache', }); @@ -777,7 +777,7 @@ function createRequestHandler({ detectScript, liveScriptParts }) { } if (p === '/detect.js' || p === '/') { if (!detectScript) { res.writeHead(404); res.end('Not available'); return; } - res.writeHead(200, { 'Content-Type': 'application/javascript' }); + res.writeHead(200, { 'Content-Type': 'application/javascript; charset=utf-8' }); res.end(detectScript); return; } diff --git a/tests/live-server.test.mjs b/tests/live-server.test.mjs index 034d20e02..be0a0c17d 100644 --- a/tests/live-server.test.mjs +++ b/tests/live-server.test.mjs @@ -350,7 +350,7 @@ describe('live-server integration', () => { it('/live.js serves script with token injected', async () => { const res = await fetch(`http://localhost:${server.port}/live.js?token=${server.token}`); assert.equal(res.status, 200); - assert.equal(res.headers.get('content-type'), 'application/javascript'); + assert.equal(res.headers.get('content-type'), 'application/javascript; charset=utf-8'); const text = await res.text(); assert.ok(text.includes('__IMPECCABLE_TOKEN__')); assert.ok(text.includes(server.token)); @@ -545,6 +545,9 @@ colors: {} const res = await fetch(`http://localhost:${server.port}/detect.js`); // May 404 if detect-antipatterns-browser.js hasn't been built assert.ok(res.status === 200 || res.status === 404); + if (res.status === 200) { + assert.equal(res.headers.get('content-type'), 'application/javascript; charset=utf-8'); + } }); it('/manual-edit-commit runs the batched AI apply path and clears successful entries', async () => {