@@ -121,6 +121,53 @@ export const renderEntrypointMcpPlaywright = (config: TemplateConfig): string =>
121121 . replaceAll ( "__CODEX_HOME__" , config . codexHome )
122122 . replaceAll ( "__SERVICE_NAME__" , config . serviceName )
123123
124+ const entrypointProjectCodexSkillsSyncTemplate = String . raw `# Mirror project-owned Codex skill trees into CODEX_HOME without overwriting global skills.
125+ docker_git_sync_project_codex_skills() {
126+ local codex_home="${ "$" } {CODEX_HOME:-__CODEX_HOME__}"
127+ local project_dir="${ "$" } {TARGET_DIR:-}"
128+ local project_skills_root="$codex_home/skills/.docker-git-project"
129+ local linked=0
130+ local spec=""
131+ local mount_name=""
132+ local relative_path=""
133+
134+ if [[ -z "$project_dir" || ! -d "$project_dir" ]]; then
135+ return 0
136+ fi
137+
138+ mkdir -p "$codex_home/skills"
139+ rm -rf "$project_skills_root"
140+ mkdir -p "$project_skills_root"
141+
142+ # Priority goes from generic -> shared agent dirs -> agent-specific Codex dirs.
143+ for spec in \
144+ "10-root-skills::.skills" \
145+ "20-agents-skills::.agents/skills" \
146+ "30-agents-dot-skills::.agents/.skills" \
147+ "40-claude-skills::.claude/skills" \
148+ "50-claude-dot-skills::.claude/.skills" \
149+ "80-codex-skills::.codex/skills" \
150+ "90-codex-dot-skills::.codex/.skills"; do
151+ mount_name="${ "$" } {spec%%::*}"
152+ relative_path="${ "$" } {spec#*::}"
153+
154+ if [[ -d "$project_dir/$relative_path" ]]; then
155+ ln -sfn "$project_dir/$relative_path" "$project_skills_root/$mount_name"
156+ chown -h 1000:1000 "$project_skills_root/$mount_name" 2>/dev/null || true
157+ linked=1
158+ fi
159+ done
160+
161+ chown 1000:1000 "$codex_home/skills" "$project_skills_root" 2>/dev/null || true
162+
163+ if [[ "$linked" -eq 1 ]]; then
164+ echo "[codex-skills] linked project skill trees into $project_skills_root"
165+ fi
166+ }`
167+
168+ export const renderEntrypointProjectCodexSkillsSync = ( config : TemplateConfig ) : string =>
169+ entrypointProjectCodexSkillsSyncTemplate . replaceAll ( "__CODEX_HOME__" , config . codexHome )
170+
124171const entrypointAgentsNoticeTemplate = String . raw `# Ensure global AGENTS.md exists for container context
125172AGENTS_PATH="__CODEX_HOME__/AGENTS.md"
126173LEGACY_AGENTS_PATH="/home/__SSH_USER__/AGENTS.md"
0 commit comments