vibes-plug 2.5.0 → 2.11.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 (177) hide show
  1. package/.claude/rules/vibes-plug-core.md +32 -0
  2. package/.cursor/rules/vibes-plug-core.mdc +51 -0
  3. package/.cursorrules +42 -0
  4. package/AGENTS.md +37 -7
  5. package/BLUEPRINT.md +309 -217
  6. package/CHANGELOG.md +133 -1
  7. package/CLAUDE.md +70 -0
  8. package/LICENSE +1 -1
  9. package/README.md +641 -415
  10. package/index.js +19 -0
  11. package/package.json +44 -8
  12. package/plugin.json +24 -7
  13. package/scripts/generate_swarm_gif.py +295 -0
  14. package/scripts/install.js +201 -0
  15. package/skills/accessibility-testing-expert/SKILL.md +116 -0
  16. package/skills/ai-cost-token-optimizer/SKILL.md +82 -52
  17. package/skills/ai-evals-benchmark-expert/SKILL.md +188 -0
  18. package/skills/ai-llm-integration-expert/SKILL.md +185 -178
  19. package/skills/ai-media-generation-expert/SKILL.md +172 -0
  20. package/skills/ai-prompt-engineering-expert/SKILL.md +84 -0
  21. package/skills/angular-expert/SKILL.md +148 -0
  22. package/skills/api-design-expert/SKILL.md +6 -3
  23. package/skills/api-gateway-proxy-expert/SKILL.md +81 -0
  24. package/skills/app-analyzer-optimizer/SKILL.md +6 -3
  25. package/skills/apple-ecosystem-expert/SKILL.md +144 -141
  26. package/skills/{asisten_ramah → asisten-ramah}/SKILL.md +7 -1
  27. package/skills/astro-framework-expert/SKILL.md +200 -0
  28. package/skills/async-queue-temporal-expert/SKILL.md +210 -24
  29. package/skills/authentication-identity-expert/SKILL.md +278 -275
  30. package/skills/auto-doc-updater/SKILL.md +7 -1
  31. package/skills/autonomous-chaos-monkey/SKILL.md +63 -63
  32. package/skills/autonomous-red-teamer/SKILL.md +172 -28
  33. package/skills/autonomous-tdd-debugger/SKILL.md +70 -64
  34. package/skills/background-jobs-queue-expert/SKILL.md +235 -0
  35. package/skills/biome-linter-formatter-expert/SKILL.md +89 -0
  36. package/skills/blockchain-web3-expert/SKILL.md +115 -0
  37. package/skills/bootstrap-to-modern/SKILL.md +9 -6
  38. package/skills/brainstorming/SKILL.md +58 -50
  39. package/skills/browser-automation-expert/SKILL.md +197 -21
  40. package/skills/bun-runtime-expert/SKILL.md +7 -1
  41. package/skills/chatbot-messaging-expert/SKILL.md +114 -0
  42. package/skills/ci-cd-devops-architect/SKILL.md +45 -36
  43. package/skills/cloud-hosting-expert/SKILL.md +7 -1
  44. package/skills/coderabbit/SKILL.md +7 -1
  45. package/skills/compliance-gdpr-privacy-expert/SKILL.md +85 -0
  46. package/skills/cron-scheduler-expert/SKILL.md +303 -297
  47. package/skills/data-pipeline-etl-expert/SKILL.md +84 -0
  48. package/skills/data-telemetry-expert/SKILL.md +7 -1
  49. package/skills/data-visualization-expert/SKILL.md +154 -0
  50. package/skills/database-migration-versioning-expert/SKILL.md +90 -0
  51. package/skills/database-orm-expert/SKILL.md +13 -3
  52. package/skills/dependency-upgrade-migrator/SKILL.md +300 -294
  53. package/skills/design-system-architect/SKILL.md +278 -259
  54. package/skills/desktop-electron-expert/SKILL.md +128 -0
  55. package/skills/documentation-site-expert/SKILL.md +59 -0
  56. package/skills/doku-mcp-server/SKILL.md +7 -1
  57. package/skills/doku-payment-gateway/SKILL.md +7 -1
  58. package/skills/domain-driven-design-expert/SKILL.md +82 -0
  59. package/skills/e2e-testing-expert/SKILL.md +7 -1
  60. package/skills/ecommerce-expert/SKILL.md +87 -0
  61. package/skills/edge-serverless-db-expert/SKILL.md +98 -42
  62. package/skills/email-notification-expert/SKILL.md +367 -361
  63. package/skills/error-resilience-expert/SKILL.md +485 -479
  64. package/skills/event-driven-architect/SKILL.md +7 -1
  65. package/skills/feature-flag-analytics-expert/SKILL.md +65 -45
  66. package/skills/file-upload-media-expert/SKILL.md +436 -430
  67. package/skills/firebase-security-expert/SKILL.md +7 -1
  68. package/skills/form-validation-expert/SKILL.md +406 -400
  69. package/skills/fullstack-expert/SKILL.md +60 -1
  70. package/skills/gemini-agent-booster/SKILL.md +173 -135
  71. package/skills/geospatial-maps-expert/SKILL.md +80 -0
  72. package/skills/global-a11y-i18n-expert/SKILL.md +7 -1
  73. package/skills/glsl-shader-expert/SKILL.md +106 -100
  74. package/skills/go-programming-expert/SKILL.md +21 -15
  75. package/skills/graph-rag-knowledge-expert/SKILL.md +159 -0
  76. package/skills/graphql-apollo-expert/SKILL.md +113 -107
  77. package/skills/headless-cms-expert/SKILL.md +181 -0
  78. package/skills/hig/SKILL.md +7 -1
  79. package/skills/js-backend-expert/SKILL.md +218 -216
  80. package/skills/legacy-code-translator/SKILL.md +70 -64
  81. package/skills/local-slm-edge-ai-expert/SKILL.md +167 -0
  82. package/skills/logging-error-tracking-expert/SKILL.md +343 -337
  83. package/skills/mcp-client-orchestrator/SKILL.md +75 -69
  84. package/skills/mcp-server-architect/SKILL.md +294 -194
  85. package/skills/micro-frontend-architect/SKILL.md +111 -105
  86. package/skills/mobile-expo-expert/SKILL.md +8 -2
  87. package/skills/mobile-push-notification-expert/SKILL.md +70 -50
  88. package/skills/modern-css-native-expert/SKILL.md +189 -0
  89. package/skills/monday-design-aesthetic/SKILL.md +7 -1
  90. package/skills/monorepo-architect/SKILL.md +7 -1
  91. package/skills/mpa-orchestrator/SKILL.md +20 -1
  92. package/skills/multi-agent-orchestration/SKILL.md +254 -234
  93. package/skills/multiple-entry-points/SKILL.md +37 -1
  94. package/skills/mvc-expert/SKILL.md +7 -1
  95. package/skills/n8n-automation-expert/SKILL.md +89 -0
  96. package/skills/nextjs-app-router-expert/SKILL.md +148 -0
  97. package/skills/openapi-swagger-codegen-expert/SKILL.md +67 -0
  98. package/skills/payment-gateway-expert/SKILL.md +85 -1
  99. package/skills/pdf-document-generation-expert/SKILL.md +91 -0
  100. package/skills/performance-web-vitals/SKILL.md +7 -1
  101. package/skills/post-quantum-crypto-migrator/SKILL.md +57 -57
  102. package/skills/prd-architect/SKILL.md +7 -1
  103. package/skills/proactive-background-watcher/SKILL.md +67 -61
  104. package/skills/production-ready-hardener/SKILL.md +461 -455
  105. package/skills/project-context-mapper/SKILL.md +84 -78
  106. package/skills/pwa-offline-first-expert/SKILL.md +185 -0
  107. package/skills/python-programming-expert/SKILL.md +407 -401
  108. package/skills/rate-limit-abuse-prevention/SKILL.md +376 -370
  109. package/skills/realtime-collaboration-expert/SKILL.md +55 -1
  110. package/skills/rich-text-editor-expert/SKILL.md +177 -0
  111. package/skills/rust-programming-expert/SKILL.md +7 -1
  112. package/skills/saas-billing/SKILL.md +7 -1
  113. package/skills/saas-multi-tenant/SKILL.md +7 -1
  114. package/skills/saas-mvp-launcher/SKILL.md +20 -1
  115. package/skills/saas-transformer/SKILL.md +499 -488
  116. package/skills/scalability-clean-code/SKILL.md +7 -1
  117. package/skills/search-engine-expert/SKILL.md +89 -0
  118. package/skills/secure-fuzz-testing/SKILL.md +7 -1
  119. package/skills/self-evolving-memory-graph/SKILL.md +90 -74
  120. package/skills/self-healing-cloud-orchestrator/SKILL.md +57 -57
  121. package/skills/senior-frontend/SKILL.md +141 -161
  122. package/skills/seo/SKILL.md +41 -17
  123. package/skills/session-context-loader/SKILL.md +82 -76
  124. package/skills/session-handoff-resume/SKILL.md +7 -1
  125. package/skills/{skill_baru → skill-baru}/SKILL.md +8 -2
  126. package/skills/solidjs-expert/SKILL.md +80 -0
  127. package/skills/spa-orchestrator/SKILL.md +20 -1
  128. package/skills/sse-websocket-streaming-expert/SKILL.md +93 -0
  129. package/skills/state-management-expert/SKILL.md +7 -1
  130. package/skills/supabase-migration/SKILL.md +47 -1
  131. package/skills/supabase-security-expert/SKILL.md +7 -1
  132. package/skills/svelte-sveltekit-expert/SKILL.md +91 -0
  133. package/skills/svg-animation-motion-expert/SKILL.md +115 -0
  134. package/skills/tailwind-expert/SKILL.md +88 -136
  135. package/skills/tanstack-query-expert/SKILL.md +7 -1
  136. package/skills/tauri-expert/SKILL.md +7 -1
  137. package/skills/token-saver/SKILL.md +1 -1
  138. package/skills/typescript-expert/SKILL.md +12 -6
  139. package/skills/ui-components-expert/SKILL.md +165 -279
  140. package/skills/ui-ux-pro-max/SKILL.md +23 -3
  141. package/skills/vector-db-rag-expert/SKILL.md +175 -19
  142. package/skills/vibe-code-gardener/SKILL.md +1 -1
  143. package/skills/visual-qa-vision-agent/SKILL.md +70 -64
  144. package/skills/voice-ai-realtime-agent/SKILL.md +202 -0
  145. package/skills/vue-frontend-expert/SKILL.md +131 -125
  146. package/skills/wasm-edge-computing-expert/SKILL.md +97 -0
  147. package/skills/web-3d-graphics-expert/SKILL.md +136 -130
  148. package/skills/web-game-engine-expert/SKILL.md +101 -95
  149. package/skills/web-scraper/SKILL.md +157 -207
  150. package/skills/website-design-cloner/SKILL.md +179 -173
  151. package/skills/webxr-ar-vr-expert/SKILL.md +122 -116
  152. package/skills/wordpress-headless-expert/SKILL.md +144 -0
  153. package/skills/zero-to-prod-orchestrator/SKILL.md +52 -27
  154. package/skills/zero-trust-secret-vault/SKILL.md +87 -39
  155. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  156. package/.github/workflows/publish.yml +0 -20
  157. package/CONTRIBUTING.md +0 -199
  158. package/SECURITY.md +0 -21
  159. package/banner.png +0 -0
  160. package/skills/autonomous-swarm-director/SKILL.md +0 -69
  161. package/skills/hyper-context-synthesizer/SKILL.md +0 -55
  162. package/skills/llm-cost-arbitrage-router/SKILL.md +0 -59
  163. package/skills/senior-fullstack/SKILL.md +0 -167
  164. package/skills/senior-fullstack/references/architecture_patterns.md +0 -160
  165. package/skills/senior-fullstack/references/development_workflows.md +0 -222
  166. package/skills/senior-fullstack/references/tech_stack_guide.md +0 -190
  167. package/skills/senior-fullstack/scripts/code_quality_analyzer.py +0 -114
  168. package/skills/senior-fullstack/scripts/fullstack_scaffolder.py +0 -114
  169. package/skills/senior-fullstack/scripts/project_scaffolder.py +0 -114
  170. package/skills/seo-aeo-landing-page-writer/SKILL.md +0 -97
  171. package/skills/seo-geo/SKILL.md +0 -188
  172. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-310.pyc +0 -0
  173. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc +0 -0
  174. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-310.pyc +0 -0
  175. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
  176. package/skills/ui_ux_expert/SKILL.md +0 -125
  177. package/vibes-swarm-demo.gif +0 -0
