chore(deps): Update development #86

Closed
renovate wants to merge 1 commit from renovate/development into main
Collaborator

This PR contains the following updates:

Package Change Age Confidence
@fission-ai/openspec 1.6.01.9.0 age confidence
@types/leaflet (source) 1.9.211.9.22 age confidence
eslint (source) 10.7.010.8.1 age confidence
jsdom 30.0.030.0.1 age confidence
prettier (source) 3.9.53.9.6 age confidence
react-i18next 17.0.917.0.11 age confidence
react-test-renderer (source) 19.2.719.2.8 age confidence
turbo (source) 2.10.42.10.11 age confidence
typescript-eslint (source) 8.63.08.67.0 age confidence

Release Notes

Fission-AI/OpenSpec (@​fission-ai/openspec)

v1.9.0

Compare Source

Minor Changes
  • #​1622 59c16a4 Thanks @​clay-good! - ### New Features

    • Command Code command adapter — Command Code is now a first-class, adapter-backed tool. openspec init generates OpenSpec commands under .commandcode/commands/opsx-<id>.md (invoked as /opsx-<id>) alongside the skills under .commandcode/skills/, matching Command Code's documented custom-slash-command surface.
  • #​1613 42d7f67 Thanks @​Angelthebestone! - ### New Features

    • Command Code supportopenspec init now supports Command Code as an adapterless skills-only tool. It installs the OpenSpec skills under .commandcode/skills/ and invokes them as /openspec-* commands, matching Command Code's native skill surface.
  • #​1604 83be9d1 Thanks @​clay-good! - Add openspec validate --archived: an opt-in check that every change under changes/archive/ has all of its tasks.md checkboxes ticked, exiting non-zero if any are unchecked. This surfaces changes that were archived with unfinished work — which the normal validate flow never catches, because it only looks at active changes — and is meant for a pre-commit or CI hook (#​205). It is a standalone scope: it does not alter any existing validate invocation and does not re-validate already-applied spec deltas.

