taste-lint 0.1.0 → 0.3.0

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.
Files changed (41) hide show
  1. package/README.md +18 -14
  2. package/data/config.schema.json +7 -44
  3. package/data/rules/copywriting/copywriting-anthropomorphism.yaml +4 -3
  4. package/data/rules/copywriting/copywriting-antithesis-frame.yaml +21 -0
  5. package/data/rules/copywriting/copywriting-click-here-links.yaml +4 -3
  6. package/data/rules/copywriting/copywriting-conditions-first.yaml +2 -2
  7. package/data/rules/copywriting/copywriting-copula-avoidance.yaml +21 -0
  8. package/data/rules/copywriting/copywriting-error-descriptions.yaml +2 -2
  9. package/data/rules/copywriting/copywriting-filler-words.yaml +4 -3
  10. package/data/rules/copywriting/copywriting-latinisms.yaml +6 -4
  11. package/data/rules/copywriting/copywriting-nominalisations.yaml +4 -3
  12. package/data/rules/copywriting/copywriting-participle-tail.yaml +21 -0
  13. package/data/rules/copywriting/copywriting-passive-voice.yaml +4 -3
  14. package/data/rules/copywriting/copywriting-promotional-docs-voice.yaml +4 -3
  15. package/data/rules/copywriting/copywriting-requirements-language.yaml +2 -2
  16. package/data/rules/copywriting/copywriting-searchable-headings.yaml +2 -2
  17. package/data/rules/copywriting/copywriting-tee-up.yaml +21 -0
  18. package/data/rules/copywriting/copywriting-temporal-words.yaml +4 -3
  19. package/data/rules/craft/craft-atmosphere-gradient.yaml +28 -0
  20. package/data/rules/craft/craft-default-indigo.yaml +28 -0
  21. package/data/rules/motion/motion-will-change-misuse.yaml +28 -0
  22. package/data/rules/product/product-nested-modals.yaml +1 -1
  23. package/data/rules/product/product-select-for-few-options.yaml +1 -1
  24. package/data/rules/schema/rule.schema.json +1 -5
  25. package/data/rules/typography/typography-straight-quotes.yaml +0 -1
  26. package/dist/cli.js +865 -2313
  27. package/dist/cli.js.map +1 -1
  28. package/dist/index.d.ts +51 -128
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +588 -1185
  31. package/dist/index.js.map +1 -1
  32. package/package.json +4 -1
  33. package/data/audit/SKILL.md +0 -22
  34. package/data/audit/capture.js +0 -111
  35. package/data/audit/example.json +0 -75
  36. package/data/rules/copywriting/copywriting-announced-honesty.yaml +0 -43
  37. package/data/rules/copywriting/copywriting-changed-supplied-facts.yaml +0 -31
  38. package/data/rules/copywriting/copywriting-drafting-instruction-echo.yaml +0 -31
  39. package/data/rules/copywriting/copywriting-profile-register-mismatch.yaml +0 -31
  40. package/data/rules/copywriting/copywriting-unraised-objection.yaml +0 -43
  41. package/data/rules/copywriting/copywriting-vague-personal-request.yaml +0 -43
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  **Catch AI slop before you ship.**
6
6
 
