Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
201 commits
Select commit Hold shift + click to select a range
b38b125
fix/toml found miscompiles (#166)
zaidejjo Sep 30, 2026
23bfc8c
Realse v0.1.5
zaidejjo Sep 30, 2026
c6b111f
fix/deterministic warning order (#167)
zaidejjo Sep 30, 2026
e215a3c
chore/ci release pipeline (#169)
zaidejjo Oct 1, 2026
2f3f05f
Merge branch 'main' into dev
Oct 1, 2026
c95a575
Realse v0.1.6
zaidejjo Oct 1, 2026
5caf3b3
ci: PAT-created releases so downstream triggers fire; ubuntu base for…
zaidejjo Oct 1, 2026
e5ab700
Merge branch 'main' into dev
Oct 1, 2026
8d432fc
feat: multi-platform releases, README refresh, CONTRIBUTING, Apache-2…
zaidejjo Oct 1, 2026
d2c3382
chore: drop windows from release assets (compiler does not support it…
zaidejjo Oct 1, 2026
df11dfc
Merge pull request #175 from zaidejjo/feat/readme-installers
zaidejjo Oct 1, 2026
e58127c
feat: zz setup, shell completions, auto-heal, install --path, CLI pro…
zaidejjo Oct 1, 2026
733e264
Merge pull request #176 from zaidejjo/feat/setup-completions-install-…
zaidejjo Oct 1, 2026
17a7609
feat/setup fixes (#177)
zaidejjo Oct 1, 2026
3d2694d
feat/upgrade doctor pkg tools (#178)
zaidejjo Oct 1, 2026
ae9b86d
native: yield tail call/return values from if/else branches (#179)
zaidejjo Oct 1, 2026
350499e
native: heal loop-arena strings at retaining stores
Oct 1, 2026
0d334de
tests: regression fixtures for arena-string stores + early call-returns
Oct 1, 2026
c4778d5
fuzz: v2 shapes behind --shapes v2 (default mode byte-identical)
Oct 1, 2026
0150f93
frontend: fold -9223372036854775808 to i64::MIN
Oct 1, 2026
870af4f
feat: bitwise operators &, |, ^, ~, <<, >>
zaidejjo Oct 1, 2026
47bc8cf
fix: review follow-ups for bitwise operators
zaidejjo Oct 1, 2026
a79dd80
native: index-set must not zz_int-wrap string values
Oct 1, 2026
3dd6321
docs: fuzz v2 shape families in README
Oct 1, 2026
180a4d1
pm: opt-in [package] zz minimum-compiler requirement
Oct 1, 2026
dc8102b
docs: VM value-copy design (COW + last-use move)
Oct 1, 2026
35ad970
docs: v0.1.6 draft release notes (no tag)
Oct 1, 2026
40aaf3d
Merge pull request #180 from zaidejjo/fix/toml-pkg-followups
zaidejjo Oct 1, 2026
f06a4c2
Merge remote-tracking branch 'origin/dev' into feat/bitwise-ops
zaidejjo Oct 1, 2026
1655e2e
fix: assert dev-build marker on stderr in build_e2e
zaidejjo Oct 1, 2026
a3b3105
Merge pull request #181 from zaidejjo/feat/bitwise-ops
zaidejjo Oct 1, 2026
e45e4d3
bench: move-append elision harness plus pre-optimization baseline
Oct 1, 2026
0826ea4
analysis: shared move-on-self-reassign eligibility plus tests
Oct 1, 2026
6c6db0a
feat: tuple indexing, len, and bare destructuring
zaidejjo Oct 1, 2026
48b7f43
fix: formatters preserve bare vs paren destructure form
zaidejjo Oct 1, 2026
e7a4c7f
Merge pull request #182 from zaidejjo/feat/lang-limits
zaidejjo Oct 1, 2026
175bd72
perf: move-on-self-reassign append elision (native + VM)
zaidejjo Oct 2, 2026
3305b03
feat: compound assignment (+= -= *= /= %= **= &= |= ^= <<= >>=)
zaidejjo Oct 2, 2026
e3e0ddc
Merge pull request #183 from zaidejjo/feat/compound-assign
zaidejjo Oct 2, 2026
5548a8a
feat: generic structs (Box<T>, impl Box[T], inference + methods)
zaidejjo Oct 2, 2026
64fbb7c
Merge pull request #184 from zaidejjo/feat/generic-structs
zaidejjo Oct 2, 2026
0795339
fix: box unboxed structs and raw scalars in array/tuple literals (AOT)
zaidejjo Oct 2, 2026
35d8666
Merge pull request #185 from zaidejjo/fix/aot-tuple-unboxed-boxing
zaidejjo Oct 2, 2026
386ada7
perf: linear appends via move-on-self-reassign takes (native + VM)
zaidejjo Oct 2, 2026
cbdc780
fix: raw-scalar fields in unboxed literals + release boxed container …
zaidejjo Oct 2, 2026
2ed5032
Merge pull request #186 from zaidejjo/fix/aot-container-temp-release
zaidejjo Oct 2, 2026
83b984f
Merge origin/dev into perf/move-append-elision
zaidejjo Oct 3, 2026
8604635
Merge pull request #187 from zaidejjo/perf/move-append-elision
zaidejjo Oct 3, 2026
7c11630
docs: AOT parity fix plan for nested [[str]] + UTF-8 measure
zaidejjo Oct 3, 2026
1c0e6a7
fix: AOT parity for nested [[str]] stores and UTF-8 string measure
zaidejjo Oct 3, 2026
e8d882f
Merge pull request #189 from zaidejjo/fix/aot-nested-array-utf8-parity
zaidejjo Oct 3, 2026
fda4f38
fix: parser typed-decl in while cond, len(dict) native, call-result s…
zaidejjo Oct 3, 2026
54800b0
Merge pull request #190 from zaidejjo/fix/parser-dictlen-structfield-…
zaidejjo Oct 3, 2026
9f88586
fix: native sqlz row cN aliases plus struct == boxing and deep equality
zaidejjo Oct 3, 2026
b5a1d0e
Merge pull request #191 from zaidejjo/fix/aot-row-cN-struct-eq
zaidejjo Oct 3, 2026
2e98a71
feat: trailing commas in call args, func params, closure params
zaidejjo Oct 3, 2026
1e8e6e9
Merge pull request #192 from zaidejjo/feat/trailing-comma-call-args
zaidejjo Oct 3, 2026
20e30cc
feat(test): cargo-style grouped output, VM default + AOT engine
zaidejjo Oct 3, 2026
0871a63
fix(test): review pass — pipe drains, honest skips, float literals
zaidejjo Oct 3, 2026
137a171
feat(test): kill all five limitations
zaidejjo Oct 3, 2026
fef624d
feat(stdlib): native std.term raw-mode primitives
zaidejjo Oct 3, 2026
3ff58a8
Merge pull request #193 from zaidejjo/feat/std-term-raw-mode
zaidejjo Oct 3, 2026
64e2cc0
feat(stdlib): add term.flush for interactive rendering
zaidejjo Oct 3, 2026
3c9f379
Merge pull request #194 from zaidejjo/feat/std-term-flush
zaidejjo Oct 3, 2026
48a79fb
fix(codegen): free-function method receivers (Bug 8)
zaidejjo Oct 3, 2026
5f95284
chore(parity): refresh known-native-failure map
zaidejjo Oct 3, 2026
cc5f375
Merge pull request #195 from zaidejjo/fix/aot-method-dispatch-boxing
zaidejjo Oct 3, 2026
9ce2f64
fix(codegen): method receivers on call/index/literal/field roots (Bug…
zaidejjo Oct 3, 2026
ed57ec6
Merge pull request #196 from zaidejjo/fix/aot-method-receiver-roots
zaidejjo Oct 3, 2026
4fea3b2
Fix checker/runtime/AOT parity bugs: var collision, default args, ind…
zaidejjo Oct 3, 2026
a006623
Default zz build to static; fix native term.flush (dual-buffer deadlock)
zaidejjo Oct 4, 2026
cbce9ed
Add zz build --full (max optimization) and -o output naming
zaidejjo Oct 4, 2026
e157333
Fix compiler gaps: BIT bool coercion, method-shadow calls, selective …
zaidejjo Oct 4, 2026
4b664b4
Fix qualified-alias calls and first-class function values natively
zaidejjo Oct 4, 2026
5555659
Merge pull request #198 from zaidejjo/fix/compiler-gaps-todo-app
zaidejjo Oct 4, 2026
b639ac8
feat(arena): add zz_arena bump allocator + compiler bench corpus
zaidejjo Oct 4, 2026
f2c3624
feat(arena): track zz_arena in Cargo.lock
zaidejjo Oct 4, 2026
978bb15
feat(arena): zero-copy lexer tokens (P2a)
zaidejjo Oct 4, 2026
95ca2e6
feat(arena): skip no-op decorator re-expansion (P2b)
zaidejjo Oct 4, 2026
bedb6cb
feat(arena): checker key sharing + result moves (P3)
zaidejjo Oct 4, 2026
4516bd8
feat(arena): pre-join CallPath dotted names at compile time (P4)
zaidejjo Oct 4, 2026
37e7de8
docs(arena): P0-P6 record, production notes, open gates (P6)
zaidejjo Oct 4, 2026
cdce3de
Merge pull request #199 from zaidejjo/feat/arena-allocator
zaidejjo Oct 4, 2026
48cce20
feat(arena-next): pre-size lexer/parser collections (Q1)
zaidejjo Oct 4, 2026
c1e4c43
feat(arena-next): multi-file bench corpus (Q0); mimalloc A/B rejected…
zaidejjo Oct 4, 2026
5a6682e
feat(arena-next): move loader seeds into checker (Q3)
zaidejjo Oct 4, 2026
ac66334
feat(arena-next): move entry-point seeds into final check (Q4a)
zaidejjo Oct 4, 2026
f761543
bench: single-file 4000-func corpus for loader-overhead isolation
zaidejjo Oct 4, 2026
220a5c3
Merge pull request #200 from zaidejjo/feat/arena-next
zaidejjo Oct 4, 2026
6e63300
feat(arena-scale): borrow clean string literals in lexer (S3)
zaidejjo Oct 4, 2026
ecb4dba
feat(arena-scale): dep-aware module check cache (S1)
zaidejjo Oct 4, 2026
6b7f4ed
docs(arena): arena-next record (Q0-Q4, S1, S3, de-scoped S2)
zaidejjo Oct 4, 2026
de57d1e
Merge pull request #201 from zaidejjo/feat/arena-scale
zaidejjo Oct 4, 2026
d1268e1
fix(aot): plug heap leaks in string concat, elvis, loop locals
zaidejjo Oct 4, 2026
da6a5a6
Merge pull request #202 from zaidejjo/feat/arena-overflow-leak
zaidejjo Oct 4, 2026
b4c3e68
feat(stdlib,frontend): pure-ZZ map/set/dec/bytes/csv/time-date + matc…
zaidejjo Oct 4, 2026
d769908
feat(lang): contextual type aliases with cross-module support
zaidejjo Oct 4, 2026
0d0b26a
Merge pull request #203 from zaidejjo/fix/zz-gaps-full
zaidejjo Oct 4, 2026
960bd5f
fix(aot): link libcurl/libsqlite3 only when reachable natives need them
zaidejjo Oct 4, 2026
8be354c
Merge remote-tracking branch 'origin/dev' into fix/link-hygiene
zaidejjo Oct 4, 2026
ca07002
fix(aot): register pure-ZZ map/set/dec/bytes/csv/str/time gaps in dri…
zaidejjo Oct 4, 2026
5a13008
fix(fmt): emit import alias before selective item list
zaidejjo Oct 4, 2026
da41083
Merge pull request #204 from zaidejjo/fix/link-hygiene
zaidejjo Oct 4, 2026
69b2d87
feat(toolchain): managed Zig backend via zz toolchain install
zaidejjo Oct 4, 2026
25af922
Merge pull request #205 from zaidejjo/feat/zig-toolchain
zaidejjo Oct 4, 2026
2563b59
feat(aot): unboxed scalar calling convention for monomorphic functions
zaidejjo Oct 4, 2026
5707a82
fix(aot): scope unboxed state out of closures; capture locals in _u b…
zaidejjo Oct 4, 2026
6e4d76d
test(parity): graduate frame_slots to strict parity
zaidejjo Oct 4, 2026
1084c3c
Merge pull request #206 from zaidejjo/perf/unboxed-scalar-calls
zaidejjo Oct 4, 2026
d87bb2c
feat(aot): elide loop safepoints without concurrency; forward stack-a…
zaidejjo Oct 4, 2026
a06d346
Merge pull request #207 from zaidejjo/perf/unboxed-range-loops
zaidejjo Oct 4, 2026
80851bd
feat(aot): inline str(int/bool) in append chains; elide dead array re…
zaidejjo Oct 5, 2026
74f3ad6
Merge pull request #208 from zaidejjo/perf/str-append-path
zaidejjo Oct 5, 2026
42d0156
feat(aot): ascii fast path for str char length
zaidejjo Oct 5, 2026
dafcf9c
Merge pull request #209 from zaidejjo/perf/io-path
zaidejjo Oct 5, 2026
cc45c96
feat(lang): user-defined enums with erasure to objects
zaidejjo Oct 4, 2026
2500291
feat(lang): generic enums, payload chaining, match/if-let hardening
zaidejjo Oct 5, 2026
5ad6e81
fix(aot): guard tuple-pattern unpack behind tag+len test
zaidejjo Oct 5, 2026
672b87b
Merge pull request #210 from zaidejjo/feat/user-enums
zaidejjo Oct 5, 2026
1f23a0f
m0: fixture feature tags, edge corpus, parity sweep extended
zaidejjo Oct 5, 2026
d16b1bb
fix(vm): write-through chained index stores
zaidejjo Oct 5, 2026
26acb37
merge fix/vm-chained-index-store: write-through chained index stores
zaidejjo Oct 5, 2026
77ebe71
merge feat/m0-parity-harness: M0 fixture tags, edge corpus, parity sweep
zaidejjo Oct 5, 2026
ed8bb58
merge dev (M0) into pre-m1 work
zaidejjo Oct 5, 2026
94f29c9
pre-m1: quad matrix, normalizer gates, modules parity, benches, IR sp…
zaidejjo Oct 5, 2026
b0898cf
spec: lock closure capture semantics (by-reference, per-iteration bin…
zaidejjo Oct 5, 2026
8d6ed6d
fix(aot): parity-safe C flags, explicit NaN guard for int() casts
zaidejjo Oct 5, 2026
ce05724
fix(aot): copy-on-write struct headers (value semantics for field wri…
zaidejjo Oct 5, 2026
8d799dd
merge fix/aot-flags-parity: parity-safe C flags + NaN guard
zaidejjo Oct 5, 2026
de4ed16
fix(vm): always-wrap integer arithmetic (+ - * neg pow loop counters)
zaidejjo Oct 5, 2026
b05cf6f
fix(aot+vm): trap MIN/-1 and MIN%-1 on all legs
zaidejjo Oct 5, 2026
356da26
fix(aot): trap negative integer exponents natively
zaidejjo Oct 5, 2026
289a176
fix(aot): trap out-of-bounds index reads natively
zaidejjo Oct 5, 2026
0713038
WIP: detach-on-mutation for index stores (runtime side)
zaidejjo Oct 5, 2026
160f950
Merge branch 'fix/aot-struct-aliasing' into feat/pre-m1-matrix
zaidejjo Oct 5, 2026
2c067f5
Merge branch 'feat/pre-m1-matrix' into fix/aot-field-index-store
zaidejjo Oct 5, 2026
6948900
fix(aot): value semantics for all index/field stores
zaidejjo Oct 5, 2026
307d949
fix(aot): propagate main() Result to the exit code
zaidejjo Oct 5, 2026
833fa4d
fix(aot): fail pg.connect loudly instead of null-handle leniency
zaidejjo Oct 5, 2026
b570534
fix(aot): recognize bare scalar globals as already-unboxed
zaidejjo Oct 5, 2026
f4466a7
harness: mark IR-deferred lowering bugs in known-failure notes
zaidejjo Oct 5, 2026
da7537d
docs: FEATURES edge list matches post-fix strictness
zaidejjo Oct 5, 2026
742b699
fix(aot): invalidate SROA forwarding on nested/field store roots
zaidejjo Oct 5, 2026
e181bd1
merge fix/aot-field-index-store follow-up: store-root invalidation
zaidejjo Oct 5, 2026
9fd7de9
bench: before/after medians around the flags PR (perf-neutral within …
zaidejjo Oct 5, 2026
5495637
cleanup close-out: negative-index probe, remaining-divergences report…
zaidejjo Oct 5, 2026
cfc4e9d
fix(aot): canonical float formatting via the Rust core (spec §4)\n\nC…
zaidejjo Oct 5, 2026
ee9eaa0
fix(frontend): parse ** on the RHS of * / and %\n\nparse_multiplicati…
zaidejjo Oct 5, 2026
cbb8c8a
fix(aot): recognize raw scalar globals in function bodies (CLASS 2 fo…
zaidejjo Oct 5, 2026
78405f9
probes: evaluation-order fixtures + compound single-evaluation fix\n\…
zaidejjo Oct 5, 2026
a9042da
docs: evaluation order, closure probe report, OOM close-out\n\nSpec §…
zaidejjo Oct 5, 2026
07abcaf
fix(http): second Ctrl+C force-exits graceful shutdown\n\nFirst press…
zaidejjo Oct 5, 2026
bd1739c
fuzz: v4 shapes (floats, precedence, closures, stores, casts, structs…
zaidejjo Oct 5, 2026
21c4213
lint: let-else for quad natives (clippy unnecessary-unwrap)
zaidejjo Oct 5, 2026
566aaed
docs: fuzz README covers v3/v4 shapes + batch mode
zaidejjo Oct 5, 2026
a1365b3
Merge pull request #211 from zaidejjo/feat/pre-m1-matrix
zaidejjo Oct 5, 2026
6d1bd7c
fix(aot): pg FFI follows zz_index_set pointer signature + refused-tra…
zaidejjo Oct 5, 2026
675964d
test: tiered CI, batched parity, parallel quad, cached plugin scaffold
zaidejjo Oct 5, 2026
d555140
Merge pull request #212 from zaidejjo/feat/test-speed
zaidejjo Oct 5, 2026
0b70250
feat(strings): doubled-brace {{ }} escapes in single + triple strings
zaidejjo Oct 6, 2026
f235e6e
Merge pull request #213 from zaidejjo/feat/string-braces
zaidejjo Oct 6, 2026
52f94a3
feat(ir): zzc-codec slice — zz_ir crate, bytecode run/dis/emit, sourc…
zaidejjo Oct 6, 2026
712edc6
chore: drop zz_ir debug example
zaidejjo Oct 6, 2026
8dde4f6
Merge pull request #218 from zaidejjo/feat/zzc-codec
zaidejjo Oct 6, 2026
1a7c630
fix: issue sweep — loader seeds, struct globals, shim order, brace-mi…
zaidejjo Oct 6, 2026
ecb16e5
Merge pull request #223 from zaidejjo/feat/issue-sweep
zaidejjo Oct 6, 2026
f2b3c9b
feat(ir): populate function signatures from HIR during lowering
zaidejjo Oct 6, 2026
a383bda
feat(aot): Chunk->C backend behind --chunk (slice-1)
zaidejjo Oct 6, 2026
27cd5b6
Merge pull request #258 from zaidejjo/feat/aot-from-chunk
zaidejjo Oct 6, 2026
1602d08
Hygiene: fuzz CLASS 1 FIXED (#241) + Rust comparison docs (#197) (#259)
zaidejjo Oct 6, 2026
9e02236
Imports/loader batch: hard errors, plugin selective, re-export loud f…
zaidejjo Oct 6, 2026
787ecc7
Checker DX + syntax helpers: Sherlock diagnostics batch (244-248) (#268)
zaidejjo Oct 6, 2026
95c8c35
feat(interp): single-line strings expand digit- and paren-led express…
zaidejjo Oct 6, 2026
fb8d42a
Native correctness: short-circuit, selective consts, detailed traps (…
zaidejjo Oct 6, 2026
1f94b4a
LSP flags, selective diagnostics, always-on completion (255-257) (#271)
zaidejjo Oct 6, 2026
7f9b5ec
LSP packages: dep/workspace harvest, full completion, pow census, sca…
zaidejjo Oct 6, 2026
f779791
LSP colors that mean something: call classification, paren-free items…
zaidejjo Oct 6, 2026
6cfb251
Parity gate green: all_funcs mirror; struct-literal completion; edito…
zaidejjo Oct 6, 2026
b725fc8
fix(lsp): advertise inlayHint and references providers (#281)
zaidejjo Oct 7, 2026
8783aeb
feat(stdlib): positional str search (find/rfind/starts_with_at/ends_w…
zaidejjo Oct 7, 2026
b258878
Merge pull request #282 from zaidejjo/feat/str-find
zaidejjo Oct 7, 2026
e5d6d80
feat(stdlib): str.bytes / bytes.to_str / bytes.to_ints bridge
zaidejjo Oct 7, 2026
bfde71c
Merge pull request #283 from zaidejjo/feat/str-bytes
zaidejjo Oct 7, 2026
3c4998f
perf(stdlib): memchr scan cores, native str.count
zaidejjo Oct 7, 2026
239b46b
fix(ci): drop str.count from KNOWN_CODEGEN_GAPS (C impl now exists)
zaidejjo Oct 7, 2026
413f3c1
fix(ci): list str_find/str_bytes fixtures in batched parity inventory
zaidejjo Oct 7, 2026
d2bc7fa
Merge pull request #284 from zaidejjo/feat/memchr-scans
zaidejjo Oct 7, 2026
2408fb3
fix(stdlib): trim_span backward scan usize underflow on short windows
zaidejjo Oct 7, 2026
125cd70
feat(stdlib): bounded search (find_in/rfind_in/count_in) + memchr fin…
zaidejjo Oct 7, 2026
18027eb
feat(codegen): bounded search C twins (find_in/rfind_in/count_in)
zaidejjo Oct 7, 2026
bd70e5e
test+docs: bounded search fixture coverage
zaidejjo Oct 7, 2026
26b02db
style: clippy needless_as_bytes + cargo fmt
zaidejjo Oct 7, 2026
f4ad683
Merge pull request #285 from zaidejjo/fix/trim-underflow
zaidejjo Oct 7, 2026
2828a29
Merge pull request #286 from zaidejjo/feat/bounded-search
zaidejjo Oct 7, 2026
034bb35
fix(stdlib): rfind_in empty returns clamped end (matches wrapper sema…
zaidejjo Oct 7, 2026
39d359f
Merge pull request #287 from zaidejjo/fix/rfind-empty
zaidejjo Oct 7, 2026
6011069
feat(stdlib): str.classify native classifier (Rust + registry)
zaidejjo Oct 7, 2026
c2f788c
feat(stdlib+codegen): str.classify native classifier with 6-arg AOT s…
zaidejjo Oct 7, 2026
37e0c90
fix(tests): terminate unterminated import-body prints before batch ma…
zaidejjo Oct 7, 2026
9ca69b7
Merge pull request #289 from zaidejjo/feat/native-classify
zaidejjo Oct 7, 2026
761a9bc
Realse v0.2.0
zaidejjo Oct 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
19 changes: 16 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,22 @@ jobs:
run: cargo fmt --check
- name: clippy
run: cargo clippy --all-targets -- -D warnings
- name: 'test (unix: full suite incl. native legs)'
if: runner.os != 'Windows'
run: cargo test --all
- name: 'test (PR: fast suite — VM legs only)'
if: runner.os != 'Windows' && github.event_name == 'pull_request'
# PR signal in minutes: unit + e2e (VM) + VM-only parity.
run: ./scripts/test-fast.sh
- name: 'test (PR: batched native parity)'
if: runner.os != 'Windows' && github.event_name == 'pull_request'
# All batchable strict fixtures' native legs in ~4 clang builds
# (same programs, same flags, demuxed per file). Individuals run
# VM-only inside test-fast.sh above.
run: ZZ_BATCH_NATIVE=1 cargo test -p zz_cli --test batched_parity
- name: 'test (merge: full suite, strict natives via batch)'
if: runner.os != 'Windows' && github.event_name != 'pull_request'
# `ZZ_BATCH_NATIVE=1`: strict-success natives run batched
# (same programs, same flags); quad, error, and known-failure
# natives stay individual. Full coverage, no duplicated builds.
run: ZZ_BATCH_NATIVE=1 cargo test --all
- name: 'test (windows: VM-only, native backend unsupported)'
if: runner.os == 'Windows'
# The native backend is POSIX/Linux-only (epoll/fork AOT server, no
Expand Down
7 changes: 7 additions & 0 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ on:
release:
types: [published]
workflow_dispatch:
inputs:
version:
description: "Version to package without leading v (default: Cargo.toml; needed to rebuild an older tag's image)"
required: false
default: ""

env:
CARGO_TERM_COLOR: always
Expand All @@ -41,6 +46,8 @@ jobs:
run: |
if [ "${{ github.event_name }}" = "release" ]; then
TAG="${{ github.event.release.tag_name }}"
elif [ -n "${{ inputs.version }}" ]; then
TAG="v${{ inputs.version }}"
else
# Manual dispatch: version comes from the tree (normally main).
TAG="v$(grep -m1 '^version = ' Cargo.toml | cut -d'"' -f2)"
Expand Down
63 changes: 51 additions & 12 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,17 @@ name: release
# dispatch. Push-to-main is deliberately NOT a trigger: every merge
# already ran CI, and re-running here would duplicate it.
#
# Downstream trigger contract: docker-publish and aur-publish listen for
# `release: published`, and GitHub does NOT fire that event when the
# Release is created with GITHUB_TOKEN (token-authenticated API activity
# never triggers new workflow runs — anti-recursion rule). So the tag +
# Release below are created with a user PAT (`RELEASE_TOKEN` secret,
# Contents read+write on this repo). Without it the Release still cuts
# fine, but docker/AUR will never fire — check the step logs for the
# explicit warning.
#
# Flow: resolve version -> skip if released -> sync Cargo.lock ->
# build zips (x86_64 + aarch64, in parallel) -> create Release WITH
# build zips (linux + macos, in parallel) -> create Release WITH
# the zips attached (single shot, so `release: published` consumers
# never see a half-ready Release).
#
Expand Down Expand Up @@ -148,22 +157,30 @@ jobs:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

build-assets:
name: build release zip (${{ matrix.ziparch }})
name: build release zip (${{ matrix.os }}-${{ matrix.arch }})
needs: [cut]
# Same CI gate as `cut` (a skipped `cut` leaves `skip` empty, which
# `!= 'true'` would wrongly pass — belt and suspenders).
if: ${{ (github.event_name != 'workflow_run' || github.event.workflow_run.conclusion == 'success') && needs.cut.outputs.skip != 'true' }}
runs-on: ${{ matrix.runner }}
strategy:
# One arch failing must not cancel the other: we want both logs.
# One target failing must not cancel the others: we want all logs.
# The publish step refuses to cut the Release with a zip missing.
fail-fast: false
matrix:
include:
- ziparch: x86_64
- os: linux
arch: x86_64
runner: ubuntu-latest
- ziparch: aarch64
- os: linux
arch: aarch64
runner: ubuntu-24.04-arm
- os: macos
arch: aarch64
runner: macos-14
- os: macos
arch: x86_64
runner: macos-13
steps:
- uses: actions/checkout@v4
with:
Expand All @@ -172,8 +189,12 @@ jobs:
ref: main
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: install native deps
- name: install native deps (linux)
if: matrix.os == 'linux'
run: sudo apt-get update && sudo apt-get install -y clang libcurl4-openssl-dev libsqlite3-dev zip unzip
- name: install native deps (macos)
if: matrix.os == 'macos'
run: brew install zip unzip
- name: build + zip
run: |
PKGVER="${{ needs.cut.outputs.pkgver }}"
Expand All @@ -187,8 +208,12 @@ jobs:
cargo build --release --locked -p zz_cli -p zz_lsp
./target/release/zz --version
test -x ./target/release/zz-lsp
strip target/release/zz target/release/zz-lsp
ZIP="zz-$PKGVER-linux-${{ matrix.ziparch }}.zip"
if [ "${{ matrix.os }}" = "macos" ]; then
strip -x target/release/zz target/release/zz-lsp
else
strip target/release/zz target/release/zz-lsp
fi
ZIP="zz-$PKGVER-${{ matrix.os }}-${{ matrix.arch }}.zip"
rm -rf dist "$ZIP"
mkdir -p dist
cp target/release/zz target/release/zz-lsp LICENSE README.md dist/
Expand All @@ -197,7 +222,7 @@ jobs:
- name: upload zip artifact
uses: actions/upload-artifact@v4
with:
name: release-zip-${{ matrix.ziparch }}
name: release-zip-${{ matrix.os }}-${{ matrix.arch }}
path: zz-*.zip
if-no-files-found: error

Expand All @@ -217,6 +242,13 @@ jobs:
with:
pattern: release-zip-*
merge-multiple: true
- name: resolve release token
run: |
if [ -z "${{ secrets.RELEASE_TOKEN }}" ]; then
echo "::warning::RELEASE_TOKEN secret is not set — falling back to GITHUB_TOKEN. The Release will cut, but docker-publish/aur-publish will NOT trigger (GitHub suppresses workflow runs from token-created releases). Add a PAT with Contents read+write as RELEASE_TOKEN to enable the chain."
else
echo "using RELEASE_TOKEN (user PAT): downstream release workflows will trigger"
fi
- name: create tag + release with assets (if missing)
run: |
TAG="${{ needs.cut.outputs.tag }}"
Expand All @@ -233,14 +265,21 @@ jobs:
fi
ls -la zz-*.zip
test -f "zz-${{ needs.cut.outputs.pkgver }}-linux-x86_64.zip" \
|| { echo "error: x86_64 zip missing, refusing half-ready release." >&2; exit 1; }
|| { echo "error: linux x86_64 zip missing, refusing half-ready release." >&2; exit 1; }
test -f "zz-${{ needs.cut.outputs.pkgver }}-linux-aarch64.zip" \
|| { echo "error: aarch64 zip missing, refusing half-ready release." >&2; exit 1; }
|| { echo "error: linux aarch64 zip missing, refusing half-ready release." >&2; exit 1; }
test -f "zz-${{ needs.cut.outputs.pkgver }}-macos-aarch64.zip" \
|| { echo "error: macos aarch64 zip missing, refusing half-ready release." >&2; exit 1; }
test -f "zz-${{ needs.cut.outputs.pkgver }}-macos-x86_64.zip" \
|| { echo "error: macos x86_64 zip missing, refusing half-ready release." >&2; exit 1; }
gh release create "$TAG" \
--target "main" \
--title "$TAG" \
--generate-notes \
zz-*.zip
echo "created release $TAG with prebuilt zips"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# User PAT when present so the `release: published` event is
# genuine and downstream workflows fire; GITHUB_TOKEN fallback
# cuts the Release but triggers nothing (see warning above).
GH_TOKEN: ${{ secrets.RELEASE_TOKEN != '' && secrets.RELEASE_TOKEN || secrets.GITHUB_TOKEN }}
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ bench/native/bench_loop
bench/native/bench_str
bench/native/_go/main
bench/native/.bin
# move-append elision harness: generated corpus + built binaries
# (regenerate deterministically via gen_corpus.py, seed 7)
bench/move_append/corpus/
bench/move_append/bin/
bench/native/categories/*
!bench/native/categories/*.zz
benchmarks/arena_bench
Expand All @@ -33,3 +37,5 @@ bench/performance_check/RESULTS.md
# AUR render output (local only, CI regenerates per release)
packaging/aur/out/
packaging/aur/tmp/

tests/fuzz/__pycache__/
51 changes: 51 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Contributing to ZZ

Thanks for helping. Keep it simple.

## Setup

```bash
git clone https://github.com/zaidejjo/zz
cd zz
cargo install --path crates/zz_cli
```

Requires stable Rust.

## Workflow

```bash
cargo test -p zz_frontend # single crate, fast loop
./scripts/test-fast.sh # fast suite (skips native legs + plugin e2e)
cargo test --all # full suite (slow, CI equivalent)
cargo clippy --all-targets -- -D warnings
cargo fmt --check
```

CI enforces zero clippy warnings and clean `cargo fmt`.

## PRs

1. Fork, branch from `main`, keep the diff focused.
2. Add a `.zz` fixture under `tests/fixtures/` for user-facing changes and register it in `crates/zz_cli/tests/e2e.rs`.
3. Update docs on the website repo when behavior changes.
4. Make sure tests, clippy, and fmt pass before requesting review.

## Project layout

```
zz_frontend → zz_checker → zz_stdlib → zz_cli
| |
v v
zz_runtime ──────────────→ zz_lsp
```

- `zz_frontend`: lexer, parser, AST, formatter.
- `zz_checker`: type checker with inference.
- `zz_runtime`: interpreter + VM.
- `zz_stdlib`: native functions (keep `funcs.rs` type signatures and `natives.rs` implementations in sync).
- `zz_cli`: `zz` binary. `zz_lsp`: `zz-lsp` binary.

## License

By contributing you agree your changes are Apache-2.0 licensed.
52 changes: 52 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
[workspace]
resolver = "2"
members = ["crates/zz_frontend", "crates/zz_checker", "crates/zz_hir", "crates/zz_runtime", "crates/zz_stdlib", "crates/zz_codegen", "crates/zz_cli", "crates/zz_fmt", "crates/zz_lsp", "crates/zz_native_rt", "crates/zz_pm", "crates/zz_plugin"]
members = ["crates/zz_frontend", "crates/zz_checker", "crates/zz_hir", "crates/zz_arena", "crates/zz_runtime", "crates/zz_ir", "crates/zz_stdlib", "crates/zz_codegen", "crates/zz_cli", "crates/zz_fmt", "crates/zz_lsp", "crates/zz_native_rt", "crates/zz_pm", "crates/zz_plugin"]

[workspace.package]
version = "0.1.6"
version = "0.2.0"
edition = "2021"
license = "Apache-2.0"

Expand All @@ -18,6 +18,7 @@ dirs = "6"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tar = "0.4"
lzma-rs = "0.3"
flate2 = "1"
ureq = "3"
base64 = "0.22"
Expand Down
Loading
Loading