@tendrilapp/cli 0.1.24 → 0.1.26
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/dist/SKILL.md +56 -8
- package/dist/tendril-mcp.js +1 -1
- package/dist/tendril.js +736 -149
- package/package.json +1 -1
package/dist/SKILL.md
CHANGED
|
@@ -69,13 +69,29 @@ fidelity gap" was a missing font weight one check away; a stop rule is
|
|
|
69
69
|
for avoiding thrash, never for converting an unverified hypothesis into
|
|
70
70
|
a final answer.
|
|
71
71
|
|
|
72
|
+
Concurrency, whether that is several components in one session or one
|
|
73
|
+
large set:
|
|
74
|
+
- Every agent in flight spends ONE shared Figma budget, and Figma
|
|
75
|
+
meters per minute as well as per day, so parallelism sets the burst
|
|
76
|
+
rate. Scale recorders to the total pose count: up to ~30 poses,
|
|
77
|
+
four; ~30–100 poses, two; beyond ~100 poses, record serially and
|
|
78
|
+
pace it — a large set has no slack to burn on a per-minute limit.
|
|
79
|
+
A measured 8-wide batch hit its rate limit (per-piece resume
|
|
80
|
+
recovered, but the stall is avoidable).
|
|
81
|
+
- COUNT EVERY AGENT THAT CALLS FIGMA, not every agent you launched:
|
|
82
|
+
a recorder NEVER spawns its own recorders. It records the queue it
|
|
83
|
+
was handed and stops. A measured 4-wide run peaked at double the
|
|
84
|
+
intended rate because two recorders spawned children that kept
|
|
85
|
+
calling after their parents reported done — the parent's "done" is
|
|
86
|
+
not proof its calls have stopped. To split a large queue further,
|
|
87
|
+
hand out the extra slices yourself so the whole count stays in one
|
|
88
|
+
place.
|
|
89
|
+
|
|
72
90
|
Batch runs (several components in one session):
|
|
73
|
-
- Cap concurrent recorders at FOUR. All recorders share one Figma
|
|
74
|
-
desktop MCP server; a measured 8-wide batch hit its rate limit
|
|
75
|
-
(per-piece resume recovered, but the stall is avoidable).
|
|
76
91
|
- Batch the questions: plan ALL sets first, then put every
|
|
77
|
-
defaults-to-confirm
|
|
78
|
-
— never one dialog per
|
|
92
|
+
defaults-to-confirm, every missing-interaction-state disclosure and
|
|
93
|
+
the one model question to the user together — never one dialog per
|
|
94
|
+
component, and never mid-generation.
|
|
79
95
|
- Create candidate directories with a bare `mkdir -p <dir>` — no
|
|
80
96
|
`&&`-compounds. Compound variants each need their own permission
|
|
81
97
|
approval; the bare form is one grant for the whole batch.
|
|
@@ -110,8 +126,38 @@ Batch runs (several components in one session):
|
|
|
110
126
|
which X should it show?" — the heuristic's pick is Recommended;
|
|
111
127
|
a different answer re-plans via `defaults` (free until the first
|
|
112
128
|
envelope is ingested, frozen after).
|
|
113
|
-
|
|
114
|
-
|
|
129
|
+
- `interactionStatesToConfirm`: the component set has no hover,
|
|
130
|
+
focus or pressed variant, so nothing recorded shows how it looks
|
|
131
|
+
while someone is using it — and what is never recorded is never
|
|
132
|
+
checked. Say its `statement` and `designFix` as written. This one
|
|
133
|
+
is a DISCLOSURE, not a question: no answer is needed, nothing is
|
|
134
|
+
blocked, and the fix (if the user wants one) is a new variant in
|
|
135
|
+
Figma, not a change in the code. Say only what
|
|
136
|
+
`recordedVariants` contains — never guess from the component's
|
|
137
|
+
name what kind of control it is.
|
|
138
|
+
FEASIBILITY, before the first recording call: the plan output
|
|
139
|
+
states the call arithmetic for this queue (poses × calls per pose).
|
|
140
|
+
Turn it into a verdict with one free check — IF your Figma server
|
|
141
|
+
exposes a `whoami` tool, call it: it names the seat and plan and is
|
|
142
|
+
exempt from Figma's tool-call limits. Then divide the queue's call
|
|
143
|
+
count by the daily allowance that seat carries. Never quote an
|
|
144
|
+
allowance from memory; use the one whoami reports. Not every
|
|
145
|
+
transport has it — the remote Figma MCP server does, the local Dev
|
|
146
|
+
Mode server does not — so if yours does not, say the allowance is
|
|
147
|
+
UNKNOWN and show the plan's own hint as the unverified figure it is
|
|
148
|
+
marked as, rather than presenting a guess as a checked number. If the set fits inside one
|
|
149
|
+
day, record and say nothing about cost — a set that comfortably
|
|
150
|
+
fits is not worth the user's attention. If it does NOT fit, stop
|
|
151
|
+
and tell the user in plain numbers before recording anything:
|
|
152
|
+
"336 poses × 3 = 1,008 Figma calls. Your Full seat on Professional
|
|
153
|
+
allows 200/day, so this set needs about 5 days." Then let them
|
|
154
|
+
choose: (a) pace it across days — a rate limit loses no recorded
|
|
155
|
+
work, the set persists after every pose and re-running the same
|
|
156
|
+
command resumes; (b) record fewer poses — theirs to decide alone,
|
|
157
|
+
because it buys calls with coverage and there is no tool for it:
|
|
158
|
+
they re-plan with `--sample` in their own terminal; (c) a seat or
|
|
159
|
+
plan with a larger daily allowance. Never sample on their behalf,
|
|
160
|
+
and never start a set you have computed cannot finish.
|
|
115
161
|
Later, `tendril_engine_brief` may carry `fontProvisioning` (the
|
|
116
162
|
design uses a family the local kit lacks). First run
|
|
117
163
|
`tendril fonts resolve --set <recording-dir>` yourself — it fetches
|
|
@@ -146,7 +192,9 @@ Batch runs (several components in one session):
|
|
|
146
192
|
from it. SPEED: after `plan` the whole queue is known and reps are
|
|
147
193
|
independent — fan out across parallel subagents in any order (use
|
|
148
194
|
the cheap `tendril-recorder` agent; recording is transcription,
|
|
149
|
-
not reasoning)
|
|
195
|
+
not reasoning), with HOW MANY set by the concurrency rule above:
|
|
196
|
+
it scales down as poses go up, and no recorder spawns recorders.
|
|
197
|
+
HOST-POLICY GATE (measured, run 6): many hosts
|
|
150
198
|
forbid spawning subagents unless the user requested it, and the
|
|
151
199
|
cost of not delegating is invisible until paid (12 hand-recorded
|
|
152
200
|
reps ≈ 45k main-context tokens that cheap recorders absorb at ~11k
|
package/dist/tendril-mcp.js
CHANGED
|
@@ -25,7 +25,7 @@ var optStr = (d) => z.string().optional().describe(d);
|
|
|
25
25
|
var TOOLS = [
|
|
26
26
|
{
|
|
27
27
|
name: "tendril_record_plan",
|
|
28
|
-
description: "ENTRY POINT for implementing/building a React component from a Figma design or figma.com URL \u2014 start the Tendril pipeline here (after loading the tendril skill, if installed). Plans a recording session: computes the rep queue (anchor + one-factor + conflict crosses) from the verbatim get_metadata response (pass its blocks via metadataParts \u2014 no file to write) and persists the set manifest. Resumes if the set already exists. The output may carry USER QUESTIONS \u2014 defaultsToConfirm (which pose is the component's default) or a multiple-component-sets error (which set to record): render them to a present user and apply the answers via `defaults` / `componentSet`; non-interactive runs follow each question's stated fallback.
|
|
28
|
+
description: "ENTRY POINT for implementing/building a React component from a Figma design or figma.com URL \u2014 start the Tendril pipeline here (after loading the tendril skill, if installed). Plans a recording session: computes the rep queue (anchor + one-factor + conflict crosses) from the verbatim get_metadata response (pass its blocks via metadataParts \u2014 no file to write) and persists the set manifest. Resumes if the set already exists. The output may carry USER QUESTIONS \u2014 defaultsToConfirm (which pose is the component's default) or a multiple-component-sets error (which set to record): render them to a present user and apply the answers via `defaults` / `componentSet`; non-interactive runs follow each question's stated fallback. It may also carry `interactionStatesToConfirm` \u2014 the recording holds no hover/focus/pressed state, so nothing shows how the component behaves when someone uses it: say its `statement` and `designFix` in that SAME one message (the fix is a Figma variant, not code). It is a disclosure, not a gate \u2014 no answer is required and recording proceeds regardless. The output also carries `feasibilityCheck`: the call arithmetic for this queue plus the free `whoami` check that turns it into a verdict \u2014 complete that handshake BEFORE the first recording call, and surface the verdict to the user when the set does not fit their daily allowance.",
|
|
29
29
|
schema: z.object({
|
|
30
30
|
setDir: str("recording set directory to create/resume"),
|
|
31
31
|
component: str("component/system name"),
|