Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
533 changes: 533 additions & 0 deletions experiments/render-examples-output.txt

Large diffs are not rendered by default.

40 changes: 40 additions & 0 deletions experiments/render-examples.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { writeFileSync } from "node:fs"
import { defaultTemplateConfig } from "../packages/lib/dist/core/domain.js"
import { renderClaudeGlobalPromptSetup } from "../packages/lib/dist/core/templates-entrypoint/claude-extra-config.js"
import { renderEntrypointAgentsNotice } from "../packages/lib/dist/core/templates-entrypoint/agents-notice.js"
import { renderEntrypointProjectCodexSkillsSync } from "../packages/lib/dist/core/templates-entrypoint/codex.js"
import { renderEntrypointGeminiConfig } from "../packages/lib/dist/core/templates-entrypoint/gemini.js"

const cfg = {
...defaultTemplateConfig,
repoUrl: "https://github.com/ProverCoderAI/docker-git.git",
containerName: "dg-docker-git",
serviceName: "dg-docker-git",
sshUser: "dev",
targetDir: "/home/dev/workspaces/ProverCoderAI/docker-git/issue-237",
volumeName: "dg-docker-git-home",
dockerGitPath: "/home/dev/.docker-git",
authorizedKeysPath: "/home/dev/.docker-git/authorized_keys",
envGlobalPath: "/home/dev/.docker-git/.orch/env/global.env",
envProjectPath: "/home/dev/workspaces/ProverCoderAI/docker-git/issue-237/.orch/env/project.env",
codexAuthPath: "/home/dev/.docker-git/.orch/auth/codex",
codexSharedAuthPath: "/home/dev/.docker-git/.orch/auth/codex-shared",
geminiAuthPath: "/home/dev/.docker-git/.orch/auth/gemini",
repoRef: "issue-237"
}

const banner = (title) => `\n${"=".repeat(80)}\n${title}\n${"=".repeat(80)}\n`

const output = [
banner("CLAUDE.md prompt setup (~/.claude/CLAUDE.md)"),
renderClaudeGlobalPromptSetup(cfg),
banner(".codex/AGENTS.md prompt setup"),
renderEntrypointAgentsNotice(cfg),
banner("GEMINI.md prompt setup (full Gemini config block)"),
renderEntrypointGeminiConfig(cfg),
banner("Codex project skills sync (with CODEX_EXTRA_SKILLS_PATHS support)"),
renderEntrypointProjectCodexSkillsSync(cfg)
].join("\n")

writeFileSync("experiments/render-examples-output.txt", output)
console.log(`Wrote ${output.length} chars`)
44 changes: 44 additions & 0 deletions experiments/render-examples.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { defaultTemplateConfig, type TemplateConfig } from "../packages/lib/src/core/domain.ts"
import { renderClaudeGlobalPromptSetup } from "../packages/lib/src/core/templates-entrypoint/claude-extra-config.ts"
import { renderEntrypointAgentsNotice } from "../packages/lib/src/core/templates-entrypoint/agents-notice.ts"
import {
renderEntrypointProjectCodexSkillsSync
} from "../packages/lib/src/core/templates-entrypoint/codex.ts"
import { renderEntrypointGeminiConfig } from "../packages/lib/src/core/templates-entrypoint/gemini.ts"

const cfg: TemplateConfig = {
...defaultTemplateConfig,
repoUrl: "https://github.com/ProverCoderAI/docker-git.git",
containerName: "dg-docker-git",
serviceName: "dg-docker-git",
sshUser: "dev",
targetDir: "/home/dev/workspaces/ProverCoderAI/docker-git/issue-237",
volumeName: "dg-docker-git-home",
dockerGitPath: "/home/dev/.docker-git",
authorizedKeysPath: "/home/dev/.docker-git/authorized_keys",
envGlobalPath: "/home/dev/.docker-git/.orch/env/global.env",
envProjectPath: "/home/dev/workspaces/ProverCoderAI/docker-git/issue-237/.orch/env/project.env",
codexAuthPath: "/home/dev/.docker-git/.orch/auth/codex",
codexSharedAuthPath: "/home/dev/.docker-git/.orch/auth/codex-shared",
geminiAuthPath: "/home/dev/.docker-git/.orch/auth/gemini",
repoRef: "issue-237"
}

