@assemblyline-agents/figma 2.0.0 → 3.0.0

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.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 OpenEve contributors
3
+ Copyright (c) 2026 Assembly Line contributors
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Official Assembly Line Figma connection plugin.
4
4
 
5
- It connects agents to Figma, exposing design-file tools through Figma's MCP server. The package exports `defineFigmaConnection(options)` to declare the connection in an agent definition and an `assemblyLinePlugin` module so the Assembly Line CLI and compiler can discover the plugin's connection metadata. A bundled skill under `skills/` teaches agents how to use the connection's tools.
5
+ It connects agents to Figma, exposing design-file tools through Figma's MCP server. The package exports `defineFigmaConnection(options)` to declare the connection in an agent definition and an `assemblyLinePlugin` module so the Assembly Line CLI and compiler can discover the plugin's connection metadata.
6
6
 
7
7
  ## Install
8
8
 
@@ -0,0 +1,3 @@
1
+ import { type ConnectionPluginEventAdapter } from "@assemblyline-agents/core";
2
+ export declare const figmaEvents: ConnectionPluginEventAdapter;
3
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,4BAA4B,EAGlC,MAAM,2BAA2B,CAAC;AAYnC,eAAO,MAAM,WAAW,EAAE,4BAyGzB,CAAC"}
package/dist/events.js ADDED
@@ -0,0 +1,157 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { ConnectionEventError, parseConnectionEventJson, providerJson, stringField } from "@assemblyline-agents/core";
3
+ const API = "https://api.figma.com/v2/webhooks";
4
+ export const figmaEvents = {
5
+ prepare(context) {
6
+ const key = desiredKey(context.callbackUrl, context.selectedEvents, context.resources);
7
+ if (stringField(context.state ?? {}, "desiredKey") === key)
8
+ return context.state;
9
+ const previous = registrations(context.state, "registrations");
10
+ const registrationsToCreate = [];
11
+ for (const resource of context.resources) {
12
+ const scope = figmaScope(resource);
13
+ for (const event of context.selectedEvents) {
14
+ registrationsToCreate.push({ ...scope, event, passcode: randomBytes(32).toString("base64url") });
15
+ }
16
+ }
17
+ return {
18
+ desiredKey: key,
19
+ callbackUrl: context.callbackUrl,
20
+ registrations: registrationsToCreate,
21
+ previous: previous
22
+ };
23
+ },
24
+ async reconcile(context) {
25
+ const token = (await context.getToken()).token;
26
+ const registrationsToCreate = registrations(context.state, "registrations");
27
+ if (!registrationsToCreate.length) {
28
+ return {
29
+ status: "needs_setup",
30
+ ...(context.state ? { state: context.state } : {}),
31
+ instructions: "Add at least one Figma event resource: { context: 'team' | 'project' | 'file', contextId: '...' }."
32
+ };
33
+ }
34
+ const existing = registrationsToCreate.filter((registration) => registration.webhookId);
35
+ if (existing.length === registrationsToCreate.length && registrations(context.state, "previous").length === 0) {
36
+ return { status: "active", ...(context.state ? { state: context.state } : {}), detail: `${existing.length} Figma webhook${existing.length === 1 ? " is" : "s are"} active.` };
37
+ }
38
+ for (const prior of registrations(context.state, "previous")) {
39
+ if (!prior.webhookId)
40
+ continue;
41
+ await providerJson(context.fetch, `${API}/${encodeURIComponent(prior.webhookId)}`, {
42
+ method: "DELETE",
43
+ headers: auth(token)
44
+ }, [200, 204, 404]);
45
+ }
46
+ const active = [];
47
+ for (const registration of registrationsToCreate) {
48
+ const created = await providerJson(context.fetch, API, {
49
+ method: "POST",
50
+ headers: auth(token),
51
+ body: JSON.stringify({
52
+ event_type: registration.event,
53
+ context: registration.context,
54
+ context_id: registration.contextId,
55
+ endpoint: context.callbackUrl,
56
+ passcode: registration.passcode,
57
+ description: `Assembly Line ${context.connectionName}`
58
+ })
59
+ });
60
+ active.push({ ...registration, webhookId: identifier(created, "id") });
61
+ }
62
+ return {
63
+ status: "active",
64
+ externalId: active.map((registration) => registration.webhookId).join(","),
65
+ state: {
66
+ desiredKey: stringField(context.state ?? {}, "desiredKey") ?? "",
67
+ callbackUrl: context.callbackUrl,
68
+ registrations: active,
69
+ previous: []
70
+ },
71
+ detail: `${active.length} Figma webhook${active.length === 1 ? " is" : "s are"} active.`
72
+ };
73
+ },
74
+ async remove(context) {
75
+ const token = (await context.getToken()).token;
76
+ for (const registration of registrations(context.state, "registrations")) {
77
+ if (!registration.webhookId)
78
+ continue;
79
+ await providerJson(context.fetch, `${API}/${encodeURIComponent(registration.webhookId)}`, {
80
+ method: "DELETE",
81
+ headers: auth(token)
82
+ }, [200, 204, 404]);
83
+ }
84
+ },
85
+ async check(context) {
86
+ const active = registrations(context.state, "registrations").filter((registration) => registration.webhookId);
87
+ if (!active.length)
88
+ return { status: "needs_setup", detail: "No Figma webhooks are configured." };
89
+ const token = (await context.getToken()).token;
90
+ for (const registration of active) {
91
+ const value = await providerJson(context.fetch, `${API}/${encodeURIComponent(registration.webhookId)}`, { headers: auth(token) }, [200, 404]);
92
+ if (!value.id)
93
+ return { status: "degraded", detail: `Figma webhook ${registration.webhookId} no longer exists.` };
94
+ if (value.status && value.status !== "ACTIVE")
95
+ return { status: "degraded", detail: `Figma webhook ${registration.webhookId} is ${String(value.status)}.` };
96
+ }
97
+ return { status: "active", detail: `${active.length} Figma webhook${active.length === 1 ? " is" : "s are"} active.` };
98
+ },
99
+ ingress(request, context) {
100
+ const payload = parseConnectionEventJson(request.body);
101
+ const passcode = stringField(payload, "passcode");
102
+ const registration = registrations(context.state, "registrations").find((candidate) => candidate.passcode === passcode);
103
+ if (!registration)
104
+ throw new ConnectionEventError("Figma webhook passcode is invalid.", 401);
105
+ const event = stringField(payload, "event_type");
106
+ if (!event)
107
+ throw new ConnectionEventError("Figma webhook omitted event_type.");
108
+ if (event === "PING")
109
+ return { events: [], response: { status: 200, body: { ok: true } }, audit: { event } };
110
+ const timestamp = stringField(payload, "timestamp");
111
+ const eventId = [identifier(payload, "webhook_id"), event, stringField(payload, "file_key") ?? "", timestamp ?? ""].join(":");
112
+ return {
113
+ events: [{ event, eventId, payload: payload, ...(timestamp ? { occurredAt: timestamp } : {}) }],
114
+ response: { status: 200, body: { ok: true } },
115
+ audit: { event }
116
+ };
117
+ }
118
+ };
119
+ function auth(token) {
120
+ return { authorization: `Bearer ${token}`, "content-type": "application/json" };
121
+ }
122
+ function figmaScope(resource) {
123
+ const context = stringField(resource, "context");
124
+ const contextId = stringField(resource, "contextId", "context_id");
125
+ if (!context || !["team", "project", "file"].includes(context) || !contextId) {
126
+ throw new Error("Figma event resources require context team, project, or file and contextId.");
127
+ }
128
+ return { context, contextId };
129
+ }
130
+ function registrations(state, key) {
131
+ const value = state?.[key];
132
+ if (!Array.isArray(value))
133
+ return [];
134
+ return value.flatMap((item) => {
135
+ if (!item || typeof item !== "object" || Array.isArray(item))
136
+ return [];
137
+ const record = item;
138
+ const event = stringField(record, "event");
139
+ const context = stringField(record, "context");
140
+ const contextId = stringField(record, "contextId");
141
+ const passcode = stringField(record, "passcode");
142
+ if (!event || !context || !contextId || !passcode)
143
+ return [];
144
+ const webhookId = stringField(record, "webhookId");
145
+ return [{ event, context, contextId, passcode, ...(webhookId ? { webhookId } : {}) }];
146
+ });
147
+ }
148
+ function desiredKey(callbackUrl, events, resources) {
149
+ return JSON.stringify([callbackUrl, [...events].sort(), resources]);
150
+ }
151
+ function identifier(value, key) {
152
+ const id = value[key];
153
+ if (typeof id === "string" || typeof id === "number")
154
+ return String(id);
155
+ throw new Error(`Figma webhook payload omitted ${key}.`);
156
+ }
157
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqE,KAAK,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAE/I,MAAM,MAAM,sBAAsB,GAAG,0BAA0B,CAAC;AAChE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,yEAAwD;AAC7H,eAAO,MAAM,kBAAkB,kDAA0C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmG,KAAK,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAG7K,MAAM,MAAM,sBAAsB,GAAG,0BAA0B,CAAC;AAChE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,yEAKpE;AACD,eAAO,MAAM,kBAAkB,kDAA0C,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,12 @@
1
- import { connectionPluginMetadata, defineMcpPluginConnection, definePlugin } from "@assemblyline-agents/core";
1
+ import { connectionPluginMetadata, defineConnectionPluginEvents, defineMcpPluginConnection, definePlugin } from "@assemblyline-agents/core";
2
+ import { figmaEvents } from "./events.js";
2
3
  const PLUGIN = connectionPluginMetadata("figma");
