Skip to content

Commit bd15b81

Browse files
committed
fix(lint): split codex entrypoint templates
1 parent 3e64dcb commit bd15b81

File tree

6 files changed

+128
-119
lines changed

6 files changed

+128
-119
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { TemplateConfig } from "./domain.js"
2+
import { renderEntrypointAgentsNotice } from "./templates-entrypoint/agents-notice.js"
23
import {
34
renderEntrypointAuthorizedKeys,
45
renderEntrypointBaseline,
@@ -13,7 +14,6 @@ import {
1314
} from "./templates-entrypoint/base.js"
1415
import { renderEntrypointClaudeConfig } from "./templates-entrypoint/claude.js"
1516
import {
16-
renderEntrypointAgentsNotice,
1717
renderEntrypointCodexHome,
1818
renderEntrypointCodexResumeHint,
1919
renderEntrypointCodexSharedAuth,
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import type { TemplateConfig } from "../domain.js"
2+
3+
const entrypointAgentsNoticeTemplate = String.raw`# Ensure global AGENTS.md exists for container context
4+
AGENTS_PATH="__CODEX_HOME__/AGENTS.md"
5+
LEGACY_AGENTS_PATH="/home/__SSH_USER__/AGENTS.md"
6+
PROJECT_LINE="Рабочая папка проекта (git clone): __TARGET_DIR__"
7+
WORKSPACES_LINE="Доступные workspace пути: __TARGET_DIR__"
8+
WORKSPACE_INFO_LINE="Контекст workspace: repository"
9+
FOCUS_LINE="Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: __TARGET_DIR__"
10+
INTERNET_LINE="Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе."
11+
SUBAGENTS_LINE="Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю."
12+
if [[ "$REPO_REF" == issue-* ]]; then
13+
ISSUE_ID="$(printf "%s" "$REPO_REF" | sed -E 's#^issue-##')"
14+
ISSUE_URL=""
15+
if [[ "$REPO_URL" == https://github.com/* ]]; then
16+
ISSUE_REPO="$(printf "%s" "$REPO_URL" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##')"
17+
if [[ -n "$ISSUE_REPO" ]]; then
18+
ISSUE_URL="https://github.com/$ISSUE_REPO/issues/$ISSUE_ID"
19+
fi
20+
fi
21+
if [[ -n "$ISSUE_URL" ]]; then
22+
WORKSPACE_INFO_LINE="Контекст workspace: issue #$ISSUE_ID ($ISSUE_URL)"
23+
else
24+
WORKSPACE_INFO_LINE="Контекст workspace: issue #$ISSUE_ID"
25+
fi
26+
elif [[ "$REPO_REF" == refs/pull/*/head ]]; then
27+
PR_ID="$(printf "%s" "$REPO_REF" | sed -nE 's#^refs/pull/([0-9]+)/head$#\1#p')"
28+
PR_URL=""
29+
if [[ "$REPO_URL" == https://github.com/* && -n "$PR_ID" ]]; then
30+
PR_REPO="$(printf "%s" "$REPO_URL" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##')"
31+
if [[ -n "$PR_REPO" ]]; then
32+
PR_URL="https://github.com/$PR_REPO/pull/$PR_ID"
33+
fi
34+
fi
35+
if [[ -n "$PR_ID" && -n "$PR_URL" ]]; then
36+
WORKSPACE_INFO_LINE="Контекст workspace: PR #$PR_ID ($PR_URL)"
37+
elif [[ -n "$PR_ID" ]]; then
38+
WORKSPACE_INFO_LINE="Контекст workspace: PR #$PR_ID"
39+
else
40+
WORKSPACE_INFO_LINE="Контекст workspace: pull request ($REPO_REF)"
41+
fi
42+
fi
43+
MANAGED_START="<!-- docker-git:managed:start -->"
44+
MANAGED_END="<!-- docker-git:managed:end -->"
45+
if [[ ! -f "$AGENTS_PATH" ]]; then
46+
MANAGED_BLOCK="$(cat <<EOF
47+
$MANAGED_START
48+
$PROJECT_LINE
49+
$WORKSPACES_LINE
50+
$WORKSPACE_INFO_LINE
51+
$FOCUS_LINE
52+
$INTERNET_LINE
53+
$SUBAGENTS_LINE
54+
$MANAGED_END
55+
EOF
56+
)"
57+
cat <<EOF > "$AGENTS_PATH"
58+
Ты автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, codex, opencode, oh-my-opencode, sshpass, git, node, pnpm и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~
59+
$MANAGED_BLOCK
60+
Если ты видишь файлы AGENTS.md внутри проекта, ты обязан их читать и соблюдать инструкции.
61+
EOF
62+
chown 1000:1000 "$AGENTS_PATH" || true
63+
fi
64+
if [[ -f "$AGENTS_PATH" ]]; then
65+
MANAGED_BLOCK="$(cat <<EOF
66+
$MANAGED_START
67+
$PROJECT_LINE
68+
$WORKSPACES_LINE
69+
$WORKSPACE_INFO_LINE
70+
$FOCUS_LINE
71+
$INTERNET_LINE
72+
$SUBAGENTS_LINE
73+
$MANAGED_END
74+
EOF
75+
)"
76+
TMP_AGENTS_PATH="$(mktemp)"
77+
if grep -qF "$MANAGED_START" "$AGENTS_PATH" && grep -qF "$MANAGED_END" "$AGENTS_PATH"; then
78+
awk -v start="$MANAGED_START" -v end="$MANAGED_END" -v repl="$MANAGED_BLOCK" '
79+
BEGIN { in_block = 0 }
80+
$0 == start { print repl; in_block = 1; next }
81+
$0 == end { in_block = 0; next }
82+
in_block == 0 { print }
83+
' "$AGENTS_PATH" > "$TMP_AGENTS_PATH"
84+
else
85+
sed \
86+
-e '/^Рабочая папка проекта (git clone):/d' \
87+
-e '/^Доступные workspace пути:/d' \
88+
-e '/^Контекст workspace:/d' \
89+
-e '/^Фокус задачи:/d' \
90+
-e '/^Issue AGENTS.md:/d' \
91+
-e '/^Доступ к интернету:/d' \
92+
-e '/^Для решения задач обязательно используй subagents[.]/d' \
93+
"$AGENTS_PATH" > "$TMP_AGENTS_PATH"
94+
if [[ -s "$TMP_AGENTS_PATH" ]]; then
95+
printf "\n" >> "$TMP_AGENTS_PATH"
96+
fi
97+
printf "%s\n" "$MANAGED_BLOCK" >> "$TMP_AGENTS_PATH"
98+
fi
99+
mv "$TMP_AGENTS_PATH" "$AGENTS_PATH"
100+
chown 1000:1000 "$AGENTS_PATH" || true
101+
fi
102+
if [[ -f "$LEGACY_AGENTS_PATH" && -f "$AGENTS_PATH" ]]; then
103+
LEGACY_SUM="$(cksum "$LEGACY_AGENTS_PATH" 2>/dev/null | awk '{print $1 \":\" $2}')"
104+
CODEX_SUM="$(cksum "$AGENTS_PATH" 2>/dev/null | awk '{print $1 \":\" $2}')"
105+
if [[ -n "$LEGACY_SUM" && "$LEGACY_SUM" == "$CODEX_SUM" ]]; then
106+
rm -f "$LEGACY_AGENTS_PATH"
107+
fi
108+
fi`
109+
110+
export const renderEntrypointAgentsNotice = (config: TemplateConfig): string =>
111+
entrypointAgentsNoticeTemplate.replaceAll("__CODEX_HOME__", config.codexHome).replaceAll(
112+
"__SSH_USER__",
113+
config.sshUser
114+
)
115+
.replaceAll("__TARGET_DIR__", config.targetDir)

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

Lines changed: 0 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -213,117 +213,3 @@ export const renderEntrypointCodexResumeHint = (config: TemplateConfig): string
213213
entrypointCodexResumeHintTemplate
214214
.replaceAll("__REPO_REF_DEFAULT__", escapeForDoubleQuotes(config.repoRef))
215215
.replaceAll("__REPO_URL_DEFAULT__", escapeForDoubleQuotes(config.repoUrl))
216-
217-
const entrypointAgentsNoticeTemplate = String.raw`# Ensure global AGENTS.md exists for container context
218-
AGENTS_PATH="__CODEX_HOME__/AGENTS.md"
219-
LEGACY_AGENTS_PATH="/home/__SSH_USER__/AGENTS.md"
220-
PROJECT_LINE="Рабочая папка проекта (git clone): __TARGET_DIR__"
221-
WORKSPACES_LINE="Доступные workspace пути: __TARGET_DIR__"
222-
WORKSPACE_INFO_LINE="Контекст workspace: repository"
223-
FOCUS_LINE="Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: __TARGET_DIR__"
224-
INTERNET_LINE="Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе."
225-
SUBAGENTS_LINE="Для решения задач обязательно используй subagents. Сам агент обязан выполнять финальную проверку, интеграцию и валидацию результата перед ответом пользователю."
226-
if [[ "$REPO_REF" == issue-* ]]; then
227-
ISSUE_ID="$(printf "%s" "$REPO_REF" | sed -E 's#^issue-##')"
228-
ISSUE_URL=""
229-
if [[ "$REPO_URL" == https://github.com/* ]]; then
230-
ISSUE_REPO="$(printf "%s" "$REPO_URL" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##')"
231-
if [[ -n "$ISSUE_REPO" ]]; then
232-
ISSUE_URL="https://github.com/$ISSUE_REPO/issues/$ISSUE_ID"
233-
fi
234-
fi
235-
if [[ -n "$ISSUE_URL" ]]; then
236-
WORKSPACE_INFO_LINE="Контекст workspace: issue #$ISSUE_ID ($ISSUE_URL)"
237-
else
238-
WORKSPACE_INFO_LINE="Контекст workspace: issue #$ISSUE_ID"
239-
fi
240-
elif [[ "$REPO_REF" == refs/pull/*/head ]]; then
241-
PR_ID="$(printf "%s" "$REPO_REF" | sed -nE 's#^refs/pull/([0-9]+)/head$#\1#p')"
242-
PR_URL=""
243-
if [[ "$REPO_URL" == https://github.com/* && -n "$PR_ID" ]]; then
244-
PR_REPO="$(printf "%s" "$REPO_URL" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##')"
245-
if [[ -n "$PR_REPO" ]]; then
246-
PR_URL="https://github.com/$PR_REPO/pull/$PR_ID"
247-
fi
248-
fi
249-
if [[ -n "$PR_ID" && -n "$PR_URL" ]]; then
250-
WORKSPACE_INFO_LINE="Контекст workspace: PR #$PR_ID ($PR_URL)"
251-
elif [[ -n "$PR_ID" ]]; then
252-
WORKSPACE_INFO_LINE="Контекст workspace: PR #$PR_ID"
253-
else
254-
WORKSPACE_INFO_LINE="Контекст workspace: pull request ($REPO_REF)"
255-
fi
256-
fi
257-
MANAGED_START="<!-- docker-git:managed:start -->"
258-
MANAGED_END="<!-- docker-git:managed:end -->"
259-
if [[ ! -f "$AGENTS_PATH" ]]; then
260-
MANAGED_BLOCK="$(cat <<EOF
261-
$MANAGED_START
262-
$PROJECT_LINE
263-
$WORKSPACES_LINE
264-
$WORKSPACE_INFO_LINE
265-
$FOCUS_LINE
266-
$INTERNET_LINE
267-
$SUBAGENTS_LINE
268-
$MANAGED_END
269-
EOF
270-
)"
271-
cat <<EOF > "$AGENTS_PATH"
272-
Ты автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, codex, opencode, oh-my-opencode, sshpass, git, node, pnpm и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~
273-
$MANAGED_BLOCK
274-
Если ты видишь файлы AGENTS.md внутри проекта, ты обязан их читать и соблюдать инструкции.
275-
EOF
276-
chown 1000:1000 "$AGENTS_PATH" || true
277-
fi
278-
if [[ -f "$AGENTS_PATH" ]]; then
279-
MANAGED_BLOCK="$(cat <<EOF
280-
$MANAGED_START
281-
$PROJECT_LINE
282-
$WORKSPACES_LINE
283-
$WORKSPACE_INFO_LINE
284-
$FOCUS_LINE
285-
$INTERNET_LINE
286-
$SUBAGENTS_LINE
287-
$MANAGED_END
288-
EOF
289-
)"
290-
TMP_AGENTS_PATH="$(mktemp)"
291-
if grep -qF "$MANAGED_START" "$AGENTS_PATH" && grep -qF "$MANAGED_END" "$AGENTS_PATH"; then
292-
awk -v start="$MANAGED_START" -v end="$MANAGED_END" -v repl="$MANAGED_BLOCK" '
293-
BEGIN { in_block = 0 }
294-
$0 == start { print repl; in_block = 1; next }
295-
$0 == end { in_block = 0; next }
296-
in_block == 0 { print }
297-
' "$AGENTS_PATH" > "$TMP_AGENTS_PATH"
298-
else
299-
sed \
300-
-e '/^Рабочая папка проекта (git clone):/d' \
301-
-e '/^Доступные workspace пути:/d' \
302-
-e '/^Контекст workspace:/d' \
303-
-e '/^Фокус задачи:/d' \
304-
-e '/^Issue AGENTS.md:/d' \
305-
-e '/^Доступ к интернету:/d' \
306-
-e '/^Для решения задач обязательно используй subagents[.]/d' \
307-
"$AGENTS_PATH" > "$TMP_AGENTS_PATH"
308-
if [[ -s "$TMP_AGENTS_PATH" ]]; then
309-
printf "\n" >> "$TMP_AGENTS_PATH"
310-
fi
311-
printf "%s\n" "$MANAGED_BLOCK" >> "$TMP_AGENTS_PATH"
312-
fi
313-
mv "$TMP_AGENTS_PATH" "$AGENTS_PATH"
314-
chown 1000:1000 "$AGENTS_PATH" || true
315-
fi
316-
if [[ -f "$LEGACY_AGENTS_PATH" && -f "$AGENTS_PATH" ]]; then
317-
LEGACY_SUM="$(cksum "$LEGACY_AGENTS_PATH" 2>/dev/null | awk '{print $1 \":\" $2}')"
318-
CODEX_SUM="$(cksum "$AGENTS_PATH" 2>/dev/null | awk '{print $1 \":\" $2}')"
319-
if [[ -n "$LEGACY_SUM" && "$LEGACY_SUM" == "$CODEX_SUM" ]]; then
320-
rm -f "$LEGACY_AGENTS_PATH"
321-
fi
322-
fi`
323-
324-
export const renderEntrypointAgentsNotice = (config: TemplateConfig): string =>
325-
entrypointAgentsNoticeTemplate.replaceAll("__CODEX_HOME__", config.codexHome).replaceAll(
326-
"__SSH_USER__",
327-
config.sshUser
328-
)
329-
.replaceAll("__TARGET_DIR__", config.targetDir)

packages/lib/src/core/templates-entrypoint/nested-docker-git.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,13 @@ chown -R 1000:1000 "$DOCKER_GIT_HOME" || true`
181181
export const renderEntrypointDockerGitBootstrap = (config: TemplateConfig): string =>
182182
entrypointDockerGitBootstrapTemplate
183183
.replaceAll("__SSH_USER__", config.sshUser)
184-
.replaceAll("__AUTHORIZED_KEYS_BASENAME__", config.authorizedKeysPath.replaceAll("\\", "/").split("/").at(-1) ?? "authorized_keys")
184+
.replaceAll(
185+
"__AUTHORIZED_KEYS_BASENAME__",
186+
config.authorizedKeysPath.replaceAll("\\", "/").split("/").at(-1) ?? "authorized_keys"
187+
)
185188
.replaceAll("__ENV_GLOBAL_BASENAME__", config.envGlobalPath.replaceAll("\\", "/").split("/").at(-1) ?? "global.env")
186-
.replaceAll("__ENV_PROJECT_BASENAME__", config.envProjectPath.replaceAll("\\", "/").split("/").at(-1) ?? "project.env")
189+
.replaceAll(
190+
"__ENV_PROJECT_BASENAME__",
191+
config.envProjectPath.replaceAll("\\", "/").split("/").at(-1) ?? "project.env"
192+
)
187193
.replaceAll("__CODEX_HOME__", config.codexHome)

packages/lib/src/core/templates/docker-compose.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ const renderBootstrapMounts = (config: TemplateConfig): string => {
9898
` - ${renderProjectHostPath(envGlobal.dir)}:/opt/docker-git/bootstrap/source/env-global:ro`,
9999
` - ${renderProjectHostPath(envProject.dir)}:/opt/docker-git/bootstrap/source/env-project:ro`,
100100
` - ${renderProjectHostPath(config.codexAuthPath)}:/opt/docker-git/bootstrap/source/project-auth/codex:ro`,
101-
` - ${renderProjectHostPath(renderClaudeBootstrapSourceDir(config.codexAuthPath))}:/opt/docker-git/bootstrap/source/project-auth/claude:ro`,
101+
` - ${
102+
renderProjectHostPath(renderClaudeBootstrapSourceDir(config.codexAuthPath))
103+
}:/opt/docker-git/bootstrap/source/project-auth/claude:ro`,
102104
` - ${renderProjectHostPath(config.codexSharedAuthPath)}:/opt/docker-git/bootstrap/source/shared-auth/codex:ro`
103105
].join("\n")
104106
}

packages/lib/src/usecases/projects-up.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import { ensureCodexConfigFile } from "./auth-sync.js"
2525
import { ensureComposeNetworkReady } from "./docker-network-gc.js"
2626
import { loadReservedPorts, selectAvailablePort } from "./ports-reserve.js"
2727
import { parseComposePsOutput } from "./projects-core.js"
28-
import { ensureSharedCodexVolumeReady } from "./shared-volume-seed.js"
2928
import { resolveTemplateResourceLimits } from "./resource-limits.js"
29+
import { ensureSharedCodexVolumeReady } from "./shared-volume-seed.js"
3030

3131
const maxPortAttempts = 25
3232

0 commit comments

Comments
 (0)