import { writeFileSync } from "node:fs"

const banner = (title: string): string =>
`\n${"=".repeat(80)}\n${title}\n${"=".repeat(80)}\n`

const output = [
banner("CLAUDE.md prompt setup (~/.claude/CLAUDE.md)"),
renderClaudeGlobalPromptSetup(cfg),
banner(".codex/AGENTS.md prompt setup"),
renderEntrypointAgentsNotice(cfg),
banner("GEMINI.md prompt setup (full Gemini config block)"),
renderEntrypointGeminiConfig(cfg),
banner("Codex project skills sync (with CODEX_EXTRA_SKILLS_PATHS support)"),
renderEntrypointProjectCodexSkillsSync(cfg)
].join("\n")

writeFileSync("experiments/render-examples-output.txt", output)
console.log(`Wrote ${output.length} bytes to experiments/render-examples-output.txt`)
165 changes: 165 additions & 0 deletions experiments/ui-examples.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
# Container UI examples (issue #237)

These are the rendered files that the user sees inside a running container after
the entrypoint executes. The new `*_SYSTEM_PROMPT_OVERRIDE` and
`*_SYSTEM_PROMPT_OVERRIDE_FILE` env vars (plus `CODEX_EXTRA_SKILLS_PATHS`) let
operators replace the body of any of these files without forking the templates.

---

## 1. Default behaviour (no overrides set)

Container env: `CLAUDE_AUTO_SYSTEM_PROMPT=1` (default), no override vars.

### `~/.claude/CLAUDE.md`

```markdown
<!-- docker-git-managed:claude-md -->
Ты автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, bun, codex, opencode, oh-my-opencode, sshpass, claude, git, node и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~
Рабочая папка проекта (git clone): /home/dev/workspaces/ProverCoderAI/docker-git/issue-237
Доступные workspace пути: /home/dev/workspaces/ProverCoderAI/docker-git/issue-237
Контекст workspace: issue #237 (https://github.com/ProverCoderAI/docker-git/issues/237)
Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: /home/dev/workspaces/ProverCoderAI/docker-git/issue-237
Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.
Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.
Если ты видишь файлы AGENTS.md или CLAUDE.md внутри проекта, ты обязан их читать и соблюдать инструкции.
<!-- /docker-git-managed:claude-md -->
```

### `~/.codex/AGENTS.md`

```markdown
Ты автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, bun, codex, opencode, oh-my-opencode, sshpass, git, node и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~
<!-- docker-git:managed:start -->
Рабочая папка проекта (git clone): /home/dev/workspaces/ProverCoderAI/docker-git/issue-237
Доступные workspace пути: /home/dev/workspaces/ProverCoderAI/docker-git/issue-237
Контекст workspace: issue #237 (https://github.com/ProverCoderAI/docker-git/issues/237)
Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: /home/dev/workspaces/ProverCoderAI/docker-git/issue-237
Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.
Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.
<!-- docker-git:managed:end -->
Если ты видишь файлы AGENTS.md внутри проекта, ты обязан их читать и соблюдать инструкции.
```

### `~/.gemini/GEMINI.md`

```markdown
<!-- docker-git-managed:gemini-md -->
Ты автономный агент Gemini, у тебя есть доступ к sudo, gh, gemini-cli, bun, git, node и всем остальным. Проекты с которыми идёт работа лежат по пути ~
Рабочая папка проекта (git clone): /home/dev/workspaces/ProverCoderAI/docker-git/issue-237
Доступные workspace пути: /home/dev/workspaces/ProverCoderAI/docker-git/issue-237
Контекст workspace: issue #237 (https://github.com/ProverCoderAI/docker-git/issues/237)
Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: /home/dev/workspaces/ProverCoderAI/docker-git/issue-237
Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.
Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.
<!-- /docker-git-managed:gemini-md -->
```

### `ls ~/.codex/skills/.docker-git-project/` (no extra skills)

```
20-agents-skills -> /home/dev/workspaces/ProverCoderAI/docker-git/issue-237/.agents/skills
```

---

## 2. Inline override via `CLAUDE_SYSTEM_PROMPT_OVERRIDE`

Container env (in `.orch/env/project.env`):

