vibes-plug 2.5.0 → 2.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/.claude/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 +319 -217
  6. package/CHANGELOG.md +170 -1
  7. package/CLAUDE.md +70 -0
  8. package/LICENSE +1 -1
  9. package/README.md +611 -415
  10. package/index.js +19 -0
  11. package/package.json +44 -8
  12. package/plugin.json +24 -7
  13. package/scripts/check-anti-slop.js +53 -0
  14. package/scripts/generate_swarm_gif.py +295 -0
  15. package/scripts/install.js +201 -0
  16. package/skills/accessibility-testing-expert/SKILL.md +116 -0
  17. package/skills/ai-llm-integration-expert/SKILL.md +192 -178
  18. package/skills/ai-media-generation-expert/SKILL.md +172 -0
  19. package/skills/ai-prompt-engineering-expert/SKILL.md +134 -0
  20. package/skills/angular-expert/SKILL.md +148 -0
  21. package/skills/anti-slop/SKILL.md +133 -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/astro-framework-expert/SKILL.md +200 -0
  27. package/skills/async-queue-temporal-expert/SKILL.md +189 -26
  28. package/skills/authentication-identity-expert/SKILL.md +78 -181
  29. package/skills/autonomous-red-teamer/SKILL.md +172 -28
  30. package/skills/autonomous-tdd-debugger/SKILL.md +70 -64
  31. package/skills/biome-linter-formatter-expert/SKILL.md +89 -0
  32. package/skills/blockchain-web3-expert/SKILL.md +115 -0
  33. package/skills/bootstrap-to-modern/SKILL.md +9 -6
  34. package/skills/brainstorming/SKILL.md +60 -52
  35. package/skills/browser-automation-expert/SKILL.md +197 -21
  36. package/skills/bun-runtime-expert/SKILL.md +7 -1
  37. package/skills/chatbot-messaging-expert/SKILL.md +114 -0
  38. package/skills/ci-cd-devops-architect/SKILL.md +45 -36
  39. package/skills/cloud-hosting-expert/SKILL.md +7 -1
  40. package/skills/coderabbit/SKILL.md +7 -1
  41. package/skills/compliance-gdpr-privacy-expert/SKILL.md +85 -0
  42. package/skills/cron-scheduler-expert/SKILL.md +303 -297
  43. package/skills/data-pipeline-etl-expert/SKILL.md +84 -0
  44. package/skills/data-telemetry-expert/SKILL.md +7 -1
  45. package/skills/data-visualization-expert/SKILL.md +154 -0
  46. package/skills/database-orm-expert/SKILL.md +165 -294
  47. package/skills/deep-research-analyst/SKILL.md +136 -0
  48. package/skills/dependency-upgrade-migrator/SKILL.md +300 -294
  49. package/skills/design-system-architect/SKILL.md +309 -260
  50. package/skills/desktop-electron-expert/SKILL.md +128 -0
  51. package/skills/documentation-site-expert/SKILL.md +59 -0
  52. package/skills/doku-mcp-server/SKILL.md +7 -1
  53. package/skills/doku-payment-gateway/SKILL.md +7 -1
  54. package/skills/domain-driven-design-expert/SKILL.md +82 -0
  55. package/skills/e2e-testing-expert/SKILL.md +7 -1
  56. package/skills/ecommerce-expert/SKILL.md +87 -0
  57. package/skills/email-notification-expert/SKILL.md +393 -360
  58. package/skills/error-resilience-expert/SKILL.md +506 -479
  59. package/skills/event-driven-architect/SKILL.md +7 -1
  60. package/skills/feature-flag-analytics-expert/SKILL.md +65 -45
  61. package/skills/file-upload-media-expert/SKILL.md +436 -430
  62. package/skills/firebase-security-expert/SKILL.md +7 -1
  63. package/skills/form-validation-expert/SKILL.md +406 -400
  64. package/skills/fullstack-expert/SKILL.md +184 -202
  65. package/skills/gemini-agent-booster/SKILL.md +173 -135
  66. package/skills/geospatial-maps-expert/SKILL.md +80 -0
  67. package/skills/global-a11y-i18n-expert/SKILL.md +7 -1
  68. package/skills/glsl-shader-expert/SKILL.md +158 -69
  69. package/skills/go-programming-expert/SKILL.md +21 -15
  70. package/skills/graph-rag-knowledge-expert/SKILL.md +200 -0
  71. package/skills/graphql-apollo-expert/SKILL.md +113 -107
  72. package/skills/headless-cms-expert/SKILL.md +181 -0
  73. package/skills/hig/SKILL.md +7 -1
  74. package/skills/js-backend-expert/SKILL.md +218 -216
  75. package/skills/legacy-code-translator/SKILL.md +70 -64
  76. package/skills/local-slm-edge-ai-expert/SKILL.md +167 -0
  77. package/skills/logging-error-tracking-expert/SKILL.md +343 -337
  78. package/skills/mcp-server-architect/SKILL.md +308 -194
  79. package/skills/micro-frontend-architect/SKILL.md +111 -105
  80. package/skills/mobile-expo-expert/SKILL.md +8 -2
  81. package/skills/modern-css-native-expert/SKILL.md +189 -0
  82. package/skills/monorepo-architect/SKILL.md +7 -1
  83. package/skills/mpa-orchestrator/SKILL.md +20 -1
  84. package/skills/multi-agent-orchestration/SKILL.md +254 -234
  85. package/skills/multiple-entry-points/SKILL.md +37 -1
  86. package/skills/mvc-expert/SKILL.md +7 -1
  87. package/skills/n8n-automation-expert/SKILL.md +89 -0
  88. package/skills/nextjs-app-router-expert/SKILL.md +148 -0
  89. package/skills/openapi-swagger-codegen-expert/SKILL.md +67 -0
  90. package/skills/payment-gateway-expert/SKILL.md +85 -1
  91. package/skills/pdf-document-generation-expert/SKILL.md +91 -0
  92. package/skills/performance-web-vitals/SKILL.md +7 -1
  93. package/skills/post-quantum-crypto-migrator/SKILL.md +57 -57
  94. package/skills/prd-architect/SKILL.md +182 -201
  95. package/skills/proactive-background-watcher/SKILL.md +67 -61
  96. package/skills/production-ready-hardener/SKILL.md +459 -456
  97. package/skills/pwa-offline-first-expert/SKILL.md +226 -0
  98. package/skills/pydantic-ai-expert/SKILL.md +161 -0
  99. package/skills/python-programming-expert/SKILL.md +407 -401
  100. package/skills/rate-limit-abuse-prevention/SKILL.md +376 -370
  101. package/skills/realtime-collaboration-expert/SKILL.md +55 -1
  102. package/skills/rich-text-editor-expert/SKILL.md +177 -0
  103. package/skills/rust-programming-expert/SKILL.md +7 -1
  104. package/skills/saas-architect/SKILL.md +154 -0
  105. package/skills/saas-billing/SKILL.md +7 -1
  106. package/skills/saas-multi-tenant/SKILL.md +7 -1
  107. package/skills/scalability-clean-code/SKILL.md +7 -1
  108. package/skills/search-engine-expert/SKILL.md +89 -0
  109. package/skills/secure-fuzz-testing/SKILL.md +7 -1
  110. package/skills/self-healing-cloud-orchestrator/SKILL.md +57 -57
  111. package/skills/senior-frontend/SKILL.md +139 -161
  112. package/skills/senior-frontend/scripts/frontend_scaffolder.py +1 -1
  113. package/skills/seo/SKILL.md +41 -17
  114. package/skills/session-memory-manager/SKILL.md +128 -0
  115. package/skills/solidjs-expert/SKILL.md +80 -0
  116. package/skills/spa-orchestrator/SKILL.md +20 -1
  117. package/skills/sse-websocket-streaming-expert/SKILL.md +93 -0
  118. package/skills/state-management-expert/SKILL.md +7 -1
  119. package/skills/supabase-security-expert/SKILL.md +7 -1
  120. package/skills/svelte-sveltekit-expert/SKILL.md +91 -0
  121. package/skills/svg-animation-motion-expert/SKILL.md +115 -0
  122. package/skills/synthetic-data-finetuning-expert/SKILL.md +155 -0
  123. package/skills/tailwind-expert/SKILL.md +88 -136
  124. package/skills/tanstack-query-expert/SKILL.md +7 -1
  125. package/skills/tauri-expert/SKILL.md +7 -1
  126. package/skills/typescript-expert/SKILL.md +12 -6
  127. package/skills/ui-ux-pro-max/SKILL.md +25 -3
  128. package/skills/vector-db-rag-expert/SKILL.md +175 -19
  129. package/skills/vercel-ai-sdk-expert/SKILL.md +181 -0
  130. package/skills/visual-qa-vision-agent/SKILL.md +70 -64
  131. package/skills/voice-ai-realtime-agent/SKILL.md +242 -0
  132. package/skills/vue-frontend-expert/SKILL.md +131 -125
  133. package/skills/wasm-edge-computing-expert/SKILL.md +97 -0
  134. package/skills/web-3d-graphics-expert/SKILL.md +262 -80
  135. package/skills/web-game-engine-expert/SKILL.md +281 -48
  136. package/skills/web-scraper/SKILL.md +157 -207
  137. package/skills/website-design-cloner/SKILL.md +179 -173
  138. package/skills/webxr-ar-vr-expert/SKILL.md +108 -63
  139. package/skills/wordpress-headless-expert/SKILL.md +144 -0
  140. package/skills/zero-to-prod-orchestrator/SKILL.md +65 -38
  141. package/skills/zero-trust-secret-vault/SKILL.md +87 -39
  142. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  143. package/.github/workflows/publish.yml +0 -20
  144. package/CONTRIBUTING.md +0 -199
  145. package/SECURITY.md +0 -21
  146. package/banner.png +0 -0
  147. package/skills/ai-cost-token-optimizer/SKILL.md +0 -52
  148. package/skills/asisten_ramah/SKILL.md +0 -41
  149. package/skills/auto-doc-updater/SKILL.md +0 -214
  150. package/skills/autonomous-chaos-monkey/SKILL.md +0 -63
  151. package/skills/autonomous-swarm-director/SKILL.md +0 -69
  152. package/skills/edge-serverless-db-expert/SKILL.md +0 -43
  153. package/skills/hyper-context-synthesizer/SKILL.md +0 -55
  154. package/skills/llm-cost-arbitrage-router/SKILL.md +0 -59
  155. package/skills/mcp-client-orchestrator/SKILL.md +0 -70
  156. package/skills/mobile-push-notification-expert/SKILL.md +0 -51
  157. package/skills/monday-design-aesthetic/SKILL.md +0 -67
  158. package/skills/project-context-mapper/SKILL.md +0 -79
  159. package/skills/saas-mvp-launcher/SKILL.md +0 -241
  160. package/skills/saas-transformer/SKILL.md +0 -489
  161. package/skills/saas-transformer/references/billing_integration_guide.md +0 -401
  162. package/skills/self-evolving-memory-graph/SKILL.md +0 -75
  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/session-context-loader/SKILL.md +0 -77
  173. package/skills/session-handoff-resume/SKILL.md +0 -158
  174. package/skills/skill_baru/SKILL.md +0 -172
  175. package/skills/supabase-migration/SKILL.md +0 -45
  176. package/skills/token-saver/SKILL.md +0 -119
  177. package/skills/ui-components-expert/SKILL.md +0 -280
  178. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-310.pyc +0 -0
  179. package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc +0 -0
  180. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-310.pyc +0 -0
  181. package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
  182. package/skills/ui_ux_expert/SKILL.md +0 -125
  183. package/skills/vibe-code-gardener/SKILL.md +0 -181
  184. package/vibes-swarm-demo.gif +0 -0
  185. /package/skills/{saas-transformer → saas-architect}/references/feature_gating_patterns.md +0 -0
  186. /package/skills/{saas-transformer → saas-architect}/references/saas_transformation_checklist.md +0 -0
  187. /package/skills/{saas-transformer → saas-architect}/scripts/saas_transformation_scanner.py +0 -0