Patch Changes
  • #​1530 bf5099e Thanks @​clay-good! - Apply workflow now tells agents to surface unexpected scope instead of hiding it. When a task needs work beyond what the spec describes, the /opsx:apply skill and command guidance direct the agent to pause and report the added scope rather than silently narrowing, deferring, or simplifying away specified behavior, and to mark a task complete only when its specified behavior is fully implemented. Fixes #​1529.

  • #​1603 9ae75c8 Thanks @​clay-good! - openspec archive no longer writes terminal escape codes to a redirected or captured stdout. Its confirmation prompts and the no-argument change picker drew their live UI with ANSI cursor-move sequences even when stdout was not a terminal — noise in a redirected log, and in some non-interactive hosts an unbounded render loop that could grow the captured output until the disk filled. When stdout (or stdin) is not a terminal, archive now reads the confirmations as plain text, and a no-argument run asks you to pass a change name up front instead of drawing a menu. Piped answers (printf 'y\n' | openspec archive …) and --yes behave as before, and interactive terminals are unchanged. Fixes #​1526.

  • #​1528 9425897 Thanks @​Marzx13! - Canonicalize rebuilt specs to end with exactly one final LF. Previously a spec whose ## Requirements section was last was rebuilt with a trailing blank line (\n\n), which failed Markdown whitespace checks after sync or archive. Internal spacing and content after the Requirements section are unchanged.

  • #​1640 610b78f Thanks @​clay-good! - Preserve the blank lines around a spec's ## Requirements heading when syncing a delta. openspec archive rebuilt openspec/specs/<capability>/spec.md by joining its slices with a bare newline, so the blank lines that surround the heading were dropped and the resulting file failed Markdown whitespace checks. The rebuild now keeps that spacing intact. Fixes #​1625. Thanks @​jwang513! (#​1637)

  • #​1640 610b78f Thanks @​clay-good! - openspec validate --all and openspec list --json no longer silently pass when run outside an OpenSpec project. From a directory with no root they used to resolve the current directory as an implicit root, exit 0, and report empty results — a false pass for CI and agents. Bulk validation (--all, --changes, --specs) and list now require an existing root (the openspec/project.md fallback for legacy projects is kept), while direct validation and other intentional implicit-root workflows are unchanged. Thanks @​clay-good! (#​1612)

  • #​1640 610b78f Thanks @​clay-good! - Label the update workflow in the openspec config workflow picker. The checklist had friendly labels for 11 of the 12 workflows but was missing update, so that row — one of the six core workflows every user sees — fell back to its raw id with a placeholder description. The update-change template's stale "expanded-profile" wording is also reworded to "optional". Fixes #​1627. Thanks @​clay-good! (#​1632)

  • #​1640 610b78f Thanks @​clay-good! - openspec schema fork now preserves the source schema's YAML formatting. Renaming a forked schema.yaml round-tripped through a parse/re-serialize step that dropped comments, could rewrite block-scalar style (a literal | folded to >), and reordered keys, so the fork no longer matched its source. The rename now edits the document in place via the YAML Document API, leaving comments, scalar style, and key order untouched. Thanks @​clay-good! (#​1607)

  • #​1640 610b78f Thanks @​clay-good! - openspec schemas now resolves through the canonical OpenSpec root-selection precedence instead of always reading from the current directory. It accepts --store <id>, rejects --store-path like the other store-aware commands, and returns the shared machine-readable diagnostics on JSON failures, while preserving the existing human output and bare JSON array on success. Thanks @​Patodo! (#​1616)

  • #​1640 610b78f Thanks @​clay-good! - openspec validate now warns on ambiguous task numbering in spec-driven changes: a task ID duplicated at full depth (including across resolved task files), or a task whose leading number disagrees with its enclosing ## N. group. Numeric-looking text outside numbered groups is ignored, and custom schemas are unchanged until they opt in. The checks run across direct, bulk, and deprecated change validation. Closes #​1520. Thanks @​alectimison-maker! (#​1523)

  • #​1522 07dea6e Thanks @​clay-good! - ### Bug Fixes

    • Don't let a legacy Codex upgrade hijack the vendor-neutral agents targetopenspec update no longer overwrites an existing .agents skills tree (and its ownership marker) when Codex is detected only from leftover global ~/.codex/prompts. Because Codex and the vendor-neutral agents target share .agents/skills, a project that used the agents target could have its generic skills silently rewritten with Codex-specific syntax and its target flipped to Codex on the next update --force. The legacy-upgrade path now respects the established owner of a shared skills directory, matching the one-writer rule openspec init already applies. When an upgrade is skipped this way, that tool's repo-local legacy files (e.g. .codex/prompts/openspec-*.md) are also preserved rather than cleaned up, since no replacement was written to take their place. A genuine first-time Codex upgrade (no .agents tree yet) is unaffected.
  • #​1521 c751b3d Thanks @​clay-good! - ### Bug Fixes

    • Stop silently dropping unlabeled scenarios on archiveopenspec validate and openspec archive now recognize every level-4 (#### followed by whitespace) child of a requirement as a scenario, matching how the spec is counted elsewhere. Before, the scenario-loss guard only recognized headers written exactly as #### Scenario:, so a MODIFIED requirement that dropped a differently-labeled child (for example #### Edge case) passed validation and was then permanently deleted by archive with no warning. Both paths now agree, so the loss is caught at authoring time. Scenario names are normalized when comparing (an optional Scenario: prefix and a CommonMark closing # run are ignored), so simply relabeling a scenario is not mistaken for dropping one.
  • #​1610 17581c1 Thanks @​clay-good! - ### Bug Fixes

    • openspec init now suggests an IDE restart only when an IDE-resident tool such as Cursor, GitHub Copilot, Continue, or Cline was configured. CLI tools like Claude Code, Codex, and Gemini CLI no longer show the hint, since their commands work as soon as the files exist.
  • #​1609 804427b Thanks @​clay-good! - Suppress the first-run telemetry disclosure notice when --json is used. On a
    first-ever run the notice was written to stdout and could break --json
    consumers; it is now deferred to the first later non-JSON run, keeping --json
    output valid while still guaranteeing the disclosure.

v1.8.0

Compare Source

Minor Changes
  • #​1303 1aa0f2a Thanks @​solanab! - Add the vendor-neutral agents target: openspec init --tools agents installs the workflow skills to .agents/skills/openspec-*/SKILL.md, the shared location AGENTS.md-compatible assistants read. It is skills-only, so no slash commands are generated. Because agents is now a real target, --tools all includes it and creates .agents/skills/ where it previously did not.

  • #​1274 7a4a745 Thanks @​NicoAvanzDev! - Generate GitHub Copilot coding agent setup and custom agent files during openspec init and keep them synchronized during openspec update.

  • #​1214 161f945 Thanks @​showms! - Add MiniMax Code as a global skills-only tool target.

  • #​1518 568e56c Thanks @​clay-good! - ### New Features

    • Atlassian Rovo Dev CLIopenspec init --tools rovodev installs the OpenSpec workflow skills for Atlassian's Rovo Dev CLI. It is skills-only (no slash commands), written to .rovodev.
Bug Fixes
  • Codex skills now live in the shared .agents directoryopenspec init and openspec update install Codex skills under .agents/skills/ (the canonical location assistants read) and migrate an existing .codex skills directory in place. Files you customized are preserved, not overwritten.

  • openspec status separates planning from implementation — status now reports isPlanningComplete (every non-skipped planning artifact exists; skipped artifacts count as satisfied without being written) distinctly from overall progress, and its messages no longer imply a change is finished before it has been implemented. isComplete is kept as a compatibility alias, so existing scripts keep working.

  • #​1517 73207a6 Thanks @​clay-good! - Make GitHub Copilot cloud coding-agent files opt-in. Selecting the github-copilot tool no longer silently writes a GitHub Actions workflow into .github/; openspec init now asks first (default No) and remembers the choice in openspec/config.yaml (githubCopilot.cloudAgent). Use --copilot-cloud / --no-copilot-cloud to decide non-interactively.

    • openspec update never prompts — it only refreshes cloud files for projects that opted in (or that already have generated cloud files, so existing setups keep working).
    • Opting out (--no-copilot-cloud or cloudAgent: false) removes OpenSpec-managed cloud files; a user-customized file is always preserved, never overwritten or deleted.
    • init and update now report whether cloud files were written, skipped, or left untouched — and if you already have your own copilot-setup-steps.yml, they say it was preserved and that you need to add the OpenSpec install step by hand.
  • #​1484 521ee33 Thanks @​clay-good! - Retire a capability when a change removes its last requirement. A change that declares retire_capabilities: true in its .openspec.yaml (alongside the schema: that file requires) may now be archived even when its REMOVED entries take a capability's last requirement: openspec archive deletes that capability's main spec instead of aborting with "Spec must have at least one requirement". Without the marker nothing changes — the archive aborts exactly as before, except the message now names the marker as the way out. Retirement happens only when the emptied spec could not have been written at all, every one is named in the archive output, a pasteable git checkout is included when the spec lived in the caller's checkout, and --no-validate never retires. Archive now also rejects a main spec with duplicate canonical requirement names instead of letting delta reconciliation collapse one of the duplicate blocks. One thing to know before retiring: a capability's spec is the base another change's MODIFIED block is checked against, so an in-flight change that modifies the capability you just retired will keep validating clean and then refuse to archive ("target spec does not exist; only ADDED requirements are allowed for new specs") — close or rework that change alongside the retirement.

Patch Changes
  • #​1502 ece8660 Thanks @​clay-good! - openspec validate now treats the English SHALL/MUST convention as guidance in normal mode, so requirements written in other languages can validate. Strict mode continues to enforce the convention.

  • #​1483 2b3d368 Thanks @​clay-good! - Tell the caller which flag to pass when openspec archive cannot ask its confirmation questions. An AI agent (or any script) runs the CLI with stdin closed, so every prompt rejects with @inquirer's User force closed the prompt with 0 null — the archive aborted with an error that named neither the question nor the flag, and agents burned a turn guessing (#​1479). Each confirmation now reports what it needed and a pasteable rerun that carries the flags you already passed: openspec archive <name> --skip-specs --yes stays a --skip-specs run, so following the suggestion cannot merge specs you opted out of merging, and a change name that needs quoting gets double quotes, the one form bash, zsh, PowerShell and cmd.exe all read the same way (a name no shell reads literally even quoted — one containing $, a backtick, or the %/! that cmd.exe still expands inside quotes — is left as a <change-name> placeholder rather than a command that would target something else). openspec archive with no change name used to swallow the same failure, print No change selected. Aborting. and exit 0 — success for a run that archived nothing; it now exits 1 asking for a change name, matching how openspec show and openspec validate already behave without a terminal. The check is reactive — it inspects a prompt that already failed — so answers piped into the command, --yes, --json, and Ctrl-C all behave exactly as before, and a run that OpenSpec already considers non-interactive (CI, OPEN_SPEC_INTERACTIVE=0, --no-interactive) gets the guidance even when the runner allocated a pty. The onboarding walkthrough, the only generated guidance that tells an agent to run openspec archive, now shows --yes.

  • #​1486 427abf4 Thanks @​clay-good! - Task progress now counts indented sub-tasks. A tasks.md whose sub-tasks were unfinished reported ✓ Complete in openspec list and openspec view, was missing those tasks from the openspec instructions apply list, and archived with no incomplete-task warning, because both checkbox parsers only matched checkboxes at column 0.

    Progress counting and the apply task list now share one parser, so list, view, archive and apply agree about which lines of a tasks file are tasks. A checkbox with no text after it is left out of the apply list, which has nothing to act on, but still counts toward every progress number; a file of nothing but such checkboxes now asks to be rewritten rather than reporting itself done. The shared pattern matches every line the two it replaced matched, and more, so task counts can rise but never fall: no change starts reporting less work than before, and archive's incomplete-task warning can only become stricter. Checkboxes are still counted wherever they appear, including inside a code fence, an HTML comment or an indented block, so a tasks.md that shows a checklist as a format example can now count that example as work — remove it from the file, or pass --yes to archive.

  • #​1500 26bd1d4 Thanks @​clay-good! - Keep generated workflows on the selected store, handle optional workflow fallbacks safely, and validate synced specs before reporting success.

  • #​1490 45cca5d Thanks @​clay-good! - Say before confirmation when archiving a change will delete a note written next to a requirement. A requirement absorbs anything below it that OpenSpec doesn't recognize as a new heading — a note indented by the one to three spaces Markdown allows, for example — so removing or modifying that requirement took the note with it, silently. openspec archive now names content the rebuilt spec would actually drop and where to move it to keep it. The merge itself is unchanged: nothing is relocated, because a # line inside a scenario looks identical to a note and moving one of those would rewrite the spec wrongly.

  • #​1492 690a27e Thanks @​mc856! - openspec init and openspec update no longer delete the CoStrict and Junie command files they just generated. Legacy cleanup removes artifacts older OpenSpec versions left behind, and two of its patterns named paths the current adapters still write to. CoStrict's was a whole-directory removal of .cospec/openspec/commands/, the folder the adapter writes opsx-<id>.md into, so every run wiped the directory — including any file the user kept there — while the banner above it read No user content to preserve. Junie's .junie/commands/opsx-*.md listed its own current output. Cleanup runs before the config migration, so on a config that has no profile key yet the missing command files make delivery detection read the project as skills-only and persist that to the global config: the files are not regenerated, and the preference changes for every other project too.

    CoStrict is now a file pattern, .cospec/openspec/commands/openspec-*.md, matching the three commands the pre-opsx CoStrict integration wrote there (openspec-proposal.md, openspec-apply.md, openspec-archive.md) and the same shape every other file-based tool already uses. Junie's entry is removed outright: Junie support arrived after the slash configurators that wrote openspec-* files were deleted, so no OpenSpec version ever created those files there. Genuinely legacy files are still detected and removed, and no other tool's patterns change — they never overlapped their adapter's current output.

  • #​1501 0b20ae3 Thanks @​clay-good! - Keep the propose workflow focused on planning, clarify material ambiguities before creating a change, and hand implementation off to the apply workflow.

  • #​1503 8a3850d Thanks @​clay-good! - When exploration turns into a new change, generated explore guidance now instructs agents to run openspec new change before writing requested artifacts. This preserves the required .openspec.yaml metadata instead of letting an agent create an incomplete change directory by hand. After the user accepts a capture, explore also creates the requested artifacts without requiring another workflow command.

  • #​1513 622c509 Thanks @​FasterPHP! - Honor telemetry.enabled in global config. false disables anonymous telemetry and openspec update version checks; unset keeps telemetry enabled, and env/CI opt-outs still take precedence.

  • #​1499 9cd845f Thanks @​clay-good! - Keep generated files, specs, archive moves, and local state inside their intended security boundaries without breaking linked monorepo workflows.

  • #​1482 84ebc57 Thanks @​clay-good! - openspec validate <change> now reports a MODIFIED requirement that omits a scenario the main spec still has — the same loss archive already refuses to apply — so the change fails at authoring time instead of at archive time. A change carrying a stale MODIFIED block will start failing validation; it was already unarchivable, and the message names the scenarios to copy back in.

v1.7.0

Compare Source

Minor Changes
  • #​1475 17af60c Thanks @​clay-good! - Add CodeArts Agent skills support: openspec init --tools codeartsagent installs the workflow skills.

  • #​1475 17af60c Thanks @​clay-good! - Add Hermes Agent as a supported AI tool: openspec init --tools hermes installs the workflow skills (Hermes is skills-only and invokes them directly).

  • #​1475 17af60c Thanks @​clay-good! - Add ZCode as a supported AI tool: openspec init --tools zcode generates its skills and /opsx:* commands.

  • #​1475 17af60c Thanks @​clay-good! - Codex is now skills-only: workflows install as $openspec-* skills and previously managed custom prompts are retired (existing ones are cleaned up on update).

  • #​1062 eac2973 Thanks @​showms! - Add current project context and per-operation guidance to apply and archive workflows. Projects can configure operations.apply.guidance and operations.archive.guidance; openspec instructions apply returns apply inputs, and the new read-only openspec instructions archive surface returns archive inputs for the selected root.

    Archive, bulk archive, and sync skills now load current archive inputs and specs artifact rules at execution time, fail before writes or moves when required instruction lookups fail, and reuse specs-rule snapshots during inline sync.

  • #​1475 17af60c Thanks @​clay-good! - Publish the workflow skills as static skills/<name>/SKILL.md files so npx skills add Fission-AI/OpenSpec works.

  • #​1399 27b22ab Thanks @​clay-good! - Add skip_specs: true change metadata for work with no spec-level behavior change (pure refactors, tooling, docs). openspec validate accepts a zero-delta change that declares the marker (honored only when the metadata parses under the shared change-metadata schema and names a schema that loads) and errors when the marker and delta specs are both present, the artifact graph no longer blocks tasks on spec files for such changes, openspec status renders the specs stage as explicitly skipped, and the propose/specs guidance points to the marker instead of contradicting the validator.

  • #​1475 17af60c Thanks @​clay-good! - Resolve symlinked schema directories so schemas shared via symlink (e.g. from a dotfiles repo) are discovered.

  • #​1470 6295515 Thanks @​clay-good! - openspec update now offers to upgrade the CLI when yours is behind the published one. Instruction files are generated by the installed CLI, so a stale install reported ✓ All 1 tool(s) up to date (v1.6.0) while the workflows added in newer releases were never written:

    A newer OpenSpec CLI is available (v1.6.0 → v1.7.0).
      Running from: /usr/local/lib/node_modules/@&#8203;fission-ai/openspec
    ? Upgrade to v1.7.0 now? (Y/n)
    

    Say yes and it upgrades, confirms the new version is the one that answers, then re-runs the update so the new workflows arrive in the same command. Say no and it prints the command matching how you installed OpenSpec, and updates with what you have. Nothing happens to your machine that you did not agree to: the offer appears only in an interactive terminal and only where npm install -g would help, and the check is skipped in CI or when OPENSPEC_NO_UPDATE_CHECK, DO_NOT_TRACK=1, or OPENSPEC_TELEMETRY=0 is set.

    See CLI reference → openspec update for the per-install-method behavior and every opt-out.

Patch Changes
  • #​1404 a84ae70 Thanks @​clay-good! - Generated skills for tools without a command adapter (Kimi Code, Mistral Vibe, Hermes, ForgeCode, CodeArts) no longer reference /opsx:* commands that were never generated: skill cross-references, the init getting-started hint, and the profile-migration message now use each tool's documented skill invocation (Kimi Code: /skill:openspec-*; others: /openspec-*), and Codex — skills-invocable with no slash surface — gets a syntax-neutral hint that names the skill. Selections that mix invocation syntaxes print one labeled hint per distinct form, so every advertised instruction is usable by the tool it names. When delivery: commands would generate nothing for a selected tool, init prints a configuration correction naming that tool, even when other tools did get commands or skills. The committed skills.sh distribution is regenerated with skill references (default /openspec-* form, as that channel installs skills only).

  • #​1363 5199f41 Thanks @​clay-good! - ### Features

    • One default store for every repo on your machineopenspec config set defaultStore <id> sets a machine-level fallback root: any command run outside a planning root, with no --store flag and no project store: pointer, resolves to that store. It sits at the bottom of the precedence list, so --store, a local root, and a project pointer all still win. The root banner and JSON root block report the distinct provenance source: "global_default", so users and tooling can tell a machine-wide default from a repo's own pointer. A stale id degrades to the underlying store error with a fix that names openspec config unset defaultStore.
  • #​1435 6a5171e Thanks @​clay-good! - openspec new change now accepts numeric-prefixed names like 100-add-feature or 00001-add-auth, useful for ordering or tiering changes. Change names now use the same kebab-case grammar as store ids and change metadata (a leading digit is allowed); archive already treated date-prefixed names as a supported convention. Uppercase, spaces, underscores, and leading/trailing or consecutive hyphens are still rejected, and every previously valid name stays valid.

  • #​1425 040a869 Thanks @​clay-good! - Compare config key guards literally instead of through a helper.

    setNestedValue and deleteNestedValue rejected prototype-reaching key segments through a helper that did a Set lookup. That is correct, but static analysis could not follow it, so CodeQL kept reporting prototype-pollution on the very assignments the guard protects. The segments are now compared literally in the same function, still checked across the whole path before anything is written. Behavior is unchanged for every input, verified against the previous implementation across 400,000 generated cases.

  • #​1431 6a4f0d7 Thanks @​clay-good! - A delta spec that introduces a brand-new capability can now open with a ## Purpose, and openspec archive uses it as the Purpose of the main spec it creates instead of writing the TBD - created by archiving change <name>. Update Purpose after archive. placeholder over it. The specs artifact instruction, its example, the delta template and the openspec-sync-specs skill all tell authors and agents to write one, so the CLI and agent-driven sync paths produce the same main spec.

    Archive keeps the placeholder when the delta has no usable ## Purpose:

    • no ## Purpose header outside a code fence or HTML comment, or a body that is only a code fence or only a comment
    • a body that would leave a spec its own parser cannot read — a heading or requirement header that truncates a section, an unterminated fence, or any HTML comment
    • in the second case archive also says why, and still completes rather than aborting

    A carried Purpose under 50 characters is kept but warned about, since openspec validate --strict reports it as too brief. The Purpose of an existing main spec is never touched; archive warns when it ignores a delta's Purpose there.

  • #​1437 19d4171 Thanks @​clay-good! - openspec archive no longer aborts when a REMOVED delta's requirement is already gone from the main spec (the early-sync pattern the sync skill teaches): it warns, treats the removal as already applied, and reports applied-only totals. In --json mode those warnings are carried in a new optional warnings array on the archive result. When every operation for a spec was already synced, archive skips rewriting that file instead of churning normalization differences into it. A delta that both RENAMEs and REMOVEs the same requirement is now rejected explicitly, by both validate and archive — the two spellings are compared case- and whitespace-insensitively — and a REMOVED header that differs only in case or whitespace from an existing requirement still aborts (that is a typo, not an early sync). Also fixed: the archive delta gate matches section headers case-insensitively like the parser; symlinked specs/<capability>/spec.md files are discovered instead of silently dropped; openspec show <change> no longer prints a spurious "scenarios" flag warning; files generated for qwen and bob reference commands by their real hyphenated names (/opsx-<id>), and init's getting-started hint follows suit; apply/update/onboard guidance names the CLI fallback for profiles that don't install /opsx:continue or /opsx:new.

  • #​1411 c439a4e Thanks @​clay-good! - Fix phantom requirements parsed from delta specs, which made openspec archive warn about problems openspec validate never reported.

    A header inside a delta section that is not a ### Requirement: header — a divider such as ### Documentation Requirements — was read as a requirement with no scenario. openspec archive warned that it was missing a scenario, and openspec show <change> --json and openspec change list counted it as an extra delta. The change parser now ignores those headers, matching the delta reader, so the phantom is gone from the warnings and from the JSON. Main spec parsing is unchanged.

    openspec archive also no longer repeats requirement-level issues from the delta specs in its non-blocking "Proposal warnings in proposal.md" block. Each defect was printed twice there, and a ## REMOVED Requirements entry — names-only by design — was reported as missing a scenario on every correct removal. Delta spec validation still reports and blocks on genuine defects, and proposal-level warnings are unchanged.

  • #​1394 b474f81 Thanks @​clay-good! - ### Bug Fixes

    • Archive no longer races the spec sync, or reports a sync that never landed — the generated openspec-archive-change skill (and the matching opsx:archive command) handed the spec sync to a background task and then moved the change folder immediately. The archive could move the delta specs out from under the running sync: the change ended up archived, openspec/specs/ was never updated, and the summary still reported Specs: ✓ Synced. The sync now runs inline, and the archive only proceeds once every capability with a delta spec has been checked against it — ADDED present, MODIFIED changes applied, REMOVED gone, RENAMED under the new name and not the old. If the sync fails or a capability doesn't match, the archive stops and reports what differs instead of claiming success; nothing has moved, so you can fix it and retry.
  • #​1475 17af60c Thanks @​clay-good! - Apply profile changes with the installed CLI instead of shelling out to npx, which could run a different version.

  • #​1475 17af60c Thanks @​clay-good! - Delta and main-spec parsers strip a UTF-8 BOM, so files saved by Windows editors or PowerShell redirects no longer fail with "No delta sections found".

  • #​1398 97d441a Thanks @​clay-good! - ### Bug Fixes

    • Bulk archive now stops when you pick "Cancel" — the generated openspec-bulk-archive-change skill (and the matching opsx:bulk-archive command) offered a "Cancel" option at the confirmation prompt but never told the agent what to do with it, so the next step archived every selected change anyway. The prompt now routes each answer by intent: "Cancel" stops without archiving anything, the archive options proceed (the ready-only option archives just the changes the status table marks Ready or Ready*), and any other answer re-asks instead of archiving. The single-change archive skill already routes Cancel this way; this brings the bulk variant in line.
  • #​1375 52a8bce Thanks @​clay-good! - --change now accepts any change name that exists on disk (e.g. date-prefixed names like 2026-07-04-voice-copilot-v1), matching what list, validate, and archive already resolve. Lookup still rejects unsafe names (path separators, .., hidden entries); the kebab-case naming rule still applies when creating a change.

  • #​1475 17af60c Thanks @​clay-good! - openspec new change rejects names over 200 characters with a validation message instead of surfacing a raw ENAMETOOLONG filesystem error.

  • #​1447 fb19699 Thanks @​hsusul! - Generated tool command files now carry valid YAML frontmatter for every supported tool. Command names ship as OPSX: Explore, and the unquoted name: OPSX: Explore that adapters emitted is not parseable YAML — strict parsers rejected the whole file, so the command failed to load. Several adapters also re-implemented their own escaping, and a few interpolated descriptions in raw.

    Escaping now lives in one place (escapeYamlValue / formatTagsArray) and every adapter uses it. String frontmatter values are always double-quoted, which also keeps values like true, null and 123 from round-tripping as booleans, nulls and numbers. Non-string fields such as allowed-tools and invokable are unchanged. Expect the first openspec update after upgrading to rewrite the frontmatter lines of your generated command files.

    Archive workflow guidance also gets two corrections: bulk archive now carries its per-delta include/exclude decisions into execution, so a delta whose implementation was not found is reported as sync skipped instead of being synced anyway, and both archive workflows verify the main specs before moving the change directory.

  • #​1471 9a937cb Thanks @​clay-good! - Reference slash commands by the name each tool actually registers. Command bodies, generated SKILL.md cross-references, and the init/update/migration hints all advertised /opsx:<id>, but only 7 of the 28 tools with a command adapter register that name — the ones whose files sit in an opsx/ directory. The other 21 write .../opsx-<id>.md, where the filename is the command, so tools such as Cursor, GitHub Copilot, Windsurf and Kilo Code were told to type a command their palette never had; a single generated Cursor file named itself /opsx-apply in frontmatter and then told the reader to run /opsx:apply. The command name is now derived from the command file each adapter writes rather than a hand-maintained tool list, so a newly added adapter cannot drift, and the wrapper around it is adapter metadata: Amazon Q loads its files into a prompt library invoked with @, so it now gets @opsx-<id> in command bodies, skills, and the onboarding hint instead of a slash command it never registers. Codex, which generates no command files at all, now gets $openspec-<skill> — the syntax its CLI actually accepts — everywhere it previously advertised /opsx:*, superseding the syntax-neutral hint described in the pending adapterless-skill-references note. Command filenames and paths are unchanged, and Claude Code output is byte-identical.

  • #​1364 f58b445 Thanks @​clay-good! - Fix openspec completion install detecting the wrong shell for fish (and other)
    users whose interactive shell differs from their login shell. Detection now
    consults the parent process before falling back to $SHELL, so running the
    command from fish installs fish completions instead of defaulting to bash.

  • #​1377 285dfd7 Thanks @​clay-good! - ### Bug Fixes

    • Config rules: keys are no longer reported as Unknown artifact ID when they belong to a different schema. The global rules map is now validated against the union of artifact IDs across every available schema, so multi-schema projects stop seeing spurious warnings on every command (#​1322).
  • #​1401 b33b15d Thanks @​clay-good! - Stop design.md from restating the proposal. In the default spec-driven schema, the design instruction asked for "Background, current state, constraints, stakeholders" and "What this design achieves and excludes" without saying that motivation and scope already live in proposal.md, so agents restated the proposal's Why and What Changes instead of adding the design's own value - approach, alternatives, and trade-offs. The instruction and the design template now state the boundary explicitly (the proposal covers why and what, design covers how) and tell the agent to reference those documents rather than repeat them (#​1382).

  • #​1167 1637856 Thanks @​mehdishahdoost! - Windsurf is now Devin Desktop. Windsurf was rebranded on June 2, 2026 and its config directory moved: .devin/ is the preferred read + write location, .windsurf/ a legacy read-only fallback that the Devin Local agent does not read at all. OpenSpec follows the rename rather than carrying two ids for one product — the tool id is devin, writing .devin/workflows/opsx-<id>.md and .devin/skills/openspec-*/SKILL.md, and it is detected from either directory.

    • --tools windsurf still resolves, so existing setup scripts keep working; it now configures .devin/.
    • If your OpenSpec files are still in .windsurf/, openspec update explains the rebrand and offers to move them. --force and non-interactive runs take the move; declining leaves every file exactly where it is. Only the files OpenSpec generates move — each skill's SKILL.md and commands named opsx-*. A hand-written Cascade workflow, a reference file you keep beside a SKILL.md, a command file you edited, and .devin/rules/ all stay exactly where they are.
    • Devin skills and the getting-started hint reference /openspec-* skills rather than /opsx-* workflows, because only Devin Desktop reads workflows; the /openspec-* form works on both agents. Workflow bodies still use /opsx-<id>, the name Devin registers for a workflow file.
  • #​1475 17af60c Thanks @​clay-good! - openspec doctor now notes when a store checkout is behind its upstream ref.

  • #​1475 17af60c Thanks @​clay-good! - Make the archive scenario-drift check multiplicity-aware: a MODIFIED block that keeps only one of two same-named scenarios no longer silently drops the other.

  • #​1408 378d468 Thanks @​clay-good! - Explore now reads the project's context and rules from openspec/config.yaml (or config.yml) at the start of a session, so it reasons with the same tech stack and conventions the artifact-creating workflows already receive.

  • #​1475 17af60c Thanks @​clay-good! - openspec feedback shows the formatted text and a pre-filled submission URL on any gh failure (issues disabled, network, rate limit), not only when gh is missing or unauthenticated.

  • #​1396 60f720c Thanks @​clay-good! - Fix openspec feedback failing when the repository does not define the feedback label. The command now retries without the label and notes that it was not applied, instead of exiting with an error and discarding the feedback.

  • #​1151 18cbf5d Thanks @​javigomez! - ### Fixed

    • Ignore Markdown structure (requirement headers, delta sections, scenarios, REMOVED/RENAMED entries) that appears inside fenced code blocks when parsing delta specs. Previously a fenced ### Requirement: example was parsed as a real (phantom) requirement, producing spurious validate errors and risking incorrect archive output. Fenced-code detection is now shared across the Markdown parsers so validate and archive behave consistently.
  • #​1475 17af60c Thanks @​clay-good! - The archive scenario-drift check now ignores #### Scenario: lines inside fenced code blocks, matching validate: a fenced example no longer false-aborts an archive, and a fenced name no longer masks a genuinely dropped scenario.

  • #​1316 9b70481 Thanks @​mc856! - ### Bug Fixes

    • archive no longer stacks a second date prefix — archiving a change whose name already starts with a YYYY-MM-DD- prefix (a common authoring convention) keeps the name as-is instead of prepending today's date. Previously openspec archive 2026-07-04-voice-copilot-v1 --yes produced 2026-07-06-2026-07-04-voice-copilot-v1, and when run on a later day the folder sorted under a day on which the change did not happen. Names without a full date prefix (including partial dates like 2026-07-feature) are dated as before, and the naming is now idempotent.
  • #​1374 da3907b Thanks @​clay-good! - fix(completion): make the PowerShell completion script parse and load again

    The generated OpenSpecCompletion.ps1 contained 18 empty switch ($positionalIndex) { } blocks — emitted for commands whose positionals are all path-typed (PowerShell completes paths natively, so those cases produce no clauses). A switch with no clauses is a PowerShell parse error ("Missing condition in switch statement clause"), and PowerShell parses the whole file before running it, so the script never loaded and completions never registered. The generator now skips the positional-index block entirely when no positional produces completions, so the script parses clean (18 → 0 errors) and tab completion works.

  • #​1388 9b5d2cd Thanks @​mc856! - ### Bug Fixes

    • Archive workflow templates no longer teach agents to stack a second date prefix — the openspec-archive-change and openspec-bulk-archive-change skill/command templates (and the onboarding walkthrough's archived-path example) now mirror the openspec archive rule: a change whose name already starts with a YYYY-MM-DD- prefix is archived under its own name, while other names get the current date prepended as before. Previously an agent following the workflow instructions on a change named 2026-07-04-voice-copilot-v1 produced archive/2026-07-07-2026-07-04-voice-copilot-v1, whatever the CLI did.
  • #​1475 17af60c Thanks @​clay-good! - Gemini command files escape TOML-active characters (quotes, backslashes, control characters) in the description and prompt, so a template value containing them can no longer produce an invalid .toml file.

  • #​1464 5bcf057 Thanks @​clay-good! - Workflow skills and commands no longer tell agents to use the Claude Code-only AskUserQuestion tool. The same templates are generated for every supported tool, and agents without that tool (OpenCode, Factory Droid, Codex, and others) errored or stalled on the instruction. The guidance is now runtime-neutral: agents are simply told to ask the user.

  • #​1403 2d6c447 Thanks @​clay-good! - ### Bug Fixes

    • Propose and fast-forward skills no longer name the Claude-only TodoWrite tool — the generated openspec-propose and openspec-ff-change skills (and their /opsx:propose / /opsx:ff commands) told every agent to "Use the TodoWrite tool", which only exists in Claude Code. Codex, Cursor, Gemini, Copilot, and the other supported tools have no such tool, so agents either errored or stalled looking for it. The instruction is now runtime-neutral ("Use a todo list to track progress"), which works everywhere — including Claude Code.
  • #​1415 e2f748c Thanks @​clay-good! - Reject config key paths that reach the prototype chain, and update the bundled yaml dependency.

    openspec config set --allow-unknown __proto__.polluted <value> reported success and assigned onto Object.prototype for the rest of the process. --allow-unknown was meant to relax the known-key check only, but it skipped every key check, so __proto__, constructor, and prototype segments reached the nested-write helper. Those segments are now rejected in config set whether or not --allow-unknown is passed, and setNestedValue / deleteNestedValue refuse them regardless of caller. Ordinary keys such as featureFlags.myFlag behave exactly as before.

    The yaml runtime dependency moves from 2.8.2 to 2.9.0, picking up the fix for a stack overflow on deeply nested input (GHSA / advisory patched in 2.8.3).

  • #​1376 7958924 Thanks @​clay-good! - ### Bug Fixes

    • Archive after early syncopenspec archive no longer fails with ADDED failed … already exists when a change's specs were already synced to the main specs before archiving (the early-sync pattern from the sync workflow). If an ADDED requirement already exists in the target spec with identical content, applying it is treated as a no-op; a same-named requirement with different content still aborts the archive as a genuine conflict (#​1332).
  • #​1386 b419e96 Thanks @​mc856! - ### Bug Fixes

    • Archive after early sync (RENAMED)openspec archive no longer fails with RENAMED failed … source not found when a change's renames were already synced to the main specs before archiving (the early-sync pattern from the sync workflow). If a RENAMED requirement's source header is gone but the target header exists in the spec, applying the rename is treated as a no-op; a rename whose source and target are both missing still aborts the archive as a genuine error, and reported counts reflect only renames actually applied.
  • #​1462 ebf66c7 Thanks @​clay-good! - Respect reduced-motion preferences in openspec init: the welcome animation is skipped when the OS reduced-motion setting is on (macOS Reduce Motion, GNOME animations disabled), when OPENSPEC_NO_ANIMATION is set, or when the new --no-animation flag is passed. The static welcome screen is shown instead.

  • #​1405 5dfef4b Thanks @​clay-good! - ### Bug Fixes

    • Custom schema instructions are no longer overridden by hard-coded spec-driven patterns — the openspec-continue-change skill/command embedded one-line "common artifact patterns" for proposal.md, specs, design.md, and tasks.md, so agents followed those shortcuts instead of the schema's instruction field whenever a custom schema reused familiar artifact names. The templates now state that the instruction field is the authoritative guidance, and the propose, continue, and ff workflows direct the agent — both in the artifact-creation step and in the guidelines — to invoke a skill when the instruction delegates artifact creation to one, verifying the artifact exists afterward (fixes #​777).
  • #​1475 17af60c Thanks @​clay-good! - Follow the Kimi CLI rename to Kimi Code: new install paths with automatic migration of existing .kimi setups.

  • #​1415 e2f748c Thanks @​clay-good! - Parse spec headings in linear time when the title is padded with whitespace.

    Building the reference index read the first Purpose line with a regex that backtracked quadratically on a heading full of spaces: 10,000 characters of padding took 60ms, and 100,000 would have taken roughly six seconds. The heading scan is now hand-rolled and linear. Behavior is unchanged — the replacement was checked against the old implementation across 303,000 generated inputs, including CommonMark closing sequences (## Purpose ##), seven-hash lines, and headings with no space after the hashes.

  • #​1475 17af60c Thanks @​clay-good! - Use local dates for CLI date-only values (archive names, timestamps) instead of UTC, so late-evening archives no longer get tomorrow's date.

  • #​1475 17af60c Thanks @​clay-good! - openspec update warns when a custom profile is missing core workflows instead of silently generating a partial install.

  • #​1428 81d5109 Thanks @​taltas! - Update current Roo Code product references to its community successor, Zoo Code.

  • #​1475 17af60c Thanks @​clay-good! - Archive treats a MODIFIED delta whose content already matches the main spec as a no-op: a fully early-synced change now reports "Specs already in sync" instead of rewriting the file and claiming modifications.

  • #​1475 17af60c Thanks @​clay-good! - Render multi-select prompts with [x]/[ ] checkbox markers instead of radio-button icons.

  • #​1475 17af60c Thanks @​clay-good! - Discover nested spec paths like specs/<area>/<capability>/spec.md recursively and consistently across parse, apply, and archive.

  • #​1410 b3b05e1 Thanks @​clay-good! - Only advertise onboarding commands that will actually exist. The openspec init welcome screen and the openspec update "Getting started" summary listed /opsx:new and /opsx:continue, which the default core profile never generates, so users were told to run commands that did not exist. Both surfaces now list the commands for the installed workflows. The init and update completion hints also name the skill (/openspec-propose) instead of a command for tools that receive no command files — Codex, and any tool under skills-only delivery.

  • #​1412 1dc670d Thanks @​clay-good! - ### Fixed

    • /opsx:propose and /opsx:ff no longer finish a change with no spec written. The workflows listed only proposal/design/tasks and treated the apply phase's tasks artifact as the stop condition — but status marks an artifact done as soon as a matching file exists, so writing tasks.md early satisfied the loop while specs/<capability>/spec.md was never created (a spec-less change in a spec-driven tool). The loop now derives the full required set — every apply dependency plus everything it transitively requires — from a single status call, creates each missing artifact, and only skips one when its own instruction field marks it conditional. (#​1260, #​788)
Changed
  • openspec status --json now reports each artifact's requires edges. Every entry in the artifacts array carries a requires array of the ids it directly depends on, present for every status (including done) so agents can compute the transitive required set from status alone. Additive and backward-compatible — existing fields are unchanged.

  • #​1191 7704702 Thanks @​mc856! - Generate Markdown commands for Qwen Code instead of deprecated TOML format. Qwen Code now recommends Markdown custom commands with YAML frontmatter; the old .qwen/commands/opsx-*.toml files are cleaned up as legacy artifacts on update.

  • #​1475 17af60c Thanks @​clay-good! - An already-synced RENAMED delta aborts when a case/whitespace variant of the source requirement still exists — the same typo guard REMOVED deltas have.

  • #​1368 de78c31 Thanks @​clay-good! - ### Fixes

    • Regenerated artifacts now pick up your manual edits — the continue, propose, and fast-forward workflows (and the openspec instructions dependency block) now tell the agent to re-read dependency artifacts from disk before creating the next one, instead of trusting whatever version it saw earlier in the conversation. Previously, editing spec.md and deleting design.md/tasks.md to regenerate them could silently produce artifacts based on the stale, pre-edit content.
  • #​1475 17af60c Thanks @​clay-good! - Proposal guidance now resolves blocking open questions with the user instead of deferring them to design.md.

  • #​1392 a13abea Thanks @​clay-good! - ### Fixed

    • Stop a delta spec written directly at a change's specs/ root from being silently dropped. validate accepted specs/spec.md and counted its deltas, but the apply/archive merge only reads capability folders (specs/<capability>/spec.md), so the change could pass validation and be archived while its requirements never reached openspec/specs/. validate now uses the same discovery rules as the merge path and reports the misplaced file with a fix hint, and archive blocks instead of completing.
  • #​1465 f917b8b Thanks @​clay-good! - Order artifacts by the schema's declaration order instead of alphabetically.

    specs and design both require only proposal, so both become ready at once - and the tie used to be broken alphabetically, which put design first. openspec status listed design above specs and nextSteps recommended writing design.md before any spec existed, contradicting the spec-driven schema's own documented proposal → specs → design → tasks sequence.

    Ties now follow the order the schema declares its artifacts, so openspec status, status --json, nextSteps, blocked by: lists, and an artifact's unlocks all agree. No dependency edges changed, so nothing newly blocks and design.md stays optional - only the order of equally-ready artifacts moved. Custom schemas get the same guarantee: dependency order still comes first, but wherever your schema leaves two artifacts equally ready, the order of its artifacts: list now decides which one the CLI recommends - so reorder that list if it was never deliberate.

  • #​1446 5348da9 Thanks @​showms! - ### Bug Fixes

    • Preserve an existing project-local schema when openspec schema init --force rejects an unknown artifact ID. Forced replacement now begins only after artifact validation succeeds.
  • #​1433 26f009d Thanks @​clay-good! - Change lookup no longer requires proposal.md. openspec show, openspec change list/show/validate, and shell completion now resolve a change by its directory, matching openspec list, status, instructions, and validate.

    Previously a change created by openspec new change — which scaffolds only .openspec.yaml — was reported as Unknown item by openspec show and was missing from completions and openspec change list until a proposal was written, and a change from a schema with no proposal artifact was never resolvable. openspec change list now reports the same set as openspec list, keeps task counts for a change that has no proposal yet, and labels it (no proposal.md yet) rather than (unable to read). Showing such a change explains that the proposal is not written yet and points at openspec status --change <name>.

  • #​1468 fc886af Thanks @​clay-good! - The continue, update, verify, sync, and archive workflow skills now select a change the same way apply does: use the provided name, infer it from conversation context, auto-select when exactly one active change exists, and only prompt when the choice is genuinely ambiguous. Previously these workflows were told to always prompt ("Do NOT guess or auto-select"), so invoking them with a single active change stalled on a question with only one possible answer. The selection is always announced ("Using change: ") with how to override, and bulk archive still always prompts.

  • #​1194 b7c85c7 Thanks @​mc856! - Fix skills-only delivery emitting /opsx:* command references. SKILL.md files generated by init, update, and workspace skill setup now reference the corresponding skills (e.g. /openspec-apply-change) when delivery: 'skills' is configured, instead of commands that were never generated.

  • #​1475 17af60c Thanks @​clay-good! - Specs instructions include the spec content guidance from the concepts docs, so generated specs follow the requirement/scenario format.

  • #​1475 17af60c Thanks @​clay-good! - The static welcome screen (reduced motion, --no-animation, narrow terminals) now waits for the Enter it asks for instead of letting the keystroke submit the tool picker unseen.

  • #​1475 17af60c Thanks @​clay-good! - Sync and archive workflows resolve main specs through the store-aware root instead of assuming openspec/specs in the repo.

  • #​1402 0da5f98 Thanks @​clay-good! - Show the main spec format in the sync-specs skill so agents stop leaving delta operation headers (## ADDED/MODIFIED Requirements) in openspec/specs/ — merged main specs with those headers parse as 0 requirements in openspec view (#​1120).

  • #​1476 8731290 Thanks @​clay-good! - Telemetry no longer depends on posthog-node: the single usage event is sent with a plain fetch to the same endpoint. Installing OpenSpec no longer pulls the fast-publishing posthog-node/@posthog/core/@posthog/types tree, which broke downstream installs under supply-chain age policies like pnpm's minimumReleaseAge (#​1390).

  • #​1475 17af60c Thanks @​clay-good! - The stale-CLI check hardens its install detection: a directory merely named volta no longer changes the upgrade hint, the Windows npm-ownership check corroborates against the openspec.cmd shim npm actually writes, and a registry redirect from https to plain http is no longer followed.

  • #​1475 17af60c Thanks @​clay-good! - The stale-CLI check tears down a redirected registry connection when its time budget expires instead of leaving the socket open.

  • #​1442 10fa39b Thanks @​hsusul! - openspec update now refreshes tools that are configured with command files but no skills (delivery commands). Previously it read the generating version only from skill files, so such a tool was reported as "up to date" forever and its command files were never regenerated after a CLI upgrade. Command files carry no version stamp, so OpenSpec compares their contents against what it would generate now — including removing a command file left behind by a workflow you have since deselected. CRLF line endings and a UTF-8 BOM are treated as checkout artifacts rather than drift, so a Windows clone does not report a spurious update.

  • #​1475 17af60c Thanks @​clay-good! - openspec update with delivery: commands prints the same configuration correction as init when it removes the skills of a tool that supports only skills, instead of deleting them silently.

  • #​1475 17af60c Thanks @​clay-good! - openspec validate reports an unreadable specs/ directory as the error it is instead of misdiagnosing it as "no deltas found".

  • #​1455 6b3623a Thanks @​c4patino! - openspec view now resolves the configured OpenSpec root instead of always reading the current directory, and accepts --store <id> like its sibling commands. Projects whose openspec/config.yaml points at an external store saw an empty dashboard — 0 specs, 0 requirements — while openspec list read the same store correctly.

  • #​1475 17af60c Thanks @​clay-good! - Preserve keyboard input on Windows after the welcome screen instead of dropping the first keystrokes.

  • #​1475 17af60c Thanks @​clay-good! - zsh completion install honors $ZSH and $ZSH_CUSTOM, so Oh My Zsh setups at custom locations get the completion where their shell actually loads it.

eslint/eslint (eslint)

v10.8.1

Compare Source

Bug Fixes

  • 18eb0a7 fix: prevent ASI hazard in no-unused-labels autofix (#​21173) (dongkyu lee)
  • 151ba3f fix: false positives in getter-return and accessor-pairs (#​21163) (Grit)
  • 6898df9 fix: ignore meta-property names in id-denylist (#​21166) (Pixel)
  • 4d7db66 fix: ignore meta-property names in id-match (#​21167) (Pixel)
  • 677214e fix: handle ASI hazards in no-unused-vars removeVar suggestion (#​20935) (kuldeep kumar)

Documentation

  • 7d0cbf8 docs: Update README (GitHub Actions Bot)
  • 0a05812 docs: add missing backticks to no-duplicate-imports.js (#​21183) (Lee Daeun)
  • 678c90b docs: Update README (GitHub Actions Bot)
  • 8a10424 docs: Update README (GitHub Actions Bot)
  • 69bb948 docs: Update README (GitHub Actions Bot)

Chores

v10.8.0

Compare Source

Features

Bug Fixes

  • 6b8d2f7 fix: escape reserved characters in rule id in html formatter (#​21129) (Francesco Trotta)
  • 9091071 fix: prevent no-unreachable-loop crash when all loop types are ignored (#​21116) (Pixel)
  • e23fafe fix: prefer-object-spread add semicolon when adding parenthesis (#​21081) (synthex-byte)
  • 20b5ad0 fix: quadratic-time regex in prefer-template (#​21096) (Milos Djermanovic)
  • 8b6f6c0 fix: apply ignore configs to computed methods in class-methods-use-this (#​21094) (Pixel)
  • b2c608c fix: NewExpression with parenthesized callee in preserve-caught-error (#​21083) (Francesco Trotta)

Documentation

  • 6ddf858 docs: fix broken Specify Parser Options anchor link (#​21106) (Minsu)
  • 784dfbe docs: Clarify no-eq-null description (#​21120) (Park Harin)
  • 7ec733a docs: Fix typos and grammar in glossary (#​21095) (Marry (Subin Yang))
  • 92bb13f docs: replace quake link (#​21108) (Jung Hyeon Jun)
  • 68eb4a5 docs: fix broken Specify Globals anchor links in rule pages (#​21103) (Minsu)
  • d28f697 docs: replace Code Climate CLI links with Qlty CLI links (#​21099) (Jung Hyeon Jun)
  • eccc68d docs: correct --suppressions-location option description (#​21093) (Ga eun Lee)
  • c5963f7 docs: Update README (GitHub Actions Bot)

Chores

  • 4fbf46d test: pin webpack version to 5.108.4 (#​21137) (Francesco Trotta)
  • 2d063e2 chore: update HTTP URLs to HTTPS in JSDoc and comments (#​21101) (Bo Hyun Kim)
  • eccbe7b test: add error locations to no-class-assign (#​21123) (devoil)
  • e7d1e43 ci: bump actions/setup-go from 6 to 7 (#​21118) (dependabot[bot])
  • e9d66d0 ci: bump actions/setup-node from 6 to 7 (#​21119) (dependabot[bot])
  • ee225b6 test: Add error location details to no-eq-null rule (#​21117) (Park Harin)
  • 044a627 chore: update minimatch to ^10.2.5 (#​21107) (김채영)
  • fb09aa8 chore: update ecosystem plugins (#​21115) (ESLint Bot)
  • 5abd878 test: add error locations to no-proto (#​21114) (Gihyeon Jeong / 정기현)
  • 9715887 test: Add error location details to no-div-regex (#​21110) (Park Harin)
  • a746ec6 test: add error locations to no-new-wrappers (#​21109) (Gihyeon Jeong / 정기현)
  • 8dde645 test: add error locations to no-ex-assign (#​21102) (devoil)
  • 13ab0ec test: add error locations to no-label-var (#​21098) (Gihyeon Jeong / 정기현)
  • a99906f test: Add error location details to no-delete-var rule (#​21105) (Park Harin)
  • c47e8dc chore: add missing backticks to languages/js/index.js (#​21104) (beeen)
  • 0174428 chore: add missing backticks to translate-cli-options.js (#​21097) (dongkyu lee)
  • 3d36589 chore: add missing backticks to serialization.js (#​21091) (이규환)
  • dcc9312 test: add error locations to eqeqeq (#​21090) (Ga eun Lee)
  • 2710b18 ci: Add explicit permissions to rebuild-docs-sites workflow (#​21089) (Marry (Subin Yang))
  • 5d2f866 chore: update dependency prettier to v3.9.5 (#​21086) (renovate[bot])
  • d584e31 chore: fix failing ecosystem test for eslint-plugin-unicorn (#​21084) (Francesco Trotta)
  • bf3eda0 chore: update ecosystem plugins (#​21079) (ESLint Bot)
jsdom/jsdom (jsdom)

v30.0.1

Compare Source

  • Fixed getComputedStyle() with calc() and other functions throwing an exception, which regressed in v30.0.0. (@​asamuzaK)
  • Sped up up range operations on large documents (@​leonidaz)
prettier/prettier (prettier)

v3.9.6

Compare Source

diff

TypeScript: Preserve quotes for methods named new (#​19621 by @​kovsu)
// Input
interface Container {
  "new"(id: string): number;
}

// Prettier 3.9.5
interface Container {
  new(id: string): number;
}

// Prettier 3.9.6
interface Container {
  "new"(id: string): number;
}
TypeScript: Support import defer (#​19624, #​19675 by @​fisker)
// Input
import defer * as foo from "foo";

// Prettier 3.9.5
import * as foo from "foo";

// Prettier 3.9.6
import defer * as foo from "foo";
JavaScript: Added a new official plugin @prettier/plugin-yuku (#​19628, #​19629 by @​fisker)

@prettier/plugin-yuku is powered by Yuku (A high-performance JavaScript/TypeScript compiler toolchain written in Zig).

This plugin includes two new parsers: yuku (JavaScript syntax) and yuku-ts (TypeScript syntax).

To use this plugin:

  1. Install the plugin:

    yarn add --dev prettier @&#8203;prettier/plugin-yuku
    
  2. Add it to your .prettierrc:

    plugins:
      - "@&#8203;prettier/plugin-yuku"
    

Due to package size limitations, this plugin is not bundled with the main prettier package and must be installed separately.

For more information, check the package homepage.

Big thanks to @​arshad-yaseen for his excellent work.

i18next/react-i18next (react-i18next)

v17.0.11

Compare Source

  • chore: html-parse-stringify updated to ^4.0.1. The parser powering <Trans> is now actively maintained under the i18next org (i18next/html-parse-stringify) after years without upstream releases. 4.x brings modern dual ESM/CJS packaging with an exports map, zero runtime dependencies, reworked TypeScript types and a long list of parser fixes (literal < in text, multiline/CRLF attribute values, comments containing >, doctype handling, quote-aware bracket handling).
  • refactor(Trans): the internal escapeLiteralLessThan scanner (~80 lines) is replaced by the parser's new allowedTags option with identical semantics: only numbered tags, kept basic HTML tags and known component names are parsed as markup, any other tag-shaped sequence in the translation stays literal text. Rendered output is unchanged (all 493 tests pass, including the #​1880 and #​1893 escaping cases).

v17.0.10

Compare Source

  • fix(warnings): the useTranslation and Trans "You will need to pass in an i18next instance" warnings now match the useSSR wording, mentioning the props/context alternatives and the most common unexplained cause at scale: duplicate react-i18next copies in monorepo setups. The Trans variant also referenced the internal i18nextReactModule name; it now points to the public initReactI18next API.
  • feat(warnings): development-only warning (SUSPENDED_WHILE_LOADING, logged once) right before useTranslation suspends while translations are loading. With the default useSuspense: true and no <Suspense> boundary this previously surfaced as a blank screen or a cryptic React error; the warning now names both fixes (add a <Suspense> boundary or set react.useSuspense: false). No-op in production builds; the process.env.NODE_ENV check is wrapped so runtimes without a process global (raw ESM in the browser, some edge runtimes) stay silent instead of throwing.
  • ci: weekly workflow typechecking the test suite against @types/react@next / @types/react-dom@next, so the next React major's type changes (like the React 18 TFunctionResult/children wave) surface before user reports.
react/react (react-test-renderer)

v19.2.8: 19.2.8 (July 21st, 2026)

Compare Source

React Server Components

vercel/turborepo (turbo)

v2.10.11: Turborepo v2.10.11

Compare Source

What's Changed

Changelog

Full Changelog: https://github.com/vercel/turborepo/compare/v2.10.10...v2.10.11

v2.10.10: Turborepo v2.10.10

Compare Source

What's Changed

Changelog

New Contributors

Full Changelog: https://github.com/vercel/turborepo/compare/v2.10.9...v2.10.10

v2.10.9: Turborepo v2.10.9

Compare Source

What's Changed

Changelog

New Contributors

Full Changelog: https://github.com/vercel/turborepo/compare/v2.10.8...v2.10.9

v2.10.8: Turborepo v2.10.8

Compare Source

What's Changed

Changelog

New Contributors

Full Changelog: https://github.com/vercel/turborepo/compare/v2.10.7...v2.10.8

v2.10.7: Turborepo v2.10.7

Compare Source

What's Changed

Changelog

Full Changelog: https://github.com/vercel/turborepo/compare/v2.10.6...v2.10.7

v2.10.6: Turborepo v2.10.6

Compare Source

What's Changed

Changelog

New Contributors

Full Changelog: https://github.com/vercel/turborepo/compare/v2.10.5...v2.10.6

v2.10.5: Turborepo v2.10.5

Compare Source

What's Changed

Changelog

New Contributors

Full Changelog: https://github.com/vercel/turborepo/compare/v2.10.4...v2.10.5

typescript-eslint/typescript-eslint (typescript-eslint)

v8.67.0

Compare Source

🚀 Features
  • typescript-eslint: export basic globs for using tseslint (#​12105)
❤️ Thank You

See GitHub Releases for more information.

You can read about our versioning strategy and releases on our website.

v8.66.0

Compare Source

This was a version bump only for typescript-eslint to align it with other projects, there were no code changes.

See GitHub Releases for more information.

You can read about our versioning strategy and releases on our website.

v8.65.0

Compare Source

🚀 Features
  • add warning when TS 7 is detected (#​12529)
❤️ Thank You

See GitHub Releases for more information.

You can read about our versioning strategy and releases on our website.

v8.64.0

Compare Source

This was a version bump only for typescript-eslint to align it with other projects, there were no code changes.

See GitHub Releases for more information.

You can read about our versioning strategy and releases on our website.


Configuration

📅 Schedule: (in timezone Europe/Copenhagen)

  • Branch creation
    • "before 6am on monday"
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Mend Renovate.

This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@fission-ai/openspec](https://github.com/Fission-AI/OpenSpec) | [`1.6.0` → `1.9.0`](https://renovatebot.com/diffs/npm/@fission-ai%2fopenspec/1.6.0/1.9.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@fission-ai%2fopenspec/1.9.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@fission-ai%2fopenspec/1.6.0/1.9.0?slim=true) | | [@types/leaflet](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/leaflet) ([source](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/leaflet)) | [`1.9.21` → `1.9.22`](https://renovatebot.com/diffs/npm/@types%2fleaflet/1.9.21/1.9.22) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fleaflet/1.9.22?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fleaflet/1.9.21/1.9.22?slim=true) | | [eslint](https://eslint.org) ([source](https://github.com/eslint/eslint)) | [`10.7.0` → `10.8.1`](https://renovatebot.com/diffs/npm/eslint/10.7.0/10.8.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/eslint/10.8.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint/10.7.0/10.8.1?slim=true) | | [jsdom](https://github.com/jsdom/jsdom) | [`30.0.0` → `30.0.1`](https://renovatebot.com/diffs/npm/jsdom/30.0.0/30.0.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/jsdom/30.0.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/jsdom/30.0.0/30.0.1?slim=true) | | [prettier](https://prettier.io) ([source](https://github.com/prettier/prettier)) | [`3.9.5` → `3.9.6`](https://renovatebot.com/diffs/npm/prettier/3.9.5/3.9.6) | ![age](https://developer.mend.io/api/mc/badges/age/npm/prettier/3.9.6?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/prettier/3.9.5/3.9.6?slim=true) | | [react-i18next](https://github.com/i18next/react-i18next) | [`17.0.9` → `17.0.11`](https://renovatebot.com/diffs/npm/react-i18next/17.0.9/17.0.11) | ![age](https://developer.mend.io/api/mc/badges/age/npm/react-i18next/17.0.11?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/react-i18next/17.0.9/17.0.11?slim=true) | | [react-test-renderer](https://react.dev/) ([source](https://github.com/react/react/tree/HEAD/packages/react-test-renderer)) | [`19.2.7` → `19.2.8`](https://renovatebot.com/diffs/npm/react-test-renderer/19.2.7/19.2.8) | ![age](https://developer.mend.io/api/mc/badges/age/npm/react-test-renderer/19.2.8?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/react-test-renderer/19.2.7/19.2.8?slim=true) | | [turbo](https://turborepo.dev) ([source](https://github.com/vercel/turborepo)) | [`2.10.4` → `2.10.11`](https://renovatebot.com/diffs/npm/turbo/2.10.4/2.10.11) | ![age](https://developer.mend.io/api/mc/badges/age/npm/turbo/2.10.11?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/turbo/2.10.4/2.10.11?slim=true) | | [typescript-eslint](https://typescript-eslint.io/packages/typescript-eslint) ([source](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint)) | [`8.63.0` → `8.67.0`](https://renovatebot.com/diffs/npm/typescript-eslint/8.63.0/8.67.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/typescript-eslint/8.67.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/typescript-eslint/8.63.0/8.67.0?slim=true) | --- ### Release Notes <details> <summary>Fission-AI/OpenSpec (@&#8203;fission-ai/openspec)</summary> ### [`v1.9.0`](https://github.com/Fission-AI/OpenSpec/blob/HEAD/CHANGELOG.md#190) [Compare Source](https://github.com/Fission-AI/OpenSpec/compare/v1.8.0...v1.9.0) ##### Minor Changes - [#&#8203;1622](https://github.com/Fission-AI/OpenSpec/pull/1622) [`59c16a4`](https://github.com/Fission-AI/OpenSpec/commit/59c16a4461254ed984d1d5e29d00af1a5610035a) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - ### New Features - **Command Code command adapter** — Command Code is now a first-class, adapter-backed tool. `openspec init` generates OpenSpec commands under `.commandcode/commands/opsx-<id>.md` (invoked as `/opsx-<id>`) alongside the skills under `.commandcode/skills/`, matching Command Code's documented custom-slash-command surface. - [#&#8203;1613](https://github.com/Fission-AI/OpenSpec/pull/1613) [`42d7f67`](https://github.com/Fission-AI/OpenSpec/commit/42d7f673bc5f13378451267c8a9d0c23f63a2d1a) Thanks [@&#8203;Angelthebestone](https://github.com/Angelthebestone)! - ### New Features - **Command Code support** — `openspec init` now supports Command Code as an adapterless skills-only tool. It installs the OpenSpec skills under `.commandcode/skills/` and invokes them as `/openspec-*` commands, matching Command Code's native skill surface. - [#&#8203;1604](https://github.com/Fission-AI/OpenSpec/pull/1604) [`83be9d1`](https://github.com/Fission-AI/OpenSpec/commit/83be9d113e8310789c281f7c8a00ed4fad191dd5) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Add `openspec validate --archived`: an opt-in check that every change under `changes/archive/` has all of its `tasks.md` checkboxes ticked, exiting non-zero if any are unchecked. This surfaces changes that were archived with unfinished work — which the normal validate flow never catches, because it only looks at active changes — and is meant for a pre-commit or CI hook ([#&#8203;205](https://github.com/Fission-AI/OpenSpec/issues/205)). It is a standalone scope: it does not alter any existing `validate` invocation and does not re-validate already-applied spec deltas. ##### Patch Changes - [#&#8203;1530](https://github.com/Fission-AI/OpenSpec/pull/1530) [`bf5099e`](https://github.com/Fission-AI/OpenSpec/commit/bf5099e39fdb5d7bde2adc84f49ea93afd7463e9) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Apply workflow now tells agents to surface unexpected scope instead of hiding it. When a task needs work beyond what the spec describes, the `/opsx:apply` skill and command guidance direct the agent to pause and report the added scope rather than silently narrowing, deferring, or simplifying away specified behavior, and to mark a task complete only when its specified behavior is fully implemented. Fixes [#&#8203;1529](https://github.com/Fission-AI/OpenSpec/issues/1529). - [#&#8203;1603](https://github.com/Fission-AI/OpenSpec/pull/1603) [`9ae75c8`](https://github.com/Fission-AI/OpenSpec/commit/9ae75c86efe5d326ffa7ca5a3fd64b1f1e7728c2) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec archive` no longer writes terminal escape codes to a redirected or captured stdout. Its confirmation prompts and the no-argument change picker drew their live UI with ANSI cursor-move sequences even when stdout was not a terminal — noise in a redirected log, and in some non-interactive hosts an unbounded render loop that could grow the captured output until the disk filled. When stdout (or stdin) is not a terminal, archive now reads the confirmations as plain text, and a no-argument run asks you to pass a change name up front instead of drawing a menu. Piped answers (`printf 'y\n' | openspec archive …`) and `--yes` behave as before, and interactive terminals are unchanged. Fixes [#&#8203;1526](https://github.com/Fission-AI/OpenSpec/issues/1526). - [#&#8203;1528](https://github.com/Fission-AI/OpenSpec/pull/1528) [`9425897`](https://github.com/Fission-AI/OpenSpec/commit/942589741de35f1b8896b410d7ea70295bb137c0) Thanks [@&#8203;Marzx13](https://github.com/Marzx13)! - Canonicalize rebuilt specs to end with exactly one final LF. Previously a spec whose `## Requirements` section was last was rebuilt with a trailing blank line (`\n\n`), which failed Markdown whitespace checks after sync or archive. Internal spacing and content after the Requirements section are unchanged. - [#&#8203;1640](https://github.com/Fission-AI/OpenSpec/pull/1640) [`610b78f`](https://github.com/Fission-AI/OpenSpec/commit/610b78f6554e8aabfa294df53962428ff85c8b76) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Preserve the blank lines around a spec's `## Requirements` heading when syncing a delta. `openspec archive` rebuilt `openspec/specs/<capability>/spec.md` by joining its slices with a bare newline, so the blank lines that surround the heading were dropped and the resulting file failed Markdown whitespace checks. The rebuild now keeps that spacing intact. Fixes [#&#8203;1625](https://github.com/Fission-AI/OpenSpec/issues/1625). Thanks [@&#8203;jwang513](https://github.com/jwang513)! ([#&#8203;1637](https://github.com/Fission-AI/OpenSpec/pull/1637)) - [#&#8203;1640](https://github.com/Fission-AI/OpenSpec/pull/1640) [`610b78f`](https://github.com/Fission-AI/OpenSpec/commit/610b78f6554e8aabfa294df53962428ff85c8b76) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec validate --all` and `openspec list --json` no longer silently pass when run outside an OpenSpec project. From a directory with no root they used to resolve the current directory as an implicit root, exit 0, and report empty results — a false pass for CI and agents. Bulk validation (`--all`, `--changes`, `--specs`) and `list` now require an existing root (the `openspec/project.md` fallback for legacy projects is kept), while direct validation and other intentional implicit-root workflows are unchanged. Thanks [@&#8203;clay-good](https://github.com/clay-good)! ([#&#8203;1612](https://github.com/Fission-AI/OpenSpec/pull/1612)) - [#&#8203;1640](https://github.com/Fission-AI/OpenSpec/pull/1640) [`610b78f`](https://github.com/Fission-AI/OpenSpec/commit/610b78f6554e8aabfa294df53962428ff85c8b76) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Label the `update` workflow in the `openspec config` workflow picker. The checklist had friendly labels for 11 of the 12 workflows but was missing `update`, so that row — one of the six core workflows every user sees — fell back to its raw id with a placeholder description. The update-change template's stale "expanded-profile" wording is also reworded to "optional". Fixes [#&#8203;1627](https://github.com/Fission-AI/OpenSpec/issues/1627). Thanks [@&#8203;clay-good](https://github.com/clay-good)! ([#&#8203;1632](https://github.com/Fission-AI/OpenSpec/pull/1632)) - [#&#8203;1640](https://github.com/Fission-AI/OpenSpec/pull/1640) [`610b78f`](https://github.com/Fission-AI/OpenSpec/commit/610b78f6554e8aabfa294df53962428ff85c8b76) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec schema fork` now preserves the source schema's YAML formatting. Renaming a forked `schema.yaml` round-tripped through a parse/re-serialize step that dropped comments, could rewrite block-scalar style (a literal `|` folded to `>`), and reordered keys, so the fork no longer matched its source. The rename now edits the document in place via the YAML Document API, leaving comments, scalar style, and key order untouched. Thanks [@&#8203;clay-good](https://github.com/clay-good)! ([#&#8203;1607](https://github.com/Fission-AI/OpenSpec/pull/1607)) - [#&#8203;1640](https://github.com/Fission-AI/OpenSpec/pull/1640) [`610b78f`](https://github.com/Fission-AI/OpenSpec/commit/610b78f6554e8aabfa294df53962428ff85c8b76) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec schemas` now resolves through the canonical OpenSpec root-selection precedence instead of always reading from the current directory. It accepts `--store <id>`, rejects `--store-path` like the other store-aware commands, and returns the shared machine-readable diagnostics on JSON failures, while preserving the existing human output and bare JSON array on success. Thanks [@&#8203;Patodo](https://github.com/Patodo)! ([#&#8203;1616](https://github.com/Fission-AI/OpenSpec/pull/1616)) - [#&#8203;1640](https://github.com/Fission-AI/OpenSpec/pull/1640) [`610b78f`](https://github.com/Fission-AI/OpenSpec/commit/610b78f6554e8aabfa294df53962428ff85c8b76) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec validate` now warns on ambiguous task numbering in `spec-driven` changes: a task ID duplicated at full depth (including across resolved task files), or a task whose leading number disagrees with its enclosing `## N.` group. Numeric-looking text outside numbered groups is ignored, and custom schemas are unchanged until they opt in. The checks run across direct, bulk, and deprecated change validation. Closes [#&#8203;1520](https://github.com/Fission-AI/OpenSpec/issues/1520). Thanks [@&#8203;alectimison-maker](https://github.com/alectimison-maker)! ([#&#8203;1523](https://github.com/Fission-AI/OpenSpec/pull/1523)) - [#&#8203;1522](https://github.com/Fission-AI/OpenSpec/pull/1522) [`07dea6e`](https://github.com/Fission-AI/OpenSpec/commit/07dea6ed2faf71c8b9f4944d64246f2ff39eeffc) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - ### Bug Fixes - **Don't let a legacy Codex upgrade hijack the vendor-neutral `agents` target** — `openspec update` no longer overwrites an existing `.agents` skills tree (and its ownership marker) when Codex is detected only from leftover global `~/.codex/prompts`. Because Codex and the vendor-neutral `agents` target share `.agents/skills`, a project that used the `agents` target could have its generic skills silently rewritten with Codex-specific syntax and its target flipped to Codex on the next `update --force`. The legacy-upgrade path now respects the established owner of a shared skills directory, matching the one-writer rule `openspec init` already applies. When an upgrade is skipped this way, that tool's repo-local legacy files (e.g. `.codex/prompts/openspec-*.md`) are also preserved rather than cleaned up, since no replacement was written to take their place. A genuine first-time Codex upgrade (no `.agents` tree yet) is unaffected. - [#&#8203;1521](https://github.com/Fission-AI/OpenSpec/pull/1521) [`c751b3d`](https://github.com/Fission-AI/OpenSpec/commit/c751b3da52a7f06d6662a8673feff4685566cdd4) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - ### Bug Fixes - **Stop silently dropping unlabeled scenarios on archive** — `openspec validate` and `openspec archive` now recognize every level-4 (`####` followed by whitespace) child of a requirement as a scenario, matching how the spec is counted elsewhere. Before, the scenario-loss guard only recognized headers written exactly as `#### Scenario:`, so a `MODIFIED` requirement that dropped a differently-labeled child (for example `#### Edge case`) passed validation and was then permanently deleted by archive with no warning. Both paths now agree, so the loss is caught at authoring time. Scenario names are normalized when comparing (an optional `Scenario:` prefix and a CommonMark closing `#` run are ignored), so simply relabeling a scenario is not mistaken for dropping one. - [#&#8203;1610](https://github.com/Fission-AI/OpenSpec/pull/1610) [`17581c1`](https://github.com/Fission-AI/OpenSpec/commit/17581c11edf6b27ef18be7be1e4dcc06c81a3fff) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - ### Bug Fixes - `openspec init` now suggests an IDE restart only when an IDE-resident tool such as Cursor, GitHub Copilot, Continue, or Cline was configured. CLI tools like Claude Code, Codex, and Gemini CLI no longer show the hint, since their commands work as soon as the files exist. - [#&#8203;1609](https://github.com/Fission-AI/OpenSpec/pull/1609) [`804427b`](https://github.com/Fission-AI/OpenSpec/commit/804427b6ff3f3b35b542365ba8b32e183fce3287) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Suppress the first-run telemetry disclosure notice when `--json` is used. On a first-ever run the notice was written to stdout and could break `--json` consumers; it is now deferred to the first later non-JSON run, keeping `--json` output valid while still guaranteeing the disclosure. ### [`v1.8.0`](https://github.com/Fission-AI/OpenSpec/blob/HEAD/CHANGELOG.md#180) [Compare Source](https://github.com/Fission-AI/OpenSpec/compare/v1.7.0...v1.8.0) ##### Minor Changes - [#&#8203;1303](https://github.com/Fission-AI/OpenSpec/pull/1303) [`1aa0f2a`](https://github.com/Fission-AI/OpenSpec/commit/1aa0f2abfc19f2487f5b8566e6eb3bf15f41c20a) Thanks [@&#8203;solanab](https://github.com/solanab)! - Add the vendor-neutral `agents` target: `openspec init --tools agents` installs the workflow skills to `.agents/skills/openspec-*/SKILL.md`, the shared location AGENTS.md-compatible assistants read. It is skills-only, so no slash commands are generated. Because `agents` is now a real target, `--tools all` includes it and creates `.agents/skills/` where it previously did not. - [#&#8203;1274](https://github.com/Fission-AI/OpenSpec/pull/1274) [`7a4a745`](https://github.com/Fission-AI/OpenSpec/commit/7a4a745d803b698c34947eda6d73b5a24aebb58c) Thanks [@&#8203;NicoAvanzDev](https://github.com/NicoAvanzDev)! - Generate GitHub Copilot coding agent setup and custom agent files during `openspec init` and keep them synchronized during `openspec update`. - [#&#8203;1214](https://github.com/Fission-AI/OpenSpec/pull/1214) [`161f945`](https://github.com/Fission-AI/OpenSpec/commit/161f9454a372aab67c495d780928bba89c829f3e) Thanks [@&#8203;showms](https://github.com/showms)! - Add MiniMax Code as a global skills-only tool target. - [#&#8203;1518](https://github.com/Fission-AI/OpenSpec/pull/1518) [`568e56c`](https://github.com/Fission-AI/OpenSpec/commit/568e56c67231dbe2447aca4f0e7995c05ada95a3) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - ### New Features - **Atlassian Rovo Dev CLI** — `openspec init --tools rovodev` installs the OpenSpec workflow skills for Atlassian's Rovo Dev CLI. It is skills-only (no slash commands), written to `.rovodev`. ##### Bug Fixes - **Codex skills now live in the shared `.agents` directory** — `openspec init` and `openspec update` install Codex skills under `.agents/skills/` (the canonical location assistants read) and migrate an existing `.codex` skills directory in place. Files you customized are preserved, not overwritten. - **`openspec status` separates planning from implementation** — status now reports `isPlanningComplete` (every non-skipped planning artifact exists; skipped artifacts count as satisfied without being written) distinctly from overall progress, and its messages no longer imply a change is finished before it has been implemented. `isComplete` is kept as a compatibility alias, so existing scripts keep working. - [#&#8203;1517](https://github.com/Fission-AI/OpenSpec/pull/1517) [`73207a6`](https://github.com/Fission-AI/OpenSpec/commit/73207a6f2cd235729ac3fe3cb1e44152b8f63f12) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Make GitHub Copilot cloud coding-agent files opt-in. Selecting the `github-copilot` tool no longer silently writes a GitHub Actions workflow into `.github/`; `openspec init` now asks first (default No) and remembers the choice in `openspec/config.yaml` (`githubCopilot.cloudAgent`). Use `--copilot-cloud` / `--no-copilot-cloud` to decide non-interactively. - `openspec update` never prompts — it only refreshes cloud files for projects that opted in (or that already have generated cloud files, so existing setups keep working). - Opting out (`--no-copilot-cloud` or `cloudAgent: false`) removes OpenSpec-managed cloud files; a user-customized file is always preserved, never overwritten or deleted. - `init` and `update` now report whether cloud files were written, skipped, or left untouched — and if you already have your own `copilot-setup-steps.yml`, they say it was preserved and that you need to add the OpenSpec install step by hand. - [#&#8203;1484](https://github.com/Fission-AI/OpenSpec/pull/1484) [`521ee33`](https://github.com/Fission-AI/OpenSpec/commit/521ee33e6ece269241b45e08017ee60f13fdef08) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Retire a capability when a change removes its last requirement. A change that declares `retire_capabilities: true` in its `.openspec.yaml` (alongside the `schema:` that file requires) may now be archived even when its REMOVED entries take a capability's last requirement: `openspec archive` deletes that capability's main spec instead of aborting with "Spec must have at least one requirement". Without the marker nothing changes — the archive aborts exactly as before, except the message now names the marker as the way out. Retirement happens only when the emptied spec could not have been written at all, every one is named in the archive output, a pasteable `git checkout` is included when the spec lived in the caller's checkout, and `--no-validate` never retires. Archive now also rejects a main spec with duplicate canonical requirement names instead of letting delta reconciliation collapse one of the duplicate blocks. One thing to know before retiring: a capability's spec is the base another change's MODIFIED block is checked against, so an in-flight change that modifies the capability you just retired will keep validating clean and then refuse to archive ("target spec does not exist; only ADDED requirements are allowed for new specs") — close or rework that change alongside the retirement. ##### Patch Changes - [#&#8203;1502](https://github.com/Fission-AI/OpenSpec/pull/1502) [`ece8660`](https://github.com/Fission-AI/OpenSpec/commit/ece8660d44bd19b86440376327752cda3d7b0717) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec validate` now treats the English `SHALL`/`MUST` convention as guidance in normal mode, so requirements written in other languages can validate. Strict mode continues to enforce the convention. - [#&#8203;1483](https://github.com/Fission-AI/OpenSpec/pull/1483) [`2b3d368`](https://github.com/Fission-AI/OpenSpec/commit/2b3d368539132be6311e55db58899abbf5306b81) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Tell the caller which flag to pass when `openspec archive` cannot ask its confirmation questions. An AI agent (or any script) runs the CLI with stdin closed, so every prompt rejects with `@inquirer`'s `User force closed the prompt with 0 null` — the archive aborted with an error that named neither the question nor the flag, and agents burned a turn guessing ([#&#8203;1479](https://github.com/Fission-AI/OpenSpec/issues/1479)). Each confirmation now reports what it needed and a pasteable rerun that carries the flags you already passed: `openspec archive <name> --skip-specs --yes` stays a `--skip-specs` run, so following the suggestion cannot merge specs you opted out of merging, and a change name that needs quoting gets double quotes, the one form bash, zsh, PowerShell and cmd.exe all read the same way (a name no shell reads literally even quoted — one containing `$`, a backtick, or the `%`/`!` that cmd.exe still expands inside quotes — is left as a `<change-name>` placeholder rather than a command that would target something else). `openspec archive` with no change name used to swallow the same failure, print `No change selected. Aborting.` and exit 0 — success for a run that archived nothing; it now exits 1 asking for a change name, matching how `openspec show` and `openspec validate` already behave without a terminal. The check is reactive — it inspects a prompt that already failed — so answers piped into the command, `--yes`, `--json`, and Ctrl-C all behave exactly as before, and a run that OpenSpec already considers non-interactive (`CI`, `OPEN_SPEC_INTERACTIVE=0`, `--no-interactive`) gets the guidance even when the runner allocated a pty. The onboarding walkthrough, the only generated guidance that tells an agent to run `openspec archive`, now shows `--yes`. - [#&#8203;1486](https://github.com/Fission-AI/OpenSpec/pull/1486) [`427abf4`](https://github.com/Fission-AI/OpenSpec/commit/427abf40ac45a9a44f78eb74c81f53f9f4197ccf) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Task progress now counts indented sub-tasks. A `tasks.md` whose sub-tasks were unfinished reported `✓ Complete` in `openspec list` and `openspec view`, was missing those tasks from the `openspec instructions apply` list, and archived with no incomplete-task warning, because both checkbox parsers only matched checkboxes at column 0. Progress counting and the apply task list now share one parser, so `list`, `view`, `archive` and `apply` agree about which lines of a tasks file are tasks. A checkbox with no text after it is left out of the apply list, which has nothing to act on, but still counts toward every progress number; a file of nothing but such checkboxes now asks to be rewritten rather than reporting itself done. The shared pattern matches every line the two it replaced matched, and more, so task counts can rise but never fall: no change starts reporting less work than before, and archive's incomplete-task warning can only become stricter. Checkboxes are still counted wherever they appear, including inside a code fence, an HTML comment or an indented block, so a `tasks.md` that shows a checklist as a format example can now count that example as work — remove it from the file, or pass `--yes` to archive. - [#&#8203;1500](https://github.com/Fission-AI/OpenSpec/pull/1500) [`26bd1d4`](https://github.com/Fission-AI/OpenSpec/commit/26bd1d4e5c6c6ba75bd7d6136424019b2bf89ced) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Keep generated workflows on the selected store, handle optional workflow fallbacks safely, and validate synced specs before reporting success. - [#&#8203;1490](https://github.com/Fission-AI/OpenSpec/pull/1490) [`45cca5d`](https://github.com/Fission-AI/OpenSpec/commit/45cca5db6137ed209117cc70510eb3e057fb981b) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Say before confirmation when archiving a change will delete a note written next to a requirement. A requirement absorbs anything below it that OpenSpec doesn't recognize as a new heading — a note indented by the one to three spaces Markdown allows, for example — so removing or modifying that requirement took the note with it, silently. `openspec archive` now names content the rebuilt spec would actually drop and where to move it to keep it. The merge itself is unchanged: nothing is relocated, because a `#` line inside a scenario looks identical to a note and moving one of those would rewrite the spec wrongly. - [#&#8203;1492](https://github.com/Fission-AI/OpenSpec/pull/1492) [`690a27e`](https://github.com/Fission-AI/OpenSpec/commit/690a27e649c4a3325daeb0f6667ebe0f82792179) Thanks [@&#8203;mc856](https://github.com/mc856)! - `openspec init` and `openspec update` no longer delete the CoStrict and Junie command files they just generated. Legacy cleanup removes artifacts older OpenSpec versions left behind, and two of its patterns named paths the current adapters still write to. CoStrict's was a whole-directory removal of `.cospec/openspec/commands/`, the folder the adapter writes `opsx-<id>.md` into, so every run wiped the directory — including any file the user kept there — while the banner above it read `No user content to preserve`. Junie's `.junie/commands/opsx-*.md` listed its own current output. Cleanup runs before the config migration, so on a config that has no `profile` key yet the missing command files make delivery detection read the project as skills-only and persist that to the global config: the files are not regenerated, and the preference changes for every other project too. CoStrict is now a file pattern, `.cospec/openspec/commands/openspec-*.md`, matching the three commands the pre-`opsx` CoStrict integration wrote there (`openspec-proposal.md`, `openspec-apply.md`, `openspec-archive.md`) and the same shape every other file-based tool already uses. Junie's entry is removed outright: Junie support arrived after the slash configurators that wrote `openspec-*` files were deleted, so no OpenSpec version ever created those files there. Genuinely legacy files are still detected and removed, and no other tool's patterns change — they never overlapped their adapter's current output. - [#&#8203;1501](https://github.com/Fission-AI/OpenSpec/pull/1501) [`0b20ae3`](https://github.com/Fission-AI/OpenSpec/commit/0b20ae3964283bdcb4e34ea7380770857f6a339c) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Keep the propose workflow focused on planning, clarify material ambiguities before creating a change, and hand implementation off to the apply workflow. - [#&#8203;1503](https://github.com/Fission-AI/OpenSpec/pull/1503) [`8a3850d`](https://github.com/Fission-AI/OpenSpec/commit/8a3850da735e241c14ad94935463f879b33f21a9) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - When exploration turns into a new change, generated explore guidance now instructs agents to run `openspec new change` before writing requested artifacts. This preserves the required `.openspec.yaml` metadata instead of letting an agent create an incomplete change directory by hand. After the user accepts a capture, explore also creates the requested artifacts without requiring another workflow command. - [#&#8203;1513](https://github.com/Fission-AI/OpenSpec/pull/1513) [`622c509`](https://github.com/Fission-AI/OpenSpec/commit/622c509a1349c3ad9c52cd1a4ee007bd47549204) Thanks [@&#8203;FasterPHP](https://github.com/FasterPHP)! - Honor `telemetry.enabled` in global config. `false` disables anonymous telemetry and `openspec update` version checks; unset keeps telemetry enabled, and env/CI opt-outs still take precedence. - [#&#8203;1499](https://github.com/Fission-AI/OpenSpec/pull/1499) [`9cd845f`](https://github.com/Fission-AI/OpenSpec/commit/9cd845fc459b71486d9f2424c2e1f38e2ca8766e) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Keep generated files, specs, archive moves, and local state inside their intended security boundaries without breaking linked monorepo workflows. - [#&#8203;1482](https://github.com/Fission-AI/OpenSpec/pull/1482) [`84ebc57`](https://github.com/Fission-AI/OpenSpec/commit/84ebc57cb3f0e91b93484484092fdc2f9fcf39e6) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec validate <change>` now reports a MODIFIED requirement that omits a scenario the main spec still has — the same loss archive already refuses to apply — so the change fails at authoring time instead of at archive time. A change carrying a stale MODIFIED block will start failing validation; it was already unarchivable, and the message names the scenarios to copy back in. ### [`v1.7.0`](https://github.com/Fission-AI/OpenSpec/blob/HEAD/CHANGELOG.md#170) [Compare Source](https://github.com/Fission-AI/OpenSpec/compare/v1.6.0...v1.7.0) ##### Minor Changes - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Add CodeArts Agent skills support: `openspec init --tools codeartsagent` installs the workflow skills. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Add Hermes Agent as a supported AI tool: `openspec init --tools hermes` installs the workflow skills (Hermes is skills-only and invokes them directly). - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Add ZCode as a supported AI tool: `openspec init --tools zcode` generates its skills and `/opsx:*` commands. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Codex is now skills-only: workflows install as `$openspec-*` skills and previously managed custom prompts are retired (existing ones are cleaned up on update). - [#&#8203;1062](https://github.com/Fission-AI/OpenSpec/pull/1062) [`eac2973`](https://github.com/Fission-AI/OpenSpec/commit/eac2973819037727b10214f70db2f54d82f2d891) Thanks [@&#8203;showms](https://github.com/showms)! - Add current project context and per-operation guidance to apply and archive workflows. Projects can configure `operations.apply.guidance` and `operations.archive.guidance`; `openspec instructions apply` returns apply inputs, and the new read-only `openspec instructions archive` surface returns archive inputs for the selected root. Archive, bulk archive, and sync skills now load current archive inputs and `specs` artifact rules at execution time, fail before writes or moves when required instruction lookups fail, and reuse specs-rule snapshots during inline sync. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Publish the workflow skills as static `skills/<name>/SKILL.md` files so `npx skills add Fission-AI/OpenSpec` works. - [#&#8203;1399](https://github.com/Fission-AI/OpenSpec/pull/1399) [`27b22ab`](https://github.com/Fission-AI/OpenSpec/commit/27b22ab4cbf530fa00e17f0f6b75a44d56777542) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Add `skip_specs: true` change metadata for work with no spec-level behavior change (pure refactors, tooling, docs). `openspec validate` accepts a zero-delta change that declares the marker (honored only when the metadata parses under the shared change-metadata schema and names a schema that loads) and errors when the marker and delta specs are both present, the artifact graph no longer blocks `tasks` on spec files for such changes, `openspec status` renders the specs stage as explicitly skipped, and the propose/specs guidance points to the marker instead of contradicting the validator. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Resolve symlinked schema directories so schemas shared via symlink (e.g. from a dotfiles repo) are discovered. - [#&#8203;1470](https://github.com/Fission-AI/OpenSpec/pull/1470) [`6295515`](https://github.com/Fission-AI/OpenSpec/commit/6295515d4da4f7c76eaed00b7f1926771eae92de) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec update` now offers to upgrade the CLI when yours is behind the published one. Instruction files are generated by the installed CLI, so a stale install reported `✓ All 1 tool(s) up to date (v1.6.0)` while the workflows added in newer releases were never written: ```text A newer OpenSpec CLI is available (v1.6.0 → v1.7.0). Running from: /usr/local/lib/node_modules/@&#8203;fission-ai/openspec ? Upgrade to v1.7.0 now? (Y/n) ``` Say yes and it upgrades, confirms the new version is the one that answers, then re-runs the update so the new workflows arrive in the same command. Say no and it prints the command matching how you installed OpenSpec, and updates with what you have. Nothing happens to your machine that you did not agree to: the offer appears only in an interactive terminal and only where `npm install -g` would help, and the check is skipped in CI or when `OPENSPEC_NO_UPDATE_CHECK`, `DO_NOT_TRACK=1`, or `OPENSPEC_TELEMETRY=0` is set. See [CLI reference → `openspec update`](https://github.com/Fission-AI/OpenSpec/blob/main/docs/cli.md#openspec-update) for the per-install-method behavior and every opt-out. ##### Patch Changes - [#&#8203;1404](https://github.com/Fission-AI/OpenSpec/pull/1404) [`a84ae70`](https://github.com/Fission-AI/OpenSpec/commit/a84ae70e8c6ef6ffaab56599d6f91fa39873e63d) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Generated skills for tools without a command adapter (Kimi Code, Mistral Vibe, Hermes, ForgeCode, CodeArts) no longer reference `/opsx:*` commands that were never generated: skill cross-references, the init getting-started hint, and the profile-migration message now use each tool's documented skill invocation (Kimi Code: `/skill:openspec-*`; others: `/openspec-*`), and Codex — skills-invocable with no slash surface — gets a syntax-neutral hint that names the skill. Selections that mix invocation syntaxes print one labeled hint per distinct form, so every advertised instruction is usable by the tool it names. When `delivery: commands` would generate nothing for a selected tool, init prints a configuration correction naming that tool, even when other tools did get commands or skills. The committed skills.sh distribution is regenerated with skill references (default `/openspec-*` form, as that channel installs skills only). - [#&#8203;1363](https://github.com/Fission-AI/OpenSpec/pull/1363) [`5199f41`](https://github.com/Fission-AI/OpenSpec/commit/5199f41a5d523b9212dd2854ec5e505d2f80e2e7) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - ### Features - **One default store for every repo on your machine** — `openspec config set defaultStore <id>` sets a machine-level fallback root: any command run outside a planning root, with no `--store` flag and no project `store:` pointer, resolves to that store. It sits at the bottom of the precedence list, so `--store`, a local root, and a project pointer all still win. The root banner and JSON `root` block report the distinct provenance `source: "global_default"`, so users and tooling can tell a machine-wide default from a repo's own pointer. A stale id degrades to the underlying store error with a fix that names `openspec config unset defaultStore`. - [#&#8203;1435](https://github.com/Fission-AI/OpenSpec/pull/1435) [`6a5171e`](https://github.com/Fission-AI/OpenSpec/commit/6a5171e18630db4ed8e78c9edfaae4be532e2af6) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec new change` now accepts numeric-prefixed names like `100-add-feature` or `00001-add-auth`, useful for ordering or tiering changes. Change names now use the same kebab-case grammar as store ids and change metadata (a leading digit is allowed); `archive` already treated date-prefixed names as a supported convention. Uppercase, spaces, underscores, and leading/trailing or consecutive hyphens are still rejected, and every previously valid name stays valid. - [#&#8203;1425](https://github.com/Fission-AI/OpenSpec/pull/1425) [`040a869`](https://github.com/Fission-AI/OpenSpec/commit/040a86931f5398167137a483b2e8081aec13016e) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Compare config key guards literally instead of through a helper. `setNestedValue` and `deleteNestedValue` rejected prototype-reaching key segments through a helper that did a `Set` lookup. That is correct, but static analysis could not follow it, so CodeQL kept reporting prototype-pollution on the very assignments the guard protects. The segments are now compared literally in the same function, still checked across the whole path before anything is written. Behavior is unchanged for every input, verified against the previous implementation across 400,000 generated cases. - [#&#8203;1431](https://github.com/Fission-AI/OpenSpec/pull/1431) [`6a4f0d7`](https://github.com/Fission-AI/OpenSpec/commit/6a4f0d7f3384486132cb9c516b635c23cadc1fa2) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - A delta spec that introduces a brand-new capability can now open with a `## Purpose`, and `openspec archive` uses it as the Purpose of the main spec it creates instead of writing the `TBD - created by archiving change <name>. Update Purpose after archive.` placeholder over it. The `specs` artifact instruction, its example, the delta template and the `openspec-sync-specs` skill all tell authors and agents to write one, so the CLI and agent-driven sync paths produce the same main spec. Archive keeps the placeholder when the delta has no usable `## Purpose`: - no `## Purpose` header outside a code fence or HTML comment, or a body that is only a code fence or only a comment - a body that would leave a spec its own parser cannot read — a heading or requirement header that truncates a section, an unterminated fence, or any HTML comment - in the second case archive also says why, and still completes rather than aborting A carried Purpose under 50 characters is kept but warned about, since `openspec validate --strict` reports it as too brief. The Purpose of an existing main spec is never touched; archive warns when it ignores a delta's Purpose there. - [#&#8203;1437](https://github.com/Fission-AI/OpenSpec/pull/1437) [`19d4171`](https://github.com/Fission-AI/OpenSpec/commit/19d41714c8b790488732687443713e406ef5aeef) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec archive` no longer aborts when a REMOVED delta's requirement is already gone from the main spec (the early-sync pattern the sync skill teaches): it warns, treats the removal as already applied, and reports applied-only totals. In `--json` mode those warnings are carried in a new optional `warnings` array on the archive result. When every operation for a spec was already synced, archive skips rewriting that file instead of churning normalization differences into it. A delta that both RENAMEs and REMOVEs the same requirement is now rejected explicitly, by both `validate` and `archive` — the two spellings are compared case- and whitespace-insensitively — and a REMOVED header that differs only in case or whitespace from an existing requirement still aborts (that is a typo, not an early sync). Also fixed: the archive delta gate matches section headers case-insensitively like the parser; symlinked `specs/<capability>/spec.md` files are discovered instead of silently dropped; `openspec show <change>` no longer prints a spurious "scenarios" flag warning; files generated for qwen and bob reference commands by their real hyphenated names (`/opsx-<id>`), and init's getting-started hint follows suit; apply/update/onboard guidance names the CLI fallback for profiles that don't install `/opsx:continue` or `/opsx:new`. - [#&#8203;1411](https://github.com/Fission-AI/OpenSpec/pull/1411) [`c439a4e`](https://github.com/Fission-AI/OpenSpec/commit/c439a4ee48ef02dcdae6ac8101b7d12924695e7e) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Fix phantom requirements parsed from delta specs, which made `openspec archive` warn about problems `openspec validate` never reported. A header inside a delta section that is not a `### Requirement:` header — a divider such as `### Documentation Requirements` — was read as a requirement with no scenario. `openspec archive` warned that it was missing a scenario, and `openspec show <change> --json` and `openspec change list` counted it as an extra delta. The change parser now ignores those headers, matching the delta reader, so the phantom is gone from the warnings and from the JSON. Main spec parsing is unchanged. `openspec archive` also no longer repeats requirement-level issues from the delta specs in its non-blocking "Proposal warnings in proposal.md" block. Each defect was printed twice there, and a `## REMOVED Requirements` entry — names-only by design — was reported as missing a scenario on every correct removal. Delta spec validation still reports and blocks on genuine defects, and proposal-level warnings are unchanged. - [#&#8203;1394](https://github.com/Fission-AI/OpenSpec/pull/1394) [`b474f81`](https://github.com/Fission-AI/OpenSpec/commit/b474f81cb4bebbeff0e447fd78c34a613ebd02fa) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - ### Bug Fixes - **Archive no longer races the spec sync, or reports a sync that never landed** — the generated `openspec-archive-change` skill (and the matching `opsx:archive` command) handed the spec sync to a background task and then moved the change folder immediately. The archive could move the delta specs out from under the running sync: the change ended up archived, `openspec/specs/` was never updated, and the summary still reported `Specs: ✓ Synced`. The sync now runs inline, and the archive only proceeds once every capability with a delta spec has been checked against it — ADDED present, MODIFIED changes applied, REMOVED gone, RENAMED under the new name and not the old. If the sync fails or a capability doesn't match, the archive stops and reports what differs instead of claiming success; nothing has moved, so you can fix it and retry. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Apply profile changes with the installed CLI instead of shelling out to `npx`, which could run a different version. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Delta and main-spec parsers strip a UTF-8 BOM, so files saved by Windows editors or PowerShell redirects no longer fail with "No delta sections found". - [#&#8203;1398](https://github.com/Fission-AI/OpenSpec/pull/1398) [`97d441a`](https://github.com/Fission-AI/OpenSpec/commit/97d441a8ee2738d3008709e61acfc91925c7ae3a) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - ### Bug Fixes - **Bulk archive now stops when you pick "Cancel"** — the generated `openspec-bulk-archive-change` skill (and the matching `opsx:bulk-archive` command) offered a "Cancel" option at the confirmation prompt but never told the agent what to do with it, so the next step archived every selected change anyway. The prompt now routes each answer by intent: "Cancel" stops without archiving anything, the archive options proceed (the ready-only option archives just the changes the status table marks `Ready` or `Ready*`), and any other answer re-asks instead of archiving. The single-change archive skill already routes Cancel this way; this brings the bulk variant in line. - [#&#8203;1375](https://github.com/Fission-AI/OpenSpec/pull/1375) [`52a8bce`](https://github.com/Fission-AI/OpenSpec/commit/52a8bce1fd2bc98c51fa35cf0cfa05e799eb4404) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `--change` now accepts any change name that exists on disk (e.g. date-prefixed names like `2026-07-04-voice-copilot-v1`), matching what `list`, `validate`, and `archive` already resolve. Lookup still rejects unsafe names (path separators, `..`, hidden entries); the kebab-case naming rule still applies when creating a change. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec new change` rejects names over 200 characters with a validation message instead of surfacing a raw ENAMETOOLONG filesystem error. - [#&#8203;1447](https://github.com/Fission-AI/OpenSpec/pull/1447) [`fb19699`](https://github.com/Fission-AI/OpenSpec/commit/fb196995dad017074415a638824eb546f3321cbc) Thanks [@&#8203;hsusul](https://github.com/hsusul)! - Generated tool command files now carry valid YAML frontmatter for every supported tool. Command names ship as `OPSX: Explore`, and the unquoted `name: OPSX: Explore` that adapters emitted is not parseable YAML — strict parsers rejected the whole file, so the command failed to load. Several adapters also re-implemented their own escaping, and a few interpolated descriptions in raw. Escaping now lives in one place (`escapeYamlValue` / `formatTagsArray`) and every adapter uses it. String frontmatter values are always double-quoted, which also keeps values like `true`, `null` and `123` from round-tripping as booleans, nulls and numbers. Non-string fields such as `allowed-tools` and `invokable` are unchanged. Expect the first `openspec update` after upgrading to rewrite the frontmatter lines of your generated command files. Archive workflow guidance also gets two corrections: bulk archive now carries its per-delta include/exclude decisions into execution, so a delta whose implementation was not found is reported as `sync skipped` instead of being synced anyway, and both archive workflows verify the main specs before moving the change directory. - [#&#8203;1471](https://github.com/Fission-AI/OpenSpec/pull/1471) [`9a937cb`](https://github.com/Fission-AI/OpenSpec/commit/9a937cb9b36fb1040bdbde3bab3fa3903944ef10) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Reference slash commands by the name each tool actually registers. Command bodies, generated `SKILL.md` cross-references, and the `init`/`update`/migration hints all advertised `/opsx:<id>`, but only 7 of the 28 tools with a command adapter register that name — the ones whose files sit in an `opsx/` directory. The other 21 write `.../opsx-<id>.md`, where the filename is the command, so tools such as Cursor, GitHub Copilot, Windsurf and Kilo Code were told to type a command their palette never had; a single generated Cursor file named itself `/opsx-apply` in frontmatter and then told the reader to run `/opsx:apply`. The command *name* is now derived from the command file each adapter writes rather than a hand-maintained tool list, so a newly added adapter cannot drift, and the *wrapper* around it is adapter metadata: Amazon Q loads its files into a prompt library invoked with `@`, so it now gets `@opsx-<id>` in command bodies, skills, and the onboarding hint instead of a slash command it never registers. Codex, which generates no command files at all, now gets `$openspec-<skill>` — the syntax its CLI actually accepts — everywhere it previously advertised `/opsx:*`, superseding the syntax-neutral hint described in the pending `adapterless-skill-references` note. Command filenames and paths are unchanged, and Claude Code output is byte-identical. - [#&#8203;1364](https://github.com/Fission-AI/OpenSpec/pull/1364) [`f58b445`](https://github.com/Fission-AI/OpenSpec/commit/f58b4456925b6331f3e5902a1c57905afe7edbf5) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Fix `openspec completion install` detecting the wrong shell for fish (and other) users whose interactive shell differs from their login shell. Detection now consults the parent process before falling back to `$SHELL`, so running the command from fish installs fish completions instead of defaulting to bash. - [#&#8203;1377](https://github.com/Fission-AI/OpenSpec/pull/1377) [`285dfd7`](https://github.com/Fission-AI/OpenSpec/commit/285dfd7d764752b2a1e7e8cc843d613421e62652) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - ### Bug Fixes - Config `rules:` keys are no longer reported as `Unknown artifact ID` when they belong to a different schema. The global rules map is now validated against the union of artifact IDs across every available schema, so multi-schema projects stop seeing spurious warnings on every command ([#&#8203;1322](https://github.com/Fission-AI/OpenSpec/issues/1322)). - [#&#8203;1401](https://github.com/Fission-AI/OpenSpec/pull/1401) [`b33b15d`](https://github.com/Fission-AI/OpenSpec/commit/b33b15d98ae929624c991632c7382ebc234d4ca7) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Stop `design.md` from restating the proposal. In the default `spec-driven` schema, the design instruction asked for "Background, current state, constraints, stakeholders" and "What this design achieves and excludes" without saying that motivation and scope already live in `proposal.md`, so agents restated the proposal's Why and What Changes instead of adding the design's own value - approach, alternatives, and trade-offs. The instruction and the design template now state the boundary explicitly (the proposal covers why and what, design covers how) and tell the agent to reference those documents rather than repeat them ([#&#8203;1382](https://github.com/Fission-AI/OpenSpec/issues/1382)). - [#&#8203;1167](https://github.com/Fission-AI/OpenSpec/pull/1167) [`1637856`](https://github.com/Fission-AI/OpenSpec/commit/1637856c423f2e84457652d1ab58885fe9744fb2) Thanks [@&#8203;mehdishahdoost](https://github.com/mehdishahdoost)! - **Windsurf is now Devin Desktop.** Windsurf was rebranded on June 2, 2026 and its config directory moved: `.devin/` is the preferred read + write location, `.windsurf/` a legacy read-only fallback that the Devin Local agent does not read at all. OpenSpec follows the rename rather than carrying two ids for one product — the tool id is `devin`, writing `.devin/workflows/opsx-<id>.md` and `.devin/skills/openspec-*/SKILL.md`, and it is detected from either directory. - `--tools windsurf` still resolves, so existing setup scripts keep working; it now configures `.devin/`. - If your OpenSpec files are still in `.windsurf/`, `openspec update` explains the rebrand and offers to move them. `--force` and non-interactive runs take the move; declining leaves every file exactly where it is. Only the files OpenSpec generates move — each skill's `SKILL.md` and commands named `opsx-*`. A hand-written Cascade workflow, a reference file you keep beside a `SKILL.md`, a command file you edited, and `.devin/rules/` all stay exactly where they are. - Devin skills and the getting-started hint reference `/openspec-*` skills rather than `/opsx-*` workflows, because only Devin Desktop reads workflows; the `/openspec-*` form works on both agents. Workflow bodies still use `/opsx-<id>`, the name Devin registers for a workflow file. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec doctor` now notes when a store checkout is behind its upstream ref. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Make the archive scenario-drift check multiplicity-aware: a MODIFIED block that keeps only one of two same-named scenarios no longer silently drops the other. - [#&#8203;1408](https://github.com/Fission-AI/OpenSpec/pull/1408) [`378d468`](https://github.com/Fission-AI/OpenSpec/commit/378d468ad348dc1e973ed30c5cfa458fb77c9de3) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Explore now reads the project's context and rules from `openspec/config.yaml` (or `config.yml`) at the start of a session, so it reasons with the same tech stack and conventions the artifact-creating workflows already receive. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec feedback` shows the formatted text and a pre-filled submission URL on any gh failure (issues disabled, network, rate limit), not only when gh is missing or unauthenticated. - [#&#8203;1396](https://github.com/Fission-AI/OpenSpec/pull/1396) [`60f720c`](https://github.com/Fission-AI/OpenSpec/commit/60f720c43acd94de7645ac8629c614ede4682b6a) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Fix `openspec feedback` failing when the repository does not define the `feedback` label. The command now retries without the label and notes that it was not applied, instead of exiting with an error and discarding the feedback. - [#&#8203;1151](https://github.com/Fission-AI/OpenSpec/pull/1151) [`18cbf5d`](https://github.com/Fission-AI/OpenSpec/commit/18cbf5d32ffe1bff4fff692e24568c605cf1e0fa) Thanks [@&#8203;javigomez](https://github.com/javigomez)! - ### Fixed - Ignore Markdown structure (requirement headers, delta sections, scenarios, REMOVED/RENAMED entries) that appears inside fenced code blocks when parsing delta specs. Previously a fenced `### Requirement:` example was parsed as a real (phantom) requirement, producing spurious `validate` errors and risking incorrect `archive` output. Fenced-code detection is now shared across the Markdown parsers so `validate` and `archive` behave consistently. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - The archive scenario-drift check now ignores `#### Scenario:` lines inside fenced code blocks, matching validate: a fenced example no longer false-aborts an archive, and a fenced name no longer masks a genuinely dropped scenario. - [#&#8203;1316](https://github.com/Fission-AI/OpenSpec/pull/1316) [`9b70481`](https://github.com/Fission-AI/OpenSpec/commit/9b70481df727ab9f7a00dd0118e4e09373a36fb9) Thanks [@&#8203;mc856](https://github.com/mc856)! - ### Bug Fixes - **`archive` no longer stacks a second date prefix** — archiving a change whose name already starts with a `YYYY-MM-DD-` prefix (a common authoring convention) keeps the name as-is instead of prepending today's date. Previously `openspec archive 2026-07-04-voice-copilot-v1 --yes` produced `2026-07-06-2026-07-04-voice-copilot-v1`, and when run on a later day the folder sorted under a day on which the change did not happen. Names without a full date prefix (including partial dates like `2026-07-feature`) are dated as before, and the naming is now idempotent. - [#&#8203;1374](https://github.com/Fission-AI/OpenSpec/pull/1374) [`da3907b`](https://github.com/Fission-AI/OpenSpec/commit/da3907b8a9170711c8b7f63e18352e8577cf7df5) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - fix(completion): make the PowerShell completion script parse and load again The generated `OpenSpecCompletion.ps1` contained 18 empty `switch ($positionalIndex) { }` blocks — emitted for commands whose positionals are all `path`-typed (PowerShell completes paths natively, so those cases produce no clauses). A switch with no clauses is a PowerShell parse error ("Missing condition in switch statement clause"), and PowerShell parses the whole file before running it, so the script never loaded and completions never registered. The generator now skips the positional-index block entirely when no positional produces completions, so the script parses clean (18 → 0 errors) and tab completion works. - [#&#8203;1388](https://github.com/Fission-AI/OpenSpec/pull/1388) [`9b5d2cd`](https://github.com/Fission-AI/OpenSpec/commit/9b5d2cdd0c1aa4b1b49da4f95c6cec8d7d38b155) Thanks [@&#8203;mc856](https://github.com/mc856)! - ### Bug Fixes - **Archive workflow templates no longer teach agents to stack a second date prefix** — the `openspec-archive-change` and `openspec-bulk-archive-change` skill/command templates (and the onboarding walkthrough's archived-path example) now mirror the `openspec archive` rule: a change whose name already starts with a `YYYY-MM-DD-` prefix is archived under its own name, while other names get the current date prepended as before. Previously an agent following the workflow instructions on a change named `2026-07-04-voice-copilot-v1` produced `archive/2026-07-07-2026-07-04-voice-copilot-v1`, whatever the CLI did. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Gemini command files escape TOML-active characters (quotes, backslashes, control characters) in the description and prompt, so a template value containing them can no longer produce an invalid `.toml` file. - [#&#8203;1464](https://github.com/Fission-AI/OpenSpec/pull/1464) [`5bcf057`](https://github.com/Fission-AI/OpenSpec/commit/5bcf05766a70ec0163c3e700a3029b1c1da895d8) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Workflow skills and commands no longer tell agents to use the Claude Code-only AskUserQuestion tool. The same templates are generated for every supported tool, and agents without that tool (OpenCode, Factory Droid, Codex, and others) errored or stalled on the instruction. The guidance is now runtime-neutral: agents are simply told to ask the user. - [#&#8203;1403](https://github.com/Fission-AI/OpenSpec/pull/1403) [`2d6c447`](https://github.com/Fission-AI/OpenSpec/commit/2d6c447100c51fb1e5f65c6f6a35ce02a3196a10) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - ### Bug Fixes - **Propose and fast-forward skills no longer name the Claude-only TodoWrite tool** — the generated `openspec-propose` and `openspec-ff-change` skills (and their `/opsx:propose` / `/opsx:ff` commands) told every agent to "Use the **TodoWrite tool**", which only exists in Claude Code. Codex, Cursor, Gemini, Copilot, and the other supported tools have no such tool, so agents either errored or stalled looking for it. The instruction is now runtime-neutral ("Use a todo list to track progress"), which works everywhere — including Claude Code. - [#&#8203;1415](https://github.com/Fission-AI/OpenSpec/pull/1415) [`e2f748c`](https://github.com/Fission-AI/OpenSpec/commit/e2f748c64f05efaeac720f83c71fb6f1b6f6e18d) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Reject config key paths that reach the prototype chain, and update the bundled `yaml` dependency. `openspec config set --allow-unknown __proto__.polluted <value>` reported success and assigned onto `Object.prototype` for the rest of the process. `--allow-unknown` was meant to relax the known-key check only, but it skipped every key check, so `__proto__`, `constructor`, and `prototype` segments reached the nested-write helper. Those segments are now rejected in `config set` whether or not `--allow-unknown` is passed, and `setNestedValue` / `deleteNestedValue` refuse them regardless of caller. Ordinary keys such as `featureFlags.myFlag` behave exactly as before. The `yaml` runtime dependency moves from 2.8.2 to 2.9.0, picking up the fix for a stack overflow on deeply nested input (GHSA / advisory patched in 2.8.3). - [#&#8203;1376](https://github.com/Fission-AI/OpenSpec/pull/1376) [`7958924`](https://github.com/Fission-AI/OpenSpec/commit/7958924e95654af981437951e967983385da8001) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - ### Bug Fixes - **Archive after early sync** — `openspec archive` no longer fails with `ADDED failed … already exists` when a change's specs were already synced to the main specs before archiving (the early-sync pattern from the `sync` workflow). If an ADDED requirement already exists in the target spec with identical content, applying it is treated as a no-op; a same-named requirement with different content still aborts the archive as a genuine conflict ([#&#8203;1332](https://github.com/Fission-AI/OpenSpec/issues/1332)). - [#&#8203;1386](https://github.com/Fission-AI/OpenSpec/pull/1386) [`b419e96`](https://github.com/Fission-AI/OpenSpec/commit/b419e965bbf413cc658bbac37325ebc147b1c869) Thanks [@&#8203;mc856](https://github.com/mc856)! - ### Bug Fixes - **Archive after early sync (RENAMED)** — `openspec archive` no longer fails with `RENAMED failed … source not found` when a change's renames were already synced to the main specs before archiving (the early-sync pattern from the `sync` workflow). If a RENAMED requirement's source header is gone but the target header exists in the spec, applying the rename is treated as a no-op; a rename whose source and target are both missing still aborts the archive as a genuine error, and reported counts reflect only renames actually applied. - [#&#8203;1462](https://github.com/Fission-AI/OpenSpec/pull/1462) [`ebf66c7`](https://github.com/Fission-AI/OpenSpec/commit/ebf66c7ee1df3f7465d7f480753f952483133a73) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Respect reduced-motion preferences in `openspec init`: the welcome animation is skipped when the OS reduced-motion setting is on (macOS Reduce Motion, GNOME animations disabled), when `OPENSPEC_NO_ANIMATION` is set, or when the new `--no-animation` flag is passed. The static welcome screen is shown instead. - [#&#8203;1405](https://github.com/Fission-AI/OpenSpec/pull/1405) [`5dfef4b`](https://github.com/Fission-AI/OpenSpec/commit/5dfef4b00c233fbe78f40488bd4ff98f4204684c) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - ### Bug Fixes - **Custom schema instructions are no longer overridden by hard-coded spec-driven patterns** — the `openspec-continue-change` skill/command embedded one-line "common artifact patterns" for proposal.md, specs, design.md, and tasks.md, so agents followed those shortcuts instead of the schema's `instruction` field whenever a custom schema reused familiar artifact names. The templates now state that the `instruction` field is the authoritative guidance, and the `propose`, `continue`, and `ff` workflows direct the agent — both in the artifact-creation step and in the guidelines — to invoke a skill when the instruction delegates artifact creation to one, verifying the artifact exists afterward (fixes [#&#8203;777](https://github.com/Fission-AI/OpenSpec/issues/777)). - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Follow the Kimi CLI rename to Kimi Code: new install paths with automatic migration of existing `.kimi` setups. - [#&#8203;1415](https://github.com/Fission-AI/OpenSpec/pull/1415) [`e2f748c`](https://github.com/Fission-AI/OpenSpec/commit/e2f748c64f05efaeac720f83c71fb6f1b6f6e18d) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Parse spec headings in linear time when the title is padded with whitespace. Building the reference index read the first Purpose line with a regex that backtracked quadratically on a heading full of spaces: 10,000 characters of padding took 60ms, and 100,000 would have taken roughly six seconds. The heading scan is now hand-rolled and linear. Behavior is unchanged — the replacement was checked against the old implementation across 303,000 generated inputs, including CommonMark closing sequences (`## Purpose ##`), seven-hash lines, and headings with no space after the hashes. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Use local dates for CLI date-only values (archive names, timestamps) instead of UTC, so late-evening archives no longer get tomorrow's date. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec update` warns when a custom profile is missing core workflows instead of silently generating a partial install. - [#&#8203;1428](https://github.com/Fission-AI/OpenSpec/pull/1428) [`81d5109`](https://github.com/Fission-AI/OpenSpec/commit/81d5109b86f16537deb99f84a772a83235dc9e09) Thanks [@&#8203;taltas](https://github.com/taltas)! - Update current Roo Code product references to its community successor, Zoo Code. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Archive treats a MODIFIED delta whose content already matches the main spec as a no-op: a fully early-synced change now reports "Specs already in sync" instead of rewriting the file and claiming modifications. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Render multi-select prompts with `[x]`/`[ ]` checkbox markers instead of radio-button icons. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Discover nested spec paths like `specs/<area>/<capability>/spec.md` recursively and consistently across parse, apply, and archive. - [#&#8203;1410](https://github.com/Fission-AI/OpenSpec/pull/1410) [`b3b05e1`](https://github.com/Fission-AI/OpenSpec/commit/b3b05e1abeb312caefd57e60be799aeb466c1d0e) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Only advertise onboarding commands that will actually exist. The `openspec init` welcome screen and the `openspec update` "Getting started" summary listed `/opsx:new` and `/opsx:continue`, which the default `core` profile never generates, so users were told to run commands that did not exist. Both surfaces now list the commands for the installed workflows. The `init` and `update` completion hints also name the skill (`/openspec-propose`) instead of a command for tools that receive no command files — Codex, and any tool under skills-only delivery. - [#&#8203;1412](https://github.com/Fission-AI/OpenSpec/pull/1412) [`1dc670d`](https://github.com/Fission-AI/OpenSpec/commit/1dc670deea741b8313b8a22fb975741f84677b3f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - ### Fixed - **`/opsx:propose` and `/opsx:ff` no longer finish a change with no spec written.** The workflows listed only `proposal`/`design`/`tasks` and treated the apply phase's `tasks` artifact as the stop condition — but `status` marks an artifact `done` as soon as a matching file exists, so writing `tasks.md` early satisfied the loop while `specs/<capability>/spec.md` was never created (a spec-less change in a spec-driven tool). The loop now derives the full required set — every apply dependency plus everything it transitively `requires` — from a single `status` call, creates each missing artifact, and only skips one when its own `instruction` field marks it conditional. ([#&#8203;1260](https://github.com/Fission-AI/OpenSpec/issues/1260), [#&#8203;788](https://github.com/Fission-AI/OpenSpec/issues/788)) ##### Changed - **`openspec status --json` now reports each artifact's `requires` edges.** Every entry in the `artifacts` array carries a `requires` array of the ids it directly depends on, present for every status (including `done`) so agents can compute the transitive required set from `status` alone. Additive and backward-compatible — existing fields are unchanged. - [#&#8203;1191](https://github.com/Fission-AI/OpenSpec/pull/1191) [`7704702`](https://github.com/Fission-AI/OpenSpec/commit/7704702d61fa71e4f553c21a06bdf8e4ee803b4a) Thanks [@&#8203;mc856](https://github.com/mc856)! - Generate Markdown commands for Qwen Code instead of deprecated TOML format. Qwen Code now recommends Markdown custom commands with YAML frontmatter; the old `.qwen/commands/opsx-*.toml` files are cleaned up as legacy artifacts on update. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - An already-synced RENAMED delta aborts when a case/whitespace variant of the source requirement still exists — the same typo guard REMOVED deltas have. - [#&#8203;1368](https://github.com/Fission-AI/OpenSpec/pull/1368) [`de78c31`](https://github.com/Fission-AI/OpenSpec/commit/de78c31ffd885a0558ae55d332f74d5485dc01c0) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - ### Fixes - **Regenerated artifacts now pick up your manual edits** — the continue, propose, and fast-forward workflows (and the `openspec instructions` dependency block) now tell the agent to re-read dependency artifacts from disk before creating the next one, instead of trusting whatever version it saw earlier in the conversation. Previously, editing `spec.md` and deleting `design.md`/`tasks.md` to regenerate them could silently produce artifacts based on the stale, pre-edit content. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Proposal guidance now resolves blocking open questions with the user instead of deferring them to design.md. - [#&#8203;1392](https://github.com/Fission-AI/OpenSpec/pull/1392) [`a13abea`](https://github.com/Fission-AI/OpenSpec/commit/a13abeac47d419462b0193dbf9423dd466ffe6c7) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - ### Fixed - Stop a delta spec written directly at a change's `specs/` root from being silently dropped. `validate` accepted `specs/spec.md` and counted its deltas, but the apply/archive merge only reads capability folders (`specs/<capability>/spec.md`), so the change could pass validation and be archived while its requirements never reached `openspec/specs/`. `validate` now uses the same discovery rules as the merge path and reports the misplaced file with a fix hint, and `archive` blocks instead of completing. - [#&#8203;1465](https://github.com/Fission-AI/OpenSpec/pull/1465) [`f917b8b`](https://github.com/Fission-AI/OpenSpec/commit/f917b8be5e1100189ef62320ba9322763053640e) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Order artifacts by the schema's declaration order instead of alphabetically. `specs` and `design` both require only `proposal`, so both become ready at once - and the tie used to be broken alphabetically, which put `design` first. `openspec status` listed design above specs and `nextSteps` recommended writing `design.md` before any spec existed, contradicting the spec-driven schema's own documented `proposal → specs → design → tasks` sequence. Ties now follow the order the schema declares its artifacts, so `openspec status`, `status --json`, `nextSteps`, `blocked by:` lists, and an artifact's `unlocks` all agree. No dependency edges changed, so nothing newly blocks and `design.md` stays optional - only the order of equally-ready artifacts moved. Custom schemas get the same guarantee: dependency order still comes first, but wherever your schema leaves two artifacts equally ready, the order of its `artifacts:` list now decides which one the CLI recommends - so reorder that list if it was never deliberate. - [#&#8203;1446](https://github.com/Fission-AI/OpenSpec/pull/1446) [`5348da9`](https://github.com/Fission-AI/OpenSpec/commit/5348da930c4038ffd5b5a521702b71315dcd0019) Thanks [@&#8203;showms](https://github.com/showms)! - ### Bug Fixes - Preserve an existing project-local schema when `openspec schema init --force` rejects an unknown artifact ID. Forced replacement now begins only after artifact validation succeeds. - [#&#8203;1433](https://github.com/Fission-AI/OpenSpec/pull/1433) [`26f009d`](https://github.com/Fission-AI/OpenSpec/commit/26f009d940f311b99db7f310816bb166a99fb3ef) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Change lookup no longer requires `proposal.md`. `openspec show`, `openspec change list/show/validate`, and shell completion now resolve a change by its directory, matching `openspec list`, `status`, `instructions`, and `validate`. Previously a change created by `openspec new change` — which scaffolds only `.openspec.yaml` — was reported as `Unknown item` by `openspec show` and was missing from completions and `openspec change list` until a proposal was written, and a change from a schema with no proposal artifact was never resolvable. `openspec change list` now reports the same set as `openspec list`, keeps task counts for a change that has no proposal yet, and labels it `(no proposal.md yet)` rather than `(unable to read)`. Showing such a change explains that the proposal is not written yet and points at `openspec status --change <name>`. - [#&#8203;1468](https://github.com/Fission-AI/OpenSpec/pull/1468) [`fc886af`](https://github.com/Fission-AI/OpenSpec/commit/fc886af7f93068482bbf2c66fd1eb76b40c6a22f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - The continue, update, verify, sync, and archive workflow skills now select a change the same way apply does: use the provided name, infer it from conversation context, auto-select when exactly one active change exists, and only prompt when the choice is genuinely ambiguous. Previously these workflows were told to always prompt ("Do NOT guess or auto-select"), so invoking them with a single active change stalled on a question with only one possible answer. The selection is always announced ("Using change: <name>") with how to override, and bulk archive still always prompts. - [#&#8203;1194](https://github.com/Fission-AI/OpenSpec/pull/1194) [`b7c85c7`](https://github.com/Fission-AI/OpenSpec/commit/b7c85c741ca56748a4ae095b573fe4550c5c977f) Thanks [@&#8203;mc856](https://github.com/mc856)! - Fix skills-only delivery emitting `/opsx:*` command references. SKILL.md files generated by init, update, and workspace skill setup now reference the corresponding skills (e.g. `/openspec-apply-change`) when `delivery: 'skills'` is configured, instead of commands that were never generated. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Specs instructions include the spec content guidance from the concepts docs, so generated specs follow the requirement/scenario format. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - The static welcome screen (reduced motion, `--no-animation`, narrow terminals) now waits for the Enter it asks for instead of letting the keystroke submit the tool picker unseen. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Sync and archive workflows resolve main specs through the store-aware root instead of assuming `openspec/specs` in the repo. - [#&#8203;1402](https://github.com/Fission-AI/OpenSpec/pull/1402) [`0da5f98`](https://github.com/Fission-AI/OpenSpec/commit/0da5f98e147543a44379e32295e2e9798d775d83) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Show the main spec format in the sync-specs skill so agents stop leaving delta operation headers (`## ADDED/MODIFIED Requirements`) in `openspec/specs/` — merged main specs with those headers parse as 0 requirements in `openspec view` ([#&#8203;1120](https://github.com/Fission-AI/OpenSpec/issues/1120)). - [#&#8203;1476](https://github.com/Fission-AI/OpenSpec/pull/1476) [`8731290`](https://github.com/Fission-AI/OpenSpec/commit/87312900f532c6c13ea556d4badaff2efdfa9602) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Telemetry no longer depends on `posthog-node`: the single usage event is sent with a plain fetch to the same endpoint. Installing OpenSpec no longer pulls the fast-publishing `posthog-node`/`@posthog/core`/`@posthog/types` tree, which broke downstream installs under supply-chain age policies like pnpm's `minimumReleaseAge` ([#&#8203;1390](https://github.com/Fission-AI/OpenSpec/issues/1390)). - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - The stale-CLI check hardens its install detection: a directory merely named `volta` no longer changes the upgrade hint, the Windows npm-ownership check corroborates against the `openspec.cmd` shim npm actually writes, and a registry redirect from https to plain http is no longer followed. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - The stale-CLI check tears down a redirected registry connection when its time budget expires instead of leaving the socket open. - [#&#8203;1442](https://github.com/Fission-AI/OpenSpec/pull/1442) [`10fa39b`](https://github.com/Fission-AI/OpenSpec/commit/10fa39b1c3a3e88c02ae7d3053864c03a793ff47) Thanks [@&#8203;hsusul](https://github.com/hsusul)! - `openspec update` now refreshes tools that are configured with command files but no skills (delivery `commands`). Previously it read the generating version only from skill files, so such a tool was reported as "up to date" forever and its command files were never regenerated after a CLI upgrade. Command files carry no version stamp, so OpenSpec compares their contents against what it would generate now — including removing a command file left behind by a workflow you have since deselected. CRLF line endings and a UTF-8 BOM are treated as checkout artifacts rather than drift, so a Windows clone does not report a spurious update. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec update` with `delivery: commands` prints the same configuration correction as init when it removes the skills of a tool that supports only skills, instead of deleting them silently. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - `openspec validate` reports an unreadable specs/ directory as the error it is instead of misdiagnosing it as "no deltas found". - [#&#8203;1455](https://github.com/Fission-AI/OpenSpec/pull/1455) [`6b3623a`](https://github.com/Fission-AI/OpenSpec/commit/6b3623a39e96f49995d38d642738b31f68e92039) Thanks [@&#8203;c4patino](https://github.com/c4patino)! - `openspec view` now resolves the configured OpenSpec root instead of always reading the current directory, and accepts `--store <id>` like its sibling commands. Projects whose `openspec/config.yaml` points at an external store saw an empty dashboard — 0 specs, 0 requirements — while `openspec list` read the same store correctly. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - Preserve keyboard input on Windows after the welcome screen instead of dropping the first keystrokes. - [#&#8203;1475](https://github.com/Fission-AI/OpenSpec/pull/1475) [`17af60c`](https://github.com/Fission-AI/OpenSpec/commit/17af60c66e4c049e3986fdbafcdc16b202cda59f) Thanks [@&#8203;clay-good](https://github.com/clay-good)! - zsh completion install honors `$ZSH` and `$ZSH_CUSTOM`, so Oh My Zsh setups at custom locations get the completion where their shell actually loads it. </details> <details> <summary>eslint/eslint (eslint)</summary> ### [`v10.8.1`](https://github.com/eslint/eslint/releases/tag/v10.8.1) [Compare Source](https://github.com/eslint/eslint/compare/v10.8.0...v10.8.1) #### Bug Fixes - [`18eb0a7`](https://github.com/eslint/eslint/commit/18eb0a7e787b9fac3049ef3dad0e845d2bd940a4) fix: prevent ASI hazard in `no-unused-labels` autofix ([#&#8203;21173](https://github.com/eslint/eslint/issues/21173)) (dongkyu lee) - [`151ba3f`](https://github.com/eslint/eslint/commit/151ba3f5834a0909e8b9b1736f4889ac694c0104) fix: false positives in `getter-return` and `accessor-pairs` ([#&#8203;21163](https://github.com/eslint/eslint/issues/21163)) (Grit) - [`6898df9`](https://github.com/eslint/eslint/commit/6898df9364639ee64b9448a4cb6b08a30c16bd37) fix: ignore meta-property names in `id-denylist` ([#&#8203;21166](https://github.com/eslint/eslint/issues/21166)) (Pixel) - [`4d7db66`](https://github.com/eslint/eslint/commit/4d7db6628e2badf0857cb88734fe641c3874bce9) fix: ignore meta-property names in `id-match` ([#&#8203;21167](https://github.com/eslint/eslint/issues/21167)) (Pixel) - [`677214e`](https://github.com/eslint/eslint/commit/677214e7eea83d8bc6e4b79eea871577e1369d5f) fix: handle ASI hazards in no-unused-vars removeVar suggestion ([#&#8203;20935](https://github.com/eslint/eslint/issues/20935)) (kuldeep kumar) #### Documentation - [`7d0cbf8`](https://github.com/eslint/eslint/commit/7d0cbf81cfdb7526b5c4cb7b222ddc7f257db560) docs: Update README (GitHub Actions Bot) - [`0a05812`](https://github.com/eslint/eslint/commit/0a05812adb12598b32e85297b98df5ad14501d60) docs: add missing backticks to `no-duplicate-imports.js` ([#&#8203;21183](https://github.com/eslint/eslint/issues/21183)) (Lee Daeun) - [`678c90b`](https://github.com/eslint/eslint/commit/678c90b55da2889d4400cbf6e2584ab683faf202) docs: Update README (GitHub Actions Bot) - [`8a10424`](https://github.com/eslint/eslint/commit/8a104242e8e1c5614940fab7324346974cff7d26) docs: Update README (GitHub Actions Bot) - [`69bb948`](https://github.com/eslint/eslint/commit/69bb948061105426dbe6e3c931fcda783286e020) docs: Update README (GitHub Actions Bot) #### Chores - [`0a14800`](https://github.com/eslint/eslint/commit/0a148005051fded2ef1d14cc228ae505251b4b10) chore: update github/codeql-action action to v4.37.4 ([#&#8203;21196](https://github.com/eslint/eslint/issues/21196)) (renovate\[bot]) - [`05adcb1`](https://github.com/eslint/eslint/commit/05adcb13542061dc7fadde5cd58d23d405a96d93) test: fix failing ecosystem test for `eslint-plugin-unicorn` ([#&#8203;21191](https://github.com/eslint/eslint/issues/21191)) (Lazizbek Ergashev) - [`5611035`](https://github.com/eslint/eslint/commit/56110356652dd614b3cf0933538abb551fc6bd6f) test: add error locations info to `no-void` ([#&#8203;21185](https://github.com/eslint/eslint/issues/21185)) (Lee Daeun) - [`ee47333`](https://github.com/eslint/eslint/commit/ee47333aa681cfc3cb54df08c38f211ea219cc2a) ci: bump github/codeql-action from 4 to 4.37.3 ([#&#8203;21176](https://github.com/eslint/eslint/issues/21176)) (dependabot\[bot]) - [`f131c03`](https://github.com/eslint/eslint/commit/f131c034ad91bbf06bcbb6b5e931447a8e419a46) chore: improve ecosystem test failure reporting ([#&#8203;20937](https://github.com/eslint/eslint/issues/20937)) (crimsonjay0) - [`1f6edde`](https://github.com/eslint/eslint/commit/1f6eddee609b369b50993eab08d437dda4700991) chore: update ecosystem plugins ([#&#8203;21182](https://github.com/eslint/eslint/issues/21182)) (ESLint Bot) - [`d3266fb`](https://github.com/eslint/eslint/commit/d3266fb26c719c6b90a6cbe54bb120c9335ad19c) chore: unpin `webpack` dependency ([#&#8203;21172](https://github.com/eslint/eslint/issues/21172)) (Francesco Trotta) - [`65a6519`](https://github.com/eslint/eslint/commit/65a6519cc8733b4688558a8611397cf9d01dd55d) chore: add allowScripts field to package.json ([#&#8203;21092](https://github.com/eslint/eslint/issues/21092)) (GiHoon Noh) - [`22e5256`](https://github.com/eslint/eslint/commit/22e52568536e0009d4493dc888736bc163220c4b) ci: add `triage:no` label to Dependabot PRs ([#&#8203;21141](https://github.com/eslint/eslint/issues/21141)) (lumir) - [`55c9038`](https://github.com/eslint/eslint/commit/55c9038836c91b6bd5617f0c97bea2274c9cc0bf) ci: bump actions/labeler from 6 to 7 ([#&#8203;21159](https://github.com/eslint/eslint/issues/21159)) (dependabot\[bot]) - [`7280e78`](https://github.com/eslint/eslint/commit/7280e78183d4711a49916b6a49ba5efaa651a991) chore: update dependency prettier to v3.9.6 ([#&#8203;21162](https://github.com/eslint/eslint/issues/21162)) (renovate\[bot]) - [`eddbad6`](https://github.com/eslint/eslint/commit/eddbad60158d8cda86830fbe934a9d2282273b32) test: fix failing ecosystem test for `eslint-plugin-unicorn` ([#&#8203;21156](https://github.com/eslint/eslint/issues/21156)) (Francesco Trotta) - [`60a178d`](https://github.com/eslint/eslint/commit/60a178d5ef1b0c471be0831031ed7347f8f81dc2) chore: update ecosystem plugins ([#&#8203;21150](https://github.com/eslint/eslint/issues/21150)) (ESLint Bot) - [`f9f61dc`](https://github.com/eslint/eslint/commit/f9f61dc6112836f46a58a410c38b8c2faf10973f) test: add error locations to `no-unreachable` ([#&#8203;21151](https://github.com/eslint/eslint/issues/21151)) (JIYEON) - [`d086293`](https://github.com/eslint/eslint/commit/d08629382b0a6aaa042823b796e5100e60053b54) test: add error locations to `no-undef` ([#&#8203;21147](https://github.com/eslint/eslint/issues/21147)) (JIYEON) - [`cc01b67`](https://github.com/eslint/eslint/commit/cc01b67061bbf558aa25746883ea1cad847f7cf2) test: add error locations to `no-useless-catch` ([#&#8203;21144](https://github.com/eslint/eslint/issues/21144)) (devoil) - [`688e75e`](https://github.com/eslint/eslint/commit/688e75ede01b295d51f2f86c9d82da020a4c887e) chore: add missing backticks in JSDoc ([#&#8203;21143](https://github.com/eslint/eslint/issues/21143)) (Bo Hyun Kim) - [`7c1e175`](https://github.com/eslint/eslint/commit/7c1e17543ad396f50f65b003cf9142d43d3c63b0) test: add error locations to `require-await` ([#&#8203;21145](https://github.com/eslint/eslint/issues/21145)) (Grit) - [`588a26d`](https://github.com/eslint/eslint/commit/588a26ddce3c5a20f5b3f3d51ba1353cce7b4b0c) test: add error locations to `no-extra-label` ([#&#8203;21139](https://github.com/eslint/eslint/issues/21139)) (dongkyu lee) - [`059aa89`](https://github.com/eslint/eslint/commit/059aa895743639e3ab53d14f9d944ff4be042233) test: add error locations to `no-useless-concat` ([#&#8203;21140](https://github.com/eslint/eslint/issues/21140)) (dongkyu lee) - [`5a452a8`](https://github.com/eslint/eslint/commit/5a452a8ba53917d65c9d83c3959ed35c2f890613) test: add error locations to `no-const-assign` ([#&#8203;21138](https://github.com/eslint/eslint/issues/21138)) (dongkyu lee) ### [`v10.8.0`](https://github.com/eslint/eslint/releases/tag/v10.8.0) [Compare Source](https://github.com/eslint/eslint/compare/v10.7.0...v10.8.0) #### Features - [`2fee9bb`](https://github.com/eslint/eslint/commit/2fee9bb7416116cbed4d8c8100b1ae713b6356a1) feat: export `ConfigObject` from `eslint/config` ([#&#8203;21082](https://github.com/eslint/eslint/issues/21082)) (sethamus) #### Bug Fixes - [`6b8d2f7`](https://github.com/eslint/eslint/commit/6b8d2f7589b8a7c8b91b8ca2a2ef6d46178760d8) fix: escape reserved characters in rule id in `html` formatter ([#&#8203;21129](https://github.com/eslint/eslint/issues/21129)) (Francesco Trotta) - [`9091071`](https://github.com/eslint/eslint/commit/90910715011211a20d011d807d398a7005127f35) fix: prevent `no-unreachable-loop` crash when all loop types are ignored ([#&#8203;21116](https://github.com/eslint/eslint/issues/21116)) (Pixel) - [`e23fafe`](https://github.com/eslint/eslint/commit/e23fafe8d4b15355adef6cdebef414c3a2019454) fix: prefer-object-spread add semicolon when adding parenthesis ([#&#8203;21081](https://github.com/eslint/eslint/issues/21081)) (synthex-byte) - [`20b5ad0`](https://github.com/eslint/eslint/commit/20b5ad052360a443786a202e94624a3f81846511) fix: quadratic-time regex in `prefer-template` ([#&#8203;21096](https://github.com/eslint/eslint/issues/21096)) (Milos Djermanovic) - [`8b6f6c0`](https://github.com/eslint/eslint/commit/8b6f6c0b33411f34485512456d94f221daf7321f) fix: apply ignore configs to computed methods in class-methods-use-this ([#&#8203;21094](https://github.com/eslint/eslint/issues/21094)) (Pixel) - [`b2c608c`](https://github.com/eslint/eslint/commit/b2c608c014a396800a24a89343265d0616bee2d8) fix: NewExpression with parenthesized callee in `preserve-caught-error` ([#&#8203;21083](https://github.com/eslint/eslint/issues/21083)) (Francesco Trotta) #### Documentation - [`6ddf858`](https://github.com/eslint/eslint/commit/6ddf8587e5cfeeb7328332601bb76d98b8a198ea) docs: fix broken Specify Parser Options anchor link ([#&#8203;21106](https://github.com/eslint/eslint/issues/21106)) (Minsu) - [`784dfbe`](https://github.com/eslint/eslint/commit/784dfbe98f0222426fd200153a5ce2e5624151f0) docs: Clarify `no-eq-null` description ([#&#8203;21120](https://github.com/eslint/eslint/issues/21120)) (Park Harin) - [`7ec733a`](https://github.com/eslint/eslint/commit/7ec733a3ba5acb053a73ac656030a3879aa48fda) docs: Fix typos and grammar in glossary ([#&#8203;21095](https://github.com/eslint/eslint/issues/21095)) (Marry (Subin Yang)) - [`92bb13f`](https://github.com/eslint/eslint/commit/92bb13f13065db72d62454b9830d3ae52db15c76) docs: replace quake link ([#&#8203;21108](https://github.com/eslint/eslint/issues/21108)) (Jung Hyeon Jun) - [`68eb4a5`](https://github.com/eslint/eslint/commit/68eb4a57572409dbdcfeb3bc5c92ddbba46bc770) docs: fix broken Specify Globals anchor links in rule pages ([#&#8203;21103](https://github.com/eslint/eslint/issues/21103)) (Minsu) - [`d28f697`](https://github.com/eslint/eslint/commit/d28f697e0d32d7446c825fd89c362db028450134) docs: replace Code Climate CLI links with Qlty CLI links ([#&#8203;21099](https://github.com/eslint/eslint/issues/21099)) (Jung Hyeon Jun) - [`eccc68d`](https://github.com/eslint/eslint/commit/eccc68d42564e46bc9020d19ec52d2988f3b7bfa) docs: correct --suppressions-location option description ([#&#8203;21093](https://github.com/eslint/eslint/issues/21093)) (Ga eun Lee) - [`c5963f7`](https://github.com/eslint/eslint/commit/c5963f74bfa82a5b7ccc0607dcdcc695b8c97a31) docs: Update README (GitHub Actions Bot) #### Chores - [`4fbf46d`](https://github.com/eslint/eslint/commit/4fbf46d140120ae838db08cbe49544c985956490) test: pin `webpack` version to 5.108.4 ([#&#8203;21137](https://github.com/eslint/eslint/issues/21137)) (Francesco Trotta) - [`2d063e2`](https://github.com/eslint/eslint/commit/2d063e224e9bb0ccb0a28c120f7e380a8d62f320) chore: update HTTP URLs to HTTPS in JSDoc and comments ([#&#8203;21101](https://github.com/eslint/eslint/issues/21101)) (Bo Hyun Kim) - [`eccbe7b`](https://github.com/eslint/eslint/commit/eccbe7bc9257a6c99880468e452c8dfafbf47f74) test: add error locations to `no-class-assign` ([#&#8203;21123](https://github.com/eslint/eslint/issues/21123)) (devoil) - [`e7d1e43`](https://github.com/eslint/eslint/commit/e7d1e4373bf626f8da76d62ce024c28928bc99bc) ci: bump actions/setup-go from 6 to 7 ([#&#8203;21118](https://github.com/eslint/eslint/issues/21118)) (dependabot\[bot]) - [`e9d66d0`](https://github.com/eslint/eslint/commit/e9d66d0cde1a7752c29dee53ab7b62632835a87a) ci: bump actions/setup-node from 6 to 7 ([#&#8203;21119](https://github.com/eslint/eslint/issues/21119)) (dependabot\[bot]) - [`ee225b6`](https://github.com/eslint/eslint/commit/ee225b60c26f0cc5f4d71641888a5bd2ec5626d6) test: Add error location details to `no-eq-null` rule ([#&#8203;21117](https://github.com/eslint/eslint/issues/21117)) (Park Harin) - [`044a627`](https://github.com/eslint/eslint/commit/044a627fa3e28ee1410d515acc5378eb4b49f8ba) chore: update minimatch to ^10.2.5 ([#&#8203;21107](https://github.com/eslint/eslint/issues/21107)) (김채영) - [`fb09aa8`](https://github.com/eslint/eslint/commit/fb09aa8ff09730d3ccf68859e065f99666b52466) chore: update ecosystem plugins ([#&#8203;21115](https://github.com/eslint/eslint/issues/21115)) (ESLint Bot) - [`5abd878`](https://github.com/eslint/eslint/commit/5abd878740fe417fd8a910cac3741f2a0317b365) test: add error locations to `no-proto` ([#&#8203;21114](https://github.com/eslint/eslint/issues/21114)) (Gihyeon Jeong / 정기현) - [`9715887`](https://github.com/eslint/eslint/commit/9715887ec94a5ff936447d7b680d039fbe2f0541) test: Add error location details to `no-div-regex` ([#&#8203;21110](https://github.com/eslint/eslint/issues/21110)) (Park Harin) - [`a746ec6`](https://github.com/eslint/eslint/commit/a746ec6ea4a2249b1eb3f512264da5f4d5f7c886) test: add error locations to `no-new-wrappers` ([#&#8203;21109](https://github.com/eslint/eslint/issues/21109)) (Gihyeon Jeong / 정기현) - [`8dde645`](https://github.com/eslint/eslint/commit/8dde64570e240f3ef8af873d59a752db6d8519aa) test: add error locations to `no-ex-assign` ([#&#8203;21102](https://github.com/eslint/eslint/issues/21102)) (devoil) - [`13ab0ec`](https://github.com/eslint/eslint/commit/13ab0ec447650c079d8a5e5d67222f79e69c741e) test: add error locations to `no-label-var` ([#&#8203;21098](https://github.com/eslint/eslint/issues/21098)) (Gihyeon Jeong / 정기현) - [`a99906f`](https://github.com/eslint/eslint/commit/a99906ffb8342dde03336b5c6372b5658f21d5f2) test: Add error location details to `no-delete-var` rule ([#&#8203;21105](https://github.com/eslint/eslint/issues/21105)) (Park Harin) - [`c47e8dc`](https://github.com/eslint/eslint/commit/c47e8dc9bbfba797430db45ae08cb6f7392cfc9d) chore: add missing backticks to `languages/js/index.js` ([#&#8203;21104](https://github.com/eslint/eslint/issues/21104)) (beeen) - [`0174428`](https://github.com/eslint/eslint/commit/0174428dd7543d118cf67a823b98dd97032fe68c) chore: add missing backticks to `translate-cli-options.js` ([#&#8203;21097](https://github.com/eslint/eslint/issues/21097)) (dongkyu lee) - [`3d36589`](https://github.com/eslint/eslint/commit/3d36589a4917326500f0707bb41745160f387d00) chore: add missing backticks to `serialization.js` ([#&#8203;21091](https://github.com/eslint/eslint/issues/21091)) (이규환) - [`dcc9312`](https://github.com/eslint/eslint/commit/dcc9312c1081931de0fe1b555fbb6aa82fe696b9) test: add error locations to `eqeqeq` ([#&#8203;21090](https://github.com/eslint/eslint/issues/21090)) (Ga eun Lee) - [`2710b18`](https://github.com/eslint/eslint/commit/2710b182472cd1a95e4aff6186cb2c4fbadb4ee0) ci: Add explicit permissions to rebuild-docs-sites workflow ([#&#8203;21089](https://github.com/eslint/eslint/issues/21089)) (Marry (Subin Yang)) - [`5d2f866`](https://github.com/eslint/eslint/commit/5d2f8663ee60701e9036b0b0933a12efd9d93269) chore: update dependency prettier to v3.9.5 ([#&#8203;21086](https://github.com/eslint/eslint/issues/21086)) (renovate\[bot]) - [`d584e31`](https://github.com/eslint/eslint/commit/d584e31098f262563b97dc5d5f23a63a187879a0) chore: fix failing ecosystem test for `eslint-plugin-unicorn` ([#&#8203;21084](https://github.com/eslint/eslint/issues/21084)) (Francesco Trotta) - [`bf3eda0`](https://github.com/eslint/eslint/commit/bf3eda049bd690f1e9a5a0c4520a6329b3e4ec85) chore: update ecosystem plugins ([#&#8203;21079](https://github.com/eslint/eslint/issues/21079)) (ESLint Bot) </details> <details> <summary>jsdom/jsdom (jsdom)</summary> ### [`v30.0.1`](https://github.com/jsdom/jsdom/releases/tag/v30.0.1) [Compare Source](https://github.com/jsdom/jsdom/compare/v30.0.0...v30.0.1) - Fixed `getComputedStyle()` with `calc()` and other functions throwing an exception, which regressed in v30.0.0. ([@&#8203;asamuzaK](https://github.com/asamuzaK)) - Sped up up range operations on large documents ([@&#8203;leonidaz](https://github.com/leonidaz)) </details> <details> <summary>prettier/prettier (prettier)</summary> ### [`v3.9.6`](https://github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#396) [Compare Source](https://github.com/prettier/prettier/compare/3.9.5...3.9.6) [diff](https://github.com/prettier/prettier/compare/3.9.5...3.9.6) ##### TypeScript: Preserve quotes for methods named `new` ([#&#8203;19621](https://github.com/prettier/prettier/pull/19621) by [@&#8203;kovsu](https://github.com/kovsu)) <!-- prettier-ignore --> ```tsx // Input interface Container { "new"(id: string): number; } // Prettier 3.9.5 interface Container { new(id: string): number; } // Prettier 3.9.6 interface Container { "new"(id: string): number; } ``` ##### TypeScript: Support `import defer` ([#&#8203;19624](https://github.com/prettier/prettier/pull/19624), [#&#8203;19675](https://github.com/prettier/prettier/pull/19675) by [@&#8203;fisker](https://github.com/fisker)) <!-- prettier-ignore --> ```tsx // Input import defer * as foo from "foo"; // Prettier 3.9.5 import * as foo from "foo"; // Prettier 3.9.6 import defer * as foo from "foo"; ``` ##### JavaScript: Added a new official plugin `@prettier/plugin-yuku` ([#&#8203;19628](https://github.com/prettier/prettier/pull/19628), [#&#8203;19629](https://github.com/prettier/prettier/pull/19629) by [@&#8203;fisker](https://github.com/fisker)) `@prettier/plugin-yuku` is powered by [Yuku](https://yuku.fyi/) (A high-performance JavaScript/TypeScript compiler toolchain written in Zig). This plugin includes two new parsers: `yuku` (JavaScript syntax) and `yuku-ts` (TypeScript syntax). **To use this plugin:** 1. Install the plugin: ```bash yarn add --dev prettier @&#8203;prettier/plugin-yuku ``` 2. Add it to your `.prettierrc`: ```yaml plugins: - "@&#8203;prettier/plugin-yuku" ``` Due to package size limitations, this plugin is not bundled with the main prettier package and must be installed separately. For more information, check [the package homepage](https://github.com/prettier/prettier/tree/main/packages/plugin-yuku). Big thanks to [@&#8203;arshad-yaseen](https://github.com/arshad-yaseen) for his excellent work. </details> <details> <summary>i18next/react-i18next (react-i18next)</summary> ### [`v17.0.11`](https://github.com/i18next/react-i18next/blob/HEAD/CHANGELOG.md#17011) [Compare Source](https://github.com/i18next/react-i18next/compare/v17.0.10...v17.0.11) - chore: `html-parse-stringify` updated to `^4.0.1`. The parser powering `<Trans>` is now actively maintained under the i18next org ([i18next/html-parse-stringify](https://github.com/i18next/html-parse-stringify)) after years without upstream releases. 4.x brings modern dual ESM/CJS packaging with an `exports` map, zero runtime dependencies, reworked TypeScript types and a long list of parser fixes (literal `<` in text, multiline/CRLF attribute values, comments containing `>`, doctype handling, quote-aware bracket handling). - refactor(Trans): the internal `escapeLiteralLessThan` scanner (\~80 lines) is replaced by the parser's new `allowedTags` option with identical semantics: only numbered tags, kept basic HTML tags and known component names are parsed as markup, any other tag-shaped sequence in the translation stays literal text. Rendered output is unchanged (all 493 tests pass, including the [#&#8203;1880](https://github.com/i18next/react-i18next/issues/1880) and [#&#8203;1893](https://github.com/i18next/react-i18next/issues/1893) escaping cases). ### [`v17.0.10`](https://github.com/i18next/react-i18next/blob/HEAD/CHANGELOG.md#17010) [Compare Source](https://github.com/i18next/react-i18next/compare/v17.0.9...v17.0.10) - fix(warnings): the `useTranslation` and `Trans` "You will need to pass in an i18next instance" warnings now match the `useSSR` wording, mentioning the props/context alternatives and the most common unexplained cause at scale: duplicate react-i18next copies in monorepo setups. The `Trans` variant also referenced the internal `i18nextReactModule` name; it now points to the public `initReactI18next` API. - feat(warnings): development-only warning (`SUSPENDED_WHILE_LOADING`, logged once) right before `useTranslation` suspends while translations are loading. With the default `useSuspense: true` and no `<Suspense>` boundary this previously surfaced as a blank screen or a cryptic React error; the warning now names both fixes (add a `<Suspense>` boundary or set `react.useSuspense: false`). No-op in production builds; the `process.env.NODE_ENV` check is wrapped so runtimes without a `process` global (raw ESM in the browser, some edge runtimes) stay silent instead of throwing. - ci: weekly workflow typechecking the test suite against `@types/react@next` / `@types/react-dom@next`, so the next React major's type changes (like the React 18 `TFunctionResult`/children wave) surface before user reports. </details> <details> <summary>react/react (react-test-renderer)</summary> ### [`v19.2.8`](https://github.com/react/react/releases/tag/v19.2.8): 19.2.8 (July 21st, 2026) [Compare Source](https://github.com/react/react/compare/v19.2.7...v19.2.8) #### React Server Components - Performance improvements when decoding ([#&#8203;37087](https://github.com/facebook/react/pull/37087) by [@&#8203;eps1lon](https://github.com/eps1lon)) </details> <details> <summary>vercel/turborepo (turbo)</summary> ### [`v2.10.11`](https://github.com/vercel/turborepo/releases/tag/v2.10.11): Turborepo v2.10.11 [Compare Source](https://github.com/vercel/turborepo/compare/v2.10.10...v2.10.11) <!-- Release notes generated using configuration in .github/release.yml at v2.10.11 --> #### What's Changed ##### Changelog - chore: Release Turborepo 2.10.10 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13741](https://github.com/vercel/turborepo/pull/13741) - fix: Automatically approve release workflows by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13743](https://github.com/vercel/turborepo/pull/13743) - chore: Release Turborepo 2.10.11-canary.1 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13744](https://github.com/vercel/turborepo/pull/13744) - fix: Avoid repeated strict entrypoint traversal by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13745](https://github.com/vercel/turborepo/pull/13745) - chore: Release Turborepo 2.10.11-canary.2 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13747](https://github.com/vercel/turborepo/pull/13747) - feat: Cache native uv tool tasks by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13748](https://github.com/vercel/turborepo/pull/13748) - chore: Release Turborepo 2.10.11-canary.3 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13749](https://github.com/vercel/turborepo/pull/13749) - fix: Isolate concurrent generator config bundles by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13750](https://github.com/vercel/turborepo/pull/13750) - chore: Forbid release-age exclusions in examples maintenance by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13751](https://github.com/vercel/turborepo/pull/13751) - fix: Respect gitignore without git metadata by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13756](https://github.com/vercel/turborepo/pull/13756) - chore: Release Turborepo 2.10.11-canary.4 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13759](https://github.com/vercel/turborepo/pull/13759) - feat: Expand performance agent toolbox by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13761](https://github.com/vercel/turborepo/pull/13761) - docs: Redesign Turborepo homepage by [@&#8203;christopherkindl](https://github.com/christopherkindl) in [#&#8203;13702](https://github.com/vercel/turborepo/pull/13702) - fix: Tolerate transient input files by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13734](https://github.com/vercel/turborepo/pull/13734) **Full Changelog**: <https://github.com/vercel/turborepo/compare/v2.10.10...v2.10.11> ### [`v2.10.10`](https://github.com/vercel/turborepo/releases/tag/v2.10.10): Turborepo v2.10.10 [Compare Source](https://github.com/vercel/turborepo/compare/v2.10.9...v2.10.10) <!-- Release notes generated using configuration in .github/release.yml at v2.10.10 --> #### What's Changed ##### Changelog - chore: Release Turborepo 2.10.9 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13696](https://github.com/vercel/turborepo/pull/13696) - docs: Update Geistdocs to 1.19.6 by [@&#8203;molebox](https://github.com/molebox) in [#&#8203;13701](https://github.com/vercel/turborepo/pull/13701) - feat: Support nub.lock files by [@&#8203;akshat-OwO](https://github.com/akshat-OwO) in [#&#8203;13699](https://github.com/vercel/turborepo/pull/13699) - chore: Release Turborepo 2.10.10-canary.1 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13703](https://github.com/vercel/turborepo/pull/13703) - perf: Walk the repository once when pruning by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13705](https://github.com/vercel/turborepo/pull/13705) - fix(deps): Upgrade js-yaml to 4.3.1 (GHSA-5p4m-2wfm-xmqj) by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13704](https://github.com/vercel/turborepo/pull/13704) - chore: Move pnpm overrides to pnpm-workspace.yaml by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13706](https://github.com/vercel/turborepo/pull/13706) - chore: Release Turborepo 2.10.10-canary.2 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13707](https://github.com/vercel/turborepo/pull/13707) - fix: Enable Eve examples pull requests by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13708](https://github.com/vercel/turborepo/pull/13708) - feat: Add Eve operator dashboard by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13710](https://github.com/vercel/turborepo/pull/13710) - fix: Remove unsupported sandbox network policy by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13712](https://github.com/vercel/turborepo/pull/13712) - feat: Rotate Eve example maintenance daily by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13715](https://github.com/vercel/turborepo/pull/13715) - fix: Resolve agent lint errors by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13716](https://github.com/vercel/turborepo/pull/13716) - chore: Upgrade TypeScript to 7.0.2 by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13713](https://github.com/vercel/turborepo/pull/13713) - fix(cli): Move EXPERIMENTAL label from ls command to --output flag by [@&#8203;okxint](https://github.com/okxint) in [#&#8203;13709](https://github.com/vercel/turborepo/pull/13709) - fix: Apply nested parent gitignore patterns in manual hashing by [@&#8203;alexey-yunoshev-1](https://github.com/alexey-yunoshev-1) in [#&#8203;13690](https://github.com/vercel/turborepo/pull/13690) - feat: Add pytest task discovery by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13720](https://github.com/vercel/turborepo/pull/13720) - chore: Release Turborepo 2.10.10-canary.3 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13721](https://github.com/vercel/turborepo/pull/13721) - chore: Validate updated examples with turbo by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13723](https://github.com/vercel/turborepo/pull/13723) - chore: Update with-rollup example by [@&#8203;vercel-gh-bot-3](https://github.com/vercel-gh-bot-3)\[bot] in [#&#8203;13718](https://github.com/vercel/turborepo/pull/13718) - feat: Notify Slack when agents open PRs by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13722](https://github.com/vercel/turborepo/pull/13722) - chore: Enforce draft pull requests by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13726](https://github.com/vercel/turborepo/pull/13726) - fix: Expose Slack delivery diagnostics by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13733](https://github.com/vercel/turborepo/pull/13733) - chore: Update non-monorepo example by [@&#8203;vercel-gh-bot-2](https://github.com/vercel-gh-bot-2)\[bot] in [#&#8203;13727](https://github.com/vercel/turborepo/pull/13727) - chore: Update with-rsbuild example by [@&#8203;vercel-gh-bot-3](https://github.com/vercel-gh-bot-3)\[bot] in [#&#8203;13730](https://github.com/vercel/turborepo/pull/13730) - feat: Add daily performance agent by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13729](https://github.com/vercel/turborepo/pull/13729) - feat: Support cross-toolchain repository affectedness by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13737](https://github.com/vercel/turborepo/pull/13737) - fix: Scope musl library dependency installation by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13738](https://github.com/vercel/turborepo/pull/13738) - chore: Release Turbo repository packages 0.0.1-canary.24 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13739](https://github.com/vercel/turborepo/pull/13739) - fix(bun): Preserve overrides objects, trustedDependencies, workspace bins and git integrity through prune; accept lockfileVersion 3 by [@&#8203;Jarred-Sumner](https://github.com/Jarred-Sumner) in [#&#8203;13740](https://github.com/vercel/turborepo/pull/13740) #### New Contributors - [@&#8203;akshat-OwO](https://github.com/akshat-OwO) made their first contribution in [#&#8203;13699](https://github.com/vercel/turborepo/pull/13699) - [@&#8203;okxint](https://github.com/okxint) made their first contribution in [#&#8203;13709](https://github.com/vercel/turborepo/pull/13709) - [@&#8203;alexey-yunoshev-1](https://github.com/alexey-yunoshev-1) made their first contribution in [#&#8203;13690](https://github.com/vercel/turborepo/pull/13690) - [@&#8203;vercel-gh-bot-3](https://github.com/vercel-gh-bot-3)\[bot] made their first contribution in [#&#8203;13718](https://github.com/vercel/turborepo/pull/13718) - [@&#8203;vercel-gh-bot-2](https://github.com/vercel-gh-bot-2)\[bot] made their first contribution in [#&#8203;13727](https://github.com/vercel/turborepo/pull/13727) - [@&#8203;Jarred-Sumner](https://github.com/Jarred-Sumner) made their first contribution in [#&#8203;13740](https://github.com/vercel/turborepo/pull/13740) **Full Changelog**: <https://github.com/vercel/turborepo/compare/v2.10.9...v2.10.10> ### [`v2.10.9`](https://github.com/vercel/turborepo/releases/tag/v2.10.9): Turborepo v2.10.9 [Compare Source](https://github.com/vercel/turborepo/compare/v2.10.8...v2.10.9) <!-- Release notes generated using configuration in .github/release.yml at v2.10.9 --> #### What's Changed ##### Changelog - chore: Release Turborepo 2.10.8 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13626](https://github.com/vercel/turborepo/pull/13626) - perf: Walk literal-prefix tree globs without wax compilation by [@&#8203;charpeni](https://github.com/charpeni) in [#&#8203;13522](https://github.com/vercel/turborepo/pull/13522) - fix: Accept semver ranges in devEngines.packageManager.version by [@&#8203;bangseongbeom](https://github.com/bangseongbeom) in [#&#8203;13623](https://github.com/vercel/turborepo/pull/13623) - docs: Explain affected package invalidation reasons by [@&#8203;ghoullier](https://github.com/ghoullier) in [#&#8203;13594](https://github.com/vercel/turborepo/pull/13594) - perf(lockfiles): Borrow field-name scalars in the pnpm fast parser by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13648](https://github.com/vercel/turborepo/pull/13648) - perf(repository): Avoid discarded alias allocation in Relationship by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13650](https://github.com/vercel/turborepo/pull/13650) - perf(lockfiles): Drop redundant human\_name clone for pnpm v7/v9 by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13649](https://github.com/vercel/turborepo/pull/13649) - perf: Index workspace nodes by name in project\_relationships by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13647](https://github.com/vercel/turborepo/pull/13647) - perf: Share resolution identity lists across identical workspace closures by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13641](https://github.com/vercel/turborepo/pull/13641) - docs: Fix duplicated word in runtime dependencies guide summary by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13630](https://github.com/vercel/turborepo/pull/13630) - refactor: Remove turborepo-lsp dependency on turborepo-lib by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13631](https://github.com/vercel/turborepo/pull/13631) - perf: Index Bun nested lockfile entries by name for fallback resolution by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13633](https://github.com/vercel/turborepo/pull/13633) - perf: Memoize framework inference per package during task hashing by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13634](https://github.com/vercel/turborepo/pull/13634) - perf: Avoid materializing transient declarations in external\_dependencies by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13646](https://github.com/vercel/turborepo/pull/13646) - perf: Enable shared closure DP for npm and yarn1 lockfiles by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13635](https://github.com/vercel/turborepo/pull/13635) - perf: Parse pnpm explicit-key entries in the lockfile fast path by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13640](https://github.com/vercel/turborepo/pull/13640) - perf: Parallelize resolution fingerprint hashing by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13642](https://github.com/vercel/turborepo/pull/13642) - perf: Build resolution identity lists in parallel by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13643](https://github.com/vercel/turborepo/pull/13643) - perf: Intern resolution identities as Arc\<str> across closures by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13645](https://github.com/vercel/turborepo/pull/13645) - fix: Compose affected tasks with package filters by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13656](https://github.com/vercel/turborepo/pull/13656) - docs: Explain worktree cache path isolation by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13657](https://github.com/vercel/turborepo/pull/13657) - fix: Upgrade brace-expansion to 5.0.9 by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13658](https://github.com/vercel/turborepo/pull/13658) - docs: Correct verified inaccuracies in the Turborepo Agent Skill by [@&#8203;charpeni](https://github.com/charpeni) in [#&#8203;13644](https://github.com/vercel/turborepo/pull/13644) - chore: Update Next.js to 16.3.0 by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13659](https://github.com/vercel/turborepo/pull/13659) - fix: Don't use `eprintln!` in the panic hook by [@&#8203;molofsky](https://github.com/molofsky) in [#&#8203;13637](https://github.com/vercel/turborepo/pull/13637) - fix: Invalidate only when Git ignore sources change by [@&#8203;smasato](https://github.com/smasato) in [#&#8203;13632](https://github.com/vercel/turborepo/pull/13632) - docs: Update Geistdocs to 1.19.4 by [@&#8203;christopherkindl](https://github.com/christopherkindl) in [#&#8203;13680](https://github.com/vercel/turborepo/pull/13680) - docs: Exclude Turborepo from its own OSS products menu by [@&#8203;christopherkindl](https://github.com/christopherkindl) in [#&#8203;13681](https://github.com/vercel/turborepo/pull/13681) - docs: Use the geistdocs Turborepo logo in the navbar by [@&#8203;christopherkindl](https://github.com/christopherkindl) in [#&#8203;13682](https://github.com/vercel/turborepo/pull/13682) - docs: Update redirected vercel.com/nextjs.org links to current targets by [@&#8203;molebox](https://github.com/molebox) in [#&#8203;13685](https://github.com/vercel/turborepo/pull/13685) - refactor: Generalize native command arguments by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13664](https://github.com/vercel/turborepo/pull/13664) - refactor: Move native contracts to tasks by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13665](https://github.com/vercel/turborepo/pull/13665) - docs: Fix loadTransformers reference in turbo-codemod README by [@&#8203;latent-9](https://github.com/latent-9) in [#&#8203;13683](https://github.com/vercel/turborepo/pull/13683) - refactor: Model native task execution explicitly by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13666](https://github.com/vercel/turborepo/pull/13666) - feat: Compose aggregate native task dependencies by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13667](https://github.com/vercel/turborepo/pull/13667) - fix: Respect aggregate task overrides by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13668](https://github.com/vercel/turborepo/pull/13668) - test: Stabilize watch task inputs regression test by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13686](https://github.com/vercel/turborepo/pull/13686) - feat: Parse Python quality tool declarations by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13669](https://github.com/vercel/turborepo/pull/13669) - feat: Resolve Python quality plans by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13670](https://github.com/vercel/turborepo/pull/13670) - refactor: Extract uv native task specs by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13671](https://github.com/vercel/turborepo/pull/13671) - feat: Synthesize Python quality tasks by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13672](https://github.com/vercel/turborepo/pull/13672) - test: Cover Python quality task commands by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13673](https://github.com/vercel/turborepo/pull/13673) - feat: Hash Python quality task inputs by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13674](https://github.com/vercel/turborepo/pull/13674) - test: Cover Python quality task graph by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13675](https://github.com/vercel/turborepo/pull/13675) - chore: Release Turborepo 2.10.9-canary.1 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13687](https://github.com/vercel/turborepo/pull/13687) - docs: Document dependency-driven Python tasks by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13676](https://github.com/vercel/turborepo/pull/13676) - fix: Prune Bun wildcard workspace dev dependencies by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13694](https://github.com/vercel/turborepo/pull/13694) - fix: Prevent Windows process cleanup PID reuse by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13695](https://github.com/vercel/turborepo/pull/13695) #### New Contributors - [@&#8203;bangseongbeom](https://github.com/bangseongbeom) made their first contribution in [#&#8203;13623](https://github.com/vercel/turborepo/pull/13623) - [@&#8203;ghoullier](https://github.com/ghoullier) made their first contribution in [#&#8203;13594](https://github.com/vercel/turborepo/pull/13594) - [@&#8203;molofsky](https://github.com/molofsky) made their first contribution in [#&#8203;13637](https://github.com/vercel/turborepo/pull/13637) - [@&#8203;smasato](https://github.com/smasato) made their first contribution in [#&#8203;13632](https://github.com/vercel/turborepo/pull/13632) - [@&#8203;latent-9](https://github.com/latent-9) made their first contribution in [#&#8203;13683](https://github.com/vercel/turborepo/pull/13683) **Full Changelog**: <https://github.com/vercel/turborepo/compare/v2.10.8...v2.10.9> ### [`v2.10.8`](https://github.com/vercel/turborepo/releases/tag/v2.10.8): Turborepo v2.10.8 [Compare Source](https://github.com/vercel/turborepo/compare/v2.10.7...v2.10.8) <!-- Release notes generated using configuration in .github/release.yml at v2.10.8 --> #### What's Changed ##### Changelog - fix: Scroll TUI task list with mouse wheel by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13479](https://github.com/vercel/turborepo/pull/13479) - fix: Make releases resumable by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13486](https://github.com/vercel/turborepo/pull/13486) - refactor: Expose knowledge-backed package scope views by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13456](https://github.com/vercel/turborepo/pull/13456) - chore: Release Turborepo 2.10.7 by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13489](https://github.com/vercel/turborepo/pull/13489) - refactor: Use package knowledge for configuration scopes by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13457](https://github.com/vercel/turborepo/pull/13457) - refactor: Use package knowledge for run scope enumeration by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13458](https://github.com/vercel/turborepo/pull/13458) - release(turborepo): 2.10.8-canary.1 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13490](https://github.com/vercel/turborepo/pull/13490) - refactor: Use package knowledge in repository views by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13459](https://github.com/vercel/turborepo/pull/13459) - refactor: Use package knowledge in package integrations by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13460](https://github.com/vercel/turborepo/pull/13460) - ci: Parallelize environment setup steps by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13491](https://github.com/vercel/turborepo/pull/13491) - release(turborepo): 2.10.8-canary.2 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13492](https://github.com/vercel/turborepo/pull/13492) - refactor: Use package knowledge for task hashing paths by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13461](https://github.com/vercel/turborepo/pull/13461) - refactor: Use package knowledge for run-cache paths by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13462](https://github.com/vercel/turborepo/pull/13462) - refactor: Bind toolchain callbacks to package knowledge by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13463](https://github.com/vercel/turborepo/pull/13463) - refactor: Use package knowledge for microfrontend commands by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13464](https://github.com/vercel/turborepo/pull/13464) - refactor: Use package knowledge for run summaries by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13465](https://github.com/vercel/turborepo/pull/13465) - refactor: Use package knowledge for watcher paths by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13466](https://github.com/vercel/turborepo/pull/13466) - ci: Enable remote cache for types codegen by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13495](https://github.com/vercel/turborepo/pull/13495) - docs: Fix llms.txt links to page markdown routes by [@&#8203;molebox](https://github.com/molebox) in [#&#8203;13497](https://github.com/vercel/turborepo/pull/13497) - refactor: Use package knowledge for prune paths by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13467](https://github.com/vercel/turborepo/pull/13467) - refactor: Use package knowledge in the LSP by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13468](https://github.com/vercel/turborepo/pull/13468) - refactor: Use consistent repository construction by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13469](https://github.com/vercel/turborepo/pull/13469) - refactor: Delete legacy package and scope authority by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13470](https://github.com/vercel/turborepo/pull/13470) - perf: Cache telemetry salt instead of re-reading config on every hash by [@&#8203;charpeni](https://github.com/charpeni) in [#&#8203;13498](https://github.com/vercel/turborepo/pull/13498) - feat: Support Android (Termux) by [@&#8203;gtbuchanan](https://github.com/gtbuchanan) in [#&#8203;12735](https://github.com/vercel/turborepo/pull/12735) - ci: Restore Cargo targets on all test platforms by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13505](https://github.com/vercel/turborepo/pull/13505) - fix: Resolve gitdir for linked worktrees in repo index by [@&#8203;charpeni](https://github.com/charpeni) in [#&#8203;13503](https://github.com/vercel/turborepo/pull/13503) - test: Characterize relationship projections by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13499](https://github.com/vercel/turborepo/pull/13499) - refactor: Produce native relationship observations by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13500](https://github.com/vercel/turborepo/pull/13500) - feat: Resolve GitHub Actions remote base refs behind future flag by [@&#8203;louis-bompart](https://github.com/louis-bompart) in [#&#8203;10732](https://github.com/vercel/turborepo/pull/10732) - refactor: Add core relationship projections by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13502](https://github.com/vercel/turborepo/pull/13502) - refactor: Define external resolution contracts by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13507](https://github.com/vercel/turborepo/pull/13507) - refactor: Move repository tasks into Turbo configuration by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13504](https://github.com/vercel/turborepo/pull/13504) - refactor: Build JavaScript external resolution generations by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13508](https://github.com/vercel/turborepo/pull/13508) - refactor: Contribute Cargo external resolutions by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13509](https://github.com/vercel/turborepo/pull/13509) - refactor: Migrate external declaration consumers by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13511](https://github.com/vercel/turborepo/pull/13511) - ci: Auto-merge release PRs by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13510](https://github.com/vercel/turborepo/pull/13510) - chore: Release Turborepo 2.10.8-canary.3 by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13512](https://github.com/vercel/turborepo/pull/13512) - fix: Use tokenless release review gate by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13513](https://github.com/vercel/turborepo/pull/13513) - refactor: Use resolution fingerprints for task hashes by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13514](https://github.com/vercel/turborepo/pull/13514) - fix: Support fork PRs in review gate by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13516](https://github.com/vercel/turborepo/pull/13516) - refactor: Migrate lockfile affectedness by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13519](https://github.com/vercel/turborepo/pull/13519) - refactor: Migrate external resolution summaries by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13520](https://github.com/vercel/turborepo/pull/13520) - refactor: Migrate external package queries to resolution knowledge by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13523](https://github.com/vercel/turborepo/pull/13523) - fix: Serialize macOS Homebrew setup by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13549](https://github.com/vercel/turborepo/pull/13549) - refactor: Migrate prune lockfile keys to resolution identities by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13524](https://github.com/vercel/turborepo/pull/13524) - refactor: Migrate global hash inputs to resolution knowledge by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13525](https://github.com/vercel/turborepo/pull/13525) - refactor: Delete legacy external-resolution PackageInfo state by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13526](https://github.com/vercel/turborepo/pull/13526) - chore: Release Turborepo 2.10.8-canary.4 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13557](https://github.com/vercel/turborepo/pull/13557) - refactor: Remove external declaration compatibility paths by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13527](https://github.com/vercel/turborepo/pull/13527) - refactor: Produce immutable native task and command knowledge by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13528](https://github.com/vercel/turborepo/pull/13528) - refactor: Migrate native task registration and suggestions by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13529](https://github.com/vercel/turborepo/pull/13529) - refactor: Migrate turbo-json native task synthesis by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13530](https://github.com/vercel/turborepo/pull/13530) - refactor: Migrate persistent and recursive task validation by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13531](https://github.com/vercel/turborepo/pull/13531) - refactor: Migrate native task definition precedence by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13532](https://github.com/vercel/turborepo/pull/13532) - refactor: Migrate engine native command planning by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13533](https://github.com/vercel/turborepo/pull/13533) - refactor: Migrate executor native command resolution by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13534](https://github.com/vercel/turborepo/pull/13534) - refactor: Migrate native task query, devtools, and LSP views by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13535](https://github.com/vercel/turborepo/pull/13535) - refactor: Migrate command summaries and delete legacy task paths by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13536](https://github.com/vercel/turborepo/pull/13536) - refactor: Produce immutable task-contract knowledge by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13537](https://github.com/vercel/turborepo/pull/13537) - refactor: Migrate engine task-contract composition by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13538](https://github.com/vercel/turborepo/pull/13538) - refactor: Migrate hashing engines to task contracts by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13539](https://github.com/vercel/turborepo/pull/13539) - refactor: Exclude JavaScript from toolchain task-I/O dispatch by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13540](https://github.com/vercel/turborepo/pull/13540) - refactor: Migrate change classification to immutable knowledge by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13543](https://github.com/vercel/turborepo/pull/13543) - refactor: Separate prune rendering with golden coverage by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13546](https://github.com/vercel/turborepo/pull/13546) - refactor: Delete JS format interpretation from prune orchestration by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13554](https://github.com/vercel/turborepo/pull/13554) - refactor: Audit remaining JS knowledge consumer reads by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13556](https://github.com/vercel/turborepo/pull/13556) - refactor: Migrate MFE dependency detection off PackageInfo by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13558](https://github.com/vercel/turborepo/pull/13558) - refactor: Remove prune PackageInfo dependencies by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13562](https://github.com/vercel/turborepo/pull/13562) - refactor: Remove residual runtime PackageInfo gates by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13564](https://github.com/vercel/turborepo/pull/13564) - refactor: Migrate boundary diagnostics off PackageInfo by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13571](https://github.com/vercel/turborepo/pull/13571) - docs: Audit Cargo package knowledge by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13572](https://github.com/vercel/turborepo/pull/13572) - refactor: Complete Cargo relationship and resolution knowledge by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13576](https://github.com/vercel/turborepo/pull/13576) - refactor: Port Cargo task and contract knowledge by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13581](https://github.com/vercel/turborepo/pull/13581) - refactor: Port Cargo watch and prune knowledge by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13582](https://github.com/vercel/turborepo/pull/13582) - refactor: Remove runtime toolchain dispatch by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13584](https://github.com/vercel/turborepo/pull/13584) - ci: Restore Cargo target for lockfile tests by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13588](https://github.com/vercel/turborepo/pull/13588) - refactor: Replace toolchains with repository contributors by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13585](https://github.com/vercel/turborepo/pull/13585) - refactor: Remove Cargo contributor plumbing by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13586](https://github.com/vercel/turborepo/pull/13586) - refactor: Remove ToolchainId runtime dispatch by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13587](https://github.com/vercel/turborepo/pull/13587) - refactor: Route task behavior through contract domains by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13589](https://github.com/vercel/turborepo/pull/13589) - refactor: Route package consumers by manifest by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13591](https://github.com/vercel/turborepo/pull/13591) - refactor: Route MFE eligibility by manifest by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13592](https://github.com/vercel/turborepo/pull/13592) - refactor: Project manifest-derived repository facts by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13593](https://github.com/vercel/turborepo/pull/13593) - refactor: Route residual task behavior by capability by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13595](https://github.com/vercel/turborepo/pull/13595) - refactor: Route resolution through explicit domains by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13596](https://github.com/vercel/turborepo/pull/13596) - refactor: Route N-API package listing by manifest by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13597](https://github.com/vercel/turborepo/pull/13597) - docs: Vercel Remote Cache authentication with OIDC policies by [@&#8203;markandrus](https://github.com/markandrus) in [#&#8203;13140](https://github.com/vercel/turborepo/pull/13140) - refactor: Own resolution fingerprints in repository by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13598](https://github.com/vercel/turborepo/pull/13598) - refactor: Fail closed on invalid relationships by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13599](https://github.com/vercel/turborepo/pull/13599) - perf: Reuse Cargo metadata discovery snapshot by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13600](https://github.com/vercel/turborepo/pull/13600) - refactor: Resolve MFE package ownership from graph by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13601](https://github.com/vercel/turborepo/pull/13601) - refactor: Remove retained package payloads by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13603](https://github.com/vercel/turborepo/pull/13603) - feat: Add native Cargo format task by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13606](https://github.com/vercel/turborepo/pull/13606) - refactor: Compose repository graphs for optional toolchains by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13608](https://github.com/vercel/turborepo/pull/13608) - ci: Invalidate Cap'n Proto caches by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13616](https://github.com/vercel/turborepo/pull/13616) - feat: Discover uv workspaces by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13609](https://github.com/vercel/turborepo/pull/13609) - feat: Run native uv tasks by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13610](https://github.com/vercel/turborepo/pull/13610) - feat: Hash uv lockfile closures by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13611](https://github.com/vercel/turborepo/pull/13611) - fix: Make Windows Cap'n Proto cache relocatable by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13621](https://github.com/vercel/turborepo/pull/13621) - feat: Watch uv workspace changes by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13612](https://github.com/vercel/turborepo/pull/13612) - feat: Prune uv workspaces by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13613](https://github.com/vercel/turborepo/pull/13613) - fix: Fall back to polling on macOS by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13622](https://github.com/vercel/turborepo/pull/13622) - test: Add uv workspace integration coverage by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13602](https://github.com/vercel/turborepo/pull/13602) #### New Contributors - [@&#8203;gtbuchanan](https://github.com/gtbuchanan) made their first contribution in [#&#8203;12735](https://github.com/vercel/turborepo/pull/12735) **Full Changelog**: <https://github.com/vercel/turborepo/compare/v2.10.7...v2.10.8> ### [`v2.10.7`](https://github.com/vercel/turborepo/releases/tag/v2.10.7): Turborepo v2.10.7 [Compare Source](https://github.com/vercel/turborepo/compare/v2.10.6...v2.10.7) <!-- Release notes generated using configuration in .github/release.yml at be76f17100093bd5275fad4c0e2d76ad15e88d70 --> #### What's Changed ##### Changelog - release(turborepo): 2.10.6 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13431](https://github.com/vercel/turborepo/pull/13431) - chore: Refine bug report template help section by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13433](https://github.com/vercel/turborepo/pull/13433) - fix: Verify version after attempting codemod upgrade by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13446](https://github.com/vercel/turborepo/pull/13446) - test: Characterize JavaScript package discovery by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13440](https://github.com/vercel/turborepo/pull/13440) - refactor: Separate package graph node assembly by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13441](https://github.com/vercel/turborepo/pull/13441) - fix: Upgrade [@&#8203;vercel/connect](https://github.com/vercel/connect) by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13450](https://github.com/vercel/turborepo/pull/13450) - refactor: Add authoritative package knowledge by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13442](https://github.com/vercel/turborepo/pull/13442) - feat: Select runnable task entrypoints by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13452](https://github.com/vercel/turborepo/pull/13452) - refactor: Add workspace root contribution contract by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13447](https://github.com/vercel/turborepo/pull/13447) - refactor: Use package knowledge for scope selection by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13443](https://github.com/vercel/turborepo/pull/13443) - fix: Prevent mobile homepage overflow by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13453](https://github.com/vercel/turborepo/pull/13453) - docs: Document service readiness probes by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13472](https://github.com/vercel/turborepo/pull/13472) - fix: Preserve pnpm root dependencies during prune by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13476](https://github.com/vercel/turborepo/pull/13476) - fix: Preserve pnpm aliased dependencies during prune by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13477](https://github.com/vercel/turborepo/pull/13477) - release(turborepo): 2.10.7-canary.1 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13478](https://github.com/vercel/turborepo/pull/13478) - test: Add Terminal UI sanity tests by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13475](https://github.com/vercel/turborepo/pull/13475) - chore: Upgrade Next.js by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13482](https://github.com/vercel/turborepo/pull/13482) - chore: Upgrade brace-expansion by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13483](https://github.com/vercel/turborepo/pull/13483) - fix: Support multiple macOS file watch roots by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13484](https://github.com/vercel/turborepo/pull/13484) **Full Changelog**: <https://github.com/vercel/turborepo/compare/v2.10.6...v2.10.7> ### [`v2.10.6`](https://github.com/vercel/turborepo/releases/tag/v2.10.6): Turborepo v2.10.6 [Compare Source](https://github.com/vercel/turborepo/compare/v2.10.5...v2.10.6) <!-- Release notes generated using configuration in .github/release.yml at v2.10.6 --> #### What's Changed ##### Changelog - release(turborepo): 2.10.5 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13368](https://github.com/vercel/turborepo/pull/13368) - fix: Disable unresolved Cargo artifact caching by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13362](https://github.com/vercel/turborepo/pull/13362) - fix: Surface create-turbo Git failures by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13371](https://github.com/vercel/turborepo/pull/13371) - fix: Resolve exact cargo profile outputs by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13366](https://github.com/vercel/turborepo/pull/13366) - fix: Prune Bun production workspace dev dependencies by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13369](https://github.com/vercel/turborepo/pull/13369) - fix: Resolve Cargo target output layouts by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13370](https://github.com/vercel/turborepo/pull/13370) - release(turborepo): 2.10.6-canary.1 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13374](https://github.com/vercel/turborepo/pull/13374) - fix: Preserve Yarn Babel extension during pruning by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13373](https://github.com/vercel/turborepo/pull/13373) - feat: Support Cargo-only repos by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13378](https://github.com/vercel/turborepo/pull/13378) - fix: Preserve colors in TUI output by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13381](https://github.com/vercel/turborepo/pull/13381) - feat: Infer Cargo workspace tasks by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13380](https://github.com/vercel/turborepo/pull/13380) - fix: Retain shutdown signals for force exit by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13382](https://github.com/vercel/turborepo/pull/13382) - release(turborepo): 2.10.6-canary.2 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13383](https://github.com/vercel/turborepo/pull/13383) - fix: Resolve weekly security audit vulnerabilities by [@&#8203;cursor](https://github.com/cursor)\[bot] in [#&#8203;13358](https://github.com/vercel/turborepo/pull/13358) - chore: Update to Rust 1.97.0 by [@&#8203;ognevny](https://github.com/ognevny) in [#&#8203;13322](https://github.com/vercel/turborepo/pull/13322) - fix: Pin VS Code extension macOS runners by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13391](https://github.com/vercel/turborepo/pull/13391) - release(turborepo): 2.10.6-canary.3 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13392](https://github.com/vercel/turborepo/pull/13392) - docs: Add Experimental Rust Guide by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13375](https://github.com/vercel/turborepo/pull/13375) - ci: Use affected filtering for JS tests by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13386](https://github.com/vercel/turborepo/pull/13386) - ci: Fold docs checks into quality by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13385](https://github.com/vercel/turborepo/pull/13385) - ci: Verify schemas through Turborepo by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13387](https://github.com/vercel/turborepo/pull/13387) - chore: Avoid duplicate N-API Cargo build by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13388](https://github.com/vercel/turborepo/pull/13388) - chore: Hash embedded frameworks data in Rust builds by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13389](https://github.com/vercel/turborepo/pull/13389) - ci: Include VS Code extension type checks by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13390](https://github.com/vercel/turborepo/pull/13390) - refactor: Run releaser bundle directly by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13393](https://github.com/vercel/turborepo/pull/13393) - refactor: Move release publishing into releaser by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13394](https://github.com/vercel/turborepo/pull/13394) - refactor: Consolidate release orchestration by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13395](https://github.com/vercel/turborepo/pull/13395) - feat: Add crate-scoped Cargo verification tasks by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13398](https://github.com/vercel/turborepo/pull/13398) - ci: Fetch release commit parent by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13400](https://github.com/vercel/turborepo/pull/13400) - docs: Update Geistdocs to 1.13.0 by [@&#8203;molebox](https://github.com/molebox) in [#&#8203;13412](https://github.com/vercel/turborepo/pull/13412) - release(turborepo): 2.10.6-canary.4 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13401](https://github.com/vercel/turborepo/pull/13401) - fix: Preserve pnpm `node@runtime:` lockfile entries by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13408](https://github.com/vercel/turborepo/pull/13408) - chore: Fix typos in with-solid example and globwatch comment by [@&#8203;tajo](https://github.com/tajo) in [#&#8203;13416](https://github.com/vercel/turborepo/pull/13416) - refactor: Remove unused public APIs found by Hawk by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13420](https://github.com/vercel/turborepo/pull/13420) - fix: Check dynamic imports in boundaries by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13418](https://github.com/vercel/turborepo/pull/13418) - refactor: Use regex! for static pattern compilation by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13419](https://github.com/vercel/turborepo/pull/13419) - fix: Refactor `turbo watch` by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13423](https://github.com/vercel/turborepo/pull/13423) - release(turborepo): 2.10.6-canary.5 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13424](https://github.com/vercel/turborepo/pull/13424) - chore: Upgrade brace-expansion by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13429](https://github.com/vercel/turborepo/pull/13429) - chore: Update tar to 7.5.18 by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13428](https://github.com/vercel/turborepo/pull/13428) - chore: Upgrade js-yaml by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13427](https://github.com/vercel/turborepo/pull/13427) - fix: Match JIT inputs for affected tasks by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13426](https://github.com/vercel/turborepo/pull/13426) - fix: Preserve project Yarn package extensions by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13425](https://github.com/vercel/turborepo/pull/13425) #### New Contributors - [@&#8203;tajo](https://github.com/tajo) made their first contribution in [#&#8203;13416](https://github.com/vercel/turborepo/pull/13416) **Full Changelog**: <https://github.com/vercel/turborepo/compare/v2.10.5...v2.10.6> ### [`v2.10.5`](https://github.com/vercel/turborepo/releases/tag/v2.10.5): Turborepo v2.10.5 [Compare Source](https://github.com/vercel/turborepo/compare/v2.10.4...v2.10.5) <!-- Release notes generated using configuration in .github/release.yml at v2.10.5 --> #### What's Changed ##### Changelog - perf: Evaluate simple include globs without wax compilation by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13285](https://github.com/vercel/turborepo/pull/13285) - chore: Dogfood native Cargo support in this repository by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13283](https://github.com/vercel/turborepo/pull/13283) - release(turborepo): 2.10.4 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13286](https://github.com/vercel/turborepo/pull/13286) - ci: Remove dead sccache configuration by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13289](https://github.com/vercel/turborepo/pull/13289) - feat: Serve the Remote Cache as an sccache backend for Cargo tasks by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13288](https://github.com/vercel/turborepo/pull/13288) - fix: Reject output path traversal by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13290](https://github.com/vercel/turborepo/pull/13290) - fix: Disable the sccache proxy when remote cache use is off by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13291](https://github.com/vercel/turborepo/pull/13291) - feat: Embed sccache so the Cargo compile cache needs no installation by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13293](https://github.com/vercel/turborepo/pull/13293) - release(turborepo): 2.10.5-canary.1 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13294](https://github.com/vercel/turborepo/pull/13294) - fix: Pin a flag-aware turbo canary for the eve-agent deployment by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13295](https://github.com/vercel/turborepo/pull/13295) - fix: Make the sccache compile cache actually cache by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13296](https://github.com/vercel/turborepo/pull/13296) - release(turborepo): 2.10.5-canary.2 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13297](https://github.com/vercel/turborepo/pull/13297) - fix: Stop ambient CARGO\_INCREMENTAL from suppressing compile cache injection by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13298](https://github.com/vercel/turborepo/pull/13298) - fix: Never let compile cache storage failures fail the build by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13299](https://github.com/vercel/turborepo/pull/13299) - test: Add outputs path-traversal negative-case regression tests by [@&#8203;dnukumamras](https://github.com/dnukumamras) in [#&#8203;13300](https://github.com/vercel/turborepo/pull/13300) - release(turborepo): 2.10.5-canary.3 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13302](https://github.com/vercel/turborepo/pull/13302) - ci: Authenticate to Remote Cache via OIDC token exchange by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13303](https://github.com/vercel/turborepo/pull/13303) - fix: Keep pnpm patches with version range keys during prune by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13307](https://github.com/vercel/turborepo/pull/13307) - test: Scrub ambient turbo configuration from integration test children by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13306](https://github.com/vercel/turborepo/pull/13306) - fix: Show toolchain tasks in the TUI and never run in silence by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13308](https://github.com/vercel/turborepo/pull/13308) - ci: Fix change detection on push events by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13304](https://github.com/vercel/turborepo/pull/13304) - refactor: Rename the Cargo toolchain id to rust by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13311](https://github.com/vercel/turborepo/pull/13311) - fix: Remove extraneous bun.lock entries during prune by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13317](https://github.com/vercel/turborepo/pull/13317) - feat: Require a user-declared name for the Cargo workspace package by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13312](https://github.com/vercel/turborepo/pull/13312) - feat: Parse and validate the task command field by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13313](https://github.com/vercel/turborepo/pull/13313) - chore: Harden turbo-vsc to invoke turbo without a shell by [@&#8203;dnukumamras](https://github.com/dnukumamras) in [#&#8203;13319](https://github.com/vercel/turborepo/pull/13319) - feat: Resolve and execute task command overrides by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13315](https://github.com/vercel/turborepo/pull/13315) - release(turborepo): 2.10.5-canary.4 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13325](https://github.com/vercel/turborepo/pull/13325) - feat: Run the Rust workspace tests through nextest via command override by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13316](https://github.com/vercel/turborepo/pull/13316) - feat: Engage the Remote Cache and sccache compile cache for Rust CI by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13292](https://github.com/vercel/turborepo/pull/13292) - ci: Pin GitHub Actions to full commit SHAs by [@&#8203;XananasX7](https://github.com/XananasX7) in [#&#8203;13143](https://github.com/vercel/turborepo/pull/13143) - fix: Make npm prune rehoisting deterministic and complete by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13323](https://github.com/vercel/turborepo/pull/13323) - feat: Report incremental cache reuse in the run summary by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13327](https://github.com/vercel/turborepo/pull/13327) - chore: Remove planning docs by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13329](https://github.com/vercel/turborepo/pull/13329) - docs: Migrate docs site to [@&#8203;vercel/geistdocs](https://github.com/vercel/geistdocs) package by [@&#8203;molebox](https://github.com/molebox) in [#&#8203;13320](https://github.com/vercel/turborepo/pull/13320) - ci: Update Remote Cache action by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13330](https://github.com/vercel/turborepo/pull/13330) - release(turborepo): 2.10.5-canary.5 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13331](https://github.com/vercel/turborepo/pull/13331) - ci: Remove path-based workflow scheduling by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13332](https://github.com/vercel/turborepo/pull/13332) - fix: Resolve EADDRINUSE in kitchen-sink api dev script by [@&#8203;ashusnapx](https://github.com/ashusnapx) in [#&#8203;13328](https://github.com/vercel/turborepo/pull/13328) - ci: Disable telemetry messages in workflows by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13334](https://github.com/vercel/turborepo/pull/13334) - fix: Prevent Cargo run tasks from being cached by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13335](https://github.com/vercel/turborepo/pull/13335) - fix: Isolate Cargo cache by host platform by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13337](https://github.com/vercel/turborepo/pull/13337) - fix: Continue TUI text selection beyond viewport by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13338](https://github.com/vercel/turborepo/pull/13338) - ci: Dogfood Cargo target restoration by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13336](https://github.com/vercel/turborepo/pull/13336) - fix: Require current Cargo lockfiles for caching by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13339](https://github.com/vercel/turborepo/pull/13339) - fix: Reject unsupported Cargo local packages by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13340](https://github.com/vercel/turborepo/pull/13340) - fix: Allow outputs outside package roots by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13342](https://github.com/vercel/turborepo/pull/13342) - fix: Resolve Cargo lock dependencies by source by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13343](https://github.com/vercel/turborepo/pull/13343) - docs: Update Cargo workspace support by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13349](https://github.com/vercel/turborepo/pull/13349) - fix: Build Ghostty for baseline CPUs by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13352](https://github.com/vercel/turborepo/pull/13352) - fix: Preserve watch rerun semantics for task inputs by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13351](https://github.com/vercel/turborepo/pull/13351) - fix: Isolate Command Overrides From Toolchain Cache I/O by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13354](https://github.com/vercel/turborepo/pull/13354) - release(turborepo): 2.10.5-canary.6 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13355](https://github.com/vercel/turborepo/pull/13355) - fix: Include patched Ghostty crate in Cargo workspace by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13357](https://github.com/vercel/turborepo/pull/13357) - ci: Shard Rust tests across runners by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13356](https://github.com/vercel/turborepo/pull/13356) - fix: Hash Cargo build environment inputs by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13348](https://github.com/vercel/turborepo/pull/13348) - fix: Synchronize Cargo prune Docker lockfile by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13350](https://github.com/vercel/turborepo/pull/13350) - chore: Update agents app Eve dependency by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13364](https://github.com/vercel/turborepo/pull/13364) - fix: Preserve Yarn package extension ranges when pruning by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13363](https://github.com/vercel/turborepo/pull/13363) - refactor: Add `Toolchain` output availability by [@&#8203;anthonyshew](https://github.com/anthonyshew) in [#&#8203;13360](https://github.com/vercel/turborepo/pull/13360) #### New Contributors - [@&#8203;dnukumamras](https://github.com/dnukumamras) made their first contribution in [#&#8203;13300](https://github.com/vercel/turborepo/pull/13300) - [@&#8203;XananasX7](https://github.com/XananasX7) made their first contribution in [#&#8203;13143](https://github.com/vercel/turborepo/pull/13143) - [@&#8203;ashusnapx](https://github.com/ashusnapx) made their first contribution in [#&#8203;13328](https://github.com/vercel/turborepo/pull/13328) **Full Changelog**: <https://github.com/vercel/turborepo/compare/v2.10.4...v2.10.5> </details> <details> <summary>typescript-eslint/typescript-eslint (typescript-eslint)</summary> ### [`v8.67.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/typescript-eslint/CHANGELOG.md#8670-2026-08-10) [Compare Source](https://github.com/typescript-eslint/typescript-eslint/compare/v8.66.0...v8.67.0) ##### 🚀 Features - **typescript-eslint:** export basic globs for using tseslint ([#&#8203;12105](https://github.com/typescript-eslint/typescript-eslint/pull/12105)) ##### ❤️ Thank You - Claude Sonnet 5 - Evyatar Daud [@&#8203;StyleShit](https://github.com/StyleShit) - Josh Goldberg - Josh Goldberg ✨ - Kirk Waiblinger [@&#8203;kirkwaiblinger](https://github.com/kirkwaiblinger) See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.67.0) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. ### [`v8.66.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/typescript-eslint/CHANGELOG.md#8660-2026-08-03) [Compare Source](https://github.com/typescript-eslint/typescript-eslint/compare/v8.65.0...v8.66.0) This was a version bump only for typescript-eslint to align it with other projects, there were no code changes. See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.66.0) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. ### [`v8.65.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/typescript-eslint/CHANGELOG.md#8650-2026-07-20) [Compare Source](https://github.com/typescript-eslint/typescript-eslint/compare/v8.64.0...v8.65.0) ##### 🚀 Features - add warning when TS 7 is detected ([#&#8203;12529](https://github.com/typescript-eslint/typescript-eslint/pull/12529)) ##### ❤️ Thank You - Josh Goldberg ✨ - Kirk Waiblinger [@&#8203;kirkwaiblinger](https://github.com/kirkwaiblinger) See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.65.0) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. ### [`v8.64.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/typescript-eslint/CHANGELOG.md#8640-2026-07-13) [Compare Source](https://github.com/typescript-eslint/typescript-eslint/compare/v8.63.0...v8.64.0) This was a version bump only for typescript-eslint to align it with other projects, there were no code changes. See [GitHub Releases](https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.64.0) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. </details> --- ### Configuration 📅 **Schedule**: (in timezone Europe/Copenhagen) - Branch creation - "before 6am on monday" - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yODUuMiIsInVwZGF0ZWRJblZlciI6IjQzLjI4NS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiXX0=-->
chore(deps): Update development
Some checks failed
CD Staging / Build & Push Docker Images (pull_request) Has been skipped
CD Staging / Build & Push Docker Images-1 (pull_request) Has been skipped
CD Staging / Deploy Staging (pull_request) Has been skipped
CD Staging / Deploy PR Preview (pull_request) Has been skipped
CD Staging / Tear Down PR Preview (pull_request) Has been skipped
renovate/stability-days Updates have met minimum release age requirement
CI / Security Scan (pull_request) Successful in 1m6s
CI / Dockerfile Package Check (pull_request) Successful in 1m30s
CI / Checks (pull_request) Failing after 6m18s
CI / E2E Tests (pull_request) Has been skipped
CI / Visual Tests (pull_request) Successful in 2m25s
CI / Journal Image Smoke Test (pull_request) Successful in 26m36s
90b8abd40c
renovate force-pushed renovate/development from 90b8abd40c
Some checks failed
CD Staging / Build & Push Docker Images (pull_request) Has been skipped
CD Staging / Build & Push Docker Images-1 (pull_request) Has been skipped
CD Staging / Deploy Staging (pull_request) Has been skipped
CD Staging / Deploy PR Preview (pull_request) Has been skipped
CD Staging / Tear Down PR Preview (pull_request) Has been skipped
renovate/stability-days Updates have met minimum release age requirement
CI / Security Scan (pull_request) Successful in 1m6s
CI / Dockerfile Package Check (pull_request) Successful in 1m30s
CI / Checks (pull_request) Failing after 6m18s
CI / E2E Tests (pull_request) Has been skipped
CI / Visual Tests (pull_request) Successful in 2m25s
CI / Journal Image Smoke Test (pull_request) Successful in 26m36s
to e52c198e5b
Some checks failed
CD Staging / Build & Push Docker Images (pull_request) Has been skipped
CD Staging / Build & Push Docker Images-1 (pull_request) Has been skipped
CD Staging / Deploy Staging (pull_request) Has been skipped
CD Staging / Deploy PR Preview (pull_request) Has been skipped
CD Staging / Tear Down PR Preview (pull_request) Has been skipped
renovate/stability-days Updates have met minimum release age requirement
CI / Dockerfile Package Check (pull_request) Successful in 35s
CI / Security Scan (pull_request) Successful in 1m31s
CI / Visual Tests (pull_request) Successful in 3m24s
CI / Checks (pull_request) Failing after 6m30s
CI / E2E Tests (pull_request) Has been skipped
CI / Journal Image Smoke Test (pull_request) Successful in 18m10s
2026-08-20 01:55:21 +00:00
Compare
renovate force-pushed renovate/development from e52c198e5b
Some checks failed
CD Staging / Build & Push Docker Images (pull_request) Has been skipped
CD Staging / Build & Push Docker Images-1 (pull_request) Has been skipped
CD Staging / Deploy Staging (pull_request) Has been skipped
CD Staging / Deploy PR Preview (pull_request) Has been skipped
CD Staging / Tear Down PR Preview (pull_request) Has been skipped
renovate/stability-days Updates have met minimum release age requirement
CI / Dockerfile Package Check (pull_request) Successful in 35s
CI / Security Scan (pull_request) Successful in 1m31s
CI / Visual Tests (pull_request) Successful in 3m24s
CI / Checks (pull_request) Failing after 6m30s
CI / E2E Tests (pull_request) Has been skipped
CI / Journal Image Smoke Test (pull_request) Successful in 18m10s
to a8900aa2d8
Some checks failed
CD Staging / Build & Push Docker Images (pull_request) Has been skipped
CD Staging / Build & Push Docker Images-1 (pull_request) Has been skipped
CD Staging / Deploy Staging (pull_request) Has been skipped
CD Staging / Deploy PR Preview (pull_request) Has been skipped
CD Staging / Tear Down PR Preview (pull_request) Has been skipped
renovate/stability-days Updates have met minimum release age requirement
CI / Security Scan (pull_request) Successful in 1m23s
CI / Dockerfile Package Check (pull_request) Successful in 39s
CI / Visual Tests (pull_request) Successful in 4m10s
CI / Checks (pull_request) Failing after 4m53s
CI / E2E Tests (pull_request) Has been skipped
CI / Journal Image Smoke Test (pull_request) Successful in 7m30s
2026-08-20 09:06:32 +00:00
Compare
renovate force-pushed renovate/development from a8900aa2d8
Some checks failed
CD Staging / Build & Push Docker Images (pull_request) Has been skipped
CD Staging / Build & Push Docker Images-1 (pull_request) Has been skipped
CD Staging / Deploy Staging (pull_request) Has been skipped
CD Staging / Deploy PR Preview (pull_request) Has been skipped
CD Staging / Tear Down PR Preview (pull_request) Has been skipped
renovate/stability-days Updates have met minimum release age requirement
CI / Security Scan (pull_request) Successful in 1m23s
CI / Dockerfile Package Check (pull_request) Successful in 39s
CI / Visual Tests (pull_request) Successful in 4m10s
CI / Checks (pull_request) Failing after 4m53s
CI / E2E Tests (pull_request) Has been skipped
CI / Journal Image Smoke Test (pull_request) Successful in 7m30s
to 6e7cf16f71
Some checks failed
CD Staging / Build & Push Docker Images (pull_request) Has been skipped
CD Staging / Build & Push Docker Images-1 (pull_request) Has been skipped
CD Staging / Deploy Staging (pull_request) Has been skipped
CD Staging / Deploy PR Preview (pull_request) Has been skipped
CD Staging / Tear Down PR Preview (pull_request) Has been skipped
renovate/stability-days Updates have met minimum release age requirement
CI / Security Scan (pull_request) Successful in 1m12s
CI / Dockerfile Package Check (pull_request) Successful in 37s
CI / Visual Tests (pull_request) Successful in 6m13s
CI / Checks (pull_request) Failing after 6m19s
CI / E2E Tests (pull_request) Has been skipped
CI / Journal Image Smoke Test (pull_request) Successful in 23m23s
2026-08-20 16:32:28 +00:00
Compare
renovate force-pushed renovate/development from 6e7cf16f71
Some checks failed
CD Staging / Build & Push Docker Images (pull_request) Has been skipped
CD Staging / Build & Push Docker Images-1 (pull_request) Has been skipped
CD Staging / Deploy Staging (pull_request) Has been skipped
CD Staging / Deploy PR Preview (pull_request) Has been skipped
CD Staging / Tear Down PR Preview (pull_request) Has been skipped
renovate/stability-days Updates have met minimum release age requirement
CI / Security Scan (pull_request) Successful in 1m12s
CI / Dockerfile Package Check (pull_request) Successful in 37s
CI / Visual Tests (pull_request) Successful in 6m13s
CI / Checks (pull_request) Failing after 6m19s
CI / E2E Tests (pull_request) Has been skipped
CI / Journal Image Smoke Test (pull_request) Successful in 23m23s
to f36de20ecb
Some checks failed
CD Staging / Build & Push Docker Images (pull_request) Has been skipped
CD Staging / Build & Push Docker Images-1 (pull_request) Has been skipped
CD Staging / Deploy Staging (pull_request) Has been skipped
CD Staging / Deploy PR Preview (pull_request) Has been skipped
CD Staging / Tear Down PR Preview (pull_request) Has been skipped
renovate/stability-days Updates have met minimum release age requirement
CI / Security Scan (pull_request) Successful in 1m3s
CI / Dockerfile Package Check (pull_request) Successful in 40s
CI / Visual Tests (pull_request) Successful in 2m53s
CI / Checks (pull_request) Failing after 8m0s
CI / E2E Tests (pull_request) Has been skipped
CI / Journal Image Smoke Test (pull_request) Successful in 12m51s
2026-08-21 18:05:13 +00:00
Compare
ullrich force-pushed renovate/development from f36de20ecb
Some checks failed
CD Staging / Build & Push Docker Images (pull_request) Has been skipped
CD Staging / Build & Push Docker Images-1 (pull_request) Has been skipped
CD Staging / Deploy Staging (pull_request) Has been skipped
CD Staging / Deploy PR Preview (pull_request) Has been skipped
CD Staging / Tear Down PR Preview (pull_request) Has been skipped
renovate/stability-days Updates have met minimum release age requirement
CI / Security Scan (pull_request) Successful in 1m3s
CI / Dockerfile Package Check (pull_request) Successful in 40s
CI / Visual Tests (pull_request) Successful in 2m53s
CI / Checks (pull_request) Failing after 8m0s
CI / E2E Tests (pull_request) Has been skipped
CI / Journal Image Smoke Test (pull_request) Successful in 12m51s
to c1ee58e13b
Some checks failed
CD Staging / Build & Push Docker Images (pull_request) Has been skipped
CD Staging / Build & Push Docker Images-1 (pull_request) Has been skipped
CD Staging / Deploy Staging (pull_request) Has been skipped
CD Staging / Deploy PR Preview (pull_request) Has been skipped
CI / Security Scan (pull_request) Successful in 44s
CI / Dockerfile Package Check (pull_request) Successful in 15s
CI / Checks (pull_request) Failing after 5m0s
CI / E2E Tests (pull_request) Has been skipped
CI / Visual Tests (pull_request) Successful in 2m13s
CI / Journal Image Smoke Test (pull_request) Successful in 14m54s
Cancel superseded CI / Cancel in-flight CI (pull_request) Successful in 19s
CD Staging / Tear Down PR Preview (pull_request) Successful in 25s
2026-08-22 10:03:18 +00:00
Compare
Author
Collaborator

Edited/Blocked Notification

Renovate will not automatically rebase this PR, because it does not recognize the last commit author and assumes somebody else may have edited the PR.

You can manually request rebase by checking the rebase/retry box above.

⚠️ Warning: custom changes will be lost.

### Edited/Blocked Notification Renovate will not automatically rebase this PR, because it does not recognize the last commit author and assumes somebody else may have edited the PR. You can manually request rebase by checking the rebase/retry box above. ⚠️ **Warning**: custom changes will be lost.
Owner

Superseded by #95, which rebuilds these bumps against current main.

#86 was conflicted and proposed openspec 1.9.0, already superseded by 1.10.0 in #94. Rather than resolve its lockfile by hand — the manoeuvre that made #66 silently revert three merged PRs — #95 re-resolves from scratch and verifies no package regresses against main (29 upgrades, 0 downgrades).

Excluded from #95 and left for Renovate: the catalog-managed react/@types/react-dom entries (overrides pins them to catalog:, and editing catalog entries under an override breaks CI=true pnpm install), the majors typescript 6→7 and fit-file-parser 4→5, and anything in the testing-tooling group.

Superseded by #95, which rebuilds these bumps against current main. #86 was conflicted and proposed openspec 1.9.0, already superseded by 1.10.0 in #94. Rather than resolve its lockfile by hand — the manoeuvre that made #66 silently revert three merged PRs — #95 re-resolves from scratch and verifies no package regresses against main (29 upgrades, 0 downgrades). Excluded from #95 and left for Renovate: the catalog-managed react/@types/react-dom entries (`overrides` pins them to `catalog:`, and editing catalog entries under an override breaks `CI=true pnpm install`), the majors typescript 6→7 and fit-file-parser 4→5, and anything in the testing-tooling group.
ullrich closed this pull request 2026-08-24 14:35:23 +00:00
Some checks failed
CD Staging / Build & Push Docker Images (pull_request) Has been skipped
CD Staging / Build & Push Docker Images-1 (pull_request) Has been skipped
CD Staging / Deploy Staging (pull_request) Has been skipped
CD Staging / Deploy PR Preview (pull_request) Has been skipped
CI / Security Scan (pull_request) Successful in 44s
Required
Details
CI / Dockerfile Package Check (pull_request) Successful in 15s
Required
Details
CI / Checks (pull_request) Failing after 5m0s
Required
Details
CI / E2E Tests (pull_request) Has been skipped
Required
Details
CI / Visual Tests (pull_request) Successful in 2m13s
Required
Details
CI / Journal Image Smoke Test (pull_request) Successful in 14m54s
Required
Details
Cancel superseded CI / Cancel in-flight CI (pull_request) Successful in 19s
CD Staging / Tear Down PR Preview (pull_request) Successful in 25s

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
trails-cool/trails!86
No description provided.