Merge pull request #101 from SparshGarg999/fix/46-windows-support-codex
feat(codex): add Windows support and compatibility for Codex plugin
This commit is contained in:
@@ -22,6 +22,7 @@ rules. The shared runner remains a plain shell entrypoint that the skill calls.
|
||||
|
||||
## Install
|
||||
|
||||
On Linux/macOS:
|
||||
```bash
|
||||
git clone https://github.com/microsoft/SkillOpt.git
|
||||
cd SkillOpt
|
||||
@@ -29,6 +30,14 @@ bash plugins/codex/install.sh # installs the skill
|
||||
export SKILLOPT_SLEEP_REPO="$(pwd)" # so the runner is found from anywhere
|
||||
```
|
||||
|
||||
On Windows (PowerShell):
|
||||
```powershell
|
||||
git clone <repo-url> SkillOpt-Sleep
|
||||
cd SkillOpt-Sleep
|
||||
powershell -File plugins/codex/install.ps1
|
||||
[System.Environment]::SetEnvironmentVariable("SKILLOPT_SLEEP_REPO", "$(pwd)", "User")
|
||||
```
|
||||
|
||||
If a previous install created `~/.codex/prompts/sleep.md`, the installer moves
|
||||
that deprecated prompt aside with a `.skillopt-legacy*.bak` suffix.
|
||||
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
# Install the SkillOpt-Sleep Codex integration as a user-level Codex skill on Windows.
|
||||
# Idempotent; prints what it does.
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$RepoRoot = Resolve-Path (Join-Path $PSScriptRoot "..\..")
|
||||
$CodexHome = if ($env:CODEX_HOME) { $env:CODEX_HOME } else { Join-Path $env:USERPROFILE ".codex" }
|
||||
$AgentsSkills = Join-Path $env:USERPROFILE ".agents\skills"
|
||||
$LegacyPrompt = Join-Path $CodexHome "prompts\sleep.md"
|
||||
|
||||
Write-Output "[install] repo: $RepoRoot"
|
||||
|
||||
# 1) user-level skill
|
||||
$SkillDir = Join-Path $AgentsSkills "skillopt-sleep"
|
||||
if (-not (Test-Path $SkillDir)) {
|
||||
New-Item -ItemType Directory -Path $SkillDir -Force | Out-Null
|
||||
}
|
||||
Copy-Item (Join-Path $RepoRoot "plugins\codex\skills\skillopt-sleep\SKILL.md") (Join-Path $SkillDir "SKILL.md") -Force
|
||||
Write-Output "[install] skill -> $(Join-Path $SkillDir 'SKILL.md')"
|
||||
|
||||
# 2) retire the old custom prompt entrypoint from previous installs
|
||||
if (Test-Path $LegacyPrompt) {
|
||||
$Backup = "${LegacyPrompt}.skillopt-legacy.bak"
|
||||
if (Test-Path $Backup) {
|
||||
$DateStr = Get-Date -Format "yyyyMMddHHmmss"
|
||||
$Backup = "${LegacyPrompt}.skillopt-legacy.${DateStr}.bak"
|
||||
}
|
||||
Move-Item $LegacyPrompt $Backup -Force
|
||||
Write-Output "[install] legacy prompt -> $Backup"
|
||||
}
|
||||
|
||||
# 3) record the repo location so the runner is found from anywhere
|
||||
Write-Output "[install] add to your environment variables:"
|
||||
Write-Output " [System.Environment]::SetEnvironmentVariable('SKILLOPT_SLEEP_REPO', '$RepoRoot', 'User')"
|
||||
Write-Output " Or set it via System Properties."
|
||||
|
||||
# 4) optional: append an AGENTS.md hint (only if the user opts in)
|
||||
Write-Output ""
|
||||
Write-Output "[install] Optional — add this to ~/.codex/AGENTS.md so Codex always knows the tool:"
|
||||
Write-Output ""
|
||||
Write-Output " ## SkillOpt-Sleep"
|
||||
Write-Output " Use the skillopt-sleep skill when I ask to run a sleep/dream/offline"
|
||||
Write-Output " self-improvement cycle. The runner is:"
|
||||
Write-Output " \`powershell -File `"$RepoRoot\plugins\run-sleep.ps1`" status --project `"\$(pwd)\`"\`."
|
||||
Write-Output ""
|
||||
Write-Output "Done. Try asking Codex:"
|
||||
Write-Output " Use the skillopt-sleep skill to run status for this project."
|
||||
@@ -65,6 +65,18 @@ bash "$SKILLOPT_SLEEP_REPO/plugins/run-sleep.sh" run --project "$(pwd)" \
|
||||
bash "$SKILLOPT_SLEEP_REPO/plugins/run-sleep.sh" adopt --project "$(pwd)"
|
||||
```
|
||||
|
||||
On Windows (CMD / PowerShell):
|
||||
```cmd
|
||||
:: CMD
|
||||
set SKILLOPT_SLEEP_REPO=C:\path\to\SkillOpt-Sleep
|
||||
"%SKILLOPT_SLEEP_REPO%\plugins\run-sleep.cmd" status --project "%CD%"
|
||||
```
|
||||
```powershell
|
||||
# PowerShell
|
||||
$env:SKILLOPT_SLEEP_REPO = "C:\path\to\SkillOpt-Sleep"
|
||||
powershell -File "$env:SKILLOPT_SLEEP_REPO\plugins\run-sleep.ps1" status --project "$(pwd)"
|
||||
```
|
||||
|
||||
Actions are `status`, `harvest`, `dry-run`, `run`, `adopt`, `schedule`, and `unschedule`.
|
||||
|
||||
- Default backend is `mock`, which is deterministic and spends no API budget.
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
@echo off
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
:: Resolve REPO_ROOT
|
||||
set "SCRIPT_DIR=%~dp0"
|
||||
:: Strip trailing backslash
|
||||
set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%"
|
||||
|
||||
set "REPO_ROOT="
|
||||
if exist "%SCRIPT_DIR%\..\skillopt_sleep" (
|
||||
cd /d "%SCRIPT_DIR%\.."
|
||||
set "REPO_ROOT=%CD%"
|
||||
goto root_resolved
|
||||
)
|
||||
if not "%CLAUDE_PLUGIN_ROOT%"=="" if exist "%CLAUDE_PLUGIN_ROOT%\..\..\skillopt_sleep" (
|
||||
cd /d "%CLAUDE_PLUGIN_ROOT%\..\.."
|
||||
set "REPO_ROOT=%CD%"
|
||||
goto root_resolved
|
||||
)
|
||||
if not "%SKILLOPT_SLEEP_REPO%"=="" if exist "%SKILLOPT_SLEEP_REPO%\skillopt_sleep" (
|
||||
set "REPO_ROOT=%SKILLOPT_SLEEP_REPO%"
|
||||
goto root_resolved
|
||||
)
|
||||
|
||||
:: Search upward from current directory
|
||||
set "d=%CD%"
|
||||
:loop
|
||||
if exist "!d!\skillopt_sleep" (
|
||||
set "REPO_ROOT=!d!"
|
||||
goto root_resolved
|
||||
)
|
||||
for %%I in ("!d!") do set "parent=%%~dpI"
|
||||
:: Strip trailing backslash from parent if it's not root
|
||||
if "!parent!"=="!d!" goto root_resolved
|
||||
set "parent=!parent:~0,-1!"
|
||||
if "!parent!"=="" goto root_resolved
|
||||
set "d=!parent!"
|
||||
goto loop
|
||||
|
||||
:root_resolved
|
||||
|
||||
if "%REPO_ROOT%"=="" goto fallback_mode
|
||||
|
||||
:: ── Source Checkout Mode ───────────────────────────────────────────
|
||||
set "PY="
|
||||
if not "%SKILLOPT_SLEEP_PYTHON%"=="" (
|
||||
set "PY=%SKILLOPT_SLEEP_PYTHON%"
|
||||
goto py_found
|
||||
)
|
||||
|
||||
for %%p in (python3.exe python.exe py.exe) do (
|
||||
where %%p >nul 2>nul
|
||||
if !errorlevel! equ 0 (
|
||||
%%p -c "import sys; sys.exit(0 if sys.version_info >= (3, 10) else 1)" >nul 2>nul
|
||||
if !errorlevel! equ 0 (
|
||||
set "PY=%%p"
|
||||
goto py_found
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
:py_found
|
||||
if "%PY%"=="" (
|
||||
echo [sleep] ERROR: need Python >= 3.10 (found none). >&2
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
cd /d "%REPO_ROOT%"
|
||||
if "%~1" == "" (
|
||||
"%PY%" -m skillopt_sleep status
|
||||
) else (
|
||||
"%PY%" -m skillopt_sleep %*
|
||||
)
|
||||
exit /b !errorlevel!
|
||||
|
||||
|
||||
:: ── Fallback Mode (No Source Checkout) ─────────────────────────────
|
||||
:fallback_mode
|
||||
|
||||
:: Fallback 1: skillopt-sleep CLI on PATH (uv tool install / pipx / pip install).
|
||||
where skillopt-sleep >nul 2>nul
|
||||
if !errorlevel! neq 0 goto try_fallback_2
|
||||
|
||||
if "%~1" == "" (
|
||||
skillopt-sleep status
|
||||
) else (
|
||||
skillopt-sleep %*
|
||||
)
|
||||
exit /b !errorlevel!
|
||||
|
||||
:try_fallback_2
|
||||
:: Fallback 2: importable as a module (pip install into the active Python).
|
||||
set "PY="
|
||||
for %%p in (python3.exe python.exe py.exe) do (
|
||||
where %%p >nul 2>nul
|
||||
if !errorlevel! equ 0 (
|
||||
%%p -c "import sys; sys.exit(0 if sys.version_info >= (3, 10) else 1)" >nul 2>nul
|
||||
if !errorlevel! equ 0 (
|
||||
%%p -c "import skillopt_sleep" >nul 2>nul
|
||||
if !errorlevel! equ 0 (
|
||||
set "PY=%%p"
|
||||
goto py_import_found
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
:py_import_found
|
||||
|
||||
if "%PY%" == "" goto not_found
|
||||
|
||||
if "%~1" == "" (
|
||||
"%PY%" -m skillopt_sleep status
|
||||
) else (
|
||||
"%PY%" -m skillopt_sleep %*
|
||||
)
|
||||
exit /b !errorlevel!
|
||||
|
||||
:not_found
|
||||
echo [sleep] ERROR: could not locate the skillopt_sleep package. >&2
|
||||
echo [sleep] Install it with 'uv tool install skillopt' or 'pip install skillopt', >&2
|
||||
echo [sleep] or set SKILLOPT_SLEEP_REPO to a clone of the SkillOpt repo. >&2
|
||||
exit /b 1
|
||||
@@ -0,0 +1,94 @@
|
||||
# SkillOpt-Sleep shared runner for Windows PowerShell
|
||||
# Resolves the repo root, picks Python >= 3.10, and runs the engine CLI.
|
||||
#
|
||||
# Usage: .\run-sleep.ps1 [status|run|dry-run|adopt|...] [args...]
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$ScriptDir = $PSScriptRoot
|
||||
|
||||
$RepoRoot = $null
|
||||
if (Test-Path (Join-Path $ScriptDir "..\skillopt_sleep")) {
|
||||
$RepoRoot = Resolve-Path (Join-Path $ScriptDir "..")
|
||||
} elseif ($env:CLAUDE_PLUGIN_ROOT -and (Test-Path (Join-Path $env:CLAUDE_PLUGIN_ROOT "..\..\skillopt_sleep"))) {
|
||||
$RepoRoot = Resolve-Path (Join-Path $env:CLAUDE_PLUGIN_ROOT "..\..")
|
||||
} elseif ($env:SKILLOPT_SLEEP_REPO -and (Test-Path (Join-Path $env:SKILLOPT_SLEEP_REPO "skillopt_sleep"))) {
|
||||
$RepoRoot = Resolve-Path $env:SKILLOPT_SLEEP_REPO
|
||||
} else {
|
||||
# search upward from current location
|
||||
$d = Get-Item .
|
||||
while ($d -and $d.FullName -ne $d.Root.FullName) {
|
||||
if (Test-Path (Join-Path $d.FullName "skillopt_sleep")) {
|
||||
$RepoRoot = $d.FullName
|
||||
break
|
||||
}
|
||||
$d = Split-Path -Parent $d.FullName -ErrorAction SilentlyContinue | Get-Item -ErrorAction SilentlyContinue
|
||||
}
|
||||
}
|
||||
|
||||
$argsList = @($args)
|
||||
if ($argsList.Count -eq 0) {
|
||||
$argsList = @("status")
|
||||
}
|
||||
|
||||
if ($RepoRoot) {
|
||||
$Py = ""
|
||||
if ($env:SKILLOPT_SLEEP_PYTHON) {
|
||||
$Py = $env:SKILLOPT_SLEEP_PYTHON
|
||||
} else {
|
||||
foreach ($cand in @("python3", "python", "py")) {
|
||||
$cmd = Get-Command $cand -ErrorAction SilentlyContinue
|
||||
if ($cmd) {
|
||||
$ver = & $cand -c "import sys; print('%d%d' % sys.version_info[:2])" 2>$null
|
||||
if ($ver -and [int]$ver -ge 310) {
|
||||
$Py = $cand
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $Py) {
|
||||
[Console]::Error.WriteLine("[sleep] ERROR: need Python >= 3.10 (found none).")
|
||||
exit 1
|
||||
}
|
||||
|
||||
Set-Location $RepoRoot
|
||||
& $Py -m skillopt_sleep $argsList
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
|
||||
# No source checkout found — fall back to an installed engine.
|
||||
|
||||
# Fallback 1: skillopt-sleep CLI on PATH (uv tool install / pipx / pip install).
|
||||
$cliCmd = Get-Command "skillopt-sleep" -ErrorAction SilentlyContinue
|
||||
if ($cliCmd) {
|
||||
& skillopt-sleep $argsList
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
|
||||
# Fallback 2: importable as a module (pip install into the active Python).
|
||||
$Py = ""
|
||||
foreach ($cand in @("python3", "python", "py")) {
|
||||
$cmd = Get-Command $cand -ErrorAction SilentlyContinue
|
||||
if ($cmd) {
|
||||
$ver = & $cand -c "import sys; print('%d%d' % sys.version_info[:2])" 2>$null
|
||||
if ($ver -and [int]$ver -ge 310) {
|
||||
$hasModule = & $cand -c "import skillopt_sleep" 2>$null
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
$Py = $cand
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($Py) {
|
||||
& $Py -m skillopt_sleep $argsList
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
|
||||
[Console]::Error.WriteLine("[sleep] ERROR: could not locate the skillopt_sleep package.")
|
||||
[Console]::Error.WriteLine("[sleep] Install it with 'uv tool install skillopt' or 'pip install skillopt',")
|
||||
[Console]::Error.WriteLine("[sleep] or set SKILLOPT_SLEEP_REPO to a clone of the SkillOpt repo.")
|
||||
exit 1
|
||||
Reference in New Issue
Block a user