chore(deps): Update development #86
No reviewers
Labels
No labels
dependencies
major
security-pin
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
trails-cool/trails!86
Loading…
Reference in a new issue
No description provided.
Delete branch "renovate/development"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
This PR contains the following updates:
1.6.0→1.9.01.9.21→1.9.2210.7.0→10.8.130.0.0→30.0.13.9.5→3.9.617.0.9→17.0.1119.2.7→19.2.82.10.4→2.10.118.63.0→8.67.0Release Notes
Fission-AI/OpenSpec (@fission-ai/openspec)
v1.9.0Compare Source
Minor Changes
#1622
59c16a4Thanks @clay-good! - ### New Featuresopenspec initgenerates 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
42d7f67Thanks @Angelthebestone! - ### New Featuresopenspec initnow 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
83be9d1Thanks @clay-good! - Addopenspec validate --archived: an opt-in check that every change underchanges/archive/has all of itstasks.mdcheckboxes 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 existingvalidateinvocation and does not re-validate already-applied spec deltas.Patch Changes
#1530
bf5099eThanks @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:applyskill 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
9ae75c8Thanks @clay-good! -openspec archiveno 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--yesbehave as before, and interactive terminals are unchanged. Fixes #1526.#1528
9425897Thanks @Marzx13! - Canonicalize rebuilt specs to end with exactly one final LF. Previously a spec whose## Requirementssection 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
610b78fThanks @clay-good! - Preserve the blank lines around a spec's## Requirementsheading when syncing a delta.openspec archiverebuiltopenspec/specs/<capability>/spec.mdby 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
610b78fThanks @clay-good! -openspec validate --allandopenspec list --jsonno 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) andlistnow require an existing root (theopenspec/project.mdfallback for legacy projects is kept), while direct validation and other intentional implicit-root workflows are unchanged. Thanks @clay-good! (#1612)#1640
610b78fThanks @clay-good! - Label theupdateworkflow in theopenspec configworkflow picker. The checklist had friendly labels for 11 of the 12 workflows but was missingupdate, 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
610b78fThanks @clay-good! -openspec schema forknow preserves the source schema's YAML formatting. Renaming a forkedschema.yamlround-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
610b78fThanks @clay-good! -openspec schemasnow resolves through the canonical OpenSpec root-selection precedence instead of always reading from the current directory. It accepts--store <id>, rejects--store-pathlike 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
610b78fThanks @clay-good! -openspec validatenow warns on ambiguous task numbering inspec-drivenchanges: 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
07dea6eThanks @clay-good! - ### Bug Fixesagentstarget —openspec updateno longer overwrites an existing.agentsskills tree (and its ownership marker) when Codex is detected only from leftover global~/.codex/prompts. Because Codex and the vendor-neutralagentstarget share.agents/skills, a project that used theagentstarget could have its generic skills silently rewritten with Codex-specific syntax and its target flipped to Codex on the nextupdate --force. The legacy-upgrade path now respects the established owner of a shared skills directory, matching the one-writer ruleopenspec initalready 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.agentstree yet) is unaffected.#1521
c751b3dThanks @clay-good! - ### Bug Fixesopenspec validateandopenspec archivenow 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 aMODIFIEDrequirement 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 optionalScenario:prefix and a CommonMark closing#run are ignored), so simply relabeling a scenario is not mistaken for dropping one.#1610
17581c1Thanks @clay-good! - ### Bug Fixesopenspec initnow 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
804427bThanks @clay-good! - Suppress the first-run telemetry disclosure notice when--jsonis used. On afirst-ever run the notice was written to stdout and could break
--jsonconsumers; it is now deferred to the first later non-JSON run, keeping
--jsonoutput valid while still guaranteeing the disclosure.
v1.8.0Compare Source
Minor Changes
#1303
1aa0f2aThanks @solanab! - Add the vendor-neutralagentstarget:openspec init --tools agentsinstalls 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. Becauseagentsis now a real target,--tools allincludes it and creates.agents/skills/where it previously did not.#1274
7a4a745Thanks @NicoAvanzDev! - Generate GitHub Copilot coding agent setup and custom agent files duringopenspec initand keep them synchronized duringopenspec update.#1214
161f945Thanks @showms! - Add MiniMax Code as a global skills-only tool target.#1518
568e56cThanks @clay-good! - ### New Featuresopenspec init --tools rovodevinstalls 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
.agentsdirectory —openspec initandopenspec updateinstall Codex skills under.agents/skills/(the canonical location assistants read) and migrate an existing.codexskills directory in place. Files you customized are preserved, not overwritten.openspec statusseparates planning from implementation — status now reportsisPlanningComplete(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.isCompleteis kept as a compatibility alias, so existing scripts keep working.#1517
73207a6Thanks @clay-good! - Make GitHub Copilot cloud coding-agent files opt-in. Selecting thegithub-copilottool no longer silently writes a GitHub Actions workflow into.github/;openspec initnow asks first (default No) and remembers the choice inopenspec/config.yaml(githubCopilot.cloudAgent). Use--copilot-cloud/--no-copilot-cloudto decide non-interactively.openspec updatenever prompts — it only refreshes cloud files for projects that opted in (or that already have generated cloud files, so existing setups keep working).--no-copilot-cloudorcloudAgent: false) removes OpenSpec-managed cloud files; a user-customized file is always preserved, never overwritten or deleted.initandupdatenow report whether cloud files were written, skipped, or left untouched — and if you already have your owncopilot-setup-steps.yml, they say it was preserved and that you need to add the OpenSpec install step by hand.#1484
521ee33Thanks @clay-good! - Retire a capability when a change removes its last requirement. A change that declaresretire_capabilities: truein its.openspec.yaml(alongside theschema:that file requires) may now be archived even when its REMOVED entries take a capability's last requirement:openspec archivedeletes 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 pasteablegit checkoutis included when the spec lived in the caller's checkout, and--no-validatenever 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
ece8660Thanks @clay-good! -openspec validatenow treats the EnglishSHALL/MUSTconvention as guidance in normal mode, so requirements written in other languages can validate. Strict mode continues to enforce the convention.#1483
2b3d368Thanks @clay-good! - Tell the caller which flag to pass whenopenspec archivecannot ask its confirmation questions. An AI agent (or any script) runs the CLI with stdin closed, so every prompt rejects with@inquirer'sUser 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 --yesstays a--skip-specsrun, 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 archivewith no change name used to swallow the same failure, printNo change selected. Aborting.and exit 0 — success for a run that archived nothing; it now exits 1 asking for a change name, matching howopenspec showandopenspec validatealready 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 runopenspec archive, now shows--yes.#1486
427abf4Thanks @clay-good! - Task progress now counts indented sub-tasks. Atasks.mdwhose sub-tasks were unfinished reported✓ Completeinopenspec listandopenspec view, was missing those tasks from theopenspec instructions applylist, 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,archiveandapplyagree 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 atasks.mdthat shows a checklist as a format example can now count that example as work — remove it from the file, or pass--yesto archive.#1500
26bd1d4Thanks @clay-good! - Keep generated workflows on the selected store, handle optional workflow fallbacks safely, and validate synced specs before reporting success.#1490
45cca5dThanks @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 archivenow 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
690a27eThanks @mc856! -openspec initandopenspec updateno 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 writesopsx-<id>.mdinto, so every run wiped the directory — including any file the user kept there — while the banner above it readNo user content to preserve. Junie's.junie/commands/opsx-*.mdlisted its own current output. Cleanup runs before the config migration, so on a config that has noprofilekey 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-opsxCoStrict 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 wroteopenspec-*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
0b20ae3Thanks @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
8a3850dThanks @clay-good! - When exploration turns into a new change, generated explore guidance now instructs agents to runopenspec new changebefore writing requested artifacts. This preserves the required.openspec.yamlmetadata 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
622c509Thanks @FasterPHP! - Honortelemetry.enabledin global config.falsedisables anonymous telemetry andopenspec updateversion checks; unset keeps telemetry enabled, and env/CI opt-outs still take precedence.#1499
9cd845fThanks @clay-good! - Keep generated files, specs, archive moves, and local state inside their intended security boundaries without breaking linked monorepo workflows.#1482
84ebc57Thanks @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.0Compare Source
Minor Changes
#1475
17af60cThanks @clay-good! - Add CodeArts Agent skills support:openspec init --tools codeartsagentinstalls the workflow skills.#1475
17af60cThanks @clay-good! - Add Hermes Agent as a supported AI tool:openspec init --tools hermesinstalls the workflow skills (Hermes is skills-only and invokes them directly).#1475
17af60cThanks @clay-good! - Add ZCode as a supported AI tool:openspec init --tools zcodegenerates its skills and/opsx:*commands.#1475
17af60cThanks @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
eac2973Thanks @showms! - Add current project context and per-operation guidance to apply and archive workflows. Projects can configureoperations.apply.guidanceandoperations.archive.guidance;openspec instructions applyreturns apply inputs, and the new read-onlyopenspec instructions archivesurface returns archive inputs for the selected root.Archive, bulk archive, and sync skills now load current archive inputs and
specsartifact rules at execution time, fail before writes or moves when required instruction lookups fail, and reuse specs-rule snapshots during inline sync.#1475
17af60cThanks @clay-good! - Publish the workflow skills as staticskills/<name>/SKILL.mdfiles sonpx skills add Fission-AI/OpenSpecworks.#1399
27b22abThanks @clay-good! - Addskip_specs: truechange metadata for work with no spec-level behavior change (pure refactors, tooling, docs).openspec validateaccepts 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 blockstaskson spec files for such changes,openspec statusrenders the specs stage as explicitly skipped, and the propose/specs guidance points to the marker instead of contradicting the validator.#1475
17af60cThanks @clay-good! - Resolve symlinked schema directories so schemas shared via symlink (e.g. from a dotfiles repo) are discovered.#1470
6295515Thanks @clay-good! -openspec updatenow 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: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 -gwould help, and the check is skipped in CI or whenOPENSPEC_NO_UPDATE_CHECK,DO_NOT_TRACK=1, orOPENSPEC_TELEMETRY=0is set.See CLI reference →
openspec updatefor the per-install-method behavior and every opt-out.Patch Changes
#1404
a84ae70Thanks @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. Whendelivery: commandswould 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
5199f41Thanks @clay-good! - ### Featuresopenspec config set defaultStore <id>sets a machine-level fallback root: any command run outside a planning root, with no--storeflag and no projectstore: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 JSONrootblock report the distinct provenancesource: "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 namesopenspec config unset defaultStore.#1435
6a5171eThanks @clay-good! -openspec new changenow accepts numeric-prefixed names like100-add-featureor00001-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);archivealready 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
040a869Thanks @clay-good! - Compare config key guards literally instead of through a helper.setNestedValueanddeleteNestedValuerejected prototype-reaching key segments through a helper that did aSetlookup. 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
6a4f0d7Thanks @clay-good! - A delta spec that introduces a brand-new capability can now open with a## Purpose, andopenspec archiveuses it as the Purpose of the main spec it creates instead of writing theTBD - created by archiving change <name>. Update Purpose after archive.placeholder over it. Thespecsartifact instruction, its example, the delta template and theopenspec-sync-specsskill 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:## Purposeheader outside a code fence or HTML comment, or a body that is only a code fence or only a commentA carried Purpose under 50 characters is kept but warned about, since
openspec validate --strictreports 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
19d4171Thanks @clay-good! -openspec archiveno 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--jsonmode those warnings are carried in a new optionalwarningsarray 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 bothvalidateandarchive— 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; symlinkedspecs/<capability>/spec.mdfiles 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:continueor/opsx:new.#1411
c439a4eThanks @clay-good! - Fix phantom requirements parsed from delta specs, which madeopenspec archivewarn about problemsopenspec validatenever 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 archivewarned that it was missing a scenario, andopenspec show <change> --jsonandopenspec change listcounted 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 archivealso 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 Requirementsentry — 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
b474f81Thanks @clay-good! - ### Bug Fixesopenspec-archive-changeskill (and the matchingopsx:archivecommand) 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 reportedSpecs: ✓ 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
17af60cThanks @clay-good! - Apply profile changes with the installed CLI instead of shelling out tonpx, which could run a different version.#1475
17af60cThanks @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
97d441aThanks @clay-good! - ### Bug Fixesopenspec-bulk-archive-changeskill (and the matchingopsx:bulk-archivecommand) 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 marksReadyorReady*), 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
52a8bceThanks @clay-good! ---changenow accepts any change name that exists on disk (e.g. date-prefixed names like2026-07-04-voice-copilot-v1), matching whatlist,validate, andarchivealready resolve. Lookup still rejects unsafe names (path separators,.., hidden entries); the kebab-case naming rule still applies when creating a change.#1475
17af60cThanks @clay-good! -openspec new changerejects names over 200 characters with a validation message instead of surfacing a raw ENAMETOOLONG filesystem error.#1447
fb19699Thanks @hsusul! - Generated tool command files now carry valid YAML frontmatter for every supported tool. Command names ship asOPSX: Explore, and the unquotedname: OPSX: Explorethat 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 liketrue,nulland123from round-tripping as booleans, nulls and numbers. Non-string fields such asallowed-toolsandinvokableare unchanged. Expect the firstopenspec updateafter 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 skippedinstead of being synced anyway, and both archive workflows verify the main specs before moving the change directory.#1471
9a937cbThanks @clay-good! - Reference slash commands by the name each tool actually registers. Command bodies, generatedSKILL.mdcross-references, and theinit/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 anopsx/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-applyin 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 pendingadapterless-skill-referencesnote. Command filenames and paths are unchanged, and Claude Code output is byte-identical.#1364
f58b445Thanks @clay-good! - Fixopenspec completion installdetecting 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 thecommand from fish installs fish completions instead of defaulting to bash.
#1377
285dfd7Thanks @clay-good! - ### Bug Fixesrules:keys are no longer reported asUnknown artifact IDwhen 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
b33b15dThanks @clay-good! - Stopdesign.mdfrom restating the proposal. In the defaultspec-drivenschema, 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 inproposal.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
1637856Thanks @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 isdevin, writing.devin/workflows/opsx-<id>.mdand.devin/skills/openspec-*/SKILL.md, and it is detected from either directory.--tools windsurfstill resolves, so existing setup scripts keep working; it now configures.devin/..windsurf/,openspec updateexplains the rebrand and offers to move them.--forceand non-interactive runs take the move; declining leaves every file exactly where it is. Only the files OpenSpec generates move — each skill'sSKILL.mdand commands namedopsx-*. A hand-written Cascade workflow, a reference file you keep beside aSKILL.md, a command file you edited, and.devin/rules/all stay exactly where they are./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
17af60cThanks @clay-good! -openspec doctornow notes when a store checkout is behind its upstream ref.#1475
17af60cThanks @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
378d468Thanks @clay-good! - Explore now reads the project's context and rules fromopenspec/config.yaml(orconfig.yml) at the start of a session, so it reasons with the same tech stack and conventions the artifact-creating workflows already receive.#1475
17af60cThanks @clay-good! -openspec feedbackshows 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
60f720cThanks @clay-good! - Fixopenspec feedbackfailing when the repository does not define thefeedbacklabel. 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
18cbf5dThanks @javigomez! - ### Fixed### Requirement:example was parsed as a real (phantom) requirement, producing spuriousvalidateerrors and risking incorrectarchiveoutput. Fenced-code detection is now shared across the Markdown parsers sovalidateandarchivebehave consistently.#1475
17af60cThanks @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
9b70481Thanks @mc856! - ### Bug Fixesarchiveno longer stacks a second date prefix — archiving a change whose name already starts with aYYYY-MM-DD-prefix (a common authoring convention) keeps the name as-is instead of prepending today's date. Previouslyopenspec archive 2026-07-04-voice-copilot-v1 --yesproduced2026-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 like2026-07-feature) are dated as before, and the naming is now idempotent.#1374
da3907bThanks @clay-good! - fix(completion): make the PowerShell completion script parse and load againThe generated
OpenSpecCompletion.ps1contained 18 emptyswitch ($positionalIndex) { }blocks — emitted for commands whose positionals are allpath-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
9b5d2cdThanks @mc856! - ### Bug Fixesopenspec-archive-changeandopenspec-bulk-archive-changeskill/command templates (and the onboarding walkthrough's archived-path example) now mirror theopenspec archiverule: a change whose name already starts with aYYYY-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 named2026-07-04-voice-copilot-v1producedarchive/2026-07-07-2026-07-04-voice-copilot-v1, whatever the CLI did.#1475
17af60cThanks @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.tomlfile.#1464
5bcf057Thanks @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
2d6c447Thanks @clay-good! - ### Bug Fixesopenspec-proposeandopenspec-ff-changeskills (and their/opsx:propose//opsx:ffcommands) 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
e2f748cThanks @clay-good! - Reject config key paths that reach the prototype chain, and update the bundledyamldependency.openspec config set --allow-unknown __proto__.polluted <value>reported success and assigned ontoObject.prototypefor the rest of the process.--allow-unknownwas meant to relax the known-key check only, but it skipped every key check, so__proto__,constructor, andprototypesegments reached the nested-write helper. Those segments are now rejected inconfig setwhether or not--allow-unknownis passed, andsetNestedValue/deleteNestedValuerefuse them regardless of caller. Ordinary keys such asfeatureFlags.myFlagbehave exactly as before.The
yamlruntime 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
7958924Thanks @clay-good! - ### Bug Fixesopenspec archiveno longer fails withADDED failed … already existswhen a change's specs were already synced to the main specs before archiving (the early-sync pattern from thesyncworkflow). 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
b419e96Thanks @mc856! - ### Bug Fixesopenspec archiveno longer fails withRENAMED failed … source not foundwhen a change's renames were already synced to the main specs before archiving (the early-sync pattern from thesyncworkflow). 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
ebf66c7Thanks @clay-good! - Respect reduced-motion preferences inopenspec init: the welcome animation is skipped when the OS reduced-motion setting is on (macOS Reduce Motion, GNOME animations disabled), whenOPENSPEC_NO_ANIMATIONis set, or when the new--no-animationflag is passed. The static welcome screen is shown instead.#1405
5dfef4bThanks @clay-good! - ### Bug Fixesopenspec-continue-changeskill/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'sinstructionfield whenever a custom schema reused familiar artifact names. The templates now state that theinstructionfield is the authoritative guidance, and thepropose,continue, andffworkflows 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
17af60cThanks @clay-good! - Follow the Kimi CLI rename to Kimi Code: new install paths with automatic migration of existing.kimisetups.#1415
e2f748cThanks @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
17af60cThanks @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
17af60cThanks @clay-good! -openspec updatewarns when a custom profile is missing core workflows instead of silently generating a partial install.#1428
81d5109Thanks @taltas! - Update current Roo Code product references to its community successor, Zoo Code.#1475
17af60cThanks @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
17af60cThanks @clay-good! - Render multi-select prompts with[x]/[ ]checkbox markers instead of radio-button icons.#1475
17af60cThanks @clay-good! - Discover nested spec paths likespecs/<area>/<capability>/spec.mdrecursively and consistently across parse, apply, and archive.#1410
b3b05e1Thanks @clay-good! - Only advertise onboarding commands that will actually exist. Theopenspec initwelcome screen and theopenspec update"Getting started" summary listed/opsx:newand/opsx:continue, which the defaultcoreprofile never generates, so users were told to run commands that did not exist. Both surfaces now list the commands for the installed workflows. Theinitandupdatecompletion 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
1dc670dThanks @clay-good! - ### Fixed/opsx:proposeand/opsx:ffno longer finish a change with no spec written. The workflows listed onlyproposal/design/tasksand treated the apply phase'stasksartifact as the stop condition — butstatusmarks an artifactdoneas soon as a matching file exists, so writingtasks.mdearly satisfied the loop whilespecs/<capability>/spec.mdwas 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 transitivelyrequires— from a singlestatuscall, creates each missing artifact, and only skips one when its owninstructionfield marks it conditional. (#1260, #788)Changed
openspec status --jsonnow reports each artifact'srequiresedges. Every entry in theartifactsarray carries arequiresarray of the ids it directly depends on, present for every status (includingdone) so agents can compute the transitive required set fromstatusalone. Additive and backward-compatible — existing fields are unchanged.#1191
7704702Thanks @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-*.tomlfiles are cleaned up as legacy artifacts on update.#1475
17af60cThanks @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
de78c31Thanks @clay-good! - ### Fixesopenspec instructionsdependency 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, editingspec.mdand deletingdesign.md/tasks.mdto regenerate them could silently produce artifacts based on the stale, pre-edit content.#1475
17af60cThanks @clay-good! - Proposal guidance now resolves blocking open questions with the user instead of deferring them to design.md.#1392
a13abeaThanks @clay-good! - ### Fixedspecs/root from being silently dropped.validateacceptedspecs/spec.mdand 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 reachedopenspec/specs/.validatenow uses the same discovery rules as the merge path and reports the misplaced file with a fix hint, andarchiveblocks instead of completing.#1465
f917b8bThanks @clay-good! - Order artifacts by the schema's declaration order instead of alphabetically.specsanddesignboth require onlyproposal, so both become ready at once - and the tie used to be broken alphabetically, which putdesignfirst.openspec statuslisted design above specs andnextStepsrecommended writingdesign.mdbefore any spec existed, contradicting the spec-driven schema's own documentedproposal → specs → design → taskssequence.Ties now follow the order the schema declares its artifacts, so
openspec status,status --json,nextSteps,blocked by:lists, and an artifact'sunlocksall agree. No dependency edges changed, so nothing newly blocks anddesign.mdstays 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 itsartifacts:list now decides which one the CLI recommends - so reorder that list if it was never deliberate.#1446
5348da9Thanks @showms! - ### Bug Fixesopenspec schema init --forcerejects an unknown artifact ID. Forced replacement now begins only after artifact validation succeeds.#1433
26f009dThanks @clay-good! - Change lookup no longer requiresproposal.md.openspec show,openspec change list/show/validate, and shell completion now resolve a change by its directory, matchingopenspec list,status,instructions, andvalidate.Previously a change created by
openspec new change— which scaffolds only.openspec.yaml— was reported asUnknown itembyopenspec showand was missing from completions andopenspec change listuntil a proposal was written, and a change from a schema with no proposal artifact was never resolvable.openspec change listnow reports the same set asopenspec 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 atopenspec status --change <name>.#1468
fc886afThanks @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
b7c85c7Thanks @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) whendelivery: 'skills'is configured, instead of commands that were never generated.#1475
17af60cThanks @clay-good! - Specs instructions include the spec content guidance from the concepts docs, so generated specs follow the requirement/scenario format.#1475
17af60cThanks @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
17af60cThanks @clay-good! - Sync and archive workflows resolve main specs through the store-aware root instead of assumingopenspec/specsin the repo.#1402
0da5f98Thanks @clay-good! - Show the main spec format in the sync-specs skill so agents stop leaving delta operation headers (## ADDED/MODIFIED Requirements) inopenspec/specs/— merged main specs with those headers parse as 0 requirements inopenspec view(#1120).#1476
8731290Thanks @clay-good! - Telemetry no longer depends onposthog-node: the single usage event is sent with a plain fetch to the same endpoint. Installing OpenSpec no longer pulls the fast-publishingposthog-node/@posthog/core/@posthog/typestree, which broke downstream installs under supply-chain age policies like pnpm'sminimumReleaseAge(#1390).#1475
17af60cThanks @clay-good! - The stale-CLI check hardens its install detection: a directory merely namedvoltano longer changes the upgrade hint, the Windows npm-ownership check corroborates against theopenspec.cmdshim npm actually writes, and a registry redirect from https to plain http is no longer followed.#1475
17af60cThanks @clay-good! - The stale-CLI check tears down a redirected registry connection when its time budget expires instead of leaving the socket open.#1442
10fa39bThanks @hsusul! -openspec updatenow refreshes tools that are configured with command files but no skills (deliverycommands). 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
17af60cThanks @clay-good! -openspec updatewithdelivery: commandsprints the same configuration correction as init when it removes the skills of a tool that supports only skills, instead of deleting them silently.#1475
17af60cThanks @clay-good! -openspec validatereports an unreadable specs/ directory as the error it is instead of misdiagnosing it as "no deltas found".#1455
6b3623aThanks @c4patino! -openspec viewnow resolves the configured OpenSpec root instead of always reading the current directory, and accepts--store <id>like its sibling commands. Projects whoseopenspec/config.yamlpoints at an external store saw an empty dashboard — 0 specs, 0 requirements — whileopenspec listread the same store correctly.#1475
17af60cThanks @clay-good! - Preserve keyboard input on Windows after the welcome screen instead of dropping the first keystrokes.#1475
17af60cThanks @clay-good! - zsh completion install honors$ZSHand$ZSH_CUSTOM, so Oh My Zsh setups at custom locations get the completion where their shell actually loads it.eslint/eslint (eslint)
v10.8.1Compare Source
Bug Fixes
18eb0a7fix: prevent ASI hazard inno-unused-labelsautofix (#21173) (dongkyu lee)151ba3ffix: false positives ingetter-returnandaccessor-pairs(#21163) (Grit)6898df9fix: ignore meta-property names inid-denylist(#21166) (Pixel)4d7db66fix: ignore meta-property names inid-match(#21167) (Pixel)677214efix: handle ASI hazards in no-unused-vars removeVar suggestion (#20935) (kuldeep kumar)Documentation
7d0cbf8docs: Update README (GitHub Actions Bot)0a05812docs: add missing backticks tono-duplicate-imports.js(#21183) (Lee Daeun)678c90bdocs: Update README (GitHub Actions Bot)8a10424docs: Update README (GitHub Actions Bot)69bb948docs: Update README (GitHub Actions Bot)Chores
0a14800chore: update github/codeql-action action to v4.37.4 (#21196) (renovate[bot])05adcb1test: fix failing ecosystem test foreslint-plugin-unicorn(#21191) (Lazizbek Ergashev)5611035test: add error locations info tono-void(#21185) (Lee Daeun)ee47333ci: bump github/codeql-action from 4 to 4.37.3 (#21176) (dependabot[bot])f131c03chore: improve ecosystem test failure reporting (#20937) (crimsonjay0)1f6eddechore: update ecosystem plugins (#21182) (ESLint Bot)d3266fbchore: unpinwebpackdependency (#21172) (Francesco Trotta)65a6519chore: add allowScripts field to package.json (#21092) (GiHoon Noh)22e5256ci: addtriage:nolabel to Dependabot PRs (#21141) (lumir)55c9038ci: bump actions/labeler from 6 to 7 (#21159) (dependabot[bot])7280e78chore: update dependency prettier to v3.9.6 (#21162) (renovate[bot])eddbad6test: fix failing ecosystem test foreslint-plugin-unicorn(#21156) (Francesco Trotta)60a178dchore: update ecosystem plugins (#21150) (ESLint Bot)f9f61dctest: add error locations tono-unreachable(#21151) (JIYEON)d086293test: add error locations tono-undef(#21147) (JIYEON)cc01b67test: add error locations tono-useless-catch(#21144) (devoil)688e75echore: add missing backticks in JSDoc (#21143) (Bo Hyun Kim)7c1e175test: add error locations torequire-await(#21145) (Grit)588a26dtest: add error locations tono-extra-label(#21139) (dongkyu lee)059aa89test: add error locations tono-useless-concat(#21140) (dongkyu lee)5a452a8test: add error locations tono-const-assign(#21138) (dongkyu lee)v10.8.0Compare Source
Features
2fee9bbfeat: exportConfigObjectfromeslint/config(#21082) (sethamus)Bug Fixes
6b8d2f7fix: escape reserved characters in rule id inhtmlformatter (#21129) (Francesco Trotta)9091071fix: preventno-unreachable-loopcrash when all loop types are ignored (#21116) (Pixel)e23fafefix: prefer-object-spread add semicolon when adding parenthesis (#21081) (synthex-byte)20b5ad0fix: quadratic-time regex inprefer-template(#21096) (Milos Djermanovic)8b6f6c0fix: apply ignore configs to computed methods in class-methods-use-this (#21094) (Pixel)b2c608cfix: NewExpression with parenthesized callee inpreserve-caught-error(#21083) (Francesco Trotta)Documentation
6ddf858docs: fix broken Specify Parser Options anchor link (#21106) (Minsu)784dfbedocs: Clarifyno-eq-nulldescription (#21120) (Park Harin)7ec733adocs: Fix typos and grammar in glossary (#21095) (Marry (Subin Yang))92bb13fdocs: replace quake link (#21108) (Jung Hyeon Jun)68eb4a5docs: fix broken Specify Globals anchor links in rule pages (#21103) (Minsu)d28f697docs: replace Code Climate CLI links with Qlty CLI links (#21099) (Jung Hyeon Jun)eccc68ddocs: correct --suppressions-location option description (#21093) (Ga eun Lee)c5963f7docs: Update README (GitHub Actions Bot)Chores
4fbf46dtest: pinwebpackversion to 5.108.4 (#21137) (Francesco Trotta)2d063e2chore: update HTTP URLs to HTTPS in JSDoc and comments (#21101) (Bo Hyun Kim)eccbe7btest: add error locations tono-class-assign(#21123) (devoil)e7d1e43ci: bump actions/setup-go from 6 to 7 (#21118) (dependabot[bot])e9d66d0ci: bump actions/setup-node from 6 to 7 (#21119) (dependabot[bot])ee225b6test: Add error location details tono-eq-nullrule (#21117) (Park Harin)044a627chore: update minimatch to ^10.2.5 (#21107) (김채영)fb09aa8chore: update ecosystem plugins (#21115) (ESLint Bot)5abd878test: add error locations tono-proto(#21114) (Gihyeon Jeong / 정기현)9715887test: Add error location details tono-div-regex(#21110) (Park Harin)a746ec6test: add error locations tono-new-wrappers(#21109) (Gihyeon Jeong / 정기현)8dde645test: add error locations tono-ex-assign(#21102) (devoil)13ab0ectest: add error locations tono-label-var(#21098) (Gihyeon Jeong / 정기현)a99906ftest: Add error location details tono-delete-varrule (#21105) (Park Harin)c47e8dcchore: add missing backticks tolanguages/js/index.js(#21104) (beeen)0174428chore: add missing backticks totranslate-cli-options.js(#21097) (dongkyu lee)3d36589chore: add missing backticks toserialization.js(#21091) (이규환)dcc9312test: add error locations toeqeqeq(#21090) (Ga eun Lee)2710b18ci: Add explicit permissions to rebuild-docs-sites workflow (#21089) (Marry (Subin Yang))5d2f866chore: update dependency prettier to v3.9.5 (#21086) (renovate[bot])d584e31chore: fix failing ecosystem test foreslint-plugin-unicorn(#21084) (Francesco Trotta)bf3eda0chore: update ecosystem plugins (#21079) (ESLint Bot)jsdom/jsdom (jsdom)
v30.0.1Compare Source
getComputedStyle()withcalc()and other functions throwing an exception, which regressed in v30.0.0. (@asamuzaK)prettier/prettier (prettier)
v3.9.6Compare Source
diff
TypeScript: Preserve quotes for methods named
new(#19621 by @kovsu)TypeScript: Support
import defer(#19624, #19675 by @fisker)JavaScript: Added a new official plugin
@prettier/plugin-yuku(#19628, #19629 by @fisker)@prettier/plugin-yukuis powered by Yuku (A high-performance JavaScript/TypeScript compiler toolchain written in Zig).This plugin includes two new parsers:
yuku(JavaScript syntax) andyuku-ts(TypeScript syntax).To use this plugin:
Install the plugin:
Add it to your
.prettierrc: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.11Compare Source
html-parse-stringifyupdated 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 anexportsmap, 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).escapeLiteralLessThanscanner (~80 lines) is replaced by the parser's newallowedTagsoption 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.10Compare Source
useTranslationandTrans"You will need to pass in an i18next instance" warnings now match theuseSSRwording, mentioning the props/context alternatives and the most common unexplained cause at scale: duplicate react-i18next copies in monorepo setups. TheTransvariant also referenced the internali18nextReactModulename; it now points to the publicinitReactI18nextAPI.SUSPENDED_WHILE_LOADING, logged once) right beforeuseTranslationsuspends while translations are loading. With the defaultuseSuspense: trueand 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 setreact.useSuspense: false). No-op in production builds; theprocess.env.NODE_ENVcheck is wrapped so runtimes without aprocessglobal (raw ESM in the browser, some edge runtimes) stay silent instead of throwing.@types/react@next/@types/react-dom@next, so the next React major's type changes (like the React 18TFunctionResult/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
(#37087 by @eps1lon)
vercel/turborepo (turbo)
v2.10.11: Turborepo v2.10.11Compare 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.10Compare 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.9Compare Source
What's Changed
Changelog
eprintln!in the panic hook by @molofsky in #13637New Contributors
Full Changelog: https://github.com/vercel/turborepo/compare/v2.10.8...v2.10.9
v2.10.8: Turborepo v2.10.8Compare 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.7Compare 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.6Compare Source
What's Changed
Changelog
node@runtime:lockfile entries by @anthonyshew in #13408turbo watchby @anthonyshew in #13423New Contributors
Full Changelog: https://github.com/vercel/turborepo/compare/v2.10.5...v2.10.6
v2.10.5: Turborepo v2.10.5Compare Source
What's Changed
Changelog
Toolchainoutput availability by @anthonyshew in #13360New Contributors
Full Changelog: https://github.com/vercel/turborepo/compare/v2.10.4...v2.10.5
typescript-eslint/typescript-eslint (typescript-eslint)
v8.67.0Compare Source
🚀 Features
❤️ Thank You
See GitHub Releases for more information.
You can read about our versioning strategy and releases on our website.
v8.66.0Compare 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.0Compare Source
🚀 Features
❤️ Thank You
See GitHub Releases for more information.
You can read about our versioning strategy and releases on our website.
v8.64.0Compare 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)
🚦 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.
This PR has been generated by Mend Renovate.
90b8abd40ce52c198e5be52c198e5ba8900aa2d8a8900aa2d86e7cf16f716e7cf16f71f36de20ecbf36de20ecbc1ee58e13bEdited/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.
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 (
overridespins them tocatalog:, and editing catalog entries under an override breaksCI=true pnpm install), the majors typescript 6→7 and fit-file-parser 4→5, and anything in the testing-tooling group.Pull request closed