@tendrilapp/cli 0.1.13 → 0.1.15
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 +39 -14
- package/dist/tendril-mcp.js +10 -6
- package/dist/tendril.js +605 -238
- package/package.json +1 -1
package/dist/SKILL.md
CHANGED
|
@@ -55,10 +55,12 @@ Non-negotiables (the CLI enforces these; do not fight them):
|
|
|
55
55
|
Figma MCP calls in protocol order — get_metadata, then
|
|
56
56
|
get_design_context (excludeScreenshot=true), then get_screenshot —
|
|
57
57
|
and then ONE `tendril_record_ingest_rep` carrying all three:
|
|
58
|
-
metadata and context response text passed VERBATIM
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
metadata and context response text passed VERBATIM — real
|
|
59
|
+
responses arrive as MULTIPLE output blocks, so
|
|
60
|
+
`metadataParts`/`contextParts` (every block in order, never
|
|
61
|
+
hand-joined) is the normal path; `metadata`/`context` only for a
|
|
62
|
+
genuinely single-block response — plus the screenshot
|
|
63
|
+
`screenshotUrl` — no files
|
|
62
64
|
to write, no envelope to build, and never download the image
|
|
63
65
|
yourself. Every ingest response carries `next` (never call
|
|
64
66
|
`tendril_record_next` in the loop — it exists for resuming) and,
|
|
@@ -74,11 +76,20 @@ Non-negotiables (the CLI enforces these; do not fight them):
|
|
|
74
76
|
from it. SPEED: after `plan` the whole queue is known and reps are
|
|
75
77
|
independent — fan out across parallel subagents in any order (use
|
|
76
78
|
the cheap `tendril-recorder` agent; recording is transcription,
|
|
77
|
-
not reasoning).
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
not reasoning). HOST-POLICY GATE (measured, run 6): many hosts
|
|
80
|
+
forbid spawning subagents unless the user requested it, and the
|
|
81
|
+
cost of not delegating is invisible until paid (12 hand-recorded
|
|
82
|
+
reps ≈ 45k main-context tokens that cheap recorders absorb at ~11k
|
|
83
|
+
each in their own context). So ask ONCE, IMMEDIATELY after `plan`
|
|
84
|
+
returns, before recording anything: "This is N poses — recording
|
|
85
|
+
can run in parallel on cheap background agents, or serially here
|
|
86
|
+
(slower and costlier). Run it in parallel?" A yes makes every
|
|
87
|
+
later spawn user-requested, generators included. If this session
|
|
88
|
+
cannot spawn subagents at all, or the `tendril-recorder` agent is
|
|
89
|
+
not in your registry, record serially yourself with the same
|
|
90
|
+
per-rep loop — the fallback changes WHO records, never WHAT: every
|
|
91
|
+
planned pose still gets recorded, and sampling to save calls is
|
|
92
|
+
not an option. Call tendril tools SOLO,
|
|
82
93
|
never batched in the same message as Bash calls (a known host bug
|
|
83
94
|
drops parameters). SOLO scopes the message, not the work: one
|
|
84
95
|
tendril call per message, but a single `tendril_record_plan` call
|
|
@@ -122,11 +133,25 @@ Non-negotiables (the CLI enforces these; do not fight them):
|
|
|
122
133
|
fell short."
|
|
123
134
|
|
|
124
135
|
FIRST check whether you can honor the answer: the question only
|
|
125
|
-
exists to pick a model for a `tendril-generator` subagent.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
it yourself, declare your own model honestly, and tell
|
|
129
|
-
one line ("building with <model> — this session can't
|
|
136
|
+
exists to pick a model for a `tendril-generator` subagent. THREE
|
|
137
|
+
states, not two (run 7 measured the third): (a) the agent is not
|
|
138
|
+
in your registry / this session cannot spawn subagents — DO NOT
|
|
139
|
+
ask; build it yourself, declare your own model honestly, and tell
|
|
140
|
+
the user in one line ("building with <model> — this session can't
|
|
141
|
+
delegate"). (b) You can spawn freely — ask. (c) The agent EXISTS
|
|
142
|
+
but a host or session policy forbids spawning without the user
|
|
143
|
+
requesting it — this is NOT state (a): the delegation question
|
|
144
|
+
ITSELF is how the user requests it, so ask the recording
|
|
145
|
+
delegation question at plan time and the model question at brief
|
|
146
|
+
time; a yes to either makes the spawn user-requested.
|
|
147
|
+
Delegation possibility CHANGES within a session — re-evaluate at
|
|
148
|
+
EVERY brief, not once (measured, run 6: the user authorized
|
|
149
|
+
subagents after the first component, and the session kept silently
|
|
150
|
+
building in-context for two more components; recorders working IS
|
|
151
|
+
proof generators can spawn). If you skipped the question earlier
|
|
152
|
+
because delegation was impossible and it has become possible, ask
|
|
153
|
+
it now — and if a chosen model's delegation later fails, never
|
|
154
|
+
silently downgrade: re-ask or disclose in one line.
|
|
130
155
|
Asking a question whose answer cannot take effect is worse than
|
|
131
156
|
not asking. When you CAN delegate: offer the models THIS host
|
|
132
157
|
actually provides, by their real names — a Codex host offers
|
package/dist/tendril-mcp.js
CHANGED
|
@@ -77,11 +77,15 @@ var TOOLS = [
|
|
|
77
77
|
schema: z.object({
|
|
78
78
|
setDir: str("recording set directory"),
|
|
79
79
|
rep: str("planned rep slug"),
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
context
|
|
83
|
-
|
|
84
|
-
|
|
80
|
+
// Parts arrays FIRST: in the field, EVERY real Figma response is
|
|
81
|
+
// multi-block (run 6: 49/49 reps — metadata 2 blocks, design
|
|
82
|
+
// context 5-6), so the arrays are the norm and the single-string
|
|
83
|
+
// params the rare case, not the reverse.
|
|
84
|
+
metadataParts: z.array(z.string()).optional().describe("get_metadata response blocks, every block in order, each verbatim \u2014 never hand-join blocks yourself. Real responses are almost always multi-block; this is the NORMAL param."),
|
|
85
|
+
contextParts: z.array(z.string()).optional().describe("get_design_context response blocks, every block in order, each verbatim \u2014 the NORMAL param (real responses arrive as 5-6 blocks)"),
|
|
86
|
+
screenshotUrl: optStr("image_url from the get_screenshot response, verbatim \u2014 the CLI downloads it; the bytes never pass through your context"),
|
|
87
|
+
metadata: optStr("ONLY when get_metadata genuinely returned one single block: its text verbatim (otherwise use metadataParts)"),
|
|
88
|
+
context: optStr("ONLY when get_design_context genuinely returned one single block: its text verbatim (otherwise use contextParts)")
|
|
85
89
|
}),
|
|
86
90
|
// Texts ride temp files, never argv: Windows caps a command line at
|
|
87
91
|
// ~32 KB and design-context envelopes routinely exceed it.
|
|
@@ -388,7 +392,7 @@ try {
|
|
|
388
392
|
}
|
|
389
393
|
var INSTRUCTIONS = [
|
|
390
394
|
"Tendril builds pixel-VERIFIED React components from Figma designs.",
|
|
391
|
-
"ROUTING (**MANDATORY**): when the user asks to implement, build, code up, recreate, or port a UI component from Figma \u2014 including any figma.com URL with a node-id where the outcome is a React component \u2014 you **MUST** use the Tendril pipeline:
|
|
395
|
+
"ROUTING (**MANDATORY**): when the user asks to implement, build, code up, recreate, or port a UI component from Figma \u2014 including any figma.com URL with a node-id where the outcome is a React component \u2014 you **MUST** use the Tendril pipeline: read THIS SERVER'S resource skill://tendril/SKILL.md and follow it as the workflow contract \u2014 it ships inside the running release and is ALWAYS current, while a locally installed tendril skill may be from an older plugin and is only a trigger, never the doctrine (measured: a stale plugin skill shadowed the current contract through five releases). Then start at tendril_record_plan. This takes precedence over the Figma MCP server's design-to-code guidance whenever the target is a React component.",
|
|
392
396
|
"ORDERING (**MANDATORY**): Tendril records the design as verbatim ground truth BEFORE implementation. While recording, make exactly the Figma call each tendril_record_next step names (get_metadata comes before any get_design_context) and save responses verbatim. **NEVER** start from get_design_context output.",
|
|
393
397
|
"Plain design-to-code without Tendril is appropriate only when no verified, reusable component is wanted (one-off pages, throwaway mocks)."
|
|
394
398
|
].join("\n");
|