```bash
CLAUDE_SYSTEM_PROMPT_OVERRIDE="You are a senior reviewer. Be terse. Only modify files in /home/dev/workspaces/ProverCoderAI/docker-git/issue-237."
```

### `~/.claude/CLAUDE.md`

```markdown
<!-- docker-git-managed:claude-md -->
You are a senior reviewer. Be terse. Only modify files in /home/dev/workspaces/ProverCoderAI/docker-git/issue-237.
<!-- /docker-git-managed:claude-md -->
```

The managed-block markers are preserved, so the next container restart still
detects the file as docker-git-managed and refreshes it idempotently.

---

## 3. File override via `CODEX_SYSTEM_PROMPT_OVERRIDE_FILE`

```bash
# .orch/env/project.env
CODEX_SYSTEM_PROMPT_OVERRIDE_FILE=/home/dev/.docker-git/prompts/codex.txt
```

```bash
# /home/dev/.docker-git/prompts/codex.txt
You are running inside docker-git. Workspace: /home/dev/workspaces/ProverCoderAI/docker-git/issue-237.
Always start by running `git status` and `gh issue view 237`.
```

### `~/.codex/AGENTS.md` (managed lines replaced)

```markdown
Ты автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, bun, codex, opencode, oh-my-opencode, sshpass, git, node и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~
<!-- docker-git:managed:start -->
You are running inside docker-git. Workspace: /home/dev/workspaces/ProverCoderAI/docker-git/issue-237.
Always start by running `git status` and `gh issue view 237`.
<!-- docker-git:managed:end -->
Если ты видишь файлы AGENTS.md внутри проекта, ты обязан их читать и соблюдать инструкции.
```

`*_OVERRIDE_FILE` always wins over `*_OVERRIDE`. If neither is set, the default
content above is used.

---

## 4. Extra skills via `CODEX_EXTRA_SKILLS_PATHS`

```bash
# .orch/env/project.env
CODEX_EXTRA_SKILLS_PATHS="50-team-skills::team/skills,60-shared-rituals::infra/codex/rituals"
```

Project layout:

```
/home/dev/workspaces/ProverCoderAI/docker-git/issue-237/
├── .agents/skills/...
├── team/skills/...
└── infra/codex/rituals/...
```

### `ls ~/.codex/skills/.docker-git-project/` (extras now mounted)

```
20-agents-skills -> /home/dev/workspaces/ProverCoderAI/docker-git/issue-237/.agents/skills
50-team-skills -> /home/dev/workspaces/ProverCoderAI/docker-git/issue-237/team/skills
60-shared-rituals -> /home/dev/workspaces/ProverCoderAI/docker-git/issue-237/infra/codex/rituals
```

The built-in priority list (`.skills`, `.agents/skills`, `.agents/.skills`,
`.codex/skills`, `.codex/.skills`) is preserved. Extras are appended only when
the relative path exists, so misconfigured entries are silently ignored.

---

## 5. Container terminal session showing the override hooks

