vibes-plug 1.0.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 (183) 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 +96 -0
  5. package/BLUEPRINT.md +309 -125
  6. package/CHANGELOG.md +183 -1
  7. package/CLAUDE.md +70 -0
  8. package/LICENSE +1 -1
  9. package/README.md +641 -263
  10. package/index.js +19 -0
  11. package/package.json +61 -25
  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 -0
  17. package/skills/ai-evals-benchmark-expert/SKILL.md +188 -0
  18. package/skills/ai-llm-integration-expert/SKILL.md +147 -122
  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 +316 -309
  23. package/skills/api-gateway-proxy-expert/SKILL.md +81 -0
  24. package/skills/app-analyzer-optimizer/SKILL.md +195 -188
  25. package/skills/apple-ecosystem-expert/SKILL.md +145 -0
  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 +240 -0
  29. package/skills/authentication-identity-expert/SKILL.md +279 -45
  30. package/skills/auto-doc-updater/SKILL.md +219 -203
  31. package/skills/autonomous-chaos-monkey/SKILL.md +63 -0
  32. package/skills/autonomous-red-teamer/SKILL.md +203 -0
  33. package/skills/autonomous-tdd-debugger/SKILL.md +71 -0
  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 +93 -86
  38. package/skills/brainstorming/SKILL.md +381 -353
  39. package/skills/browser-automation-expert/SKILL.md +222 -0
  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 +81 -45
  43. package/skills/cloud-hosting-expert/SKILL.md +249 -243
  44. package/skills/coderabbit/SKILL.md +197 -191
  45. package/skills/compliance-gdpr-privacy-expert/SKILL.md +85 -0
  46. package/skills/cron-scheduler-expert/SKILL.md +304 -0
  47. package/skills/data-pipeline-etl-expert/SKILL.md +84 -0
  48. package/skills/data-telemetry-expert/SKILL.md +218 -212
  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 +303 -293
  52. package/skills/dependency-upgrade-migrator/SKILL.md +301 -0
  53. package/skills/design-system-architect/SKILL.md +278 -242
  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 +257 -0
  57. package/skills/doku-payment-gateway/SKILL.md +233 -0
  58. package/skills/domain-driven-design-expert/SKILL.md +82 -0
  59. package/skills/e2e-testing-expert/SKILL.md +320 -314
  60. package/skills/ecommerce-expert/SKILL.md +87 -0
  61. package/skills/edge-serverless-db-expert/SKILL.md +99 -0
  62. package/skills/email-notification-expert/SKILL.md +368 -0
  63. package/skills/error-resilience-expert/SKILL.md +486 -0
  64. package/skills/event-driven-architect/SKILL.md +86 -80
  65. package/skills/feature-flag-analytics-expert/SKILL.md +66 -0
  66. package/skills/file-upload-media-expert/SKILL.md +437 -0
  67. package/skills/firebase-security-expert/SKILL.md +7 -1
  68. package/skills/form-validation-expert/SKILL.md +407 -0
  69. package/skills/fullstack-expert/SKILL.md +260 -201
  70. package/skills/fullstack-expert/references/api_design_guide.md +466 -466
  71. package/skills/fullstack-expert/references/multi_language_backend.md +528 -528
  72. package/skills/fullstack-expert/scripts/api_contract_validator.py +253 -253
  73. package/skills/fullstack-expert/scripts/architecture_analyzer.py +326 -326
  74. package/skills/gemini-agent-booster/SKILL.md +142 -104
  75. package/skills/geospatial-maps-expert/SKILL.md +80 -0
  76. package/skills/global-a11y-i18n-expert/SKILL.md +86 -80
  77. package/skills/glsl-shader-expert/SKILL.md +107 -0
  78. package/skills/go-programming-expert/SKILL.md +300 -294
  79. package/skills/graph-rag-knowledge-expert/SKILL.md +159 -0
  80. package/skills/graphql-apollo-expert/SKILL.md +114 -0
  81. package/skills/headless-cms-expert/SKILL.md +181 -0
  82. package/skills/hig/SKILL.md +193 -187
  83. package/skills/js-backend-expert/SKILL.md +218 -191
  84. package/skills/legacy-code-translator/SKILL.md +71 -0
  85. package/skills/local-slm-edge-ai-expert/SKILL.md +167 -0
  86. package/skills/logging-error-tracking-expert/SKILL.md +344 -0
  87. package/skills/mcp-client-orchestrator/SKILL.md +76 -0
  88. package/skills/mcp-server-architect/SKILL.md +226 -126
  89. package/skills/micro-frontend-architect/SKILL.md +112 -0
  90. package/skills/mobile-expo-expert/SKILL.md +191 -185
  91. package/skills/mobile-push-notification-expert/SKILL.md +71 -0
  92. package/skills/modern-css-native-expert/SKILL.md +189 -0
  93. package/skills/monday-design-aesthetic/SKILL.md +72 -66
  94. package/skills/monorepo-architect/SKILL.md +232 -226
  95. package/skills/mpa-orchestrator/SKILL.md +120 -101
  96. package/skills/multi-agent-orchestration/SKILL.md +173 -153
  97. package/skills/multiple-entry-points/SKILL.md +91 -55
  98. package/skills/mvc-expert/SKILL.md +237 -231
  99. package/skills/n8n-automation-expert/SKILL.md +89 -0
  100. package/skills/nextjs-app-router-expert/SKILL.md +148 -0
  101. package/skills/openapi-swagger-codegen-expert/SKILL.md +67 -0
  102. package/skills/payment-gateway-expert/SKILL.md +129 -45
  103. package/skills/pdf-document-generation-expert/SKILL.md +91 -0
  104. package/skills/performance-web-vitals/SKILL.md +337 -331
  105. package/skills/post-quantum-crypto-migrator/SKILL.md +57 -0
  106. package/skills/prd-architect/SKILL.md +206 -190
  107. package/skills/proactive-background-watcher/SKILL.md +68 -0
  108. package/skills/production-ready-hardener/PRODUCTION_READINESS_REPORT.md +67 -0
  109. package/skills/production-ready-hardener/SKILL.md +461 -468
  110. package/skills/production-ready-hardener/references/production_checklist.md +161 -161
  111. package/skills/production-ready-hardener/scripts/production_readiness_scanner.py +881 -875
  112. package/skills/project-context-mapper/SKILL.md +85 -0
  113. package/skills/pwa-offline-first-expert/SKILL.md +185 -0
  114. package/skills/python-programming-expert/SKILL.md +407 -270
  115. package/skills/rate-limit-abuse-prevention/SKILL.md +377 -0
  116. package/skills/realtime-collaboration-expert/SKILL.md +99 -45
  117. package/skills/rich-text-editor-expert/SKILL.md +177 -0
  118. package/skills/rust-programming-expert/SKILL.md +240 -234
  119. package/skills/saas-billing/SKILL.md +382 -376
  120. package/skills/saas-multi-tenant/SKILL.md +256 -236
  121. package/skills/saas-mvp-launcher/SKILL.md +30 -1
  122. package/skills/saas-transformer/SKILL.md +499 -445
  123. package/skills/saas-transformer/references/billing_integration_guide.md +401 -401
  124. package/skills/saas-transformer/references/feature_gating_patterns.md +137 -137
  125. package/skills/saas-transformer/references/saas_transformation_checklist.md +121 -121
  126. package/skills/saas-transformer/scripts/saas_transformation_scanner.py +39 -29
  127. package/skills/scalability-clean-code/SKILL.md +234 -228
  128. package/skills/search-engine-expert/SKILL.md +89 -0
  129. package/skills/secure-fuzz-testing/SKILL.md +7 -1
  130. package/skills/self-evolving-memory-graph/SKILL.md +91 -0
  131. package/skills/self-healing-cloud-orchestrator/SKILL.md +57 -0
  132. package/skills/senior-frontend/SKILL.md +85 -105
  133. package/skills/seo/SKILL.md +258 -224
  134. package/skills/session-context-loader/SKILL.md +83 -0
  135. package/skills/session-handoff-resume/SKILL.md +163 -157
  136. package/skills/{skill_baru → skill-baru}/SKILL.md +177 -146
  137. package/skills/solidjs-expert/SKILL.md +80 -0
  138. package/skills/spa-orchestrator/SKILL.md +306 -287
  139. package/skills/sse-websocket-streaming-expert/SKILL.md +93 -0
  140. package/skills/state-management-expert/SKILL.md +277 -271
  141. package/skills/supabase-migration/SKILL.md +47 -1
  142. package/skills/supabase-security-expert/SKILL.md +248 -242
  143. package/skills/svelte-sveltekit-expert/SKILL.md +91 -0
  144. package/skills/svg-animation-motion-expert/SKILL.md +115 -0
  145. package/skills/tailwind-expert/SKILL.md +139 -187
  146. package/skills/tanstack-query-expert/SKILL.md +204 -198
  147. package/skills/tauri-expert/SKILL.md +7 -1
  148. package/skills/token-saver/SKILL.md +118 -110
  149. package/skills/typescript-expert/SKILL.md +329 -278
  150. package/skills/ui-components-expert/SKILL.md +166 -63
  151. package/skills/ui-ux-pro-max/SKILL.md +221 -200
  152. package/skills/vector-db-rag-expert/SKILL.md +208 -0
  153. package/skills/vibe-code-gardener/SKILL.md +180 -172
  154. package/skills/visual-qa-vision-agent/SKILL.md +71 -0
  155. package/skills/voice-ai-realtime-agent/SKILL.md +202 -0
  156. package/skills/vue-frontend-expert/SKILL.md +132 -0
  157. package/skills/wasm-edge-computing-expert/SKILL.md +97 -0
  158. package/skills/web-3d-graphics-expert/SKILL.md +137 -0
  159. package/skills/web-game-engine-expert/SKILL.md +102 -0
  160. package/skills/web-scraper/SKILL.md +98 -146
  161. package/skills/website-design-cloner/SKILL.md +180 -0
  162. package/skills/webxr-ar-vr-expert/SKILL.md +123 -0
  163. package/skills/wordpress-headless-expert/SKILL.md +144 -0
  164. package/skills/zero-to-prod-orchestrator/SKILL.md +231 -180
  165. package/skills/zero-trust-secret-vault/SKILL.md +88 -0
  166. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  167. package/CONTRIBUTING.md +0 -199
  168. package/SECURITY.md +0 -21
  169. package/banner.png +0 -0
  170. package/skills/senior-fullstack/SKILL.md +0 -167
  171. package/skills/senior-fullstack/references/architecture_patterns.md +0 -160
  172. package/skills/senior-fullstack/references/development_workflows.md +0 -222
  173. package/skills/senior-fullstack/references/tech_stack_guide.md +0 -190
  174. package/skills/senior-fullstack/scripts/code_quality_analyzer.py +0 -114
  175. package/skills/senior-fullstack/scripts/fullstack_scaffolder.py +0 -114
  176. package/skills/senior-fullstack/scripts/project_scaffolder.py +0 -114
  177. package/skills/seo-aeo-landing-page-writer/SKILL.md +0 -97
  178. package/skills/seo-geo/SKILL.md +0 -188
  179. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-310.pyc +0 -0
  180. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc +0 -0
  181. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-310.pyc +0 -0
  182. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
  183. package/skills/ui_ux_expert/SKILL.md +0 -114
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,25 +1,61 @@
1
- {
2
- "name": "vibes-plug",
3
- "version": "1.0.0",
4
- "description": "Customization plugin for Antigravity containing 65+ 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",
5
- "main": "index.js",
6
- "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1"
8
- },
9
- "repository": {
10
- "type": "git",
11
- "url": "git+https://github.com/roedyrustam/vibes-plug.git"
12
- },
13
- "keywords": [
14
- "gemini",
15
- "plugins",
16
- "gemini",
17
- "skills"
18
- ],
19
- "author": "Roedy Rustam",
20
- "license": "ISC",
21
- "bugs": {
22
- "url": "https://github.com/roedyrustam/vibes-plug/issues"
23
- },
24
- "homepage": "https://github.com/roedyrustam/vibes-plug#readme"
25
- }
1
+ {
2
+ "name": "vibes-plug",
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
+ "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
+ ],
27
+ "scripts": {
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"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/roedyrustam/vibes-plug.git"
37
+ },
38
+ "keywords": [
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"
54
+ ],
55
+ "author": "Roedy Rustam",
56
+ "license": "MIT",
57
+ "bugs": {
58
+ "url": "https://github.com/roedyrustam/vibes-plug/issues"
59
+ },
60
+ "homepage": "https://github.com/roedyrustam/vibes-plug#readme"
61
+ }
package/plugin.json CHANGED
@@ -1,8 +1,25 @@
1
- {
2
- "name": "vibes-plug",
3
- "version": "1.6.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();