Commit graph

606 commits

Author SHA1 Message Date
deseltrus
b97a47db42 feat(tui): add placeholder support to Input component
The Input component had no placeholder text support — when empty, it
showed only "> " with a blinking cursor and no hint of expected input.

The ExtensionInputComponent received a placeholder parameter but
discarded it (_placeholder with underscore = intentionally unused).

Fix: Input now has a public placeholder property. When value is empty,
renders the placeholder in dim text. ExtensionInputComponent passes
the placeholder through to Input.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 07:23:59 +01:00
deseltrus
be2492b48d fix(prefs): break parse/serialize cycle for empty arrays and objects
The preferences parser treated [] and {} as strings instead of empty
array/object. On next serialize, yamlSafeString quoted them as "[]"
and "{}", permanently corrupting the preferences file. This caused
the wizard to show empty fields (models, auto_supervisor, etc.).

Fix: parseScalar now recognizes [] and {} (quoted or unquoted) as
empty array/object. Serializer omits empty values entirely instead
of writing key: [] or key: {}.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 07:19:13 +01:00
deseltrus
5377cfad50 fix(ux): launch prefs wizard directly from /gsd prefs
Instead of just showing "Edit file" notification, /gsd prefs now
ensures the preferences file exists and immediately launches the
interactive wizard. This matches user expectation — typing "prefs"
should let you edit preferences, not just show a file path.