7
- Scan your project with [Jev by TypeSafe AI](https://docs.typesafe.ai/introduction).
7
+ Design review on every commit, from the [Taste Training](https://blode.co/taste-training) and [Agent Skills](https://github.com/mblode/agent-skills) rules.
8
8
 
9
9
  <p align="center">
10
10
  <a href="https://www.npmjs.com/package/taste-lint"><img alt="npm version" src="https://img.shields.io/npm/v/taste-lint?style=flat&colorA=000000&colorB=000000" /></a>
@@ -19,31 +19,37 @@ Scan your project with [Jev by TypeSafe AI](https://docs.typesafe.ai/introductio
19
19
  npx taste-lint@latest init
20
20
  ```
21
21
 
22
- Requires Node 24.11 or later. Run it from your project directory. Init installs locally and adds a scan script.
22
+ Node 24.11+. Init adds a `taste` script that runs `taste-lint lint --profile product`.
23
23
 
24
24
  ## Quickstart
25
25
 
26
- Create a [Vercel AI Gateway key](https://vercel.com/docs/ai-gateway/authentication-and-byok/api-keys). Then:
26
+ ```bash
27
+ npm run taste -- --dry-run
28
+ ```
29
+
30
+ No key, no account. The mechanical checks run and fail the build on what they find.
31
+
32
+ To add the Jev review notes, get a [Vercel AI Gateway key](https://vercel.com/docs/ai-gateway/authentication-and-byok/api-keys):
27
33
 
28
34
  ```bash
29
35
  export AI_GATEWAY_API_KEY="your-vercel-ai-gateway-key"
30
36
  npm run taste
31
37
  ```
32
38
 
33
- No taste-lint account or config. AI checks send selected text and rule context to Vercel AI Gateway, billed to your account. Repeat runs reuse cached answers.
34
-
35
- Use your package manager in place of npm. Pass `--agent` to init for agent instructions, or `--dry-run` to preview setup.
39
+ Checks bill your key and cache between runs. `--dry-run` previews the cost first.
36
40
 
37
41
  ## What it checks
38
42
 
39
- - **Product interfaces:** error recovery, empty states, confirmation labels, unsupported claims, and broad CSS transitions.
40
- - **Whole pages:** agent-assisted UI, typography, copy, interaction, motion and SEO audits. Run `taste-lint scan guide` for the workflow.
41
- - **Writing:** Markdown, MDX, and READMEs with `--profile writing`.
42
- - **Agent instructions:** AGENTS.md and skills with `--profile instructions`.
43
+ - **Motion:** `transition-all` and `transition: all`, ease-in, linear easing, transitions over 300ms, entrances from scale zero, `framer-motion` imports.
44
+ - **Copy:** the [ghostwriter](https://github.com/mblode/agent-skills/tree/main/skills/ghostwriter) structure tells (participle tails, “it’s not X, it’s Y”, “Here’s the thing”), “click here” links, “successfully” toasts, emoji in UI, nominalisations, anthropomorphism, long sentences that chain clauses.
45
+ - **Typography:** straight quotes, three-dot ellipses, hyphens for dashes, `x` for ×, missing space before a unit, light weights on small body text, uppercase without tracking.
46
+ - **Under review:** vague errors, empty states with no action, bare “Confirm” labels, claims with nothing to check, missing error states. These go to [Jev by TypeSafe AI](https://docs.typesafe.ai/introduction), which answers with a probability.
47
+
48
+ 28 checks block. 125 more report and never fail a run. They are pattern ports nobody has yet watched on a real codebase, and Jev questions no labelled corpus has yet promoted. See [usage](https://blode.co/taste-lint/docs/usage) for how promotion works.
43
49
 
44
- Rules come from [Agent Skills](https://github.com/mblode/agent-skills) and [Taste Training](https://blode.co/taste-training). Local checks handle measurable rules. Jev judges meaning and returns probabilities. Uncalibrated AI rules stay advisory. Active findings can fail a run.
50
+ Profiles scope a run: `product` (tsx, jsx, css), `writing` (md, mdx, README), `instructions` (AGENTS.md, skills, plans), `all`.
45
51
 
46
- The default scan focuses on six checks and shows five prioritized groups. Use `--only <rule-id>` for a specific check or `--profile all` for the full catalog. Source checks do not replace reviewing the running interface.
52
+ Add your own voice with a rule pack: `"rules": ["$GHOSTWRITER_HOME/taste-lint"]` in `taste-lint.config.json` checks drafts against your [ghostwriter](https://github.com/mblode/agent-skills/tree/main/skills/ghostwriter) profile.
47
53
 
48
54
  ## Docs
49
55
 
@@ -53,8 +59,6 @@ The default scan focuses on six checks and shows five prioritized groups. Use `-
53
59
  </a>
54
60
  </p>
55
61
 
56
- `taste-lint scan --help` lists every option. `--dry-run` previews scope and cost. `--output json` and `--output sarif` are for scripts and code review.
57
-
58
62
  ## License
59
63
 
60
64
  MIT
@@ -14,6 +14,13 @@
14
14
  "smartQuotesAtBuild": {
15
15
  "type": "boolean"
16
16
  },
17
+ "rules": {
18
+ "description": "Extra rule directories, laid out like data/rules (domain folders of YAML rules). Paths resolve from the scan root; a leading ~ and $VARS expand, so a voice pack can live in $GHOSTWRITER_HOME.",
19
+ "type": "array",
20
+ "items": {
21
+ "type": "string"
22
+ }
23
+ },
17
24
  "components": {
18
25
  "type": "object",
19
26
  "additionalProperties": false,
@@ -54,9 +61,6 @@
54
61
  "readme",
55
62
  "skill",
56
63
  "plan",
57
- "personal",
58
- "pr",
59
- "slides",
60
64
  "unknown"
61
65
  ]
62
66
  }
@@ -75,47 +79,6 @@
75
79
  }
76
80
  }
