AI skills in use in my daily
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

94 lines
3.7 KiB

# Fake nightshift for lights-out end-to-end testing.
# Mimics the real CLI's observable contract: creates .nightshift\runs\<runId>\ with notes.md,
# prompt.md, nightshift.log, and end-state.json, makes a real commit on a nightshift/<runId>
# branch, then exits.
param()
$allArgs = @($args)
New-Item -ItemType Directory -Force -Path $env:LIGHTS_OUT_ROOT | Out-Null
$allArgs | ConvertTo-Json -Depth 5 | Set-Content -LiteralPath (Join-Path $env:LIGHTS_OUT_ROOT 'stub-args.json') -Encoding UTF8
# The prompt is the final positional argument.
$prompt = $allArgs[-1]
function Get-StubRunId([string]$P) {
$slug = $P.ToLowerInvariant()
$slug = [regex]::Replace($slug, '[^a-z0-9]+', '-')
$slug = [regex]::Replace($slug, '^-+', '')
$slug = [regex]::Replace($slug, '-+$', '')
if ($slug.Length -gt 20) { $slug = $slug.Substring(0, 20) }
$slug = [regex]::Replace($slug, '-+$', '')
$sha = [System.Security.Cryptography.SHA256]::Create()
try {
$hex = -join ($sha.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($P)) | ForEach-Object { $_.ToString('x2') })
}
finally { $sha.Dispose() }
"$slug-$($hex.Substring(0,6))"
}
$runId = Get-StubRunId $prompt
$stopWhen = ''
$useWorktree = $false
for ($i = 0; $i -lt $allArgs.Count - 1; $i++) {
if ($allArgs[$i] -eq '--stop-when') { $stopWhen = $allArgs[$i + 1] }
if ($allArgs[$i] -eq '--worktree') { $useWorktree = $true }
}
Write-Output "stub-nightshift: starting run $runId"
$effectiveRoot = (Get-Location).Path
if ($useWorktree) {
$repoRoot = (git rev-parse --show-toplevel)
$repoName = Split-Path -Leaf $repoRoot
$repoParent = Split-Path -Parent $repoRoot
for ($suffix = 0; $suffix -lt 100; $suffix++) {
$actualRunId = if ($suffix -eq 0) { $runId } else { "$runId-$suffix" }
$worktreePath = Join-Path $repoParent "$repoName-nightshift-worktrees\$actualRunId"
git worktree add -q -b "nightshift/$actualRunId" $worktreePath HEAD 2>$null
if ($LASTEXITCODE -eq 0) {
$runId = $actualRunId
break
}
}
Set-Location -LiteralPath $worktreePath
$effectiveRoot = $worktreePath
}
$runDir = Join-Path (Get-Location) ".nightshift\runs\$runId"
New-Item -ItemType Directory -Force -Path $runDir | Out-Null
Set-Content -LiteralPath (Join-Path $runDir 'prompt.md') -Value $prompt -Encoding UTF8
$notes = "# nightshift run: $runId`n`n## Iteration Log`n`n### Iteration 1`nSimplified the widget helper. Tests still green.`n`n### Iteration 2`nRemoved a redundant branch in index.js.`n"
Set-Content -LiteralPath (Join-Path $runDir 'notes.md') -Value $notes -Encoding UTF8
'{"level":"info","message":"stub engine log"}' | Set-Content -LiteralPath (Join-Path $runDir 'nightshift.log') -Encoding UTF8
if (-not $useWorktree) {
for ($suffix = 0; $suffix -lt 100; $suffix++) {
$actualRunId = if ($suffix -eq 0) { $runId } else { "$runId-$suffix" }
git checkout -q -b "nightshift/$actualRunId" 2>$null
if ($LASTEXITCODE -eq 0) {
$runId = $actualRunId
break
}
}
}
'export const widget = (x) => x + 1;' | Set-Content -LiteralPath 'index.js'
git add -A
git commit -q -m 'refactor: simplify widget helper'
'// tidied' | Add-Content -LiteralPath 'README.md'
git add -A
git commit -q -m 'docs: tidy readme'
@{
status = 'completed'
stopCondition = $stopWhen
agentError = $null
iterations = 2
successCount = 2
failCount = 0
endedAt = (Get-Date).ToString('o')
} | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $runDir 'end-state.json') -Encoding UTF8
Write-Output " debug log $(Join-Path $runDir 'nightshift.log')"
if ($useWorktree) { Write-Output "nightshift: worktree preserved at $effectiveRoot" }
Write-Output "stub-nightshift: done"
exit 0