Skip to content

Commit fcf4f67

Browse files
committed
feat(templates): allow customizing system prompts and codex skills
Add runtime override hooks for the per-agent system prompts and the project Codex skills sync: - CLAUDE_SYSTEM_PROMPT_OVERRIDE / CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE replace the body inside the managed CLAUDE.md block while keeping the docker-git managed markers so updates remain idempotent. - CODEX_SYSTEM_PROMPT_OVERRIDE / CODEX_SYSTEM_PROMPT_OVERRIDE_FILE replace the managed lines inside ~/.codex/AGENTS.md. - GEMINI_SYSTEM_PROMPT_OVERRIDE / GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE replace the body inside ~/.gemini/GEMINI.md. - CODEX_EXTRA_SKILLS_PATHS lets users mount additional skill trees (format "prio-name::relative/path", comma- or newline-separated) alongside the built-in priority list. Each hook prefers the *_FILE variant over the inline value, falling back to the existing default content so existing deployments behave identically when no overrides are set. Mirror the lib changes into packages/app/src/lib, document the new env vars in the CLI help text, and add tests asserting the rendered entrypoint contains the new override scaffolding.
1 parent 6e32cfe commit fcf4f67

10 files changed

Lines changed: 177 additions & 34 deletions

File tree

packages/app/src/docker-git/cli/usage.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,13 @@ Container runtime env (set via .orch/env/project.env):
8080
CODEX_SHARE_AUTH=1|0 Share Codex auth.json across projects (default: 1)
8181
CODEX_AUTO_UPDATE=1|0 Auto-update Codex CLI on container start (default: 1)
8282
CLAUDE_AUTO_SYSTEM_PROMPT=1|0 Auto-attach docker-git managed system prompt to claude (default: 1)
83+
CLAUDE_SYSTEM_PROMPT_OVERRIDE=<text> Custom Claude system prompt body (overrides default Russian template)
84+
CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE=<path> Path to file with custom Claude prompt (takes precedence over OVERRIDE)
85+
CODEX_SYSTEM_PROMPT_OVERRIDE=<text> Custom Codex managed-block content for AGENTS.md
86+
CODEX_SYSTEM_PROMPT_OVERRIDE_FILE=<path> Path to file with custom Codex managed-block content (takes precedence)
87+
GEMINI_SYSTEM_PROMPT_OVERRIDE=<text> Custom Gemini system prompt body
88+
GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE=<path> Path to file with custom Gemini prompt (takes precedence over OVERRIDE)
89+
CODEX_EXTRA_SKILLS_PATHS=<spec>[,<spec>...] Extra skill trees mounted into Codex (format: "prio-name::relative/path"; comma- or newline-separated)
8390
DOCKER_GIT_ZSH_AUTOSUGGEST=1|0 Enable zsh-autosuggestions (default: 0)
8491
DOCKER_GIT_ZSH_AUTOSUGGEST_STYLE=... zsh-autosuggestions highlight style (default: fg=8,italic)
8592
DOCKER_GIT_ZSH_AUTOSUGGEST_STRATEGY=... Suggestion sources (default: history completion)