77
81
  }
78
- },
79
- "architecture": {
80
- "type": "object",
81
- "additionalProperties": false,
82
- "properties": {
83
- "boundaries": {
84
- "type": "array",
85
- "items": {
86
- "type": "object",
87
- "additionalProperties": false,
88
- "required": ["from", "disallow", "reason"],
89
- "properties": {
90
- "from": {
91
- "type": "string",
92
- "minLength": 1
93
- },
94
- "disallow": {
95
- "type": "string",
96
- "minLength": 1
97
- },
98
- "reason": {
99
- "type": "string",
100
- "minLength": 1
101
- }
102
- }
103
- }
104
- },
105
- "deprecatedImports": {
106
- "type": "object",
107
- "additionalProperties": {
108
- "type": "string",
109
- "minLength": 1
110
- }
111
- },
112
- "generated": {
113
- "type": "array",
114
- "items": {
115
- "type": "string"
116
- }
117
- }
118
- }
119
82
  }
120
83
  },
121
84
  "$schema": "https://json-schema.org/draft/2020-12/schema",
@@ -1,12 +1,13 @@
1
- # Ported from mblode/agent-skills skills/docs-writing/rules/voice-no-anthropomorphism.md.
1
+ # Ported from mblode/agent-skills skills/docs-writing/rules/voice-no-anthropomorphism.md, now
2
+ # skills/ghostwriter/references/docs.md after docs-writing was retired.
2
3
  id: copywriting-anthropomorphism
3
4
  title: Software described as thinking, wanting or knowing
4
5
  categoryId: machine-prose
5
6
  source:
6
7
  {
7
8
  repo: mblode/agent-skills,
8
- path: skills/docs-writing/rules/voice-no-anthropomorphism.md,
9
- line: 7,
9
+ path: skills/ghostwriter/references/docs.md,
10
+ line: 13,
10
11
  }
11
12
  unit: [paragraph]
12
13
  mechanical:
