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.
- package/.claude/rules/vibes-plug-core.md +32 -0
- package/.cursor/rules/vibes-plug-core.mdc +51 -0
- package/.cursorrules +42 -0
- package/AGENTS.md +37 -7
- package/BLUEPRINT.md +309 -217
- package/CHANGELOG.md +133 -1
- package/CLAUDE.md +70 -0
- package/LICENSE +1 -1
- package/README.md +641 -415
- package/index.js +19 -0
- package/package.json +44 -8
- package/plugin.json +24 -7
- package/scripts/generate_swarm_gif.py +295 -0
- package/scripts/install.js +201 -0
- package/skills/accessibility-testing-expert/SKILL.md +116 -0
- package/skills/ai-cost-token-optimizer/SKILL.md +82 -52
- package/skills/ai-evals-benchmark-expert/SKILL.md +188 -0
- package/skills/ai-llm-integration-expert/SKILL.md +185 -178
- package/skills/ai-media-generation-expert/SKILL.md +172 -0
- package/skills/ai-prompt-engineering-expert/SKILL.md +84 -0
- package/skills/angular-expert/SKILL.md +148 -0
- package/skills/api-design-expert/SKILL.md +6 -3
- package/skills/api-gateway-proxy-expert/SKILL.md +81 -0
- package/skills/app-analyzer-optimizer/SKILL.md +6 -3
- package/skills/apple-ecosystem-expert/SKILL.md +144 -141
- package/skills/{asisten_ramah ā asisten-ramah}/SKILL.md +7 -1
- package/skills/astro-framework-expert/SKILL.md +200 -0
- package/skills/async-queue-temporal-expert/SKILL.md +210 -24
- package/skills/authentication-identity-expert/SKILL.md +278 -275
- package/skills/auto-doc-updater/SKILL.md +7 -1
- package/skills/autonomous-chaos-monkey/SKILL.md +63 -63
- package/skills/autonomous-red-teamer/SKILL.md +172 -28
- package/skills/autonomous-tdd-debugger/SKILL.md +70 -64
- package/skills/background-jobs-queue-expert/SKILL.md +235 -0
- package/skills/biome-linter-formatter-expert/SKILL.md +89 -0
- package/skills/blockchain-web3-expert/SKILL.md +115 -0
- package/skills/bootstrap-to-modern/SKILL.md +9 -6
- package/skills/brainstorming/SKILL.md +58 -50
- package/skills/browser-automation-expert/SKILL.md +197 -21
- package/skills/bun-runtime-expert/SKILL.md +7 -1
- package/skills/chatbot-messaging-expert/SKILL.md +114 -0
- package/skills/ci-cd-devops-architect/SKILL.md +45 -36
- package/skills/cloud-hosting-expert/SKILL.md +7 -1
- package/skills/coderabbit/SKILL.md +7 -1
- package/skills/compliance-gdpr-privacy-expert/SKILL.md +85 -0
- package/skills/cron-scheduler-expert/SKILL.md +303 -297
- package/skills/data-pipeline-etl-expert/SKILL.md +84 -0
- package/skills/data-telemetry-expert/SKILL.md +7 -1
- package/skills/data-visualization-expert/SKILL.md +154 -0
- package/skills/database-migration-versioning-expert/SKILL.md +90 -0
- package/skills/database-orm-expert/SKILL.md +13 -3
- package/skills/dependency-upgrade-migrator/SKILL.md +300 -294
- package/skills/design-system-architect/SKILL.md +278 -259
- package/skills/desktop-electron-expert/SKILL.md +128 -0
- package/skills/documentation-site-expert/SKILL.md +59 -0
- package/skills/doku-mcp-server/SKILL.md +7 -1
- package/skills/doku-payment-gateway/SKILL.md +7 -1
- package/skills/domain-driven-design-expert/SKILL.md +82 -0
- package/skills/e2e-testing-expert/SKILL.md +7 -1
- package/skills/ecommerce-expert/SKILL.md +87 -0
- package/skills/edge-serverless-db-expert/SKILL.md +98 -42
- package/skills/email-notification-expert/SKILL.md +367 -361
- package/skills/error-resilience-expert/SKILL.md +485 -479
- package/skills/event-driven-architect/SKILL.md +7 -1
- package/skills/feature-flag-analytics-expert/SKILL.md +65 -45
- package/skills/file-upload-media-expert/SKILL.md +436 -430
- package/skills/firebase-security-expert/SKILL.md +7 -1
- package/skills/form-validation-expert/SKILL.md +406 -400
- package/skills/fullstack-expert/SKILL.md +60 -1
- package/skills/gemini-agent-booster/SKILL.md +173 -135
- package/skills/geospatial-maps-expert/SKILL.md +80 -0
- package/skills/global-a11y-i18n-expert/SKILL.md +7 -1
- package/skills/glsl-shader-expert/SKILL.md +106 -100
- package/skills/go-programming-expert/SKILL.md +21 -15
- package/skills/graph-rag-knowledge-expert/SKILL.md +159 -0
- package/skills/graphql-apollo-expert/SKILL.md +113 -107
- package/skills/headless-cms-expert/SKILL.md +181 -0
- package/skills/hig/SKILL.md +7 -1
- package/skills/js-backend-expert/SKILL.md +218 -216
- package/skills/legacy-code-translator/SKILL.md +70 -64
- package/skills/local-slm-edge-ai-expert/SKILL.md +167 -0
- package/skills/logging-error-tracking-expert/SKILL.md +343 -337
- package/skills/mcp-client-orchestrator/SKILL.md +75 -69
- package/skills/mcp-server-architect/SKILL.md +294 -194
- package/skills/micro-frontend-architect/SKILL.md +111 -105
- package/skills/mobile-expo-expert/SKILL.md +8 -2
- package/skills/mobile-push-notification-expert/SKILL.md +70 -50
- package/skills/modern-css-native-expert/SKILL.md +189 -0
- package/skills/monday-design-aesthetic/SKILL.md +7 -1
- package/skills/monorepo-architect/SKILL.md +7 -1
- package/skills/mpa-orchestrator/SKILL.md +20 -1
- package/skills/multi-agent-orchestration/SKILL.md +254 -234
- package/skills/multiple-entry-points/SKILL.md +37 -1
- package/skills/mvc-expert/SKILL.md +7 -1
- package/skills/n8n-automation-expert/SKILL.md +89 -0
- package/skills/nextjs-app-router-expert/SKILL.md +148 -0
- package/skills/openapi-swagger-codegen-expert/SKILL.md +67 -0
- package/skills/payment-gateway-expert/SKILL.md +85 -1
- package/skills/pdf-document-generation-expert/SKILL.md +91 -0
- package/skills/performance-web-vitals/SKILL.md +7 -1
- package/skills/post-quantum-crypto-migrator/SKILL.md +57 -57
- package/skills/prd-architect/SKILL.md +7 -1
- package/skills/proactive-background-watcher/SKILL.md +67 -61
- package/skills/production-ready-hardener/SKILL.md +461 -455
- package/skills/project-context-mapper/SKILL.md +84 -78
- package/skills/pwa-offline-first-expert/SKILL.md +185 -0
- package/skills/python-programming-expert/SKILL.md +407 -401
- package/skills/rate-limit-abuse-prevention/SKILL.md +376 -370
- package/skills/realtime-collaboration-expert/SKILL.md +55 -1
- package/skills/rich-text-editor-expert/SKILL.md +177 -0
- package/skills/rust-programming-expert/SKILL.md +7 -1
- package/skills/saas-billing/SKILL.md +7 -1
- package/skills/saas-multi-tenant/SKILL.md +7 -1
- package/skills/saas-mvp-launcher/SKILL.md +20 -1
- package/skills/saas-transformer/SKILL.md +499 -488
- package/skills/scalability-clean-code/SKILL.md +7 -1
- package/skills/search-engine-expert/SKILL.md +89 -0
- package/skills/secure-fuzz-testing/SKILL.md +7 -1
- package/skills/self-evolving-memory-graph/SKILL.md +90 -74
- package/skills/self-healing-cloud-orchestrator/SKILL.md +57 -57
- package/skills/senior-frontend/SKILL.md +141 -161
- package/skills/seo/SKILL.md +41 -17
- package/skills/session-context-loader/SKILL.md +82 -76
- package/skills/session-handoff-resume/SKILL.md +7 -1
- package/skills/{skill_baru ā skill-baru}/SKILL.md +8 -2
- package/skills/solidjs-expert/SKILL.md +80 -0
- package/skills/spa-orchestrator/SKILL.md +20 -1
- package/skills/sse-websocket-streaming-expert/SKILL.md +93 -0
- package/skills/state-management-expert/SKILL.md +7 -1
- package/skills/supabase-migration/SKILL.md +47 -1
- package/skills/supabase-security-expert/SKILL.md +7 -1
- package/skills/svelte-sveltekit-expert/SKILL.md +91 -0
- package/skills/svg-animation-motion-expert/SKILL.md +115 -0
- package/skills/tailwind-expert/SKILL.md +88 -136
- package/skills/tanstack-query-expert/SKILL.md +7 -1
- package/skills/tauri-expert/SKILL.md +7 -1
- package/skills/token-saver/SKILL.md +1 -1
- package/skills/typescript-expert/SKILL.md +12 -6
- package/skills/ui-components-expert/SKILL.md +165 -279
- package/skills/ui-ux-pro-max/SKILL.md +23 -3
- package/skills/vector-db-rag-expert/SKILL.md +175 -19
- package/skills/vibe-code-gardener/SKILL.md +1 -1
- package/skills/visual-qa-vision-agent/SKILL.md +70 -64
- package/skills/voice-ai-realtime-agent/SKILL.md +202 -0
- package/skills/vue-frontend-expert/SKILL.md +131 -125
- package/skills/wasm-edge-computing-expert/SKILL.md +97 -0
- package/skills/web-3d-graphics-expert/SKILL.md +136 -130
- package/skills/web-game-engine-expert/SKILL.md +101 -95
- package/skills/web-scraper/SKILL.md +157 -207
- package/skills/website-design-cloner/SKILL.md +179 -173
- package/skills/webxr-ar-vr-expert/SKILL.md +122 -116
- package/skills/wordpress-headless-expert/SKILL.md +144 -0
- package/skills/zero-to-prod-orchestrator/SKILL.md +52 -27
- package/skills/zero-trust-secret-vault/SKILL.md +87 -39
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- package/.github/workflows/publish.yml +0 -20
- package/CONTRIBUTING.md +0 -199
- package/SECURITY.md +0 -21
- package/banner.png +0 -0
- package/skills/autonomous-swarm-director/SKILL.md +0 -69
- package/skills/hyper-context-synthesizer/SKILL.md +0 -55
- package/skills/llm-cost-arbitrage-router/SKILL.md +0 -59
- package/skills/senior-fullstack/SKILL.md +0 -167
- package/skills/senior-fullstack/references/architecture_patterns.md +0 -160
- package/skills/senior-fullstack/references/development_workflows.md +0 -222
- package/skills/senior-fullstack/references/tech_stack_guide.md +0 -190
- package/skills/senior-fullstack/scripts/code_quality_analyzer.py +0 -114
- package/skills/senior-fullstack/scripts/fullstack_scaffolder.py +0 -114
- package/skills/senior-fullstack/scripts/project_scaffolder.py +0 -114
- package/skills/seo-aeo-landing-page-writer/SKILL.md +0 -97
- package/skills/seo-geo/SKILL.md +0 -188
- package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-310.pyc +0 -0
- package/skills/ui-ux-pro-max/scripts/__pycache__/core.cpython-312.pyc +0 -0
- package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-310.pyc +0 -0
- package/skills/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-312.pyc +0 -0
- package/skills/ui_ux_expert/SKILL.md +0 -125
- 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.
|
|
4
|
-
"description": "
|
|
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
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
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": "
|
|
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.
|
|
4
|
-
"description": "
|
|
5
|
-
"author": "
|
|
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();
|