chore: version packages - #358
Open
github-actions[bot] wants to merge 1 commit into
Open
github-actions[bot] wants to merge 1 commit into
github-actions[bot] wants to merge 1 commit into
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
18 times, most recently
from
September 22, 2026 21:28
e9de89d to
a320d60
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
September 22, 2026 21:34
a320d60 to
eab61db
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and publish to npm yourself or setup this action to publish automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@taskless/cli@0.11.3
Compare with v0.11.2
Patch Changes
aa49d45:
taskless check --rule <id>(repeatable) restricts a run to the named rules, so a rule can be measured over the whole project without running every other rule and filtering the JSON afterwards. The filter applies to both static engines and to runtime rules, keeps every exclusion a whole-project run applies, and refuses an id no rule directory has.d7b33ab:
taskless detectrecognizes oxlint alongside eslint, biome and stylelint, from.oxlintrc.json,.oxlintrc.jsonc,oxlint.config.ts,oxlint.config.mts, or anoxlintentry inpackage.json.5047148: The feedback survey is replaced for 0.11.3. Only the kind of rule the user was trying to create is required now; the user's own words, the completion verdict, what worked, what did not, the agent in use, and the most valuable rule so far are all optional. A
skipat the invite no longer dismisses the survey: the agent sends its own account of the session and leaves the user's words out.feedback dismissis reserved for a user who asks that nothing be sent. Every install is invited once more, since the new survey keeps its own cadence.d41576f: Two rules can no longer share an id across engines.
verifyfails a rule whose id is also a directory name under another engine, and a new scaffold migration (9) renames the ones that already exist..taskless/rules/sg/no-eval/beside.taskless/rules/vale/no-eval/was silent:check's human output printserror[no-eval]with no engine, so a collision shows two identical lines, and every id-addressed command had two answers to choose between.Your rule ids may change on upgrade, and
checkoutput changes with them. The firsttaskless initafter upgrading renames the collidingsgandvalecopies to<id>-<engine>—sg/no-evalbecomessg/no-eval-sg,vale/no-evalbecomesvale/no-eval-vale. Where both move, neither keeps the bare id, so nobody has to work out which of their two rules kept the name. If<id>-<engine>is already taken it uses the next free<id>-<engine>-2,-3, … and never overwrites an existing rule.A
runtimerule is never renamed and keeps the bare id, so a collision betweenruntimeand another engine moves only the other one. Runtime rules are the signed and blessed tier, and this keeps the upgrade clear of that machinery. Nothing is left colliding either way, because one engine can only hold one directory per id.Everything the rename touches is inside the rule's own directory: the directory name, the rule file, its
id:field, an sg rule's.tests/fixtures and theirid:fields, and a Vale rule's.vale.inibreadcrumb and both segments of its<id>.<id>assignment. Every rename is printed — old path, new path, and each file rewritten — as is any runtime rule that kept its id, so you can see exactly what moved before committing it. Update any CI config, baseline file or suppression comment that names an old id — includingcheck --rule <id>, which errors withRULE_NOT_FOUNDrather than reporting zero findings when the id it names has been renamed out from under it..taskless/rule-metadata/<id>.ymlis left where it is rather than following either rule, since a symmetric rename gives it no owner. In practice there is nothing there: this CLI has never written a sidecar, because the service does not return the metadata block they are written from.d3befa0: Update the bundled Vale to 3.22.0.
For a rule under
.taskless/rules/vale/, what you can now write:scope: text & ~link(and~strong,~emphasis,~code) runs on the paragraph and blanks the element's text out of it before the rule sees it, so a wording or casing rule can leave link text and bold terms alone without giving up the sentence around them. Positions after the blanked element do not move. The release note'stext.rawandparagraph.linkspellings are not scopes;verifyrejects them, so write the bare inline name.split: trueon aspellingrule checks the parts of an identifier (getHTTPResponsze_v2reportsResponsze) and places each at its own position. 3.21.0 accepted the key and did neither.frontmatterorfrontmatter.<key>rule reports every occurrence in a field at the field's own position; a token appearing twice in one field was reported once.<Note>...</Note>) is linted.What changes for a rule you already have:
BasedOnStyles =is removed from every rule's.vale.ini, by migration 0008 on the nextinit, andverifynow rejects the key with any value (vale-config-no-based-on-styles). Every earlier version of thecreate-vale-rulerecipe wrote the line into every matcher, where it was inert: no bundled style loads unless a run-levelBasedOnStylesnames one, and the assembled header names none. On 3.22.0 an empty value clears every setting a file inherited from an earlier matcher, and the assembled run config is every rule's matchers in id order, so a rule writing the line under[docs/**]silenced every alphabetically earlier rule underdocs/, and[*.md]beside another rule's[*.{md,markdown}]silenced the first on every.mdfile, with nothing reported.checkandverifyrefuse to run untilinithas migrated the configs, and name it; commit the rewritten files. A migrated config enables exactly what the old one did on 3.21.0.scopenegateslink,strong,emphasisorcodeno longer sees that element's text inside a paragraph. Through 3.21.0 the paragraph still carried it, so findings inside those elements disappear. Drop the negation if the rule was meant to reach them.testandverifybuild no longer writesBasedOnStyles =. Measured on both binaries, nothing fires without it andVale.Spellingnever could, so fixtures behave as before.Not changed for a rule this CLI assembles: a
[formats]key may now be a file name or a glob, but no rule config can carry one and the assembled header writes none, so the extension still decides the parser.UNSETas a rule's value behaves asNOand is not accepted;YESandNOremain the two values.taskless agent updatecarries the same list, with what to do about each.620865e:
verifyvalidates a Vale rule's.vale.iniagainst a schema and names the constraint each rejection violates. The config is parsed into an ordered structure and checked there: an assignment above the first matcher, a matcher without itstskl) rulebreadcrumb, a key naming another rule, a value other thanYES/NO, aBasedOnStylesassignment with any value, a config with no matcher or noYES, and aNOmatcher that precedes everyYES(both judged by each matcher's final verdict, so aYESa laterNOin the same matcher overrides does not count) are each rejected under avale-config-*constraint thatverify --jsonreports inviolations[]andreference.jsonpublishes. A repeated key, a[*]matcher, and a.taskless/**matcher are reported as a notice without failing the rule.checkruns the same schema before assembling the Vale run config, and a rejected config refuses the Vale engine for that run: the failure names the rule and the line, reaches the exit code, and ast-grep still runs. A rule is never silently left out of the assembled config. Accepted configs are written verbatim under their breadcrumb, so the one string edit assembly used to make (dropping a copied-inStylesPath) is gone; that line is now a rejection. Advisories reachcheck's notices. To find every rejected line at once, runtaskless verify.This is still
patch. The package is0.y.z, and every config the schema refuses was already being misread by Vale: a rule enabled nowhere with aW101on stderr, a rule silently overriding a neighbour, a disable the following enable cancelled. The release surfaces a defect the consumer already had rather than introducing one, the same call as linting files over 128 KB again in 0.11.3.78dc643:
verifywarns when a Vale rule'srawlist has more than one entry, since Vale concatenates them into one pattern rather than alternating them; thecreate-vale-rulerecipe explains the(a|b)form. The warning rides onnoticeand does not fail the rule.3acb5a1:
agent create-vale-rule(topic v13) corrects two claims that cost rule authors work. Vale patterns are not RE2-only: Vale compiles with Go'sregexpand falls back toregexp2, so lookahead, lookbehind and backreferences work, and the recipe no longer tells you to split a rule that one pattern expresses. Two silent limits are measured and documented alongside it: a backreference does nothing as aswapkey, and the implicit word boundary ontokens/swaplands after a trailing lookahead, so that lookahead has to peek at a non-word character.checkon a rule's.tests/failbucket is a supported way to read a rendered message, because.taskless/is excluded from the whole-project walk only; when that bucket comes back empty, the recipe now sends you to the rule's own config, specifically a[.taskless/**]matcher, before the pattern.verifycarried the same imprecision and now states both halves: a[.taskless/**]matcher is unnecessary on a whole-project check, AND it silences the rule on a path you name, such as the rule's own fixture bucket. It was previously described as acting only under a barevaleinvocation, which read as harmless.agent update(topic v10) is corrected to match.b2e2662:
checkno longer skips Vale target files over 128 KB. The guard(
VALE_MAX_FILE_BYTES, added in 0.11.2) was written against Vale 3.20.0,whose lint time grew superlinearly with the size of a single Markdown block,
so one large file could consume the run's whole timeout and, because Vale
writes nothing until the run finishes, cost every other file its findings.
The same release moved the vendored Vale to 3.21.0, whose perf work makes that
cost linear regardless of block structure, so the cap no longer separates a
cheap file from an expensive one. Re-measured on the reproduction from
Track upstream: Vale lint time is superlinear in single-block size, and no output is emitted until the run finishes #325 against the vendored 3.21.0 binary (darwin/arm64, warm, median
of three):
huge.md)What a user sees: a file that 0.11.2 named in a
Vale did not check N file(s) over 131072 bytesnotice is linted again and produces findings; the notice isgone. The per-file retry for a target whose front matter Vale cannot parse
(One unparseable file zeroes findings for the whole check run #300) is unchanged, as is the 60 s run timeout. Vale still emits
nothing until the run completes, so a run killed by an external time limit
still loses every finding; with linear cost that takes a file in the hundreds
of megabytes rather than the hundreds of kilobytes.
f97365d:
taskless --versionand-vprint the version. Before, both fell through to the full usage banner, and-vwas not recognised at all.Build Info
npx @taskless/cli-nightly@0.11.3-20260922213651xb1896efBuilt from: b1896ef
Built at: 2026-09-22 21:36:51