@@ -0,0 +1,21 @@
1
+ # Hand-cut from mblode/agent-skills skills/ghostwriter/references/tells.md (structure tells).
2
+ id: copywriting-antithesis-frame
3
+ title: Sets up a claim by denying one nobody made
4
+ categoryId: machine-prose
5
+ source:
6
+ {
7
+ repo: mblode/agent-skills,
8
+ path: skills/ghostwriter/references/tells.md,
9
+ line: 12,
10
+ }
11
+ unit: [paragraph]
12
+ mechanical:
13
+ regex: "(?<![\"“‘'])\\bnot (?:just|only|merely) (?:a |an |the |about )?[\\w-]+(?: [\\w-]+){0,4}[,;]? but\\b|(?<![\"“‘'])\\b(?:it|this|that)(?:['’]s| is)(?: not|n['’]t) (?:just |only )?(?:about )?[^.!?,;]{1,40}[.,;] (?:it|this|that)(?:['’]s| is)\\b"
14
+ flags: giu
15
+ severity: minor
16
+ fix:
17
+ hint: >-
18
+ Say the positive thing. "It's not a tool, it's a workflow" becomes "It's a workflow."
19
+ preconditions: { notInCode: true }
20
+ status: active
21
+ handWritten: [mechanical, fix, preconditions]
@@ -1,4 +1,5 @@
1
- # Ported from mblode/agent-skills skills/docs-writing/rules/format-descriptive-links.md and taste-training
1
+ # Ported from mblode/agent-skills skills/docs-writing/rules/format-descriptive-links.md, now
2
+ # skills/ghostwriter/references/docs.md after docs-writing was retired. and taste-training
2
3
  # full-stack-audit.tsx (click-here).
3
4
  id: copywriting-click-here-links
4
5
  title: Link text that names nothing
@@ -6,8 +7,8 @@ categoryId: actionable-cta
6
7
  source:
7
8
  {
8
9
  repo: mblode/agent-skills,
9
- path: skills/docs-writing/rules/format-descriptive-links.md,
10
- line: 7,
10
+ path: skills/ghostwriter/references/docs.md,
11
+ line: 21,
11
12
  }
12
13
  unit: [jsx-text]
13
14
  mechanical:
@@ -3,8 +3,8 @@ title: An instruction hides its prerequisite after the action
3
3
  categoryId: page-structure
4
4
  source:
5
5
  repo: mblode/agent-skills
6
- path: skills/docs-writing/rules/structure-conditions-first.md
7
- line: 7
6
+ path: skills/ghostwriter/references/docs.md
7
+ line: 15
8
8
  ruleId: structure-conditions-first
9
9
  unit:
10
10
  - paragraph
@@ -0,0 +1,21 @@
1
+ # Hand-cut from mblode/agent-skills skills/ghostwriter/references/tells.md (structure tells).
2
+ id: copywriting-copula-avoidance
3
+ title: Dresses up "is" or "has"
4
+ categoryId: machine-prose
5
+ source:
6
+ {
7
+ repo: mblode/agent-skills,
8
+ path: skills/ghostwriter/references/tells.md,
9
+ line: 13,
10
+ }
11
+ unit: [paragraph]
12
+ mechanical:
13
+ regex: "(?<![\"“‘'])\\b(?:serves|stands) as (?:a|an|the)\\b|(?<![\"“‘'])\\bboasts\\b"
14
+ flags: giu
15
+ severity: minor
16
+ fix:
17
+ hint: >-
18
+ Write "is" or "has". "The index serves as a cache" becomes "The index is a cache."
19
+ preconditions: { notInCode: true }
20
+ status: review-only
21
+ handWritten: [mechanical, fix, preconditions]
@@ -3,8 +3,8 @@ title: An error explanation provides no recovery guidance
3
3
  categoryId: reference-reading
4
4
  source:
5
5
  repo: mblode/agent-skills
6
- path: skills/docs-writing/rules/code-error-descriptions.md
7
- line: 7
6
+ path: skills/ghostwriter/references/docs.md
7
+ line: 19
8
8
  ruleId: code-error-descriptions
9
9
  unit:
10
10
  - paragraph
@@ -1,4 +1,5 @@
1
- # Ported from mblode/agent-skills skills/docs-writing/rules/clarity-defaults.md (cut filler) and the lesson
1
+ # Ported from mblode/agent-skills skills/docs-writing/rules/clarity-defaults.md, now
2
+ # skills/ghostwriter/references/docs.md after docs-writing was retired. (cut filler) and the lesson
2
3
  # edit-one-lens-at-a-time.mdx.
