vibes-plug 2.11.0 → 3.9.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 +5 -0
- package/.cursor/rules/vibes-plug-core.mdc +8 -3
- package/.cursorrules +9 -3
- package/AGENTS.md +25 -4
- package/CHANGELOG.md +151 -0
- package/CLAUDE.md +15 -8
- package/README.md +216 -641
- package/bin/vibes.mjs +1104 -0
- package/index.js +1 -1
- package/package.json +11 -3
- package/plugin.json +4 -3
- package/scripts/check-anti-slop.js +53 -0
- package/scripts/check-anti-slop.mjs +53 -0
- package/scripts/generate_swarm_gif.py +2 -2
- package/scripts/install.js +3 -1
- package/scripts/update_skills.js +1 -1
- package/scripts/update_skills.mjs +86 -0
- package/scripts/validate-skills.mjs +111 -0
- package/skills/accessibility-testing-expert/SKILL.md +117 -116
- package/skills/affective-computing-emotion-ai/SKILL.md +83 -0
- package/skills/agentic-coding-workflow-expert/SKILL.md +297 -0
- package/skills/agentic-memory-architect/SKILL.md +52 -0
- package/skills/agentic-micro-economy-architect/SKILL.md +92 -0
- package/skills/ai-llm-integration-expert/SKILL.md +330 -187
- package/skills/ai-media-generation-expert/SKILL.md +173 -172
- package/skills/ai-prompt-engineering-expert/SKILL.md +170 -50
- package/skills/ai-safety-governance-expert/SKILL.md +223 -0
- package/skills/angular-expert/SKILL.md +149 -148
- package/skills/anti-slop/SKILL.md +134 -0
- package/skills/api-design-expert/SKILL.md +4 -3
- package/skills/api-gateway-proxy-expert/SKILL.md +3 -2
- package/skills/app-analyzer-optimizer/SKILL.md +4 -3
- package/skills/apple-ecosystem-expert/SKILL.md +6 -5
- package/skills/astro-framework-expert/SKILL.md +201 -200
- package/skills/async-queue-temporal-expert/SKILL.md +218 -240
- package/skills/authentication-identity-expert/SKILL.md +79 -184
- package/skills/autonomous-red-teamer/SKILL.md +338 -203
- package/skills/autonomous-tdd-debugger/SKILL.md +6 -5
- package/skills/biome-linter-formatter-expert/SKILL.md +90 -89
- package/skills/blockchain-web3-expert/SKILL.md +116 -115
- package/skills/brainstorming/SKILL.md +392 -377
- package/skills/browser-automation-expert/SKILL.md +260 -222
- package/skills/bun-runtime-expert/SKILL.md +5 -4
- package/skills/chatbot-messaging-expert/SKILL.md +115 -114
- package/skills/ci-cd-devops-architect/SKILL.md +3 -2
- package/skills/cloud-hosting-expert/SKILL.md +5 -4
- package/skills/coderabbit/SKILL.md +5 -4
- package/skills/compliance-gdpr-privacy-expert/SKILL.md +3 -2
- package/skills/composable-mach-architect/SKILL.md +338 -0
- package/skills/cron-scheduler-expert/SKILL.md +5 -4
- package/skills/data-pipeline-etl-expert/SKILL.md +3 -2
- package/skills/data-telemetry-expert/SKILL.md +5 -4
- package/skills/data-visualization-expert/SKILL.md +155 -154
- package/skills/database-orm-expert/SKILL.md +102 -240
- package/skills/deep-research-analyst/SKILL.md +182 -0
- package/skills/dependency-upgrade-migrator/SKILL.md +11 -10
- package/skills/design-system-architect/SKILL.md +34 -3
- package/skills/desktop-electron-expert/SKILL.md +129 -128
- package/skills/documentation-site-expert/SKILL.md +60 -59
- package/skills/doku-mcp-server/SKILL.md +5 -4
- package/skills/doku-payment-gateway/SKILL.md +250 -232
- package/skills/domain-driven-design-expert/SKILL.md +3 -2
- package/skills/e2e-testing-expert/SKILL.md +5 -4
- package/skills/ecommerce-expert/SKILL.md +88 -87
- package/skills/email-notification-expert/SKILL.md +35 -7
- package/skills/ephemeral-generative-ui-architect/SKILL.md +88 -0
- package/skills/error-resilience-expert/SKILL.md +26 -4
- package/skills/event-driven-architect/SKILL.md +5 -4
- package/skills/feature-flag-analytics-expert/SKILL.md +3 -2
- package/skills/file-upload-media-expert/SKILL.md +5 -4
- package/skills/firebase-security-expert/SKILL.md +5 -4
- package/skills/form-validation-expert/SKILL.md +7 -6
- package/skills/frontier-ai-models-expert/SKILL.md +116 -0
- package/skills/fullstack-expert/SKILL.md +68 -144
- package/skills/gemini-agent-booster/SKILL.md +248 -172
- package/skills/geospatial-maps-expert/SKILL.md +81 -80
- package/skills/global-a11y-i18n-expert/SKILL.md +5 -4
- package/skills/glsl-shader-expert/SKILL.md +155 -71
- package/skills/go-programming-expert/SKILL.md +5 -4
- package/skills/graph-rag-knowledge-expert/SKILL.md +201 -159
- package/skills/graphql-apollo-expert/SKILL.md +5 -4
- package/skills/headless-cms-expert/SKILL.md +182 -181
- package/skills/hig/SKILL.md +5 -4
- package/skills/js-backend-expert/SKILL.md +219 -218
- package/skills/legacy-code-translator/SKILL.md +6 -5
- package/skills/llm-finops-router/SKILL.md +52 -0
- package/skills/local-slm-edge-ai-expert/SKILL.md +168 -167
- package/skills/logging-error-tracking-expert/SKILL.md +5 -4
- package/skills/mcp-server-architect/SKILL.md +316 -294
- package/skills/micro-frontend-architect/SKILL.md +5 -4
- package/skills/mobile-expo-expert/SKILL.md +5 -4
- package/skills/modern-css-native-expert/SKILL.md +190 -189
- package/skills/monorepo-architect/SKILL.md +5 -4
- package/skills/mpa-orchestrator/SKILL.md +41 -4
- package/skills/multi-agent-orchestration/SKILL.md +388 -254
- package/skills/mvc-expert/SKILL.md +5 -4
- package/skills/n8n-automation-expert/SKILL.md +90 -89
- package/skills/nextjs-app-router-expert/SKILL.md +3 -2
- package/skills/openapi-swagger-codegen-expert/SKILL.md +4 -3
- package/skills/payment-gateway-expert/SKILL.md +131 -128
- package/skills/pdf-document-generation-expert/SKILL.md +92 -91
- package/skills/performance-web-vitals/SKILL.md +5 -4
- package/skills/post-quantum-crypto-migrator/SKILL.md +3 -2
- package/skills/prd-architect/SKILL.md +85 -109
- package/skills/proactive-background-watcher/SKILL.md +5 -4
- package/skills/production-ready-hardener/SKILL.md +25 -27
- package/skills/pwa-offline-first-expert/SKILL.md +227 -185
- package/skills/pydantic-ai-expert/SKILL.md +162 -0
- package/skills/python-programming-expert/SKILL.md +5 -4
- package/skills/rate-limit-abuse-prevention/SKILL.md +5 -4
- package/skills/realtime-collaboration-expert/SKILL.md +3 -2
- package/skills/rich-text-editor-expert/SKILL.md +178 -177
- package/skills/rust-programming-expert/SKILL.md +5 -4
- package/skills/saas-architect/SKILL.md +155 -0
- package/skills/saas-billing/SKILL.md +394 -382
- package/skills/saas-multi-tenant/SKILL.md +7 -6
- package/skills/scalability-clean-code/SKILL.md +5 -4
- package/skills/search-engine-expert/SKILL.md +90 -89
- package/skills/self-healing-cloud-orchestrator/SKILL.md +3 -2
- package/skills/senior-frontend/SKILL.md +21 -18
- package/skills/senior-frontend/scripts/frontend_scaffolder.py +1 -1
- package/skills/seo/SKILL.md +4 -4
- package/skills/session-memory-manager/SKILL.md +129 -0
- package/skills/solidjs-expert/SKILL.md +81 -80
- package/skills/spa-orchestrator/SKILL.md +5 -4
- package/skills/sse-websocket-streaming-expert/SKILL.md +3 -2
- package/skills/state-management-expert/SKILL.md +5 -4
- package/skills/supabase-security-expert/SKILL.md +5 -4
- package/skills/svelte-sveltekit-expert/SKILL.md +92 -91
- package/skills/svg-animation-motion-expert/SKILL.md +3 -2
- package/skills/synthetic-data-finetuning-expert/SKILL.md +156 -0
- package/skills/tailwind-expert/SKILL.md +62 -5
- package/skills/tanstack-query-expert/SKILL.md +5 -4
- package/skills/tauri-expert/SKILL.md +5 -4
- package/skills/typescript-expert/SKILL.md +5 -4
- package/skills/ui-ux-pro-max/SKILL.md +7 -4
- package/skills/vector-db-rag-expert/SKILL.md +209 -208
- package/skills/vercel-ai-sdk-expert/SKILL.md +226 -0
- package/skills/voice-ai-realtime-agent/SKILL.md +243 -202
- package/skills/vue-frontend-expert/SKILL.md +5 -4
- package/skills/wasm-edge-computing-expert/SKILL.md +3 -2
- package/skills/web-3d-graphics-expert/SKILL.md +259 -82
- package/skills/web-game-engine-expert/SKILL.md +278 -50
- package/skills/web-scraper/SKILL.md +158 -157
- package/skills/website-design-cloner/SKILL.md +5 -4
- package/skills/webxr-ar-vr-expert/SKILL.md +105 -65
- package/skills/wordpress-headless-expert/SKILL.md +145 -144
- package/skills/zero-tech-debt-auditor/SKILL.md +115 -0
- package/skills/zero-to-prod-orchestrator/SKILL.md +281 -227
- package/skills/zero-trust-secret-vault/SKILL.md +3 -2
- package/BLUEPRINT.md +0 -309
- package/skills/ai-cost-token-optimizer/SKILL.md +0 -82
- package/skills/ai-evals-benchmark-expert/SKILL.md +0 -188
- package/skills/asisten-ramah/SKILL.md +0 -47
- package/skills/auto-doc-updater/SKILL.md +0 -220
- package/skills/autonomous-chaos-monkey/SKILL.md +0 -63
- package/skills/background-jobs-queue-expert/SKILL.md +0 -235
- package/skills/bootstrap-to-modern/SKILL.md +0 -94
- package/skills/database-migration-versioning-expert/SKILL.md +0 -90
- package/skills/edge-serverless-db-expert/SKILL.md +0 -99
- package/skills/mcp-client-orchestrator/SKILL.md +0 -76
- package/skills/mobile-push-notification-expert/SKILL.md +0 -71
- package/skills/monday-design-aesthetic/SKILL.md +0 -73
- package/skills/multiple-entry-points/SKILL.md +0 -91
- package/skills/project-context-mapper/SKILL.md +0 -85
- package/skills/saas-mvp-launcher/SKILL.md +0 -260
- package/skills/saas-transformer/SKILL.md +0 -500
- package/skills/saas-transformer/references/billing_integration_guide.md +0 -401
- package/skills/secure-fuzz-testing/SKILL.md +0 -207
- package/skills/self-evolving-memory-graph/SKILL.md +0 -91
- package/skills/session-context-loader/SKILL.md +0 -83
- package/skills/session-handoff-resume/SKILL.md +0 -164
- package/skills/skill-baru/SKILL.md +0 -178
- package/skills/supabase-migration/SKILL.md +0 -91
- package/skills/token-saver/SKILL.md +0 -119
- package/skills/ui-components-expert/SKILL.md +0 -166
- package/skills/vibe-code-gardener/SKILL.md +0 -181
- package/skills/visual-qa-vision-agent/SKILL.md +0 -71
- /package/skills/{saas-transformer → saas-architect}/references/feature_gating_patterns.md +0 -0
- /package/skills/{saas-transformer → saas-architect}/references/saas_transformation_checklist.md +0 -0
- /package/skills/{saas-transformer → saas-architect}/scripts/saas_transformation_scanner.py +0 -0
package/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibes-plug",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Universal AI plugin with
|
|
3
|
+
"version": "3.9.0",
|
|
4
|
+
"description": "Universal AI plugin with 131 specialized skills for Antigravity, Claude, and Cursor. Updated for the modern 2026 tech stack (React 19, Tailwind v4, Bun, Hono, AI Safety, CUA). Designed to support software development, UI/UX design, SEO optimization, and SaaS business strategies",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
7
|
-
"vibes-plug": "
|
|
7
|
+
"vibes-plug": "scripts/install.js",
|
|
8
|
+
"vibes": "bin/vibes.mjs"
|
|
8
9
|
},
|
|
9
10
|
"files": [
|
|
10
11
|
"index.js",
|
|
@@ -27,10 +28,15 @@
|
|
|
27
28
|
"scripts": {
|
|
28
29
|
"test": "echo \"Error: no test specified\" && exit 1",
|
|
29
30
|
"generate:gif": "python scripts/generate_swarm_gif.py",
|
|
31
|
+
"update-skills": "node scripts/update_skills.mjs",
|
|
32
|
+
"audit": "node scripts/check-anti-slop.mjs",
|
|
30
33
|
"install-all": "node scripts/install.js --all",
|
|
31
34
|
"install-claude": "node scripts/install.js --claude",
|
|
32
35
|
"install-cursor": "node scripts/install.js --cursor"
|
|
33
36
|
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@inquirer/prompts": "^7.0.0"
|
|
39
|
+
},
|
|
34
40
|
"repository": {
|
|
35
41
|
"type": "git",
|
|
36
42
|
"url": "git+https://github.com/roedyrustam/vibes-plug.git"
|
|
@@ -59,3 +65,5 @@
|
|
|
59
65
|
},
|
|
60
66
|
"homepage": "https://github.com/roedyrustam/vibes-plug#readme"
|
|
61
67
|
}
|
|
68
|
+
|
|
69
|
+
|
package/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibes-plug",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Universal AI plugin with
|
|
3
|
+
"version": "3.9.0",
|
|
4
|
+
"description": "Universal AI plugin with 131 specialized skills for Antigravity, Claude, and Cursor.",
|
|
5
5
|
"author": "Roedy Rustam",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": "https://github.com/roedyrustam/vibes-plug.git",
|
|
@@ -22,4 +22,5 @@
|
|
|
22
22
|
"skillsDir": "skills/"
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
-
}
|
|
25
|
+
}
|
|
26
|
+
|
|
@@ -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,53 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* scripts/check-anti-slop.mjs
|
|
4
|
+
* Automated Anti-AI Slop Validator for vibes-plug & user codebases.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import fs from 'fs';
|
|
8
|
+
import path from '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|mjs|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
|
+
}
|
|
@@ -121,8 +121,8 @@ for frame_idx in range(NUM_FRAMES):
|
|
|
121
121
|
draw.text((START_X + 20, 18), 'VIBES PLUG', fill='#38bdf8', font=font_title)
|
|
122
122
|
draw.text((START_X + 135, 21), '— Universal Agentic Swarm Workflow (2026 Edition)', fill='#94a3b8', font=font_subtitle)
|
|
123
123
|
|
|
124
|
-
#
|
|
125
|
-
badge_text = '
|
|
124
|
+
# 145+ Skills Badge (Pill)
|
|
125
|
+
badge_text = '145+ SKILLS ACTIVE'
|
|
126
126
|
badge_w, badge_h = 138, 24
|
|
127
127
|
badge_x = START_X + TOTAL_CARDS_W - badge_w
|
|
128
128
|
badge_y = 17
|
package/scripts/install.js
CHANGED
|
@@ -195,7 +195,9 @@ Examples:
|
|
|
195
195
|
console.log('');
|
|
196
196
|
}
|
|
197
197
|
|
|
198
|
-
console.log('✨ Installation complete
|
|
198
|
+
console.log('✨ Installation complete!');
|
|
199
|
+
console.log('⚡ Vibes-Plug is now configured as the PRIMARY TRIGGER (Pemicu Utama).');
|
|
200
|
+
console.log('🔗 All 127+ skills are automatically synchronized across Antigravity, Claude, and Cursor!\n');
|
|
199
201
|
}
|
|
200
202
|
|
|
201
203
|
main();
|
package/scripts/update_skills.js
CHANGED
|
@@ -62,7 +62,7 @@ function updateSkills() {
|
|
|
62
62
|
content = content.replace(/Tailwind CSS(?: |\\u0026nbsp;| )v3/g, (match) => match.replace('v3', 'v4'));
|
|
63
63
|
content = content.replace(/Tailwind(?: |\\u0026nbsp;| )v3/g, (match) => match.replace('v3', 'v4'));
|
|
64
64
|
content = content.replace(/TanStack Query(?: |\\u0026nbsp;| )v4/g, (match) => match.replace('v4', 'v5'));
|
|
65
|
-
content = content.replace(/Bun(?: |\\u0026nbsp;| )v1\.0/g, (match) => match.replace('v1.0', 'v1.
|
|
65
|
+
content = content.replace(/Bun(?: |\\u0026nbsp;| )v1\.0/g, (match) => match.replace('v1.0', 'v1.2+'));
|
|
66
66
|
|
|
67
67
|
if (content !== originalContent) {
|
|
68
68
|
fs.writeFileSync(filePath, content, 'utf-8');
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* scripts/update_skills.mjs
|
|
4
|
+
* Batch update skill files: fix encoding, standardize headers, bump tech versions.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import fs from 'fs';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
+
const __dirname = path.dirname(__filename);
|
|
13
|
+
const skillsDir = path.join(__dirname, '../skills');
|
|
14
|
+
|
|
15
|
+
function walk(dir) {
|
|
16
|
+
let results = [];
|
|
17
|
+
const list = fs.readdirSync(dir);
|
|
18
|
+
list.forEach(file => {
|
|
19
|
+
const fullPath = path.join(dir, file);
|
|
20
|
+
const stat = fs.statSync(fullPath);
|
|
21
|
+
if (stat && stat.isDirectory()) {
|
|
22
|
+
results = results.concat(walk(fullPath));
|
|
23
|
+
} else {
|
|
24
|
+
results.push(fullPath);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
return results;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function updateSkills() {
|
|
31
|
+
const files = walk(skillsDir);
|
|
32
|
+
|
|
33
|
+
files.forEach(filePath => {
|
|
34
|
+
const ext = path.extname(filePath);
|
|
35
|
+
if (ext === '.md' || ext === '.csv' || ext === '.py') {
|
|
36
|
+
let content = fs.readFileSync(filePath, 'utf-8');
|
|
37
|
+
const originalContent = content;
|
|
38
|
+
|
|
39
|
+
if (ext === '.md') {
|
|
40
|
+
// Only clean frontmatter if it exists at the top of the file
|
|
41
|
+
if (content.startsWith('---')) {
|
|
42
|
+
const parts = content.split('---');
|
|
43
|
+
if (parts.length >= 3) {
|
|
44
|
+
let frontmatter = parts[1];
|
|
45
|
+
frontmatter = frontmatter.replace(/github:.*?\n/g, '');
|
|
46
|
+
frontmatter = frontmatter.replace(/risk:.*?\n/g, '');
|
|
47
|
+
frontmatter = frontmatter.replace(/source:.*?\n/g, '');
|
|
48
|
+
frontmatter = frontmatter.replace(/date_added:.*?\n/g, '');
|
|
49
|
+
parts[1] = frontmatter;
|
|
50
|
+
content = parts.join('---');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Standardize headers
|
|
55
|
+
content = content.replace(/^## When to Use$/gm, '## Kondisi Pemicu / Trigger Conditions');
|
|
56
|
+
|
|
57
|
+
// Fix encoding issues from ui_ux_expert
|
|
58
|
+
content = content.replace(/🎯/g, '🎯');
|
|
59
|
+
content = content.replace(/🧠/g, '🧠');
|
|
60
|
+
content = content.replace(/🎨/g, '🎨');
|
|
61
|
+
content = content.replace(/ðŸ"±/g, '📱');
|
|
62
|
+
content = content.replace(/🧩/g, '🧩');
|
|
63
|
+
content = content.replace(/âš™ï¸ /g, '⚙️');
|
|
64
|
+
content = content.replace(/🚀/g, '🚀');
|
|
65
|
+
content = content.replace(/â Œ/g, '❌');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Update technologies to keep them current
|
|
69
|
+
content = content.replace(/React(?: |\\u0026nbsp;| )18/g, m => m.replace('18', '19'));
|
|
70
|
+
content = content.replace(/Next\.js(?: |\\u0026nbsp;| )14/g, m => m.replace('14', '15'));
|
|
71
|
+
content = content.replace(/Tailwind CSS(?: |\\u0026nbsp;| )v3/g, m => m.replace('v3', 'v4'));
|
|
72
|
+
content = content.replace(/Tailwind(?: |\\u0026nbsp;| )v3/g, m => m.replace('v3', 'v4'));
|
|
73
|
+
content = content.replace(/TanStack Query(?: |\\u0026nbsp;| )v4/g, m => m.replace('v4', 'v5'));
|
|
74
|
+
content = content.replace(/Bun(?: |\\u0026nbsp;| )v1\.0/g, m => m.replace('v1.0', 'v1.2+'));
|
|
75
|
+
|
|
76
|
+
if (content !== originalContent) {
|
|
77
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
78
|
+
console.log(`✅ Updated: ${path.relative(skillsDir, filePath)}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
console.log('\n🎉 Skills update complete.');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
updateSkills();
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
|
|
4
|
+
const SKILLS_DIR = path.join(process.cwd(), 'skills');
|
|
5
|
+
|
|
6
|
+
const DEPRECATED_REFS = [
|
|
7
|
+
'project-context-mapper',
|
|
8
|
+
'ui-components-expert',
|
|
9
|
+
'database-migration-versioning-expert',
|
|
10
|
+
'supabase-migration',
|
|
11
|
+
'auto-doc-updater',
|
|
12
|
+
'session-handoff-resume',
|
|
13
|
+
'session-context-loader'
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
async function validateSkills() {
|
|
17
|
+
console.log('🔍 Starting Vibes-Plug Ecosystem Validation...\n');
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
const entries = await fs.readdir(SKILLS_DIR, { withFileTypes: true });
|
|
21
|
+
const skillDirs = entries.filter(e => e.isDirectory());
|
|
22
|
+
|
|
23
|
+
let totalSkills = 0;
|
|
24
|
+
let passedSkills = 0;
|
|
25
|
+
let failedSkills = 0;
|
|
26
|
+
const errors = [];
|
|
27
|
+
|
|
28
|
+
for (const dir of skillDirs) {
|
|
29
|
+
totalSkills++;
|
|
30
|
+
const skillName = dir.name;
|
|
31
|
+
const skillPath = path.join(SKILLS_DIR, skillName, 'SKILL.md');
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
const content = await fs.readFile(skillPath, 'utf8');
|
|
35
|
+
const skillErrors = [];
|
|
36
|
+
|
|
37
|
+
// 1. Check Frontmatter existence (ignore BOM)
|
|
38
|
+
const frontmatterMatch = content.match(/---\r?\n([\s\S]*?)\r?\n---/);
|
|
39
|
+
if (!frontmatterMatch) {
|
|
40
|
+
skillErrors.push('Missing YAML frontmatter');
|
|
41
|
+
} else {
|
|
42
|
+
const fm = frontmatterMatch[1];
|
|
43
|
+
if (!fm.includes('name:')) skillErrors.push('Missing "name" in frontmatter');
|
|
44
|
+
if (!fm.includes('description:')) skillErrors.push('Missing "description" in frontmatter');
|
|
45
|
+
|
|
46
|
+
const versionMatch = fm.match(/version:\s*"([^"]+)"/);
|
|
47
|
+
if (!versionMatch) {
|
|
48
|
+
skillErrors.push('Missing "version" tag (Rule: All skills must be 3.0.0+)');
|
|
49
|
+
} else {
|
|
50
|
+
const version = versionMatch[1];
|
|
51
|
+
const major = parseInt(version.split('.')[0], 10);
|
|
52
|
+
if (isNaN(major) || major < 3) {
|
|
53
|
+
skillErrors.push(`Version outdated: ${version} (expected >= 3.0.0)`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// 2. Check for deprecated references
|
|
59
|
+
for (const ref of DEPRECATED_REFS) {
|
|
60
|
+
if (content.includes(ref)) {
|
|
61
|
+
skillErrors.push(`Contains deprecated reference: ${ref}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// 3. Check for Bilingual structure
|
|
66
|
+
const lowerContent = content.toLowerCase();
|
|
67
|
+
const hasEnglish = lowerContent.includes('english') || lowerContent.includes('inggris');
|
|
68
|
+
const hasIndo = lowerContent.includes('bahasa indonesia') || lowerContent.includes('indonesia');
|
|
69
|
+
|
|
70
|
+
if (!hasEnglish || !hasIndo) {
|
|
71
|
+
skillErrors.push('Missing bilingual sections (English & Bahasa Indonesia)');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (skillErrors.length > 0) {
|
|
75
|
+
failedSkills++;
|
|
76
|
+
errors.push(`❌ ${skillName}:\n - ${skillErrors.join('\n - ')}`);
|
|
77
|
+
} else {
|
|
78
|
+
passedSkills++;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
} catch (err) {
|
|
82
|
+
failedSkills++;
|
|
83
|
+
errors.push(`❌ ${skillName}:\n - Missing SKILL.md file`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
console.log(`📊 Validation Summary:`);
|
|
88
|
+
console.log(`----------------------`);
|
|
89
|
+
console.log(`Total Skills : ${totalSkills}`);
|
|
90
|
+
console.log(`✅ Passed : ${passedSkills}`);
|
|
91
|
+
console.log(`❌ Failed : ${failedSkills}\n`);
|
|
92
|
+
|
|
93
|
+
if (errors.length > 0) {
|
|
94
|
+
console.log('🚨 Issues Found:');
|
|
95
|
+
// Just print first 5 errors to avoid terminal spam
|
|
96
|
+
errors.slice(0, 10).forEach(e => console.log(e));
|
|
97
|
+
if(errors.length > 10) console.log(`... and ${errors.length - 10} more skills failed.`);
|
|
98
|
+
console.log('\n❌ CI Pipeline Failed! Please fix the errors above.');
|
|
99
|
+
process.exit(1);
|
|
100
|
+
} else {
|
|
101
|
+
console.log(`🎉 All ${totalSkills} skills passed strict validation! Ecosystem is perfectly healthy.`);
|
|
102
|
+
process.exit(0);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
} catch (error) {
|
|
106
|
+
console.error('Failed to read skills directory:', error);
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
validateSkills();
|
|
@@ -1,116 +1,117 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: accessibility-testing-expert
|
|
3
|
-
description: "Expert guide for automated and manual Web Accessibility (a11y) testing — axe-core, Pa11y, Playwright a11y, screen reader testing, and WCAG 2.2 Level AA/AAA compliance / Panduan ahli pengujian aksesibilitas web."
|
|
4
|
-
author: "Roedy Rustam"
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
- **`
|
|
19
|
-
- **`
|
|
20
|
-
- **`
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
import
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
.
|
|
47
|
-
.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
await page.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
.
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
await
|
|
69
|
-
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
"
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
"http://localhost:3000/
|
|
87
|
-
"http://localhost:3000/
|
|
88
|
-
"http://localhost:3000/
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
- **
|
|
96
|
-
- **
|
|
97
|
-
- **
|
|
98
|
-
- **
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
- **`
|
|
108
|
-
- **`
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
-
|
|
116
|
-
-
|
|
1
|
+
---
|
|
2
|
+
name: accessibility-testing-expert
|
|
3
|
+
description: "Expert guide for automated and manual Web Accessibility (a11y) testing — axe-core, Pa11y, Playwright a11y, screen reader testing, and WCAG 2.2 Level AA/AAA compliance / Panduan ahli pengujian aksesibilitas web."
|
|
4
|
+
author: "Roedy Rustam"
|
|
5
|
+
version: "3.0.0"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Accessibility Testing Expert (2026 Edition)
|
|
9
|
+
|
|
10
|
+
[English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
<a name="english"></a>
|
|
15
|
+
## English
|
|
16
|
+
|
|
17
|
+
### Orchestration & Integration
|
|
18
|
+
- **`global-a11y-i18n-expert`**: Core WCAG rules, ARIA patterns, and internationalization standards.
|
|
19
|
+
- **`e2e-testing-expert`**: Integrating automated accessibility assertions into Playwright/Vitest CI suites.
|
|
20
|
+
- **`design-system-architect, senior-frontend`**: Accessible component primitives (Radix UI, Base UI, ARIA patterns).
|
|
21
|
+
- **`visual-qa-vision-agent`**: Visual audits for focus rings, contrast ratios, and layout flow.
|
|
22
|
+
|
|
23
|
+
### Description
|
|
24
|
+
Production guide for automated, semi-automated, and manual web accessibility (a11y) testing. Covers WCAG 2.2 Level AA/AAA compliance validation using `@axe-core/playwright`, Pa11y, Google Lighthouse CI, screen reader verification (NVDA, VoiceOver), keyboard navigation audits, focus management, and color contrast compliance.
|
|
25
|
+
|
|
26
|
+
### Trigger Conditions
|
|
27
|
+
- Running automated accessibility test suites in CI/CD pipelines.
|
|
28
|
+
- Auditing web apps for WCAG 2.1 / 2.2 Level AA compliance and legal accessibility requirements (ADA, EAA).
|
|
29
|
+
- Debugging keyboard traps, missing ARIA labels, or broken screen reader navigation.
|
|
30
|
+
- Writing test cases for focus trapping in modals and custom dialogs.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
### Core Testing Workflows
|
|
35
|
+
|
|
36
|
+
#### 1. Automated A11y Testing with Playwright & Axe-Core
|
|
37
|
+
```typescript
|
|
38
|
+
import { test, expect } from '@playwright/test';
|
|
39
|
+
import AxeBuilder from '@axe-core/playwright';
|
|
40
|
+
|
|
41
|
+
test.describe('Accessibility Automated Audits', () => {
|
|
42
|
+
test('homepage should have zero critical or serious a11y violations', async ({ page }) => {
|
|
43
|
+
await page.goto('/');
|
|
44
|
+
|
|
45
|
+
const accessibilityScanResults = await new AxeBuilder({ page })
|
|
46
|
+
.withTags(['wcag2a', 'wcag2aa', 'wcag22aa'])
|
|
47
|
+
.disableRules(['color-contrast']) // If tested separately
|
|
48
|
+
.analyze();
|
|
49
|
+
|
|
50
|
+
expect(accessibilityScanResults.violations).toEqual([]);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test('modal dialog should trap focus and pass a11y audit', async ({ page }) => {
|
|
54
|
+
await page.goto('/dashboard');
|
|
55
|
+
await page.click('button#open-modal');
|
|
56
|
+
|
|
57
|
+
// Verify modal is open and focused
|
|
58
|
+
const modal = page.locator('[role="dialog"]');
|
|
59
|
+
await expect(modal).toBeVisible();
|
|
60
|
+
|
|
61
|
+
const modalAudit = await new AxeBuilder({ page })
|
|
62
|
+
.include('[role="dialog"]')
|
|
63
|
+
.analyze();
|
|
64
|
+
|
|
65
|
+
expect(modalAudit.violations).toEqual([]);
|
|
66
|
+
|
|
67
|
+
// Verify keyboard escape closes modal
|
|
68
|
+
await page.keyboard.press('Escape');
|
|
69
|
+
await expect(modal).toBeHidden();
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
#### 2. Automated Pa11y CI Configuration (`.pa11yci.json`)
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"defaults": {
|
|
78
|
+
"standard": "WCAG2AA",
|
|
79
|
+
"timeout": 15000,
|
|
80
|
+
"runners": ["axe", "htmlcs"],
|
|
81
|
+
"ignore": [
|
|
82
|
+
"WCAG2AA.Principle1.Guideline1_4.1_4_3.G18.Abs"
|
|
83
|
+
]
|
|
84
|
+
},
|
|
85
|
+
"urls": [
|
|
86
|
+
"http://localhost:3000/",
|
|
87
|
+
"http://localhost:3000/login",
|
|
88
|
+
"http://localhost:3000/pricing",
|
|
89
|
+
"http://localhost:3000/docs"
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
#### 3. Keyboard & Screen Reader Verification Checklist
|
|
95
|
+
- **Tab Navigation**: All interactive elements (`<button>`, `<a>`, `<input>`) can receive focus in logical reading order.
|
|
96
|
+
- **Focus Indicators**: Visible, high-contrast focus rings (`outline: 2px solid var(--focus-color)` with `outline-offset`).
|
|
97
|
+
- **No Keyboard Traps**: Focus can enter and leave components using only `Tab`, `Shift+Tab`, and `Esc`.
|
|
98
|
+
- **Landmarks**: Proper semantic tags (`<header>`, `<nav>`, `<main>`, `<footer>`, `<aside>`).
|
|
99
|
+
- **ARIA Attributes**: `aria-expanded`, `aria-controls`, `aria-haspopup`, and `aria-live` updated dynamically.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
<a name="bahasa-indonesia"></a>
|
|
104
|
+
## Bahasa Indonesia
|
|
105
|
+
|
|
106
|
+
### Integrasi Orkestrasi
|
|
107
|
+
- **`global-a11y-i18n-expert`**: Pedoman standar WCAG, pola ARIA, dan aksesibilitas internasional.
|
|
108
|
+
- **`e2e-testing-expert`**: Integrasi pengujian aksesibilitas otomatis ke pipeline Playwright CI.
|
|
109
|
+
- **`design-system-architect, senior-frontend`**: Validasi aksesibilitas komponen headless dan desain UI.
|
|
110
|
+
|
|
111
|
+
### Deskripsi
|
|
112
|
+
Panduan produksi untuk pengujian aksesibilitas web (a11y) otomatis dan manual. Memastikan kepatuhan terhadap standar WCAG 2.2 Level AA/AAA menggunakan `@axe-core/playwright`, Pa11y, Lighthouse CI, pengujian screen reader, navigasi keyboard, dan kontras warna.
|
|
113
|
+
|
|
114
|
+
### Kondisi Pemicu
|
|
115
|
+
- Menjalankan audit aksesibilitas otomatis di pipeline CI/CD.
|
|
116
|
+
- Memverifikasi kepatuhan hukum aksesibilitas (WCAG 2.2, ADA, EAA).
|
|
117
|
+
- Menguji alur keyboard dan pembaca layar (screen reader) pada komponen kompleks seperti modal dan dropdown.
|