Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
6e32cfe
Initial commit with task details
konard May 5, 2026
fcf4f67
feat(templates): allow customizing system prompts and codex skills
konard May 5, 2026
5b4641e
docs(experiments): capture rendered entrypoint output and UI walkthrough
konard May 5, 2026
5570942
Merge remote-tracking branch 'upstream/main' into issue-237-d4e1e2d53afd
konard May 5, 2026
fbd25a4
Revert "Initial commit with task details"
konard May 5, 2026
1b982e2
Merge remote-tracking branch 'origin/main' into issue-237-d4e1e2d53afd
skulidropek May 6, 2026
0640ade
docs(pr): capture prompt override screenshots
skulidropek May 6, 2026
cff71b0
feat(app): add Prompts and Skills management panels
konard May 9, 2026
eb5362d
docs(issue-237): capture prompts and skills web panel screenshots
konard May 9, 2026
f38f087
Merge upstream/main into issue-237-d4e1e2d53afd
konard May 9, 2026
260d820
docs(issue-237): add MCP proof screenshots
skulidropek May 9, 2026
bb689db
feat: add Skiller as docker-git submodule
skulidropek May 9, 2026
87ee717
docs: replace Skiller proof with live app screenshots
skulidropek May 9, 2026
bd26843
feat: launch Skiller from terminal header
skulidropek May 9, 2026
5175459
docs: add live Skiller launch proof screenshots
skulidropek May 9, 2026
e212b98
fix: open Skiller UI from terminal button
skulidropek May 9, 2026
d220d01
fix: scope Skiller to project container filesystem
skulidropek May 9, 2026
f4c46d8
fix: resolve project SSH through shared Docker network
skulidropek May 9, 2026
5f98f58
fix: open Skiller with terminal session URL
skulidropek May 9, 2026
09a0b0b
docs: add session-scoped Skiller proof
skulidropek May 9, 2026
e655e57
fix: initialize Skiller submodule in Docker E2E
skulidropek May 9, 2026
89c04cb
fix: expose selected container Codex skills to Skiller
skulidropek May 9, 2026
11dac2e
fix: add browser folder picker for scoped Skiller
skulidropek May 9, 2026
354dcd2
fix: scope project Skiller browser picker
skulidropek May 10, 2026
68090c6
fix: keep Skiller session URLs scoped
skulidropek May 10, 2026
09f8618
feat: add scoped Skiller prompt editor proofs
skulidropek May 12, 2026
c40e5d0
test: allow browser e2e cold startup
skulidropek May 12, 2026
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
5 changes: 5 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
.git
node_modules
**/node_modules
**/.cache
third_party/skiller-desktop-skills-manager/out
12 changes: 12 additions & 0 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,8 @@ jobs:
timeout-minutes: 40
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Install dependencies
uses: ./.github/actions/setup
- name: Docker info
Expand All @@ -168,6 +170,8 @@ jobs:
timeout-minutes: 40
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Install dependencies
uses: ./.github/actions/setup
- name: Docker info
Expand All @@ -181,6 +185,8 @@ jobs:
timeout-minutes: 40
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Install dependencies
uses: ./.github/actions/setup
- name: Docker info
Expand All @@ -194,6 +200,8 @@ jobs:
timeout-minutes: 40
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Install dependencies
uses: ./.github/actions/setup
- name: Docker info
Expand All @@ -207,6 +215,8 @@ jobs:
timeout-minutes: 60
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Install dependencies
uses: ./.github/actions/setup
- name: Docker info
Expand All @@ -220,6 +230,8 @@ jobs:
timeout-minutes: 40
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Install dependencies
uses: ./.github/actions/setup
- name: Docker info
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "third_party/skiller-desktop-skills-manager"]
path = third_party/skiller-desktop-skills-manager
url = https://github.com/beautyfree/skiller-desktop-skills-manager.git
90 changes: 90 additions & 0 deletions docs/integrations/skiller.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# Skiller Integration

Skiller is included as an isolated git submodule so docker-git can reuse the upstream desktop skills manager without mixing Electron dependencies into the docker-git Bun workspace.

## Upstream

- Repository: https://github.com/beautyfree/skiller-desktop-skills-manager
- Path: `third_party/skiller-desktop-skills-manager`
- Pinned version: `v0.2.14`
- Pinned commit: `6ff6b9ca1ff2d78d3af7dac47b03ed1c315dab6b`
- License: MIT, copyright 2025 Skiller Contributors

The submodule is intentionally outside `packages/*` and is not listed in the root workspace. This keeps the existing docker-git `build`, `check`, `typecheck`, and `test` scripts scoped to docker-git packages unless a Skiller-specific script is run.

## Commands

Initialize the pinned submodule:

```bash
bun run skiller:init
```

Install Skiller dependencies inside the submodule:

```bash
bun run skiller:install
```

