Skip to content

v1.4.0

Latest

Choose a tag to compare

@github-actions github-actions released this 10 Oct 09:31
· 31 commits to main since this release
v1.4.0
aff6018

What's Changed

  • fix(parse): adapt nested pattern groups after literal text by @ss-o in #205
  • docs(parser): record the local-first front-end strategy by @ss-o in #219
  • fix(parse): keep brace-form if chains across line continuations and end them at newlines by @ss-o in #218
  • fix(parse): bump mvdan/sh to v3.14.1 and fail closed on repeat and foreach by @ss-o in #217
  • chore(contrib): add parser-gap intake, scoped parser guidance, commit lint by @ss-o in #222
  • docs(readme): improve root README with org template guidance by @ss-o in #223
  • fix(parse): reject newline between brace-form if condition and body (#220) by @ss-o in #224
  • fix(parse): honor quotes and escapes inside pattern bracket expressions (#204) by @ss-o in #225
  • fix(parse): support associative-array subscripts beginning with @ (#194) by @ss-o in #226
  • fix(parse): support function name; { list } definitions (#213) by @ss-o in #227
  • docs(readme): correct contracts the CLI does not emit by @ss-o in #229
  • docs(project): record the 2026-09-16 organization discovery survey by @ss-o in #240
  • fix(parse): keep ${#name} inside brace-form if bodies by @ss-o in #243
  • fix(parse): accept the ${name::=word} assignment operator by @ss-o in #244
  • fix(parse): accept a second parameter subscript as File metadata by @ss-o in #249
  • fix(parse): accept bracket expressions in flagged subscript patterns by @ss-o in #248
  • fix(parse): accept bare associative keys with operator punctuation by @ss-o in #247
  • fix(parse): accept associative keys mixing an expansion with ':' by @ss-o in #256
  • fix(parse): end a brace-form condition only at a whole-word ]] by @ss-o in #257
  • fix(parse): accept a quoted or escaped ) inside a conditional pattern group by @ss-o in #258
  • fix(parse): accept a declaration builtin or let as the last command before } by @ss-o in #262
  • fix(parse): rebase alternate-for retry errors and keep later anonymous-arg blockers by @ss-o in #264
  • fix(parse): accept a multi-line word list in an alternate for loop by @ss-o in #268
  • fix(parse): read repeat loops as while clauses with count metadata by @ss-o in #272
  • fix(parse): read a rejected expression after , in a flagged subscript literally by @ss-o in #286
  • ci(corpus): pin consumer revisions so unrelated changes stay green by @ss-o in #292
  • docs(corpus): declare the src loader as a startup-file by @ss-o in #294
  • fix(parse): support the if list sublist short form (#210) by @ss-o in #295
  • fix(parse): support multi-name function definitions (#251) by @ss-o in #304
  • fix(parse): accept a loop body that begins with a separator after do (#238) by @ss-o in #296
  • fix(parse): read the select short form as a select loop (#212) by @ss-o in #305
  • fix(parse): close a repeat sublist from the source, not from End() (#300) by @ss-o in #308
  • fix(parse): end a select sublist from the source (#300) by @ss-o in #310
  • fix(parse): close a declaration brace block inside a loop, if or case body (#298) by @ss-o in #309
  • fix(scope): index multi-name and anonymous function declarations (#306) by @ss-o in #311
  • fix(parse): accept a separator that opens a then or else branch (#297) by @ss-o in #312
  • fix(parse): accept a select header with an empty body (#302) by @ss-o in #313
  • fix(parse): accept the brace body of a select loop (#301) by @ss-o in #315
  • fix(parse): reject a bare } word as native Zsh does (#314) by @ss-o in #317
  • fix(parse): reject a } that ends a word as native Zsh does (#316) by @ss-o in #318
  • fix(parse): accept the parenthesized list form of select (#303) by @ss-o in #320
  • fix(parse): read an empty select body before an operator (#319) by @ss-o in #322
  • fix(parse): accept a negated select or for adapter form (#321) by @ss-o in #323
  • fix(parse): support single-command for, while and until loops (#211) by @ss-o in #325
  • fix(parse): accept the alternate for (( ... )) sublist form (#241) by @ss-o in #326
  • fix(parse): accept an empty loop body after while, until and for (#327) by @ss-o in #329
  • refactor(parse): share one command-position walker (#299) by @ss-o in #328
  • perf(ci): check every Zsh file in one job instead of one job per file (#334) by @ss-o in #336
  • fix(parse): disarm alternate-form scan on a non-brace while body (#337) by @ss-o in #338
  • fix(parse): reject carriage returns Zsh rejects (#333) by @ss-o in #339
  • fix(parse): accept a redundant ; in command position (#332) by @ss-o in #340
  • fix(parse): read a while or until condition as a list (#330) by @ss-o in #341
  • docs(project): record the 2026-09-21 survey and pin two fixtures by @ss-o in #342
  • docs: use semantic line breaks in prose by @ss-o in #343
  • fix(parse): accept a list ending in a dangling && or || by @ss-o in #345
  • fix(parse): accept a separator before a () function body by @ss-o in #347
  • fix(parse): accept a multi-name for with a parenthesized word list by @ss-o in #348
  • fix(parse): accept a function body that is not a brace group by @ss-o in #349
  • fix(parse): accept math function calls in arithmetic expressions by @ss-o in #352
  • fix(parse): keep a condition brace group out of the alternate-if body by @ss-o in #353
  • fix(parse): accept a math function call in a ternary branch by @ss-o in #355
  • fix(parse): read a nested $(( as arithmetic, as native Zsh does by @ss-o in #364
  • fix(parse): accept a flagged subscript pattern in every position by @ss-o in #358
  • perf(parse): stop anonymous-function closer retries without progress by @ss-o in #365
  • fix(parse): read a bracket expression before a flagged pattern's operator by @ss-o in #367
  • fix(parse): read a doubled sign in an associative key as key text by @ss-o in #370
  • fix(parse): read a subscripted expansion inside a flagged pattern (#371) by @ss-o in #375
  • fix(parse): read an expansion operator under a length prefix (#373) by @ss-o in #377
  • fix(parse): read a bracket expression in a flagged pattern in arithmetic (#368) by @ss-o in #378
  • fix(parse): read a command substitution in a flagged pattern (#379) by @ss-o in #381
  • fix(parse): reject a flagged pattern the parser cut short (#382) by @ss-o in #383
  • fix(parse): read a single-quoted key in a nested expansion by @ss-o in #388
  • fix(parse): accept a plain command heading a brace-form condition list (#376) by @ss-o in #392
  • fix(parse): read substitutions inside double quotes (#393) by @ss-o in #399
  • fix(parse): read the until brace form like while (#394) by @ss-o in #402
  • fix(lint): clear staticcheck findings and lint the module in CI (#380) by @ss-o in #403
  • test(survey): check fixtures against native zsh in Go CI (#404) by @ss-o in #405
  • docs(project): freeze requiredFixtures as the deletion baseline (#406) by @ss-o in #407
  • feat(survey): trace base parses and adapter depth per file (#408) by @ss-o in #409
  • feat(survey): compare verdicts against a base build (#412) by @ss-o in #413
  • ci: report parse cost per pull request, observed not gated (#414) by @ss-o in #415
  • test(manualcite): require released Zsh manual citations by @ss-o in #411
  • docs: add the parser-gap fix skill and agent session setup (#416) by @ss-o in #417
  • test(ci): keep hardened action pins in step with Renovate bumps (#420) by @ss-o in #421
  • ci: bump the golangci-lint version in all three places together (#422) by @ss-o in #423
  • test(corpus): cite the manual on every ok- fixture by @ss-o in #424
  • feat: mutation-test the lines a change touches (#425) by @ss-o in #426
  • test(parse): cite the manual on the #120 invalid source by @ss-o in #427
  • test(parse): cite the manual on the #208 invalid sources by @ss-o in #430
  • test(parse): cite the manual on the #211 invalid sources by @ss-o in #432
  • test(parse): cite the manual on the #212 invalid sources by @ss-o in #433
  • feat: generate probe grids across scanner contexts (#428) by @ss-o in #431
  • fix(parse): skip here-document bodies in the brace-form scanners (#429) by @ss-o in #436
  • fix(ci): flag parse cost only when a file keeps its verdict (#437) by @ss-o in #438
  • fix(parse): read ${...} as its own quoting context in patterns (#401) by @ss-o in #442
  • test(parse): cite the manual on the #215 invalid sources by @ss-o in #434
  • test(parse): cite the manual on the #216 invalid sources by @ss-o in #444
  • test(parse): cite the manual on the #220 invalid sources by @ss-o in #445
  • feat(parse): read brace-form if and while in the parser fork (#446) by @ss-o in #447
  • docs(project): cut the parser-gap workflow back to the contract (#448) by @ss-o in #449
  • fix(parse): read a quote in a double-quoted ${...} word as text (#400) by @ss-o in #450
  • fix(parse): read a here-string as a word in the try/always scanner (#435) by @ss-o in #451
  • fix(parse): read a case pattern's leading ( as its opener (#440) by @ss-o in #454
  • fix(parse): recognise a quoted pattern closer inside backquotes (#441) by @ss-o in #455
  • fix(parse): read a pattern group through a substitution (#439) by @ss-o in #456
  • fix(parse): read a case pattern that begins with a group (#452) by @ss-o in #458
  • fix(parse): keep a same-line tail after a brace-form for closer (#275) by @ss-o in #460
  • feat(parse): read loop short and alternate forms in the fork (#459) by @ss-o in #461
  • feat(parse): read repeat loops as a RepeatClause in the fork (#281) by @ss-o in #464
  • fix(ci): stop mutation.sh passing runs where every mutant times out (#463) by @ss-o in #465
  • docs(agents): name the org files parser work must open (#468) by @ss-o in #471
  • fix(parse): read list trivia before a closer after a dangling operator (#466) by @ss-o in #472
  • ci: adopt the organization routing caller (ADR-0031) by @ss-o in #473
  • fix(parse): accept an empty alternative in a case pattern (#396) by @ss-o in #474
  • fix(parse): read a bare associative key holding a blank (#372) by @ss-o in #475
  • feat(parse): read the csh-style foreach ... end loop (#214) by @ss-o in #477
  • fix(parse): accept a function name holding an expansion (#234) by @ss-o in #478
  • ci(corpus): guard F-Sy-H and the Zsh Completion tree against regressions (#470) by @ss-o in #486
  • fix(parse): stop the function head scan at a closer (#480) by @ss-o in #487
  • fix(parse): read a line continuation as trivia before a redundant separator (#467) by @ss-o in #489
  • docs(corpus): verify the Zsh 5.9 false accepts in the regression survey record (#488) by @ss-o in #491
  • ci: judge native-oracle jobs with Zsh 5.9.2 (#492) by @ss-o in #493
  • docs: document the two-tier zsh -n verdict and corpus renames (#287, #290) by @ss-o in #498
  • fix(parser): accept separators between the case word and in (#485) by @ss-o in #499
  • fix(parser): reject reserved words after an assignment prefix (#278) by @ss-o in #500
  • fix(parser): read a function keyword definition with no body (#479) by @ss-o in #501
  • fix(parse): read a math function call inside a parenthesized group (#356) by @ss-o in #504
  • fix(parse): end a dangling && or || at its closing backquote (#469) by @ss-o in #505
  • fix(parser): accept a subscripted or array assignment prefix (#285) by @ss-o in #506
  • fix(parser): require a name after a braced ${+ (#363) by @ss-o in #507
  • ci: emit corpus checks on every pull request by @ss-o in #508
  • fix(parser): accept module and multi-operand dash conditions (#484) by @ss-o in #510
  • fix(parser): end a word inside a glob group as Zsh does by @ss-o in #514
  • fix(parser): reject a lone - condition and ! or ( after < or > by @ss-o in #515
  • fix(parse): skip a parameter expansion in a conditional pattern group by @ss-o in #516
  • fix(parser): nest braces in the word of a parameter expansion by @ss-o in #520
  • fix(parser): end an =~ operand inside a group as other Zsh words by @ss-o in #523
  • fix(parser): end a word at an empty group in a [[ ]] operand by @ss-o in #524
  • fix(parser): count braces in the subscript of an unquoted ${...} by @ss-o in #525
  • fix(parser): parse a command substitution body inside a glob group by @ss-o in #527
  • fix(parser): parse a command substitution body in a subscript flag argument by @ss-o in #528
  • fix(parser): keep a ] inside a substitution in a subscript flag argument by @ss-o in #530
  • fix(parser): nest a bare group inside a word's glob group by @ss-o in #533
  • fix(parser): keep a flagged short subscript inside a subscript flag argument by @ss-o in #535
  • fix(parser): balance substitution brackets over a whole subscript by @ss-o in #536
  • fix(parser): reject a [ never closed in a subscript flag argument by @ss-o in #537
  • fix(parser): reject a [ never closed in a short subscript flag argument by @ss-o in #539
  • test(survey): check corpus trees against Zsh's own deparse (#541) by @ss-o in #549
  • fix(parser): keep a brace-form else without a then position (#541) by @ss-o in #550
  • fix(parser): print function and case forms Zsh reads as written (#541) by @ss-o in #551
  • fix(parser): read a short subscript flag with dquote_parse rules (#540) by @ss-o in #552
  • fix(parser): read && or || across ; as Zsh does (#548) by @ss-o in #556
  • fix(parser): read | or |& across ; as Zsh does (#553) by @ss-o in #558
  • feat(agents): add one command that verifies a parser change (#560) by @ss-o in #561
  • feat(survey): one command for a parser fix's grid, differentials and checks (#545) by @ss-o in #559
  • feat(survey): judge a file against zsh -f -n and reduce a parser gap (#562) by @ss-o in #566
  • fix(survey): report a file zsh cannot open instead of judging it invalid by @ss-o in #568
  • fix(parser): read a leading ; in a quoted or backquoted substitution (#569) by @ss-o in #570
  • fix(parser): read a # glued to a case pattern's opener as text (#482) by @ss-o in #579
  • fix(parser): keep a blank inside a case pattern's bracket expression (#483) by @ss-o in #581
  • fix(parser): read a (( that continues a word as a glob group (#481) by @ss-o in #585
  • feat(agents): adopt complete organization instruction consumers by @ss-o in #593
  • ci: pin org routing to 893749ca and refresh code-review skill by @ss-o in #594
  • chore(github): vendor the organization issue forms by @ss-o in #595
  • docs(github): describe the vendored organization forms in the issue config by @ss-o in #596
  • ci: re-pin the code-review skill with bundled criteria by @ss-o in #597
  • docs(project): correct the agent tooling plan and track each step by @ss-o in #599
  • fix(tooling): cover fork and case mutation blind spots by @ss-o in #601
  • ci: adopt advisory tool-attribution checks by @ss-o in #602
  • chore(github): sync the organization forms and repin commit-lint by @ss-o in #603
  • test(survey): link each runtime-tier invalid fixture to its issue (#563) by @ss-o in #604
  • ci: repin org routing and add the reporting-issues section by @ss-o in #605
  • ci: repin org routing to the reporting heading fix by @ss-o in #606
  • ci: repin org routing to link the project profile by @ss-o in #607
  • docs(project): record full #489 and #536 mutation replays (#544) by @ss-o in #608
  • docs: align local parser guidance with tooling (#564) by @ss-o in #600
  • fix(parser): return an error, not a panic, for ${[ at EOF (#609) by @ss-o in https://github.com//pull/617
  • fix(parser): read empty sublists and dangling and-or in the fork (#572) by @ss-o in #615
  • fix(rules): resolve command prefixes, narrow unquoted-var (#613) by @ss-o in #618
  • docs(project): put fix evidence in the PR, not dated records (#546) by @ss-o in #616

Full Changelog: v1.3.0...v1.4.0