-
Notifications
You must be signed in to change notification settings - Fork 0
Enable documentation generation and enhance Copilot persistence setup #11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
c3d7244
6decbc4
bf89f03
3e5af1e
8b9b718
91aa7f4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,28 @@ | ||
| ## How It Works | ||
|
|
||
| Inspired by the [shell-history pattern](https://github.com/stuartleeks/dev-container-features/tree/main/src/shell-history), this feature: | ||
|
|
||
| 1. **Mounts a named volume** (scoped per dev container via `${devcontainerId}`) to `/copilot-data` | ||
| 2. **Creates a symlink** from `~/.copilot` → `/copilot-data` | ||
| 3. **Sets ownership** to the container user during installation (auto-detects from `$_REMOTE_USER`) | ||
|
|
||
| > **Note:** If `~/.copilot` already exists as a directory during installation, it is moved into the volume at `/copilot-data/migrated-<timestamp>/` before the symlink is created. | ||
|
|
||
| ## What Persists | ||
|
|
||
| - ✅ Chat history and sessions | ||
| - ✅ CLI configuration (model preferences, settings) | ||
| - ✅ Command history | ||
| - ✅ Trusted folders | ||
|
|
||
| ## Troubleshooting | ||
|
|
||
| View the volume data: | ||
| ```bash | ||
| ls -la /copilot-data | ||
| ``` | ||
|
|
||
| Check the symlink: | ||
| ```bash | ||
| ls -la ~/.copilot | ||
| ``` |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,64 +1,31 @@ | ||
| #!/bin/bash | ||
| set -e | ||
|
|
||
| echo "Setting up Copilot CLI persistence..." | ||
|
|
||
| # Determine the user (defaults to vscode if not set) | ||
| USERNAME="${_REMOTE_USER:-"${USERNAME:-"vscode"}"}" | ||
|
|
||
| # Resolve home directory via the passwd database or shell expansion | ||
| USER_HOME="" | ||
| if command -v getent >/dev/null 2>&1; then | ||
| USER_HOME="$(getent passwd "${USERNAME}" | cut -d: -f6)" | ||
| fi | ||
| USER_HOME="${_REMOTE_USER_HOME:-"$(getent passwd "${USERNAME}" 2>/dev/null | cut -d: -f6)"}" | ||
| if [ -z "${USER_HOME}" ]; then | ||
| USER_HOME="$(eval echo "~${USERNAME}" 2>/dev/null || true)" | ||
| fi | ||
| if [ -z "${USER_HOME}" ]; then | ||
| echo "Error: Unable to determine home directory for user '${USERNAME}'" >&2 | ||
| echo "ERROR: Could not determine home directory for user '${USERNAME}'" >&2 | ||
| exit 1 | ||
| fi | ||
|
|
||
| # Create the persistent data directory in a neutral location | ||
| mkdir -p /copilot-data | ||
|
|
||
| # Get the user's UID and GID | ||
| USER_UID=$(id -u "${USERNAME}" 2>/dev/null || echo "1000") | ||
| USER_GID=$(id -g "${USERNAME}" 2>/dev/null || echo "1000") | ||
|
|
||
| # Fix ownership for the user (build-time, may be overridden by volume mount) | ||
| chown -R "${USER_UID}:${USER_GID}" /copilot-data | ||
| # Prepare the persistent data directory (permissions carry into named volume on first use) | ||
| mkdir -p /copilot-data | ||
| chown "${USER_UID}:${USER_GID}" /copilot-data | ||
| chmod 700 /copilot-data | ||
|
|
||
| # Create an init script that fixes volume permissions at container start. | ||
| # When a named volume is mounted, build-time permissions may not carry over, | ||
| # so we fix ownership on every shell login. | ||
| mkdir -p /usr/local/share/copilot-persistence | ||
| cat > /usr/local/share/copilot-persistence/init.sh << 'INIT' | ||
| #!/bin/bash | ||
| # Fix /copilot-data ownership if it exists and is not writable by current user | ||
| if [ -d /copilot-data ] && [ ! -w /copilot-data ]; then | ||
| sudo chown -R "$(id -u):$(id -g)" /copilot-data 2>/dev/null || true | ||
| fi | ||
| INIT | ||
| chmod 755 /usr/local/share/copilot-persistence/init.sh | ||
|
|
||
| # Source the init script from profile so it runs on container start | ||
| cat > /etc/profile.d/copilot-persistence.sh << 'PROFILE' | ||
| # Fix copilot-data volume permissions on login | ||
| if [ -f /usr/local/share/copilot-persistence/init.sh ]; then | ||
| . /usr/local/share/copilot-persistence/init.sh | ||
| fi | ||
| PROFILE | ||
| # Fix volume permissions at login (build-time ownership may not carry into mounted volumes) | ||
| cat > /etc/profile.d/copilot-persistence.sh << 'EOF' | ||
| [ -d /copilot-data ] && [ ! -w /copilot-data ] && sudo -n chown -R "$(id -u):$(id -g)" /copilot-data 2>/dev/null || true | ||
| EOF | ||
|
|
||
| # Create a symlink from the default location to our persistent volume | ||
| # This handles the case where Copilot doesn't use XDG_CONFIG_HOME correctly | ||
| # Migrate any pre-existing Copilot data into the volume, then symlink | ||
| mkdir -p "${USER_HOME}" | ||
| if [ ! -L "${USER_HOME}/.copilot" ] || [ "$(readlink "${USER_HOME}/.copilot")" != "/copilot-data" ]; then | ||
| rm -rf "${USER_HOME}/.copilot" 2>/dev/null || true | ||
| ln -sf /copilot-data "${USER_HOME}/.copilot" | ||
| chown -h "${USER_UID}:${USER_GID}" "${USER_HOME}/.copilot" | ||
| if [ -e "${USER_HOME}/.copilot" ] && [ ! -L "${USER_HOME}/.copilot" ]; then | ||
| mv "${USER_HOME}/.copilot" "/copilot-data/migrated-$(date +%s%N)-$$" | ||
| fi | ||
| ln -sfn /copilot-data "${USER_HOME}/.copilot" | ||
|
Comment on lines
+23
to
+28
|
||
| chown -h "${USER_UID}:${USER_GID}" "${USER_HOME}/.copilot" | ||
|
|
||
| echo "Copilot CLI persistence configured successfully for user: ${USERNAME}" | ||
| echo "Data will be stored in /copilot-data (mounted volume)" | ||
| echo "Copilot persistence: ~/.copilot → /copilot-data" | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
USER_HOMEresolution now unconditionally invokesgetentinside a command substitution whileset -eis enabled. On images wheregetentis missing (or returns non-zero), this can cause the installer to exit before emitting the fallback error message. Consider guarding withcommand -v getentand/or reintroducing the~${USERNAME}fallback used elsewhere in this repo (e.g.,src/ohmyposh/install.sh).