Skip to content

Commit 11a6c68

Browse files
committed
Merge remote-tracking branch 'origin/staging' into feat/wsl-performance-easy-wins
# Conflicts: # cli/bun.lock # cli/package.json # docs/package-lock.json # docs/package.json
2 parents a9ed933 + f68c8dc commit 11a6c68

12 files changed

Lines changed: 582 additions & 869 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ jobs:
3333
runs-on: ubuntu-latest
3434
steps:
3535
- uses: actions/checkout@v6
36-
- uses: actions/setup-python@v5
36+
- uses: actions/setup-python@v6
3737
with:
3838
python-version: "3.x"
3939
- run: pip install pytest

.github/workflows/deploy-docs.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ jobs:
2929
working-directory: docs
3030
- run: npm run build
3131
working-directory: docs
32-
- uses: actions/upload-pages-artifact@v4
32+
- uses: actions/upload-pages-artifact@v5
3333
with:
3434
path: docs/dist
3535

@@ -41,4 +41,4 @@ jobs:
4141
url: ${{ steps.deployment.outputs.page_url }}
4242
steps:
4343
- id: deployment
44-
uses: actions/deploy-pages@v4
44+
uses: actions/deploy-pages@v5

cli/bun.lock

Lines changed: 12 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cli/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@
2929
},
3030
"dependencies": {
3131
"@clack/prompts": "^1.3.0",
32-
"@devcontainers/cli": "^0.71.0",
32+
"@devcontainers/cli": "^0.86.1",
3333
"chalk": "^5.4.0",
34-
"commander": "^13.0.0"
34+
"commander": "^14.0.3"
3535
},
3636
"devDependencies": {
3737
"@types/bun": "^1.3.10",
38-
"@types/node": "^22.0.0",
39-
"typescript": "^5.7.0"
38+
"@types/node": "^25.6.1",
39+
"typescript": "^6.0.3"
4040
},
4141
"engines": {
4242
"node": ">=18.0.0"

container/.devcontainer/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@
9595

9696
### Terminal
9797

98+
- **Zsh completion stack** — new `zsh-completions` feature installs fzf, carapace-bin, zsh-autosuggestions, zsh-syntax-highlighting, and fzf-tab at build time. Tab completion now works for all CLI tools (docker, npm, git flags, codeforge subcommands, claude flags) with fuzzy matching via fzf-tab.
99+
- **Default shell set to zsh**`chsh` runs at build time so `$SHELL` is `/usr/bin/zsh`. Tmux `default-shell` also set to zsh, so new panes spawn zsh regardless of entry method.
100+
- **Carapace multi-shell bridge**`setup-terminal.sh` configures carapace with `CARAPACE_BRIDGES='zsh,fish,bash,inshellisense'` after OMZ sourcing, providing completions for tools that only ship fish/bash completers. Installed via GitHub releases `.deb` with tarball fallback (apt.fury.io GPG key is defunct).
101+
- **OMZ plugins expanded** — plugins list now includes `docker`, `docker-compose`, `npm`, `node`, `python`, `pip`, `fzf-tab`, `zsh-autosuggestions`, and `zsh-syntax-highlighting` (was just `git`).
98102
- **Alt+Enter newline keybinding** — added `alt+enter``chat:newline` to the default Claude Code keybindings. Windows Terminal doesn't support the Kitty keyboard protocol, so Shift+Enter and Ctrl+Enter send identical bytes to plain Enter. Alt+Enter sends ESC+CR, which is universally distinct and works reliably as a newline key.
99103
- **Shell terminal keybinds hardened** — disabled `Ctrl+Z` (suspend, which closes Docker-attached panes), `Ctrl+S/Q` (flow control freeze), and `Ctrl+W` (conflicts with Windows Terminal close-tab). Rebound `Ctrl+\` (SIGQUIT) to `Ctrl+]` and `Ctrl+D` (EOF) to `Ctrl+^` as emergency-only alternatives. Also unbound zsh's `Alt+W` (copy-region-as-kill) and `Alt+Q` (push-line) to free those keys for terminal use.
100104

container/.devcontainer/devcontainer.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
"./features/rtk",
7272
"./features/codex-cli",
7373
"./features/hermes-agent",
74+
"./features/zsh-completions",
7475
"./features/tmux",
7576
"./features/agent-browser",
7677
"./features/claude-monitor",
@@ -122,6 +123,7 @@
122123
"./features/rtk": {},
123124
"./features/codex-cli": {},
124125
"./features/hermes-agent": {},
126+
"./features/zsh-completions": {},
125127
"./features/tmux": {},
126128
"./features/ccusage": {
127129
"version": "latest",

container/.devcontainer/features/tmux/install.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ cat > "$TMUX_CONF" << 'EOF'
3232
# Theme: Catppuccin Mocha
3333
3434
# ── Core Settings ──────────────────────────────────────────────
35+
set -g default-shell /usr/bin/zsh
3536
set -g mouse on
3637
set -g base-index 1
3738
setw -g pane-base-index 1
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"id": "zsh-completions",
3+
"version": "1.0.0",
4+
"name": "Zsh Completion Stack",
5+
"description": "Installs fzf, carapace, zsh-autosuggestions, zsh-syntax-highlighting, fzf-tab, and sets zsh as default shell",
6+
"options": {
7+
"version": {
8+
"type": "string",
9+
"default": "latest",
10+
"description": "Set to 'none' to skip installation"
11+
},
12+
"username": {
13+
"type": "string",
14+
"default": "automatic",
15+
"description": "Target user for shell config"
16+
}
17+
}
18+
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
#!/bin/bash
2+
# SPDX-License-Identifier: GPL-3.0-only
3+
# Copyright (c) 2026 Marcus Krueger
4+
# Installs zsh completion stack: fzf, carapace, zsh-autosuggestions,
5+
# zsh-syntax-highlighting, fzf-tab. Sets zsh as default shell.
6+
set -euo pipefail
7+
8+
VERSION="${VERSION:-latest}"
9+
USERNAME="${USERNAME:-automatic}"
10+
11+
# Skip installation if version is "none"
12+
if [ "${VERSION}" = "none" ]; then
13+
echo "[zsh-completions] Skipping installation (version=none)"
14+
exit 0
15+
fi
16+
17+
# Resolve username
18+
if [ "${USERNAME}" = "automatic" ] || [ "${USERNAME}" = "auto" ]; then
19+
if [ -n "${_REMOTE_USER:-}" ]; then
20+
USERNAME="${_REMOTE_USER}"
21+
elif [ -n "${_CONTAINER_USER:-}" ]; then
22+
USERNAME="${_CONTAINER_USER}"
23+
else
24+
USERNAME="vscode"
25+
fi
26+
fi
27+
28+
USER_HOME=$(eval echo "~${USERNAME}")
29+
ZSH_CUSTOM="${USER_HOME}/.oh-my-zsh/custom"
30+
31+
echo "[zsh-completions] Installing completion stack for user: ${USERNAME}"
32+
33+
# ── Install fzf via apt ───────────────────────────────────────────
34+
echo "[zsh-completions] Installing fzf..."
35+
apt-get update -y
36+
apt-get install -y fzf
37+
38+
# ── Install carapace from GitHub releases ─────────────────────────
39+
echo "[zsh-completions] Installing carapace..."
40+
CARAPACE_INSTALLED=false
41+
42+
# Try GitHub releases .deb (most reliable)
43+
CARAPACE_VERSION=$(curl -fsSL https://api.github.com/repos/carapace-sh/carapace-bin/releases/latest 2>/dev/null | grep '"tag_name"' | sed 's/.*"v\(.*\)".*/\1/')
44+
if [ -n "$CARAPACE_VERSION" ]; then
45+
CARAPACE_DEB_URL="https://github.com/carapace-sh/carapace-bin/releases/download/v${CARAPACE_VERSION}/carapace-bin_${CARAPACE_VERSION}_linux_amd64.deb"
46+
if curl -fsSL "$CARAPACE_DEB_URL" -o /tmp/carapace.deb; then
47+
dpkg -i /tmp/carapace.deb
48+
rm -f /tmp/carapace.deb
49+
CARAPACE_INSTALLED=true
50+
echo "[zsh-completions] carapace ${CARAPACE_VERSION} installed via .deb"
51+
fi
52+
fi
53+
54+
# Fallback: tarball extract
55+
if [ "$CARAPACE_INSTALLED" = false ] && [ -n "$CARAPACE_VERSION" ]; then
56+
CARAPACE_TAR_URL="https://github.com/carapace-sh/carapace-bin/releases/download/v${CARAPACE_VERSION}/carapace-bin_${CARAPACE_VERSION}_linux_amd64.tar.gz"
57+
if curl -fsSL "$CARAPACE_TAR_URL" -o /tmp/carapace.tar.gz; then
58+
tar xzf /tmp/carapace.tar.gz -C /usr/local/bin carapace
59+
rm -f /tmp/carapace.tar.gz
60+
CARAPACE_INSTALLED=true
61+
echo "[zsh-completions] carapace ${CARAPACE_VERSION} installed via tarball"
62+
fi
63+
fi
64+
65+
if [ "$CARAPACE_INSTALLED" = false ]; then
66+
echo "[zsh-completions] WARNING: carapace install failed — completions will degrade gracefully"
67+
fi
68+
69+
# ── Clone zsh plugins (shallow, no .git for image size) ───────────
70+
echo "[zsh-completions] Installing zsh plugins..."
71+
mkdir -p "${ZSH_CUSTOM}/plugins"
72+
73+
clone_plugin() {
74+
local repo="$1"
75+
local name="$2"
76+
local target="${ZSH_CUSTOM}/plugins/${name}"
77+
78+
if [ -d "${target}" ]; then
79+
echo "[zsh-completions] ${name} already present, skipping"
80+
return 0
81+
fi
82+
83+
echo "[zsh-completions] Cloning ${name}..."
84+
git clone --depth=1 "https://github.com/${repo}.git" "${target}"
85+
rm -rf "${target}/.git"
86+
}
87+
88+
clone_plugin "zsh-users/zsh-autosuggestions" "zsh-autosuggestions"
89+
clone_plugin "zsh-users/zsh-syntax-highlighting" "zsh-syntax-highlighting"
90+
clone_plugin "Aloxaf/fzf-tab" "fzf-tab"
91+
92+
# ── Fix ownership ────────────────────────────────────────────────
93+
chown -R "${USERNAME}:${USERNAME}" "${ZSH_CUSTOM}/plugins/"
94+
95+
# ── Set zsh as default shell ──────────────────────────────────────
96+
echo "[zsh-completions] Setting default shell to /usr/bin/zsh for ${USERNAME}..."
97+
chsh -s /usr/bin/zsh "${USERNAME}"
98+
99+
# ── Clean up apt cache ────────────────────────────────────────────
100+
apt-get clean
101+
rm -rf /var/lib/apt/lists/*
102+
103+
echo "[zsh-completions] Installation complete"
104+
echo " - fzf: $(fzf --version 2>/dev/null || echo 'installed')"
105+
echo " - carapace: $(carapace --version 2>/dev/null || echo 'not available')"
106+
echo " - Plugins: zsh-autosuggestions, zsh-syntax-highlighting, fzf-tab"
107+
echo " - Default shell: /usr/bin/zsh"

0 commit comments

Comments
 (0)