Course menuForge Kitchen

Questions

FAQ

What to run after a change, what to do when something breaks, and every command and word the course uses, each in one place.

After a change, what do I run?

Find what you just changed. The commands are in the order to run them, from the app folder.

I changed code in src/

Both levels

With forge tunnel running, save the file and reload the Jira page: the tunnel serves your laptop’s code. Without the tunnel, deploy:

RunTerminal
forge deploy

The site picks up the new version on its own. You do not need to install again.

I added a scope or a supplier host

Both levels

A permission change makes a new major version. Approve it, then move each installation onto it:

RunTerminal
forge deploy --approve MAJOR_VERSION_RULE
forge install --upgrade

If the app is installed on Jira and Confluence, run the upgrade for each; it asks which installation.

I set or changed a variable

Both levels

Variables reach your functions with the next deploy:

RunTerminal
forge variables list
forge deploy

Variables belong to one environment. Without -e, both commands use development.

I changed the menu desk (Level 2)

Level 2

The desk is built from static/desk/src into static/desk/build, which is what Forge serves. Build, then deploy:

RunTerminal
npm run build:ui
forge deploy

I added an npm package

Both levels

Install it so package.json lists it, then deploy. Forge bundles what package.json and your imports name:

RunTerminal
npm install @forge/api
forge deploy

The app now writes to Confluence (Level 2)

Level 2

Deploy and upgrade as for any permission change, then install the app on Confluence on the same site, once:

RunTerminal
forge deploy --approve MAJOR_VERSION_RULE
forge install --upgrade
forge install

In the last command, choose Confluence and the same developer site. After that, each major version needs forge install --upgrade for both installations.

Something went wrong

Find the message or the symptom. Each answer says why it happens and how to get going again.

Deploy stops after a permission change

Both levels

That is expected, not an error. A new scope or supplier host makes a new major version, which you approve. Then each installation has to accept it, like a landlord signing a new licence:

RunTerminal
forge deploy --approve MAJOR_VERSION_RULE
forge install --upgrade

“Unable to get local issuer certificate”

Both levels

A VPN or company proxy is intercepting HTTPS, and Node does not trust its certificate. Disconnect the VPN and try again. If your company needs a proxy, set it for npm with the values from your IT team:

RunTerminal
npm config set proxy http://proxy.example.com:8080
npm config set https-proxy http://proxy.example.com:8080

I can’t see the recipe card on the work item

Level 1

Check that the app is installed on the site you are looking at (forge install list). Then open a work item and look for the app’s button under the summary: issue panels are added from there, once per work item.

The card says “No API Ninjas key”

Both levels

The variable is missing in this environment, or you have not deployed since setting it:

RunTerminal
forge variables set --encrypt API_NINJAS_KEY
forge deploy

With forge tunnel running, your laptop runs the code, so the key has to be in your shell as FORGE_USER_VAR_API_NINJAS_KEY. In bash or zsh, read -s FORGE_USER_VAR_API_NINJAS_KEY && export FORGE_USER_VAR_API_NINJAS_KEY asks for it without echoing it.

“Cannot find module @forge/…”

Both levels

The code imports a package that is not installed. Install the one named in the message, then deploy:

RunTerminal
npm install @forge/api
forge deploy

The menu desk page is blank

Level 2

Forge serves static/desk/build, which only exists after a build. Run npm run build:ui, then forge deploy. If it is still blank, check that resources in the manifest points at static/desk/build.

Creating a ticket fails with “Jira answered 400”

Level 2

Usually the issue type. The app creates a Task in the space set by KITCHEN_PROJECT_KEY. If your space has no Task type, set another one and deploy:

RunTerminal
forge variables set KITCHEN_ISSUE_TYPE Story
forge deploy

The sous-chef found no dishes

Level 2

The notes have to name dishes the kitchen agreed to make. Write them plainly (“We will serve pad thai and a miso soup”) and send the menu again. If the logs show a Forge LLM error instead, check that the llm module is in the manifest and that you approved and upgraded after adding it.

The tickets appear, but no Confluence page

Level 2

Set the space key and make sure the app is installed on Confluence:

RunTerminal
forge variables set MENU_SPACE_KEY KITCHEN
forge deploy
forge install --product confluence

Moving a ticket to “Approved for Agent” does nothing

Level 2

The pass checks four things before it hands a dish on: the ticket is in your kitchen space, it has the assign-to-agent label, its status is exactly the one in HANDOFF_STATUS (by default “Approved for Agent”), and it was not handed on before. The log says which check stopped it.

The specialist chef does not appear in Rovo

Level 2

Rovo has to be active on the site, and the installation has to be on the version that added the agent. Deploy, approve and upgrade, then open Rovo Chat and browse agents.

Commands at a glance

Every command the course uses. Run them from the app folder.