3
- export function defineFigmaConnection(options) { return defineMcpPluginConnection(PLUGIN, options); }
4
+ export function defineFigmaConnection(options) {
5
+ const definition = defineMcpPluginConnection(PLUGIN, options);
6
+ const events = defineConnectionPluginEvents(PLUGIN, options.events, figmaEvents);
7
+ if (events)
8
+ definition.events = events;
9
+ return definition;
10
+ }
4
11
  export const assemblyLinePlugin = definePlugin({ connections: [PLUGIN] });
5
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,YAAY,EAAmC,MAAM,2BAA2B,CAAC;AAC/I,MAAM,MAAM,GAAG,wBAAwB,CAAC,OAAO,CAAE,CAAC;AAElD,MAAM,UAAU,qBAAqB,CAAC,OAA+B,IAAI,OAAO,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAC7H,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,YAAY,EAAmC,MAAM,2BAA2B,CAAC;AAC7K,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,MAAM,MAAM,GAAG,wBAAwB,CAAC,OAAO,CAAE,CAAC;AAElD,MAAM,UAAU,qBAAqB,CAAC,OAA+B;IACnE,MAAM,UAAU,GAAG,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACjF,IAAI,MAAM;QAAE,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;IACvC,OAAO,UAAU,CAAC;AACpB,CAAC;AACD,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assemblyline-agents/figma",
3
- "version": "2.0.0",
3
+ "version": "3.0.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -9,12 +9,11 @@
9
9
  }
10
10
  },
11
11
  "dependencies": {
12
- "@assemblyline-agents/core": "2.0.0"
12
+ "@assemblyline-agents/core": "3.0.0"
13
13
  },
14
14
  "description": "Official Assembly Line Figma connection plugin.",
15
15
  "files": [
16
- "dist",
17
- "skills"
16
+ "dist"
18
17
  ],
19
18
  "engines": {
20
19
  "node": ">=22.19.0"
@@ -1,8 +0,0 @@
1
- ---
2
- name: figma
3
- description: Use configured Figma tools for design context, files, variables, components, and Dev Mode.
4
- ---
5
- # Figma
6
- Resolve the exact Figma URL, file, page, or node before fetching design context. Preserve component and variable names in implementation guidance.
7
-
8
- The deployment owner configures Figma client allowlisting and OAuth. The scaffold is read-only; creating or modifying Figma, FigJam, or Slides content requires writes to be enabled with the configured approval gate.