Skip to content

Commit d8508c6

Browse files
konardclaude
andcommitted
feat(core): enrich hardcoded system prompts in container templates
Update the code-embedded system prompts that are injected into CLAUDE.md, AGENTS.md, and GEMINI.md when docker-git containers start. Extracts shared behavioral instructions into a new system-prompt-content.ts module and injects them into all three agent templates (claude, codex, gemini). New prompt sections based on issues #96, #101, #78, #41, #54, #92, #90: - Isolated environment awareness - Instrumental behavior (execute, don't guide) - Deep Research process rule - Mandatory subagent delegation with plan mode - Mandatory response contract (status, root cause, changes, verification) - Proof of execution requirements in PRs - Public API usage (no localhost URLs) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 2fff509 commit d8508c6

5 files changed

Lines changed: 73 additions & 11 deletions

File tree

packages/app/tests/docker-git/entrypoint-auth.test.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,10 @@ describe("renderEntrypoint auth bridge", () => {
7979
expect(entrypoint).toContain("CLAUDE_GLOBAL_PROMPT_FILE=\"/home/dev/.claude/CLAUDE.md\"")
8080
expect(entrypoint).toContain("CLAUDE_AUTO_SYSTEM_PROMPT=\"${CLAUDE_AUTO_SYSTEM_PROMPT:-1}\"")
8181
expect(entrypoint).toContain("docker-git-managed:claude-md")
82-
expect(entrypoint).toContain(
83-
"SUBAGENTS_LINE=\"Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.\""
84-
)
85-
expect(entrypoint.split("Для решения задач обязательно используй subagents.").length - 1).toBeGreaterThanOrEqual(
86-
2
87-
)
82+
expect(entrypoint).toContain("BEHAVIOR_BLOCK=")
83+
expect(entrypoint).toContain("SUBAGENTS (ОБЯЗАТЕЛЬНО):")
84+
expect(entrypoint).toContain("ОБЯЗАТЕЛЬНЫЙ КОНТРАКТ ОТВЕТА:")
85+
expect(entrypoint).toContain("DEEP RESEARCH:")
8886
expect(entrypoint).toContain("token=\"${GITHUB_TOKEN:-}\"")
8987
expect(entrypoint).toContain("token=\"${GH_TOKEN:-}\"")
9088
expect(entrypoint).toContain(String.raw`printf "%s\n" "password=$token"`)

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

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

34
const entrypointClaudeGlobalPromptTemplate = String
45
.raw`# Claude Code: managed global memory (CLAUDE.md is auto-loaded by Claude Code)
@@ -52,7 +53,7 @@ if [[ "$CLAUDE_AUTO_SYSTEM_PROMPT" == "1" ]]; then
5253
$CLAUDE_WORKSPACE_CONTEXT
5354
Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: __TARGET_DIR__
5455
Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.
55-
Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.
56+
__SYSTEM_PROMPT_BEHAVIOR__
5657
Если ты видишь файлы AGENTS.md или CLAUDE.md внутри проекта, ты обязан их читать и соблюдать инструкции.
5758
<!-- /docker-git-managed:claude-md -->
5859
EOF
@@ -79,6 +80,7 @@ export const renderClaudeGlobalPromptSetup = (config: TemplateConfig): string =>
7980
.replaceAll("__SSH_USER__", config.sshUser)
8081
.replaceAll("__REPO_REF_DEFAULT__", escapeForDoubleQuotes(config.repoRef))
8182
.replaceAll("__REPO_URL_DEFAULT__", escapeForDoubleQuotes(config.repoUrl))
83+
.replaceAll("__SYSTEM_PROMPT_BEHAVIOR__", systemPromptBehavior)
8284

8385
export const renderClaudeWrapperSetup = (): string =>
8486
String.raw`CLAUDE_WRAPPER_BIN="/usr/local/bin/claude"

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

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

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

@@ -129,7 +130,7 @@ WORKSPACES_LINE="Доступные workspace пути: __TARGET_DIR__"
129130
WORKSPACE_INFO_LINE="Контекст workspace: repository"
130131
FOCUS_LINE="Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: __TARGET_DIR__"
131132
INTERNET_LINE="Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе."
132-
SUBAGENTS_LINE="Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю."
133+
BEHAVIOR_BLOCK="__SYSTEM_PROMPT_BEHAVIOR__"
133134
if [[ "$REPO_REF" == issue-* ]]; then
134135
ISSUE_ID="$(printf "%s" "$REPO_REF" | sed -E 's#^issue-##')"
135136
ISSUE_URL=""
@@ -171,7 +172,7 @@ $WORKSPACES_LINE
171172
$WORKSPACE_INFO_LINE
172173
$FOCUS_LINE
173174
$INTERNET_LINE
174-
$SUBAGENTS_LINE
175+
$BEHAVIOR_BLOCK
175176
$MANAGED_END
176177
EOF
177178
)"
@@ -190,7 +191,7 @@ $WORKSPACES_LINE
190191
$WORKSPACE_INFO_LINE
191192
$FOCUS_LINE
192193
$INTERNET_LINE
193-
$SUBAGENTS_LINE
194+
$BEHAVIOR_BLOCK
194195
$MANAGED_END
195196
EOF
196197
)"
@@ -233,3 +234,4 @@ export const renderEntrypointAgentsNotice = (config: TemplateConfig): string =>
233234
"__SSH_USER__",
234235
config.sshUser
235236
).replaceAll("__TARGET_DIR__", config.targetDir)
237+
.replaceAll("__SYSTEM_PROMPT_BEHAVIOR__", systemPromptBehavior)

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

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