3
4
  id: copywriting-filler-words
4
5
  title: Intensifiers and filler that add nothing
@@ -6,8 +7,8 @@ categoryId: machine-prose
6
7
  source:
7
8
  {
8
9
  repo: mblode/agent-skills,
9
- path: skills/docs-writing/rules/clarity-defaults.md,
10
- line: 12,
10
+ path: skills/ghostwriter/references/docs.md,
11
+ line: 17,
11
12
  }
12
13
  unit: [paragraph, jsx-text]
13
14
  mechanical:
@@ -1,12 +1,14 @@
1
- # Ported from mblode/agent-skills skills/docs-writing/rules/clarity-no-latin.md.
1
+ # Ported from mblode/agent-skills skills/docs-writing/rules/clarity-no-latin.md, now
2
+ # skills/ghostwriter/references/docs.md after docs-writing was retired. Review-only:
3
+ # ghostwriter keeps "plain words" but no longer bans Latin abbreviations outright.
2
4
  id: copywriting-latinisms
3
5
  title: Latin abbreviation in running text
4
6
  categoryId: reader-first-framing
5
7
  source:
6
8
  {
7
9
  repo: mblode/agent-skills,
8
- path: skills/docs-writing/rules/clarity-no-latin.md,
9
- line: 7,
10
+ path: skills/ghostwriter/references/docs.md,
11
+ line: 17,
10
12
  }
11
13
  unit: [paragraph, heading]
12
14
  mechanical:
@@ -21,5 +23,5 @@ preconditions:
21
23
  docType:
22
24
  [tutorial, howto, reference, explanation, agent-instructions, lesson],
23
25
  }
24
- status: active
26
+ status: review-only
25
27
  handWritten: [mechanical, fix, preconditions]
@@ -1,12 +1,13 @@
1
- # Ported from mblode/agent-skills skills/docs-writing/rules/clarity-no-nominalizations.md.
1
+ # Ported from mblode/agent-skills skills/docs-writing/rules/clarity-no-nominalizations.md, now
2
+ # skills/ghostwriter/references/docs.md after docs-writing was retired.
2
3
  id: copywriting-nominalisations
3
4
  title: Verb buried in a noun
4
5
  categoryId: reader-first-framing
5
6
  source:
6
7
  {
7
8
  repo: mblode/agent-skills,
8
- path: skills/docs-writing/rules/clarity-no-nominalizations.md,
9
- line: 7,
9
+ path: skills/ghostwriter/references/docs.md,
10
+ line: 17,
10
11
  }
11
12
  unit: [paragraph, jsx-text]
12
13
  mechanical:
@@ -0,0 +1,21 @@
1
+ # Hand-cut from mblode/agent-skills skills/ghostwriter/references/tells.md (structure tells).
2
+ id: copywriting-participle-tail
3
+ title: Sentence ends in a participle tail
4
+ categoryId: machine-prose
5
+ source:
6
+ {
7
+ repo: mblode/agent-skills,
8
+ path: skills/ghostwriter/references/tells.md,
9
+ line: 16,
10
+ }
11
+ unit: [paragraph]
12
+ mechanical:
13
+ regex: "(?<![\"“‘']),\\s+(?:ensuring|highlighting|underscoring|showcasing|emphasi[sz]ing|reinforcing|cementing|solidifying|fostering|signall?ing)\\b"
14
+ flags: giu
15
+ severity: minor
16
+ fix:
17
+ hint: >-
18
+ Keep the fact and cut at the comma. "Tests run on every push, ensuring quality" becomes "Tests run on every push."
19
+ preconditions: { notInCode: true }
20
+ status: active
21
+ handWritten: [mechanical, fix, preconditions]
@@ -1,12 +1,13 @@
1
- # Ported from mblode/agent-skills skills/docs-writing/rules/voice-defaults.md (active voice, present tense).
1
+ # Ported from mblode/agent-skills skills/docs-writing/rules/voice-defaults.md, now
2
+ # skills/ghostwriter/references/docs.md after docs-writing was retired. (active voice, present tense).
2
3
  id: copywriting-passive-voice