package/index.js ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Vibes Plug - Universal AI Plugin with 140+ Specialized Skills
3
+ * Platform support: Antigravity (AGY), Claude Code, and Cursor IDE
4
+ */
5
+
6
+ const path = require('path');
7
+ const pluginJson = require('./plugin.json');
8
+
9
+ module.exports = {
10
+ name: pluginJson.name,
11
+ version: pluginJson.version,
12
+ description: pluginJson.description,
13
+ author: pluginJson.author,
14
+ license: pluginJson.license,
15
+ platforms: pluginJson.platforms,
16
+ pluginRoot: path.resolve(__dirname),
17
+ skillsPath: path.resolve(__dirname, 'skills'),
18
+ scriptsPath: path.resolve(__dirname, 'scripts'),
19
+ };
package/package.json CHANGED
@@ -1,23 +1,59 @@
1
1
  {
2
2
  "name": "vibes-plug",
3
- "version": "2.5.0",
4
- "description": "Customization plugin for Antigravity containing 103+ specialized *skills* updated for the modern 2026 tech stack (React 19, Tailwind v4, Bun, Hono, Supabase Auth v3). Designed to support software development, UI/UX design, SEO optimization, and SaaS business strategies",
3
+ "version": "2.11.0",
4
+ "description": "Universal AI plugin with 140+ specialized skills for Antigravity, Claude, and Cursor. Updated for the modern 2026 tech stack (React 19, Tailwind v4, Bun, Hono, Supabase Auth v3). Designed to support software development, UI/UX design, SEO optimization, and SaaS business strategies",
5
5
  "main": "index.js",
6
+ "bin": {
7
+ "vibes-plug": "./scripts/install.js"
8
+ },
9
+ "files": [
10
+ "index.js",
11
+ "plugin.json",
12
+ "AGENTS.md",
13
+ "CLAUDE.md",
14
+ ".cursorrules",
15
+ "scripts",
16
+ "skills",
17
+ "!**/__pycache__/**",
18
+ "!**/*.pyc",
19
+ "!**/*.pyo",
20
+ ".claude",
21
+ ".cursor",
22
+ "README.md",
23
+ "BLUEPRINT.md",
24
+ "CHANGELOG.md",
25
+ "LICENSE"
26
+ ],
6
27
  "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1"
28
+ "test": "echo \"Error: no test specified\" && exit 1",
29
+ "generate:gif": "python scripts/generate_swarm_gif.py",
30
+ "install-all": "node scripts/install.js --all",
31
+ "install-claude": "node scripts/install.js --claude",
32
+ "install-cursor": "node scripts/install.js --cursor"
8
33
  },
