<?xml version="1.0" encoding="UTF-8"?>
<otherdata xmlns="http://linux.duke.edu/metadata/other" packages="2">
<package pkgid="afb61c59049c436ff3c6465b43457e19c3c51c72f43b563d8c56aed9a859688f" name="lash-shell" arch="src">
  <version epoch="0" ver="0.13.0" rel="14.1"/>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.1.0-1" date="1776340800">- Core protocol: Frontend terminal connection with dynamic terminal size.
- Daemon architecture: Shared memory IPC for improved performance.
- Command parsing: Single-quoted arguments, backtick command capture, method chaining.
- Control flow: `if`/`else`, `for`, `while`, and `match` statements.
- Variable management: Variable expansion, scoping, exit code variables, tilde expansion.
- Process handling: `IoMonitor` for signal monitoring and pipe management, job management.
- Object and list access: Bracket access for objects and lists, JSON parsing methods.
- Line editor: Completion handling, bracket access, Docker-based static builds.
- Help command: Built-in usage instructions.
- Initial project documentation: Code of Conduct, contributing guidelines, license, and README.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.2.0-1" date="1776427200">- Installation packages: Packages for macOS (Homebrew), Debian, Fedora, and Arch Linux.
- Welcome navigator: Interactive tutorial and setup pages with starfield animation.
- History plugin: History storage with reverse search and JSONL persistence.
- Powerline prompt: Git status indicators, path abbreviation, and duration display.
- Session tracking: Session and frequency plugins for command tracking.
- Typo correction: Interactive "Did You Mean?" suggestions with fuzzy matching.
- Turbo mode: Optimized pipeline execution for `sort`, `head`, `tail`, and file reading.
- Highlighting plugin: Syntax highlighting on keystroke in interactive shell.
- Completion plugin: Subcommand completion for `git`, `docker`, `helm`, and `kubectl`.
- Deploy scripts: macOS and Linux release automation.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.3.0-1" date="1776513600">- Environment variable access: `env.VAR` syntax with prioritization logic.
- Stream methods: New output handling with stream methods for stderr.
- Command capture enhancements: Improved capture output structure with stderr handling.
- Pipeline variable expansion: Variables expanded within pipeline commands.
- Arithmetic and comparison operators: Full expression evaluation in the language.
- Navigator: Interactive typewriter with HAL outro and falling star animation.
- Refactored `CaptureOutput` structure for consistent error handling.
- Refactored execution and lifecycle handling in daemon.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.4.0-1" date="1776600000">- User-defined functions: `fn` declarations with multi-parameter support and pipeline execution inside function bodies.
- Semver type: `semver()` built-in for parsing and comparing semantic versions.
- Exit statement: `exit` with optional exit code.
- `write to` statement: Write output directly to files.
- `enforce` and `confirm_when`: Assertion and confirmation helpers.
- `.first`, `.empty`, `toNumber`, `extract` methods: New list and string methods.
- Output range methods: `write`/`writeln` for stream output.
- Interactive prompt built-ins: `prompt()`, `confirm()`, `choose()`, `password()`.
- Homebrew tap: Lash is now installable via Homebrew.
- Refactored method dispatching with dynamic discovery of list and string methods.
- Introduced `PipelineOptions` for enhanced pipeline execution configuration.
- Refactored variable expansion logic and extracted common functions.
- Enhanced error formatting with method suggestions.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.5.0-1" date="1776686400">- Daemon auto-start: Daemon starts automatically when needed.
- macOS sysinfo: Enhanced system information support on macOS.
- Updated dependencies for `fluent-asserts` and `trial` to latest versions.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.5.1-1" date="1776772800">- stderr-to-stdout redirection: Support for `2&gt;&amp;1` syntax with related parsing logic.
- Terminal restoring: `restoreTermios` resets terminal settings on exit using `TCSANOW`.
- Comment support: Comments are now ignored in statement parsing.
- Fixed signal handling to use `!= 0` for `activePid` checks.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.6.0-1" date="1776859200">- Match expressions: Value-returning match arms for pattern matching on values.
- Return statement: Functions now support explicit `return` for early exit.
- Multi-line method chains: Improved readability for chained method calls in scripts.
- Element-wise string methods for lists: Apply string methods across list items.
- String interpolation: Brace-delimited expressions in strings with escape sequence support.
- Subscript access in interpolation: Use `[]` inside string interpolation.
- Locale-aware sorting: Sort operations respect locale settings.
- Per-stage pipeline timing: Prefix a pipeline with `time` to get per-stage timing reports.
- Interactive prompt built-ins: `prompt()`, `confirm()`, `choose()`, `password()`, `confirm_when()`.
- Password handling and logging: Enhanced credential handling features.
- Recent command/output tracking: `EvalContext` tracks recent commands and their output.
- Fixed terminal input draining after script execution.
- Updated `handleEscapeSequence` to correctly handle prompt updates in `LineEditor`.
- Enhanced turbo sorting and unique operations.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.7.0-1" date="1776945600">- Double logical operators: Support for `&amp;&amp;` and `||` in command parsing.
- PTY handling: Improved PTY allocation and terminal response management, including `SIGTTOU` handling during terminal control.
- Version check plugin: Notifies users when a new release is available.
- Refactored `dispatchPipeline`, `handleInput`, and `executeWithRedirects` for improved permission checks, error handling, and memory management.
- Refactored Turbo operations to use `CLine` type and streamlined bulk/streaming execution paths.
- Updated turbo and startup performance metrics across multiple benchmarks.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.8.0-1" date="1777032000">- Homebrew resources: Added `lash-debug` and `lash-lsp` as resources in the Homebrew formula.
- Post-install/uninstall scripts: Shell integration is now managed automatically via install hooks.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.8.1-1" date="1777118400">- Updated installation URLs in Homebrew formula and documentation.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.8.2-1" date="1777204800">- Updated installation instructions and package names to use `lash-shell`.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.9.0-1" date="1777291200">- Expression output: Expressions used as statements (e.g. `` `ls -lsah`.take(4) ``) now print their result instead of silently discarding it. Applies to the daemon REPL, script execution, and control flow blocks.
- Turbo: multi-segment support and forked commands: Turbo execution now handles multi-segment pipelines and forked command structures.
- Turbo: regex grep operations: Added `grepRegex` and `grepRegexInvert` operations with `-E` flag support, using a custom `PosixRegex` struct for improved performance.
- Turbo: unique count: New `uniqueCounted` operation for `uniq -c`, counting occurrences of each unique line.
- Turbo: regex count fusion: `grepRegex` operations fused with length operations are combined into `grepRegexCount` / `grepRegexInvertCount`.
- Startup: Deferred heavy module imports to local scope in `app.d`, reducing startup overhead by ~0.5ms in lightweight mode.
- Turbo: native-only bypass: Pipelines with only native-favored operations (sort, head, tail) skip Turbo and run natively where the OS tools are faster.
- Turbo: GC disabled during execution: Garbage collection is disabled during Turbo pipeline runs to eliminate collection pauses.
- Turbo: dynamic buffer sizing: Buffer allocation in `executeTurboPipeline` is now based on operation type for better memory efficiency.
- Turbo: optimized line reading: New `readFirstNLines` function for efficient first-N-lines reads from file descriptors.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.10.0-1" date="1777377600">- Security profiles: Full profile system with create, edit, test, reload, and permission management. Profiles support resource limits, filesystem sandboxing (Landlock, Seatbelt), network policy enforcement, spawn allow/deny lists, forced environment variables, and inheritance.
- Profile auto-detection: Automatic profile switching based on session context, with dismissal support.
- Network proxy: Transparent network interception with TLS SNI verification, DNS interception, and hostname-level allow/deny policies via TUN device and lwIP integration.
- Session monitor: Audit pipe and monitoring capabilities for active sessions.
- Seccomp-BPF enforcement: Process and network restrictions via seccomp filters on Linux.
- Session sandboxing: Per-session temporary directories with Landlock enforcement and fallback logging.
- Armor integration: New armor module providing unified sandboxing across Landlock (Linux) and Seatbelt (macOS).
- Powerline enhancements: Transient prompt, user@host display, root/virtualenv/Node.js/Docker/Kubernetes/AWS context indicators, and exit status coloring.
- DAP client: `readExact` for reliable message reading in the debug adapter protocol client.
- Unique daemon sockets: Auto-started daemons use per-process socket files to avoid collisions.
- Migrated protocol layer from custom connection/shm modules to the `conduit` library.
- Replaced raw POSIX syscalls with checked wrappers for improved error handling.
- Refactored unit tests to use fluent assertions for improved readability.
- Enhanced error handling and validation across profile persistence and command dispatch.
- Client cwd: Session now uses the client's working directory instead of the daemon's.
- CI cleanup: Background daemon processes are now cleaned up after blackbox tests.
- Armor dependency: Fixed lwip linker path for armor 1.1.0.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.12.0-1" date="1777464000">- Native plugins: `.lash` files in `~/.lash/plugins/` auto-load their `fn` and `type` declarations into every session. Layered discovery: compiled-in bundle → `/usr/share/lash/plugins/` → user dir, with later layers overriding earlier same-named declarations. `lash --list-plugins` shows both native and external plugins with signatures, methods, and cache TTLs.
- Bundled git plugin: Ships with ~19 shortcuts (`gst`, `gco`, `gcb`, `gp`, `gpsup`, `gl`, `glo`, `gd`, `ga`, `gaa`, `gc`, `gcm`, `gb`, `gba`, `gsw`, `grhh`, `grb`, `grbc`, `grbi`) and four typed argument types (`GitBranch`, `GitRef`, `GitPath`, `GitArg`) that drive completion out of the box.
- Typed functions: `fn` accepts typed parameters, union types (`A | B | C`), list types (`[T]`), and a trailing rest parameter (`...args: [T]`). Arguments are coerced per the signature at command-position dispatch; coercion failures produce friendly `'X' is not a valid &lt;type&gt;` errors. Doc comments on functions and parameters attach to the AST and feed both `--help` output and LSP hover.
- User-defined types: `type Name { cache = &lt;duration&gt; values(query) { ... } validate(x) { ... } }`. `cache = 2s`/`5m`/`1h` memoizes `values(query)` per-query with TTL; errors bypass the cache. `validate(x)` is optional — derived as `x in values("")` when absent. Union type arms use `validate` to route between alternatives (`GitBranch | int` tries the type first, falls through to `int` on failure).
- `fn main` script entry point: When a script declares a top-level `fn main(...)`, CLI args are coerced through its typed signature. Missing required args or coercion failures emit `Error: ...` plus auto-generated help. `--help` / `-h` renders the shared help formatter (doc summary, typed-arg table, optional "Runs:" line for plugin wrappers). Scripts without `fn main` receive args through an implicit `args` list.
- Real-time subprocess streaming: Fn bodies with pipelines stream stdout/stderr to the terminal as they run (`commandStream` scope callback) instead of buffering. Stderr is rendered in red.
- Shared help formatter: Plugin `fn --help`, `fn main --help`, and `lash --list-plugins` all use the same renderer in `lash.backend.help`.
- Heredoc: `&lt;&lt;EOF ... EOF` and `&lt;&lt;-EOF` (tab-stripping) for multi-line input redirection. A quoted delimiter (`&lt;&lt;'EOF'`, `&lt;&lt;"EOF"`) suppresses variable interpolation in the body.
- Here-strings: `&lt;&lt;&lt;` feeds a single string to stdin without spawning a temp file.
- Process substitution: `&lt;(cmd)` expands to a `/dev/fd/N` path so commands can read from a subprocess pipeline as if it were a file.
- Brace expansion: comma lists `{a,b,c}`, numeric ranges `{1..10}` (with optional step `{1..10..2}`), letter ranges `{a..z}`, nested braces, and Cartesian products (`{a,b}{x,y}`) — all expanded at tokenization and integrated with pipeline variable expansion.
- POSIX parameter expansion: `${var:-default}`, `${var:+alt}`, `${var:?msg}`, `${#var}` (length), and `${var/pat/rep}` / `${var//pat/rep}` (replace-first / replace-all).
- Recursive globbing: `**/*.d` and friends now match across directory boundaries.
- Reverse-incremental history search: Ctrl-R style substring search with a dedicated overlay; results refine on each keystroke and Ctrl-R cycles through matches.
- Overlay system: New stack-based overlay manager (`SelectionOverlay`, `HistoryPreviewOverlay`, permission-request modal) routes key events to the topmost overlay and composes cleanly with the line editor. Suggestion handling moved to `SelectionOverlay` with proper accelerator behavior.
- Permission prompts: When a plugin or sandbox check needs user approval, a modal overlay collects the response without disrupting the prompt line.
- Multi-line line editor: `LineEditor` now detects newlines in pasted/edited input, redraws only the affected region, and uses `refreshAfterEdit` to keep the visible buffer in sync without flicker.
- Terminal title: Shell sets the window title from the running command via `setTitle` (with control-byte escaping). New `commandTitle` extracts and truncates the first token from a command line for the title.
- Spinner: Frontend spinner now reacts to plugin events for smoother feedback during long-running operations.
- ANSI styling helpers: New escape-sequence builders centralize terminal styling for overlays and rendering.
- Highlight plugin themes: Syntax-highlight colors are now driven by named themes; backticks (command captures) get their own coloring.
- Foreground signal handling: SIGINT / SIGTSTP delivered to a foreground job updates job state correctly and returns control to the shell instead of leaking through to the parent.
- PTY job resumption: `fg` resumes a stopped foreground PTY job with the terminal hand-off it needs to receive keystrokes again.
- Signal-byte stripping: PTY input filters out signal bytes before re-injecting them so Ctrl-C / Ctrl-Z don't get processed twice.
- Hover: Resolves doc comments on `fn`, `type`, and parameters.
- Completion: Offers keywords, builtins (20 with descriptions), native-plugin fns, types, scope variables, and PATH executables at command position. Subcommand-aware completion for `git`, `docker`, `helm`, `kubectl`, `cargo`, `npm`, `dub`, `systemctl`. Lazy `whatis`-backed descriptions via `completionItem/resolve`. `--help`-parsing and bash-completion-invocation fallbacks extend coverage to unknown binaries.
- Native-plugin function completion: Plugin `fn` names complete at command position; their typed arguments drive context-aware completion.
- Semantic tokens: Doc comments are classified with a `documentation` semantic-token modifier only when followed by a fn/type/unittest declaration.
- Input-event context: `inputKeyData` events now include alias and function-name context so plugins can react to expansions in flight.
- `usage { }` blocks removed. Scripts that used `usage { ... }` to declare args must migrate to `fn main(...)` with typed parameters. No auto-migration — the old syntax is a parse error. Enum and range constraints (`[a, b, c]`, `1..100`) move to user-defined `type` with `validate(x)`.
- **`$1`..`$N`, `$@`, `$*`, `$#` removed.** `$0` (script path) is the only surviving shell-positional. Access named parameters on `fn main` or the implicit `args` list.
- Armor `includeWorkdir` was dead code. `buildLinuxContext` passed an empty string as the cwd parameter to `buildLandlockRuleset`, so the workdir was never actually added to Landlock rules — every sandboxed pipeline ran with the cwd inaccessible. Fixed in `lash.runtime.armor.buildArmorContext` by appending the cwd to `readWritePaths` when `includeWorkdir` is set, plus walking parent directories up to `/` so `getcwd()` syscalls resolve.
- Default profile filesystem rules: Added `/dev` to `read_write` (programs need `/dev/null` for both reading and writing) and `~` to `read_only` so commands like `git` can read `~/.gitconfig` and `~/.ssh/`. Removed the hard `max_processes = 512` cap from the `developer` profile — `RLIMIT_NPROC` is per-UID, not per-tree, so a fixed cap broke Go binaries (`glab`) and `git push` once the user had any background processes.
- DAP integration test client: Race condition where `poll()` on the OS fd reported "no data" while `fread`'s C-stdio buffer still held the next message. Switched `tests/integration/dap.d` to direct POSIX `read()` so poll readiness matches available data.
- `lash.lang.evaluator.coercion` centralizes argument coercion for both command-position dispatch and `fn main` script entry.
- Doc-comment accumulation (`DocBuffer` + `attachDocs` + `extractDocLines`) shared across block-body parser, LSP tolerant parser, and per-line script executor. `extractDocLines` decomposed into `skipWhitespace` / `scanLineComment` / `scanBlockComment`, each unit-tested.
- `executable` enumeration extracted from the completions-plugin engine into a reusable module so the LSP can use it without pulling in the plugin framework.
- Error-handling closure deduplicated across `script_execution.d` (13 sites collapsed into two `failWith` delegates).
- Tutorial tests and obsolete usage-block scripts removed from the test suite.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.12.1-1" date="1777464001">- AUR (`lash-shell-bin`): Arch users can now install via any AUR helper (`yay -S lash-shell-bin`). PKGBUILD wraps the upstream `.pkg.tar.zst`. CI auto-updates on each tag; `.SRCINFO` is regenerated by a bash converter (no `makepkg` dependency).
- OBS (openSUSE Build Service): `home:gedaiu/lash-shell` builds for Fedora 41/42/43/Rawhide, openSUSE Tumbleweed/Leap 15.6/16.0, Ubuntu 22.04/24.04/24.10, Debian 12/13, and CentOS 8 Stream. CI hits a service-token trigger after each release; OBS pulls a fresh source tarball from GitLab and rebuilds.
- Homebrew formula renamed: `lash` → `lash-shell` for consistency with `.deb` / `.rpm` / `.pkg.tar.zst` package naming. Users update with `brew uninstall lash &amp;&amp; brew install lash-shell`.
- AppStream metainfo + hicolor icons: `lash-shell` now appears in GNOME Software / KDE Discover with logo, summary, and description. Icons installed at standard `/usr/share/icons/hicolor/&lt;size&gt;/apps/com.szabobogdan.Lash.png` paths.
- CHANGELOG.md as single source of truth: `CHANGELOG.yaml` (nfpm), `obs/debian/changelog`, and the `%changelog` section in `obs/lash-shell.spec` are now regenerated on every release by `scripts/changelog-derive.py`.
- Project metadata: homepage standardised to &lt;https://lash.szabobogdan.com/&gt; across `nfpm.yaml`, `homebrew/lash-shell.rb`, `dub.json`, and the AppStream metainfo. `Vcs-Git` / `Vcs-Browser` Control fields point at the GitLab repo.
- `release.lash` rewritten for CI: takes no args, derives version from `git describe --tags --exact-match`, hard-fails if `lash --version` doesn't match the tag, and runs identically on the developer machine and the GitLab runner.
- Single-source release flow: dropped `scripts/release.sh` in favour of `./lash release.lash` (the daemon is the release tool too).
- Syntax highlight no longer lags one keystroke: every buffer mutation (typing, backspace, Ctrl+U/K/W, delete, paste, history navigation) now refreshes highlight spans before redrawing. Previously the daemon's highlighter saw the pre-edit buffer.
- Backtick-wrapped commands highlight correctly: `` `ls`.map(…) `` now colours `ls` as a builtin and the backticks as brackets, instead of the whole token rendering as an "unknown command" error.
- Dark / light themes: new `Theme` struct in the highlight plugin with two palettes that meet the design constraints (no orange/red on valid commands/args/values, no dim/transparent colours).
- `theme` builtin: `theme` prints the current theme; `theme dark` / `theme light` writes `highlight.theme = …` to `~/.lash/config`. The highlight plugin reloads via mtime check on every keystroke.
- `method` palette moved off blue: `.map`, `.toLower`, etc. now render in magenta so they're visually distinct from external commands (cyan family).</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.12.2-1" date="1777464002">- release.lash: backtick command with interpolated path (`` `${script_dir}/lash --version` ``) was being parsed as a single argv token; switched to `./lash --version` (runs in workspace cwd).
- CHANGELOG.yaml: dates now emitted in RFC3339 (`2026-04-29T00:28:30Z`) so nfpm's changelog parser accepts them.
- OBS commit path: `osc checkout --output-dir DIR` places the package files directly in `DIR`, not in `DIR/home:gedaiu/lash-shell`; release.lash now `cd`s into the right dir.
- AUR sha line: build the `sha256sums=(…)` replacement via lash string concat to avoid any quoting ambiguity in the sed argument.
- nfpm.yaml: dropped `deb.fields`, `rpm.summary`, `archlinux.pkgbase` — those fields are recognised in newer nfpm versions, but the v2.41.1 we install in CI rejects them. Re-add when CI bumps nfpm.
- AUR key location: moved from `/etc/gitlab-runner/aur-ssh-key` to `/home/gitlab-runner/.ssh/aur-ci-key` so the gitlab-runner user can read it (the system dir is `drwx------` root-only).</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.12.3-1" date="1777550400">- release.lash: previous tarball cleanup loop never matched anything because `` `ls lash-*.tar.gz` `` in a lash backtick passes the glob to `ls` literally; switched to `bash -c "ls …"` so old `lash-*.tar.gz` files in the OBS package now actually get `osc rm`'d before the new commit.
- install.md rewritten with AUR (`yay -S lash-shell-bin`) for Arch users and OBS native repos (one apt/dnf source line that auto-updates) for Fedora/RHEL/CentOS, openSUSE, Debian, and Ubuntu. The one-shot `curl + dpkg/rpm/pacman` instructions stay as fallbacks.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.13.0-1" date="1777723200">- `type Foo { template = "path" }` binds a user-defined type to a text-template file. Fields are inferred from the template body; constructing `Foo { ... }` is type-checked against that inferred shape. Templates can use `${name}` (legacy) or `{{name}}` substitution, dotted paths `{{a.b.c}}`, conditional blocks `{{#if x}}…{{/if}}`, and loops `{{#each xs as |i|}}…{{/each}}` with arbitrary nesting. Whitespace trimming around block tags is always-on. There is no `{{else}}` and no whitespace sigils.
- Strict typing at three gates: parse-time semantic analysis (catches missing required fields and obvious literal-type mismatches like `flag: 42` against a bool field, halting execution before any statement runs), construction-time validation in `evalObjectLiteral` (catches dynamic values), and render-time as a final safety net. Errors carry path-aware messages like `template field 'Fleet.environments[0].servers[0].host' is required but missing`.
- Implicit methods on typed objects: `obj.render()` returns the rendered text, `obj.write(stream)` writes it to a stream.
- `write VALUE to "path"` shorthand: desugars to `write to "path" as f { VALUE.write(f) }`. Reads as a single declarative line for typed templates.
- JS-style object shorthand: `{ name }` desugars to `{ name: name }`. Mix shorthand and explicit entries freely. Works for both untyped and typed (`Foo { ... }`) literals.
- Typed object literals (`Foo { entries }`): the type-name prefix attaches a `typeName` to the constructed object and triggers template-shape validation when the type carries a `template` clause.
- Default-value parameters in `fn`: `fn main(file: string = "VERSION")` declares an optional parameter with a default. Defaults can be any expression; evaluated lazily when the caller omits the arg.
- Forward function references: the semantic analyzer pre-passes top-level `fn` declarations so `fn main` can call helpers defined below it. Tutorials can finally put the entry point at the top of the file.
- Analyzer halts on error: any `Severity.error` diagnostic from semantic analysis stops execution before the first statement runs, surfacing the diagnostic on stderr (with `--log-verbose`) or via the rendered output.
- `stdout` / `stderr` recognised as built-in stream names by the semantic analyzer (no more "may not be declared" warnings on `.writeln(stdout)`).
- All five generated release artifacts are now rendered from typed templates instead of sed pipelines:
- Removed the in-repo `aur/PKGBUILD` (now derived). The `.template` files are the single source of truth; rendering is mechanical and the typed-template engine catches missing fields or wrong types at parse time.
- New tutorial [`docs/tutorials/typed-templates.md`](docs/src/content/docs/tutorials/typed-templates.md): end-to-end walk-through generating systemd unit files from a typed value, demonstrating field inference, conditionals, loops, nested data, and the JS-style shorthand.
- New reference page [`docs/reference/templates.md`](docs/src/content/docs/reference/templates.md): full grammar table, validation gates, whitespace rules, error-message format.
- All ten existing tutorials rewritten in a "concept-intro + test-first" style: each opens with "What's a [variable / function / chain / control-flow / …]?" before the goal, then walks through each step by writing the unittest first and only then the implementation. Each tutorial mentions how to run the tests with `lash --test FILE` and shows the auto-derived `--help` output.
- Tutorial scripts modernized in `tests/scripts/`: `tutorial_bump`, `tutorial_disk_hogs`, `tutorial_log_errors`, `tutorial_resize`, `tutorial_organize`, `tutorial_backup`, `tutorial_analyze_log`, `tutorial_deploy`, `demo_showcase` — all converted from the removed `usage { }` syntax to `fn main(...)` with default-value parameters and inline `unittest { }` blocks.
- New integration suite [`tests/integration/tutorials.d`](tests/integration/tutorials.d) drives `--help` and `--test` for every tutorial script.
- Bumped to v0.4 ([spec/index.md](spec/index.md)).
- §3.6 — `template = "&lt;path&gt;"` clause on `type`; mutually exclusive with `values` / `validate`.
- §3.7 — new section on typed templates: grammar, inferred-shape rules, three validation gates, implicit `.render()` and `.write(stream)` methods.
- §5.8 — formalised object literals; covers the shorthand `{ x } ≡ { x: x }`.
- §5.9 — typed object literals; static-analyzer rules.
- §6.10 — `write to` statement (block form and the `write VALUE to PATH` shorthand).</changelog>
</package>
<package pkgid="f3d79b5cb87c4bc605266f7293e0a6c9aca811a017ce6609d1f38aefbe99ac72" name="lash-shell" arch="x86_64">
  <version epoch="0" ver="0.13.0" rel="14.1"/>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.1.0-1" date="1776340800">- Core protocol: Frontend terminal connection with dynamic terminal size.
