troy: Skill for Cursor

.cursor/skills/wrap/SKILL.md

wrap is a skill for Cursor from sybrew/troy. It costs 70 tokens per session (1,242 once invoked), scanned A, original, MIT.

A utility for measuring visual line width and applying this repository's wrapping rules to PHP and JavaScript. It accounts for tabs and checks specific line patterns instead of treating every line as having the same limit.

In plain words
What is it for?
It is for checking files or code snippets and finding lines that need wrapping under the repository's formatting rules.
Why use it?
It replaces guesses about line length with a repeatable check and helps decide where long expressions should be wrapped.

Skill for Cursor

Written for Cursor: installed under .cursor/.

This is sybrew/troy's own configuration. It tells Cursor how to work on troy itself, so it is not a mod to install elsewhere. Copy it as a starting point and replace the rules that are about this project. Everything troy configures →

Reuse

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.

Copy the file
curl -O https://raw.githubusercontent.com/sybrew/troy/main/.cursor/skills/wrap/SKILL.md
Clone the repo
git clone --depth 1 https://github.com/sybrew/troy

Made for: Cursor.

Wrote 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.

agentmods badge for wrap

README.md
[![agentmods](https://agentmods.dev/badge/skills/sybrew/troy/wrap/github.svg)](https://agentmods.dev/skills/sybrew/troy/wrap)
Your own site
<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.

agentmods 80×15 button for wrap

Your own site · 80×15
<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>
Per session 70 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 1,242 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

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.

ModelPer sessionOnce 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

Measured 2d ago against content hash f9705cf1ba4d, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

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.

.cursor/skills/wrap/SKILL.md · 88 lines

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

Read the full file on GitHub · 88 lines

Files

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.

Changes

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.

  1. 2d ago First seen · 88 lines · 70 tokens per session scan A f9705cf1ba4d

Subscribe to this mod's changes

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.

Related

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…

Lonsdale201/wp-agent-skills · 214 tokens

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…

Lonsdale201/wp-agent-skills · 206 tokens

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…

Lonsdale201/wp-agent-skills · 183 tokens

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"…

Lonsdale201/wp-agent-skills · 193 tokens

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…

Lonsdale201/wp-agent-skills · 224 tokens

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…

Lonsdale201/wp-agent-skills · 207 tokens