9
34
  "repository": {
10
35
  "type": "git",
11
36
  "url": "git+https://github.com/roedyrustam/vibes-plug.git"
12
37
  },
13
38
  "keywords": [
14
- "gemini",
15
- "plugins",
16
- "gemini",
17
- "skills"
39
+ "antigravity",
40
+ "claude-code",
41
+ "cursor-rules",
42
+ "ai-agents",
43
+ "multi-agent-swarm",
44
+ "mcp",
45
+ "model-context-protocol",
46
+ "vibe-coding",
47
+ "react19",
48
+ "nextjs15",
49
+ "tailwindcss-v4",
50
+ "bun",
51
+ "skills",
52
+ "developer-tools",
53
+ "zero-to-prod"
18
54
  ],
19
55
  "author": "Roedy Rustam",
20
- "license": "ISC",
56
+ "license": "MIT",
21
57
  "bugs": {
22
58
  "url": "https://github.com/roedyrustam/vibes-plug/issues"
23
59
  },
package/plugin.json CHANGED
@@ -1,8 +1,25 @@
1
- {
2
- "name": "vibes-plug",
3
- "version": "2.5.0",
4
- "description": "Plugin kustomisasi untuk Antigravity.",
5
- "author": "roedy rustam",
6
- "license": "MIT",
7
- "repository": "https://github.com/roedyrustam/vibes-plug.git"
1
+ {
2
+ "name": "vibes-plug",
3
+ "version": "2.11.0",
4
+ "description": "Universal AI plugin with 140+ specialized skills for Antigravity, Claude, and Cursor.",
5
+ "author": "Roedy Rustam",
6
+ "license": "MIT",
7
+ "repository": "https://github.com/roedyrustam/vibes-plug.git",
8
+ "platforms": {
9
+ "antigravity": {
10
+ "entry": "AGENTS.md",
11
+ "config": "plugin.json",
12
+ "skillsDir": "skills/"
13
+ },
14
+ "claude": {
15
+ "entry": "CLAUDE.md",
16
+ "rulesDir": ".claude/rules/",
17
+ "skillsDir": "skills/"
18
+ },
19
+ "cursor": {
20
+ "entry": ".cursorrules",
21
+ "rulesDir": ".cursor/rules/",
22
+ "skillsDir": "skills/"
23
+ }
24
+ }
8
25
  }
@@ -0,0 +1,295 @@
1
+ import os
2
+ import math
3
+ from PIL import Image, ImageDraw, ImageFont
4
+
5
+ W, H = 960, 440
6
+ NUM_FRAMES = 50
7
+
8
+ # Load system fonts
9
+ font_title = ImageFont.truetype('C:\\Windows\\Fonts\\segoeuib.ttf', 16)
10
+ font_subtitle = ImageFont.truetype('C:\\Windows\\Fonts\\segoeui.ttf', 12)
11
+ font_badge = ImageFont.truetype('C:\\Windows\\Fonts\\segoeuib.ttf', 11)
12
+ font_director_title = ImageFont.truetype('C:\\Windows\\Fonts\\segoeuib.ttf', 13)
13
+ font_director_sub = ImageFont.truetype('C:\\Windows\\Fonts\\segoeui.ttf', 10)
14
+ font_card_num = ImageFont.truetype('C:\\Windows\\Fonts\\segoeuib.ttf', 10)
15
+ font_card_title = ImageFont.truetype('C:\\Windows\\Fonts\\segoeuib.ttf', 12)
16
+ font_card_body = ImageFont.truetype('C:\\Windows\\Fonts\\segoeui.ttf', 10)
17
+ font_card_status = ImageFont.truetype('C:\\Windows\\Fonts\\segoeuib.ttf', 9)
18
+ font_console = ImageFont.truetype('C:\\Windows\\Fonts\\consola.ttf', 11)
19
+
20
+ CARDS = [
21
+ {
22
+ "num": "01",
23
+ "title": "Ideation & PRD",
24
+ "skills": "brainstorming\nprd-architect",
25
+ "color": (6, 182, 212), # Cyan
26
+ "hex": "#06b6d4",
27
+ "msg": "[Phase 1/5] Swarm Director: Synthesizing PRD.md, ERD & Architecture Matrix...",
28
+ },
29
+ {
30
+ "num": "02",
31
+ "title": "UI/UX & Design",
32
+ "skills": "senior-frontend\ntailwind-v4 • hig",
33
+ "color": (168, 85, 247), # Purple
34
+ "hex": "#a855f7",
35
+ "msg": "[Phase 2/5] Frontend Swarm: Scaffolding Tailwind v4, M3 tokens & glassmorphic UI...",
36
+ },
37
+ {
38
+ "num": "03",
39
+ "title": "Backend & DB",
40
+ "skills": "js-backend • go\nmcp-architect",
41
+ "color": (59, 130, 246), # Blue
42
+ "hex": "#3b82f6",
43
+ "msg": "[Phase 3/5] Backend Swarm: Provisioning Hono/Bun APIs & Model Context Protocol...",
44
+ },
45
+ {
46
+ "num": "04",
47
+ "title": "Frontier AI & Voice",
48
+ "skills": "voice-ai • graph-rag\nvector-db • evals",
49
+ "color": (236, 72, 153), # Pink / Magenta
50
+ "hex": "#ec4899",
51
+ "msg": "[Phase 4/5] AI Swarm: Ultra-low latency Voice (<300ms) & Neo4j GraphRAG active...",
52
+ },
53
+ {
54
+ "num": "05",
55
+ "title": "Hardening & Prod",
56
+ "skills": "zero-to-prod\nproduction-hardener",
57
+ "color": (16, 185, 129), # Emerald Green
58
+ "hex": "#10b981",
59
+ "msg": "[Phase 5/5] QA Auditor: Running Zero-to-Prod gates — 140 Skills Certified (100%)",
60
+ },
61
+ ]
62
+
63
+ # Card layout
64
+ CARD_W = 168
65
+ CARD_H = 110
66
+ CARD_Y = 205
67
+ CARD_SPACING = 14
68
+ TOTAL_CARDS_W = len(CARDS) * CARD_W + (len(CARDS) - 1) * CARD_SPACING
69
+ START_X = (W - TOTAL_CARDS_W) // 2
70
+
71
+ for i, card in enumerate(CARDS):
72
+ card["x1"] = START_X + i * (CARD_W + CARD_SPACING)
73
+ card["x2"] = card["x1"] + CARD_W
74
+ card["y1"] = CARD_Y
75
+ card["y2"] = CARD_Y + CARD_H
76
+ card["cx"] = card["x1"] + CARD_W // 2
77
+
78
+ DIRECTOR_CX = W // 2
79
+ DIRECTOR_CY = 112
80
+ DIRECTOR_W = 190
81
+ DIRECTOR_H = 64
82
+
83
+ def draw_lightning(draw, x, y, color='#38bdf8'):
84
+ # Precise vector lightning bolt
85
+ pts = [
86
+ (x + 5, y),
87
+ (x, y + 9),
88
+ (x + 5, y + 9),
89
+ (x + 2, y + 17),
90
+ (x + 11, y + 6),
91
+ (x + 6, y + 6),
92
+ (x + 9, y)
93
+ ]
94
+ draw.polygon(pts, fill=color)
95
+
96
+ def draw_checkmark(draw, x, y, color='#10b981'):
97
+ draw.line([(x, y + 4), (x + 3, y + 8)], fill=color, width=2)
98
+ draw.line([(x + 3, y + 8), (x + 9, y)], fill=color, width=2)
99
+
100
+ def draw_play_arrow(draw, x, y, color):
101
+ pts = [(x, y), (x + 7, y + 4), (x, y + 8)]
102
+ draw.polygon(pts, fill=color)
103
+
104
+ frames = []
105
+
106
+ for frame_idx in range(NUM_FRAMES):
107
+ img = Image.new('RGB', (W, H), '#080c16')
108
+ draw = ImageDraw.Draw(img)
109
+
110
+ # 1. Subtle background grid
111
+ for gx in range(0, W, 32):
112
+ draw.line([(gx, 0), (gx, H)], fill='#0d1527', width=1)
113
+ for gy in range(0, H, 32):
114
+ draw.line([(0, gy), (W, gy)], fill='#0d1527', width=1)
115
+
116
+ # 2. Header
117
+ draw.line([(START_X, 48), (START_X + TOTAL_CARDS_W, 48)], fill='#1e293b', width=1)
118
+
119
+ # Title & icon
120
+ draw_lightning(draw, START_X + 2, 20, '#38bdf8')
121
+ draw.text((START_X + 20, 18), 'VIBES PLUG', fill='#38bdf8', font=font_title)
122
+ draw.text((START_X + 135, 21), '— Universal Agentic Swarm Workflow (2026 Edition)', fill='#94a3b8', font=font_subtitle)
123
+
124
+ # 140+ Skills Badge (Pill)
125
+ badge_text = '140+ SKILLS ACTIVE'
126
+ badge_w, badge_h = 138, 24
127
+ badge_x = START_X + TOTAL_CARDS_W - badge_w
128
+ badge_y = 17
129
+ draw.rounded_rectangle([badge_x, badge_y, badge_x + badge_w, badge_y + badge_h], radius=12, fill='#6d28d9', outline='#8b5cf6', width=1)
130
+ draw.text((badge_x + 14, badge_y + 4), badge_text, fill='#ffffff', font=font_badge)
131
+
132
+ # Determine active phase (0 to 4)
133
+ phase_idx = min(frame_idx // 10, 4)
134
+ phase_progress = (frame_idx % 10) / 9.0
135
+
136
+ # Overall progress percentage
137
+ pct = int(((frame_idx + 1) / NUM_FRAMES) * 100)
138
+
139
+ # 3. Connector Lines from Director to Cards
140
+ for i, card in enumerate(CARDS):
141
+ c_x = card["cx"]
142
+ c_y = card["y1"]
143
+ d_x = DIRECTOR_CX
144
+ d_y = DIRECTOR_CY + DIRECTOR_H // 2
145
+
146
+ if i < phase_idx:
147
+ line_color = '#1e3a5f'
148
+ width = 1
149
+ elif i == phase_idx:
150
+ line_color = card["hex"]
151
+ width = 2
152
+ else:
153
+ line_color = '#131d2e'
154
+ width = 1
155
+
156
+ draw.line([(d_x, d_y), (c_x, c_y)], fill=line_color, width=width)
157
+
158
+ # 4. Animated Data Particles on Active Line
159
+ active_card = CARDS[phase_idx]
160
+ src_x, src_y = DIRECTOR_CX, DIRECTOR_CY + DIRECTOR_H // 2
161
+ dst_x, dst_y = active_card["cx"], active_card["y1"]
162
+
163
+ for p_offset in [0.0, 0.48]:
164
+ t = (phase_progress + p_offset) % 1.0
165
+ px = src_x + (dst_x - src_x) * t
166
+ py = src_y + (dst_y - src_y) * t
167
+ col = active_card["color"]
168
+ draw.ellipse([px - 4, py - 4, px + 4, py + 4], fill=col)
169
+ draw.ellipse([px - 2, py - 2, px + 2, py + 2], fill='#ffffff')
170
+
171
+ # 5. Director Node (Center)
172
+ dir_x1 = DIRECTOR_CX - DIRECTOR_W // 2
173
+ dir_x2 = DIRECTOR_CX + DIRECTOR_W // 2
174
+ dir_y1 = DIRECTOR_CY - DIRECTOR_H // 2
175
+ dir_y2 = DIRECTOR_CY + DIRECTOR_H // 2
176
+
177
+ # Outer glow pulse
178
+ pulse_size = int(math.sin(frame_idx * 0.3) * 3)
179
+ draw.rounded_rectangle(
180
+ [dir_x1 - 4 - pulse_size, dir_y1 - 4 - pulse_size, dir_x2 + 4 + pulse_size, dir_y2 + 4 + pulse_size],
181
+ radius=16,
182
+ outline='#4c1d95',
183
+ width=1
184
+ )
185
+ # Main node box
186
+ draw.rounded_rectangle([dir_x1, dir_y1, dir_x2, dir_y2], radius=12, fill='#111827', outline='#8b5cf6', width=2)
187
+ # Icon and Title
188
+ draw.text((dir_x1 + 18, dir_y1 + 14), 'SWARM DIRECTOR', fill='#f8fafc', font=font_director_title)
189
+ draw.text((dir_x1 + 18, dir_y1 + 36), 'AGY • Claude Code • Cursor', fill='#c084fc', font=font_director_sub)
190
+ # Pulsing status dot with margin
191
+ dot_col = '#10b981' if (frame_idx % 6 < 4) else '#059669'
192
+ draw.ellipse([dir_x2 - 20, dir_y1 + 15, dir_x2 - 12, dir_y1 + 23], fill=dot_col)
193
+
194
+ # 6. Domain Cards
195
+ for i, card in enumerate(CARDS):
196
+ is_active = (i == phase_idx)
197
+ is_completed = (i < phase_idx)
198
+ x1, y1, x2, y2 = card["x1"], card["y1"], card["x2"], card["y2"]
199
+
200
+ if is_active:
201
+ bg_col = '#0e172a'
202
+ border_col = card["hex"]
203
+ border_w = 2
204
+ draw.rounded_rectangle([x1 - 2, y1 - 2, x2 + 2, y2 + 2], radius=10, outline=border_col, width=1)
205
+ elif is_completed:
206
+ bg_col = '#0a101f'
207
+ border_col = '#1e293b'
208
+ border_w = 1
209
+ else:
210
+ bg_col = '#090d16'
211
+ border_col = '#151f32'
212
+ border_w = 1
213
+
214
+ draw.rounded_rectangle([x1, y1, x2, y2], radius=8, fill=bg_col, outline=border_col, width=border_w)
215
+
216
+ # Phase number pill
217
+ pill_w, pill_h = 24, 16
218
+ pill_x = x1 + 10
219
+ pill_y = y1 + 10
220
+ if is_active:
221
+ pill_fill = card["hex"]
222
+ pill_txt_col = '#ffffff'
223
+ elif is_completed:
224
+ pill_fill = '#10b981'
225
+ pill_txt_col = '#ffffff'
226
+ else:
227
+ pill_fill = '#1e293b'
228
+ pill_txt_col = '#64748b'
229
+
230
+ draw.rounded_rectangle([pill_x, pill_y, pill_x + pill_w, pill_y + pill_h], radius=4, fill=pill_fill)
231
+ draw.text((pill_x + 5, pill_y + 1), card["num"], fill=pill_txt_col, font=font_card_num)
232
+
233
+ # Card Title
234
+ title_col = '#f8fafc' if is_active else ('#cbd5e1' if is_completed else '#64748b')
235
+ draw.text((pill_x + pill_w + 6, pill_y + 1), card["title"], fill=title_col, font=font_card_title)
236
+
237
+ # Skills list
238
+ skills_col = '#94a3b8' if (is_active or is_completed) else '#475569'
239
+ draw.text((x1 + 10, y1 + 38), card["skills"], fill=skills_col, font=font_card_body, spacing=3)
240
+
241
+ # Status indicator at bottom of card
242
+ if is_completed:
243
+ draw_checkmark(draw, x1 + 10, y2 - 17, '#10b981')
244
+ draw.text((x1 + 24, y2 - 18), 'COMPLETED', fill='#10b981', font=font_card_status)
245
+ elif is_active:
246
+ draw_play_arrow(draw, x1 + 10, y2 - 16, card["hex"])
247
+ draw.text((x1 + 22, y2 - 18), 'EXECUTING...', fill=card["hex"], font=font_card_status)
248
+ draw.ellipse([x2 - 18, y2 - 16, x2 - 10, y2 - 8], fill=card["hex"])
249
+ else:
250
+ draw.ellipse([x1 + 11, y2 - 15, x1 + 16, y2 - 10], outline='#475569', width=1)
251
+ draw.text((x1 + 22, y2 - 18), 'QUEUED', fill='#475569', font=font_card_status)
252
+
253
+ # 7. Bottom Console & Execution Monitor
254
+ bar_x1 = START_X
255
+ bar_x2 = START_X + TOTAL_CARDS_W
256
+ bar_y1 = 338
257
+ bar_y2 = 418
258
+ draw.rounded_rectangle([bar_x1, bar_y1, bar_x2, bar_y2], radius=8, fill='#0a101f', outline='#1e293b', width=1)
259
+
260
+ # Console text with blinking cursor
261
+ cursor = 'ā–ˆ' if (frame_idx % 4 < 2) else ' '
262
+ draw.text((bar_x1 + 16, bar_y1 + 14), active_card["msg"] + cursor, fill='#e2e8f0', font=font_console)
263
+
264
+ # Progress bar track
265
+ pb_x1 = bar_x1 + 16
266
+ pb_x2 = bar_x2 - 16
267
+ pb_y1 = bar_y1 + 42
268
+ pb_y2 = pb_y1 + 16
269
+ draw.rounded_rectangle([pb_x1, pb_y1, pb_x2, pb_y2], radius=4, fill='#0f172a', outline='#1e293b', width=1)
270
+
271
+ # Progress bar fill
272
+ fill_w = max(int((pb_x2 - pb_x1) * (pct / 100.0)), 14)
273
+ fill_col = active_card["hex"]
274
+ draw.rounded_rectangle([pb_x1 + 1, pb_y1 + 1, pb_x1 + fill_w - 1, pb_y2 - 1], radius=3, fill=fill_col)
275
+
276
+ # Progress percentage label
277
+ pct_text = f'{pct}% Complete'
278
+ draw.text((pb_x2 - 82, pb_y1 + 2), pct_text, fill='#ffffff' if pct > 85 else '#94a3b8', font=font_card_num)
279
+
280
+ frames.append(img)
281
+
282
+ # Save as animated GIF
283
+ PLUGIN_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
284
+ output_path = os.path.join(PLUGIN_ROOT, 'vibes-swarm-demo.gif')
285
+ frames[0].save(
286
+ output_path,
287
+ save_all=True,
288
+ append_images=frames[1:],
289
+ duration=80,
290
+ loop=0,
291
+ optimize=True
292
+ )
293
+
294
+ file_size = os.path.getsize(output_path)
295
+ print(f'Generated {output_path}: {file_size / 1024:.1f} KB, {NUM_FRAMES} frames')
@@ -0,0 +1,201 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const os = require('os');
6
+
7
+ const PLUGIN_ROOT = path.resolve(__dirname, '..');
8
+ const HOME = os.homedir();
9
+
10
+ // Platform detection and target directories
11
+ const platforms = {
12
+ antigravity: {
13
+ name: 'Antigravity (AGY)',
14
+ globalDir: path.join(HOME, '.gemini', 'config', 'plugins', 'vibes-plug'),
15
+ detect: () => fs.existsSync(path.join(HOME, '.gemini')),
16
+ },
17
+ claude: {
18
+ name: 'Claude Code',
19
+ globalDir: path.join(HOME, '.claude'),
20
+ detect: () => {
21
+ // Claude Code is installed if ~/.claude exists or `claude` command is available
22
+ return fs.existsSync(path.join(HOME, '.claude'));
23
+ },
24
+ },
25
+ cursor: {
26
+ name: 'Cursor IDE',
27
+ projectOnly: true,
28
+ detect: () => {
29
+ // Cursor uses per-project .cursor/rules/ — always available
30
+ return true;
31
+ },
32
+ },
33
+ };
34
+
35
+ function copyRecursiveSync(src, dest) {
36
+ const stat = fs.statSync(src);
37
+ if (stat.isDirectory()) {
38
+ if (!fs.existsSync(dest)) fs.mkdirSync(dest, { recursive: true });
39
+ fs.readdirSync(src).forEach(child => {
40
+ copyRecursiveSync(path.join(src, child), path.join(dest, child));
41
+ });
42
+ } else {
43
+ fs.copyFileSync(src, dest);
44
+ }
45
+ }
46
+
47
+ function installForAntigravity() {
48
+ const target = platforms.antigravity.globalDir;
49
+ if (path.resolve(PLUGIN_ROOT) === path.resolve(target)) {
50
+ console.log(' āœ… Already installed at correct location.');
51
+ return;
52
+ }
53
+ console.log(` šŸ“ Copying to ${target}`);
54
+ copyRecursiveSync(PLUGIN_ROOT, target);
55
+ console.log(' āœ… Done.');
56
+ }
57
+
58
+ function installForClaude(projectDir) {
59
+ // Global: Copy CLAUDE.md to ~/.claude/CLAUDE.md (append or create)
60
+ const globalClaudeDir = platforms.claude.globalDir;
61
+ if (!fs.existsSync(globalClaudeDir)) {
62
+ fs.mkdirSync(globalClaudeDir, { recursive: true });
63
+ }
64
+
65
+ // Copy CLAUDE.md
66
+ const claudeMdSrc = path.join(PLUGIN_ROOT, 'CLAUDE.md');
67
+ const claudeMdDest = path.join(globalClaudeDir, 'CLAUDE.md');
68
+ if (fs.existsSync(claudeMdSrc)) {
69
+ fs.copyFileSync(claudeMdSrc, claudeMdDest);
70
+ console.log(` āœ… Copied CLAUDE.md → ${claudeMdDest}`);
71
+ }
72
+
73
+ // Copy .claude/rules/
74
+ const rulesDir = path.join(PLUGIN_ROOT, '.claude', 'rules');
75
+ const targetRulesDir = path.join(globalClaudeDir, 'rules');
76
+ if (fs.existsSync(rulesDir)) {
77
+ copyRecursiveSync(rulesDir, targetRulesDir);
78
+ console.log(` āœ… Copied rules → ${targetRulesDir}`);
79
+ }
80
+
81
+ // Copy skills directory
82
+ const skillsSrc = path.join(PLUGIN_ROOT, 'skills');
83
+ const skillsDest = path.join(globalClaudeDir, 'skills');
84
+ if (fs.existsSync(skillsSrc)) {
85
+ copyRecursiveSync(skillsSrc, skillsDest);
86
+ console.log(` āœ… Copied skills → ${skillsDest}`);
87
+ }
88
+
89
+ // Per-project install
90
+ if (projectDir) {
91
+ const projClaude = path.join(projectDir, '.claude');
92
+ if (!fs.existsSync(projClaude)) fs.mkdirSync(projClaude, { recursive: true });
93
+ fs.copyFileSync(claudeMdSrc, path.join(projectDir, 'CLAUDE.md'));
94
+ copyRecursiveSync(rulesDir, path.join(projClaude, 'rules'));
95
+ console.log(` āœ… Per-project install → ${projectDir}`);
96
+ }
97
+ }
98
+
99
+ function installForCursor(projectDir) {
100
+ if (!projectDir) {
101
+ console.log(' āš ļø Cursor requires a project directory. Usage: node install.js --cursor --project /path/to/project');
102
+ return;
103
+ }
104
+
105
+ // Copy .cursorrules to project root
106
+ const cursorRulesSrc = path.join(PLUGIN_ROOT, '.cursorrules');
107
+ const cursorRulesDest = path.join(projectDir, '.cursorrules');
108
+ if (fs.existsSync(cursorRulesSrc)) {
109
+ fs.copyFileSync(cursorRulesSrc, cursorRulesDest);
110
+ console.log(` āœ… Copied .cursorrules → ${cursorRulesDest}`);
111
+ }
112
+
113
+ // Copy .cursor/rules/ to project
114
+ const mdcSrc = path.join(PLUGIN_ROOT, '.cursor', 'rules');
115
+ const mdcDest = path.join(projectDir, '.cursor', 'rules');
116
+ if (fs.existsSync(mdcSrc)) {
117
+ copyRecursiveSync(mdcSrc, mdcDest);
118
+ console.log(` āœ… Copied .cursor/rules/ → ${mdcDest}`);
119
+ }
120
+
121
+ // Copy skills/ for reference
122
+ const skillsSrc = path.join(PLUGIN_ROOT, 'skills');
123
+ const skillsDest = path.join(projectDir, '.cursor', 'skills');
124
+ if (fs.existsSync(skillsSrc)) {
125
+ copyRecursiveSync(skillsSrc, skillsDest);
126
+ console.log(` āœ… Copied skills → ${skillsDest}`);
127
+ }
128
+ }
129
+
130
+ // --- CLI ---
131
+ function main() {
132
+ const args = process.argv.slice(2);
133
+ const helpFlag = args.includes('--help') || args.includes('-h');
134
+ const allFlag = args.includes('--all');
135
+ const agyFlag = args.includes('--antigravity') || args.includes('--agy');
136
+ const claudeFlag = args.includes('--claude');
137
+ const cursorFlag = args.includes('--cursor');
138
+ const projectIdx = args.indexOf('--project');
139
+ const projectDir = projectIdx !== -1 ? args[projectIdx + 1] : null;
140
+
141
+ const pkg = require('../package.json');
142
+ const version = pkg.version || '2.11.0';
143
+
144
+ if (helpFlag || args.length === 0) {
145
+ console.log(`
146
+ ╔══════════════════════════════════════════════════════════╗
147
+ ā•‘ vibes-plug installer v${version.padEnd(6)} (2026 Edition) ā•‘
148
+ ā•‘ Universal AI Plugin for AGY, Claude, and Cursor ā•‘
149
+ ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•
150
+
151
+ Usage: npx vibes-plug [options] or node install.js [options]
152
+
153
+ Options:
154
+ --all Install for all detected platforms
155
+ --antigravity, --agy Install for Antigravity
156
+ --claude Install for Claude Code (global + optional per-project)
157
+ --cursor Install for Cursor IDE (requires --project)
158
+ --project <path> Target project directory (for Claude/Cursor per-project install)
159
+ --help, -h Show this help message
160
+
161
+ Examples:
162
+ npx vibes-plug --all
163
+ npx vibes-plug --claude
164
+ npx vibes-plug --cursor --project ./my-app
165
+ node scripts/install.js --all
166
+ `);
167
+ return;
168
+ }
169
+
170
+ console.log(`\nšŸš€ vibes-plug installer v${version}\n`);
171
+
172
+ // Detect platforms
173
+ console.log('šŸ“” Detecting platforms...');
174
+ Object.entries(platforms).forEach(([key, p]) => {
175
+ const detected = p.detect();
176
+ console.log(` ${detected ? 'āœ…' : 'āŒ'} ${p.name}: ${detected ? 'detected' : 'not found'}`);
177
+ });
178
+ console.log('');
179
+
180
+ if (allFlag || agyFlag) {
181
+ console.log('šŸ”§ Installing for Antigravity...');
182
+ installForAntigravity();
183
+ console.log('');
184
+ }
185
+
186
+ if (allFlag || claudeFlag) {
187
+ console.log('šŸ”§ Installing for Claude Code...');
188
+ installForClaude(projectDir);
189
+ console.log('');
190
+ }
191
+
192
+ if (allFlag || cursorFlag) {
193
+ console.log('šŸ”§ Installing for Cursor IDE...');
194
+ installForCursor(projectDir);
195
+ console.log('');
196
+ }
197
+
198
+ console.log('✨ Installation complete!\n');
199
+ }
200
+
201
+ main();