Set up

Once per laptop, app or site.

npm install -g @forge/cli@latest
Installs (or updates) the Forge CLI on your laptop. Once, before anything else, and again when the CLI says it is out of date. Never with sudo.
forge --version
Prints the CLI version, which proves the install worked. Right after installing or upgrading the CLI.
forge login
Logs the CLI in with your Atlassian email and an API token. It asks for both. Once per laptop, or when the token expires.
forge whoami
Shows which Atlassian account the CLI is logged in as. After logging in, or when a command says you are not allowed.
forge site provision
Creates a free development site of your own, or shows the one you have. Once, during setup, if you do not have a developer site yet.
forge create
Registers a new app and copies a starter template into a new folder. It asks which template. Once, at the start of Level 1.
forge register
Gives a downloaded copy of the app your own app id. Only if you start from one of the course’s code downloads instead of your own folder.
npm install
Installs the packages listed in package.json. After creating or downloading the app, and after pulling in someone else’s changes.
forge install
Installs the deployed app on one site and product. It asks which. Once per site and product. Later deploys reach it on their own.
forge install --product confluence
Installs the same app on Confluence, on the same site. Once, in Level 2, before the app writes Confluence pages.
forge variables set --encrypt API_NINJAS_KEY
Stores a secret with the app. The CLI asks for the value without showing it. Once per environment, for the supplier key (and the door code in Level 2). Deploy afterwards.
forge variables set KITCHEN_PROJECT_KEY KIT
Stores a setting that is not secret, such as your Jira space key. In Level 2 setup, once per environment. Deploy afterwards.
forge webtrigger create
Prints the URL of a web trigger for one installation. It asks which. In Level 2, lesson 8, to find the delivery door’s address.

After every change

When you edit code, the manifest or the menu desk.

npm run build:ui
Builds the menu desk (Custom UI) into static/desk/build. Before every deploy that changes the menu desk. From Level 2, lesson 1.
forge deploy
Uploads your code and manifest as a new version, to the development environment by default. After every change to code, the manifest or a variable.
forge tunnel
Runs your functions on your laptop while the site keeps calling them. While you work on code, so changes show on refresh without a deploy. Press Ctrl+C to stop.

After a permission change

When the manifest asks for more: new scopes or supplier hosts.

forge deploy --approve MAJOR_VERSION_RULE
Deploys a version that changes permissions, which Forge treats as a new major version. When forge deploy stops because you added a scope or a supplier host.
forge install --upgrade
Moves an installation onto the new major version, so the site grants the new permissions. After an approved deploy. Run it for each product the app is installed on.

Check and debug

Before a deploy, or when something looks wrong.

forge install list
Lists where the app is installed, with the version and environment. When you are not sure the app is on the right site.
forge variables list
Lists the variables of an environment. Encrypted values are hidden. To check a variable is set, and set in the right environment.
forge lint
Checks the manifest and code for problems before a deploy. After every manifest change, and whenever a deploy fails.
forge lint --fix
Adds the scopes your code needs to the manifest. After you call a new product API, before you deploy.
forge logs --since 15m
Shows what your functions logged in the last 15 minutes, including errors. When something did not happen, or happened twice.

Clean up

When you are finished.

forge uninstall
Removes the app from a site. When you are finished with the course.

Words, in one line

Each word is explained properly once, where the course first uses it. Here is the one-line version, its kitchen name, and Atlassian’s own page.

Agent handoffthe pass

When a work item labelled assign-to-agent reaches the “Approved for Agent” status, the app hands it on once.

App codethe playbook

The JavaScript in your app folder: the frontend that draws the UI and the functions that run in the cloud.

asApp()on the restaurant’s own badge

Calls a product API as the app itself. Needed when no user is present, such as in a queue consumer or trigger.

asUser()on the staff member’s badge

Calls a product API as the person using the app, with exactly their permissions.

Atlassian API tokenthe van’s permit

A token from your Atlassian account that forge login uses to act as you.

Checkpointticking dishes off

Progress saved in storage as the worker goes, so a retried event skips the work already done.

Confluence pagethe menu of record

A Confluence page the worker writes once per menu, listing every dish ticket it created.

Consumer (worker function)the prep cook

The function a consumer module runs for each queue event, after the original request has already returned.

Custom UIyour own fitted counter

Your own HTML, CSS and JavaScript, served from a resources folder and shown in a sandboxed frame.

Deploydeliver the playbook

forge deploy uploads your code and manifest to the Atlassian cloud as a new version. It changes nothing on a site by itself.

Developer siteyour test location

A free site of your own for building and breaking apps. Never use your company’s Jira for this course.

Egress permissionthe approved supplier list

Forge blocks calls to the outside unless the host is listed under permissions.external.fetch.backend.

Environmenta kitchen copy

