OpenSpace/scripts/install-global-codex-openspace

133 lines
4.9 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd -- "$SCRIPT_DIR/.." && pwd)"
REPO_PYTHON="$REPO_ROOT/.venv/bin/python"
CODEX_HOME="${CODEX_HOME:-$HOME/.codex}"
BIN_DIR="$CODEX_HOME/bin"
if [[ ! -x "$REPO_PYTHON" ]]; then
echo "Missing OpenSpace Python runtime: $REPO_PYTHON" >&2
exit 1
fi
mkdir -p "$BIN_DIR"
cat > "$BIN_DIR/openspace-global-mcp" <<EOF
#!/usr/bin/env bash
set -euo pipefail
REPO_ROOT="$REPO_ROOT"
CODEX_HOME="$CODEX_HOME"
REPO_PYTHON="\$REPO_ROOT/.venv/bin/python"
if [[ ! -x "\$REPO_PYTHON" ]]; then
echo "Missing OpenSpace Python runtime: \$REPO_PYTHON" >&2
exit 1
fi
workspace="\${OPENSPACE_WORKSPACE:-\$PWD}"
workspace_explicit=0
if [[ -n "\${OPENSPACE_WORKSPACE:-}" ]]; then
workspace_explicit=1
fi
if git_root="\$(git -C "\$workspace" rev-parse --show-toplevel 2>/dev/null)"; then
workspace="\$git_root"
fi
if [[ "\$workspace_explicit" == "0" && ( -z "\$workspace" || "\$workspace" == "/" || "\$workspace" == "." ) ]]; then
project_skill_dir="\${HOME}/.codex/projects/default/skills"
mkdir -p "\$project_skill_dir" "\${HOME}/.codex/skills"
unset OPENSPACE_WORKSPACE
export OPENSPACE_HOST_SKILL_DIRS="\${HOME}/.codex/projects/default/skills,\${HOME}/.codex/skills"
export OPENSPACE_MCP_PROXY_MODE="direct"
export OPENSPACE_MCP_DAEMON_STATE_DIR="\${OPENSPACE_MCP_DAEMON_STATE_DIR:-\${CODEX_HOME}/state/openspace}"
mkdir -p "\$OPENSPACE_MCP_DAEMON_STATE_DIR"
echo "Warning: Codex Desktop did not provide a usable workspace. Shared OpenSpace daemons were disabled for safety; workspace-aware tools must rely on explicit workspace_dir." >&2
exec "\$REPO_PYTHON" -m openspace.mcp_proxy --kind main --transport stdio
fi
project_name="\$(basename "\$workspace")"
if [[ -z "\$project_name" || "\$project_name" == "/" || "\$project_name" == "." ]]; then
project_name="default"
fi
project_skill_dir="\${HOME}/.codex/projects/\${project_name}/skills"
mkdir -p "\$project_skill_dir" "\${HOME}/.codex/skills"
export OPENSPACE_WORKSPACE="\$workspace"
export OPENSPACE_HOST_SKILL_DIRS="\${OPENSPACE_HOST_SKILL_DIRS:-\${project_skill_dir},\${HOME}/.codex/skills}"
export OPENSPACE_MCP_PROXY_MODE="\${OPENSPACE_MCP_PROXY_MODE:-daemon}"
export OPENSPACE_MCP_DAEMON_STATE_DIR="\${OPENSPACE_MCP_DAEMON_STATE_DIR:-\${CODEX_HOME}/state/openspace}"
mkdir -p "\$OPENSPACE_MCP_DAEMON_STATE_DIR"
exec "\$REPO_PYTHON" -m openspace.mcp_proxy --kind main --transport stdio
EOF
cat > "$BIN_DIR/openspace-evolution-global-mcp" <<EOF
#!/usr/bin/env bash
set -euo pipefail
REPO_ROOT="$REPO_ROOT"
CODEX_HOME="$CODEX_HOME"
REPO_PYTHON="\$REPO_ROOT/.venv/bin/python"
if [[ ! -x "\$REPO_PYTHON" ]]; then
echo "Missing OpenSpace Python runtime: \$REPO_PYTHON" >&2
exit 1
fi
workspace="\${OPENSPACE_WORKSPACE:-\$PWD}"
workspace_explicit=0
if [[ -n "\${OPENSPACE_WORKSPACE:-}" ]]; then
workspace_explicit=1
fi
if git_root="\$(git -C "\$workspace" rev-parse --show-toplevel 2>/dev/null)"; then
workspace="\$git_root"
fi
if [[ "\$workspace_explicit" == "0" && ( -z "\$workspace" || "\$workspace" == "/" || "\$workspace" == "." ) ]]; then
project_skill_dir="\${HOME}/.codex/projects/default/skills"
mkdir -p "\$project_skill_dir" "\${HOME}/.codex/skills"
unset OPENSPACE_WORKSPACE
export OPENSPACE_HOST_SKILL_DIRS="\${HOME}/.codex/projects/default/skills,\${HOME}/.codex/skills"
export OPENSPACE_MCP_PROXY_MODE="direct"
export OPENSPACE_MCP_DAEMON_STATE_DIR="\${OPENSPACE_MCP_DAEMON_STATE_DIR:-\${CODEX_HOME}/state/openspace}"
mkdir -p "\$OPENSPACE_MCP_DAEMON_STATE_DIR"
echo "Warning: Codex Desktop did not provide a usable workspace. Shared OpenSpace daemons were disabled for safety; workspace-aware tools must rely on explicit workspace_dir." >&2
exec "\$REPO_PYTHON" -m openspace.mcp_proxy --kind evolution --transport stdio
fi
export OPENSPACE_WORKSPACE="\$workspace"
project_name="\$(basename "\$OPENSPACE_WORKSPACE")"
if [[ -z "\$project_name" || "\$project_name" == "/" || "\$project_name" == "." ]]; then
project_name="default"
fi
project_skill_dir="\${HOME}/.codex/projects/\${project_name}/skills"
mkdir -p "\$project_skill_dir" "\${HOME}/.codex/skills"
export OPENSPACE_HOST_SKILL_DIRS="\${OPENSPACE_HOST_SKILL_DIRS:-\${project_skill_dir},\${HOME}/.codex/skills}"
export OPENSPACE_MCP_PROXY_MODE="\${OPENSPACE_MCP_PROXY_MODE:-daemon}"
export OPENSPACE_MCP_DAEMON_STATE_DIR="\${OPENSPACE_MCP_DAEMON_STATE_DIR:-\${CODEX_HOME}/state/openspace}"
mkdir -p "\$OPENSPACE_MCP_DAEMON_STATE_DIR"
exec "\$REPO_PYTHON" -m openspace.mcp_proxy --kind evolution --transport stdio
EOF
chmod +x "$BIN_DIR/openspace-global-mcp" "$BIN_DIR/openspace-evolution-global-mcp"
cat <<EOF
Installed:
- $BIN_DIR/openspace-global-mcp
- $BIN_DIR/openspace-evolution-global-mcp
Next:
1. Point your global ~/.codex/config.toml MCP entries at those two wrapper scripts.
2. Keep your global ~/.codex/AGENTS.md rules in sync with the repo docs.
Reference:
- $REPO_ROOT/docs/global-codex-integration.md
EOF