Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
36ff9f5
Move plugins to single binary runtime
backnotprop May 18, 2026
e7260ee
Add plugin subpath exports to shared package
backnotprop May 18, 2026
c5b203d
Add long-running Plannotator daemon runtime (#734)
backnotprop May 27, 2026
66f0494
Remove legacy standalone apps, archive, and integrations (#797)
backnotprop May 27, 2026
ebe989a
Simplify extensions to thin wrappers: server-owned prompts, vendor tr…
backnotprop May 28, 2026
f864e4b
Start daemon on install with stop-before-replace upgrade cycle
backnotprop May 28, 2026
12d7bd2
Replace ConfigStore with Zustand vanilla store
backnotprop May 28, 2026
9b1b33b
Add full provenance record for feat/single-server-runtime stack
backnotprop May 28, 2026
a6e1796
Update provenance record with full 13-PR stack history
backnotprop May 28, 2026
c9fc47a
Mark Tab mode config backlog item DONE (already wired end-to-end)
backnotprop May 28, 2026
94e287c
Add post-merge human verification steps for PR #813 (dialog) and #814…
backnotprop May 28, 2026
e5394a8
refactor(frontend): migrate AddProjectDialog to Radix Dialog (#813)
backnotprop May 28, 2026
39b4ead
Support GitLab: custom-domain detection + MR list/detailed (#814)
backnotprop May 28, 2026
769fcee
Fix order-dependent PR-stack grouping via leaf-rooting (#815)
backnotprop May 28, 2026
2c50bff
Backlog: mark configStore→Zustand migration DONE (shipped in #808)
backnotprop May 28, 2026
66593cf
Fix PR review reactivation posting against stale head commit (#816)
backnotprop May 28, 2026
46ab2cd
Docs: document PR re-review reactivation + head-SHA refresh as canoni…
backnotprop May 28, 2026
aa4430f
Backlog: notify the user when a session updates live (session-revision)
backnotprop May 28, 2026
06f555a
Remove docs/ (single-binary-runtime, adversarial_rubric); fix dead li…
backnotprop May 28, 2026
f483e60
Add main→branch merge carry-in inventory (what to port, what's silent…
backnotprop May 28, 2026
286f038
Merge remote-tracking branch 'origin/main' into merge/main-into-ssr
backnotprop May 29, 2026
13d7532
Make Amp a conforming thin wrapper (plugin-client); drop orphan pi se…
backnotprop May 29, 2026
4690e6b
Fix release smoke: authenticate /daemon/* requests with the daemon token
backnotprop May 29, 2026
eef3754
Fix Windows smoke: force IPv4 on session URL + add failure diagnostics
backnotprop May 29, 2026
eac9178
Remove unused @vitest/browser-playwright scaffolding
backnotprop May 29, 2026
7d2dd7b
Drop deleted vitest.browser.config.ts from frontend tsconfig include
backnotprop May 29, 2026
ed1dea1
Backlog: Amp plugin needs a bundled dist for standalone (curl) install
backnotprop May 29, 2026
6e65aa3
Stop ignoring /goals/ — it holds tracked project docs, not setup-goal…
backnotprop May 29, 2026
6964b34
Re-inventory performance findings: 8 fixed, 2 partial, 29 open (HEAD …
backnotprop May 29, 2026
5dd3484
Provenance: add post-stack phase (#813-816, main merge, CI fixes); re…
backnotprop May 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
137 changes: 0 additions & 137 deletions .agents/skills/pierre-guard/SKILL.md

This file was deleted.

107 changes: 60 additions & 47 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
- name: Install dependencies
run: bun install

- name: Generate Pi extension shared copies
- name: Generate Pi extension shared helpers
run: bash apps/pi-extension/vendor.sh

- name: Type check
Expand Down Expand Up @@ -68,7 +68,6 @@ jobs:

- name: Build UI
run: |
bun run build:review
bun run build:hook

- name: Compile binaries (cross-compile all targets)
Expand Down Expand Up @@ -168,24 +167,41 @@ jobs:
PLANNOTATOR_PORT="$port" "$@" &
local pid=$!
local ok=0
# Daemon control routes (/daemon/*) require the daemon auth token,
# which is written to the daemon state file. Read it and send it as
# a bearer token on the smoke's requests, or every call 401s.
local state_file="${PLANNOTATOR_DATA_DIR:-$HOME/.plannotator}/daemon.json"

for _ in $(seq 1 60); do
if curl -sf "http://127.0.0.1:${port}${endpoint}" -o /dev/null 2>/dev/null; then
ok=1
break
local token=""
if [ -f "$state_file" ]; then
token="$(python3 -c "import json,sys; print(json.load(open(sys.argv[1])).get('authToken',''))" "$state_file" 2>/dev/null || true)"
fi
if [ -n "$token" ]; then
local sessions
sessions="$(curl -sf -H "Authorization: Bearer ${token}" "http://127.0.0.1:${port}/daemon/sessions" 2>/dev/null || true)"
if [ -n "$sessions" ]; then
local session_url
session_url="$(python3 -c 'import json,sys; data=json.load(sys.stdin); sessions=data.get("sessions") or []; print(sessions[0].get("url","") if sessions else "")' <<< "$sessions")"
if [ -n "$session_url" ] && curl -sf -H "Authorization: Bearer ${token}" "${session_url}${endpoint}" -o /dev/null 2>/dev/null; then
ok=1
break
fi
fi
fi
sleep 0.5
done

kill "$pid" 2>/dev/null || true
wait "$pid" 2>/dev/null || true
PLANNOTATOR_PORT="$port" "$BINARY" daemon stop >/dev/null 2>&1 || true

if [ "$ok" = "0" ]; then
echo "FAIL: ${label} did not respond on :${port}${endpoint}"
echo "FAIL: ${label} did not expose a daemon-scoped ${endpoint}"
exit 1
fi

echo "OK: ${label} responded on :${port}${endpoint}"
echo "OK: ${label} exposed daemon-scoped ${endpoint}"
}

# 2. review: exercises server startup, bundled HTML, git diff, and HTTP.
Expand Down Expand Up @@ -229,36 +245,67 @@ jobs:
-RedirectStandardError $stderr
$ok = $false

# Daemon control routes (/daemon/*) require the daemon auth token
# from the state file; send it as a bearer token or requests 401.
$dataDir = if ($env:PLANNOTATOR_DATA_DIR) { $env:PLANNOTATOR_DATA_DIR } else { Join-Path $env:USERPROFILE ".plannotator" }
$stateFile = Join-Path $dataDir "daemon.json"
$diagToken = $false
$diagSessions = "(none)"
$diagSessionUrl = "(none)"
$diagApi = "(not reached)"
try {
for ($i = 0; $i -lt 60; $i++) {
try {
Invoke-WebRequest -Uri "http://127.0.0.1:$Port$Endpoint" -UseBasicParsing -TimeoutSec 1 | Out-Null
$ok = $true
break
$token = ""
if (Test-Path $stateFile) {
$token = (Get-Content $stateFile -Raw | ConvertFrom-Json).authToken
}
if ($token) {
$diagToken = $true
$headers = @{ Authorization = "Bearer $token" }
$sessionsResponse = Invoke-WebRequest -Uri "http://127.0.0.1:$Port/daemon/sessions" -Headers $headers -UseBasicParsing -TimeoutSec 2
$diagSessions = "HTTP $($sessionsResponse.StatusCode)"
$sessionsBody = $sessionsResponse.Content | ConvertFrom-Json
if ($sessionsBody.sessions.Count -gt 0) {
# The daemon binds IPv4 127.0.0.1, but the session url uses
# "localhost", which Invoke-WebRequest resolves to IPv6 ::1
# first on Windows and then fails to connect. Force IPv4.
$sessionUrl = ($sessionsBody.sessions[0].url) -replace '://localhost:', '://127.0.0.1:'
$diagSessionUrl = $sessionUrl
$apiResponse = Invoke-WebRequest -Uri "$sessionUrl$Endpoint" -Headers $headers -UseBasicParsing -TimeoutSec 2
$diagApi = "HTTP $($apiResponse.StatusCode)"
$ok = $true
break
}
}
} catch {
$diagApi = "exception: $($_.Exception.Message)"
if ($process.HasExited) {
break
}
Start-Sleep -Milliseconds 500
}
Start-Sleep -Milliseconds 500
}
} finally {
if (-not $process.HasExited) {
Stop-Process -Id $process.Id -Force
Wait-Process -Id $process.Id -ErrorAction SilentlyContinue
}
& $binary daemon stop *> $null
Remove-Item Env:\PLANNOTATOR_PORT -ErrorAction SilentlyContinue
}

if (-not $ok) {
Write-Host "diag: stateFile=$stateFile exists=$(Test-Path $stateFile) tokenSeen=$diagToken"
Write-Host "diag: sessions=$diagSessions sessionUrl=$diagSessionUrl api=$diagApi"
Write-Host "stdout:"
Get-Content $stdout -ErrorAction SilentlyContinue
Write-Host "stderr:"
Get-Content $stderr -ErrorAction SilentlyContinue
throw "FAIL: $Label did not respond on :$Port$Endpoint"
throw "FAIL: $Label did not expose a daemon-scoped $Endpoint"
}

Write-Host "OK: $Label responded on :$Port$Endpoint"
Write-Host "OK: $Label exposed daemon-scoped $Endpoint"
}

# 2. review: exercises server startup, bundled HTML, git diff, and HTTP.
Expand All @@ -267,37 +314,6 @@ jobs:
# 3. annotate: exercises annotate server startup with a real file.
Test-PlannotatorServer "plannotator annotate" "19501" "/api/plan" @("annotate", "README.md")

pi-extension-ai-runtime-windows:
needs: test
# Exercises the Pi extension's Node/jiti server mirror on Windows with an
# npm-style `pi` shim pair. The binary smoke above covers the compiled Bun
# CLI, but the published Pi extension uses this separate Node path.
name: Pi extension AI runtime (Windows)
runs-on: windows-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version: 1.3.11

- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24

- name: Install dependencies
run: bun install

- name: Generate Pi extension shared copies
shell: bash
run: bash apps/pi-extension/vendor.sh

- name: Build Pi AI runtime smoke
run: bun build scripts/smoke-pi-extension-ai-runtime.ts --target=node --outfile "$env:RUNNER_TEMP/pi-ai-runtime-smoke.mjs"

- name: Run Pi AI runtime smoke
run: node "$env:RUNNER_TEMP/pi-ai-runtime-smoke.mjs"

install-script-smoke:
needs: build
runs-on: ${{ matrix.os }}
Expand Down Expand Up @@ -454,7 +470,6 @@ jobs:
needs:
- build
- smoke-binaries
- pi-extension-ai-runtime-windows
- install-script-smoke
if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
Expand Down Expand Up @@ -521,7 +536,6 @@ jobs:
needs:
- build
- smoke-binaries
- pi-extension-ai-runtime-windows
- install-script-smoke
runs-on: ubuntu-latest
permissions:
Expand All @@ -544,7 +558,6 @@ jobs:

- name: Build packages
run: |
bun run build:review
bun run build:hook
bun run build:opencode
bun run build:pi
Expand Down
33 changes: 1 addition & 32 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
- name: Install dependencies
run: bun install

- name: Generate Pi extension shared copies
- name: Generate Pi extension shared helpers
run: bash apps/pi-extension/vendor.sh

- name: Type check
Expand All @@ -31,37 +31,6 @@ jobs:
- name: Run tests
run: bun test

pi-extension-ai-runtime-windows:
# Exercises the Pi extension's Node/jiti server mirror on Windows with an
# npm-style `pi` shim pair. This catches regressions where `where pi`
# resolves the extensionless shim before pi.cmd and the Ask AI provider
# crashes before the plan review UI opens.
name: Pi extension AI runtime (Windows)
runs-on: windows-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with:
bun-version: latest

- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24

- name: Install dependencies
run: bun install

- name: Generate Pi extension shared copies
shell: bash
run: bash apps/pi-extension/vendor.sh

- name: Build Pi AI runtime smoke
run: bun build scripts/smoke-pi-extension-ai-runtime.ts --target=node --outfile "$env:RUNNER_TEMP/pi-ai-runtime-smoke.mjs"

- name: Run Pi AI runtime smoke
run: node "$env:RUNNER_TEMP/pi-ai-runtime-smoke.mjs"

install-cmd-windows:
# End-to-end integration test for scripts/install.cmd on real cmd.exe.
# The unit tests in scripts/install.test.ts are file-content string checks
Expand Down
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,4 @@ plannotator-local
# Local research/reference docs (not for repo)
/reference/
/Plannotator Waitlist Signup/
# Local goal setup packages generated by the setup-goal skill.
/goals/
*.bun-build
Loading
Loading