fix: normalize line endings and use platform-native EOL in SKILL.md output

Normalize all content to LF in transformToSkillFormat, then convert to
os.EOL (CRLF on Windows, LF on Linux/macOS) before writing SKILL.md
files in both writeSkillArtifacts and installCustomAgentLauncher.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Wendy Smoak 2026-02-21 07:39:56 -05:00
parent 64e0c9d681
commit 1eeea70977
1 changed files with 9 additions and 3 deletions

View File

@ -227,8 +227,9 @@ class CodexSetup extends BaseIdeSetup {
// Transform content: rewrite frontmatter for skills format // Transform content: rewrite frontmatter for skills format
const skillContent = this.transformToSkillFormat(artifact.content, skillName); const skillContent = this.transformToSkillFormat(artifact.content, skillName);
// Write SKILL.md // Write SKILL.md with platform-native line endings
await fs.writeFile(path.join(skillDir, 'SKILL.md'), skillContent, 'utf8'); const platformContent = skillContent.replaceAll('\n', os.EOL);
await fs.writeFile(path.join(skillDir, 'SKILL.md'), platformContent, 'utf8');
writtenCount++; writtenCount++;
} }
@ -243,6 +244,9 @@ class CodexSetup extends BaseIdeSetup {
* @returns {string} Transformed content * @returns {string} Transformed content
*/ */
transformToSkillFormat(content, skillName) { transformToSkillFormat(content, skillName) {
// Normalize line endings so body matches rebuilt frontmatter (both LF)
content = content.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
// Parse frontmatter // Parse frontmatter
const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/); const fmMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
if (!fmMatch) { if (!fmMatch) {
@ -420,8 +424,10 @@ class CodexSetup extends BaseIdeSetup {
'6. WAIT for user input before proceeding\n' + '6. WAIT for user input before proceeding\n' +
'</agent-activation>\n'; '</agent-activation>\n';
// Write with platform-native line endings
const platformContent = skillContent.replaceAll('\n', os.EOL);
const skillPath = path.join(skillDir, 'SKILL.md'); const skillPath = path.join(skillDir, 'SKILL.md');
await fs.writeFile(skillPath, skillContent, 'utf8'); await fs.writeFile(skillPath, platformContent, 'utf8');
return { return {
path: path.relative(projectDir, skillPath), path: path.relative(projectDir, skillPath),