Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
2b2646c
persona: address activity summary (WIP, syntax issues)
danieljohnmorris May 20, 2026
30d8acc
merge main into next (bring 0.12.1 progress)
danieljohnmorris May 20, 2026
d2d6100
chore: drop stray persona/address-activity WIP file
danieljohnmorris May 20, 2026
693b451
chore: slim SECURITY.md, move release-gate runbook to docs/
danieljohnmorris May 19, 2026
2e161ba
ci: trigger workflow on next
danieljohnmorris May 20, 2026
eb13947
accept .@ as canonical source extension, deprecate .ilo
danieljohnmorris May 20, 2026
94860c4
rename examples/*.ilo and tests/engine-matrix/*.ilo to .@
danieljohnmorris May 20, 2026
16b3f26
update test harness to accept .@ and add regression tests
danieljohnmorris May 20, 2026
6711b15
update internal source references from .ilo to .@
danieljohnmorris May 20, 2026
d002841
doc sweep: update SPEC, MANIFESTO, README, CHANGELOG for .@ extension
danieljohnmorris May 20, 2026
647395c
update skills, plugin manifest, and editor extensions for .@
danieljohnmorris May 20, 2026
7f52856
ci: trigger workflow on next
danieljohnmorris May 20, 2026
90580fd
Merge pull request #473 from ilo-lang/chore/security-md-cleanup
danieljohnmorris May 20, 2026
03e5b2e
fmt: apply rustfmt and regenerate ai.txt after rebase onto main
danieljohnmorris May 20, 2026
867c7a7
Merge pull request #476 from ilo-lang/feature/ext-at
danieljohnmorris May 20, 2026
236f13e
scaffold: codegen layer design doc and empty backend module
danieljohnmorris May 18, 2026
fe823df
hir: design doc for thin typed HIR
danieljohnmorris May 18, 2026
ce95431
hir: typed Program, Decl, Stmt, Expr definitions
danieljohnmorris May 18, 2026
88e4bc9
hir: AST to HIR lowering pass
danieljohnmorris May 18, 2026
40d893c
hir: raise pass and throwaway walker for round-trip testing
danieljohnmorris May 18, 2026
9d9a3e3
hir: round-trip test across examples/ corpus
danieljohnmorris May 18, 2026
29c3c93
backend: define Backend trait with Artefact and BackendError
danieljohnmorris May 19, 2026
4b5d1e2
backend/cranelift: first concrete impl behind the trait
danieljohnmorris May 19, 2026
df49cc1
test: byte-identical regression at the Cranelift object-file level
danieljohnmorris May 19, 2026
1e2b94f
changelog: backend trait and Cranelift refactor under 0.13.0
danieljohnmorris May 19, 2026
47a33a9
backend/python: move python transpile behind the Backend trait
danieljohnmorris May 19, 2026
3e7c51b
build: wire --py dispatch through compile_cmd
danieljohnmorris May 19, 2026
0902651
main: remove --emit python in favour of ilo build --py
danieljohnmorris May 19, 2026
88c488c
test: python emit byte-identical regression + 0.13.0 changelog
danieljohnmorris May 19, 2026
2dd9352
deps: wasm-encoder + wasmparser, bundle WASI preview1 adapter
danieljohnmorris May 19, 2026
14db62c
backend/wasm: WasmBackend with Component Model default
danieljohnmorris May 19, 2026
a077c1a
build: wire --wasm dispatch and --target through compile_cmd
danieljohnmorris May 19, 2026
4391e6a
test: wasm emit validation + wasmtime runtime + edge example
danieljohnmorris May 19, 2026
f9cfd93
docs: wasm capability matrix and 0.13.0 changelog entry
danieljohnmorris May 19, 2026
5018374
pin Zero compiler version
danieljohnmorris May 19, 2026
2609b69
backend/zero: ZeroBackend source emit
danieljohnmorris May 19, 2026
4b8e401
build: wire --0 and --0bin dispatch
danieljohnmorris May 19, 2026
3a695d4
test: zero emit, binary round-trip, capability gates
danieljohnmorris May 19, 2026
aff3df6
docs: zero transpile capabilities matrix
danieljohnmorris May 19, 2026
3fb2121
changelog: 0.13.0 zero backend
danieljohnmorris May 19, 2026
5b7f77d
hir: delete throwaway walker, raise, and round-trip test
danieljohnmorris May 19, 2026
fcee395
main: manifesto-strict ilo build help
danieljohnmorris May 19, 2026
b43f680
test: cross-backend conformance suite
danieljohnmorris May 19, 2026
0581966
bump version to 0.13.0
danieljohnmorris May 19, 2026
e7e0858
changelog: finalise 0.13.0
danieljohnmorris May 19, 2026
b47fcf6
docs: 0.13.0 release notes
danieljohnmorris May 19, 2026
205326b
zero backend: resolve install path via $HOME, validate PATH probe
danieljohnmorris May 19, 2026
a85deea
python emit: unique temp names for nested complex matches
danieljohnmorris May 19, 2026
20df89f
conformance: hard-fail on Cranelift regressions
danieljohnmorris May 19, 2026
2a3ab08
wasm backend: capture both streams on wasm-tools failure, use NamedTe…
danieljohnmorris May 19, 2026
1b6cf5f
backend: document HIR side channels, add debug_assert in python emit
danieljohnmorris May 19, 2026
7809b48
conformance: gate on ILO-B### codes, quote-aware run parsing
danieljohnmorris May 19, 2026
380c24e
conformance: align unsupported helper with ILO-B### gate
danieljohnmorris May 19, 2026
b20e32f
backend: include ILO-B### code in Display for CodegenFailed
danieljohnmorris May 19, 2026
033e2a3
backend: regression tests for unsupported helper, fallback wasm-tools…
danieljohnmorris May 19, 2026
bf666dc
fmt: apply rustfmt across backend and test files post-rebase
danieljohnmorris May 19, 2026
44fea0c
tests: drop --vm assertion from help_shows_usage (engine selectors no…
danieljohnmorris May 19, 2026
600555c
test: recapture AOT object-file baselines after rebase onto next
danieljohnmorris May 19, 2026
6d4a1a8
examples: skip vm engine in wasm-edge and zero-bridge hello examples
danieljohnmorris May 19, 2026
3e6fdcd
ci: trigger workflow
danieljohnmorris May 20, 2026
d7644e9
ci: trigger workflow on next
danieljohnmorris May 20, 2026
4a31a85
changelog: undo 0.13.0 finalisation, keep CalVer Unreleased
danieljohnmorris May 20, 2026
7c7c002
fix CI failures: clippy dead code, wasm-tools gate, aot platform gate
danieljohnmorris May 20, 2026
7a40d34
test: fix python-emit baseline lookup for .@ example extension
danieljohnmorris May 20, 2026
cd3134e
spec: agent-natural surface for re-run experiment
danieljohnmorris May 21, 2026
903dd39
tests: pin match-arm block bodies cross-engine
danieljohnmorris May 21, 2026
7450f4f
parser: add if/else, while, for agent-natural sugars
danieljohnmorris May 21, 2026
097c8a2
docs: lead skill files with agent-natural surface
danieljohnmorris May 21, 2026
bebde99
Merge pull request #406 from ilo-lang/feature/codegen-layer
danieljohnmorris May 21, 2026
ed3b8e7
merge main into next: catch up 302 commits incl crypto, HTTP verbs, .…
danieljohnmorris May 21, 2026
ce87c78
ci(sync-next): do real 3-way merge before opening sync PR
danieljohnmorris May 21, 2026
153256d
tests: fix .@ path lookup + regen aot baselines + verify doctest
danieljohnmorris May 21, 2026
c8ac283
tests: align remaining baselines with merged builtins and rename
danieljohnmorris May 21, 2026
4b0a1fa
ci(check-skill-tokens): relax per-module caps for the catch-up sync
danieljohnmorris May 21, 2026
3d8578d
fix(vm): add B64Dec to tree_bridge_returns_result list
danieljohnmorris May 21, 2026
f0d9371
Merge pull request #574 from ilo-lang/sync/567-resolve
danieljohnmorris May 21, 2026
c7b8f8a
WIP parser: named-args desugar (incomplete)
danieljohnmorris May 21, 2026
87f12b3
merge next into compat/agent-natural
danieljohnmorris May 21, 2026
f0d9682
Add muscle-memory aliases: post, upper, lower, capitalize
May 21, 2026
ed1f37c
docs(agent-natural): lead skill files with natural surface
danieljohnmorris May 21, 2026
e87e9ff
fix: gate named-args desugar on known user fn
danieljohnmorris May 21, 2026
1247952
test: cover inline lambda as first arg to builtin HOF
danieljohnmorris May 21, 2026
2723b43
Merge pull request #611 from ilo-lang/fix/named-args-vs-inline-lambda
danieljohnmorris May 21, 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
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@
"name": "ilo",
"source": "./",
"description": "Write, run, debug, and explain programs in ilo — a token-optimised programming language for AI agents",
"version": "0.12.0",
"version": "0.13.0",
"author": {
"name": "Daniel Morris"
},
"homepage": "https://github.com/ilo-lang/ilo",
"license": "MIT",
"keywords": ["ilo", "programming-language", "token-optimised", "ai-agents"],
"skills": [
{ "name": "ilo-language", "description": "Use this when writing or reviewing .ilo source.", "path": "skills/ilo/ilo-language.md" },
{ "name": "ilo-language", "description": "Use this when writing or reviewing .@ source (.ilo also accepted with deprecation warning).", "path": "skills/ilo/ilo-language.md" },
{ "name": "ilo-language-records", "description": "Use this when writing ilo code that declares or uses record types.", "path": "skills/ilo/ilo-language-records.md" },
{ "name": "ilo-builtins-core", "description": "Use this when calling core builtins: type coercions, list ops, HOFs, and map ops.", "path": "skills/ilo/ilo-builtins-core.md" },
{ "name": "ilo-builtins-math", "description": "Use this when calling math builtins: arithmetic, trig, constants, random, and statistics.", "path": "skills/ilo/ilo-builtins-math.md" },
Expand Down
3 changes: 3 additions & 0 deletions .github/gitleaks.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
# an allowlist for the placeholder strings that ship in examples/ so the
# release-gate scanner does not false-positive on demo code.
#
# For the full release-gate runbook (when to run, incident procedure, why
# release-only) see docs/release-secret-scan.md.
#
# Run locally:
# gitleaks detect --source . --no-git --redact --verbose
# gitleaks detect --source . --redact --verbose # includes git history
Expand Down
8 changes: 7 additions & 1 deletion .github/workflows/sync-next.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,21 @@ jobs:
ref: next
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Try fast-forward
- name: Try fast-forward, then 3-way merge
id: ff
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
if git merge --ff-only origin/main; then
echo "result=ff" >> "$GITHUB_OUTPUT"
git push origin next
elif git merge --no-ff origin/main -m "chore(sync): merge main into next [automated]"; then
# Non-ff but clean 3-way merge: push the merge commit to next.
# Only falls through to the PR step on true conflict.
echo "result=merged" >> "$GITHUB_OUTPUT"
git push origin next
else
git merge --abort || true
echo "result=diverged" >> "$GITHUB_OUTPUT"
fi
- name: Open sync PR if diverged
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ research/*
research/closed-loop-bench/results/raw/
research/closed-loop-bench/.zero/
research/closed-loop-bench/**/__pycache__/
# Zero compiler local cache (created when `zero check`/`zero build` runs
# from the repo root, e.g. via Stage 5e tests). Reproducible; never tracked.
/.zero/
site/
.DS_Store
.astro/
Expand Down
1 change: 1 addition & 0 deletions .zero-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0.1.2
242 changes: 237 additions & 5 deletions CHANGELOG.md

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

