@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 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 and the one model question to the user together
78
- — never one dialog per component.
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
- Recording cost is stated in figmaCallEstimate, never asked about —
114
- proceed with what the user provided.
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). HOST-POLICY GATE (measured, run 6): many hosts
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
@@ -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. Recording cost is stated in figmaCallEstimate, never asked about \u2014 proceed with what the user provided.",
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"),