packages/app/src/lib/core/templates-entrypoint/agents-notice.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,27 @@ elif [[ "$REPO_REF" == refs/pull/*/head ]]; then
4343
fi
4444
MANAGED_START="<!-- docker-git:managed:start -->"
4545
MANAGED_END="<!-- docker-git:managed:end -->"
46-
if [[ ! -f "$AGENTS_PATH" ]]; then
47-
MANAGED_BLOCK="$(cat <<EOF
48-
$MANAGED_START
46+
CODEX_SYSTEM_PROMPT_OVERRIDE_FILE="${"$"}{CODEX_SYSTEM_PROMPT_OVERRIDE_FILE:-}"
47+
CODEX_SYSTEM_PROMPT_OVERRIDE="${"$"}{CODEX_SYSTEM_PROMPT_OVERRIDE:-}"
48+
if [[ -n "$CODEX_SYSTEM_PROMPT_OVERRIDE_FILE" && -r "$CODEX_SYSTEM_PROMPT_OVERRIDE_FILE" ]]; then
49+
MANAGED_LINES="$(cat "$CODEX_SYSTEM_PROMPT_OVERRIDE_FILE")"
50+
elif [[ -n "$CODEX_SYSTEM_PROMPT_OVERRIDE" ]]; then
51+
MANAGED_LINES="$CODEX_SYSTEM_PROMPT_OVERRIDE"
52+
else
53+
MANAGED_LINES="$(cat <<EOF
4954
$PROJECT_LINE
5055
$WORKSPACES_LINE
5156
$WORKSPACE_INFO_LINE
5257
$FOCUS_LINE
5358
$INTERNET_LINE
5459
$SUBAGENTS_LINE
60+
EOF
61+
)"
62+
fi
63+
if [[ ! -f "$AGENTS_PATH" ]]; then
64+
MANAGED_BLOCK="$(cat <<EOF
65+
$MANAGED_START
66+
$MANAGED_LINES
5567
$MANAGED_END
5668
EOF
5769
)"
@@ -65,12 +77,7 @@ fi
6577
if [[ -f "$AGENTS_PATH" ]]; then
6678
MANAGED_BLOCK="$(cat <<EOF
6779
$MANAGED_START
68-
$PROJECT_LINE
69-
$WORKSPACES_LINE
70-
$WORKSPACE_INFO_LINE
71-
$FOCUS_LINE
72-
$INTERNET_LINE
73-
$SUBAGENTS_LINE
80+
$MANAGED_LINES
7481
$MANAGED_END
7582
EOF
7683
)"

packages/app/src/lib/core/templates-entrypoint/claude-extra-config.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,9 @@ elif [[ "$REPO_REF_VALUE" == refs/pull/*/head ]]; then
4141
fi
4242
fi
4343
44-
if [[ "$CLAUDE_AUTO_SYSTEM_PROMPT" == "1" ]]; then
45-
mkdir -p "$(dirname "$CLAUDE_GLOBAL_PROMPT_FILE")"
46-
chown 1000:1000 "$(dirname "$CLAUDE_GLOBAL_PROMPT_FILE")" 2>/dev/null || true
47-
if [[ ! -f "$CLAUDE_GLOBAL_PROMPT_FILE" ]] || grep -q "^<!-- docker-git-managed:claude-md -->$" "$CLAUDE_GLOBAL_PROMPT_FILE"; then
48-
cat <<EOF > "$CLAUDE_GLOBAL_PROMPT_FILE"
49-
<!-- docker-git-managed:claude-md -->
44+
CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE="${"$"}{CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE:-}"
45+
CLAUDE_SYSTEM_PROMPT_OVERRIDE="${"$"}{CLAUDE_SYSTEM_PROMPT_OVERRIDE:-}"
46+
CLAUDE_DEFAULT_PROMPT_BODY="$(cat <<EOF
5047
Ты автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, bun, codex, opencode, oh-my-opencode, sshpass, claude, git, node и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~
5148
Рабочая папка проекта (git clone): __TARGET_DIR__
5249
Доступные workspace пути: __TARGET_DIR__
@@ -55,6 +52,23 @@ $CLAUDE_WORKSPACE_CONTEXT
5552
Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.
5653
Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.
5754
Если ты видишь файлы AGENTS.md или CLAUDE.md внутри проекта, ты обязан их читать и соблюдать инструкции.
55+
EOF
56+
)"
57+
if [[ -n "$CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE" && -r "$CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE" ]]; then
58+
CLAUDE_PROMPT_BODY="$(cat "$CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE")"
59+
elif [[ -n "$CLAUDE_SYSTEM_PROMPT_OVERRIDE" ]]; then
60+
CLAUDE_PROMPT_BODY="$CLAUDE_SYSTEM_PROMPT_OVERRIDE"
61+
else
62+
CLAUDE_PROMPT_BODY="$CLAUDE_DEFAULT_PROMPT_BODY"
63+
fi
64+
65+
if [[ "$CLAUDE_AUTO_SYSTEM_PROMPT" == "1" ]]; then
66+
mkdir -p "$(dirname "$CLAUDE_GLOBAL_PROMPT_FILE")"
67+
chown 1000:1000 "$(dirname "$CLAUDE_GLOBAL_PROMPT_FILE")" 2>/dev/null || true
68+
if [[ ! -f "$CLAUDE_GLOBAL_PROMPT_FILE" ]] || grep -q "^<!-- docker-git-managed:claude-md -->$" "$CLAUDE_GLOBAL_PROMPT_FILE"; then
69+
cat <<EOF > "$CLAUDE_GLOBAL_PROMPT_FILE"
70+
<!-- docker-git-managed:claude-md -->
71+
$CLAUDE_PROMPT_BODY
5872
<!-- /docker-git-managed:claude-md -->
5973
EOF
6074
chmod 0644 "$CLAUDE_GLOBAL_PROMPT_FILE" || true