- Daemon architecture: Shared memory IPC for improved performance.
- Command parsing: Single-quoted arguments, backtick command capture, method chaining.
- Control flow: `if`/`else`, `for`, `while`, and `match` statements.
- Variable management: Variable expansion, scoping, exit code variables, tilde expansion.
- Process handling: `IoMonitor` for signal monitoring and pipe management, job management.
- Object and list access: Bracket access for objects and lists, JSON parsing methods.
- Line editor: Completion handling, bracket access, Docker-based static builds.
- Help command: Built-in usage instructions.
- Initial project documentation: Code of Conduct, contributing guidelines, license, and README.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.2.0-1" date="1776427200">- Installation packages: Packages for macOS (Homebrew), Debian, Fedora, and Arch Linux.
- Welcome navigator: Interactive tutorial and setup pages with starfield animation.
- History plugin: History storage with reverse search and JSONL persistence.
- Powerline prompt: Git status indicators, path abbreviation, and duration display.
- Session tracking: Session and frequency plugins for command tracking.
- Typo correction: Interactive "Did You Mean?" suggestions with fuzzy matching.
- Turbo mode: Optimized pipeline execution for `sort`, `head`, `tail`, and file reading.
- Highlighting plugin: Syntax highlighting on keystroke in interactive shell.
- Completion plugin: Subcommand completion for `git`, `docker`, `helm`, and `kubectl`.
- Deploy scripts: macOS and Linux release automation.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.3.0-1" date="1776513600">- Environment variable access: `env.VAR` syntax with prioritization logic.
- Stream methods: New output handling with stream methods for stderr.
- Command capture enhancements: Improved capture output structure with stderr handling.
- Pipeline variable expansion: Variables expanded within pipeline commands.
- Arithmetic and comparison operators: Full expression evaluation in the language.
- Navigator: Interactive typewriter with HAL outro and falling star animation.
- Refactored `CaptureOutput` structure for consistent error handling.
- Refactored execution and lifecycle handling in daemon.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.4.0-1" date="1776600000">- User-defined functions: `fn` declarations with multi-parameter support and pipeline execution inside function bodies.
- Semver type: `semver()` built-in for parsing and comparing semantic versions.
- Exit statement: `exit` with optional exit code.
- `write to` statement: Write output directly to files.
- `enforce` and `confirm_when`: Assertion and confirmation helpers.
- `.first`, `.empty`, `toNumber`, `extract` methods: New list and string methods.
- Output range methods: `write`/`writeln` for stream output.
- Interactive prompt built-ins: `prompt()`, `confirm()`, `choose()`, `password()`.
- Homebrew tap: Lash is now installable via Homebrew.
- Refactored method dispatching with dynamic discovery of list and string methods.
- Introduced `PipelineOptions` for enhanced pipeline execution configuration.
- Refactored variable expansion logic and extracted common functions.
- Enhanced error formatting with method suggestions.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.5.0-1" date="1776686400">- Daemon auto-start: Daemon starts automatically when needed.
- macOS sysinfo: Enhanced system information support on macOS.
- Updated dependencies for `fluent-asserts` and `trial` to latest versions.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.5.1-1" date="1776772800">- stderr-to-stdout redirection: Support for `2&gt;&amp;1` syntax with related parsing logic.
- Terminal restoring: `restoreTermios` resets terminal settings on exit using `TCSANOW`.
- Comment support: Comments are now ignored in statement parsing.
- Fixed signal handling to use `!= 0` for `activePid` checks.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.6.0-1" date="1776859200">- Match expressions: Value-returning match arms for pattern matching on values.
- Return statement: Functions now support explicit `return` for early exit.
- Multi-line method chains: Improved readability for chained method calls in scripts.
- Element-wise string methods for lists: Apply string methods across list items.
- String interpolation: Brace-delimited expressions in strings with escape sequence support.
- Subscript access in interpolation: Use `[]` inside string interpolation.
- Locale-aware sorting: Sort operations respect locale settings.
- Per-stage pipeline timing: Prefix a pipeline with `time` to get per-stage timing reports.
- Interactive prompt built-ins: `prompt()`, `confirm()`, `choose()`, `password()`, `confirm_when()`.
- Password handling and logging: Enhanced credential handling features.
- Recent command/output tracking: `EvalContext` tracks recent commands and their output.
- Fixed terminal input draining after script execution.
- Updated `handleEscapeSequence` to correctly handle prompt updates in `LineEditor`.
- Enhanced turbo sorting and unique operations.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.7.0-1" date="1776945600">- Double logical operators: Support for `&amp;&amp;` and `||` in command parsing.
- PTY handling: Improved PTY allocation and terminal response management, including `SIGTTOU` handling during terminal control.
- Version check plugin: Notifies users when a new release is available.
- Refactored `dispatchPipeline`, `handleInput`, and `executeWithRedirects` for improved permission checks, error handling, and memory management.
- Refactored Turbo operations to use `CLine` type and streamlined bulk/streaming execution paths.
- Updated turbo and startup performance metrics across multiple benchmarks.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.8.0-1" date="1777032000">- Homebrew resources: Added `lash-debug` and `lash-lsp` as resources in the Homebrew formula.
- Post-install/uninstall scripts: Shell integration is now managed automatically via install hooks.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.8.1-1" date="1777118400">- Updated installation URLs in Homebrew formula and documentation.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.8.2-1" date="1777204800">- Updated installation instructions and package names to use `lash-shell`.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.9.0-1" date="1777291200">- Expression output: Expressions used as statements (e.g. `` `ls -lsah`.take(4) ``) now print their result instead of silently discarding it. Applies to the daemon REPL, script execution, and control flow blocks.
- Turbo: multi-segment support and forked commands: Turbo execution now handles multi-segment pipelines and forked command structures.
- Turbo: regex grep operations: Added `grepRegex` and `grepRegexInvert` operations with `-E` flag support, using a custom `PosixRegex` struct for improved performance.
- Turbo: unique count: New `uniqueCounted` operation for `uniq -c`, counting occurrences of each unique line.
- Turbo: regex count fusion: `grepRegex` operations fused with length operations are combined into `grepRegexCount` / `grepRegexInvertCount`.
- Startup: Deferred heavy module imports to local scope in `app.d`, reducing startup overhead by ~0.5ms in lightweight mode.
- Turbo: native-only bypass: Pipelines with only native-favored operations (sort, head, tail) skip Turbo and run natively where the OS tools are faster.
- Turbo: GC disabled during execution: Garbage collection is disabled during Turbo pipeline runs to eliminate collection pauses.
- Turbo: dynamic buffer sizing: Buffer allocation in `executeTurboPipeline` is now based on operation type for better memory efficiency.
- Turbo: optimized line reading: New `readFirstNLines` function for efficient first-N-lines reads from file descriptors.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.10.0-1" date="1777377600">- Security profiles: Full profile system with create, edit, test, reload, and permission management. Profiles support resource limits, filesystem sandboxing (Landlock, Seatbelt), network policy enforcement, spawn allow/deny lists, forced environment variables, and inheritance.
- Profile auto-detection: Automatic profile switching based on session context, with dismissal support.
- Network proxy: Transparent network interception with TLS SNI verification, DNS interception, and hostname-level allow/deny policies via TUN device and lwIP integration.
- Session monitor: Audit pipe and monitoring capabilities for active sessions.
- Seccomp-BPF enforcement: Process and network restrictions via seccomp filters on Linux.
- Session sandboxing: Per-session temporary directories with Landlock enforcement and fallback logging.
- Armor integration: New armor module providing unified sandboxing across Landlock (Linux) and Seatbelt (macOS).
- Powerline enhancements: Transient prompt, user@host display, root/virtualenv/Node.js/Docker/Kubernetes/AWS context indicators, and exit status coloring.
- DAP client: `readExact` for reliable message reading in the debug adapter protocol client.
- Unique daemon sockets: Auto-started daemons use per-process socket files to avoid collisions.
- Migrated protocol layer from custom connection/shm modules to the `conduit` library.
- Replaced raw POSIX syscalls with checked wrappers for improved error handling.
- Refactored unit tests to use fluent assertions for improved readability.
- Enhanced error handling and validation across profile persistence and command dispatch.
- Client cwd: Session now uses the client's working directory instead of the daemon's.
- CI cleanup: Background daemon processes are now cleaned up after blackbox tests.
- Armor dependency: Fixed lwip linker path for armor 1.1.0.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.12.0-1" date="1777464000">- Native plugins: `.lash` files in `~/.lash/plugins/` auto-load their `fn` and `type` declarations into every session. Layered discovery: compiled-in bundle → `/usr/share/lash/plugins/` → user dir, with later layers overriding earlier same-named declarations. `lash --list-plugins` shows both native and external plugins with signatures, methods, and cache TTLs.
- Bundled git plugin: Ships with ~19 shortcuts (`gst`, `gco`, `gcb`, `gp`, `gpsup`, `gl`, `glo`, `gd`, `ga`, `gaa`, `gc`, `gcm`, `gb`, `gba`, `gsw`, `grhh`, `grb`, `grbc`, `grbi`) and four typed argument types (`GitBranch`, `GitRef`, `GitPath`, `GitArg`) that drive completion out of the box.
- Typed functions: `fn` accepts typed parameters, union types (`A | B | C`), list types (`[T]`), and a trailing rest parameter (`...args: [T]`). Arguments are coerced per the signature at command-position dispatch; coercion failures produce friendly `'X' is not a valid &lt;type&gt;` errors. Doc comments on functions and parameters attach to the AST and feed both `--help` output and LSP hover.
- User-defined types: `type Name { cache = &lt;duration&gt; values(query) { ... } validate(x) { ... } }`. `cache = 2s`/`5m`/`1h` memoizes `values(query)` per-query with TTL; errors bypass the cache. `validate(x)` is optional — derived as `x in values("")` when absent. Union type arms use `validate` to route between alternatives (`GitBranch | int` tries the type first, falls through to `int` on failure).
- `fn main` script entry point: When a script declares a top-level `fn main(...)`, CLI args are coerced through its typed signature. Missing required args or coercion failures emit `Error: ...` plus auto-generated help. `--help` / `-h` renders the shared help formatter (doc summary, typed-arg table, optional "Runs:" line for plugin wrappers). Scripts without `fn main` receive args through an implicit `args` list.
- Real-time subprocess streaming: Fn bodies with pipelines stream stdout/stderr to the terminal as they run (`commandStream` scope callback) instead of buffering. Stderr is rendered in red.
- Shared help formatter: Plugin `fn --help`, `fn main --help`, and `lash --list-plugins` all use the same renderer in `lash.backend.help`.
- Heredoc: `&lt;&lt;EOF ... EOF` and `&lt;&lt;-EOF` (tab-stripping) for multi-line input redirection. A quoted delimiter (`&lt;&lt;'EOF'`, `&lt;&lt;"EOF"`) suppresses variable interpolation in the body.
- Here-strings: `&lt;&lt;&lt;` feeds a single string to stdin without spawning a temp file.
- Process substitution: `&lt;(cmd)` expands to a `/dev/fd/N` path so commands can read from a subprocess pipeline as if it were a file.
- Brace expansion: comma lists `{a,b,c}`, numeric ranges `{1..10}` (with optional step `{1..10..2}`), letter ranges `{a..z}`, nested braces, and Cartesian products (`{a,b}{x,y}`) — all expanded at tokenization and integrated with pipeline variable expansion.
- POSIX parameter expansion: `${var:-default}`, `${var:+alt}`, `${var:?msg}`, `${#var}` (length), and `${var/pat/rep}` / `${var//pat/rep}` (replace-first / replace-all).
- Recursive globbing: `**/*.d` and friends now match across directory boundaries.
- Reverse-incremental history search: Ctrl-R style substring search with a dedicated overlay; results refine on each keystroke and Ctrl-R cycles through matches.
- Overlay system: New stack-based overlay manager (`SelectionOverlay`, `HistoryPreviewOverlay`, permission-request modal) routes key events to the topmost overlay and composes cleanly with the line editor. Suggestion handling moved to `SelectionOverlay` with proper accelerator behavior.
- Permission prompts: When a plugin or sandbox check needs user approval, a modal overlay collects the response without disrupting the prompt line.
- Multi-line line editor: `LineEditor` now detects newlines in pasted/edited input, redraws only the affected region, and uses `refreshAfterEdit` to keep the visible buffer in sync without flicker.
- Terminal title: Shell sets the window title from the running command via `setTitle` (with control-byte escaping). New `commandTitle` extracts and truncates the first token from a command line for the title.
- Spinner: Frontend spinner now reacts to plugin events for smoother feedback during long-running operations.
- ANSI styling helpers: New escape-sequence builders centralize terminal styling for overlays and rendering.
- Highlight plugin themes: Syntax-highlight colors are now driven by named themes; backticks (command captures) get their own coloring.
- Foreground signal handling: SIGINT / SIGTSTP delivered to a foreground job updates job state correctly and returns control to the shell instead of leaking through to the parent.
- PTY job resumption: `fg` resumes a stopped foreground PTY job with the terminal hand-off it needs to receive keystrokes again.
- Signal-byte stripping: PTY input filters out signal bytes before re-injecting them so Ctrl-C / Ctrl-Z don't get processed twice.
- Hover: Resolves doc comments on `fn`, `type`, and parameters.
- Completion: Offers keywords, builtins (20 with descriptions), native-plugin fns, types, scope variables, and PATH executables at command position. Subcommand-aware completion for `git`, `docker`, `helm`, `kubectl`, `cargo`, `npm`, `dub`, `systemctl`. Lazy `whatis`-backed descriptions via `completionItem/resolve`. `--help`-parsing and bash-completion-invocation fallbacks extend coverage to unknown binaries.
- Native-plugin function completion: Plugin `fn` names complete at command position; their typed arguments drive context-aware completion.
- Semantic tokens: Doc comments are classified with a `documentation` semantic-token modifier only when followed by a fn/type/unittest declaration.
- Input-event context: `inputKeyData` events now include alias and function-name context so plugins can react to expansions in flight.
- `usage { }` blocks removed. Scripts that used `usage { ... }` to declare args must migrate to `fn main(...)` with typed parameters. No auto-migration — the old syntax is a parse error. Enum and range constraints (`[a, b, c]`, `1..100`) move to user-defined `type` with `validate(x)`.
- **`$1`..`$N`, `$@`, `$*`, `$#` removed.** `$0` (script path) is the only surviving shell-positional. Access named parameters on `fn main` or the implicit `args` list.
- Armor `includeWorkdir` was dead code. `buildLinuxContext` passed an empty string as the cwd parameter to `buildLandlockRuleset`, so the workdir was never actually added to Landlock rules — every sandboxed pipeline ran with the cwd inaccessible. Fixed in `lash.runtime.armor.buildArmorContext` by appending the cwd to `readWritePaths` when `includeWorkdir` is set, plus walking parent directories up to `/` so `getcwd()` syscalls resolve.
- Default profile filesystem rules: Added `/dev` to `read_write` (programs need `/dev/null` for both reading and writing) and `~` to `read_only` so commands like `git` can read `~/.gitconfig` and `~/.ssh/`. Removed the hard `max_processes = 512` cap from the `developer` profile — `RLIMIT_NPROC` is per-UID, not per-tree, so a fixed cap broke Go binaries (`glab`) and `git push` once the user had any background processes.
- DAP integration test client: Race condition where `poll()` on the OS fd reported "no data" while `fread`'s C-stdio buffer still held the next message. Switched `tests/integration/dap.d` to direct POSIX `read()` so poll readiness matches available data.
- `lash.lang.evaluator.coercion` centralizes argument coercion for both command-position dispatch and `fn main` script entry.
- Doc-comment accumulation (`DocBuffer` + `attachDocs` + `extractDocLines`) shared across block-body parser, LSP tolerant parser, and per-line script executor. `extractDocLines` decomposed into `skipWhitespace` / `scanLineComment` / `scanBlockComment`, each unit-tested.
- `executable` enumeration extracted from the completions-plugin engine into a reusable module so the LSP can use it without pulling in the plugin framework.
- Error-handling closure deduplicated across `script_execution.d` (13 sites collapsed into two `failWith` delegates).
- Tutorial tests and obsolete usage-block scripts removed from the test suite.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.12.1-1" date="1777464001">- AUR (`lash-shell-bin`): Arch users can now install via any AUR helper (`yay -S lash-shell-bin`). PKGBUILD wraps the upstream `.pkg.tar.zst`. CI auto-updates on each tag; `.SRCINFO` is regenerated by a bash converter (no `makepkg` dependency).
- OBS (openSUSE Build Service): `home:gedaiu/lash-shell` builds for Fedora 41/42/43/Rawhide, openSUSE Tumbleweed/Leap 15.6/16.0, Ubuntu 22.04/24.04/24.10, Debian 12/13, and CentOS 8 Stream. CI hits a service-token trigger after each release; OBS pulls a fresh source tarball from GitLab and rebuilds.
- Homebrew formula renamed: `lash` → `lash-shell` for consistency with `.deb` / `.rpm` / `.pkg.tar.zst` package naming. Users update with `brew uninstall lash &amp;&amp; brew install lash-shell`.
- AppStream metainfo + hicolor icons: `lash-shell` now appears in GNOME Software / KDE Discover with logo, summary, and description. Icons installed at standard `/usr/share/icons/hicolor/&lt;size&gt;/apps/com.szabobogdan.Lash.png` paths.
- CHANGELOG.md as single source of truth: `CHANGELOG.yaml` (nfpm), `obs/debian/changelog`, and the `%changelog` section in `obs/lash-shell.spec` are now regenerated on every release by `scripts/changelog-derive.py`.
- Project metadata: homepage standardised to &lt;https://lash.szabobogdan.com/&gt; across `nfpm.yaml`, `homebrew/lash-shell.rb`, `dub.json`, and the AppStream metainfo. `Vcs-Git` / `Vcs-Browser` Control fields point at the GitLab repo.
- `release.lash` rewritten for CI: takes no args, derives version from `git describe --tags --exact-match`, hard-fails if `lash --version` doesn't match the tag, and runs identically on the developer machine and the GitLab runner.
- Single-source release flow: dropped `scripts/release.sh` in favour of `./lash release.lash` (the daemon is the release tool too).
- Syntax highlight no longer lags one keystroke: every buffer mutation (typing, backspace, Ctrl+U/K/W, delete, paste, history navigation) now refreshes highlight spans before redrawing. Previously the daemon's highlighter saw the pre-edit buffer.
- Backtick-wrapped commands highlight correctly: `` `ls`.map(…) `` now colours `ls` as a builtin and the backticks as brackets, instead of the whole token rendering as an "unknown command" error.
- Dark / light themes: new `Theme` struct in the highlight plugin with two palettes that meet the design constraints (no orange/red on valid commands/args/values, no dim/transparent colours).
- `theme` builtin: `theme` prints the current theme; `theme dark` / `theme light` writes `highlight.theme = …` to `~/.lash/config`. The highlight plugin reloads via mtime check on every keystroke.
- `method` palette moved off blue: `.map`, `.toLower`, etc. now render in magenta so they're visually distinct from external commands (cyan family).</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.12.2-1" date="1777464002">- release.lash: backtick command with interpolated path (`` `${script_dir}/lash --version` ``) was being parsed as a single argv token; switched to `./lash --version` (runs in workspace cwd).
- CHANGELOG.yaml: dates now emitted in RFC3339 (`2026-04-29T00:28:30Z`) so nfpm's changelog parser accepts them.
- OBS commit path: `osc checkout --output-dir DIR` places the package files directly in `DIR`, not in `DIR/home:gedaiu/lash-shell`; release.lash now `cd`s into the right dir.
- AUR sha line: build the `sha256sums=(…)` replacement via lash string concat to avoid any quoting ambiguity in the sed argument.
- nfpm.yaml: dropped `deb.fields`, `rpm.summary`, `archlinux.pkgbase` — those fields are recognised in newer nfpm versions, but the v2.41.1 we install in CI rejects them. Re-add when CI bumps nfpm.
- AUR key location: moved from `/etc/gitlab-runner/aur-ssh-key` to `/home/gitlab-runner/.ssh/aur-ci-key` so the gitlab-runner user can read it (the system dir is `drwx------` root-only).</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.12.3-1" date="1777550400">- release.lash: previous tarball cleanup loop never matched anything because `` `ls lash-*.tar.gz` `` in a lash backtick passes the glob to `ls` literally; switched to `bash -c "ls …"` so old `lash-*.tar.gz` files in the OBS package now actually get `osc rm`'d before the new commit.
- install.md rewritten with AUR (`yay -S lash-shell-bin`) for Arch users and OBS native repos (one apt/dnf source line that auto-updates) for Fedora/RHEL/CentOS, openSUSE, Debian, and Ubuntu. The one-shot `curl + dpkg/rpm/pacman` instructions stay as fallbacks.</changelog>
  <changelog author="Bogdan Szabo &lt;contact@szabobogdan.com&gt; - 0.13.0-1" date="1777723200">- `type Foo { template = "path" }` binds a user-defined type to a text-template file. Fields are inferred from the template body; constructing `Foo { ... }` is type-checked against that inferred shape. Templates can use `${name}` (legacy) or `{{name}}` substitution, dotted paths `{{a.b.c}}`, conditional blocks `{{#if x}}…{{/if}}`, and loops `{{#each xs as |i|}}…{{/each}}` with arbitrary nesting. Whitespace trimming around block tags is always-on. There is no `{{else}}` and no whitespace sigils.
