tribunal-kit 3.0.0 → 4.0.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/.agent/ARCHITECTURE.md +99 -99
- package/.agent/GEMINI.md +52 -52
- package/.agent/agents/accessibility-reviewer.md +187 -220
- package/.agent/agents/ai-code-reviewer.md +199 -233
- package/.agent/agents/backend-specialist.md +215 -238
- package/.agent/agents/code-archaeologist.md +161 -181
- package/.agent/agents/database-architect.md +184 -207
- package/.agent/agents/debugger.md +191 -218
- package/.agent/agents/dependency-reviewer.md +103 -136
- package/.agent/agents/devops-engineer.md +218 -238
- package/.agent/agents/documentation-writer.md +201 -221
- package/.agent/agents/explorer-agent.md +160 -180
- package/.agent/agents/frontend-reviewer.md +160 -194
- package/.agent/agents/frontend-specialist.md +248 -237
- package/.agent/agents/game-developer.md +48 -52
- package/.agent/agents/logic-reviewer.md +116 -149
- package/.agent/agents/mobile-developer.md +200 -223
- package/.agent/agents/mobile-reviewer.md +162 -195
- package/.agent/agents/orchestrator.md +181 -211
- package/.agent/agents/penetration-tester.md +157 -174
- package/.agent/agents/performance-optimizer.md +183 -203
- package/.agent/agents/performance-reviewer.md +178 -211
- package/.agent/agents/precedence-reviewer.md +213 -0
- package/.agent/agents/product-manager.md +142 -162
- package/.agent/agents/product-owner.md +6 -25
- package/.agent/agents/project-planner.md +142 -162
- package/.agent/agents/qa-automation-engineer.md +225 -242
- package/.agent/agents/security-auditor.md +174 -194
- package/.agent/agents/seo-specialist.md +193 -213
- package/.agent/agents/sql-reviewer.md +161 -194
- package/.agent/agents/supervisor-agent.md +184 -203
- package/.agent/agents/swarm-worker-contracts.md +17 -17
- package/.agent/agents/swarm-worker-registry.md +46 -46
- package/.agent/agents/test-coverage-reviewer.md +160 -193
- package/.agent/agents/test-engineer.md +0 -21
- package/.agent/agents/type-safety-reviewer.md +175 -208
- package/.agent/patterns/generator.md +9 -9
- package/.agent/patterns/inversion.md +12 -12
- package/.agent/patterns/pipeline.md +9 -9
- package/.agent/patterns/reviewer.md +13 -13
- package/.agent/patterns/tool-wrapper.md +9 -9
- package/.agent/rules/GEMINI.md +63 -63
- package/.agent/scripts/append_flow.js +72 -0
- package/.agent/scripts/case_law_manager.py +525 -0
- package/.agent/scripts/compress_skills.py +167 -0
- package/.agent/scripts/consolidate_skills.py +173 -0
- package/.agent/scripts/deep_compress.py +202 -0
- package/.agent/scripts/minify_context.py +80 -0
- package/.agent/scripts/security_scan.py +1 -1
- package/.agent/scripts/skill_evolution.py +563 -0
- package/.agent/scripts/strip_tribunal.py +41 -0
- package/.agent/skills/agent-organizer/SKILL.md +100 -126
- package/.agent/skills/agentic-patterns/SKILL.md +0 -70
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +134 -160
- package/.agent/skills/api-patterns/SKILL.md +123 -215
- package/.agent/skills/api-security-auditor/SKILL.md +143 -177
- package/.agent/skills/app-builder/SKILL.md +334 -50
- package/.agent/skills/app-builder/templates/SKILL.md +13 -15
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +16 -16
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +22 -22
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +20 -20
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +17 -17
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +21 -21
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +20 -20
- package/.agent/skills/appflow-wireframe/SKILL.md +95 -121
- package/.agent/skills/architecture/SKILL.md +169 -331
- package/.agent/skills/authentication-best-practices/SKILL.md +139 -173
- package/.agent/skills/bash-linux/SKILL.md +129 -154
- package/.agent/skills/behavioral-modes/SKILL.md +8 -69
- package/.agent/skills/brainstorming/SKILL.md +436 -104
- package/.agent/skills/building-native-ui/SKILL.md +152 -174
- package/.agent/skills/clean-code/SKILL.md +331 -360
- package/.agent/skills/code-review-checklist/SKILL.md +0 -62
- package/.agent/skills/config-validator/SKILL.md +115 -141
- package/.agent/skills/csharp-developer/SKILL.md +468 -528
- package/.agent/skills/database-design/SKILL.md +104 -369
- package/.agent/skills/deployment-procedures/SKILL.md +119 -145
- package/.agent/skills/devops-engineer/SKILL.md +295 -332
- package/.agent/skills/devops-incident-responder/SKILL.md +87 -113
- package/.agent/skills/doc.md +5 -5
- package/.agent/skills/documentation-templates/SKILL.md +27 -63
- package/.agent/skills/edge-computing/SKILL.md +131 -157
- package/.agent/skills/extract-design-system/SKILL.md +108 -134
- package/.agent/skills/framer-motion-expert/SKILL.md +111 -855
- package/.agent/skills/frontend-design/SKILL.md +151 -499
- package/.agent/skills/game-design-expert/SKILL.md +79 -105
- package/.agent/skills/game-engineering-expert/SKILL.md +96 -122
- package/.agent/skills/geo-fundamentals/SKILL.md +97 -124
- package/.agent/skills/github-operations/SKILL.md +279 -314
- package/.agent/skills/gsap-expert/SKILL.md +119 -826
- package/.agent/skills/i18n-localization/SKILL.md +113 -138
- package/.agent/skills/intelligent-routing/SKILL.md +167 -127
- package/.agent/skills/lint-and-validate/SKILL.md +16 -52
- package/.agent/skills/llm-engineering/SKILL.md +344 -357
- package/.agent/skills/local-first/SKILL.md +128 -154
- package/.agent/skills/mcp-builder/SKILL.md +92 -118
- package/.agent/skills/mobile-design/SKILL.md +213 -219
- package/.agent/skills/motion-engineering/SKILL.md +184 -0
- package/.agent/skills/nextjs-react-expert/SKILL.md +99 -698
- package/.agent/skills/nodejs-best-practices/SKILL.md +498 -559
- package/.agent/skills/observability/SKILL.md +293 -330
- package/.agent/skills/parallel-agents/SKILL.md +96 -122
- package/.agent/skills/performance-profiling/SKILL.md +217 -254
- package/.agent/skills/plan-writing/SKILL.md +92 -118
- package/.agent/skills/platform-engineer/SKILL.md +97 -123
- package/.agent/skills/playwright-best-practices/SKILL.md +137 -162
- package/.agent/skills/powershell-windows/SKILL.md +112 -146
- package/.agent/skills/project-idioms/SKILL.md +87 -0
- package/.agent/skills/python-patterns/SKILL.md +15 -35
- package/.agent/skills/python-pro/SKILL.md +148 -754
- package/.agent/skills/react-specialist/SKILL.md +123 -827
- package/.agent/skills/readme-builder/SKILL.md +23 -85
- package/.agent/skills/realtime-patterns/SKILL.md +269 -304
- package/.agent/skills/red-team-tactics/SKILL.md +18 -51
- package/.agent/skills/rust-pro/SKILL.md +623 -701
- package/.agent/skills/seo-fundamentals/SKILL.md +129 -154
- package/.agent/skills/server-management/SKILL.md +164 -190
- package/.agent/skills/shadcn-ui-expert/SKILL.md +181 -206
- package/.agent/skills/skill-creator/SKILL.md +24 -56
- package/.agent/skills/sql-pro/SKILL.md +579 -633
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +35 -66
- package/.agent/skills/swiftui-expert/SKILL.md +151 -176
- package/.agent/skills/systematic-debugging/SKILL.md +92 -118
- package/.agent/skills/tailwind-patterns/SKILL.md +516 -576
- package/.agent/skills/tdd-workflow/SKILL.md +111 -137
- package/.agent/skills/test-result-analyzer/SKILL.md +33 -73
- package/.agent/skills/testing-patterns/SKILL.md +512 -573
- package/.agent/skills/trend-researcher/SKILL.md +30 -71
- package/.agent/skills/ui-ux-pro-max/SKILL.md +8 -41
- package/.agent/skills/ui-ux-researcher/SKILL.md +51 -91
- package/.agent/skills/vue-expert/SKILL.md +127 -866
- package/.agent/skills/vulnerability-scanner/SKILL.md +354 -269
- package/.agent/skills/web-accessibility-auditor/SKILL.md +168 -193
- package/.agent/skills/web-design-guidelines/SKILL.md +25 -61
- package/.agent/skills/webapp-testing/SKILL.md +119 -145
- package/.agent/skills/whimsy-injector/SKILL.md +58 -132
- package/.agent/skills/workflow-optimizer/SKILL.md +28 -68
- package/.agent/workflows/api-tester.md +151 -151
- package/.agent/workflows/audit.md +127 -138
- package/.agent/workflows/brainstorm.md +110 -110
- package/.agent/workflows/changelog.md +112 -112
- package/.agent/workflows/create.md +124 -124
- package/.agent/workflows/debug.md +165 -189
- package/.agent/workflows/deploy.md +180 -189
- package/.agent/workflows/enhance.md +128 -151
- package/.agent/workflows/fix.md +114 -135
- package/.agent/workflows/generate.md +13 -4
- package/.agent/workflows/migrate.md +160 -160
- package/.agent/workflows/orchestrate.md +168 -168
- package/.agent/workflows/performance-benchmarker.md +114 -123
- package/.agent/workflows/plan.md +173 -173
- package/.agent/workflows/preview.md +80 -80
- package/.agent/workflows/refactor.md +161 -183
- package/.agent/workflows/review-ai.md +101 -129
- package/.agent/workflows/review.md +116 -116
- package/.agent/workflows/session.md +94 -94
- package/.agent/workflows/status.md +79 -79
- package/.agent/workflows/strengthen-skills.md +138 -139
- package/.agent/workflows/swarm.md +179 -179
- package/.agent/workflows/test.md +189 -211
- package/.agent/workflows/tribunal-backend.md +94 -113
- package/.agent/workflows/tribunal-database.md +95 -115
- package/.agent/workflows/tribunal-frontend.md +96 -118
- package/.agent/workflows/tribunal-full.md +93 -133
- package/.agent/workflows/tribunal-mobile.md +95 -119
- package/.agent/workflows/tribunal-performance.md +110 -133
- package/.agent/workflows/ui-ux-pro-max.md +122 -143
- package/README.md +30 -1
- package/bin/tribunal-kit.js +175 -12
- package/package.json +25 -4
- package/.agent/skills/api-patterns/api-style.md +0 -42
- package/.agent/skills/api-patterns/auth.md +0 -24
- package/.agent/skills/api-patterns/documentation.md +0 -26
- package/.agent/skills/api-patterns/graphql.md +0 -41
- package/.agent/skills/api-patterns/rate-limiting.md +0 -31
- package/.agent/skills/api-patterns/response.md +0 -37
- package/.agent/skills/api-patterns/rest.md +0 -40
- package/.agent/skills/api-patterns/security-testing.md +0 -122
- package/.agent/skills/api-patterns/trpc.md +0 -41
- package/.agent/skills/api-patterns/versioning.md +0 -22
- package/.agent/skills/app-builder/agent-coordination.md +0 -71
- package/.agent/skills/app-builder/feature-building.md +0 -53
- package/.agent/skills/app-builder/project-detection.md +0 -34
- package/.agent/skills/app-builder/scaffolding.md +0 -118
- package/.agent/skills/app-builder/tech-stack.md +0 -40
- package/.agent/skills/architecture/context-discovery.md +0 -43
- package/.agent/skills/architecture/examples.md +0 -94
- package/.agent/skills/architecture/pattern-selection.md +0 -68
- package/.agent/skills/architecture/patterns-reference.md +0 -50
- package/.agent/skills/architecture/trade-off-analysis.md +0 -77
- package/.agent/skills/brainstorming/dynamic-questioning.md +0 -360
- package/.agent/skills/database-design/database-selection.md +0 -43
- package/.agent/skills/database-design/indexing.md +0 -39
- package/.agent/skills/database-design/migrations.md +0 -48
- package/.agent/skills/database-design/optimization.md +0 -36
- package/.agent/skills/database-design/orm-selection.md +0 -30
- package/.agent/skills/database-design/schema-design.md +0 -56
- package/.agent/skills/frontend-design/animation-guide.md +0 -331
- package/.agent/skills/frontend-design/color-system.md +0 -329
- package/.agent/skills/frontend-design/decision-trees.md +0 -418
- package/.agent/skills/frontend-design/motion-graphics.md +0 -306
- package/.agent/skills/frontend-design/typography-system.md +0 -363
- package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
- package/.agent/skills/frontend-design/visual-effects.md +0 -383
- package/.agent/skills/intelligent-routing/router-manifest.md +0 -65
- package/.agent/skills/mobile-design/decision-trees.md +0 -516
- package/.agent/skills/mobile-design/mobile-backend.md +0 -491
- package/.agent/skills/mobile-design/mobile-color-system.md +0 -420
- package/.agent/skills/mobile-design/mobile-debugging.md +0 -122
- package/.agent/skills/mobile-design/mobile-design-thinking.md +0 -357
- package/.agent/skills/mobile-design/mobile-navigation.md +0 -458
- package/.agent/skills/mobile-design/mobile-performance.md +0 -767
- package/.agent/skills/mobile-design/mobile-testing.md +0 -356
- package/.agent/skills/mobile-design/mobile-typography.md +0 -433
- package/.agent/skills/mobile-design/platform-android.md +0 -666
- package/.agent/skills/mobile-design/platform-ios.md +0 -561
- package/.agent/skills/mobile-design/touch-psychology.md +0 -537
- package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
- package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
- package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
- package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
- package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
- package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
- package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
- package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
- package/.agent/skills/vulnerability-scanner/checklists.md +0 -121
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
consolidate_skills.py
|
|
4
|
+
Merges all sub-files in skill directories into the main SKILL.md.
|
|
5
|
+
Strips: verbose intros, output format blocks, run scripts tables,
|
|
6
|
+
mandatory read tables, empty headers, redundant boilerplate.
|
|
7
|
+
Keeps: all code blocks, hallucination traps, checklist items.
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
python .agent/scripts/consolidate_skills.py [skill_name]
|
|
11
|
+
python .agent/scripts/consolidate_skills.py # all skills
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import os, re, sys
|
|
15
|
+
|
|
16
|
+
BASE = '.agent/skills'
|
|
17
|
+
|
|
18
|
+
# These patterns are global (GEMINI.md) — strip from sub-files before merge
|
|
19
|
+
STRIP_PATTERNS = [
|
|
20
|
+
r'(?ms)^## 🏛️ Tribunal Integration.*?(?=^## |\Z)',
|
|
21
|
+
r'(?ms)^## Tribunal Integration.*?(?=^## |\Z)',
|
|
22
|
+
r'(?ms)^### ✅ Pre-Flight Self-Audit.*?(?=^###|^## |\Z)',
|
|
23
|
+
r'(?ms)^## Pre-Flight Self-Audit.*?(?=^## |\Z)',
|
|
24
|
+
r'(?ms)^## Output Format\b.*?(?=^## |\Z)',
|
|
25
|
+
r'(?ms)^## 🔧 Runtime Scripts.*?(?=^## |\Z)',
|
|
26
|
+
r'(?ms)^## 🔴 MANDATORY.*?(?=^## |\Z)',
|
|
27
|
+
r'(?ms)^## ⚠️ CRITICAL: ASK BEFORE ASSUMING.*?(?=^## |\Z)',
|
|
28
|
+
r'(?ms)^## 📝 CHECKPOINT \(MANDATORY.*?(?=^## |\Z)',
|
|
29
|
+
r'(?ms)^## Output Format.*?```\n[^`]*```\n?(?=^## |\Z)',
|
|
30
|
+
r'(?ms)^\*\*Execute these for validation.*?---\n',
|
|
31
|
+
r'(?ms)^\*\*VBC \(Verification-Before-Completion\).*?\n',
|
|
32
|
+
# MANDATORY read tables
|
|
33
|
+
r'(?ms)^\*\*⛔ DO NOT start.*?---\n?',
|
|
34
|
+
r'(?ms)^> 🧠 \*\*mobile-design.*?\n',
|
|
35
|
+
r'(?ms)^> \*\*STOP.*?\n',
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
# Heading level adjustment (sub-files use H1 — convert to H2 in merged output)
|
|
39
|
+
def adjust_headings(content, offset=1):
|
|
40
|
+
"""Promote headings by adding # chars"""
|
|
41
|
+
lines = content.split('\n')
|
|
42
|
+
out = []
|
|
43
|
+
for line in lines:
|
|
44
|
+
m = re.match(r'^(#{1,5}) ', line)
|
|
45
|
+
if m:
|
|
46
|
+
level = len(m.group(1))
|
|
47
|
+
new_level = min(level + offset, 6)
|
|
48
|
+
line = '#' * new_level + line[level:]
|
|
49
|
+
out.append(line)
|
|
50
|
+
return '\n'.join(out)
|
|
51
|
+
|
|
52
|
+
def clean_content(content):
|
|
53
|
+
"""Apply strip patterns"""
|
|
54
|
+
for p in STRIP_PATTERNS:
|
|
55
|
+
content = re.sub(p, '', content)
|
|
56
|
+
content = re.sub(r'\n{3,}', '\n\n', content)
|
|
57
|
+
return content.strip()
|
|
58
|
+
|
|
59
|
+
def extract_frontmatter(content):
|
|
60
|
+
"""Return (frontmatter_dict_str, body)"""
|
|
61
|
+
m = re.match(r'^---\n(.*?)\n---\n', content, re.DOTALL)
|
|
62
|
+
if m:
|
|
63
|
+
return m.group(1), content[m.end():]
|
|
64
|
+
return '', content
|
|
65
|
+
|
|
66
|
+
def get_sub_title(content):
|
|
67
|
+
"""Get first H1 from a sub-file"""
|
|
68
|
+
m = re.search(r'^# (.+)', content, re.MULTILINE)
|
|
69
|
+
return m.group(1) if m else None
|
|
70
|
+
|
|
71
|
+
def consolidate(skill_dir):
|
|
72
|
+
skill_name = os.path.basename(skill_dir)
|
|
73
|
+
main_path = os.path.join(skill_dir, 'SKILL.md')
|
|
74
|
+
if not os.path.exists(main_path):
|
|
75
|
+
return False
|
|
76
|
+
|
|
77
|
+
# Find sub-files (non-SKILL.md markdown files)
|
|
78
|
+
sub_files = sorted([
|
|
79
|
+
f for f in os.listdir(skill_dir)
|
|
80
|
+
if f.endswith('.md') and f != 'SKILL.md'
|
|
81
|
+
])
|
|
82
|
+
|
|
83
|
+
if not sub_files:
|
|
84
|
+
return False
|
|
85
|
+
|
|
86
|
+
print(f'\n → Consolidating: {skill_name} ({len(sub_files)} sub-files)')
|
|
87
|
+
|
|
88
|
+
# Read main SKILL.md
|
|
89
|
+
main_content = open(main_path, 'r', encoding='utf-8', errors='ignore').read()
|
|
90
|
+
frontmatter, main_body = extract_frontmatter(main_content)
|
|
91
|
+
|
|
92
|
+
# Clean & update frontmatter version
|
|
93
|
+
fm_lines = frontmatter.split('\n')
|
|
94
|
+
new_fm = []
|
|
95
|
+
for line in fm_lines:
|
|
96
|
+
if line.startswith('version:'):
|
|
97
|
+
new_fm.append('version: 3.1.0')
|
|
98
|
+
elif line.startswith('last-updated:'):
|
|
99
|
+
new_fm.append('last-updated: 2026-04-06')
|
|
100
|
+
else:
|
|
101
|
+
new_fm.append(line)
|
|
102
|
+
frontmatter = '\n'.join(new_fm)
|
|
103
|
+
|
|
104
|
+
# Clean main body
|
|
105
|
+
main_body = clean_content(main_body)
|
|
106
|
+
|
|
107
|
+
# Remove MANDATORY read table from main body
|
|
108
|
+
# (links like [file.md](file.md) in tables)
|
|
109
|
+
main_body = re.sub(r'\|.*?\.md.*?\|.*?\|.*?\|\n', '', main_body)
|
|
110
|
+
main_body = re.sub(r'^\|[-| ]+\|\n', '', main_body, flags=re.MULTILINE)
|
|
111
|
+
main_body = re.sub(r'\n{3,}', '\n\n', main_body)
|
|
112
|
+
|
|
113
|
+
# Merge sub-files
|
|
114
|
+
merged_sections = []
|
|
115
|
+
for fname in sub_files:
|
|
116
|
+
fpath = os.path.join(skill_dir, fname)
|
|
117
|
+
raw = open(fpath, 'r', encoding='utf-8', errors='ignore').read()
|
|
118
|
+
_, body = extract_frontmatter(raw)
|
|
119
|
+
body = clean_content(body)
|
|
120
|
+
# Adjust headings: H1→H2, H2→H3, etc.
|
|
121
|
+
body = adjust_headings(body, offset=1)
|
|
122
|
+
if body.strip():
|
|
123
|
+
merged_sections.append(body.strip())
|
|
124
|
+
|
|
125
|
+
# Build final output
|
|
126
|
+
combined = f'---\n{frontmatter}\n---\n\n{main_body}'
|
|
127
|
+
if merged_sections:
|
|
128
|
+
combined += '\n\n---\n\n' + '\n\n---\n\n'.join(merged_sections)
|
|
129
|
+
|
|
130
|
+
# Final cleanup
|
|
131
|
+
combined = re.sub(r'\n{3,}', '\n\n', combined)
|
|
132
|
+
combined = combined.strip() + '\n'
|
|
133
|
+
|
|
134
|
+
# Measure savings
|
|
135
|
+
total_sub_bytes = sum(os.path.getsize(os.path.join(skill_dir, f)) for f in sub_files)
|
|
136
|
+
print(f' Sub-files total: {total_sub_bytes//1024}KB')
|
|
137
|
+
|
|
138
|
+
# Write consolidated SKILL.md
|
|
139
|
+
with open(main_path, 'w', encoding='utf-8') as f:
|
|
140
|
+
f.write(combined)
|
|
141
|
+
|
|
142
|
+
new_size = os.path.getsize(main_path)
|
|
143
|
+
print(f' New SKILL.md: {new_size//1024}KB (from {len(main_content)//1024}KB main + {total_sub_bytes//1024}KB subs → {new_size//1024}KB)')
|
|
144
|
+
|
|
145
|
+
# Delete sub-files
|
|
146
|
+
for fname in sub_files:
|
|
147
|
+
os.remove(os.path.join(skill_dir, fname))
|
|
148
|
+
print(f' Deleted: {fname}')
|
|
149
|
+
|
|
150
|
+
return True
|
|
151
|
+
|
|
152
|
+
def main():
|
|
153
|
+
target = sys.argv[1] if len(sys.argv) > 1 else None
|
|
154
|
+
|
|
155
|
+
total_saved = 0
|
|
156
|
+
processed = 0
|
|
157
|
+
|
|
158
|
+
for skill_name in os.listdir(BASE):
|
|
159
|
+
skill_dir = os.path.join(BASE, skill_name)
|
|
160
|
+
if not os.path.isdir(skill_dir):
|
|
161
|
+
continue
|
|
162
|
+
if target and skill_name != target:
|
|
163
|
+
continue
|
|
164
|
+
if consolidate(skill_dir):
|
|
165
|
+
processed += 1
|
|
166
|
+
|
|
167
|
+
if processed == 0:
|
|
168
|
+
print('No skills with sub-files found (or target not matched).')
|
|
169
|
+
else:
|
|
170
|
+
print(f'\n✅ Consolidated {processed} skills.')
|
|
171
|
+
|
|
172
|
+
if __name__ == '__main__':
|
|
173
|
+
main()
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
deep_compress.py - Deep surgical compression for .agent/ markdown files (skills, agents, workflows).
|
|
4
|
+
Targets: repetitive boilerplate, verbose code comments, redundant example sections.
|
|
5
|
+
Safe: never removes H1/H2 headers, never removes HALLUCINATION TRAP lines, never removes code blocks entirely.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import os, re, sys
|
|
9
|
+
|
|
10
|
+
BASE_DIRS = ['.agent/skills', '.agent/agents', '.agent/workflows']
|
|
11
|
+
|
|
12
|
+
# ─── SECTION REMOVAL ─────────────────────────────────────────────────────────
|
|
13
|
+
# These are globally covered by GEMINI.md — strip from all files
|
|
14
|
+
|
|
15
|
+
REMOVE_SECTIONS = [
|
|
16
|
+
r'(?ms)^## 🏛️ Tribunal Integration.*?(?=^## |\Z)',
|
|
17
|
+
r'(?ms)^## Tribunal Integration.*?(?=^## |\Z)',
|
|
18
|
+
r'(?ms)^### ✅ Pre-Flight Self-Audit.*?(?=^### |^## |\Z)',
|
|
19
|
+
r'(?ms)^## Pre-Flight Self-Audit.*?(?=^## |\Z)',
|
|
20
|
+
r'(?ms)^## Cross-Workflow Navigation.*?(?=^## |\Z)',
|
|
21
|
+
r'(?ms)^## LLM Traps.*?(?=^## |\Z)',
|
|
22
|
+
r'(?ms)^## VBC Protocol.*?(?=^## |\Z)',
|
|
23
|
+
r'(?ms)^## Output Format\n```[\s\S]*?```\n',
|
|
24
|
+
r'(?ms)^## 🤖 LLM-Specific Traps.*?(?=^## |\Z)', # covered in GEMINI.md
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
# ─── VERBOSE COMMENT REMOVAL IN CODE BLOCKS ──────────────────────────────────
|
|
28
|
+
# Removes lines that just restate the concept being shown — pure padding
|
|
29
|
+
|
|
30
|
+
VERBOSE_COMMENT_PATTERNS = [
|
|
31
|
+
# e.g. "// Any HTML or SVG element can be prefixed with `motion.`"
|
|
32
|
+
r"(?m)^(\s*)//\s*(?:Any HTML or SVG element|motion\.div, motion\.span|The MAGIC of|This is the key performance|The pattern that|Compound components share|Note that children|The action receives|Children inherit the|Import first|Parent controls when|It's always motion)\b[^\n]*\n",
|
|
33
|
+
# e.g. "# TypedDict gives you autocomplete..."
|
|
34
|
+
r"(?m)^(\s*)#\s*(?:TypedDict gives you|Usage:|Note:|Return user|Return None|Automatically)\b[^\n]*\n",
|
|
35
|
+
# Obvious standalone "// Usage:" label inside code blocks
|
|
36
|
+
r"(?m)^\s*//\s*Usage:\s*\n(?=\s*[<{])",
|
|
37
|
+
r"(?m)^\s*#\s*Usage:\s*\n(?=\s*[{])",
|
|
38
|
+
# "// When server responds..." style obvious follow-on comment
|
|
39
|
+
r"(?m)^\s*//\s*When (?:server responds|a component|React can interrupt|the React Compiler)[^\n]*\n",
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
# ─── CHATTY SENTENCE REMOVAL BEFORE FIRST CODE BLOCK ─────────────────────────
|
|
43
|
+
# Removes motivational opener sentences: "X is a paradigm shift. If you..."
|
|
44
|
+
|
|
45
|
+
def strip_chatty_openers(content):
|
|
46
|
+
"""Remove 2-3 sentence filler paragraphs between H1 and first ---"""
|
|
47
|
+
return re.sub(
|
|
48
|
+
r'(^# .+\n)\n.{60,}\n.{30,}\n(?:\n---)',
|
|
49
|
+
r'\1\n---',
|
|
50
|
+
content,
|
|
51
|
+
flags=re.MULTILINE
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# ─── COLLAPSE NESTED IDENTICAL EXAMPLES ──────────────────────────────────────
|
|
55
|
+
# Many files have "// Legacy" vs "// Modern" comments — compress to 1 block
|
|
56
|
+
|
|
57
|
+
def compress_legacy_modern_blocks(content):
|
|
58
|
+
"""Convert // LEGACY + // MODERN dual examples into compact diff-style"""
|
|
59
|
+
# Pattern: code block with ❌ LEGACY followed immediately by ✅ MODERN
|
|
60
|
+
pattern = re.compile(
|
|
61
|
+
r'```(\w+)\n((?:.*\n)*?.*// ❌ LEGACY[^\n]*\n(?:.*\n)*?)```\n\n```\w+\n((?:.*\n)*?.*// ✅ MODERN[^\n]*\n(?:.*\n)*?)```',
|
|
62
|
+
re.MULTILINE
|
|
63
|
+
)
|
|
64
|
+
# Only compress if the whole block is < 30 lines total
|
|
65
|
+
def compress(m):
|
|
66
|
+
total_lines = m.group(2).count('\n') + m.group(3).count('\n')
|
|
67
|
+
if total_lines > 28:
|
|
68
|
+
return m.group(0) # too big to safely merge — leave alone
|
|
69
|
+
lang = m.group(1)
|
|
70
|
+
legacy = m.group(2).strip()
|
|
71
|
+
modern = m.group(3).strip()
|
|
72
|
+
return f'```{lang}\n// ❌ LEGACY\n{legacy}\n\n// ✅ MODERN\n{modern}\n```'
|
|
73
|
+
return pattern.sub(compress, content)
|
|
74
|
+
|
|
75
|
+
# ─── STRIP EMPTY COMMENT LINES ───────────────────────────────────────────────
|
|
76
|
+
def strip_empty_comments(content):
|
|
77
|
+
"""Remove lines that are ONLY // or #"""
|
|
78
|
+
content = re.sub(r'(?m)^\s*//\s*$\n', '', content)
|
|
79
|
+
content = re.sub(r'(?m)^\s*#\s*$\n', '', content)
|
|
80
|
+
return content
|
|
81
|
+
|
|
82
|
+
# ─── TRIM REPEATED RULES (dedup consecutive bullet points in same section) ───
|
|
83
|
+
def dedup_bullet_points(content):
|
|
84
|
+
"""Remove exact duplicate bullet point lines (often copy-pasted across sections)."""
|
|
85
|
+
lines = content.split('\n')
|
|
86
|
+
seen_bullets = {}
|
|
87
|
+
output = []
|
|
88
|
+
for i, line in enumerate(lines):
|
|
89
|
+
stripped = line.strip()
|
|
90
|
+
if stripped.startswith(('✅', '❌', '- ✅', '- ❌')):
|
|
91
|
+
if stripped in seen_bullets and i - seen_bullets[stripped] < 80:
|
|
92
|
+
continue # skip duplicate within 80 lines
|
|
93
|
+
seen_bullets[stripped] = i
|
|
94
|
+
output.append(line)
|
|
95
|
+
return '\n'.join(output)
|
|
96
|
+
|
|
97
|
+
# ─── COLLAPSE BLANKS ─────────────────────────────────────────────────────────
|
|
98
|
+
def collapse_blanks(content):
|
|
99
|
+
return re.sub(r'\n{3,}', '\n\n', content)
|
|
100
|
+
|
|
101
|
+
# ─── REMOVE REDUNDANT IMPORTS IN COMMENTS ────────────────────────────────────
|
|
102
|
+
# Some files have // import { x } from "y" repeated in every example
|
|
103
|
+
|
|
104
|
+
def compress_import_repetition(content):
|
|
105
|
+
"""If same import line appears in 3+ separate code blocks, add a note and strip repetitions."""
|
|
106
|
+
import_line = re.compile(r'import \{[^}]+\} from "[^"]+";')
|
|
107
|
+
matches = import_line.findall(content)
|
|
108
|
+
freq = {}
|
|
109
|
+
for m in matches:
|
|
110
|
+
freq[m] = freq.get(m, 0) + 1
|
|
111
|
+
|
|
112
|
+
for imp, count in freq.items():
|
|
113
|
+
if count >= 4:
|
|
114
|
+
# First occurrence: keep it. Subsequent ones: replace with comment
|
|
115
|
+
first_done = [False]
|
|
116
|
+
def replacer(m, imp=imp, first_done=first_done):
|
|
117
|
+
if m.group(0) == imp:
|
|
118
|
+
if not first_done[0]:
|
|
119
|
+
first_done[0] = True
|
|
120
|
+
return m.group(0)
|
|
121
|
+
return f'// {imp} ← (already imported above)'
|
|
122
|
+
return m.group(0)
|
|
123
|
+
content = import_line.sub(replacer, content)
|
|
124
|
+
return content
|
|
125
|
+
|
|
126
|
+
# ─── MAIN PIPELINE ──────────────────────────────────────────────────────────
|
|
127
|
+
|
|
128
|
+
def compress_file(path):
|
|
129
|
+
with open(path, 'r', encoding='utf-8', errors='ignore') as f:
|
|
130
|
+
original = f.read()
|
|
131
|
+
|
|
132
|
+
content = original
|
|
133
|
+
|
|
134
|
+
# 1. Strip global boilerplate sections
|
|
135
|
+
for pattern in REMOVE_SECTIONS:
|
|
136
|
+
content = re.sub(pattern, '', content)
|
|
137
|
+
|
|
138
|
+
# 2. Strip chatty openers
|
|
139
|
+
content = strip_chatty_openers(content)
|
|
140
|
+
|
|
141
|
+
# 3. Compress legacy/modern dual blocks
|
|
142
|
+
content = compress_legacy_modern_blocks(content)
|
|
143
|
+
|
|
144
|
+
# 4. Verbose inline code comment removal
|
|
145
|
+
for pattern in VERBOSE_COMMENT_PATTERNS:
|
|
146
|
+
content = re.sub(pattern, '', content)
|
|
147
|
+
|
|
148
|
+
# 5. Strip empty comment lines
|
|
149
|
+
content = strip_empty_comments(content)
|
|
150
|
+
|
|
151
|
+
# 6. Deduplicate bullet points
|
|
152
|
+
content = dedup_bullet_points(content)
|
|
153
|
+
|
|
154
|
+
# 7. Collapse 3+ blank lines
|
|
155
|
+
content = collapse_blanks(content)
|
|
156
|
+
|
|
157
|
+
# Write back only if changed
|
|
158
|
+
if content.strip() != original.strip():
|
|
159
|
+
with open(path, 'w', encoding='utf-8') as f:
|
|
160
|
+
f.write(content.strip() + '\n')
|
|
161
|
+
|
|
162
|
+
return len(original), len(content)
|
|
163
|
+
|
|
164
|
+
def main():
|
|
165
|
+
total_orig = 0
|
|
166
|
+
total_new = 0
|
|
167
|
+
file_results = []
|
|
168
|
+
|
|
169
|
+
for base in BASE_DIRS:
|
|
170
|
+
if not os.path.exists(base):
|
|
171
|
+
continue
|
|
172
|
+
for root, _, files in os.walk(base):
|
|
173
|
+
for fname in files:
|
|
174
|
+
if fname.endswith('.md'):
|
|
175
|
+
path = os.path.join(root, fname)
|
|
176
|
+
orig, new = compress_file(path)
|
|
177
|
+
total_orig += orig
|
|
178
|
+
total_new += new
|
|
179
|
+
saved = orig - new
|
|
180
|
+
if saved > 200:
|
|
181
|
+
rel = os.path.relpath(path, '.')
|
|
182
|
+
file_results.append((saved, rel))
|
|
183
|
+
|
|
184
|
+
file_results.sort(reverse=True)
|
|
185
|
+
|
|
186
|
+
saved_total = total_orig - total_new
|
|
187
|
+
pct = saved_total / total_orig * 100 if total_orig else 0
|
|
188
|
+
|
|
189
|
+
print(f"\n{'='*58}")
|
|
190
|
+
print(f" Deep Compression Complete")
|
|
191
|
+
print(f"{'='*58}")
|
|
192
|
+
print(f" Original : {total_orig:,} bytes ({total_orig//1024}KB)")
|
|
193
|
+
print(f" After : {total_new:,} bytes ({total_new//1024}KB)")
|
|
194
|
+
print(f" Saved : {saved_total:,} bytes ({saved_total//1024}KB) — {pct:.1f}%")
|
|
195
|
+
print(f"\n Top savings:")
|
|
196
|
+
for saved, path in file_results[:20]:
|
|
197
|
+
skill = '/'.join(path.replace('\\','/').split('/')[-2:])
|
|
198
|
+
print(f" -{saved//1024:2}KB {skill}")
|
|
199
|
+
print()
|
|
200
|
+
|
|
201
|
+
if __name__ == '__main__':
|
|
202
|
+
main()
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import re
|
|
3
|
+
|
|
4
|
+
def minify_markdown(file_path):
|
|
5
|
+
with open(file_path, 'r', encoding='utf-8') as f:
|
|
6
|
+
content = f.read()
|
|
7
|
+
|
|
8
|
+
original_len = len(content)
|
|
9
|
+
|
|
10
|
+
# 1. Strip repetitive Output Format templates (These are huge and the LLM already knows how to output the Tribunal format from GEMINI.md)
|
|
11
|
+
content = re.sub(r'## Output Format\n\n```[\s\S]*?```\n', '', content)
|
|
12
|
+
|
|
13
|
+
# 2. Convert bloated Cross-Workflow Navigation tables to dense YAML lists
|
|
14
|
+
# Find tables under Cross-Workflow Navigation
|
|
15
|
+
def replace_table_with_list(match):
|
|
16
|
+
table_text = match.group(0)
|
|
17
|
+
lines = table_text.strip().split('\n')
|
|
18
|
+
out = []
|
|
19
|
+
for line in lines:
|
|
20
|
+
if line.startswith('|') and not line.startswith('|:') and not line.startswith('| After'):
|
|
21
|
+
parts = [p.strip() for p in line.split('|') if p.strip()]
|
|
22
|
+
if len(parts) >= 2:
|
|
23
|
+
out.append(f"- {parts[0]} -> {parts[1]}")
|
|
24
|
+
return "\n".join(out) + "\n"
|
|
25
|
+
|
|
26
|
+
content = re.sub(r'## Cross-Workflow Navigation\n\n\|.*?\|[\s\S]*?(?=\n## |\Z)', lambda m: '## Cross-Workflow Navigation\n' + replace_table_with_list(m), content)
|
|
27
|
+
|
|
28
|
+
# 3. Collapse multiple empty lines into a single one
|
|
29
|
+
content = re.sub(r'\n{3,}', '\n\n', content)
|
|
30
|
+
|
|
31
|
+
# 4. Remove padding from remaining tables to save space tokens
|
|
32
|
+
def unpad_table(match):
|
|
33
|
+
line = match.group(0)
|
|
34
|
+
# remove spaces around |
|
|
35
|
+
line = re.sub(r'\s+\|\s+', '|', line)
|
|
36
|
+
line = re.sub(r'\|\s+', '|', line)
|
|
37
|
+
line = re.sub(r'\s+\|', '|', line)
|
|
38
|
+
return line
|
|
39
|
+
content = re.sub(r'^\|.+|$', unpad_table, content, flags=re.MULTILINE)
|
|
40
|
+
|
|
41
|
+
# 5. Remove conversational blockquotes > if they don't contain WARNING/NOTE/IMPORTANT
|
|
42
|
+
def remove_conversational_quotes(match):
|
|
43
|
+
text = match.group(0)
|
|
44
|
+
if '⚠️' in text or 'WARNING' in text or 'CRITICAL' in text or '!' in text:
|
|
45
|
+
return text
|
|
46
|
+
# Otherwise just return the text without quote
|
|
47
|
+
return text.replace('> ', '').replace('>', '')
|
|
48
|
+
content = re.sub(r'^>.*$', remove_conversational_quotes, content, flags=re.MULTILINE)
|
|
49
|
+
|
|
50
|
+
# 6. Dense Examples (convert ❌ Bad: and ✅ Good: blocks to single lines)
|
|
51
|
+
content = content.replace('\n❌ Bad:', ' ❌')
|
|
52
|
+
content = content.replace('\n✅ Good:', ' ✅')
|
|
53
|
+
|
|
54
|
+
with open(file_path, 'w', encoding='utf-8') as f:
|
|
55
|
+
f.write(content)
|
|
56
|
+
|
|
57
|
+
return original_len, len(content)
|
|
58
|
+
|
|
59
|
+
def main():
|
|
60
|
+
agent_dir = os.path.join('.agent')
|
|
61
|
+
total_original = 0
|
|
62
|
+
total_new = 0
|
|
63
|
+
|
|
64
|
+
for root, _, files in os.walk(agent_dir):
|
|
65
|
+
for file in files:
|
|
66
|
+
if file.endswith('.md'):
|
|
67
|
+
file_path = os.path.join(root, file)
|
|
68
|
+
orig, new = minify_markdown(file_path)
|
|
69
|
+
total_original += orig
|
|
70
|
+
total_new += new
|
|
71
|
+
|
|
72
|
+
saved = total_original - total_new
|
|
73
|
+
percent = (saved / total_original * 100) if total_original > 0 else 0
|
|
74
|
+
print(f"Minification Complete.")
|
|
75
|
+
print(f"Original size: {total_original} bytes")
|
|
76
|
+
print(f"New size: {total_new} bytes")
|
|
77
|
+
print(f"Saved: {saved} bytes ({percent:.1f}%)")
|
|
78
|
+
|
|
79
|
+
if __name__ == '__main__':
|
|
80
|
+
main()
|
|
@@ -32,7 +32,7 @@ BOLD = "\033[1m"
|
|
|
32
32
|
RESET = "\033[0m"
|
|
33
33
|
|
|
34
34
|
SOURCE_EXTENSIONS = {".ts", ".tsx", ".js", ".jsx", ".py", ".go", ".java", ".rb"}
|
|
35
|
-
SKIP_DIRS = {"node_modules", ".git", "dist", "build", "__pycache__", ".agent", ".next", "vendor"}
|
|
35
|
+
SKIP_DIRS = {"node_modules", ".git", "dist", "build", "__pycache__", ".agent", ".next", "vendor", "coverage", "lcov-report", ".nyc_output", "test-results", ".jest-cache"}
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
@dataclass
|