Forge keeps separate copies of each app: development (the default), staging and production, each with its own variables.

Environment variablethe safe

A named value stored with the app, read in code as process.env.NAME. --encrypt hides the value from forge variables list.

External APIa supplier

A service outside Atlassian that your functions call over HTTPS. Here it is API Ninjas, which returns recipes.

Fan-outthe split

One input becomes many outputs: one menu meeting becomes one Jira work item per dish.

Forgethe building

Atlassian’s app platform: you write the code, Atlassian hosts it, runs it and keeps it next to the product’s data.

Forge appyour restaurant

Your code plus its manifest. One app can add several things to Jira and Confluence at once.

Forge bridgethe hatch

@forge/bridge connects your frontend to Forge: invoke(), view.getContext(), router and more.

Forge CLIthe delivery van

The forge command on your laptop. It creates, deploys, installs and tunnels your app.

forge install --upgradethe landlord signs the new licence

Moves an installation onto a new major version so the site grants the new permissions.

forge lintthe inspector

Checks the manifest and code before a deploy. --fix adds missing scopes it can infer from your code.

Forge LLMthe sous-chef

Large language models hosted by Atlassian, called with chat() from @forge/llm after declaring an llm module.

forge logsthe kitchen log

Shows what your functions printed with console.log and any errors, for a site and environment.

Forge MCP serverthe rulebook on call

An MCP server from Atlassian that gives AI coding tools current Forge documentation and guides while you work.

Forge SQLthe storeroom ledger

A relational database per installation, for data you query with joins and filters. This course uses KVS instead.

forge tunnelcook from home

Runs your functions on your laptop while the site keeps calling them, so changes show up on refresh without a deploy.

Functiona station

A named entry point in your code (handler: file.export) that Forge runs in the cloud when something calls it.

Global page (jira:globalPage)the menu desk

A full page of your own in Jira’s Apps menu. Here the head chef pastes the notes from a menu meeting.

ignoreSelfthe bell ignores the restaurant’s own badge

A trigger filter that skips events the app caused itself, so its own edits don’t re-run it.

Installopen at a location

forge install puts a deployed app on one site and product. You do it once per site; later deploys reach it automatically.

invoke()the runner

The frontend’s way to call a resolver function by name and wait for its answer.

Issue panel (jira:issuePanel)the recipe card

A module that adds your UI to the work item view, below the description.

Jira work itema dish ticket

A Jira issue. In this course each work item names one dish, such as “Pad thai”.

Job idthe receipt

The id the resolver returns at once, here menuId, so the page can ask about progress later.

Key-Value Store (KVS)labelled jars

Forge’s hosted storage of JSON values by key, from @forge/kvs. Each installation has its own.

Major versiona new licence

A deploy that changes permissions creates a new major version. You approve it, then each site has to accept it.

manifest.ymlthe licence

The app’s description of itself: what it adds (modules), which files it serves (resources) and what it may do (permissions).

Modulea line on the licence

One thing your app adds to a product, such as jira:issuePanel or trigger. Each has a unique key.

Product contextthe ticket number

Forge tells your functions where they were called from, for example context.extension.issue.id.

Product REST APIsthe house systems

Jira and Confluence REST APIs, called from functions with requestJira and requestConfluence.

Product triggerthe bell

A trigger module runs a function when a product event happens, such as avi:jira:created:issue.

Queue (@forge/events)the rail

Async events: push a small message now, and a consumer function handles it later, with its own longer time limit.

Queue eventa job slip

The small body you push to a queue. Keep it to an id and keep the real data in storage.

Resolverthe cook

Backend functions, each with a name, that the frontend calls with invoke(). They run in the Atlassian cloud, not in the browser.

Rovo actiona technique

An action module: a function with typed inputs that a Rovo agent may decide to call.

Rovo agent (rovo:agent)the specialist chef

An AI agent your app adds to Rovo, with a prompt and a list of actions it may call.

Runtime limitsthe kitchen timer

Every function invocation has a time limit. Work that may take longer belongs in a queue consumer, which can be given more time.

Scopea key to the house systems

A permission such as read:jira-work that the app must declare before it may call a product API.

Shared secretthe door code

A web trigger URL is public, so the app checks a secret header against an encrypted variable before doing anything.

Sitea location

One Atlassian cloud site, such as your-name.atlassian.net, with its own Jira, Confluence and users.

Studio agenta guest chef

An agent built in Rovo Studio in the browser, with no code and no app of its own.

Template (forge create)a standard floor plan

forge create registers a new app and copies a working starter for the module you pick.

UI Kitstandard furniture

Atlassian’s React components for Forge (@forge/react). They render natively and look like the product.

Web triggerthe delivery door

A webtrigger module gives your app a URL that outside systems can call over HTTPS.

Type at least two letters.