Borrowing it
Nothing to install: this file belongs to sybrew/troy. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/sybrew/troy/main/.cursor/skills/wrap/SKILL.mdgit clone --depth 1 https://github.com/sybrew/troyWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/sybrew/troy/wrap)<a href="https://agentmods.dev/skills/sybrew/troy/wrap"><img src="https://agentmods.dev/badge/skills/sybrew/troy/wrap/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/sybrew/troy/wrap"><img src="https://agentmods.dev/badge/skills/sybrew/troy/wrap.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00070 | $0.01242 |
| Opus 5.5 | $0.00028 | $0.00497 |
| Sonnet 5.5 | $0.00014 | $0.00248 |
| Haiku 4.5 | $0.00007 | $0.00124 |
Grade A, and why
wrap scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 88 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Wrap and visual width
Do not guess column counts. Tabs are 1 character in editors and in .length. House width is tab = 4.
Source of truth: .github/copilot-instructions.md, .github/instructions/php.instructions.md, and .github/instructions/javascript.instructions.md. This skill only stops misreads.
Width measurement works on any text. --compact-if is the 80-column void if / elseif / else if terminator.
Measure
From the repo root. Same command on Windows (PowerShell or cmd), macOS, and Linux:
php .cursor/skills/wrap/scripts/visual-width.php path/to/file.php
php .cursor/skills/wrap/scripts/visual-width.php --line 85 path/to/file.php
php .cursor/skills/wrap/scripts/visual-width.php --compact-if --gt 80 path/to/file.php
--line N one 1-based line. --gt N only lines wider than N. --compact-if only same-line void if / elseif / else if ( … ) return; / continue; / break;. Output is path:line:width. Files only; directories are not scanned.
Pipe a snippet:
Windows PowerShell:
"if ( ! `$x ) return;" | php .cursor/skills/wrap/scripts/visual-width.php
macOS / Linux:
printf '%s\n' 'if ( ! $x ) return;' | php .cursor/skills/wrap/scripts/visual-width.php
PHP 7.4+ on PATH. If php is missing, say so and do not invent a width.
Decision tree
80 visual columns apply to compact void if / elseif / else if that keep return;, continue;, or break; on the same line, and to PHP attributes kept on the same line as the annotated symbol. Measure that whole line.
| Case | 80? | What to do |
|---|---|---|
if ( expr ) return; / continue; / break; and vis ≤ 80 |
yes | Keep same line |
Same, vis > 80, condition is one expression (no && / ||) |
yes | Terminator next line, unbraced. Do not wrap the condition |
Same, vis > 80, condition has && / || |
yes | Wrap at those operators (first operand padded 3 spaces), braces. Do not wrap only the terminator |
Valued return after if |
no | Next line, unbraced. Line length is not the trigger |
| Assignment, ternary, coalesce | no | Stay one line unless another rule already forces a wrap |
| Ternary/coalesce RHS already multiline | no | Break after =, pad first operand 3 spaces so ? / : / ?? align |
| Call arguments > 30 characters total | no (30) | Wrap those arguments |
| Array/object/closure among several arguments | no | Every argument of that call on its own line |
Assigned ?: / ?? whose first operand is a multi-parameter call |
no | Each parameter on its own line. Indent the call one tab, and put the operator at that same indent. Do not pad the call by 3 spaces. Keep each later operand on one line |
| SQL over 80 | SQL 80 | SQL clause rules, not compact-if |
| PHP attribute + symbol vis > 80 | yes | Attribute on the line above. If the attribute itself vis > 80, wrap its arguments like a call |
Function { blank |
n/a | Functions/closures only, 2+ statements. Never after if / loop / try / labeled { |
Blank before return / yield |
n/a | Interior has 2+ statements. Not before continue / break |
| Hook-doc isolation | n/a | Sibling statements only. Glue the docblock to the call, including as an operand of a compound if. Do not split that if into extra guards. Not translators, not filter-as-argument |
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2d ago First seen · 88 lines · 70 tokens per session scan A f9705cf1ba4d
wrap is a skill published in the GitHub repository sybrew/troy (55 stars, last pushed 14d ago), licensed MIT. It adds 70 tokens to every session and 1,242 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-10-26.
Other skills, from other repositories
bd-better-route-bridge
Compose better-data DTOs with the better-route library — use BetterRouteBridge::{get, post, put, patch, delete} to register a REST route that hydrates the request into a DTO, validates, calls the handler with (DataObject, mixed $request), and presents returned DataObject values through Presenter with…
bd-data-object
Add or modify DataObject subclasses inside the better-data library — the immutable, attribute-decorated DTOs the whole library is built around. Every DTO is final readonly class extends DataObject with constructor-promoted typed parameters; sources hydrate via ::fromArray, sinks project via SinkProjection, the…
wp-plugin-bootstrap
Scaffolds and reviews the main entry-point PHP file of a WordPress plugin — header (with Requires Plugins for WP 6.5+), ABSPATH guard, file/path/url/version constants, Composer PSR-4 autoload with src/ as the default class root, optional scoped fallback for release ZIP safety, PascalCase class filenames that match…
bd-attribute
Add a new declarative attribute to the better-data library (e.g. #[ArrayOf], #[Default], domain hint). Attributes live in src/Attribute/ as final readonly classes with constructor-promoted public properties — pure data carriers, never business logic. The failure mode that catches every contributor is "partial wiring"…
bd-hydration-coercion
Modify how raw values become typed property values in better-data — work in TypeCoercer (primitives + DateTime + Enum + Secret) or DataObject::coerceParameter (attribute-aware — ListOf, Encrypted, etc.). Critical layering — TypeCoercer is pure, must stay callable from a no-WordPress unit test, no side effects, no…
bd-source-adapter
Add a new source adapter to better-data — code that reads from a WordPress data store the library doesn't cover yet (comments, attachments, transients, custom tables). Mirror the canonical shape PostSource / UserSource / TermSource use — a non-final class with static hydrate(int|object, $dtoClass) and…