[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6R7TFPW0ZYH3X400MWQKZJD":3,"skill-same:01M6R7TFPW0ZYH3X400MWQKZJD":55},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":29,"linkOnly":30,"markdownContent":31,"markdownBody":32,"frontMatter":33,"refName":35,"commitSha":36,"skillDirectory":37,"forksCount":13,"repositoryHtmlUrl":38,"repositoryHomepageUrl":6,"ownerHtmlUrl":39,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":40,"install":41,"resources":54},"01M6R7TFPW0ZYH3X400MWQKZJD","windows-compatibility",null,"Cross-platform path handling and command patterns","barichter\u002Fsquad","barichter","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F96797186?v=4","01M6R712K8ESMDF089BFENBR16","01M6R712R74BSQQSG2GTXBWR8P",0,"MIT","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Fpackages\u002Fsquad-sdk\u002Ftemplates\u002Fskills\u002Fwindows-compatibility\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28],"windows","windows compatibility","compatibility","git","command","patterns","cross-platform","platform","high","path","bugs","2026-11-10 10:12:30",false,"---\nname: \"windows-compatibility\"\ndescription: \"Cross-platform path handling and command patterns\"\ndomain: \"platform\"\nconfidence: \"high\"\nsource: \"earned (multiple Windows-specific bugs: colons in filenames, git -C failures, path separators)\"\n---\n\n## Context\n\nSquad runs on Windows, macOS, and Linux. Several bugs have been traced to platform-specific assumptions: ISO timestamps with colons (illegal on Windows), `git -C` with Windows paths (unreliable), forward-slash paths in Node.js on Windows.\n\n## Patterns\n\n### Filenames & Timestamps\n- **Never use colons in filenames:** ISO 8601 format `2026-03-15T05:30:00Z` is illegal on Windows\n- **Use `safeTimestamp()` utility:** Replaces colons with hyphens → `2026-03-15T05-30-00Z`\n- **Centralize formatting:** Don't inline `.toISOString().replace(\u002F:\u002Fg, '-')` — use the utility\n\n### Git Commands\n- **Never use `git -C {path}`:** Unreliable with Windows paths (backslashes, spaces, drive letters)\n- **Always `cd` first:** Change directory, then run git commands\n- **Check for changes before commit:** `git diff --cached --quiet` (exit 0 = no changes)\n\n### Commit Messages\n- **Never embed newlines in `-m` flag:** Backtick-n (`\\n`) fails silently in PowerShell\n- **Use temp file + `-F` flag:** Write message to file, commit with `git commit -F $msgFile`\n\n### Paths\n- **Never assume CWD is repo root:** Always use `TEAM ROOT` from spawn prompt or run `git rev-parse --show-toplevel`\n- **Use path.join() or path.resolve():** Don't manually concatenate with `\u002F` or `\\`\n\n### Path Comparison (Case Sensitivity)\n- **Never use case-sensitive `startsWith` or `===` for path comparison on Windows or macOS:** These filesystems are case-insensitive — `C:\\Users\\` and `c:\\users\\` refer to the same location\n- **Use platform-aware comparison:** Check `process.platform === 'win32' || process.platform === 'darwin'` and lowercase both sides before comparing\n- **Pattern:**\n  ```typescript\n  const CASE_INSENSITIVE = process.platform === 'win32' || process.platform === 'darwin';\n  \n  function pathStartsWith(fullPath: string, prefix: string): boolean {\n    if (CASE_INSENSITIVE) {\n      return fullPath.toLowerCase().startsWith(prefix.toLowerCase());\n    }\n    return fullPath.startsWith(prefix);\n  }\n  ```\n- **Where it matters:** Security checks (path traversal prevention), rootDir confinement, any path-contains-path validation\n- **Linux is case-sensitive:** Do NOT lowercase on Linux — `\u002FHome\u002F` and `\u002Fhome\u002F` are different directories\n\n## Examples\n\n✓ **Correct:**\n```javascript\n\u002F\u002F Timestamp utility\nconst safeTimestamp = () => new Date().toISOString().replace(\u002F:\u002Fg, '-').split('.')[0] + 'Z';\n\n\u002F\u002F Git workflow (PowerShell)\ncd $teamRoot\ngit add .squad\u002F\nif ($LASTEXITCODE -eq 0) {\n  $msg = @\"\ndocs(ai-team): session log\n\nChanges:\n- Added decisions\n\"@\n  $msgFile = [System.IO.Path]::GetTempFileName()\n  Set-Content -Path $msgFile -Value $msg -Encoding utf8\n  git commit -F $msgFile\n  Remove-Item $msgFile\n}\n```\n\n✗ **Incorrect:**\n```javascript\n\u002F\u002F Colon in filename\nconst logPath = `.squad\u002Flog\u002F${new Date().toISOString()}.md`; \u002F\u002F ILLEGAL on Windows\n\n\u002F\u002F git -C with Windows path\nexec('git -C C:\\\\src\\\\squad add .squad\u002F'); \u002F\u002F UNRELIABLE\n\n\u002F\u002F Inline newlines in commit message\nexec('git commit -m \"First line\\nSecond line\"'); \u002F\u002F FAILS silently in PowerShell\n```\n\n## Anti-Patterns\n\n- Testing only on one platform (bugs ship to other platforms)\n- Assuming Unix-style paths work everywhere\n- Using `git -C` because it \"looks cleaner\" (it doesn't work)\n- Skipping `git diff --cached --quiet` check (creates empty commits)\n- **Wrong — case-sensitive path check on Windows and macOS:**\n  ```typescript\n  if (!resolved.startsWith(rootDir + path.sep)) {\n    throw new Error('Path traversal blocked');\n  }\n  \u002F\u002F Fails: 'c:\\\\Users\\\\temp\\\\file'.startsWith('C:\\\\Users\\\\temp\\\\') → false\n  ```\n","## Context\n\nSquad runs on Windows, macOS, and Linux. Several bugs have been traced to platform-specific assumptions: ISO timestamps with colons (illegal on Windows), `git -C` with Windows paths (unreliable), forward-slash paths in Node.js on Windows.\n\n## Patterns\n\n### Filenames & Timestamps\n- **Never use colons in filenames:** ISO 8601 format `2026-03-15T05:30:00Z` is illegal on Windows\n- **Use `safeTimestamp()` utility:** Replaces colons with hyphens → `2026-03-15T05-30-00Z`\n- **Centralize formatting:** Don't inline `.toISOString().replace(\u002F:\u002Fg, '-')` — use the utility\n\n### Git Commands\n- **Never use `git -C {path}`:** Unreliable with Windows paths (backslashes, spaces, drive letters)\n- **Always `cd` first:** Change directory, then run git commands\n- **Check for changes before commit:** `git diff --cached --quiet` (exit 0 = no changes)\n\n### Commit Messages\n- **Never embed newlines in `-m` flag:** Backtick-n (`\\n`) fails silently in PowerShell\n- **Use temp file + `-F` flag:** Write message to file, commit with `git commit -F $msgFile`\n\n### Paths\n- **Never assume CWD is repo root:** Always use `TEAM ROOT` from spawn prompt or run `git rev-parse --show-toplevel`\n- **Use path.join() or path.resolve():** Don't manually concatenate with `\u002F` or `\\`\n\n### Path Comparison (Case Sensitivity)\n- **Never use case-sensitive `startsWith` or `===` for path comparison on Windows or macOS:** These filesystems are case-insensitive — `C:\\Users\\` and `c:\\users\\` refer to the same location\n- **Use platform-aware comparison:** Check `process.platform === 'win32' || process.platform === 'darwin'` and lowercase both sides before comparing\n- **Pattern:**\n  ```typescript\n  const CASE_INSENSITIVE = process.platform === 'win32' || process.platform === 'darwin';\n  \n  function pathStartsWith(fullPath: string, prefix: string): boolean {\n    if (CASE_INSENSITIVE) {\n      return fullPath.toLowerCase().startsWith(prefix.toLowerCase());\n    }\n    return fullPath.startsWith(prefix);\n  }\n  ```\n- **Where it matters:** Security checks (path traversal prevention), rootDir confinement, any path-contains-path validation\n- **Linux is case-sensitive:** Do NOT lowercase on Linux — `\u002FHome\u002F` and `\u002Fhome\u002F` are different directories\n\n## Examples\n\n✓ **Correct:**\n```javascript\n\u002F\u002F Timestamp utility\nconst safeTimestamp = () => new Date().toISOString().replace(\u002F:\u002Fg, '-').split('.')[0] + 'Z';\n\n\u002F\u002F Git workflow (PowerShell)\ncd $teamRoot\ngit add .squad\u002F\nif ($LASTEXITCODE -eq 0) {\n  $msg = @\"\ndocs(ai-team): session log\n\nChanges:\n- Added decisions\n\"@\n  $msgFile = [System.IO.Path]::GetTempFileName()\n  Set-Content -Path $msgFile -Value $msg -Encoding utf8\n  git commit -F $msgFile\n  Remove-Item $msgFile\n}\n```\n\n✗ **Incorrect:**\n```javascript\n\u002F\u002F Colon in filename\nconst logPath = `.squad\u002Flog\u002F${new Date().toISOString()}.md`; \u002F\u002F ILLEGAL on Windows\n\n\u002F\u002F git -C with Windows path\nexec('git -C C:\\\\src\\\\squad add .squad\u002F'); \u002F\u002F UNRELIABLE\n\n\u002F\u002F Inline newlines in commit message\nexec('git commit -m \"First line\\nSecond line\"'); \u002F\u002F FAILS silently in PowerShell\n```\n\n## Anti-Patterns\n\n- Testing only on one platform (bugs ship to other platforms)\n- Assuming Unix-style paths work everywhere\n- Using `git -C` because it \"looks cleaner\" (it doesn't work)\n- Skipping `git diff --cached --quiet` check (creates empty commits)\n- **Wrong — case-sensitive path check on Windows and macOS:**\n  ```typescript\n  if (!resolved.startsWith(rootDir + path.sep)) {\n    throw new Error('Path traversal blocked');\n  }\n  \u002F\u002F Fails: 'c:\\\\Users\\\\temp\\\\file'.startsWith('C:\\\\Users\\\\temp\\\\') → false\n  ```\n",{"name":5,"domain":25,"source":34,"confidence":26,"description":7},"earned (multiple Windows-specific bugs: colons in filenames, git -C failures, path separators)","dev","ec19f5e92325e634e3c6eff500e3cefa56131cc9","packages\u002Fsquad-sdk\u002Ftemplates\u002Fskills\u002Fwindows-compatibility","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad","https:\u002F\u002Fgithub.com\u002Fbarichter","2026-04-13 22:53:46",{"source":8,"skillName":5,"commands":42,"prompt":52,"zipAvailable":53},[43,46,49],{"tool":44,"command":45},"npx","npx skills add barichter\u002Fsquad --skill windows-compatibility",{"tool":47,"command":48},"bunx","bunx skills add barichter\u002Fsquad --skill windows-compatibility",{"tool":50,"command":51},"pnpm","pnpm dlx skills add barichter\u002Fsquad --skill windows-compatibility","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Fpackages\u002Fsquad-sdk\u002Ftemplates\u002Fskills\u002Fwindows-compatibility\u002FSKILL.md",true,[],[56,72,80,95,118,124],{"skillNo":57,"name":58,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":59,"categories":60,"keywords":66,"publishedAt":29},"01M6R7VE8SZD1E37WWJN4ZFPWB","My Skill","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftest-fixtures\u002Fskills-test-abb30454\u002Fmy-skill\u002FSKILL.md",[61],{"categoryNo":62,"categoryName":63,"taxonomyType":64,"taxonomyTypeDesc":65},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[67,68,69,70,71],"my","my skill","tester","vitest","testing",{"skillNo":73,"name":74,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":29},"01M6R7VD19M4TMAA74XGD6QSZX","bad-skill","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftest-fixtures\u002Fskills-test-abb30454\u002Fbad-skill\u002FSKILL.md",[],[78,79],"bad skill","bad",{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":29},"01M6R7V9TYTX6Z621V6RWA51G6","squad-conventions","Core conventions and patterns used in the Squad codebase","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Fsquad-conventions\u002FSKILL.md",[],[87,88,89,90,91,23,92,93,26,94],"squad conventions","squad","conventions","project-conventions","core","project","manual","codebase",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":29},"01M6R7TTF0ABMGSVWASVYF6D51","rework-rate","Measure and interpret PR rework rate — the emerging 5th DORA metric","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Frework-rate\u002FSKILL.md",[],[102,103,104,105,106,107,108,109,110,26,88,111,112,113,114,115,116,117,93],"rate","rework rate","metric","efficiency","prs","when","pr","review","code quality","code","code-review","metrics","health","team","analyze","quality",{"skillNo":119,"name":120,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":123,"publishedAt":29},"01M6R7TRZPET44JRCSQF08EEA8","nap","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Fnap\u002FSKILL.md",[],[120],{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":131,"publishedAt":29},"01M6R7TK10WCT77A52E27GR5R3","{skill-name}","{what this skill teaches agents}","https:\u002F\u002Fgithub.com\u002Fbarichter\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskill.md",[130],{"categoryNo":62,"categoryName":63,"taxonomyType":64,"taxonomyTypeDesc":65},[132,133,134,135,136,137,138,139,140,141,93,26,71],"{skill name}","skill name","name","design","api","how","error-handling","learned","error","api-design"]