Commit graph

4537 commits

Author SHA1 Message Date
copilot-swe-agent[bot]
bb598c78e3 fix: harden publish verification and document fix for missing dist/loader.js
Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
2026-03-14 00:53:26 -06:00
copilot-swe-agent[bot]
71e5d09420 Initial plan 2026-03-14 00:52:48 -06:00
TÂCHES
d5f99ef626 Merge pull request #319 from gsd-build/release/v2.10.7
release: v2.10.7
2026-03-14 00:33:09 -06:00
Lex Christopherson
a3a5770326 2.10.7 2026-03-14 00:28:41 -06:00
Lex Christopherson
acc8cfa7dc docs: update changelog for v2.10.7
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 00:28:22 -06:00
copilot-swe-agent[bot]
ce67189156 revert: remove accidentally committed package dependency changes
Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
2026-03-14 06:11:12 +00:00
copilot-swe-agent[bot]
a89f45ce91 fix(#300): update stale comments that described old buggy behavior
Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
2026-03-14 06:10:42 +00:00
copilot-swe-agent[bot]
ece02e5492 Initial plan 2026-03-14 06:02:16 +00:00
TÂCHES
c188fab42c Merge pull request #316 from gsd-build/fix/stale-completed-unit-oom-313
fix: treat unresolvable artifact paths as stale completion state
2026-03-14 00:00:37 -06:00
TÂCHES
500cb5f6f3 Merge branch 'main' into fix/stale-completed-unit-oom-313 2026-03-13 23:51:34 -06:00
Lex Christopherson
fe11285ed5 fix: treat unresolvable artifact paths as stale completion state (#313)
verifyExpectedArtifact() returned true when resolveExpectedArtifactPath()
returned null, conflating "unit type has no artifact" with "slice directory
missing on disk". This caused /gsd auto to infinitely skip and re-dispatch
the same stale completed-unit entry until OOM.

Now only replan-slice (the sole type with no verifiable artifact) passes
on null; all other types return false, triggering the existing eviction
logic that removes the stale key and re-runs the unit.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-13 23:51:04 -06:00
TÂCHES
0e96984e3f Merge pull request #315 from gsd-build/copilot/fix-auto-mode-git-issues
[WIP] Fix auto-mode force-adding .gsd/ files to git
2026-03-13 23:50:26 -06:00
TÂCHES
658e83bd58 Merge branch 'main' into copilot/fix-auto-mode-git-issues 2026-03-13 23:44:20 -06:00
TÂCHES
e6d815a26a Merge pull request #310 from gsd-build/feat/fix-merge-session
feat: auto-resolve merge conflicts via fix-merge LLM session
2026-03-13 23:41:46 -06:00
copilot-swe-agent[bot]
7299f322aa Initial plan 2026-03-14 05:40:22 +00:00
Lex Christopherson
9298467ece fix: update integration branch test to match #300 behavior
writeIntegrationBranch now intentionally updates when the branch changes
(#300). Updated the stale "idempotent — doesn't overwrite" test to assert
the new behavior, and added a separate test for same-branch idempotency.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-13 23:37:56 -06:00
TÂCHES
ff1d7c5af9 Merge branch 'main' into feat/fix-merge-session 2026-03-13 23:37:31 -06:00
TÂCHES
6d5d918c40 Merge pull request #299 from frizynn/fix/macos-keybinding-display
fix: display ⌥ instead of Alt for keybindings on macOS
2026-03-13 23:35:00 -06:00
Lex Christopherson
33e5ec6d37 fix: replace TS parameter properties with explicit fields for Node strip-types compatibility
MergeConflictError used `public readonly` constructor parameter properties,
which are not supported by Node's --experimental-strip-types mode (type
stripping only, no TS-to-JS transforms). This crashed 19 test files on import.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-13 23:33:28 -06:00
TÂCHES
b287457250 Merge branch 'main' into feat/fix-merge-session 2026-03-13 23:32:13 -06:00
TÂCHES
475ed645b4 Merge branch 'main' into fix/macos-keybinding-display 2026-03-13 23:25:08 -06:00
TÂCHES
4901191208 Merge pull request #308 from gsd-build/copilot/search-legacy-dead-code
Remove deprecated legacy OAuth dead code
2026-03-13 23:24:51 -06:00
TÂCHES
a11b828e5d Merge branch 'main' into copilot/search-legacy-dead-code 2026-03-13 23:21:35 -06:00
TÂCHES
3fd7b9d8e2 Merge branch 'main' into feat/fix-merge-session 2026-03-13 23:21:25 -06:00
TÂCHES
1302e06f75 Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-03-13 23:21:14 -06:00
TÂCHES
bdb5defa3a Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-03-13 23:20:59 -06:00
TÂCHES
742e26abc1 Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-03-13 23:20:48 -06:00
TÂCHES
8b068f98bc Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-03-13 23:20:39 -06:00
TÂCHES
d887cf40d1 Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-03-13 23:20:28 -06:00
TÂCHES
c9d626b030 Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-03-13 23:20:17 -06:00
TÂCHES
a6be172829 Merge branch 'main' into fix/macos-keybinding-display 2026-03-13 23:18:34 -06:00
TÂCHES
b5c89b8e1b Merge pull request #309 from gsd-build/fix/303-secrets-gate-recheck
fix: re-check secrets manifest before every dispatch, not just at startAuto
2026-03-13 23:18:21 -06:00
TÂCHES
079d1751b0 Merge branch 'main' into feat/fix-merge-session 2026-03-13 23:17:02 -06:00
TÂCHES
9ef7536f3d Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-03-13 23:13:06 -06:00
TÂCHES
0810aec739 Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-03-13 23:12:49 -06:00
Lex Christopherson
a68fa00b4c feat: auto-resolve merge conflicts via fix-merge LLM session
When auto-mode merges a completed slice and hits code conflicts in
non-.gsd files, dispatch a fix-merge session to resolve them instead
of hard-resetting and stopping. This eliminates the #1 cause of
unnecessary auto-mode stops.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-13 23:12:08 -06:00
copilot-swe-agent[bot]
bbfbb66ed2 Remove deprecated legacy dead code from OAuth module
Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
2026-03-14 05:11:55 +00:00
Lex Christopherson
2b96b1a247 fix: re-check secrets manifest before every dispatch, not just at startAuto
When plan-milestone writes SECRETS-MANIFEST.md, the secrets gate at
startAuto has already fired (manifest didn't exist yet). Without a
re-check, the model proceeds into plan-slice / execute-task with no
real credentials and mocks external services — cascading risk into
every downstream slice.

Added a secrets re-check gate inside dispatchNextUnit that runs before
every unit dispatch. getManifestStatus is cheap (file read + .env
scan) so the check is a no-op when no manifest exists or all secrets
are already collected. Idempotent: skips keys already present in .env.

Closes #303
2026-03-13 23:07:01 -06:00
copilot-swe-agent[bot]
a8452aa684 Initial plan 2026-03-14 05:01:32 +00:00
TÂCHES
63e30e842d Merge pull request #306 from gsd-build/fix/301-remove-delivery-retry
fix: remove infinite delivery retry loop for background job completions
2026-03-13 22:49:49 -06:00
Lex Christopherson
4924bbe6b2 fix: update integration branch when user starts auto-mode from a different branch (#300)
writeIntegrationBranch was unconditionally skipping if any integration
branch was already recorded, even if the user started auto-mode from a
different branch. Now it only skips when the recorded branch matches —
if it differs, the record is updated so slices merge to the correct target.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-13 22:47:14 -06:00
TÂCHES
8536d028bf Merge branch 'main' into fix/301-remove-delivery-retry 2026-03-13 22:46:38 -06:00
TÂCHES
dca35ab3ea Merge branch 'main' into fix/macos-keybinding-display 2026-03-13 22:46:13 -06:00
TÂCHES
770132b20e fix: eliminate branch checkout during slice merge that caused STATE.md conflicts (#302) (#307)
The merge flow checked out the slice branch mid-merge to untrack runtime
files, which failed when .gsd/STATE.md had uncommitted working tree changes.
Instead, strip runtime files from the staged merge result post-merge — no
branch switching needed.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-13 22:43:02 -06:00
TÂCHES
f01858a4c9 Merge branch 'main' into fix/301-remove-delivery-retry 2026-03-13 22:42:56 -06:00
Lex Christopherson
9feca64496 fix: eliminate branch checkout during slice merge that caused STATE.md conflicts (#302)
The merge flow checked out the slice branch mid-merge to untrack runtime
files, which failed when .gsd/STATE.md had uncommitted working tree changes.
Instead, strip runtime files from the staged merge result post-merge — no
branch switching needed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-13 22:38:54 -06:00
TÂCHES
3cf7b7435e ci: harden publish pipeline to prevent broken releases (#304)
* fix: suppress git credential prompts that freeze TUI (#280)

Set GIT_TERMINAL_PROMPT=0 and GIT_ASKPASS="" on all git subprocess calls
so git fails immediately instead of prompting for credentials when tokens
expire, which deadlocks the TUI's stdin.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* ci: add CI workflow and fix publish to prevent broken releases

Add ci.yml that runs build + test + smoke test on every push/PR to main.
Fix build-native.yml publish job to explicitly build before publishing,
verify dist/loader.js exists, check tarball contents, and smoke test the
published package.

Closes #293

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-13 22:35:19 -06:00
Lex Christopherson
f102559d28 fix: remove infinite delivery retry loop for background job completions (#301)
Background job completions were delivered via an infinite retry loop with
exponential backoff. Since delivery is an in-process function call (not a
network operation), retries served no purpose and caused each retry to
trigger a full LLM turn — burning tokens indefinitely until the 5-minute
eviction timer fired.

Delivery is now fire-once. The acknowledgeDeliveries API is retained as a
no-op for compatibility with the await_job tool.

Closes #301

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-13 22:32:24 -06:00
Jamie Nelson
f791731d4f feat: add GitHub Workflows skill with CI workflow and ci_monitor tool (#294)
* feat: add GitHub Workflows skill with CI workflow and ci_monitor tool

- Runs on push to main and feature branches
- Runs on pull requests to main
- Build + test pipeline using Node 22

Cross-platform CI monitoring tool for debugging GitHub Actions:
- `runs` - List recent workflow runs
- `watch` - Monitor running workflow
- `fail-fast` - Exit 1 on first failure (for scripts)
- `log-failed` - Show failed job logs
- `test-summary` - Extract test pass/fail counts
- `check-actions` - GraphQL query for action versions
- `grep` - Search logs with context
- `wait-for` - Block until deployment keyword appears

Pure Node.js - no shell interpolation, works on macOS/Windows/Linux.

Drift-immune skill that:
- Routes all CI operations through ci_monitor.cjs
- Fetches live docs from docs.github.com (no stale training data)
- Provides validation constraints (BEFORE/AFTER/EVIDENCE)

- Split tests into test:unit (141 tests, ~12s) and test:integration (5 tests)
- Fixed idle-recovery.test.ts for current implementation
- Removed AGENTS.md dead code from resource-loader.ts
- Moved npm run build out of tests (fixes ENOBUFS)

When CI fails, you need observable diagnostics:
- `gh run` output is not script-friendly
- ci_monitor.cjs provides structured output for automation
- The skill ensures AI uses the tool, not stale training data

* fix: resolve imports and path for current upstream version

- Updated imports from @mariozechner/pi-coding-agent to @gsd/pi-coding-agent
- Fixed integration test path calculation to use process.cwd()
- Kept test:unit and test:integration scripts

* fix: replace search provider preference instead of accumulating

AuthStorage.set() for api_key credentials appends to the existing list
rather than replacing. When setSearchProviderPreference was called twice
with different values, the second call appended the new value, leaving
the first value at index 0, which get() returned.

Fix: call auth.remove() before auth.set() to ensure only the latest
preference is stored.

https://claude.ai/code/session_01Qx7HRSDb117KzDZzdKk1KB

* fix: address all 10 open PR review comments

- package.json: run build before test:integration so a fresh checkout works
- pack-install.test.ts: replace execSync+shell redirects with execFileSync
  argument arrays (portable, no shell parsing, paths with spaces safe)
- ci_monitor.test.ts: remove unconditional passed++ after assert; move
  success message after the failed > 0 check so it only prints on success
- setup_gh.cjs: replace unzip/tar shell-outs with platform-specific
  execFileSync calls (unzip on macOS, PowerShell Expand-Archive on Windows);
  add compareVersions() for correct element-by-element semver comparison
- ci_monitor.cjs: add --repo/-R global option so repo is overrideable;
  fix getLogs() to use gh run view --log --job instead of binary REST endpoint

https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM

* fix: make all changed files fully cross-platform (Windows/macOS/Linux)

- pack-install.test.ts: use tar npm package instead of tar CLI; resolve
  gsd binary as gsd.cmd on Windows; skip shebang check on Windows
- setup_gh.cjs: use execFileSync for all binary invocations; replace
  which with where on Windows; add Windows PATH guidance; filter preferred
  install dirs by platform; unify ZIP extraction to use process.platform
  consistently; escape single quotes in PowerShell Expand-Archive args
- ci_monitor.cjs: use path.join for .github/workflows paths; replace
  all split('\n') with split(/\r?\n/) to handle Windows CRLF output

https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM

* refactor: simplify and deduplicate changed files

- ci_monitor.cjs: memoize getRepo() so gh repo view subprocess runs at
  most once per invocation instead of once per command call in watch loops
- pack-install.test.ts: extract packTarball() helper to eliminate
  duplicate npm pack logic across two tests; remove unused contents variable

https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM

* refactor: remove redundant existsSync before canWrite() in findInstallDir

canWrite() already returns false for non-existent directories, so the
pre-check was a TOCTOU-style redundancy with no behavioral value.

https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM

* fix: replace tar npm package with Node built-ins (zlib + manual tar parsing)

tar is not in the dependency tree. listTarEntries() decompresses via
createGunzip() and parses the 512-byte tar block format directly,
reading name/prefix/type/size fields per POSIX ustar spec. No external
dependency required. Also fixes the broken tarball variable reference
left over from the packTarball() refactor.

https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM

* remove: drop setup_gh scripts in favour of ci_monitor

setup_gh.cjs and setup_gh.py were one-shot gh CLI installers.
ci_monitor.cjs covers the day-to-day CI use case and is the tool
the skill routes through. Environments that need gh installed can
use brew/winget/distro packages directly.

https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM

* fix: run only unit tests in CI — integration tests cause ENOBUFS

The integration tests (npm pack → npm install → spawn node) exceed
the buffer limits of the CI runner environment. They are documented
as requiring a manual build+run step. CI now runs test:unit only.

https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM

* fix: run all tests in CI without ENOBUFS

- ci.yml: run unit and integration as separate steps; build is already
  its own step so test:integration doesn't need to rebuild
- package.json: remove npm run build from test:integration script
- pack-install.test.ts: npm install uses stdio:'ignore' to avoid
  piping large output through Node buffers (root cause of ENOBUFS);
  add early dist/ check with clear error message instead of rebuilding

https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM

* fix: resolve ENOBUFS and clean up setup_gh references

- pack-install.test.ts: derive tarball filename from package.json
  instead of piping npm pack --json stdout; use stdio:ignore throughout
  to avoid exhausting OS pipe buffers on CI runners
- SKILL.md: remove setup_gh install instructions; assume gh is
  pre-installed via system package manager; point to ci_monitor.cjs
- github_project_setup.py: remove setup_gh.py reference from error message

https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM

* fix: address Copilot review comments on pack-install.test.ts

- listTarEntries: collect chunks in array, Buffer.concat once on end
  instead of O(n²) repeated concat in data handler
- listTarEntries: attach error handler to createReadStream so read
  errors reject the Promise instead of crashing the process
- npm pack: use stdio:['ignore','ignore','pipe'] to preserve stderr
  for diagnostics while still avoiding ENOBUFS on stdout
- npm install: same — pipe stderr so failures include error output

https://claude.ai/code/session_01AT6CgcAB62kWcDsTJg9HZM

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-03-13 22:31:17 -06:00
frizynn
eeb5202842 fix: display ⌥ instead of Alt for keybindings on macOS
On macOS the Alt key is the Option key (⌥), but all UI hints showed
"Alt+". Added formatKeyForDisplay() utility that converts alt+ to ⌥
on darwin, applied it in formatKeys() for dynamic keybinding hints,
and updated hardcoded strings in tree-selector, models-selector,
settings-selector, auto-mode dashboard, and extension shortcut display.
2026-03-13 22:40:39 -03:00