34
// CHANGE: add Gemini CLI entrypoint configuration
45
// WHY: enable Gemini CLI in Docker with automated auth, trust settings and MCP
@@ -272,7 +273,7 @@ cat <<EOF > "$GEMINI_MD_PATH"
272273
$GEMINI_WORKSPACE_CONTEXT
273274
Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: __TARGET_DIR__
274275
Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.
275-
Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.
276+
__SYSTEM_PROMPT_BEHAVIOR__
276277
Если ты видишь файлы AGENTS.md, GEMINI.md или CLAUDE.md внутри проекта, ты обязан их читать и соблюдать инструкции.
277278
<!-- /docker-git-managed:gemini-md -->
278279
EOF
@@ -282,6 +283,7 @@ const renderEntrypointGeminiNotice = (config: TemplateConfig): string =>
282283
entrypointGeminiNoticeTemplate
283284
.replaceAll("__GEMINI_HOME__", config.geminiHome)
284285
.replaceAll("__TARGET_DIR__", config.targetDir)
286+
.replaceAll("__SYSTEM_PROMPT_BEHAVIOR__", systemPromptBehavior)
285287

286288
export const renderEntrypointGeminiConfig = (config: TemplateConfig): string =>
287289
[
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// CHANGE: extract shared system prompt content for all agents (claude, codex, gemini)
2+
// WHY: single source of truth for container-injected system prompt; avoids drift between agents
3+
// REF: issue-189 (unify system prompt from all issue requirements)
4+
// SOURCE: n/a
5+
// PURITY: CORE
6+
// INVARIANT: all agent templates reference the same behavioral instructions
7+
// COMPLEXITY: O(1)
8+
9+
/**
10+
* Behavioral instructions injected into every agent's system prompt file
11+
* (CLAUDE.md, AGENTS.md, GEMINI.md) when a docker-git container starts.
12+
*
13+
* These lines are appended after the identity/workspace context block.
14+
* They must be plain text (no unescaped shell variables or backticks).
15+
*
16+
* @pure true
17+
* @invariant content is static text, no side effects
18+
*/
19+
// CHANGE: enriched prompt with requirements from issues #96, #101, #78, #41, #54, #92, #90, #4
20+
// WHY: user requested comprehensive system prompt based on all prompt-related issues
21+
// QUOTE(ТЗ): "Пройдись по всем моим Issues в которых я писал информацию об промте и составь мне системный промт"
22+
// REF: issue-189
23+
export const systemPromptBehavior = [
24+
"Ты работаешь в изолированном контейнере. Все твои действия безопасны для хост-системы.",
25+
"",
26+
"ИНСТРУМЕНТАЛЬНОЕ ПОВЕДЕНИЕ:",
27+
"- Не предлагай гайды вместо действий. Если можешь выполнить — выполни сам, затем сообщи что сделано.",
28+
"- Всегда начинай с изучения задачи: состояние проекта, существующие паттерны, интеграционные точки.",
29+
"- Всегда завершай верификацией: сборка, тесты, линтеры.",
30+
"- Используй gh CLI для GitHub (issues, PR, CI) вместо браузера.",
31+
"",
32+
"DEEP RESEARCH:",
33+
"В начале работы формулируй вопрос: \"I am looking for code that does <функциональность>, is there existing code?\"",
34+
"Сперва ищи и переиспользуй существующие паттерны (минимальный корректный diff).",
35+
"",
36+
"SUBAGENTS (ОБЯЗАТЕЛЬНО):",
37+
"- Разбивай крупные задачи на подзадачи и делегируй их параллельно через subagents.",
38+
"- Сам агент выполняет финальную проверку, интеграцию и валидацию результата.",
39+
"- При клонировании нового проекта — запускай plan mode: изучи Issues, кодовую базу, сформируй план в PR.",
40+
"",
41+
"ОБЯЗАТЕЛЬНЫЙ КОНТРАКТ ОТВЕТА:",
42+
"Каждый ответ по задаче ОБЯЗАН содержать:",
43+
"1. Статус: что именно сделано (конкретный результат)",
44+
"2. Root Cause (для багов): корневая причина",
45+
"3. Что изменено: список файлов и суть изменений",
46+
"4. Верификация: как проверено (команды, тесты)",
47+
"5. Где проверить: ссылка на PR, коммит, или команда",
48+
"",
49+
"PROOF OF EXECUTION В PR:",
50+
"Каждый PR обязан содержать доказательства выполнения:",
51+
"- UI/UX: скриншоты до/после",
52+
"- API/Backend: вывод команд/тестов, HTTP коды",
53+
"- Bugfix: воспроизведение до и подтверждение после",
54+
"- Performance: метрики до/после",
55+
"",
56+
"ПУБЛИЧНЫЙ API:",
57+
"- Никогда не давай localhost URL. Используй публичный адрес контейнера/сервиса."
58+
].join("\n")

0 commit comments

Comments
 (0)