Changelog
@ekanos/sdk, @ekanos/ui, and @ekanos/integration-schema release in lockstep at the same version. @ekanos/cli and @ekanos/harness version independently.
October 2026 — zod 4, signed-webhook schemes, shared widget chrome, next-intl
@ekanos/sdk 0.4.0
- zod 4 support. The
zodpeer range is now^3.25.76 || ^4.0.0. Partner-facing schema generics (StorageKeyDeclaration,PartnerActionDeclaration, a webhook’spayloadSchema) are constrained by Standard Schema instead ofz.ZodType, so a schema from either zod major satisfies them.StandardSchemaV1is exported. Existing definitions compile unchanged. Webhook payloads are validated through~standard.validatein the host and in@ekanos/sdk/testing. A record key that fails its key schema (an action name, a storage key) reports the key schema’s own message again under zod 4, instead of “Invalid key in record”. - New:
signature.schemefor webhooks.WebhookSignatureSchemeis re-exported from@ekanos/sdk/integration. See Webhooks. - New: shared widget chrome.
Widget.Headerrenders a ⋯ menu (“Open in workspace”, “Refresh”, “Pin to board” / “Unpin from board”), takes a newmenuprop andWidget.MenuItemfor your own items, the error boundary insideWidget.Activeoffers “Try again”, andWidget.HealthFootersays when the integration last synced.Widget.DataStatetakesonRefresh,refreshingandupdatedAt. New in@ekanos/sdk/components: theWidgetDatatype and the optionalWidgetContextValue.dataandWidgetMeta.openHreffields. See Widgets. - Changed (breaking outside Ekanos and the harness):
@ekanos/ui/transresolves through next-intl instead of react-i18next. ANextIntlClientProvideris now required,next-intl(^4.14.7) is a new peer, and the@ekanos/sdk/eslintpreset now bans importingi18nextandreact-i18nextaltogether. See Runtime notes. PartnerActionDeclarationis now exported from@ekanos/sdk/integration, so you can name the type of an action handler you share with a tool.partnerOAuthErrorParamhas copy for three more error codes:app_not_set_up,organization_accessandwrong_workspace. See OAuth.
@ekanos/integration-schema 0.4.0
- New:
webhooks[].signature.schemewithalgorithm(sha256|sha1),format(digest|keyed),digestKey,timestampKey,timestampHeader,signedPayloadandtoleranceSeconds. Cross-field rules are enforced at parse time. Omittingschemekeeps the previous behaviour: a bare orsha256=-labelled HMAC-SHA256 of the raw body. New exported typeWebhookSignatureScheme. - zod 4 support, with the same peer range and Standard Schema constraints as the SDK.
StandardSchemaV1is exported.
@ekanos/ui 0.4.0
- New:
@ekanos/ui/pagewithPageBody,PageRail,PageTitleSection,PageToolbar/PageToolbarActions,PageRailTabs,PageRailSubTabs,PageBackButton,PageRangeSwitchandPageViewModeToggle. - New:
@ekanos/ui/status-badge(StatusBadge) and@ekanos/ui/stat(Statand its parts). - Changed:
@ekanos/ui/transresolves through next-intl; see the SDK entry above. It is now a client entry (it carries'use client') and no longer accepts ani18ninstance prop.i18nextandreact-i18nextare no longer dependencies. - Tokens:
tokens.cssis generated from Ekanos’s design system and checked by value in the build. This fixes a stale--destructive-strongand adds the missing--warning-strong,--info-strongand--favoritetokens, with theirtext-warning-strong,text-info-strongandtext-favoriteutilities. - Overlays use the elevation tiers (dialogs
shadow-modal, select and dropdown menusshadow-popover), and inputs, textareas and select triggers fill withbg-card.@base-ui/reactis bumped to 1.8.0.
@ekanos/harness 0.4.0
- Fixed: fixtures-mode actions. A registry that declared a host-route fixture such as
GET /api/integrations/<slug>/storagemade everyuseIntegrationAction()call answer500 handler_errorbefore the handler ran. Host-route fixtures are now skipped on that path. See Harness actions. - The Triggers tab shows a declared
signature.schemeas a badge (algorithm, signed payload, keyed pairs, timestamp source and replay window). RootLayoutmounts aNextIntlClientProvider, andnext-intl(^4.14.7) is a new peer dependency. Supports zod 4.
@ekanos/cli 0.3.3
- The
ekanos initscaffold pins@ekanos/sdk,@ekanos/uiand@ekanos/harnessto^0.4.0and@ekanos/clito^0.3.3. On 0.x semver^0.3.0excludes 0.4.0, so without this a fresh scaffold would install the previous toolchain. - The scaffold installs
next-intl(^4.14.7). - The scaffold includes a
pnpm-workspace.yamlapprovingesbuild’s build script (allowBuilds: { esbuild: true }). Under pnpm 10+, a project without it fails everyekanos dev/ekanos testwithERR_PNPM_IGNORED_BUILDS, withekanos testblaming the green tests. npm and yarn ignore the file. - The generated
AGENTS.mdmentionssignature.schemeand points at the SDK README’s provider table. ekanos validate’s “did you mean” suggestions read definitions built with either zod major. The CLI bundles@ekanos/integration-schema0.4.0.
September 2026 — widget actions
@ekanos/sdk 0.3.0
- New:
useIntegrationAction<TInput, TOutput>(slug, actionName, options)in@ekanos/sdk/hooks— a react-query mutation that posts toPOST /api/integrations/<slug>/actions/<actionName>. Also exports theintegrationActionUrlURL builder. - New:
IntegrationActionError— the typed error a rejected action mutation always throws, withstatus,code, and (for a 400invalid_input) your zodissues. - New:
PublicActionErrorin@ekanos/sdk/integration— throw it from an action handler to show itsmessageto the user verbatim. Any other throw becomes a generic"Action failed."response under thehandler_errorcode.
@ekanos/integration-schema 0.3.0
- New:
actions— a record of widget-invoked, deterministic server handlers keyed by kebab-case name:{ description, input, output?, handler }, whereinput(and optionaloutput) are real zod schemas. - New:
proposes.scope('user' | 'team') — your declared intent for the integration’s scope.
@ekanos/ui 0.3.0
- Version-lockstep release, no changes.
@ekanos/harness 0.3.0
- Actions endpoint —
ekanos devservesPOST /api/integrations/<slug>/actions/<actionName>, so a widget callinguseIntegrationAction()runs its declared handler with no extra wiring. Fixtures mode runs it against a mock context and never the real network; live mode uses the same server-held context as live webhooks and schedules. - Live-mode confirmation — the first action call on an integration while the toolbar is set to Live raises a one-time confirmation for the session. Fixtures mode never prompts.
- README documents the actions surface and its pinned response codes:
action_not_found,invalid_input,rate_limited,handler_error.
@ekanos/cli 0.3.2
- Fixed the
ekanos initscaffold pinning@ekanos/sdk/@ekanos/ui/@ekanos/harnessto^0.2.0, which excluded 0.3.0. The template now pins them to^0.3.0and@ekanos/clito^0.3.1.
@ekanos/cli 0.3.1
- The scaffold documents the
actionssurface: a new “Actions” section inAGENTS.mdand a commented exampleactions['create-record']insrc/integration.ts. Docs and scaffold text only.
@ekanos/cli 0.3.0
- Shell contract 2 —
ekanos devscaffoldsapp/api/integrations/[slug]/[...path]/route.ts, which serves the live-mode OAuth loop, storage bridge, and trigger route through@ekanos/harness/api. Pair with@ekanos/harness0.2.0 or later. ekanos dev --host <non-loopback>now setsEKANOS_HARNESS_EXPOSED=1after a warning, anddevprints where the harness generates.ekanos/local-secrets.json.
September 2026 — client-side fetch, partner OAuth, live-mode OAuth loop
@ekanos/sdk 0.2.0
- New:
useIntegrationFetch()/IntegrationFetchProvideranduseActivationData()/IntegrationActivationDataProviderin@ekanos/sdk/hooks— the client-side counterpart toctx.fetch. Outside a provider,useIntegrationFetch()is a plainglobalThis.fetchpassthrough anduseActivationData()returnsnull. - New:
createMockFetchProvider()in@ekanos/sdk/testing, sharing its fixture matching withcreateMockContext. - The
@ekanos/sdk/eslintpreset now namesuseIntegrationFetch()as the remediation for a barefetchin client code.
@ekanos/sdk 0.1.6
- Partner OAuth client helpers in
@ekanos/sdk/hooks:partnerOAuthConnectPath,partnerOAuthStatusUrl,createPartnerConnectionCheck, andpartnerOAuthErrorParam, for use withOAuthActivationForm. - The host now runs the OAuth flow at
/api/integrations/<slug>/oauth/{connect,callback,status}, and the submission gate acceptsoauthdeclarations. Known gaps: no host-driven token refresh, no disconnect hook, HTTP Basic token-endpoint auth only.
@ekanos/sdk 0.1.5
- New:
Widget.Body— a padded body container for use insideWidget.Active, whose content area is flush by design.
@ekanos/sdk and @ekanos/integration-schema 0.1.4
- New:
onActivate— an optional(ctx) => Promise<void>hook that runs after an activation is first persisted and again after activation data is updated. Errors are non-fatal. The production host does not call it yet. - New:
invokeActivate()in@ekanos/sdk/testing.
@ekanos/ui and @ekanos/integration-schema 0.2.0, 0.1.6, 0.1.5
- Version-lockstep releases, no changes.
@ekanos/harness 0.2.0
- Local OAuth loop — live mode runs the real authorize → callback →
onTokensloop on localhost through the new@ekanos/harness/apientry (createHarnessApiHandlers(registry)), with admin-tier credentials in a gitignored.ekanos/local-secrets.jsonfilled in from the Activation surface. - Fixtures mode answers
oauth/statusfrom a newoauth.connectedentry field (connected by default). - New
live.default: 'live'opens an integration in Live API mode. - API routes refuse non-loopback
Hostheaders unlessEKANOS_HARNESS_EXPOSED=1.
@ekanos/harness 0.1.5
HarnessProvidersmounts the SDK’sIntegrationFetchProviderandIntegrationActivationDataProvideraround every widget, souseIntegrationFetch()works with no partner-writtenFetchProvider.HarnessLiveMode.FetchProvideris now@deprecatedbut still works.
@ekanos/harness 0.1.4
- The Triggers surface’s OAuth card explains the hosted OAuth transport and the host-derived redirect URI.
@ekanos/harness 0.1.3
- Same-origin
/api/…requests are answered from fixtures in every toolbar mode; a miss throwsNoRecordedResponseErrorin both modes. HarnessLiveMode.FetchProviderreceivesmodeandactivationDataprops.- New entry point
@ekanos/harness/hooks, exportinguseHarnessDataMode()anduseLiveActivationData().
@ekanos/cli 0.2.3
- Fixed the
ekanos inittemplate pinning the old^0.1.0toolchain, which made a fresh scaffold’s install fail with ERESOLVE.
@ekanos/cli 0.2.2
- Scaffolded
AGENTS.mdnamesuseIntegrationFetch()/useActivationData()as the widget networking seam and adds a “Network model” note. Template text only.
@ekanos/cli 0.2.0
- Redesigned findings output for
validate,publish’s gate refusal, andstatus --findings: grouped by check, severity-ordered, with codeframes where a source line can be resolved.ekanos testadds aFAILURESappendix for vitest;--rawskips it. - Project-scoped
ekanos status— shows this project’s versions, with other integrations in the source summarized (--allexpands them). - Line numbers and “did you mean” suggestions on
validatefindings. - Interactive
initandloginin a real terminal; CI,--json, and piped output are unaffected. - Scaffold hardening —
tsconfig.jsonsetsnoUncheckedIndexedAccess;validatewarns when it is missing (project.host-compiler-rules) andpublishrefuses. A pre-commit hook runsekanos validate(skip withSKIP_EKANOS_HOOK=1). --jsonoutput is unchanged apart from additive fields onstatusandtest.
August–September 2026
@ekanos/cli 0.1.10
ekanos publishnow packs root-leveltsconfig*.jsonand vitest/vite config files, which the hosted gate’schecks/typecheckandchecks/testsstages need. Upgrade and republish for the fix to take effect.
@ekanos/cli 0.1.9
- The
ekanos initscaffold declares@ekanos/harness,tailwindcss, and@tailwindcss/postcssas devDependencies, so the firstekanos devworks. - New advisory check
icons/pro-only— warns on Font Awesome names not in the Free set.
@ekanos/cli 0.1.8
ekanos statusshows the gate’s verdict per version;--findingslists every finding;--watchblocks until the current version reachesgated/dev(exit 0) orrejected(exit 10).
@ekanos/cli 0.1.7
ekanos.jsonaccepts an optionaldocsarray, written by the repeatableekanos init --docs <value>flag.initalso scaffoldsdocs/api-notes.mdand.mcp.json.validatewarns withdocs/missing-filefor a listed local doc that does not exist.
@ekanos/sdk and @ekanos/ui 0.1.1
BaseMarketplaceTileimportsnext/link.js, so the SDK loads under plain Node and vitest.Transrenders itsdefaultsstring when no i18next instance is registered.- Package metadata: dead
repository/homepagelinks removed;bugsisnpm@govastly.com.
Migration guide
0.3 → 0.4
Runnpm i -g @ekanos/cli@latest, then ekanos upgrade in the project. On 0.x semver ^0.3.0 excludes 0.4.0, so the pins must move. What to check:
- Add
next-intl.@ekanos/uiand@ekanos/harnessnow requirenext-intl(^4.14.7) as a peer. Projects fromekanos init0.3.3 already have it. <Trans>outside Ekanos and the harness needs aNextIntlClientProviderabove it (for a Storybook or a bare unit test:<NextIntlClientProvider locale="en" messages={{}} timeZone="UTC">). Remove anyi18nprop passed toTrans, and anyi18next/react-i18nextimports, which the ESLint preset now bans.- zod: nothing to do. Zod 3 (
^3.25.76) keeps working; zod 4 is now accepted. - pnpm 10+: add
pnpm-workspace.yamlwithallowBuilds: { esbuild: true }if the project predates CLI 0.3.3. - Everything else is additive:
signature.scheme,Widget.MenuItem,Widget.DataState’sonRefresh/refreshing/updatedAt,@ekanos/ui/page,status-badgeandstat.
0.2 → 0.3
No breaking changes. Theactions surface is optional. To add an action:
- Declare it under
actionsindefineIntegration() - Call it from your widget with
useIntegrationAction() - Handle
IntegrationActionErrorin the mutation’s error path
@ekanos/sdk, @ekanos/ui, and @ekanos/harness resolve to ^0.3.0 — ekanos upgrade does this. (Current projects move on to ^0.4.0; see 0.3 → 0.4 above.)
Existing projects from before CLI 0.2.0
Add"noUncheckedIndexedAccess": true to compilerOptions in tsconfig.json — ekanos publish refuses to submit until it is set.
Support
- Report bugs — Email npm@govastly.com with details
- Check version —
ekanos --version - Upgrade safely —
ekanos upgradeverifies and rolls back automatically