From 5918c68814148bf03644bec6a3f5acadd0937d79 Mon Sep 17 00:00:00 2001 From: konard Date: Wed, 17 Jun 2026 06:23:13 +0000 Subject: [PATCH 1/4] Initial commit with task details Adding .gitkeep for PR creation (default mode). This file will be removed when the task is complete. Issue: https://github.com/ProverCoderAI/docker-git/issues/413 --- .gitkeep | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitkeep diff --git a/.gitkeep b/.gitkeep new file mode 100644 index 00000000..7fcc125b --- /dev/null +++ b/.gitkeep @@ -0,0 +1 @@ +# .gitkeep file auto-generated at 2026-06-17T06:23:13.924Z for PR creation at branch issue-413-cb2a359e0ffa for issue https://github.com/ProverCoderAI/docker-git/issues/413 \ No newline at end of file From 3c64fdb5437638861a1c1384e1b4ce2e4000677b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2026 06:31:58 +0000 Subject: [PATCH 2/4] chore(release): version packages --- packages/app/CHANGELOG.md | 9 +++++++++ packages/app/package.json | 2 +- packages/docker-git-session-sync/CHANGELOG.md | 6 ++++++ packages/docker-git-session-sync/package.json | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md index 4eef8c73..dd7e5a73 100644 --- a/packages/app/CHANGELOG.md +++ b/packages/app/CHANGELOG.md @@ -1,5 +1,14 @@ # @prover-coder-ai/docker-git +## 1.3.5 + +### Patch Changes + +- chore: automated version bump + +- Updated dependencies []: + - @prover-coder-ai/docker-git-session-sync@1.0.63 + ## 1.3.4 ### Patch Changes diff --git a/packages/app/package.json b/packages/app/package.json index 29069780..66f95f9a 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@prover-coder-ai/docker-git", - "version": "1.3.4", + "version": "1.3.5", "description": "docker-git Bun and Gridland CLI plus browser frontend", "main": "dist/src/docker-git/main.js", "bin": { diff --git a/packages/docker-git-session-sync/CHANGELOG.md b/packages/docker-git-session-sync/CHANGELOG.md index 16f07008..3573150f 100644 --- a/packages/docker-git-session-sync/CHANGELOG.md +++ b/packages/docker-git-session-sync/CHANGELOG.md @@ -1,5 +1,11 @@ # @prover-coder-ai/docker-git-session-sync +## 1.0.63 + +### Patch Changes + +- chore: automated version bump + ## 1.0.62 ### Patch Changes diff --git a/packages/docker-git-session-sync/package.json b/packages/docker-git-session-sync/package.json index 12cc86ef..9ae0dde4 100644 --- a/packages/docker-git-session-sync/package.json +++ b/packages/docker-git-session-sync/package.json @@ -1,6 +1,6 @@ { "name": "@prover-coder-ai/docker-git-session-sync", - "version": "1.0.62", + "version": "1.0.63", "description": "Standalone docker-git AI agent session synchronization tool", "main": "dist/docker-git-session-sync.js", "bin": { From 2e66e2e12e568f6dd9184b6a15e4ce619d56540a Mon Sep 17 00:00:00 2001 From: konard Date: Wed, 17 Jun 2026 06:51:20 +0000 Subject: [PATCH 3/4] fix(entrypoint): expand tilde TARGET_DIR against dev home, not root $HOME The generated entrypoint runs as root (sshd), so $HOME is /root. A ~/... TARGET_DIR reaching the entrypoint was expanded against $HOME -> /root/app, which the unprivileged 'su - ' clone cannot write, so git clone failed and the workspace 'app' folder stayed empty (issue #413). Expand against /home/ so the clone always lands in the dev-owned workspace. Fixes #413 --- .changeset/entrypoint-tilde-clone-target.md | 15 +++++++++ .../src/lib/core/templates-entrypoint/base.ts | 4 +-- .../lib/src/core/templates-entrypoint/base.ts | 4 +-- packages/lib/tests/core/templates.test.ts | 32 +++++++++++++++++++ 4 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 .changeset/entrypoint-tilde-clone-target.md diff --git a/.changeset/entrypoint-tilde-clone-target.md b/.changeset/entrypoint-tilde-clone-target.md new file mode 100644 index 00000000..017bb74c --- /dev/null +++ b/.changeset/entrypoint-tilde-clone-target.md @@ -0,0 +1,15 @@ +--- +"@prover-coder-ai/docker-git": patch +--- + +Fix `docker-git clone` leaving the workspace `app` folder empty when `TARGET_DIR` +is a tilde path. + +The generated entrypoint runs as `root` (sshd), so `$HOME` resolves to `/root`. +When a `~`/`~/...` `TARGET_DIR` reached the entrypoint (e.g. via the `TARGET_DIR` +env override), it was expanded against `$HOME`, resolving to `/root/app`. Because +the auto-clone runs as `su - `, cloning into the root-owned `/root/app` +failed with "permission denied", so the repository never landed in the prepared +home and the workspace `app` folder stayed empty. The tilde is now expanded +against the unprivileged user's home `/home/`, so the clone always lands +in the dev-owned workspace. diff --git a/packages/app/src/lib/core/templates-entrypoint/base.ts b/packages/app/src/lib/core/templates-entrypoint/base.ts index 2200712a..98f23e6b 100644 --- a/packages/app/src/lib/core/templates-entrypoint/base.ts +++ b/packages/app/src/lib/core/templates-entrypoint/base.ts @@ -17,9 +17,9 @@ REPO_REF="\${REPO_REF:-}" FORK_REPO_URL="\${FORK_REPO_URL:-}" ${renderTargetDirDefault(config)} if [[ "$TARGET_DIR" == "~" ]]; then - TARGET_DIR="$HOME" + TARGET_DIR="/home/${config.sshUser}" elif [[ "$TARGET_DIR" == "~/"* ]]; then - TARGET_DIR="$HOME\${TARGET_DIR:1}" + TARGET_DIR="/home/${config.sshUser}\${TARGET_DIR:1}" fi CLAUDE_AUTH_LABEL="\${CLAUDE_AUTH_LABEL:-}" CODEX_AUTH_LABEL="\${CODEX_AUTH_LABEL:-}" diff --git a/packages/lib/src/core/templates-entrypoint/base.ts b/packages/lib/src/core/templates-entrypoint/base.ts index f3205dfa..7b98938b 100644 --- a/packages/lib/src/core/templates-entrypoint/base.ts +++ b/packages/lib/src/core/templates-entrypoint/base.ts @@ -17,9 +17,9 @@ REPO_REF="\${REPO_REF:-}" FORK_REPO_URL="\${FORK_REPO_URL:-}" ${renderTargetDirDefault(config)} if [[ "$TARGET_DIR" == "~" ]]; then - TARGET_DIR="$HOME" + TARGET_DIR="/home/${config.sshUser}" elif [[ "$TARGET_DIR" == "~/"* ]]; then - TARGET_DIR="$HOME\${TARGET_DIR:1}" + TARGET_DIR="/home/${config.sshUser}\${TARGET_DIR:1}" fi CLAUDE_AUTH_LABEL="\${CLAUDE_AUTH_LABEL:-}" CODEX_AUTH_LABEL="\${CODEX_AUTH_LABEL:-}" diff --git a/packages/lib/tests/core/templates.test.ts b/packages/lib/tests/core/templates.test.ts index b17fb7c3..50e33895 100644 --- a/packages/lib/tests/core/templates.test.ts +++ b/packages/lib/tests/core/templates.test.ts @@ -467,6 +467,38 @@ describe("renderEntrypoint clone cache", () => { }) }) +describe("renderEntrypoint tilde target dir expansion", () => { + // CHANGE: assert runtime `~`/`~/...` TARGET_DIR overrides resolve to the dev-owned home + // WHY: the entrypoint runs as root (sshd), so `$HOME` is /root; expanding a tilde TARGET_DIR + // against `$HOME` resolved the clone target to /root/app, which `su - dev` cannot write, + // so `git clone` failed and the workspace `app` folder stayed EMPTY (issue #413) + // QUOTE(ТЗ): "Почему-то при docker-git clone не делается git clone в папку app" + // REF: issue-413 + // FORMAT THEOREM: expand("~") = /home/ ∧ expand("~/p") = /home//p + it("expands a bare `~` against the dev home, not root's $HOME", () => { + const entrypoint = renderEntrypoint(makeTemplateConfig({ sshUser: "dev" })) + + expect(entrypoint).toContain('if [[ "$TARGET_DIR" == "~" ]]; then') + expect(entrypoint).toContain('TARGET_DIR="/home/dev"') + expect(entrypoint).toContain('TARGET_DIR="/home/dev${TARGET_DIR:1}"') + expect(entrypoint).not.toContain('TARGET_DIR="$HOME"') + expect(entrypoint).not.toContain('TARGET_DIR="$HOME${TARGET_DIR:1}"') + }) + + it("expands the tilde against the configured ssh user for generated configs", () => { + fc.assert( + fc.property(generatedTemplateConfigArbitrary, (config) => { + const entrypoint = renderEntrypoint(config) + + expect(entrypoint).toContain(`TARGET_DIR="/home/${config.sshUser}"`) + expect(entrypoint).toContain(`TARGET_DIR="/home/${config.sshUser}\${TARGET_DIR:1}"`) + expect(entrypoint).not.toContain('TARGET_DIR="$HOME"') + expect(entrypoint).not.toContain('TARGET_DIR="$HOME${TARGET_DIR:1}"') + }) + ) + }) +}) + describe("renderEntrypointGitHooks", () => { it("keeps the app mirror of the post-push PR fragment in sync with lib", () => { expect(renderAppPostPushPrEnsure()).toBe(renderLibPostPushPrEnsure()) From 75a43f5f7d14235d90ee9dd822c33ffda28499d6 Mon Sep 17 00:00:00 2001 From: konard Date: Wed, 17 Jun 2026 07:00:53 +0000 Subject: [PATCH 4/4] Revert "Initial commit with task details" This reverts commit 5918c68814148bf03644bec6a3f5acadd0937d79. --- .gitkeep | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .gitkeep diff --git a/.gitkeep b/.gitkeep deleted file mode 100644 index 7fcc125b..00000000 --- a/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -# .gitkeep file auto-generated at 2026-06-17T06:23:13.924Z for PR creation at branch issue-413-cb2a359e0ffa for issue https://github.com/ProverCoderAI/docker-git/issues/413 \ No newline at end of file