Repository navigation
Releases: ryanackley/forge-sim
Release list
v0.1.19
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.
contextOverridesare keyed by property name and value, so[Jira.Project]in project A and project B are different channels. contextOverridesreplace 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.PublishResulton success is{ eventId, eventTimestamp }with noerrorskey, matching the package typings. Code that didif (result.errors)now behaves the same locally and in Forge.@forge/realtimeexports theJira,ConfluenceandBitbucketproduct-context enums;@forge/bridge/realtimesubpath 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 usingpermissions.sandbox,dashboards:filter,global:fullPageandjira:entityPropertySetnow 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-passthroughchat()acceptclaude-opus-5,claude-opus-4-8,claude-opus-4-7andclaude-sonnet-5.claude-3-7-sonnetandclaude-3-5-haikuare gone fromlist()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
temperatureandtop_pon the four new models; the shim still passes them through.
Dev mode
- State-writer lock: an orphaned
forge-sim devinstance 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
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 MCPforge_deploytool hard-fail on error-level findings; warnings print but don't block (matchingforge lintsemantics)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 panelicon, deprecated UI Kit 1 module shapes, and app ids that aren't ARIs (useforge register, or the placeholderari:cloud:ecosystem::app/00000000-0000-0000-0000-000000000000for 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.errorsis nowRealtimeError[](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 devnow 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
Fixed
renderer/now installs from a clean clone. A committedrenderer/.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
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, andforge-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