@hecer/yoke 1.5.1 → 1.6.1
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/.claude-plugin/plugin.json +13 -13
- package/.codex-plugin/plugin.json +7 -7
- package/CHANGELOG.md +280 -259
- package/README.md +855 -834
- package/TODOS.md +5 -5
- package/agents/docs.toml +6 -6
- package/agents/implementer.toml +6 -6
- package/agents/reviewer.toml +6 -6
- package/agents/security.toml +6 -6
- package/bench/README.md +86 -86
- package/bench/RESULTS.md +35 -35
- package/bench/output-compaction.mjs +65 -65
- package/bench/result-schema.mjs +12 -12
- package/bench/results/claude-2026-07-27T18-03-26.json +50 -50
- package/bench/results/codex-unavailable-1785175418318.json +15 -15
- package/bench/results/gemini-2026-07-27T18-03-44.json +46 -46
- package/bench/run-matrix.mjs +26 -26
- package/bench/run.mjs +106 -106
- package/canon/AGENTS.md +30 -30
- package/canon/context/DECISIONS.md +4 -4
- package/canon/context/GLOSSARY.md +11 -0
- package/canon/context/KNOWLEDGE.md +4 -4
- package/canon/context/PROJECT.md +15 -15
- package/canon/loop/loop-spec.md +65 -65
- package/canon/loop/prd.schema.md +43 -43
- package/canon/manifest.yaml +59 -53
- package/canon/policy/gates.md +7 -7
- package/canon/policy/roles.md +9 -9
- package/canon/skills/ATTRIBUTION.md +99 -71
- package/canon/skills/authoring-prd/SKILL.md +58 -58
- package/canon/skills/brainstorming/SKILL.md +164 -164
- package/canon/skills/codebase-design/DEEPENING.md +15 -0
- package/canon/skills/codebase-design/DESIGN-IT-TWICE.md +12 -0
- package/canon/skills/codebase-design/SKILL.md +39 -0
- package/canon/skills/dispatching-parallel-agents/SKILL.md +182 -182
- package/canon/skills/document-release/SKILL.md +302 -297
- package/canon/skills/domain-modeling/ADR-FORMAT.md +19 -0
- package/canon/skills/domain-modeling/CONTEXT-FORMAT.md +39 -0
- package/canon/skills/domain-modeling/SKILL.md +35 -0
- package/canon/skills/executing-plans/SKILL.md +70 -70
- package/canon/skills/finishing-a-development-branch/SKILL.md +200 -200
- package/canon/skills/health/SKILL.md +177 -177
- package/canon/skills/maintaining-context/SKILL.md +34 -34
- package/canon/skills/minimal-code/SKILL.md +21 -21
- package/canon/skills/no-ai-slop/SKILL.md +103 -0
- package/canon/skills/no-ai-slop/eval.md +43 -0
- package/canon/skills/plan-ceo-review/SKILL.md +541 -541
- package/canon/skills/plan-eng-review/SKILL.md +362 -362
- package/canon/skills/receiving-code-review/SKILL.md +213 -213
- package/canon/skills/requesting-code-review/SKILL.md +105 -105
- package/canon/skills/resolving-merge-conflicts/SKILL.md +18 -0
- package/canon/skills/retro/SKILL.md +397 -397
- package/canon/skills/review/SKILL.md +246 -246
- package/canon/skills/ship/SKILL.md +691 -691
- package/canon/skills/subagent-driven-development/SKILL.md +277 -277
- package/canon/skills/systematic-debugging/SKILL.md +296 -296
- package/canon/skills/tdd/SKILL.md +371 -371
- package/canon/skills/unslop-ui/SKILL.md +34 -34
- package/canon/skills/using-git-worktrees/SKILL.md +218 -218
- package/canon/skills/verification-before-completion/SKILL.md +139 -139
- package/canon/skills/visual-verification/SKILL.md +54 -54
- package/canon/skills/workflow/SKILL.md +22 -22
- package/canon/skills/writing-for-agents/SKILL-MECHANICS.md +27 -0
- package/canon/skills/writing-for-agents/SKILL.md +42 -0
- package/canon/skills/writing-plans/SKILL.md +152 -152
- package/canon/skills/writing-skills/SKILL.md +655 -655
- package/canon/skills/yoke-retrofit/SKILL.md +26 -26
- package/canon/skills/yoke-workflow/SKILL.md +20 -20
- package/canon/tools/codex-rtk-hook.mjs +35 -35
- package/canon/tools/graphify.md +3 -3
- package/canon/tools/playwright-mcp.md +3 -3
- package/canon/tools/rtk.md +7 -7
- package/canon/tools/serena.md +6 -6
- package/dist/agents/process.js +3 -0
- package/dist/canon/manifest.js +2 -0
- package/dist/canon/skill-package.js +113 -0
- package/dist/canon/validate.js +16 -1
- package/dist/context/command.js +4 -1
- package/dist/context/context.js +6 -0
- package/dist/loop/dispatcher.js +1 -1
- package/dist/loop/loop.js +26 -0
- package/dist/loop/parallel-command.js +3 -0
- package/dist/loop/run-command.js +11 -0
- package/dist/loop/watchdog.js +28 -11
- package/dist/loop/worker.js +11 -0
- package/dist/prd/command.js +17 -17
- package/dist/retrofit/apply.js +22 -7
- package/dist/retrofit/command.js +4 -1
- package/dist/retrofit/config.js +4 -0
- package/dist/retrofit/context-actions.js +1 -1
- package/dist/retrofit/detect.js +2 -0
- package/dist/retrofit/planners/claude.js +16 -20
- package/dist/retrofit/planners/codex.js +3 -7
- package/dist/retrofit/planners/gemini.js +11 -1
- package/dist/retrofit/preserve.js +2 -2
- package/dist/retrofit/report.js +5 -0
- package/dist/retrofit/skill-actions.js +66 -0
- package/dist/retrofit/ui-detect.js +83 -0
- package/dist/scan/gate.js +36 -0
- package/docs/MIGRATING-TO-1.0.md +33 -33
- package/docs/MIGRATING-TO-1.1.md +27 -27
- package/docs/MIGRATING-TO-1.4.md +70 -70
- package/docs/PUBLISHING.md +91 -91
- package/docs/superpowers/plans/2026-06-28-baustein-e-context-layer.md +981 -981
- package/docs/superpowers/plans/2026-06-29-baustein-f-routing.md +258 -258
- package/docs/superpowers/plans/2026-06-29-baustein-g-loop-observability.md +1006 -1006
- package/docs/superpowers/plans/2026-06-29-baustein-h-loop-robustness.md +374 -374
- package/docs/superpowers/plans/2026-06-30-baustein-i-visual-design-verification.md +450 -450
- package/docs/superpowers/plans/2026-07-02-baustein-k-zero-to-100-bootstrap.md +1024 -1024
- package/docs/superpowers/plans/2026-07-02-baustein-m-flow-smoke-proofs.md +574 -574
- package/docs/superpowers/plans/2026-08-13-gauntlet-quality-loop.md +537 -537
- package/docs/superpowers/plans/2026-08-16-artifact-backed-output-compaction.md +329 -329
- package/docs/superpowers/plans/2026-08-20-automatic-ui-design-gate.md +59 -0
- package/docs/superpowers/plans/2026-08-20-capability-skills-and-context.md +51 -0
- package/docs/superpowers/plans/2026-08-20-complete-skill-packages-and-invocation.md +59 -0
- package/docs/superpowers/plans/2026-08-20-windows-reliability-and-release.md +67 -0
- package/docs/superpowers/specs/2026-06-28-baustein-e-context-layer-design.md +146 -146
- package/docs/superpowers/specs/2026-06-29-baustein-f-routing-design.md +106 -106
- package/docs/superpowers/specs/2026-06-29-baustein-g-loop-observability-design.md +186 -186
- package/docs/superpowers/specs/2026-06-29-baustein-h-loop-robustness-design.md +113 -113
- package/docs/superpowers/specs/2026-06-30-baustein-i-visual-design-verification-design.md +98 -98
- package/docs/superpowers/specs/2026-07-02-baustein-k-zero-to-100-bootstrap-design.md +200 -200
- package/docs/superpowers/specs/2026-07-02-baustein-m-flow-smoke-proofs-design.md +155 -155
- package/docs/superpowers/specs/2026-08-13-gauntlet-quality-loop-design.md +422 -422
- package/docs/superpowers/specs/2026-08-16-artifact-backed-output-compaction-design.md +166 -166
- package/docs/superpowers/specs/2026-08-20-skill-capabilities-and-reliability-design.md +391 -0
- package/gemini-extension.json +6 -6
- package/hooks/hooks.json +19 -19
- package/package.json +84 -84
|
@@ -1,177 +1,177 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: health
|
|
3
|
-
description: |
|
|
4
|
-
Code Quality Dashboard. Runs the project's type-checker, linter, test runner, and
|
|
5
|
-
dead-code detector, scores each category 0-10, and presents a dashboard with trends.
|
|
6
|
-
Use when asked for a "health check", "code quality report", or "quality dashboard".
|
|
7
|
-
triggers:
|
|
8
|
-
- health check
|
|
9
|
-
- code quality
|
|
10
|
-
- quality dashboard
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# Code Quality Dashboard
|
|
14
|
-
|
|
15
|
-
You are running the `health` skill. Detect and run the project's quality tools, score each category, and present a dashboard.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Step 1: Detect the health stack
|
|
20
|
-
|
|
21
|
-
Read `CLAUDE.md` and look for a `## Health Stack` section that lists the project's tools. If found, use those tools. If not found, auto-detect:
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
# Runtime detection
|
|
25
|
-
[ -f Gemfile ] && echo "RUNTIME:ruby"
|
|
26
|
-
[ -f package.json ] && echo "RUNTIME:node"
|
|
27
|
-
[ -f requirements.txt ] || [ -f pyproject.toml ] && echo "RUNTIME:python"
|
|
28
|
-
[ -f go.mod ] && echo "RUNTIME:go"
|
|
29
|
-
[ -f Cargo.toml ] && echo "RUNTIME:rust"
|
|
30
|
-
|
|
31
|
-
# Type checker
|
|
32
|
-
[ -f tsconfig.json ] && echo "TYPECHECK:tsc"
|
|
33
|
-
[ -f pyproject.toml ] && command -v mypy >/dev/null 2>&1 && echo "TYPECHECK:mypy"
|
|
34
|
-
[ -f Gemfile ] && grep -q "sorbet" Gemfile 2>/dev/null && echo "TYPECHECK:sorbet"
|
|
35
|
-
|
|
36
|
-
# Linter
|
|
37
|
-
[ -f .eslintrc* ] || [ -f eslint.config* ] && echo "LINT:eslint"
|
|
38
|
-
[ -f .rubocop.yml ] && echo "LINT:rubocop"
|
|
39
|
-
[ -f pyproject.toml ] && grep -qE "ruff|flake8" pyproject.toml 2>/dev/null && echo "LINT:ruff"
|
|
40
|
-
[ -f go.mod ] && echo "LINT:staticcheck"
|
|
41
|
-
[ -f Cargo.toml ] && echo "LINT:clippy"
|
|
42
|
-
|
|
43
|
-
# Test runner
|
|
44
|
-
[ -f jest.config* ] || [ -f vitest.config* ] && echo "TESTS:npm run test"
|
|
45
|
-
[ -f .rspec ] && echo "TESTS:bundle exec rspec"
|
|
46
|
-
[ -f pytest.ini ] || [ -f conftest.py ] && echo "TESTS:pytest"
|
|
47
|
-
[ -f go.mod ] && echo "TESTS:go test ./..."
|
|
48
|
-
[ -f Cargo.toml ] && echo "TESTS:cargo test"
|
|
49
|
-
|
|
50
|
-
# Dead code detector
|
|
51
|
-
command -v ts-prune >/dev/null 2>&1 && echo "DEADCODE:ts-prune"
|
|
52
|
-
command -v knip >/dev/null 2>&1 && echo "DEADCODE:knip"
|
|
53
|
-
[ -f go.mod ] && echo "DEADCODE:deadcode (go-deadcode)"
|
|
54
|
-
[ -f Cargo.toml ] && echo "DEADCODE:cargo udeps"
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
Print the detected stack. If nothing is detected, ask the user what tools to run.
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
## Step 2: Run the tools
|
|
62
|
-
|
|
63
|
-
Run each detected tool and capture output. Run them in parallel where possible.
|
|
64
|
-
|
|
65
|
-
**Type checker** (run the project's own type-checker, e.g. `tsc --noEmit`, `mypy .`, `srb tc`):
|
|
66
|
-
```bash
|
|
67
|
-
# Example for TypeScript:
|
|
68
|
-
npx tsc --noEmit 2>&1 | tail -20
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
**Linter** (run the project's own linter, e.g. `eslint`, `rubocop`, `ruff`):
|
|
72
|
-
```bash
|
|
73
|
-
# Example for ESLint:
|
|
74
|
-
npx eslint . --max-warnings 0 2>&1 | tail -30
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
**Test runner** (run the project's own test suite):
|
|
78
|
-
```bash
|
|
79
|
-
# Example for npm:
|
|
80
|
-
npm test -- --passWithNoTests 2>&1 | tail -40
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
**Dead-code detector** (run the project's own dead-code tool, e.g. `knip`, `ts-prune`):
|
|
84
|
-
```bash
|
|
85
|
-
# Example:
|
|
86
|
-
npx knip 2>&1 | tail -20
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Capture raw counts: errors, warnings, test pass/fail/skip counts, dead-code count.
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
## Step 3: Score each category (0–10)
|
|
94
|
-
|
|
95
|
-
Score rules (apply for each category):
|
|
96
|
-
|
|
97
|
-
| Score | Meaning |
|
|
98
|
-
|-------|---------|
|
|
99
|
-
| 10 | Zero issues |
|
|
100
|
-
| 8-9 | 1-5 minor warnings, no errors |
|
|
101
|
-
| 6-7 | <20 warnings, zero errors |
|
|
102
|
-
| 4-5 | 20-50 warnings, or 1-5 errors |
|
|
103
|
-
| 2-3 | 50-100 warnings, or 6-20 errors |
|
|
104
|
-
| 0-1 | 100+ warnings, or 20+ errors, or tool fails to run |
|
|
105
|
-
|
|
106
|
-
For tests, also consider pass rate:
|
|
107
|
-
- 10 = 100% pass
|
|
108
|
-
- 8 = 95-99%
|
|
109
|
-
- 6 = 80-94%
|
|
110
|
-
- 4 = 50-79%
|
|
111
|
-
- 0-2 = <50%
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
## Step 4: Present the dashboard
|
|
116
|
-
|
|
117
|
-
```
|
|
118
|
-
+=====================================================================+
|
|
119
|
-
| CODE QUALITY DASHBOARD |
|
|
120
|
-
| {date} — {branch} |
|
|
121
|
-
+=====================================================================+
|
|
122
|
-
| Category | Score | Status | Details |
|
|
123
|
-
|-----------------|-------|---------|--------------------------------|
|
|
124
|
-
| Type Safety | 8/10 | WARN | 3 warnings, 0 errors |
|
|
125
|
-
| Lint | 10/10 | PASS | 0 issues |
|
|
126
|
-
| Tests | 9/10 | PASS | 142/147 pass, 5 skip |
|
|
127
|
-
| Dead Code | 7/10 | WARN | 12 unused exports |
|
|
128
|
-
+---------------------------------------------------------------------+
|
|
129
|
-
| OVERALL | 8.5 | HEALTHY | |
|
|
130
|
-
+=====================================================================+
|
|
131
|
-
|
|
132
|
-
Top issues (if any):
|
|
133
|
-
[TYPECHECK] src/api/users.ts:42 — Parameter 'id' implicitly has type 'any'
|
|
134
|
-
[DEADCODE] src/utils/legacy.ts — 4 exports never imported
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
Overall score = average of category scores. Verdict:
|
|
138
|
-
- 9-10: EXCELLENT
|
|
139
|
-
- 7-8: HEALTHY
|
|
140
|
-
- 5-6: FAIR — address warnings before adding more features
|
|
141
|
-
- 3-4: POOR — address errors before shipping
|
|
142
|
-
- 0-2: CRITICAL — stop and fix now
|
|
143
|
-
|
|
144
|
-
---
|
|
145
|
-
|
|
146
|
-
## Step 5: Trend analysis (optional)
|
|
147
|
-
|
|
148
|
-
Check if previous health snapshots exist in `.context/health/` (or similar local store in the project). If prior data exists, show trends:
|
|
149
|
-
|
|
150
|
-
```
|
|
151
|
-
Trends vs last check:
|
|
152
|
-
Type Safety: 8/10 → 8/10 (=)
|
|
153
|
-
Lint: 9/10 → 10/10 (↑ +1)
|
|
154
|
-
Tests: 7/10 → 9/10 (↑ +2) — 12 new tests added
|
|
155
|
-
Dead Code: 5/10 → 7/10 (↑ +2) — cleaned up 8 exports
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
Save a snapshot to `.context/health/{date}.json` for future trend comparison:
|
|
159
|
-
```bash
|
|
160
|
-
mkdir -p .context/health
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
Use the Write tool to save `{date}.json` with the scores, counts, and branch name.
|
|
164
|
-
|
|
165
|
-
---
|
|
166
|
-
|
|
167
|
-
## Step 6: Recommendations
|
|
168
|
-
|
|
169
|
-
For each category scoring below 8, provide one concrete action:
|
|
170
|
-
- Type Safety: "Run the type-checker and fix the N errors — prioritize the ones in `{hottest file}`"
|
|
171
|
-
- Lint: "Run the linter with `--fix` to auto-fix {N} of the warnings"
|
|
172
|
-
- Tests: "Add tests for the {N} skipped/failing cases in {file}"
|
|
173
|
-
- Dead Code: "Delete the {N} unused exports in {files} — they add maintenance surface"
|
|
174
|
-
|
|
175
|
-
## Completion Status
|
|
176
|
-
|
|
177
|
-
Report **DONE** with the dashboard, or **DONE_WITH_CONCERNS** if any category is below 6.
|
|
1
|
+
---
|
|
2
|
+
name: health
|
|
3
|
+
description: |
|
|
4
|
+
Code Quality Dashboard. Runs the project's type-checker, linter, test runner, and
|
|
5
|
+
dead-code detector, scores each category 0-10, and presents a dashboard with trends.
|
|
6
|
+
Use when asked for a "health check", "code quality report", or "quality dashboard".
|
|
7
|
+
triggers:
|
|
8
|
+
- health check
|
|
9
|
+
- code quality
|
|
10
|
+
- quality dashboard
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Code Quality Dashboard
|
|
14
|
+
|
|
15
|
+
You are running the `health` skill. Detect and run the project's quality tools, score each category, and present a dashboard.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Step 1: Detect the health stack
|
|
20
|
+
|
|
21
|
+
Read `CLAUDE.md` and look for a `## Health Stack` section that lists the project's tools. If found, use those tools. If not found, auto-detect:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Runtime detection
|
|
25
|
+
[ -f Gemfile ] && echo "RUNTIME:ruby"
|
|
26
|
+
[ -f package.json ] && echo "RUNTIME:node"
|
|
27
|
+
[ -f requirements.txt ] || [ -f pyproject.toml ] && echo "RUNTIME:python"
|
|
28
|
+
[ -f go.mod ] && echo "RUNTIME:go"
|
|
29
|
+
[ -f Cargo.toml ] && echo "RUNTIME:rust"
|
|
30
|
+
|
|
31
|
+
# Type checker
|
|
32
|
+
[ -f tsconfig.json ] && echo "TYPECHECK:tsc"
|
|
33
|
+
[ -f pyproject.toml ] && command -v mypy >/dev/null 2>&1 && echo "TYPECHECK:mypy"
|
|
34
|
+
[ -f Gemfile ] && grep -q "sorbet" Gemfile 2>/dev/null && echo "TYPECHECK:sorbet"
|
|
35
|
+
|
|
36
|
+
# Linter
|
|
37
|
+
[ -f .eslintrc* ] || [ -f eslint.config* ] && echo "LINT:eslint"
|
|
38
|
+
[ -f .rubocop.yml ] && echo "LINT:rubocop"
|
|
39
|
+
[ -f pyproject.toml ] && grep -qE "ruff|flake8" pyproject.toml 2>/dev/null && echo "LINT:ruff"
|
|
40
|
+
[ -f go.mod ] && echo "LINT:staticcheck"
|
|
41
|
+
[ -f Cargo.toml ] && echo "LINT:clippy"
|
|
42
|
+
|
|
43
|
+
# Test runner
|
|
44
|
+
[ -f jest.config* ] || [ -f vitest.config* ] && echo "TESTS:npm run test"
|
|
45
|
+
[ -f .rspec ] && echo "TESTS:bundle exec rspec"
|
|
46
|
+
[ -f pytest.ini ] || [ -f conftest.py ] && echo "TESTS:pytest"
|
|
47
|
+
[ -f go.mod ] && echo "TESTS:go test ./..."
|
|
48
|
+
[ -f Cargo.toml ] && echo "TESTS:cargo test"
|
|
49
|
+
|
|
50
|
+
# Dead code detector
|
|
51
|
+
command -v ts-prune >/dev/null 2>&1 && echo "DEADCODE:ts-prune"
|
|
52
|
+
command -v knip >/dev/null 2>&1 && echo "DEADCODE:knip"
|
|
53
|
+
[ -f go.mod ] && echo "DEADCODE:deadcode (go-deadcode)"
|
|
54
|
+
[ -f Cargo.toml ] && echo "DEADCODE:cargo udeps"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Print the detected stack. If nothing is detected, ask the user what tools to run.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Step 2: Run the tools
|
|
62
|
+
|
|
63
|
+
Run each detected tool and capture output. Run them in parallel where possible.
|
|
64
|
+
|
|
65
|
+
**Type checker** (run the project's own type-checker, e.g. `tsc --noEmit`, `mypy .`, `srb tc`):
|
|
66
|
+
```bash
|
|
67
|
+
# Example for TypeScript:
|
|
68
|
+
npx tsc --noEmit 2>&1 | tail -20
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Linter** (run the project's own linter, e.g. `eslint`, `rubocop`, `ruff`):
|
|
72
|
+
```bash
|
|
73
|
+
# Example for ESLint:
|
|
74
|
+
npx eslint . --max-warnings 0 2>&1 | tail -30
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Test runner** (run the project's own test suite):
|
|
78
|
+
```bash
|
|
79
|
+
# Example for npm:
|
|
80
|
+
npm test -- --passWithNoTests 2>&1 | tail -40
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Dead-code detector** (run the project's own dead-code tool, e.g. `knip`, `ts-prune`):
|
|
84
|
+
```bash
|
|
85
|
+
# Example:
|
|
86
|
+
npx knip 2>&1 | tail -20
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Capture raw counts: errors, warnings, test pass/fail/skip counts, dead-code count.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Step 3: Score each category (0–10)
|
|
94
|
+
|
|
95
|
+
Score rules (apply for each category):
|
|
96
|
+
|
|
97
|
+
| Score | Meaning |
|
|
98
|
+
|-------|---------|
|
|
99
|
+
| 10 | Zero issues |
|
|
100
|
+
| 8-9 | 1-5 minor warnings, no errors |
|
|
101
|
+
| 6-7 | <20 warnings, zero errors |
|
|
102
|
+
| 4-5 | 20-50 warnings, or 1-5 errors |
|
|
103
|
+
| 2-3 | 50-100 warnings, or 6-20 errors |
|
|
104
|
+
| 0-1 | 100+ warnings, or 20+ errors, or tool fails to run |
|
|
105
|
+
|
|
106
|
+
For tests, also consider pass rate:
|
|
107
|
+
- 10 = 100% pass
|
|
108
|
+
- 8 = 95-99%
|
|
109
|
+
- 6 = 80-94%
|
|
110
|
+
- 4 = 50-79%
|
|
111
|
+
- 0-2 = <50%
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Step 4: Present the dashboard
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
+=====================================================================+
|
|
119
|
+
| CODE QUALITY DASHBOARD |
|
|
120
|
+
| {date} — {branch} |
|
|
121
|
+
+=====================================================================+
|
|
122
|
+
| Category | Score | Status | Details |
|
|
123
|
+
|-----------------|-------|---------|--------------------------------|
|
|
124
|
+
| Type Safety | 8/10 | WARN | 3 warnings, 0 errors |
|
|
125
|
+
| Lint | 10/10 | PASS | 0 issues |
|
|
126
|
+
| Tests | 9/10 | PASS | 142/147 pass, 5 skip |
|
|
127
|
+
| Dead Code | 7/10 | WARN | 12 unused exports |
|
|
128
|
+
+---------------------------------------------------------------------+
|
|
129
|
+
| OVERALL | 8.5 | HEALTHY | |
|
|
130
|
+
+=====================================================================+
|
|
131
|
+
|
|
132
|
+
Top issues (if any):
|
|
133
|
+
[TYPECHECK] src/api/users.ts:42 — Parameter 'id' implicitly has type 'any'
|
|
134
|
+
[DEADCODE] src/utils/legacy.ts — 4 exports never imported
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Overall score = average of category scores. Verdict:
|
|
138
|
+
- 9-10: EXCELLENT
|
|
139
|
+
- 7-8: HEALTHY
|
|
140
|
+
- 5-6: FAIR — address warnings before adding more features
|
|
141
|
+
- 3-4: POOR — address errors before shipping
|
|
142
|
+
- 0-2: CRITICAL — stop and fix now
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Step 5: Trend analysis (optional)
|
|
147
|
+
|
|
148
|
+
Check if previous health snapshots exist in `.context/health/` (or similar local store in the project). If prior data exists, show trends:
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
Trends vs last check:
|
|
152
|
+
Type Safety: 8/10 → 8/10 (=)
|
|
153
|
+
Lint: 9/10 → 10/10 (↑ +1)
|
|
154
|
+
Tests: 7/10 → 9/10 (↑ +2) — 12 new tests added
|
|
155
|
+
Dead Code: 5/10 → 7/10 (↑ +2) — cleaned up 8 exports
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Save a snapshot to `.context/health/{date}.json` for future trend comparison:
|
|
159
|
+
```bash
|
|
160
|
+
mkdir -p .context/health
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Use the Write tool to save `{date}.json` with the scores, counts, and branch name.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Step 6: Recommendations
|
|
168
|
+
|
|
169
|
+
For each category scoring below 8, provide one concrete action:
|
|
170
|
+
- Type Safety: "Run the type-checker and fix the N errors — prioritize the ones in `{hottest file}`"
|
|
171
|
+
- Lint: "Run the linter with `--fix` to auto-fix {N} of the warnings"
|
|
172
|
+
- Tests: "Add tests for the {N} skipped/failing cases in {file}"
|
|
173
|
+
- Dead Code: "Delete the {N} unused exports in {files} — they add maintenance surface"
|
|
174
|
+
|
|
175
|
+
## Completion Status
|
|
176
|
+
|
|
177
|
+
Report **DONE** with the dashboard, or **DONE_WITH_CONCERNS** if any category is below 6.
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: maintaining-context
|
|
3
|
-
description: Use at the start of any substantial task and whenever you make a non-obvious decision or learn a reusable fact — keeps .yoke/context/ (PROJECT, DECISIONS, KNOWLEDGE) the durable source of truth so fresh-context work never drifts.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Maintaining Project Context
|
|
7
|
-
|
|
8
|
-
Yoke keeps durable, cross-session context in `.yoke/context/`. These files are the
|
|
9
|
-
project's memory — they survive between sessions and loop iterations, so an agent
|
|
10
|
-
starting with a fresh context window is never blind.
|
|
11
|
-
|
|
12
|
-
## Before substantial work
|
|
13
|
-
|
|
14
|
-
1. Read `.yoke/context/PROJECT.md` — the north star (goal, constraints, **non-goals**, success criteria). Align your work to it. If the task contradicts a non-goal, stop and flag it.
|
|
15
|
-
2. Skim `.yoke/context/KNOWLEDGE.md` for gotchas that affect what you are about to do.
|
|
16
|
-
|
|
17
|
-
## While working
|
|
18
|
-
|
|
19
|
-
- When you make a **non-obvious decision** (a trade-off, an architectural choice, a rejected alternative), append it to `.yoke/context/DECISIONS.md`:
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
## <YYYY-MM-DD> — <area-or-story>: <short title>
|
|
23
|
-
What you chose and why, in one or two lines.
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
(This mirrors the heading the loop writes for completed stories, so loop-authored and hand-authored entries share one shape.)
|
|
27
|
-
|
|
28
|
-
- When you learn a **reusable fact or gotcha** (a non-obvious build step, an API quirk, a convention), append a bullet to `.yoke/context/KNOWLEDGE.md`.
|
|
29
|
-
|
|
30
|
-
## Rules
|
|
31
|
-
|
|
32
|
-
- Never rewrite history in `DECISIONS.md` — only append.
|
|
33
|
-
- Keep `PROJECT.md` curated and short; it is read into every loop prompt.
|
|
34
|
-
- Inside the autonomous loop, the loop appends a decision per completed story for you — you still add the *why* and any learnings.
|
|
1
|
+
---
|
|
2
|
+
name: maintaining-context
|
|
3
|
+
description: Use at the start of any substantial task and whenever you make a non-obvious decision or learn a reusable fact — keeps .yoke/context/ (PROJECT, DECISIONS, KNOWLEDGE) the durable source of truth so fresh-context work never drifts.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Maintaining Project Context
|
|
7
|
+
|
|
8
|
+
Yoke keeps durable, cross-session context in `.yoke/context/`. These files are the
|
|
9
|
+
project's memory — they survive between sessions and loop iterations, so an agent
|
|
10
|
+
starting with a fresh context window is never blind.
|
|
11
|
+
|
|
12
|
+
## Before substantial work
|
|
13
|
+
|
|
14
|
+
1. Read `.yoke/context/PROJECT.md` — the north star (goal, constraints, **non-goals**, success criteria). Align your work to it. If the task contradicts a non-goal, stop and flag it.
|
|
15
|
+
2. Skim `.yoke/context/KNOWLEDGE.md` for gotchas that affect what you are about to do.
|
|
16
|
+
|
|
17
|
+
## While working
|
|
18
|
+
|
|
19
|
+
- When you make a **non-obvious decision** (a trade-off, an architectural choice, a rejected alternative), append it to `.yoke/context/DECISIONS.md`:
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
## <YYYY-MM-DD> — <area-or-story>: <short title>
|
|
23
|
+
What you chose and why, in one or two lines.
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
(This mirrors the heading the loop writes for completed stories, so loop-authored and hand-authored entries share one shape.)
|
|
27
|
+
|
|
28
|
+
- When you learn a **reusable fact or gotcha** (a non-obvious build step, an API quirk, a convention), append a bullet to `.yoke/context/KNOWLEDGE.md`.
|
|
29
|
+
|
|
30
|
+
## Rules
|
|
31
|
+
|
|
32
|
+
- Never rewrite history in `DECISIONS.md` — only append.
|
|
33
|
+
- Keep `PROJECT.md` curated and short; it is read into every loop prompt.
|
|
34
|
+
- Inside the autonomous loop, the loop appends a decision per completed story for you — you still add the *why* and any learnings.
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: minimal-code
|
|
3
|
-
description: Use before writing any code — write the least code that fully solves the task (YAGNI, stdlib-first, no unrequested abstractions) to save tokens and reduce maintenance.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Minimal Code (lazy senior dev)
|
|
7
|
-
|
|
8
|
-
The best code is the code you never wrote. Before writing anything, walk this ladder and stop at the first rung that solves the task:
|
|
9
|
-
|
|
10
|
-
1. **Does it already exist?** Reuse an existing function, file, or builtin before writing new code.
|
|
11
|
-
2. **Can the language/stdlib do it?** Prefer the standard library and built-in platform features over a dependency or a hand-rolled version.
|
|
12
|
-
3. **Is the abstraction requested?** Do not add layers, config, interfaces, or generality nobody asked for. Solve the concrete case.
|
|
13
|
-
4. **Is it the shortest correct version?** Prefer deletion over addition, boring over clever, one obvious path over branching flexibility.
|
|
14
|
-
5. **Did the task actually ask for this?** Build only what was requested — no speculative features (YAGNI).
|
|
15
|
-
|
|
16
|
-
Rules:
|
|
17
|
-
- Deletion over addition. Boring over clever. No abstractions that were not requested.
|
|
18
|
-
- Prefer the standard library and existing code over new code or new dependencies.
|
|
19
|
-
- Mark an intentional simplification with a short `minimal-code:` comment so reviewers see it was deliberate.
|
|
20
|
-
|
|
21
|
-
This saves tokens (less generated code), shrinks the review surface, and lowers maintenance — complementary to rtk, which compresses command output. Adapted from the MIT-licensed "ponytail" ruleset (github.com/DietrichGebert/ponytail).
|
|
1
|
+
---
|
|
2
|
+
name: minimal-code
|
|
3
|
+
description: Use before writing any code — write the least code that fully solves the task (YAGNI, stdlib-first, no unrequested abstractions) to save tokens and reduce maintenance.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Minimal Code (lazy senior dev)
|
|
7
|
+
|
|
8
|
+
The best code is the code you never wrote. Before writing anything, walk this ladder and stop at the first rung that solves the task:
|
|
9
|
+
|
|
10
|
+
1. **Does it already exist?** Reuse an existing function, file, or builtin before writing new code.
|
|
11
|
+
2. **Can the language/stdlib do it?** Prefer the standard library and built-in platform features over a dependency or a hand-rolled version.
|
|
12
|
+
3. **Is the abstraction requested?** Do not add layers, config, interfaces, or generality nobody asked for. Solve the concrete case.
|
|
13
|
+
4. **Is it the shortest correct version?** Prefer deletion over addition, boring over clever, one obvious path over branching flexibility.
|
|
14
|
+
5. **Did the task actually ask for this?** Build only what was requested — no speculative features (YAGNI).
|
|
15
|
+
|
|
16
|
+
Rules:
|
|
17
|
+
- Deletion over addition. Boring over clever. No abstractions that were not requested.
|
|
18
|
+
- Prefer the standard library and existing code over new code or new dependencies.
|
|
19
|
+
- Mark an intentional simplification with a short `minimal-code:` comment so reviewers see it was deliberate.
|
|
20
|
+
|
|
21
|
+
This saves tokens (less generated code), shrinks the review surface, and lowers maintenance — complementary to rtk, which compresses command output. Adapted from the MIT-licensed "ponytail" ruleset (github.com/DietrichGebert/ponytail).
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: no-ai-slop
|
|
3
|
+
description: Edit prose into clearer, more direct writing while preserving the writer's voice, or detect named AI-slop patterns without rewriting or guessing authorship. Use for documentation, release notes, product copy, or prose audits; do not trigger for code-only work.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# No AI slop
|
|
7
|
+
|
|
8
|
+
Preserve the writer's point and voice while making the prose clearer and more alive. Remove observed
|
|
9
|
+
patterns without turning distinctive writing into generic polished copy.
|
|
10
|
+
|
|
11
|
+
## Choose the job
|
|
12
|
+
|
|
13
|
+
**Edit (default).** Make the minimum effective edit. Return the full edited draft and a short
|
|
14
|
+
**What changed** section.
|
|
15
|
+
|
|
16
|
+
**Detect.** Name every pattern from this skill that appears, quote the affected line, and give a
|
|
17
|
+
short fix. Do not rewrite, score the draft, or guess whether AI wrote it. Offer an edit after the
|
|
18
|
+
report.
|
|
19
|
+
|
|
20
|
+
If no draft was provided, ask for it. Ask one audience/format question only when the answer would
|
|
21
|
+
materially change the edit. If the goal is unclear, ask what the reader should think, feel, or do.
|
|
22
|
+
|
|
23
|
+
## Editing principles
|
|
24
|
+
|
|
25
|
+
- Read the full draft first and identify its point plus the vocabulary, cadence, bluntness, humor,
|
|
26
|
+
uncertainty, digressions, and polish level worth preserving.
|
|
27
|
+
- Make the minimum effective change. Fix observed patterns, errors, repetition, and unclear
|
|
28
|
+
passages. Leave strong sentences alone.
|
|
29
|
+
- Keep the writer's meaning. Do not invent claims, examples, statistics, sources, or opinions.
|
|
30
|
+
- Lead with the point when setup adds nothing. Keep setup that adds context, tension, or character.
|
|
31
|
+
- Open up tangled prose without flattening its cadence. Keep clear fragments and changes in pace.
|
|
32
|
+
- Prefer concrete facts, mechanisms, consequences, and judgments over abstract importance.
|
|
33
|
+
- Use the portability test: a sentence that could move unchanged to another product or company is
|
|
34
|
+
probably filler unless it carries a necessary general rule.
|
|
35
|
+
- Let facts and examples carry emphasis. Remove commentary that tells the reader what is important
|
|
36
|
+
when the prose already shows it.
|
|
37
|
+
- Prefer direct verbs and active voice when they are clearer.
|
|
38
|
+
- Preserve useful edge, strong opinions, humor, and honest uncertainty.
|
|
39
|
+
- Keep the existing structure unless it hurts the piece. Report any meaningful reorganization.
|
|
40
|
+
- Preserve precise technical and domain terms. A word that is empty in marketing copy can still be
|
|
41
|
+
correct in a product vocabulary. In Yoke, **coding harness** is an established, precise term; do
|
|
42
|
+
not replace it merely because "harness" is often vague elsewhere.
|
|
43
|
+
|
|
44
|
+
## Words and phrases to inspect
|
|
45
|
+
|
|
46
|
+
Remove these when they add no precise meaning: delve, foster, leverage, utilize, facilitate,
|
|
47
|
+
empower, streamline, robust, cutting-edge, paradigm shift, game changer, tapestry, realm, beacon,
|
|
48
|
+
multifaceted, meticulous, intricate, paramount, transformative, elevate, embark, supercharge,
|
|
49
|
+
harness, ever-evolving.
|
|
50
|
+
|
|
51
|
+
Inspect often-empty adverbs such as just, literally, honestly, simply, actually, truly,
|
|
52
|
+
fundamentally, importantly, crucially, inherently, and inevitably. Keep one when it carries real
|
|
53
|
+
emphasis, uncertainty, contrast, or spoken rhythm.
|
|
54
|
+
|
|
55
|
+
Inspect filler such as "it's worth noting," "at the end of the day," "when it comes to," "at its
|
|
56
|
+
core," "in today's world," "the reality is," "in terms of," "going forward," and "let's dive in."
|
|
57
|
+
Cut it when it delays the point.
|
|
58
|
+
|
|
59
|
+
The lists above are prompts for judgment, not blind replacements. Quoted examples, precise domain
|
|
60
|
+
language, and the writer's recognizable voice take precedence.
|
|
61
|
+
|
|
62
|
+
## Patterns to cut
|
|
63
|
+
|
|
64
|
+
- **Binary contrasts:** "This is not X. It's Y." State Y directly.
|
|
65
|
+
- **Throat-clearing:** "Here's the thing," "Let me be clear," or "The truth is." Start with the
|
|
66
|
+
point.
|
|
67
|
+
- **Faux-insight setups:** "What most people get wrong" or "The part everyone misses." Make the
|
|
68
|
+
claim stand on evidence.
|
|
69
|
+
- **Colon reveals:** a dramatic noun phrase followed by a lowercase reveal. Use a plain sentence;
|
|
70
|
+
reserve colons for lists, labels, and quotations.
|
|
71
|
+
- **Superficial analysis:** trailing clauses such as "highlighting" or "underscoring" that label
|
|
72
|
+
significance instead of explaining a mechanism or consequence.
|
|
73
|
+
- **Importance puffery:** "marks a pivotal moment," "plays a vital role," or "stands as a
|
|
74
|
+
testament." State the fact.
|
|
75
|
+
- **Interpretive metadiscourse:** "The key point is," "As you can see," "This distinction matters,"
|
|
76
|
+
or a redundant "In other words." Delete it or add the missing support.
|
|
77
|
+
- **Weasel attribution:** "experts agree," "studies show," or "widely regarded as." Name the source
|
|
78
|
+
or flag the unsupported claim.
|
|
79
|
+
- **Fake-strong verbs:** prefer "is" or "has" when they are clearer; otherwise name what the thing
|
|
80
|
+
actually does.
|
|
81
|
+
- **Synonym cycling:** repeat the correct term instead of rotating agent, assistant, and tool for
|
|
82
|
+
style.
|
|
83
|
+
- **Negative listing:** "Not X. Not Y. Z." State Z.
|
|
84
|
+
- **Dramatic fragmentation:** stacked punchy fragments or "That's it. That's the whole thing."
|
|
85
|
+
- **Robotic rhythm:** repeated sentence shapes, identical paragraph structures, or forced symmetry.
|
|
86
|
+
- **Rhetorical setups:** "What if I told you," "Plot twist," and self-answered question/answer pairs.
|
|
87
|
+
- **Fake-profound kickers:** delete the decorative final metaphor or mic-drop line. End on the last
|
|
88
|
+
concrete point or next action.
|
|
89
|
+
- **Summary-recap endings:** remove a final paragraph that merely repeats the piece.
|
|
90
|
+
- **Formatting slop:** emoji headings, decorative bold, bullets that should be sentences, and
|
|
91
|
+
headings over tiny sections.
|
|
92
|
+
- **Em-dash clusters:** use a comma, period, or parentheses unless the dash clearly improves the
|
|
93
|
+
sentence. Short copy usually needs none.
|
|
94
|
+
|
|
95
|
+
## Workflow
|
|
96
|
+
|
|
97
|
+
1. Read the whole draft and identify the point plus three to five voice signals internally.
|
|
98
|
+
2. In Detect mode, return named findings with quoted lines and short fixes, then stop.
|
|
99
|
+
3. In Edit mode, make the minimum useful changes.
|
|
100
|
+
4. Read [eval.md](eval.md) and check the result directly. Fix each failed check.
|
|
101
|
+
5. Return the full edited draft and **What changed**.
|
|
102
|
+
|
|
103
|
+
This skill reports observable prose patterns. It never classifies authorship.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# No AI slop eval
|
|
2
|
+
|
|
3
|
+
Use this after an edit. Mark each check pass or fail; fix failures before returning the draft.
|
|
4
|
+
|
|
5
|
+
For Detect mode, verify that the report names each observed pattern, quotes the affected passage,
|
|
6
|
+
and gives a short fix without rewriting, scoring, or claiming authorship.
|
|
7
|
+
|
|
8
|
+
## Meaning and voice
|
|
9
|
+
|
|
10
|
+
1. Does the edit preserve the writer's point without adding claims, examples, statistics, quotes,
|
|
11
|
+
sources, or opinions?
|
|
12
|
+
2. Does it preserve distinctive vocabulary, cadence, bluntness, humor, uncertainty, digressions,
|
|
13
|
+
and level of polish?
|
|
14
|
+
3. Were strong sentences left alone instead of normalized for consistency?
|
|
15
|
+
4. Is the amount of cutting proportional to the observed problems?
|
|
16
|
+
5. Does useful setup remain while generic throat-clearing is gone?
|
|
17
|
+
6. Was structure preserved unless changing it improved comprehension?
|
|
18
|
+
7. Are precise technical and domain terms unchanged, including established Yoke product language?
|
|
19
|
+
|
|
20
|
+
## Clarity
|
|
21
|
+
|
|
22
|
+
1. Does each generic sentence pass the portability test or carry a necessary general rule?
|
|
23
|
+
2. Do concrete facts, mechanisms, examples, consequences, and direct verbs do the work?
|
|
24
|
+
3. Are tangled sentences fixed while clear spoken cadence and fragments remain?
|
|
25
|
+
4. Are unsupported attributions named as unsupported rather than replaced with invented sources?
|
|
26
|
+
|
|
27
|
+
## Pattern check
|
|
28
|
+
|
|
29
|
+
1. Are empty buzzwords, filler phrases, and inflated claims removed unless quoted or used precisely?
|
|
30
|
+
2. Are binary contrasts, negative lists, rhetorical setups, and throat-clearing removed?
|
|
31
|
+
3. Are faux-insight setups, colon reveals, superficial analysis, synonym cycling, dramatic fragments,
|
|
32
|
+
and robotic rhythm fixed?
|
|
33
|
+
4. Is importance puffery replaced with facts, and interpretive metadiscourse removed?
|
|
34
|
+
5. Are decorative kickers and recap endings gone?
|
|
35
|
+
6. Does formatting follow the content instead of decorating it?
|
|
36
|
+
7. Are colons grammatical and em dashes sparse?
|
|
37
|
+
|
|
38
|
+
## Final read
|
|
39
|
+
|
|
40
|
+
1. Would the writer recognize the edited draft as their own voice?
|
|
41
|
+
2. Would it sound natural when read to a sharp colleague?
|
|
42
|
+
3. Does Edit output include the full draft and **What changed**?
|
|
43
|
+
4. Does Detect output stop after named, quoted, actionable findings?
|