packages/app/src/lib/core/templates-entrypoint/codex.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,22 @@ docker_git_sync_project_codex_skills() {
164164
fi
165165
done
166166
167+
# Extra entries via CODEX_EXTRA_SKILLS_PATHS (comma- or newline-separated "prio-name::relative/path").
168+
local extra_specs="${"$"}{CODEX_EXTRA_SKILLS_PATHS:-}"
169+
if [[ -n "$extra_specs" ]]; then
170+
extra_specs="${"$"}{extra_specs//,/$'\n'}"
171+
while IFS= read -r spec; do
172+
[[ -z "$spec" ]] && continue
173+
mount_name="${"$"}{spec%%::*}"
174+
relative_path="${"$"}{spec#*::}"
175+
if [[ -d "$project_dir/$relative_path" ]]; then
176+
ln -sfn "$project_dir/$relative_path" "$project_skills_root/$mount_name"
177+
chown -h 1000:1000 "$project_skills_root/$mount_name" 2>/dev/null || true
178+
linked=1
179+
fi
180+
done <<< "$extra_specs"
181+
fi
182+
167183
chown 1000:1000 "$codex_home/skills" "$project_skills_root" 2>/dev/null || true
168184
169185
if [[ "$linked" -eq 1 ]]; then

packages/app/src/lib/core/templates-entrypoint/gemini.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,9 @@ elif [[ "$REPO_REF" == refs/pull/*/head ]]; then
265265
fi
266266
fi
267267
268-
cat <<EOF > "$GEMINI_MD_PATH"
269-
<!-- docker-git-managed:gemini-md -->
268+
GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE="${"$"}{GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE:-}"
269+
GEMINI_SYSTEM_PROMPT_OVERRIDE="${"$"}{GEMINI_SYSTEM_PROMPT_OVERRIDE:-}"
270+
GEMINI_DEFAULT_PROMPT_BODY="$(cat <<EOF
270271
Ты автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, bun, codex, gemini, claude, opencode, oh-my-opencode, sshpass, git, node и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~
271272
Рабочая папка проекта (git clone): __TARGET_DIR__
272273
Доступные workspace пути: __TARGET_DIR__
@@ -275,6 +276,19 @@ $GEMINI_WORKSPACE_CONTEXT
275276
Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.
276277
Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.
277278
Если ты видишь файлы AGENTS.md, GEMINI.md или CLAUDE.md внутри проекта, ты обязан их читать и соблюдать инструкции.
279+
EOF
280+
)"
281+
if [[ -n "$GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE" && -r "$GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE" ]]; then
282+
GEMINI_PROMPT_BODY="$(cat "$GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE")"
283+
elif [[ -n "$GEMINI_SYSTEM_PROMPT_OVERRIDE" ]]; then
284+
GEMINI_PROMPT_BODY="$GEMINI_SYSTEM_PROMPT_OVERRIDE"
285+
else
286+
GEMINI_PROMPT_BODY="$GEMINI_DEFAULT_PROMPT_BODY"
287+
fi
288+
289+
cat <<EOF > "$GEMINI_MD_PATH"
290+
<!-- docker-git-managed:gemini-md -->
291+
$GEMINI_PROMPT_BODY
278292
<!-- /docker-git-managed:gemini-md -->
279293
EOF
280294
chown 1000:1000 "$GEMINI_MD_PATH" || true`

packages/lib/src/core/templates-entrypoint/agents-notice.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,27 @@ elif [[ "$REPO_REF" == refs/pull/*/head ]]; then
4242
fi
4343
MANAGED_START="<!-- docker-git:managed:start -->"
4444
MANAGED_END="<!-- docker-git:managed:end -->"
45-
if [[ ! -f "$AGENTS_PATH" ]]; then
46-
MANAGED_BLOCK="$(cat <<EOF
47-
$MANAGED_START
45+
CODEX_SYSTEM_PROMPT_OVERRIDE_FILE="${"$"}{CODEX_SYSTEM_PROMPT_OVERRIDE_FILE:-}"
46+
CODEX_SYSTEM_PROMPT_OVERRIDE="${"$"}{CODEX_SYSTEM_PROMPT_OVERRIDE:-}"
47+
if [[ -n "$CODEX_SYSTEM_PROMPT_OVERRIDE_FILE" && -r "$CODEX_SYSTEM_PROMPT_OVERRIDE_FILE" ]]; then
48+
MANAGED_LINES="$(cat "$CODEX_SYSTEM_PROMPT_OVERRIDE_FILE")"
49+
elif [[ -n "$CODEX_SYSTEM_PROMPT_OVERRIDE" ]]; then
50+
MANAGED_LINES="$CODEX_SYSTEM_PROMPT_OVERRIDE"
51+
else
52+
MANAGED_LINES="$(cat <<EOF
4853
$PROJECT_LINE
4954
$WORKSPACES_LINE
5055
$WORKSPACE_INFO_LINE
5156
$FOCUS_LINE
5257
$INTERNET_LINE
5358
$SUBAGENTS_LINE
59+
EOF
60+
)"
61+
fi
62+
if [[ ! -f "$AGENTS_PATH" ]]; then
63+
MANAGED_BLOCK="$(cat <<EOF
64+
$MANAGED_START
65+
$MANAGED_LINES
5466
$MANAGED_END
5567
EOF
5668
)"
@@ -64,12 +76,7 @@ fi
6476
if [[ -f "$AGENTS_PATH" ]]; then
6577
MANAGED_BLOCK="$(cat <<EOF
6678
$MANAGED_START
67-
$PROJECT_LINE
68-
$WORKSPACES_LINE
69-
$WORKSPACE_INFO_LINE
70-
$FOCUS_LINE
71-
$INTERNET_LINE
72-
$SUBAGENTS_LINE
79+
$MANAGED_LINES
7380
$MANAGED_END
7481
EOF
7582
)"

