Changelog
Release history for the Stitch CLI, pulled from the library repo at build time.
-
v2.0.2, unreleased
Added
- On startup,
stitch runandstitch run --watchautomatically add.stitch/and.stitch.lockto the repo's.gitignoreif missing. Prevents Stitch's history files (history.jsonl,history-head.json,jobs.json) and the watch lockfile from pollutinggit statusand being accidentally committed during watch-mode auto-commit. Idempotent: existing entries are preserved, no duplicates are written. Creates.gitignoreif absent.
Changed
- Version string is now sourced from
package.jsonat build time (viatsupdefineinjection intosrc/version.ts). The--versionflag and the TUI welcome banner read from a single constant, so future releases only need apackage.jsonbump.
- On startup,
-
v2.0.1, 2026-04-28
Added
- Watch mode: press
Enter(orr) between runs to re-run immediately without waiting for a file change.qexits. Keybinding hint was already rendered in the footer; the race is now wired inrunWatchMode. - Watch mode:
Ctrl+Cduring an in-flight run now aborts the current run and returns to watch idle, instead of killing the whole process. Running jobs are SIGKILLed, the active agent CLI child is killed, remaining jobs are markednot_runwith reasonaborted. Pressqto exit fully.
Changed
Runner.run(jobs, dryRun?, signal?)now accepts an optionalAbortSignalfor cooperative cancellation.AgentDriver.fix(context, signal?)likewise. Existing callers that do not pass a signal are unaffected.
Fixed
- Watch mode:
.stitch.lockself-heals when a previous Stitch run crashed, wasSIGKILLed, or left a stale lockfile after a PID got recycled. The new lockfile stores a small JSON record with a 5-second heartbeat; on the next start, Stitch automatically reclaims the lock when the pid is dead, the pid was recycled to an unrelated process, or the heartbeat is older than 30 seconds (after a boundedSIGTERM+SIGKILLescalation). The old "delete.stitch.lockmanually" instruction is gone. Real double-runs are still blocked. - Watch mode no longer leaks background polling promises when a re-run is triggered.
waitForChangeThenIdleaccepts anAbortSignal;ui.waitForRerundoes too. - Watch mode now runs the full auto-commit/push path after every successful iteration, matching
stitch runbehavior. Previously it silently skipped commit and push. git commitnow stages withgit add -Aso new files created by the agent (new tests, new modules) are included. Previouslygit add -udropped them silently.autoCommitPushreturns a structuredreasonso the UI can explain why a commit or push did not happen (dirty_pre_run,run_failed,no_fixed_jobs,nothing_staged,commit_failed,push_failed).- When Stitch starts with uncommitted changes in the working tree, it prints a one-line warning on stderr and skips auto-commit for the run instead of silently bailing.
RunReport.fixedJobsis now derived fromfilesModified(set from the driver'sFixOutcome.applied) instead ofattempts > 1, so jobs the agent edited still trigger a commit even if they passed on the first re-run.
- Watch mode: press
-
v2.0.0, 2026-04-16
Full rewrite from Python to TypeScript. Distributed via npm, zero runtime dependency on Python.
Changed (breaking)
- Package renamed from PyPI
stitch-agent(Python) to npmstitch-agent(TypeScript). Install vianpm i -g stitch-agentorbunx stitch-agent. - Entry binary now runs on Node 20+ / Bun 1.0+. Python 3.12 requirement removed.
- CLI surface preserved:
stitch run,stitch generate,stitch doctor,stitch history.
Added
stitch doctordiagnostic command (runtime, CI config, agent CLI, permissions).stitch historywith streak-compacted fix history..stitch.ymlconfiguration file (agent, maxAttempts, failFast, jobs, push, watch, debounce).--fail-fastflag cancels in-flight jobs on first failure before the fix loop.- Bitbucket Pipelines support alongside GitLab CI and GitHub Actions.
- OpenTUI renderer replaces the raw ANSI TUI for flicker-free output.
- Auto-commit and auto-push after a successful fix loop (disabled via
--no-push). - Global error handler in the CLI: unhandled errors print
stitch: <msg>instead of raw Node stack traces.STITCH_DEBUG=1re-enables stacks. - Automated npm publish from
release/*branches via GitLab CI (issue #34).
Removed
- Python codebase (
stitch_agent/,runners/,pyproject.toml). Full history remains in git. @orchetron/storm+ React TUI runtime (8MB+1.5MB+260KB), replaced by OpenTUI.
- Package renamed from PyPI
-
v1.1.0, 2026-04-12
Added
- LLM-based job classification replaces hardcoded pattern matching. Infra jobs (deploy, publish, docker push) are skipped by default; verify jobs (lint, test, build) run. Cached in
.stitch/jobs.jsonkeyed by job-name hash. - Auto-detect CI platform (GitLab, GitHub) so
--jobsis no longer required. stitch generate <agent>command: LLM analyzes the repo and proposes CI test/lint jobs.
Fixed
- Product name capitalization ("Stitch") standardized across all user-facing messages.
- LLM-based job classification replaces hardcoded pattern matching. Infra jobs (deploy, publish, docker push) are skipped by default; verify jobs (lint, test, build) run. Cached in
-
v1.0.0, 2026-04-10
First stable release. Pivot to skill-first local CI runner.
Changed (breaking)
- Project repositioned from CI-hosted webhook service to local-first CLI. Runs your CI jobs on the developer machine and delegates fixes to a local agent CLI (Claude Code or Codex).
- Zero-config mode:
.stitch.ymlno longer required for normal use. - Anthropic API driver removed. Agent CLI (claude, codex) is now the only fix backend; no API keys handled by Stitch.
Added
- Rich TUI for
stitch run(progress bar, per-job status, footer). --permission-mode acceptEditspassed to the Claude Code CLI so fixes apply without prompts.
Removed
- OpenAI API driver (
stitch_agent/drivers/api.py),openaidependency. - Webhook server, orchestrator examples, Docker sandbox validation mode (already removed in v0.1.5, cleanup finalized).
pydanticandhttpxdependencies (zero-config refactor).
Pre-v1.0.0 (Python era)
Entries below describe the pre-v1 Python/webhook implementation. Kept for historical reference. Not applicable to the current TypeScript codebase.
-
v0.2.1 — 2026-03-24
Removed
stitch connectcommand — vestigial webhook provisioning (docs removed in v0.1.5, code removed now)- Dead dependencies:
gitpython,python-gitlab,pygithub,fastapi,uvicorn webhook_secretsetting,docker_imageconfig field,_run_not_implemented()placeholderafter_scriptCI mode — simplified to.poststage only- Stale
ISSUE-unrecognized-error-patterns.md
Fixed
__version__in__init__.pynow matchespyproject.toml(was stuck at 0.1.0)- README: added missing
patch_validator.pyto architecture tree, addedvalidationconfig to.stitch.ymlexample, fixed intro text, addedLICENSEfile
-
v0.2.0 — 2026-03-23
Added
- Auto-repair with model escalation — when a fix fails CI, stitch automatically retries on the same branch instead of escalating to human review. Tracks attempt count via branch commits. After initial retries, escalates to Sonnet model. Only escalates to human after all attempts exhausted.
retry_fixmethod onStitchAgent— generates and pushes fixes to an existing fix branch with model override support.push_to_branchandcount_branch_commitson adapters (GitLab + GitHub).- New CI runner statuses:
retried(fix pushed),fix_exhausted(max attempts reached, human needed),retry_error,retry_failed.
Fixed
- Classifier fails to extract file paths from GitLab logs — ANSI escape codes in job traces broke the file reference regex. Now strips ANSI codes from job logs.
-
v0.1.8 — 2026-03-23
Fixed
fetch_file_content400/403 on self-hosted GitLab — reverse proxies (Cloudflare, nginx) reject%2F-encoded slashes in GitLab files API paths. Now falls back to tree listing + blob endpoint when the primary API returns 400 or 403.
-
v0.1.7 — 2026-03-23
Added
- Patch validation gate — programmatic validation of LLM-generated patches before pushing to fix branches. Rejects destructive fixes that rewrite entire files, change function signatures, remove exports, or add new dependencies. Escalates instead of pushing broken code.
ValidationConfigin.stitch.yml— configurable thresholds:max_diff_ratio,max_files_changed,max_lines_changed,block_new_imports,block_signature_changes,block_export_removal.PatchValidatormodule with language-aware checks for Python, TypeScript, and JavaScript (diff ratio, export removal, signature preservation, new import detection, delete protection).- 15 new tests covering all validation checks including a real-world reproduction of the
config.tsrewrite bug.
-
v0.1.6 — 2026-03-23
Fixed
- stitch-check 404 on self-hosted GitLab —
get_latest_commit_messageAPI call failed on instances where the token lackedread_repositoryscope. Now readsCI_COMMIT_MESSAGEenv var first (always available in GitLab CI), falls back to API only when needed. - API fallback errors are suppressed gracefully — no more unhandled 404 crashes in verify/escalate mode.
- Non-conservative fixes breaking callers — hardened fixer prompt with explicit constraints: never change function signatures, type definitions, exports, or unrelated lines. If a fix requires signature changes, the LLM now returns an empty patch (escalates) instead of introducing new errors.
Added
commit_messagefield onCIContextdataclass — carries commit message from CI environment.- Three new tests: env var path, API fallback, and 404 resilience.
- stitch-check 404 on self-hosted GitLab —
-
v0.1.5 — 2026-03-23
Removed
- Webhook server —
runners/webhook.pyand all webhook configuration (stitch lives in CI now) - Orchestrator examples —
runners/examples/(Prefect, Temporal, Dagster) — CI-native approach replaces them - Strict validation mode — Docker sandbox (
validator.py,workspace.py) — CI pipeline verifies fixes natively validation_modesetting and all webhook-related env vars from settings- Contributing section and
stitch connectcommand from README
Changed
- README rewritten: focused on CI-native approach, removed all webhook/server documentation
- Architecture diagram updated to reflect simplified codebase
stitch-checkreplaces separatestitch-verify/stitch-retryjobs — single job withwhen: always- On stitch/fix-* branches, auto-detects verify vs escalate by checking for failed jobs in pipeline
- When fix doesn't pass CI, escalates with clear message instead of silent failure
- Webhook server —
-
v0.1.4 — 2026-03-23
Added
- Two-phase CI flow — fixes are verified by CI before creating MRs
- Phase 1 (fix): generate fix → push to
stitch/fix-*branch (no MR) - Phase 2 (verify): CI passes on fix branch → create MR automatically
- Phase 1 (fix): generate fix → push to
Stitch-Targetcommit trailer for tracking target branch across phasesget_latest_commit_message()method on adapters (GitLab + GitHub)stitch-verifyCI job template for both GitLab and GitHub
Changed
stitch ciauto-detects verify mode when running on astitch/fix-*branchagent.fix()acceptscreate_mrparameter (defaultTrue, CI setsFalse)- Updated CI templates: two jobs (fix + verify) instead of one
- Documentation rewritten to reflect two-phase flow
- Two-phase CI flow — fixes are verified by CI before creating MRs
-
v0.1.3 — 2026-03-23
Changed
- Classification now routes all error types to a fix attempt — no more auto-escalation
ESCALATION_TYPESemptied;LOGIC_ERRORandUNKNOWNmoved toSONNET_TYPES
Fixed
- TypeScript error pattern now matches
ts(2365)format (case-insensitive, optional parens)
-
v0.1.2 — 2026-03-22
Fixed
- Fix HTTP client closed error in CI runner — unified adapter session for job discovery and processing
- Fix publish pipeline uploading stale artifacts — clean dist/ before rebuild
-
v0.1.0 — 2026-03-22
Initial public release.
Features
- CI-native mode (
stitch ci) — auto-detect GitLab/GitHub from env vars, zero config- GitLab:
.poststage (catch-all) - GitHub:
workflow_runevent trigger - Loop prevention via branch exclusion +
max_attempts
- GitLab:
- Error classification — 150+ patterns across 9 error types
- AI-powered fixes — Haiku for simple errors, Sonnet for complex ones
- Automatic PR/MR creation with Conventional Commits messages
- Multi-channel escalation — Slack, webhook, and custom notifications
- Onboarding commands —
stitch setup,stitch doctor - Fix history — SQLite-backed tracking with pattern analytics
- Platform support — GitLab, GitHub (including self-hosted)
- CI-native mode (