@tendrilapp/cli 0.1.54 → 0.1.56
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 +31 -48
- package/dist/tendril-mcp.js +1 -1
- package/dist/tendril.js +4969 -4535
- package/package.json +3 -2
package/dist/SKILL.md
CHANGED
|
@@ -20,48 +20,25 @@ Non-negotiables (the CLI enforces these; do not fight them):
|
|
|
20
20
|
- Sub-bar results are honest, not failures to hide: exit 5 ships the
|
|
21
21
|
bundle with real scores. Report them as they are.
|
|
22
22
|
|
|
23
|
-
Permissions
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
user
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
~300 shell decisions to the user because this check certified only
|
|
43
|
-
the MCP half. If either half is missing, BEFORE the first recording
|
|
44
|
-
call, tell the user one approval can replace every pipeline prompt
|
|
45
|
-
and offer `tendril_permissions` with `write: true` — it merges the
|
|
46
|
-
per-tool allowlist PLUS the run's shell surface and project-scoped
|
|
47
|
-
Write/Edit (with deny guards so that grant can never touch
|
|
48
|
-
`./.claude/**` or `./.git/**`) into the project's
|
|
49
|
-
settings.local.json (idempotent, touches nothing else). PREFIXES:
|
|
50
|
-
pass `figmaPrefix` (and `tendrilPrefix` for non-plugin installs)
|
|
51
|
-
spelled exactly as THIS session names those tools — the part before
|
|
52
|
-
`__get_metadata` — whenever they differ from the plugin defaults; a
|
|
53
|
-
measured figma-remote session got six entries that could never
|
|
54
|
-
match because the write assumed the plugin shape. These are
|
|
55
|
-
CONVENIENCE grants, not a security boundary — the command's output
|
|
56
|
-
names what they trade (read verbs read any file without prompting;
|
|
57
|
-
host Bash patterns are best-effort prefix matches; the CLI
|
|
58
|
-
subcommand grants carry the CLI's own write surface). RELAY that
|
|
59
|
-
note to the user with the offer, never soften it, and say BOTH that
|
|
60
|
-
a reload is required AND that the current session keeps prompting
|
|
61
|
-
until then — the savings land next session; that is expected, not a
|
|
62
|
-
failure. Offer ONCE per session; never run it unoffered (it edits
|
|
63
|
-
the user's settings), and if declined, proceed without mentioning
|
|
64
|
-
it again.
|
|
23
|
+
Permissions: do nothing up front. Hosts now default to auto/allow
|
|
24
|
+
modes where pipeline calls never prompt, and an unprompted consent
|
|
25
|
+
dialog is itself the alarm it claims to prevent. Act ONLY on
|
|
26
|
+
observable evidence of the ask-mode case — you cannot see the host's
|
|
27
|
+
permission prompts (measured: a session full of prompts had a
|
|
28
|
+
prompt-conditioned offer never fire), but you CAN see a denied or
|
|
29
|
+
long-pending tool call, and the user can tell you they are being
|
|
30
|
+
prompted for everything. When that evidence exists, name the
|
|
31
|
+
one-command fix ONCE and let them decide: `tendril_permissions` with
|
|
32
|
+
`write: true` merges the pipeline's per-tool allowlist plus the run's
|
|
33
|
+
shell surface and project-scoped Write/Edit (deny guards keep the
|
|
34
|
+
grant out of `./.claude/**` and `./.git/**`) into the project's
|
|
35
|
+
settings.local.json — idempotent, touches nothing else. Pass
|
|
36
|
+
`figmaPrefix`/`tendrilPrefix` exactly as THIS session names those
|
|
37
|
+
tools when they differ from the plugin defaults. These are
|
|
38
|
+
CONVENIENCE grants, not a security boundary — relay the command's own
|
|
39
|
+
trade-off note unsoftened, and say that a reload is required and the
|
|
40
|
+
current session keeps prompting until then. Never run it unasked; if
|
|
41
|
+
declined, proceed and drop the subject.
|
|
65
42
|
|
|
66
43
|
Long generator/score waits: silence is not a health signal, and POLL
|
|
67
44
|
cadence is not RELAY cadence (run 13: rounds landed 6–11 minutes apart,
|
|
@@ -233,9 +210,11 @@ Batch runs (several components in one session):
|
|
|
233
210
|
cost of not delegating is invisible until paid (12 hand-recorded
|
|
234
211
|
reps ≈ 45k main-context tokens that cheap recorders absorb at ~11k
|
|
235
212
|
each in their own context). So ask ONCE, IMMEDIATELY after `plan`
|
|
236
|
-
returns, before recording anything
|
|
237
|
-
|
|
238
|
-
|
|
213
|
+
returns, before recording anything. You do not have to remember
|
|
214
|
+
the wording: whenever poses remain, the plan output carries
|
|
215
|
+
`recordingDelegation` — its `question` is the ask, verbatim, and
|
|
216
|
+
`recommendedRecorders` is the fan-out for that queue. Put it to
|
|
217
|
+
the user with the other plan-time questions. A yes makes every
|
|
239
218
|
later spawn user-requested, generators included. If this session
|
|
240
219
|
cannot spawn subagents at all, or the `tendril-recorder` agent is
|
|
241
220
|
not in your registry, record serially yourself with the same
|
|
@@ -494,9 +473,13 @@ machine token can fake.
|
|
|
494
473
|
The terminal sequence on green: `verify` → the inspect sheet (written
|
|
495
474
|
automatically) → `tendril_publish` → surface what it returns:
|
|
496
475
|
|
|
497
|
-
- `status: "approval-pending"` (a component's FIRST publish):
|
|
498
|
-
|
|
499
|
-
|
|
476
|
+
- `status: "approval-pending"` (a component's FIRST publish): surface
|
|
477
|
+
the ask THE MOMENT it appears, as its own short message with the
|
|
478
|
+
`approveUrl` VERBATIM on its own line — the link is the user's single
|
|
479
|
+
next action, and it opens a card that explains exactly what approving
|
|
480
|
+
publishes (the same card also waits on their portal home page, so
|
|
481
|
+
either door works). Name the `approveAsAccount` it carries — state
|
|
482
|
+
the account explicitly even when it looks obvious, because the
|
|
500
483
|
approving browser can be signed in to a different account than this
|
|
501
484
|
session runs under, and a mismatch strands the user on an empty
|
|
502
485
|
approve page. Do not urge them to approve: approving includes
|
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. 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.",
|
|
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. When poses remain it also carries `recordingDelegation` \u2014 a QUESTION, asked once, before the first recording call: parallel cheap recorders or serially in your own context. Put it to a present user with the other plan-time questions and honour the answer; if this session cannot spawn subagents, do not ask \u2014 record serially and say so in one line. 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"),
|