packages/lib/src/core/templates-entrypoint/claude-extra-config.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,9 @@ elif [[ "$REPO_REF_VALUE" == refs/pull/*/head ]]; then
4040
fi
4141
fi
4242
43-
if [[ "$CLAUDE_AUTO_SYSTEM_PROMPT" == "1" ]]; then
44-
mkdir -p "$(dirname "$CLAUDE_GLOBAL_PROMPT_FILE")"
45-
chown 1000:1000 "$(dirname "$CLAUDE_GLOBAL_PROMPT_FILE")" 2>/dev/null || true
46-
if [[ ! -f "$CLAUDE_GLOBAL_PROMPT_FILE" ]] || grep -q "^<!-- docker-git-managed:claude-md -->$" "$CLAUDE_GLOBAL_PROMPT_FILE"; then
47-
cat <<EOF > "$CLAUDE_GLOBAL_PROMPT_FILE"
48-
<!-- docker-git-managed:claude-md -->
43+
CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE="${"$"}{CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE:-}"
44+
CLAUDE_SYSTEM_PROMPT_OVERRIDE="${"$"}{CLAUDE_SYSTEM_PROMPT_OVERRIDE:-}"
45+
CLAUDE_DEFAULT_PROMPT_BODY="$(cat <<EOF
4946
Ты автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, bun, codex, opencode, oh-my-opencode, sshpass, claude, git, node и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~
5047
Рабочая папка проекта (git clone): __TARGET_DIR__
5148
Доступные workspace пути: __TARGET_DIR__
@@ -54,6 +51,23 @@ $CLAUDE_WORKSPACE_CONTEXT
5451
Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.
5552
Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.
5653
Если ты видишь файлы AGENTS.md или CLAUDE.md внутри проекта, ты обязан их читать и соблюдать инструкции.
54+
EOF
55+
)"
56+
if [[ -n "$CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE" && -r "$CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE" ]]; then
57+
CLAUDE_PROMPT_BODY="$(cat "$CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE")"
58+
elif [[ -n "$CLAUDE_SYSTEM_PROMPT_OVERRIDE" ]]; then
59+
CLAUDE_PROMPT_BODY="$CLAUDE_SYSTEM_PROMPT_OVERRIDE"
60+
else
61+
CLAUDE_PROMPT_BODY="$CLAUDE_DEFAULT_PROMPT_BODY"
62+
fi
63+
64+
if [[ "$CLAUDE_AUTO_SYSTEM_PROMPT" == "1" ]]; then
65+
mkdir -p "$(dirname "$CLAUDE_GLOBAL_PROMPT_FILE")"
66+
chown 1000:1000 "$(dirname "$CLAUDE_GLOBAL_PROMPT_FILE")" 2>/dev/null || true
67+
if [[ ! -f "$CLAUDE_GLOBAL_PROMPT_FILE" ]] || grep -q "^<!-- docker-git-managed:claude-md -->$" "$CLAUDE_GLOBAL_PROMPT_FILE"; then
68+
cat <<EOF > "$CLAUDE_GLOBAL_PROMPT_FILE"
69+
<!-- docker-git-managed:claude-md -->
70+
$CLAUDE_PROMPT_BODY
5771
<!-- /docker-git-managed:claude-md -->
5872
EOF
5973
chmod 0644 "$CLAUDE_GLOBAL_PROMPT_FILE" || true

packages/lib/src/core/templates-entrypoint/codex.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,22 @@ docker_git_sync_project_codex_skills() {
163163
fi
164164
done
165165
166+
# Extra entries via CODEX_EXTRA_SKILLS_PATHS (comma- or newline-separated "prio-name::relative/path").
167+
local extra_specs="${"$"}{CODEX_EXTRA_SKILLS_PATHS:-}"
168+
if [[ -n "$extra_specs" ]]; then
169+
extra_specs="${"$"}{extra_specs//,/$'\n'}"
170+
while IFS= read -r spec; do
171+
[[ -z "$spec" ]] && continue
172+
mount_name="${"$"}{spec%%::*}"
173+
relative_path="${"$"}{spec#*::}"
174+
if [[ -d "$project_dir/$relative_path" ]]; then
175+
ln -sfn "$project_dir/$relative_path" "$project_skills_root/$mount_name"
176+
chown -h 1000:1000 "$project_skills_root/$mount_name" 2>/dev/null || true
177+
linked=1
178+
fi
179+
done <<< "$extra_specs"
180+
fi
181+
166182
chown 1000:1000 "$codex_home/skills" "$project_skills_root" 2>/dev/null || true
167183
168184
if [[ "$linked" -eq 1 ]]; then

packages/lib/src/core/templates-entrypoint/gemini.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,8 +264,9 @@ elif [[ "$REPO_REF" == refs/pull/*/head ]]; then
264264
fi
265265
fi
266266
267-
cat <<EOF > "$GEMINI_MD_PATH"
268-
<!-- docker-git-managed:gemini-md -->
267+
GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE="${"$"}{GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE:-}"
268+
GEMINI_SYSTEM_PROMPT_OVERRIDE="${"$"}{GEMINI_SYSTEM_PROMPT_OVERRIDE:-}"
269+
GEMINI_DEFAULT_PROMPT_BODY="$(cat <<EOF
269270
Ты автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, bun, codex, gemini, claude, opencode, oh-my-opencode, sshpass, git, node и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~
270271
Рабочая папка проекта (git clone): __TARGET_DIR__
271272
Доступные workspace пути: __TARGET_DIR__
@@ -274,6 +275,19 @@ $GEMINI_WORKSPACE_CONTEXT
274275
Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.
275276
Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.
276277
Если ты видишь файлы AGENTS.md, GEMINI.md или CLAUDE.md внутри проекта, ты обязан их читать и соблюдать инструкции.
278+
EOF
279+
)"
280+
if [[ -n "$GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE" && -r "$GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE" ]]; then
281+
GEMINI_PROMPT_BODY="$(cat "$GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE")"
282+
elif [[ -n "$GEMINI_SYSTEM_PROMPT_OVERRIDE" ]]; then
283+
GEMINI_PROMPT_BODY="$GEMINI_SYSTEM_PROMPT_OVERRIDE"
284+
else
285+
GEMINI_PROMPT_BODY="$GEMINI_DEFAULT_PROMPT_BODY"
286+
fi
287+
288+
cat <<EOF > "$GEMINI_MD_PATH"
289+
<!-- docker-git-managed:gemini-md -->
290+
$GEMINI_PROMPT_BODY
277291
<!-- /docker-git-managed:gemini-md -->
278292
EOF
279293
chown 1000:1000 "$GEMINI_MD_PATH" || true`

packages/lib/tests/core/templates.test.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,40 @@ describe("renderEntrypoint auth bridge", () => {
201201
expect(entrypoint.split("Для решения задач обязательно используй subagents.").length - 1).toBeGreaterThanOrEqual(2)
202202
})
203203

204+
it("renders system-prompt override hooks for codex/claude/gemini", () => {
205+
const entrypoint = renderAuthEntrypoint()
206+
207+
expectContainsAll(entrypoint, [
208+
"CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE=\"${CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE:-}\"",
209+
"CLAUDE_SYSTEM_PROMPT_OVERRIDE=\"${CLAUDE_SYSTEM_PROMPT_OVERRIDE:-}\"",
210+
"if [[ -n \"$CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE\" && -r \"$CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE\" ]]; then",
211+
"CLAUDE_PROMPT_BODY=\"$(cat \"$CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE\")\"",
212+
"CLAUDE_PROMPT_BODY=\"$CLAUDE_SYSTEM_PROMPT_OVERRIDE\"",
213+
"CLAUDE_PROMPT_BODY=\"$CLAUDE_DEFAULT_PROMPT_BODY\"",
214+
"CODEX_SYSTEM_PROMPT_OVERRIDE_FILE=\"${CODEX_SYSTEM_PROMPT_OVERRIDE_FILE:-}\"",
215+
"CODEX_SYSTEM_PROMPT_OVERRIDE=\"${CODEX_SYSTEM_PROMPT_OVERRIDE:-}\"",
216+
"MANAGED_LINES=\"$(cat \"$CODEX_SYSTEM_PROMPT_OVERRIDE_FILE\")\"",
217+
"MANAGED_LINES=\"$CODEX_SYSTEM_PROMPT_OVERRIDE\"",
218+
"GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE=\"${GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE:-}\"",
219+
"GEMINI_SYSTEM_PROMPT_OVERRIDE=\"${GEMINI_SYSTEM_PROMPT_OVERRIDE:-}\"",
220+
"GEMINI_PROMPT_BODY=\"$(cat \"$GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE\")\"",
221+
"GEMINI_PROMPT_BODY=\"$GEMINI_SYSTEM_PROMPT_OVERRIDE\"",
222+
"GEMINI_PROMPT_BODY=\"$GEMINI_DEFAULT_PROMPT_BODY\""
223+
])
224+
})
225+
226+
it("renders extra-skills hook for the codex skill sync function", () => {
227+
const entrypoint = renderAuthEntrypoint()
228+
229+
expectContainsAll(entrypoint, [
230+
"local extra_specs=\"${CODEX_EXTRA_SKILLS_PATHS:-}\"",
231+
"if [[ -n \"$extra_specs\" ]]; then",
232+
"extra_specs=\"${extra_specs//,/$'\\n'}\"",
233+
"while IFS= read -r spec; do",
234+
"done <<< \"$extra_specs\""
235+
])
236+
})
237+
204238
it("renders terminal recovery hooks and disables zsh autosuggestions by default", () => {
205239
const entrypoint = renderAuthEntrypoint()
206240

0 commit comments

Comments
 (0)