Thanks for your interest in contributing to ilo!

For the release secret-scan gate (gitleaks, allowlist, incident procedure) see [docs/release-secret-scan.md](docs/release-secret-scan.md).

## Getting Started

```bash
Expand Down
59 changes: 52 additions & 7 deletions Cargo.lock

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

7 changes: 5 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "ilo"
version = "0.12.0"
version = "0.13.0"
edition = "2024"
rust-version = "1.85"
description = "ilo - the token-minimal programming language AI agents write"
Expand Down Expand Up @@ -46,6 +46,8 @@ fastrand = "2"
getrandom = "0.2"
regex = "1"
chrono = { version = "0.4", default-features = false, features = ["clock"] }
wasm-encoder = "0.249"
tempfile = "3"
percent-encoding = "2"
base64 = "0.22"
chrono-tz = "0.10"
Expand All @@ -57,8 +59,9 @@ subtle = "2"
[dev-dependencies]
wiremock = "0.6"
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
tempfile = "3"
serde_json = "1"
wasmparser = "0.249"
shlex = "1"

[profile.release]
strip = true
Expand Down
2 changes: 2 additions & 0 deletions MANIFESTO.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ A named argument like `amount: 42` costs more tokens than positional `42`. We in
**What the agent cares about:** "How many tokens will this cost me end-to-end?"
**How this helps:** The language is as terse as possible *without increasing retry rate*. Where there's a tradeoff between generation cost and error rate, we optimise for total cost.

We measured the tokenizer; `.@` saves one token per filename.

**Prefix notation** eliminates parentheses and saves tokens at every nesting level. `(a * b) + c` becomes `+*a b c` - 4 fewer characters, 1 fewer token. Deeper nesting saves more: `((a + b) * c) >= 100` becomes `>=*+a b c 100` - 7 fewer characters, 3 fewer tokens. Across 25 expression patterns, prefix notation saves 22% of tokens and 42% of characters vs infix. See the [prefix-vs-infix benchmark](research/explorations/prefix-vs-infix/) for the full analysis.

**Guards instead of if/else** eliminate nesting depth. In a traditional language, conditional logic stacks:
Expand Down
13 changes: 7 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,20 +104,21 @@ Uses the [skills](https://www.npmjs.com/package/skills) npm package (396K+ insta
# Inline
ilo 'dbl x:n>n;*x 2' 5 # → 10

# From file
ilo program.ilo functionName arg1 arg2
# From file (.@ and .ilo are both accepted; .@ saves one token per filename on LLM tokenizers)
ilo program.@ functionName arg1 arg2
ilo program.ilo functionName arg1 arg2 # .ilo works too

# Verb form (cargo / go / zero style; bare positional still works)
ilo run program.ilo arg1 arg2 # run
ilo check program.ilo # verify only - exit 0 if clean
ilo build program.ilo -o ./bin # AOT compile
ilo run program.@ arg1 arg2 # run
ilo check program.@ # verify only - exit 0 if clean
ilo build program.@ -o ./bin # AOT compile
```

