What's Changed
- fix: use multi_thread runtime for WASM integration tests by @mizzy in #1592
- fix: pass actual factories to DiagnosticEngine in LSP by @mizzy in #1593
- fix: eliminate Box::leak memory leak for provider names by @mizzy in #1594
- fix: add serde(default) to v3 state fields for backward compatibility by @mizzy in #1601
- fix: clear LSP schemas when all provider blocks are removed by @mizzy in #1602
- fix: make LSP provider discovery recursive by @mizzy in #1603
- fix: include file content hash in WASM precompile cache key by @mizzy in #1605
- fix: refresh orphaned resources before planning in apply command by @mizzy in #1606
- fix: add post-rename verification to LocalBackend lock renewal by @mizzy in #1607
- feat: add interpolation support for heredocs (<<EOT vs <<'EOT') by @mizzy in #1608
- feat: add
docssubcommand with embedded documentation by @mizzy in #1612 - feat: support revision/branch specification in provider source by @mizzy in #1614
- feat: add
skillssubcommand with Agent Skills installer by @mizzy in #1615 - fix: fix broken test_from_file_cached_creates_cache test by @mizzy in #1616
- feat: add
--jsonflag to validate, plan, and state show commands by @mizzy in #1617 - fix: resolve CBD reverse dependencies when Delete binding is None by @mizzy in #1618
- docs: update aws provider reference by @mizzy in #1619
- fix: error when provider plugin is not loaded during validate by @mizzy in #1623
- fix: use stderr for provider resolver download messages by @mizzy in #1625
- fix: show info-level diagnostic for unloaded providers in LSP by @mizzy in #1628
- fix: detect assignment-syntax struct blocks for LSP completion by @mizzy in #1630
- fix: show actual error reason instead of generic 'run carina init' message by @mizzy in #1631
- fix: show struct block snippet instead of builtin functions for Struct-typed attributes by @mizzy in #1633
- fix: show DSL-format enum completions for WASM providers in LSP by @mizzy in #1635
- fix: always disable sccache in pre-commit hook by @mizzy in #1636
- fix: re-resolve revision SHA on carina init --upgrade by @mizzy in #1637
- docs: update aws provider reference by @mizzy in #1638
- fix: use bare enum values in LSP completions by @mizzy in #1639
- refactor: rename carina.lock to carina-providers.lock by @mizzy in #1642
- fix: correct state lock filename in benchmark script by @mizzy in #1644
- feat: add serializable ValidatorType for WASM boundary by @mizzy in #1645
- fix: point validation errors to the specific attribute line in LSP by @mizzy in #1647
- fix: cap HTTP timeouts for all WASM plugin requests to prevent hang by @mizzy in #1649
- fix: reject double-namespace in validate_enum_namespace by @mizzy in #1652
- fix: make validate_enum_namespace strict about part count by @mizzy in #1653
- fix: run provider config type validation in LSP diagnostics by @mizzy in #1655
- feat: fallback import matching by name_attribute for anonymous resources by @mizzy in #1657
- feat: make S3 backend region optional (auto-discover via GetBucketLocation) by @mizzy in #1661
- feat: detect and block backend configuration changes by @mizzy in #1662
- fix: detect local → remote backend transition by @mizzy in #1664
- feat: add
carina state migratecommand by @mizzy in #1665 - fix: detect anonymous → named rename to avoid destructive plans by @mizzy in #1667
- fix: iterate workflow runs to find WASM artifact across workflows by @mizzy in #1669
- fix: detect rename for resources with no create-only attrs by @mizzy in #1671
- feat: Provider::read_data_source for input-taking data sources by @mizzy in #1674
- fix: plumb read_data_source through WASM plugin boundary by @mizzy in #1678
- fix: report both HTTP and basic instantiation errors in WasmProviderFactory by @mizzy in #1682
- fix: resolve ResourceRef in data source inputs before refresh by @mizzy in #1684
- fix: run orphan refresh and anonymous→let rename transfer before phase 2 by @mizzy in #1686
- fix: remove noisy log::error from core_to_wit_value for expected unresolved refs by @mizzy in #1688
- fix: display pure move effects in plan output by @mizzy in #1690
- fix: stop converting underscores to hyphens in enum values by @mizzy in #1691
- fix: suppress redundant Move nodes in TUI when Update/Replace exists by @mizzy in #1692
- Replace vendored WIT files with git submodule by @mizzy in #1694
- docs: add submodule initialization instructions by @mizzy in #1695
- fix: reject unknown attributes during schema validation by @mizzy in #1697
- fix: install LSP providers in .crn file's directory, not workspace root by @mizzy in #1699
- feat: type-check module arguments with provider-defined types by @mizzy in #1704
- feat: support quoted strings as map/attribute keys by @mizzy in #1705
- fix: handle quoted string keys in carina fmt by @mizzy in #1708
- fix: distinguish missing schema from unknown resource type in LSP by @mizzy in #1712
- feat: scope LSP provider schemas per-directory by @mizzy in #1715
- fix: create backend-lock.json only when state is written by @mizzy in #1716
- feat: resolve module providers from callers via import map by @mizzy in #1717
- fix: LSP state_for_path skipped the config directory itself by @mizzy in #1719
- fix: type completions inside list()/map() in arguments blocks by @mizzy in #1725
- fix: enable provider-defined type completions in arguments blocks by @mizzy in #1726
- fix: rename built-in type cidr to ipv4_cidr by @mizzy in #1732
- fix: preserve comment position in carina fmt by @mizzy in #1733
- fix: show Arguments and Attributes separately in resource hover by @mizzy in #1734
- feat: add hover for module call names by @mizzy in #1735
- feat: add global plugin cache for provider WASM sharing by @mizzy in #1736
- fix: add global plugin cache for revision-based providers by @mizzy in #1737
- feat: LSP uses installed providers only, no auto-download by @mizzy in #1738
- fix: reload provider schemas when WASM or lock files change by @mizzy in #1740
- feat: add module binding name completion at top level by @mizzy in #1741
- feat: add import path completion with filesystem listing by @mizzy in #1742
- feat: scaffold module call with argument tab stops by @mizzy in #1743
- feat: add Custom type to WASM provider protocol by @mizzy in #1744
- feat: validate module argument types against provider-defined custom validators by @mizzy in #1745
- feat: add validate-custom-type WIT interface for WASM provider plugins by @mizzy in #1746
- fix(docs): prevent LinkCard hover text from vanishing in light theme by @mizzy in #1748
- feat: validate attribute parameter ref types against declared type by @mizzy in #1753
- fix: validate module attribute params before module expansion by @mizzy in #1754
- fix: include module path in attribute type error and add LSP diagnostic by @mizzy in #1755
- feat: show structured diff for nested map changes in plan output by @mizzy in #1756
- feat: support typed Map keys for key-level validation by @mizzy in #1760
- feat: LSP Map key completions from typed key schema by @mizzy in #1761
- feat: support struct field completions inside Union types by @mizzy in #1762
- test: verify LSP diagnostics warn on invalid Map keys by @mizzy in #1763
- fix: show specific struct field errors in Union type validation by @mizzy in #1765
- chore: bump version to 0.4.0 by @mizzy in #1766
Full Changelog: v0.3.0...v0.4.0