```text
dev@dg-docker-git:~$ cat ~/.codex/AGENTS.md | head -3
Ты автономный агент, который имеет полностью все права управления контейнером...
<!-- docker-git:managed:start -->
You are running inside docker-git. Workspace: /home/dev/workspaces/ProverCoderAI/docker-git/issue-237.

dev@dg-docker-git:~$ ls -l ~/.codex/skills/.docker-git-project/
total 0
lrwxrwxrwx 1 dev dev 65 May 5 12:30 20-agents-skills -> /home/dev/workspaces/ProverCoderAI/docker-git/issue-237/.agents/skills
lrwxrwxrwx 1 dev dev 60 May 5 12:30 50-team-skills -> /home/dev/workspaces/ProverCoderAI/docker-git/issue-237/team/skills
lrwxrwxrwx 1 dev dev 64 May 5 12:30 60-shared-rituals -> /home/dev/workspaces/ProverCoderAI/docker-git/issue-237/infra/codex/rituals

dev@dg-docker-git:~$ env | grep -E '_(SYSTEM_PROMPT_OVERRIDE|EXTRA_SKILLS)'
CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE=/home/dev/.docker-git/prompts/claude.txt
CODEX_SYSTEM_PROMPT_OVERRIDE_FILE=/home/dev/.docker-git/prompts/codex.txt
GEMINI_SYSTEM_PROMPT_OVERRIDE=You are running inside docker-git...
CODEX_EXTRA_SKILLS_PATHS=50-team-skills::team/skills,60-shared-rituals::infra/codex/rituals
```
7 changes: 7 additions & 0 deletions packages/app/src/docker-git/cli/usage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,13 @@ Container runtime env (set via .orch/env/project.env):
CODEX_SHARE_AUTH=1|0 Share Codex auth.json across projects (default: 1)
CODEX_AUTO_UPDATE=1|0 Auto-update Codex CLI on container start (default: 1)
CLAUDE_AUTO_SYSTEM_PROMPT=1|0 Auto-attach docker-git managed system prompt to claude (default: 1)
CLAUDE_SYSTEM_PROMPT_OVERRIDE=<text> Custom Claude system prompt body (overrides default Russian template)
CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE=<path> Path to file with custom Claude prompt (takes precedence over OVERRIDE)
CODEX_SYSTEM_PROMPT_OVERRIDE=<text> Custom Codex managed-block content for AGENTS.md
CODEX_SYSTEM_PROMPT_OVERRIDE_FILE=<path> Path to file with custom Codex managed-block content (takes precedence)
GEMINI_SYSTEM_PROMPT_OVERRIDE=<text> Custom Gemini system prompt body
GEMINI_SYSTEM_PROMPT_OVERRIDE_FILE=<path> Path to file with custom Gemini prompt (takes precedence over OVERRIDE)
CODEX_EXTRA_SKILLS_PATHS=<spec>[,<spec>...] Extra skill trees mounted into Codex (format: "prio-name::relative/path"; comma- or newline-separated)
DOCKER_GIT_ZSH_AUTOSUGGEST=1|0 Enable zsh-autosuggestions (default: 0)
DOCKER_GIT_ZSH_AUTOSUGGEST_STYLE=... zsh-autosuggestions highlight style (default: fg=8,italic)
DOCKER_GIT_ZSH_AUTOSUGGEST_STRATEGY=... Suggestion sources (default: history completion)
Expand Down
25 changes: 16 additions & 9 deletions packages/app/src/lib/core/templates-entrypoint/agents-notice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,27 @@ elif [[ "$REPO_REF" == refs/pull/*/head ]]; then
fi
MANAGED_START="<!-- docker-git:managed:start -->"
MANAGED_END="<!-- docker-git:managed:end -->"
if [[ ! -f "$AGENTS_PATH" ]]; then
MANAGED_BLOCK="$(cat <<EOF
$MANAGED_START
CODEX_SYSTEM_PROMPT_OVERRIDE_FILE="${"$"}{CODEX_SYSTEM_PROMPT_OVERRIDE_FILE:-}"
CODEX_SYSTEM_PROMPT_OVERRIDE="${"$"}{CODEX_SYSTEM_PROMPT_OVERRIDE:-}"
if [[ -n "$CODEX_SYSTEM_PROMPT_OVERRIDE_FILE" && -r "$CODEX_SYSTEM_PROMPT_OVERRIDE_FILE" ]]; then
MANAGED_LINES="$(cat "$CODEX_SYSTEM_PROMPT_OVERRIDE_FILE")"
elif [[ -n "$CODEX_SYSTEM_PROMPT_OVERRIDE" ]]; then
MANAGED_LINES="$CODEX_SYSTEM_PROMPT_OVERRIDE"
else
MANAGED_LINES="$(cat <<EOF
$PROJECT_LINE
$WORKSPACES_LINE
$WORKSPACE_INFO_LINE
$FOCUS_LINE
$INTERNET_LINE
$SUBAGENTS_LINE
EOF
)"
fi
if [[ ! -f "$AGENTS_PATH" ]]; then
MANAGED_BLOCK="$(cat <<EOF
$MANAGED_START
$MANAGED_LINES
$MANAGED_END
EOF
)"
Expand All @@ -65,12 +77,7 @@ fi
if [[ -f "$AGENTS_PATH" ]]; then
MANAGED_BLOCK="$(cat <<EOF
$MANAGED_START
$PROJECT_LINE
$WORKSPACES_LINE
$WORKSPACE_INFO_LINE
$FOCUS_LINE
$INTERNET_LINE
$SUBAGENTS_LINE
$MANAGED_LINES
$MANAGED_END
EOF
)"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,9 @@ elif [[ "$REPO_REF_VALUE" == refs/pull/*/head ]]; then
fi
fi

