Four Failures That Made a Weekly launchd Job Actually Run A developer built a weekly launchd job that automatically distributes AI-learned skills from Claude Code's global skills folder into every local git repository, eliminating the need for manual copying. The script, named autoskills-sync, runs every Sunday at 6:10 AM, scans projects, filters exclusions, and installs skills via npx, logging results. The developer documented four failures encountered while getting the job to run unattended, including PATH configuration issues. Every skill my AI setup learns lives in one folder on my laptop — and none of it reaches the repo I created yesterday. That gap is why I built a weekly job that pushes my accumulated skills into every project on the machine. This is what it does, and the four failures I hit getting it to run unattended. Claude Code's ~/.claude/skills/auto/ is essentially a personal "habits library." Workarounds, completion criteria, and verification commands discovered mid-task get written out to skill files automatically by the AI, and can be referenced immediately on the next request — that's how the mechanism is designed. Reality is a little different, though. Skills keep piling up in .claude/skills/auto/ . But a project in a freshly created git repo, a side-gig job opened for the first time in weeks, a set of tools written in another language — those don't have the skills at all to begin with . Unless a human copies them by hand, or I type "refer to that skill" every single time, the habits I so carefully accumulated are completely dead in other projects. The structure of the problem looks like this. .claude/skills/auto/ global .agents/ or .claude/skills/ " local This isn't "growing your environment," it's "regrowing it every time." Once monthly revenue crosses a certain line, the number of concurrent jobs rises, and there are weeks where I cut two or three new repos. Each time, noticing the missing skills, copying manually, verifying — that work quietly eats time. Not the duration of a single tool call, but the opportunity cost of "if that skill had been here, this would have taken three minutes." The weekly auto-distribution script solves this. Early every Sunday morning, it scans all git repositories and pours the skills in. Without a human doing anything, the project you open on Monday has the latest skills in place. Don't increase the amount of work — raise the baseline quality of the environment. In building an autonomous Claude Code environment, this design philosophy has been the most effective one. One important premise. "Skills" here means the files under ~/.claude/skills/auto/ that I built up myself. Bundled skills and ~/.claude/skills/ecc/ are never touched. The distribution target is strictly my own habits library. Here's a bird's-eye view of the whole mechanism. launchd com.shun.autoskills-sync 日曜 06:10 起動 | v autoskills-sync.sh | +-- ① オンライン確認 | curl -sf -m 8 https://registry.npmjs.org/ | オフライン → exit 0(何もせず正常終了) | +-- ② プロジェクト探索 | find ~ ~/dev -maxdepth 2 | -name .git → 親ディレクトリをリスト | -name package.json / pyproject.toml / | requirements.txt / go.mod / | Cargo.toml / pubspec.yaml / | skills-lock.json | sort -u で重複除去 | +-- ③ 除外フィルタ | oss-trial/ / -public / node modules/ | Documents/ Library/ Applications/ go/ | .claude/ config-snapshots/ claude-obsidian/ | digital-products | +-- ④ 各プロジェクトへ配布 | npx -y autoskills --yes | 出力から「N skills installed」をパース | +-- ⑤ gitignore 追記(本番のみ) | .agents/ / .claude/skills/ / skills-lock.json | +-- ⑥ ログ記録 ~/.claude/logs/com.shun.autoskills-sync.log launchd, the macOS job scheduler, loads plists placed in ~/Library/LaunchAgents/ and runs them automatically. The contents of com.shun.autoskills-sync.plist look like this.