Cursor rule
.cursor/rules/surface-parity.mdcCLI, MCP, and share must pass the same format opts (tz, locale, flags)
Cursor rules
Quality
68/100
Scores the file, not the repository.Length
602 words
4 headings · 1 code blocksRepository
27
— · pushed 0 days agoLast changed
2 days ago
First indexed 2 days ago.1234567# Surface parity (CLI / MCP / share)89Any user-visible formatter change must land on **all three surfaces** before merge:1011| Surface | Verify |12|---------|--------|13| CLI | `packages/cli` command + `packages/cli/test/` |14| MCP | `toolGet*` in `packages/mcp/src/tools.ts` + `packages/mcp/test/tools.test.ts` |15| Share | `formatShare*` + `packages/mcp/test/share.test.ts` |1617`scripts/release-qa.sh` exercises CLI + share rendering across locales and timezones; MCP arg threading is **not** rendered there — guard it with unit tests.1819## Knockout surfaces live-resolve — never read the skeleton (the #1 recurring bug)2021The bundled schedule's knockout slots are **resultless placeholders** (codes like `2A`/`2B`, flag `🏳️`). So a team-facing surface that reads the static bundle is **silently** blind to a confirmed knockout tie — no crash, no wrong data, just a stale placeholder. **Knockout live-resolve regressions** shipped repeatedly in different surfaces (root cause: skeleton reads, cache gaps, or both):2223- v0.8.2 — R32 pre-draw seeds rendered static, didn't live-resolve.24- v0.8.6 — bracket third-place slots never read the merged live `match.home/away`.25- v0.8.7 — `next` / `share next` / MCP next-fixture resolvers read only the static bundle.26- v0.8.8 — statusline next-match countdown read the static bundle (`🏳️ vs 🏳️` / `⚽ —` in knockouts).27- v0.8.9 — empty fixtures cache stamped the full 15min TTL at phase boundaries; stale-cache `live · syncing…` still read the skeleton.2829**Rule:** every team-facing surface must reach the live overlay (`getBracket` / `getNextFixtureForTeam` — the same `fetchWindow` the bracket uses), fail closed on outage, and attribute the provider only when the overlay served the chosen fixture. **Exception — statusline:** hot path cannot fetch; the cold-path refresher calls `getKnockoutFixtures` and caches to `CacheState.fixtures`; `renderPrompt` merges that slice over the bundle (countdown **and** `live · syncing…`), never leaking 🏳️. **Exception — MCP `fixtures://{date}` resource:** deliberately static ("Static fixture list"; a resource URI carries no tz and gets no live overlay) — do not "fix" it to live-resolve without a maintainer decision; agents use `get_today`/`get_bracket` for resolved pairings.3031| Surface | Entry point | Must |32|---------|-------------|------|33| CLI `bracket` / `next` | `cmdBracket` / `cmdNext` | call `getBracket` / `getNextFixtureForTeam` |34| CLI `share bracket` / `share next` | `cmdShare` | same |35| MCP `get_bracket` / `get_next_fixture` | `toolGetBracket` / `toolGetNextFixture` | same |36| MCP `get_share_snippet{bracket,next}` | `toolGetShareSnippet` | same |37| **statusline** | `renderPrompt` + `runRefresh` | hot path, NO network — indirect: refresher caches `getKnockoutFixtures` → `CacheState.fixtures`; `renderPrompt` merges them, **failing closed to `⚽ —`** when the cache lacks the pairing; unresolved placeholders dropped in syncing (never 🏳️). Empty successful fetch uses a **short TTL** (~60s); provider errors keep prior cache. **`cmdPrompt` and `cmdHook`** both spawn fixtures refresh in knockout phase. |3839**Executable guard:** `packages/{cli,mcp}/test/knockout-surface-coverage.test.ts` pins one fake resolved tie (Mexico vs Ecuador) and asserts every surface renders the real nations, not `🏳️` (statusline from a seeded cache). **`statusline.test.ts` / `refresh.test.ts`** cover syncing + empty-cache TTL. **Adding a team-facing surface? Add it to that test and this table.**4041## Format opts invariant4243If a core formatter accepts `tz`, `locale`, `flags`, or `date`, **every wrapper** passes them from `CliConfig` / `CommonOpts`.4445```typescript46// ❌ BAD — locale only; tz silently drops to server local47formatBracketList(view, { footer: false, locale: args.lang });4849// ✅ GOOD50formatBracketList(view, { footer: false, locale: args.lang, tz: args.tz });51// or reuse fmtOpts(args) where shapes align52```5354## Regression tests5556When adding a format option (e.g. `date: true` on `formatKickoff`):5758- Add a **core** unit test for the option.59- Add an **MCP tool test** proving `tz` changes output (e.g. UTC vs `America/Mexico_City` on a cross-midnight kickoff).60- Update share tests if `formatShareBracket` / compact lines are affected.61
Also in arturogarrido/claudinho
Diff this repo’s formatsOne repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| arturogarrido/claudinho.cursor/rules/bundle-bracket-pr.mdc · 27 | Cursor rules | buildtesttesting-strategygit+1 | 79/100 | 2 days ago | |
| arturogarrido/claudinho.cursor/rules/change-discipline.mdc · 27 | Cursor rules | no sections | 30/100 | yesterday | |
| arturogarrido/claudinho.cursor/rules/release-discipline.mdc · 27 | Cursor rules | lint-formatgitperformancedeployment+1 | 63/100 | 2 days ago | |
| arturogarrido/claudinho.cursor/rules/trust-boundary.mdc · 27 | Cursor rules | do-not | 58/100 | yesterday | |
| arturogarrido/claudinhoAGENTS.md · 27 | AGENTS.md | setuptestlint-formatstyle+8 | 84/100 | yesterday | |
| arturogarrido/claudinhoCLAUDE.md · 27 | CLAUDE.md | lint-formatperformanceagent-behaviour | 72/100 | 2 days ago |
Similar configs
Same format, overlapping stack, ranked by quality.
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| hiromaily/go-crypto-wallet.cursor/rules/typescript.mdc · 126 | Cursor rules | setupbuildtestlint-format+6 | 100/100 | 3 days ago | |
| TechSquidTV/Hermes.cursor/rules/10-hermes-api.mdc · 45 | Cursor rules | testlint-formatstylearch+5 | 100/100 | 3 days ago | |
| markstev/mark-starter.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+6 | 99/100 | 3 days ago | |
| Allymahmoud/case-intake-platform.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| dodgecfr/combatfilms-webapp.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| deifos/clipmira-subtitles.cursor/rules/frontend.mdc · 1 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| TechSquidTV/Hermes.cursor/rules/20-hermes-api-tests.mdc · 45 | Cursor rules | teststyletesting-strategysecurity+3 | 97/100 | 3 days ago | |
| langflow-ai/langflow.cursor/rules/docs_development.mdc · 153k | Cursor rules | setupbuildtestlint-format+7 | 97/100 | 3 days ago |
