Packaging

Ship a publishable Lunnoa integration app with the lunnoaApp manifest.

Installable apps are npm packages that default-export createApp({...}) and declare a lunnoaApp block in package.json. SuperAdmins install packages on a running Lunnoa server via the admin API; no platform rebuild is required.

Package layout

package.json
{  "name": "@acme/lunnoa-app-my-service",  "version": "1.0.0",  "main": "./dist/index.js",  "types": "./dist/index.d.ts",  "peerDependencies": {    "@lunnoa/toolkit": "^1.0.0"  },  "lunnoaApp": {    "appId": "my-service",    "toolkitVersion": "^1.0.0",    "platformVersion": "^1.0.0"  }}
FieldDescription
lunnoaApp.appIdMust match createApp({ id }) exactly
lunnoaApp.toolkitVersionCompatible toolkit semver range
lunnoaApp.platformVersionCompatible Lunnoa Automate platform semver range

Rules that avoid install failures

  • Export one default: export default createApp({ ... })
  • Keep @lunnoa/toolkit as a peerDependency (not bundled)
  • Align appId with every action, trigger, and connection id prefix
  • Ship compiled CommonJS (or whatever the host require() expects) via main
  • Pin toolkit and platform ranges you have actually tested

App metadata reminders

On createApp:

  • id: unique kebab-case slug used as the registry key
  • logoUrl: shown in the catalogue and on steps that lack an action icon
  • isPublished: defaults to true; set false while developing
  • availableForAgent: defaults to true
  • systemPromptFragment: optional short policy text injected when any of the app's actions are enabled on an agent

Reference packages

For working examples, see lunnoa_apps and the built-in apps in the lunnoa_automate monorepo (packages/apps). Built-ins use the same createApp contract; installable packages depend on the published npm toolkit version.

Next