devs-common 2.0.8__tar.gz → 2.0.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {devs_common-2.0.8 → devs_common-2.0.10}/PKG-INFO +1 -1
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/config.py +0 -5
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/core/container.py +13 -13
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/Dockerfile +2 -3
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/devcontainer.json +2 -4
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common.egg-info/PKG-INFO +1 -1
- {devs_common-2.0.8 → devs_common-2.0.10}/pyproject.toml +1 -1
- {devs_common-2.0.8 → devs_common-2.0.10}/LICENSE +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/README.md +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/__init__.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/core/__init__.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/core/project.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/core/workspace.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/devs_config.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/exceptions.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/scripts/copy-ssh.sh +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/scripts/post-create-wrapper.sh +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/scripts/python-venv-integration.sh +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/scripts/screenshot-webapp.sh +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/scripts/setup-workspace.sh +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/scripts/start-tunnel.sh +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/scripts/tunnel-status.sh +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/scripts/webapp-screenshot.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/sudo-scripts/init-firewall.sh +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/sudo-scripts/setup-devs-env.sh +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/sudo-scripts/setup-vscode-cache.sh +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/sudo-scripts/start-services.sh +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/vscode-settings-reference.md +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/utils/__init__.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/utils/config_hash.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/utils/console.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/utils/devcontainer.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/utils/devcontainer_template.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/utils/docker_client.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/utils/file_utils.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/utils/git_utils.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common/utils/repo_cache.py +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common.egg-info/SOURCES.txt +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common.egg-info/dependency_links.txt +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common.egg-info/requires.txt +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/devs_common.egg-info/top_level.txt +0 -0
- {devs_common-2.0.8 → devs_common-2.0.10}/setup.cfg +0 -0
|
@@ -12,7 +12,6 @@ class BaseConfig(ABC):
|
|
|
12
12
|
# Default directories shared across CLI and webhook
|
|
13
13
|
CLAUDE_CONFIG_DIR = Path.home() / ".devs" / "claudeconfig"
|
|
14
14
|
CODEX_CONFIG_DIR = Path.home() / ".devs" / "codexconfig"
|
|
15
|
-
VSCODE_CLI_DIR = Path.home() / ".devs" / "vscode-cli"
|
|
16
15
|
|
|
17
16
|
def __init__(self) -> None:
|
|
18
17
|
"""Initialize base configuration."""
|
|
@@ -26,9 +25,6 @@ class BaseConfig(ABC):
|
|
|
26
25
|
codex_config_env = os.getenv("DEVS_CODEX_CONFIG_DIR")
|
|
27
26
|
self.codex_config_dir = Path(codex_config_env) if codex_config_env else self.CODEX_CONFIG_DIR
|
|
28
27
|
|
|
29
|
-
vscode_cli_env = os.getenv("DEVS_VSCODE_CLI_DIR")
|
|
30
|
-
self.vscode_cli_dir = Path(vscode_cli_env) if vscode_cli_env else self.VSCODE_CLI_DIR
|
|
31
|
-
|
|
32
28
|
@property
|
|
33
29
|
def workspaces_dir(self) -> Path:
|
|
34
30
|
"""Get workspaces directory."""
|
|
@@ -104,4 +100,3 @@ class BaseConfig(ABC):
|
|
|
104
100
|
self.bridge_dir.mkdir(parents=True, exist_ok=True)
|
|
105
101
|
self.claude_config_dir.mkdir(parents=True, exist_ok=True)
|
|
106
102
|
self.codex_config_dir.mkdir(parents=True, exist_ok=True)
|
|
107
|
-
self.vscode_cli_dir.mkdir(parents=True, exist_ok=True)
|
|
@@ -588,24 +588,24 @@ class ContainerManager:
|
|
|
588
588
|
|
|
589
589
|
def _prepare_container_exec(self, dev_name: str, workspace_dir: Path, debug: bool = False, live: bool = False, extra_env: Optional[Dict[str, str]] = None) -> Tuple[str, str]:
|
|
590
590
|
"""Prepare container for exec operations (shared by exec_shell and exec_command).
|
|
591
|
-
|
|
591
|
+
|
|
592
592
|
Args:
|
|
593
593
|
dev_name: Development environment name
|
|
594
594
|
workspace_dir: Workspace directory path
|
|
595
595
|
debug: Show debug output for devcontainer operations
|
|
596
596
|
live: Whether the container is in live mode
|
|
597
597
|
extra_env: Additional environment variables to pass to container
|
|
598
|
-
|
|
598
|
+
|
|
599
599
|
Returns:
|
|
600
600
|
Tuple of (container_name, container_workspace_dir)
|
|
601
|
-
|
|
601
|
+
|
|
602
602
|
Raises:
|
|
603
603
|
ContainerError: If container preparation fails
|
|
604
604
|
"""
|
|
605
605
|
# Get initial container info (may be updated based on existing container mode)
|
|
606
606
|
workspace_info = self._get_container_info(dev_name, live)
|
|
607
607
|
container_name = workspace_info["container_name"]
|
|
608
|
-
|
|
608
|
+
|
|
609
609
|
# Check if container already exists and detect its mode
|
|
610
610
|
project_labels = self._get_project_labels(dev_name)
|
|
611
611
|
existing_containers = self.docker.find_containers_by_labels(project_labels)
|
|
@@ -615,18 +615,18 @@ class ContainerManager:
|
|
|
615
615
|
existing_is_live = existing_labels.get('devs.live') == 'true'
|
|
616
616
|
# Use the existing container's mode
|
|
617
617
|
live = existing_is_live
|
|
618
|
-
|
|
618
|
+
|
|
619
619
|
# In live mode, use the host folder name; otherwise use constructed name
|
|
620
620
|
if live:
|
|
621
621
|
workspace_name = workspace_dir.name
|
|
622
622
|
else:
|
|
623
623
|
workspace_name = workspace_info["workspace_name"]
|
|
624
624
|
container_workspace_dir = f"/workspaces/{workspace_name}"
|
|
625
|
-
|
|
625
|
+
|
|
626
626
|
# Ensure container is running
|
|
627
627
|
if not self.ensure_container_running(dev_name, workspace_dir, debug=debug, live=live, extra_env=extra_env):
|
|
628
628
|
raise ContainerError(f"Failed to start container for {dev_name}")
|
|
629
|
-
|
|
629
|
+
|
|
630
630
|
return container_name, container_workspace_dir
|
|
631
631
|
|
|
632
632
|
def exec_shell(self, dev_name: str, workspace_dir: Path, debug: bool = False, live: bool = False) -> None:
|
|
@@ -646,7 +646,7 @@ class ContainerManager:
|
|
|
646
646
|
container_name, container_workspace_dir = self._prepare_container_exec(
|
|
647
647
|
dev_name, workspace_dir, debug=debug, live=live
|
|
648
648
|
)
|
|
649
|
-
|
|
649
|
+
|
|
650
650
|
console.print(f"🐚 Opening shell in: {dev_name} (container: {container_name})")
|
|
651
651
|
console.print(f" Workspace: {container_workspace_dir}")
|
|
652
652
|
|
|
@@ -878,11 +878,11 @@ class ContainerManager:
|
|
|
878
878
|
return tunnel_name
|
|
879
879
|
|
|
880
880
|
def tunnel_auth(self, dev_name: str, workspace_dir: Path, debug: bool = False, live: bool = False, extra_env: Optional[Dict[str, str]] = None) -> None:
|
|
881
|
-
"""Authenticate VS Code tunnel (interactive,
|
|
881
|
+
"""Authenticate VS Code tunnel (interactive, per-container setup).
|
|
882
882
|
|
|
883
883
|
Runs the device code flow interactively inside the container. Auth is
|
|
884
|
-
stored in
|
|
885
|
-
|
|
884
|
+
stored in the container's filesystem and persists across stop/restart
|
|
885
|
+
cycles (but not container removal/recreation).
|
|
886
886
|
|
|
887
887
|
Args:
|
|
888
888
|
dev_name: Development environment name
|
|
@@ -925,7 +925,7 @@ class ContainerManager:
|
|
|
925
925
|
if result.returncode == 0:
|
|
926
926
|
console.print("")
|
|
927
927
|
console.print("[bold green]Authentication successful![/bold green]")
|
|
928
|
-
console.print(" Auth
|
|
928
|
+
console.print(" Auth persists across container stop/restart cycles.")
|
|
929
929
|
console.print("")
|
|
930
930
|
console.print(f" Start a tunnel: devs tunnel {dev_name}")
|
|
931
931
|
console.print(f" Then connect: code --remote tunnel+{tunnel_name} {container_workspace_dir}")
|
|
@@ -972,7 +972,7 @@ class ContainerManager:
|
|
|
972
972
|
'docker', 'exec', '-d',
|
|
973
973
|
container_name,
|
|
974
974
|
'/bin/sh', '-c',
|
|
975
|
-
f'
|
|
975
|
+
f'{tunnel_cmd} > {log_file} 2>&1'
|
|
976
976
|
]
|
|
977
977
|
|
|
978
978
|
if debug:
|
|
@@ -87,9 +87,9 @@ RUN SNIPPET="export PROMPT_COMMAND='history -a' && export HISTFILE=/commandhisto
|
|
|
87
87
|
ENV DEVCONTAINER=true
|
|
88
88
|
|
|
89
89
|
# Create workspace and config directories and set permissions
|
|
90
|
-
RUN mkdir -p /workspaces /home/node/claudeconfig /home/node/codexconfig /home/node/.vscode-server/extensions
|
|
90
|
+
RUN mkdir -p /workspaces /home/node/claudeconfig /home/node/codexconfig /home/node/.vscode-server/extensions && \
|
|
91
91
|
echo '[]' > /home/node/.vscode-server/extensions/extensions.json && \
|
|
92
|
-
chown -R node:node /workspaces /home/node /home/node/.vscode-server
|
|
92
|
+
chown -R node:node /workspaces /home/node /home/node/.vscode-server && \
|
|
93
93
|
chmod 755 /workspaces
|
|
94
94
|
|
|
95
95
|
WORKDIR /workspaces
|
|
@@ -142,7 +142,6 @@ RUN ARCH=$(dpkg --print-architecture) && \
|
|
|
142
142
|
RUN for shell_rc in /home/node/.zshrc /home/node/.bashrc; do \
|
|
143
143
|
echo "export CLAUDE_CONFIG_DIR=\"/home/node/claudeconfig\"" >> "$shell_rc" && \
|
|
144
144
|
echo "export CODEX_CONFIG_HOME=\"/home/node/codexconfig\"" >> "$shell_rc" && \
|
|
145
|
-
echo "export VSCODE_CLI_DATA_DIR=\"/home/node/.vscode/cli\"" >> "$shell_rc" && \
|
|
146
145
|
echo "export PATH=\"/home/node/.local/bin:\$PATH\"" >> "$shell_rc" && \
|
|
147
146
|
echo "alias claude=\"claude --dangerously-skip-permissions\"" >> "$shell_rc" && \
|
|
148
147
|
echo "alias codex=\"/usr/local/share/npm-global/bin/codex --full-auto\"" >> "$shell_rc" && \
|
|
@@ -83,8 +83,7 @@
|
|
|
83
83
|
// "source=${localEnv:WORKSPACE_FOLDER_NAME}-vscode-extensions,target=/home/node/.vscode-server/extensions,type=volume",
|
|
84
84
|
// .vscode-server includes extension state which we don't want to keep
|
|
85
85
|
// "source=${localEnv:WORKSPACE_FOLDER_NAME}-vscode-data,target=/home/node/.vscode-server,type=volume",
|
|
86
|
-
"source=${localEnv:WORKSPACE_FOLDER_NAME}-vscode-downloads,target=/home/node/.vscode-extensions-cache-volume,type=volume"
|
|
87
|
-
"source=${localEnv:HOME}/.devs/vscode-cli,target=/home/node/.vscode/cli,type=bind"
|
|
86
|
+
"source=${localEnv:WORKSPACE_FOLDER_NAME}-vscode-downloads,target=/home/node/.vscode-extensions-cache-volume,type=volume"
|
|
88
87
|
],
|
|
89
88
|
"remoteEnv": {
|
|
90
89
|
"NODE_OPTIONS": "--max-old-space-size=4096",
|
|
@@ -96,8 +95,7 @@
|
|
|
96
95
|
"DEVS_DEBUG": "${localEnv:DEVS_DEBUG}",
|
|
97
96
|
"DEVS_LIVE_MODE": "${localEnv:DEVS_LIVE_MODE}",
|
|
98
97
|
"DEVS_ENV_MOUNT_PATH": "${localEnv:DEVS_ENV_MOUNT_PATH}",
|
|
99
|
-
"DEVS_BRIDGE_MOUNT_PATH": "${localEnv:DEVS_BRIDGE_MOUNT_PATH}"
|
|
100
|
-
"VSCODE_CLI_DATA_DIR": "/home/node/.vscode/cli"
|
|
98
|
+
"DEVS_BRIDGE_MOUNT_PATH": "${localEnv:DEVS_BRIDGE_MOUNT_PATH}"
|
|
101
99
|
},
|
|
102
100
|
"workspaceFolder": "/workspaces/${localEnv:WORKSPACE_FOLDER_NAME}",
|
|
103
101
|
"postCreateCommand": "/usr/local/bin/post-create-wrapper.sh",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/scripts/post-create-wrapper.sh
RENAMED
|
File without changes
|
{devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/scripts/python-venv-integration.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/sudo-scripts/init-firewall.sh
RENAMED
|
File without changes
|
{devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/sudo-scripts/setup-devs-env.sh
RENAMED
|
File without changes
|
{devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/sudo-scripts/setup-vscode-cache.sh
RENAMED
|
File without changes
|
{devs_common-2.0.8 → devs_common-2.0.10}/devs_common/templates/sudo-scripts/start-services.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|