if [[ "$CLAUDE_AUTO_SYSTEM_PROMPT" == "1" ]]; then
mkdir -p "$(dirname "$CLAUDE_GLOBAL_PROMPT_FILE")"
chown 1000:1000 "$(dirname "$CLAUDE_GLOBAL_PROMPT_FILE")" 2>/dev/null || true
if [[ ! -f "$CLAUDE_GLOBAL_PROMPT_FILE" ]] || grep -q "^<!-- docker-git-managed:claude-md -->$" "$CLAUDE_GLOBAL_PROMPT_FILE"; then
cat <<EOF > "$CLAUDE_GLOBAL_PROMPT_FILE"
<!-- docker-git-managed:claude-md -->
CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE="${"$"}{CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE:-}"
CLAUDE_SYSTEM_PROMPT_OVERRIDE="${"$"}{CLAUDE_SYSTEM_PROMPT_OVERRIDE:-}"
CLAUDE_DEFAULT_PROMPT_BODY="$(cat <<EOF
Ты автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, bun, codex, opencode, oh-my-opencode, sshpass, claude, git, node и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~
Рабочая папка проекта (git clone): __TARGET_DIR__
Доступные workspace пути: __TARGET_DIR__
Expand All @@ -55,6 +52,23 @@ $CLAUDE_WORKSPACE_CONTEXT
Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.
Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.
Если ты видишь файлы AGENTS.md или CLAUDE.md внутри проекта, ты обязан их читать и соблюдать инструкции.
EOF
)"
if [[ -n "$CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE" && -r "$CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE" ]]; then
CLAUDE_PROMPT_BODY="$(cat "$CLAUDE_SYSTEM_PROMPT_OVERRIDE_FILE")"
elif [[ -n "$CLAUDE_SYSTEM_PROMPT_OVERRIDE" ]]; then
CLAUDE_PROMPT_BODY="$CLAUDE_SYSTEM_PROMPT_OVERRIDE"
else
CLAUDE_PROMPT_BODY="$CLAUDE_DEFAULT_PROMPT_BODY"
fi

if [[ "$CLAUDE_AUTO_SYSTEM_PROMPT" == "1" ]]; then
mkdir -p "$(dirname "$CLAUDE_GLOBAL_PROMPT_FILE")"
chown 1000:1000 "$(dirname "$CLAUDE_GLOBAL_PROMPT_FILE")" 2>/dev/null || true
if [[ ! -f "$CLAUDE_GLOBAL_PROMPT_FILE" ]] || grep -q "^<!-- docker-git-managed:claude-md -->$" "$CLAUDE_GLOBAL_PROMPT_FILE"; then
cat <<EOF > "$CLAUDE_GLOBAL_PROMPT_FILE"
<!-- docker-git-managed:claude-md -->
$CLAUDE_PROMPT_BODY
<!-- /docker-git-managed:claude-md -->
EOF
chmod 0644 "$CLAUDE_GLOBAL_PROMPT_FILE" || true
Expand Down
16 changes: 16 additions & 0 deletions packages/app/src/lib/core/templates-entrypoint/codex.ts
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,22 @@ docker_git_sync_project_codex_skills() {
fi
done

# Extra entries via CODEX_EXTRA_SKILLS_PATHS (comma- or newline-separated "prio-name::relative/path").
local extra_specs="${"$"}{CODEX_EXTRA_SKILLS_PATHS:-}"
if [[ -n "$extra_specs" ]]; then
extra_specs="${"$"}{extra_specs//,/$'\n'}"
while IFS= read -r spec; do
[[ -z "$spec" ]] && continue
mount_name="${"$"}{spec%%::*}"
relative_path="${"$"}{spec#*::}"
if [[ -d "$project_dir/$relative_path" ]]; then
ln -sfn "$project_dir/$relative_path" "$project_skills_root/$mount_name"
chown -h 1000:1000 "$project_skills_root/$mount_name" 2>/dev/null || true
linked=1
fi
done <<< "$extra_specs"
fi

chown 1000:1000 "$codex_home/skills" "$project_skills_root" 2>/dev/null || true

if [[ "$linked" -eq 1 ]]; then
Expand Down
Loading