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.
Files changed (187) hide show
  1. package/.claude-plugin/contrast-mcp-launcher.mjs +31 -0
  2. package/.claude-plugin/plugin.json +8 -3
  3. package/.cline-plugin/plugin.js +6 -0
  4. package/.codex-plugin/plugin.json +4 -3
  5. package/.cursor-plugin/marketplace.json +16 -0
  6. package/.cursor-plugin/plugin.json +2 -2
  7. package/.devin-plugin/plugin.json +2 -2
  8. package/.kimi-plugin/plugin.json +11 -29
  9. package/.omp-plugin/marketplace.json +15 -0
  10. package/.openclaw/skills/ponytail/SKILL.md +2 -7
  11. package/.openclaw/skills/ponytail-audit/SKILL.md +3 -6
  12. package/.openclaw/skills/ponytail-debt/SKILL.md +3 -4
  13. package/.openclaw/skills/ponytail-gain/SKILL.md +3 -4
  14. package/.openclaw/skills/ponytail-help/SKILL.md +3 -3
  15. package/.openclaw/skills/ponytail-review/SKILL.md +3 -6
  16. package/.opencode/plugins/ponytail.mjs +1 -1
  17. package/.qoder-plugin/plugin.json +12 -26
  18. package/AGENTS.md +32 -19
  19. package/__init__.py +1 -1
  20. package/assets/antislop-banner.png +0 -0
  21. package/assets/band/band.png +0 -0
  22. package/assets/band/board.png +0 -0
  23. package/assets/benchmark-3model.svg +21 -0
  24. package/assets/benchmark-agentic.svg +62 -0
  25. package/assets/codex-icon.png +0 -0
  26. package/assets/compare/code/after.webp +0 -0
  27. package/assets/compare/code/before.webp +0 -0
  28. package/assets/compare/text/after.webp +0 -0
  29. package/assets/compare/text/before.webp +0 -0
  30. package/assets/compare/ui/w-all.webp +0 -0
  31. package/assets/compare/ui/w-antislop.webp +0 -0
  32. package/assets/compare/ui/w-design.webp +0 -0
  33. package/assets/compare/ui/without.webp +0 -0
  34. package/assets/logo-dark.png +0 -0
  35. package/assets/logo-dark.svg +115 -0
  36. package/assets/logo-greenpt-dark.svg +27 -0
  37. package/assets/logo-greenpt.svg +27 -0
  38. package/assets/logo.png +0 -0
  39. package/assets/photoreunion-logo-dark.svg +4 -0
  40. package/assets/photoreunion-logo-light.svg +4 -0
  41. package/assets/profile.png +0 -0
  42. package/assets/retriever-logo-dark.svg +4 -0
  43. package/assets/retriever-logo-light.svg +4 -0
  44. package/assets/stories-banner.png +0 -0
  45. package/assets/v5/audit-es.png +0 -0
  46. package/assets/v5/audit-ja.png +0 -0
  47. package/assets/v5/audit-ko.png +0 -0
  48. package/assets/v5/audit-zh-CN.png +0 -0
  49. package/assets/v5/audit.png +0 -0
  50. package/assets/v5/beforeafter-es.png +0 -0
  51. package/assets/v5/beforeafter-ja.png +0 -0
  52. package/assets/v5/beforeafter-ko.png +0 -0
  53. package/assets/v5/beforeafter-zh-CN.png +0 -0
  54. package/assets/v5/beforeafter.png +0 -0
  55. package/assets/v5/chart-es.png +0 -0
  56. package/assets/v5/chart-ja.png +0 -0
  57. package/assets/v5/chart-ko.png +0 -0
  58. package/assets/v5/chart-zh-CN.png +0 -0
  59. package/assets/v5/chart.png +0 -0
  60. package/assets/v5/hero-es.jpg +0 -0
  61. package/assets/v5/hero-ja.jpg +0 -0
  62. package/assets/v5/hero-ko.jpg +0 -0
  63. package/assets/v5/hero-zh-CN.jpg +0 -0
  64. package/assets/v5/hero.jpg +0 -0
  65. package/assets/v5/ladder-es.png +0 -0
  66. package/assets/v5/ladder-ja.png +0 -0
  67. package/assets/v5/ladder-ko.png +0 -0
  68. package/assets/v5/ladder-zh-CN.png +0 -0
  69. package/assets/v5/ladder.png +0 -0
  70. package/assets/v5/review-es.png +0 -0
  71. package/assets/v5/review-ja.png +0 -0
  72. package/assets/v5/review-ko.png +0 -0
  73. package/assets/v5/review-zh-CN.png +0 -0
  74. package/assets/v5/review.png +0 -0
  75. package/assets/v5/tests-es.png +0 -0
  76. package/assets/v5/tests-ja.png +0 -0
  77. package/assets/v5/tests-ko.png +0 -0
  78. package/assets/v5/tests-zh-CN.png +0 -0
  79. package/assets/v5/tests.png +0 -0
  80. package/assets/waitlist-banner-es.png +0 -0
  81. package/assets/waitlist-banner-ja.png +0 -0
  82. package/assets/waitlist-banner-ko.png +0 -0
  83. package/assets/waitlist-banner-zh-CN.png +0 -0
  84. package/assets/waitlist-banner.png +0 -0
  85. package/benchmarks/.env.example +2 -0
  86. package/benchmarks/agentic/README.md +201 -0
  87. package/benchmarks/agentic/answer.py +288 -0
  88. package/benchmarks/agentic/compare.py +93 -0
  89. package/benchmarks/agentic/complete.py +178 -0
  90. package/benchmarks/agentic/judge.py +198 -0
  91. package/benchmarks/agentic/run.py +543 -0
  92. package/benchmarks/agentic/tasks.py +1544 -0
  93. package/benchmarks/arms/baseline.js +2 -0
  94. package/benchmarks/arms/caveman-SKILL.md +67 -0
  95. package/benchmarks/arms/caveman.js +8 -0
  96. package/benchmarks/arms/ponytail.js +8 -0
  97. package/benchmarks/behavior.js +54 -0
  98. package/benchmarks/behavior.yaml +40 -0
  99. package/benchmarks/correctness.js +291 -0
  100. package/benchmarks/loc.js +17 -19
  101. package/benchmarks/promptfooconfig.gemini.yaml +32 -0
  102. package/benchmarks/promptfooconfig.gpt-newest.yaml +33 -0
  103. package/benchmarks/promptfooconfig.yaml +41 -0
  104. package/benchmarks/results/2026-06-12-caveman-vs-ponytail.md +71 -0
  105. package/benchmarks/results/2026-06-12-v4-hardening-vs-caveman.md +125 -0
  106. package/benchmarks/results/2026-06-15-llama3.2-local.md +82 -0
  107. package/benchmarks/results/2026-06-16-correctness-gate-fix.md +113 -0
  108. package/benchmarks/results/2026-06-16-robustness-audit.md +135 -0
  109. package/benchmarks/results/2026-06-17-agentic-safety.md +164 -0
  110. package/benchmarks/results/2026-06-17-cost-verification.md +93 -0
  111. package/benchmarks/results/2026-06-18-agentic.md +219 -0
  112. package/benchmarks/results/2026-06-22-issue-245-217-comprehension.md +98 -0
  113. package/benchmarks/results/2026-10-07-agentic.md +186 -0
  114. package/cli/index.mjs +241 -0
  115. package/cli/lib/banner.mjs +21 -0
  116. package/cli/lib/install.mjs +498 -0
  117. package/cli/lib/settings.mjs +48 -0
  118. package/cli/package-lock.json +87 -0
  119. package/cli/package.json +42 -0
  120. package/cli/scripts/smoke-test.mjs +95 -0
  121. package/cli/scripts/smoke-worker.mjs +411 -0
  122. package/cli/scripts/sync-skills.mjs +81 -0
  123. package/examples/email-validation.md +156 -0
  124. package/examples/group-by.md +35 -0
  125. package/examples/infinite-scroll.md +58 -0
  126. package/examples/number-formatting.md +37 -0
  127. package/examples/rate-limit.md +272 -0
  128. package/examples/react-countdown.md +390 -0
  129. package/examples/url-params.md +41 -0
  130. package/gemini-extension.json +2 -2
  131. package/hooks/band/board.ts +560 -0
  132. package/hooks/band/logo.ts +3 -0
  133. package/hooks/band/metrics.ts +311 -0
  134. package/hooks/band/register.tsx +495 -0
  135. package/hooks/band/types.d.ts +34 -0
  136. package/hooks/claude-band.json +6 -0
  137. package/hooks/claude-codex-hooks.json +34 -4
  138. package/hooks/copilot-hooks.json +12 -2
  139. package/hooks/cursor-hooks.json +2 -2
  140. package/hooks/ponytail-band-import.js +274 -0
  141. package/hooks/ponytail-config.js +175 -0
  142. package/hooks/ponytail-map.js +111 -0
  143. package/hooks/ponytail-subagent.js +94 -0
  144. package/hooks/qoder-hooks.json +19 -4
  145. package/i18n/README.ko.md +230 -0
  146. package/package.json +12 -7
  147. package/pi-extension/test/extension.test.js +367 -0
  148. package/pi-extension/test/helpers.test.js +179 -0
  149. package/plugin.yaml +21 -12
  150. package/rules/antislop.mdc +18 -0
  151. package/scripts/build-openclaw-skills.js +60 -0
  152. package/scripts/check-repo.mjs +389 -0
  153. package/scripts/publish-openclaw-skills.js +75 -0
  154. package/scripts/skill-index.mjs +81 -0
  155. package/skills/antislop/SKILL.md +700 -0
  156. package/skills/antislop/VERSION +1 -0
  157. package/skills/antislop-code/SKILL.md +128 -0
  158. package/skills/antislop-copywriting/SKILL.md +407 -0
  159. package/skills/antislop-human/LICENSE-web-quality-skills +21 -0
  160. package/skills/antislop-human/SKILL.md +204 -0
  161. package/skills/antislop-human/contrast-check.py +168 -0
  162. package/skills/antislop-human/contrast-mcp.py +121 -0
  163. package/skills/antislop-human/references/A11Y-PATTERNS.md +249 -0
  164. package/skills/antislop-human/references/WCAG.md +127 -0
  165. package/skills/antislop-layoutmobile/SKILL.md +170 -0
  166. package/skills/antislop-ui/LICENSE-web-quality-skills +21 -0
  167. package/skills/antislop-ui/SKILL.md +344 -0
  168. package/skills/antislop-ui/references/CORE-WEB-VITALS.md +181 -0
  169. package/skills/antislop-ui/references/WEB-BASELINE.md +28 -0
  170. package/skills/plugin.json +5 -0
  171. package/src/package.json +3 -0
  172. package/tests/activation-map.test.js +63 -0
  173. package/tests/band-import.test.js +111 -0
  174. package/tests/band.test.tsx +520 -0
  175. package/tests/behavior.test.js +80 -0
  176. package/tests/gemini-extension.test.js +2 -2
  177. package/tests/grok-plugin.test.js +1 -1
  178. package/tests/hermes-plugin.test.js +1 -1
  179. package/tests/hooks-windows.test.js +205 -0
  180. package/tests/kimi-plugin.test.js +1 -1
  181. package/tests/map.test.js +30 -0
  182. package/tests/package-scripts.test.js +35 -0
  183. package/tests/package.test.js +23 -0
  184. package/tests/uninstall.test.js +202 -0
  185. /package/bin/{chill-agent.js → chill-agent.mjs} +0 -0
  186. /package/tests/{manifests.test.js → manifests.test.mjs} +0 -0
  187. /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.2.0",
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
+ }
@@ -0,0 +1,6 @@
1
+ // Cline picks up the skills/ folder beside package.json by itself, so this plugin
2
+ // registers nothing. It exists to give the manifest an entry point to resolve.
3
+ export default {
4
+ name: 'antislop',
5
+ manifest: { capabilities: ['skills'] },
6
+ }
@@ -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.2.0",
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.2.0",
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.2.0",
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,35 +1,17 @@
1
1
  {
2
2
  "name": "chill-agent",
3
- "displayName": "ChillAgent (Anti-Slop 2.0 + Ponytail Senior Dev)",
4
- "version": "1.2.0",
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
- "keywords": [
13
- "anti-slop",
14
- "ponytail",
15
- "design-rules",
16
- "minimalism",
17
- "agent-skills",
18
- "yagni",
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
- Lazy senior dev mode: the smallest change that fully solves the task, and a
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
- Quality audit of a whole repo: bugs, security holes, what breaks under real
5
- load, risky code without tests, slow paths, and what to delete, merge or
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
- List every `shortcut:` comment (and older `ponytail:` ones) as a debt ledger. One-shot report,
5
- changes nothing. Use for "ponytail debt", "what did ponytail defer", "list the
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
- Show ponytail's measured savings (code, cost, speed) from the benchmark.
5
- One-shot display. Use for /ponytail-gain, "what does ponytail save",
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
- Quick reference for ponytail levels, skills and commands. One-shot display.
5
- Use for /ponytail-help, "ponytail help", "how do I use ponytail".
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
- Quality review of a change: is the logic right, is it safe, does it hold
5
- under real load, is risky code tested, is it fast enough, and is every line
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": "chill-agent",
3
- "displayName": "ChillAgent (Anti-Slop 2.0 + Ponytail Senior Dev)",
4
- "version": "1.2.0",
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
- "ui",
20
- "accessibility"
14
+ "minimalism",
15
+ "code-review",
16
+ "productivity"
21
17
  ],
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
- }
18
+ "skills": "./skills/",
19
+ "rules": "./.qoder/rules/",
20
+ "hooks": "./hooks/qoder-hooks.json"
21
+ }
package/AGENTS.md CHANGED
@@ -1,19 +1,32 @@
1
- <!-- chill-agent:start -->
2
- ## ChillAgent Anti-Slop 2.0 & Pragmatic Senior Dev Standard (Ponytail + Anti-Slop)
3
- Active Mode: `full` (Options: lite | full | ultra). Switch anytime with `/chill <mode>`.
4
-
5
- Before generating or editing any code, interface, copy, or architecture in this workspace, follow these active skills:
6
- - `skills/chill-slop/SKILL.md`
7
- - `skills/chill-slop-code/SKILL.md`
8
- - `skills/chill-slop-ui/SKILL.md`
9
- - `skills/chill-slop-copywriting/SKILL.md`
10
- - `skills/chill-slop-human/SKILL.md`
11
- - `skills/chill-slop-mobile/SKILL.md`
12
-
13
- ### Core Operating Rules:
14
- 1. **The Smallest Complete Change (Ponytail):** Take the shortest path that solves the whole task: standard library > existing codebase helper > installed dependency > minimum new code. No premature abstractions or wrapper factories.
15
- 2. **Purpose Test (Anti-Slop):** Every visual decision, color accent, layout structure, and copy phrase must name a specific domain purpose. AI defaults (purple gradients, rounded-3xl cards, generic cards) are forbidden.
16
- 3. **Liveliness Bar:** Avoid sterile defaults by reading `DESIGN.md`. If `DESIGN.md` is missing, adhere strictly to Linear/Geist carbon monochromatic standards.
17
- 4. **Context Hygiene & Time-Travel:** Strip conversational fluff and emojis. When debugging stochastic agent loops, route upstream LLM calls through `chillrewind run` (deterministic SQLite WAL replay + SlopSieve circuit breaker).
18
- 5. **Delivery Disclosure:** End non-trivial deliveries with a 1-line disclosure: what was skipped and known limits/trade-offs.
19
- <!-- chill-agent:end -->
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