- Strict typing at three gates: parse-time semantic analysis (catches missing required fields and obvious literal-type mismatches like `flag: 42` against a bool field, halting execution before any statement runs), construction-time validation in `evalObjectLiteral` (catches dynamic values), and render-time as a final safety net. Errors carry path-aware messages like `template field 'Fleet.environments[0].servers[0].host' is required but missing`.
- Implicit methods on typed objects: `obj.render()` returns the rendered text, `obj.write(stream)` writes it to a stream.
- `write VALUE to "path"` shorthand: desugars to `write to "path" as f { VALUE.write(f) }`. Reads as a single declarative line for typed templates.
- JS-style object shorthand: `{ name }` desugars to `{ name: name }`. Mix shorthand and explicit entries freely. Works for both untyped and typed (`Foo { ... }`) literals.
- Typed object literals (`Foo { entries }`): the type-name prefix attaches a `typeName` to the constructed object and triggers template-shape validation when the type carries a `template` clause.
- Default-value parameters in `fn`: `fn main(file: string = "VERSION")` declares an optional parameter with a default. Defaults can be any expression; evaluated lazily when the caller omits the arg.
- Forward function references: the semantic analyzer pre-passes top-level `fn` declarations so `fn main` can call helpers defined below it. Tutorials can finally put the entry point at the top of the file.
- Analyzer halts on error: any `Severity.error` diagnostic from semantic analysis stops execution before the first statement runs, surfacing the diagnostic on stderr (with `--log-verbose`) or via the rendered output.
- `stdout` / `stderr` recognised as built-in stream names by the semantic analyzer (no more "may not be declared" warnings on `.writeln(stdout)`).
- All five generated release artifacts are now rendered from typed templates instead of sed pipelines:
- Removed the in-repo `aur/PKGBUILD` (now derived). The `.template` files are the single source of truth; rendering is mechanical and the typed-template engine catches missing fields or wrong types at parse time.
- New tutorial [`docs/tutorials/typed-templates.md`](docs/src/content/docs/tutorials/typed-templates.md): end-to-end walk-through generating systemd unit files from a typed value, demonstrating field inference, conditionals, loops, nested data, and the JS-style shorthand.
- New reference page [`docs/reference/templates.md`](docs/src/content/docs/reference/templates.md): full grammar table, validation gates, whitespace rules, error-message format.
- All ten existing tutorials rewritten in a "concept-intro + test-first" style: each opens with "What's a [variable / function / chain / control-flow / …]?" before the goal, then walks through each step by writing the unittest first and only then the implementation. Each tutorial mentions how to run the tests with `lash --test FILE` and shows the auto-derived `--help` output.
- Tutorial scripts modernized in `tests/scripts/`: `tutorial_bump`, `tutorial_disk_hogs`, `tutorial_log_errors`, `tutorial_resize`, `tutorial_organize`, `tutorial_backup`, `tutorial_analyze_log`, `tutorial_deploy`, `demo_showcase` — all converted from the removed `usage { }` syntax to `fn main(...)` with default-value parameters and inline `unittest { }` blocks.
- New integration suite [`tests/integration/tutorials.d`](tests/integration/tutorials.d) drives `--help` and `--test` for every tutorial script.
- Bumped to v0.4 ([spec/index.md](spec/index.md)).
- §3.6 — `template = "&lt;path&gt;"` clause on `type`; mutually exclusive with `values` / `validate`.
- §3.7 — new section on typed templates: grammar, inferred-shape rules, three validation gates, implicit `.render()` and `.write(stream)` methods.
- §5.8 — formalised object literals; covers the shorthand `{ x } ≡ { x: x }`.
- §5.9 — typed object literals; static-analyzer rules.
- §6.10 — `write to` statement (block form and the `write VALUE to PATH` shorthand).</changelog>
</package>
</otherdata>