3
4
  title: Passive voice where the actor is known
4
5
  categoryId: machine-prose
5
6
  source:
6
7
  {
7
8
  repo: mblode/agent-skills,
8
- path: skills/docs-writing/rules/voice-defaults.md,
9
- line: 11,
9
+ path: skills/ghostwriter/references/docs.md,
10
+ line: 13,
10
11
  }
11
12
  unit: [paragraph, heading]
12
13
  mechanical:
@@ -1,12 +1,13 @@
1
- # Ported from mblode/agent-skills skills/docs-writing/rules/voice-defaults.md (professional, not promotional).
1
+ # Ported from mblode/agent-skills skills/docs-writing/rules/voice-defaults.md, now
2
+ # skills/ghostwriter/references/docs.md after docs-writing was retired. (professional, not promotional).
2
3
  id: copywriting-promotional-docs-voice
3
4
  title: Marketing voice inside documentation
4
5
  categoryId: evidence-over-claims
5
6
  source:
6
7
  {
7
8
  repo: mblode/agent-skills,
8
- path: skills/docs-writing/rules/voice-defaults.md,
9
- line: 14,
9
+ path: skills/ghostwriter/references/docs.md,
10
+ line: 13,
10
11
  }
11
12
  unit: [paragraph, heading]
12
13
  mechanical:
@@ -3,8 +3,8 @@ title: A requirement presented as a recommendation
3
3
  categoryId: reader-first-framing
4
4
  source:
5
5
  repo: mblode/agent-skills
6
- path: skills/docs-writing/rules/voice-requirements-language.md
7
- line: 7
6
+ path: skills/ghostwriter/references/docs.md
7
+ line: 13
8
8
  ruleId: voice-requirements-language
9
9
  unit:
10
10
  - paragraph
@@ -3,8 +3,8 @@ title: A documentation heading names no topic or action
3
3
  categoryId: page-structure
4
4
  source:
5
5
  repo: mblode/agent-skills
6
- path: skills/docs-writing/rules/nav-searchable-headings.md
7
- line: 7
6
+ path: skills/ghostwriter/references/docs.md
7
+ line: 21
8
8
  ruleId: nav-searchable-headings
9
9
  unit:
10
10
  - heading
@@ -0,0 +1,21 @@
1
+ # Hand-cut from mblode/agent-skills skills/ghostwriter/references/tells.md (structure tells).
2
+ id: copywriting-tee-up
3
+ title: Tees up a point instead of stating it
4
+ categoryId: machine-prose
5
+ source:
6
+ {
7
+ repo: mblode/agent-skills,
8
+ path: skills/ghostwriter/references/tells.md,
9
+ line: 15,
10
+ }
11
+ unit: [paragraph]
12
+ mechanical:
13
+ regex: "(?<![\"“‘'])\\bhere['’]s the (?:thing|kicker|catch|deal|twist)\\b|(?<![\"“‘'])\\bthe (?:kicker|catch|twist)\\?|(?<![\"“‘'])\\bwhat struck me (?:was|is)\\b|(?<![\"“‘'])\\blet that sink in\\b"
14
+ flags: giu
15
+ severity: minor
16
+ fix:
17
+ hint: >-
18
+ Delete the tee-up and state the thing.
19
+ preconditions: { notInCode: true }
20
+ status: active
21
+ handWritten: [mechanical, fix, preconditions]
@@ -1,4 +1,5 @@
1
- # Ported from mblode/agent-skills skills/docs-writing/rules/hygiene-no-temporal.md and
1
+ # Ported from mblode/agent-skills skills/docs-writing/rules/hygiene-no-temporal.md, now
2
+ # skills/ghostwriter/references/docs.md after docs-writing was retired. and
2
3
  # rules/hygiene-update-metadata.md.
