Skip to content

Commit 5818250

Browse files
skulidropekclaude
andcommitted
feat(lib): unify system prompt across Claude, Gemini and Codex
Replace per-agent hardcoded prompts with imports from claude-system-prompt.ts (single source of truth): - PROMPT_INTRO / PROMPT_INTERNET / PROMPT_SUBAGENTS / PROMPT_FILES – shared string constants used by Codex's variable-based injection - renderSharedPrompt(workspaceContextBashVar) – builds the full prompt for Claude/Gemini heredoc injection, accepting the per-agent bash variable that resolves the workspace context at container start-up Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 83b23f3 commit 5818250

4 files changed

Lines changed: 54 additions & 28 deletions

File tree

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { TemplateConfig } from "../domain.js"
2-
import { claudeSystemPromptContent } from "./claude-system-prompt.js"
2+
import { renderSharedPrompt } from "./claude-system-prompt.js"
33

44
const entrypointClaudeGlobalPromptTemplate = String
55
.raw`# Claude Code: managed global memory (CLAUDE.md is auto-loaded by Claude Code)
@@ -47,7 +47,7 @@ if [[ "$CLAUDE_AUTO_SYSTEM_PROMPT" == "1" ]]; then
4747
if [[ ! -f "$CLAUDE_GLOBAL_PROMPT_FILE" ]] || grep -q "^<!-- docker-git-managed:claude-md -->$" "$CLAUDE_GLOBAL_PROMPT_FILE"; then
4848
cat <<EOF > "$CLAUDE_GLOBAL_PROMPT_FILE"
4949
<!-- docker-git-managed:claude-md -->
50-
${claudeSystemPromptContent}
50+
${renderSharedPrompt("$CLAUDE_WORKSPACE_CONTEXT")}
5151
<!-- /docker-git-managed:claude-md -->
5252
EOF
5353
chmod 0644 "$CLAUDE_GLOBAL_PROMPT_FILE" || true
Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,48 @@
11
/**
2-
* System prompt injected into ~/.claude/CLAUDE.md inside every container.
2+
* Shared system prompt injected into every agent (Claude, Gemini, Codex).
33
*
4-
* Edit this file to change the global Claude agent behaviour.
5-
* Supported placeholders (replaced at template-render time):
6-
* __TARGET_DIR__ – absolute path to the cloned repo inside the container
7-
* $CLAUDE_WORKSPACE_CONTEXT – bash variable resolved at container start-up
8-
* (set to "repository", "issue #N", or "PR #N")
4+
* Edit this file to change the global agent behaviour across all providers.
5+
*
6+
* Placeholders resolved at TypeScript render time:
7+
* __TARGET_DIR__ – absolute path to the cloned repo inside the container
8+
*
9+
* Placeholders resolved at container start-up (bash):
10+
* workspaceContextBashVar – per-agent bash variable reference passed to
11+
* renderSharedPrompt(), e.g. "$CLAUDE_WORKSPACE_CONTEXT"
12+
*/
13+
14+
export const PROMPT_INTRO =
15+
`Ты автономный агент, который имеет полностью все права управления контейнером. ` +
16+
`У тебя есть доступ к командам sudo, gh, codex, opencode, oh-my-opencode, sshpass, ` +
17+
`claude, gemini, git, node, pnpm и всем остальным другим. ` +
18+
`Проекты с которыми идёт работа лежат по пути ~`
19+
20+
export const PROMPT_INTERNET =
21+
`Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.`
22+
23+
export const PROMPT_SUBAGENTS =
24+
`Для решения задач обязательно используй subagents. ` +
25+
`Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.`
26+
27+
export const PROMPT_FILES =
28+
`Если ты видишь файлы AGENTS.md, GEMINI.md или CLAUDE.md внутри проекта, ты обязан их читать и соблюдать инструкции.`
29+
30+
/**
31+
* Builds the full prompt string for heredoc injection (Claude, Gemini).
32+
*
33+
* @param workspaceContextBashVar – bash variable reference that will be
34+
* interpolated at container start-up, e.g. "$CLAUDE_WORKSPACE_CONTEXT"
35+
*
36+
* __TARGET_DIR__ is left as-is and replaced by each agent's render function.
937
*/
10-
export const claudeSystemPromptContent = `Ты автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, codex, opencode, oh-my-opencode, sshpass, claude, git, node, pnpm и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~
11-
Рабочая папка проекта (git clone): __TARGET_DIR__
12-
Доступные workspace пути: __TARGET_DIR__
13-
$CLAUDE_WORKSPACE_CONTEXT
14-
Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: __TARGET_DIR__
15-
Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.
16-
Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.
17-
Если ты видишь файлы AGENTS.md или CLAUDE.md внутри проекта, ты обязан их читать и соблюдать инструкции.`
38+
export const renderSharedPrompt = (workspaceContextBashVar: string): string =>
39+
[
40+
PROMPT_INTRO,
41+
`Рабочая папка проекта (git clone): __TARGET_DIR__`,
42+
`Доступные workspace пути: __TARGET_DIR__`,
43+
workspaceContextBashVar,
44+
`Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: __TARGET_DIR__`,
45+
PROMPT_INTERNET,
46+
PROMPT_SUBAGENTS,
47+
PROMPT_FILES,
48+
].join("\n")

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { TemplateConfig } from "../domain.js"
2+
import { PROMPT_FILES, PROMPT_INTERNET, PROMPT_INTRO, PROMPT_SUBAGENTS } from "./claude-system-prompt.js"
23

34
export { renderEntrypointCodexResumeHint } from "./codex-resume-hint.js"
45

@@ -128,8 +129,8 @@ PROJECT_LINE="Рабочая папка проекта (git clone): __TARGET_DIR
128129
WORKSPACES_LINE="Доступные workspace пути: __TARGET_DIR__"
129130
WORKSPACE_INFO_LINE="Контекст workspace: repository"
130131
FOCUS_LINE="Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: __TARGET_DIR__"
131-
INTERNET_LINE="Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе."
132-
SUBAGENTS_LINE="Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю."
132+
INTERNET_LINE="${PROMPT_INTERNET}"
133+
SUBAGENTS_LINE="${PROMPT_SUBAGENTS}"
133134
if [[ "$REPO_REF" == issue-* ]]; then
134135
ISSUE_ID="$(printf "%s" "$REPO_REF" | sed -E 's#^issue-##')"
135136
ISSUE_URL=""
@@ -176,9 +177,9 @@ $MANAGED_END
176177
EOF
177178
)"
178179
cat <<EOF > "$AGENTS_PATH"
179-
Ты автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, codex, opencode, oh-my-opencode, sshpass, git, node, pnpm и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~
180+
${PROMPT_INTRO}
180181
$MANAGED_BLOCK
181-
Если ты видишь файлы AGENTS.md внутри проекта, ты обязан их читать и соблюдать инструкции.
182+
${PROMPT_FILES}
182183
EOF
183184
chown 1000:1000 "$AGENTS_PATH" || true
184185
fi

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

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { TemplateConfig } from "../domain.js"
2+
import { renderSharedPrompt } from "./claude-system-prompt.js"
23

34
// CHANGE: add Gemini CLI entrypoint configuration
45
// WHY: enable Gemini CLI in Docker with automated auth, trust settings and MCP
@@ -266,14 +267,7 @@ fi
266267
267268
cat <<EOF > "$GEMINI_MD_PATH"
268269
<!-- docker-git-managed:gemini-md -->
269-
Ты автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, codex, gemini, claude, opencode, oh-my-opencode, sshpass, git, node, pnpm и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~
270-
Рабочая папка проекта (git clone): __TARGET_DIR__
271-
Доступные workspace пути: __TARGET_DIR__
272-
$GEMINI_WORKSPACE_CONTEXT
273-
Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: __TARGET_DIR__
274-
Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.
275-
Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.
276-
Если ты видишь файлы AGENTS.md, GEMINI.md или CLAUDE.md внутри проекта, ты обязан их читать и соблюдать инструкции.
270+
${renderSharedPrompt("$GEMINI_WORKSPACE_CONTEXT")}
277271
<!-- /docker-git-managed:gemini-md -->
278272
EOF
279273
chown 1000:1000 "$GEMINI_MD_PATH" || true`

0 commit comments

Comments
 (0)