@iceinvein/agent-skills 0.1.37 → 0.1.39
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.
- package/package.json +1 -1
- package/skills/bounded-context-auditor/SKILL.md +15 -3
- package/skills/bounded-context-auditor/skill.json +1 -1
- package/skills/codebase-architecture/SKILL.md +4 -4
- package/skills/codebase-architecture/skill.json +1 -1
- package/skills/cognitive-load-auditor/SKILL.md +11 -9
- package/skills/cognitive-load-auditor/skill.json +1 -1
- package/skills/cohesion-analyzer/SKILL.md +1 -1
- package/skills/cohesion-analyzer/skill.json +1 -1
- package/skills/composability-auditor/SKILL.md +5 -5
- package/skills/composability-auditor/skill.json +1 -1
- package/skills/contract-enforcer/SKILL.md +5 -5
- package/skills/contract-enforcer/skill.json +1 -1
- package/skills/coupling-auditor/SKILL.md +2 -2
- package/skills/coupling-auditor/skill.json +1 -1
- package/skills/cover-letter/SKILL.md +18 -20
- package/skills/cover-letter/skill.json +7 -2
- package/skills/cover-letter-audit/SKILL.md +20 -20
- package/skills/cover-letter-audit/skill.json +7 -2
- package/skills/cover-letter-persona/SKILL.md +13 -13
- package/skills/cover-letter-persona/skill.json +7 -2
- package/skills/cover-letter-rewrite/SKILL.md +18 -16
- package/skills/cover-letter-rewrite/skill.json +7 -2
- package/skills/cover-letter-write/SKILL.md +25 -20
- package/skills/cover-letter-write/skill.json +7 -2
- package/skills/cqs-auditor/SKILL.md +19 -47
- package/skills/cqs-auditor/skill.json +1 -1
- package/skills/demeter-enforcer/SKILL.md +5 -5
- package/skills/demeter-enforcer/skill.json +1 -1
- package/skills/dependency-direction-auditor/SKILL.md +1 -1
- package/skills/dependency-direction-auditor/skill.json +1 -1
- package/skills/design-review/SKILL.md +6 -2
- package/skills/design-review/skill.json +1 -1
- package/skills/error-strategist/SKILL.md +3 -3
- package/skills/error-strategist/skill.json +1 -1
- package/skills/event-design-reviewer/SKILL.md +3 -3
- package/skills/event-design-reviewer/skill.json +1 -1
- package/skills/evolution-analyzer/SKILL.md +4 -3
- package/skills/evolution-analyzer/skill.json +1 -1
- package/skills/gestalt-reviewer/SKILL.md +8 -4
- package/skills/gestalt-reviewer/skill.json +1 -1
- package/skills/idempotency-guardian/SKILL.md +6 -6
- package/skills/idempotency-guardian/skill.json +1 -1
- package/skills/improve-my-codebase/CATALOGUE-FIELDS.md +2 -2
- package/skills/improve-my-codebase/SKILL.md +68 -27
- package/skills/improve-my-codebase/skill.json +1 -1
- package/skills/index.json +33 -33
- package/skills/integration-pattern-auditor/SKILL.md +2 -2
- package/skills/integration-pattern-auditor/skill.json +1 -1
- package/skills/magpie/README.md +3 -5
- package/skills/magpie/SKILL.md +39 -536
- package/skills/magpie/package.json +1 -1
- package/skills/magpie/references/critic.md +58 -0
- package/skills/magpie/references/peer-review.md +84 -0
- package/skills/magpie/references/specialists.md +391 -0
- package/skills/magpie/scripts/__tests__/helper.test.ts +40 -0
- package/skills/magpie/scripts/__tests__/skill-lint.test.ts +116 -28
- package/skills/magpie/scripts/__tests__/status-cmd.test.ts +13 -0
- package/skills/magpie/scripts/helper.js +24 -13
- package/skills/magpie/scripts/status-cmd.ts +10 -1
- package/skills/magpie/skill.json +2 -1
- package/skills/module-secret-auditor/SKILL.md +8 -5
- package/skills/module-secret-auditor/skill.json +1 -1
- package/skills/port-adapter-auditor/SKILL.md +3 -3
- package/skills/port-adapter-auditor/skill.json +1 -1
- package/skills/rams-design-audit/SKILL.md +4 -2
- package/skills/rams-design-audit/skill.json +1 -1
- package/skills/seam-finder/SKILL.md +2 -2
- package/skills/seam-finder/skill.json +1 -1
- package/skills/simplicity-razor/SKILL.md +4 -4
- package/skills/simplicity-razor/skill.json +1 -1
- package/skills/temporal-coupling-detector/SKILL.md +2 -2
- package/skills/temporal-coupling-detector/skill.json +1 -1
- package/skills/terse/SKILL.md +12 -7
- package/skills/terse/skill.json +1 -1
- package/skills/type-driven-designer/SKILL.md +8 -8
- package/skills/type-driven-designer/skill.json +1 -1
- package/skills/unidirectional-flow-enforcer/SKILL.md +2 -2
- package/skills/unidirectional-flow-enforcer/skill.json +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bounded-context-auditor
|
|
3
|
-
description: Use when the same domain term means different things in different parts of the codebase, when a God Model
|
|
3
|
+
description: Use when the same domain term means different things in different parts of the codebase, when a God Model serves multiple subsystems with conflicting needs, or when deciding where service/module boundaries should be. Trigger on "should this be one service or two?", "why does the User class have 40 fields?", or when a change to one feature breaks an unrelated one through a shared model. NOT for code-level coupling within a single context, import direction, or event payload design.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Bounded Context Auditor
|
|
@@ -46,7 +46,13 @@ Language is the first signal that boundaries exist. Look for three patterns:
|
|
|
46
46
|
|
|
47
47
|
### 2. Draw the Context Map
|
|
48
48
|
|
|
49
|
-
For each distinct bounded context discovered, document its position in the system using
|
|
49
|
+
For each distinct bounded context discovered, document its position in the system using the context-mapping relationship types (Evans 2003 plus his later context-mapping set):
|
|
50
|
+
|
|
51
|
+
**Partnership**
|
|
52
|
+
- Two contexts (and teams) succeed or fail together; they plan and release in coordination
|
|
53
|
+
- Example: Ordering and Payments ship a combined checkout initiative; neither can deliver alone
|
|
54
|
+
- Distinct from Shared Kernel: the teams coordinate closely but each still owns its own model
|
|
55
|
+
- Risk: coordination cost; use when the mutual dependency is real, not just convenient
|
|
50
56
|
|
|
51
57
|
**Shared Kernel**
|
|
52
58
|
- Two contexts own the same model together; changes require coordination
|
|
@@ -70,7 +76,7 @@ For each distinct bounded context discovered, document its position in the syste
|
|
|
70
76
|
- Downstream translates upstream's model to its own language
|
|
71
77
|
- Example: Fulfillment receives Order from Sales but translates to internal ShippableItem; changes to Order don't touch Fulfillment
|
|
72
78
|
- Goal: isolation. Downstream only knows upstream's public interface, not internals
|
|
73
|
-
-
|
|
79
|
+
- The ACL is owned by and protects the downstream; it may translate in both directions, but its loyalty is to the downstream model
|
|
74
80
|
|
|
75
81
|
**Open Host Service**
|
|
76
82
|
- Upstream publishes a protocol/API specifically for downstreams
|
|
@@ -78,6 +84,12 @@ For each distinct bounded context discovered, document its position in the syste
|
|
|
78
84
|
- Upside: clear contract, versioning, planned deprecation
|
|
79
85
|
- Downside: upstream must maintain backward compatibility
|
|
80
86
|
|
|
87
|
+
**Published Language**
|
|
88
|
+
- Contexts exchange information via a well-documented shared language (schema, standard format), often paired with Open Host Service
|
|
89
|
+
- Example: contexts integrate through a versioned Avro/JSON schema registry rather than each other's internal models
|
|
90
|
+
- Upside: no context exposes internals; evolution is managed at the schema level
|
|
91
|
+
- Risk: the shared language itself needs governance
|
|
92
|
+
|
|
81
93
|
**Separate Ways**
|
|
82
94
|
- No integration between contexts; they genuinely don't interact
|
|
83
95
|
- Example: Marketing analytics and Warehouse inventory have no integration
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bounded-context-auditor",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Evans-inspired bounded context analysis: detect linguistic fractures, draw context maps, identify leaking language and shared model pollution",
|
|
5
5
|
"author": "iceinvein",
|
|
6
6
|
"type": "prompt",
|
|
@@ -18,7 +18,7 @@ Design architecture for new projects or review existing codebases. Covers both m
|
|
|
18
18
|
- "Map the dependencies in this project"
|
|
19
19
|
- Codebase feels tangled, coupled, or inconsistent
|
|
20
20
|
|
|
21
|
-
**Not for:** Reviewing design documents (use `design-
|
|
21
|
+
**Not for:** Reviewing design documents (use `design-review`), bug hunting, performance optimization.
|
|
22
22
|
|
|
23
23
|
## Mode Selection
|
|
24
24
|
|
|
@@ -70,7 +70,7 @@ These drivers determine which patterns are appropriate. A 500-line CLI does not
|
|
|
70
70
|
|
|
71
71
|
### Phase 3: Select Architectural Patterns
|
|
72
72
|
|
|
73
|
-
Using Phase 2 drivers, recommend macro-level patterns from `patterns-reference.md
|
|
73
|
+
Using Phase 2 drivers, recommend macro-level patterns from the patterns reference installed alongside this skill (`patterns-reference.md`; on cursor/gemini installs it is named `codebase-architecture-patterns.*`; on codex installs it is not bundled, so name patterns from general knowledge instead):
|
|
74
74
|
- Overall structure (layered, hexagonal, event-driven, etc.)
|
|
75
75
|
- Communication style (sync, async, event sourcing)
|
|
76
76
|
- Data strategy (single DB, CQRS, shared-nothing)
|
|
@@ -83,7 +83,7 @@ The most important phase:
|
|
|
83
83
|
- Each module gets a clear responsibility (one sentence)
|
|
84
84
|
- Define interfaces between modules
|
|
85
85
|
- **Establish dependency direction** — which modules know about which? Dependencies should point toward stable abstractions, not toward volatile details.
|
|
86
|
-
- **Name the design patterns** that apply within each module (e.g., "plugin system uses Strategy", "event bus uses Observer"). Refer to
|
|
86
|
+
- **Name the design patterns** that apply within each module (e.g., "plugin system uses Strategy", "event bus uses Observer"). Refer to the patterns reference (see Phase 3 for its per-install filename).
|
|
87
87
|
|
|
88
88
|
### Phase 5: Produce Architecture Spec
|
|
89
89
|
|
|
@@ -144,7 +144,7 @@ Save to `docs/architecture/architecture-review-YYYY-MM-DD.md`:
|
|
|
144
144
|
|
|
145
145
|
For each smell or weakness:
|
|
146
146
|
- What to change and why
|
|
147
|
-
- Which pattern to apply (reference
|
|
147
|
+
- Which pattern to apply (from the patterns reference; see Phase 3 for its per-install filename)
|
|
148
148
|
- Impact estimate (how much code changes, risk of breakage)
|
|
149
149
|
- Priority (high / medium / low) with rationale
|
|
150
150
|
|
|
@@ -19,19 +19,19 @@ A UI evaluation framework based on Jeff Johnson's *Designing with the Mind in Mi
|
|
|
19
19
|
- "This is overwhelming" / "Too many choices" / "Where do I start?"
|
|
20
20
|
- Navigation with many paths or deep nesting
|
|
21
21
|
|
|
22
|
-
**Not for:** Visual styling (use
|
|
22
|
+
**Not for:** Visual styling and decoration (use `rams-design-audit`), spacing and visual grouping (use `gestalt-reviewer`), accessibility compliance (WCAG), or performance optimization. The three compose on a full UI review.
|
|
23
23
|
|
|
24
24
|
## The Process
|
|
25
25
|
|
|
26
26
|
### 1. Apply the Cognitive Laws
|
|
27
27
|
|
|
28
28
|
**Miller's Law — Working memory holds 7±2 items (practically 3-4 groups)**
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
29
|
+
- Working memory limits apply to what the user must HOLD IN MIND (items to compare, codes to remember across screens, steps to track), not to what is merely visible: a visible list is externalized and scanned, not memorized (Johnson's own point).
|
|
30
|
+
- Count what the user must actually keep in their head across an interaction; flag flows that require remembering more than 3-4 things (e.g. comparing options that aren't side by side, multi-screen wizards that reference earlier answers).
|
|
31
|
+
- Ungrouped long lists are still a problem, but via scanning cost and decision time (see Hick's Law), not a working-memory violation.
|
|
32
|
+
- Fix: chunk into 3-5 labeled groups so the user scans group labels first, and keep anything that must be remembered visible instead.
|
|
33
33
|
|
|
34
|
-
**Hick's Law — Decision time = b × log₂(n + 1)**
|
|
34
|
+
**Hick's Law — Decision time = a + b × log₂(n + 1)**
|
|
35
35
|
- Count the number of choices the user must evaluate before acting
|
|
36
36
|
- More choices = longer decision time = higher abandonment
|
|
37
37
|
- Fix: reduce visible choices through progressive disclosure, smart defaults, or recommended options
|
|
@@ -93,7 +93,7 @@ Example:
|
|
|
93
93
|
```
|
|
94
94
|
COGNITIVE LOAD: Project settings page
|
|
95
95
|
Items visible: 23 settings in a flat list, no grouping
|
|
96
|
-
Chunking: none — all 23 items presented equally
|
|
96
|
+
Chunking: none — all 23 items presented equally; scanning cost and per-item decisions pile up (Hick's Law)
|
|
97
97
|
Decision points: each setting is an independent choice — 23 decisions on one page
|
|
98
98
|
Memory demands: user must scroll up to see project name while editing deploy settings at bottom
|
|
99
99
|
Primary action: Save button at bottom — not visible without scrolling
|
|
@@ -105,13 +105,15 @@ COGNITIVE LOAD: Project settings page
|
|
|
105
105
|
|
|
106
106
|
Decision engine. After generating UI code, the agent audits its own output for cognitive overload. The report identifies specific violations and concrete fixes. The human sees the audit alongside the component.
|
|
107
107
|
|
|
108
|
+
**Acquiring the UI when auditing something the agent didn't just write:** prefer a rendered view (user screenshot, or a browser/screenshot tool if available); otherwise count items, choices, and flows from the component source and routing, and say the audit ran source-only (item counts and flow steps survive that mode; target sizes and visual salience don't).
|
|
109
|
+
|
|
108
110
|
For complex interfaces where high information density is unavoidable (dashboards, admin panels, IDE-like tools), the agent acknowledges that intrinsic load is high and focuses on eliminating extraneous load rather than demanding everything be simple.
|
|
109
111
|
|
|
110
112
|
## Common Violations
|
|
111
113
|
|
|
112
114
|
| Violation | Law broken | Fix |
|
|
113
115
|
|-----------|-----------|-----|
|
|
114
|
-
| 20+ items in a flat list |
|
|
116
|
+
| 20+ items in a flat list | Hick's Law (scanning/decision cost) | Chunk into 3-5 labeled groups |
|
|
115
117
|
| 10+ navigation items at same level | Hick's Law | Progressive disclosure, group into categories |
|
|
116
118
|
| Small, closely-spaced action buttons | Fitts's Law | Increase size, increase spacing, primary action larger |
|
|
117
119
|
| "Type your account ID" (no autocomplete) | Recognition > recall | Provide selection or autocomplete |
|
|
@@ -137,7 +139,7 @@ For complex interfaces where high information density is unavoidable (dashboards
|
|
|
137
139
|
| Law | Formula/Rule | Practical Implication |
|
|
138
140
|
|-----|-------------|----------------------|
|
|
139
141
|
| **Miller's Law** | Working memory: 7±2 items (practically 3-4 groups) | Chunk information; aim for 3-5 groups per screen |
|
|
140
|
-
| **Hick's Law** | Decision time = b × log₂(n + 1) | Fewer choices → faster decisions. Use defaults. |
|
|
142
|
+
| **Hick's Law** | Decision time = a + b × log₂(n + 1) | Fewer choices → faster decisions. Use defaults. |
|
|
141
143
|
| **Fitts's Law** | Time = a + b × log₂(1 + D/W) | Big close targets for primary actions, small distant for destructive |
|
|
142
144
|
| **Von Restorff Effect** | Distinct items are remembered better | Make the important thing visually different |
|
|
143
145
|
| **Serial Position Effect** | First and last items remembered best | Put critical info at top and bottom, not buried in middle |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cognitive-load-auditor",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Jeff Johnson-inspired cognitive load analysis: evaluate UI against Miller's Law, Hick's Law, Fitts's Law, and working memory limits",
|
|
5
5
|
"author": "iceinvein",
|
|
6
6
|
"type": "prompt",
|
|
@@ -115,7 +115,7 @@ COHESION: UserService (src/users/service.ts)
|
|
|
115
115
|
|
|
116
116
|
## Interaction Model
|
|
117
117
|
|
|
118
|
-
Decision engine. The agent analyzes cohesion in modules it reviews or refactors, producing the cohesion report. When reviewing existing code, it identifies the lowest-cohesion modules (coincidental and logical first) and recommends targeted extractions. The agent targets the largest, most-changed files first—they're the best signal of cohesion problems. It doesn't aim for every module to reach functional cohesion; it balances practicality (some temporal/procedural cohesion is acceptable in init/shutdown) with clarity (modules should be nameable, testable, and reasonably sized).
|
|
118
|
+
Decision engine. The agent analyzes cohesion in modules it reviews or refactors, producing the cohesion report. When reviewing existing code, it identifies the lowest-cohesion modules (coincidental and logical first) and recommends targeted extractions. The agent targets the largest, most-changed files first—they're the best signal of cohesion problems (rank them with `git log --since="6 months ago" --name-only --pretty=format: | sort | uniq -c | sort -rn | head -20`, cross-checked against line counts). It doesn't aim for every module to reach functional cohesion; it balances practicality (some temporal/procedural cohesion is acceptable in init/shutdown) with clarity (modules should be nameable, testable, and reasonably sized).
|
|
119
119
|
|
|
120
120
|
## Cohesion vs. Coupling
|
|
121
121
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cohesion-analyzer",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Constantine & Yourdon-inspired cohesion analysis: classify module focus on the 7-level spectrum, find split lines, reduce mixed responsibilities",
|
|
5
5
|
"author": "iceinvein",
|
|
6
6
|
"type": "prompt",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: composability-auditor
|
|
3
|
-
description: Use when functions or modules are hard to reuse because they do too much or assume too much about their environment, when
|
|
3
|
+
description: Use when functions or modules are hard to reuse because they do too much or assume too much about their environment, when a new feature means modifying existing code instead of combining units, or when testing needs elaborate setup because the unit manages its own I/O. Trigger on "I need exactly what this does but with different output", or when adding a feature means adding a flag. NOT for top-level orchestration code, performance-critical paths, or one-off scripts.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Composability Auditor
|
|
@@ -145,7 +145,7 @@ Decomposed into three units:
|
|
|
145
145
|
```typescript
|
|
146
146
|
// Unit 1: Fetch data — takes connection as parameter
|
|
147
147
|
function fetchOrderReport(db: Database, orderId: string): Report {
|
|
148
|
-
const orders = db.query(
|
|
148
|
+
const orders = db.query("SELECT * FROM orders WHERE id = ?", [orderId]);
|
|
149
149
|
return formatReport(orders);
|
|
150
150
|
}
|
|
151
151
|
|
|
@@ -163,8 +163,8 @@ function sendEmail(service: EmailService, message: EmailMessage): Promise<void>
|
|
|
163
163
|
return service.send(message);
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
-
// Composition — caller orchestrates
|
|
167
|
-
async function processReport(orderId: string, config: Config) {
|
|
166
|
+
// Composition — caller orchestrates; every dependency arrives as a parameter
|
|
167
|
+
async function processReport(orderId: string, config: Config, emailService: EmailService) {
|
|
168
168
|
const db = createConnection(config.databaseUrl); // Config passed in
|
|
169
169
|
const report = fetchOrderReport(db, orderId);
|
|
170
170
|
const email = prepareReportEmail(report, config.recipientEmail);
|
|
@@ -185,7 +185,7 @@ Decision engine. The agent analyzes units in code it writes or reviews, producin
|
|
|
185
185
|
|
|
186
186
|
## The Unix Philosophy Reference
|
|
187
187
|
|
|
188
|
-
McIlroy,
|
|
188
|
+
McIlroy, Pinson, and Tague articulated four principles in the 1978 Bell System Technical Journal foreword (Pike and Kernighan's *The UNIX Programming Environment*, 1984, later popularized the philosophy):
|
|
189
189
|
|
|
190
190
|
1. **Make each program do one thing well.** Concentrate all efforts on that one thing. Don't clutter the program with unrelated features.
|
|
191
191
|
2. **Expect the output of every program to become the input of another, yet unknown, program.** Don't insist on interactive input; don't produce extraneous information.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "composability-auditor",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Unix Philosophy-inspired composability analysis: identify reuse blockers, decompose self-sufficient units into composable pieces with standard interfaces",
|
|
5
5
|
"author": "iceinvein",
|
|
6
6
|
"type": "prompt",
|
|
@@ -15,9 +15,9 @@ A structured correctness framework based on Bertrand Meyer's *Design by Contract
|
|
|
15
15
|
- Functions that handle external input, state transitions, or cross-module boundaries
|
|
16
16
|
- "Is this function correct?" / "What are the edge cases?"
|
|
17
17
|
- "What does this function guarantee?"
|
|
18
|
-
- Reviewing boundary behavior
|
|
18
|
+
- Reviewing boundary behavior (what a function requires and guarantees)
|
|
19
19
|
|
|
20
|
-
**Not for:** Trivial getters, simple property access, configuration code, pure mappings with obvious behavior.
|
|
20
|
+
**Not for:** Trivial getters, simple property access, configuration code, pure mappings with obvious behavior. For what happens after valid input enters the system — try/catch strategy, error classification, recovery boundaries — use `error-strategist` (which routes precondition/validation design back here).
|
|
21
21
|
|
|
22
22
|
## The Process
|
|
23
23
|
|
|
@@ -132,8 +132,8 @@ These are design decisions, not implementation details. The human owns them.
|
|
|
132
132
|
|
|
133
133
|
## The Meyer Principles (Reference)
|
|
134
134
|
|
|
135
|
-
1. **Separate commands from queries.** Functions that return values should not have side effects
|
|
136
|
-
2. **Demand
|
|
137
|
-
3. **The client is responsible for preconditions.** The function does not need to "handle" invalid input gracefully — it needs to fail clearly and immediately when preconditions are violated.
|
|
135
|
+
1. **Separate commands from queries.** Functions that return values should not have side effects, and vice versa (the dedicated `cqs-auditor` skill covers this in full). When you must violate it, document that in the contract.
|
|
136
|
+
2. **Demand only what you need, and demand it explicitly.** Require nothing beyond what the implementation truly relies on, but state every requirement precisely; postconditions should guarantee the most specific output you can honestly promise. Meyer's style is demanding: a strong, explicit precondition beats tolerant code that silently accepts anything.
|
|
137
|
+
3. **The client is responsible for preconditions.** The function does not need to "handle" invalid input gracefully — it needs to fail clearly and immediately when preconditions are violated. Enforce preconditions at trust boundaries (external input, public APIs); internally, assert rather than handle.
|
|
138
138
|
4. **Inheritance respects contracts.** Subtypes may weaken preconditions (accept more) and strengthen postconditions (guarantee more), but never the reverse.
|
|
139
139
|
5. **Contracts are documentation that compiles.** The best contracts are checked at runtime (assertions, type narrowing, validation) — not just written in comments.
|
|
@@ -113,7 +113,7 @@ Coupling is about *between* modules. Cohesion is about *within* a module. They'r
|
|
|
113
113
|
- **Low coupling + low cohesion** = modules are independent but internally disorganized. Fix the cohesion.
|
|
114
114
|
- **Low coupling + high cohesion** = the goal. Modules are internally focused and externally independent.
|
|
115
115
|
|
|
116
|
-
This skill addresses coupling only. If a module has cohesion problems (doing too many unrelated things), that's a signal for the
|
|
116
|
+
This skill addresses coupling only. If a module has cohesion problems (doing too many unrelated things), that's a signal for the `cohesion-analyzer` skill.
|
|
117
117
|
|
|
118
118
|
## Guard Rails
|
|
119
119
|
|
|
@@ -131,7 +131,7 @@ This skill addresses coupling only. If a module has cohesion problems (doing too
|
|
|
131
131
|
2. **Maximize cohesion within modules.** A module that does one thing well has fewer reasons to couple with others.
|
|
132
132
|
3. **Coupling type matters more than coupling count.** One content coupling is worse than five data couplings.
|
|
133
133
|
4. **Coupling is directional.** A depends on B ≠ B depends on A. Map the direction.
|
|
134
|
-
5. **The Law of Demeter operationalizes coupling.** "
|
|
134
|
+
5. **The Law of Demeter operationalizes coupling.** Later work (Lieberherr's Law of Demeter, 1987, not Constantine & Yourdon) turned this into the "don't talk to strangers" rule: a module should only call methods on its direct dependencies. See the `demeter-enforcer` skill.
|
|
135
135
|
|
|
136
136
|
## Common Mistakes
|
|
137
137
|
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cover-letter
|
|
3
3
|
description: >
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
or shares a resume and job description together. Route to the right subcommand:
|
|
12
|
-
write, audit, rewrite, or persona.
|
|
4
|
+
Use for generic or ambiguous cover-letter requests: the user says "cover
|
|
5
|
+
letter" or "help me apply" without a clear write/audit/rewrite verb, invokes
|
|
6
|
+
/cover-letter, or asks what the suite can do. Routes to the subcommand
|
|
7
|
+
skills and holds the suite's shared conventions (file I/O, naming, state
|
|
8
|
+
directory, writing principles). When the phrasing already names the action
|
|
9
|
+
(write/draft, audit/score, rewrite/fix, persona/voice), trigger that
|
|
10
|
+
subcommand skill directly instead.
|
|
13
11
|
argument-hint: "[write|audit|rewrite|persona] [...args]"
|
|
14
12
|
---
|
|
15
13
|
|
|
@@ -25,7 +23,7 @@ a human wrote them, fit the job, and match the resume.
|
|
|
25
23
|
| `/cover-letter write` | Generate a letter from resume + job description | `cover-letter-write` |
|
|
26
24
|
| `/cover-letter audit <file>` | Score a letter on content, structure, AI-ness, correctness | `cover-letter-audit` |
|
|
27
25
|
| `/cover-letter rewrite <file>` | Humanize and realign an existing letter | `cover-letter-rewrite` |
|
|
28
|
-
| `/cover-letter persona [create\|list\|use\|show]` | Manage writing voice/tone profiles | `cover-letter-persona` |
|
|
26
|
+
| `/cover-letter persona [create\|list\|use\|show\|delete]` | Manage writing voice/tone profiles | `cover-letter-persona` |
|
|
29
27
|
|
|
30
28
|
When invoked without arguments, list these subcommands and ask which one the
|
|
31
29
|
user wants.
|
|
@@ -65,7 +63,7 @@ Letters are emitted as three sibling files by default:
|
|
|
65
63
|
|
|
66
64
|
- `<out>/<company>-<role>-<YYYY-MM-DD>.md` (canonical source)
|
|
67
65
|
- `<out>/<company>-<role>-<YYYY-MM-DD>.docx` (via `pandoc`)
|
|
68
|
-
- `<out>/<company>-<role>-<YYYY-MM-DD>.pdf` (via `pandoc
|
|
66
|
+
- `<out>/<company>-<role>-<YYYY-MM-DD>.pdf` (via `pandoc`; the PDF engine fallback chain is defined once, in cover-letter-write's emit step)
|
|
69
67
|
|
|
70
68
|
Default output directory: `./cover-letters/`. Override with `--out <dir>`.
|
|
71
69
|
|
|
@@ -80,7 +78,7 @@ Personas and session state live at `~/.config/cover-letter/`:
|
|
|
80
78
|
~/.config/cover-letter/
|
|
81
79
|
├── personas/ # one JSON per persona
|
|
82
80
|
├── active-persona # plain text, contains active persona name
|
|
83
|
-
└── last-run.json #
|
|
81
|
+
└── last-run.json # written by cover-letter-write step 7; read by audit/rewrite when the user gives no paths
|
|
84
82
|
```
|
|
85
83
|
|
|
86
84
|
Create the directory on first write. Never touch anything outside it when
|
|
@@ -111,13 +109,13 @@ and rewrite skills enforce them; the audit skill scores against them.
|
|
|
111
109
|
"I hope this message finds you well". Every one of these is an AI tell and
|
|
112
110
|
a wasted first sentence.
|
|
113
111
|
7. **No sentimental cliches.** A cover letter is not a Hallmark card. Avoid
|
|
114
|
-
"hit close to home", "struck a chord", "resonated with me"
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
112
|
+
the likes of "hit close to home", "struck a chord", "resonated with me";
|
|
113
|
+
the canonical list lives in cover-letter-audit's AI phrase list, which the
|
|
114
|
+
audit scores against (do not maintain a second copy here). These are corny;
|
|
115
|
+
they signal either AI prose or a writer reaching for warmth they have not
|
|
116
|
+
earned with specificity. Replace with a concrete reason the thing connects:
|
|
117
|
+
which paragraph of the post, which past project of yours, which shared
|
|
118
|
+
problem.
|
|
121
119
|
8. **Human closing.** Skip "Please do not hesitate to contact me". A plain
|
|
122
120
|
sign-off works better.
|
|
123
121
|
9. **Length.** 250 to 400 words by default. Shorter is almost always better.
|
|
@@ -155,7 +153,7 @@ A typical end-to-end flow:
|
|
|
155
153
|
1. `/cover-letter persona create` (one-time, or skip for default professional voice)
|
|
156
154
|
2. `/cover-letter persona use <name>` (optional)
|
|
157
155
|
3. `/cover-letter write --resume <resume> --jd <jd>` produces the letter plus a self-audit score
|
|
158
|
-
4. If score below
|
|
156
|
+
4. If the score lands below Strong (under 80 per cover-letter-audit's rating table) or the user is unhappy, `/cover-letter rewrite <file>` with optional `--focus humanize|tighten|align`
|
|
159
157
|
5. `/cover-letter audit <file>` for a final independent score
|
|
160
158
|
|
|
161
159
|
Each subcommand skill details its own workflow, inputs, and outputs.
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cover-letter",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Cover letter suite router. Dispatches to write, audit, rewrite, or persona subcommands and shares file I/O (PDF, DOCX, MD/MDX, URL), output formats, and writing conventions across the suite",
|
|
5
5
|
"author": "iceinvein",
|
|
6
6
|
"type": "prompt",
|
|
7
|
-
"tools": [
|
|
7
|
+
"tools": [
|
|
8
|
+
"claude",
|
|
9
|
+
"cursor",
|
|
10
|
+
"codex",
|
|
11
|
+
"gemini"
|
|
12
|
+
],
|
|
8
13
|
"files": {
|
|
9
14
|
"prompt": "SKILL.md"
|
|
10
15
|
},
|
|
@@ -1,24 +1,22 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cover-letter-audit
|
|
3
3
|
description: >
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
cover letter", "review cover letter", "check cover letter for AI", "does this
|
|
12
|
-
cover letter sound human", "rate my cover letter", "is this cover letter any
|
|
13
|
-
good", or shares a finished letter and asks for feedback.
|
|
4
|
+
Use when the user asks to audit, score, rate, or review an existing cover
|
|
5
|
+
letter ("audit cover letter", "does this sound AI", "rate my cover letter",
|
|
6
|
+
"is this any good"), or shares a finished letter asking for feedback.
|
|
7
|
+
Scores 100 points across content/fit, structure, voice/humanness, and
|
|
8
|
+
correctness, detects AI-content signals, and returns a prioritized fix
|
|
9
|
+
list. Accepts markdown, DOCX, PDF, or pasted text. NOT for writing a letter
|
|
10
|
+
(cover-letter-write) or applying edits (cover-letter-rewrite).
|
|
14
11
|
argument-hint: "<letter-file-or-text> [--resume <file>] [--jd <file|url|text>] [--format md|json|table]"
|
|
15
12
|
---
|
|
16
13
|
|
|
17
14
|
# Cover Letter Auditor
|
|
18
15
|
|
|
19
16
|
Score a cover letter and return prioritized fixes. The score combines four
|
|
20
|
-
categories to 100 points.
|
|
21
|
-
|
|
17
|
+
categories to 100 points. The Rating table below maps score bands to actions
|
|
18
|
+
and is the single source of truth for thresholds across the cover-letter
|
|
19
|
+
suite; other skills cite it rather than restating numbers.
|
|
22
20
|
|
|
23
21
|
## Inputs
|
|
24
22
|
|
|
@@ -41,7 +39,9 @@ Flags:
|
|
|
41
39
|
## Parsing
|
|
42
40
|
|
|
43
41
|
Same extraction tools as `cover-letter-write`. If the letter is a DOCX or PDF,
|
|
44
|
-
convert to markdown first via pandoc or pdftotext.
|
|
42
|
+
convert to markdown first via pandoc or pdftotext. If no letter path is given,
|
|
43
|
+
check `~/.config/cover-letter/last-run.json` for the most recent write output
|
|
44
|
+
before asking.
|
|
45
45
|
|
|
46
46
|
## Scoring rubric
|
|
47
47
|
|
|
@@ -67,9 +67,9 @@ coverage points: 3 to specificity, 3 to motivation.
|
|
|
67
67
|
| Check | Points | Pass criteria |
|
|
68
68
|
|-------|--------|--------------|
|
|
69
69
|
| Sections present | 5 | Opening hook, fit/evidence, motivation, close all identifiable |
|
|
70
|
-
| Opening | 5 | First sentence is specific and not
|
|
70
|
+
| Opening | 5 | First sentence is specific and not a filler opener (the "I am writing to express..." family, items 1-4 of the AI phrase list below). Generic opener costs all 5 points. |
|
|
71
71
|
| Close | 3 | Two sentences max, no "do not hesitate to contact me", plain sign-off |
|
|
72
|
-
| Length | 4 | Word count within target band
|
|
72
|
+
| Length | 4 | Word count within the declared target band: default 250-400, or the `--length short|standard|long` band from cover-letter-write (150-220 / 250-400 / 380-460) when one was declared or recorded in last-run.json |
|
|
73
73
|
| Formatting | 3 | No stray markdown headings, no bullet lists, no tables, no code blocks. Letter reads as prose. |
|
|
74
74
|
|
|
75
75
|
### 3. Voice and Humanness (25)
|
|
@@ -78,15 +78,15 @@ coverage points: 3 to specificity, 3 to motivation.
|
|
|
78
78
|
|-------|--------|--------------|
|
|
79
79
|
| Burstiness | 7 | Sentence length standard deviation >= 5 words; at least one sentence under 10 words and one over 20 per paragraph |
|
|
80
80
|
| AI phrase count | 6 | Zero phrases from the AI phrase list below. Minus 1 per phrase, down to 0. |
|
|
81
|
-
| Vocabulary diversity (TTR) | 4 | Type-Token Ratio >= 0.5 for letters over 200 words.
|
|
82
|
-
| Contraction/formality match | 3 | Contraction frequency within persona
|
|
81
|
+
| Vocabulary diversity (TTR) | 4 | Type-Token Ratio >= 0.5 for letters over 200 words earns 4; 0.40-0.49 earns 2; below 0.4 earns 0. |
|
|
82
|
+
| Contraction/formality match | 3 | Contraction frequency within ±0.15 of the persona's `contraction_frequency` scalar (default persona 0.4 → accept 0.25-0.55). If no persona, accept 0.2-0.7. |
|
|
83
83
|
| Em-dash count | 2 | Zero em-dashes. Em-dashes are a strong AI-output signal; each one costs both points. |
|
|
84
|
-
| Passive voice | 3 | At most 10% of
|
|
84
|
+
| Passive voice | 3 | At most 10% of sentences in passive voice (or persona cap) |
|
|
85
85
|
|
|
86
86
|
#### AI phrase list
|
|
87
87
|
|
|
88
|
-
Flag any occurrence of these, case-insensitive.
|
|
89
|
-
|
|
88
|
+
Flag any occurrence of these, case-insensitive. This is the canonical list for
|
|
89
|
+
the whole cover-letter suite (write and rewrite reference it):
|
|
90
90
|
|
|
91
91
|
Cover-letter specific:
|
|
92
92
|
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cover-letter-audit",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Scores a cover letter on 100 points across content/fit, structure, voice/humanness, and correctness; detects AI-generated-content signals and produces a prioritized fix list",
|
|
5
5
|
"author": "iceinvein",
|
|
6
6
|
"type": "prompt",
|
|
7
|
-
"tools": [
|
|
7
|
+
"tools": [
|
|
8
|
+
"claude",
|
|
9
|
+
"cursor",
|
|
10
|
+
"codex",
|
|
11
|
+
"gemini"
|
|
12
|
+
],
|
|
8
13
|
"files": {
|
|
9
14
|
"prompt": "SKILL.md"
|
|
10
15
|
},
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: cover-letter-persona
|
|
3
3
|
description: >
|
|
4
|
-
|
|
5
|
-
tone
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"create persona", "use persona", or asks how to tune the voice of their letters.
|
|
4
|
+
Use when the user wants to tune the voice of their cover letters: "persona",
|
|
5
|
+
"voice", "tone", "writing style", "make it sound more formal/casual",
|
|
6
|
+
"create persona", "use persona". Manages reusable writing personas on the
|
|
7
|
+
NNGroup 4-dimension tone framework; personas set readability, sentence
|
|
8
|
+
lengths, contraction frequency, passive-voice cap, and do/don't lists,
|
|
9
|
+
consumed by cover-letter-write and cover-letter-rewrite. NOT for one-off
|
|
10
|
+
edits to a letter (cover-letter-rewrite).
|
|
12
11
|
argument-hint: "[create|list|use|show|delete] [persona-name]"
|
|
13
12
|
---
|
|
14
13
|
|
|
@@ -36,7 +35,7 @@ Create the directory on first run. Use kebab-case filenames (e.g.,
|
|
|
36
35
|
|---------|---------|
|
|
37
36
|
| `/cover-letter persona create [name]` | Interactive interview; writes a new persona file |
|
|
38
37
|
| `/cover-letter persona list` | Show all saved personas |
|
|
39
|
-
| `/cover-letter persona use <name>` | Set the active persona
|
|
38
|
+
| `/cover-letter persona use <name>` | Set the active persona (persists until changed) |
|
|
40
39
|
| `/cover-letter persona show <name>` | Print full persona profile |
|
|
41
40
|
| `/cover-letter persona delete <name>` | Remove a persona file (ask to confirm) |
|
|
42
41
|
|
|
@@ -173,10 +172,11 @@ should I go with?"
|
|
|
173
172
|
|
|
174
173
|
## List command
|
|
175
174
|
|
|
176
|
-
Glob `~/.config/cover-letter/personas/*.json` and render
|
|
175
|
+
Glob `~/.config/cover-letter/personas/*.json` and render ("Updated" is the
|
|
176
|
+
persona file's modification time; no schema field needed):
|
|
177
177
|
|
|
178
|
-
| Persona | Stage | Tone hint |
|
|
179
|
-
|
|
178
|
+
| Persona | Stage | Tone hint | Updated |
|
|
179
|
+
|---------|-------|-----------|---------|
|
|
180
180
|
| senior-eng-default | senior | serious, mid-formal | 2026-04-20 |
|
|
181
181
|
| casual-startup | senior | serious, casual | 2026-04-24 |
|
|
182
182
|
|
|
@@ -189,7 +189,7 @@ Read the named persona JSON. Write its name to
|
|
|
189
189
|
|
|
190
190
|
```
|
|
191
191
|
Active persona: senior-eng-default
|
|
192
|
-
- Tone: serious (0.75), mid-formal (0.45), respectful (0.25),
|
|
192
|
+
- Tone: serious (0.75), mid-formal (0.45), respectful (0.25), mid-enthusiastic (0.45)
|
|
193
193
|
- Sentence length target: 17 words ± 8
|
|
194
194
|
- Contractions: 40%; passive cap: 10%
|
|
195
195
|
- Signature: "Best,\nAlex Chen\nalex@example.com | portfolio.example.com"
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cover-letter-persona",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Reusable writing personas built on the NNGroup 4-dimension tone framework, adapted for professional correspondence and used by cover-letter-write and cover-letter-rewrite",
|
|
5
5
|
"author": "iceinvein",
|
|
6
6
|
"type": "prompt",
|
|
7
|
-
"tools": [
|
|
7
|
+
"tools": [
|
|
8
|
+
"claude",
|
|
9
|
+
"cursor",
|
|
10
|
+
"codex",
|
|
11
|
+
"gemini"
|
|
12
|
+
],
|
|
8
13
|
"files": {
|
|
9
14
|
"prompt": "SKILL.md"
|
|
10
15
|
},
|