/gsd prefs status still available for file path info without wizard.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 07:13:23 +01:00
deseltrus
0c9cbf6b4c fix(ux): differentiate skill diagnostics and improve prefs discoverability
Split skill diagnostics into [Skill conflicts] (actual collisions) and
[Skill issues] (validation warnings like missing description) so users
aren't misled by the label. Add wizard hint to /gsd prefs output.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 06:54:11 +01:00
Colin Johnson
fe03743b08 fix: guard against newer synced resources (#445)
Co-authored-by: TÂCHES <afromanguy@me.com>
2026-03-14 22:58:18 -06:00
Flux Labs
16364c7dba fix: prevent web_search tool injection for non-Anthropic providers serving Claude models (#444) (#446)
GitHub Copilot users with Claude models got 400 errors because the native
Anthropic web_search_20250305 tool was injected into requests to Copilot's
API proxy, which doesn't support it. The root cause was that model_select
never fires before the first API request on new sessions, so the fallback
heuristic (model name starts with "claude-") couldn't distinguish direct
Anthropic from proxied providers.

Fix: pass the resolved Model object through to the before_provider_request
event so extensions can check model.provider directly instead of relying on
model name heuristics.
2026-03-14 22:15:00 -06:00
Lex Christopherson
861a06cf34 2.12.0 2026-03-14 21:19:54 -06:00
Lex Christopherson
f719c48f09 docs: update changelog for v2.12.0 2026-03-14 21:19:38 -06:00
TÂCHES
11234b7456 fix(agent-core): await event queue in tool hooks for safe parallel execution (#439)
Moves extension tool_call/tool_result interception from wrapToolsWithExtensions
(which fires inside the agent loop, bypassing event settlement) to
beforeToolCall/afterToolCall hooks that await _agentEventQueue. This ensures
extensions always see settled state — including the appended assistant message —
even when tools execute in parallel.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 21:16:17 -06:00
Copilot
6d2ff3d4a5 Fix: em dash and slash in milestone/slice titles corrupt GSD state management (#426)
* Initial plan

* chore: establish baseline before implementing em-dash fix

Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>

* fix: validate milestone titles against delimiter characters (em dash, slash) that break state management

- Changed STATE.md separator from em dash to colon in buildStateMarkdown and state.md template
- Removed ambiguous '— Context' suffix from context.md H1 template
- Added validateTitle() function to detect problematic delimiter characters
- Added delimiter_in_title doctor issue code for milestone/slice title validation
- Added tests for validateTitle() and doctor delimiter detection
- Added em-dash-in-title cases to regex-hardening test

Fixes: milestone titles containing '—' caused state corruption when the LLM
misread the ambiguous STATE.md separator format and wrote incorrect planning files.

Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
2026-03-14 21:03:55 -06:00
Flux Labs
ecf8125e39 feat: add Ollama Cloud as model and web tool provider (#430) (#434)
Add Ollama Cloud (ollama.com) as a built-in provider with both model
hosting and web search/fetch capabilities.

Model provider:
- 13 curated models via OpenAI-compatible API (Llama 3.1, Qwen 3,
  DeepSeek R1, Gemma 3, Mistral, Phi-4, GPT-OSS)
- Auth via OLLAMA_API_KEY environment variable
- Registered in onboarding, env hydration, and model resolver

Web tool provider:
- Search via POST ollama.com/api/web_search
- Page fetch via POST ollama.com/api/web_fetch (fallback after Jina)
- Added as third search provider option alongside Tavily and Brave
- /search-provider command updated with ollama option

Closes #430
2026-03-14 21:03:31 -06:00
Copilot
3fed189e00 feat(pi-agent-core): parallel tool calling with before/after hooks (#427)
* Initial plan

* feat(pi-agent-core): add parallel tool calling support with beforeToolCall/afterToolCall hooks

Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: glittercowboy <186001655+glittercowboy@users.noreply.github.com>
2026-03-14 21:02:43 -06:00
gkd67pjznr-ctrl
3c931b2e19 fix(guided-flow): add self-heal for stale runtime records on wizard start (#436)
auto.ts has selfHealRuntimeRecords() which cleans up stale .gsd/runtime/units/
records when /gsd auto starts. However, guided-flow.ts (used by /gsd manual
mode) had zero awareness of runtime records — it only checked auto.lock.

This means if auto-mode crashes mid-unit, the stale runtime records persist
until the next /gsd auto run. Users who alternate between manual and auto
mode, or who only use manual mode after a crash, would accumulate stale
records that could cause spurious re-dispatch or confusing state.

Add selfHealRuntimeRecords() to guided-flow.ts that:
- Clears records where the expected artifact already exists (completed but
  closeout didn't finish)
- Clears records stuck in dispatched or timeout phase (process died mid-unit)
- Notifies the user how many stale records were cleaned

Called in showSmartEntry() before the crash lock check so the wizard always
starts from a clean state regardless of how the previous session ended.

Co-authored-by: Thomas <twilliams1234@gmail.com>
2026-03-14 20:54:16 -06:00
Flux Labs
0e3284215a fix: bg_shell ready_port timeout and error handling (#428) (#435)
When a server fails to bind to the configured ready_port, the process
would stay in "starting" status indefinitely after the probing interval
cleared, with no error surfaced to the agent. This fixes the hang by:

- Transitioning process to "error" status when port probing times out
- Detecting process exit during port polling and reporting stderr context
- Adding ready_timeout parameter for custom timeout values
- Including stderr output in waitForReady timeout/error responses
- Registering SIGTERM/SIGINT handlers to clean up bg processes on exit

Closes #428
2026-03-14 20:51:02 -06:00
Flux Labs
96ced0357b fix: clear cachedReaddir before dispatch and artifact verification (#431) (#432)
The directory listing cache in paths.ts has no TTL and was never cleared
in production, causing dispatchNextUnit to re-dispatch the same unit
when files written by the previous unit weren't visible to deriveState.

Add clearPathCache() calls at the top of dispatchNextUnit (before
deriveState) and verifyExpectedArtifact so each dispatch cycle and
artifact check sees fresh disk state.

Closes #431
2026-03-14 20:48:43 -06:00
TÂCHES
cad9971f9f Merge pull request #429 from gsd-build/release/v2.11.1 2026-03-14 18:57:47 -06:00
TÂCHES
c2a063bddd release: v2.11.1 — urgent fix for auto-mode loop on research-slice/plan-slice 2026-03-14 18:52:05 -06:00
TÂCHES
8c45a0dda3 Merge pull request #424 from gsd-build/perf/inline-static-templates
perf: inline static templates into prompt builders to eliminate ~44 READ tool calls per milestone
2026-03-14 18:18:14 -06:00
TÂCHES
9f56049509 Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-03-14 17:55:23 -06:00
TÂCHES
36a810be8a Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-03-14 17:55:05 -06:00
Lex Christopherson
3551d2291b perf: inline static templates into prompt builders to eliminate ~44 READ tool calls per milestone
Add loadTemplate() and inlineTemplate() to prompt-loader.ts, then use
them in all 7 auto.ts builder functions and ~9 guided-flow.ts callsites
to inject template content at prompt-build time. Update 16 prompt .md
files to reference inlined templates instead of instructing agents to
read them from disk.

Over a typical 3-slice/15-task milestone run, this eliminates ~44
unnecessary READ tool calls (~45-90s latency, ~5-9k wasted tokens).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:34:42 -06:00
TÂCHES
73c0fd8043 Merge pull request #416 from fluxlabs/feat/post-unit-hooks-140
feat: extensible hook system for auto-mode state machine
2026-03-14 17:14:31 -06:00
TÂCHES
af4cd1ec35 Merge pull request #421 from gsd-build/fix/auto-clear-caches
fix(auto): clear parse and path caches alongside state cache
2026-03-14 17:06:50 -06:00
Lex Christopherson
9c82a1b79f fix(auto): clear parse and path caches alongside state cache
Ensures auto-mode reads fresh file data after unit completion,
slice merges, and self-healing — prevents stale cached parses
from the memoized deriveState pipeline.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 17:02:32 -06:00
TÂCHES
1b5b413eb1 Merge pull request #420 from gsd-build/fix/smoke-test-banner
fix(ci): smoke test handles banner output
2026-03-14 17:01:11 -06:00
Lex Christopherson
bce3c1457e fix(ci): strip ANSI codes and match version line in smoke test
The --version flag outputs a banner with ANSI escape codes. The smoke
test compared the entire multi-line output against the bare version
string, causing false failures on every release.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 16:56:57 -06:00
TÂCHES
888ec0dc59 Merge pull request #418 from gsd-build/fix/version-2.11.0
fix: restore version 2.11.0
2026-03-14 16:16:19 -06:00
Lex Christopherson
accd0e3a02 fix: restore version 2.11.0 in package.json
Copilot Autofix reverted the version bump in f63cb944.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 16:12:24 -06:00
TÂCHES
b83419f840 Merge pull request #417 from gsd-build/release/v2.11.0
Release v2.11.0
2026-03-14 16:11:38 -06:00
TÂCHES
f63cb9448e Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-03-14 16:07:08 -06:00
Lex Christopherson
7d3c5bfd6f 2.11.0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 16:03:46 -06:00
Lex Christopherson
d7a2d3675d docs: update changelog for v2.11.0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 16:03:35 -06:00
TÂCHES
4334f3a27f Merge pull request #415 from fluxlabs/perf/repo-hotpath-optimizations 2026-03-14 15:58:04 -06:00
Flux Labs
cafc36f16c feat: add extensible hook system for auto-mode state machine (#140)
Implements post-unit hooks, pre-dispatch hooks, state persistence, and
a /gsd hooks status command — all configured via preferences.md without
code changes. Enables code review loops, simplify passes, convention
enforcement, and custom unit interception as opt-in extensions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 16:52:43 -05:00
TÂCHES
d39341a7fd Merge pull request #412 from fluxlabs/feat/provider-fallback 2026-03-14 15:26:21 -06:00
Flux Labs
f981d5aa79 perf: optimize discovery and interactive hot paths 2026-03-14 16:03:44 -05:00
TÂCHES
6d8445b201 Merge pull request #413 from gsd-build/perf/memoize-derive-state
perf: memoize deriveState() per dispatch cycle
2026-03-14 14:53:39 -06:00
Lex Christopherson
8a64a1c1da fix(tests): invalidate both state and path caches before assertions expecting fresh disk state
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 14:47:29 -06:00
Flux Labs
adca6901ec feat: add cross-provider fallback when rate/quota limits are hit (#125)
When all credentials for a provider are exhausted, the system now
automatically falls back to the next available provider in a
user-configured fallback chain. Higher-priority providers are
restored automatically when their backoff expires.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 15:45:44 -05:00
Lex Christopherson
e739c4cab7 perf: memoize deriveState() per dispatch cycle
deriveState() was called ~7 times per dispatch cycle, each call re-reading
the entire .gsd/milestones/ tree from disk (~50-60 file reads per call,
~350-420 redundant reads per cycle). Add a 100ms TTL cache keyed by
basePath so repeated calls within the same dispatch cycle return the
cached result. Expose invalidateStateCache() and call it at every
mutation boundary in auto.ts: handleAgentEnd start, post-merge
re-derivations, and resume-from-pause.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 14:38:19 -06:00
TÂCHES
86f705c8e4 Merge pull request #398 from gsd-build/perf/path-resolution-cache
perf: session-scoped directory listing cache for path resolution
2026-03-14 14:36:59 -06:00
Lex Christopherson
d7faf8a4e5 fix(tests): invalidate path cache between deriveState calls that expect fresh disk state
Tests that write files and immediately call deriveState() got stale results
because the path resolution cache (dirEntryCache/dirListCache) returned
cached directory listings that didn't include newly written files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 14:14:40 -06:00
TÂCHES
5b62a3c7b3 Merge pull request #407 from fluxlabs/feat/model-provider-preferences-350 2026-03-14 14:13:56 -06:00
TÂCHES
4139e0d194 Merge pull request #406 from fluxlabs/fix/auto-mode-openrouter-model-resolution 2026-03-14 14:12:47 -06:00
TÂCHES
6004b5caaa Merge pull request #405 from fluxlabs/fix/git-svn-noise-404 2026-03-14 14:12:13 -06:00
TÂCHES
6ec179c743 Merge pull request #408 from fluxlabs/feat/custom-openai-compatible-endpoint 2026-03-14 14:11:14 -06:00
TÂCHES
5e0d333ea5 Merge pull request #400 from gsd-build/perf/prompt-dedup 2026-03-14 14:10:19 -06:00
TÂCHES
a4999a406e Merge pull request #399 from gsd-build/perf/parse-cache 2026-03-14 14:09:54 -06:00
TÂCHES
879c476df5 Merge pull request #394 from ASRagab/main 2026-03-14 14:09:34 -06:00
TÂCHES
d22226e3b8 Merge pull request #391 from deseltrus/refactor/dynamic-extension-discovery 2026-03-14 14:09:22 -06:00