## dagucloud/dagu — v2.18.1…v2.18.2

_37 commits._

### Features
- **feat(workbook): read every Japanese form under a pinned type (#2998)** (5ca5c59)
- **feat(xlsx): merge on write_cells, extract cache by labels, Japanese typing, cap and merge coverage (#2997)** (51bf8c7)
- **feat(xlsx): refuse an extract listing longer than 200 KB (#2996)** (af341a5)
- **feat(xlsx): xlsx.extract reads fields out of a form-like sheet by cell address (#2994)** (e2bf997)
- **feat(chat): schema-constrained output for chat.completion (#2995)** (3b0cbb0)
- **feat(xlsx): validate, write_cells, sheet, convert, and dry-run checks (#2981)** (822847e)
- **feat(mail): use the gmail api for google oauth mail accounts (#2984)** (ce58145)
- **feat: add prune-artifacts command to reclaim orphaned artifacts (#2900)** (3de0f02)
- **feat: add xlsx actions, dagu xlsx commands, and MCP workbook target (#2979)** (3cce8be)
- **feat: webhook profile tokens (#2964)** (2639f25)
- **feat: optional signal propagation to running DAG processes (#2885)** (f664697)
- **feat(cli): read run parameters with --params-stdin (#2884)** (c168a14)
- **feat(ui): log page-size selector and page jump (#2882)** (020ca71)

### Fixes
- **fix(xlsx): never let two writes land on one merged cell (#2993)** (0b57b55)
- **fix: append by header name, partially succeeded foreach, numeric text in cells (#2990)** (329211c)
- **fix: correct help and schema text for browser and computer steps (#2987)** (6c3cc8d)
- **fix(value): preserve inserted binding text (#2982)** (ee3248d)
- **fix: replay browser recordings as other runs left them (#2986)** (b881cd1)
- **fix: perform only one action per browser act (#2985)** (7db7e2a)
- **fix(scheduler): log scheduled slots skipped while the DAG is busy (#2980)** (cf57f56)
- **fix: treat hidden browser replay targets as cache misses (#2983)** (e8af8fa)
- **fix: clear replay caches when cleanup deletes all history (#2973)** (be1e6f3)
- **fix: run coordinator shutdown on SIGINT and SIGTERM (#2972)** (1ee69be)
- **fix: end the browser when its runtime fails to start (#2971)** (e8e8d4e)
- **fix: abort repeating steps stopped between attempts (#2969)** (65c72cc)
- **fix: keep SIGTERM handled during supervisor shutdown (#2966)** (e91c562)
- **fix(api): return 400 for malformed JSON request bodies (#2955)** (d1c3780)
- **fix(ui): use exclusive end bounds for specific run periods (#2953)** (a6f9c28)

### Tests
- **test(conformance): allocate the wait.http port dynamically (#2908)** (5da7921)
- **test(xlsx): close the conformance gaps of spec 077 (#2989)** (5eb6773)
- **test: fix flaky graceful stop test for repeating steps (#2974)** (f5e755c)
- **test: fix flaky test server and poll backoff tests (#2965)** (b3e7e6d)
- **test: cover dry-run shell and command access checks (#2643)** (0cfca2f)

### Chore
- **refactor(frontend): cache the asset bundle hash instead of the formatted version (#2907)** (50c1187)
- **chore: persist state and generated files via WriteFileAtomic (#2906)** (73009a4)
- **refactor(sse): extract add-topic classification into a helper (#2905)** (0ee0f76)
- **chore(deps): bump the go-patch group with 6 updates (#2960)** (f65edb3)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/dagucloud/dagu?utm_source=github-action)._