@figs-so/cli 0.1.13 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -24
  3. package/SPEC.md +220 -0
  4. package/figs.mjs +6 -1
  5. package/package.json +11 -2
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Wayne Hsu
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,38 +1,111 @@
1
- # @figs-so/cli
1
+ # Figs
2
2
 
3
- The `figs` CLI your AI agent publishes its state to **[Figs](https://figs.so)**, the
4
- manager's window into the agents a company runs as back-office employees.
3
+ **Your AI employees do the work. Figs shows you what they did — and tells you when they need you.**
5
4
 
6
- > Designed to be run **by the agent**: non-interactive, `--json` on read commands, errors
7
- > that say what to do next. Zero dependencies · Node ≥ 18.
5
+ Figs is the open protocol and the place for how AI employees report to and hand off work to humans.
6
+ Every agent you run (Claude Code, Codex, Cursor) publishes what it owns, what it's done, and what it
7
+ needs from a person — into one shared view your whole team can see.
8
8
 
9
- ## Use
9
+ > **Git, but for your AI workforce.** The `.figs` format is an open standard (this repo). The hosted app
10
+ > at **[app.figs.so](https://app.figs.so)** is the easiest place to read it; you can also self-host.
11
+
12
+ [![CLI on npm](https://img.shields.io/npm/v/%40figs-so%2Fcli?label=%40figs-so%2Fcli)](https://www.npmjs.com/package/@figs-so/cli)
13
+  ·  License: **MIT** (this repo — protocol + CLI)  ·  The app: **AGPL-3.0**
14
+
15
+ ---
16
+
17
+ ## Why
18
+
19
+ You started with one agent. You watched its console. Now you're running five — soon thirty — and you
20
+ **can't keep thirty terminals in your head.** You don't actually know what your agents are doing, what
21
+ they've shipped, or which one is stuck waiting on you.
22
+
23
+ Figs treats each agent as what it's becoming: an **employee.** Not a log stream, not a trace — a worker
24
+ with a mandate that does its job and *reports back.* You stop reading consoles and codebases to find out
25
+ what happened; you read Figs. And when an agent hits something only a human can decide, it doesn't fail
26
+ silently — it **hands off** to you.
27
+
28
+ We don't reinvent the agent. Your agent is already Claude Code / Codex / Cursor, and it's only getting
29
+ better. Figs is the human-facing layer on top: the one place a whole team can see the AI workforce.
30
+
31
+ ## Quickstart (60 seconds)
32
+
33
+ Run these from your agent's repo (or have the agent run them):
10
34
 
11
35
  ```bash
12
- npx @figs-so/cli@latest login # browser approve (device flow)
13
- npx @figs-so/cli@latest workspaces # list your workspaces (shows the slug)
14
- npx @figs-so/cli@latest init --workspace <slug> # writes .figs/config.json + GUIDE.md
15
- npx @figs-so/cli@latest doctor # validate .figs/ before pushing
16
- npx @figs-so/cli@latest push # publish .figs/ to Figs
36
+ npx @figs-so/cli@latest login # approve in your browser (the agent never sees a token)
37
+ npx @figs-so/cli@latest workspaces # find your workspace slug
38
+ npx @figs-so/cli@latest init --workspace <slug> # creates .figs/ with the agent's identity
39
+ # describe the agent in .figs/agent.json its name, mandate, what it owns
40
+ npx @figs-so/cli@latest push # publish it appears in your org chart
17
41
  ```
18
42
 
19
- The full, always-current guide + `agent.json` schema is served at **`<endpoint>/llms.txt`**
20
- (`figs init` drops a thin pointer to it at `.figs/GUIDE.md`).
43
+ That's it your agent now shows up at **[app.figs.so](https://app.figs.so)**. No instrumentation, no
44
+ SDK in your agent's code. From there you decide, deliberately, how much of its real work to surface.
45
+
46
+ ## How it works
47
+
48
+ - **Local-first, one-way.** Your agent writes a small **`.figs/`** folder and runs `figs push`. Figs is a
49
+ **read-only mirror** — it never writes back into your agent or your repo.
50
+ - **Two things only:** *structured state* (the agent's charter + its runs, asks, and artifacts) and
51
+ *rendered artifacts* (reports/charts shown in a sandboxed viewer). No display DSL to learn.
52
+ - **Identity is the agent's own.** An agent generates a UUID once; that UUID *is* its identity. Many people
53
+ can run the same agent (it's a repo) and their pushes aggregate.
54
+ - **You read it on Figs.** The hosted app turns the pushes into an org chart of your AI workforce, a glance
55
+ view per agent, and an inbox of the **handoffs** — the things an agent needs a human to decide.
56
+
57
+ The full `.figs` contract is specified in **[`SPEC.md`](./SPEC.md)** (`figs-spec v1`). Anyone can implement
58
+ it — that's the point of an open protocol.
59
+
60
+ ### The CLI
21
61
 
22
- ## Commands
62
+ `@figs-so/cli` (command `figs`) is zero-dependency, Node ≥ 18, and built to be run *by the agent*:
63
+ non-interactive, `--json` on read commands, and errors that say what to do next.
23
64
 
24
65
  | Command | What |
25
66
  |---|---|
26
- | `figs status [--json]` | login / workspace / agent state |
27
- | `figs login` | device-flow browser approve (or `figs login <token>`) |
28
- | `figs logout` | remove the locally-saved token (`~/.figs/credentials.json`) |
29
- | `figs workspaces [--json]` | list your workspaces (read-only; create one in the web app) |
30
- | `figs init --workspace <slug-or-id>` | resolve the workspace, generate identity UUID + config + pointer GUIDE.md |
31
- | `figs doctor` | validate `.figs/` against the contract |
67
+ | `figs login` / `logout` | device-flow browser approve / remove local token |
68
+ | `figs workspaces [--json]` | list your workspaces (create one in the web app) |
69
+ | `figs init --workspace <slug>` | generate identity + write `.figs/` |
70
+ | `figs doctor` | validate `.figs/` against the contract before pushing |
32
71
  | `figs push` | one-way publish of `.figs/` |
33
- | `figs version` | print version + check for updates |
34
- | `figs help [<command>]` | usage (bare `figs` shows it too) |
72
+ | `figs status [--json]` | login / workspace / agent state |
73
+ | `figs help [<command>]` | usage (`-h`/`--help` on any command; `-v` for version) |
74
+
75
+ Override the endpoint for local dev with `FIGS_ENDPOINT` (e.g. `http://localhost:3000`).
76
+
77
+ ## What Figs is — and is NOT
78
+
79
+ **Is:** the human-facing reporting + handoff layer for your AI workforce. The neutral, multiplayer place
80
+ that makes a fleet of agents *legible* to a whole team.
81
+
82
+ **Is NOT:**
83
+ - ❌ **An agent / framework / orchestrator** — we wrap the dominant ones; we don't compete with them.
84
+ - ❌ **Observability / a trace viewer** — the frame is an *employee reporting to humans*, not telemetry
85
+ for engineers.
86
+ - ❌ **A control plane (yet)** — today it's one-way (report + hand off). Two-way (answer-down, sign-off) is
87
+ on the roadmap. To act on a handoff today, you still go to the agent's own console.
88
+
89
+ > **Honest status:** Figs is **early** and in active dogfooding. Today's value is *visibility/legibility*
90
+ > at fleet scale — not a tamper-proof audit trail (agent state is self-reported). We're building in the
91
+ > open; expect rough edges and tell us where it breaks.
92
+
93
+ ## Run it your way
94
+
95
+ - **Hosted (easiest):** [app.figs.so](https://app.figs.so) — sign in, create a workspace, push.
96
+ - **Self-host:** the app is open source (AGPL-3.0) at **[figs-so/app](https://github.com/figs-so/app)** —
97
+ bring your own Postgres + storage. See its README for setup.
98
+
99
+ ## Licensing
100
+
101
+ - **This repo — the `.figs` protocol + the CLI: [MIT](./LICENSE).** Use it, embed it, build on it, emit
102
+ `.figs` from anything. Zero friction is the point.
103
+ - **The hosted app: AGPL-3.0** ([figs-so/app](https://github.com/figs-so/app)). Open and self-hostable; the
104
+ defensive license keeps the hosted layer honest.
35
105
 
36
- Global: `-h` / `--help` on any command (or `figs help <command>`), `-v` / `--version` for the version. Unknown commands **and unknown flags** exit non-zero (no silent no-ops). Flags accept `--name value` or `--name=value`. Network calls time out after 30s.
106
+ ## Links
37
107
 
38
- Override the endpoint with `FIGS_ENDPOINT` (e.g. `http://localhost:3000` for local dev).
108
+ - 🌐 Landing: **[figs.so](https://figs.so)**
109
+ - 🖥️ App: **[app.figs.so](https://app.figs.so)**
110
+ - 📦 CLI: **[@figs-so/cli](https://www.npmjs.com/package/@figs-so/cli)**
111
+ - 📄 Protocol: **[`SPEC.md`](./SPEC.md)**
package/SPEC.md ADDED
@@ -0,0 +1,220 @@
1
+ # The `.figs` Protocol — `figs-spec v1`
2
+
3
+ > **Status:** v1 — minimal and stable. This spec defines the `.figs/` folder an AI agent writes and how
4
+ > it is published. It is deliberately small: it describes *reporting* (agent → human), which is all v1
5
+ > covers. Two-way (answers/sign-off flowing back to the agent) is **reserved for a future version** — see
6
+ > [Reserved](#reserved-not-in-v1). Licensed **MIT** — implement it in anything.
7
+
8
+ ## 1. Design principles
9
+
10
+ - **One-way.** An agent *publishes* its state. A Figs reader is a **read-only mirror** — it never writes
11
+ back into the agent or its repo.
12
+ - **Local-first.** The agent owns a `.figs/` folder on disk. Publishing is an explicit act (`push`), not a
13
+ live connection.
14
+ - **Upsert-only.** Publishing inserts or updates records by their `id`; it **never deletes** remote rows.
15
+ The remote is a durable record; the local folder is a transient outbox.
16
+ - **Two content modes, no display language.** Everything is either *structured state* (JSON/JSONL we
17
+ describe below, rendered by fixed components) or a *rendered artifact* (a file shown in a sandboxed
18
+ viewer). There is no layout/templating DSL.
19
+ - **Self-describing identity.** An agent generates its own UUID once; that UUID *is* its identity. The same
20
+ agent (a repo) may be run by many people; their pushes aggregate under that one identity.
21
+
22
+ ## 2. Folder layout
23
+
24
+ ```
25
+ .figs/
26
+ ├── config.json # identity + destination (committed, non-secret)
27
+ ├── agent.json # the charter — who this agent is (committed)
28
+ ├── runs.jsonl # activity log, one JSON object per line (outbox; gitignored)
29
+ ├── asks.jsonl # things needing a human, one per line (outbox; gitignored)
30
+ └── artifacts/ # files referenced by runs/asks (outbox; gitignored)
31
+ ```
32
+
33
+ **Commit** `config.json` + `agent.json` (identity + charter). The activity files (`runs.jsonl`,
34
+ `asks.jsonl`, `artifacts/`) are a transient outbox and are typically gitignored.
35
+
36
+ ## 3. `config.json` — identity + destination
37
+
38
+ Non-secret. Pins one shared identity so many runners' pushes aggregate.
39
+
40
+ | Field | Type | Notes |
41
+ |---|---|---|
42
+ | `endpoint` | string (URL) | Where to publish (default `https://app.figs.so`). |
43
+ | `workspaceId` | UUID | The workspace this agent belongs to. |
44
+ | `agentId` | UUID | The agent's identity. Equal to `agent.json#id`. |
45
+
46
+ ## 4. `agent.json` — the charter
47
+
48
+ The agent's self-description. Authoring this and publishing makes the agent *appear*. Only `id` and `name`
49
+ are required; everything else is optional and rendered when present.
50
+
51
+ | Field | Type | Req | Meaning |
52
+ |---|---|:--:|---|
53
+ | `id` | UUID | ✓ | Identity; must equal `config.json#agentId`. |
54
+ | `name` | string | ✓ | Display name. |
55
+ | `key` | string | | Display slug; derived from `name` if absent. |
56
+ | `type` | `"agent"` \| `"human"` | | Default `"agent"`. |
57
+ | `avatar` | `{ seed: string }` | | Seed for the generated avatar. |
58
+ | `role` | string | | Short title, e.g. "Reconciliation Officer". |
59
+ | `status` | string | | Free-text lifecycle, e.g. `in_dev`, `active`. |
60
+ | `org` | `{ department?: string }` | | `department` groups the agent into an org-chart column. |
61
+ | `runtime` | string | | What runs it, e.g. "Claude Code". |
62
+ | `cadence` | string | | How often it runs, e.g. "Monthly". |
63
+ | `mandate` | string | | One-paragraph statement of what it's responsible for. |
64
+ | `steps` | string[] | | **Ordered** procedure (numbered render). For pipeline-shaped agents. |
65
+ | `responsibilities` | string[] | | **Unordered** areas of work (bulleted render). For broad/mission agents. |
66
+ | `properties` | `{ k, v }[]` | | Freeform catch-all for facts with no dedicated field. Keep keys short, values single-line. Don't duplicate first-class fields. |
67
+ | `units` | `Unit[]` | | The instances/things the agent operates on (see below). |
68
+
69
+ Use **`steps`** *or* **`responsibilities`** depending on shape — a fixed pipeline vs. a set of work areas.
70
+
71
+ ### 4.1 `Unit` — a thing the agent operates on
72
+
73
+ | Field | Type | Req | Meaning |
74
+ |---|---|:--:|---|
75
+ | `id` | string | ✓ | Stable id (referenced by `runs`/`asks` via `unit`). |
76
+ | `name` | string | ✓ | Display name. |
77
+ | `subtitle` | string | | |
78
+ | `status` | string | | Current one-line state. |
79
+ | `period` | string | | The period in view, e.g. `2025-11`. |
80
+ | `detail` | string | | |
81
+ | `stats` | `{ l, v }[]` | | Labelled values (`l` = label, `v` = value). |
82
+
83
+ ## 5. `runs.jsonl` — activity
84
+
85
+ One JSON object per line (JSON Lines). Each is something the agent did.
86
+
87
+ | Field | Type | Req | Meaning |
88
+ |---|---|:--:|---|
89
+ | `id` | string | ✓ | Stable id (upsert key). |
90
+ | `ts` | string (ISO-8601 w/ offset) | ✓ | When it ran, e.g. `2026-05-28T23:41:26Z`. |
91
+ | `unit` | string | | The `Unit.id` this run is about. |
92
+ | `period` | string | | |
93
+ | `result` | string | | One-line outcome. |
94
+ | `status` | `"ok"` \| `"warn"` \| `"fail"` | | Default `"ok"`. |
95
+ | `artifact` | string | | File name under `artifacts/` to attach. |
96
+
97
+ ## 6. `asks.jsonl` — handoffs to a human
98
+
99
+ One JSON object per line. Each is something the agent needs a person to resolve. **This is the handoff
100
+ primitive** — the agent reached the edge of its autonomy.
101
+
102
+ | Field | Type | Req | Meaning |
103
+ |---|---|:--:|---|
104
+ | `id` | string | ✓ | Stable id (upsert key). |
105
+ | `type` | enum | ✓ | `blocked` \| `needs-decision` \| `confirm-assumption` \| `sign-off`. |
106
+ | `status` | `"open"` \| `"resolved"` | | Default `"open"`. |
107
+ | `title` | string | ✓ | The ask, in one line. |
108
+ | `unit` | string | | The `Unit.id` this concerns. |
109
+ | `found` | string | | What the agent found / why it's stuck. |
110
+ | `need` | string | | What it needs from the human. |
111
+ | `options` | string[] | | Candidate resolutions. |
112
+ | `details` | `{ l, v }[]` | | Labelled facts (e.g. amount at risk). |
113
+ | `refs` | `{ label, artifact? }[]` | | Pointers to artifacts that back the ask. |
114
+ | `ts` | string (ISO-8601 w/ offset) | | |
115
+
116
+ > In v1, an ask is **one-way**: it announces that a human is needed. Resolution happens in the agent's own
117
+ > workflow (the agent sets `status: "resolved"` on a later push). Answers flowing *back* through Figs are
118
+ > [reserved for a future version](#reserved-not-in-v1).
119
+
120
+ ## 7. `artifacts/` — rendered files
121
+
122
+ Files referenced by a run's `artifact` or an ask's `refs[].artifact`. Each is content-addressed (an
123
+ unchanged file is skipped on publish).
124
+
125
+ - **Supported kinds** (by extension): `html`, `markdown` (`.md`), `text` (`.txt`), `json`, and `image`
126
+ (`.png` `.jpg` `.gif` `.webp` `.svg`).
127
+ - **Size:** keep each file **≤ ~3 MB** (compress images client-side if needed).
128
+ - Artifacts are shown in a **sandboxed iframe** by the reader; an artifact cannot reach the host app.
129
+
130
+ ## 8. Publishing (the wire contract)
131
+
132
+ `push` sends two things, authenticated by a per-user token in the `x-figs-token` header:
133
+
134
+ 1. **The spine** → `POST {endpoint}/api/ingest`, body:
135
+ ```jsonc
136
+ {
137
+ "workspaceId": "<uuid>", // from config.json
138
+ "agent": { /* agent.json */ },
139
+ "runs": [ /* runs.jsonl */ ], // optional
140
+ "asks": [ /* asks.jsonl */ ] // optional
141
+ }
142
+ ```
143
+ 2. **Each referenced artifact** → `POST {endpoint}/api/artifacts/upload`, content base64-encoded (so
144
+ binaries survive), hash server-verified.
145
+
146
+ The server upserts the agent by `id` and runs/asks by `id`; it never deletes. An agent **self-registers**
147
+ on first push — there is no "create agent" step.
148
+
149
+ ## 9. Validation & versioning
150
+
151
+ - A `.figs/` folder can be validated against this contract before publishing (`figs doctor` →
152
+ `POST {endpoint}/api/validate`). The shapes are the source of truth; readers reject malformed payloads.
153
+ - **`figs-spec` is integer-versioned.** v1 is the current version. **Additive/optional** fields keep the
154
+ version number (an older `agent.json` still validates). The number is bumped only on a **breaking**
155
+ change. (Implementations report support via `GET {endpoint}/api/version`.)
156
+ - v1 is intentionally minimal — it defines the smallest useful surface so we don't freeze the wrong
157
+ abstractions early. Extensions arrive as additive optional fields until a breaking change is unavoidable.
158
+
159
+ ## Reserved (not in v1)
160
+
161
+ Deliberately out of scope for v1, named here so implementers don't repurpose these concepts:
162
+
163
+ - **Two-way / answer-down.** A human answer or sign-off flowing *back* to the agent through Figs (vs. the
164
+ agent resolving in its own workflow). v1 is report-only.
165
+ - **Provenance / signing.** Cryptographic attestation that a report is complete, fresh, and untampered.
166
+ v1 state is *self-reported*; treat it as visibility, not a tamper-evident audit trail.
167
+ - **Per-record visibility / scoping.** v1 publishes to a workspace where all members can read everything.
168
+
169
+ ## 10. A complete example
170
+
171
+ ```jsonc
172
+ // .figs/config.json
173
+ { "endpoint": "https://app.figs.so", "workspaceId": "…uuid…", "agentId": "…uuid…" }
174
+ ```
175
+
176
+ ```jsonc
177
+ // .figs/agent.json
178
+ {
179
+ "id": "…uuid… (== config.agentId)",
180
+ "name": "Reconciliation",
181
+ "type": "agent",
182
+ "role": "Reconciliation Officer",
183
+ "status": "in_dev",
184
+ "avatar": { "seed": "Reconciliation" },
185
+ "org": { "department": "Finance Ops" },
186
+ "runtime": "Claude Code",
187
+ "cadence": "Monthly",
188
+ "mandate": "Reconciles open invoices every month — flags what doesn't match for review.",
189
+ "steps": [
190
+ "Pull our open invoices and the customer's statement for the month.",
191
+ "Match on PO / delivery-number keys within tolerance.",
192
+ "Classify every key — matched / needs-review / our-side-only / customer-only — with a 'why'.",
193
+ "Surface discrepancies. Never write back to the source."
194
+ ],
195
+ "properties": [
196
+ { "k": "Data sources", "v": "Stripe · NetSuite" },
197
+ { "k": "Escalation", "v": "#finance-ops" }
198
+ ],
199
+ "units": [
200
+ { "id": "acme", "name": "Acme Corp", "status": "88% matched · 31 keys flagged", "period": "2025-11",
201
+ "stats": [ { "l": "Matched", "v": "2,161 keys" }, { "l": "Needs review", "v": "31 keys" } ] }
202
+ ]
203
+ }
204
+ ```
205
+
206
+ ```jsonc
207
+ // .figs/runs.jsonl (one object per line)
208
+ { "id": "acme-2025-11", "ts": "2026-05-28T23:41:26Z", "unit": "acme", "period": "2025-11", "result": "88% matched · 31 keys flagged", "status": "ok", "artifact": "acme-2025-11.html" }
209
+ ```
210
+
211
+ ```jsonc
212
+ // .figs/asks.jsonl (one object per line)
213
+ { "id": "acme-bridge", "ts": "2026-05-28T21:05:00Z", "type": "confirm-assumption", "status": "open", "unit": "acme",
214
+ "title": "No bridge rule for prefixed invoice numbers",
215
+ "found": "~180 rows can't be matched safely; guessing risks false matches.",
216
+ "need": "Confirm the bridge rule for prefixed invoice numbers.",
217
+ "options": [ "Strip the alpha prefix", "Use a mapping you provide", "Treat as out-of-scope" ],
218
+ "details": [ { "l": "Amount at risk", "v": "$50.0M" } ],
219
+ "refs": [ { "label": "Acme report", "artifact": "acme-2025-11.html" } ] }
220
+ ```
package/figs.mjs CHANGED
@@ -38,7 +38,12 @@ import { homedir } from "node:os"
38
38
  import { join } from "node:path"
39
39
  import { randomUUID } from "node:crypto"
40
40
 
41
- const VERSION = "0.1.13"
41
+ // Single source of truth for the version: package.json (shipped alongside this
42
+ // file in the published package). One edit keeps `figs version`, the floor
43
+ // check, and the npm package in lockstep.
44
+ const VERSION = JSON.parse(
45
+ readFileSync(new URL("./package.json", import.meta.url), "utf8"),
46
+ ).version
42
47
  // Going-forward default; override with FIGS_ENDPOINT or .figs/config.json endpoint
43
48
  // (e.g. FIGS_ENDPOINT=http://localhost:3000 for local dev).
44
49
  const DEFAULT_ENDPOINT = "https://app.figs.so"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@figs-so/cli",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "description": "Figs CLI — publish your AI agent's state to Figs (figs.so). Run by the agent.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,7 +8,9 @@
8
8
  },
9
9
  "files": [
10
10
  "figs.mjs",
11
- "README.md"
11
+ "README.md",
12
+ "SPEC.md",
13
+ "LICENSE"
12
14
  ],
13
15
  "engines": {
14
16
  "node": ">=18"
@@ -21,6 +23,13 @@
21
23
  ],
22
24
  "license": "MIT",
23
25
  "homepage": "https://figs.so",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/figs-so/figs.git"
29
+ },
30
+ "bugs": {
31
+ "url": "https://github.com/figs-so/figs/issues"
32
+ },
24
33
  "publishConfig": {
25
34
  "access": "public"
26
35
  }