@tendrilapp/cli 0.1.52 → 0.1.54

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
@@ -206,7 +206,7 @@ Batch runs (several components in one session):
206
206
  metadata and context response text passed VERBATIM — responses
207
207
  often arrive as MULTIPLE output blocks (block counts vary BY
208
208
  TRANSPORT: the desktop server has been measured at 2-4 blocks per
209
- response, the remote server at 1-2 — never treat any count as a
209
+ response, the remote server at 1-5 — never treat any count as a
210
210
  sanity check), so `metadataParts`/`contextParts` (every block in
211
211
  order, never hand-joined) is the normal path; `metadata`/`context`
212
212
  only for a genuinely single-block response — plus the screenshot
@@ -253,7 +253,13 @@ Batch runs (several components in one session):
253
253
  5. COMPOSITION: read the status output's `composition` block. If it
254
254
  lists unconfirmed partner pairs, this recording references OTHER
255
255
  recorded components (a segmented control built from a recorded
256
- Control, a dialog holding a recorded Button). Order matters:
256
+ Control, a dialog holding a recorded Button). A pair the human
257
+ ALREADY confirmed can legitimately re-open as a GROWTH ask
258
+ (`growsConfirmed: true`): new evidence derived MORE instances of
259
+ the same pairing — say so as an addition, never as a contradiction
260
+ of the settled decision; confirming adds the new instances, the
261
+ standing confirmation is untouched, and growth asks cannot be
262
+ declined (leave them unconfirmed and they simply stay local). Order matters:
257
263
  generate the PARTNER bundle first, then put the pairing decision in
258
264
  front of the human — it is human-only on either channel, and you
259
265
  can never make it. CLICK PATH (lead with this): `tendril_compose`
@@ -388,6 +394,13 @@ Batch runs (several components in one session):
388
394
  genuinely headless runs; it cannot tell "nobody is there" from "the
389
395
  harness said nobody is there", so it must at least say what it did,
390
396
  loudly and first.)
397
+ PRESENCE PROOF OVERRIDES THE NON-INTERACTIVE BRANCH: a browser
398
+ approval decided mid-run — a compose card approved, a publish
399
+ card clicked — is a human at the keyboard, whatever the harness
400
+ said. From the moment one lands, ask the consent gates that
401
+ remain instead of auto-resolving them (measured, 2026-08-30: a
402
+ run auto-resolved the model pick for its THIRD generation while
403
+ the user was demonstrably present, having just clicked Approve).
391
404
  Weak models produce honest sub-bar reports, never false passes.
392
405
  6. Tell the user roughly what a run costs them: organism-scale
393
406
  components have measured 0.3–0.7M tokens of their plan.
@@ -527,6 +540,14 @@ live at <URL>" (or "done — waiting for your Approve at <link>, as
527
540
  <account>"), before scores, caveats and file lists. The user should
528
541
  never have to ask where their component is.
529
542
 
543
+ And invite the ONE check only the user can run: right after the
544
+ done-line, ask them to open the live page and say whether the demo
545
+ renders. You cannot execute the published page — a browser can, and
546
+ a served-page defect is invisible to every check this pipeline runs
547
+ (measured, 2026-08-30: two publishes reported "done — live" while
548
+ both live demos showed an error banner nobody had seen). One line,
549
+ no urging: "open it and tell me if anything looks off."
550
+
530
551
  A green verify may also print COMPOSE lines: other recorded components
531
552
  that embed the one just verified. Relay them after the done-line as
532
553
  DISCLOSURES (zero questions — the confirm decision is human-only, in
@@ -125,9 +125,18 @@ var TOOLS = [
125
125
  description: "Publish a VERIFIED bundle to the user's portal \u2014 phase one of the browser-approved publish. Re-publishing an already-published component completes in one call. A component's FIRST publish is a human-only decision the portal enforces: this call requests the approval and returns the approve-page link \u2014 RELAY IT to the user verbatim, along with which account the result says to be signed in as (they click Approve in the browser; approving includes accepting the design system's publishing terms, which is their decision to make, never yours to urge). Then call tendril_publish_wait to finish. You cannot approve this yourself: the portal only accepts the decision from their signed-in browser, never from this machine's token. Requires a green verify (the CLI refuses a declined run) and a portal session (tendril_login).",
126
126
  schema: z.object({
127
127
  bundleDir: str("bundle directory (verified \u2014 carries component.json and verify-evidence)"),
128
- portal: optStr("portal origin override for self-hosted portals (defaults to the stored session's portal)")
128
+ portal: optStr("portal origin override for self-hosted portals (defaults to the stored session's portal)"),
129
+ designSystemName: optStr(
130
+ "first publish only: a PROPOSED display name for the design system, prefilled on the approve card where the human names or picks it \u2014 pass the design's human name when you know it (the Figma file's title, the design system the user named); without a proposal the card prefills the raw Figma file key, and a plain Approve makes that key the permanent name"
131
+ )
129
132
  }),
130
- argv: (i) => ["publish", i["bundleDir"], "--approve-start", ...typeof i["portal"] === "string" ? ["--to", i["portal"]] : []]
133
+ argv: (i) => [
134
+ "publish",
135
+ i["bundleDir"],
136
+ "--approve-start",
137
+ ...typeof i["designSystemName"] === "string" ? ["--design-system-name", i["designSystemName"]] : [],
138
+ ...typeof i["portal"] === "string" ? ["--to", i["portal"]] : []
139
+ ]
131
140
  },
132
141
  {
133
142
  name: "tendril_publish_wait",
@@ -161,12 +170,14 @@ var TOOLS = [
161
170
  description: "Fetch the user's living DESIGN-SYSTEM.md \u2014 the portal-assembled file describing one design system: its components with their ruler verdicts, each component's prescribed API and poses, the captured variable vocabulary, the icon inventory, and a changelog. Call it with no arguments first to LIST the design systems and their ids, then again with `ds` to fetch one (pass `out` to write the file where a design agent will read it). The file is a PROJECTION the portal re-assembles fresh on every fetch \u2014 never edit it, re-fetch it. Needs a portal session (tendril_login); it is owner-only because the vocabulary and icons are the customer's design IP.",
162
171
  schema: z.object({
163
172
  ds: optStr("the design system id \u2014 omit to list them"),
173
+ component: optStr("with ds: one component's id (from the file's inventory links) \u2014 fetches just that component's markdown page, the right scope when building with a single component"),
164
174
  out: optStr("write the markdown to this file instead of returning it inline"),
165
175
  portal: optStr("portal origin override for self-hosted portals (defaults to the stored session's portal)")
166
176
  }),
167
177
  argv: (i) => [
168
178
  "design-system",
169
179
  ...typeof i["ds"] === "string" ? ["--ds", i["ds"]] : [],
180
+ ...typeof i["component"] === "string" ? ["--component", i["component"]] : [],
170
181
  ...typeof i["out"] === "string" ? ["--out", i["out"]] : [],
171
182
  ...typeof i["portal"] === "string" ? ["--to", i["portal"]] : []
172
183
  ]