claude-code-templates 1.21.13 → 1.22.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.
- package/README.md +79 -77
- package/{cli-tool/bin → bin}/create-claude-config.js +2 -0
- package/package.json +79 -21
- package/{cli-tool/src → src}/analytics-web/chats_mobile.html +17 -16
- package/{cli-tool/src → src}/console-bridge.js +3 -3
- package/{cli-tool/src → src}/index.js +130 -10
- package/src/plugin-dashboard-web/app.js +806 -0
- package/src/plugin-dashboard-web/index.html +292 -0
- package/src/plugin-dashboard-web/styles.css +1781 -0
- package/src/plugin-dashboard.js +689 -0
- package/src/security-audit.js +164 -0
- package/src/validation/ARCHITECTURE.md +309 -0
- package/src/validation/BaseValidator.js +152 -0
- package/src/validation/README.md +543 -0
- package/src/validation/ValidationOrchestrator.js +305 -0
- package/src/validation/validators/IntegrityValidator.js +338 -0
- package/src/validation/validators/ProvenanceValidator.js +399 -0
- package/src/validation/validators/ReferenceValidator.js +373 -0
- package/src/validation/validators/SemanticValidator.js +449 -0
- package/src/validation/validators/StructuralValidator.js +376 -0
- package/.claude/agents/agent-expert.md +0 -477
- package/.claude/agents/cli-ui-designer.md +0 -405
- package/.claude/agents/command-expert.md +0 -421
- package/.claude/agents/docusaurus-expert.md +0 -173
- package/.claude/agents/frontend-developer.md +0 -32
- package/.claude/agents/mcp-expert.md +0 -258
- package/.claude/commands/lint.md +0 -111
- package/.claude/commands/test.md +0 -73
- package/.claude/settings.local.json +0 -56
- package/.env.example +0 -26
- package/.github/WORKFLOWS_REFERENCE.md +0 -88
- package/.github/workflows/deploy-docusaurus.yml +0 -31
- package/.github/workflows/deploy.yml +0 -33
- package/.github/workflows/publish-package.yml +0 -125
- package/.mcp.json +0 -4
- package/AGENTS.md +0 -4
- package/CLAUDE.md +0 -482
- package/CLAUDE_JOBS_README.md +0 -148
- package/CODE_OF_CONDUCT.md +0 -82
- package/CONTRIBUTING.md +0 -505
- package/DEPLOYMENT.md +0 -60
- package/LICENSE +0 -21
- package/ROADMAP.md +0 -278
- package/SECURITY.md +0 -65
- package/api/index.html +0 -1
- package/api/package.json +0 -7
- package/api/track-download-supabase.js +0 -150
- package/cli-tool/Makefile +0 -102
- package/cli-tool/README.md +0 -126
- package/cli-tool/TESTING.md +0 -262
- package/cli-tool/components/agents/ai-specialists/ai-ethics-advisor.md +0 -195
- package/cli-tool/components/agents/ai-specialists/hackathon-ai-strategist.md +0 -46
- package/cli-tool/components/agents/ai-specialists/llms-maintainer.md +0 -94
- package/cli-tool/components/agents/ai-specialists/model-evaluator.md +0 -150
- package/cli-tool/components/agents/ai-specialists/prompt-engineer.md +0 -112
- package/cli-tool/components/agents/ai-specialists/search-specialist.md +0 -59
- package/cli-tool/components/agents/ai-specialists/task-decomposition-expert.md +0 -97
- package/cli-tool/components/agents/api-graphql/graphql-architect.md +0 -208
- package/cli-tool/components/agents/api-graphql/graphql-performance-optimizer.md +0 -357
- package/cli-tool/components/agents/api-graphql/graphql-security-specialist.md +0 -519
- package/cli-tool/components/agents/blockchain-web3/smart-contract-auditor.md +0 -32
- package/cli-tool/components/agents/blockchain-web3/smart-contract-specialist.md +0 -32
- package/cli-tool/components/agents/blockchain-web3/web3-integration-specialist.md +0 -32
- package/cli-tool/components/agents/business-marketing/business-analyst.md +0 -194
- package/cli-tool/components/agents/business-marketing/content-marketer.md +0 -36
- package/cli-tool/components/agents/business-marketing/customer-support.md +0 -36
- package/cli-tool/components/agents/business-marketing/legal-advisor.md +0 -50
- package/cli-tool/components/agents/business-marketing/marketing-attribution-analyst.md +0 -352
- package/cli-tool/components/agents/business-marketing/payment-integration.md +0 -33
- package/cli-tool/components/agents/business-marketing/product-strategist.md +0 -212
- package/cli-tool/components/agents/business-marketing/risk-manager.md +0 -42
- package/cli-tool/components/agents/business-marketing/sales-automator.md +0 -36
- package/cli-tool/components/agents/data-ai/ai-engineer.md +0 -33
- package/cli-tool/components/agents/data-ai/computer-vision-engineer.md +0 -562
- package/cli-tool/components/agents/data-ai/data-engineer.md +0 -33
- package/cli-tool/components/agents/data-ai/data-scientist.md +0 -337
- package/cli-tool/components/agents/data-ai/ml-engineer.md +0 -33
- package/cli-tool/components/agents/data-ai/mlops-engineer.md +0 -58
- package/cli-tool/components/agents/data-ai/nlp-engineer.md +0 -680
- package/cli-tool/components/agents/data-ai/quant-analyst.md +0 -33
- package/cli-tool/components/agents/database/database-admin.md +0 -33
- package/cli-tool/components/agents/database/database-architect.md +0 -590
- package/cli-tool/components/agents/database/database-optimization.md +0 -33
- package/cli-tool/components/agents/database/database-optimizer.md +0 -33
- package/cli-tool/components/agents/database/neon-auth-specialist.md +0 -175
- package/cli-tool/components/agents/database/neon-database-architect.md +0 -141
- package/cli-tool/components/agents/database/neon-expert.md +0 -846
- package/cli-tool/components/agents/database/nosql-specialist.md +0 -708
- package/cli-tool/components/agents/database/supabase-schema-architect.md +0 -138
- package/cli-tool/components/agents/deep-research-team/academic-researcher.md +0 -33
- package/cli-tool/components/agents/deep-research-team/agent-overview.md +0 -235
- package/cli-tool/components/agents/deep-research-team/competitive-intelligence-analyst.md +0 -530
- package/cli-tool/components/agents/deep-research-team/data-analyst.md +0 -112
- package/cli-tool/components/agents/deep-research-team/fact-checker.md +0 -553
- package/cli-tool/components/agents/deep-research-team/query-clarifier.md +0 -73
- package/cli-tool/components/agents/deep-research-team/report-generator.md +0 -108
- package/cli-tool/components/agents/deep-research-team/research-brief-generator.md +0 -108
- package/cli-tool/components/agents/deep-research-team/research-coordinator.md +0 -94
- package/cli-tool/components/agents/deep-research-team/research-orchestrator.md +0 -119
- package/cli-tool/components/agents/deep-research-team/research-synthesizer.md +0 -109
- package/cli-tool/components/agents/deep-research-team/technical-researcher.md +0 -95
- package/cli-tool/components/agents/development-team/backend-architect.md +0 -31
- package/cli-tool/components/agents/development-team/cli-ui-designer.md +0 -405
- package/cli-tool/components/agents/development-team/devops-engineer.md +0 -886
- package/cli-tool/components/agents/development-team/frontend-developer.md +0 -32
- package/cli-tool/components/agents/development-team/fullstack-developer.md +0 -1205
- package/cli-tool/components/agents/development-team/ios-developer.md +0 -36
- package/cli-tool/components/agents/development-team/mobile-developer.md +0 -33
- package/cli-tool/components/agents/development-team/ui-ux-designer.md +0 -36
- package/cli-tool/components/agents/development-tools/code-reviewer.md +0 -30
- package/cli-tool/components/agents/development-tools/command-expert.md +0 -422
- package/cli-tool/components/agents/development-tools/context-manager.md +0 -65
- package/cli-tool/components/agents/development-tools/debugger.md +0 -31
- package/cli-tool/components/agents/development-tools/dx-optimizer.md +0 -64
- package/cli-tool/components/agents/development-tools/error-detective.md +0 -33
- package/cli-tool/components/agents/development-tools/mcp-expert.md +0 -259
- package/cli-tool/components/agents/development-tools/performance-profiler.md +0 -799
- package/cli-tool/components/agents/development-tools/test-engineer.md +0 -936
- package/cli-tool/components/agents/devops-infrastructure/cloud-architect.md +0 -33
- package/cli-tool/components/agents/devops-infrastructure/deployment-engineer.md +0 -33
- package/cli-tool/components/agents/devops-infrastructure/devops-troubleshooter.md +0 -33
- package/cli-tool/components/agents/devops-infrastructure/monitoring-specialist.md +0 -36
- package/cli-tool/components/agents/devops-infrastructure/network-engineer.md +0 -33
- package/cli-tool/components/agents/devops-infrastructure/security-engineer.md +0 -971
- package/cli-tool/components/agents/devops-infrastructure/terraform-specialist.md +0 -36
- package/cli-tool/components/agents/devops-infrastructure/vercel-deployment-specialist.md +0 -357
- package/cli-tool/components/agents/documentation/api-documenter.md +0 -33
- package/cli-tool/components/agents/documentation/changelog-generator.md +0 -37
- package/cli-tool/components/agents/documentation/docusaurus-expert.md +0 -175
- package/cli-tool/components/agents/documentation/technical-writer.md +0 -37
- package/cli-tool/components/agents/expert-advisors/agent-expert.md +0 -491
- package/cli-tool/components/agents/expert-advisors/architect-review.md +0 -50
- package/cli-tool/components/agents/expert-advisors/dependency-manager.md +0 -45
- package/cli-tool/components/agents/expert-advisors/documentation-expert.md +0 -47
- package/cli-tool/components/agents/ffmpeg-clip-team/audio-mixer.md +0 -37
- package/cli-tool/components/agents/ffmpeg-clip-team/audio-quality-controller.md +0 -100
- package/cli-tool/components/agents/ffmpeg-clip-team/podcast-content-analyzer.md +0 -60
- package/cli-tool/components/agents/ffmpeg-clip-team/podcast-metadata-specialist.md +0 -46
- package/cli-tool/components/agents/ffmpeg-clip-team/podcast-transcriber.md +0 -68
- package/cli-tool/components/agents/ffmpeg-clip-team/social-media-clip-creator.md +0 -69
- package/cli-tool/components/agents/ffmpeg-clip-team/timestamp-precision-specialist.md +0 -98
- package/cli-tool/components/agents/ffmpeg-clip-team/video-editor.md +0 -37
- package/cli-tool/components/agents/game-development/3d-artist.md +0 -37
- package/cli-tool/components/agents/game-development/game-designer.md +0 -37
- package/cli-tool/components/agents/game-development/unity-game-developer.md +0 -110
- package/cli-tool/components/agents/game-development/unreal-engine-developer.md +0 -128
- package/cli-tool/components/agents/git/git-flow-manager.md +0 -329
- package/cli-tool/components/agents/mcp-dev-team/mcp-deployment-orchestrator.md +0 -101
- package/cli-tool/components/agents/mcp-dev-team/mcp-integration-engineer.md +0 -37
- package/cli-tool/components/agents/mcp-dev-team/mcp-protocol-specialist.md +0 -37
- package/cli-tool/components/agents/mcp-dev-team/mcp-registry-navigator.md +0 -112
- package/cli-tool/components/agents/mcp-dev-team/mcp-security-auditor.md +0 -70
- package/cli-tool/components/agents/mcp-dev-team/mcp-server-architect.md +0 -74
- package/cli-tool/components/agents/mcp-dev-team/mcp-testing-engineer.md +0 -106
- package/cli-tool/components/agents/modernization/architecture-modernizer.md +0 -37
- package/cli-tool/components/agents/modernization/cloud-migration-specialist.md +0 -37
- package/cli-tool/components/agents/modernization/legacy-modernizer.md +0 -33
- package/cli-tool/components/agents/obsidian-ops-team/Scripts/daily_notes_connector.py +0 -306
- package/cli-tool/components/agents/obsidian-ops-team/Scripts/enhance_tag_standardizer.py +0 -343
- package/cli-tool/components/agents/obsidian-ops-team/Scripts/find_keyword_connections.py +0 -216
- package/cli-tool/components/agents/obsidian-ops-team/Scripts/fix_quoted_tags.py +0 -82
- package/cli-tool/components/agents/obsidian-ops-team/Scripts/implement_entity_connections.py +0 -195
- package/cli-tool/components/agents/obsidian-ops-team/Scripts/link_suggester.py +0 -301
- package/cli-tool/components/agents/obsidian-ops-team/Scripts/metadata_adder.py +0 -197
- package/cli-tool/components/agents/obsidian-ops-team/Scripts/moc_generator.py +0 -296
- package/cli-tool/components/agents/obsidian-ops-team/Scripts/parse_keyword_connections.py +0 -122
- package/cli-tool/components/agents/obsidian-ops-team/Scripts/tag_standardizer.py +0 -387
- package/cli-tool/components/agents/obsidian-ops-team/connection-agent.md +0 -67
- package/cli-tool/components/agents/obsidian-ops-team/content-curator.md +0 -81
- package/cli-tool/components/agents/obsidian-ops-team/metadata-agent.md +0 -51
- package/cli-tool/components/agents/obsidian-ops-team/moc-agent.md +0 -112
- package/cli-tool/components/agents/obsidian-ops-team/review-agent.md +0 -94
- package/cli-tool/components/agents/obsidian-ops-team/tag-agent.md +0 -92
- package/cli-tool/components/agents/obsidian-ops-team/vault-optimizer.md +0 -76
- package/cli-tool/components/agents/ocr-extraction-team/document-structure-analyzer.md +0 -37
- package/cli-tool/components/agents/ocr-extraction-team/markdown-syntax-formatter.md +0 -58
- package/cli-tool/components/agents/ocr-extraction-team/ocr-grammar-fixer.md +0 -36
- package/cli-tool/components/agents/ocr-extraction-team/ocr-preprocessing-optimizer.md +0 -37
- package/cli-tool/components/agents/ocr-extraction-team/ocr-quality-assurance.md +0 -62
- package/cli-tool/components/agents/ocr-extraction-team/text-comparison-validator.md +0 -60
- package/cli-tool/components/agents/ocr-extraction-team/visual-analysis-ocr.md +0 -52
- package/cli-tool/components/agents/performance-testing/load-testing-specialist.md +0 -37
- package/cli-tool/components/agents/performance-testing/performance-engineer.md +0 -33
- package/cli-tool/components/agents/performance-testing/react-performance-optimization.md +0 -65
- package/cli-tool/components/agents/performance-testing/test-automator.md +0 -33
- package/cli-tool/components/agents/performance-testing/web-vitals-optimizer.md +0 -37
- package/cli-tool/components/agents/podcast-creator-team/academic-research-synthesizer.md +0 -61
- package/cli-tool/components/agents/podcast-creator-team/comprehensive-researcher.md +0 -49
- package/cli-tool/components/agents/podcast-creator-team/episode-orchestrator.md +0 -52
- package/cli-tool/components/agents/podcast-creator-team/guest-outreach-coordinator.md +0 -37
- package/cli-tool/components/agents/podcast-creator-team/market-research-analyst.md +0 -54
- package/cli-tool/components/agents/podcast-creator-team/podcast-editor.md +0 -37
- package/cli-tool/components/agents/podcast-creator-team/podcast-trend-scout.md +0 -60
- package/cli-tool/components/agents/podcast-creator-team/project-supervisor-orchestrator.md +0 -48
- package/cli-tool/components/agents/podcast-creator-team/seo-podcast-optimizer.md +0 -58
- package/cli-tool/components/agents/podcast-creator-team/social-media-copywriter.md +0 -57
- package/cli-tool/components/agents/podcast-creator-team/twitter-ai-influencer-manager.md +0 -62
- package/cli-tool/components/agents/programming-languages/c-pro.md +0 -36
- package/cli-tool/components/agents/programming-languages/c-sharp-pro.md +0 -40
- package/cli-tool/components/agents/programming-languages/cpp-pro.md +0 -39
- package/cli-tool/components/agents/programming-languages/golang-pro.md +0 -33
- package/cli-tool/components/agents/programming-languages/javascript-pro.md +0 -36
- package/cli-tool/components/agents/programming-languages/php-pro.md +0 -44
- package/cli-tool/components/agents/programming-languages/python-pro.md +0 -33
- package/cli-tool/components/agents/programming-languages/rust-pro.md +0 -36
- package/cli-tool/components/agents/programming-languages/shell-scripting-pro.md +0 -38
- package/cli-tool/components/agents/programming-languages/sql-pro.md +0 -36
- package/cli-tool/components/agents/programming-languages/typescript-pro.md +0 -38
- package/cli-tool/components/agents/realtime/supabase-realtime-optimizer.md +0 -193
- package/cli-tool/components/agents/security/api-security-audit.md +0 -93
- package/cli-tool/components/agents/security/compliance-specialist.md +0 -37
- package/cli-tool/components/agents/security/incident-responder.md +0 -75
- package/cli-tool/components/agents/security/penetration-tester.md +0 -37
- package/cli-tool/components/agents/security/security-auditor.md +0 -33
- package/cli-tool/components/agents/web-tools/nextjs-architecture-expert.md +0 -194
- package/cli-tool/components/agents/web-tools/react-performance-optimizer.md +0 -425
- package/cli-tool/components/agents/web-tools/seo-analyzer.md +0 -37
- package/cli-tool/components/agents/web-tools/url-context-validator.md +0 -61
- package/cli-tool/components/agents/web-tools/url-link-extractor.md +0 -59
- package/cli-tool/components/agents/web-tools/web-accessibility-checker.md +0 -37
- package/cli-tool/components/commands/automation/act.md +0 -57
- package/cli-tool/components/commands/automation/ci-pipeline.md +0 -378
- package/cli-tool/components/commands/automation/husky.md +0 -130
- package/cli-tool/components/commands/automation/workflow-orchestrator.md +0 -576
- package/cli-tool/components/commands/database/supabase-backup-manager.md +0 -37
- package/cli-tool/components/commands/database/supabase-data-explorer.md +0 -37
- package/cli-tool/components/commands/database/supabase-migration-assistant.md +0 -37
- package/cli-tool/components/commands/database/supabase-performance-optimizer.md +0 -37
- package/cli-tool/components/commands/database/supabase-realtime-monitor.md +0 -37
- package/cli-tool/components/commands/database/supabase-schema-sync.md +0 -37
- package/cli-tool/components/commands/database/supabase-security-audit.md +0 -37
- package/cli-tool/components/commands/database/supabase-type-generator.md +0 -37
- package/cli-tool/components/commands/deployment/add-changelog.md +0 -92
- package/cli-tool/components/commands/deployment/blue-green-deployment.md +0 -824
- package/cli-tool/components/commands/deployment/changelog-demo-command.md +0 -43
- package/cli-tool/components/commands/deployment/ci-setup.md +0 -323
- package/cli-tool/components/commands/deployment/containerize-application.md +0 -93
- package/cli-tool/components/commands/deployment/deployment-monitoring.md +0 -1228
- package/cli-tool/components/commands/deployment/hotfix-deploy.md +0 -283
- package/cli-tool/components/commands/deployment/prepare-release.md +0 -357
- package/cli-tool/components/commands/deployment/rollback-deploy.md +0 -145
- package/cli-tool/components/commands/deployment/setup-automated-releases.md +0 -143
- package/cli-tool/components/commands/deployment/setup-kubernetes-deployment.md +0 -93
- package/cli-tool/components/commands/documentation/create-architecture-documentation.md +0 -95
- package/cli-tool/components/commands/documentation/create-onboarding-guide.md +0 -93
- package/cli-tool/components/commands/documentation/doc-api.md +0 -242
- package/cli-tool/components/commands/documentation/docs-maintenance.md +0 -119
- package/cli-tool/components/commands/documentation/generate-api-documentation.md +0 -97
- package/cli-tool/components/commands/documentation/interactive-documentation.md +0 -133
- package/cli-tool/components/commands/documentation/load-llms-txt.md +0 -39
- package/cli-tool/components/commands/documentation/migration-guide.md +0 -250
- package/cli-tool/components/commands/documentation/troubleshooting-guide.md +0 -370
- package/cli-tool/components/commands/documentation/update-docs.md +0 -107
- package/cli-tool/components/commands/game-development/game-analytics-integration.md +0 -128
- package/cli-tool/components/commands/game-development/game-asset-pipeline.md +0 -108
- package/cli-tool/components/commands/game-development/game-performance-profiler.md +0 -78
- package/cli-tool/components/commands/game-development/game-testing-framework.md +0 -112
- package/cli-tool/components/commands/game-development/unity-project-setup.md +0 -190
- package/cli-tool/components/commands/git/feature.md +0 -196
- package/cli-tool/components/commands/git/finish.md +0 -528
- package/cli-tool/components/commands/git/flow-status.md +0 -438
- package/cli-tool/components/commands/git/hotfix.md +0 -456
- package/cli-tool/components/commands/git/release.md +0 -381
- package/cli-tool/components/commands/git-workflow/branch-cleanup.md +0 -181
- package/cli-tool/components/commands/git-workflow/commit.md +0 -167
- package/cli-tool/components/commands/git-workflow/create-pr.md +0 -19
- package/cli-tool/components/commands/git-workflow/create-pull-request.md +0 -126
- package/cli-tool/components/commands/git-workflow/create-worktrees.md +0 -174
- package/cli-tool/components/commands/git-workflow/fix-github-issue.md +0 -13
- package/cli-tool/components/commands/git-workflow/git-bisect-helper.md +0 -261
- package/cli-tool/components/commands/git-workflow/pr-review.md +0 -76
- package/cli-tool/components/commands/git-workflow/update-branch-name.md +0 -9
- package/cli-tool/components/commands/nextjs-vercel/nextjs-api-tester.md +0 -480
- package/cli-tool/components/commands/nextjs-vercel/nextjs-bundle-analyzer.md +0 -406
- package/cli-tool/components/commands/nextjs-vercel/nextjs-component-generator.md +0 -489
- package/cli-tool/components/commands/nextjs-vercel/nextjs-middleware-creator.md +0 -712
- package/cli-tool/components/commands/nextjs-vercel/nextjs-migration-helper.md +0 -778
- package/cli-tool/components/commands/nextjs-vercel/nextjs-performance-audit.md +0 -653
- package/cli-tool/components/commands/nextjs-vercel/nextjs-scaffold.md +0 -237
- package/cli-tool/components/commands/nextjs-vercel/vercel-deploy-optimize.md +0 -341
- package/cli-tool/components/commands/nextjs-vercel/vercel-edge-function.md +0 -810
- package/cli-tool/components/commands/nextjs-vercel/vercel-env-sync.md +0 -666
- package/cli-tool/components/commands/orchestration/archive.md +0 -414
- package/cli-tool/components/commands/orchestration/commit.md +0 -305
- package/cli-tool/components/commands/orchestration/find.md +0 -272
- package/cli-tool/components/commands/orchestration/log.md +0 -355
- package/cli-tool/components/commands/orchestration/move.md +0 -220
- package/cli-tool/components/commands/orchestration/optimize.md +0 -375
- package/cli-tool/components/commands/orchestration/remove.md +0 -301
- package/cli-tool/components/commands/orchestration/report.md +0 -292
- package/cli-tool/components/commands/orchestration/resume.md +0 -256
- package/cli-tool/components/commands/orchestration/start.md +0 -169
- package/cli-tool/components/commands/orchestration/status.md +0 -219
- package/cli-tool/components/commands/orchestration/sync.md +0 -294
- package/cli-tool/components/commands/performance/add-performance-monitoring.md +0 -84
- package/cli-tool/components/commands/performance/implement-caching-strategy.md +0 -84
- package/cli-tool/components/commands/performance/optimize-api-performance.md +0 -119
- package/cli-tool/components/commands/performance/optimize-build.md +0 -139
- package/cli-tool/components/commands/performance/optimize-bundle-size.md +0 -84
- package/cli-tool/components/commands/performance/optimize-database-performance.md +0 -84
- package/cli-tool/components/commands/performance/optimize-memory-usage.md +0 -91
- package/cli-tool/components/commands/performance/performance-audit.md +0 -89
- package/cli-tool/components/commands/performance/setup-cdn-optimization.md +0 -84
- package/cli-tool/components/commands/performance/system-behavior-simulator.md +0 -415
- package/cli-tool/components/commands/project-management/add-package.md +0 -90
- package/cli-tool/components/commands/project-management/add-to-changelog.md +0 -37
- package/cli-tool/components/commands/project-management/create-feature.md +0 -130
- package/cli-tool/components/commands/project-management/create-jtbd.md +0 -37
- package/cli-tool/components/commands/project-management/create-prd.md +0 -36
- package/cli-tool/components/commands/project-management/create-prp.md +0 -37
- package/cli-tool/components/commands/project-management/init-project.md +0 -80
- package/cli-tool/components/commands/project-management/milestone-tracker.md +0 -44
- package/cli-tool/components/commands/project-management/pac-configure.md +0 -32
- package/cli-tool/components/commands/project-management/pac-create-epic.md +0 -41
- package/cli-tool/components/commands/project-management/pac-create-ticket.md +0 -42
- package/cli-tool/components/commands/project-management/pac-update-status.md +0 -39
- package/cli-tool/components/commands/project-management/pac-validate.md +0 -35
- package/cli-tool/components/commands/project-management/project-health-check.md +0 -58
- package/cli-tool/components/commands/project-management/project-timeline-simulator.md +0 -37
- package/cli-tool/components/commands/project-management/project-to-linear.md +0 -38
- package/cli-tool/components/commands/project-management/release.md +0 -31
- package/cli-tool/components/commands/project-management/todo.md +0 -62
- package/cli-tool/components/commands/security/add-authentication-system.md +0 -34
- package/cli-tool/components/commands/security/dependency-audit.md +0 -32
- package/cli-tool/components/commands/security/penetration-test.md +0 -40
- package/cli-tool/components/commands/security/secrets-scanner.md +0 -39
- package/cli-tool/components/commands/security/security-audit.md +0 -82
- package/cli-tool/components/commands/security/security-hardening.md +0 -33
- package/cli-tool/components/commands/setup/create-database-migrations.md +0 -35
- package/cli-tool/components/commands/setup/design-database-schema.md +0 -37
- package/cli-tool/components/commands/setup/design-rest-api.md +0 -37
- package/cli-tool/components/commands/setup/implement-graphql-api.md +0 -37
- package/cli-tool/components/commands/setup/migrate-to-typescript.md +0 -37
- package/cli-tool/components/commands/setup/setup-ci-cd-pipeline.md +0 -37
- package/cli-tool/components/commands/setup/setup-development-environment.md +0 -37
- package/cli-tool/components/commands/setup/setup-docker-containers.md +0 -37
- package/cli-tool/components/commands/setup/setup-formatting.md +0 -37
- package/cli-tool/components/commands/setup/setup-linting.md +0 -37
- package/cli-tool/components/commands/setup/setup-monitoring-observability.md +0 -37
- package/cli-tool/components/commands/setup/setup-monorepo.md +0 -37
- package/cli-tool/components/commands/setup/setup-rate-limiting.md +0 -37
- package/cli-tool/components/commands/setup/update-dependencies.md +0 -35
- package/cli-tool/components/commands/simulation/business-scenario-explorer.md +0 -37
- package/cli-tool/components/commands/simulation/constraint-modeler.md +0 -37
- package/cli-tool/components/commands/simulation/decision-tree-explorer.md +0 -37
- package/cli-tool/components/commands/simulation/digital-twin-creator.md +0 -37
- package/cli-tool/components/commands/simulation/future-scenario-generator.md +0 -37
- package/cli-tool/components/commands/simulation/market-response-modeler.md +0 -37
- package/cli-tool/components/commands/simulation/monte-carlo-simulator.md +0 -37
- package/cli-tool/components/commands/simulation/simulation-calibrator.md +0 -37
- package/cli-tool/components/commands/simulation/system-dynamics-modeler.md +0 -37
- package/cli-tool/components/commands/simulation/timeline-compressor.md +0 -37
- package/cli-tool/components/commands/svelte/svelte:a11y.md +0 -105
- package/cli-tool/components/commands/svelte/svelte:component.md +0 -81
- package/cli-tool/components/commands/svelte/svelte:debug.md +0 -48
- package/cli-tool/components/commands/svelte/svelte:migrate.md +0 -79
- package/cli-tool/components/commands/svelte/svelte:optimize.md +0 -99
- package/cli-tool/components/commands/svelte/svelte:scaffold.md +0 -89
- package/cli-tool/components/commands/svelte/svelte:storybook-migrate.md +0 -204
- package/cli-tool/components/commands/svelte/svelte:storybook-mock.md +0 -213
- package/cli-tool/components/commands/svelte/svelte:storybook-setup.md +0 -113
- package/cli-tool/components/commands/svelte/svelte:storybook-story.md +0 -145
- package/cli-tool/components/commands/svelte/svelte:storybook-troubleshoot.md +0 -191
- package/cli-tool/components/commands/svelte/svelte:storybook.md +0 -48
- package/cli-tool/components/commands/svelte/svelte:test-coverage.md +0 -77
- package/cli-tool/components/commands/svelte/svelte:test-fix.md +0 -74
- package/cli-tool/components/commands/svelte/svelte:test-setup.md +0 -85
- package/cli-tool/components/commands/svelte/svelte:test.md +0 -60
- package/cli-tool/components/commands/sync/bidirectional-sync.md +0 -37
- package/cli-tool/components/commands/sync/bulk-import-issues.md +0 -37
- package/cli-tool/components/commands/sync/cross-reference-manager.md +0 -37
- package/cli-tool/components/commands/sync/issue-to-linear-task.md +0 -37
- package/cli-tool/components/commands/sync/linear-task-to-issue.md +0 -37
- package/cli-tool/components/commands/sync/sync-automation-setup.md +0 -37
- package/cli-tool/components/commands/sync/sync-conflict-resolver.md +0 -37
- package/cli-tool/components/commands/sync/sync-health-monitor.md +0 -37
- package/cli-tool/components/commands/sync/sync-issues-to-linear.md +0 -37
- package/cli-tool/components/commands/sync/sync-linear-to-issues.md +0 -37
- package/cli-tool/components/commands/sync/sync-migration-assistant.md +0 -37
- package/cli-tool/components/commands/sync/sync-pr-to-task.md +0 -37
- package/cli-tool/components/commands/sync/sync-status.md +0 -391
- package/cli-tool/components/commands/sync/task-from-pr.md +0 -37
- package/cli-tool/components/commands/team/architecture-review.md +0 -37
- package/cli-tool/components/commands/team/decision-quality-analyzer.md +0 -37
- package/cli-tool/components/commands/team/dependency-mapper.md +0 -37
- package/cli-tool/components/commands/team/estimate-assistant.md +0 -37
- package/cli-tool/components/commands/team/issue-triage.md +0 -37
- package/cli-tool/components/commands/team/memory-spring-cleaning.md +0 -37
- package/cli-tool/components/commands/team/migration-assistant.md +0 -37
- package/cli-tool/components/commands/team/retrospective-analyzer.md +0 -37
- package/cli-tool/components/commands/team/session-learning-capture.md +0 -37
- package/cli-tool/components/commands/team/sprint-planning.md +0 -189
- package/cli-tool/components/commands/team/standup-report.md +0 -37
- package/cli-tool/components/commands/team/team-knowledge-mapper.md +0 -37
- package/cli-tool/components/commands/team/team-velocity-tracker.md +0 -37
- package/cli-tool/components/commands/team/team-workload-balancer.md +0 -37
- package/cli-tool/components/commands/testing/add-mutation-testing.md +0 -37
- package/cli-tool/components/commands/testing/add-property-based-testing.md +0 -37
- package/cli-tool/components/commands/testing/e2e-setup.md +0 -37
- package/cli-tool/components/commands/testing/generate-test-cases.md +0 -37
- package/cli-tool/components/commands/testing/generate-tests.md +0 -82
- package/cli-tool/components/commands/testing/setup-comprehensive-testing.md +0 -37
- package/cli-tool/components/commands/testing/setup-load-testing.md +0 -37
- package/cli-tool/components/commands/testing/setup-visual-testing.md +0 -37
- package/cli-tool/components/commands/testing/test-automation-orchestrator.md +0 -37
- package/cli-tool/components/commands/testing/test-changelog-automation.md +0 -37
- package/cli-tool/components/commands/testing/test-coverage.md +0 -37
- package/cli-tool/components/commands/testing/test-quality-analyzer.md +0 -37
- package/cli-tool/components/commands/testing/testing_plan_integration.md +0 -37
- package/cli-tool/components/commands/testing/write-tests.md +0 -37
- package/cli-tool/components/commands/utilities/all-tools.md +0 -31
- package/cli-tool/components/commands/utilities/architecture-scenario-explorer.md +0 -375
- package/cli-tool/components/commands/utilities/check-file.md +0 -53
- package/cli-tool/components/commands/utilities/clean-branches.md +0 -243
- package/cli-tool/components/commands/utilities/clean.md +0 -1
- package/cli-tool/components/commands/utilities/code-permutation-tester.md +0 -341
- package/cli-tool/components/commands/utilities/code-review.md +0 -70
- package/cli-tool/components/commands/utilities/code-to-task.md +0 -583
- package/cli-tool/components/commands/utilities/context-prime.md +0 -1
- package/cli-tool/components/commands/utilities/debug-error.md +0 -121
- package/cli-tool/components/commands/utilities/directory-deep-dive.md +0 -34
- package/cli-tool/components/commands/utilities/explain-code.md +0 -194
- package/cli-tool/components/commands/utilities/fix-issue.md +0 -85
- package/cli-tool/components/commands/utilities/generate-linear-worklog.md +0 -113
- package/cli-tool/components/commands/utilities/git-status.md +0 -39
- package/cli-tool/components/commands/utilities/initref.md +0 -3
- package/cli-tool/components/commands/utilities/prime.md +0 -41
- package/cli-tool/components/commands/utilities/refactor-code.md +0 -116
- package/cli-tool/components/commands/utilities/ultra-think.md +0 -153
- package/cli-tool/components/hooks/HOOK_PATTERNS_COMPRESSED.json +0 -1
- package/cli-tool/components/hooks/automation/agents-md-loader.json +0 -17
- package/cli-tool/components/hooks/automation/build-on-change.json +0 -16
- package/cli-tool/components/hooks/automation/dependency-checker.json +0 -16
- package/cli-tool/components/hooks/automation/deployment-health-monitor.json +0 -29
- package/cli-tool/components/hooks/automation/discord-detailed-notifications.json +0 -26
- package/cli-tool/components/hooks/automation/discord-error-notifications.json +0 -37
- package/cli-tool/components/hooks/automation/discord-notifications.json +0 -25
- package/cli-tool/components/hooks/automation/simple-notifications.json +0 -16
- package/cli-tool/components/hooks/automation/slack-detailed-notifications.json +0 -26
- package/cli-tool/components/hooks/automation/slack-error-notifications.json +0 -37
- package/cli-tool/components/hooks/automation/slack-notifications.json +0 -25
- package/cli-tool/components/hooks/automation/telegram-detailed-notifications.json +0 -26
- package/cli-tool/components/hooks/automation/telegram-error-notifications.json +0 -37
- package/cli-tool/components/hooks/automation/telegram-notifications.json +0 -25
- package/cli-tool/components/hooks/automation/vercel-auto-deploy.json +0 -17
- package/cli-tool/components/hooks/automation/vercel-environment-sync.json +0 -29
- package/cli-tool/components/hooks/development-tools/change-tracker.json +0 -25
- package/cli-tool/components/hooks/development-tools/command-logger.json +0 -16
- package/cli-tool/components/hooks/development-tools/file-backup.json +0 -16
- package/cli-tool/components/hooks/development-tools/lint-on-save.json +0 -16
- package/cli-tool/components/hooks/development-tools/nextjs-code-quality-enforcer.json +0 -17
- package/cli-tool/components/hooks/development-tools/smart-formatting.json +0 -16
- package/cli-tool/components/hooks/git/conventional-commits.json +0 -16
- package/cli-tool/components/hooks/git/conventional-commits.py +0 -84
- package/cli-tool/components/hooks/git/prevent-direct-push.json +0 -16
- package/cli-tool/components/hooks/git/prevent-direct-push.py +0 -86
- package/cli-tool/components/hooks/git/validate-branch-name.json +0 -16
- package/cli-tool/components/hooks/git/validate-branch-name.py +0 -96
- package/cli-tool/components/hooks/git-workflow/auto-git-add.json +0 -16
- package/cli-tool/components/hooks/git-workflow/smart-commit.json +0 -25
- package/cli-tool/components/hooks/performance/performance-budget-guard.json +0 -27
- package/cli-tool/components/hooks/performance/performance-monitor.json +0 -27
- package/cli-tool/components/hooks/post-tool/format-javascript-files.json +0 -16
- package/cli-tool/components/hooks/post-tool/format-python-files.json +0 -16
- package/cli-tool/components/hooks/post-tool/git-add-changes.json +0 -25
- package/cli-tool/components/hooks/post-tool/run-tests-after-changes.json +0 -16
- package/cli-tool/components/hooks/pre-tool/backup-before-edit.json +0 -16
- package/cli-tool/components/hooks/pre-tool/notify-before-bash.json +0 -16
- package/cli-tool/components/hooks/pre-tool/update-search-year.json +0 -17
- package/cli-tool/components/hooks/security/file-protection.json +0 -16
- package/cli-tool/components/hooks/security/security-scanner.json +0 -16
- package/cli-tool/components/hooks/testing/test-runner.json +0 -16
- package/cli-tool/components/mcps/browser_automation/browser-use-mcp-server.json +0 -20
- package/cli-tool/components/mcps/browser_automation/browsermcp.json +0 -9
- package/cli-tool/components/mcps/browser_automation/mcp-server-browserbase.json +0 -14
- package/cli-tool/components/mcps/browser_automation/mcp-server-playwright.json +0 -9
- package/cli-tool/components/mcps/browser_automation/playwright-mcp-server.json +0 -9
- package/cli-tool/components/mcps/browser_automation/playwright-mcp.json +0 -11
- package/cli-tool/components/mcps/database/mysql-integration.json +0 -12
- package/cli-tool/components/mcps/database/neon.json +0 -9
- package/cli-tool/components/mcps/database/postgresql-integration.json +0 -12
- package/cli-tool/components/mcps/database/supabase.json +0 -17
- package/cli-tool/components/mcps/deepgraph/deepgraph-nextjs.json +0 -13
- package/cli-tool/components/mcps/deepgraph/deepgraph-react.json +0 -13
- package/cli-tool/components/mcps/deepgraph/deepgraph-typescript.json +0 -13
- package/cli-tool/components/mcps/deepgraph/deepgraph-vue.json +0 -13
- package/cli-tool/components/mcps/devtools/azure-kubernetes-service.json +0 -11
- package/cli-tool/components/mcps/devtools/box.json +0 -14
- package/cli-tool/components/mcps/devtools/circleci.json +0 -13
- package/cli-tool/components/mcps/devtools/codacy.json +0 -12
- package/cli-tool/components/mcps/devtools/context7.json +0 -9
- package/cli-tool/components/mcps/devtools/dynatrace.json +0 -13
- package/cli-tool/components/mcps/devtools/elasticsearch.json +0 -18
- package/cli-tool/components/mcps/devtools/figma-dev-mode.json +0 -8
- package/cli-tool/components/mcps/devtools/firecrawl.json +0 -12
- package/cli-tool/components/mcps/devtools/firefly-mcp.json +0 -13
- package/cli-tool/components/mcps/devtools/huggingface.json +0 -11
- package/cli-tool/components/mcps/devtools/imagesorcery.json +0 -11
- package/cli-tool/components/mcps/devtools/ios-simulator-mcp.json +0 -9
- package/cli-tool/components/mcps/devtools/jfrog.json +0 -8
- package/cli-tool/components/mcps/devtools/just-mcp.json +0 -9
- package/cli-tool/components/mcps/devtools/launchdarkly.json +0 -12
- package/cli-tool/components/mcps/devtools/leetcode.json +0 -8
- package/cli-tool/components/mcps/devtools/logfire.json +0 -9
- package/cli-tool/components/mcps/devtools/markitdown.json +0 -14
- package/cli-tool/components/mcps/devtools/mcp-server-atlassian-bitbucket.json +0 -9
- package/cli-tool/components/mcps/devtools/mcp-server-trello.json +0 -12
- package/cli-tool/components/mcps/devtools/microsoft-clarity.json +0 -11
- package/cli-tool/components/mcps/devtools/microsoft-dev-box.json +0 -9
- package/cli-tool/components/mcps/devtools/mongodb.json +0 -12
- package/cli-tool/components/mcps/devtools/postman.json +0 -12
- package/cli-tool/components/mcps/devtools/sentry.json +0 -8
- package/cli-tool/components/mcps/devtools/serena.json +0 -9
- package/cli-tool/components/mcps/devtools/stripe.json +0 -12
- package/cli-tool/components/mcps/devtools/terraform.json +0 -14
- package/cli-tool/components/mcps/devtools/webflow.json +0 -8
- package/cli-tool/components/mcps/filesystem/filesystem-access.json +0 -13
- package/cli-tool/components/mcps/integration/github-integration.json +0 -12
- package/cli-tool/components/mcps/integration/memory-integration.json +0 -9
- package/cli-tool/components/mcps/marketing/facebook-ads-mcp-server.json +0 -13
- package/cli-tool/components/mcps/marketing/google-ads-mcp-server.json +0 -11
- package/cli-tool/components/mcps/productivity/monday.json +0 -14
- package/cli-tool/components/mcps/productivity/notion.json +0 -12
- package/cli-tool/components/mcps/web/web-fetch.json +0 -9
- package/cli-tool/components/settings/api/bedrock-configuration.json +0 -7
- package/cli-tool/components/settings/api/corporate-proxy.json +0 -7
- package/cli-tool/components/settings/api/custom-headers.json +0 -6
- package/cli-tool/components/settings/api/vertex-configuration.json +0 -17
- package/cli-tool/components/settings/authentication/api-key-helper.json +0 -7
- package/cli-tool/components/settings/authentication/force-claudeai-login.json +0 -4
- package/cli-tool/components/settings/authentication/force-console-login.json +0 -4
- package/cli-tool/components/settings/cleanup/retention-7-days.json +0 -4
- package/cli-tool/components/settings/cleanup/retention-90-days.json +0 -4
- package/cli-tool/components/settings/environment/bash-timeouts.json +0 -8
- package/cli-tool/components/settings/environment/development-utils.json +0 -8
- package/cli-tool/components/settings/environment/performance-optimization.json +0 -8
- package/cli-tool/components/settings/environment/privacy-focused.json +0 -10
- package/cli-tool/components/settings/git/git-flow-settings.json +0 -79
- package/cli-tool/components/settings/global/aws-credentials.json +0 -5
- package/cli-tool/components/settings/global/custom-model.json +0 -7
- package/cli-tool/components/settings/global/git-commit-settings.json +0 -4
- package/cli-tool/components/settings/mcp/disable-risky-servers.json +0 -8
- package/cli-tool/components/settings/mcp/enable-all-project-servers.json +0 -4
- package/cli-tool/components/settings/mcp/enable-specific-servers.json +0 -8
- package/cli-tool/components/settings/mcp/mcp-timeouts.json +0 -8
- package/cli-tool/components/settings/model/use-haiku.json +0 -4
- package/cli-tool/components/settings/model/use-sonnet.json +0 -4
- package/cli-tool/components/settings/permissions/additional-directories.json +0 -11
- package/cli-tool/components/settings/permissions/allow-git-operations.json +0 -14
- package/cli-tool/components/settings/permissions/allow-npm-commands.json +0 -11
- package/cli-tool/components/settings/permissions/deny-sensitive-files.json +0 -11
- package/cli-tool/components/settings/permissions/development-mode.json +0 -31
- package/cli-tool/components/settings/permissions/read-only-mode.json +0 -18
- package/cli-tool/components/settings/statusline/asset-pipeline-controller-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/bug-circus-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/code-casino-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/code-spaceship-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/colorful-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/command-statusline.json +0 -8
- package/cli-tool/components/settings/statusline/context-monitor.json +0 -7
- package/cli-tool/components/settings/statusline/context-monitor.py +0 -236
- package/cli-tool/components/settings/statusline/data-ocean-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/emotion-theater-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/game-performance-monitor-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/git-branch-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/git-flow-status.json +0 -7
- package/cli-tool/components/settings/statusline/minimal-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/multiplatform-build-status-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/neon-database-dev.json +0 -7
- package/cli-tool/components/settings/statusline/neon-database-resources.json +0 -7
- package/cli-tool/components/settings/statusline/productivity-rainbow-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/programmer-tamagotchi-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/programming-fitness-tracker-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/project-info-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/rpg-status-bar-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/time-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/unity-project-dashboard-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/vercel-deployment-monitor.json +0 -7
- package/cli-tool/components/settings/statusline/vercel-error-alert-system.json +0 -7
- package/cli-tool/components/settings/statusline/vercel-multi-env-status.json +0 -7
- package/cli-tool/components/settings/statusline/virtual-code-garden-statusline.json +0 -7
- package/cli-tool/components/settings/statusline/zero-config-deployment-monitor.json +0 -7
- package/cli-tool/components/settings/telemetry/custom-telemetry.json +0 -7
- package/cli-tool/components/settings/telemetry/disable-telemetry.json +0 -6
- package/cli-tool/components/settings/telemetry/enable-telemetry.json +0 -6
- package/cli-tool/docs_to_claude/ANALYTICS_STATE_DETECTION.md +0 -183
- package/cli-tool/docs_to_claude/ARCHITECTURE.md +0 -472
- package/cli-tool/docs_to_claude/BLOG_WRITING_GUIDE.md +0 -438
- package/cli-tool/docs_to_claude/CLAUDE_DATA_STRUCTURE.md +0 -400
- package/cli-tool/docs_to_claude/COMMANDS_GUIDE.md +0 -1035
- package/cli-tool/docs_to_claude/CONVERSATION_STATE_IMPROVEMENTS.md +0 -154
- package/cli-tool/docs_to_claude/DEBUG_TYPING_DETECTION.md +0 -95
- package/cli-tool/docs_to_claude/DOWNLOAD_TRACKING.md +0 -291
- package/cli-tool/docs_to_claude/ENHANCED_STATE_DETECTION.md +0 -122
- package/cli-tool/docs_to_claude/HEALTH_CHECK_IMPLEMENTATION.md +0 -135
- package/cli-tool/docs_to_claude/HOOKS_GUIDE.md +0 -1249
- package/cli-tool/docs_to_claude/STATUSLINE_GUIDE.md +0 -1123
- package/cli-tool/docs_to_claude/SUBAGENTS_GUIDE.md +0 -566
- package/cli-tool/docs_to_claude/SUB_AGENTS.md +0 -329
- package/cli-tool/jest.config.js +0 -84
- package/cli-tool/package-lock.json +0 -5471
- package/cli-tool/package.json +0 -96
- package/cli-tool/templates/common/.claude/commands/git-workflow.md +0 -239
- package/cli-tool/templates/common/.claude/commands/project-setup.md +0 -316
- package/cli-tool/templates/common/.mcp.json +0 -41
- package/cli-tool/templates/common/CLAUDE.md +0 -109
- package/cli-tool/templates/common/README.md +0 -96
- package/cli-tool/templates/go/.mcp.json +0 -78
- package/cli-tool/templates/go/README.md +0 -25
- package/cli-tool/templates/javascript-typescript/.claude/commands/api-endpoint.md +0 -51
- package/cli-tool/templates/javascript-typescript/.claude/commands/debug.md +0 -52
- package/cli-tool/templates/javascript-typescript/.claude/commands/lint.md +0 -48
- package/cli-tool/templates/javascript-typescript/.claude/commands/npm-scripts.md +0 -48
- package/cli-tool/templates/javascript-typescript/.claude/commands/refactor.md +0 -55
- package/cli-tool/templates/javascript-typescript/.claude/commands/test.md +0 -61
- package/cli-tool/templates/javascript-typescript/.claude/commands/typescript-migrate.md +0 -51
- package/cli-tool/templates/javascript-typescript/.claude/settings.json +0 -142
- package/cli-tool/templates/javascript-typescript/.mcp.json +0 -80
- package/cli-tool/templates/javascript-typescript/CLAUDE.md +0 -185
- package/cli-tool/templates/javascript-typescript/README.md +0 -259
- package/cli-tool/templates/javascript-typescript/examples/angular-app/.claude/commands/components.md +0 -63
- package/cli-tool/templates/javascript-typescript/examples/angular-app/.claude/commands/services.md +0 -62
- package/cli-tool/templates/javascript-typescript/examples/node-api/.claude/commands/api-endpoint.md +0 -46
- package/cli-tool/templates/javascript-typescript/examples/node-api/.claude/commands/database.md +0 -56
- package/cli-tool/templates/javascript-typescript/examples/node-api/.claude/commands/middleware.md +0 -61
- package/cli-tool/templates/javascript-typescript/examples/node-api/.claude/commands/route.md +0 -57
- package/cli-tool/templates/javascript-typescript/examples/node-api/CLAUDE.md +0 -102
- package/cli-tool/templates/javascript-typescript/examples/react-app/.claude/commands/component.md +0 -29
- package/cli-tool/templates/javascript-typescript/examples/react-app/.claude/commands/hooks.md +0 -44
- package/cli-tool/templates/javascript-typescript/examples/react-app/.claude/commands/state-management.md +0 -45
- package/cli-tool/templates/javascript-typescript/examples/react-app/CLAUDE.md +0 -81
- package/cli-tool/templates/javascript-typescript/examples/react-app/agents/react-performance-optimization.md +0 -530
- package/cli-tool/templates/javascript-typescript/examples/react-app/agents/react-state-management.md +0 -295
- package/cli-tool/templates/javascript-typescript/examples/vue-app/.claude/commands/components.md +0 -46
- package/cli-tool/templates/javascript-typescript/examples/vue-app/.claude/commands/composables.md +0 -51
- package/cli-tool/templates/python/.claude/commands/lint.md +0 -111
- package/cli-tool/templates/python/.claude/commands/test.md +0 -73
- package/cli-tool/templates/python/.claude/settings.json +0 -153
- package/cli-tool/templates/python/.mcp.json +0 -78
- package/cli-tool/templates/python/CLAUDE.md +0 -276
- package/cli-tool/templates/python/examples/django-app/.claude/commands/admin.md +0 -264
- package/cli-tool/templates/python/examples/django-app/.claude/commands/django-model.md +0 -124
- package/cli-tool/templates/python/examples/django-app/.claude/commands/views.md +0 -222
- package/cli-tool/templates/python/examples/django-app/CLAUDE.md +0 -313
- package/cli-tool/templates/python/examples/fastapi-app/.claude/commands/api-endpoints.md +0 -513
- package/cli-tool/templates/python/examples/fastapi-app/.claude/commands/auth.md +0 -775
- package/cli-tool/templates/python/examples/fastapi-app/.claude/commands/database.md +0 -657
- package/cli-tool/templates/python/examples/fastapi-app/.claude/commands/deployment.md +0 -160
- package/cli-tool/templates/python/examples/fastapi-app/.claude/commands/testing.md +0 -927
- package/cli-tool/templates/python/examples/fastapi-app/CLAUDE.md +0 -229
- package/cli-tool/templates/python/examples/flask-app/.claude/commands/app-factory.md +0 -384
- package/cli-tool/templates/python/examples/flask-app/.claude/commands/blueprint.md +0 -243
- package/cli-tool/templates/python/examples/flask-app/.claude/commands/database.md +0 -410
- package/cli-tool/templates/python/examples/flask-app/.claude/commands/deployment.md +0 -620
- package/cli-tool/templates/python/examples/flask-app/.claude/commands/flask-route.md +0 -217
- package/cli-tool/templates/python/examples/flask-app/.claude/commands/testing.md +0 -559
- package/cli-tool/templates/python/examples/flask-app/CLAUDE.md +0 -391
- package/cli-tool/templates/ruby/.claude/commands/model.md +0 -360
- package/cli-tool/templates/ruby/.claude/commands/test.md +0 -480
- package/cli-tool/templates/ruby/.claude/settings.json +0 -146
- package/cli-tool/templates/ruby/.mcp.json +0 -83
- package/cli-tool/templates/ruby/CLAUDE.md +0 -284
- package/cli-tool/templates/ruby/examples/rails-app/.claude/commands/authentication.md +0 -490
- package/cli-tool/templates/ruby/examples/rails-app/CLAUDE.md +0 -376
- package/cli-tool/templates/rust/.mcp.json +0 -78
- package/cli-tool/templates/rust/README.md +0 -26
- package/cli-tool/test-commands.sh +0 -85
- package/cli-tool/test-detailed.sh +0 -267
- package/dev-server.js +0 -46
- package/docs/CNAME +0 -1
- package/docs/README.md +0 -49
- package/docs/_config.yml +0 -43
- package/docs/api/agents.json +0 -942
- package/docs/blog/assets/aitmpl-nextjs-search.png +0 -0
- package/docs/blog/assets/aitmpl-supabase-search.png +0 -0
- package/docs/blog/assets/e2b-claude-code-sandbox-cover.png +0 -0
- package/docs/blog/assets/nextjs-vercel-claude-code-templates-cover.png +0 -0
- package/docs/blog/assets/supabase-claude-code-templates-cover.png +0 -0
- package/docs/blog/e2b-claude-code-sandbox/index.html +0 -908
- package/docs/blog/index.html +0 -274
- package/docs/blog/nextjs-vercel-claude-code-integration/index.html +0 -1032
- package/docs/blog/supabase-claude-code-integration/index.html +0 -848
- package/docs/claude-jobs.json +0 -163
- package/docs/component.html +0 -506
- package/docs/components-metadata.json +0 -303
- package/docs/components.json +0 -4952
- package/docs/css/blog.css +0 -821
- package/docs/css/component-page.css +0 -1063
- package/docs/css/stack-page.css +0 -776
- package/docs/css/styles.css +0 -4540
- package/docs/css/trending.css +0 -1441
- package/docs/css/workflows-modal.css +0 -739
- package/docs/css/workflows.css +0 -1234
- package/docs/download-stats.html +0 -527
- package/docs/index.html +0 -627
- package/docs/jobs.html +0 -1059
- package/docs/js/carousel.js +0 -177
- package/docs/js/cart-manager.js +0 -658
- package/docs/js/component-page.js +0 -808
- package/docs/js/data-loader.js +0 -633
- package/docs/js/generate-search-data.js +0 -82
- package/docs/js/index-events.js +0 -1812
- package/docs/js/modal-helpers.js +0 -345
- package/docs/js/script.js +0 -2167
- package/docs/js/search-functionality.js +0 -1165
- package/docs/js/stack-router.js +0 -561
- package/docs/js/trending.js +0 -752
- package/docs/js/utils.js +0 -43
- package/docs/js/workflows-events.js +0 -1146
- package/docs/js/workflows.js +0 -627
- package/docs/robots.txt +0 -28
- package/docs/sandbox-interface.html +0 -1418
- package/docs/sitemap.xml +0 -193
- package/docs/static/img/logo.png +0 -0
- package/docs/static/img/logo.svg +0 -23
- package/docs/trending-data.json +0 -885
- package/docs/trending.html +0 -238
- package/docs/vercel.json +0 -36
- package/docs/workflows.html +0 -391
- package/docu/README.md +0 -41
- package/docu/docs/cli-options.md +0 -90
- package/docu/docs/components/agents.md +0 -113
- package/docu/docs/components/commands.md +0 -90
- package/docu/docs/components/hooks.md +0 -114
- package/docu/docs/components/mcps.md +0 -109
- package/docu/docs/components/overview.md +0 -73
- package/docu/docs/components/settings.md +0 -105
- package/docu/docs/components/templates.md +0 -119
- package/docu/docs/intro.md +0 -40
- package/docu/docs/safety-features.md +0 -13
- package/docu/docs/support.md +0 -13
- package/docu/docs/tools/analytics.md +0 -23
- package/docu/docs/tools/chats.md +0 -33
- package/docu/docs/tools/health-check.md +0 -60
- package/docu/docs/tools/overview.md +0 -39
- package/docu/docs/tools/sandbox.md +0 -61
- package/docu/docs/tools/tunnel.md +0 -38
- package/docu/docusaurus.config.ts +0 -169
- package/docu/package-lock.json +0 -16185
- package/docu/package.json +0 -47
- package/docu/sidebars.ts +0 -49
- package/docu/src/components/HomepageFeatures/index.tsx +0 -82
- package/docu/src/components/HomepageFeatures/styles.module.css +0 -131
- package/docu/src/css/custom.css +0 -849
- package/docu/src/pages/index.module.css +0 -111
- package/docu/src/pages/index.tsx +0 -65
- package/docu/src/pages/markdown-page.md +0 -7
- package/docu/static/img/favicon.ico +0 -0
- package/docu/static/img/logo.svg +0 -23
- package/docu/tsconfig.json +0 -8
- package/docu/vercel.json +0 -11
- package/generate_agents_api.py +0 -65
- package/generate_claude_jobs.py +0 -985
- package/generate_components_json.py +0 -391
- package/social-preview.png +0 -0
- package/test_serpapi.py +0 -36
- package/vercel.json +0 -111
- /package/{cli-tool/components → components}/sandbox/README.md +0 -0
- /package/{cli-tool/components → components}/sandbox/e2b/.env.example +0 -0
- /package/{cli-tool/components → components}/sandbox/e2b/SANDBOX_DEBUGGING.md +0 -0
- /package/{cli-tool/components → components}/sandbox/e2b/claude-code-sandbox.md +0 -0
- /package/{cli-tool/components → components}/sandbox/e2b/e2b-launcher.py +0 -0
- /package/{cli-tool/components → components}/sandbox/e2b/e2b-monitor.py +0 -0
- /package/{cli-tool/components → components}/sandbox/e2b/requirements.txt +0 -0
- /package/{cli-tool/src → src}/agents.js +0 -0
- /package/{cli-tool/src → src}/analytics/core/AgentAnalyzer.js +0 -0
- /package/{cli-tool/src → src}/analytics/core/ConversationAnalyzer.js +0 -0
- /package/{cli-tool/src → src}/analytics/core/FileWatcher.js +0 -0
- /package/{cli-tool/src → src}/analytics/core/ProcessDetector.js +0 -0
- /package/{cli-tool/src → src}/analytics/core/SessionAnalyzer.js +0 -0
- /package/{cli-tool/src → src}/analytics/core/StateCalculator.js +0 -0
- /package/{cli-tool/src → src}/analytics/data/DataCache.js +0 -0
- /package/{cli-tool/src → src}/analytics/notifications/NotificationManager.js +0 -0
- /package/{cli-tool/src → src}/analytics/notifications/WebSocketServer.js +0 -0
- /package/{cli-tool/src → src}/analytics/utils/PerformanceMonitor.js +0 -0
- /package/{cli-tool/src → src}/analytics-web/FRONT_ARCHITECTURE.md +0 -0
- /package/{cli-tool/src → src}/analytics-web/assets/js/main.js.deprecated +0 -0
- /package/{cli-tool/src → src}/analytics-web/components/ActivityHeatmap.js +0 -0
- /package/{cli-tool/src → src}/analytics-web/components/AgentAnalytics.js +0 -0
- /package/{cli-tool/src → src}/analytics-web/components/App.js +0 -0
- /package/{cli-tool/src → src}/analytics-web/components/Charts.js +0 -0
- /package/{cli-tool/src → src}/analytics-web/components/ConversationTable.js +0 -0
- /package/{cli-tool/src → src}/analytics-web/components/DashboardPage.js +0 -0
- /package/{cli-tool/src → src}/analytics-web/components/HeaderComponent.js +0 -0
- /package/{cli-tool/src → src}/analytics-web/components/SessionTimer.js +0 -0
- /package/{cli-tool/src → src}/analytics-web/components/Sidebar.js +0 -0
- /package/{cli-tool/src → src}/analytics-web/components/ToolDisplay.js +0 -0
- /package/{cli-tool/src → src}/analytics-web/index.html +0 -0
- /package/{cli-tool/src → src}/analytics-web/index.html.original +0 -0
- /package/{cli-tool/src → src}/analytics-web/services/DataService.js +0 -0
- /package/{cli-tool/src → src}/analytics-web/services/StateService.js +0 -0
- /package/{cli-tool/src → src}/analytics-web/services/WebSocketService.js +0 -0
- /package/{cli-tool/src → src}/analytics.js +0 -0
- /package/{docu/static/.nojekyll → src/analytics.log} +0 -0
- /package/{cli-tool/src → src}/chats-mobile.js +0 -0
- /package/{cli-tool/src → src}/claude-api-proxy.js +0 -0
- /package/{cli-tool/src → src}/command-scanner.js +0 -0
- /package/{cli-tool/src → src}/command-stats.js +0 -0
- /package/{cli-tool/src → src}/file-operations.js +0 -0
- /package/{cli-tool/src → src}/health-check.js +0 -0
- /package/{cli-tool/src → src}/hook-scanner.js +0 -0
- /package/{cli-tool/src → src}/hook-stats.js +0 -0
- /package/{cli-tool/src → src}/mcp-stats.js +0 -0
- /package/{cli-tool/src → src}/prompts.js +0 -0
- /package/{cli-tool/src → src}/sandbox-interface.html +0 -0
- /package/{cli-tool/src → src}/sandbox-server.js +0 -0
- /package/{cli-tool/src → src}/sdk/global-agent-manager.js +0 -0
- /package/{cli-tool/src → src}/templates.js +0 -0
- /package/{cli-tool/src → src}/test-console-bridge.js +0 -0
- /package/{cli-tool/src → src}/tracking-service.js +0 -0
- /package/{cli-tool/src → src}/utils.js +0 -0
package/docs/js/index-events.js
DELETED
|
@@ -1,1812 +0,0 @@
|
|
|
1
|
-
// Index Events - Handles events specific to index.html
|
|
2
|
-
console.log('index-events.js loaded successfully');
|
|
3
|
-
|
|
4
|
-
// Global function to focus search input when clicking wrapper
|
|
5
|
-
function focusSearchInput() {
|
|
6
|
-
const searchInput = document.getElementById('searchInput');
|
|
7
|
-
if (searchInput) {
|
|
8
|
-
searchInput.focus();
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
class IndexPageManager {
|
|
13
|
-
constructor() {
|
|
14
|
-
this.currentFilter = 'agents';
|
|
15
|
-
this.currentCategoryFilter = 'all';
|
|
16
|
-
this.currentSort = 'downloads'; // Default sort by downloads
|
|
17
|
-
this.templatesData = null;
|
|
18
|
-
this.componentsData = null;
|
|
19
|
-
this.availableCategories = {
|
|
20
|
-
agents: new Set(),
|
|
21
|
-
commands: new Set(),
|
|
22
|
-
mcps: new Set(),
|
|
23
|
-
settings: new Set(),
|
|
24
|
-
hooks: new Set(),
|
|
25
|
-
templates: new Set()
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
// Pagination settings
|
|
29
|
-
this.currentPage = 1;
|
|
30
|
-
this.itemsPerPage = 24; // 3x3 grid
|
|
31
|
-
this.totalPages = 1;
|
|
32
|
-
|
|
33
|
-
// Framework icons mapping (from script.js)
|
|
34
|
-
this.FRAMEWORK_ICONS = {
|
|
35
|
-
// Languages
|
|
36
|
-
'common': 'devicon-gear-plain',
|
|
37
|
-
'javascript-typescript': 'devicon-javascript-plain',
|
|
38
|
-
'python': 'devicon-python-plain',
|
|
39
|
-
'ruby': 'devicon-ruby-plain',
|
|
40
|
-
'rust': 'devicon-rust-plain',
|
|
41
|
-
'go': 'devicon-go-plain',
|
|
42
|
-
|
|
43
|
-
// JavaScript/TypeScript frameworks
|
|
44
|
-
'react': 'devicon-react-original',
|
|
45
|
-
'vue': 'devicon-vuejs-plain',
|
|
46
|
-
'angular': 'devicon-angularjs-plain',
|
|
47
|
-
'node': 'devicon-nodejs-plain',
|
|
48
|
-
|
|
49
|
-
// Python frameworks
|
|
50
|
-
'django': 'devicon-django-plain',
|
|
51
|
-
'flask': 'devicon-flask-original',
|
|
52
|
-
'fastapi': 'devicon-fastapi-plain',
|
|
53
|
-
|
|
54
|
-
// Ruby frameworks
|
|
55
|
-
'rails': 'devicon-rails-plain',
|
|
56
|
-
'sinatra': 'devicon-ruby-plain',
|
|
57
|
-
|
|
58
|
-
// Default fallback
|
|
59
|
-
'default': 'devicon-devicon-plain'
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
async init() {
|
|
64
|
-
try {
|
|
65
|
-
// Setup event listeners first (they don't depend on data)
|
|
66
|
-
this.setupEventListeners();
|
|
67
|
-
|
|
68
|
-
// Show loading state
|
|
69
|
-
this.showLoadingState(true);
|
|
70
|
-
|
|
71
|
-
// Load all components and templates at once
|
|
72
|
-
await this.loadComponentsData();
|
|
73
|
-
await this.loadTemplatesData();
|
|
74
|
-
|
|
75
|
-
// Display components
|
|
76
|
-
this.displayCurrentFilter();
|
|
77
|
-
|
|
78
|
-
} catch (error) {
|
|
79
|
-
console.error('Error initializing index page:', error);
|
|
80
|
-
this.showError('Failed to load data. Please refresh the page.');
|
|
81
|
-
} finally {
|
|
82
|
-
this.showLoadingState(false);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
async loadTemplatesData() {
|
|
87
|
-
try {
|
|
88
|
-
// Templates are now loaded from components.json, not GitHub
|
|
89
|
-
this.templatesData = await window.dataLoader.loadTemplates();
|
|
90
|
-
|
|
91
|
-
// Update display if templates were found
|
|
92
|
-
if (this.templatesData && Object.keys(this.templatesData).length > 0) {
|
|
93
|
-
this.displayCurrentFilter();
|
|
94
|
-
}
|
|
95
|
-
} catch (error) {
|
|
96
|
-
console.warn('Templates not available in components.json:', error);
|
|
97
|
-
// Continue without templates - this is not critical
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
async loadComponentsData() {
|
|
102
|
-
try {
|
|
103
|
-
// Load all components at once - the performance issue was mostly due to GitHub fetching
|
|
104
|
-
// Now that we only use components.json, we can load all data safely
|
|
105
|
-
this.componentsData = await window.dataLoader.loadAllComponents();
|
|
106
|
-
this.collectAvailableCategories();
|
|
107
|
-
} catch (error) {
|
|
108
|
-
console.error('Error loading components:', error);
|
|
109
|
-
// Use fallback data
|
|
110
|
-
this.componentsData = window.dataLoader.getFallbackComponentData();
|
|
111
|
-
this.collectAvailableCategories();
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// This method is no longer needed since we load all components at once
|
|
116
|
-
// Kept for backward compatibility but does nothing
|
|
117
|
-
async loadMoreComponentsInBackground() {
|
|
118
|
-
// No-op: All components are now loaded in the initial request
|
|
119
|
-
console.log('All components loaded in initial request - background loading not needed');
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Check if data object is empty
|
|
123
|
-
isDataEmpty(data) {
|
|
124
|
-
return !data || ((!data.agents || data.agents.length === 0) &&
|
|
125
|
-
(!data.commands || data.commands.length === 0) &&
|
|
126
|
-
(!data.mcps || data.mcps.length === 0) &&
|
|
127
|
-
(!data.settings || data.settings.length === 0) &&
|
|
128
|
-
(!data.hooks || data.hooks.length === 0));
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Show/hide loading state
|
|
132
|
-
showLoadingState(isLoading) {
|
|
133
|
-
const loadingElements = document.querySelectorAll('.loading-indicator, .loading-spinner');
|
|
134
|
-
const contentElements = document.querySelectorAll('#unifiedGrid, .filter-controls');
|
|
135
|
-
|
|
136
|
-
loadingElements.forEach(el => {
|
|
137
|
-
el.style.display = isLoading ? 'flex' : 'none';
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
contentElements.forEach(el => {
|
|
141
|
-
el.style.opacity = isLoading ? '0.7' : '1';
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
setupEventListeners() {
|
|
146
|
-
// Filter buttons
|
|
147
|
-
document.querySelectorAll('.filter-btn').forEach(btn => {
|
|
148
|
-
btn.addEventListener('click', (e) => {
|
|
149
|
-
const filter = e.target.dataset.filter;
|
|
150
|
-
this.setFilter(filter);
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
// Copy buttons
|
|
155
|
-
document.addEventListener('click', (e) => {
|
|
156
|
-
if (e.target.classList.contains('copy-btn')) {
|
|
157
|
-
const command = e.target.previousElementSibling.textContent;
|
|
158
|
-
this.copyToClipboard(command);
|
|
159
|
-
}
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
// Card flip functionality for template cards
|
|
163
|
-
document.addEventListener('click', (e) => {
|
|
164
|
-
const card = e.target.closest('.template-card');
|
|
165
|
-
// Prevent flipping for "add new" cards or if a button is clicked
|
|
166
|
-
if (card && !card.classList.contains('add-template-card') && !e.target.closest('button')) {
|
|
167
|
-
console.log('Global template card clicked, toggling flip');
|
|
168
|
-
card.classList.toggle('flipped');
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
// ESC key to close all flipped cards
|
|
173
|
-
document.addEventListener('keydown', (e) => {
|
|
174
|
-
if (e.key === 'Escape') {
|
|
175
|
-
document.querySelectorAll('.template-card.flipped').forEach(card => {
|
|
176
|
-
card.classList.remove('flipped');
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
setFilter(filter) {
|
|
183
|
-
this.currentFilter = filter;
|
|
184
|
-
this.currentPage = 1; // Reset to first page when changing filter
|
|
185
|
-
this.currentCategoryFilter = 'all'; // Reset category filter to show all items
|
|
186
|
-
|
|
187
|
-
// Update active button
|
|
188
|
-
document.querySelectorAll('.filter-btn').forEach(btn => {
|
|
189
|
-
btn.classList.toggle('active', btn.dataset.filter === filter);
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
this.displayCurrentFilter();
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// Set category filter
|
|
196
|
-
setCategoryFilter(category) {
|
|
197
|
-
this.currentCategoryFilter = category;
|
|
198
|
-
this.currentPage = 1; // Reset to first page when changing category
|
|
199
|
-
|
|
200
|
-
// Update category filter buttons
|
|
201
|
-
document.querySelectorAll('.category-filter-btn').forEach(btn => {
|
|
202
|
-
btn.classList.remove('active');
|
|
203
|
-
});
|
|
204
|
-
const targetBtn = document.querySelector(`[data-category="${category}"]`);
|
|
205
|
-
if (targetBtn) {
|
|
206
|
-
targetBtn.classList.add('active');
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// Regenerate the component display
|
|
210
|
-
this.displayCurrentFilter();
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// Update category sub-filters in the unified-filter-bar
|
|
214
|
-
updateCategorySubFilters() {
|
|
215
|
-
const unifiedFilterBar = document.querySelector('.unified-filter-bar');
|
|
216
|
-
if (!unifiedFilterBar) return;
|
|
217
|
-
|
|
218
|
-
// Remove existing category filters
|
|
219
|
-
const existingCategoryFilters = unifiedFilterBar.querySelector('.category-filter-row');
|
|
220
|
-
if (existingCategoryFilters) {
|
|
221
|
-
existingCategoryFilters.remove();
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// Get categories for current filter type
|
|
225
|
-
const currentCategories = Array.from(this.availableCategories[this.currentFilter] || []).sort();
|
|
226
|
-
|
|
227
|
-
if (currentCategories.length <= 1) {
|
|
228
|
-
// Don't show sub-filters if there's only one category or none
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
// Create category filter row
|
|
233
|
-
const categoryFilterRow = document.createElement('div');
|
|
234
|
-
categoryFilterRow.className = 'category-filter-row';
|
|
235
|
-
categoryFilterRow.innerHTML = `
|
|
236
|
-
<div class="category-filter-label">Categories:</div>
|
|
237
|
-
<div class="category-filter-buttons">
|
|
238
|
-
<button class="category-filter-btn ${this.currentCategoryFilter === 'all' ? 'active' : ''}"
|
|
239
|
-
data-category="all">
|
|
240
|
-
All
|
|
241
|
-
</button>
|
|
242
|
-
${currentCategories.map(category => `
|
|
243
|
-
<button class="category-filter-btn ${this.currentCategoryFilter === category ? 'active' : ''}"
|
|
244
|
-
data-category="${category}">
|
|
245
|
-
${this.formatComponentName(category)}
|
|
246
|
-
</button>
|
|
247
|
-
`).join('')}
|
|
248
|
-
</div>
|
|
249
|
-
`;
|
|
250
|
-
|
|
251
|
-
// Add click event listeners
|
|
252
|
-
categoryFilterRow.querySelectorAll('.category-filter-btn').forEach(btn => {
|
|
253
|
-
btn.addEventListener('click', () => {
|
|
254
|
-
this.setCategoryFilter(btn.getAttribute('data-category'));
|
|
255
|
-
});
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
// Append to unified filter bar
|
|
259
|
-
unifiedFilterBar.appendChild(categoryFilterRow);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// Get filtered components based on current filter and category filter
|
|
263
|
-
getFilteredComponents(type) {
|
|
264
|
-
if (!type) type = this.currentFilter;
|
|
265
|
-
if (type === 'templates') {
|
|
266
|
-
return [];
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
let components = this.componentsData[type] || [];
|
|
270
|
-
|
|
271
|
-
// Apply category filter if not 'all'
|
|
272
|
-
if (this.currentCategoryFilter !== 'all') {
|
|
273
|
-
components = components.filter(component => {
|
|
274
|
-
const category = component.category || 'general';
|
|
275
|
-
return category === this.currentCategoryFilter;
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
// Apply sorting
|
|
280
|
-
components = this.sortComponents(components);
|
|
281
|
-
|
|
282
|
-
return components;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
// Sort components based on current sort option
|
|
286
|
-
sortComponents(components) {
|
|
287
|
-
const sortedComponents = [...components]; // Create a copy to avoid mutating original
|
|
288
|
-
|
|
289
|
-
if (this.currentSort === 'downloads') {
|
|
290
|
-
// Sort by downloads (descending) - components with no downloads go to the end
|
|
291
|
-
sortedComponents.sort((a, b) => {
|
|
292
|
-
const downloadsA = a.downloads || 0;
|
|
293
|
-
const downloadsB = b.downloads || 0;
|
|
294
|
-
return downloadsB - downloadsA;
|
|
295
|
-
});
|
|
296
|
-
} else if (this.currentSort === 'alphabetical') {
|
|
297
|
-
// Sort alphabetically by name
|
|
298
|
-
sortedComponents.sort((a, b) => {
|
|
299
|
-
const nameA = (a.name || '').toLowerCase();
|
|
300
|
-
const nameB = (b.name || '').toLowerCase();
|
|
301
|
-
return nameA.localeCompare(nameB);
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
return sortedComponents;
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
// Handle sort change from the dropdown
|
|
309
|
-
handleSortChange(sortValue) {
|
|
310
|
-
this.currentSort = sortValue;
|
|
311
|
-
this.currentPage = 1; // Reset to first page when changing sort
|
|
312
|
-
this.displayCurrentFilter();
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// Collect available categories from loaded components
|
|
316
|
-
collectAvailableCategories() {
|
|
317
|
-
// Reset categories
|
|
318
|
-
this.availableCategories.agents.clear();
|
|
319
|
-
this.availableCategories.commands.clear();
|
|
320
|
-
this.availableCategories.mcps.clear();
|
|
321
|
-
this.availableCategories.settings.clear();
|
|
322
|
-
this.availableCategories.hooks.clear();
|
|
323
|
-
this.availableCategories.templates.clear();
|
|
324
|
-
|
|
325
|
-
// Collect categories from each component type
|
|
326
|
-
if (this.componentsData.agents && Array.isArray(this.componentsData.agents)) {
|
|
327
|
-
this.componentsData.agents.forEach(component => {
|
|
328
|
-
const category = component.category || 'general';
|
|
329
|
-
this.availableCategories.agents.add(category);
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
if (this.componentsData.commands && Array.isArray(this.componentsData.commands)) {
|
|
334
|
-
this.componentsData.commands.forEach(component => {
|
|
335
|
-
const category = component.category || 'general';
|
|
336
|
-
this.availableCategories.commands.add(category);
|
|
337
|
-
});
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
if (this.componentsData.mcps && Array.isArray(this.componentsData.mcps)) {
|
|
341
|
-
this.componentsData.mcps.forEach(component => {
|
|
342
|
-
const category = component.category || 'general';
|
|
343
|
-
this.availableCategories.mcps.add(category);
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
if (this.componentsData.settings && Array.isArray(this.componentsData.settings)) {
|
|
348
|
-
this.componentsData.settings.forEach(component => {
|
|
349
|
-
const category = component.category || 'general';
|
|
350
|
-
this.availableCategories.settings.add(category);
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
if (this.componentsData.hooks && Array.isArray(this.componentsData.hooks)) {
|
|
355
|
-
this.componentsData.hooks.forEach(component => {
|
|
356
|
-
const category = component.category || 'general';
|
|
357
|
-
this.availableCategories.hooks.add(category);
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
// Collect categories from templates (use language as category for language templates)
|
|
362
|
-
if (this.componentsData.templates && Array.isArray(this.componentsData.templates)) {
|
|
363
|
-
this.componentsData.templates.forEach(template => {
|
|
364
|
-
if (template.subtype === 'language') {
|
|
365
|
-
this.availableCategories.templates.add(template.name);
|
|
366
|
-
} else if (template.subtype === 'framework' && template.language) {
|
|
367
|
-
this.availableCategories.templates.add(template.language);
|
|
368
|
-
}
|
|
369
|
-
});
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
displayCurrentFilter() {
|
|
374
|
-
const grid = document.getElementById('unifiedGrid');
|
|
375
|
-
if (!grid) return;
|
|
376
|
-
|
|
377
|
-
// Set proper grid class based on current filter
|
|
378
|
-
if (this.currentFilter === 'templates') {
|
|
379
|
-
grid.className = 'unified-grid templates-mode';
|
|
380
|
-
} else {
|
|
381
|
-
grid.className = 'unified-grid components-mode';
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
// Update filter button counts
|
|
385
|
-
this.updateFilterCounts();
|
|
386
|
-
|
|
387
|
-
switch (this.currentFilter) {
|
|
388
|
-
case 'templates':
|
|
389
|
-
this.displayTemplates(grid);
|
|
390
|
-
break;
|
|
391
|
-
case 'agents':
|
|
392
|
-
case 'commands':
|
|
393
|
-
case 'mcps':
|
|
394
|
-
case 'settings':
|
|
395
|
-
case 'hooks':
|
|
396
|
-
this.displayComponents(grid, this.currentFilter);
|
|
397
|
-
break;
|
|
398
|
-
default:
|
|
399
|
-
grid.innerHTML = '<div class="error">Unknown filter</div>';
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
displayTemplates(grid) {
|
|
404
|
-
if (!this.componentsData || !this.componentsData.templates) {
|
|
405
|
-
grid.innerHTML = '<div class="loading">Loading templates...</div>';
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
// Update category sub-filters for templates
|
|
410
|
-
this.updateCategorySubFilters();
|
|
411
|
-
|
|
412
|
-
// Clear the grid
|
|
413
|
-
grid.innerHTML = '';
|
|
414
|
-
|
|
415
|
-
// Add the "Add New Template" card first
|
|
416
|
-
const addTemplateCard = this.createAddTemplateCard();
|
|
417
|
-
grid.appendChild(addTemplateCard);
|
|
418
|
-
|
|
419
|
-
// Filter templates based on category selection
|
|
420
|
-
let filteredTemplates = this.componentsData.templates;
|
|
421
|
-
if (this.currentCategoryFilter !== 'all') {
|
|
422
|
-
filteredTemplates = this.componentsData.templates.filter(template => {
|
|
423
|
-
if (template.subtype === 'language') {
|
|
424
|
-
return template.name === this.currentCategoryFilter;
|
|
425
|
-
} else if (template.subtype === 'framework') {
|
|
426
|
-
return template.language === this.currentCategoryFilter;
|
|
427
|
-
}
|
|
428
|
-
return false;
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
// Apply sorting to templates
|
|
433
|
-
filteredTemplates = this.sortComponents(filteredTemplates);
|
|
434
|
-
|
|
435
|
-
// Create template cards from the filtered list
|
|
436
|
-
filteredTemplates.forEach(template => {
|
|
437
|
-
const templateCard = this.createTemplateCardFromJSON(template);
|
|
438
|
-
grid.appendChild(templateCard);
|
|
439
|
-
});
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
displayComponents(grid, type) {
|
|
443
|
-
if (!this.componentsData) {
|
|
444
|
-
grid.innerHTML = '<div class="loading">Loading components...</div>';
|
|
445
|
-
return;
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
// Update category sub-filters in the unified-filter-bar
|
|
449
|
-
this.updateCategorySubFilters();
|
|
450
|
-
|
|
451
|
-
const allComponents = this.getFilteredComponents(type);
|
|
452
|
-
|
|
453
|
-
// Calculate pagination
|
|
454
|
-
const totalItems = allComponents.length + 1; // +1 for "Add New" card
|
|
455
|
-
this.totalPages = Math.ceil(totalItems / this.itemsPerPage);
|
|
456
|
-
|
|
457
|
-
// Get components for current page
|
|
458
|
-
const startIndex = (this.currentPage - 1) * this.itemsPerPage;
|
|
459
|
-
const endIndex = startIndex + this.itemsPerPage;
|
|
460
|
-
|
|
461
|
-
let html = '';
|
|
462
|
-
let itemsToShow = [];
|
|
463
|
-
|
|
464
|
-
// Add "Add New" card to the beginning
|
|
465
|
-
itemsToShow.push({ type: 'add-new', data: type });
|
|
466
|
-
|
|
467
|
-
// Add components
|
|
468
|
-
allComponents.forEach(component => {
|
|
469
|
-
itemsToShow.push({ type: 'component', data: component });
|
|
470
|
-
});
|
|
471
|
-
|
|
472
|
-
// Get items for current page
|
|
473
|
-
const pageItems = itemsToShow.slice(startIndex, endIndex);
|
|
474
|
-
|
|
475
|
-
// Generate HTML for page items
|
|
476
|
-
pageItems.forEach(item => {
|
|
477
|
-
if (item.type === 'add-new') {
|
|
478
|
-
html += this.createAddComponentCard(item.data);
|
|
479
|
-
} else {
|
|
480
|
-
html += this.generateComponentCard(item.data);
|
|
481
|
-
}
|
|
482
|
-
});
|
|
483
|
-
|
|
484
|
-
// Create pagination controls
|
|
485
|
-
const paginationHTML = this.createPaginationControls();
|
|
486
|
-
|
|
487
|
-
grid.innerHTML = html || '<div class="no-data">No components available</div>';
|
|
488
|
-
|
|
489
|
-
// Add pagination after the grid
|
|
490
|
-
this.updatePagination(paginationHTML);
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
generateComponentCard(component) {
|
|
495
|
-
// Generate install command - remove .md extension from path
|
|
496
|
-
let componentPath = component.path || component.name;
|
|
497
|
-
// Remove .md or .json extensions from path
|
|
498
|
-
if (componentPath.endsWith('.md') || componentPath.endsWith('.json')) {
|
|
499
|
-
componentPath = componentPath.replace(/\.(md|json)$/, '');
|
|
500
|
-
}
|
|
501
|
-
if (componentPath.endsWith('.json')) {
|
|
502
|
-
componentPath = componentPath.replace(/\.json$/, '');
|
|
503
|
-
}
|
|
504
|
-
const installCommand = `npx claude-code-templates@latest --${component.type}=${componentPath} --yes`;
|
|
505
|
-
|
|
506
|
-
const typeConfig = {
|
|
507
|
-
agent: { icon: '🤖', color: '#ff6b6b' },
|
|
508
|
-
command: { icon: '⚡', color: '#4ecdc4' },
|
|
509
|
-
mcp: { icon: '🔌', color: '#45b7d1' },
|
|
510
|
-
setting: { icon: '⚙️', color: '#9c88ff' },
|
|
511
|
-
hook: { icon: '🪝', color: '#ff8c42' }
|
|
512
|
-
};
|
|
513
|
-
|
|
514
|
-
const config = typeConfig[component.type];
|
|
515
|
-
|
|
516
|
-
// Escape quotes and special characters for onclick attributes
|
|
517
|
-
const escapedType = component.type.replace(/'/g, "\\'");
|
|
518
|
-
const escapedName = (component.name || '').replace(/'/g, "\\'");
|
|
519
|
-
const escapedPath = (component.path || component.name || '').replace(/'/g, "\\'");
|
|
520
|
-
const escapedCategory = (component.category || 'general').replace(/'/g, "\\'");
|
|
521
|
-
const escapedCommand = installCommand.replace(/'/g, "\\'");
|
|
522
|
-
|
|
523
|
-
// Create category label (use "General" if no category)
|
|
524
|
-
const categoryName = component.category || 'general';
|
|
525
|
-
const categoryLabel = `<div class="category-label">${this.formatComponentName(categoryName)}</div>`;
|
|
526
|
-
|
|
527
|
-
// Create download badge if downloads data exists
|
|
528
|
-
const downloadBadge = component.downloads && component.downloads > 0 ?
|
|
529
|
-
`<div class="download-badge" title="${component.downloads} downloads">
|
|
530
|
-
<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">
|
|
531
|
-
<path d="M5 20h14v-2H5v2zM19 9h-4V3H9v6H5l7 7 7-7z"/>
|
|
532
|
-
</svg>
|
|
533
|
-
${this.formatNumber(component.downloads)}
|
|
534
|
-
</div>` : '';
|
|
535
|
-
|
|
536
|
-
return `
|
|
537
|
-
<div class="template-card" data-type="${component.type}">
|
|
538
|
-
<div class="card-inner">
|
|
539
|
-
<div class="card-front">
|
|
540
|
-
${downloadBadge}
|
|
541
|
-
${categoryLabel}
|
|
542
|
-
<div class="framework-logo" style="color: ${config.color}">
|
|
543
|
-
<span class="component-icon">${config.icon}</span>
|
|
544
|
-
</div>
|
|
545
|
-
<h3 class="template-title">${this.formatComponentName(component.name)}</h3>
|
|
546
|
-
${component.type === 'mcp' ?
|
|
547
|
-
`<p class="template-description">${this.truncateDescription(component.description || 'MCP integration for enhanced development workflow', 80)}</p>` :
|
|
548
|
-
`<p class="template-description">${this.getComponentDescription(component)}</p>`
|
|
549
|
-
}
|
|
550
|
-
</div>
|
|
551
|
-
<div class="card-back">
|
|
552
|
-
<div class="command-display">
|
|
553
|
-
<h3>Installation Command</h3>
|
|
554
|
-
<div class="command-code-container">
|
|
555
|
-
<div class="command-code">${installCommand}</div>
|
|
556
|
-
<button class="copy-overlay-btn" onclick="copyToClipboard('${escapedCommand}'); event.stopPropagation();" title="Copy command">
|
|
557
|
-
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
|
|
558
|
-
<path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/>
|
|
559
|
-
</svg>
|
|
560
|
-
Copy Command
|
|
561
|
-
</button>
|
|
562
|
-
</div>
|
|
563
|
-
<div class="card-actions">
|
|
564
|
-
<button class="view-files-btn" onclick="showComponentDetails('${escapedType}', '${escapedName}', '${escapedPath}', '${escapedCategory}')">
|
|
565
|
-
📁 View Details
|
|
566
|
-
</button>
|
|
567
|
-
<button class="add-to-cart-btn"
|
|
568
|
-
data-type="${component.type}s"
|
|
569
|
-
data-path="${componentPath}"
|
|
570
|
-
onclick="handleAddToCart('${escapedName}', '${componentPath}', '${component.type}s', '${escapedCategory}', this)">
|
|
571
|
-
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
|
|
572
|
-
<path d="M19,7H18V6A2,2 0 0,0 16,4H8A2,2 0 0,0 6,6V7H5A1,1 0 0,0 4,8A1,1 0 0,0 5,9H6V19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V9H19A1,1 0 0,0 20,8A1,1 0 0,0 19,7M8,6H16V7H8V6M16,19H8V9H16V19Z"/>
|
|
573
|
-
</svg>
|
|
574
|
-
Add to Stack
|
|
575
|
-
</button>
|
|
576
|
-
</div>
|
|
577
|
-
</div>
|
|
578
|
-
</div>
|
|
579
|
-
</div>
|
|
580
|
-
</div>
|
|
581
|
-
`;
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
copyToClipboard(text) {
|
|
585
|
-
// Use the global function from utils.js
|
|
586
|
-
if (typeof window.copyToClipboard === 'function') {
|
|
587
|
-
window.copyToClipboard(text);
|
|
588
|
-
} else {
|
|
589
|
-
copyToClipboard(text);
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
showNotification(message, type = 'info') {
|
|
594
|
-
const notification = document.createElement('div');
|
|
595
|
-
notification.textContent = message;
|
|
596
|
-
notification.className = `notification notification-${type}`;
|
|
597
|
-
notification.style.cssText = `
|
|
598
|
-
position: fixed;
|
|
599
|
-
top: 20px;
|
|
600
|
-
right: 20px;
|
|
601
|
-
background: ${type === 'success' ? '#10b981' : type === 'error' ? '#ef4444' : '#3b82f6'};
|
|
602
|
-
color: white;
|
|
603
|
-
padding: 12px 24px;
|
|
604
|
-
border-radius: 6px;
|
|
605
|
-
z-index: 10000;
|
|
606
|
-
font-family: system-ui, -apple-system, sans-serif;
|
|
607
|
-
animation: slideIn 0.3s ease;
|
|
608
|
-
`;
|
|
609
|
-
|
|
610
|
-
document.body.appendChild(notification);
|
|
611
|
-
setTimeout(() => {
|
|
612
|
-
if (notification.parentNode) {
|
|
613
|
-
notification.parentNode.removeChild(notification);
|
|
614
|
-
}
|
|
615
|
-
}, 3000);
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
formatComponentName(name) {
|
|
619
|
-
return name.split('-').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
formatNumber(num) {
|
|
623
|
-
if (num >= 1000000) {
|
|
624
|
-
return (num / 1000000).toFixed(1) + 'M';
|
|
625
|
-
} else if (num >= 1000) {
|
|
626
|
-
return (num / 1000).toFixed(1) + 'K';
|
|
627
|
-
}
|
|
628
|
-
return num.toString();
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
truncateDescription(description, maxLength = 80) {
|
|
632
|
-
if (!description) return '';
|
|
633
|
-
if (description.length <= maxLength) return description;
|
|
634
|
-
return description.substring(0, maxLength).trim() + '...';
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
getComponentDescription(component) {
|
|
638
|
-
let description = '';
|
|
639
|
-
|
|
640
|
-
if (component.description) {
|
|
641
|
-
description = component.description;
|
|
642
|
-
} else if (component.content) {
|
|
643
|
-
// Try to extract description from frontmatter
|
|
644
|
-
const descMatch = component.content.match(/description:\s*(.+?)(?:\n|$)/);
|
|
645
|
-
if (descMatch) {
|
|
646
|
-
description = descMatch[1].trim().replace(/^["']|["']$/g, '');
|
|
647
|
-
} else {
|
|
648
|
-
// Use first paragraph if no frontmatter description
|
|
649
|
-
const lines = component.content.split('\n');
|
|
650
|
-
const firstParagraph = lines.find(line => line.trim() && !line.startsWith('---') && !line.startsWith('#'));
|
|
651
|
-
if (firstParagraph) {
|
|
652
|
-
description = firstParagraph.trim();
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
if (!description) {
|
|
658
|
-
description = `A ${component.type} component for Claude Code.`;
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
// Truncate description to max 120 characters for proper card display
|
|
662
|
-
if (description.length > 120) {
|
|
663
|
-
description = description.substring(0, 117) + '...';
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
return description;
|
|
667
|
-
}
|
|
668
|
-
|
|
669
|
-
// Update filter button counts
|
|
670
|
-
updateFilterCounts() {
|
|
671
|
-
// Get accurate total counts from data loader (includes full data counts)
|
|
672
|
-
const totalCounts = window.dataLoader.getTotalCounts();
|
|
673
|
-
if (!totalCounts) return;
|
|
674
|
-
|
|
675
|
-
// Update each filter button with accurate total count
|
|
676
|
-
const agentsBtn = document.querySelector('[data-filter="agents"]');
|
|
677
|
-
const commandsBtn = document.querySelector('[data-filter="commands"]');
|
|
678
|
-
const mcpsBtn = document.querySelector('[data-filter="mcps"]');
|
|
679
|
-
const settingsBtn = document.querySelector('[data-filter="settings"]');
|
|
680
|
-
const hooksBtn = document.querySelector('[data-filter="hooks"]');
|
|
681
|
-
const templatesBtn = document.querySelector('[data-filter="templates"]');
|
|
682
|
-
|
|
683
|
-
if (agentsBtn) {
|
|
684
|
-
agentsBtn.innerHTML = `🤖 Agents (${totalCounts.agents})`;
|
|
685
|
-
}
|
|
686
|
-
if (commandsBtn) {
|
|
687
|
-
commandsBtn.innerHTML = `⚡ Commands (${totalCounts.commands})`;
|
|
688
|
-
}
|
|
689
|
-
if (mcpsBtn) {
|
|
690
|
-
mcpsBtn.innerHTML = `🔌 MCPs (${totalCounts.mcps})`;
|
|
691
|
-
}
|
|
692
|
-
if (settingsBtn) {
|
|
693
|
-
settingsBtn.innerHTML = `⚙️ Settings (${totalCounts.settings})`;
|
|
694
|
-
}
|
|
695
|
-
if (hooksBtn) {
|
|
696
|
-
hooksBtn.innerHTML = `🪝 Hooks (${totalCounts.hooks})`;
|
|
697
|
-
}
|
|
698
|
-
if (templatesBtn) {
|
|
699
|
-
templatesBtn.innerHTML = `📦 Templates (${totalCounts.templates})`;
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
// Create Add Component card
|
|
704
|
-
createAddComponentCard(type) {
|
|
705
|
-
const typeConfig = {
|
|
706
|
-
agents: {
|
|
707
|
-
icon: '🤖',
|
|
708
|
-
name: 'Agent',
|
|
709
|
-
description: 'Create a new AI specialist agent',
|
|
710
|
-
color: '#ff6b6b'
|
|
711
|
-
},
|
|
712
|
-
commands: {
|
|
713
|
-
icon: '⚡',
|
|
714
|
-
name: 'Command',
|
|
715
|
-
description: 'Add a custom slash command',
|
|
716
|
-
color: '#4ecdc4'
|
|
717
|
-
},
|
|
718
|
-
mcps: {
|
|
719
|
-
icon: '🔌',
|
|
720
|
-
name: 'MCP',
|
|
721
|
-
description: 'Build a Model Context Protocol integration',
|
|
722
|
-
color: '#45b7d1'
|
|
723
|
-
},
|
|
724
|
-
settings: {
|
|
725
|
-
icon: '⚙️',
|
|
726
|
-
name: 'Setting',
|
|
727
|
-
description: 'Configure Claude Code behavior',
|
|
728
|
-
color: '#9c88ff'
|
|
729
|
-
},
|
|
730
|
-
hooks: {
|
|
731
|
-
icon: '🪝',
|
|
732
|
-
name: 'Hook',
|
|
733
|
-
description: 'Automate tool execution workflows',
|
|
734
|
-
color: '#ff8c42'
|
|
735
|
-
}
|
|
736
|
-
};
|
|
737
|
-
|
|
738
|
-
const config = typeConfig[type];
|
|
739
|
-
if (!config) return '';
|
|
740
|
-
|
|
741
|
-
return `
|
|
742
|
-
<div class="template-card add-template-card add-component-card" onclick="showComponentContributeModal('${type}')">
|
|
743
|
-
<div class="card-inner">
|
|
744
|
-
<div class="card-front">
|
|
745
|
-
<div class="framework-logo" style="color: ${config.color}">
|
|
746
|
-
<svg width="32" height="32" viewBox="0 0 24 24" fill="currentColor">
|
|
747
|
-
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"/>
|
|
748
|
-
</svg>
|
|
749
|
-
</div>
|
|
750
|
-
<h3 class="template-title">Add New ${config.name}</h3>
|
|
751
|
-
<p class="template-description">${config.description}</p>
|
|
752
|
-
</div>
|
|
753
|
-
</div>
|
|
754
|
-
</div>
|
|
755
|
-
`;
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
showError(message) {
|
|
759
|
-
const grid = document.getElementById('unifiedGrid');
|
|
760
|
-
if (grid) {
|
|
761
|
-
grid.innerHTML = `
|
|
762
|
-
<div class="error-message">
|
|
763
|
-
<h3>Error</h3>
|
|
764
|
-
<p>${message}</p>
|
|
765
|
-
<button onclick="location.reload()" class="btn-primary">Retry</button>
|
|
766
|
-
</div>
|
|
767
|
-
`;
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
|
|
771
|
-
// Get framework icon from mapping
|
|
772
|
-
getFrameworkIcon(framework) {
|
|
773
|
-
return this.FRAMEWORK_ICONS[framework] || this.FRAMEWORK_ICONS['default'];
|
|
774
|
-
}
|
|
775
|
-
|
|
776
|
-
// Create Add Template card
|
|
777
|
-
createAddTemplateCard() {
|
|
778
|
-
const card = document.createElement('div');
|
|
779
|
-
card.className = 'template-card add-template-card';
|
|
780
|
-
|
|
781
|
-
card.innerHTML = `
|
|
782
|
-
<div class="card-inner">
|
|
783
|
-
<div class="card-front">
|
|
784
|
-
<div class="framework-logo">
|
|
785
|
-
<svg width="32" height="32" viewBox="0 0 24 24" fill="currentColor">
|
|
786
|
-
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"/>
|
|
787
|
-
</svg>
|
|
788
|
-
</div>
|
|
789
|
-
<h3 class="template-title">Add New Template</h3>
|
|
790
|
-
<p class="template-description">Contribute a new language or framework to the community</p>
|
|
791
|
-
</div>
|
|
792
|
-
</div>
|
|
793
|
-
`;
|
|
794
|
-
|
|
795
|
-
// Add click handler
|
|
796
|
-
card.addEventListener('click', () => {
|
|
797
|
-
showComponentContributeModal('templates');
|
|
798
|
-
});
|
|
799
|
-
|
|
800
|
-
return card;
|
|
801
|
-
}
|
|
802
|
-
|
|
803
|
-
// Create template card from JSON structure
|
|
804
|
-
createTemplateCardFromJSON(template) {
|
|
805
|
-
const card = document.createElement('div');
|
|
806
|
-
card.className = 'template-card';
|
|
807
|
-
|
|
808
|
-
// Determine the icon based on template name/type
|
|
809
|
-
const icon = this.getFrameworkIcon(template.name);
|
|
810
|
-
|
|
811
|
-
// Create the display name
|
|
812
|
-
const displayName = template.subtype === 'framework'
|
|
813
|
-
? `${template.language}/${template.name}`
|
|
814
|
-
: template.name;
|
|
815
|
-
|
|
816
|
-
card.innerHTML = `
|
|
817
|
-
<div class="card-inner">
|
|
818
|
-
<div class="card-front">
|
|
819
|
-
<div class="framework-logo">
|
|
820
|
-
<i class="${icon} colored"></i>
|
|
821
|
-
</div>
|
|
822
|
-
<h3 class="template-title">${displayName}</h3>
|
|
823
|
-
<p class="template-description">${template.description}</p>
|
|
824
|
-
</div>
|
|
825
|
-
<div class="card-back">
|
|
826
|
-
<div class="command-display">
|
|
827
|
-
<h3>Installation Command</h3>
|
|
828
|
-
<div class="command-code">${template.installCommand}</div>
|
|
829
|
-
<div class="action-buttons">
|
|
830
|
-
<button class="view-files-btn" onclick="showTemplateDetails('${template.id}', '${template.name}', '${template.subtype}')">
|
|
831
|
-
📁 View Files
|
|
832
|
-
</button>
|
|
833
|
-
<button class="copy-command-btn" onclick="copyToClipboard('${template.installCommand}')">
|
|
834
|
-
📋 Copy Command
|
|
835
|
-
</button>
|
|
836
|
-
</div>
|
|
837
|
-
</div>
|
|
838
|
-
</div>
|
|
839
|
-
</div>
|
|
840
|
-
`;
|
|
841
|
-
|
|
842
|
-
// Card flip is handled by global event listener in setupEventListeners
|
|
843
|
-
|
|
844
|
-
return card;
|
|
845
|
-
}
|
|
846
|
-
|
|
847
|
-
// Create individual template card (legacy method, keep for compatibility)
|
|
848
|
-
createTemplateCard(languageKey, languageData, frameworkKey, frameworkData) {
|
|
849
|
-
const card = document.createElement('div');
|
|
850
|
-
card.className = `template-card ${languageData.comingSoon ? 'coming-soon' : ''}`;
|
|
851
|
-
|
|
852
|
-
const displayName = frameworkKey === 'none' ?
|
|
853
|
-
frameworkData.name :
|
|
854
|
-
`${languageData.name.split('/')[0]}/${frameworkData.name}`;
|
|
855
|
-
|
|
856
|
-
card.innerHTML = `
|
|
857
|
-
<div class="card-inner">
|
|
858
|
-
<div class="card-front">
|
|
859
|
-
${languageData.comingSoon ? '<div class="coming-soon-badge">Coming Soon</div>' : ''}
|
|
860
|
-
<div class="framework-logo">
|
|
861
|
-
<i class="${frameworkData.icon} colored"></i>
|
|
862
|
-
</div>
|
|
863
|
-
<h3 class="template-title">${displayName}</h3>
|
|
864
|
-
<p class="template-description">${(languageData.description || '').substring(0, 120)}${(languageData.description || '').length > 120 ? '...' : ''}</p>
|
|
865
|
-
</div>
|
|
866
|
-
<div class="card-back">
|
|
867
|
-
<div class="command-display">
|
|
868
|
-
<h3>Installation Options</h3>
|
|
869
|
-
<div class="command-code">${frameworkData.command}</div>
|
|
870
|
-
<div class="action-buttons">
|
|
871
|
-
<button class="view-files-btn" onclick="showInstallationFiles('${languageKey}', '${frameworkKey}', '${displayName}')">
|
|
872
|
-
📁 View Files
|
|
873
|
-
</button>
|
|
874
|
-
<button class="copy-command-btn" onclick="copyToClipboard('${frameworkData.command}')">
|
|
875
|
-
📋 Copy Command
|
|
876
|
-
</button>
|
|
877
|
-
</div>
|
|
878
|
-
</div>
|
|
879
|
-
</div>
|
|
880
|
-
</div>
|
|
881
|
-
`;
|
|
882
|
-
|
|
883
|
-
// Add click handler for card flip (only if not coming soon)
|
|
884
|
-
if (!languageData.comingSoon) {
|
|
885
|
-
card.addEventListener('click', (e) => {
|
|
886
|
-
// Don't flip if clicking on buttons
|
|
887
|
-
if (!e.target.closest('button')) {
|
|
888
|
-
card.classList.toggle('flipped');
|
|
889
|
-
}
|
|
890
|
-
});
|
|
891
|
-
}
|
|
892
|
-
|
|
893
|
-
return card;
|
|
894
|
-
}
|
|
895
|
-
|
|
896
|
-
// Fetch templates configuration from GitHub
|
|
897
|
-
async fetchTemplatesConfig() {
|
|
898
|
-
const GITHUB_CONFIG = {
|
|
899
|
-
owner: 'davila7',
|
|
900
|
-
repo: 'claude-code-templates',
|
|
901
|
-
branch: 'main',
|
|
902
|
-
templatesPath: 'cli-tool/src/templates.js'
|
|
903
|
-
};
|
|
904
|
-
|
|
905
|
-
try {
|
|
906
|
-
const url = `https://raw.githubusercontent.com/${GITHUB_CONFIG.owner}/${GITHUB_CONFIG.repo}/${GITHUB_CONFIG.branch}/${GITHUB_CONFIG.templatesPath}?t=${Date.now()}`;
|
|
907
|
-
const response = await fetch(url);
|
|
908
|
-
|
|
909
|
-
if (!response.ok) {
|
|
910
|
-
throw new Error(`HTTP error! status: ${response.status}`);
|
|
911
|
-
}
|
|
912
|
-
|
|
913
|
-
const templateFileContent = await response.text();
|
|
914
|
-
this.templatesData = this.parseTemplatesConfig(templateFileContent);
|
|
915
|
-
|
|
916
|
-
return this.templatesData;
|
|
917
|
-
} catch (error) {
|
|
918
|
-
console.error('Error fetching templates:', error);
|
|
919
|
-
throw error;
|
|
920
|
-
}
|
|
921
|
-
}
|
|
922
|
-
|
|
923
|
-
// Parse templates configuration
|
|
924
|
-
parseTemplatesConfig(fileContent) {
|
|
925
|
-
try {
|
|
926
|
-
const configMatch = fileContent.match(/const TEMPLATES_CONFIG = ({[\s\S]*?});/);
|
|
927
|
-
if (!configMatch) {
|
|
928
|
-
throw new Error('TEMPLATES_CONFIG not found in file');
|
|
929
|
-
}
|
|
930
|
-
|
|
931
|
-
let configString = configMatch[1];
|
|
932
|
-
configString = configString.replace(/'/g, '"');
|
|
933
|
-
configString = configString.replace(/(\w+):/g, '"$1":');
|
|
934
|
-
configString = configString.replace(/,(\s*[}\]])/g, '$1');
|
|
935
|
-
|
|
936
|
-
return JSON.parse(configString);
|
|
937
|
-
} catch (error) {
|
|
938
|
-
console.error('Error parsing templates config:', error);
|
|
939
|
-
return null;
|
|
940
|
-
}
|
|
941
|
-
}
|
|
942
|
-
|
|
943
|
-
// Show contribute modal
|
|
944
|
-
showContributeModal() {
|
|
945
|
-
alert('Contribute modal would open here - this needs to be implemented with the full modal HTML from script.js');
|
|
946
|
-
}
|
|
947
|
-
|
|
948
|
-
// Create pagination controls
|
|
949
|
-
createPaginationControls() {
|
|
950
|
-
if (this.totalPages <= 1) return '';
|
|
951
|
-
|
|
952
|
-
let paginationHTML = '<div class="pagination-container">';
|
|
953
|
-
paginationHTML += '<div class="pagination">';
|
|
954
|
-
|
|
955
|
-
// Previous button
|
|
956
|
-
const prevDisabled = this.currentPage === 1 ? 'disabled' : '';
|
|
957
|
-
paginationHTML += `<button class="pagination-btn prev-btn ${prevDisabled}" onclick="goToPage(${this.currentPage - 1})" ${prevDisabled ? 'disabled' : ''}>`;
|
|
958
|
-
paginationHTML += '<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/></svg>';
|
|
959
|
-
paginationHTML += '</button>';
|
|
960
|
-
|
|
961
|
-
// Page numbers
|
|
962
|
-
const startPage = Math.max(1, this.currentPage - 2);
|
|
963
|
-
const endPage = Math.min(this.totalPages, this.currentPage + 2);
|
|
964
|
-
|
|
965
|
-
if (startPage > 1) {
|
|
966
|
-
paginationHTML += `<button class="pagination-btn page-btn" onclick="goToPage(1)">1</button>`;
|
|
967
|
-
if (startPage > 2) {
|
|
968
|
-
paginationHTML += '<span class="pagination-dots">...</span>';
|
|
969
|
-
}
|
|
970
|
-
}
|
|
971
|
-
|
|
972
|
-
for (let i = startPage; i <= endPage; i++) {
|
|
973
|
-
const activeClass = i === this.currentPage ? 'active' : '';
|
|
974
|
-
paginationHTML += `<button class="pagination-btn page-btn ${activeClass}" onclick="goToPage(${i})">${i}</button>`;
|
|
975
|
-
}
|
|
976
|
-
|
|
977
|
-
if (endPage < this.totalPages) {
|
|
978
|
-
if (endPage < this.totalPages - 1) {
|
|
979
|
-
paginationHTML += '<span class="pagination-dots">...</span>';
|
|
980
|
-
}
|
|
981
|
-
paginationHTML += `<button class="pagination-btn page-btn" onclick="goToPage(${this.totalPages})">${this.totalPages}</button>`;
|
|
982
|
-
}
|
|
983
|
-
|
|
984
|
-
// Next button
|
|
985
|
-
const nextDisabled = this.currentPage === this.totalPages ? 'disabled' : '';
|
|
986
|
-
paginationHTML += `<button class="pagination-btn next-btn ${nextDisabled}" onclick="goToPage(${this.currentPage + 1})" ${nextDisabled ? 'disabled' : ''}>`;
|
|
987
|
-
paginationHTML += '<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M10.02 6L8.61 7.41 13.19 12l-4.58 4.59L10.02 18l6-6z"/></svg>';
|
|
988
|
-
paginationHTML += '</button>';
|
|
989
|
-
|
|
990
|
-
paginationHTML += '</div>';
|
|
991
|
-
paginationHTML += `<div class="pagination-info">Page ${this.currentPage} of ${this.totalPages}</div>`;
|
|
992
|
-
paginationHTML += '</div>';
|
|
993
|
-
|
|
994
|
-
return paginationHTML;
|
|
995
|
-
}
|
|
996
|
-
|
|
997
|
-
// Navigate to specific page
|
|
998
|
-
goToPage(page) {
|
|
999
|
-
if (page < 1 || page > this.totalPages || page === this.currentPage) return;
|
|
1000
|
-
|
|
1001
|
-
this.currentPage = page;
|
|
1002
|
-
this.displayCurrentFilter();
|
|
1003
|
-
|
|
1004
|
-
// Scroll to top of content grid
|
|
1005
|
-
const contentGrid = document.getElementById('contentGrid');
|
|
1006
|
-
if (contentGrid) {
|
|
1007
|
-
contentGrid.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
|
1008
|
-
}
|
|
1009
|
-
}
|
|
1010
|
-
|
|
1011
|
-
// Update pagination controls
|
|
1012
|
-
updatePagination(paginationHTML) {
|
|
1013
|
-
// Remove any existing pagination containers from the entire document
|
|
1014
|
-
const existingPaginations = document.querySelectorAll('.pagination-container');
|
|
1015
|
-
existingPaginations.forEach(pagination => pagination.remove());
|
|
1016
|
-
|
|
1017
|
-
// Add new pagination if needed
|
|
1018
|
-
if (this.totalPages > 1 && paginationHTML) {
|
|
1019
|
-
const contentGrid = document.getElementById('contentGrid');
|
|
1020
|
-
if (contentGrid) {
|
|
1021
|
-
contentGrid.insertAdjacentHTML('afterend', paginationHTML);
|
|
1022
|
-
}
|
|
1023
|
-
}
|
|
1024
|
-
}
|
|
1025
|
-
}
|
|
1026
|
-
|
|
1027
|
-
// Global function for component details is now handled by modal-helpers.js
|
|
1028
|
-
|
|
1029
|
-
// Global function for copying is now handled by utils.js
|
|
1030
|
-
|
|
1031
|
-
// Global function for handling sort change (called from onchange)
|
|
1032
|
-
function handleSortChange(sortValue) {
|
|
1033
|
-
if (window.indexManager) {
|
|
1034
|
-
window.indexManager.handleSortChange(sortValue);
|
|
1035
|
-
}
|
|
1036
|
-
}
|
|
1037
|
-
|
|
1038
|
-
// Global function for handling filter click with navigation
|
|
1039
|
-
function handleFilterClick(event, filter) {
|
|
1040
|
-
event.preventDefault(); // Prevent default link navigation
|
|
1041
|
-
setUnifiedFilter(filter);
|
|
1042
|
-
}
|
|
1043
|
-
|
|
1044
|
-
// Global function for setting filter (called from onclick)
|
|
1045
|
-
function setUnifiedFilter(filter) {
|
|
1046
|
-
if (window.indexManager) {
|
|
1047
|
-
window.indexManager.setFilter(filter);
|
|
1048
|
-
}
|
|
1049
|
-
|
|
1050
|
-
// Update filter buttons - remove active from ALL filter buttons
|
|
1051
|
-
document.querySelectorAll('.component-type-filters .filter-chip').forEach(btn => {
|
|
1052
|
-
btn.classList.remove('active');
|
|
1053
|
-
});
|
|
1054
|
-
|
|
1055
|
-
// Add active class only to the clicked filter button
|
|
1056
|
-
const activeBtn = document.querySelector(`.component-type-filters [data-filter="${filter}"]`);
|
|
1057
|
-
if (activeBtn) {
|
|
1058
|
-
activeBtn.classList.add('active');
|
|
1059
|
-
}
|
|
1060
|
-
|
|
1061
|
-
console.log('Component type filter selected:', filter);
|
|
1062
|
-
|
|
1063
|
-
// Update URL with filter parameter
|
|
1064
|
-
if (typeof updateURLWithFilter === 'function') {
|
|
1065
|
-
updateURLWithFilter(filter);
|
|
1066
|
-
}
|
|
1067
|
-
|
|
1068
|
-
// Show category filters for the selected component type
|
|
1069
|
-
showCategoryFilters(filter);
|
|
1070
|
-
}
|
|
1071
|
-
|
|
1072
|
-
// Function to show category filters based on component type
|
|
1073
|
-
function showCategoryFilters(componentType) {
|
|
1074
|
-
const categoryContainer = document.getElementById('componentCategories');
|
|
1075
|
-
const categoryChips = document.getElementById('categoryChips');
|
|
1076
|
-
|
|
1077
|
-
if (!categoryContainer || !categoryChips) return;
|
|
1078
|
-
|
|
1079
|
-
// Get categories from actual component data
|
|
1080
|
-
let categories = [];
|
|
1081
|
-
|
|
1082
|
-
if (window.dataLoader) {
|
|
1083
|
-
const dataLoader = window.dataLoader;
|
|
1084
|
-
|
|
1085
|
-
console.log('DataLoader available, getting categories for:', componentType);
|
|
1086
|
-
console.log('DataLoader componentsData:', dataLoader.componentsData);
|
|
1087
|
-
|
|
1088
|
-
switch(componentType) {
|
|
1089
|
-
case 'agents':
|
|
1090
|
-
const agents = dataLoader.getComponentsByType('agent');
|
|
1091
|
-
console.log('Agents data:', agents);
|
|
1092
|
-
categories = getUniqueCategories(agents);
|
|
1093
|
-
break;
|
|
1094
|
-
case 'commands':
|
|
1095
|
-
const commands = dataLoader.getComponentsByType('command');
|
|
1096
|
-
console.log('Commands data:', commands);
|
|
1097
|
-
categories = getUniqueCategories(commands);
|
|
1098
|
-
break;
|
|
1099
|
-
case 'settings':
|
|
1100
|
-
try {
|
|
1101
|
-
categories = dataLoader.getSettingCategories ? dataLoader.getSettingCategories() : getUniqueCategories(dataLoader.getSettings());
|
|
1102
|
-
} catch (e) {
|
|
1103
|
-
const settings = dataLoader.getComponentsByType('setting') || dataLoader.getSettings();
|
|
1104
|
-
categories = getUniqueCategories(settings);
|
|
1105
|
-
}
|
|
1106
|
-
break;
|
|
1107
|
-
case 'hooks':
|
|
1108
|
-
try {
|
|
1109
|
-
categories = dataLoader.getHookCategories ? dataLoader.getHookCategories() : getUniqueCategories(dataLoader.getHooks());
|
|
1110
|
-
} catch (e) {
|
|
1111
|
-
const hooks = dataLoader.getComponentsByType('hook') || dataLoader.getHooks();
|
|
1112
|
-
categories = getUniqueCategories(hooks);
|
|
1113
|
-
}
|
|
1114
|
-
break;
|
|
1115
|
-
case 'mcps':
|
|
1116
|
-
const mcps = dataLoader.getComponentsByType('mcp');
|
|
1117
|
-
console.log('MCPs data:', mcps);
|
|
1118
|
-
categories = getUniqueCategories(mcps);
|
|
1119
|
-
break;
|
|
1120
|
-
case 'templates':
|
|
1121
|
-
const templates = dataLoader.getComponentsByType('template');
|
|
1122
|
-
console.log('Templates data:', templates);
|
|
1123
|
-
categories = getUniqueCategories(templates);
|
|
1124
|
-
break;
|
|
1125
|
-
default:
|
|
1126
|
-
categories = [];
|
|
1127
|
-
}
|
|
1128
|
-
|
|
1129
|
-
console.log('Found categories for', componentType, ':', categories);
|
|
1130
|
-
} else {
|
|
1131
|
-
console.log('DataLoader not available yet');
|
|
1132
|
-
}
|
|
1133
|
-
|
|
1134
|
-
// Add "All" option at the beginning
|
|
1135
|
-
if (categories.length > 0) {
|
|
1136
|
-
categories.unshift('All');
|
|
1137
|
-
}
|
|
1138
|
-
|
|
1139
|
-
if (categories.length > 0) {
|
|
1140
|
-
categoryChips.innerHTML = categories.map((category, index) => {
|
|
1141
|
-
const displayName = formatCategoryName(category);
|
|
1142
|
-
// Only the first item (All) should be active by default
|
|
1143
|
-
const isActive = index === 0 ? 'active' : '';
|
|
1144
|
-
return `
|
|
1145
|
-
<button class="filter-chip ${isActive}" data-category="${category.toLowerCase()}" onclick="setCategoryFilter('${category.toLowerCase()}')">
|
|
1146
|
-
${displayName}
|
|
1147
|
-
</button>
|
|
1148
|
-
`;
|
|
1149
|
-
}).join('');
|
|
1150
|
-
|
|
1151
|
-
categoryContainer.style.display = 'block';
|
|
1152
|
-
} else {
|
|
1153
|
-
categoryContainer.style.display = 'none';
|
|
1154
|
-
}
|
|
1155
|
-
}
|
|
1156
|
-
|
|
1157
|
-
// Helper function to extract unique categories from component data
|
|
1158
|
-
function getUniqueCategories(components) {
|
|
1159
|
-
if (!components || !Array.isArray(components)) return [];
|
|
1160
|
-
|
|
1161
|
-
const categories = new Set();
|
|
1162
|
-
components.forEach(component => {
|
|
1163
|
-
if (component.category && component.category.trim() !== '') {
|
|
1164
|
-
categories.add(component.category);
|
|
1165
|
-
}
|
|
1166
|
-
});
|
|
1167
|
-
|
|
1168
|
-
return Array.from(categories).sort();
|
|
1169
|
-
}
|
|
1170
|
-
|
|
1171
|
-
// Helper function to format category names for display
|
|
1172
|
-
function formatCategoryName(category) {
|
|
1173
|
-
if (category === 'All') return 'All';
|
|
1174
|
-
|
|
1175
|
-
// Convert category names to proper case
|
|
1176
|
-
return category
|
|
1177
|
-
.split(/[-_\s]+/)
|
|
1178
|
-
.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
1179
|
-
.join(' ');
|
|
1180
|
-
}
|
|
1181
|
-
|
|
1182
|
-
// Function to handle category filter selection
|
|
1183
|
-
// Enhanced setCategoryFilter function that handles both old and new category systems
|
|
1184
|
-
window.setCategoryFilter = function setCategoryFilter(category) {
|
|
1185
|
-
console.log('setCategoryFilter called with:', category);
|
|
1186
|
-
|
|
1187
|
-
// Handle the new category chips in #categoryChips
|
|
1188
|
-
const categoryButtons = document.querySelectorAll('#categoryChips button.filter-chip');
|
|
1189
|
-
if (categoryButtons.length > 0) {
|
|
1190
|
-
console.log('Found new category buttons:', categoryButtons.length);
|
|
1191
|
-
|
|
1192
|
-
categoryButtons.forEach((btn, index) => {
|
|
1193
|
-
console.log(`Button ${index}:`, btn.getAttribute('data-category'), 'has active:', btn.classList.contains('active'));
|
|
1194
|
-
btn.classList.remove('active');
|
|
1195
|
-
});
|
|
1196
|
-
|
|
1197
|
-
// Add active class only to the clicked button
|
|
1198
|
-
const activeBtn = document.querySelector(`#categoryChips button[data-category="${category}"]`);
|
|
1199
|
-
console.log('Target button found:', activeBtn);
|
|
1200
|
-
|
|
1201
|
-
if (activeBtn) {
|
|
1202
|
-
activeBtn.classList.add('active');
|
|
1203
|
-
console.log('Added active class to:', category);
|
|
1204
|
-
}
|
|
1205
|
-
}
|
|
1206
|
-
|
|
1207
|
-
// Also call the existing IndexManager setCategoryFilter method for actual filtering
|
|
1208
|
-
if (window.indexManager && window.indexManager.setCategoryFilter) {
|
|
1209
|
-
console.log('Calling IndexManager setCategoryFilter with:', category);
|
|
1210
|
-
window.indexManager.setCategoryFilter(category);
|
|
1211
|
-
}
|
|
1212
|
-
|
|
1213
|
-
// Force re-render of the current filter to apply category filtering
|
|
1214
|
-
if (window.indexManager && window.indexManager.displayCurrentFilter) {
|
|
1215
|
-
console.log('Re-displaying current filter to apply category filter');
|
|
1216
|
-
window.indexManager.displayCurrentFilter();
|
|
1217
|
-
}
|
|
1218
|
-
}
|
|
1219
|
-
|
|
1220
|
-
// Test function to debug category filters
|
|
1221
|
-
window.testCategoryFilter = function() {
|
|
1222
|
-
console.log('=== Category Filter Debug ===');
|
|
1223
|
-
const categoryChips = document.getElementById('categoryChips');
|
|
1224
|
-
console.log('Category chips container:', categoryChips);
|
|
1225
|
-
|
|
1226
|
-
if (categoryChips) {
|
|
1227
|
-
const buttons = categoryChips.querySelectorAll('button.filter-chip');
|
|
1228
|
-
console.log('Found buttons:', buttons.length);
|
|
1229
|
-
|
|
1230
|
-
buttons.forEach((btn, index) => {
|
|
1231
|
-
console.log(`Button ${index}:`, {
|
|
1232
|
-
category: btn.getAttribute('data-category'),
|
|
1233
|
-
hasActive: btn.classList.contains('active'),
|
|
1234
|
-
onclick: btn.getAttribute('onclick')
|
|
1235
|
-
});
|
|
1236
|
-
});
|
|
1237
|
-
}
|
|
1238
|
-
|
|
1239
|
-
console.log('setCategoryFilter function exists:', typeof window.setCategoryFilter);
|
|
1240
|
-
}
|
|
1241
|
-
|
|
1242
|
-
// Global helper functions for template cards
|
|
1243
|
-
function showInstallationFiles(languageKey, frameworkKey, displayName) {
|
|
1244
|
-
console.log('Show installation files for:', displayName);
|
|
1245
|
-
// For now, just show a simple alert - could be enhanced later with full modal
|
|
1246
|
-
alert(`Installation files for ${displayName} would be shown here.`);
|
|
1247
|
-
}
|
|
1248
|
-
|
|
1249
|
-
// Global function for template details
|
|
1250
|
-
function showTemplateDetails(templateId, templateName, subtype) {
|
|
1251
|
-
if (!window.indexManager || !window.indexManager.componentsData) {
|
|
1252
|
-
console.error('IndexManager or components data not available');
|
|
1253
|
-
return;
|
|
1254
|
-
}
|
|
1255
|
-
|
|
1256
|
-
// Find the template in the data
|
|
1257
|
-
const template = window.indexManager.componentsData.templates.find(t => t.id === templateId);
|
|
1258
|
-
if (!template) {
|
|
1259
|
-
console.error('Template not found:', templateId);
|
|
1260
|
-
return;
|
|
1261
|
-
}
|
|
1262
|
-
|
|
1263
|
-
// Create modal to show template files
|
|
1264
|
-
const modalHTML = `
|
|
1265
|
-
<div class="modal-overlay" onclick="closeComponentModal()">
|
|
1266
|
-
<div class="modal-content component-modal" onclick="event.stopPropagation()">
|
|
1267
|
-
<div class="modal-header">
|
|
1268
|
-
<div class="component-modal-title">
|
|
1269
|
-
<span class="component-icon">📦</span>
|
|
1270
|
-
<h3>${templateName} Template</h3>
|
|
1271
|
-
</div>
|
|
1272
|
-
<div class="component-type-badge" style="background-color: #f9a825;">TEMPLATE</div>
|
|
1273
|
-
<button class="modal-close" onclick="closeComponentModal()">×</button>
|
|
1274
|
-
</div>
|
|
1275
|
-
<div class="modal-body">
|
|
1276
|
-
<div class="component-details">
|
|
1277
|
-
<div class="component-description">
|
|
1278
|
-
${template.description}
|
|
1279
|
-
</div>
|
|
1280
|
-
|
|
1281
|
-
<div class="installation-section">
|
|
1282
|
-
<h4>📦 Installation</h4>
|
|
1283
|
-
<div class="command-line">
|
|
1284
|
-
<code>${template.installCommand}</code>
|
|
1285
|
-
<button class="copy-btn" onclick="copyToClipboard('${template.installCommand}')">Copy</button>
|
|
1286
|
-
</div>
|
|
1287
|
-
</div>
|
|
1288
|
-
|
|
1289
|
-
<div class="component-content">
|
|
1290
|
-
<h4>📁 Template Files (${template.files ? template.files.length : 0} files)</h4>
|
|
1291
|
-
${template.files && template.files.length > 0 ? `
|
|
1292
|
-
<div class="template-files-list">
|
|
1293
|
-
${template.files.map(file => `
|
|
1294
|
-
<div class="template-file-item">
|
|
1295
|
-
<span class="file-icon">📄</span>
|
|
1296
|
-
<span class="file-name">${file}</span>
|
|
1297
|
-
</div>
|
|
1298
|
-
`).join('')}
|
|
1299
|
-
</div>
|
|
1300
|
-
` : '<p>No files listed for this template.</p>'}
|
|
1301
|
-
</div>
|
|
1302
|
-
</div>
|
|
1303
|
-
</div>
|
|
1304
|
-
<div class="modal-actions">
|
|
1305
|
-
<a href="https://github.com/davila7/claude-code-templates/tree/main/cli-tool/templates/${subtype === 'framework' ? `${template.language}/examples/${templateName}` : templateName}" target="_blank" class="github-folder-link">
|
|
1306
|
-
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
|
|
1307
|
-
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.30.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
|
|
1308
|
-
</svg>
|
|
1309
|
-
View on GitHub
|
|
1310
|
-
</a>
|
|
1311
|
-
</div>
|
|
1312
|
-
</div>
|
|
1313
|
-
</div>
|
|
1314
|
-
`;
|
|
1315
|
-
|
|
1316
|
-
// Remove existing modal if present
|
|
1317
|
-
const existingModal = document.querySelector('.modal-overlay');
|
|
1318
|
-
if (existingModal) {
|
|
1319
|
-
existingModal.remove();
|
|
1320
|
-
}
|
|
1321
|
-
|
|
1322
|
-
// Add modal to body
|
|
1323
|
-
document.body.insertAdjacentHTML('beforeend', modalHTML);
|
|
1324
|
-
}
|
|
1325
|
-
|
|
1326
|
-
// Global function for setting category filter (called from onclick)
|
|
1327
|
-
// setCategoryFilter function is now defined globally above as window.setCategoryFilter
|
|
1328
|
-
|
|
1329
|
-
// Show component contribute modal (copied from script.js)
|
|
1330
|
-
function showComponentContributeModal(type) {
|
|
1331
|
-
const typeConfig = {
|
|
1332
|
-
agents: {
|
|
1333
|
-
name: 'Agent',
|
|
1334
|
-
description: 'AI specialist that handles specific development tasks',
|
|
1335
|
-
example: 'python-testing-specialist',
|
|
1336
|
-
structure: '- Agent metadata (name, description, color)\n- Core expertise areas\n- When to use guidelines\n- Code examples and patterns'
|
|
1337
|
-
},
|
|
1338
|
-
commands: {
|
|
1339
|
-
name: 'Command',
|
|
1340
|
-
description: 'Custom slash command for Claude Code',
|
|
1341
|
-
example: 'optimize-bundle',
|
|
1342
|
-
structure: '- Command description and usage\n- Task breakdown\n- Process steps\n- Best practices and examples'
|
|
1343
|
-
},
|
|
1344
|
-
mcps: {
|
|
1345
|
-
name: 'MCP',
|
|
1346
|
-
description: 'Model Context Protocol integration',
|
|
1347
|
-
example: 'redis-integration',
|
|
1348
|
-
structure: '- MCP server configuration\n- Connection parameters\n- Environment variables\n- Usage examples'
|
|
1349
|
-
},
|
|
1350
|
-
settings: {
|
|
1351
|
-
name: 'Setting',
|
|
1352
|
-
description: 'Claude Code configuration setting',
|
|
1353
|
-
example: 'custom-model-config',
|
|
1354
|
-
structure: '- Setting description\n- Configuration options\n- Environment variables\n- Usage examples and best practices'
|
|
1355
|
-
},
|
|
1356
|
-
hooks: {
|
|
1357
|
-
name: 'Hook',
|
|
1358
|
-
description: 'Automation hook for tool execution',
|
|
1359
|
-
example: 'format-on-save',
|
|
1360
|
-
structure: '- Hook description and trigger\n- Command to execute\n- PreToolUse or PostToolUse configuration\n- Error handling and examples'
|
|
1361
|
-
},
|
|
1362
|
-
templates: {
|
|
1363
|
-
name: 'Template',
|
|
1364
|
-
description: 'Project template with language or framework setup',
|
|
1365
|
-
example: 'python or django-app',
|
|
1366
|
-
structure: 'For Languages: Create folder with base files\nFor Frameworks: Add to examples/ subfolder with specific setup'
|
|
1367
|
-
}
|
|
1368
|
-
};
|
|
1369
|
-
|
|
1370
|
-
const config = typeConfig[type];
|
|
1371
|
-
|
|
1372
|
-
let modalHTML = '';
|
|
1373
|
-
|
|
1374
|
-
if (type === 'templates') {
|
|
1375
|
-
// Special modal for templates
|
|
1376
|
-
modalHTML = `
|
|
1377
|
-
<div class="modal-overlay" onclick="closeComponentModal()">
|
|
1378
|
-
<div class="modal-content contribute-modal" onclick="event.stopPropagation()">
|
|
1379
|
-
<div class="modal-header">
|
|
1380
|
-
<h3>📦 Contribute a New Template</h3>
|
|
1381
|
-
<button class="modal-close" onclick="closeComponentModal()">×</button>
|
|
1382
|
-
</div>
|
|
1383
|
-
<div class="modal-body">
|
|
1384
|
-
<div class="contribute-intro">
|
|
1385
|
-
<p>Help expand Claude Code by contributing a new project template! Choose between contributing a new <strong>Language</strong> or a <strong>Framework</strong>:</p>
|
|
1386
|
-
</div>
|
|
1387
|
-
|
|
1388
|
-
<div class="template-types">
|
|
1389
|
-
<div class="template-type-section">
|
|
1390
|
-
<h3>🏗️ Contributing a New Language</h3>
|
|
1391
|
-
<p>Add support for a completely new programming language (e.g., Kotlin, PHP, Swift)</p>
|
|
1392
|
-
|
|
1393
|
-
<div class="contribute-steps">
|
|
1394
|
-
<div class="contribute-step">
|
|
1395
|
-
<div class="step-number-contrib">1</div>
|
|
1396
|
-
<div class="step-content-contrib">
|
|
1397
|
-
<h4>Create Language Folder</h4>
|
|
1398
|
-
<p>Create a new folder in <code>cli-tool/templates/</code> with your language name:</p>
|
|
1399
|
-
<div class="step-command">
|
|
1400
|
-
<code>mkdir cli-tool/templates/kotlin</code>
|
|
1401
|
-
<button class="copy-btn" onclick="copyToClipboard('mkdir cli-tool/templates/kotlin')">Copy</button>
|
|
1402
|
-
</div>
|
|
1403
|
-
</div>
|
|
1404
|
-
</div>
|
|
1405
|
-
|
|
1406
|
-
<div class="contribute-step">
|
|
1407
|
-
<div class="step-number-contrib">2</div>
|
|
1408
|
-
<div class="step-content-contrib">
|
|
1409
|
-
<h4>Add Base Files</h4>
|
|
1410
|
-
<p>Add the essential files for your language. <strong>Required Claude Code files:</strong></p>
|
|
1411
|
-
<div class="claude-files-info">
|
|
1412
|
-
<ul>
|
|
1413
|
-
<li><code>CLAUDE.md</code> - Project documentation and Claude Code instructions</li>
|
|
1414
|
-
<li><code>.mcp.json</code> - MCP server configuration if needed</li>
|
|
1415
|
-
<li><code>.claude/</code> - Claude Code configuration folder with agents, commands, and settings</li>
|
|
1416
|
-
</ul>
|
|
1417
|
-
</div>
|
|
1418
|
-
<div class="component-structure">
|
|
1419
|
-
<strong>Required structure:</strong>
|
|
1420
|
-
<pre>cli-tool/templates/kotlin/
|
|
1421
|
-
├── CLAUDE.md # Claude Code configuration
|
|
1422
|
-
├── .mcp.json # MCP server configuration
|
|
1423
|
-
└── .claude/ # Claude Code settings
|
|
1424
|
-
├── agents/ # Language-specific agents
|
|
1425
|
-
├── commands/ # Language-specific commands
|
|
1426
|
-
└── settings.json # Claude settings
|
|
1427
|
-
</pre>
|
|
1428
|
-
</div>
|
|
1429
|
-
</div>
|
|
1430
|
-
</div>
|
|
1431
|
-
|
|
1432
|
-
<div class="contribute-step">
|
|
1433
|
-
<div class="step-number-contrib">3</div>
|
|
1434
|
-
<div class="step-content-contrib">
|
|
1435
|
-
<h4>Create Examples Folder (Optional)</h4>
|
|
1436
|
-
<p>If your language has popular frameworks, create an examples folder:</p>
|
|
1437
|
-
<div class="step-command">
|
|
1438
|
-
<code>mkdir cli-tool/templates/kotlin/examples</code>
|
|
1439
|
-
<button class="copy-btn" onclick="copyToClipboard('mkdir cli-tool/templates/kotlin/examples')">Copy</button>
|
|
1440
|
-
</div>
|
|
1441
|
-
</div>
|
|
1442
|
-
</div>
|
|
1443
|
-
</div>
|
|
1444
|
-
</div>
|
|
1445
|
-
|
|
1446
|
-
<div class="template-type-section">
|
|
1447
|
-
<h3>⚡ Contributing a Framework</h3>
|
|
1448
|
-
<p>Add a framework variation to an existing language (e.g., Spring Boot for Java)</p>
|
|
1449
|
-
|
|
1450
|
-
<div class="contribute-steps">
|
|
1451
|
-
<div class="contribute-step">
|
|
1452
|
-
<div class="step-number-contrib">1</div>
|
|
1453
|
-
<div class="step-content-contrib">
|
|
1454
|
-
<h4>Choose Existing Language</h4>
|
|
1455
|
-
<p>Navigate to an existing language's examples folder:</p>
|
|
1456
|
-
<div class="step-command">
|
|
1457
|
-
<code>cd cli-tool/templates/javascript-typescript/examples</code>
|
|
1458
|
-
<button class="copy-btn" onclick="copyToClipboard('cd cli-tool/templates/javascript-typescript/examples')">Copy</button>
|
|
1459
|
-
</div>
|
|
1460
|
-
</div>
|
|
1461
|
-
</div>
|
|
1462
|
-
|
|
1463
|
-
<div class="contribute-step">
|
|
1464
|
-
<div class="step-number-contrib">2</div>
|
|
1465
|
-
<div class="step-content-contrib">
|
|
1466
|
-
<h4>Create Framework Folder</h4>
|
|
1467
|
-
<p>Create a folder with your framework name:</p>
|
|
1468
|
-
<div class="step-command">
|
|
1469
|
-
<code>mkdir nextjs-app</code>
|
|
1470
|
-
<button class="copy-btn" onclick="copyToClipboard('mkdir nextjs-app')">Copy</button>
|
|
1471
|
-
</div>
|
|
1472
|
-
</div>
|
|
1473
|
-
</div>
|
|
1474
|
-
|
|
1475
|
-
<div class="contribute-step">
|
|
1476
|
-
<div class="step-number-contrib">3</div>
|
|
1477
|
-
<div class="step-content-contrib">
|
|
1478
|
-
<h4>Add Framework Files</h4>
|
|
1479
|
-
<p>Add all necessary files for your framework setup. <strong>Required Claude Code files:</strong></p>
|
|
1480
|
-
<div class="claude-files-info">
|
|
1481
|
-
<ul>
|
|
1482
|
-
<li><code>CLAUDE.md</code> - Framework documentation and Claude Code instructions</li>
|
|
1483
|
-
<li><code>.mcp.json</code> - MCP server configuration for framework-specific tools</li>
|
|
1484
|
-
<li><code>.claude/</code> - Claude Code configuration folder with framework-specific agents and commands</li>
|
|
1485
|
-
</ul>
|
|
1486
|
-
</div>
|
|
1487
|
-
<div class="component-structure">
|
|
1488
|
-
<strong>Required structure:</strong>
|
|
1489
|
-
<pre>nextjs-app/
|
|
1490
|
-
├── CLAUDE.md # Claude Code configuration
|
|
1491
|
-
├── .mcp.json # MCP server configuration
|
|
1492
|
-
└── .claude/ # Claude Code settings
|
|
1493
|
-
├── agents/ # Framework-specific agents
|
|
1494
|
-
├── commands/ # Framework-specific commands
|
|
1495
|
-
└── settings.json # Claude settings
|
|
1496
|
-
</pre>
|
|
1497
|
-
</div>
|
|
1498
|
-
</div>
|
|
1499
|
-
</div>
|
|
1500
|
-
</div>
|
|
1501
|
-
</div>
|
|
1502
|
-
</div>
|
|
1503
|
-
|
|
1504
|
-
<div class="contribute-step">
|
|
1505
|
-
<div class="step-number-contrib">4</div>
|
|
1506
|
-
<div class="step-content-contrib">
|
|
1507
|
-
<h4>Test Your Template</h4>
|
|
1508
|
-
<p>Test your template installation:</p>
|
|
1509
|
-
<div class="step-command">
|
|
1510
|
-
<code>npx claude-code-templates@latest --template=your-template-name --yes</code>
|
|
1511
|
-
<button class="copy-btn" onclick="copyToClipboard('npx claude-code-templates@latest --template=your-template-name --yes')">Copy</button>
|
|
1512
|
-
</div>
|
|
1513
|
-
</div>
|
|
1514
|
-
</div>
|
|
1515
|
-
|
|
1516
|
-
<div class="contribute-step">
|
|
1517
|
-
<div class="step-number-contrib">5</div>
|
|
1518
|
-
<div class="step-content-contrib">
|
|
1519
|
-
<h4>Submit Pull Request</h4>
|
|
1520
|
-
<p>Submit your template contribution:</p>
|
|
1521
|
-
<div class="step-command">
|
|
1522
|
-
<code>git add cli-tool/templates/</code>
|
|
1523
|
-
<button class="copy-btn" onclick="copyToClipboard('git add cli-tool/templates/')">Copy</button>
|
|
1524
|
-
</div>
|
|
1525
|
-
<div class="step-command">
|
|
1526
|
-
<code>git commit -m "feat: Add [language/framework] template"</code>
|
|
1527
|
-
<button class="copy-btn" onclick="copyToClipboard('git commit -m \\"feat: Add [language/framework] template\\"')">Copy</button>
|
|
1528
|
-
</div>
|
|
1529
|
-
</div>
|
|
1530
|
-
</div>
|
|
1531
|
-
|
|
1532
|
-
<div class="contribute-footer">
|
|
1533
|
-
<div class="help-section">
|
|
1534
|
-
<h4>Need Help?</h4>
|
|
1535
|
-
<p>Check <a href="https://github.com/davila7/claude-code-templates/tree/main/cli-tool/templates" target="_blank">existing templates</a> for examples or open an issue on GitHub for guidance.</p>
|
|
1536
|
-
</div>
|
|
1537
|
-
</div>
|
|
1538
|
-
</div>
|
|
1539
|
-
</div>
|
|
1540
|
-
</div>
|
|
1541
|
-
`;
|
|
1542
|
-
} else {
|
|
1543
|
-
// Default modal for other component types
|
|
1544
|
-
modalHTML = `
|
|
1545
|
-
<div class="modal-overlay" onclick="closeComponentModal()">
|
|
1546
|
-
<div class="modal-content contribute-modal" onclick="event.stopPropagation()">
|
|
1547
|
-
<div class="modal-header">
|
|
1548
|
-
<h3>📝 Contribute a New ${config.name}</h3>
|
|
1549
|
-
<button class="modal-close" onclick="closeComponentModal()">×</button>
|
|
1550
|
-
</div>
|
|
1551
|
-
<div class="modal-body">
|
|
1552
|
-
<div class="contribute-intro">
|
|
1553
|
-
<p>Help expand Claude Code by contributing a new ${config.name.toLowerCase()}! Follow these steps:</p>
|
|
1554
|
-
</div>
|
|
1555
|
-
|
|
1556
|
-
<div class="contribute-steps">
|
|
1557
|
-
<div class="contribute-step">
|
|
1558
|
-
<div class="step-number-contrib">1</div>
|
|
1559
|
-
<div class="step-content-contrib">
|
|
1560
|
-
<h4>Create Your ${config.name}</h4>
|
|
1561
|
-
<p>Add your ${config.name.toLowerCase()} to: <code>cli-tool/components/${type}/</code></p>
|
|
1562
|
-
<div class="component-structure">
|
|
1563
|
-
<strong>Structure should include:</strong>
|
|
1564
|
-
<pre>${config.structure}</pre>
|
|
1565
|
-
</div>
|
|
1566
|
-
<div class="step-command">
|
|
1567
|
-
<strong>Example filename:</strong> <code>${config.example}.${(type === 'mcps' || type === 'settings' || type === 'hooks') ? 'json' : 'md'}</code>
|
|
1568
|
-
</div>
|
|
1569
|
-
</div>
|
|
1570
|
-
</div>
|
|
1571
|
-
|
|
1572
|
-
<div class="contribute-step">
|
|
1573
|
-
<div class="step-number-contrib">2</div>
|
|
1574
|
-
<div class="step-content-contrib">
|
|
1575
|
-
<h4>Follow the Pattern</h4>
|
|
1576
|
-
<p>Check existing ${type} in the repository to understand the structure and conventions.</p>
|
|
1577
|
-
<div class="step-command">
|
|
1578
|
-
<a href="https://github.com/davila7/claude-code-templates/tree/main/cli-tool/components/${type}" target="_blank" class="github-folder-link">
|
|
1579
|
-
📁 View existing ${type}
|
|
1580
|
-
</a>
|
|
1581
|
-
</div>
|
|
1582
|
-
</div>
|
|
1583
|
-
</div>
|
|
1584
|
-
|
|
1585
|
-
<div class="contribute-step">
|
|
1586
|
-
<div class="step-number-contrib">3</div>
|
|
1587
|
-
<div class="step-content-contrib">
|
|
1588
|
-
<h4>Test Your Component</h4>
|
|
1589
|
-
<p>Ensure your ${config.name.toLowerCase()} works correctly with Claude Code.</p>
|
|
1590
|
-
<div class="step-command">
|
|
1591
|
-
<code>cd cli-tool && npm test</code>
|
|
1592
|
-
<button class="copy-btn" onclick="copyToClipboard('cd cli-tool && npm test')">Copy</button>
|
|
1593
|
-
</div>
|
|
1594
|
-
</div>
|
|
1595
|
-
</div>
|
|
1596
|
-
|
|
1597
|
-
<div class="contribute-step">
|
|
1598
|
-
<div class="step-number-contrib">4</div>
|
|
1599
|
-
<div class="step-content-contrib">
|
|
1600
|
-
<h4>Submit Pull Request</h4>
|
|
1601
|
-
<p>Submit your contribution with proper documentation:</p>
|
|
1602
|
-
<div class="step-command">
|
|
1603
|
-
<code>git add cli-tool/components/${type}/${config.example}.${(type === 'mcps' || type === 'settings' || type === 'hooks') ? 'json' : 'md'}</code>
|
|
1604
|
-
<button class="copy-btn" onclick="copyToClipboard('git add cli-tool/components/${type}/${config.example}.${(type === 'mcps' || type === 'settings' || type === 'hooks') ? 'json' : 'md'}')">Copy</button>
|
|
1605
|
-
</div>
|
|
1606
|
-
<div class="step-command">
|
|
1607
|
-
<code>git commit -m "feat: Add ${config.example} ${config.name.toLowerCase()}"</code>
|
|
1608
|
-
<button class="copy-btn" onclick="copyToClipboard('git commit -m \\"feat: Add ${config.example} ${config.name.toLowerCase()}\\"')">Copy</button>
|
|
1609
|
-
</div>
|
|
1610
|
-
</div>
|
|
1611
|
-
</div>
|
|
1612
|
-
</div>
|
|
1613
|
-
|
|
1614
|
-
<div class="contribute-footer">
|
|
1615
|
-
<div class="help-section">
|
|
1616
|
-
<h4>Need Help?</h4>
|
|
1617
|
-
<p>Check existing ${type} for examples or open an issue on GitHub for guidance.</p>
|
|
1618
|
-
</div>
|
|
1619
|
-
</div>
|
|
1620
|
-
</div>
|
|
1621
|
-
</div>
|
|
1622
|
-
</div>
|
|
1623
|
-
`;
|
|
1624
|
-
}
|
|
1625
|
-
|
|
1626
|
-
// Remove existing modal if present
|
|
1627
|
-
const existingModal = document.querySelector('.modal-overlay');
|
|
1628
|
-
if (existingModal) {
|
|
1629
|
-
existingModal.remove();
|
|
1630
|
-
}
|
|
1631
|
-
|
|
1632
|
-
// Add modal to body
|
|
1633
|
-
document.body.insertAdjacentHTML('beforeend', modalHTML);
|
|
1634
|
-
|
|
1635
|
-
// Add event listener for ESC key
|
|
1636
|
-
const handleEscape = (e) => {
|
|
1637
|
-
if (e.key === 'Escape') {
|
|
1638
|
-
closeComponentModal();
|
|
1639
|
-
document.removeEventListener('keydown', handleEscape);
|
|
1640
|
-
}
|
|
1641
|
-
};
|
|
1642
|
-
document.addEventListener('keydown', handleEscape);
|
|
1643
|
-
}
|
|
1644
|
-
|
|
1645
|
-
// Global functions for templates functionality
|
|
1646
|
-
function showInstallationFiles(languageKey, frameworkKey, displayName) {
|
|
1647
|
-
alert(`Installation files for ${displayName} would be shown here`);
|
|
1648
|
-
}
|
|
1649
|
-
|
|
1650
|
-
// Close modal (from script.js)
|
|
1651
|
-
function closeModal() {
|
|
1652
|
-
const modal = document.querySelector('.modal');
|
|
1653
|
-
if (modal) {
|
|
1654
|
-
modal.remove();
|
|
1655
|
-
}
|
|
1656
|
-
}
|
|
1657
|
-
|
|
1658
|
-
// Close component modal
|
|
1659
|
-
function closeComponentModal() {
|
|
1660
|
-
const modalOverlay = document.querySelector('.modal-overlay');
|
|
1661
|
-
if (modalOverlay) {
|
|
1662
|
-
modalOverlay.remove();
|
|
1663
|
-
}
|
|
1664
|
-
}
|
|
1665
|
-
|
|
1666
|
-
// Global pagination function (called from onclick)
|
|
1667
|
-
function goToPage(page) {
|
|
1668
|
-
if (window.indexManager) {
|
|
1669
|
-
window.indexManager.goToPage(page);
|
|
1670
|
-
}
|
|
1671
|
-
}
|
|
1672
|
-
|
|
1673
|
-
// Clean component name by removing extensions and formatting
|
|
1674
|
-
function getCleanComponentName(name) {
|
|
1675
|
-
if (!name) {
|
|
1676
|
-
return 'Unknown Component';
|
|
1677
|
-
}
|
|
1678
|
-
|
|
1679
|
-
let cleanName = name;
|
|
1680
|
-
|
|
1681
|
-
// Remove .md extension if present
|
|
1682
|
-
if (cleanName.endsWith('.md')) {
|
|
1683
|
-
cleanName = cleanName.slice(0, -3);
|
|
1684
|
-
}
|
|
1685
|
-
|
|
1686
|
-
// Remove .json extension if present
|
|
1687
|
-
if (cleanName.endsWith('.json')) {
|
|
1688
|
-
cleanName = cleanName.slice(0, -5);
|
|
1689
|
-
}
|
|
1690
|
-
|
|
1691
|
-
// Convert kebab-case or snake_case to Title Case
|
|
1692
|
-
cleanName = cleanName
|
|
1693
|
-
.replace(/[-_]/g, ' ')
|
|
1694
|
-
.split(' ')
|
|
1695
|
-
.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
1696
|
-
.join(' ');
|
|
1697
|
-
|
|
1698
|
-
return cleanName;
|
|
1699
|
-
}
|
|
1700
|
-
|
|
1701
|
-
// Handle Add to Cart button click
|
|
1702
|
-
function handleAddToCart(name, path, type, category, buttonElement) {
|
|
1703
|
-
// Prevent event propagation to avoid card flip
|
|
1704
|
-
if (window.event) {
|
|
1705
|
-
window.event.stopPropagation();
|
|
1706
|
-
}
|
|
1707
|
-
|
|
1708
|
-
// Clean the component name for better display
|
|
1709
|
-
const cleanName = getCleanComponentName(name);
|
|
1710
|
-
|
|
1711
|
-
const item = {
|
|
1712
|
-
name: cleanName,
|
|
1713
|
-
path: path,
|
|
1714
|
-
category: category,
|
|
1715
|
-
description: `${cleanName} - ${category}`
|
|
1716
|
-
};
|
|
1717
|
-
|
|
1718
|
-
// Add to cart using the cart manager
|
|
1719
|
-
const success = addToCart(item, type);
|
|
1720
|
-
|
|
1721
|
-
if (success) {
|
|
1722
|
-
// Update button state
|
|
1723
|
-
buttonElement.classList.add('added');
|
|
1724
|
-
buttonElement.innerHTML = `
|
|
1725
|
-
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
|
|
1726
|
-
<path d="M9,20.42L2.79,14.21L5.62,11.38L9,14.77L18.88,4.88L21.71,7.71L9,20.42Z"/>
|
|
1727
|
-
</svg>
|
|
1728
|
-
Added to Stack
|
|
1729
|
-
`;
|
|
1730
|
-
|
|
1731
|
-
// Show a brief animation
|
|
1732
|
-
buttonElement.style.transform = 'scale(0.95)';
|
|
1733
|
-
setTimeout(() => {
|
|
1734
|
-
buttonElement.style.transform = 'scale(1)';
|
|
1735
|
-
}, 150);
|
|
1736
|
-
|
|
1737
|
-
// Show notification (the cart manager already handles this, but we can add extra visual feedback)
|
|
1738
|
-
console.log(`✅ ${name} added to stack successfully!`);
|
|
1739
|
-
}
|
|
1740
|
-
}
|
|
1741
|
-
|
|
1742
|
-
// Initialize when DOM is ready
|
|
1743
|
-
document.addEventListener('DOMContentLoaded', () => {
|
|
1744
|
-
window.indexManager = new IndexPageManager();
|
|
1745
|
-
window.indexManager.init();
|
|
1746
|
-
|
|
1747
|
-
// Initialize category filters for default selection (agents)
|
|
1748
|
-
// Wait for components to load, then show categories
|
|
1749
|
-
const initCategories = () => {
|
|
1750
|
-
if (window.dataLoader && window.dataLoader.componentsData) {
|
|
1751
|
-
showCategoryFilters('agents');
|
|
1752
|
-
} else {
|
|
1753
|
-
setTimeout(initCategories, 200);
|
|
1754
|
-
}
|
|
1755
|
-
};
|
|
1756
|
-
|
|
1757
|
-
setTimeout(initCategories, 100);
|
|
1758
|
-
|
|
1759
|
-
// Focus search input on page load and setup terminal cursor
|
|
1760
|
-
setTimeout(() => {
|
|
1761
|
-
const searchInput = document.getElementById('searchInput');
|
|
1762
|
-
if (searchInput) {
|
|
1763
|
-
searchInput.focus();
|
|
1764
|
-
setupTerminalCursor();
|
|
1765
|
-
}
|
|
1766
|
-
}, 300); // Small delay to ensure DOM is fully loaded
|
|
1767
|
-
});
|
|
1768
|
-
|
|
1769
|
-
// Terminal cursor functionality
|
|
1770
|
-
function setupTerminalCursor() {
|
|
1771
|
-
const searchInput = document.getElementById('searchInput');
|
|
1772
|
-
const cursor = document.getElementById('terminalCursor');
|
|
1773
|
-
|
|
1774
|
-
if (!searchInput || !cursor) return;
|
|
1775
|
-
|
|
1776
|
-
function updateCursorPosition() {
|
|
1777
|
-
const promptWidth = 26; // Width of ">" prompt + extra space
|
|
1778
|
-
|
|
1779
|
-
// If input has text, position cursor at the end of the text
|
|
1780
|
-
if (searchInput.value.length > 0) {
|
|
1781
|
-
// Create a temporary span to measure text width
|
|
1782
|
-
const temp = document.createElement('span');
|
|
1783
|
-
temp.style.visibility = 'hidden';
|
|
1784
|
-
temp.style.position = 'absolute';
|
|
1785
|
-
temp.style.whiteSpace = 'pre';
|
|
1786
|
-
temp.style.font = window.getComputedStyle(searchInput).font;
|
|
1787
|
-
temp.textContent = searchInput.value;
|
|
1788
|
-
|
|
1789
|
-
document.body.appendChild(temp);
|
|
1790
|
-
const textWidth = temp.getBoundingClientRect().width;
|
|
1791
|
-
document.body.removeChild(temp);
|
|
1792
|
-
|
|
1793
|
-
cursor.style.left = `${promptWidth + textWidth + 2}px`;
|
|
1794
|
-
} else {
|
|
1795
|
-
// If input is empty, position cursor right after the prompt with space
|
|
1796
|
-
cursor.style.left = `${promptWidth}px`;
|
|
1797
|
-
}
|
|
1798
|
-
}
|
|
1799
|
-
|
|
1800
|
-
// Update cursor position on input
|
|
1801
|
-
searchInput.addEventListener('input', updateCursorPosition);
|
|
1802
|
-
searchInput.addEventListener('focus', () => {
|
|
1803
|
-
cursor.style.display = 'block';
|
|
1804
|
-
updateCursorPosition();
|
|
1805
|
-
});
|
|
1806
|
-
searchInput.addEventListener('blur', () => {
|
|
1807
|
-
cursor.style.display = 'none';
|
|
1808
|
-
});
|
|
1809
|
-
|
|
1810
|
-
// Initial position
|
|
1811
|
-
updateCursorPosition();
|
|
1812
|
-
}
|