3
4
  id: copywriting-temporal-words
4
5
  title: Wording anchored to the time of writing
@@ -6,8 +7,8 @@ categoryId: reference-reading
6
7
  source:
7
8
  {
8
9
  repo: mblode/agent-skills,
9
- path: skills/docs-writing/rules/hygiene-no-temporal.md,
10
- line: 7,
10
+ path: skills/ghostwriter/references/docs.md,
11
+ line: 23,
11
12
  }
12
13
  unit: [paragraph, heading]
13
14
  mechanical:
@@ -0,0 +1,28 @@
1
+ # Hand-cut from mblode/agent-skills skills/ui-design/direction/aesthetic-direction.md (slop signals).
2
+ id: craft-atmosphere-gradient
3
+ title: Purple or cyan gradient used as atmosphere
4
+ categoryId: generic-decoration
5
+ source:
6
+ {
7
+ repo: mblode/agent-skills,
8
+ path: skills/ui-design/direction/aesthetic-direction.md,
9
+ line: 12,
10
+ }
11
+ scope:
12
+ include: ["**/*.tsx", "**/*.jsx"]
13
+ unit: [source]
14
+ mechanical:
15
+ regex: "\\bbg-(?:gradient-to|linear-to|radial)-?[\\w-]*[^\"'`\\n]*?\\b(?:from|via|to)-(?:purple|violet|fuchsia|indigo|cyan)-\\d{2,3}\\b|\\b(?:from|via)-(?:purple|violet|fuchsia|indigo|cyan)-\\d{2,3}\\b[^\"'`\\n]*?\\bbg-(?:gradient-to|linear-to|radial)"
16
+ flags: gu
17
+ severity: minor
18
+ fix:
19
+ hint: >-
20
+ Give the surface a content or brand role, or remove the gradient. Purple and cyan washes are the most common AI-generated backdrop.
21
+ status: review-only
22
+ review:
23
+ applicability: A class list pairs a gradient background with purple, violet, fuchsia, indigo or cyan stops.
24
+ exceptions: Brand colours, data visualisation ramps, and illustrations where the gradient carries meaning.
25
+ evidence: The brand palette and what the gradient surface contains.
26
+ verification: Confirm the gradient carries a brand or content role, or replace it with a flat surface from the theme.
27
+ sourceHash: 696321dfa9cb90a6d31bba628bba33aecf23ff4aaadd3516ca2a2eea4e6219e1
28
+ handWritten: [mechanical, fix, review, scope]
@@ -0,0 +1,28 @@
1
+ # Hand-cut from mblode/agent-skills skills/ui-design/guidelines/colors.md.
2
+ id: craft-default-indigo
3
+ title: Indigo accent that looks like a template default
4
+ categoryId: colour-system
5
+ source:
6
+ {
7
+ repo: mblode/agent-skills,
8
+ path: skills/ui-design/guidelines/colors.md,
9
+ line: 5,
10
+ }
11
+ scope:
12
+ include: ["**/*.tsx", "**/*.jsx", "**/*.css"]
13
+ unit: [source]
14
+ mechanical:
15
+ regex: "\\b(?:bg|text|border|ring|from|via|to|fill|stroke|outline|accent|shadow|decoration)-indigo-\\d{2,3}\\b"
16
+ flags: gu
17
+ severity: minor
18
+ fix:
19
+ hint: >-
20
+ Pick an accent from the brand, or use the theme's primary token. Indigo is the colour every starter template ships with.
21
+ status: review-only
22
+ review:
23
+ applicability: Components use Tailwind indigo classes as the accent colour.
24
+ exceptions: A brand that is indigo, or a project whose theme already standardises on indigo.
25
+ evidence: The brand colour in the theme or design tokens, and how many components use indigo.
26
+ verification: Confirm indigo is the brand choice, or replace it with the theme's primary token.
27
+ sourceHash: cdd85836ef30c0827d41e0a07ed549a3b5a3d120b6f1aa39cf259aff87a8d0e8
28
+ handWritten: [mechanical, fix, review, scope]
@@ -0,0 +1,28 @@
1
+ # Hand-cut from mblode/agent-skills skills/ui-animation/references/performance-deep-dive.md.
2
+ id: motion-will-change-misuse
3
+ title: will-change promotes a property the compositor cannot animate
4
+ categoryId: motion-restraint
5
+ source:
6
+ {
7
+ repo: mblode/agent-skills,
8
+ path: skills/ui-animation/references/performance-deep-dive.md,
9
+ line: 161,
10
+ }
11
+ scope:
12
+ include: ["**/*.css", "**/*.scss", "**/*.tsx", "**/*.jsx"]
13
+ unit: [source]
14
+ mechanical:
15
+ regex: "will-change\\s*:\\s*[\"'`]?(?!\\s*(?:transform|opacity|auto)\\s*[\"'`]?\\s*[;},!])[a-z-]+|\\bwill-change-(?:scroll|contents|\\[(?!transform|opacity)[^\\]]+\\])"
16
+ flags: giu
17
+ severity: minor
18
+ fix:
19
+ hint: >-
20
+ Promote only transform or opacity, and only while the motion runs. Each promoted layer costs compositor memory.
21
+ status: review-only
22
+ review:
23
+ applicability: A stylesheet or class list sets will-change to a property other than transform or opacity.
24
+ exceptions: Measured scroll-performance fixes with a comment explaining the choice.
25
+ evidence: The declaration, the element it applies to, and whether it is toggled around the animation.
26
+ verification: Restrict will-change to transform or opacity and set it only during the animation.
27
+ sourceHash: f3f43c733bac58c4e64f13c769f7a360c39c0d446c886f79d929e76ae8b5fdfc
28
+ handWritten: [mechanical, fix, review, scope]
@@ -29,4 +29,4 @@ review:
29
29
  exceptions: JSX nesting alone does not prove simultaneous visibility; mutually exclusive steps and nonmodal surfaces are exceptions.
30
30
  evidence: Both open-state transitions, modal primitive implementations, and focus and Escape behavior.
31
31
  verification: Open the second step using the keyboard; confirm one modal owns focus and Escape closes the intended surface.
32
- sourceHash: e575cc8c2c06ae38542bd068a9f4d1871714391c543b5caf0dbb8ae1847a2f77
32
+ sourceHash: 9aab069ba1b93ab405a9741cd6d1e026eb08442ff881587b4f84a612653a2fbb
@@ -27,4 +27,4 @@ review:
27
27
  exceptions: Dynamically loaded options, dependent choices, or a documented platform constraint can require a select.
28
28
  evidence: The complete option source, dynamic branches, and the task requiring comparison.
29
29
  verification: Confirm all choices remain available and selection, keyboard input, and form submission work.
30
- sourceHash: e575cc8c2c06ae38542bd068a9f4d1871714391c543b5caf0dbb8ae1847a2f77
30
+ sourceHash: 9aab069ba1b93ab405a9741cd6d1e026eb08442ff881587b4f84a612653a2fbb
@@ -70,8 +70,7 @@
70
70
  "attr-string",
71
71
  "class-list",
72
72
  "element",
73
- "source",
74
- "audit"
73
+ "source"
75
74
  ]
76
75
  }
77
76
  },
@@ -200,9 +199,6 @@
200
199
  "readme",
201
200
  "skill",
202
201
  "plan",
203
- "personal",
204
- "pr",
205
- "slides",
206
202
  "unknown"
207
203
  ]
208
204
  }
@@ -30,7 +30,6 @@ preconditions:
30
30
  ui,
31
31
  unknown,
32
32
  readme,
33
- personal,
34
33
  ]
35
34
  smartQuotesAtBuild: false
36
35
  status: active