chore: version packages - #308
Merged
Merged
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
11 times, most recently
from
September 11, 2026 01:05
280292e to
0a855df
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
7 times, most recently
from
September 18, 2026 18:04
5b745e9 to
d0ee211
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
September 19, 2026 03:01
d0ee211 to
a94dff3
Compare
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.2
Compare with v0.11.1
Patch Changes
80e5309: Update the bundled ast-grep to 0.45.3 (from 0.45.2).
What a rule author sees in
taskless checkon ast-grep rules:ast-grep-ignorecomment in scanned code now takes effect only when it is the comment's first alphabetic text. A comment that merely mentioned the directive as prose above a flagged line used to suppress the finding; it no longer does, so findings can appear that were hidden before. Moveast-grep-ignoreto the start of the comment if the suppression was meant.unused-suppressionhints.taskless verify, and the language list are unchanged. Nothing installed under.taskless/needs migrating.b8b6f32: Fixed reference stubs (
.claude/,.agents/, etc.) freezing a stale,unpinned
npx @taskless/cliinvocation into their own frontmatterdescriptionforever, even on a nightly install whose canonical.taskless/skills/taskless/SKILL.mdcorrectly names the pinned@taskless/cli-nightly@<version>package. A stub'sdescriptionis copiedverbatim from source and, unlike canonical content, is never rewritten for
the current build target — so any CLI invocation baked into it would go
stale on the very first release that changed. The invocation is removed from
the skill and command
descriptionfields entirely: the canonical filealready carries the correct, per-build invocation, and a stub always defers
to it, so there is no longer a second copy that can drift.
2d088fa:
info --jsonnow includesinstall.onboarded, matching the field theonboardrecipe already instructs agents to read from that command. Beforethis, the field was written to
.taskless/taskless.jsonand enforced byonboard's own gate, but omitted from theinfo --jsonpayload, so an agentfollowing the recipe read
undefinedand re-ran a full discovery pass on aproject that had already onboarded. A manifest that omits the field now
reports
onboarded: false, matching the strict-equality gateonboarditself applies, rather than
nullor leaving the key out.548f268:
init --jsonnow writes only the parseable envelope to stdout. Previously,the non-interactive install path (also reached from
init --no-interactive --json) unconditionally logged human-readable prose — the "no toolsdetected" fallback notice and the per-target skill/command summary — to
stdout ahead of the JSON envelope, so
taskless init --json | jq .failedwith a JSON parse error. That prose now goes to stderr, where it stays
visible to a person watching the terminal without corrupting a machine
consumer's view of stdout, matching how
verify/testand the migrationnotice already behave under
--json.b68b095:
taskless initis now the batch install in every context, and--no-interactiveis dropped: a barenpx @taskless/cliin a terminal is the wizard,initis the install and upgrade path for agents, scripts, and CI, andagent initis the recipe. A script that still passes the flag getsinitunchanged.initends with an upgrade trailer naming the directories that hold changed files and, after a CLI version move, pointing attaskless update; the--jsonenvelope gainscliVersion, a per-targettargetssummary, and achangedflag. A canonical.taskless/file whose bytes already match the bundle is no longer rewritten or reported as written. Theagentsubcommand serves every recipe under a fetch-time directive (fetch again next task; a session that installed or upgraded Taskless holds a stale skill), which the@taskless/cli/promptsexport does not carry and whichheader: falsestrips with the version. Theagent initrecipe is rewritten for the agent that runs it, and the skill andtsklcommand say a recipe is fetched again for each task. The skill and command sources name the CLI through the%(TASKLESS_CLI)splaceholder, rendered at install, so a nightly or dev build no longer depends on finding the literalnpx @taskless/cliin prose.54cd0c0:
checkno longer loses every finding in a run because one file's frontmatter could not be parsed. A Vale front-matter error used to abort the
entire Vale invocation before any result was written, so
resultscame back[]for the whole run regardless of how many other files had findings — and[]was indistinguishable from a genuinely clean pass.runValenow retries around a file Vale's own error attributes to one of therun's targets, excluding it and reporting it as a per-file finding
(
ruleId: "vale-parse-error",severity: "error") instead of failing thewhole run. Every other file's findings are reported normally. A failure Vale
does not attribute to a single target file — a malformed rule, a timeout, a
crash — is unaffected and still fails the run exactly as before.
46eccf7:
.taskless/.gitignorenow ignores/.tmp-*, the scratch request files the agent recipes write (.tmp-rule-request.json,.tmp-improve-request.json), so a file an agent forgot to clean up is a stray rather than a commit. This is scaffold migration 7; the scaffold's ownversionfield carries the compatibility signal, and a project at 6 gains one ignore line the next time it is bootstrapped.A
feedbacksubcommand joins the CLI, reached only through the survey invite a served recipe carries and so absent from thetaskless agentindex:feedback send --from <file>validates a human-keyed payload (verbatim,goal,completedasYes/No/Unknown, optionalworkedWellandneedsImprovement), maps it to the PostHog survey's question ids, and capturessurvey sent;feedback dismisscapturessurvey dismissed. Both hold the next invite off for 20 days and, under the telemetry opt-out, say nothing was sent and exit 0.Two recipes back it:
taskless agent feedbacktells the agent it is the survey's respondent (the user's reply verbatim, the rest from its own account of the session) and embeds the payload schema;feedback-inviteis the fragment a served recipe carries, rendered header-less.The four recipes where an agent-driven session most often goes wrong (
onboard,create-sg-rule,create-vale-rule,create-remote-rule) now end with a short feedback invite when telemetry is on, the run is not in CI, and the survey'snext_askhas passed. Serving it capturessurvey shownand holds the next invite off for 10 days;taskless onboardandtaskless agent onboardboth carry it. The@taskless/cli/promptsexport never does.DO_NOT_TRACK=1,TASKLESS_TELEMETRY_DISABLED=1, orCI=truemeans no invite is served.3cfbe5b:
rule create --jsonandrule improve --jsonnow emit the standard{ ok: false, code, message }envelope on stdout when a file-set rule arrives witha stray
testsfield, instead of throwing a bare, unreportedCLIError.Previously the guard threw from inside the command's own
trywithout goingthrough the command's
fail()helper, so under--jsonnothing was writtento stdout at all — prose landed on stderr and the process exited 1,
indistinguishable from a crash, and the
RULE_GENERATION_FAILEDcode thecreate-remote-rulerecipe documents as a branch target was never actuallyreachable for this guard. Both call sites now route through
fail(), and theduplicated guard itself was consolidated into one shared check so the two
copies cannot drift again silently.
Not addressed here: rules written to disk earlier in the same delivery loop
(before the guard fires) are still not named in the failure envelope. The
published envelope shape (
CLIErrorEnvelope) has no field for a partial filelist, and adding one is a schema change out of scope for this fix.
b6668ea: Corrected the published
@taskless/cli/schemasdocstrings forverifyOutputSchemaandvaleVerifyOutputSchema, which named a command form—
taskless rule verify <id> --json— that was removed when rule addressingmoved from id to path. No runtime behavior changes; the schemas themselves
are unchanged. A consumer reading these docstrings (e.g. via editor
tooltips or generated docs) would previously be pointed at a command that
does not exist.
878a53d:
checkno longer risks losing every Vale finding in a run to one oversizedfile. Vale's cost is quadratic in a single file's size (measured against the
pinned binary: 128KB is ~0.8s for one rule, 384KB is already ~7s), and
VALE_TIMEOUT_MSbounds the whole run, not one file — a large enoughdocument could consume most or all of that budget on its own, and a timeout
discards every other file's findings along with it (the same failure One unparseable file zeroes findings for the whole check run #300
fixed, on a path One unparseable file zeroes findings for the whole check run #300 did not cover).
runValenow excludes a target file over 128KB (VALE_MAX_FILE_BYTESinsrc/rules/vale/run.ts) before invoking Vale at all, the same preemptivetreatment already given to a format Vale cannot parse — but only when some
Vale rule's own
.vale.inisection could actually reach that file.assembleValeConfignow returns the section patterns it wrote alongside theconfig path, and the size scan globs by those patterns (
findOversizedFilesin
src/rules/vale/formats.ts) instead of walking every file in the project.A first version of this fix scanned the whole tree unconditionally and named
pnpm-lock.yamlandpackages/cli/CHANGELOG.mdas "not checked" on this veryrepository, even though no rule's matcher touches either file — Vale was
never going to open them, so that was a false positive, not a caught coverage
hole. Excluded files are named in a
noticesentry rather than a finding:unlike an unparseable file (where Vale itself proves the file was a real
target by erroring on it), this exclusion is a preemptive guess from a
filesystem walk, and a soft advisory fits an unconfirmed guess better than a
hard error.
A consumer may now see a
checkthat previously counted a large file'sprose findings instead report a
noticesentry naming that file as skipped— but only for a file some rule's own scope actually reaches. 128KB is
comfortably past hand-written prose (roughly 20,000 words); this should only
affect generated output, pasted data, or exported notes checked directly
against a matching rule.
665802d: Telemetry now records six adoption dimensions on every event:
workspaceIdandrepositoryId(both hashed),envOS,ci,ciProvider, andlanguageStack.cli_check_completedalso reportsruleCount, so a scan that loaded no rulesis distinguishable from one that loaded rules and found nothing.
Nothing to react to. No command changes behaviour, no output changes shape, and
every dimension falls back to a sentinel rather than failing — telemetry is not
a precondition for any command.
TASKLESS_TELEMETRY_DISABLED=1andDO_NOT_TRACK=1continue to short-circuit before any of it is resolved, so theopt-out remains an opt-out of the work rather than only of the send.
patchrather thanminorbecause the package is pre-1.0, where added surfacedoes not earn a
minor, and because none of this is API a consumer can call.18871a1: Update the bundled Vale to 3.21.0.
For a rule under
.taskless/rules/vale/, what you can now write:scope: doc(<selector>)picks part of a document by CSS selector, where a heading and everything under it is asection:text & doc(section:has(> h2:contains("Decision")))is one section's prose,~doc(...)is everything outside it, and ametricscoped todoc(...)puts a word budget on that section alone. A leaf element on its own (doc(h2)) is inert; chain it (text & doc(h2)).verifyaccepts the family and leaves the selector to Vale, which rejects one it cannot compile at load.metrichonors itsscope:scope: sentencemeasures each sentence rather than the whole document. An absent scope, orscope: text, still measures the document..ipynbis a format: Markdown cells are read as Markdown, code cells as their kernel's comments, raw cells and outputs not at all. Findings point at the notebook file's own lines.BlockIgnoresandTokenIgnoresin a rule's.vale.ininow apply under an[*.html]matcher.What changes for a rule you already have:
[glob]section repeated in a rule's.vale.ini, or a key repeated inside one, now keeps its last assignment rather than its first. Precedence is last-wins in both directions, so a disable placed after the enable it narrows works in every shape.actionname is refused when the rule loads, and one config serves the whole run, so a typo there fails every Vale rule in the project.verifynow rejects a name outsidereplace,remove,suggest,convert,edit.metricthat declared ascopewas measuring the whole document anyway; it now measures what the scope names, so its findings move.[*.ipynb]was linting the notebook's JSON; it now reads cells, so findings from outputs and metadata are gone.taskless agent updatecarries the same list, with what to do about each.4626c20: Fixed
check --jsonreporting araw-scope Vale finding'srange.start.lineone line earlier than the flagged text (check --json reports Vale findings 1 line early, or 2 lines early for raw-scope rules #297). A
rawpattern isconventionally anchored with a leading
\nso it can require "start of line"against the unparsed document; that
\nis part of Vale's reported match, andVale attributes
Lineto the newline ending the previous line rather than tothe line the flagged text is actually on. The mapper now counts a match's
leading newlines and adds them back before converting to the 0-indexed
CheckResult.rangeevery source uses.default-scope findings were not affected: Vale already reports the correct1-based line for them, and
range.start.lineis 0-indexed by design (everysource in
CheckResult.rangeis —format.tsadds 1 back when it displays,and check --json reports Vale findings 1 line early, or 2 lines early for raw-scope rules #297's "off by one" for default-scope rules was this documented
convention compared against a 1-based file line, not a bug).
Build Info
npx @taskless/cli-nightly@0.11.2-20260919030302xb1280acBuilt from: b1280ac
Built at: 2026-09-19 03:03:02