chill-agent 1.5.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/contrast-mcp-launcher.mjs +31 -0
- package/.claude-plugin/plugin.json +8 -3
- package/.cline-plugin/plugin.js +6 -0
- package/.codex-plugin/plugin.json +4 -3
- package/.cursor-plugin/marketplace.json +16 -0
- package/.cursor-plugin/plugin.json +2 -2
- package/.devin-plugin/plugin.json +2 -2
- package/.kimi-plugin/plugin.json +11 -29
- package/.omp-plugin/marketplace.json +15 -0
- package/.openclaw/skills/ponytail/SKILL.md +2 -7
- package/.openclaw/skills/ponytail-audit/SKILL.md +3 -6
- package/.openclaw/skills/ponytail-debt/SKILL.md +3 -4
- package/.openclaw/skills/ponytail-gain/SKILL.md +3 -4
- package/.openclaw/skills/ponytail-help/SKILL.md +3 -3
- package/.openclaw/skills/ponytail-review/SKILL.md +3 -6
- package/.opencode/plugins/ponytail.mjs +1 -1
- package/.qoder-plugin/plugin.json +12 -26
- package/AGENTS.md +32 -19
- package/__init__.py +1 -1
- package/assets/antislop-banner.png +0 -0
- package/assets/band/band.png +0 -0
- package/assets/band/board.png +0 -0
- package/assets/benchmark-3model.svg +21 -0
- package/assets/benchmark-agentic.svg +62 -0
- package/assets/codex-icon.png +0 -0
- package/assets/compare/code/after.webp +0 -0
- package/assets/compare/code/before.webp +0 -0
- package/assets/compare/text/after.webp +0 -0
- package/assets/compare/text/before.webp +0 -0
- package/assets/compare/ui/w-all.webp +0 -0
- package/assets/compare/ui/w-antislop.webp +0 -0
- package/assets/compare/ui/w-design.webp +0 -0
- package/assets/compare/ui/without.webp +0 -0
- package/assets/logo-dark.png +0 -0
- package/assets/logo-dark.svg +115 -0
- package/assets/logo-greenpt-dark.svg +27 -0
- package/assets/logo-greenpt.svg +27 -0
- package/assets/logo.png +0 -0
- package/assets/photoreunion-logo-dark.svg +4 -0
- package/assets/photoreunion-logo-light.svg +4 -0
- package/assets/profile.png +0 -0
- package/assets/retriever-logo-dark.svg +4 -0
- package/assets/retriever-logo-light.svg +4 -0
- package/assets/stories-banner.png +0 -0
- package/assets/v5/audit-es.png +0 -0
- package/assets/v5/audit-ja.png +0 -0
- package/assets/v5/audit-ko.png +0 -0
- package/assets/v5/audit-zh-CN.png +0 -0
- package/assets/v5/audit.png +0 -0
- package/assets/v5/beforeafter-es.png +0 -0
- package/assets/v5/beforeafter-ja.png +0 -0
- package/assets/v5/beforeafter-ko.png +0 -0
- package/assets/v5/beforeafter-zh-CN.png +0 -0
- package/assets/v5/beforeafter.png +0 -0
- package/assets/v5/chart-es.png +0 -0
- package/assets/v5/chart-ja.png +0 -0
- package/assets/v5/chart-ko.png +0 -0
- package/assets/v5/chart-zh-CN.png +0 -0
- package/assets/v5/chart.png +0 -0
- package/assets/v5/hero-es.jpg +0 -0
- package/assets/v5/hero-ja.jpg +0 -0
- package/assets/v5/hero-ko.jpg +0 -0
- package/assets/v5/hero-zh-CN.jpg +0 -0
- package/assets/v5/hero.jpg +0 -0
- package/assets/v5/ladder-es.png +0 -0
- package/assets/v5/ladder-ja.png +0 -0
- package/assets/v5/ladder-ko.png +0 -0
- package/assets/v5/ladder-zh-CN.png +0 -0
- package/assets/v5/ladder.png +0 -0
- package/assets/v5/review-es.png +0 -0
- package/assets/v5/review-ja.png +0 -0
- package/assets/v5/review-ko.png +0 -0
- package/assets/v5/review-zh-CN.png +0 -0
- package/assets/v5/review.png +0 -0
- package/assets/v5/tests-es.png +0 -0
- package/assets/v5/tests-ja.png +0 -0
- package/assets/v5/tests-ko.png +0 -0
- package/assets/v5/tests-zh-CN.png +0 -0
- package/assets/v5/tests.png +0 -0
- package/assets/waitlist-banner-es.png +0 -0
- package/assets/waitlist-banner-ja.png +0 -0
- package/assets/waitlist-banner-ko.png +0 -0
- package/assets/waitlist-banner-zh-CN.png +0 -0
- package/assets/waitlist-banner.png +0 -0
- package/benchmarks/.env.example +2 -0
- package/benchmarks/agentic/README.md +201 -0
- package/benchmarks/agentic/answer.py +288 -0
- package/benchmarks/agentic/compare.py +93 -0
- package/benchmarks/agentic/complete.py +178 -0
- package/benchmarks/agentic/judge.py +198 -0
- package/benchmarks/agentic/run.py +543 -0
- package/benchmarks/agentic/tasks.py +1544 -0
- package/benchmarks/arms/baseline.js +2 -0
- package/benchmarks/arms/caveman-SKILL.md +67 -0
- package/benchmarks/arms/caveman.js +8 -0
- package/benchmarks/arms/ponytail.js +8 -0
- package/benchmarks/behavior.js +54 -0
- package/benchmarks/behavior.yaml +40 -0
- package/benchmarks/correctness.js +291 -0
- package/benchmarks/loc.js +17 -19
- package/benchmarks/promptfooconfig.gemini.yaml +32 -0
- package/benchmarks/promptfooconfig.gpt-newest.yaml +33 -0
- package/benchmarks/promptfooconfig.yaml +41 -0
- package/benchmarks/results/2026-06-12-caveman-vs-ponytail.md +71 -0
- package/benchmarks/results/2026-06-12-v4-hardening-vs-caveman.md +125 -0
- package/benchmarks/results/2026-06-15-llama3.2-local.md +82 -0
- package/benchmarks/results/2026-06-16-correctness-gate-fix.md +113 -0
- package/benchmarks/results/2026-06-16-robustness-audit.md +135 -0
- package/benchmarks/results/2026-06-17-agentic-safety.md +164 -0
- package/benchmarks/results/2026-06-17-cost-verification.md +93 -0
- package/benchmarks/results/2026-06-18-agentic.md +219 -0
- package/benchmarks/results/2026-06-22-issue-245-217-comprehension.md +98 -0
- package/benchmarks/results/2026-10-07-agentic.md +186 -0
- package/cli/index.mjs +241 -0
- package/cli/lib/banner.mjs +21 -0
- package/cli/lib/install.mjs +498 -0
- package/cli/lib/settings.mjs +48 -0
- package/cli/package-lock.json +87 -0
- package/cli/package.json +42 -0
- package/cli/scripts/smoke-test.mjs +95 -0
- package/cli/scripts/smoke-worker.mjs +411 -0
- package/cli/scripts/sync-skills.mjs +81 -0
- package/examples/email-validation.md +156 -0
- package/examples/group-by.md +35 -0
- package/examples/infinite-scroll.md +58 -0
- package/examples/number-formatting.md +37 -0
- package/examples/rate-limit.md +272 -0
- package/examples/react-countdown.md +390 -0
- package/examples/url-params.md +41 -0
- package/gemini-extension.json +2 -2
- package/hooks/band/board.ts +560 -0
- package/hooks/band/logo.ts +3 -0
- package/hooks/band/metrics.ts +311 -0
- package/hooks/band/register.tsx +495 -0
- package/hooks/band/types.d.ts +34 -0
- package/hooks/claude-band.json +6 -0
- package/hooks/claude-codex-hooks.json +34 -4
- package/hooks/copilot-hooks.json +12 -2
- package/hooks/cursor-hooks.json +2 -2
- package/hooks/ponytail-band-import.js +274 -0
- package/hooks/ponytail-config.js +175 -0
- package/hooks/ponytail-map.js +111 -0
- package/hooks/ponytail-subagent.js +94 -0
- package/hooks/qoder-hooks.json +19 -4
- package/i18n/README.ko.md +230 -0
- package/package.json +12 -7
- package/pi-extension/test/extension.test.js +367 -0
- package/pi-extension/test/helpers.test.js +179 -0
- package/plugin.yaml +21 -12
- package/rules/antislop.mdc +18 -0
- package/scripts/build-openclaw-skills.js +60 -0
- package/scripts/check-repo.mjs +389 -0
- package/scripts/publish-openclaw-skills.js +75 -0
- package/scripts/skill-index.mjs +81 -0
- package/skills/antislop/SKILL.md +700 -0
- package/skills/antislop/VERSION +1 -0
- package/skills/antislop-code/SKILL.md +128 -0
- package/skills/antislop-copywriting/SKILL.md +407 -0
- package/skills/antislop-human/LICENSE-web-quality-skills +21 -0
- package/skills/antislop-human/SKILL.md +204 -0
- package/skills/antislop-human/contrast-check.py +168 -0
- package/skills/antislop-human/contrast-mcp.py +121 -0
- package/skills/antislop-human/references/A11Y-PATTERNS.md +249 -0
- package/skills/antislop-human/references/WCAG.md +127 -0
- package/skills/antislop-layoutmobile/SKILL.md +170 -0
- package/skills/antislop-ui/LICENSE-web-quality-skills +21 -0
- package/skills/antislop-ui/SKILL.md +344 -0
- package/skills/antislop-ui/references/CORE-WEB-VITALS.md +181 -0
- package/skills/antislop-ui/references/WEB-BASELINE.md +28 -0
- package/skills/plugin.json +5 -0
- package/src/package.json +3 -0
- package/tests/activation-map.test.js +63 -0
- package/tests/band-import.test.js +111 -0
- package/tests/band.test.tsx +520 -0
- package/tests/behavior.test.js +80 -0
- package/tests/gemini-extension.test.js +2 -2
- package/tests/grok-plugin.test.js +1 -1
- package/tests/hermes-plugin.test.js +1 -1
- package/tests/hooks-windows.test.js +205 -0
- package/tests/kimi-plugin.test.js +1 -1
- package/tests/map.test.js +30 -0
- package/tests/package-scripts.test.js +35 -0
- package/tests/package.test.js +23 -0
- package/tests/uninstall.test.js +202 -0
- /package/bin/{chill-agent.js → chill-agent.mjs} +0 -0
- /package/tests/{manifests.test.js → manifests.test.mjs} +0 -0
- /package/tests/{rules.test.js → rules.test.mjs} +0 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Starts contrast-mcp.py with whichever Python name this machine has.
|
|
4
|
+
* The manifest's `command` is a single string and cannot pick per platform.
|
|
5
|
+
*/
|
|
6
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
|
|
10
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const server = path.join(here, "..", "skills", "antislop-human", "contrast-mcp.py");
|
|
12
|
+
|
|
13
|
+
const candidates = process.platform === "win32" ? ["python", "python3"] : ["python3", "python"];
|
|
14
|
+
|
|
15
|
+
// Run each candidate: the Windows `python` stub is on PATH but only opens the
|
|
16
|
+
// Store, and pyenv shims exit non-zero when no version is set.
|
|
17
|
+
const python = candidates.find(
|
|
18
|
+
(bin) => spawnSync(bin, ["-c", ""], { stdio: "ignore" }).status === 0
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
if (!python) {
|
|
22
|
+
// stderr, never stdout: stdout is the JSON-RPC channel.
|
|
23
|
+
console.error(
|
|
24
|
+
`antislop-contrast: no working Python found (tried ${candidates.join(", ")}). ` +
|
|
25
|
+
"Install Python 3 to use the contrast tool."
|
|
26
|
+
);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const child = spawn(python, [server], { stdio: "inherit" });
|
|
31
|
+
child.on("exit", (code, signal) => process.exit(signal ? 1 : (code ?? 0)));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chill-agent",
|
|
3
3
|
"displayName": "ChillAgent (Anti-Slop 2.0 + Ponytail Senior Dev)",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.6.0",
|
|
5
5
|
"description": "Master Negative Filter, Anti-Slop, and Pragmatic Senior Dev Standard. Combines ruthless YAGNI minimalism with Linear-grade visual engineering.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "sann"
|
|
@@ -31,5 +31,10 @@
|
|
|
31
31
|
"./skills/chill-debt/",
|
|
32
32
|
"./skills/chill-gain/",
|
|
33
33
|
"./skills/chill-help/"
|
|
34
|
-
]
|
|
35
|
-
|
|
34
|
+
],
|
|
35
|
+
"hooks": [
|
|
36
|
+
"./hooks/claude-codex-hooks.json",
|
|
37
|
+
"./hooks/claude-band.json"
|
|
38
|
+
],
|
|
39
|
+
"types": "./hooks/band/types.d.ts"
|
|
40
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chill-agent",
|
|
3
3
|
"displayName": "ChillAgent (Anti-Slop 2.0 + Ponytail Senior Dev)",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.6.0",
|
|
5
5
|
"description": "Master Negative Filter, Anti-Slop, and Pragmatic Senior Dev Standard. Combines ruthless YAGNI minimalism with Linear-grade visual engineering.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "sann"
|
|
@@ -31,5 +31,6 @@
|
|
|
31
31
|
"./skills/chill-debt/",
|
|
32
32
|
"./skills/chill-gain/",
|
|
33
33
|
"./skills/chill-help/"
|
|
34
|
-
]
|
|
35
|
-
|
|
34
|
+
],
|
|
35
|
+
"hooks": "./hooks/claude-codex-hooks.json"
|
|
36
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "anti-slop",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "miqdadbadjuber"
|
|
5
|
+
},
|
|
6
|
+
"metadata": {
|
|
7
|
+
"description": "The antislop plugin for Cursor. Anti Slop: Rules for AI Coding Agents."
|
|
8
|
+
},
|
|
9
|
+
"plugins": [
|
|
10
|
+
{
|
|
11
|
+
"name": "antislop",
|
|
12
|
+
"source": ".",
|
|
13
|
+
"description": "Anti Slop: Rules for AI Coding Agents. Stops generic AI slop in generated UI, copy, and code. Loads as six skills."
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chill-agent",
|
|
3
3
|
"displayName": "ChillAgent (Anti-Slop 2.0 + Ponytail Senior Dev)",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.6.0",
|
|
5
5
|
"description": "Master Negative Filter, Anti-Slop, and Pragmatic Senior Dev Standard. Combines ruthless YAGNI minimalism with Linear-grade visual engineering.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "sann"
|
|
@@ -32,4 +32,4 @@
|
|
|
32
32
|
"./skills/chill-gain/",
|
|
33
33
|
"./skills/chill-help/"
|
|
34
34
|
]
|
|
35
|
-
}
|
|
35
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chill-agent",
|
|
3
3
|
"displayName": "ChillAgent (Anti-Slop 2.0 + Ponytail Senior Dev)",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.6.0",
|
|
5
5
|
"description": "Master Negative Filter, Anti-Slop, and Pragmatic Senior Dev Standard. Combines ruthless YAGNI minimalism with Linear-grade visual engineering.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "sann"
|
|
@@ -32,4 +32,4 @@
|
|
|
32
32
|
"./skills/chill-gain/",
|
|
33
33
|
"./skills/chill-help/"
|
|
34
34
|
]
|
|
35
|
-
}
|
|
35
|
+
}
|
package/.kimi-plugin/plugin.json
CHANGED
|
@@ -1,35 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chill-agent",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"description": "Master Negative Filter, Anti-Slop, and Pragmatic Senior Dev Standard. Combines ruthless YAGNI minimalism with Linear-grade visual engineering.",
|
|
3
|
+
"version": "1.6.0",
|
|
4
|
+
"description": "Lazy senior dev mode. Forces the simplest, shortest solution that actually works: YAGNI, stdlib first, no unrequested abstractions.",
|
|
6
5
|
"author": {
|
|
7
|
-
"name": "sann"
|
|
6
|
+
"name": "sann",
|
|
7
|
+
"url": "https://github.com/sann/chill-agent"
|
|
8
8
|
},
|
|
9
9
|
"homepage": "https://github.com/sann/chill-agent",
|
|
10
|
-
"repository": "https://github.com/sann/chill-agent",
|
|
11
10
|
"license": "MIT",
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"ui",
|
|
20
|
-
"accessibility"
|
|
21
|
-
],
|
|
22
|
-
"skills": [
|
|
23
|
-
"./skills/chill-slop/",
|
|
24
|
-
"./skills/chill-slop-ui/",
|
|
25
|
-
"./skills/chill-slop-code/",
|
|
26
|
-
"./skills/chill-slop-copywriting/",
|
|
27
|
-
"./skills/chill-slop-human/",
|
|
28
|
-
"./skills/chill-slop-mobile/",
|
|
29
|
-
"./skills/chill-audit/",
|
|
30
|
-
"./skills/chill-review/",
|
|
31
|
-
"./skills/chill-debt/",
|
|
32
|
-
"./skills/chill-gain/",
|
|
33
|
-
"./skills/chill-help/"
|
|
34
|
-
]
|
|
35
|
-
}
|
|
11
|
+
"interface": {
|
|
12
|
+
"displayName": "ChillAgent (Anti-Slop 2.0 + Ponytail)",
|
|
13
|
+
"shortDescription": "Lazy senior dev mode: YAGNI, stdlib first, the least code that works."
|
|
14
|
+
},
|
|
15
|
+
"skills": "./skills/",
|
|
16
|
+
"systemPromptPath": "./AGENTS.md"
|
|
17
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "anti-slop",
|
|
3
|
+
"description": "The antislop skill/plugin. Anti Slop: Rules for AI Coding Agents.",
|
|
4
|
+
"owner": {
|
|
5
|
+
"name": "miqdadbadjuber"
|
|
6
|
+
},
|
|
7
|
+
"plugins": [
|
|
8
|
+
{
|
|
9
|
+
"name": "antislop",
|
|
10
|
+
"source": "./",
|
|
11
|
+
"version": "3.2.26",
|
|
12
|
+
"description": "Anti Slop: Rules for AI Coding Agents. Stops generic AI slop in generated UI, copy, and code. Loads as six skills."
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ponytail
|
|
3
|
-
description:
|
|
4
|
-
|
|
5
|
-
reply a busy human understands in one read. Use on any coding task (writing,
|
|
6
|
-
fixing, refactoring, reviewing, choosing dependencies) and when the user says
|
|
7
|
-
"ponytail", "be lazy", "simplest solution", "yagni", or complains about
|
|
8
|
-
over-engineering or bloat. Levels: lite, full (default), ultra.
|
|
9
|
-
argument-hint: "[lite|full|ultra|off]"
|
|
3
|
+
description: "Lazy senior dev mode for any coding task: the smallest change that fully solves it, and a reply a busy human understands in one read."
|
|
4
|
+
homepage: https://github.com/DietrichGebert/ponytail
|
|
10
5
|
license: MIT
|
|
11
6
|
---
|
|
12
7
|
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ponytail-audit
|
|
3
|
-
description:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
split. Ranked, each finding explained in plain English. One-shot report,
|
|
7
|
-
changes nothing. Use for "audit this codebase", "review the whole repo",
|
|
8
|
-
"find bloat", "what can I delete", /ponytail-audit.
|
|
3
|
+
description: "Quality audit of the whole repo: bugs, security, real load, missing tests, speed, and what to delete. Most important first."
|
|
4
|
+
homepage: https://github.com/DietrichGebert/ponytail
|
|
5
|
+
license: MIT
|
|
9
6
|
---
|
|
10
7
|
|
|
11
8
|
Audit the whole repo like the senior developer who just inherited it and
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ponytail-debt
|
|
3
|
-
description:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
shortcuts", /ponytail-debt.
|
|
3
|
+
description: "Harvest every shortcut: comment into one debt ledger, so deferrals get tracked instead of forgotten. One-shot report."
|
|
4
|
+
homepage: https://github.com/DietrichGebert/ponytail
|
|
5
|
+
license: MIT
|
|
7
6
|
---
|
|
8
7
|
|
|
9
8
|
Every deliberate ponytail shortcut is marked with a `shortcut:` comment naming
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ponytail-gain
|
|
3
|
-
description:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
"ponytail impact".
|
|
3
|
+
description: "Show ponytail measured impact as a scoreboard: less code, less cost, more speed, from the agentic benchmark averages. One-shot display."
|
|
4
|
+
homepage: https://github.com/DietrichGebert/ponytail
|
|
5
|
+
license: MIT
|
|
7
6
|
---
|
|
8
7
|
|
|
9
8
|
# Ponytail Gain
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ponytail-help
|
|
3
|
-
description:
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
description: "Quick reference for ponytail's modes, skills, and commands. One-shot display."
|
|
4
|
+
homepage: https://github.com/DietrichGebert/ponytail
|
|
5
|
+
license: MIT
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Ponytail Help
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ponytail-review
|
|
3
|
-
description:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
needed. Reads the connected code, not only the diff. Each finding is
|
|
7
|
-
explained in plain English. Use for "review this", "code review", "review
|
|
8
|
-
the last commit", "review my PR", "is this over-engineered", /ponytail-review.
|
|
3
|
+
description: "Quality review of a diff: bugs, security, real load, missing tests, speed, and what to delete. Each finding says what goes wrong and how to fix it."
|
|
4
|
+
homepage: https://github.com/DietrichGebert/ponytail
|
|
5
|
+
license: MIT
|
|
9
6
|
---
|
|
10
7
|
|
|
11
8
|
Review a change like the senior developer who will be paged when it breaks.
|
|
@@ -91,7 +91,7 @@ function readSkills() {
|
|
|
91
91
|
const dir = path.resolve(__dirname, '../../skills');
|
|
92
92
|
try {
|
|
93
93
|
return fs.readdirSync(dir, { withFileTypes: true })
|
|
94
|
-
.filter((entry) => entry.isDirectory())
|
|
94
|
+
.filter((entry) => entry.isDirectory() && entry.name.startsWith('ponytail'))
|
|
95
95
|
.map((entry) => {
|
|
96
96
|
const file = path.join(dir, entry.name, 'SKILL.md');
|
|
97
97
|
const parsed = parseSkillFile(file);
|
|
@@ -1,35 +1,21 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"description": "Master Negative Filter, Anti-Slop, and Pragmatic Senior Dev Standard. Combines ruthless YAGNI minimalism with Linear-grade visual engineering.",
|
|
2
|
+
"name": "ponytail",
|
|
3
|
+
"version": "1.6.0",
|
|
4
|
+
"description": "Lazy senior dev mode. Forces the simplest, shortest solution that actually works: YAGNI, stdlib first, no unrequested abstractions.",
|
|
6
5
|
"author": {
|
|
7
|
-
"name": "sann"
|
|
6
|
+
"name": "sann",
|
|
7
|
+
"url": "https://github.com/sann/chill-agent"
|
|
8
8
|
},
|
|
9
9
|
"homepage": "https://github.com/sann/chill-agent",
|
|
10
10
|
"repository": "https://github.com/sann/chill-agent",
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"keywords": [
|
|
13
|
-
"anti-slop",
|
|
14
|
-
"ponytail",
|
|
15
|
-
"design-rules",
|
|
16
|
-
"minimalism",
|
|
17
|
-
"agent-skills",
|
|
18
13
|
"yagni",
|
|
19
|
-
"
|
|
20
|
-
"
|
|
14
|
+
"minimalism",
|
|
15
|
+
"code-review",
|
|
16
|
+
"productivity"
|
|
21
17
|
],
|
|
22
|
-
"skills":
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
"./skills/chill-slop-copywriting/",
|
|
27
|
-
"./skills/chill-slop-human/",
|
|
28
|
-
"./skills/chill-slop-mobile/",
|
|
29
|
-
"./skills/chill-audit/",
|
|
30
|
-
"./skills/chill-review/",
|
|
31
|
-
"./skills/chill-debt/",
|
|
32
|
-
"./skills/chill-gain/",
|
|
33
|
-
"./skills/chill-help/"
|
|
34
|
-
]
|
|
35
|
-
}
|
|
18
|
+
"skills": "./skills/",
|
|
19
|
+
"rules": "./.qoder/rules/",
|
|
20
|
+
"hooks": "./hooks/qoder-hooks.json"
|
|
21
|
+
}
|
package/AGENTS.md
CHANGED
|
@@ -1,19 +1,32 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
Before
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
1
|
+
# Ponytail, lazy senior dev mode
|
|
2
|
+
|
|
3
|
+
You are a lazy senior developer. The best code is the code never written. You solve the whole problem with the least new code. End your reply with one or two lines: what you skipped or did not check, and any risk the user must know.
|
|
4
|
+
|
|
5
|
+
## Before you write
|
|
6
|
+
|
|
7
|
+
Read the task and the code it touches. List every place your change must reach: callers, tests, fixtures, config, exports. Check what your change could break for users: data it would destroy or expose, callers that stop working. That is scope. Extra features are not.
|
|
8
|
+
|
|
9
|
+
## The smallest complete change
|
|
10
|
+
|
|
11
|
+
Take the first option that fully works:
|
|
12
|
+
|
|
13
|
+
1. Does it need to exist? Skip features, options and flexibility nobody asked for, and name them in one line. A vague request ("build me X") gets the smallest version that does the core job.
|
|
14
|
+
2. Already in this codebase (a helper, component, service, pattern)? Use it the way the surrounding code does.
|
|
15
|
+
3. Standard library or a platform feature? Use it, unless the project has its own. A house component beats a native widget.
|
|
16
|
+
4. An installed dependency? Use it. Never add a dependency for a few lines.
|
|
17
|
+
5. Can it be one line a reader gets at a glance? One line.
|
|
18
|
+
6. Otherwise: the minimum code that works.
|
|
19
|
+
|
|
20
|
+
- Be lazy about the solution, never about the change itself: finish every part the task needs, including the callers, tests and fixtures your change breaks.
|
|
21
|
+
- No abstraction, wrapper, type conversion, option, config, boilerplate or "for later" code nobody asked for. Keep values in the form the platform already gives you. Deletion beats addition. Keep the structure the codebase already has: its layers, interfaces and conventions.
|
|
22
|
+
- The shortest working diff wins, once you know everything it must touch. A one-liner that needs decoding is not short.
|
|
23
|
+
- Comment only the why the code cannot show, in one line.
|
|
24
|
+
- Bug fix: before you edit, grep every caller of the function you touch, then fix the root cause once in the shared code.
|
|
25
|
+
- Code you move or merge keeps its error handling and validation.
|
|
26
|
+
- Between options of equal size, take the one that is correct on edge cases.
|
|
27
|
+
- Lazy code without its check is unfinished: new non-trivial logic (a branch, a loop, a parser, money or security, or a whole new script or app) leaves one small test or an assert-based self-check. Trivial changes need none.
|
|
28
|
+
- A shortcut with a known limit gets a code comment in this form: `shortcut: <the limit>, <when to upgrade>`.
|
|
29
|
+
|
|
30
|
+
Never cut: validation at trust boundaries, error handling that prevents data loss, security, accessibility, the calibration real hardware needs, anything the user asked for.
|
|
31
|
+
|
|
32
|
+
(Yes, this file also applies to agents working on the ponytail repo itself. Especially to them.)
|
package/__init__.py
CHANGED
|
@@ -207,7 +207,7 @@ def register(ctx: Any) -> None:
|
|
|
207
207
|
"""Register Ponytail hooks, skills, and slash commands with Hermes."""
|
|
208
208
|
for child in sorted(SKILLS_DIR.iterdir() if SKILLS_DIR.exists() else []):
|
|
209
209
|
skill_md = child / "SKILL.md"
|
|
210
|
-
if child.is_dir() and skill_md.exists():
|
|
210
|
+
if child.is_dir() and skill_md.exists() and child.name.startswith("ponytail"):
|
|
211
211
|
ctx.register_skill(child.name, skill_md)
|
|
212
212
|
|
|
213
213
|
ctx.register_hook("pre_llm_call", _pre_llm_call)
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<svg viewBox="0 0 860 336" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system, 'Segoe UI', Helvetica, Arial, sans-serif">
|
|
2
|
+
<title>Median lines of code per arm across three models</title>
|
|
3
|
+
<text x="20" y="26" font-size="15" font-weight="600" fill="#8b949e">Median lines of code. 10 runs per cell. Lower is leaner.</text>
|
|
4
|
+
<text x="20" y="45" font-size="12" fill="#8b949e" opacity="0.85">Ponytail writes 80-94% less code, costs 42-75% less, and runs 3-6x faster than a no-skill agent.</text>
|
|
5
|
+
<rect x="20" y="58" width="12" height="12" rx="2" fill="#8b949e"/><text x="38" y="69" font-size="13" fill="#8b949e">baseline (no skill)</text>
|
|
6
|
+
<rect x="190" y="58" width="12" height="12" rx="2" fill="#d9822b"/><text x="208" y="69" font-size="13" fill="#8b949e">caveman</text>
|
|
7
|
+
<rect x="300" y="58" width="12" height="12" rx="2" fill="#2da44e"/><text x="318" y="69" font-size="13" fill="#8b949e">ponytail</text>
|
|
8
|
+
<text x="112" y="119" font-size="13" font-weight="600" fill="#8b949e" text-anchor="end">Haiku</text>
|
|
9
|
+
<rect x="120" y="92" width="508" height="14" rx="2" fill="#8b949e"/><text x="634" y="103" font-size="11" fill="#8b949e">518</text>
|
|
10
|
+
<rect x="120" y="110" width="114" height="14" rx="2" fill="#d9822b"/><text x="240" y="121" font-size="11" fill="#d9822b">116</text>
|
|
11
|
+
<rect x="120" y="128" width="38" height="14" rx="2" fill="#2da44e"/><text x="164" y="139" font-size="11" fill="#2da44e" font-weight="600">39</text>
|
|
12
|
+
<text x="112" y="193" font-size="13" font-weight="600" fill="#8b949e" text-anchor="end">Sonnet</text>
|
|
13
|
+
<rect x="120" y="166" width="680" height="14" rx="2" fill="#8b949e"/><text x="806" y="177" font-size="11" fill="#8b949e">693</text>
|
|
14
|
+
<rect x="120" y="184" width="118" height="14" rx="2" fill="#d9822b"/><text x="244" y="195" font-size="11" fill="#d9822b">120</text>
|
|
15
|
+
<rect x="120" y="202" width="43" height="14" rx="2" fill="#2da44e"/><text x="169" y="213" font-size="11" fill="#2da44e" font-weight="600">44</text>
|
|
16
|
+
<text x="112" y="267" font-size="13" font-weight="600" fill="#8b949e" text-anchor="end">Opus</text>
|
|
17
|
+
<rect x="120" y="240" width="251" height="14" rx="2" fill="#8b949e"/><text x="377" y="251" font-size="11" fill="#8b949e">256</text>
|
|
18
|
+
<rect x="120" y="258" width="66" height="14" rx="2" fill="#d9822b"/><text x="192" y="269" font-size="11" fill="#d9822b">67</text>
|
|
19
|
+
<rect x="120" y="276" width="50" height="14" rx="2" fill="#2da44e"/><text x="176" y="287" font-size="11" fill="#2da44e" font-weight="600">51</text>
|
|
20
|
+
<text x="120" y="324" font-size="11" fill="#8b949e" opacity="0.8">Median of 10 runs/cell, default temperature. 5 tasks (email, debounce, CSV sum, countdown, rate-limit), same model per group. Reproduce: npx promptfoo eval -c benchmarks/promptfooconfig.yaml</text>
|
|
21
|
+
</svg>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<svg viewBox="0 0 860 488" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system, 'Segoe UI', Helvetica, Arial, sans-serif">
|
|
2
|
+
<title>Each arm vs the no-skill baseline across every metric, plus safety, Claude Code on Haiku 4.5</title>
|
|
3
|
+
<text x="430" y="24" font-size="15" font-weight="600" fill="#8b949e" text-anchor="middle">Every metric vs the no-skill baseline (Claude Code, Haiku 4.5, 12 tasks)</text>
|
|
4
|
+
|
|
5
|
+
<rect x="212" y="38" width="12" height="12" rx="2" fill="#8b949e"/><text x="229" y="48" font-size="12" fill="#8b949e">baseline</text>
|
|
6
|
+
<rect x="300" y="38" width="12" height="12" rx="2" fill="#d9822b"/><text x="317" y="48" font-size="12" fill="#8b949e">caveman</text>
|
|
7
|
+
<rect x="392" y="38" width="12" height="12" rx="2" fill="#2da44e"/><text x="409" y="48" font-size="12" fill="#8b949e">ponytail</text>
|
|
8
|
+
<rect x="478" y="38" width="12" height="12" rx="2" fill="#8957e5"/><text x="495" y="48" font-size="12" fill="#8b949e">yagni-oneliner</text>
|
|
9
|
+
|
|
10
|
+
<text x="32" y="248" font-size="12" fill="#8b949e" text-anchor="middle" transform="rotate(-90 32 248)">% of baseline (lower is leaner)</text>
|
|
11
|
+
<line x1="85" y1="360" x2="815" y2="360" stroke="#8b949e" stroke-opacity="0.55"/>
|
|
12
|
+
<line x1="85" y1="305" x2="815" y2="305" stroke="#8b949e" stroke-opacity="0.16"/>
|
|
13
|
+
<line x1="85" y1="250" x2="815" y2="250" stroke="#8b949e" stroke-opacity="0.16"/>
|
|
14
|
+
<line x1="85" y1="195" x2="815" y2="195" stroke="#8b949e" stroke-opacity="0.16"/>
|
|
15
|
+
<line x1="85" y1="140" x2="815" y2="140" stroke="#8b949e" stroke-opacity="0.45" stroke-dasharray="4 4"/>
|
|
16
|
+
<text x="78" y="364" font-size="11" fill="#8b949e" text-anchor="end">0%</text>
|
|
17
|
+
<text x="78" y="309" font-size="11" fill="#8b949e" text-anchor="end">25%</text>
|
|
18
|
+
<text x="78" y="254" font-size="11" fill="#8b949e" text-anchor="end">50%</text>
|
|
19
|
+
<text x="78" y="199" font-size="11" fill="#8b949e" text-anchor="end">75%</text>
|
|
20
|
+
<text x="78" y="144" font-size="11" fill="#8b949e" text-anchor="end">100%</text>
|
|
21
|
+
|
|
22
|
+
<!-- LOC -->
|
|
23
|
+
<rect x="108" y="140" width="30" height="220" rx="2" fill="#8b949e"/><text x="123" y="135" font-size="10" fill="#8b949e" text-anchor="middle">100%</text>
|
|
24
|
+
<rect x="146" y="184" width="30" height="176" rx="2" fill="#d9822b"/><text x="161" y="179" font-size="10" fill="#d9822b" text-anchor="middle">80%</text>
|
|
25
|
+
<rect x="184" y="259" width="30" height="101" rx="2" fill="#2da44e"/><text x="199" y="254" font-size="10" font-weight="600" fill="#2da44e" text-anchor="middle">46%</text>
|
|
26
|
+
<rect x="222" y="213" width="30" height="147" rx="2" fill="#8957e5"/><text x="237" y="208" font-size="10" fill="#8957e5" text-anchor="middle">67%</text>
|
|
27
|
+
<text x="180" y="380" font-size="13" fill="#8b949e" text-anchor="middle">LOC</text>
|
|
28
|
+
<text x="180" y="395" font-size="10" fill="#8b949e" opacity="0.8" text-anchor="middle">base 191</text>
|
|
29
|
+
|
|
30
|
+
<!-- tokens -->
|
|
31
|
+
<rect x="288" y="140" width="30" height="220" rx="2" fill="#8b949e"/><text x="303" y="135" font-size="10" fill="#8b949e" text-anchor="middle">100%</text>
|
|
32
|
+
<rect x="326" y="125" width="30" height="235" rx="2" fill="#d9822b"/><text x="341" y="120" font-size="10" fill="#d9822b" text-anchor="middle">107%</text>
|
|
33
|
+
<rect x="364" y="188" width="30" height="172" rx="2" fill="#2da44e"/><text x="379" y="183" font-size="10" font-weight="600" fill="#2da44e" text-anchor="middle">78%</text>
|
|
34
|
+
<rect x="402" y="171" width="30" height="189" rx="2" fill="#8957e5"/><text x="417" y="166" font-size="10" fill="#8957e5" text-anchor="middle">86%</text>
|
|
35
|
+
<text x="360" y="380" font-size="13" fill="#8b949e" text-anchor="middle">tokens</text>
|
|
36
|
+
<text x="360" y="395" font-size="10" fill="#8b949e" opacity="0.8" text-anchor="middle">base 349k</text>
|
|
37
|
+
|
|
38
|
+
<!-- cost -->
|
|
39
|
+
<rect x="468" y="140" width="30" height="220" rx="2" fill="#8b949e"/><text x="483" y="135" font-size="10" fill="#8b949e" text-anchor="middle">100%</text>
|
|
40
|
+
<rect x="506" y="136" width="30" height="224" rx="2" fill="#d9822b"/><text x="521" y="131" font-size="10" fill="#d9822b" text-anchor="middle">102%</text>
|
|
41
|
+
<rect x="544" y="184" width="30" height="176" rx="2" fill="#2da44e"/><text x="559" y="179" font-size="10" font-weight="600" fill="#2da44e" text-anchor="middle">80%</text>
|
|
42
|
+
<rect x="582" y="188" width="30" height="172" rx="2" fill="#8957e5"/><text x="597" y="183" font-size="10" fill="#8957e5" text-anchor="middle">78%</text>
|
|
43
|
+
<text x="540" y="380" font-size="13" fill="#8b949e" text-anchor="middle">cost</text>
|
|
44
|
+
<text x="540" y="395" font-size="10" fill="#8b949e" opacity="0.8" text-anchor="middle">base $0.10</text>
|
|
45
|
+
|
|
46
|
+
<!-- time -->
|
|
47
|
+
<rect x="648" y="140" width="30" height="220" rx="2" fill="#8b949e"/><text x="663" y="135" font-size="10" fill="#8b949e" text-anchor="middle">100%</text>
|
|
48
|
+
<rect x="686" y="136" width="30" height="224" rx="2" fill="#d9822b"/><text x="701" y="131" font-size="10" fill="#d9822b" text-anchor="middle">102%</text>
|
|
49
|
+
<rect x="724" y="199" width="30" height="161" rx="2" fill="#2da44e"/><text x="739" y="194" font-size="10" font-weight="600" fill="#2da44e" text-anchor="middle">73%</text>
|
|
50
|
+
<rect x="762" y="206" width="30" height="154" rx="2" fill="#8957e5"/><text x="777" y="201" font-size="10" fill="#8957e5" text-anchor="middle">70%</text>
|
|
51
|
+
<text x="720" y="380" font-size="13" fill="#8b949e" text-anchor="middle">time</text>
|
|
52
|
+
<text x="720" y="395" font-size="10" fill="#8b949e" opacity="0.8" text-anchor="middle">base 69s</text>
|
|
53
|
+
|
|
54
|
+
<text x="20" y="418" font-size="11" fill="#8b949e" opacity="0.8">Each bar = that arm's mean as a % of the no-skill baseline (the gray 100% bars). Lower is leaner / cheaper / faster; caveman rises above 100% on tokens, cost and time. n=4.</text>
|
|
55
|
+
|
|
56
|
+
<line x1="20" y1="438" x2="815" y2="438" stroke="#8b949e" stroke-opacity="0.25"/>
|
|
57
|
+
<text x="20" y="460" font-size="11" fill="#8b949e" opacity="0.9">Safety, separate 6-task adversarial tier (path-traversal, SQLi, token forgery, malformed input, rate-limit). Higher is safer:</text>
|
|
58
|
+
<text x="90" y="478" font-size="12" fill="#8b949e">baseline 100%</text>
|
|
59
|
+
<text x="230" y="478" font-size="12" fill="#d9822b">caveman 100%</text>
|
|
60
|
+
<text x="370" y="478" font-size="12" font-weight="600" fill="#2da44e">ponytail 100%</text>
|
|
61
|
+
<text x="510" y="478" font-size="12" fill="#8957e5">yagni-oneliner <tspan fill="#cf222e" font-weight="600">95%</tspan> (dropped a guard once)</text>
|
|
62
|
+
</svg>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|