Commit graph

590 commits

Author SHA1 Message Date
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
Flux Labs
595c778250 feat: add custom OpenAI-compatible endpoint option to onboarding wizard (#335)
Adds a "Custom (OpenAI-compatible)" provider option to the API key
flow in the onboarding wizard. When selected, prompts for base URL,
API key, and model ID, then writes the config to models.json.
2026-03-14 15:07:47 -05:00
Flux Labs
c1dcca6820 feat: allow specifying model provider in preferences (#350)
Add explicit provider targeting for model preferences when the same
model ID exists across multiple providers (e.g., claude-sonnet-4-6
on both Anthropic and Bedrock).

Two formats supported:
- String: "bedrock/claude-sonnet-4-6"
- Object: { model: claude-sonnet-4-6, provider: bedrock }

The provider/model string format already worked in the resolution
code but was undocumented. This adds the provider field to the
object format and documents both approaches.
2026-03-14 15:06:49 -05:00
TÂCHES
7f0caffd65 Merge pull request #397 from gsd-build/perf/dispatch-timeout
perf: reduce dispatch gap timeout from 30s to 5s
2026-03-14 14:04:27 -06:00
Flux Labs
8abbccea54 fix: resolve OpenRouter model IDs in auto-mode and show active model per phase
OpenRouter models use slash-separated IDs (e.g. "moonshotai/kimi-k2.5") where the
full string is the model ID on the "openrouter" provider. The auto-mode model
switcher incorrectly split on the first slash and treated the prefix as a provider
name, causing all OpenRouter preference models to fail resolution and fall back to
the default model for every phase.

Now the resolver first checks whether the slash-prefix is a known provider, and if
not (or if no match is found), falls back to matching the full string as a model ID
— consistent with model-resolver.ts.

Also improves the progress widget and notifications to show [PHASE] and
provider/model so users can confirm the correct model is active.

Closes #402
2026-03-14 15:00:03 -05:00
Flux Labs
9eb5a00f4f fix: suppress git-svn noise that causes confusing errors on affected systems (#404)
Systems with a buggy git-svn Perl module (notably Arch Linux) emit
"Duplicate specification" warnings on every git invocation. Filter
these from error messages and suppress git-svn loading via GIT_SVN_ID.
Also update repository URLs from stale glittercowboy/gsd-pi to
gsd-build/gsd-2.
2026-03-14 14:59:02 -05:00
deseltrus
aca53c5853 refactor: replace hardcoded extension list with dynamic discovery in loader
loader.ts previously maintained a hardcoded list of bundled extension paths
for GSD_BUNDLED_EXTENSION_PATHS. This required manual updates whenever
extensions were added or removed, and created a consistency gap with
buildResourceLoader() which already discovers extensions dynamically.

Replace with runtime directory scanning that mirrors the discovery rules
in resource-loader.ts:
- Top-level .ts/.js files → extension entry point
- Directories with index.ts or index.js → extension entry point
- Directories without either (shared/, remote-questions/) → skipped

Benefits:
- Adding a new extension no longer requires editing loader.ts
- GSD_BUNDLED_EXTENSION_PATHS stays in sync with what buildResourceLoader()
  loads in the main process — subagents now receive the same extensions
- Fixes: 5 extensions (google-search, mcporter, ttsr, universal-config,
  voice) were loaded in the main process but missing from
  GSD_BUNDLED_EXTENSION_PATHS, meaning subagents did not receive them
- Eliminates a common source of merge conflicts for contributors and forks
  that add custom extensions
2026-03-14 20:37:18 +01:00
TÂCHES
6450c5b8d9 fix: include export-html templates in pkg/ shim (#370) (#395)
* fix: include export-html templates in pkg/ shim for --export support (#370)

The --export command fails with ENOENT because getExportTemplateDir()
resolves to pkg/dist/core/export-html/ which doesn't exist. The build
script copies themes into pkg/dist/ but had no equivalent step for
export-html templates.

- Add copy-export-html build script mirroring copy-themes pattern
- Chain copy-export-html into the build script
- Fix .gitignore: re-negate pkg/dist/ after the catch-all dist/ rule
- Add vendor/ exception for pkg/dist/core/export-html/vendor/
- Commit template.html, template.css, template.js, and vendor/ files

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

* chore: tighten .gitignore negation to specific pkg/dist subdirs

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-14 13:36:32 -06:00
Lex Christopherson
c3b518457a perf: deduplicate transitive dependency summaries in prompt builders
Prevent duplicate slice/dependency summaries from being inlined into
prompts when the same ID appears more than once. Uses a Set to track
already-included IDs in inlineDependencySummaries and
buildCompleteMilestonePrompt.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 13:35:34 -06:00
TÂCHES
4dcbff0c06 fix: increase timeout for z.ai provider to handle slow API spikes (#379) (#396)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 13:34:47 -06:00
Lex Christopherson
3a705cb501 perf: add content-hash-keyed parse cache for file parsing
parseRoadmap, parsePlan, parseSummary, and parseContinue are pure
functions that get called repeatedly with the same content during
deriveState dispatch cycles. A module-scoped Map keyed by a fast
composite key (length + first 100 chars + last 100 chars) avoids
redundant parsing. Cache caps at 50 entries and clears when full.
Exports clearParseCache() for explicit invalidation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 13:34:40 -06:00
Lex Christopherson
1b6fdd6aa6 perf: add session-scoped directory listing cache to path resolution
resolveDir(), resolveFile(), and resolveTaskFiles() call readdirSync()
on every invocation with no caching. These are called dozens of times
per dispatch cycle through resolveMilestonePath, resolveSliceFile,
relTaskFile, etc. This adds a module-level Map cache for directory
listings with an exported clearPathCache() function for invalidation
at dispatch cycle boundaries and milestone transitions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 13:34:29 -06:00
Lex Christopherson
7e9b792dc4 perf: reduce dispatch gap timeout from 30s to 5s
The dispatch gap watchdog is a safety net for when the dispatch chain
silently breaks. 30s is unnecessarily long and makes failures feel
sluggish. 5s is plenty of time to detect a stall without the wait.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 13:34:24 -06:00
Ahmad Ragab
5af1f752cb fix: add missing front matter to github-workflows skill 2026-03-14 15:24:07 -04:00
Flux Labs
07609d50b7 fix: prevent login dialog from leaving dangling promises that freeze the UI (#280) (#390) 2026-03-14 13:15:11 -06:00
Kassie Povinelli
a883008be6 feat(gsd): implement auto-mode fallback model rotation on network errors (#386) 2026-03-14 13:13:22 -06:00
Flux Labs
a896737df2 fix: prevent login dialog from leaving dangling promises that freeze the UI (#280)
The LoginDialogComponent's showPrompt/showManualInput methods returned
Promises that could hang forever if: (a) a new prompt superseded a
pending one without rejecting it, (b) the abort signal fired without
cleaning up promises, or (c) the dialog was removed without disposing
pending state.

- Add rejectPending() to safely reject outstanding promises before
  creating new ones
- Wire AbortSignal listener to auto-reject on external cancellation
- Add dispose() method called by restoreEditor() as a safety net
- Clean up manualCodePromise on error path
- Filter internal error messages (Superseded/disposed) from user display
2026-03-14 14:08:34 -05:00