Commit graph

453 commits

Author SHA1 Message Date
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
079d1751b0 Merge branch 'main' into feat/fix-merge-session 2026-03-13 23:17:02 -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
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
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
Lex Christopherson
105fc0103a 2.10.6
Native Rust modules (truncation, hashing, bash stream), memory extraction pipeline, 1M context model, TUI crash fix, and rate limit improvements
2026-03-13 16:56:36 -06:00
Lex Christopherson
539262ee64 fix: strip hashline prefixes from TUI read output (#265)
Hashline prefixes (e.g. "1#BQ:") were leaking into the TUI display
for file reads, showing as weird characters to users. Strip them
before rendering since they're only meant for model consumption.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-13 16:56:06 -06:00
Lex Christopherson
ca8697ae26 feat: use server-requested retry delay for Anthropic rate limits
Anthropic's 429 responses include retry-after and x-ratelimit-reset-*
headers that tell us exactly when to retry. Previously we ignored these
and used exponential backoff (2s, 4s, 8s), which is both wrong and
misleading in the UI countdown.

- Add retryAfterMs to AssistantMessage as the structured carrier
- Extract retry-after / x-ratelimit-reset-requests / x-ratelimit-reset-tokens
  from Anthropic SDK APIError.headers in the provider catch block
- Session uses retryAfterMs when present (capped by maxDelayMs=60s),
  falls back to exponential backoff for errors with no timing hint

The UI countdown now shows the actual Anthropic reset time. No UI changes needed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-13 16:51:17 -06:00
Lex Christopherson
7664163c1f fix: truncate oversized TUI lines instead of crashing (#287)
Lines exceeding terminal width are now silently truncated at the render
boundary rather than throwing a fatal error that kills the session.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-13 16:50:58 -06:00
TÂCHES
60a3607ff7 feat: native Rust output truncation module (#268)
* feat: add native Rust output truncation module

Line-boundary-aware truncation for tool outputs (bash, grep, file reads),
replacing JS byte-counting with native Rust via napi-rs. Supports head,
tail, and both modes. Counts by UTF-8 bytes, respects line boundaries,
uses memchr for fast newline scanning.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: remove unsafe blocks and fix truncation message byte counts

Replace unsafe from_utf8_unchecked with safe from_utf8().expect() —
the invariant (splitting at newline boundaries) is sound but the perf
difference is negligible, so no reason to use unsafe.

Fix truncateOutput messages that reported the byte budget as "bytes
truncated" instead of the actual number of bytes removed.

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-13 16:48:49 -06:00
TÂCHES
b730ed87d0 feat: native Rust xxHash32 for hashline (#272)
* feat: replace pure-JS xxHash32 with native Rust implementation via napi

The hashline edit tool calls xxHash32 on every line of every file read/edit.
Moving this to a native Rust implementation (xxhash-rust crate) eliminates
JS overhead for this hot path. Hash output is identical -- verified by tests
comparing native vs JS reference across 11 input vectors including empty
strings, short/long inputs, unicode, and seeded variants.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: use typed native interface and remove version-drag comment in xxhash wrapper

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-13 16:46:08 -06:00
TÂCHES
8ac5a82409 feat: memory extraction pipeline (#261)
* feat: add memory extraction pipeline extension

Two-phase pipeline that extracts durable knowledge from session transcripts
and consolidates into project-scoped memory artifacts injected into future
sessions via system prompt.

- MemorySettings in settings-manager (disabled by default)
- SQLite storage with lease-based job queue (better-sqlite3)
- Phase 1: scan .jsonl sessions, extract knowledge via LLM
- Phase 2: consolidate extractions into MEMORY.md
- /memory command: view, clear, rebuild, stats
- Secret redaction on all stored output
- Watermark tracking to skip unchanged sessions

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

* fix: harden memory extraction pipeline security and performance

- Expand secret redaction patterns (Stripe, JWT, PEM, npm, Anthropic, OpenAI keys)
- Stream-read session file headers instead of loading entire file for cwd check
- Add 50MB file size cap to prevent OOM with concurrent extraction workers
- Delete orphaned prompt .md files (prompts are inlined in pipeline.ts)
- Reset package-lock.json to current main to fix version drift

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 16:41:13 -06:00
TÂCHES
8a5465d901 feat: native Rust bash stream processor for single-pass chunk processing (#271)
Replaces the multi-pass JS pipeline (TextDecoder → stripAnsi → sanitizeBinaryOutput)
in bash-executor.ts with a single native Rust call that handles UTF-8 decoding,
ANSI stripping, binary sanitization, and CR removal in one pass.

Key features:
- StreamState tracks incomplete UTF-8 and ANSI sequences across chunk boundaries
- Standalone stripAnsiNative() and sanitizeBinaryOutputNative() for use elsewhere
- Comprehensive test coverage for split multibyte, split ANSI, binary data

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-13 16:34:17 -06:00
Lex Christopherson
6b63b51087 ci: skip main package publish if already on npm (mirrors platform package handling) 2026-03-13 16:31:56 -06:00
Jamie Nelson
17074c4db5 fix: update tests for current implementation (#284)
- idle-recovery.test.ts: Use 'unknown-type' instead of 'execute-task'
  for null-path test (execute-task now has artifact paths for task summaries)

- app-smoke.test.ts: Remove AGENTS.md assertions (merged into system.md
  in commit 0b6d88f). Add ENOBUFS skip handling for tarball tests
  (system buffer exhaustion is not a code issue).
2026-03-13 16:26:17 -06:00
Juan Francisco Lebrero
5ff362ed0e feat: add claude-opus-4-6[1m] model with 1M context window (#288)
Add the 1M context variant of Claude Opus 4.6 to the model registry
and fix model resolver to try exact match before glob detection, so
model IDs containing bracket characters (like [1m]) are not
misinterpreted as glob patterns.
2026-03-13 16:25:45 -06:00
Lex Christopherson
d23b77ff32 ci: guard main package publish until all platform packages are verified on npm
Prevents publishing gsd-pi to npm if any @gsd-build/engine-* optional
dependency is missing at the expected version. Avoids the failure mode
seen in 2.10.5 where the main package shipped before platform packages
were available, causing 'Cannot find module' errors on fresh installs.
2026-03-13 16:24:07 -06:00
TÂCHES
8b9cfae9e9 feat: native Rust streaming JSON parser (#266)
* feat: add native Rust streaming JSON parser for LLM tool call argument parsing

Replaces the JS partial-json library with a Rust implementation exposed via napi-rs.
The parser handles incomplete JSON from streaming deltas by closing unclosed strings,
objects, arrays, removing trailing commas, and completing truncated literals.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: handle truncated numbers and remove dead partial-json dependency

Adds truncated number recovery (e.g. `{"key": 12`, `{"key": 3.`, `{"key": 1e`)
to the Rust streaming JSON parser, and removes the now-unused `partial-json`
npm dependency from pi-ai.

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

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-13 16:21:58 -06:00
Juan Francisco Lebrero
9b0f31e39a fix: use version ranges for native engine optional dependencies (#286)
The v2.10.5 release broke on darwin-arm64 because the main package
was published before the native CI built and published the platform
packages. With exact version pinning, npm silently skips the
optional dep when the version doesn't exist, causing a fatal crash.

Change to >=2.10.2 range so npm installs the latest available
binary. The native API is stable across patch versions.

Also stop sync-platform-versions.cjs from overwriting the ranges
back to exact versions during CI.
2026-03-13 16:20:44 -06:00
Lex Christopherson
4959ecfd33 fix: guard publish against uncommitted version sync changes
Adds a git diff check after sync-platform-versions so npm publish fails
if the sync had to make changes. Prevents a repeat of #276 where
optionalDependencies were out of sync with the published version.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-13 16:12:37 -06:00
TÂCHES
54df619891 feat: task isolation for subagent filesystem safety (#254)
* feat: add task isolation for subagent filesystem safety

Subagents can run in isolated git worktrees (or FUSE overlays on Linux)
so concurrent tasks don't stomp on each other's files. Changes are
captured as unified diffs and merged back via git apply.

- New isolation.ts module with worktree and FUSE overlay backends
- TaskIsolationSettings in settings-manager (mode + merge strategy)
- isolated parameter on the subagent tool schema
- Baseline capture/apply mirrors the parent repo's dirty state
- Process exit handler for best-effort cleanup of stale worktrees

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

* fix: correct delta capture to exclude parent baseline state

The worktree backend now commits a baseline snapshot after applying the
parent's dirty state, so captureDeltaPatch diffs only the subagent's
actual changes against the post-baseline HEAD (not the original HEAD).

The FUSE overlay backend tracks the parent's dirty file set at mount
time and filters the upper dir during delta capture to exclude inherited
dirty files.

Also removes dead code: findGitRoot (unused), readIsolationMergeStrategy
(exported but never called).

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 16:10:55 -06:00
Lex Christopherson
fdeb520332 fix: restore bashInterceptor settings dropped by async-jobs merge
The async-jobs PR (#260) accidentally dropped `bashInterceptor` from the
Settings interface and the getBashInterceptorEnabled/getBashInterceptorRules
methods from SettingsManager, breaking the TypeScript build on main.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-13 16:06:21 -06:00
Lex Christopherson
4c2e40b9a3 docs: update system prompt routing for async_bash vs bg_shell 2026-03-13 16:05:09 -06:00
Juan Francisco Lebrero
bd5bf996a8 fix: show 'keep current' option in config when already authenticated (#283)
When running `gsd config` with existing LLM auth or web search
configured, show a 'Keep current (provider)' option at the top
so users don't have to re-authenticate.

Co-authored-by: Juan Francisco Lebrero <fran@Juans-MacBook-Air.local>
2026-03-13 16:04:35 -06:00
TÂCHES
fa9477f638 feat: async background jobs extension (#260) 2026-03-13 16:01:30 -06:00
TÂCHES
7b0b71da79 Merge pull request #281 from gsd-build/fix/276-version-sync
fix: 2.10.5 — correct optionalDependencies version sync (#276)
2026-03-13 16:00:16 -06:00
Lex Christopherson
16518a217e 2.10.5
Fix optionalDependencies version sync — 2.10.4 shipped with engine packages pinned to 2.10.2 (the broken version), so users never got the fixed binaries. Closes #276.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-13 15:59:24 -06:00
TÂCHES
7741df9d2a Merge pull request #278 from frizynn/feat/web-search-onboarding
feat: add web search provider step to onboarding wizard
2026-03-13 15:57:03 -06:00
Juan Francisco Lebrero
866ada5c66 feat: add web search provider selection to onboarding wizard
After LLM provider login, ask how to search the web:
- Anthropic built-in (no key needed, shown when using Claude)
- Brave Search (API key)
- Tavily (API key)
- Skip

Moves Brave/Brave Answers out of the generic tool keys step into
the dedicated web search step for better discoverability.
2026-03-13 18:56:02 -03:00
TÂCHES
79587229a1 Merge pull request #273 from frizynn/feat/update-subcommand
feat: add `gsd update` subcommand
2026-03-13 15:50:44 -06:00
TÂCHES
6ffa0ad677 Merge pull request #274 from frizynn/feat/simpler-onboarding
feat: simplify onboarding into two-step auth flow
2026-03-13 15:50:22 -06:00
Juan Francisco Lebrero
45b269df0e fix: use plain language instead of OAuth jargon in onboarding 2026-03-13 18:50:02 -03:00
TÂCHES
2452d34f53 Merge pull request #255 from gsd-build/feat/multi-credential
feat: multi-credential round-robin with rate-limit fallback
2026-03-13 15:49:57 -06:00
Lex Christopherson
e9676202e1 fix: add tests and clarify edge cases for multi-credential auth storage
- Add 14 tests covering round-robin, session-sticky, login accumulation,
  backoff/fallback, and getAll() truncation behavior
- Document getAll() truncation is intentional (OAuth refresh only)
- Add comment in markUsageLimitReached explaining round-robin race
  is benign in single-threaded event loop context

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-13 15:49:44 -06:00
Juan Francisco Lebrero
049ce9577c feat: simplify onboarding into two-step auth flow
Replace the flat 9-option provider list with a two-step flow:
1. How to sign in? (Browser login / API key / Skip)
2. Which provider? (filtered by auth method)

This reduces cognitive load on first launch — users pick their
auth method first, then see only the relevant providers.
2026-03-13 18:49:05 -03:00
TÂCHES
bdb6bcde35 Merge pull request #258 from gsd-build/feat/bash-interceptor
feat: bash interceptor for tool discipline
2026-03-13 15:47:53 -06:00
Juan Francisco Lebrero
0858092098 feat: add gsd update subcommand for self-update
Adds a CLI subcommand that checks npm for the latest version and
runs `npm install -g gsd-pi@latest` if an update is available.
Prints current/latest version and clear success/failure messages.
2026-03-13 18:47:33 -03:00
Lex Christopherson
e55b6dd994 fix: bash interceptor regex bugs and add unit tests
- Fix cat rule to exclude heredoc syntax (cat <<EOF) via negative lookahead
- Fix write rule: exclude >> append and digit-prefixed fd redirects (2>)
  using lookbehind (?<![|>\d])>(?!>)
- Add compileInterceptor() — pre-compiles rules once at construction time
  instead of on every bash call; export CompiledInterceptor type
- Update createBashTool to use pre-compiled interceptor instance
- Add 33 unit tests covering all rules, edge cases, and pass-throughs
2026-03-13 15:46:08 -06:00
TÂCHES
40e30f61dc Merge pull request #264 from frizynn/fix/gsd-merge-all-conflicts
fix: auto-resolve .gsd/ planning artifact conflicts during slice merge
2026-03-13 15:40:49 -06:00