Skip to content

Commit ca250b8

Browse files
committed
feat(core): use public api url in managed prompts
1 parent e92f0c3 commit ca250b8

9 files changed

Lines changed: 79 additions & 3 deletions

File tree

docker-compose.api.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ services:
66
container_name: docker-git-api
77
environment:
88
DOCKER_GIT_API_PORT: ${DOCKER_GIT_API_PORT:-3334}
9+
DOCKER_GIT_API_PUBLIC_URL: ${DOCKER_GIT_API_PUBLIC_URL:-}
910
DOCKER_GIT_PROJECTS_ROOT: ${DOCKER_GIT_PROJECTS_ROOT:-/home/dev/.docker-git}
1011
DOCKER_GIT_FEDERATION_PUBLIC_ORIGIN: ${DOCKER_GIT_FEDERATION_PUBLIC_ORIGIN:-}
1112
DOCKER_GIT_FEDERATION_ACTOR: ${DOCKER_GIT_FEDERATION_ACTOR:-docker-git}

packages/api/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ Optional env:
3535

3636
- `DOCKER_GIT_API_BIND_HOST` (default: `127.0.0.1`)
3737
- `DOCKER_GIT_API_PORT` (default: `3334`)
38+
- `DOCKER_GIT_API_PUBLIC_URL` (optional public base URL for prompts and externally visible API links)
3839
- `DOCKER_GIT_PROJECTS_ROOT_HOST` (host path with docker-git projects, default: `/home/dev/.docker-git`)
3940
- `DOCKER_GIT_PROJECTS_ROOT` (container path, default: `/home/dev/.docker-git`)
4041
- `DOCKER_GIT_FEDERATION_PUBLIC_ORIGIN` (optional public ActivityPub origin)

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,20 @@ 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("DOCKER_GIT_API_PUBLIC_URL=\"${DOCKER_GIT_API_PUBLIC_URL:-}\"")
83+
expect(entrypoint).toContain(
84+
"docker_git_upsert_ssh_env \"DOCKER_GIT_API_PUBLIC_URL\" \"$DOCKER_GIT_API_PUBLIC_URL\""
85+
)
86+
expect(entrypoint).toContain(
87+
"PUBLIC_API_USAGE_LINE=\"Если пользователь просит ссылку на docker-git API или просит выполнить API-вызов, используй только публичный API адрес выше. Никогда не подставляй localhost/127.0.0.1.\""
88+
)
89+
expect(entrypoint).toContain("Публичный API docker-git: не задан.")
90+
expect(entrypoint).toContain(
91+
"AGENT_API_PROMPT=\" When mentioning or calling the docker-git API, use the public URL $DOCKER_GIT_API_PUBLIC_URL and never localhost/127.0.0.1.\""
92+
)
93+
expect(entrypoint).toContain(
94+
"AGENT_API_PROMPT=\" Do not invent localhost/127.0.0.1 links for the docker-git API.\""
95+
)
8296
expect(entrypoint).toContain(
8397
"SUBAGENTS_LINE=\"Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.\""
8498
)

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,23 @@ const indentBlock = (block: string, size = 2): string => {
1414

1515
const renderAgentPrompt = (): string =>
1616
String.raw`AGENT_PROMPT=""
17+
AGENT_API_PROMPT=""
1718
ISSUE_NUM=""
1819
if [[ "$REPO_REF" =~ ^issue-([0-9]+)$ ]]; then
1920
ISSUE_NUM="${"${"}BASH_REMATCH[1]}"
2021
fi
2122
23+
if [[ -n "${"$"}{DOCKER_GIT_API_PUBLIC_URL:-}" ]]; then
24+
AGENT_API_PROMPT=" When mentioning or calling the docker-git API, use the public URL ${"$"}DOCKER_GIT_API_PUBLIC_URL and never localhost/127.0.0.1."
25+
else
26+
AGENT_API_PROMPT=" Do not invent localhost/127.0.0.1 links for the docker-git API."
27+
fi
28+
2229
if [[ "$AGENT_AUTO" == "1" ]]; then
2330
if [[ -n "$ISSUE_NUM" ]]; then
24-
AGENT_PROMPT="Read GitHub issue #$ISSUE_NUM for this repository (use gh issue view $ISSUE_NUM). Implement the requested changes, commit them, create a PR that closes #$ISSUE_NUM, and push it."
31+
AGENT_PROMPT="Read GitHub issue #$ISSUE_NUM for this repository (use gh issue view $ISSUE_NUM). Implement the requested changes, commit them, create a PR that closes #$ISSUE_NUM, and push it.$AGENT_API_PROMPT"
2532
else
26-
AGENT_PROMPT="Analyze this repository, implement any pending tasks, commit changes, create a PR, and push it."
33+
AGENT_PROMPT="Analyze this repository, implement any pending tasks, commit changes, create a PR, and push it.$AGENT_API_PROMPT"
2734
fi
2835
fi`
2936

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ GIT_USER_EMAIL="\${GIT_USER_EMAIL:-}"
2626
CODEX_AUTO_UPDATE="\${CODEX_AUTO_UPDATE:-1}"
2727
AGENT_MODE="\${AGENT_MODE:-}"
2828
AGENT_AUTO="\${AGENT_AUTO:-}"
29+
DOCKER_GIT_API_PUBLIC_URL="\${DOCKER_GIT_API_PUBLIC_URL:-}"
2930
MCP_PLAYWRIGHT_ENABLE="\${MCP_PLAYWRIGHT_ENABLE:-${config.enableMcpPlaywright ? "1" : "0"}}"
3031
MCP_PLAYWRIGHT_CDP_ENDPOINT="\${MCP_PLAYWRIGHT_CDP_ENDPOINT:-}"
3132
MCP_PLAYWRIGHT_ISOLATED="\${MCP_PLAYWRIGHT_ISOLATED:-1}"
@@ -49,7 +50,9 @@ docker_git_upsert_ssh_env() {
4950
printf "%s\n" "$key=$value" >> "$SSH_ENV_PATH"
5051
chmod 600 "$SSH_ENV_PATH" || true
5152
chown 1000:1000 "$SSH_ENV_PATH" || true
52-
}`
53+
}
54+
55+
docker_git_upsert_ssh_env "DOCKER_GIT_API_PUBLIC_URL" "$DOCKER_GIT_API_PUBLIC_URL"`
5356

5457
export const renderEntrypointPackageCache = (config: TemplateConfig): string =>
5558
`# Share package manager caches across all docker-git containers

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ CLAUDE_AUTO_SYSTEM_PROMPT="${"$"}{CLAUDE_AUTO_SYSTEM_PROMPT:-1}"
77
CLAUDE_WORKSPACE_CONTEXT="Контекст workspace: repository"
88
REPO_REF_VALUE="${"$"}{REPO_REF:-__REPO_REF_DEFAULT__}"
99
REPO_URL_VALUE="${"$"}{REPO_URL:-__REPO_URL_DEFAULT__}"
10+
CLAUDE_PUBLIC_API_URL_VALUE="${"$"}{DOCKER_GIT_API_PUBLIC_URL:-}"
11+
CLAUDE_PUBLIC_API_LINE="Публичный API docker-git: не задан."
12+
CLAUDE_PUBLIC_API_USAGE_LINE="Если пользователь просит ссылку на docker-git API или просит выполнить API-вызов, используй только публичный API адрес выше. Никогда не подставляй localhost/127.0.0.1."
13+
14+
if [[ -n "$CLAUDE_PUBLIC_API_URL_VALUE" ]]; then
15+
CLAUDE_PUBLIC_API_LINE="Публичный API docker-git: $CLAUDE_PUBLIC_API_URL_VALUE"
16+
fi
1017
1118
if [[ "$REPO_REF_VALUE" == issue-* ]]; then
1219
ISSUE_ID_VALUE="$(printf "%s" "$REPO_REF_VALUE" | sed -E 's#^issue-##')"
@@ -52,6 +59,8 @@ if [[ "$CLAUDE_AUTO_SYSTEM_PROMPT" == "1" ]]; then
5259
$CLAUDE_WORKSPACE_CONTEXT
5360
Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: __TARGET_DIR__
5461
Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.
62+
$CLAUDE_PUBLIC_API_LINE
63+
$CLAUDE_PUBLIC_API_USAGE_LINE
5564
Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.
5665
Если ты видишь файлы AGENTS.md или CLAUDE.md внутри проекта, ты обязан их читать и соблюдать инструкции.
5766
<!-- /docker-git-managed:claude-md -->

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,13 @@ WORKSPACES_LINE="Доступные workspace пути: __TARGET_DIR__"
129129
WORKSPACE_INFO_LINE="Контекст workspace: repository"
130130
FOCUS_LINE="Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: __TARGET_DIR__"
131131
INTERNET_LINE="Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе."
132+
PUBLIC_API_URL_VALUE="${"$"}{DOCKER_GIT_API_PUBLIC_URL:-}"
133+
PUBLIC_API_LINE="Публичный API docker-git: не задан."
134+
PUBLIC_API_USAGE_LINE="Если пользователь просит ссылку на docker-git API или просит выполнить API-вызов, используй только публичный API адрес выше. Никогда не подставляй localhost/127.0.0.1."
132135
SUBAGENTS_LINE="Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю."
136+
if [[ -n "$PUBLIC_API_URL_VALUE" ]]; then
137+
PUBLIC_API_LINE="Публичный API docker-git: $PUBLIC_API_URL_VALUE"
138+
fi
133139
if [[ "$REPO_REF" == issue-* ]]; then
134140
ISSUE_ID="$(printf "%s" "$REPO_REF" | sed -E 's#^issue-##')"
135141
ISSUE_URL=""
@@ -171,6 +177,8 @@ $WORKSPACES_LINE
171177
$WORKSPACE_INFO_LINE
172178
$FOCUS_LINE
173179
$INTERNET_LINE
180+
$PUBLIC_API_LINE
181+
$PUBLIC_API_USAGE_LINE
174182
$SUBAGENTS_LINE
175183
$MANAGED_END
176184
EOF
@@ -190,6 +198,8 @@ $WORKSPACES_LINE
190198
$WORKSPACE_INFO_LINE
191199
$FOCUS_LINE
192200
$INTERNET_LINE
201+
$PUBLIC_API_LINE
202+
$PUBLIC_API_USAGE_LINE
193203
$SUBAGENTS_LINE
194204
$MANAGED_END
195205
EOF
@@ -210,6 +220,8 @@ EOF
210220
-e '/^Фокус задачи:/d' \
211221
-e '/^Issue AGENTS.md:/d' \
212222
-e '/^Доступ к интернету:/d' \
223+
-e '/^Публичный API docker-git:/d' \
224+
-e '/^Если пользователь просит ссылку на docker-git API или просит выполнить API-вызов,/d' \
213225
-e '/^Для решения задач обязательно используй subagents[.]/d' \
214226
"$AGENTS_PATH" > "$TMP_AGENTS_PATH"
215227
if [[ -s "$TMP_AGENTS_PATH" ]]; then

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,12 @@ docker_git_upsert_ssh_env "GEMINI_CLI_APPROVAL_MODE" "yolo"`
232232
const entrypointGeminiNoticeTemplate = String.raw`# Ensure global GEMINI.md exists for container context
233233
GEMINI_MD_PATH="__GEMINI_HOME__/GEMINI.md"
234234
GEMINI_WORKSPACE_CONTEXT="Контекст workspace: repository"
235+
GEMINI_PUBLIC_API_URL_VALUE="${"$"}{DOCKER_GIT_API_PUBLIC_URL:-}"
236+
GEMINI_PUBLIC_API_LINE="Публичный API docker-git: не задан."
237+
GEMINI_PUBLIC_API_USAGE_LINE="Если пользователь просит ссылку на docker-git API или просит выполнить API-вызов, используй только публичный API адрес выше. Никогда не подставляй localhost/127.0.0.1."
238+
if [[ -n "$GEMINI_PUBLIC_API_URL_VALUE" ]]; then
239+
GEMINI_PUBLIC_API_LINE="Публичный API docker-git: $GEMINI_PUBLIC_API_URL_VALUE"
240+
fi
235241
if [[ "$REPO_REF" == issue-* ]]; then
236242
ISSUE_ID="$(printf "%s" "$REPO_REF" | sed -E 's#^issue-##')"
237243
ISSUE_URL=""
@@ -272,6 +278,8 @@ cat <<EOF > "$GEMINI_MD_PATH"
272278
$GEMINI_WORKSPACE_CONTEXT
273279
Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: __TARGET_DIR__
274280
Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.
281+
$GEMINI_PUBLIC_API_LINE
282+
$GEMINI_PUBLIC_API_USAGE_LINE
275283
Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю.
276284
Если ты видишь файлы AGENTS.md, GEMINI.md или CLAUDE.md внутри проекта, ты обязан их читать и соблюдать инструкции.
277285
<!-- /docker-git-managed:gemini-md -->

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { readFileSync } from "node:fs"
12
import { describe, expect, it } from "@effect/vitest"
23

34
import { defaultTemplateConfig, type TemplateConfig } from "../../src/core/domain.js"
@@ -46,6 +47,17 @@ describe("renderEntrypointDnsRepair", () => {
4647
expect(dnsRepairIndex).toBeGreaterThanOrEqual(0)
4748
expect(packageCacheIndex).toBeGreaterThan(dnsRepairIndex)
4849
})
50+
51+
it("renders public API guidance in managed prompts without localhost fallback links", () => {
52+
const entrypoint = renderEntrypoint(makeTemplateConfig())
53+
54+
expect(entrypoint).toContain("DOCKER_GIT_API_PUBLIC_URL=\"${DOCKER_GIT_API_PUBLIC_URL:-}\"")
55+
expect(entrypoint).toContain('PUBLIC_API_URL_VALUE="${DOCKER_GIT_API_PUBLIC_URL:-}"')
56+
expect(entrypoint).toContain("Публичный API docker-git: не задан.")
57+
expect(entrypoint).toContain(
58+
"Если пользователь просит ссылку на docker-git API или просит выполнить API-вызов, используй только публичный API адрес выше. Никогда не подставляй localhost/127.0.0.1."
59+
)
60+
})
4961
})
5062

5163
describe("renderEntrypointGitHooks", () => {
@@ -109,4 +121,13 @@ describe("renderDockerCompose", () => {
109121
expect(browserDnsIndex).toBeGreaterThan(browserServiceIndex)
110122
expect((compose.match(/\n dns:\n/g) ?? []).length).toBe(2)
111123
})
124+
125+
it("passes through the public API URL to the api compose service", () => {
126+
const apiCompose = readFileSync(
127+
new URL("../../../../docker-compose.api.yml", import.meta.url),
128+
"utf8"
129+
)
130+
131+
expect(apiCompose).toContain("DOCKER_GIT_API_PUBLIC_URL: ${DOCKER_GIT_API_PUBLIC_URL:-}")
132+
})
112133
})

0 commit comments

Comments
 (0)