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.
Files changed (811) hide show
  1. package/README.md +79 -77
  2. package/{cli-tool/bin → bin}/create-claude-config.js +2 -0
  3. package/package.json +79 -21
  4. package/{cli-tool/src → src}/analytics-web/chats_mobile.html +17 -16
  5. package/{cli-tool/src → src}/console-bridge.js +3 -3
  6. package/{cli-tool/src → src}/index.js +130 -10
  7. package/src/plugin-dashboard-web/app.js +806 -0
  8. package/src/plugin-dashboard-web/index.html +292 -0
  9. package/src/plugin-dashboard-web/styles.css +1781 -0
  10. package/src/plugin-dashboard.js +689 -0
  11. package/src/security-audit.js +164 -0
  12. package/src/validation/ARCHITECTURE.md +309 -0
  13. package/src/validation/BaseValidator.js +152 -0
  14. package/src/validation/README.md +543 -0
  15. package/src/validation/ValidationOrchestrator.js +305 -0
  16. package/src/validation/validators/IntegrityValidator.js +338 -0
  17. package/src/validation/validators/ProvenanceValidator.js +399 -0
  18. package/src/validation/validators/ReferenceValidator.js +373 -0
  19. package/src/validation/validators/SemanticValidator.js +449 -0
  20. package/src/validation/validators/StructuralValidator.js +376 -0
  21. package/.claude/agents/agent-expert.md +0 -477
  22. package/.claude/agents/cli-ui-designer.md +0 -405
  23. package/.claude/agents/command-expert.md +0 -421
  24. package/.claude/agents/docusaurus-expert.md +0 -173
  25. package/.claude/agents/frontend-developer.md +0 -32
  26. package/.claude/agents/mcp-expert.md +0 -258
  27. package/.claude/commands/lint.md +0 -111
  28. package/.claude/commands/test.md +0 -73
  29. package/.claude/settings.local.json +0 -56
  30. package/.env.example +0 -26
  31. package/.github/WORKFLOWS_REFERENCE.md +0 -88
  32. package/.github/workflows/deploy-docusaurus.yml +0 -31
  33. package/.github/workflows/deploy.yml +0 -33
  34. package/.github/workflows/publish-package.yml +0 -125
  35. package/.mcp.json +0 -4
  36. package/AGENTS.md +0 -4
  37. package/CLAUDE.md +0 -482
  38. package/CLAUDE_JOBS_README.md +0 -148
  39. package/CODE_OF_CONDUCT.md +0 -82
  40. package/CONTRIBUTING.md +0 -505
  41. package/DEPLOYMENT.md +0 -60
  42. package/LICENSE +0 -21
  43. package/ROADMAP.md +0 -278
  44. package/SECURITY.md +0 -65
  45. package/api/index.html +0 -1
  46. package/api/package.json +0 -7
  47. package/api/track-download-supabase.js +0 -150
  48. package/cli-tool/Makefile +0 -102
  49. package/cli-tool/README.md +0 -126
  50. package/cli-tool/TESTING.md +0 -262
  51. package/cli-tool/components/agents/ai-specialists/ai-ethics-advisor.md +0 -195
  52. package/cli-tool/components/agents/ai-specialists/hackathon-ai-strategist.md +0 -46
  53. package/cli-tool/components/agents/ai-specialists/llms-maintainer.md +0 -94
  54. package/cli-tool/components/agents/ai-specialists/model-evaluator.md +0 -150
  55. package/cli-tool/components/agents/ai-specialists/prompt-engineer.md +0 -112
  56. package/cli-tool/components/agents/ai-specialists/search-specialist.md +0 -59
  57. package/cli-tool/components/agents/ai-specialists/task-decomposition-expert.md +0 -97
  58. package/cli-tool/components/agents/api-graphql/graphql-architect.md +0 -208
  59. package/cli-tool/components/agents/api-graphql/graphql-performance-optimizer.md +0 -357
  60. package/cli-tool/components/agents/api-graphql/graphql-security-specialist.md +0 -519
  61. package/cli-tool/components/agents/blockchain-web3/smart-contract-auditor.md +0 -32
  62. package/cli-tool/components/agents/blockchain-web3/smart-contract-specialist.md +0 -32
  63. package/cli-tool/components/agents/blockchain-web3/web3-integration-specialist.md +0 -32
  64. package/cli-tool/components/agents/business-marketing/business-analyst.md +0 -194
  65. package/cli-tool/components/agents/business-marketing/content-marketer.md +0 -36
  66. package/cli-tool/components/agents/business-marketing/customer-support.md +0 -36
  67. package/cli-tool/components/agents/business-marketing/legal-advisor.md +0 -50
  68. package/cli-tool/components/agents/business-marketing/marketing-attribution-analyst.md +0 -352
  69. package/cli-tool/components/agents/business-marketing/payment-integration.md +0 -33
  70. package/cli-tool/components/agents/business-marketing/product-strategist.md +0 -212
  71. package/cli-tool/components/agents/business-marketing/risk-manager.md +0 -42
  72. package/cli-tool/components/agents/business-marketing/sales-automator.md +0 -36
  73. package/cli-tool/components/agents/data-ai/ai-engineer.md +0 -33
  74. package/cli-tool/components/agents/data-ai/computer-vision-engineer.md +0 -562
  75. package/cli-tool/components/agents/data-ai/data-engineer.md +0 -33
  76. package/cli-tool/components/agents/data-ai/data-scientist.md +0 -337
  77. package/cli-tool/components/agents/data-ai/ml-engineer.md +0 -33
  78. package/cli-tool/components/agents/data-ai/mlops-engineer.md +0 -58
  79. package/cli-tool/components/agents/data-ai/nlp-engineer.md +0 -680
  80. package/cli-tool/components/agents/data-ai/quant-analyst.md +0 -33
  81. package/cli-tool/components/agents/database/database-admin.md +0 -33
  82. package/cli-tool/components/agents/database/database-architect.md +0 -590
  83. package/cli-tool/components/agents/database/database-optimization.md +0 -33
  84. package/cli-tool/components/agents/database/database-optimizer.md +0 -33
  85. package/cli-tool/components/agents/database/neon-auth-specialist.md +0 -175
  86. package/cli-tool/components/agents/database/neon-database-architect.md +0 -141
  87. package/cli-tool/components/agents/database/neon-expert.md +0 -846
  88. package/cli-tool/components/agents/database/nosql-specialist.md +0 -708
  89. package/cli-tool/components/agents/database/supabase-schema-architect.md +0 -138
  90. package/cli-tool/components/agents/deep-research-team/academic-researcher.md +0 -33
  91. package/cli-tool/components/agents/deep-research-team/agent-overview.md +0 -235
  92. package/cli-tool/components/agents/deep-research-team/competitive-intelligence-analyst.md +0 -530
  93. package/cli-tool/components/agents/deep-research-team/data-analyst.md +0 -112
  94. package/cli-tool/components/agents/deep-research-team/fact-checker.md +0 -553
  95. package/cli-tool/components/agents/deep-research-team/query-clarifier.md +0 -73
  96. package/cli-tool/components/agents/deep-research-team/report-generator.md +0 -108
  97. package/cli-tool/components/agents/deep-research-team/research-brief-generator.md +0 -108
  98. package/cli-tool/components/agents/deep-research-team/research-coordinator.md +0 -94
  99. package/cli-tool/components/agents/deep-research-team/research-orchestrator.md +0 -119
  100. package/cli-tool/components/agents/deep-research-team/research-synthesizer.md +0 -109
  101. package/cli-tool/components/agents/deep-research-team/technical-researcher.md +0 -95
  102. package/cli-tool/components/agents/development-team/backend-architect.md +0 -31
  103. package/cli-tool/components/agents/development-team/cli-ui-designer.md +0 -405
  104. package/cli-tool/components/agents/development-team/devops-engineer.md +0 -886
  105. package/cli-tool/components/agents/development-team/frontend-developer.md +0 -32
  106. package/cli-tool/components/agents/development-team/fullstack-developer.md +0 -1205
  107. package/cli-tool/components/agents/development-team/ios-developer.md +0 -36
  108. package/cli-tool/components/agents/development-team/mobile-developer.md +0 -33
  109. package/cli-tool/components/agents/development-team/ui-ux-designer.md +0 -36
  110. package/cli-tool/components/agents/development-tools/code-reviewer.md +0 -30
  111. package/cli-tool/components/agents/development-tools/command-expert.md +0 -422
  112. package/cli-tool/components/agents/development-tools/context-manager.md +0 -65
  113. package/cli-tool/components/agents/development-tools/debugger.md +0 -31
  114. package/cli-tool/components/agents/development-tools/dx-optimizer.md +0 -64
  115. package/cli-tool/components/agents/development-tools/error-detective.md +0 -33
  116. package/cli-tool/components/agents/development-tools/mcp-expert.md +0 -259
  117. package/cli-tool/components/agents/development-tools/performance-profiler.md +0 -799
  118. package/cli-tool/components/agents/development-tools/test-engineer.md +0 -936
  119. package/cli-tool/components/agents/devops-infrastructure/cloud-architect.md +0 -33
  120. package/cli-tool/components/agents/devops-infrastructure/deployment-engineer.md +0 -33
  121. package/cli-tool/components/agents/devops-infrastructure/devops-troubleshooter.md +0 -33
  122. package/cli-tool/components/agents/devops-infrastructure/monitoring-specialist.md +0 -36
  123. package/cli-tool/components/agents/devops-infrastructure/network-engineer.md +0 -33
  124. package/cli-tool/components/agents/devops-infrastructure/security-engineer.md +0 -971
  125. package/cli-tool/components/agents/devops-infrastructure/terraform-specialist.md +0 -36
  126. package/cli-tool/components/agents/devops-infrastructure/vercel-deployment-specialist.md +0 -357
  127. package/cli-tool/components/agents/documentation/api-documenter.md +0 -33
  128. package/cli-tool/components/agents/documentation/changelog-generator.md +0 -37
  129. package/cli-tool/components/agents/documentation/docusaurus-expert.md +0 -175
  130. package/cli-tool/components/agents/documentation/technical-writer.md +0 -37
  131. package/cli-tool/components/agents/expert-advisors/agent-expert.md +0 -491
  132. package/cli-tool/components/agents/expert-advisors/architect-review.md +0 -50
  133. package/cli-tool/components/agents/expert-advisors/dependency-manager.md +0 -45
  134. package/cli-tool/components/agents/expert-advisors/documentation-expert.md +0 -47
  135. package/cli-tool/components/agents/ffmpeg-clip-team/audio-mixer.md +0 -37
  136. package/cli-tool/components/agents/ffmpeg-clip-team/audio-quality-controller.md +0 -100
  137. package/cli-tool/components/agents/ffmpeg-clip-team/podcast-content-analyzer.md +0 -60
  138. package/cli-tool/components/agents/ffmpeg-clip-team/podcast-metadata-specialist.md +0 -46
  139. package/cli-tool/components/agents/ffmpeg-clip-team/podcast-transcriber.md +0 -68
  140. package/cli-tool/components/agents/ffmpeg-clip-team/social-media-clip-creator.md +0 -69
  141. package/cli-tool/components/agents/ffmpeg-clip-team/timestamp-precision-specialist.md +0 -98
  142. package/cli-tool/components/agents/ffmpeg-clip-team/video-editor.md +0 -37
  143. package/cli-tool/components/agents/game-development/3d-artist.md +0 -37
  144. package/cli-tool/components/agents/game-development/game-designer.md +0 -37
  145. package/cli-tool/components/agents/game-development/unity-game-developer.md +0 -110
  146. package/cli-tool/components/agents/game-development/unreal-engine-developer.md +0 -128
  147. package/cli-tool/components/agents/git/git-flow-manager.md +0 -329
  148. package/cli-tool/components/agents/mcp-dev-team/mcp-deployment-orchestrator.md +0 -101
  149. package/cli-tool/components/agents/mcp-dev-team/mcp-integration-engineer.md +0 -37
  150. package/cli-tool/components/agents/mcp-dev-team/mcp-protocol-specialist.md +0 -37
  151. package/cli-tool/components/agents/mcp-dev-team/mcp-registry-navigator.md +0 -112
  152. package/cli-tool/components/agents/mcp-dev-team/mcp-security-auditor.md +0 -70
  153. package/cli-tool/components/agents/mcp-dev-team/mcp-server-architect.md +0 -74
  154. package/cli-tool/components/agents/mcp-dev-team/mcp-testing-engineer.md +0 -106
  155. package/cli-tool/components/agents/modernization/architecture-modernizer.md +0 -37
  156. package/cli-tool/components/agents/modernization/cloud-migration-specialist.md +0 -37
  157. package/cli-tool/components/agents/modernization/legacy-modernizer.md +0 -33
  158. package/cli-tool/components/agents/obsidian-ops-team/Scripts/daily_notes_connector.py +0 -306
  159. package/cli-tool/components/agents/obsidian-ops-team/Scripts/enhance_tag_standardizer.py +0 -343
  160. package/cli-tool/components/agents/obsidian-ops-team/Scripts/find_keyword_connections.py +0 -216
  161. package/cli-tool/components/agents/obsidian-ops-team/Scripts/fix_quoted_tags.py +0 -82
  162. package/cli-tool/components/agents/obsidian-ops-team/Scripts/implement_entity_connections.py +0 -195
  163. package/cli-tool/components/agents/obsidian-ops-team/Scripts/link_suggester.py +0 -301
  164. package/cli-tool/components/agents/obsidian-ops-team/Scripts/metadata_adder.py +0 -197
  165. package/cli-tool/components/agents/obsidian-ops-team/Scripts/moc_generator.py +0 -296
  166. package/cli-tool/components/agents/obsidian-ops-team/Scripts/parse_keyword_connections.py +0 -122
  167. package/cli-tool/components/agents/obsidian-ops-team/Scripts/tag_standardizer.py +0 -387
  168. package/cli-tool/components/agents/obsidian-ops-team/connection-agent.md +0 -67
  169. package/cli-tool/components/agents/obsidian-ops-team/content-curator.md +0 -81
  170. package/cli-tool/components/agents/obsidian-ops-team/metadata-agent.md +0 -51
  171. package/cli-tool/components/agents/obsidian-ops-team/moc-agent.md +0 -112
  172. package/cli-tool/components/agents/obsidian-ops-team/review-agent.md +0 -94
  173. package/cli-tool/components/agents/obsidian-ops-team/tag-agent.md +0 -92
  174. package/cli-tool/components/agents/obsidian-ops-team/vault-optimizer.md +0 -76
  175. package/cli-tool/components/agents/ocr-extraction-team/document-structure-analyzer.md +0 -37
  176. package/cli-tool/components/agents/ocr-extraction-team/markdown-syntax-formatter.md +0 -58
  177. package/cli-tool/components/agents/ocr-extraction-team/ocr-grammar-fixer.md +0 -36
  178. package/cli-tool/components/agents/ocr-extraction-team/ocr-preprocessing-optimizer.md +0 -37
  179. package/cli-tool/components/agents/ocr-extraction-team/ocr-quality-assurance.md +0 -62
  180. package/cli-tool/components/agents/ocr-extraction-team/text-comparison-validator.md +0 -60
  181. package/cli-tool/components/agents/ocr-extraction-team/visual-analysis-ocr.md +0 -52
  182. package/cli-tool/components/agents/performance-testing/load-testing-specialist.md +0 -37
  183. package/cli-tool/components/agents/performance-testing/performance-engineer.md +0 -33
  184. package/cli-tool/components/agents/performance-testing/react-performance-optimization.md +0 -65
  185. package/cli-tool/components/agents/performance-testing/test-automator.md +0 -33
  186. package/cli-tool/components/agents/performance-testing/web-vitals-optimizer.md +0 -37
  187. package/cli-tool/components/agents/podcast-creator-team/academic-research-synthesizer.md +0 -61
  188. package/cli-tool/components/agents/podcast-creator-team/comprehensive-researcher.md +0 -49
  189. package/cli-tool/components/agents/podcast-creator-team/episode-orchestrator.md +0 -52
  190. package/cli-tool/components/agents/podcast-creator-team/guest-outreach-coordinator.md +0 -37
  191. package/cli-tool/components/agents/podcast-creator-team/market-research-analyst.md +0 -54
  192. package/cli-tool/components/agents/podcast-creator-team/podcast-editor.md +0 -37
  193. package/cli-tool/components/agents/podcast-creator-team/podcast-trend-scout.md +0 -60
  194. package/cli-tool/components/agents/podcast-creator-team/project-supervisor-orchestrator.md +0 -48
  195. package/cli-tool/components/agents/podcast-creator-team/seo-podcast-optimizer.md +0 -58
  196. package/cli-tool/components/agents/podcast-creator-team/social-media-copywriter.md +0 -57
  197. package/cli-tool/components/agents/podcast-creator-team/twitter-ai-influencer-manager.md +0 -62
  198. package/cli-tool/components/agents/programming-languages/c-pro.md +0 -36
  199. package/cli-tool/components/agents/programming-languages/c-sharp-pro.md +0 -40
  200. package/cli-tool/components/agents/programming-languages/cpp-pro.md +0 -39
  201. package/cli-tool/components/agents/programming-languages/golang-pro.md +0 -33
  202. package/cli-tool/components/agents/programming-languages/javascript-pro.md +0 -36
  203. package/cli-tool/components/agents/programming-languages/php-pro.md +0 -44
  204. package/cli-tool/components/agents/programming-languages/python-pro.md +0 -33
  205. package/cli-tool/components/agents/programming-languages/rust-pro.md +0 -36
  206. package/cli-tool/components/agents/programming-languages/shell-scripting-pro.md +0 -38
  207. package/cli-tool/components/agents/programming-languages/sql-pro.md +0 -36
  208. package/cli-tool/components/agents/programming-languages/typescript-pro.md +0 -38
  209. package/cli-tool/components/agents/realtime/supabase-realtime-optimizer.md +0 -193
  210. package/cli-tool/components/agents/security/api-security-audit.md +0 -93
  211. package/cli-tool/components/agents/security/compliance-specialist.md +0 -37
  212. package/cli-tool/components/agents/security/incident-responder.md +0 -75
  213. package/cli-tool/components/agents/security/penetration-tester.md +0 -37
  214. package/cli-tool/components/agents/security/security-auditor.md +0 -33
  215. package/cli-tool/components/agents/web-tools/nextjs-architecture-expert.md +0 -194
  216. package/cli-tool/components/agents/web-tools/react-performance-optimizer.md +0 -425
  217. package/cli-tool/components/agents/web-tools/seo-analyzer.md +0 -37
  218. package/cli-tool/components/agents/web-tools/url-context-validator.md +0 -61
  219. package/cli-tool/components/agents/web-tools/url-link-extractor.md +0 -59
  220. package/cli-tool/components/agents/web-tools/web-accessibility-checker.md +0 -37
  221. package/cli-tool/components/commands/automation/act.md +0 -57
  222. package/cli-tool/components/commands/automation/ci-pipeline.md +0 -378
  223. package/cli-tool/components/commands/automation/husky.md +0 -130
  224. package/cli-tool/components/commands/automation/workflow-orchestrator.md +0 -576
  225. package/cli-tool/components/commands/database/supabase-backup-manager.md +0 -37
  226. package/cli-tool/components/commands/database/supabase-data-explorer.md +0 -37
  227. package/cli-tool/components/commands/database/supabase-migration-assistant.md +0 -37
  228. package/cli-tool/components/commands/database/supabase-performance-optimizer.md +0 -37
  229. package/cli-tool/components/commands/database/supabase-realtime-monitor.md +0 -37
  230. package/cli-tool/components/commands/database/supabase-schema-sync.md +0 -37
  231. package/cli-tool/components/commands/database/supabase-security-audit.md +0 -37
  232. package/cli-tool/components/commands/database/supabase-type-generator.md +0 -37
  233. package/cli-tool/components/commands/deployment/add-changelog.md +0 -92
  234. package/cli-tool/components/commands/deployment/blue-green-deployment.md +0 -824
  235. package/cli-tool/components/commands/deployment/changelog-demo-command.md +0 -43
  236. package/cli-tool/components/commands/deployment/ci-setup.md +0 -323
  237. package/cli-tool/components/commands/deployment/containerize-application.md +0 -93
  238. package/cli-tool/components/commands/deployment/deployment-monitoring.md +0 -1228
  239. package/cli-tool/components/commands/deployment/hotfix-deploy.md +0 -283
  240. package/cli-tool/components/commands/deployment/prepare-release.md +0 -357
  241. package/cli-tool/components/commands/deployment/rollback-deploy.md +0 -145
  242. package/cli-tool/components/commands/deployment/setup-automated-releases.md +0 -143
  243. package/cli-tool/components/commands/deployment/setup-kubernetes-deployment.md +0 -93
  244. package/cli-tool/components/commands/documentation/create-architecture-documentation.md +0 -95
  245. package/cli-tool/components/commands/documentation/create-onboarding-guide.md +0 -93
  246. package/cli-tool/components/commands/documentation/doc-api.md +0 -242
  247. package/cli-tool/components/commands/documentation/docs-maintenance.md +0 -119
  248. package/cli-tool/components/commands/documentation/generate-api-documentation.md +0 -97
  249. package/cli-tool/components/commands/documentation/interactive-documentation.md +0 -133
  250. package/cli-tool/components/commands/documentation/load-llms-txt.md +0 -39
  251. package/cli-tool/components/commands/documentation/migration-guide.md +0 -250
  252. package/cli-tool/components/commands/documentation/troubleshooting-guide.md +0 -370
  253. package/cli-tool/components/commands/documentation/update-docs.md +0 -107
  254. package/cli-tool/components/commands/game-development/game-analytics-integration.md +0 -128
  255. package/cli-tool/components/commands/game-development/game-asset-pipeline.md +0 -108
  256. package/cli-tool/components/commands/game-development/game-performance-profiler.md +0 -78
  257. package/cli-tool/components/commands/game-development/game-testing-framework.md +0 -112
  258. package/cli-tool/components/commands/game-development/unity-project-setup.md +0 -190
  259. package/cli-tool/components/commands/git/feature.md +0 -196
  260. package/cli-tool/components/commands/git/finish.md +0 -528
  261. package/cli-tool/components/commands/git/flow-status.md +0 -438
  262. package/cli-tool/components/commands/git/hotfix.md +0 -456
  263. package/cli-tool/components/commands/git/release.md +0 -381
  264. package/cli-tool/components/commands/git-workflow/branch-cleanup.md +0 -181
  265. package/cli-tool/components/commands/git-workflow/commit.md +0 -167
  266. package/cli-tool/components/commands/git-workflow/create-pr.md +0 -19
  267. package/cli-tool/components/commands/git-workflow/create-pull-request.md +0 -126
  268. package/cli-tool/components/commands/git-workflow/create-worktrees.md +0 -174
  269. package/cli-tool/components/commands/git-workflow/fix-github-issue.md +0 -13
  270. package/cli-tool/components/commands/git-workflow/git-bisect-helper.md +0 -261
  271. package/cli-tool/components/commands/git-workflow/pr-review.md +0 -76
  272. package/cli-tool/components/commands/git-workflow/update-branch-name.md +0 -9
  273. package/cli-tool/components/commands/nextjs-vercel/nextjs-api-tester.md +0 -480
  274. package/cli-tool/components/commands/nextjs-vercel/nextjs-bundle-analyzer.md +0 -406
  275. package/cli-tool/components/commands/nextjs-vercel/nextjs-component-generator.md +0 -489
  276. package/cli-tool/components/commands/nextjs-vercel/nextjs-middleware-creator.md +0 -712
  277. package/cli-tool/components/commands/nextjs-vercel/nextjs-migration-helper.md +0 -778
  278. package/cli-tool/components/commands/nextjs-vercel/nextjs-performance-audit.md +0 -653
  279. package/cli-tool/components/commands/nextjs-vercel/nextjs-scaffold.md +0 -237
  280. package/cli-tool/components/commands/nextjs-vercel/vercel-deploy-optimize.md +0 -341
  281. package/cli-tool/components/commands/nextjs-vercel/vercel-edge-function.md +0 -810
  282. package/cli-tool/components/commands/nextjs-vercel/vercel-env-sync.md +0 -666
  283. package/cli-tool/components/commands/orchestration/archive.md +0 -414
  284. package/cli-tool/components/commands/orchestration/commit.md +0 -305
  285. package/cli-tool/components/commands/orchestration/find.md +0 -272
  286. package/cli-tool/components/commands/orchestration/log.md +0 -355
  287. package/cli-tool/components/commands/orchestration/move.md +0 -220
  288. package/cli-tool/components/commands/orchestration/optimize.md +0 -375
  289. package/cli-tool/components/commands/orchestration/remove.md +0 -301
  290. package/cli-tool/components/commands/orchestration/report.md +0 -292
  291. package/cli-tool/components/commands/orchestration/resume.md +0 -256
  292. package/cli-tool/components/commands/orchestration/start.md +0 -169
  293. package/cli-tool/components/commands/orchestration/status.md +0 -219
  294. package/cli-tool/components/commands/orchestration/sync.md +0 -294
  295. package/cli-tool/components/commands/performance/add-performance-monitoring.md +0 -84
  296. package/cli-tool/components/commands/performance/implement-caching-strategy.md +0 -84
  297. package/cli-tool/components/commands/performance/optimize-api-performance.md +0 -119
  298. package/cli-tool/components/commands/performance/optimize-build.md +0 -139
  299. package/cli-tool/components/commands/performance/optimize-bundle-size.md +0 -84
  300. package/cli-tool/components/commands/performance/optimize-database-performance.md +0 -84
  301. package/cli-tool/components/commands/performance/optimize-memory-usage.md +0 -91
  302. package/cli-tool/components/commands/performance/performance-audit.md +0 -89
  303. package/cli-tool/components/commands/performance/setup-cdn-optimization.md +0 -84
  304. package/cli-tool/components/commands/performance/system-behavior-simulator.md +0 -415
  305. package/cli-tool/components/commands/project-management/add-package.md +0 -90
  306. package/cli-tool/components/commands/project-management/add-to-changelog.md +0 -37
  307. package/cli-tool/components/commands/project-management/create-feature.md +0 -130
  308. package/cli-tool/components/commands/project-management/create-jtbd.md +0 -37
  309. package/cli-tool/components/commands/project-management/create-prd.md +0 -36
  310. package/cli-tool/components/commands/project-management/create-prp.md +0 -37
  311. package/cli-tool/components/commands/project-management/init-project.md +0 -80
  312. package/cli-tool/components/commands/project-management/milestone-tracker.md +0 -44
  313. package/cli-tool/components/commands/project-management/pac-configure.md +0 -32
  314. package/cli-tool/components/commands/project-management/pac-create-epic.md +0 -41
  315. package/cli-tool/components/commands/project-management/pac-create-ticket.md +0 -42
  316. package/cli-tool/components/commands/project-management/pac-update-status.md +0 -39
  317. package/cli-tool/components/commands/project-management/pac-validate.md +0 -35
  318. package/cli-tool/components/commands/project-management/project-health-check.md +0 -58
  319. package/cli-tool/components/commands/project-management/project-timeline-simulator.md +0 -37
  320. package/cli-tool/components/commands/project-management/project-to-linear.md +0 -38
  321. package/cli-tool/components/commands/project-management/release.md +0 -31
  322. package/cli-tool/components/commands/project-management/todo.md +0 -62
  323. package/cli-tool/components/commands/security/add-authentication-system.md +0 -34
  324. package/cli-tool/components/commands/security/dependency-audit.md +0 -32
  325. package/cli-tool/components/commands/security/penetration-test.md +0 -40
  326. package/cli-tool/components/commands/security/secrets-scanner.md +0 -39
  327. package/cli-tool/components/commands/security/security-audit.md +0 -82
  328. package/cli-tool/components/commands/security/security-hardening.md +0 -33
  329. package/cli-tool/components/commands/setup/create-database-migrations.md +0 -35
  330. package/cli-tool/components/commands/setup/design-database-schema.md +0 -37
  331. package/cli-tool/components/commands/setup/design-rest-api.md +0 -37
  332. package/cli-tool/components/commands/setup/implement-graphql-api.md +0 -37
  333. package/cli-tool/components/commands/setup/migrate-to-typescript.md +0 -37
  334. package/cli-tool/components/commands/setup/setup-ci-cd-pipeline.md +0 -37
  335. package/cli-tool/components/commands/setup/setup-development-environment.md +0 -37
  336. package/cli-tool/components/commands/setup/setup-docker-containers.md +0 -37
  337. package/cli-tool/components/commands/setup/setup-formatting.md +0 -37
  338. package/cli-tool/components/commands/setup/setup-linting.md +0 -37
  339. package/cli-tool/components/commands/setup/setup-monitoring-observability.md +0 -37
  340. package/cli-tool/components/commands/setup/setup-monorepo.md +0 -37
  341. package/cli-tool/components/commands/setup/setup-rate-limiting.md +0 -37
  342. package/cli-tool/components/commands/setup/update-dependencies.md +0 -35
  343. package/cli-tool/components/commands/simulation/business-scenario-explorer.md +0 -37
  344. package/cli-tool/components/commands/simulation/constraint-modeler.md +0 -37
  345. package/cli-tool/components/commands/simulation/decision-tree-explorer.md +0 -37
  346. package/cli-tool/components/commands/simulation/digital-twin-creator.md +0 -37
  347. package/cli-tool/components/commands/simulation/future-scenario-generator.md +0 -37
  348. package/cli-tool/components/commands/simulation/market-response-modeler.md +0 -37
  349. package/cli-tool/components/commands/simulation/monte-carlo-simulator.md +0 -37
  350. package/cli-tool/components/commands/simulation/simulation-calibrator.md +0 -37
  351. package/cli-tool/components/commands/simulation/system-dynamics-modeler.md +0 -37
  352. package/cli-tool/components/commands/simulation/timeline-compressor.md +0 -37
  353. package/cli-tool/components/commands/svelte/svelte:a11y.md +0 -105
  354. package/cli-tool/components/commands/svelte/svelte:component.md +0 -81
  355. package/cli-tool/components/commands/svelte/svelte:debug.md +0 -48
  356. package/cli-tool/components/commands/svelte/svelte:migrate.md +0 -79
  357. package/cli-tool/components/commands/svelte/svelte:optimize.md +0 -99
  358. package/cli-tool/components/commands/svelte/svelte:scaffold.md +0 -89
  359. package/cli-tool/components/commands/svelte/svelte:storybook-migrate.md +0 -204
  360. package/cli-tool/components/commands/svelte/svelte:storybook-mock.md +0 -213
  361. package/cli-tool/components/commands/svelte/svelte:storybook-setup.md +0 -113
  362. package/cli-tool/components/commands/svelte/svelte:storybook-story.md +0 -145
  363. package/cli-tool/components/commands/svelte/svelte:storybook-troubleshoot.md +0 -191
  364. package/cli-tool/components/commands/svelte/svelte:storybook.md +0 -48
  365. package/cli-tool/components/commands/svelte/svelte:test-coverage.md +0 -77
  366. package/cli-tool/components/commands/svelte/svelte:test-fix.md +0 -74
  367. package/cli-tool/components/commands/svelte/svelte:test-setup.md +0 -85
  368. package/cli-tool/components/commands/svelte/svelte:test.md +0 -60
  369. package/cli-tool/components/commands/sync/bidirectional-sync.md +0 -37
  370. package/cli-tool/components/commands/sync/bulk-import-issues.md +0 -37
  371. package/cli-tool/components/commands/sync/cross-reference-manager.md +0 -37
  372. package/cli-tool/components/commands/sync/issue-to-linear-task.md +0 -37
  373. package/cli-tool/components/commands/sync/linear-task-to-issue.md +0 -37
  374. package/cli-tool/components/commands/sync/sync-automation-setup.md +0 -37
  375. package/cli-tool/components/commands/sync/sync-conflict-resolver.md +0 -37
  376. package/cli-tool/components/commands/sync/sync-health-monitor.md +0 -37
  377. package/cli-tool/components/commands/sync/sync-issues-to-linear.md +0 -37
  378. package/cli-tool/components/commands/sync/sync-linear-to-issues.md +0 -37
  379. package/cli-tool/components/commands/sync/sync-migration-assistant.md +0 -37
  380. package/cli-tool/components/commands/sync/sync-pr-to-task.md +0 -37
  381. package/cli-tool/components/commands/sync/sync-status.md +0 -391
  382. package/cli-tool/components/commands/sync/task-from-pr.md +0 -37
  383. package/cli-tool/components/commands/team/architecture-review.md +0 -37
  384. package/cli-tool/components/commands/team/decision-quality-analyzer.md +0 -37
  385. package/cli-tool/components/commands/team/dependency-mapper.md +0 -37
  386. package/cli-tool/components/commands/team/estimate-assistant.md +0 -37
  387. package/cli-tool/components/commands/team/issue-triage.md +0 -37
  388. package/cli-tool/components/commands/team/memory-spring-cleaning.md +0 -37
  389. package/cli-tool/components/commands/team/migration-assistant.md +0 -37
  390. package/cli-tool/components/commands/team/retrospective-analyzer.md +0 -37
  391. package/cli-tool/components/commands/team/session-learning-capture.md +0 -37
  392. package/cli-tool/components/commands/team/sprint-planning.md +0 -189
  393. package/cli-tool/components/commands/team/standup-report.md +0 -37
  394. package/cli-tool/components/commands/team/team-knowledge-mapper.md +0 -37
  395. package/cli-tool/components/commands/team/team-velocity-tracker.md +0 -37
  396. package/cli-tool/components/commands/team/team-workload-balancer.md +0 -37
  397. package/cli-tool/components/commands/testing/add-mutation-testing.md +0 -37
  398. package/cli-tool/components/commands/testing/add-property-based-testing.md +0 -37
  399. package/cli-tool/components/commands/testing/e2e-setup.md +0 -37
  400. package/cli-tool/components/commands/testing/generate-test-cases.md +0 -37
  401. package/cli-tool/components/commands/testing/generate-tests.md +0 -82
  402. package/cli-tool/components/commands/testing/setup-comprehensive-testing.md +0 -37
  403. package/cli-tool/components/commands/testing/setup-load-testing.md +0 -37
  404. package/cli-tool/components/commands/testing/setup-visual-testing.md +0 -37
  405. package/cli-tool/components/commands/testing/test-automation-orchestrator.md +0 -37
  406. package/cli-tool/components/commands/testing/test-changelog-automation.md +0 -37
  407. package/cli-tool/components/commands/testing/test-coverage.md +0 -37
  408. package/cli-tool/components/commands/testing/test-quality-analyzer.md +0 -37
  409. package/cli-tool/components/commands/testing/testing_plan_integration.md +0 -37
  410. package/cli-tool/components/commands/testing/write-tests.md +0 -37
  411. package/cli-tool/components/commands/utilities/all-tools.md +0 -31
  412. package/cli-tool/components/commands/utilities/architecture-scenario-explorer.md +0 -375
  413. package/cli-tool/components/commands/utilities/check-file.md +0 -53
  414. package/cli-tool/components/commands/utilities/clean-branches.md +0 -243
  415. package/cli-tool/components/commands/utilities/clean.md +0 -1
  416. package/cli-tool/components/commands/utilities/code-permutation-tester.md +0 -341
  417. package/cli-tool/components/commands/utilities/code-review.md +0 -70
  418. package/cli-tool/components/commands/utilities/code-to-task.md +0 -583
  419. package/cli-tool/components/commands/utilities/context-prime.md +0 -1
  420. package/cli-tool/components/commands/utilities/debug-error.md +0 -121
  421. package/cli-tool/components/commands/utilities/directory-deep-dive.md +0 -34
  422. package/cli-tool/components/commands/utilities/explain-code.md +0 -194
  423. package/cli-tool/components/commands/utilities/fix-issue.md +0 -85
  424. package/cli-tool/components/commands/utilities/generate-linear-worklog.md +0 -113
  425. package/cli-tool/components/commands/utilities/git-status.md +0 -39
  426. package/cli-tool/components/commands/utilities/initref.md +0 -3
  427. package/cli-tool/components/commands/utilities/prime.md +0 -41
  428. package/cli-tool/components/commands/utilities/refactor-code.md +0 -116
  429. package/cli-tool/components/commands/utilities/ultra-think.md +0 -153
  430. package/cli-tool/components/hooks/HOOK_PATTERNS_COMPRESSED.json +0 -1
  431. package/cli-tool/components/hooks/automation/agents-md-loader.json +0 -17
  432. package/cli-tool/components/hooks/automation/build-on-change.json +0 -16
  433. package/cli-tool/components/hooks/automation/dependency-checker.json +0 -16
  434. package/cli-tool/components/hooks/automation/deployment-health-monitor.json +0 -29
  435. package/cli-tool/components/hooks/automation/discord-detailed-notifications.json +0 -26
  436. package/cli-tool/components/hooks/automation/discord-error-notifications.json +0 -37
  437. package/cli-tool/components/hooks/automation/discord-notifications.json +0 -25
  438. package/cli-tool/components/hooks/automation/simple-notifications.json +0 -16
  439. package/cli-tool/components/hooks/automation/slack-detailed-notifications.json +0 -26
  440. package/cli-tool/components/hooks/automation/slack-error-notifications.json +0 -37
  441. package/cli-tool/components/hooks/automation/slack-notifications.json +0 -25
  442. package/cli-tool/components/hooks/automation/telegram-detailed-notifications.json +0 -26
  443. package/cli-tool/components/hooks/automation/telegram-error-notifications.json +0 -37
  444. package/cli-tool/components/hooks/automation/telegram-notifications.json +0 -25
  445. package/cli-tool/components/hooks/automation/vercel-auto-deploy.json +0 -17
  446. package/cli-tool/components/hooks/automation/vercel-environment-sync.json +0 -29
  447. package/cli-tool/components/hooks/development-tools/change-tracker.json +0 -25
  448. package/cli-tool/components/hooks/development-tools/command-logger.json +0 -16
  449. package/cli-tool/components/hooks/development-tools/file-backup.json +0 -16
  450. package/cli-tool/components/hooks/development-tools/lint-on-save.json +0 -16
  451. package/cli-tool/components/hooks/development-tools/nextjs-code-quality-enforcer.json +0 -17
  452. package/cli-tool/components/hooks/development-tools/smart-formatting.json +0 -16
  453. package/cli-tool/components/hooks/git/conventional-commits.json +0 -16
  454. package/cli-tool/components/hooks/git/conventional-commits.py +0 -84
  455. package/cli-tool/components/hooks/git/prevent-direct-push.json +0 -16
  456. package/cli-tool/components/hooks/git/prevent-direct-push.py +0 -86
  457. package/cli-tool/components/hooks/git/validate-branch-name.json +0 -16
  458. package/cli-tool/components/hooks/git/validate-branch-name.py +0 -96
  459. package/cli-tool/components/hooks/git-workflow/auto-git-add.json +0 -16
  460. package/cli-tool/components/hooks/git-workflow/smart-commit.json +0 -25
  461. package/cli-tool/components/hooks/performance/performance-budget-guard.json +0 -27
  462. package/cli-tool/components/hooks/performance/performance-monitor.json +0 -27
  463. package/cli-tool/components/hooks/post-tool/format-javascript-files.json +0 -16
  464. package/cli-tool/components/hooks/post-tool/format-python-files.json +0 -16
  465. package/cli-tool/components/hooks/post-tool/git-add-changes.json +0 -25
  466. package/cli-tool/components/hooks/post-tool/run-tests-after-changes.json +0 -16
  467. package/cli-tool/components/hooks/pre-tool/backup-before-edit.json +0 -16
  468. package/cli-tool/components/hooks/pre-tool/notify-before-bash.json +0 -16
  469. package/cli-tool/components/hooks/pre-tool/update-search-year.json +0 -17
  470. package/cli-tool/components/hooks/security/file-protection.json +0 -16
  471. package/cli-tool/components/hooks/security/security-scanner.json +0 -16
  472. package/cli-tool/components/hooks/testing/test-runner.json +0 -16
  473. package/cli-tool/components/mcps/browser_automation/browser-use-mcp-server.json +0 -20
  474. package/cli-tool/components/mcps/browser_automation/browsermcp.json +0 -9
  475. package/cli-tool/components/mcps/browser_automation/mcp-server-browserbase.json +0 -14
  476. package/cli-tool/components/mcps/browser_automation/mcp-server-playwright.json +0 -9
  477. package/cli-tool/components/mcps/browser_automation/playwright-mcp-server.json +0 -9
  478. package/cli-tool/components/mcps/browser_automation/playwright-mcp.json +0 -11
  479. package/cli-tool/components/mcps/database/mysql-integration.json +0 -12
  480. package/cli-tool/components/mcps/database/neon.json +0 -9
  481. package/cli-tool/components/mcps/database/postgresql-integration.json +0 -12
  482. package/cli-tool/components/mcps/database/supabase.json +0 -17
  483. package/cli-tool/components/mcps/deepgraph/deepgraph-nextjs.json +0 -13
  484. package/cli-tool/components/mcps/deepgraph/deepgraph-react.json +0 -13
  485. package/cli-tool/components/mcps/deepgraph/deepgraph-typescript.json +0 -13
  486. package/cli-tool/components/mcps/deepgraph/deepgraph-vue.json +0 -13
  487. package/cli-tool/components/mcps/devtools/azure-kubernetes-service.json +0 -11
  488. package/cli-tool/components/mcps/devtools/box.json +0 -14
  489. package/cli-tool/components/mcps/devtools/circleci.json +0 -13
  490. package/cli-tool/components/mcps/devtools/codacy.json +0 -12
  491. package/cli-tool/components/mcps/devtools/context7.json +0 -9
  492. package/cli-tool/components/mcps/devtools/dynatrace.json +0 -13
  493. package/cli-tool/components/mcps/devtools/elasticsearch.json +0 -18
  494. package/cli-tool/components/mcps/devtools/figma-dev-mode.json +0 -8
  495. package/cli-tool/components/mcps/devtools/firecrawl.json +0 -12
  496. package/cli-tool/components/mcps/devtools/firefly-mcp.json +0 -13
  497. package/cli-tool/components/mcps/devtools/huggingface.json +0 -11
  498. package/cli-tool/components/mcps/devtools/imagesorcery.json +0 -11
  499. package/cli-tool/components/mcps/devtools/ios-simulator-mcp.json +0 -9
  500. package/cli-tool/components/mcps/devtools/jfrog.json +0 -8
  501. package/cli-tool/components/mcps/devtools/just-mcp.json +0 -9
  502. package/cli-tool/components/mcps/devtools/launchdarkly.json +0 -12
  503. package/cli-tool/components/mcps/devtools/leetcode.json +0 -8
  504. package/cli-tool/components/mcps/devtools/logfire.json +0 -9
  505. package/cli-tool/components/mcps/devtools/markitdown.json +0 -14
  506. package/cli-tool/components/mcps/devtools/mcp-server-atlassian-bitbucket.json +0 -9
  507. package/cli-tool/components/mcps/devtools/mcp-server-trello.json +0 -12
  508. package/cli-tool/components/mcps/devtools/microsoft-clarity.json +0 -11
  509. package/cli-tool/components/mcps/devtools/microsoft-dev-box.json +0 -9
  510. package/cli-tool/components/mcps/devtools/mongodb.json +0 -12
  511. package/cli-tool/components/mcps/devtools/postman.json +0 -12
  512. package/cli-tool/components/mcps/devtools/sentry.json +0 -8
  513. package/cli-tool/components/mcps/devtools/serena.json +0 -9
  514. package/cli-tool/components/mcps/devtools/stripe.json +0 -12
  515. package/cli-tool/components/mcps/devtools/terraform.json +0 -14
  516. package/cli-tool/components/mcps/devtools/webflow.json +0 -8
  517. package/cli-tool/components/mcps/filesystem/filesystem-access.json +0 -13
  518. package/cli-tool/components/mcps/integration/github-integration.json +0 -12
  519. package/cli-tool/components/mcps/integration/memory-integration.json +0 -9
  520. package/cli-tool/components/mcps/marketing/facebook-ads-mcp-server.json +0 -13
  521. package/cli-tool/components/mcps/marketing/google-ads-mcp-server.json +0 -11
  522. package/cli-tool/components/mcps/productivity/monday.json +0 -14
  523. package/cli-tool/components/mcps/productivity/notion.json +0 -12
  524. package/cli-tool/components/mcps/web/web-fetch.json +0 -9
  525. package/cli-tool/components/settings/api/bedrock-configuration.json +0 -7
  526. package/cli-tool/components/settings/api/corporate-proxy.json +0 -7
  527. package/cli-tool/components/settings/api/custom-headers.json +0 -6
  528. package/cli-tool/components/settings/api/vertex-configuration.json +0 -17
  529. package/cli-tool/components/settings/authentication/api-key-helper.json +0 -7
  530. package/cli-tool/components/settings/authentication/force-claudeai-login.json +0 -4
  531. package/cli-tool/components/settings/authentication/force-console-login.json +0 -4
  532. package/cli-tool/components/settings/cleanup/retention-7-days.json +0 -4
  533. package/cli-tool/components/settings/cleanup/retention-90-days.json +0 -4
  534. package/cli-tool/components/settings/environment/bash-timeouts.json +0 -8
  535. package/cli-tool/components/settings/environment/development-utils.json +0 -8
  536. package/cli-tool/components/settings/environment/performance-optimization.json +0 -8
  537. package/cli-tool/components/settings/environment/privacy-focused.json +0 -10
  538. package/cli-tool/components/settings/git/git-flow-settings.json +0 -79
  539. package/cli-tool/components/settings/global/aws-credentials.json +0 -5
  540. package/cli-tool/components/settings/global/custom-model.json +0 -7
  541. package/cli-tool/components/settings/global/git-commit-settings.json +0 -4
  542. package/cli-tool/components/settings/mcp/disable-risky-servers.json +0 -8
  543. package/cli-tool/components/settings/mcp/enable-all-project-servers.json +0 -4
  544. package/cli-tool/components/settings/mcp/enable-specific-servers.json +0 -8
  545. package/cli-tool/components/settings/mcp/mcp-timeouts.json +0 -8
  546. package/cli-tool/components/settings/model/use-haiku.json +0 -4
  547. package/cli-tool/components/settings/model/use-sonnet.json +0 -4
  548. package/cli-tool/components/settings/permissions/additional-directories.json +0 -11
  549. package/cli-tool/components/settings/permissions/allow-git-operations.json +0 -14
  550. package/cli-tool/components/settings/permissions/allow-npm-commands.json +0 -11
  551. package/cli-tool/components/settings/permissions/deny-sensitive-files.json +0 -11
  552. package/cli-tool/components/settings/permissions/development-mode.json +0 -31
  553. package/cli-tool/components/settings/permissions/read-only-mode.json +0 -18
  554. package/cli-tool/components/settings/statusline/asset-pipeline-controller-statusline.json +0 -7
  555. package/cli-tool/components/settings/statusline/bug-circus-statusline.json +0 -7
  556. package/cli-tool/components/settings/statusline/code-casino-statusline.json +0 -7
  557. package/cli-tool/components/settings/statusline/code-spaceship-statusline.json +0 -7
  558. package/cli-tool/components/settings/statusline/colorful-statusline.json +0 -7
  559. package/cli-tool/components/settings/statusline/command-statusline.json +0 -8
  560. package/cli-tool/components/settings/statusline/context-monitor.json +0 -7
  561. package/cli-tool/components/settings/statusline/context-monitor.py +0 -236
  562. package/cli-tool/components/settings/statusline/data-ocean-statusline.json +0 -7
  563. package/cli-tool/components/settings/statusline/emotion-theater-statusline.json +0 -7
  564. package/cli-tool/components/settings/statusline/game-performance-monitor-statusline.json +0 -7
  565. package/cli-tool/components/settings/statusline/git-branch-statusline.json +0 -7
  566. package/cli-tool/components/settings/statusline/git-flow-status.json +0 -7
  567. package/cli-tool/components/settings/statusline/minimal-statusline.json +0 -7
  568. package/cli-tool/components/settings/statusline/multiplatform-build-status-statusline.json +0 -7
  569. package/cli-tool/components/settings/statusline/neon-database-dev.json +0 -7
  570. package/cli-tool/components/settings/statusline/neon-database-resources.json +0 -7
  571. package/cli-tool/components/settings/statusline/productivity-rainbow-statusline.json +0 -7
  572. package/cli-tool/components/settings/statusline/programmer-tamagotchi-statusline.json +0 -7
  573. package/cli-tool/components/settings/statusline/programming-fitness-tracker-statusline.json +0 -7
  574. package/cli-tool/components/settings/statusline/project-info-statusline.json +0 -7
  575. package/cli-tool/components/settings/statusline/rpg-status-bar-statusline.json +0 -7
  576. package/cli-tool/components/settings/statusline/time-statusline.json +0 -7
  577. package/cli-tool/components/settings/statusline/unity-project-dashboard-statusline.json +0 -7
  578. package/cli-tool/components/settings/statusline/vercel-deployment-monitor.json +0 -7
  579. package/cli-tool/components/settings/statusline/vercel-error-alert-system.json +0 -7
  580. package/cli-tool/components/settings/statusline/vercel-multi-env-status.json +0 -7
  581. package/cli-tool/components/settings/statusline/virtual-code-garden-statusline.json +0 -7
  582. package/cli-tool/components/settings/statusline/zero-config-deployment-monitor.json +0 -7
  583. package/cli-tool/components/settings/telemetry/custom-telemetry.json +0 -7
  584. package/cli-tool/components/settings/telemetry/disable-telemetry.json +0 -6
  585. package/cli-tool/components/settings/telemetry/enable-telemetry.json +0 -6
  586. package/cli-tool/docs_to_claude/ANALYTICS_STATE_DETECTION.md +0 -183
  587. package/cli-tool/docs_to_claude/ARCHITECTURE.md +0 -472
  588. package/cli-tool/docs_to_claude/BLOG_WRITING_GUIDE.md +0 -438
  589. package/cli-tool/docs_to_claude/CLAUDE_DATA_STRUCTURE.md +0 -400
  590. package/cli-tool/docs_to_claude/COMMANDS_GUIDE.md +0 -1035
  591. package/cli-tool/docs_to_claude/CONVERSATION_STATE_IMPROVEMENTS.md +0 -154
  592. package/cli-tool/docs_to_claude/DEBUG_TYPING_DETECTION.md +0 -95
  593. package/cli-tool/docs_to_claude/DOWNLOAD_TRACKING.md +0 -291
  594. package/cli-tool/docs_to_claude/ENHANCED_STATE_DETECTION.md +0 -122
  595. package/cli-tool/docs_to_claude/HEALTH_CHECK_IMPLEMENTATION.md +0 -135
  596. package/cli-tool/docs_to_claude/HOOKS_GUIDE.md +0 -1249
  597. package/cli-tool/docs_to_claude/STATUSLINE_GUIDE.md +0 -1123
  598. package/cli-tool/docs_to_claude/SUBAGENTS_GUIDE.md +0 -566
  599. package/cli-tool/docs_to_claude/SUB_AGENTS.md +0 -329
  600. package/cli-tool/jest.config.js +0 -84
  601. package/cli-tool/package-lock.json +0 -5471
  602. package/cli-tool/package.json +0 -96
  603. package/cli-tool/templates/common/.claude/commands/git-workflow.md +0 -239
  604. package/cli-tool/templates/common/.claude/commands/project-setup.md +0 -316
  605. package/cli-tool/templates/common/.mcp.json +0 -41
  606. package/cli-tool/templates/common/CLAUDE.md +0 -109
  607. package/cli-tool/templates/common/README.md +0 -96
  608. package/cli-tool/templates/go/.mcp.json +0 -78
  609. package/cli-tool/templates/go/README.md +0 -25
  610. package/cli-tool/templates/javascript-typescript/.claude/commands/api-endpoint.md +0 -51
  611. package/cli-tool/templates/javascript-typescript/.claude/commands/debug.md +0 -52
  612. package/cli-tool/templates/javascript-typescript/.claude/commands/lint.md +0 -48
  613. package/cli-tool/templates/javascript-typescript/.claude/commands/npm-scripts.md +0 -48
  614. package/cli-tool/templates/javascript-typescript/.claude/commands/refactor.md +0 -55
  615. package/cli-tool/templates/javascript-typescript/.claude/commands/test.md +0 -61
  616. package/cli-tool/templates/javascript-typescript/.claude/commands/typescript-migrate.md +0 -51
  617. package/cli-tool/templates/javascript-typescript/.claude/settings.json +0 -142
  618. package/cli-tool/templates/javascript-typescript/.mcp.json +0 -80
  619. package/cli-tool/templates/javascript-typescript/CLAUDE.md +0 -185
  620. package/cli-tool/templates/javascript-typescript/README.md +0 -259
  621. package/cli-tool/templates/javascript-typescript/examples/angular-app/.claude/commands/components.md +0 -63
  622. package/cli-tool/templates/javascript-typescript/examples/angular-app/.claude/commands/services.md +0 -62
  623. package/cli-tool/templates/javascript-typescript/examples/node-api/.claude/commands/api-endpoint.md +0 -46
  624. package/cli-tool/templates/javascript-typescript/examples/node-api/.claude/commands/database.md +0 -56
  625. package/cli-tool/templates/javascript-typescript/examples/node-api/.claude/commands/middleware.md +0 -61
  626. package/cli-tool/templates/javascript-typescript/examples/node-api/.claude/commands/route.md +0 -57
  627. package/cli-tool/templates/javascript-typescript/examples/node-api/CLAUDE.md +0 -102
  628. package/cli-tool/templates/javascript-typescript/examples/react-app/.claude/commands/component.md +0 -29
  629. package/cli-tool/templates/javascript-typescript/examples/react-app/.claude/commands/hooks.md +0 -44
  630. package/cli-tool/templates/javascript-typescript/examples/react-app/.claude/commands/state-management.md +0 -45
  631. package/cli-tool/templates/javascript-typescript/examples/react-app/CLAUDE.md +0 -81
  632. package/cli-tool/templates/javascript-typescript/examples/react-app/agents/react-performance-optimization.md +0 -530
  633. package/cli-tool/templates/javascript-typescript/examples/react-app/agents/react-state-management.md +0 -295
  634. package/cli-tool/templates/javascript-typescript/examples/vue-app/.claude/commands/components.md +0 -46
  635. package/cli-tool/templates/javascript-typescript/examples/vue-app/.claude/commands/composables.md +0 -51
  636. package/cli-tool/templates/python/.claude/commands/lint.md +0 -111
  637. package/cli-tool/templates/python/.claude/commands/test.md +0 -73
  638. package/cli-tool/templates/python/.claude/settings.json +0 -153
  639. package/cli-tool/templates/python/.mcp.json +0 -78
  640. package/cli-tool/templates/python/CLAUDE.md +0 -276
  641. package/cli-tool/templates/python/examples/django-app/.claude/commands/admin.md +0 -264
  642. package/cli-tool/templates/python/examples/django-app/.claude/commands/django-model.md +0 -124
  643. package/cli-tool/templates/python/examples/django-app/.claude/commands/views.md +0 -222
  644. package/cli-tool/templates/python/examples/django-app/CLAUDE.md +0 -313
  645. package/cli-tool/templates/python/examples/fastapi-app/.claude/commands/api-endpoints.md +0 -513
  646. package/cli-tool/templates/python/examples/fastapi-app/.claude/commands/auth.md +0 -775
  647. package/cli-tool/templates/python/examples/fastapi-app/.claude/commands/database.md +0 -657
  648. package/cli-tool/templates/python/examples/fastapi-app/.claude/commands/deployment.md +0 -160
  649. package/cli-tool/templates/python/examples/fastapi-app/.claude/commands/testing.md +0 -927
  650. package/cli-tool/templates/python/examples/fastapi-app/CLAUDE.md +0 -229
  651. package/cli-tool/templates/python/examples/flask-app/.claude/commands/app-factory.md +0 -384
  652. package/cli-tool/templates/python/examples/flask-app/.claude/commands/blueprint.md +0 -243
  653. package/cli-tool/templates/python/examples/flask-app/.claude/commands/database.md +0 -410
  654. package/cli-tool/templates/python/examples/flask-app/.claude/commands/deployment.md +0 -620
  655. package/cli-tool/templates/python/examples/flask-app/.claude/commands/flask-route.md +0 -217
  656. package/cli-tool/templates/python/examples/flask-app/.claude/commands/testing.md +0 -559
  657. package/cli-tool/templates/python/examples/flask-app/CLAUDE.md +0 -391
  658. package/cli-tool/templates/ruby/.claude/commands/model.md +0 -360
  659. package/cli-tool/templates/ruby/.claude/commands/test.md +0 -480
  660. package/cli-tool/templates/ruby/.claude/settings.json +0 -146
  661. package/cli-tool/templates/ruby/.mcp.json +0 -83
  662. package/cli-tool/templates/ruby/CLAUDE.md +0 -284
  663. package/cli-tool/templates/ruby/examples/rails-app/.claude/commands/authentication.md +0 -490
  664. package/cli-tool/templates/ruby/examples/rails-app/CLAUDE.md +0 -376
  665. package/cli-tool/templates/rust/.mcp.json +0 -78
  666. package/cli-tool/templates/rust/README.md +0 -26
  667. package/cli-tool/test-commands.sh +0 -85
  668. package/cli-tool/test-detailed.sh +0 -267
  669. package/dev-server.js +0 -46
  670. package/docs/CNAME +0 -1
  671. package/docs/README.md +0 -49
  672. package/docs/_config.yml +0 -43
  673. package/docs/api/agents.json +0 -942
  674. package/docs/blog/assets/aitmpl-nextjs-search.png +0 -0
  675. package/docs/blog/assets/aitmpl-supabase-search.png +0 -0
  676. package/docs/blog/assets/e2b-claude-code-sandbox-cover.png +0 -0
  677. package/docs/blog/assets/nextjs-vercel-claude-code-templates-cover.png +0 -0
  678. package/docs/blog/assets/supabase-claude-code-templates-cover.png +0 -0
  679. package/docs/blog/e2b-claude-code-sandbox/index.html +0 -908
  680. package/docs/blog/index.html +0 -274
  681. package/docs/blog/nextjs-vercel-claude-code-integration/index.html +0 -1032
  682. package/docs/blog/supabase-claude-code-integration/index.html +0 -848
  683. package/docs/claude-jobs.json +0 -163
  684. package/docs/component.html +0 -506
  685. package/docs/components-metadata.json +0 -303
  686. package/docs/components.json +0 -4952
  687. package/docs/css/blog.css +0 -821
  688. package/docs/css/component-page.css +0 -1063
  689. package/docs/css/stack-page.css +0 -776
  690. package/docs/css/styles.css +0 -4540
  691. package/docs/css/trending.css +0 -1441
  692. package/docs/css/workflows-modal.css +0 -739
  693. package/docs/css/workflows.css +0 -1234
  694. package/docs/download-stats.html +0 -527
  695. package/docs/index.html +0 -627
  696. package/docs/jobs.html +0 -1059
  697. package/docs/js/carousel.js +0 -177
  698. package/docs/js/cart-manager.js +0 -658
  699. package/docs/js/component-page.js +0 -808
  700. package/docs/js/data-loader.js +0 -633
  701. package/docs/js/generate-search-data.js +0 -82
  702. package/docs/js/index-events.js +0 -1812
  703. package/docs/js/modal-helpers.js +0 -345
  704. package/docs/js/script.js +0 -2167
  705. package/docs/js/search-functionality.js +0 -1165
  706. package/docs/js/stack-router.js +0 -561
  707. package/docs/js/trending.js +0 -752
  708. package/docs/js/utils.js +0 -43
  709. package/docs/js/workflows-events.js +0 -1146
  710. package/docs/js/workflows.js +0 -627
  711. package/docs/robots.txt +0 -28
  712. package/docs/sandbox-interface.html +0 -1418
  713. package/docs/sitemap.xml +0 -193
  714. package/docs/static/img/logo.png +0 -0
  715. package/docs/static/img/logo.svg +0 -23
  716. package/docs/trending-data.json +0 -885
  717. package/docs/trending.html +0 -238
  718. package/docs/vercel.json +0 -36
  719. package/docs/workflows.html +0 -391
  720. package/docu/README.md +0 -41
  721. package/docu/docs/cli-options.md +0 -90
  722. package/docu/docs/components/agents.md +0 -113
  723. package/docu/docs/components/commands.md +0 -90
  724. package/docu/docs/components/hooks.md +0 -114
  725. package/docu/docs/components/mcps.md +0 -109
  726. package/docu/docs/components/overview.md +0 -73
  727. package/docu/docs/components/settings.md +0 -105
  728. package/docu/docs/components/templates.md +0 -119
  729. package/docu/docs/intro.md +0 -40
  730. package/docu/docs/safety-features.md +0 -13
  731. package/docu/docs/support.md +0 -13
  732. package/docu/docs/tools/analytics.md +0 -23
  733. package/docu/docs/tools/chats.md +0 -33
  734. package/docu/docs/tools/health-check.md +0 -60
  735. package/docu/docs/tools/overview.md +0 -39
  736. package/docu/docs/tools/sandbox.md +0 -61
  737. package/docu/docs/tools/tunnel.md +0 -38
  738. package/docu/docusaurus.config.ts +0 -169
  739. package/docu/package-lock.json +0 -16185
  740. package/docu/package.json +0 -47
  741. package/docu/sidebars.ts +0 -49
  742. package/docu/src/components/HomepageFeatures/index.tsx +0 -82
  743. package/docu/src/components/HomepageFeatures/styles.module.css +0 -131
  744. package/docu/src/css/custom.css +0 -849
  745. package/docu/src/pages/index.module.css +0 -111
  746. package/docu/src/pages/index.tsx +0 -65
  747. package/docu/src/pages/markdown-page.md +0 -7
  748. package/docu/static/img/favicon.ico +0 -0
  749. package/docu/static/img/logo.svg +0 -23
  750. package/docu/tsconfig.json +0 -8
  751. package/docu/vercel.json +0 -11
  752. package/generate_agents_api.py +0 -65
  753. package/generate_claude_jobs.py +0 -985
  754. package/generate_components_json.py +0 -391
  755. package/social-preview.png +0 -0
  756. package/test_serpapi.py +0 -36
  757. package/vercel.json +0 -111
  758. /package/{cli-tool/components → components}/sandbox/README.md +0 -0
  759. /package/{cli-tool/components → components}/sandbox/e2b/.env.example +0 -0
  760. /package/{cli-tool/components → components}/sandbox/e2b/SANDBOX_DEBUGGING.md +0 -0
  761. /package/{cli-tool/components → components}/sandbox/e2b/claude-code-sandbox.md +0 -0
  762. /package/{cli-tool/components → components}/sandbox/e2b/e2b-launcher.py +0 -0
  763. /package/{cli-tool/components → components}/sandbox/e2b/e2b-monitor.py +0 -0
  764. /package/{cli-tool/components → components}/sandbox/e2b/requirements.txt +0 -0
  765. /package/{cli-tool/src → src}/agents.js +0 -0
  766. /package/{cli-tool/src → src}/analytics/core/AgentAnalyzer.js +0 -0
  767. /package/{cli-tool/src → src}/analytics/core/ConversationAnalyzer.js +0 -0
  768. /package/{cli-tool/src → src}/analytics/core/FileWatcher.js +0 -0
  769. /package/{cli-tool/src → src}/analytics/core/ProcessDetector.js +0 -0
  770. /package/{cli-tool/src → src}/analytics/core/SessionAnalyzer.js +0 -0
  771. /package/{cli-tool/src → src}/analytics/core/StateCalculator.js +0 -0
  772. /package/{cli-tool/src → src}/analytics/data/DataCache.js +0 -0
  773. /package/{cli-tool/src → src}/analytics/notifications/NotificationManager.js +0 -0
  774. /package/{cli-tool/src → src}/analytics/notifications/WebSocketServer.js +0 -0
  775. /package/{cli-tool/src → src}/analytics/utils/PerformanceMonitor.js +0 -0
  776. /package/{cli-tool/src → src}/analytics-web/FRONT_ARCHITECTURE.md +0 -0
  777. /package/{cli-tool/src → src}/analytics-web/assets/js/main.js.deprecated +0 -0
  778. /package/{cli-tool/src → src}/analytics-web/components/ActivityHeatmap.js +0 -0
  779. /package/{cli-tool/src → src}/analytics-web/components/AgentAnalytics.js +0 -0
  780. /package/{cli-tool/src → src}/analytics-web/components/App.js +0 -0
  781. /package/{cli-tool/src → src}/analytics-web/components/Charts.js +0 -0
  782. /package/{cli-tool/src → src}/analytics-web/components/ConversationTable.js +0 -0
  783. /package/{cli-tool/src → src}/analytics-web/components/DashboardPage.js +0 -0
  784. /package/{cli-tool/src → src}/analytics-web/components/HeaderComponent.js +0 -0
  785. /package/{cli-tool/src → src}/analytics-web/components/SessionTimer.js +0 -0
  786. /package/{cli-tool/src → src}/analytics-web/components/Sidebar.js +0 -0
  787. /package/{cli-tool/src → src}/analytics-web/components/ToolDisplay.js +0 -0
  788. /package/{cli-tool/src → src}/analytics-web/index.html +0 -0
  789. /package/{cli-tool/src → src}/analytics-web/index.html.original +0 -0
  790. /package/{cli-tool/src → src}/analytics-web/services/DataService.js +0 -0
  791. /package/{cli-tool/src → src}/analytics-web/services/StateService.js +0 -0
  792. /package/{cli-tool/src → src}/analytics-web/services/WebSocketService.js +0 -0
  793. /package/{cli-tool/src → src}/analytics.js +0 -0
  794. /package/{docu/static/.nojekyll → src/analytics.log} +0 -0
  795. /package/{cli-tool/src → src}/chats-mobile.js +0 -0
  796. /package/{cli-tool/src → src}/claude-api-proxy.js +0 -0
  797. /package/{cli-tool/src → src}/command-scanner.js +0 -0
  798. /package/{cli-tool/src → src}/command-stats.js +0 -0
  799. /package/{cli-tool/src → src}/file-operations.js +0 -0
  800. /package/{cli-tool/src → src}/health-check.js +0 -0
  801. /package/{cli-tool/src → src}/hook-scanner.js +0 -0
  802. /package/{cli-tool/src → src}/hook-stats.js +0 -0
  803. /package/{cli-tool/src → src}/mcp-stats.js +0 -0
  804. /package/{cli-tool/src → src}/prompts.js +0 -0
  805. /package/{cli-tool/src → src}/sandbox-interface.html +0 -0
  806. /package/{cli-tool/src → src}/sandbox-server.js +0 -0
  807. /package/{cli-tool/src → src}/sdk/global-agent-manager.js +0 -0
  808. /package/{cli-tool/src → src}/templates.js +0 -0
  809. /package/{cli-tool/src → src}/test-console-bridge.js +0 -0
  810. /package/{cli-tool/src → src}/tracking-service.js +0 -0
  811. /package/{cli-tool/src → src}/utils.js +0 -0
