@tendrilapp/cli 0.1.27 → 0.1.28

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
@@ -28,16 +28,29 @@ settings file the host merges — the project's
28
28
  `.claude/settings.local.json` or `.claude/settings.json`, or the
29
29
  user's `~/.claude/settings.json` — contains tendril MCP entries
30
30
  (plugin installs use `mcp__plugin_tendril_tendril__*`; direct
31
- `claude mcp add` installs use `mcp__<server-name>__*`). If none does,
32
- BEFORE the first recording call, tell the user one approval can
33
- replace every pipeline prompt and offer `tendril_permissions` with
34
- `write: true` it merges the per-tool allowlist into the project's
35
- settings.local.json (idempotent, touches nothing else; note it writes
36
- PLUGIN-prefixed names a direct-install user should run
37
- `tendril permissions --claude` and adapt the prefix instead) and the
38
- user must reload the session to apply; say that out loud. Offer ONCE
39
- per session; never run it unoffered (it edits the user's settings),
40
- and if declined, proceed without mentioning it again.
31
+ `claude mcp add` installs use `mcp__<server-name>__*`) AND shell-
32
+ surface entries (`Bash(ls:*)`-style prefixes plus `Write`/`Edit`).
33
+ THE MCP LIST ALONE IS NOT "PERMISSIONS ARE FINE": a run is mostly
34
+ shellmkdir, evidence reads, log writes, the printed npx commands
35
+ and a measured session whose every MCP call was covered still put
36
+ ~300 shell decisions to the user because this check certified only
37
+ the MCP half. If either half is missing, BEFORE the first recording
38
+ call, tell the user one approval can replace every pipeline prompt
39
+ and offer `tendril_permissions` with `write: true` it merges the
40
+ per-tool allowlist PLUS the run's shell surface and project-scoped
41
+ Write/Edit (with deny guards so that grant can never touch
42
+ `./.claude/**` or `./.git/**`) into the project's
43
+ settings.local.json (idempotent, touches nothing else; note it
44
+ writes PLUGIN-prefixed names — a direct-install user should run
45
+ `tendril permissions --claude` and adapt the prefix instead). These
46
+ are CONVENIENCE grants, not a security boundary — the command's
47
+ output names what they trade (read verbs read any file without
48
+ prompting; host Bash patterns are best-effort prefix matches; the
49
+ CLI subcommand grants carry the CLI's own write surface). RELAY that
50
+ note to the user with the offer, never soften it, and say the user
51
+ must reload the session to apply. Offer ONCE per session; never run
52
+ it unoffered (it edits the user's settings), and if declined,
53
+ proceed without mentioning it again.
41
54
 
42
55
  Long generator/score waits: silence is not a health signal, and POLL
43
56
  cadence is not RELAY cadence (run 13: rounds landed 6–11 minutes apart,
@@ -171,11 +184,13 @@ Batch runs (several components in one session):
171
184
  Figma MCP calls in protocol order — get_metadata, then
172
185
  get_design_context (excludeScreenshot=true), then get_screenshot —
173
186
  and then ONE `tendril_record_ingest_rep` carrying all three:
174
- metadata and context response text passed VERBATIM — real
175
- responses arrive as MULTIPLE output blocks, so
176
- `metadataParts`/`contextParts` (every block in order, never
177
- hand-joined) is the normal path; `metadata`/`context` only for a
178
- genuinely single-block response plus the screenshot
187
+ metadata and context response text passed VERBATIM — responses
188
+ often arrive as MULTIPLE output blocks (block counts vary BY
189
+ TRANSPORT: the desktop server has been measured at 2-4 blocks per
190
+ response, the remote server at 1-2 never treat any count as a
191
+ sanity check), so `metadataParts`/`contextParts` (every block in
192
+ order, never hand-joined) is the normal path; `metadata`/`context`
193
+ only for a genuinely single-block response — plus the screenshot
179
194
  `screenshotUrl` — no files
180
195
  to write, no envelope to build, and never download the image
181
196
  yourself. Every ingest response carries `next` (never call
@@ -278,6 +293,15 @@ Batch runs (several components in one session):
278
293
  no prices or percentages (they go stale). Non-interactive runs
279
294
  pick the balanced tier and state the reason in the report. Always
280
295
  pass the choice via --host/--model (self-reported provenance).
296
+ CONSENT GATES AUTO-RESOLVED IN A NON-INTERACTIVE RUN — the model
297
+ pick, the parallel-recording decision — must open the FINAL REPORT,
298
+ first lines, not sit in a log: the user learns what was decided for
299
+ them before they read anything else. (Measured: an autonomy setting
300
+ converted both gates into buried deviations while the user sat
301
+ present and wanted to be asked. The non-interactive branch is for
302
+ genuinely headless runs; it cannot tell "nobody is there" from "the
303
+ harness said nobody is there", so it must at least say what it did,
304
+ loudly and first.)
281
305
  Weak models produce honest sub-bar reports, never false passes.
282
306
  6. Tell the user roughly what a run costs them: organism-scale
283
307
  components have measured 0.3–0.7M tokens of their plan.
@@ -66,7 +66,7 @@ var TOOLS = [
66
66
  },
67
67
  {
68
68
  name: "tendril_permissions",
69
- description: "Install the Claude Code permission allowlist for the Tendril pipeline (write: true \u2014 merges per-tool entries into the project's .claude/settings.local.json, idempotent, never touches other settings), or list the entries without writing. OFFER THIS AT PIPELINE START whenever NO merged Claude settings file (project .claude/settings.local.json or .claude/settings.json, or user ~/.claude/settings.json) contains tendril MCP entries \u2014 plugin installs use mcp__plugin_tendril_tendril__*, direct claude-mcp-add installs use mcp__<server>__* (for those, write:true installs PLUGIN-prefixed names that will not match: list without writing and adapt the prefix instead). A FILE check, never prompt-watching \u2014 agents cannot observe permission prompts. ONE approval here replaces a prompt per pipeline call. Never run it unoffered; the user must reload the session for new settings to apply \u2014 say so.",
69
+ description: "Install the Claude Code permission allowlist for the Tendril pipeline (write: true \u2014 merges the MCP per-tool entries, the run's shell surface, and project-scoped Write/Edit with deny guards for ./.claude and ./.git into the project's .claude/settings.local.json, idempotent, never touches other keys), or list the entries without writing. The shell/Write grants are CONVENIENCE, not a security boundary \u2014 the output's note names exactly what they trade; RELAY it with the offer. OFFER THIS AT PIPELINE START whenever NO merged Claude settings file (project .claude/settings.local.json or .claude/settings.json, or user ~/.claude/settings.json) contains tendril MCP entries \u2014 plugin installs use mcp__plugin_tendril_tendril__*, direct claude-mcp-add installs use mcp__<server>__* (for those, write:true installs PLUGIN-prefixed names that will not match: list without writing and adapt the prefix instead). A FILE check, never prompt-watching \u2014 agents cannot observe permission prompts. ONE approval here replaces a prompt per pipeline call. Never run it unoffered; the user must reload the session for new settings to apply \u2014 say so.",
70
70
  schema: z.object({
71
71
  write: z.boolean().optional().describe("true = install into .claude/settings.local.json (the point of this tool); false/absent = just return the entries")
72
72
  }),
@@ -226,7 +226,7 @@ var TOOLS = [
226
226
  },
227
227
  {
228
228
  name: "tendril_engine_score",
229
- description: "AGENT-HARNESS engine, step 2 (the oracle): scores a candidate bundle directory against recorded truth \u2014 per-config pixels, behaviors, hover parity \u2014 and returns feedback plus evidence artifacts. Iterate until allPass or two non-improving rounds. Only THIS tool's output counts as a score; never claim numbers yourself.",
229
+ description: "AGENT-HARNESS engine, step 2 (the oracle): scores a candidate bundle directory against recorded truth \u2014 per-config pixels, behaviors, state parity (recording-selected \u2014 a bundle cannot unschedule it) \u2014 and returns feedback plus evidence artifacts. Iterate until allPass or two non-improving rounds. Only THIS tool's output counts as a score; never claim numbers yourself.",
230
230
  schema: z.object({
231
231
  taskOrSet: str("reference task name or recording-set directory"),
232
232
  candidateDir: str("directory containing the proposed bundle files"),