Skip to content

Releases: ryanackley/forge-sim

v0.1.19

Choose a tag to compare

@nyxthedev nyxthedev released this 09 Oct 15:18

forge-sim v0.1.19

Fix release. Realtime now matches the real @forge/realtime package, the manifest validator accepts the shapes Forge added since July, and the @forge/llm shim knows about Opus 5 and Sonnet 5.

Realtime: channel scoping matches Forge (#11)

Thanks to @leanzero-srl for the production datapoint. The headless API collapsed every channel to a global one, so an app that leaked events across issues or modules passed locally and misbehaved in Forge. Verified against the real @forge/realtime 1.0.1 and @forge/bridge 5.17.0 packages, not just the docs; where the two disagreed, the package wins.

  • Channel identity is built from product-context values, not names. A panel on issue 10001 no longer hears a publish from issue 10002. contextOverrides are keyed by property name and value, so [Jira.Project] in project A and project B are different channels.
  • contextOverrides replace the default module scope instead of being ignored. Non-array overrides throw with Forge's exact message. publishGlobal() ignores overrides, as the real package does.
  • signRealtimeToken() tokens are enforced on the bridge subscribe path.
  • PublishResult on success is { eventId, eventTimestamp } with no errors key, matching the package typings. Code that did if (result.errors) now behaves the same locally and in Forge.
  • @forge/realtime exports the Jira, Confluence and Bitbucket product-context enums; @forge/bridge/realtime subpath resolves.
  • Re-renders triggered from a realtime subscriber are attributed to the subscribing module instead of the last-rendered one. The dev server, MCP tools and renderer bridge all pass the module's product context so scoping is identical across the three surfaces.

Manifest validation

  • @forge/manifest ^12.9 to ^13.5. Manifests using permissions.sandbox, dashboards:filter, global:fullPage and jira:entityPropertySet now validate at deploy and load time instead of being rejected. Regression test pins each accepted shape.

@forge/llm shim (#9, #12, #16, #21)

  • list() and real-passthrough chat() accept claude-opus-5, claude-opus-4-8, claude-opus-4-7 and claude-sonnet-5. claude-3-7-sonnet and claude-3-5-haiku are gone from list() because Atlassian removed them from the supported-models page. A test pins the exact doc list so the next drift fails loudly.
  • Known gap, tracked separately: Forge rejects temperature and top_p on the four new models; the shim still passes them through.

Dev mode

  • State-writer lock: an orphaned forge-sim dev instance can no longer clobber the persisted state of a newer one.

Docs

  • ROADMAP rewritten for the post-release phase (0.2 platform catch-up, 0.3 graph and agents, 0.4 interop and determinism).
  • Stats blocks refreshed: 2,731 tests across 146 files (2,566 core / 139 files), 41 MCP tools.

Full changelog: v0.1.18...v0.1.19

v0.1.18

Choose a tag to compare

@nyxthedev nyxthedev released this 01 Aug 11:05

forge-sim v0.1.18

Note for npm users: v0.1.17 was tagged on GitHub but never published to npm, so this release takes you from 0.1.16 straight to 0.1.18. Everything below is new to you.

Manifest validation with Atlassian's official validator

forge-sim now runs your manifest.yml through @forge/manifest, the same validation pipeline that powers forge lint and forge deploy. If your manifest would fail a real deploy, it now fails in the simulator too.

  • deploy() and the MCP forge_deploy tool hard-fail on error-level findings; warnings print but don't block (matching forge lint semantics)
  • sim.loadManifest(yaml) runs the same checks, minus file-existence rules (there's no app directory to check). Pass { validate: false } if a test deliberately needs a broken manifest.
  • Errors include line:column, the validator's reference code, and remediation hints for common mistakes: missing runtime, missing panel icon, deprecated UI Kit 1 module shapes, and app ids that aren't ARIs (use forge register, or the placeholder ari:cloud:ecosystem::app/00000000-0000-0000-0000-000000000000 for pure local simulation)

This closes a class of silent parity gaps where the simulator accepted manifests that Forge rejects. It's especially useful when an AI is driving the dev loop: stale training data produces outdated manifest shapes, and the validator now catches them at the door with an actionable fix in the error text.

Realtime: publish() now requires an invocation context

realtime.publish() from outside a frontend invocation context (product triggers, scheduled triggers, web triggers, queue consumers) now returns { eventId: null, errors: [{ message: 'Unauthorized request' }] } instead of silently delivering to the global channel. This matches real Forge behavior: use publishGlobal() and subscribeGlobal() from async contexts.

  • Invocation context is tracked across all five entry paths and survives async continuations
  • PublishResult.errors is now RealtimeError[] (objects with .message), matching the documented shape, across the core API, both bridge shims, and the MCP tool
  • Backend-to-frontend scoped delivery in forge-sim dev now resolves the correct module instead of falling back to the global plane

Fixes

  • npm install now works from a clean clone (#15)

Stats

135 test files, 2,396 tests passing.

v0.1.17

Choose a tag to compare

@nyxthedev nyxthedev released this 28 Jul 14:45

Fixed

  • renderer/ now installs from a clean clone. A committed renderer/.npmrc (legacy-peer-deps=true) fixes the hard ERESOLVE failure on npm 11+ caused by Atlaskit's React 16 peer pins. Contributed by @leanzero-srl in #15.

It turns out the same .npmrc also fixes npm ci: the "lockfile out of sync" errors came from npm computing a peer-inclusive ideal tree, not from actual lockfile drift. With the flag in place, npm ci replays the existing lockfile cleanly. No lockfile regeneration was needed.

Verified from a clean checkout: npm ci (1,272 packages), renderer suite (166 tests), root suite (2,360 tests), tsc and vite builds.

Published package behavior is unchanged: installed-package mode already wrote its own .npmrc before materializing renderer deps, so end users were never affected. This release fixes the contributor path.

forge-sim v0.1.16

Choose a tag to compare

@nyxthedev nyxthedev released this 19 Jul 13:49

First public release of forge-sim — a simulated Atlassian Forge runtime for local development and testing. Run Forge apps entirely on your machine: resolvers, triggers, queues, scheduled jobs, KVS / Custom Entities / SQL / Object Store, UI Kit rendering with real Atlaskit components, Custom UI, web triggers, @forge/llm, and more.

Highlights

  • Three driver surfaces: in-process API (createSimulator()) for vitest/jest, an MCP server (41 tools) for AI-driven iteration, and forge-sim dev — a full dev server with live browser preview and dev tools.
  • Behavioral parity first: if it works in forge-sim, it should work in Forge — and vice versa. Error shapes, quotas, and API contracts are pinned against the real @forge/* packages.
  • Fully sandboxed until you connect a real account: mock-first product APIs with optional real-API passthrough (PAT) for dev mode.
  • Battle-tested: 2,526 automated tests, hardened through repeated independent adversarial evaluation rounds.

Install

npm install --save-dev forge-sim

See the README and docs to get started.