package/docs/js/script.js DELETED
@@ -1,2167 +0,0 @@
1
- // GitHub repository configuration
2
- const GITHUB_CONFIG = {
3
- owner: 'davila7',
4
- repo: 'claude-code-templates',
5
- branch: 'main',
6
- templatesPath: 'cli-tool/src/templates.js'
7
- };
8
-
9
- // Framework logos using Devicon CDN (https://devicon.dev/)
10
- const FRAMEWORK_ICONS = {
11
- // Languages
12
- 'common': 'devicon-gear-plain', // Generic gear icon
13
- 'javascript-typescript': 'devicon-javascript-plain',
14
- 'python': 'devicon-python-plain',
15
- 'ruby': 'devicon-ruby-plain',
16
- 'rust': 'devicon-rust-plain',
17
- 'go': 'devicon-go-plain',
18
-
19
- // JavaScript/TypeScript frameworks
20
- 'react': 'devicon-react-original',
21
- 'vue': 'devicon-vuejs-plain',
22
- 'angular': 'devicon-angularjs-plain',
23
- 'node': 'devicon-nodejs-plain',
24
-
25
- // Python frameworks
26
- 'django': 'devicon-django-plain',
27
- 'flask': 'devicon-flask-original',
28
- 'fastapi': 'devicon-fastapi-plain',
29
-
30
- // Ruby frameworks
31
- 'rails': 'devicon-rails-plain',
32
- 'sinatra': 'devicon-ruby-plain', // Use Ruby icon for Sinatra
33
-
34
- // Default fallback
35
- 'default': 'devicon-devicon-plain'
36
- };
37
-
38
- let templatesData = null;
39
-
40
- // Fetch templates configuration from GitHub
41
- async function fetchTemplatesConfig() {
42
- const grid = document.getElementById('unifiedGrid') || document.getElementById('templatesGrid');
43
- grid.innerHTML = '<div class="loading">Loading templates from GitHub...</div>';
44
-
45
- try {
46
- // Add cache-busting parameter to ensure we get the latest version
47
- const url = `https://raw.githubusercontent.com/${GITHUB_CONFIG.owner}/${GITHUB_CONFIG.repo}/${GITHUB_CONFIG.branch}/${GITHUB_CONFIG.templatesPath}?t=${Date.now()}`;
48
- const response = await fetch(url);
49
-
50
- if (!response.ok) {
51
- throw new Error(`HTTP error! status: ${response.status}`);
52
- }
53
-
54
- const templateFileContent = await response.text();
55
-
56
- // Parse the JavaScript file to extract TEMPLATES_CONFIG
57
- templatesData = parseTemplatesConfig(templateFileContent);
58
-
59
- if (templatesData) {
60
- generateTemplateCards();
61
- } else {
62
- throw new Error('Failed to parse templates configuration');
63
- }
64
-
65
- } catch (error) {
66
- console.error('Error fetching templates:', error);
67
- grid.innerHTML = `
68
- <div class="error-message">
69
- <h3>Error loading templates</h3>
70
- <p>Could not fetch templates from GitHub. Please try again later.</p>
71
- <button onclick="displayTemplates()" class="retry-btn">Retry</button>
72
- </div>
73
- `;
74
- }
75
- }
76
-
77
- // Parse the templates.js file content to extract TEMPLATES_CONFIG
78
- function parseTemplatesConfig(fileContent) {
79
- try {
80
- // Extract TEMPLATES_CONFIG object from the file
81
- const configMatch = fileContent.match(/const TEMPLATES_CONFIG = ({[\s\S]*?});/);
82
- if (!configMatch) {
83
- throw new Error('TEMPLATES_CONFIG not found in file');
84
- }
85
-
86
- // Clean up the extracted object string and make it valid JSON
87
- let configString = configMatch[1];
88
-
89
- // Replace single quotes with double quotes
90
- configString = configString.replace(/'/g, '"');
91
-
92
- // Handle object property names without quotes
93
- configString = configString.replace(/(\w+):/g, '"$1":');
94
-
95
- // Remove trailing commas
96
- configString = configString.replace(/,(\s*[}\]])/g, '$1');
97
-
98
- // Parse the JSON
99
- const config = JSON.parse(configString);
100
-
101
- return config;
102
- } catch (error) {
103
- console.error('Error parsing templates config:', error);
104
- return null;
105
- }
106
- }
107
-
108
- // Generate template cards from fetched data
109
- function generateTemplateCards() {
110
- const grid = document.getElementById('unifiedGrid');
111
- grid.innerHTML = '';
112
-
113
- if (!templatesData) {
114
- grid.innerHTML = '<div class="error-message">No templates data available</div>';
115
- return;
116
- }
117
-
118
- // Add the "Add New Template" card first
119
- const addTemplateCard = createAddTemplateCard();
120
- grid.appendChild(addTemplateCard);
121
-
122
- Object.entries(templatesData).forEach(([languageKey, languageData]) => {
123
- // Skip the 'common' template as we're replacing it with the Add Template card
124
- if (languageKey === 'common') {
125
- return;
126
- }
127
-
128
- // Create base language card (no framework)
129
- const baseCard = createTemplateCard(languageKey, languageData, 'none', {
130
- name: languageData.name,
131
- icon: getFrameworkIcon(languageKey),
132
- command: `npx claude-code-templates@latest --template=${languageKey} --yes`
133
- });
134
- grid.appendChild(baseCard);
135
-
136
- // Create framework-specific cards
137
- if (languageData.frameworks) {
138
- Object.entries(languageData.frameworks).forEach(([frameworkKey, frameworkData]) => {
139
- const frameworkCard = createTemplateCard(languageKey, languageData, frameworkKey, {
140
- name: frameworkData.name,
141
- icon: getFrameworkIcon(frameworkKey),
142
- command: `npx claude-code-templates@latest --template=${languageKey} --yes`
143
- });
144
- grid.appendChild(frameworkCard);
145
- });
146
- }
147
- });
148
- }
149
-
150
- function createAddTemplateCard() {
151
- const card = document.createElement('div');
152
- card.className = 'template-card add-template-card';
153
-
154
- card.innerHTML = `
155
- <div class="card-inner">
156
- <div class="card-front">
157
- <div class="framework-logo">
158
- <svg width="32" height="32" viewBox="0 0 24 24" fill="currentColor">
159
- <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"/>
160
- </svg>
161
- </div>
162
- <h3 class="template-title">Add New Template</h3>
163
- <p class="template-description">Contribute a new language or framework to the community</p>
164
- </div>
165
- </div>
166
- `;
167
-
168
- // Add click handler to open contribution modal directly (no flip)
169
- card.addEventListener('click', () => {
170
- showContributeModal();
171
- });
172
-
173
- return card;
174
- }
175
-
176
- function createTemplateCard(languageKey, languageData, frameworkKey, frameworkData) {
177
- const card = document.createElement('div');
178
- card.className = `template-card ${languageData.comingSoon ? 'coming-soon' : ''}`;
179
-
180
- const displayName = frameworkKey === 'none' ?
181
- frameworkData.name :
182
- `${languageData.name.split('/')[0]}/${frameworkData.name}`;
183
-
184
- // Get download count for this template
185
- const templateKey = frameworkKey === 'none' ? languageKey : `${languageKey}/${frameworkKey}`;
186
- const downloadCount = getDownloadCount(templateKey, 'template');
187
- const downloadBadge = createDownloadBadge(downloadCount);
188
-
189
- card.innerHTML = `
190
- <div class="card-inner">
191
- <div class="card-front">
192
- ${languageData.comingSoon ? '<div class="coming-soon-badge">Coming Soon</div>' : ''}
193
- ${downloadBadge}
194
- <div class="framework-logo">
195
- <i class="${frameworkData.icon} colored"></i>
196
- </div>
197
- <h3 class="template-title">${displayName}</h3>
198
- <p class="template-description">${languageData.description || ''}</p>
199
- </div>
200
- <div class="card-back">
201
- <div class="command-display">
202
- <h3>Installation Options</h3>
203
- <div class="command-code">${frameworkData.command}</div>
204
- <div class="action-buttons">
205
- <button class="view-files-btn" onclick="showInstallationFiles('${languageKey}', '${frameworkKey}', '${displayName}')">
206
- 📁 View Files
207
- </button>
208
- <button class="copy-command-btn" onclick="copyToClipboard('${frameworkData.command}')">
209
- 📋 Copy Command
210
- </button>
211
- </div>
212
- </div>
213
- </div>
214
- </div>
215
- `;
216
-
217
- // Add click handler for card flip (only if not coming soon)
218
- if (!languageData.comingSoon) {
219
- card.addEventListener('click', (e) => {
220
- // Don't flip if clicking on buttons
221
- if (!e.target.closest('button')) {
222
- card.classList.toggle('flipped');
223
- }
224
- });
225
- }
226
-
227
- return card;
228
- }
229
-
230
- // Get framework icon from mapping
231
- function getFrameworkIcon(framework) {
232
- return FRAMEWORK_ICONS[framework] || FRAMEWORK_ICONS['default'];
233
- }
234
-
235
- // Get installation files for a specific template
236
- function getInstallationFiles(languageKey, frameworkKey) {
237
- if (!templatesData || !templatesData[languageKey]) {
238
- return [];
239
- }
240
-
241
- const languageData = templatesData[languageKey];
242
- let files = [...(languageData.files || [])];
243
-
244
- // Add framework-specific files if applicable
245
- if (frameworkKey !== 'none' && languageData.frameworks && languageData.frameworks[frameworkKey]) {
246
- const frameworkData = languageData.frameworks[frameworkKey];
247
- if (frameworkData.additionalFiles) {
248
- files = files.concat(frameworkData.additionalFiles);
249
- }
250
- }
251
-
252
- return files;
253
- }
254
-
255
- // Show installation files popup
256
- function showInstallationFiles(languageKey, frameworkKey, displayName) {
257
- const files = getInstallationFiles(languageKey, frameworkKey);
258
-
259
- if (files.length === 0) {
260
- showCopyFeedback('No files to display');
261
- return;
262
- }
263
-
264
- // Generate GitHub folder URL
265
- const githubFolderUrl = getGithubFolderUrl(languageKey, frameworkKey);
266
-
267
- // Create modal HTML
268
- const modalHTML = `
269
- <div class="modal-overlay" onclick="closeModal()">
270
- <div class="modal-content" onclick="event.stopPropagation()">
271
- <div class="modal-header">
272
- <h3>📁 Installation Files - ${displayName}</h3>
273
- <button class="modal-close" onclick="closeModal()">×</button>
274
- </div>
275
- <div class="modal-body">
276
- <p class="modal-description">The following files will be installed in your project:</p>
277
- <div class="files-table">
278
- <div class="table-header">
279
- <div class="column-header">File</div>
280
- <div class="column-header">Destination</div>
281
- <div class="column-header">Type</div>
282
- </div>
283
- ${files.map(file => `
284
- <div class="table-row">
285
- <div class="file-source">
286
- <a href="${getGithubFileUrl(languageKey, frameworkKey, file.source)}" target="_blank" class="file-link">
287
- ${file.source}
288
- </a>
289
- </div>
290
- <div class="file-destination">${file.destination}</div>
291
- <div class="file-type">${getFileType(file.destination)}</div>
292
- </div>
293
- `).join('')}
294
- </div>
295
- <div class="modal-footer">
296
- <p class="file-count">Total: ${files.length} file${files.length > 1 ? 's' : ''}</p>
297
- <div class="modal-actions">
298
- <a href="${githubFolderUrl}" target="_blank" class="github-folder-link">
299
- <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
300
- <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"/>
301
- </svg>
302
- View all files on GitHub
303
- </a>
304
- </div>
305
- </div>
306
- </div>
307
- </div>
308
- </div>
309
- `;
310
-
311
- // Remove existing modal if present
312
- const existingModal = document.querySelector('.modal-overlay');
313
- if (existingModal) {
314
- existingModal.remove();
315
- }
316
-
317
- // Add modal to body
318
- document.body.insertAdjacentHTML('beforeend', modalHTML);
319
-
320
- // Add event listener for ESC key
321
- const handleEscape = (e) => {
322
- if (e.key === 'Escape') {
323
- closeComponentModal();
324
- document.removeEventListener('keydown', handleEscape);
325
- }
326
- };
327
- document.addEventListener('keydown', handleEscape);
328
- }
329
-
330
- // ===== ANALYTICS AND STATISTICS FUNCTIONALITY =====
331
-
332
- /**
333
- * Load and display download statistics from GitHub-generated analytics
334
- */
335
- async function loadDownloadStatistics() {
336
- try {
337
- // Fetch analytics data generated by GitHub Actions
338
- const response = await fetch('analytics/download-stats.json?t=' + Date.now());
339
-
340
- if (!response.ok) {
341
- console.log('Analytics data not available yet');
342
- hideStatisticsSection();
343
- return;
344
- }
345
-
346
- const analyticsData = await response.json();
347
- displayDownloadStatistics(analyticsData);
348
-
349
- } catch (error) {
350
- console.log('Analytics data not available:', error.message);
351
- hideStatisticsSection();
352
- }
353
- }
354
-
355
- /**
356
- * Display download statistics in the UI
357
- */
358
- function displayDownloadStatistics(data) {
359
- // Update total downloads
360
- const totalElement = document.getElementById('totalDownloads');
361
- if (totalElement) {
362
- totalElement.textContent = formatNumber(data.total_downloads || 0);
363
- }
364
-
365
- // Update individual component type counts
366
- const typeElements = {
367
- agentDownloads: data.downloads_by_type?.agent || 0,
368
- commandDownloads: data.downloads_by_type?.command || 0,
369
- mcpDownloads: data.downloads_by_type?.mcp || 0,
370
- templateDownloads: data.downloads_by_type?.template || 0
371
- };
372
-
373
- Object.entries(typeElements).forEach(([elementId, count]) => {
374
- const element = document.getElementById(elementId);
375
- if (element) {
376
- element.textContent = formatNumber(count);
377
- }
378
- });
379
-
380
- // Find and display most popular component
381
- const popularElement = document.getElementById('popularComponent');
382
- if (popularElement && data.downloads_by_component) {
383
- const topComponent = Object.entries(data.downloads_by_component)[0];
384
- if (topComponent) {
385
- const [componentName, downloadCount] = topComponent;
386
- popularElement.textContent = formatComponentNameForDisplay(componentName);
387
- popularElement.setAttribute('title', `${formatNumber(downloadCount)} downloads`);
388
- } else {
389
- popularElement.textContent = '-';
390
- }
391
- }
392
-
393
- // Update last updated timestamp
394
- const lastUpdatedElement = document.getElementById('statsLastUpdated');
395
- if (lastUpdatedElement && data.last_updated) {
396
- const lastUpdated = new Date(data.last_updated);
397
- lastUpdatedElement.textContent = formatRelativeTime(lastUpdated);
398
- }
399
-
400
- // Show the statistics section
401
- showStatisticsSection();
402
-
403
- console.log('📊 Download statistics loaded successfully');
404
- }
405
-
406
- /**
407
- * Hide statistics section when data is not available
408
- */
409
- function hideStatisticsSection() {
410
- // Keep statistics section visible even when data is not available
411
- // const statsSection = document.getElementById('downloadStatsSection');
412
- // if (statsSection) {
413
- // statsSection.style.display = 'none';
414
- // }
415
- }
416
-
417
- /**
418
- * Show statistics section when data is available
419
- * Note: Stats section has been moved to dedicated page at /download-stats.html
420
- */
421
- function showStatisticsSection() {
422
- // Stats section removed from main page - no action needed
423
- console.log('Stats available at /download-stats.html');
424
- }
425
-
426
- /**
427
- * Format numbers with thousands separators
428
- */
429
- function formatNumber(num) {
430
- if (num === 0) return '0';
431
- if (num < 1000) return num.toString();
432
- if (num < 1000000) return (num / 1000).toFixed(1) + 'K';
433
- return (num / 1000000).toFixed(1) + 'M';
434
- }
435
-
436
- /**
437
- * Format component name for display (remove prefixes, capitalize)
438
- */
439
- function formatComponentNameForDisplay(componentName) {
440
- if (!componentName || componentName === 'unknown') return '-';
441
-
442
- // Handle template format (language/framework)
443
- if (componentName.includes('/')) {
444
- const parts = componentName.split('/');
445
- return parts.map(part =>
446
- part.replace(/-/g, ' ')
447
- .replace(/\b\w/g, l => l.toUpperCase())
448
- ).join('/');
449
- }
450
-
451
- // Handle individual components
452
- return componentName
453
- .replace(/-/g, ' ')
454
- .replace(/\b\w/g, l => l.toUpperCase());
455
- }
456
-
457
- /**
458
- * Format relative time (e.g., "2 hours ago")
459
- */
460
- function formatRelativeTime(date) {
461
- const now = new Date();
462
- const diffMs = now - date;
463
- const diffMins = Math.floor(diffMs / (1000 * 60));
464
- const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
465
- const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
466
-
467
- if (diffMins < 60) {
468
- return diffMins <= 1 ? 'just now' : `${diffMins} minutes ago`;
469
- } else if (diffHours < 24) {
470
- return diffHours === 1 ? '1 hour ago' : `${diffHours} hours ago`;
471
- } else if (diffDays < 7) {
472
- return diffDays === 1 ? '1 day ago' : `${diffDays} days ago`;
473
- } else {
474
- return date.toLocaleDateString('en-US', {
475
- month: 'short',
476
- day: 'numeric',
477
- year: date.getFullYear() !== now.getFullYear() ? 'numeric' : undefined
478
- });
479
- }
480
- }
481
-
482
- /**
483
- * Refresh statistics data
484
- */
485
- async function refreshStatistics() {
486
- const refreshButton = document.querySelector('.stats-refresh-btn');
487
- if (refreshButton) {
488
- refreshButton.textContent = 'Refreshing...';
489
- refreshButton.disabled = true;
490
- }
491
-
492
- await loadDownloadStatistics();
493
-
494
- if (refreshButton) {
495
- refreshButton.textContent = 'Refresh';
496
- refreshButton.disabled = false;
497
- }
498
- }
499
-
500
- // Auto-refresh statistics every 10 minutes
501
- setInterval(loadDownloadStatistics, 10 * 60 * 1000);
502
-
503
- // Close modal
504
- function closeModal() {
505
- const modal = document.querySelector('.modal');
506
- if (modal) {
507
- modal.remove();
508
- }
509
- }
510
-
511
- // Show contribute modal
512
- function showContributeModal() {
513
- const modalHTML = `
514
- <div class="modal-overlay" onclick="closeModal()">
515
- <div class="modal-content contribute-modal" onclick="event.stopPropagation()">
516
- <div class="modal-header">
517
- <h3>🚀 Contribute a New Template</h3>
518
- <button class="modal-close" onclick="closeModal()">×</button>
519
- </div>
520
- <div class="modal-body">
521
- <div class="contribute-intro">
522
- <p>Help expand Claude Code Templates by contributing new languages or frameworks! Follow these steps to submit your contribution:</p>
523
- </div>
524
-
525
- <div class="contribute-steps">
526
- <div class="contribute-step">
527
- <div class="step-number-contrib">1</div>
528
- <div class="step-content-contrib">
529
- <h4>Fork the Repository</h4>
530
- <p>Go to the <a href="https://github.com/davila7/claude-code-templates" target="_blank">main repository</a> and click "Fork" to create your own copy.</p>
531
- <div class="step-command">
532
- <code>git clone https://github.com/YOUR_USERNAME/claude-code-templates.git</code>
533
- <button class="copy-btn" onclick="copyToClipboard('git clone https://github.com/YOUR_USERNAME/claude-code-templates.git')">Copy</button>
534
- </div>
535
- </div>
536
- </div>
537
-
538
- <div class="contribute-step">
539
- <div class="step-number-contrib">2</div>
540
- <div class="step-content-contrib">
541
- <h4>Choose Your Contribution Type</h4>
542
- <div class="contribution-types">
543
- <div class="contrib-type">
544
- <strong>New Language:</strong> Add to <code>cli-tool/templates/</code>
545
- <br><small>Example: <code>cli-tool/templates/kotlin/</code></small>
546
- </div>
547
- <div class="contrib-type">
548
- <strong>New Framework:</strong> Add to <code>cli-tool/templates/{language}/examples/</code>
549
- <br><small>Example: <code>cli-tool/templates/python/examples/fastapi-app/</code></small>
550
- </div>
551
- </div>
552
- </div>
553
- </div>
554
-
555
- <div class="contribute-step">
556
- <div class="step-number-contrib">3</div>
557
- <div class="step-content-contrib">
558
- <h4>Use Claude Code to Generate the Template</h4>
559
- <p>Copy this prompt and use it with Claude Code to automatically generate the template structure:</p>
560
- <div class="claude-prompt">
561
- <h5>📋 Claude Code Prompt:</h5>
562
- <div class="prompt-text">
563
- <pre>I want to contribute a new template to the claude-code-templates repository.
564
-
565
- Please help me create:
566
- - A new [LANGUAGE/FRAMEWORK] template
567
- - All necessary configuration files (CLAUDE.md, .claude/, .mcp.json)
568
- - Update cli-tool/src/templates.js with the new configuration
569
- - Include appropriate hooks and commands for this technology
570
-
571
- The template should follow the existing patterns in the repository and include:
572
- 1. CLAUDE.md with language/framework-specific guidelines
573
- 2. .claude/commands/ with relevant development commands
574
- 3. .mcp.json with appropriate MCP configurations
575
- 4. Update templates.js with the new template definition
576
-
577
- Target: [SPECIFY: New language (e.g., "Kotlin") OR new framework (e.g., "FastAPI for Python")]
578
-
579
- Please analyze the existing templates in the repository first to understand the structure and patterns, then create the new template following the same conventions.</pre>
580
- </div>
581
- <button class="copy-btn copy-prompt-btn" onclick="copyToClipboard(document.querySelector('.prompt-text pre').textContent)">Copy Prompt</button>
582
- </div>
583
- </div>
584
- </div>
585
-
586
- <div class="contribute-step">
587
- <div class="step-number-contrib">4</div>
588
- <div class="step-content-contrib">
589
- <h4>Test Your Template</h4>
590
- <p>Before submitting, test your template locally:</p>
591
- <div class="step-command">
592
- <code>cd cli-tool && npm test</code>
593
- <button class="copy-btn" onclick="copyToClipboard('cd cli-tool && npm test')">Copy</button>
594
- </div>
595
- <div class="step-command">
596
- <code>node src/index.js --language=YOUR_LANGUAGE</code>
597
- <button class="copy-btn" onclick="copyToClipboard('node src/index.js --language=YOUR_LANGUAGE')">Copy</button>
598
- </div>
599
- </div>
600
- </div>
601
-
602
- <div class="contribute-step">
603
- <div class="step-number-contrib">5</div>
604
- <div class="step-content-contrib">
605
- <h4>Submit Pull Request</h4>
606
- <p>Create a pull request with your changes:</p>
607
- <div class="step-command">
608
- <code>git add . && git commit -m "feat: Add [LANGUAGE/FRAMEWORK] template"</code>
609
- <button class="copy-btn" onclick="copyToClipboard('git add . && git commit -m \"feat: Add [LANGUAGE/FRAMEWORK] template\"')">Copy</button>
610
- </div>
611
- <div class="step-command">
612
- <code>git push origin main</code>
613
- <button class="copy-btn" onclick="copyToClipboard('git push origin main')">Copy</button>
614
- </div>
615
- <p>Then go to GitHub and create a Pull Request with:</p>
616
- <ul>
617
- <li>Clear title: "feat: Add [Language/Framework] template"</li>
618
- <li>Description of the template and its use cases</li>
619
- <li>Screenshots or examples if applicable</li>
620
- </ul>
621
- </div>
622
- </div>
623
- </div>
624
-
625
- <div class="contribute-footer">
626
- <div class="help-section">
627
- <h4>Need Help?</h4>
628
- <p>Check out <a href="https://github.com/davila7/claude-code-templates/blob/main/CONTRIBUTING.md" target="_blank">CONTRIBUTING.md</a> or open an issue on GitHub.</p>
629
- </div>
630
- </div>
631
- </div>
632
- </div>
633
- </div>
634
- `;
635
-
636
- // Remove existing modal if present
637
- const existingModal = document.querySelector('.modal-overlay');
638
- if (existingModal) {
639
- existingModal.remove();
640
- }
641
-
642
- // Add modal to body
643
- document.body.insertAdjacentHTML('beforeend', modalHTML);
644
-
645
- // Add event listener for ESC key
646
- const handleEscape = (e) => {
647
- if (e.key === 'Escape') {
648
- closeComponentModal();
649
- document.removeEventListener('keydown', handleEscape);
650
- }
651
- };
652
- document.addEventListener('keydown', handleEscape);
653
- }
654
-
655
- // ===== ANALYTICS AND STATISTICS FUNCTIONALITY =====
656
-
657
- /**
658
- * Load and display download statistics from GitHub-generated analytics
659
- */
660
- async function loadDownloadStatistics() {
661
- try {
662
- // Fetch analytics data generated by GitHub Actions
663
- const response = await fetch('analytics/download-stats.json?t=' + Date.now());
664
-
665
- if (!response.ok) {
666
- console.log('Analytics data not available yet');
667
- hideStatisticsSection();
668
- return;
669
- }
670
-
671
- const analyticsData = await response.json();
672
- displayDownloadStatistics(analyticsData);
673
-
674
- } catch (error) {
675
- console.log('Analytics data not available:', error.message);
676
- hideStatisticsSection();
677
- }
678
- }
679
-
680
- /**
681
- * Display download statistics in the UI
682
- */
683
- function displayDownloadStatistics(data) {
684
- // Update total downloads
685
- const totalElement = document.getElementById('totalDownloads');
686
- if (totalElement) {
687
- totalElement.textContent = formatNumber(data.total_downloads || 0);
688
- }
689
-
690
- // Update individual component type counts
691
- const typeElements = {
692
- agentDownloads: data.downloads_by_type?.agent || 0,
693
- commandDownloads: data.downloads_by_type?.command || 0,
694
- mcpDownloads: data.downloads_by_type?.mcp || 0,
695
- templateDownloads: data.downloads_by_type?.template || 0
696
- };
697
-
698
- Object.entries(typeElements).forEach(([elementId, count]) => {
699
- const element = document.getElementById(elementId);
700
- if (element) {
701
- element.textContent = formatNumber(count);
702
- }
703
- });
704
-
705
- // Find and display most popular component
706
- const popularElement = document.getElementById('popularComponent');
707
- if (popularElement && data.downloads_by_component) {
708
- const topComponent = Object.entries(data.downloads_by_component)[0];
709
- if (topComponent) {
710
- const [componentName, downloadCount] = topComponent;
711
- popularElement.textContent = formatComponentNameForDisplay(componentName);
712
- popularElement.setAttribute('title', `${formatNumber(downloadCount)} downloads`);
713
- } else {
714
- popularElement.textContent = '-';
715
- }
716
- }
717
-
718
- // Update last updated timestamp
719
- const lastUpdatedElement = document.getElementById('statsLastUpdated');
720
- if (lastUpdatedElement && data.last_updated) {
721
- const lastUpdated = new Date(data.last_updated);
722
- lastUpdatedElement.textContent = formatRelativeTime(lastUpdated);
723
- }
724
-
725
- // Show the statistics section
726
- showStatisticsSection();
727
-
728
- console.log('📊 Download statistics loaded successfully');
729
- }
730
-
731
- /**
732
- * Hide statistics section when data is not available
733
- */
734
- function hideStatisticsSection() {
735
- // Keep statistics section visible even when data is not available
736
- // const statsSection = document.getElementById('downloadStatsSection');
737
- // if (statsSection) {
738
- // statsSection.style.display = 'none';
739
- // }
740
- }
741
-
742
- /**
743
- * Show statistics section when data is available
744
- * Note: Stats section has been moved to dedicated page at /download-stats.html
745
- */
746
- function showStatisticsSection() {
747
- // Stats section removed from main page - no action needed
748
- console.log('Stats available at /download-stats.html');
749
- }
750
-
751
- /**
752
- * Format numbers with thousands separators
753
- */
754
- function formatNumber(num) {
755
- if (num === 0) return '0';
756
- if (num < 1000) return num.toString();
757
- if (num < 1000000) return (num / 1000).toFixed(1) + 'K';
758
- return (num / 1000000).toFixed(1) + 'M';
759
- }
760
-
761
- /**
762
- * Format component name for display (remove prefixes, capitalize)
763
- */
764
- function formatComponentNameForDisplay(componentName) {
765
- if (!componentName || componentName === 'unknown') return '-';
766
-
767
- // Handle template format (language/framework)
768
- if (componentName.includes('/')) {
769
- const parts = componentName.split('/');
770
- return parts.map(part =>
771
- part.replace(/-/g, ' ')
772
- .replace(/\b\w/g, l => l.toUpperCase())
773
- ).join('/');
774
- }
775
-
776
- // Handle individual components
777
- return componentName
778
- .replace(/-/g, ' ')
779
- .replace(/\b\w/g, l => l.toUpperCase());
780
- }
781
-
782
- /**
783
- * Format relative time (e.g., "2 hours ago")
784
- */
785
- function formatRelativeTime(date) {
786
- const now = new Date();
787
- const diffMs = now - date;
788
- const diffMins = Math.floor(diffMs / (1000 * 60));
789
- const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
790
- const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
791
-
792
- if (diffMins < 60) {
793
- return diffMins <= 1 ? 'just now' : `${diffMins} minutes ago`;
794
- } else if (diffHours < 24) {
795
- return diffHours === 1 ? '1 hour ago' : `${diffHours} hours ago`;
796
- } else if (diffDays < 7) {
797
- return diffDays === 1 ? '1 day ago' : `${diffDays} days ago`;
798
- } else {
799
- return date.toLocaleDateString('en-US', {
800
- month: 'short',
801
- day: 'numeric',
802
- year: date.getFullYear() !== now.getFullYear() ? 'numeric' : undefined
803
- });
804
- }
805
- }
806
-
807
- /**
808
- * Refresh statistics data
809
- */
810
- async function refreshStatistics() {
811
- const refreshButton = document.querySelector('.stats-refresh-btn');
812
- if (refreshButton) {
813
- refreshButton.textContent = 'Refreshing...';
814
- refreshButton.disabled = true;
815
- }
816
-
817
- await loadDownloadStatistics();
818
-
819
- if (refreshButton) {
820
- refreshButton.textContent = 'Refresh';
821
- refreshButton.disabled = false;
822
- }
823
- }
824
-
825
- // Auto-refresh statistics every 10 minutes
826
- setInterval(loadDownloadStatistics, 10 * 60 * 1000);
827
-
828
- // Get file type based on extension/name
829
- function getFileType(filename) {
830
- if (filename.endsWith('.md')) return 'Documentation';
831
- if (filename.endsWith('.json')) return 'Configuration';
832
- if (filename.includes('.claude')) return 'Commands';
833
- if (filename.includes('commands')) return 'Commands';
834
- return 'Configuration';
835
- }
836
-
837
- // Generate GitHub folder URL for templates
838
- function getGithubFolderUrl(languageKey, frameworkKey) {
839
- const baseUrl = 'https://github.com/davila7/claude-code-templates/tree/main/cli-tool/templates';
840
-
841
- if (frameworkKey === 'none' || !frameworkKey) {
842
- // Base language template
843
- return `${baseUrl}/${languageKey}`;
844
- } else {
845
- // Framework-specific template
846
- return `${baseUrl}/${languageKey}/examples/${frameworkKey}-app`;
847
- }
848
- }
849
-
850
- // Generate GitHub file URL for individual files
851
- function getGithubFileUrl(languageKey, frameworkKey, filePath) {
852
- const baseUrl = 'https://github.com/davila7/claude-code-templates/blob/main/cli-tool/templates';
853
- return `${baseUrl}/${filePath}`;
854
- }
855
-
856
- // Copy to clipboard function
857
- function copyToClipboard(text) {
858
- navigator.clipboard.writeText(text).then(() => {
859
- showCopyFeedback();
860
- }).catch(err => {
861
- console.error('Failed to copy: ', err);
862
- // Fallback for older browsers
863
- const textArea = document.createElement('textarea');
864
- textArea.value = text;
865
- document.body.appendChild(textArea);
866
- textArea.focus();
867
- textArea.select();
868
- try {
869
- document.execCommand('copy');
870
- showCopyFeedback();
871
- } catch (err) {
872
- console.error('Fallback copy failed: ', err);
873
- }
874
- document.body.removeChild(textArea);
875
- });
876
- }
877
-
878
- function showCopyFeedback() {
879
- // Create temporary feedback element
880
- const feedback = document.createElement('div');
881
- feedback.textContent = 'Copied to clipboard!';
882
- feedback.style.cssText = `
883
- position: fixed;
884
- top: 20px;
885
- right: 20px;
886
- background: #48bb78;
887
- color: white;
888
- padding: 1rem 1.5rem;
889
- border-radius: 8px;
890
- font-weight: 500;
891
- z-index: 1000;
892
- animation: slideInRight 0.3s ease;
893
- `;
894
-
895
- document.body.appendChild(feedback);
896
-
897
- // Remove feedback after 2 seconds
898
- setTimeout(() => {
899
- feedback.style.animation = 'slideOutRight 0.3s ease';
900
- setTimeout(() => {
901
- document.body.removeChild(feedback);
902
- }, 300);
903
- }, 2000);
904
- }
905
-
906
- // Add CSS animations for feedback and error states
907
- const style = document.createElement('style');
908
- style.textContent = `
909
- @keyframes slideInRight {
910
- from {
911
- transform: translateX(100%);
912
- opacity: 0;
913
- }
914
- to {
915
- transform: translateX(0);
916
- opacity: 1;
917
- }
918
- }
919
-
920
- @keyframes slideOutRight {
921
- from {
922
- transform: translateX(0);
923
- opacity: 1;
924
- }
925
- to {
926
- transform: translateX(100%);
927
- opacity: 0;
928
- }
929
- }
930
-
931
- .error-message {
932
- grid-column: 1 / -1;
933
- text-align: center;
934
- color: white;
935
- background: rgba(220, 53, 69, 0.2);
936
- border: 1px solid rgba(220, 53, 69, 0.3);
937
- border-radius: 12px;
938
- padding: 2rem;
939
- }
940
-
941
- .error-message h3 {
942
- margin-bottom: 1rem;
943
- font-size: 1.2rem;
944
- }
945
-
946
- .retry-btn {
947
- background: #dc3545;
948
- color: white;
949
- border: none;
950
- padding: 0.75rem 1.5rem;
951
- border-radius: 8px;
952
- cursor: pointer;
953
- margin-top: 1rem;
954
- font-size: 0.9rem;
955
- transition: background 0.2s ease;
956
- }
957
-
958
- .retry-btn:hover {
959
- background: #c82333;
960
- }
961
- `;
962
- document.head.appendChild(style);
963
-
964
- // Initialize the page
965
- document.addEventListener('DOMContentLoaded', () => {
966
- // Start with agents view (new default)
967
- setUnifiedFilter('agents');
968
- // Load download statistics
969
- loadDownloadStatistics();
970
- });
971
-
972
- // Add keyboard navigation
973
- document.addEventListener('keydown', (e) => {
974
- if (e.key === 'Escape') {
975
- // Close all flipped cards
976
- document.querySelectorAll('.template-card.flipped').forEach(card => {
977
- card.classList.remove('flipped');
978
- });
979
- }
980
- });
981
-
982
- // Auto-refresh templates every 5 minutes to pick up changes
983
- setInterval(fetchTemplatesConfig, 5 * 60 * 1000);
984
-
985
- // ===== UNIFIED COMPONENTS FUNCTIONALITY =====
986
-
987
- let componentsData = {
988
- agents: [],
989
- commands: [],
990
- mcps: []
991
- };
992
-
993
- let currentFilter = 'agents';
994
- let currentCategoryFilter = 'all';
995
- let allDataLoaded = false;
996
- let downloadStats = null;
997
- let availableCategories = {
998
- agents: new Set(),
999
- commands: new Set(),
1000
- mcps: new Set()
1001
- };
1002
-
1003
- // Unified filter functionality
1004
- function setUnifiedFilter(filter) {
1005
- currentFilter = filter;
1006
- currentCategoryFilter = 'all'; // Reset category filter when changing main filter
1007
-
1008
- // Update filter buttons
1009
- document.querySelectorAll('.filter-btn').forEach(btn => {
1010
- btn.classList.remove('active');
1011
- });
1012
- const targetFilterBtn = document.querySelector(`[data-filter="${filter}"]`);
1013
- if (targetFilterBtn) {
1014
- targetFilterBtn.classList.add('active');
1015
- }
1016
-
1017
- // Load and display content
1018
- if (filter === 'templates') {
1019
- displayTemplates();
1020
- } else {
1021
- loadAndDisplayComponents();
1022
- }
1023
- }
1024
-
1025
- // Set category filter
1026
- function setCategoryFilter(category) {
1027
- currentCategoryFilter = category;
1028
-
1029
- // Update category filter buttons
1030
- document.querySelectorAll('.category-filter-btn').forEach(btn => {
1031
- btn.classList.remove('active');
1032
- });
1033
- const targetBtn = document.querySelector(`[data-category="${category}"]`);
1034
- if (targetBtn) {
1035
- targetBtn.classList.add('active');
1036
- }
1037
-
1038
- // Regenerate the component display
1039
- generateUnifiedComponentCards();
1040
- }
1041
-
1042
- // Make setCategoryFilter available globally
1043
- window.setCategoryFilter = setCategoryFilter;
1044
-
1045
- // Display templates (existing functionality)
1046
- function displayTemplates() {
1047
- const unifiedGrid = document.getElementById('unifiedGrid');
1048
- unifiedGrid.className = 'unified-grid templates-mode';
1049
-
1050
- if (templatesData) {
1051
- generateTemplateCards();
1052
- } else {
1053
- unifiedGrid.innerHTML = '<div class="loading">Loading templates from GitHub...</div>';
1054
- fetchTemplatesConfig();
1055
- }
1056
- }
1057
-
1058
- // Load and display components
1059
- async function loadAndDisplayComponents() {
1060
- const unifiedGrid = document.getElementById('unifiedGrid');
1061
- unifiedGrid.className = 'unified-grid components-mode';
1062
-
1063
- if (!allDataLoaded) {
1064
- unifiedGrid.innerHTML = '<div class="loading">Loading components from GitHub...</div>';
1065
- await loadAllComponentsData();
1066
- }
1067
-
1068
- generateUnifiedComponentCards();
1069
- }
1070
-
1071
- // Load all components data
1072
- async function loadAllComponentsData() {
1073
- try {
1074
- const response = await fetch('components.json');
1075
- if (!response.ok) {
1076
- throw new Error(`HTTP error! status: ${response.status}`);
1077
- }
1078
- const data = await response.json();
1079
- componentsData = data;
1080
- collectAvailableCategories();
1081
- allDataLoaded = true;
1082
- } catch (error) {
1083
- console.error('Error loading components:', error);
1084
- const unifiedGrid = document.getElementById('unifiedGrid');
1085
- unifiedGrid.innerHTML = `
1086
- <div class="error-message">
1087
- <h3>Error loading components</h3>
1088
- <p>Could not fetch components from local data. Please try again later.</p>
1089
- <button onclick="loadAndDisplayComponents()" class="retry-btn">Retry</button>
1090
- </div>
1091
- `;
1092
- }
1093
- }
1094
-
1095
- // Update category sub-filters in the unified-filter-bar
1096
- function updateCategorySubFilters() {
1097
- const unifiedFilterBar = document.querySelector('.unified-filter-bar');
1098
-
1099
- // Remove existing category filters
1100
- const existingCategoryFilters = unifiedFilterBar.querySelector('.category-filter-row');
1101
- if (existingCategoryFilters) {
1102
- existingCategoryFilters.remove();
1103
- }
1104
-
1105
- // Get categories for current filter type
1106
- const currentCategories = Array.from(availableCategories[currentFilter] || []).sort();
1107
-
1108
- if (currentCategories.length <= 1 || currentFilter === 'templates') {
1109
- // Don't show sub-filters if there's only one category, none, or templates
1110
- return;
1111
- }
1112
-
1113
- // Create category filter row
1114
- const categoryFilterRow = document.createElement('div');
1115
- categoryFilterRow.className = 'category-filter-row';
1116
- categoryFilterRow.innerHTML = `
1117
- <div class="category-filter-label">Categories:</div>
1118
- <div class="category-filter-buttons">
1119
- <button class="category-filter-btn ${currentCategoryFilter === 'all' ? 'active' : ''}"
1120
- data-category="all">
1121
- All
1122
- </button>
1123
- ${currentCategories.map(category => `
1124
- <button class="category-filter-btn ${currentCategoryFilter === category ? 'active' : ''}"
1125
- data-category="${category}">
1126
- ${formatComponentName(category)}
1127
- </button>
1128
- `).join('')}
1129
- </div>
1130
- `;
1131
-
1132
- // Add click event listeners
1133
- categoryFilterRow.querySelectorAll('.category-filter-btn').forEach(btn => {
1134
- btn.addEventListener('click', () => {
1135
- setCategoryFilter(btn.getAttribute('data-category'));
1136
- });
1137
- });
1138
-
1139
- // Append to unified filter bar
1140
- unifiedFilterBar.appendChild(categoryFilterRow);
1141
- }
1142
-
1143
- // Generate unified component cards
1144
- function generateUnifiedComponentCards() {
1145
- const unifiedGrid = document.getElementById('unifiedGrid');
1146
- unifiedGrid.innerHTML = '';
1147
-
1148
- // Update category sub-filters in the unified-filter-bar
1149
- updateCategorySubFilters();
1150
-
1151
- // Get filtered components
1152
- const filteredComponents = getFilteredComponents();
1153
-
1154
- // Add "Add New" card based on current filter
1155
- if (currentFilter !== 'templates') {
1156
- const addCard = createAddComponentCard(currentFilter);
1157
- unifiedGrid.appendChild(addCard);
1158
- }
1159
-
1160
- // Add component cards
1161
- filteredComponents.forEach(component => {
1162
- const card = createComponentCard(component);
1163
- unifiedGrid.appendChild(card);
1164
- });
1165
-
1166
- // Update filter button with count
1167
- updateFilterCount();
1168
- }
1169
-
1170
- // Update filter button count
1171
- function updateFilterCount() {
1172
- const filterBtn = document.querySelector(`[data-filter="${currentFilter}"]`);
1173
- if (filterBtn && currentFilter !== 'templates') {
1174
- const components = componentsData[currentFilter];
1175
- if (components && Array.isArray(components)) {
1176
- const count = components.length;
1177
- const originalText = filterBtn.textContent.split('(')[0].trim();
1178
- filterBtn.textContent = `${originalText} (${count})`;
1179
- }
1180
- }
1181
- }
1182
-
1183
- // Get filtered components based on current filter and category filter
1184
- function getFilteredComponents() {
1185
- if (currentFilter === 'templates') {
1186
- return [];
1187
- }
1188
-
1189
- let components = componentsData[currentFilter] || [];
1190
-
1191
- // Apply category filter if not 'all'
1192
- if (currentCategoryFilter !== 'all') {
1193
- components = components.filter(component => {
1194
- const category = component.category || 'general';
1195
- return category === currentCategoryFilter;
1196
- });
1197
- }
1198
-
1199
- return components;
1200
- }
1201
-
1202
- // Collect available categories from loaded components
1203
- function collectAvailableCategories() {
1204
- // Reset categories
1205
- availableCategories.agents.clear();
1206
- availableCategories.commands.clear();
1207
- availableCategories.mcps.clear();
1208
-
1209
- // Collect categories from each component type
1210
- if (componentsData.agents && Array.isArray(componentsData.agents)) {
1211
- componentsData.agents.forEach(component => {
1212
- const category = component.category || 'general';
1213
- availableCategories.agents.add(category);
1214
- });
1215
- }
1216
-
1217
- if (componentsData.commands && Array.isArray(componentsData.commands)) {
1218
- componentsData.commands.forEach(component => {
1219
- const category = component.category || 'general';
1220
- availableCategories.commands.add(category);
1221
- });
1222
- }
1223
-
1224
- if (componentsData.mcps && Array.isArray(componentsData.mcps)) {
1225
- componentsData.mcps.forEach(component => {
1226
- const category = component.category || 'general';
1227
- availableCategories.mcps.add(category);
1228
- });
1229
- }
1230
- }
1231
-
1232
- // Load components data from GitHub (legacy function for compatibility)
1233
- async function loadComponentsData() {
1234
- // Redirect to unified loading function
1235
- await loadAndDisplayComponents();
1236
- }
1237
-
1238
- // Load specific component type from GitHub
1239
- async function loadComponentType(type) {
1240
- const baseUrl = `https://api.github.com/repos/${GITHUB_CONFIG.owner}/${GITHUB_CONFIG.repo}/contents/cli-tool/components/${type}`;
1241
-
1242
- try {
1243
- const response = await fetch(baseUrl);
1244
- if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
1245
-
1246
- const files = await response.json();
1247
- const componentPromises = files.map(async (file) => {
1248
- if (file.name.endsWith('.md') || file.name.endsWith('.json')) {
1249
- // Direct file in root level
1250
- const contentResponse = await fetch(file.download_url);
1251
- const content = await contentResponse.text();
1252
-
1253
- return {
1254
- name: file.name.replace(/\.(md|json)$/, ''),
1255
- type: type,
1256
- filename: file.name,
1257
- content: content,
1258
- url: file.html_url,
1259
- category: null // No category for root level components
1260
- };
1261
- } else if (file.type === 'dir') {
1262
- // Handle subdirectories for all component types (categories)
1263
- try {
1264
- const categoryResponse = await fetch(`https://api.github.com/repos/${GITHUB_CONFIG.owner}/${GITHUB_CONFIG.repo}/contents/cli-tool/components/${type}/${file.name}`);
1265
- if (categoryResponse.ok) {
1266
- const categoryFiles = await categoryResponse.json();
1267
- const categoryComponentPromises = categoryFiles.map(async (categoryFile) => {
1268
- if (categoryFile.name.endsWith('.md') || categoryFile.name.endsWith('.json')) {
1269
- const contentResponse = await fetch(categoryFile.download_url);
1270
- const content = await contentResponse.text();
1271
-
1272
- return {
1273
- name: `${file.name}/${categoryFile.name.replace(/\.(md|json)$/, '')}`,
1274
- type: type,
1275
- filename: categoryFile.name,
1276
- content: content,
1277
- url: categoryFile.html_url,
1278
- category: file.name
1279
- };
1280
- }
1281
- return null;
1282
- });
1283
-
1284
- const categoryComponents = await Promise.all(categoryComponentPromises);
1285
- return categoryComponents.filter(c => c !== null);
1286
- }
1287
- } catch (error) {
1288
- console.warn(`Warning: Could not load category ${file.name}:`, error);
1289
- return [];
1290
- }
1291
- }
1292
- return null;
1293
- });
1294
-
1295
- const componentsNested = await Promise.all(componentPromises);
1296
- // Flatten the array since subdirectories return arrays
1297
- const components = componentsNested.flat().filter(c => c !== null);
1298
- return components;
1299
-
1300
- } catch (error) {
1301
- console.error(`Error loading ${type}:`, error);
1302
- return [];
1303
- }
1304
- }
1305
-
1306
- // Generate component cards with filter functionality
1307
- function generateComponentCards() {
1308
- const componentsGrid = document.getElementById('componentsGrid');
1309
-
1310
- // Create filter bar
1311
- const filterBar = createComponentFilterBar();
1312
-
1313
- // Create components container
1314
- const componentsContainer = document.createElement('div');
1315
- componentsContainer.className = 'components-container';
1316
-
1317
- // Create Add New cards for each category
1318
- const addAgentCard = createAddComponentCard('agents');
1319
- const addCommandCard = createAddComponentCard('commands');
1320
- const addMcpCard = createAddComponentCard('mcps');
1321
-
1322
- // Filter and display components
1323
- const filteredComponents = getFilteredComponents();
1324
-
1325
- componentsContainer.innerHTML = '';
1326
-
1327
- // Add "Add New" cards based on filter
1328
- if (currentFilter === 'all' || currentFilter === 'agents') {
1329
- componentsContainer.appendChild(addAgentCard);
1330
- }
1331
- if (currentFilter === 'all' || currentFilter === 'commands') {
1332
- componentsContainer.appendChild(addCommandCard);
1333
- }
1334
- if (currentFilter === 'all' || currentFilter === 'mcps') {
1335
- componentsContainer.appendChild(addMcpCard);
1336
- }
1337
-
1338
- // Add component cards
1339
- filteredComponents.forEach(component => {
1340
- const card = createComponentCard(component);
1341
- componentsContainer.appendChild(card);
1342
- });
1343
-
1344
- componentsGrid.innerHTML = '';
1345
- componentsGrid.appendChild(filterBar);
1346
- componentsGrid.appendChild(componentsContainer);
1347
- }
1348
-
1349
- // Create filter bar for components
1350
- function createComponentFilterBar() {
1351
- const filterBar = document.createElement('div');
1352
- filterBar.className = 'component-filter-bar';
1353
-
1354
- const totalCounts = {
1355
- all: componentsData.agents.length + componentsData.commands.length + componentsData.mcps.length,
1356
- agents: componentsData.agents.length,
1357
- commands: componentsData.commands.length,
1358
- mcps: componentsData.mcps.length
1359
- };
1360
-
1361
- filterBar.innerHTML = `
1362
- <div class="filter-label">$ Filter Components</div>
1363
- <div class="filter-buttons">
1364
- <button class="filter-btn ${currentFilter === 'all' ? 'active' : ''}" onclick="setComponentFilter('all')">
1365
- All (${totalCounts.all})
1366
- </button>
1367
- <button class="filter-btn ${currentFilter === 'agents' ? 'active' : ''}" onclick="setComponentFilter('agents')">
1368
- 🤖 Agents (${totalCounts.agents})
1369
- </button>
1370
- <button class="filter-btn ${currentFilter === 'commands' ? 'active' : ''}" onclick="setComponentFilter('commands')">
1371
- ⚡ Commands (${totalCounts.commands})
1372
- </button>
1373
- <button class="filter-btn ${currentFilter === 'mcps' ? 'active' : ''}" onclick="setComponentFilter('mcps')">
1374
- 🔌 MCPs (${totalCounts.mcps})
1375
- </button>
1376
- </div>
1377
- `;
1378
-
1379
- return filterBar;
1380
- }
1381
-
1382
- // Set component filter
1383
- function setComponentFilter(filter) {
1384
- currentFilter = filter;
1385
- generateComponentCards();
1386
- }
1387
-
1388
-
1389
- // Create Add Component card
1390
- function createAddComponentCard(type) {
1391
- const card = document.createElement('div');
1392
- card.className = 'template-card add-template-card add-component-card';
1393
-
1394
- const typeConfig = {
1395
- agents: {
1396
- icon: `<svg width="32" height="32" viewBox="0 0 24 24" fill="currentColor">
1397
- <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"/>
1398
- </svg>`,
1399
- name: 'Agent',
1400
- description: 'Create a new AI specialist agent'
1401
- },
1402
- commands: {
1403
- icon: `<svg width="32" height="32" viewBox="0 0 24 24" fill="currentColor">
1404
- <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"/>
1405
- </svg>`,
1406
- name: 'Command',
1407
- description: 'Add a custom slash command'
1408
- },
1409
- mcps: {
1410
- icon: `<svg width="32" height="32" viewBox="0 0 24 24" fill="currentColor">
1411
- <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"/>
1412
- </svg>`,
1413
- name: 'MCP',
1414
- description: 'Build a Model Context Protocol integration'
1415
- }
1416
- };
1417
-
1418
- const config = typeConfig[type];
1419
-
1420
- card.innerHTML = `
1421
- <div class="card-inner">
1422
- <div class="card-front">
1423
- <div class="framework-logo">
1424
- ${config.icon}
1425
- </div>
1426
- <h3 class="template-title">Add New ${config.name}</h3>
1427
- <p class="template-description">${config.description}</p>
1428
- </div>
1429
- </div>
1430
- `;
1431
-
1432
- // Add click handler to open contribution modal directly (no flip)
1433
- card.addEventListener('click', () => {
1434
- showComponentContributeModal(type);
1435
- });
1436
-
1437
- return card;
1438
- }
1439
-
1440
- // Create individual component card
1441
- function createComponentCard(component) {
1442
- const card = document.createElement('div');
1443
- card.className = 'template-card';
1444
-
1445
- const typeConfig = {
1446
- agent: { icon: '🤖', color: '#ff6b6b' },
1447
- command: { icon: '⚡', color: '#4ecdc4' },
1448
- mcp: { icon: '🔌', color: '#45b7d1' }
1449
- };
1450
-
1451
- const config = typeConfig[component.type];
1452
- const installCommand = generateInstallCommand(component);
1453
-
1454
- // Get download count for this component
1455
- const downloadCount = getDownloadCount(component.name, component.type);
1456
- const downloadBadge = createDownloadBadge(downloadCount);
1457
-
1458
- // Create category label for all components (use "General" if no category)
1459
- const categoryName = component.category || 'general';
1460
- const categoryLabel = `<div class="category-label">${formatComponentName(categoryName)}</div>`;
1461
-
1462
- card.innerHTML = `
1463
- <div class="card-inner">
1464
- <div class="card-front">
1465
- ${downloadBadge}
1466
- ${categoryLabel}
1467
- <div class="framework-logo" style="color: ${config.color}">
1468
- <span class="component-icon">${config.icon}</span>
1469
- </div>
1470
- <h3 class="template-title">${formatComponentName(component.name)}</h3>
1471
- <p class="template-description">${getComponentDescription(component)}</p>
1472
- </div>
1473
- <div class="card-back">
1474
- <div class="command-display">
1475
- <h3>Installation Command</h3>
1476
- <div class="command-code">${installCommand}</div>
1477
- <div class="action-buttons">
1478
- <button class="view-files-btn" onclick="showComponentDetails('${component.type}', '${component.name}')">
1479
- 📁 View Details
1480
- </button>
1481
- <button class="copy-command-btn" onclick="copyToClipboard('${installCommand}')">
1482
- 📋 Copy Command
1483
- </button>
1484
- </div>
1485
- </div>
1486
- </div>
1487
- </div>
1488
- `;
1489
-
1490
- // Add click handler for card flip
1491
- card.addEventListener('click', (e) => {
1492
- if (!e.target.closest('button')) {
1493
- card.classList.toggle('flipped');
1494
- }
1495
- });
1496
-
1497
- return card;
1498
- }
1499
-
1500
- // Generate install command for component
1501
- function generateInstallCommand(component) {
1502
- if (component.type === 'agent') {
1503
- return `npx claude-code-templates@latest --agent=${component.name} --yes`;
1504
- } else if (component.type === 'command') {
1505
- return `npx claude-code-templates@latest --command=${component.name} --yes`;
1506
- } else if (component.type === 'mcp') {
1507
- // Remove .json extension from MCP names for the command
1508
- const mcpName = component.name.replace(/\.json$/, '');
1509
- return `npx claude-code-templates@latest --mcp=${mcpName} --yes`;
1510
- }
1511
- return `npx claude-code-templates@latest`;
1512
- }
1513
-
1514
-
1515
- // Get installation notes (removed to match template cards design)
1516
- function getInstallationNotes() {
1517
- return '';
1518
- }
1519
-
1520
- // Format component name for display
1521
- function formatComponentName(name) {
1522
- // Handle subcategorized agents (e.g., "deep-research-team/academic-researcher")
1523
- if (name.includes('/')) {
1524
- const parts = name.split('/');
1525
- const actualName = parts[parts.length - 1]; // Get the last part after the slash
1526
- return actualName
1527
- .replace(/-/g, ' ')
1528
- .replace(/\b\w/g, l => l.toUpperCase());
1529
- }
1530
-
1531
- return name
1532
- .replace(/-/g, ' ')
1533
- .replace(/\b\w/g, l => l.toUpperCase());
1534
- }
1535
-
1536
- // Get component description
1537
- function getComponentDescription(component) {
1538
- return `A component of type '${component.type}' for Claude Code.`;
1539
- }
1540
-
1541
- // Show component details modal
1542
- async function showComponentDetails(type, name) {
1543
- const component = componentsData[type + 's'].find(c => c.name === name);
1544
- if (!component) return;
1545
-
1546
- const modal = document.getElementById('componentModal');
1547
- document.getElementById('componentModalTitle').textContent = name;
1548
- document.getElementById('componentModalType').textContent = type;
1549
- document.getElementById('componentModalCategory').textContent = component.category;
1550
- document.getElementById('componentModalPath').textContent = component.path;
1551
- document.getElementById('componentModalUsage').textContent = `cct --${type} "${component.path}"`;
1552
-
1553
- const descriptionElement = document.getElementById('componentModalDescription');
1554
- descriptionElement.textContent = component.content || 'No content available.';
1555
- modal.style.display = 'block';
1556
- }
1557
-
1558
- // Show component contribute modal
1559
- function showComponentContributeModal(type) {
1560
- const typeConfig = {
1561
- agents: {
1562
- name: 'Agent',
1563
- description: 'AI specialist that handles specific development tasks',
1564
- example: 'python-testing-specialist',
1565
- structure: '- Agent metadata (name, description, color)\n- Core expertise areas\n- When to use guidelines\n- Code examples and patterns'
1566
- },
1567
- commands: {
1568
- name: 'Command',
1569
- description: 'Custom slash command for Claude Code',
1570
- example: 'optimize-bundle',
1571
- structure: '- Command description and usage\n- Task breakdown\n- Process steps\n- Best practices and examples'
1572
- },
1573
- mcps: {
1574
- name: 'MCP',
1575
- description: 'Model Context Protocol integration',
1576
- example: 'redis-integration',
1577
- structure: '- MCP server configuration\n- Connection parameters\n- Environment variables\n- Usage examples'
1578
- }
1579
- };
1580
-
1581
- const config = typeConfig[type];
1582
-
1583
- const modalHTML = `
1584
- <div class="modal-overlay" onclick="closeModal()">
1585
- <div class="modal-content contribute-modal" onclick="event.stopPropagation()">
1586
- <div class="modal-header">
1587
- <h3>📝 Contribute a New ${config.name}</h3>
1588
- <button class="modal-close" onclick="closeModal()">×</button>
1589
- </div>
1590
- <div class="modal-body">
1591
- <div class="contribute-intro">
1592
- <p>Help expand Claude Code by contributing a new ${config.name.toLowerCase()}! Follow these steps:</p>
1593
- </div>
1594
-
1595
- <div class="contribute-steps">
1596
- <div class="contribute-step">
1597
- <div class="step-number-contrib">1</div>
1598
- <div class="step-content-contrib">
1599
- <h4>Create Your ${config.name}</h4>
1600
- <p>Add your ${config.name.toLowerCase()} to: <code>cli-tool/components/${type}/</code></p>
1601
- <div class="component-structure">
1602
- <strong>Structure should include:</strong>
1603
- <pre>${config.structure}</pre>
1604
- </div>
1605
- <div class="step-command">
1606
- <strong>Example filename:</strong> <code>${config.example}.${type === 'mcps' ? 'json' : 'md'}</code>
1607
- </div>
1608
- </div>
1609
- </div>
1610
-
1611
- <div class="contribute-step">
1612
- <div class="step-number-contrib">2</div>
1613
- <div class="step-content-contrib">
1614
- <h4>Follow the Pattern</h4>
1615
- <p>Check existing ${type} in the repository to understand the structure and conventions.</p>
1616
- <div class="step-command">
1617
- <a href="https://github.com/davila7/claude-code-templates/tree/main/cli-tool/components/${type}" target="_blank" class="github-folder-link">
1618
- 📁 View existing ${type}
1619
- </a>
1620
- </div>
1621
- </div>
1622
- </div>
1623
-
1624
- <div class="contribute-step">
1625
- <div class="step-number-contrib">3</div>
1626
- <div class="step-content-contrib">
1627
- <h4>Test Your Component</h4>
1628
- <p>Ensure your ${config.name.toLowerCase()} works correctly with Claude Code.</p>
1629
- <div class="step-command">
1630
- <code>cd cli-tool && npm test</code>
1631
- <button class="copy-btn" onclick="copyToClipboard('cd cli-tool && npm test')">Copy</button>
1632
- </div>
1633
- </div>
1634
- </div>
1635
-
1636
- <div class="contribute-step">
1637
- <div class="step-number-contrib">4</div>
1638
- <div class="step-content-contrib">
1639
- <h4>Submit Pull Request</h4>
1640
- <p>Submit your contribution with proper documentation:</p>
1641
- <div class="step-command">
1642
- <code>git add cli-tool/components/${type}/${config.example}.${type === 'mcps' ? 'json' : 'md'}</code>
1643
- <button class="copy-btn" onclick="copyToClipboard('git add cli-tool/components/${type}/${config.example}.${type === 'mcps' ? 'json' : 'md'}')">Copy</button>
1644
- </div>
1645
- <div class="step-command">
1646
- <code>git commit -m "feat: Add ${config.example} ${config.name.toLowerCase()}"</code>
1647
- <button class="copy-btn" onclick="copyToClipboard('git commit -m \"feat: Add ${config.example} ${config.name.toLowerCase()}\"')">Copy</button>
1648
- </div>
1649
- </div>
1650
- </div>
1651
- </div>
1652
-
1653
- <div class="contribute-footer">
1654
- <div class="help-section">
1655
- <h4>Need Help?</h4>
1656
- <p>Check existing ${type} for examples or open an issue on GitHub for guidance.</p>
1657
- </div>
1658
- </div>
1659
- </div>
1660
- </div>
1661
- </div>
1662
- `;
1663
-
1664
- // Add modal to page
1665
- const modal = document.createElement('div');
1666
- modal.innerHTML = modalHTML;
1667
- modal.className = 'modal contribute-component-modal';
1668
- document.body.appendChild(modal);
1669
-
1670
- // Add event listener for ESC key
1671
- const handleEscape = (e) => {
1672
- if (e.key === 'Escape') {
1673
- closeComponentModal();
1674
- document.removeEventListener('keydown', handleEscape);
1675
- }
1676
- };
1677
- document.addEventListener('keydown', handleEscape);
1678
- }
1679
-
1680
- // ===== ANALYTICS AND STATISTICS FUNCTIONALITY =====
1681
-
1682
- /**
1683
- * Load and display download statistics from GitHub-generated analytics
1684
- */
1685
- async function loadDownloadStatistics() {
1686
- try {
1687
- // Fetch analytics data generated by GitHub Actions
1688
- const response = await fetch('analytics/download-stats.json?t=' + Date.now());
1689
-
1690
- if (!response.ok) {
1691
- console.log('Analytics data not available yet');
1692
- hideStatisticsSection();
1693
- return;
1694
- }
1695
-
1696
- const analyticsData = await response.json();
1697
- displayDownloadStatistics(analyticsData);
1698
-
1699
- } catch (error) {
1700
- console.log('Analytics data not available:', error.message);
1701
- hideStatisticsSection();
1702
- }
1703
- }
1704
-
1705
- /**
1706
- * Display download statistics in the UI
1707
- */
1708
- function displayDownloadStatistics(data) {
1709
- // Update total downloads
1710
- const totalElement = document.getElementById('totalDownloads');
1711
- if (totalElement) {
1712
- totalElement.textContent = formatNumber(data.total_downloads || 0);
1713
- }
1714
-
1715
- // Update individual component type counts
1716
- const typeElements = {
1717
- agentDownloads: data.downloads_by_type?.agent || 0,
1718
- commandDownloads: data.downloads_by_type?.command || 0,
1719
- mcpDownloads: data.downloads_by_type?.mcp || 0,
1720
- templateDownloads: data.downloads_by_type?.template || 0
1721
- };
1722
-
1723
- Object.entries(typeElements).forEach(([elementId, count]) => {
1724
- const element = document.getElementById(elementId);
1725
- if (element) {
1726
- element.textContent = formatNumber(count);
1727
- }
1728
- });
1729
-
1730
- // Find and display most popular component
1731
- const popularElement = document.getElementById('popularComponent');
1732
- if (popularElement && data.downloads_by_component) {
1733
- const topComponent = Object.entries(data.downloads_by_component)[0];
1734
- if (topComponent) {
1735
- const [componentName, downloadCount] = topComponent;
1736
- popularElement.textContent = formatComponentNameForDisplay(componentName);
1737
- popularElement.setAttribute('title', `${formatNumber(downloadCount)} downloads`);
1738
- } else {
1739
- popularElement.textContent = '-';
1740
- }
1741
- }
1742
-
1743
- // Update last updated timestamp
1744
- const lastUpdatedElement = document.getElementById('statsLastUpdated');
1745
- if (lastUpdatedElement && data.last_updated) {
1746
- const lastUpdated = new Date(data.last_updated);
1747
- lastUpdatedElement.textContent = formatRelativeTime(lastUpdated);
1748
- }
1749
-
1750
- // Show the statistics section
1751
- showStatisticsSection();
1752
-
1753
- console.log('📊 Download statistics loaded successfully');
1754
- }
1755
-
1756
- /**
1757
- * Hide statistics section when data is not available
1758
- */
1759
- function hideStatisticsSection() {
1760
- // Keep statistics section visible even when data is not available
1761
- // const statsSection = document.getElementById('downloadStatsSection');
1762
- // if (statsSection) {
1763
- // statsSection.style.display = 'none';
1764
- // }
1765
- }
1766
-
1767
- /**
1768
- * Show statistics section when data is available
1769
- * Note: Stats section has been moved to dedicated page at /download-stats.html
1770
- */
1771
- function showStatisticsSection() {
1772
- // Stats section removed from main page - no action needed
1773
- console.log('Stats available at /download-stats.html');
1774
- }
1775
-
1776
- /**
1777
- * Format numbers with thousands separators
1778
- */
1779
- function formatNumber(num) {
1780
- if (num === 0) return '0';
1781
- if (num < 1000) return num.toString();
1782
- if (num < 1000000) return (num / 1000).toFixed(1) + 'K';
1783
- return (num / 1000000).toFixed(1) + 'M';
1784
- }
1785
-
1786
- /**
1787
- * Format component name for display (remove prefixes, capitalize)
1788
- */
1789
- function formatComponentNameForDisplay(componentName) {
1790
- if (!componentName || componentName === 'unknown') return '-';
1791
-
1792
- // Handle template format (language/framework)
1793
- if (componentName.includes('/')) {
1794
- const parts = componentName.split('/');
1795
- return parts.map(part =>
1796
- part.replace(/-/g, ' ')
1797
- .replace(/\b\w/g, l => l.toUpperCase())
1798
- ).join('/');
1799
- }
1800
-
1801
- // Handle individual components
1802
- return componentName
1803
- .replace(/-/g, ' ')
1804
- .replace(/\b\w/g, l => l.toUpperCase());
1805
- }
1806
-
1807
- /**
1808
- * Format relative time (e.g., "2 hours ago")
1809
- */
1810
- function formatRelativeTime(date) {
1811
- const now = new Date();
1812
- const diffMs = now - date;
1813
- const diffMins = Math.floor(diffMs / (1000 * 60));
1814
- const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
1815
- const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
1816
-
1817
- if (diffMins < 60) {
1818
- return diffMins <= 1 ? 'just now' : `${diffMins} minutes ago`;
1819
- } else if (diffHours < 24) {
1820
- return diffHours === 1 ? '1 hour ago' : `${diffHours} hours ago`;
1821
- } else if (diffDays < 7) {
1822
- return diffDays === 1 ? '1 day ago' : `${diffDays} days ago`;
1823
- } else {
1824
- return date.toLocaleDateString('en-US', {
1825
- month: 'short',
1826
- day: 'numeric',
1827
- year: date.getFullYear() !== now.getFullYear() ? 'numeric' : undefined
1828
- });
1829
- }
1830
- }
1831
-
1832
- /**
1833
- * Refresh statistics data
1834
- */
1835
- async function refreshStatistics() {
1836
- const refreshButton = document.querySelector('.stats-refresh-btn');
1837
- if (refreshButton) {
1838
- refreshButton.textContent = 'Refreshing...';
1839
- refreshButton.disabled = true;
1840
- }
1841
-
1842
- await loadDownloadStatistics();
1843
-
1844
- if (refreshButton) {
1845
- refreshButton.textContent = 'Refresh';
1846
- refreshButton.disabled = false;
1847
- }
1848
- }
1849
-
1850
- // Auto-refresh statistics every 10 minutes
1851
- setInterval(loadDownloadStatistics, 10 * 60 * 1000);
1852
-
1853
- // Show detailed component modal
1854
- function showComponentModal(component) {
1855
- const typeConfig = {
1856
- agent: { icon: '🤖', color: '#ff6b6b', label: 'AGENT' },
1857
- command: { icon: '⚡', color: '#4ecdc4', label: 'COMMAND' },
1858
- mcp: { icon: '🔌', color: '#45b7d1', label: 'MCP' }
1859
- };
1860
-
1861
- const config = typeConfig[component.type];
1862
- const installCommand = generateInstallCommand(component);
1863
-
1864
- const modalHTML = `
1865
- <div class="modal-overlay" onclick="closeComponentModal()">
1866
- <div class="modal-content component-modal" onclick="event.stopPropagation()">
1867
- <div class="modal-header">
1868
- <div class="component-modal-title">
1869
- <span class="component-icon" style="color: ${config.color}">${config.icon}</span>
1870
- <h3>${formatComponentName(component.name)}</h3>
1871
- <span class="component-type-badge" style="background: ${config.color}">${config.label}</span>
1872
- </div>
1873
- <button class="modal-close" onclick="closeComponentModal()">×</button>
1874
- </div>
1875
- <div class="modal-body">
1876
- <div class="component-details">
1877
- <div class="component-description">
1878
- ${getComponentDescription(component)}
1879
- </div>
1880
-
1881
- <div class="installation-section">
1882
- <h4>📦 Installation</h4>
1883
- <div class="command-line">
1884
- <code>${installCommand}</code>
1885
- <button class="copy-btn" onclick="copyToClipboard('${installCommand}')">Copy</button>
1886
- </div>
1887
- </div>
1888
-
1889
- <div class="component-content">
1890
- <h4>📋 Component Details</h4>
1891
- <div class="component-preview">
1892
- <pre><code>${component.content ? component.content.substring(0, 500) : 'No content available'}${component.content && component.content.length > 500 ? '...' : ''}</code></pre>
1893
- </div>
1894
- </div>
1895
-
1896
- <div class="modal-actions">
1897
- <a href="${component.url}" target="_blank" class="github-folder-link">
1898
- <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
1899
- <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"/>
1900
- </svg>
1901
- View on GitHub
1902
- </a>
1903
- </div>
1904
- </div>
1905
- </div>
1906
- </div>
1907
- </div>
1908
- `;
1909
-
1910
- // Remove existing modal if present
1911
- const existingModal = document.querySelector('.modal-overlay');
1912
- if (existingModal) {
1913
- existingModal.remove();
1914
- }
1915
-
1916
- // Add modal to body
1917
- document.body.insertAdjacentHTML('beforeend', modalHTML);
1918
-
1919
- // Add event listener for ESC key
1920
- const handleEscape = (e) => {
1921
- if (e.key === 'Escape') {
1922
- closeComponentModal();
1923
- document.removeEventListener('keydown', handleEscape);
1924
- }
1925
- };
1926
- document.addEventListener('keydown', handleEscape);
1927
- }
1928
-
1929
- // ===== ANALYTICS AND STATISTICS FUNCTIONALITY =====
1930
-
1931
- /**
1932
- * Load and display download statistics from GitHub-generated analytics
1933
- */
1934
- async function loadDownloadStatistics() {
1935
- try {
1936
- // Fetch analytics data generated by GitHub Actions
1937
- const response = await fetch('analytics/download-stats.json?t=' + Date.now());
1938
-
1939
- if (!response.ok) {
1940
- console.log('Analytics data not available yet');
1941
- hideStatisticsSection();
1942
- return;
1943
- }
1944
-
1945
- const analyticsData = await response.json();
1946
- displayDownloadStatistics(analyticsData);
1947
-
1948
- } catch (error) {
1949
- console.log('Analytics data not available:', error.message);
1950
- hideStatisticsSection();
1951
- }
1952
- }
1953
-
1954
- /**
1955
- * Display download statistics in the UI
1956
- */
1957
- function displayDownloadStatistics(data) {
1958
- // Update total downloads
1959
- // Store download stats globally for use in cards
1960
- downloadStats = data;
1961
- const totalElement = document.getElementById('totalDownloads');
1962
- if (totalElement) {
1963
- totalElement.textContent = formatNumber(data.total_downloads || 0);
1964
- }
1965
-
1966
- // Update individual component type counts
1967
- const typeElements = {
1968
- agentDownloads: data.downloads_by_type?.agent || 0,
1969
- commandDownloads: data.downloads_by_type?.command || 0,
1970
- mcpDownloads: data.downloads_by_type?.mcp || 0,
1971
- templateDownloads: data.downloads_by_type?.template || 0
1972
- };
1973
-
1974
- Object.entries(typeElements).forEach(([elementId, count]) => {
1975
- const element = document.getElementById(elementId);
1976
- if (element) {
1977
- element.textContent = formatNumber(count);
1978
- }
1979
- });
1980
-
1981
- // Find and display most popular component
1982
- const popularElement = document.getElementById('popularComponent');
1983
- if (popularElement && data.downloads_by_component) {
1984
- const topComponent = Object.entries(data.downloads_by_component)[0];
1985
- if (topComponent) {
1986
- const [componentName, downloadCount] = topComponent;
1987
- popularElement.textContent = formatComponentNameForDisplay(componentName);
1988
- popularElement.setAttribute('title', `${formatNumber(downloadCount)} downloads`);
1989
- } else {
1990
- popularElement.textContent = '-';
1991
- }
1992
- }
1993
-
1994
- // Update last updated timestamp
1995
- const lastUpdatedElement = document.getElementById('statsLastUpdated');
1996
- if (lastUpdatedElement && data.last_updated) {
1997
- const lastUpdated = new Date(data.last_updated);
1998
- lastUpdatedElement.textContent = formatRelativeTime(lastUpdated);
1999
- }
2000
-
2001
- // Show the statistics section
2002
- showStatisticsSection();
2003
-
2004
- // Regenerate cards with download counts
2005
- if (currentFilter === 'templates' && templatesData) {
2006
- generateTemplateCards();
2007
- } else if (allDataLoaded) {
2008
- generateUnifiedComponentCards();
2009
- }
2010
-
2011
- console.log('📊 Download statistics loaded successfully');
2012
- }
2013
-
2014
- /**
2015
- * Hide statistics section when data is not available
2016
- */
2017
- function hideStatisticsSection() {
2018
- // Keep statistics section visible even when data is not available
2019
- // const statsSection = document.getElementById('downloadStatsSection');
2020
- // if (statsSection) {
2021
- // statsSection.style.display = 'none';
2022
- // }
2023
- }
2024
-
2025
- /**
2026
- * Show statistics section when data is available
2027
- * Note: Stats section has been moved to dedicated page at /download-stats.html
2028
- */
2029
- function showStatisticsSection() {
2030
- // Stats section removed from main page - no action needed
2031
- console.log('Stats available at /download-stats.html');
2032
- }
2033
-
2034
- /**
2035
- * Format numbers with thousands separators
2036
- */
2037
- function formatNumber(num) {
2038
- if (num === 0) return '0';
2039
- if (num < 1000) return num.toString();
2040
- if (num < 1000000) return (num / 1000).toFixed(1) + 'K';
2041
- return (num / 1000000).toFixed(1) + 'M';
2042
- }
2043
-
2044
- /**
2045
- * Format component name for display (remove prefixes, capitalize)
2046
- */
2047
- function formatComponentNameForDisplay(componentName) {
2048
- if (!componentName || componentName === 'unknown') return '-';
2049
-
2050
- // Handle template format (language/framework)
2051
- if (componentName.includes('/')) {
2052
- const parts = componentName.split('/');
2053
- return parts.map(part =>
2054
- part.replace(/-/g, ' ')
2055
- .replace(/\b\w/g, l => l.toUpperCase())
2056
- ).join('/');
2057
- }
2058
-
2059
- // Handle individual components
2060
- return componentName
2061
- .replace(/-/g, ' ')
2062
- .replace(/\b\w/g, l => l.toUpperCase());
2063
- }
2064
-
2065
- /**
2066
- * Format relative time (e.g., "2 hours ago")
2067
- */
2068
- function formatRelativeTime(date) {
2069
- const now = new Date();
2070
- const diffMs = now - date;
2071
- const diffMins = Math.floor(diffMs / (1000 * 60));
2072
- const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
2073
- const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
2074
-
2075
- if (diffMins < 60) {
2076
- return diffMins <= 1 ? 'just now' : `${diffMins} minutes ago`;
2077
- } else if (diffHours < 24) {
2078
- return diffHours === 1 ? '1 hour ago' : `${diffHours} hours ago`;
2079
- } else if (diffDays < 7) {
2080
- return diffDays === 1 ? '1 day ago' : `${diffDays} days ago`;
2081
- } else {
2082
- return date.toLocaleDateString('en-US', {
2083
- month: 'short',
2084
- day: 'numeric',
2085
- year: date.getFullYear() !== now.getFullYear() ? 'numeric' : undefined
2086
- });
2087
- }
2088
- }
2089
-
2090
- /**
2091
- * Refresh statistics data
2092
- */
2093
- async function refreshStatistics() {
2094
- const refreshButton = document.querySelector('.stats-refresh-btn');
2095
- if (refreshButton) {
2096
- refreshButton.textContent = 'Refreshing...';
2097
- refreshButton.disabled = true;
2098
- }
2099
-
2100
- await loadDownloadStatistics();
2101
-
2102
- if (refreshButton) {
2103
- refreshButton.textContent = 'Refresh';
2104
- refreshButton.disabled = false;
2105
- }
2106
- }
2107
-
2108
- // Auto-refresh statistics every 10 minutes
2109
- setInterval(loadDownloadStatistics, 10 * 60 * 1000);
2110
-
2111
- document.addEventListener('DOMContentLoaded', () => {
2112
- const modal = document.getElementById('componentModal');
2113
- const closeBtn = document.getElementById('closeComponentModal');
2114
- const closeBtnFooter = document.getElementById('closeComponentModalBtn');
2115
-
2116
- if (modal && closeBtn && closeBtnFooter) {
2117
- const closeModal = () => {
2118
- modal.style.display = 'none';
2119
- };
2120
-
2121
- closeBtn.addEventListener('click', closeModal);
2122
- closeBtnFooter.addEventListener('click', closeModal);
2123
-
2124
- window.addEventListener('click', (event) => {
2125
- if (event.target === modal) {
2126
- closeComponentModal();
2127
- }
2128
- });
2129
-
2130
- document.addEventListener('keydown', (event) => {
2131
- if (event.key === 'Escape') {
2132
- closeComponentModal();
2133
- }
2134
- });
2135
- }
2136
- });
2137
-
2138
- /**
2139
- * Get download count for a specific component
2140
- */
2141
- function getDownloadCount(componentName, componentType) {
2142
- if (!downloadStats || !downloadStats.downloads_by_component) {
2143
- return 0;
2144
- }
2145
-
2146
- // For templates, the name format is "language/framework"
2147
- if (componentType === 'template') {
2148
- return downloadStats.downloads_by_component[componentName] || 0;
2149
- }
2150
-
2151
- // For individual components (agents, commands, mcps)
2152
- return downloadStats.downloads_by_component[componentName] || 0;
2153
- }
2154
-
2155
- /**
2156
- * Create download count badge HTML
2157
- */
2158
- function createDownloadBadge(count) {
2159
- if (count === 0) return '';
2160
-
2161
- return `<div class="download-badge" title="${count} downloads">
2162
- <svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">
2163
- <path d="M5 20h14v-2H5v2zM19 9h-4V3H9v6H5l7 7 7-7z"/>
2164
- </svg>
2165
- ${formatNumber(count)}
2166
- </div>`;
2167
- }