**[Tutorial: Write your first program →](https://ilo-lang.ai/docs/first-program/)**

## Editor support

Syntax highlighting, snippets, and `--` comment handling for `.ilo` files ships in [`extensions/vscode/`](./extensions/vscode/). Install into Cursor with `cd extensions/vscode && npm run install:cursor`. VS Code marketplace publish is tracked separately.
Syntax highlighting, snippets, and `--` comment handling for `.ilo` and `.@` files ships in [`extensions/vscode/`](./extensions/vscode/). Install into Cursor with `cd extensions/vscode && npm run install:cursor`. VS Code marketplace publish is tracked separately.

## Versioning

Expand Down
82 changes: 6 additions & 76 deletions SECURITY.md
Original file line number Diff line number Diff line change
@@ -1,80 +1,10 @@
# Release security
# Security policy

This page documents the security gates that run before an ilo release tag is
cut. The goal is simple: a leaked credential, API key, private key, or other
secret should never make it onto a published artifact, a published crate, a
published npm package, or a GitHub release.
Found a vulnerability in ilo? Please do not open a public issue.

## Secret scan (gitleaks)
Report it privately via [GitHub's private vulnerability reporting](https://github.com/ilo-lang/ilo/security/advisories/new).

Every push of a `v*` tag triggers `.github/workflows/release.yml`. The first
job is `secret-scan`, which runs
[`gitleaks/gitleaks-action@v2`](https://github.com/gitleaks/gitleaks-action)
over the full repository history. All downstream jobs (`build`, `build-wasm`,
`release`, `publish-crates`, `publish-npm`, `publish-pi`) declare
`needs: secret-scan`, so any finding blocks the entire release.
We aim to acknowledge reports within 72 hours.

### What gets scanned

- Working tree (every tracked file).
- Full git history (`fetch-depth: 0`).
- Default gitleaks rule pack: AWS, GCP, Azure, GitHub, OpenAI, Anthropic,
Stripe, Slack, JWT, generic high-entropy strings, PEM blocks, and more.

### Whitelist

Placeholder credentials shipped in `examples/` (especially `examples/apps/*`
for LLM-client and ScrapingBee demos) are explicitly allowed in
[`.github/gitleaks.toml`](./.github/gitleaks.toml). The current allow regex set:

- `SCRAPINGBEE_KEY_PLACEHOLDER_set_via_env_in_real_use`
- `sk-PLACEHOLDER[-_A-Za-z0-9]*`
- `REPLACE_ME` / `YOUR_*_HERE` / `EXAMPLE_*_KEY`

If a new example needs a placeholder credential, add it to the allowlist in
the same PR.

### Running locally

Before pushing a tag, or any time you want to sanity-check the working tree:

```sh
gitleaks detect --source . --no-git --redact --verbose
gitleaks detect --source . --redact --verbose # includes git history
```

A clean run prints `no leaks found`. Anything else is a real finding to
triage before the release goes out.

## Install-script integrity verification

The release workflow's `release` job runs `sha256sum ilo-* > checksums-sha256.txt`
and uploads the resulting file alongside every published binary. The
`curl ... | sh` installers shipped from `https://ilo-lang.ai/install.sh` and
`/install.ps1` (canonical source in [`scripts/install/`](./scripts/install/))
fetch that checksum file together with the binary and refuse to install if
the SHA-256 doesn't match. This closes the standard supply-chain attack
window on the curl-pipe install path: a tampered binary on GitHub's CDN, a
TLS-intercepted download, or a mirrored asset all fail the check before the
binary is made executable. An offline regression test
(`scripts/install/test-install-sh.sh`) runs on every CI push and exercises
the happy, tamper, and missing-asset code paths.

## Why release-only, not per-PR

Running gitleaks on every PR added meaningful queue time without much
incremental safety: secrets in feature branches are caught at merge time by
GitHub's native push-protection, and the release gate is the last guarantee
before anything becomes public. The release-only model keeps developer
feedback fast and still blocks the public artifact path.

## If the scan finds something

1. The release job will fail with `secret-scan` red. No artifacts are built.
2. Treat the finding as a real incident: rotate the credential immediately,
regardless of where the leak appears (working tree, history, comment, or
doc).
3. Once rotated, scrub the secret from history (`git filter-repo` or
BFG), force-push the cleaned history, and re-cut the tag.
4. If the finding is a false positive on a new placeholder shape, extend the
allowlist in `.github/gitleaks.toml` in a follow-up PR and re-cut the tag.
For the release-time secret-scan gate, install-script integrity verification,
and incident response procedure, see [`docs/release-secret-scan.md`](./docs/release-secret-scan.md).
Loading
Loading