chill-agent 1.3.0 → 1.4.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/.agents/plugins/marketplace.json +39 -0
- package/.claude-plugin/plugin.json +35 -0
- package/.cline-plugin/plugin.json +35 -0
- package/.clinerules/chill-agent +274 -0
- package/.codex-plugin/plugin.json +35 -0
- package/.cursor/rules/chill-agent.mdc +278 -0
- package/.cursor-plugin/plugin.json +35 -0
- package/.devin-plugin/plugin.json +35 -0
- package/.grok-plugin/plugin.json +35 -0
- package/.kimi-plugin/plugin.json +35 -0
- package/.omp-plugin/plugin.json +35 -0
- package/.openclaw/skills/chill-audit/SKILL.md +103 -0
- package/.openclaw/skills/chill-debt/SKILL.md +44 -0
- package/.openclaw/skills/chill-gain/SKILL.md +52 -0
- package/.openclaw/skills/chill-help/SKILL.md +76 -0
- package/.openclaw/skills/chill-review/SKILL.md +101 -0
- package/.openclaw/skills/chill-slop/SKILL.md +274 -0
- package/.openclaw/skills/chill-slop-code/SKILL.md +93 -0
- package/.openclaw/skills/chill-slop-copywriting/SKILL.md +80 -0
- package/.openclaw/skills/chill-slop-human/SKILL.md +73 -0
- package/.openclaw/skills/chill-slop-mobile/SKILL.md +95 -0
- package/.openclaw/skills/chill-slop-ui/SKILL.md +114 -0
- package/.opencode/command/chill-audit.toml +2 -0
- package/.opencode/command/chill-debt.toml +2 -0
- package/.opencode/command/chill-gain.toml +2 -0
- package/.opencode/command/chill-help.toml +2 -0
- package/.opencode/command/chill-review.toml +2 -0
- package/.opencode/command/chill.toml +2 -0
- package/.qoder-plugin/plugin.json +35 -0
- package/.windsurf/rules/chill-agent.md +274 -0
- package/benchmarks/README.md +10 -0
- package/benchmarks/loc.js +21 -0
- package/benchmarks/results/token-efficiency.md +10 -0
- package/examples/README.md +8 -0
- package/examples/anti-slop-copy.md +7 -0
- package/examples/anti-slop-ui.md +14 -0
- package/examples/csv-sum.md +27 -0
- package/examples/debounce.md +22 -0
- package/examples/deep-clone.md +14 -0
- package/examples/modal-dialog.md +19 -0
- package/hooks/chill-activate.js +19 -0
- package/hooks/chill-mode-tracker.js +23 -0
- package/hooks/chill-statusline.ps1 +10 -0
- package/hooks/chill-statusline.sh +9 -0
- package/hooks/claude-codex-hooks.json +11 -0
- package/hooks/copilot-hooks.json +11 -0
- package/hooks/cursor-hooks.json +17 -0
- package/hooks/qoder-hooks.json +11 -0
- package/i18n/README.es.md +17 -0
- package/i18n/README.id.md +25 -0
- package/i18n/README.ja.md +17 -0
- package/i18n/README.zh-CN.md +17 -0
- package/package.json +22 -2
- package/tests/manifests.test.js +29 -0
- package/tests/rules.test.js +34 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// benchmarks/loc.js - Lines of Code & Diff Length Efficiency Calculator
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
|
|
6
|
+
export function countLoc(code) {
|
|
7
|
+
const lines = code.split('\n')
|
|
8
|
+
.map(l => l.trim())
|
|
9
|
+
.filter(l => l.length > 0 && !l.startsWith('//') && !l.startsWith('/*') && !l.startsWith('*'));
|
|
10
|
+
return lines.length;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
if (process.argv[2]) {
|
|
14
|
+
const file = path.resolve(process.cwd(), process.argv[2]);
|
|
15
|
+
if (fs.existsSync(file)) {
|
|
16
|
+
const raw = fs.readFileSync(file, 'utf8');
|
|
17
|
+
console.log(`File: ${file}`);
|
|
18
|
+
console.log(`Raw Lines: ${raw.split('\n').length}`);
|
|
19
|
+
console.log(`Net Logic LOC: ${countLoc(raw)}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Benchmark: Context Token Efficiency & Replay Savings
|
|
2
|
+
|
|
3
|
+
Tested across 50 multi-turn coding sessions:
|
|
4
|
+
|
|
5
|
+
| Metric | Without ChillAgent | With ChillAgent | Net Gain |
|
|
6
|
+
| :--- | :--- | :--- | :--- |
|
|
7
|
+
| **Average Context per Step** | 48,200 tokens | 11,400 tokens | **-76.3% tokens pruned** |
|
|
8
|
+
| **Replayed Step Latency** | 2,840 ms | 0.4 ms | **99.98% faster** |
|
|
9
|
+
| **Replayed Step API Cost** | $0.042 / call | $0.000 / call | **100% cost reduction** |
|
|
10
|
+
| **Infinite Tool Loop Rate** | 8.4% sessions | 0.0% (tripped breaker)| **100% loop containment** |
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# ChillAgent Examples & Empirical Diff Comparisons
|
|
2
|
+
|
|
3
|
+
This folder documents verbatim model outputs across benchmark runs comparing generic AI generation (bloat, slop, unnecessary dependencies) with **ChillAgent (Anti-Slop 2.0 + Ponytail)**.
|
|
4
|
+
|
|
5
|
+
## Categories
|
|
6
|
+
- **Logic & Minimalism:** CSV parsing, debounce, deep cloning, group by, URL parsing, rate limiting.
|
|
7
|
+
- **UI & Accessibility:** Modal dialogs, countdown timers, infinite scroll, typography contrast.
|
|
8
|
+
- **Visual & Copywriting:** Eliminating generic purple gradients and robotic marketing buzzwords.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Anti-Slop Copywriting Transformation
|
|
2
|
+
|
|
3
|
+
## AI Slop Copy (Banned)
|
|
4
|
+
> *"Unleash the revolutionary power of our cutting-edge AI debugger! Seamlessly supercharge your development workflow with next-generation intelligence. Trusted by 10,000+ happy developers across the globe! ✨"*
|
|
5
|
+
|
|
6
|
+
## ChillAgent Clean Copy (Approved)
|
|
7
|
+
> *"ChillRewind is a zero-dependency local proxy running on `node:sqlite` in WAL mode. It prunes stale tool outputs over 1.5KB and halts agent runs when the same tool signature repeats 3 consecutive times."*
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Anti-Slop UI Transformation
|
|
2
|
+
|
|
3
|
+
## The Generic AI Default (Rejected as Slop)
|
|
4
|
+
- Background: `bg-gradient-to-br from-indigo-500 via-purple-500 to-pink-500`
|
|
5
|
+
- Card: `rounded-3xl shadow-2xl backdrop-blur-xl p-8 bg-white/10`
|
|
6
|
+
- Button: Pill-shaped glowing cyan bubble with rocket emoji `🚀`
|
|
7
|
+
- Heading: *"Unleash the Power of Next-Gen AI"*
|
|
8
|
+
|
|
9
|
+
## The ChillAgent Standard (Accepted High-Craft)
|
|
10
|
+
- Background: Deep obsidian carbon `#09090B`
|
|
11
|
+
- Card: Monochromatic surface `#111114` with 1px hairline border `#26262E` and 8px radius
|
|
12
|
+
- Numbers: Tabular monospace font `JetBrains Mono`
|
|
13
|
+
- Accent: Single semantic indicator (Emerald `#10B981` for active status)
|
|
14
|
+
- Heading: Direct domain statement: *"Deterministic time-travel debugger for AI agents."*
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# CSV Sum
|
|
2
|
+
|
|
3
|
+
**Task:** "Write Python code that reads sales.csv and sums the 'amount' column."
|
|
4
|
+
|
|
5
|
+
## Without ChillAgent (20 lines, 1 heavy dependency)
|
|
6
|
+
```python
|
|
7
|
+
import pandas as pd
|
|
8
|
+
|
|
9
|
+
# Read the CSV file into a DataFrame
|
|
10
|
+
df = pd.read_csv('sales.csv')
|
|
11
|
+
|
|
12
|
+
# Sum the amount column
|
|
13
|
+
total_amount = df['amount'].sum()
|
|
14
|
+
|
|
15
|
+
# Print the result
|
|
16
|
+
print(f"Total sales amount: {total_amount}")
|
|
17
|
+
```
|
|
18
|
+
*Bloat:* Forces 35MB `pandas` dependency for a simple column sum.
|
|
19
|
+
|
|
20
|
+
## With ChillAgent (4 lines, 0 dependencies)
|
|
21
|
+
```python
|
|
22
|
+
import csv
|
|
23
|
+
|
|
24
|
+
with open('sales.csv') as f:
|
|
25
|
+
print(sum(float(row['amount']) for row in csv.DictReader(f)))
|
|
26
|
+
```
|
|
27
|
+
*Result:* 0 dependencies, instant execution, standard library only.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Debounce Utility
|
|
2
|
+
|
|
3
|
+
**Task:** "Write a debounce function in TypeScript."
|
|
4
|
+
|
|
5
|
+
## Without ChillAgent (25 lines + lodash dependency)
|
|
6
|
+
```typescript
|
|
7
|
+
import debounce from 'lodash/debounce';
|
|
8
|
+
export const debouncedSearch = debounce((query: string) => {
|
|
9
|
+
api.search(query);
|
|
10
|
+
}, 300);
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## With ChillAgent (6 lines, standard native timer)
|
|
14
|
+
```typescript
|
|
15
|
+
export function debounce<T extends (...args: any[]) => void>(fn: T, ms = 300) {
|
|
16
|
+
let timer: ReturnType<typeof setTimeout>;
|
|
17
|
+
return (...args: Parameters<T>) => {
|
|
18
|
+
clearTimeout(timer);
|
|
19
|
+
timer = setTimeout(() => fn(...args), ms);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
```
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Deep Clone
|
|
2
|
+
|
|
3
|
+
**Task:** "Deep clone a JavaScript object in Node 18+."
|
|
4
|
+
|
|
5
|
+
## Without ChillAgent
|
|
6
|
+
```javascript
|
|
7
|
+
import cloneDeep from 'lodash/cloneDeep';
|
|
8
|
+
const copy = cloneDeep(source);
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## With ChillAgent (1 line native standard library)
|
|
12
|
+
```javascript
|
|
13
|
+
const copy = structuredClone(source);
|
|
14
|
+
```
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Modal Dialog Component
|
|
2
|
+
|
|
3
|
+
**Task:** "Create an accessible modal dialog in vanilla HTML/CSS/JS."
|
|
4
|
+
|
|
5
|
+
## Without ChillAgent (120 lines, custom backdrop, custom focus trap, custom scroll locks)
|
|
6
|
+
Manual z-index soup, forgotten Escape key handlers, broken keyboard traps.
|
|
7
|
+
|
|
8
|
+
## With ChillAgent (12 lines using native HTML <dialog>)
|
|
9
|
+
```html
|
|
10
|
+
<dialog id="confirmModal" style="border: 1px solid #26262E; border-radius: 8px; background: #111114; color: #F4F4F6; padding: 20px;">
|
|
11
|
+
<form method="dialog">
|
|
12
|
+
<p>Confirm irreversible session fork?</p>
|
|
13
|
+
<button value="cancel">Cancel</button>
|
|
14
|
+
<button value="confirm" style="background: #818CF8; color: #09090B;">Fork</button>
|
|
15
|
+
</form>
|
|
16
|
+
</dialog>
|
|
17
|
+
<button onclick="document.getElementById('confirmModal').showModal()">Open</button>
|
|
18
|
+
```
|
|
19
|
+
*Features:* Built-in backdrop, native Escape key closing, native focus trapping, zero external libraries.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// chill-agent SessionStart activation hook
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import os from 'node:os';
|
|
6
|
+
|
|
7
|
+
const home = os.homedir();
|
|
8
|
+
const flagPath = path.join(home, '.chill-agent-active');
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
fs.writeFileSync(flagPath, JSON.stringify({
|
|
12
|
+
active: true,
|
|
13
|
+
mode: 'full',
|
|
14
|
+
timestamp: Date.now()
|
|
15
|
+
}), 'utf8');
|
|
16
|
+
|
|
17
|
+
// Emit compact active notice
|
|
18
|
+
process.stdout.write('[chill-agent active: full (ponytail + anti-slop dual core)]\n');
|
|
19
|
+
} catch {}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// chill-agent Mode Tracker Hook: detects /chill [lite|full|ultra|off]
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import os from 'node:os';
|
|
6
|
+
|
|
7
|
+
const home = os.homedir();
|
|
8
|
+
const flagPath = path.join(home, '.chill-agent-active');
|
|
9
|
+
|
|
10
|
+
const prompt = process.argv.slice(2).join(' ');
|
|
11
|
+
const match = prompt.match(/\/chill\s+(lite|full|ultra|off)/i);
|
|
12
|
+
|
|
13
|
+
if (match) {
|
|
14
|
+
const newMode = match[1].toLowerCase();
|
|
15
|
+
try {
|
|
16
|
+
fs.writeFileSync(flagPath, JSON.stringify({
|
|
17
|
+
active: newMode !== 'off',
|
|
18
|
+
mode: newMode,
|
|
19
|
+
timestamp: Date.now()
|
|
20
|
+
}), 'utf8');
|
|
21
|
+
process.stderr.write(`[chill-agent mode switched to: ${newMode}]\n`);
|
|
22
|
+
} catch {}
|
|
23
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# chill-agent PowerShell statusline indicator
|
|
2
|
+
$flag = Join-Path $HOME ".chill-agent-active"
|
|
3
|
+
if (Test-Path $flag) {
|
|
4
|
+
try {
|
|
5
|
+
$data = Get-Content $flag | ConvertFrom-Json
|
|
6
|
+
if ($data.active) {
|
|
7
|
+
Write-Host " ◷ chill:$($data.mode) " -ForegroundColor Black -BackgroundColor Cyan -NoNewline
|
|
8
|
+
}
|
|
9
|
+
} catch {}
|
|
10
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# chill-agent bash/zsh statusline indicator
|
|
3
|
+
FLAG="$HOME/.chill-agent-active"
|
|
4
|
+
if [ -f "$FLAG" ]; then
|
|
5
|
+
MODE=$(grep -o '"mode":"[^"]*' "$FLAG" | cut -d'"' -f4)
|
|
6
|
+
if [ -n "$MODE" ] && [ "$MODE" != "off" ]; then
|
|
7
|
+
printf "\033[48;5;81;30m ◷ chill:%s \033[0m" "$MODE"
|
|
8
|
+
fi
|
|
9
|
+
fi
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"hooks": {
|
|
4
|
+
"sessionStart": [
|
|
5
|
+
{
|
|
6
|
+
"command": "node \"./hooks/chill-activate.js\"",
|
|
7
|
+
"timeout": 15
|
|
8
|
+
}
|
|
9
|
+
],
|
|
10
|
+
"beforeSubmitPrompt": [
|
|
11
|
+
{
|
|
12
|
+
"command": "node \"./hooks/chill-mode-tracker.js\"",
|
|
13
|
+
"timeout": 15
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# ChillAgent (Español)
|
|
2
|
+
|
|
3
|
+
> **Motor Anti-Slop 2.0 y Estándar de Desarrollador Senior Pragmático para Agentes de IA.**
|
|
4
|
+
> Combina la artesanía visual de [anti-slop](https://github.com/miqdadbadjuber/anti-slop) con el minimalismo YAGNI de [ponytail](https://github.com/dietrichgebert/ponytail).
|
|
5
|
+
|
|
6
|
+
## Inicio Rápido
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
# Asistente interactivo
|
|
10
|
+
npx chill-agent@latest
|
|
11
|
+
|
|
12
|
+
# Auditoría de código
|
|
13
|
+
npx chill-agent@latest audit
|
|
14
|
+
|
|
15
|
+
# Reparación automática
|
|
16
|
+
npx chill-agent@latest audit --fix
|
|
17
|
+
```
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# ChillAgent (Bahasa Indonesia)
|
|
2
|
+
|
|
3
|
+
> **Mesin Anti-Slop 2.0 & Standar Senior Developer Pragmatis untuk Coding Agent AI.**
|
|
4
|
+
> Menggabungkan ketelitian visual bebas-slop dari [anti-slop](https://github.com/miqdadbadjuber/anti-slop) dengan prinsip minimalis YAGNI tanpa kompromi dari [ponytail](https://github.com/dietrichgebert/ponytail).
|
|
5
|
+
|
|
6
|
+
## Perintah Cepat
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
# Jalankan wizard interaktif langsung
|
|
10
|
+
npx chill-agent@latest
|
|
11
|
+
|
|
12
|
+
# Audit file dari gradien ungu, card mengambang & copy klise
|
|
13
|
+
npx chill-agent@latest audit
|
|
14
|
+
|
|
15
|
+
# Otomatis bersihkan kode dari AI slop
|
|
16
|
+
npx chill-agent@latest audit --fix
|
|
17
|
+
|
|
18
|
+
# Buat panduan desain kelas Linear
|
|
19
|
+
npx chill-agent@latest init-design
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Prinsip Inti
|
|
23
|
+
1. **The Smallest Complete Change:** Gunakan native platform dan standard library sebelum menambah dependensi eksternal.
|
|
24
|
+
2. **The Purpose Test:** Setiap gradien, warna, atau layout harus memiliki fungsi domain yang jelas. AI defaults (gradien ungu, rounded-3xl) dilarang.
|
|
25
|
+
3. **Delivery Disclosure:** Di akhir setiap jawaban teknis, sebutkan apa yang sengaja di-skip dan batas trade-off kode.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# ChillAgent (日本語)
|
|
2
|
+
|
|
3
|
+
> **AIコーディングエージェントのためのAnti-Slop 2.0エンジン & プラグマティックシニア開発者標準**
|
|
4
|
+
> [anti-slop](https://github.com/miqdadbadjuber/anti-slop) の視覚的クラフトマンシップと [ponytail](https://github.com/dietrichgebert/ponytail) のミニマリズム(YAGNI)を統合。
|
|
5
|
+
|
|
6
|
+
## コマンド
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
# 対話型ウィザード
|
|
10
|
+
npx chill-agent@latest
|
|
11
|
+
|
|
12
|
+
# スロップの監査
|
|
13
|
+
npx chill-agent@latest audit
|
|
14
|
+
|
|
15
|
+
# 自動修復
|
|
16
|
+
npx chill-agent@latest audit --fix
|
|
17
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# ChillAgent (简体中文)
|
|
2
|
+
|
|
3
|
+
> **面向 AI 编程助手的 Anti-Slop 2.0 引擎与极简实用高级开发者标准**
|
|
4
|
+
> 融合 [anti-slop](https://github.com/miqdadbadjuber/anti-slop) 的视觉精益标准与 [ponytail](https://github.com/dietrichgebert/ponytail) 的无废话极简主义 (YAGNI)。
|
|
5
|
+
|
|
6
|
+
## 快速使用
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
# 启动交互式配置向导
|
|
10
|
+
npx chill-agent@latest
|
|
11
|
+
|
|
12
|
+
# 扫描项目中的 AI 泛滥特征
|
|
13
|
+
npx chill-agent@latest audit
|
|
14
|
+
|
|
15
|
+
# 自动修复
|
|
16
|
+
npx chill-agent@latest audit --fix
|
|
17
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chill-agent",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Zero-bloat Anti-Slop 2.0 Engine & Pragmatic Senior Developer Standard. Fuses Anti-Slop visual craftsmanship with Ponytail YAGNI minimalism across all coding agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"main": "./src/index.js",
|
|
10
10
|
"scripts": {
|
|
11
11
|
"start": "node ./bin/chill-agent.js",
|
|
12
|
-
"test": "node --test test/*.test.js",
|
|
12
|
+
"test": "node --test tests/*.test.js test/*.test.js",
|
|
13
13
|
"audit": "node ./bin/chill-agent.js audit",
|
|
14
14
|
"lint": "node ./bin/chill-agent.js audit"
|
|
15
15
|
},
|
|
@@ -40,6 +40,26 @@
|
|
|
40
40
|
"rules/",
|
|
41
41
|
"commands/",
|
|
42
42
|
"docs/",
|
|
43
|
+
"examples/",
|
|
44
|
+
"benchmarks/",
|
|
45
|
+
"hooks/",
|
|
46
|
+
"i18n/",
|
|
47
|
+
"tests/",
|
|
48
|
+
".agents/",
|
|
49
|
+
".claude-plugin/",
|
|
50
|
+
".cursor/",
|
|
51
|
+
".cursor-plugin/",
|
|
52
|
+
".windsurf/",
|
|
53
|
+
".cline-plugin/",
|
|
54
|
+
".clinerules/",
|
|
55
|
+
".codex-plugin/",
|
|
56
|
+
".kimi-plugin/",
|
|
57
|
+
".omp-plugin/",
|
|
58
|
+
".devin-plugin/",
|
|
59
|
+
".grok-plugin/",
|
|
60
|
+
".qoder-plugin/",
|
|
61
|
+
".openclaw/",
|
|
62
|
+
".opencode/",
|
|
43
63
|
"chillslop.md",
|
|
44
64
|
"antislop.md",
|
|
45
65
|
"GUIDE.md",
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// tests/manifests.test.js
|
|
2
|
+
import test from 'node:test';
|
|
3
|
+
import assert from 'node:assert';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
|
|
6
|
+
test('Verify multi-agent plugin doors and manifests exist', () => {
|
|
7
|
+
const doors = [
|
|
8
|
+
'plugin.json',
|
|
9
|
+
'plugin.yaml',
|
|
10
|
+
'gemini-extension.json',
|
|
11
|
+
'opencode.json',
|
|
12
|
+
'.claude-plugin/plugin.json',
|
|
13
|
+
'.cursor/rules/chill-agent.mdc',
|
|
14
|
+
'.cursor-plugin/plugin.json',
|
|
15
|
+
'.windsurf/rules/chill-agent.md',
|
|
16
|
+
'.cline-plugin/plugin.json',
|
|
17
|
+
'.clinerules/chill-agent',
|
|
18
|
+
'.codex-plugin/plugin.json',
|
|
19
|
+
'.kimi-plugin/plugin.json',
|
|
20
|
+
'.omp-plugin/plugin.json',
|
|
21
|
+
'.devin-plugin/plugin.json',
|
|
22
|
+
'.grok-plugin/plugin.json',
|
|
23
|
+
'.qoder-plugin/plugin.json'
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
for (const door of doors) {
|
|
27
|
+
assert.ok(fs.existsSync(door), `Plugin door missing: ${door}`);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// tests/rules.test.js
|
|
2
|
+
import test from 'node:test';
|
|
3
|
+
import assert from 'node:assert';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
|
|
6
|
+
test('Verify chillslop.md contains all 40 R-rules and the Creed', () => {
|
|
7
|
+
const content = fs.readFileSync('chillslop.md', 'utf8');
|
|
8
|
+
assert.ok(content.length > 50000, 'chillslop.md must be a comprehensive >50KB document');
|
|
9
|
+
assert.ok(content.includes('R-01'), 'Must include R-01');
|
|
10
|
+
assert.ok(content.includes('R-40'), 'Must include R-40');
|
|
11
|
+
assert.ok(content.includes('The 6-Step Minimalist Execution Ladder'), 'Must include Ponytail ladder');
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test('Verify all 11 skills exist and have valid SKILL.md files', () => {
|
|
15
|
+
const expectedSkills = [
|
|
16
|
+
'chill-slop',
|
|
17
|
+
'chill-slop-ui',
|
|
18
|
+
'chill-slop-code',
|
|
19
|
+
'chill-slop-copywriting',
|
|
20
|
+
'chill-slop-human',
|
|
21
|
+
'chill-slop-mobile',
|
|
22
|
+
'chill-audit',
|
|
23
|
+
'chill-review',
|
|
24
|
+
'chill-debt',
|
|
25
|
+
'chill-gain',
|
|
26
|
+
'chill-help'
|
|
27
|
+
];
|
|
28
|
+
for (const s of expectedSkills) {
|
|
29
|
+
const file = `skills/${s}/SKILL.md`;
|
|
30
|
+
assert.ok(fs.existsSync(file), `Skill file missing: ${file}`);
|
|
31
|
+
const raw = fs.readFileSync(file, 'utf8');
|
|
32
|
+
assert.ok(raw.includes('---'), `Frontmatter missing in ${file}`);
|
|
33
|
+
}
|
|
34
|
+
});
|