package/index.js ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Vibes Plug - Universal AI Plugin with 145+ 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.14.1",
4
+ "description": "Universal AI plugin with 125 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.14.0",
4
+ "description": "Universal AI plugin with 125 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,53 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * scripts/check-anti-slop.js
4
+ * Automated Anti-AI Slop Validator for vibes-plug & user codebases.
5
+ */
6
+
7
+ const fs = require('fs');
8
+ const path = require('path');
9
+
10
+ const SLOP_PATTERNS = [
11
+ { name: 'Lazy Truncation Placeholder', regex: /\/\/\s*\.\.\.\s*(rest|code|implement|logic)/i },
12
+ { name: 'Unfinished TODO Stub', regex: /\/\/\s*TODO:\s*(implement|add logic|fill in|later)/i },
13
+ { name: 'Mock Data in Production', regex: /\/\/\s*mock data for now/i },
14
+ { name: 'Syntax Narration Comment', regex: /\/\/\s*(increment\s+\w+|return\s+(the\s+)?\w+|import\s+\w+\s+from)/i },
15
+ ];
16
+
17
+ const IGNORE_DIRS = ['node_modules', '.git', '.next', 'dist', 'build', 'artifacts', '.gemini'];
18
+
19
+ let slopCount = 0;
20
+
21
+ function scanDir(dir) {
22
+ if (!fs.existsSync(dir)) return;
23
+ const files = fs.readdirSync(dir);
24
+ for (const file of files) {
25
+ if (IGNORE_DIRS.includes(file)) continue;
26
+ const fullPath = path.join(dir, file);
27
+ const stat = fs.statSync(fullPath);
28
+ if (stat.isDirectory()) {
29
+ scanDir(fullPath);
30
+ } else if (/\.(ts|tsx|js|jsx|py|go|rs)$/.test(file) && !file.includes('check-anti-slop')) {
31
+ const content = fs.readFileSync(fullPath, 'utf8');
32
+ const lines = content.split('\n');
33
+ lines.forEach((line, index) => {
34
+ SLOP_PATTERNS.forEach(({ name, regex }) => {
35
+ if (regex.test(line)) {
36
+ console.error(`🚨 [AI SLOP DETECTED] ${fullPath}:${index + 1} (${name}) -> ${line.trim()}`);
37
+ slopCount++;
38
+ }
39
+ });
40
+ });
41
+ }
42
+ }
43
+ }
44
+
45
+ console.log('šŸ” Scanning repository for AI slop and placeholder code...');
46
+ scanDir(process.cwd());
47
+
48
+ if (slopCount > 0) {
49
+ console.error(`\nāŒ Failed: ${slopCount} AI slop violations detected. Purge placeholders before commit.`);
50
+ process.exit(1);
51
+ } else {
52
+ console.log('āœ… Anti-Slop Audit Passed: Clean code, zero AI slop detected.');
53
+ }
@@ -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
+ # 145+ Skills Badge (Pill)
125
+ badge_text = '145+ 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();