Skip to main content
These commands find, file and edit the issue a spec lives in, in your factory’s issue tracker. You need only an OuterLayer credential. OuterLayer holds the tracker’s credential, so the same four commands work for GitHub, Linear and Jira. Every command takes --json, plus --url and --app-id when your config lacks them. A failed command prints the reason and exits 1. Filing works for GitHub, Linear and Jira. A Linear or Jira connection made without write access is refused with tracker_write_not_permitted. spec target and spec search work for all three. The starter /spec skill runs these commands for you. See Connect an issue tracker.

outerlayer spec target

Say where a spec would be filed, and whether the factory can file there.
A factory with a stored Linear or Jira connection files there. A factory with only linked repositories files in GitHub. It needs work.read. Find open and closed issues that match a query, so a spec is not filed twice.
A closed issue is a match too, because it may already hold the decision. With --json, each issue also carries its tracker, updatedAt and URL. It needs work.read.

outerlayer spec file

File a spec as a new issue.
It prints the key, the URL, the issue’s updatedAt and the command that builds the issue:
What filing needs. The key must hold spec.insert. The Agent preset carries it, but keys made before it existed do not, so make a new key or edit the old one. For GitHub, an organization admin must also approve the OuterLayer App’s Issues: Read and write permission (issues: write) once. Until then spec target prints can file: no, and spec file refuses with tracker_write_not_permitted and sends GitHub nothing. Every attempt that reaches a tracker is recorded in a log that cannot be edited or deleted.

outerlayer spec edit

Replace the body of an issue that holds a spec.
<key> is the issue key, such as acme/api#12. --body-file is the whole new body. Pass the updatedAt that spec file printed, or that your last spec edit of the issue printed, as --updated-at, and the edit is refused with conflict if the issue has changed since. On Linear any change to the issue counts, not only to its description. Without --updated-at, the edit is not checked for someone else’s change. spec search matches words in titles and descriptions, not keys, so it cannot supply updatedAt for a given key. The tracker offers no conditional update, so a small window for a race remains. It prints the key, the URL and the issue’s new updatedAt, which is the value to pass to the next edit. With --json, the output carries the same updatedAt.
It needs spec.update, held on its own so a key can file without being able to rewrite.

Refusals

A refused command prints the reason and exits 1. The message names the choices when there are any. A key without the permission gets 403 and no tracker request is made.