Run Skiller as its own Electron app:

```bash
bun run skiller:dev
```

Run Skiller checks:

```bash
bun run skiller:check
```

## docker-git Web Launch

The docker-git web terminal header includes a `Skiller` button next to `Open browser`. In a project terminal the button calls `POST /projects/by-key/:projectKey/terminal-sessions/:sessionId/skiller/open` first, which launches the pinned submodule Electron app as a separate process, registers the terminal session filesystem scope, and writes launcher output to `~/.docker-git/logs/skiller.log`. After that response succeeds, the browser opens the returned `/api/ssh/session/:sessionId/skiller/app/` URL using the same terminal session id that is present in `/ssh/session/:sessionId`.

docker-git serves Skiller's built renderer from the submodule and proxies `/api/ssh/session/:sessionId/skiller/trpc/*` to the running Skiller tRPC backend, so the user sees the actual Skiller UI instead of an invisible background desktop process. The session id is part of the URL so a Skiller tab can be tied back to the terminal container that opened it.

For project terminals, docker-git scopes Skiller to the active project container filesystem. The API inspects the selected project container mounts, maps `/home/<sshUser>` and the project `targetDir` to the controller-visible Docker volume path, launches Skiller with `HOME` set to that mapped home directory, and registers the mapped project directory in Skiller. This makes global skill operations target the selected container home and project skill operations target the selected container project directory. If the controller cannot access the Docker volume path, the endpoint fails instead of opening Skiller against the wrong filesystem.

For Codex, Skiller resolves `~/.codex/skills` against the selected container home volume. For example, `/home/dev/.codex/skills` inside the selected container is exposed to the controller as the mapped Docker volume path and is the only Codex global skill tree used for that session. docker-git does not fall back to the controller's own `~/.codex/skills`.

When the API process has no `$DISPLAY`, the launcher uses `xvfb-run` if it is available so Skiller can still start in a headless controller environment.

## PR #238 Proof

The latest Playwright proof screenshots are checked in under `docs/screenshots/issue-237/proof/`:

- `pr238-proof-27-terminal-skiller-same-session.png` shows the attached terminal with the `Skiller` button.
- `pr238-proof-28-skiller-session-scoped-ui.png` shows the real Skiller UI opened from that button.
- `pr238-proof-29-skiller-codex-container-skill.png` shows a Codex skill discovered from the selected container's `/home/dev/.codex/skills` tree.
- `pr238-proof-30-skiller-add-project-folder-browser-picker.png` shows the browser-visible project folder picker opened from `Add project folder...` with selected-container paths.
- `pr238-proof-31-skiller-project-scoped-folder-picker-working.png` shows `/api/skiller/app/` opened from a project-scoped Skiller process with `Add project folder...` resolving to the selected container paths.
- `pr238-proof-32-docker-git-browser-live-command.png` shows the live `docker-git browser` frontend served through the same controller used for the proof.
- `pr238-proof-33-skiller-session-folder-picker-mcp.png` shows the terminal session-scoped Skiller URL opened from the real `Skiller` button and the `Add project folder...` picker resolving to `dg-skiller-button-demo:/home/dev/app`.
- `pr238-proof-34-skiller-container-skill-paths.png` shows the session-scoped Skiller skill detail rendering the Codex skill path as `/home/dev/.codex/skills/...` instead of the controller Docker volume path.
- `pr238-proof-35-skiller-container-project-paths.png` shows the Skiller Projects view rendering the active project as `/home/dev/app` instead of the controller Docker volume path.
- `pr238-proof-36-skiller-system-prompts-ui.png` shows the real session-scoped Skiller Projects UI with project and global system prompt editors backed by the selected container paths.
- `pr238-proof-37-skiller-global-system-prompt-ui.png` shows the same Skiller UI after saving a global Codex system prompt at `/home/dev/.codex/AGENTS.md`.
- `pr238-proof-38-skiller-russian-system-prompts.png` shows Skiller rendering existing docker-git-managed Claude and Gemini global prompts as readable UTF-8 Russian text instead of literal `\u0422...` escapes.

## Updating the Pin

Update Skiller only as an explicit dependency change:

```bash
git -C third_party/skiller-desktop-skills-manager fetch --tags origin
git -C third_party/skiller-desktop-skills-manager checkout <tag-or-commit>
git add third_party/skiller-desktop-skills-manager
```

After changing the pin, run both docker-git checks and Skiller checks:

```bash
bun run typecheck
bun run check
bun run skiller:check
```

## Integration Boundary

This integration makes Skiller part of the docker-git checkout and developer workflow. docker-git keeps Skiller as an isolated submodule and does not import Skiller source into the docker-git web bundle. The visible browser view is served from Skiller's own built renderer and backed by Skiller's own tRPC process.
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.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/issue-237/panel-prompts.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/issue-237/panel-skills.png
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading