Skip to content

Commit 9b31170

Browse files
chore(agents): load skills from .agents/skills natively (#231)
* chore(agents): load skills from .agents/skills natively Drop redundant .cursor/skills mirrors, stop agents init from copying them, and add always-on unslop. * docs(agents): stop saying Cursor mirrors skills
1 parent 1af65e2 commit 9b31170

44 files changed

Lines changed: 151 additions & 104 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.agents/README.md‎

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
# `.agents/` — rules & skills
22

3-
Source of truth for AI agent configuration. Cursor consumes via symlinks in `.cursor/rules/` and `.cursor/skills/`.
3+
Source of truth for AI agent configuration. Cursor loads skills from `.agents/skills/` natively and rules via `.cursor/rules/*.mdc` → `.agents/rules/*.md` symlinks.
44

55
## Start here
66

7-
| Question | Read |
8-
| --------------------------------- | --------------------------------------------------------------------- |
9-
| Repo-root stub (cross-tool) | [`AGENTS.md`](../AGENTS.md) |
10-
| Where files live, symlinks | [rules/agents-first-convention.md](rules/agents-first-convention.md) |
11-
| Tier 1 / 2 / 3 attachment modes | [rules/agents-tier-system.md](rules/agents-tier-system.md) |
12-
| Codemap tier/pairing deltas | [skills/writing-agents-config](skills/writing-agents-config/SKILL.md) |
13-
| Authoring new rules/skills (meta) | [`writing-great-skills`](skills/writing-great-skills/SKILL.md) |
14-
| Past corrections | [`lessons.md`](lessons.md) |
15-
| What exists on disk right now | `ls .agents/rules` · `ls .agents/skills` |
7+
| Question | Read |
8+
| -------------------------------------- | --------------------------------------------------------------------- |
9+
| Repo-root stub (cross-tool) | [`AGENTS.md`](../AGENTS.md) |
10+
| Where files live, rule `.mdc` symlinks | [rules/agents-first-convention.md](rules/agents-first-convention.md) |
11+
| Tier 1 / 2 / 3 attachment modes | [rules/agents-tier-system.md](rules/agents-tier-system.md) |
12+
| Codemap tier/pairing deltas | [skills/writing-agents-config](skills/writing-agents-config/SKILL.md) |
13+
| Authoring new rules/skills (meta) | [`writing-great-skills`](skills/writing-great-skills/SKILL.md) |
14+
| Unslop (always-on) | [`unslop`](skills/unslop/SKILL.md) |
15+
| Past corrections | [`lessons.md`](lessons.md) |
16+
| What exists on disk right now | `ls .agents/rules` · `ls .agents/skills` |
1617

1718
## Tier legend (summary)
1819

@@ -37,6 +38,6 @@ Discover on disk via `ls` + the frontmatter audit in [`agents-tier-system`](rule
3738
```text
3839
.agents/
3940
rules/<name>.md → .cursor/rules/<name>.mdc (symlink)
40-
skills/<name>/SKILL.md → .cursor/skills/<name> (symlink)
41+
skills/<name>/SKILL.md → Cursor reads in place
4142
lessons.md → .cursor/rules/lessons.mdc (symlink)
4243
```

‎.agents/rules/agents-first-convention.md‎

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
description: When creating or moving rules/skills, always store the source file in .agents/ and symlink from .cursor/
2+
description: When creating or moving rules/skills, store the source in .agents/. Rules need a .cursor/rules .mdc symlink. Skills do not — Cursor reads .agents/skills/ natively.
33
alwaysApply: true
44
---
55

@@ -20,24 +20,19 @@ When creating **any** new rule or skill, follow this convention:
2020

2121
## Skills (`SKILL.md` files)
2222

23-
1. Create the directory and file in `.agents/skills/<name>/SKILL.md`
24-
2. Create a symlink in `.cursor/skills/`:
25-
26-
```bash
27-
ln -s ../../.agents/skills/<name> .cursor/skills/<name>
28-
```
23+
Create `.agents/skills/<name>/SKILL.md` only — never start in `.cursor/skills/`. Cursor loads `.agents/skills/` natively. Do **not** symlink into `.cursor/skills/` (double-registers). If `/create-skill` writes there, move the folder to `.agents/skills/` and delete the `.cursor/` copy.
2924

3025
**Never** name bulk reference files `AGENTS.md` inside skill folders — use `FULL-GUIDE.md` or topic siblings.
3126

3227
## Why
3328

3429
- `.agents/` is the **source of truth** — it is IDE-agnostic and works across different AI coding tools.
35-
- `.cursor/` only contains **symlinks** pointing back to `.agents/`.
30+
- `.cursor/rules/` contains **`.mdc` symlinks** pointing back to `.agents/rules/`. Skills are not mirrored there.
3631
- This keeps configuration portable and avoids duplication.
3732

3833
## Never
3934

40-
- Never place original rule/skill content directly in `.cursor/rules/` or `.cursor/skills/`.
41-
- Never create a rule or skill without both the `.agents/` file and the `.cursor/` symlink.
35+
- Never place original rule content directly in `.cursor/rules/`.
36+
- Never create a rule without both the `.agents/` file and the `.cursor/rules/<name>.mdc` symlink. Skills need `.agents/` source only.
4237

4338
Related: [`agents-tier-system.md`](./agents-tier-system.md) · [`AGENTS.md`](../../AGENTS.md).

‎.agents/rules/agents-tier-system.md‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ globs:
44
- ".agents/rules/**"
55
- ".agents/skills/**"
66
- ".cursor/rules/**"
7-
- ".cursor/skills/**"
87
alwaysApply: false
98
---
109

@@ -20,7 +19,7 @@ for f in .agents/rules/*.md .agents/lessons.md; do
2019
done
2120
```
2221

23-
**When authoring:** pick tier before writing; pair fat rules with skills; symlinks per [`agents-first-convention`](./agents-first-convention.md). Default to intent-triggered skills and a thin always-on set.
22+
**When authoring:** pick tier before writing; pair fat rules with skills; layout per [`agents-first-convention`](./agents-first-convention.md). Default to intent-triggered skills and a thin always-on set.
2423

2524
## Reference
2625

‎.agents/rules/authoring-discipline.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ User-requested **doc audits** may slim redundant markdown; preservation above ap
2222
- **JSDoc as types (`.mjs`, `@ts-check`):** `@typedef`, `@param`, `@returns`, inline `@type` are the type system — keep them; apply the decision test only to prose in those blocks.
2323
- **End-of-turn:** cut duplicate tables/narration; after doc slim → [`docs-governance`](../skills/docs-governance/SKILL.md) slimming audit.
2424

25-
Related: [`concise-reporting`](./concise-reporting.md) · [`docs-lifecycle-sweep`](../skills/docs-lifecycle-sweep/SKILL.md).
25+
Related: [`concise-reporting`](./concise-reporting.md) · [`docs-lifecycle-sweep`](../skills/docs-lifecycle-sweep/SKILL.md) · [`unslop`](../skills/unslop/SKILL.md).

‎.agents/rules/unslop.md‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
description: Cut AI tells from any writing. Must always apply.
3+
alwaysApply: true
4+
---
5+
6+
# Unslop (STOP)
7+
8+
Before sending a reply or committing prose, **read [`unslop`](../skills/unslop/SKILL.md)** and apply it.
9+
10+
Scan for AI patterns, rewrite in human voice, self-audit remaining tells. Depth lives in the skill, not here.
11+
12+
Related: [`authoring-discipline`](./authoring-discipline.md) · [`concise-reporting`](./concise-reporting.md).

‎.agents/skills/agents-tier-system/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Always-on priming: [`.agents/rules/agents-tier-system.md`](../../rules/agents-ti
2727
1. **Decide the tier** before writing.
2828
2. **Tier 1 needs justification** — every turn? If file/intent scoped, demote to Tier 2 or Tier 3.
2929
3. **Tier 2 globs** — broadest meaningful scope; pair with skill when applicable.
30-
4. **Source + symlink** per [`agents-first-convention`](../../rules/agents-first-convention.md).
30+
4. **Layout** per [`agents-first-convention`](../../rules/agents-first-convention.md) — rules: source + `.mdc` symlink; skills: `.agents/` only.
3131

3232
### Adding a new skill
3333

‎.agents/skills/authoring-discipline/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ Always-on priming: [`.agents/rules/authoring-discipline.md`](../../rules/authori
1010

1111
Full checklists and examples: [`PROSE.md`](./PROSE.md).
1212

13-
Related: [`docs-governance`](../docs-governance/SKILL.md), [`docs-lifecycle-sweep`](../docs-lifecycle-sweep/SKILL.md), [`writing-great-skills`](../writing-great-skills/SKILL.md).
13+
Related: [`docs-governance`](../docs-governance/SKILL.md), [`docs-lifecycle-sweep`](../docs-lifecycle-sweep/SKILL.md), [`writing-great-skills`](../writing-great-skills/SKILL.md), [`unslop`](../unslop/SKILL.md).

‎.agents/skills/docs-governance/LIFECYCLE.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Every doc in this repo lives in one of **two surface tiers** (codemap is small e
99
| Tier | Substrate | Examples today | Governance shape |
1010
| ------------------------------------ | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1111
| **Tier B** — repo-wide cross-cutting | `docs/` at repo root | `docs/architecture.md`, `docs/glossary.md`, `docs/roadmap.md`, `docs/plans/`, `docs/research/`, `docs/agents.md`, `docs/benchmark.md`, `docs/golden-queries.md`, `docs/packaging.md`, `docs/why-codemap.md` | Single `docs/README.md` carrying the **canonical numbered Rules** + ownership table + lifecycle prescription; cross-cutting reference docs at the root; `plans/`, `research/`, and (when needed) `audits/` substrate folders |
12-
| **Tier 0** — per-tooling-area | `.agents/`, `.cursor/`, `scripts/` | `.agents/rules/`, `.agents/skills/`, `.cursor/rules/` (symlinks), `.cursor/skills/` (symlinks), `templates/agents/` (bundled for `codemap agents init`) | Implicit governance via [`agents-first-convention`](../../rules/agents-first-convention.md) + [`agents-tier-system`](../../rules/agents-tier-system.md); no per-area `README.md` needed; the rules + skills are themselves the docs and earn their place per § 2 below |
12+
| **Tier 0** — per-tooling-area | `.agents/`, `.cursor/`, `scripts/` | `.agents/rules/`, `.agents/skills/`, `.cursor/rules/` (`.mdc` symlinks), `templates/agents/` (bundled for `codemap agents init`) | Implicit governance via [`agents-first-convention`](../../rules/agents-first-convention.md) + [`agents-tier-system`](../../rules/agents-tier-system.md); no per-area `README.md` needed; the rules + skills are themselves the docs and earn their place per § 2 below |
1313

1414
The same shared spine applies to both. The differences are what subset each tier needs.
1515

@@ -177,7 +177,7 @@ When present, the repo-root `docs/README.md` documents:
177177

178178
`.agents/`, `.cursor/`, `scripts/`, `templates/agents/` — no per-area `README.md` needed (with the exception of `templates/agents/README.md`, which exists because the bundled templates ship to npm consumers and the README explains the consumer-vs-maintainer distinction). Governance lives in the rules + skills themselves:
179179

180-
- File-layout discipline → [`agents-first-convention`](../../rules/agents-first-convention.md) (`.agents/` is source of truth; `.cursor/` is symlinks)
180+
- File-layout discipline → [`agents-first-convention`](../../rules/agents-first-convention.md) (`.agents/` is source of truth; rules also get `.cursor/rules/*.mdc` symlinks)
181181
- Tier system for rules → [`agents-tier-system`](../../rules/agents-tier-system.md)
182182

183183
These rules are themselves docs; they're governed by their own existence test (do they earn their place per § 2?).
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
source: https://github.com/cursor/plugins
2+
path: pstack/skills/unslop
3+
fetched: 2026-08-19

‎.agents/skills/unslop/SKILL.md‎

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
---
2+
name: unslop
3+
description: Cut AI tells from any writing. Must always apply.
4+
---
5+
6+
# Unslop
7+
8+
Edit text to remove AI patterns and add human voice.
9+
10+
## Process
11+
12+
1. Scan for the patterns below.
13+
2. Rewrite. Preserve meaning, match intended tone.
14+
3. Add soul (see next section).
15+
4. Self-audit: "What makes this obviously AI generated?" Fix remaining tells.
16+
17+
## Adding soul
18+
19+
Removing patterns is half the job. Sterile, voiceless writing is just as obvious.
20+
21+
- **Have opinions.** React to facts instead of neutrally listing pros and cons.
22+
- **Vary rhythm.** Short sentences. Then longer ones that take their time. Mix it up.
23+
- **Acknowledge complexity.** "Impressive but also kind of unsettling" beats "impressive."
24+
- **Use "I" when it fits.** First person isn't unprofessional.
25+
- **Let some mess in.** Perfect structure looks machine-made.
26+
- **Be specific.** Not "this is concerning" but "there's something unsettling about agents churning away at 3am."
27+
28+
## Patterns to detect and fix
29+
30+
### Content
31+
32+
1. **Puffery.** "pivotal moment", "testament to", "evolving landscape", "setting the stage for", "indelible mark", "deeply rooted". Cut puffery, state what happened.
33+
2. **Name-dropping.** Listing media outlets without context. Pick one, say what was said.
34+
3. **Superficial -ing phrases.** "highlighting...", "ensuring...", "reflecting...", "showcasing...", "fostering...". Delete or expand with real sources.
35+
4. **Promotional language.** "nestled", "vibrant", "breathtaking", "groundbreaking", "renowned", "stunning", "must-visit". Use neutral descriptions.
36+
5. **Vague attributions.** "Experts believe", "Industry reports suggest", "Some critics argue". Name the source or delete.
37+
6. **Formulaic challenges.** "Despite challenges... continues to thrive." Replace with specific facts.
38+
39+
### Language
40+
41+
7. **AI vocabulary.** Additionally, crucial, delve, enduring, enhance, fostering, garner, interplay, intricate, landscape (abstract), pivotal, showcase, tapestry (abstract), testament, underscore, vibrant. Replace with plain words.
42+
8. **Fancy ways to say "is".** "serves as", "stands as", "boasts", "features". Just say "is" or "has".
43+
9. **"Not just X, but Y."** State the point directly instead.
44+
10. **Rule of three.** Forcing ideas into groups of three. Use the natural number.
45+
11. **Synonym cycling.** Protagonist, main character, central figure, hero all in one paragraph. Pick one, repeat it.
46+
12. **False ranges.** "from X to Y" where X and Y aren't on a meaningful scale. List topics directly.
47+
48+
### Style
49+
50+
13. **Em dash overuse.** Avoid em dashes entirely. Use periods or commas only (no parentheses, no en dashes, no hyphen-as-dash substitutes). Em dashes are an AI tell, and reaching for parentheses instead just trades one tell for another. If a thought needs separation, end the sentence or use a comma.
51+
14. **Colon overuse.** Colons are fine before a list or example. Not as mid-sentence connectors. "If you're coming from traditional automation: instead of registering event handlers, you describe conditions" adds nothing with the colon. Rewrite to let the point stand on its own without comparison framing. "Describing when the scheduler should fire works best as plain English." Same meaning, no crutch punctuation.
52+
15. **Boldface overuse.** Don't bold every proper noun or acronym.
53+
16. **Inline-header lists.** The tell is a bold label and colon that restates the line: "**Performance:** Performance improved...". Convert those to prose. A bold lead-in that ends in a period, names the item, and is followed by genuinely new detail ("**Schema in TypeScript.** Tables live in one file.") is fine, not a tell.
54+
17. **Title case headings.** Use sentence case.
55+
18. **Decorative emojis.** Remove from headings and bullets.
56+
19. **Curly quotes.** Replace with straight quotes.
57+
58+
### Communication artifacts
59+
60+
20. **Chatbot phrases.** "I hope this helps!", "Let me know if...", "Of course!", "Certainly!", "Found the smoking gun!" Remove.
61+
21. **Cutoff disclaimers.** "While specific details are limited..." Find sources or remove.
62+
22. **Sycophantic tone.** "Great question! You're absolutely right!" Respond directly.
63+
64+
### Filler
65+
66+
23. **Filler phrases.** "In order to" becomes "To". "Due to the fact that" becomes "Because". "It is important to note that" gets deleted.
67+
24. **Excessive hedging.** "could potentially possibly be argued that it might" becomes "may".
68+
25. **Generic conclusions.** "The future looks bright." State specific plans or facts.
69+
70+
### Jargon
71+
72+
26. **Abstract metaphor nouns.** Substrate, wedge, vector, locus, vantage, nexus, primitive (as noun), harness (as metaphor), surface (as in "API surface"), bedrock, scaffolding (as metaphor), modality, paradigm, gold-plating, ratchet (as metaphor), evacuate (for moving code), endgame, north star, flywheel. These read as technical but usually have a plainer concrete word. "Substrate" becomes "base". "Wedge in" becomes "add". "Vector" becomes "way" or "method". "Gold-plating" becomes "more than the job needs". "Ratchet" becomes the mechanism's real name or "a limit that only tightens". "Evacuate" becomes "move out". "Endgame" becomes "the last phase". Pick the concrete word.
73+
74+
### Plain speech
75+
76+
27. **Say what it does, not how it feels.** "the database stays close at hand", "SQL you can read", "types that follow your schema" name a feeling. The fix names the mechanism or a number: "`.toSQL()` returns the exact string sent to the database", "a column rename fails the build". Ask what the sentence tells the reader to do or know, then write that. If you can't restate it as a concrete instruction, fact, or number, cut it. One more check: if the sentence could appear unchanged in another project's docs, it says nothing about this one. Cut it.
77+
28. **Shorten or split dense sentences.** If the reader has to backtrack to parse a sentence, break it in two or drop clauses. One idea per sentence.
78+
29. **Active voice.** Prefer it. Catch "is/are/was/were + past participle" and name the actor: "queries are validated" becomes "the compiler validates queries", "the file is parsed by the loader" becomes "the loader parses the file". Passive is fine only when the actor is unknown or genuinely doesn't matter.
79+
30. **Cut adverbs, or use a stronger verb.** "runs quickly" becomes "is fast" or the number. "significantly improves" becomes the measured delta. An adverb propping up a weak verb means the verb is wrong.
80+
31. **Prefer the plain word.** "utilize" becomes "use", "leverage" becomes "use", "facilitate" becomes "help", "numerous" becomes "many", "in the event that" becomes "if". The fancier synonym is rarely clearer.

0 commit comments

Comments
 (0)