70 Commits
Author SHA1 Message Date
Hanzo AI 6edd326615 ci: align to Hanzo native forge — Gitea CI/CD + KMS secrets, GitHub → mirror
Git of record moves to git.hanzo.ai; GitHub becomes a mirror.

- .gitea/workflows/{ci,publish}.yml — native pipeline on hanzo-build-linux-amd64
  act_runners. publish.yml pulls Chrome Web Store + Firefox AMO + npm creds from
  KMS via the machine identity (no store cred in any Actions secret store).
- deploy/kms/extension-publish-kms-sync.yaml — KMSSecret CR; canonical KMS path
  hanzo:/extension-publish (env prod) for the store creds.
- .github/workflows/sync.yml — mirror main+tags to git.hanzo.ai (the only thing
  GitHub does as system of record; no-op until HANZO_GIT_TOKEN seeded).
- .github/workflows/publish.yml — remove store-publish steps (CWS/AMO/VSCE/OVSX/
  JetBrains — all no-ops today, those secrets never existed on GitHub). Keep the
  live npm publish (interim) + the downloadable GitHub Release.
- docs: PUBLISHING.md + LLM.md rewritten to the native topology.

Non-breaking: npm publish (@hanzo/browser-extension) untouched. No store publish
in this pass. Gated on operator: seed KMS store values, Gitea secrets, mirror.
2026-07-24 23:33:15 -07:00
Hanzo Dev 8e722f22fe fix(npm): write authToken to .npmrc explicitly for pnpm publish
The recursive publish 404'd on every package (npm's obscured 'unauthenticated'):
setup-node's ${NODE_AUTH_TOKEN}-templated .npmrc is read by npm but not reliably
by pnpm publish. Write the token literally into .npmrc + set @hanzo:registry, and
add npm whoami as an auth diagnostic. .npmrc gitignored.
2026-07-04 03:38:11 -07:00
Hanzo Dev 5a55ce029f chore(npm): publish all workspace packages to public npm at 1.0.0
Normalize every packages/* package for public npm publish:
- version: pre-1.0 (0.x) → 1.0.0; already-≥1.0 kept (mcp 2.4.1,
  cli-tools 1.8.0, dxt 1.8.1, browser/hanzo-ide/office/outlook 1.9.31,
  gworkspace 1.9.30, aci/auth 1.0.0)
- remove "private" from all 22 gated packages/* (apps/site + repo root
  stay private — site is a deployed website, not an npm library)
- add publishConfig.access=public everywhere (scoped @hanzo/* need it)
- add files[] + valid main pointing at built output so no empty tarballs;
  no-build packages ship src+README

CI npm job now publishes the whole workspace:
- build @hanzo/cards first (slack/teams import its dist), then
  pnpm -r --if-present run build || true
- pnpm -r publish --access public --no-git-checks --ignore-scripts
  --ignore-scripts prevents raycast/vscode `publish` lifecycle scripts
  (Raycast Store / VS Marketplace) from hijacking and aborting the run.
  workspace:* (auth, cards) is rewritten to the real version at publish.
2026-07-04 03:26:04 -07:00
Hanzo Dev abb2ad56cb feat(verticals): iManage (@hanzo/imanage) — legal DMS — Wave 5 COMPLETE
iManage Work OAuth2 + Work API (workspaces/documents/search) + content extraction,
AI actions (summarize doc / extract clauses-dates-parties / search-synthesize);
server-side tokens, never logs content, grounded extraction, 'not legal advice'.
121 tests. On published @hanzo/ai@0.2.0.

All 6 Wave 5 verticals now on main: epic(109) procore(102) quickbooks(91)
canvas-lms(119) workday(113) imanage(121). CI step added.
2026-07-04 02:02:39 -07:00
Hanzo Dev 02b447d027 feat(verticals): Workday (@hanzo/workday) — HR/HCM
Workday OAuth2 (HTTP Basic client auth, non-rotating refresh) + REST (staffing/
recruiting/absence) + RaaS custom reports, AI actions (summarize worker/team/org,
draft requisition); read-only proxy (405 on writes). 113 tests. On published
@hanzo/ai@0.2.0. CI step added.
2026-07-04 01:56:42 -07:00
Hanzo Dev a164395d4a feat(verticals): Canvas LMS (@hanzo/canvas-lms) — education
Canvas OAuth2 (per-institution host, non-rotating refresh) + REST v1 (courses/
assignments/submissions/pages) w/ Link-header pagination, AI actions (summarize
course/draft feedback/generate questions), write-back submission comments +
announcements. 119 tests. On published @hanzo/ai@0.2.0. CI step added.
2026-07-04 01:55:03 -07:00
Hanzo Dev fc6d9bb805 feat(verticals): Epic SMART-on-FHIR (@hanzo/epic) — healthcare
SMART-on-FHIR app: EHR/standalone launch, PKCE + server-side token exchange,
FHIR R4 read (Patient/Condition/MedicationRequest/AllergyIntolerance/Observation/
DocumentReference) w/ Bundle pagination, 4 AI actions (summarize patient / draft
note / extract problems&meds / ask). PHI stays server-side, never logged,
read-only. 109 tests. On published @hanzo/ai@0.2.0. CI step added.
2026-07-04 01:48:28 -07:00
Hanzo Dev a263c67aa2 fix(release): desktop installers to workspace-relative dir (Windows upload)
Windows built both installers (.msi 1.82MB + .exe 1.27MB) but upload-artifact's
path: /tmp/desktop/* didn't match Git-Bash's /tmp on windows-latest → 'No files
were found'. macOS/Linux worked (consistent /tmp). Use a workspace-relative
desktop-artifacts/ dir — identical resolution for the bash shell and the upload
action on all three OSes.
2026-07-04 01:38:50 -07:00
Hanzo Dev bb5528f0df feat(verticals): Procore + QuickBooks — Wave 5 batch 1 (partial)
- @hanzo/procore — construction: Procore OAuth2 + REST v1.0 (RFIs/submittals/docs),
  summarize/draft-RFI/action-items, write-back RFI replies (102 tests).
- @hanzo/quickbooks — finance: Intuit OAuth2 + QBO Accounting v3, summarize
  financials/explain-report/draft-descriptions (91 tests).
Both server-side token exchange + API proxy, on published @hanzo/ai@0.2.0. CI steps added.
2026-07-04 01:32:48 -07:00
Hanzo Dev 1a967f8bb2 fix(release): desktop Rust E0277 + jupyter wheel jlpm-in-pnpm
Two build bugs (16 other v1.9.31 assets shipped fine; these were the last two):
- desktop: register_hotkey returned tauri::Result, but global_shortcut register()
  yields global_shortcut::Error with no From into tauri::Error (E0277). Return
  Box<dyn Error> — both ? sites convert, and setup() already expects it.
- jupyter: hatch-jupyter-builder ran 'jlpm install' (yarn) at the pnpm monorepo
  root → rejected. Build the prod labextension via pnpm first (creates the
  skip-if-exists target), so the wheel build never invokes jlpm.
2026-07-04 01:28:16 -07:00
Hanzo Dev 66f12b08f1 fix(release): install JupyterLab before labextension build + make jupyter job non-blocking
The 'Build labextension' step calls jlpm (provided by jupyterlab), but jupyterlab
was only installed in the later wheel step → 'jlpm: not found' failed the job, and
since jupyter is in release.needs it SKIPPED the whole GitHub Release (15 good
artifacts, no release). Install the JupyterLab toolchain first + continue-on-error
on every jupyter step so a wheel failure can never block the release again.
2026-07-04 01:16:37 -07:00
Hanzo Dev 4faa92e902 ci(release): build installable artifacts for figma, sketch, teams, zendesk, desktop, jupyter
Add producer jobs mirroring the office/outlook pattern so a version tag
attaches downloadable artifacts for every surface that can be one:

- figma/sketch/zendesk: pnpm build -> bestzip dist/ (arc runner has no zip)
- teams: build +  script -> dist/hanzo-teams.zip (nil-GUID app id
  placeholder so the release asset always builds without a bot secret)
- desktop: matrix [macos, windows, ubuntu] Tauri build -> per-OS installer
  (.dmg / .msi+.exe / .AppImage+.deb), continue-on-error (signing is future)
- jupyter: build labextension -> python -m build --wheel

Wire all into the release job needs/files and extend the download table
with Design Tools / Team Apps / Desktop / Data Science sections. Every
advertised link resolves to a produced basename.
2026-07-04 01:05:31 -07:00
Hanzo Dev e37b8e7a07 chore(sdk): remove orphaned @hanzo/ai AgentKit copy from the extension
The extension's packages/ai was a duplicate 'AgentKit with MCP' (canonical home:
hanzoai/ai) that squatted the @hanzo/ai name and collided with the published AI
client. Nothing consumes it anymore (all 16 adapters resolve @hanzo/ai to the
published 0.2.0 client from npm; no @hanzo/ai/server|react subpath imports; not
in the release publish). Removing it makes @hanzo/ai in the workspace
unambiguously the AI client.

Taxonomy (per direction): @hanzo/ai = AI client · @hanzo/agent = Agent SDK ·
@hanzo/ui = all v8 components (hanzoai/ui, agent UI → @hanzo/ui/agent) ·
@hanzo/gui = v8 framework (hanzoai/gui, Tauri+Tamagui unified). Removed the
@hanzo/ai CI test step. github 84 + slack 68 still green.
2026-07-04 00:19:31 -07:00
Hanzo Dev 90a9383a6e feat(ambient): Hanzo desktop app — Tauri menubar + global hotkey (@hanzo/desktop)
Cross-platform (macOS/Windows/Linux) tray app: Cmd/Ctrl+Shift+Space spotlight,
quick actions over the clipboard (ask/summarize/explain copy; rewrite/translate/
fix paste-back via synthesized paste), streaming over published @hanzo/ai@0.2.0
(66 tests). Native installers = per-OS CI job (tauri build), never built locally.
Wave 4 dev/ambient (TS-tractable) complete.
2026-07-03 21:47:29 -07:00
Hanzo Dev de93905ce3 feat(dev): GitLab integration (@hanzo/gitlab)
Mirrors @hanzo/github for GitLab: MR review (reconstructed diff, windowed),
issue triage (labels ∩ project labels), @hanzo mentions; X-Gitlab-Token
constant-time verify; on published @hanzo/ai@0.2.0 (97 tests). CI step added.
2026-07-03 21:43:35 -07:00
Hanzo Dev 85eebae869 feat(dev): JupyterLab extension — Wave 4 batch 1 complete
@hanzo/jupyter — JupyterLab 4 labextension: side panel (active-cell/selection/
notebook context) + cell actions (explain/fix-error/docstring/optimize/generate),
insert-below write-back; pure notebook context extraction (ANSI-stripped
tracebacks); on published @hanzo/ai@0.2.0 (58 tests). CI step added.
2026-07-03 21:28:49 -07:00
Hanzo Dev 2911113fda feat(dev): GitHub App + Raycast — Wave 4 batch 1
- @hanzo/github — GitHub App: auto PR review (diff windowed), issue triage
  (labels intersected with real repo labels), @hanzo mentions; HMAC-verified
  webhooks; all via @hanzo/ai (84 tests).
- hanzo-ai (Raycast) — command bar: Ask (streaming) + Summarize/Explain/Rewrite/
  Translate/Fix-grammar over selection/clipboard, paste-back (51 tests).

Both on published @hanzo/ai@0.2.0 + @hanzo/iam. CI steps added.
2026-07-03 21:26:10 -07:00
Hanzo Dev 6772773b40 feat(design): Figma + Sketch + Canva — Wave 3 complete
Design tools on the shared design-core (rewrite/localize/critique/variants/
content-fill), all on published @hanzo/ai + @hanzo/iam:
- @hanzo/figma — plugin: code.ts↔iframe messaging, text-node write-back, a11y
  critique using real layer colors, insertable variants (56 tests).
- @hanzo/sketch — .sketchplugin: WebView panel + sketch/dom write-back (43 tests).
- @hanzo/canva — Apps SDK panel: generate/rewrite/translate/ideas, insert/replace
  text elements (40 tests).

CI: figma/sketch/canva test steps.
2026-07-03 21:10:45 -07:00
Hanzo Dev b24f0eb76e feat(business): HubSpot + Shopify — Wave 2 complete
- @hanzo/hubspot — CRM card UI extension + serverless fns: record → AI →
  Note/Task write-back (correct HUBSPOT_DEFINED associations); key server-side (75 tests).
- @hanzo/shopify — embedded admin app: product description/SEO generation +
  order summaries, productUpdate write-back (only changed field); dual HMAC
  verify (OAuth callback + webhooks), secret isolation proven (108 tests).

Both on the published @hanzo/ai@0.2.0 + @hanzo/iam. Wave 2 (Salesforce · DocuSign ·
Notion · Zendesk · HubSpot · Shopify) all on main.
2026-07-03 20:55:10 -07:00
Hanzo Dev 21686d4eda feat(zendesk): Hanzo AI ticket-sidebar app (@hanzo/zendesk)
ZAFv2 ticket_sidebar Support app on the published @hanzo/ai@0.2.0: summarize
ticket, draft reply (agent voice), suggest macro/next-steps, ask; write-back via
ticket.comment.appendText (public reply / internal note). Hanzo key is a secure
ZAF setting, proxied server-side so it never reaches the browser (49 tests). CI step added.
2026-07-03 20:49:22 -07:00
Hanzo Dev 4b84ccfcd6 feat(business): Salesforce + DocuSign + Notion on the shared foundation
Wave 2 batch 1:
- @hanzo/salesforce — LWC assistant + Apex callouts on record pages, read record →
  AI → write-back (Task/Note/Chatter), Named+External Credential (key never in Apex).
- @hanzo/docusign — summarize/extract-terms/risk-flag agreements + Connect webhook
  (HMAC-verified) auto-summary; envelope docs → pdf.js → @hanzo/ai (103 tests).
- @hanzo/notion — summarize/draft/extract pages → databases, append AI blocks,
  server-held OAuth token + proxy (104 tests).

CI: add notion/docusign/salesforce test steps. All on @hanzo/ai (now published
0.2.0 as the canonical headless client) + @hanzo/iam.
2026-07-03 20:33:13 -07:00
Hanzo Dev 3e90fd6e3a feat(teams): Hanzo AI for Microsoft Teams — Wave 1 comms complete
@hanzo/teams — bot (1:1/channel) + message extensions, Adaptive Cards via
@hanzo/cards, Action.Submit/Execute dispatch, packaged Teams app zip (69 tests).
CI: add teams test step. Wave 1 (Slack · Teams · Zoom/Meet) all on main.
2026-07-03 19:21:14 -07:00
Hanzo Dev 1c63e5592e feat(comms): Slack + Zoom/Meet apps on the shared foundation; CI build-order fix
Wave 1 comms hubs land:
- @hanzo/slack — /hanzo slash command, App Home, message shortcuts, thread-context
  quick actions, OAuth install; UI 100% @hanzo/cards Block Kit (68 tests).
- @hanzo/meetings — Zoom App + Google Meet add-on panels + Zoom webhook
  transcript→summary (signature-verified); web panels over @hanzo/ai (70 tests).

CI: build @hanzo/cards before dependent tests (consumers resolve its built dist/),
and add slack + meetings test steps.

Note: the headless @hanzo/ai client isn't published under 'latest' yet (npm
@hanzo/ai@0.1.1 is the React <HanzoAI/> UI); each adapter ships a client to the
exact createAiClient /v1 contract as an interim, to become a one-line re-export
once the headless client publishes.
2026-07-03 19:19:44 -07:00
Hanzo Dev 733c87313d ci(cards): test @hanzo/cards; workspace includes packages/cards
The shared card-builder — one canonical PanelSpec → Slack Block Kit / Teams
Adaptive Cards / Google CardService with stable action ids. The missing
foundation piece for card-host adapters (Slack/Teams/Google); pairs with the
existing @hanzo/ai (headless client) + @hanzo/iam (identity) SDKs. Pure, zero
runtime deps, 66 tests.
2026-07-03 18:55:22 -07:00
Hanzo Dev a1a355b1d1 ci(clio): test @hanzo/clio; workspace includes packages/clio
Clio practice-management integration — OAuth2 + Clio API v4, AI actions over
matters/documents with write-back to matter notes/activities, and Custom Actions
to embed AI buttons inside Clio. A hosted web app + token-exchange service
(clio.hanzo.ai; client_secret server-only, KMS), so CI-tested — no sideload
binary. Completes the daily-lawyer surface set (iManage/NetDocuments deferred).
2026-07-03 17:22:43 -07:00
Hanzo Dev c213289abf ci(pdf): test @hanzo/pdf; workspace includes packages/pdf
The Hanzo AI PDF workspace (PDF.js viewer + AI side panel — summarize, extract
parties/dates/obligations, find risky clauses over filings/contracts). A hosted
static surface (pdf.hanzo.ai over hanzoai/static), so CI-tested like the Google
Workspace add-on — no sideload binary.
2026-07-03 17:02:27 -07:00
Hanzo Dev 2655a5f227 ci(release): make Safari packaging reliable — zip the whole safari output tree
The Safari step zipped a fixed 'safari/Hanzo AI' subpath and hit zip exit 12
('nothing to do') → continue-on-error swallowed it → no release asset (v1.9.30
shipped without Safari). Zip the whole dist/safari tree (the Xcode project is
always emitted; a dev builds+signs+sideloads it) + any built .app, guarded so a
zip exit code can't blank the asset. Future releases carry Safari reliably.
2026-07-03 16:56:36 -07:00
Hanzo Dev 3105d4a099 ci(office-suite): test + release Outlook & Google Workspace add-ins
Wire the two new productivity surfaces into CI/CD:
- ci.yml: test @hanzo/outlook-addin (39) + @hanzo/gworkspace-addon (29).
- publish.yml: new 'outlook' job builds @hanzo/outlook-addin → hanzo-ai-outlook-v<ver>.zip,
  added to release needs/files + an Outlook row in the download table.
  (Google Workspace deploys via clasp to Google, not a sideload binary — CI-tested
  only, no release zip.)
- pnpm-lock: workspace now includes packages/outlook + packages/gworkspace.
2026-07-03 16:32:55 -07:00
hanzo-dev 780757ca55 feat(auth): one canonical @hanzo/auth core; migrate office; fix vscode HIP-0111
Five surfaces (browser, office, vscode, cli, mcp) each hand-rolled the SAME
IAM OAuth2+PKCE flow — and one drifted and broke: vscode built
hanzo.id/oauth/authorize and iam.hanzo.ai/oauth/token, both MISSING the
/v1/iam prefix (a 404 — the same class of bug as the browser login fix),
plus it POSTed JSON where IAM requires form-urlencoded and sent a
client_secret on a public PKCE client. That is the opposite of one way.

Decomplected into ONE core — packages/auth (@hanzo/auth):
- config.ts   canonical HIP-0111 endpoints (authorize/token/userinfo ALL
              carry /v1/iam) + the one-client-per-surface registry
              (hanzo-browser/office/vscode/cli). URL assembly lives once.
- pkce.ts     the one PKCE (S256), platform-CSPRNG + WebCrypto.
- oauth.ts    buildAuthorizeURL / exchangeCode / refreshTokens / userinfo —
              pure fetch, form-encoded per RFC 6749.
- flow.ts     login / getValidToken (transparent refresh) / logout /
              currentUser, written ONCE against TokenStore + Opener. A
              surface supplies only those two thin adapters — no surface
              re-implements the flow.
23 tests: the drift guard (every path has /v1/iam), client registry, PKCE
RFC-7636 vector, wire shapes, and the full flow with fake adapters.

Migrate office onto it: roamingSettings TokenStore + Dialog-API Opener;
delete office's duplicate pkce.ts + IAM config (now the core's). API-key
path kept. 22 tests; the core bundles into the task pane.

Fix vscode standalone-auth: all three endpoints → ${host}/v1/iam/oauth/*,
token calls form-urlencoded, OIDC scopes, drop the secret on the public
PKCE client. Compiles clean.

CI now gates @hanzo/auth. Browser/mcp/tools already use canonical paths;
migrating them to import the core is the tracked next step (each needs its
own bundler wiring) — the ONE way now exists and has two consumers.
2026-07-03 15:24:01 -07:00
Hanzo Dev 5bf8d934b4 ci(release): downloadable JetBrains + Office + Safari binaries for all platforms
The GitHub Release table advertised JetBrains and Safari downloads that 404'd —
neither job produced a release artifact — and the Office add-in was absent.
Make every advertised binary real and deterministic from the tag:

- jetbrains: always `gradlew buildPlugin` → hanzo-ai-jetbrains-v<ver>.zip artifact
  (Marketplace publish stays token-gated); the job no longer skips without the
  token, so the download link always resolves.
- office: new job builds @hanzo/office-addin → hanzo-ai-office-v<ver>.zip.
- safari: package the built .app(s) → hanzo-ai-safari-v<ver>.zip.
- release: add jetbrains+office to `needs`, add all three globs to `files`, and
  add the Office row to the download table. Asset names use the tag version so
  they match the table URLs.

All-platform release: browser (chrome/edge/firefox/safari), IDE (vscode/cursor/
windsurf/antigravity/jetbrains), Claude dxt, and Office (Word/Excel/PowerPoint).
2026-07-03 15:22:58 -07:00
hanzo-dev 4060ce491b feat(office): API-key auth + self-contained Windows test kit; release 1.9.28
- API-key auth: paste a Hanzo hk- key (console.hanzo.ai → API keys) instead
  of the IAM OAuth dialog, so the add-in is usable with zero infra/IAM setup.
  pickBearer(apiKey, oauthToken) precedence is pure + tested (29 tests).
- Windows test kit: `HANZO_OFFICE_BASE=https://localhost:3000` build ships
  serve.mjs (stdlib HTTPS static server) + SIDELOAD-WINDOWS.md, so the
  downloaded zip runs on any machine — trust a localhost cert, node serve.mjs,
  sideload manifest.xml, paste key, go.
- CI Build now emits BOTH hanzo-ai-office-v${VER}.zip (production, office.hanzo.ai)
  and hanzo-ai-office-localhost-v${VER}.zip (the test kit).

Bump browser+root to 1.9.28 so tagging v1.9.28 publishes a GitHub Release
carrying ALL binaries — chrome/edge/firefox/safari, vscode/cursor/windsurf,
claude(dxt), and now office (prod + localhost) — with permanent download links.
2026-07-03 15:05:46 -07:00
hanzo-dev 9032801deb feat(office): Hanzo AI add-in for Word, Excel & PowerPoint
The surface a non-developer actually uses — a Microsoft Office task-pane
add-in that puts Hanzo AI inside the document. Select text or a range,
ask, insert. Distinct from the browser extension and the IDE extensions;
same backend as everything else: model calls through api.hanzo.ai/v1
(OpenAI-compatible), sign-in via Hanzo IAM (hanzo.id, auth-code + PKCE,
HIP-0111). No new API surface.

Decomplected so the logic is pure and unit-tested (26 tests), Office.js
glue kept thin:
- chat.ts — request/response shaping (buildMessages fences the selection
  as data; extractContent tolerates the gateway's response shapes)
- pkce.ts — PKCE + authorize URL, verified against the RFC 7636 S256 test
  vector
- host.ts — per-host read/insert; Excel range↔text helpers tested
- config.ts — canonical endpoints pinned (api.hanzo.ai, /v1/iam/oauth/*)
- taskpane/auth/commands — the Office.js + Dialog-API glue

manifest.xml passes `office-addin-manifest validate` ("The manifest is
valid" — Word/Excel/PowerPoint on web, Windows, Mac). build.js stamps the
hosting base URL (office.hanzo.ai, override for localhost dev) into a
sideloadable/AppSource-submittable dist/manifest.xml.

CI runs the tests and builds+zips a sideloadable artifact. Publishing to
AppSource needs the dist hosted at office.hanzo.ai + a hanzo-office IAM
client + a Partner Center submission (documented in the README).
2026-07-03 14:43:29 -07:00
hanzo-dev 3e380bcec3 ci: provision electron runtime libs for the extension-host tests — VS Code downloaded but could not load libnspr4.so on the minimal arc node 2026-07-03 02:12:29 -07:00
hanzo-dev 39fc502513 ci: provision xvfb before the vscode extension-host tests — the arc pool is heterogeneous and not every node ships it (Test job hit exit 127 while the E2E job's node has it) 2026-07-03 02:09:01 -07:00
hanzo-dev ce2f186bd2 vscode: resurrect the whole test gate — 0 lint errors, 152 mocha + 3 vitest passing, hard CI gates
The package's `npm test` has been broken-by-construction for years:
tsconfig excluded src/test entirely (out/test/runTest.js never existed),
tsconfig.test.json inherited the exclude that negated its include, the
runner pointed at a ./suite/index path that never existed, two suites used
BDD describe/it under the tdd-configured mocha, a vitest file sat in the
mocha glob, `ws` was never declared (it resolved only cross-package), and
154 eslint errors blocked pretest.

Lint 154 → 0 with real fixes: the ban-types autofix damage reverted
properly (the local `Symbol` interface shadowing the ES built-in — the
actual footgun — is now `CodeSymbol` everywhere), case bodies braced via
AST codemod, empty catches annotated, `Function` types replaced with real
signatures, hasOwnProperty via Object.prototype, and
@typescript-eslint/no-var-requires off — CJS lazy requires are the
intentional activation-perf idiom (the rule is retired to stylistic in
typescript-eslint v8).

Harness: tests compile via tsconfig.test.json in pretest; runner path
fixed; BDD→TDD; glob v10 promise API; esModuleInterop default imports.
Two harnesses, one directory each: vitest owns src/test/vitest/ (scoped
vitest.config, excluded from the mocha compile), mocha owns the rest;
posttest runs the vitest side so `npm test` is the whole gate.

Suites modernized against current tool contracts (34 passing / 64 failing
→ 152 passing / 0 failing / 12 pending): web-fetch rewritten against the
real http(s) path via loopback server, mode against list/activate/show/
current, mcp-tools against config-driven getAllTools filtering, extension
pins the shipped manifest contract, shell/process/git-search/filesystem/
config/bash/mcp-runner exercise real commands, files, repos and spawns.
Dead-subject suites removed; network-dependent integration tests gated on
HANZO_E2E_LIVE with visible skip reasons (12 pending). Tests-only — the
one suspected product bug was an unfaithful Memento mock, and a real
cross-suite settings leak was fixed by making suites hermetic.

CI: cli-tools and vscode test steps lose continue-on-error and become
hard gates (vscode under xvfb-run, same as the E2E job).
2026-07-03 02:05:42 -07:00
hanzo-dev 3ab5ae053c deps: close all 175 dependabot alerts — range-exact overrides, vitest 3, otel 2
- pnpm overrides pin every vulnerable transitive to its advisory's exact
  first-patched version, scoped to the advisory's own vulnerable range so
  no dependency is dragged across a major it didn't need (criticals:
  form-data 4.0.6, handlebars 4.7.9, protobufjs 7.5.5).
- vitest < 3.2.6 is a critical (CVE fix floor) with no 0.x/1.x backport —
  forced major to ^3.2.6 in every package. Test scripts unify on
  `vitest run` (aci/ai ran bare watch mode). tools' vscode mock alias
  becomes absolute (vitest 3 dropped relative alias resolution).
- packages/ai otel family 1.x → 2.x (core <2.8.0 advisory covers all 1.x):
  resourceFromAttributes, ATTR_* semconv, constructor spanProcessors. The
  previously-uncollectable telemetry suite now runs: ai 31 tests (was 16).
- direct bumps: vite ^6.4.3 (site), esbuild ^0.25.8 (mcp), uuid ^11.1.1
  (tools). packages/ai/package-lock.json deleted — stray npm lockfile in a
  pnpm workspace, carried 24 of the alerts.
- ci: test step filtered @hanzo/tools but the package is @hanzo/cli-tools —
  the suite never ran in CI. Fixed; 87 tests now gate (behind the existing
  continue-on-error). pnpm 9 reads onlyBuiltDependencies from package.json,
  not pnpm-workspace.yaml — mirrored so native build scripts stay allowlisted.

Verified: browser 243/243 + e2e 30/30 + build; aci 29/29; ai 31/31;
cli-tools 87/87; site builds on vite 6; mcp builds on esbuild 0.25.
2026-07-03 00:40:07 -07:00
hanzo-dev b3f718dfce release: browser-extension 1.9.25 — green pipeline end to end
Fix the two failures the 1.9.24 tag surfaced:

- test/claude-integration.test.ts bound a fixed port 3002 in beforeEach
  and raced the previous test's teardown — EADDRINUSE as an unhandled
  'error', a 10s hook timeout, then ECONNREFUSED (flaked 3 of 4 local
  runs). BrowserExtensionServer now exposes ready() (resolves on listen,
  rejects on bind failure instead of crashing the process) and a port
  getter; the test binds port 0 (OS-assigned), awaits ready(), and
  terminates the client so wss.close() reliably fires. Six consecutive
  green runs.

- CI Build and Publish packaged with the `zip` binary the arc runner
  image doesn't have (Publish red since 1.9.23); Publish also wrote the
  zips one directory above where its artifact globs and the Chrome Web
  Store upload (which additionally pointed at an unversioned filename)
  looked, and CI hardcoded the version from the root package.json.
  Package with `npx web-ext build` (already in the job for linting),
  version from the browser package.json everywhere, store upload path
  fixed, and the Linux job no longer ships a junk safari zip — the real
  bundle comes from the macOS job.

Root and browser package.json move in lockstep to 1.9.25 (root was left
at 1.9.23 by the 1.9.24 bump). npm + VS Code Marketplace already carry
1.9.24; the stores' first complete release of this line is 1.9.25.
2026-07-02 21:52:58 -07:00
z 22729e5218 chore(brand): dynamic hero banner 2026-06-28 20:10:51 -07:00
1560cd1228 ci: run on self-hosted ARC pool (hanzo-build-linux-amd64/deploy), not GitHub-hosted (#3)
Co-authored-by: zeekay <z@hanzo.ai>
2026-06-19 20:34:40 -07:00
Hanzo Dev 24b55d6940 feat: add Google Antigravity IDE support + fix publish workflow
- Add build-antigravity.js build script (VSIX format, same as Cursor/Windsurf)
- Add build:antigravity script to package.json
- Register antigravity in build-all-platforms.js
- Fix publish.yml to produce all 10 release assets automatically:
  Chrome, Edge, Firefox, Safari, VS Code, Cursor, Windsurf, Antigravity, Claude DXT, JetBrains
- Add structured release notes with download table for all platforms
2026-03-11 18:10:43 -07:00
Hanzo Dev a9b33cdb8e bump: v1.7.32 — add popup tools e2e tests and CI coverage
- Bump version to 1.7.32 across root + both manifests
- Add popup-tools.spec.ts for Selector, Screenshot, Page Info, Console e2e
- Update cross-platform-e2e.yml to include popup-tools spec
2026-03-11 12:16:19 -07:00
Hanzo Dev 90987821d5 feat: auto-publish on version tag push with GitHub Release artifacts
Trigger on tag push (v*) in addition to release events. Build jobs now
upload artifacts (Chrome zip, Firefox zip, VSIX). New release job
auto-creates GitHub Release with all downloadable artifacts attached.
2026-03-10 21:42:08 -07:00
Hanzo Dev 7ee89637d2 fix: CI failures — Windows PowerShell shell + model selector test
- Add shell: bash to playwright run steps to fix Windows PowerShell
  backslash line continuation parser errors
- Change "model selector includes Zen models" test to only assert the
  select element exists with >= 1 option (model API unavailable in CI)
2026-03-10 19:47:36 -07:00
Hanzo Dev 3a6c052491 feat: full Firefox DOM control + cross-platform E2E matrix
- Implement 50+ missing methods in Firefox background script
  (dblclick, hover, clear, select, check, uncheck, getText, getHTML,
  getAttribute, querySelectorAll, waitForSelector, fetch, cookies,
  localStorage, injectScript, injectCSS, observeMutations, etc.)
- Add runInPage() helper to fix undefined→{} JSON serialization bug
- Handle extension-request messages in onmessage (was silently dropped)
- Fix client.ws.send() bug in CDP bridge sendToExtension()
- Add cross-platform Playwright E2E suite (45 tests x 5 browsers)
- Add GitHub Actions cross-platform-e2e.yml (3 OS x 3 browsers matrix)
- Bump to v1.7.30
2026-03-10 19:38:55 -07:00
Hanzo Dev b6ed1a6a4b fix(ci): delete old release before upload, use real download links
- Delete existing release before creating new one (prevents duplicate assets)
- Replace wildcard placeholders with actual versioned download links
- Remove generate_release_notes (we provide full body)
- Only collect assets matching the exact version tag
2026-03-10 13:10:51 -07:00
Hanzo Dev 55d94fd6dc ci: auto-build and release all platforms on tag push
- Build Chrome, Firefox, Edge, Safari, VS Code, Cursor, Windsurf,
  Claude DXT, JetBrains — all from CI
- Auto-create GitHub Release with all assets on v* tag push
- Fix package name refs (hanzo-ide, not @hanzo/extension)
- Publish workflow: VS Code Marketplace, Open VSX, Chrome Web Store,
  Firefox Add-ons, npm, JetBrains Marketplace
2026-03-09 23:07:25 -07:00
Hanzo Dev e6b369a5d2 chore: fix CI release artifacts, modernize sidebar tools, bump MCP to 2.2.2
- ci.yml: scope find pattern to hanzo-ai-* to prevent stale/duplicate release assets
- sidebar.ts: consolidate 10 tool categories into 5 (Core, Intelligence, Workflow, Dev, Cloud)
- mcp/package.json: bump to 2.2.2 with updated description
2026-03-06 00:39:28 -08:00
Hanzo Dev daa6a6a38c fix(jetbrains): commit gradle-wrapper.jar for CI builds
The wrapper jar must be in the repo for ./gradlew to work.
Removed the workaround that tried to generate it at CI time.
2026-03-05 10:56:40 -08:00
Hanzo Dev 86e1866d3b fix(ci): generate Gradle wrapper jar when missing for JetBrains build
The gradle-wrapper.jar was not committed to the repo, causing
./gradlew to fail with ClassNotFoundException on CI. Add a step
to generate the wrapper from the system gradle installation.
2026-03-05 10:48:35 -08:00
Hanzo Dev c6487166c9 release: v1.7.6 — align all package versions, fix CI release pipeline
- Align all package versions to 1.7.6 (root, vscode, browser, dxt, tools, jetbrains)
- Fix CI release artifact paths: collect all assets into flat release/ dir
- Allow release to proceed when optional builds (Safari, JetBrains) fail
- Fix flaky claude-integration test: async server close to prevent EADDRINUSE
- Fix repo URL in root package.json (dev.git → extension.git)
2026-03-05 10:41:10 -08:00