@diottodev/runic 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1444) hide show
  1. package/ai-research/.claude-plugin/plugin.json +16 -0
  2. package/ai-research/CLAUDE.md +17 -0
  3. package/ai-research/benchmark-analyzer/SKILL.md +106 -0
  4. package/ai-research/model-eval/SKILL.md +146 -0
  5. package/ai-security/.claude-plugin/plugin.json +15 -0
  6. package/ai-security/CLAUDE.md +16 -0
  7. package/ai-security/prompt-injection/SKILL.md +169 -0
  8. package/business/business-growth-skills/SKILL.md +56 -0
  9. package/business/business-operations-skills/SKILL.md +144 -0
  10. package/business/capacity-planner/SKILL.md +252 -0
  11. package/business/contract-and-proposal-writer/SKILL.md +423 -0
  12. package/business/customer-success-manager/SKILL.md +215 -0
  13. package/business/internal-comms/SKILL.md +125 -0
  14. package/business/knowledge-ops/SKILL.md +120 -0
  15. package/business/process-mapper/SKILL.md +102 -0
  16. package/business/procurement-optimizer/SKILL.md +167 -0
  17. package/business/revenue-operations/SKILL.md +273 -0
  18. package/business/sales-engineer/SKILL.md +225 -0
  19. package/business/vendor-management/SKILL.md +170 -0
  20. package/c-level/agent-protocol/SKILL.md +418 -0
  21. package/c-level/board-deck-builder/SKILL.md +183 -0
  22. package/c-level/board-meeting/SKILL.md +146 -0
  23. package/c-level/board-prep/SKILL.md +156 -0
  24. package/c-level/boardroom/SKILL.md +134 -0
  25. package/c-level/brief/SKILL.md +113 -0
  26. package/c-level/c-level-agents/SKILL.md +115 -0
  27. package/c-level/c-level-skills/SKILL.md +153 -0
  28. package/c-level/caio-review/SKILL.md +140 -0
  29. package/c-level/cco-review/SKILL.md +130 -0
  30. package/c-level/cdo-review/SKILL.md +126 -0
  31. package/c-level/ceo-advisor/SKILL.md +169 -0
  32. package/c-level/cfo-advisor/SKILL.md +140 -0
  33. package/c-level/cfo-review/SKILL.md +105 -0
  34. package/c-level/challenge/SKILL.md +181 -0
  35. package/c-level/change-management/SKILL.md +253 -0
  36. package/c-level/chief-ai-officer-advisor/SKILL.md +236 -0
  37. package/c-level/chief-customer-officer-advisor/SKILL.md +210 -0
  38. package/c-level/chief-data-officer-advisor/SKILL.md +205 -0
  39. package/c-level/chief-of-staff/SKILL.md +179 -0
  40. package/c-level/chro-advisor/SKILL.md +144 -0
  41. package/c-level/ciso-advisor/SKILL.md +135 -0
  42. package/c-level/ciso-review/SKILL.md +113 -0
  43. package/c-level/cmo-advisor/SKILL.md +169 -0
  44. package/c-level/cmo-review/SKILL.md +101 -0
  45. package/c-level/company-os/SKILL.md +236 -0
  46. package/c-level/competitive-intel/SKILL.md +203 -0
  47. package/c-level/context-engine/SKILL.md +134 -0
  48. package/c-level/coo-advisor/SKILL.md +137 -0
  49. package/c-level/cpo-advisor/SKILL.md +200 -0
  50. package/c-level/cpo-review/SKILL.md +110 -0
  51. package/c-level/cro-advisor/SKILL.md +183 -0
  52. package/c-level/cro-review/SKILL.md +110 -0
  53. package/c-level/cross-eval/SKILL.md +115 -0
  54. package/c-level/cs-onboard/SKILL.md +108 -0
  55. package/c-level/cto-advisor/SKILL.md +257 -0
  56. package/c-level/cto-review/SKILL.md +117 -0
  57. package/c-level/culture-architect/SKILL.md +167 -0
  58. package/c-level/decide/SKILL.md +104 -0
  59. package/c-level/decision-logger/SKILL.md +149 -0
  60. package/c-level/execute/SKILL.md +99 -0
  61. package/c-level/executive-mentor/SKILL.md +142 -0
  62. package/c-level/founder-coach/SKILL.md +300 -0
  63. package/c-level/founder-mode/SKILL.md +101 -0
  64. package/c-level/freeze/SKILL.md +101 -0
  65. package/c-level/gc-review/SKILL.md +132 -0
  66. package/c-level/general-counsel-advisor/SKILL.md +161 -0
  67. package/c-level/hard-call/SKILL.md +157 -0
  68. package/c-level/internal-narrative/SKILL.md +197 -0
  69. package/c-level/intl-expansion/SKILL.md +105 -0
  70. package/c-level/ma-playbook/SKILL.md +98 -0
  71. package/c-level/office-hours/SKILL.md +114 -0
  72. package/c-level/onboard/SKILL.md +124 -0
  73. package/c-level/org-health-diagnostic/SKILL.md +185 -0
  74. package/c-level/post-mortem/SKILL.md +115 -0
  75. package/c-level/postmortem/SKILL.md +193 -0
  76. package/c-level/scenario-war-room/SKILL.md +224 -0
  77. package/c-level/strategic-alignment/SKILL.md +194 -0
  78. package/c-level/stress-test/SKILL.md +204 -0
  79. package/c-level/vpe-advisor/SKILL.md +230 -0
  80. package/c-level/vpe-review/SKILL.md +129 -0
  81. package/commercial/channel-economics/SKILL.md +149 -0
  82. package/commercial/commercial-forecaster/SKILL.md +151 -0
  83. package/commercial/commercial-policy/SKILL.md +150 -0
  84. package/commercial/commercial-skills/SKILL.md +145 -0
  85. package/commercial/deal-desk/SKILL.md +138 -0
  86. package/commercial/partnerships-architect/SKILL.md +202 -0
  87. package/commercial/pricing-strategist/SKILL.md +130 -0
  88. package/commercial/rfp-responder/SKILL.md +154 -0
  89. package/compliance/ai-act-readiness/SKILL.md +149 -0
  90. package/compliance/aims-audit/SKILL.md +132 -0
  91. package/compliance/capa-officer/SKILL.md +434 -0
  92. package/compliance/compliance-os/SKILL.md +211 -0
  93. package/compliance/compliance-readiness/SKILL.md +136 -0
  94. package/compliance/eu-ai-act-specialist/SKILL.md +204 -0
  95. package/compliance/fda-consultant-specialist/SKILL.md +307 -0
  96. package/compliance/fda-qsr-audit-prep/SKILL.md +156 -0
  97. package/compliance/gdpr-audit-prep/SKILL.md +165 -0
  98. package/compliance/gdpr-dsgvo-expert/SKILL.md +266 -0
  99. package/compliance/information-security-manager-iso27001/SKILL.md +419 -0
  100. package/compliance/isms-audit-expert/SKILL.md +234 -0
  101. package/compliance/iso13485-audit-prep/SKILL.md +157 -0
  102. package/compliance/iso27001-audit-prep/SKILL.md +138 -0
  103. package/compliance/iso42001-specialist/SKILL.md +195 -0
  104. package/compliance/mdr-745-specialist/SKILL.md +335 -0
  105. package/compliance/qms-audit-expert/SKILL.md +323 -0
  106. package/compliance/quality-documentation-manager/SKILL.md +437 -0
  107. package/compliance/quality-manager-qmr/SKILL.md +488 -0
  108. package/compliance/quality-manager-qms-iso13485/SKILL.md +435 -0
  109. package/compliance/ra-qm-skills/SKILL.md +66 -0
  110. package/compliance/regulatory-affairs-head/SKILL.md +481 -0
  111. package/compliance/risk-management-specialist/SKILL.md +451 -0
  112. package/compliance/soc2-audit-prep/SKILL.md +152 -0
  113. package/compliance/soc2-compliance/SKILL.md +417 -0
  114. package/content/design-system/SKILL.md +156 -0
  115. package/content/markdown-html-orchestrator/SKILL.md +152 -0
  116. package/content/md-document/SKILL.md +105 -0
  117. package/content/md-review/SKILL.md +97 -0
  118. package/content/md-slides/SKILL.md +102 -0
  119. package/dist/index.js +62 -2
  120. package/engineering/.claude-plugin/plugin.json +24 -0
  121. package/engineering/CLAUDE.md +28 -0
  122. package/engineering/agent-designer/SKILL.md +159 -0
  123. package/engineering/agenthub/.claude-plugin/plugin.json +15 -0
  124. package/engineering/agenthub/CLAUDE.md +59 -0
  125. package/engineering/agenthub/README.md +268 -0
  126. package/engineering/agenthub/agents/hub-coordinator.md +99 -0
  127. package/engineering/agenthub/settings.json +24 -0
  128. package/engineering/agenthub/skills/agenthub/SKILL.md +257 -0
  129. package/engineering/agenthub/skills/agenthub/references/agent-templates.md +187 -0
  130. package/engineering/agenthub/skills/agenthub/references/coordination-strategies.md +186 -0
  131. package/engineering/agenthub/skills/agenthub/references/dag-patterns.md +149 -0
  132. package/engineering/agenthub/skills/agenthub/scripts/board_manager.py +266 -0
  133. package/engineering/agenthub/skills/agenthub/scripts/dag_analyzer.py +275 -0
  134. package/engineering/agenthub/skills/agenthub/scripts/dry_run.py +318 -0
  135. package/engineering/agenthub/skills/agenthub/scripts/hub_init.py +253 -0
  136. package/engineering/agenthub/skills/agenthub/scripts/result_ranker.py +315 -0
  137. package/engineering/agenthub/skills/agenthub/scripts/session_manager.py +302 -0
  138. package/engineering/agenthub/skills/board/SKILL.md +106 -0
  139. package/engineering/agenthub/skills/eval/SKILL.md +80 -0
  140. package/engineering/agenthub/skills/init/SKILL.md +89 -0
  141. package/engineering/agenthub/skills/merge/SKILL.md +94 -0
  142. package/engineering/agenthub/skills/run/SKILL.md +110 -0
  143. package/engineering/agenthub/skills/spawn/SKILL.md +83 -0
  144. package/engineering/agenthub/skills/status/SKILL.md +78 -0
  145. package/engineering/autoresearch-agent/.claude-plugin/plugin.json +15 -0
  146. package/engineering/autoresearch-agent/CLAUDE.md +66 -0
  147. package/engineering/autoresearch-agent/agents/experiment-runner.md +87 -0
  148. package/engineering/autoresearch-agent/evaluators/benchmark_size.py +60 -0
  149. package/engineering/autoresearch-agent/evaluators/benchmark_speed.py +40 -0
  150. package/engineering/autoresearch-agent/evaluators/build_speed.py +39 -0
  151. package/engineering/autoresearch-agent/evaluators/llm_judge_content.py +77 -0
  152. package/engineering/autoresearch-agent/evaluators/llm_judge_copy.py +113 -0
  153. package/engineering/autoresearch-agent/evaluators/llm_judge_prompt.py +108 -0
  154. package/engineering/autoresearch-agent/evaluators/memory_usage.py +53 -0
  155. package/engineering/autoresearch-agent/evaluators/test_pass_rate.py +55 -0
  156. package/engineering/autoresearch-agent/settings.json +22 -0
  157. package/engineering/autoresearch-agent/skills/autoresearch-agent/SKILL.md +308 -0
  158. package/engineering/autoresearch-agent/skills/autoresearch-agent/references/experiment-domains.md +255 -0
  159. package/engineering/autoresearch-agent/skills/autoresearch-agent/references/program-template.md +170 -0
  160. package/engineering/autoresearch-agent/skills/autoresearch-agent/scripts/log_results.py +393 -0
  161. package/engineering/autoresearch-agent/skills/autoresearch-agent/scripts/run_experiment.py +280 -0
  162. package/engineering/autoresearch-agent/skills/autoresearch-agent/scripts/setup_experiment.py +383 -0
  163. package/engineering/autoresearch-agent/skills/loop/SKILL.md +122 -0
  164. package/engineering/autoresearch-agent/skills/resume/SKILL.md +77 -0
  165. package/engineering/autoresearch-agent/skills/run/SKILL.md +84 -0
  166. package/engineering/autoresearch-agent/skills/setup/SKILL.md +77 -0
  167. package/engineering/autoresearch-agent/skills/status/SKILL.md +71 -0
  168. package/engineering/behuman/.claude-plugin/plugin.json +15 -0
  169. package/engineering/behuman/evals.json +42 -0
  170. package/engineering/behuman/skills/behuman/SKILL.md +193 -0
  171. package/engineering/behuman/skills/behuman/references/api-integration.md +100 -0
  172. package/engineering/caveman/.claude-plugin/plugin.json +21 -0
  173. package/engineering/caveman/README.md +35 -0
  174. package/engineering/caveman/agents/cs-caveman-mode.md +121 -0
  175. package/engineering/caveman/commands/cs-caveman.md +68 -0
  176. package/engineering/caveman/skills/caveman/SKILL.md +69 -0
  177. package/engineering/caveman/skills/caveman/references/companion_tooling.md +66 -0
  178. package/engineering/caveman/skills/caveman/references/compression_principles.md +112 -0
  179. package/engineering/caveman/skills/caveman/references/when_caveman_backfires.md +155 -0
  180. package/engineering/caveman/skills/caveman/scripts/caveman_compressor.py +248 -0
  181. package/engineering/caveman/skills/caveman/scripts/caveman_lint.py +191 -0
  182. package/engineering/caveman/skills/caveman/scripts/token_savings_estimator.py +137 -0
  183. package/engineering/chaos-engineering/.claude-plugin/plugin.json +15 -0
  184. package/engineering/chaos-engineering/README.md +107 -0
  185. package/engineering/chaos-engineering/skills/chaos-engineering/SKILL.md +231 -0
  186. package/engineering/chaos-engineering/skills/chaos-engineering/assets/experiment_template.md +76 -0
  187. package/engineering/chaos-engineering/skills/chaos-engineering/assets/postmortem_template.md +67 -0
  188. package/engineering/chaos-engineering/skills/chaos-engineering/references/attack_taxonomy.md +180 -0
  189. package/engineering/chaos-engineering/skills/chaos-engineering/references/chaos_principles.md +136 -0
  190. package/engineering/chaos-engineering/skills/chaos-engineering/references/experiment_design.md +158 -0
  191. package/engineering/chaos-engineering/skills/chaos-engineering/references/tooling_landscape.md +197 -0
  192. package/engineering/chaos-engineering/skills/chaos-engineering/scripts/blast_radius_calculator.py +101 -0
  193. package/engineering/chaos-engineering/skills/chaos-engineering/scripts/experiment_designer.py +139 -0
  194. package/engineering/chaos-engineering/skills/chaos-engineering/scripts/experiment_postmortem.py +144 -0
  195. package/engineering/claude-coach/.claude-plugin/plugin.json +15 -0
  196. package/engineering/claude-coach/README.md +39 -0
  197. package/engineering/claude-coach/agents/cs-claude-coach.md +50 -0
  198. package/engineering/claude-coach/commands/cs-claude-coach.md +32 -0
  199. package/engineering/claude-coach/skills/claude-coach/README.md +14 -0
  200. package/engineering/claude-coach/skills/claude-coach/SKILL.md +205 -0
  201. package/engineering/claude-coach/skills/claude-coach/references/cheat-codes.md +105 -0
  202. package/engineering/claude-coach/skills/claude-coach/references/coaching-rules.md +44 -0
  203. package/engineering/claude-coach/skills/claude-coach/scripts/cheat_code_filter.py +163 -0
  204. package/engineering/claude-coach/skills/claude-coach/scripts/coach_tip_classifier.py +205 -0
  205. package/engineering/claude-coach/skills/claude-coach/scripts/prompt_rater.py +176 -0
  206. package/engineering/code-review/SKILL.md +116 -0
  207. package/engineering/code-tour/.claude-plugin/plugin.json +15 -0
  208. package/engineering/code-tour/evals.json +32 -0
  209. package/engineering/code-tour/skills/code-tour/SKILL.md +140 -0
  210. package/engineering/data-quality-auditor/.claude-plugin/plugin.json +15 -0
  211. package/engineering/data-quality-auditor/skills/data-quality-auditor/SKILL.md +219 -0
  212. package/engineering/data-quality-auditor/skills/data-quality-auditor/references/data-quality-concepts.md +106 -0
  213. package/engineering/data-quality-auditor/skills/data-quality-auditor/scripts/data_profiler.py +258 -0
  214. package/engineering/data-quality-auditor/skills/data-quality-auditor/scripts/missing_value_analyzer.py +242 -0
  215. package/engineering/data-quality-auditor/skills/data-quality-auditor/scripts/outlier_detector.py +263 -0
  216. package/engineering/debug-error/SKILL.md +118 -0
  217. package/engineering/demo-video/.claude-plugin/plugin.json +15 -0
  218. package/engineering/demo-video/evals.json +26 -0
  219. package/engineering/demo-video/skills/demo-video/SKILL.md +110 -0
  220. package/engineering/demo-video/skills/demo-video/references/scene-design-system.md +61 -0
  221. package/engineering/docker-development/.claude-plugin/plugin.json +15 -0
  222. package/engineering/docker-development/skills/docker-development/SKILL.md +366 -0
  223. package/engineering/docker-development/skills/docker-development/references/compose-patterns.md +282 -0
  224. package/engineering/docker-development/skills/docker-development/references/dockerfile-best-practices.md +235 -0
  225. package/engineering/docker-development/skills/docker-development/scripts/compose_validator.py +390 -0
  226. package/engineering/docker-development/skills/docker-development/scripts/dockerfile_analyzer.py +410 -0
  227. package/engineering/explain-code/SKILL.md +100 -0
  228. package/engineering/feature-flags-architect/.claude-plugin/plugin.json +15 -0
  229. package/engineering/feature-flags-architect/README.md +94 -0
  230. package/engineering/feature-flags-architect/skills/feature-flags-architect/SKILL.md +219 -0
  231. package/engineering/feature-flags-architect/skills/feature-flags-architect/assets/flag_request_template.md +65 -0
  232. package/engineering/feature-flags-architect/skills/feature-flags-architect/references/flag_lifecycle.md +171 -0
  233. package/engineering/feature-flags-architect/skills/feature-flags-architect/references/flag_taxonomy.md +125 -0
  234. package/engineering/feature-flags-architect/skills/feature-flags-architect/references/provider_comparison.md +159 -0
  235. package/engineering/feature-flags-architect/skills/feature-flags-architect/references/rollout_strategies.md +140 -0
  236. package/engineering/feature-flags-architect/skills/feature-flags-architect/scripts/flag_debt_scanner.py +140 -0
  237. package/engineering/feature-flags-architect/skills/feature-flags-architect/scripts/kill_switch_audit.py +146 -0
  238. package/engineering/feature-flags-architect/skills/feature-flags-architect/scripts/rollout_planner.py +123 -0
  239. package/engineering/generate-tests/SKILL.md +142 -0
  240. package/engineering/git-commit/SKILL.md +130 -0
  241. package/engineering/grill-me/.claude-plugin/plugin.json +21 -0
  242. package/engineering/grill-me/README.md +37 -0
  243. package/engineering/grill-me/agents/cs-grill-master.md +170 -0
  244. package/engineering/grill-me/commands/cs-grill-me.md +84 -0
  245. package/engineering/grill-me/skills/grill-me/SKILL.md +58 -0
  246. package/engineering/grill-me/skills/grill-me/references/companion_tooling.md +65 -0
  247. package/engineering/grill-me/skills/grill-me/references/forcing_question_patterns.md +152 -0
  248. package/engineering/grill-me/skills/grill-me/references/when_to_stop_grilling.md +142 -0
  249. package/engineering/grill-me/skills/grill-me/scripts/decision_tree_extractor.py +149 -0
  250. package/engineering/grill-me/skills/grill-me/scripts/grill_session_tracker.py +264 -0
  251. package/engineering/grill-me/skills/grill-me/scripts/question_generator.py +142 -0
  252. package/engineering/grill-with-docs/.claude-plugin/plugin.json +21 -0
  253. package/engineering/grill-with-docs/README.md +53 -0
  254. package/engineering/grill-with-docs/agents/cs-grill-with-docs.md +200 -0
  255. package/engineering/grill-with-docs/commands/cs-grill-with-docs.md +100 -0
  256. package/engineering/grill-with-docs/skills/grill-with-docs/ADR-FORMAT.md +53 -0
  257. package/engineering/grill-with-docs/skills/grill-with-docs/CONTEXT-FORMAT.md +83 -0
  258. package/engineering/grill-with-docs/skills/grill-with-docs/SKILL.md +143 -0
  259. package/engineering/grill-with-docs/skills/grill-with-docs/references/adr_practice.md +111 -0
  260. package/engineering/grill-with-docs/skills/grill-with-docs/references/context_md_as_artifact.md +105 -0
  261. package/engineering/grill-with-docs/skills/grill-with-docs/references/ubiquitous_language.md +66 -0
  262. package/engineering/grill-with-docs/skills/grill-with-docs/scripts/adr_scanner.py +241 -0
  263. package/engineering/grill-with-docs/skills/grill-with-docs/scripts/context_md_linter.py +272 -0
  264. package/engineering/grill-with-docs/skills/grill-with-docs/scripts/glossary_code_consistency.py +301 -0
  265. package/engineering/handoff/.claude-plugin/plugin.json +21 -0
  266. package/engineering/handoff/README.md +37 -0
  267. package/engineering/handoff/agents/cs-handoff-author.md +177 -0
  268. package/engineering/handoff/commands/cs-handoff.md +80 -0
  269. package/engineering/handoff/skills/handoff/SKILL.md +41 -0
  270. package/engineering/handoff/skills/handoff/references/companion_tooling.md +56 -0
  271. package/engineering/handoff/skills/handoff/references/deduplication_discipline.md +196 -0
  272. package/engineering/handoff/skills/handoff/references/handoff_structure.md +163 -0
  273. package/engineering/handoff/skills/handoff/references/next_session_skill_matching.md +121 -0
  274. package/engineering/handoff/skills/handoff/scripts/artifact_deduplicator.py +244 -0
  275. package/engineering/handoff/skills/handoff/scripts/handoff_template_generator.py +217 -0
  276. package/engineering/handoff/skills/handoff/scripts/skill_recommender.py +185 -0
  277. package/engineering/helm-chart-builder/.claude-plugin/plugin.json +15 -0
  278. package/engineering/helm-chart-builder/skills/helm-chart-builder/SKILL.md +449 -0
  279. package/engineering/helm-chart-builder/skills/helm-chart-builder/references/chart-patterns.md +435 -0
  280. package/engineering/helm-chart-builder/skills/helm-chart-builder/references/values-design.md +462 -0
  281. package/engineering/helm-chart-builder/skills/helm-chart-builder/scripts/chart_analyzer.py +542 -0
  282. package/engineering/helm-chart-builder/skills/helm-chart-builder/scripts/values_validator.py +442 -0
  283. package/engineering/karpathy-coder/.claude-plugin/plugin.json +15 -0
  284. package/engineering/karpathy-coder/README.md +104 -0
  285. package/engineering/karpathy-coder/agents/karpathy-reviewer.md +84 -0
  286. package/engineering/karpathy-coder/commands/karpathy-check.md +46 -0
  287. package/engineering/karpathy-coder/hooks/karpathy-gate.sh +48 -0
  288. package/engineering/karpathy-coder/skills/karpathy-coder/SKILL.md +131 -0
  289. package/engineering/karpathy-coder/skills/karpathy-coder/expected_outputs/assumption_linter.json +34 -0
  290. package/engineering/karpathy-coder/skills/karpathy-coder/expected_outputs/complexity_checker.json +28 -0
  291. package/engineering/karpathy-coder/skills/karpathy-coder/expected_outputs/diff_surgeon.json +9 -0
  292. package/engineering/karpathy-coder/skills/karpathy-coder/expected_outputs/goal_verifier.json +20 -0
  293. package/engineering/karpathy-coder/skills/karpathy-coder/references/anti-patterns.md +168 -0
  294. package/engineering/karpathy-coder/skills/karpathy-coder/references/enforcement-patterns.md +128 -0
  295. package/engineering/karpathy-coder/skills/karpathy-coder/references/karpathy-principles.md +67 -0
  296. package/engineering/karpathy-coder/skills/karpathy-coder/scripts/assumption_linter.py +170 -0
  297. package/engineering/karpathy-coder/skills/karpathy-coder/scripts/complexity_checker.py +317 -0
  298. package/engineering/karpathy-coder/skills/karpathy-coder/scripts/diff_surgeon.py +217 -0
  299. package/engineering/karpathy-coder/skills/karpathy-coder/scripts/goal_verifier.py +207 -0
  300. package/engineering/kubernetes-operator/.claude-plugin/plugin.json +15 -0
  301. package/engineering/kubernetes-operator/README.md +83 -0
  302. package/engineering/kubernetes-operator/skills/kubernetes-operator/SKILL.md +242 -0
  303. package/engineering/kubernetes-operator/skills/kubernetes-operator/assets/crd_template.yaml +71 -0
  304. package/engineering/kubernetes-operator/skills/kubernetes-operator/assets/reconcile_skeleton.go +122 -0
  305. package/engineering/kubernetes-operator/skills/kubernetes-operator/references/crd_design.md +196 -0
  306. package/engineering/kubernetes-operator/skills/kubernetes-operator/references/operator_pattern.md +152 -0
  307. package/engineering/kubernetes-operator/skills/kubernetes-operator/references/reconcile_loop.md +210 -0
  308. package/engineering/kubernetes-operator/skills/kubernetes-operator/references/tooling_landscape.md +217 -0
  309. package/engineering/kubernetes-operator/skills/kubernetes-operator/scripts/crd_validator.py +134 -0
  310. package/engineering/kubernetes-operator/skills/kubernetes-operator/scripts/operator_capability_audit.py +150 -0
  311. package/engineering/kubernetes-operator/skills/kubernetes-operator/scripts/reconcile_lint.py +177 -0
  312. package/engineering/llm-cost-optimizer/SKILL.md +131 -0
  313. package/engineering/llm-wiki/.claude-plugin/plugin.json +15 -0
  314. package/engineering/llm-wiki/README.md +114 -0
  315. package/engineering/llm-wiki/agents/wiki-ingestor.md +89 -0
  316. package/engineering/llm-wiki/agents/wiki-librarian.md +83 -0
  317. package/engineering/llm-wiki/agents/wiki-linter.md +104 -0
  318. package/engineering/llm-wiki/commands/wiki-ingest.md +52 -0
  319. package/engineering/llm-wiki/commands/wiki-init.md +60 -0
  320. package/engineering/llm-wiki/commands/wiki-lint.md +83 -0
  321. package/engineering/llm-wiki/commands/wiki-log.md +64 -0
  322. package/engineering/llm-wiki/commands/wiki-query.md +58 -0
  323. package/engineering/llm-wiki/skills/llm-wiki/SKILL.md +178 -0
  324. package/engineering/llm-wiki/skills/llm-wiki/assets/AGENTS.md.template +140 -0
  325. package/engineering/llm-wiki/skills/llm-wiki/assets/CLAUDE.md.template +133 -0
  326. package/engineering/llm-wiki/skills/llm-wiki/assets/cursorrules.template +30 -0
  327. package/engineering/llm-wiki/skills/llm-wiki/assets/example-vault/README.md +35 -0
  328. package/engineering/llm-wiki/skills/llm-wiki/assets/example-vault/wiki/concepts/sparse-autoencoder.md +33 -0
  329. package/engineering/llm-wiki/skills/llm-wiki/assets/example-vault/wiki/entities/anthropic.md +31 -0
  330. package/engineering/llm-wiki/skills/llm-wiki/assets/example-vault/wiki/index.md +18 -0
  331. package/engineering/llm-wiki/skills/llm-wiki/assets/example-vault/wiki/log.md +11 -0
  332. package/engineering/llm-wiki/skills/llm-wiki/assets/example-vault/wiki/sources/monosemanticity.md +41 -0
  333. package/engineering/llm-wiki/skills/llm-wiki/assets/example-vault/wiki/synthesis/interpretability-overview.md +32 -0
  334. package/engineering/llm-wiki/skills/llm-wiki/assets/index.md.template +32 -0
  335. package/engineering/llm-wiki/skills/llm-wiki/assets/log.md.template +12 -0
  336. package/engineering/llm-wiki/skills/llm-wiki/assets/page-templates/comparison.md +39 -0
  337. package/engineering/llm-wiki/skills/llm-wiki/assets/page-templates/concept.md +31 -0
  338. package/engineering/llm-wiki/skills/llm-wiki/assets/page-templates/entity.md +31 -0
  339. package/engineering/llm-wiki/skills/llm-wiki/assets/page-templates/source-summary.md +41 -0
  340. package/engineering/llm-wiki/skills/llm-wiki/assets/page-templates/synthesis.md +38 -0
  341. package/engineering/llm-wiki/skills/llm-wiki/expected_outputs/README.md +19 -0
  342. package/engineering/llm-wiki/skills/llm-wiki/expected_outputs/append_log.json +9 -0
  343. package/engineering/llm-wiki/skills/llm-wiki/expected_outputs/export_marp.json +9 -0
  344. package/engineering/llm-wiki/skills/llm-wiki/expected_outputs/graph_analyzer.json +18 -0
  345. package/engineering/llm-wiki/skills/llm-wiki/expected_outputs/ingest_source.json +12 -0
  346. package/engineering/llm-wiki/skills/llm-wiki/expected_outputs/init_vault.json +26 -0
  347. package/engineering/llm-wiki/skills/llm-wiki/expected_outputs/lint_wiki.json +10 -0
  348. package/engineering/llm-wiki/skills/llm-wiki/expected_outputs/update_index.json +11 -0
  349. package/engineering/llm-wiki/skills/llm-wiki/expected_outputs/wiki_search.json +10 -0
  350. package/engineering/llm-wiki/skills/llm-wiki/references/cross-tool-setup.md +108 -0
  351. package/engineering/llm-wiki/skills/llm-wiki/references/ingest-workflow.md +97 -0
  352. package/engineering/llm-wiki/skills/llm-wiki/references/lint-workflow.md +91 -0
  353. package/engineering/llm-wiki/skills/llm-wiki/references/memex-principles.md +78 -0
  354. package/engineering/llm-wiki/skills/llm-wiki/references/obsidian-setup.md +85 -0
  355. package/engineering/llm-wiki/skills/llm-wiki/references/page-formats.md +194 -0
  356. package/engineering/llm-wiki/skills/llm-wiki/references/query-workflow.md +76 -0
  357. package/engineering/llm-wiki/skills/llm-wiki/references/wiki-schema.md +98 -0
  358. package/engineering/llm-wiki/skills/llm-wiki/scripts/append_log.py +134 -0
  359. package/engineering/llm-wiki/skills/llm-wiki/scripts/export_marp.py +146 -0
  360. package/engineering/llm-wiki/skills/llm-wiki/scripts/graph_analyzer.py +142 -0
  361. package/engineering/llm-wiki/skills/llm-wiki/scripts/ingest_source.py +177 -0
  362. package/engineering/llm-wiki/skills/llm-wiki/scripts/init_vault.py +219 -0
  363. package/engineering/llm-wiki/skills/llm-wiki/scripts/lint_wiki.py +202 -0
  364. package/engineering/llm-wiki/skills/llm-wiki/scripts/update_index.py +204 -0
  365. package/engineering/llm-wiki/skills/llm-wiki/scripts/wiki_search.py +145 -0
  366. package/engineering/prompt-engineering/SKILL.md +128 -0
  367. package/engineering/prompt-governance/.claude-plugin/plugin.json +15 -0
  368. package/engineering/prompt-governance/skills/prompt-governance/SKILL.md +224 -0
  369. package/engineering/refactor/SKILL.md +129 -0
  370. package/engineering/security-guidance/.claude-plugin/plugin.json +19 -0
  371. package/engineering/security-guidance/hooks/hooks.json +16 -0
  372. package/engineering/security-guidance/hooks/security_reminder_hook.py +291 -0
  373. package/engineering/security-guidance/skills/security-guidance/SKILL.md +160 -0
  374. package/engineering/security-guidance/skills/security-guidance/references/pretooluse_hook_canon.md +141 -0
  375. package/engineering/skills/agent-designer/README.md +430 -0
  376. package/engineering/skills/agent-designer/SKILL.md +279 -0
  377. package/engineering/skills/agent-designer/agent_evaluator.py +1223 -0
  378. package/engineering/skills/agent-designer/agent_planner.py +911 -0
  379. package/engineering/skills/agent-designer/assets/sample_execution_logs.json +543 -0
  380. package/engineering/skills/agent-designer/assets/sample_system_requirements.json +57 -0
  381. package/engineering/skills/agent-designer/assets/sample_tool_descriptions.json +545 -0
  382. package/engineering/skills/agent-designer/expected_outputs/sample_agent_architecture.json +488 -0
  383. package/engineering/skills/agent-designer/expected_outputs/sample_evaluation_report.json +570 -0
  384. package/engineering/skills/agent-designer/expected_outputs/sample_tool_schemas.json +416 -0
  385. package/engineering/skills/agent-designer/references/agent_architecture_patterns.md +445 -0
  386. package/engineering/skills/agent-designer/references/evaluation_methodology.md +749 -0
  387. package/engineering/skills/agent-designer/references/tool_design_best_practices.md +470 -0
  388. package/engineering/skills/agent-designer/tool_schema_generator.py +978 -0
  389. package/engineering/skills/agent-workflow-designer/SKILL.md +83 -0
  390. package/engineering/skills/agent-workflow-designer/references/workflow-patterns.md +82 -0
  391. package/engineering/skills/agent-workflow-designer/scripts/workflow_scaffolder.py +113 -0
  392. package/engineering/skills/api-design-reviewer/SKILL.md +421 -0
  393. package/engineering/skills/api-design-reviewer/references/api_antipatterns.md +680 -0
  394. package/engineering/skills/api-design-reviewer/references/rest_design_rules.md +487 -0
  395. package/engineering/skills/api-design-reviewer/scripts/api_linter.py +914 -0
  396. package/engineering/skills/api-design-reviewer/scripts/api_scorecard.py +1661 -0
  397. package/engineering/skills/api-design-reviewer/scripts/breaking_change_detector.py +1102 -0
  398. package/engineering/skills/api-test-suite-builder/SKILL.md +177 -0
  399. package/engineering/skills/api-test-suite-builder/references/example-test-files.md +508 -0
  400. package/engineering/skills/browser-automation/SKILL.md +266 -0
  401. package/engineering/skills/browser-automation/references/anti_detection_patterns.md +453 -0
  402. package/engineering/skills/browser-automation/references/data_extraction_recipes.md +580 -0
  403. package/engineering/skills/browser-automation/references/playwright_browser_api.md +492 -0
  404. package/engineering/skills/browser-automation/scripts/anti_detection_checker.py +520 -0
  405. package/engineering/skills/browser-automation/scripts/form_automation_builder.py +324 -0
  406. package/engineering/skills/browser-automation/scripts/scraping_toolkit.py +248 -0
  407. package/engineering/skills/changelog-generator/README.md +48 -0
  408. package/engineering/skills/changelog-generator/SKILL.md +165 -0
  409. package/engineering/skills/changelog-generator/references/changelog-formatting-guide.md +17 -0
  410. package/engineering/skills/changelog-generator/references/ci-integration.md +26 -0
  411. package/engineering/skills/changelog-generator/references/monorepo-strategy.md +39 -0
  412. package/engineering/skills/changelog-generator/scripts/commit_linter.py +138 -0
  413. package/engineering/skills/changelog-generator/scripts/generate_changelog.py +247 -0
  414. package/engineering/skills/chaos-engineering/SKILL.md +231 -0
  415. package/engineering/skills/chaos-engineering/assets/experiment_template.md +76 -0
  416. package/engineering/skills/chaos-engineering/assets/postmortem_template.md +67 -0
  417. package/engineering/skills/chaos-engineering/references/attack_taxonomy.md +180 -0
  418. package/engineering/skills/chaos-engineering/references/chaos_principles.md +136 -0
  419. package/engineering/skills/chaos-engineering/references/experiment_design.md +158 -0
  420. package/engineering/skills/chaos-engineering/references/tooling_landscape.md +197 -0
  421. package/engineering/skills/chaos-engineering/scripts/blast_radius_calculator.py +101 -0
  422. package/engineering/skills/chaos-engineering/scripts/experiment_designer.py +139 -0
  423. package/engineering/skills/chaos-engineering/scripts/experiment_postmortem.py +144 -0
  424. package/engineering/skills/ci-cd-pipeline-builder/README.md +48 -0
  425. package/engineering/skills/ci-cd-pipeline-builder/SKILL.md +147 -0
  426. package/engineering/skills/ci-cd-pipeline-builder/references/deployment-gates.md +17 -0
  427. package/engineering/skills/ci-cd-pipeline-builder/references/github-actions-templates.md +41 -0
  428. package/engineering/skills/ci-cd-pipeline-builder/references/gitlab-ci-templates.md +39 -0
  429. package/engineering/skills/ci-cd-pipeline-builder/scripts/pipeline_generator.py +310 -0
  430. package/engineering/skills/ci-cd-pipeline-builder/scripts/stack_detector.py +184 -0
  431. package/engineering/skills/codebase-onboarding/SKILL.md +84 -0
  432. package/engineering/skills/codebase-onboarding/references/onboarding-template.md +186 -0
  433. package/engineering/skills/codebase-onboarding/references/output-format-templates.md +41 -0
  434. package/engineering/skills/codebase-onboarding/scripts/codebase_analyzer.py +205 -0
  435. package/engineering/skills/command-guide/SKILL.md +314 -0
  436. package/engineering/skills/database-designer/README.md +388 -0
  437. package/engineering/skills/database-designer/SKILL.md +289 -0
  438. package/engineering/skills/database-designer/assets/sample_query_patterns.json +375 -0
  439. package/engineering/skills/database-designer/assets/sample_schema.json +372 -0
  440. package/engineering/skills/database-designer/assets/sample_schema.sql +207 -0
  441. package/engineering/skills/database-designer/expected_outputs/index_optimization_sample.txt +60 -0
  442. package/engineering/skills/database-designer/expected_outputs/migration_sample.txt +124 -0
  443. package/engineering/skills/database-designer/expected_outputs/schema_analysis_sample.txt +222 -0
  444. package/engineering/skills/database-designer/index_optimizer.py +926 -0
  445. package/engineering/skills/database-designer/migration_generator.py +1199 -0
  446. package/engineering/skills/database-designer/references/database-design-reference.md +476 -0
  447. package/engineering/skills/database-designer/references/database_selection_decision_tree.md +373 -0
  448. package/engineering/skills/database-designer/references/index_strategy_patterns.md +424 -0
  449. package/engineering/skills/database-designer/references/normalization_guide.md +354 -0
  450. package/engineering/skills/database-designer/schema_analyzer.py +982 -0
  451. package/engineering/skills/database-schema-designer/SKILL.md +248 -0
  452. package/engineering/skills/database-schema-designer/references/full-schema-examples.md +283 -0
  453. package/engineering/skills/dependency-auditor/README.md +524 -0
  454. package/engineering/skills/dependency-auditor/SKILL.md +338 -0
  455. package/engineering/skills/dependency-auditor/assets/sample_go.mod +53 -0
  456. package/engineering/skills/dependency-auditor/assets/sample_package.json +72 -0
  457. package/engineering/skills/dependency-auditor/assets/sample_requirements.txt +71 -0
  458. package/engineering/skills/dependency-auditor/expected_outputs/sample_license_report.txt +37 -0
  459. package/engineering/skills/dependency-auditor/expected_outputs/sample_upgrade_plan.txt +59 -0
  460. package/engineering/skills/dependency-auditor/expected_outputs/sample_vulnerability_report.json +71 -0
  461. package/engineering/skills/dependency-auditor/references/dependency_management_best_practices.md +643 -0
  462. package/engineering/skills/dependency-auditor/references/license_compatibility_matrix.md +238 -0
  463. package/engineering/skills/dependency-auditor/references/vulnerability_assessment_guide.md +461 -0
  464. package/engineering/skills/dependency-auditor/scripts/dep_scanner.py +794 -0
  465. package/engineering/skills/dependency-auditor/scripts/license_checker.py +996 -0
  466. package/engineering/skills/dependency-auditor/scripts/upgrade_planner.py +1029 -0
  467. package/engineering/skills/dependency-auditor/test-inventory.json +421 -0
  468. package/engineering/skills/dependency-auditor/test-project/package.json +72 -0
  469. package/engineering/skills/engineering-advanced-skills/SKILL.md +70 -0
  470. package/engineering/skills/env-secrets-manager/SKILL.md +260 -0
  471. package/engineering/skills/env-secrets-manager/references/secret-patterns.md +41 -0
  472. package/engineering/skills/env-secrets-manager/references/validation-detection-rotation.md +358 -0
  473. package/engineering/skills/env-secrets-manager/scripts/env_auditor.py +145 -0
  474. package/engineering/skills/feature-flags-architect/SKILL.md +219 -0
  475. package/engineering/skills/feature-flags-architect/assets/flag_request_template.md +65 -0
  476. package/engineering/skills/feature-flags-architect/references/flag_lifecycle.md +171 -0
  477. package/engineering/skills/feature-flags-architect/references/flag_taxonomy.md +125 -0
  478. package/engineering/skills/feature-flags-architect/references/provider_comparison.md +159 -0
  479. package/engineering/skills/feature-flags-architect/references/rollout_strategies.md +140 -0
  480. package/engineering/skills/feature-flags-architect/scripts/flag_debt_scanner.py +140 -0
  481. package/engineering/skills/feature-flags-architect/scripts/kill_switch_audit.py +146 -0
  482. package/engineering/skills/feature-flags-architect/scripts/rollout_planner.py +123 -0
  483. package/engineering/skills/focused-fix/SKILL.md +318 -0
  484. package/engineering/skills/full-page-screenshot/SKILL.md +123 -0
  485. package/engineering/skills/full-page-screenshot/scripts/full-page-screenshot.mjs +951 -0
  486. package/engineering/skills/git-worktree-manager/README.md +51 -0
  487. package/engineering/skills/git-worktree-manager/SKILL.md +193 -0
  488. package/engineering/skills/git-worktree-manager/references/docker-compose-patterns.md +62 -0
  489. package/engineering/skills/git-worktree-manager/references/port-allocation-strategy.md +46 -0
  490. package/engineering/skills/git-worktree-manager/scripts/worktree_cleanup.py +196 -0
  491. package/engineering/skills/git-worktree-manager/scripts/worktree_manager.py +240 -0
  492. package/engineering/skills/interview-system-designer/README.md +309 -0
  493. package/engineering/skills/interview-system-designer/SKILL.md +59 -0
  494. package/engineering/skills/interview-system-designer/assets/sample_interview_results.json +382 -0
  495. package/engineering/skills/interview-system-designer/assets/sample_role_definitions.json +170 -0
  496. package/engineering/skills/interview-system-designer/expected_outputs/product_manager_senior_questions.json +622 -0
  497. package/engineering/skills/interview-system-designer/expected_outputs/product_manager_senior_questions.txt +177 -0
  498. package/engineering/skills/interview-system-designer/expected_outputs/senior_software_engineer_senior_interview_loop.json +435 -0
  499. package/engineering/skills/interview-system-designer/expected_outputs/senior_software_engineer_senior_interview_loop.txt +151 -0
  500. package/engineering/skills/interview-system-designer/hiring_calibrator.py +1306 -0
  501. package/engineering/skills/interview-system-designer/loop_designer.py +908 -0
  502. package/engineering/skills/interview-system-designer/question_bank_generator.py +1060 -0
  503. package/engineering/skills/interview-system-designer/references/bias_mitigation_checklist.md +308 -0
  504. package/engineering/skills/interview-system-designer/references/competency_matrix_templates.md +171 -0
  505. package/engineering/skills/interview-system-designer/references/debrief_facilitation_guide.md +319 -0
  506. package/engineering/skills/interview-system-designer/references/interview-frameworks.md +46 -0
  507. package/engineering/skills/interview-system-designer/scripts/interview_planner.py +133 -0
  508. package/engineering/skills/kubernetes-operator/SKILL.md +242 -0
  509. package/engineering/skills/kubernetes-operator/assets/crd_template.yaml +71 -0
  510. package/engineering/skills/kubernetes-operator/assets/reconcile_skeleton.go +122 -0
  511. package/engineering/skills/kubernetes-operator/references/crd_design.md +196 -0
  512. package/engineering/skills/kubernetes-operator/references/operator_pattern.md +152 -0
  513. package/engineering/skills/kubernetes-operator/references/reconcile_loop.md +210 -0
  514. package/engineering/skills/kubernetes-operator/references/tooling_landscape.md +217 -0
  515. package/engineering/skills/kubernetes-operator/scripts/crd_validator.py +134 -0
  516. package/engineering/skills/kubernetes-operator/scripts/operator_capability_audit.py +150 -0
  517. package/engineering/skills/kubernetes-operator/scripts/reconcile_lint.py +177 -0
  518. package/engineering/skills/mcp-server-builder/README.md +50 -0
  519. package/engineering/skills/mcp-server-builder/SKILL.md +164 -0
  520. package/engineering/skills/mcp-server-builder/references/openapi-extraction-guide.md +34 -0
  521. package/engineering/skills/mcp-server-builder/references/python-server-template.md +22 -0
  522. package/engineering/skills/mcp-server-builder/references/typescript-server-template.md +19 -0
  523. package/engineering/skills/mcp-server-builder/references/validation-checklist.md +30 -0
  524. package/engineering/skills/mcp-server-builder/scripts/mcp_validator.py +186 -0
  525. package/engineering/skills/mcp-server-builder/scripts/openapi_to_mcp.py +284 -0
  526. package/engineering/skills/migration-architect/README.md +382 -0
  527. package/engineering/skills/migration-architect/SKILL.md +478 -0
  528. package/engineering/skills/migration-architect/assets/database_schema_after.json +367 -0
  529. package/engineering/skills/migration-architect/assets/database_schema_before.json +243 -0
  530. package/engineering/skills/migration-architect/assets/sample_database_migration.json +106 -0
  531. package/engineering/skills/migration-architect/assets/sample_service_migration.json +175 -0
  532. package/engineering/skills/migration-architect/expected_outputs/rollback_runbook.json +577 -0
  533. package/engineering/skills/migration-architect/expected_outputs/rollback_runbook.txt +282 -0
  534. package/engineering/skills/migration-architect/expected_outputs/sample_database_migration_plan.json +317 -0
  535. package/engineering/skills/migration-architect/expected_outputs/sample_database_migration_plan.txt +161 -0
  536. package/engineering/skills/migration-architect/expected_outputs/sample_service_migration_plan.json +310 -0
  537. package/engineering/skills/migration-architect/expected_outputs/sample_service_migration_plan.txt +154 -0
  538. package/engineering/skills/migration-architect/expected_outputs/schema_compatibility_report.json +192 -0
  539. package/engineering/skills/migration-architect/expected_outputs/schema_compatibility_report.txt +129 -0
  540. package/engineering/skills/migration-architect/references/data_reconciliation_strategies.md +1329 -0
  541. package/engineering/skills/migration-architect/references/migration_patterns_catalog.md +705 -0
  542. package/engineering/skills/migration-architect/references/zero_downtime_techniques.md +1104 -0
  543. package/engineering/skills/migration-architect/scripts/compatibility_checker.py +883 -0
  544. package/engineering/skills/migration-architect/scripts/migration_planner.py +661 -0
  545. package/engineering/skills/migration-architect/scripts/rollback_generator.py +1109 -0
  546. package/engineering/skills/monorepo-navigator/SKILL.md +97 -0
  547. package/engineering/skills/monorepo-navigator/references/monorepo-patterns.md +37 -0
  548. package/engineering/skills/monorepo-navigator/references/monorepo-tooling-reference.md +516 -0
  549. package/engineering/skills/monorepo-navigator/scripts/monorepo_analyzer.py +168 -0
  550. package/engineering/skills/observability-designer/README.md +384 -0
  551. package/engineering/skills/observability-designer/SKILL.md +269 -0
  552. package/engineering/skills/observability-designer/assets/sample_alerts.json +276 -0
  553. package/engineering/skills/observability-designer/assets/sample_service_api.json +83 -0
  554. package/engineering/skills/observability-designer/assets/sample_service_web.json +113 -0
  555. package/engineering/skills/observability-designer/expected_outputs/sample_dashboard.json +811 -0
  556. package/engineering/skills/observability-designer/expected_outputs/sample_slo_framework.json +545 -0
  557. package/engineering/skills/observability-designer/references/alert_design_patterns.md +469 -0
  558. package/engineering/skills/observability-designer/references/dashboard_best_practices.md +571 -0
  559. package/engineering/skills/observability-designer/references/slo_cookbook.md +329 -0
  560. package/engineering/skills/observability-designer/scripts/alert_optimizer.py +1059 -0
  561. package/engineering/skills/observability-designer/scripts/dashboard_generator.py +1219 -0
  562. package/engineering/skills/observability-designer/scripts/slo_designer.py +670 -0
  563. package/engineering/skills/performance-profiler/SKILL.md +170 -0
  564. package/engineering/skills/performance-profiler/references/profiling-recipes.md +475 -0
  565. package/engineering/skills/performance-profiler/scripts/performance_profiler.py +192 -0
  566. package/engineering/skills/pr-review-expert/SKILL.md +384 -0
  567. package/engineering/skills/rag-architect/SKILL.md +318 -0
  568. package/engineering/skills/rag-architect/chunking_optimizer.py +787 -0
  569. package/engineering/skills/rag-architect/rag_pipeline_designer.py +680 -0
  570. package/engineering/skills/rag-architect/references/chunking_strategies_comparison.md +287 -0
  571. package/engineering/skills/rag-architect/references/embedding_model_benchmark.md +338 -0
  572. package/engineering/skills/rag-architect/references/rag_evaluation_framework.md +431 -0
  573. package/engineering/skills/rag-architect/retrieval_evaluator.py +578 -0
  574. package/engineering/skills/release-manager/README.md +445 -0
  575. package/engineering/skills/release-manager/SKILL.md +490 -0
  576. package/engineering/skills/release-manager/assets/sample_commits.json +80 -0
  577. package/engineering/skills/release-manager/assets/sample_git_log.txt +30 -0
  578. package/engineering/skills/release-manager/assets/sample_git_log_full.txt +163 -0
  579. package/engineering/skills/release-manager/assets/sample_release_plan.json +273 -0
  580. package/engineering/skills/release-manager/changelog_generator.py +504 -0
  581. package/engineering/skills/release-manager/expected_outputs/changelog_example.md +37 -0
  582. package/engineering/skills/release-manager/expected_outputs/release_readiness_example.txt +30 -0
  583. package/engineering/skills/release-manager/expected_outputs/version_bump_example.txt +31 -0
  584. package/engineering/skills/release-manager/references/conventional-commits-guide.md +341 -0
  585. package/engineering/skills/release-manager/references/hotfix-procedures.md +592 -0
  586. package/engineering/skills/release-manager/references/release-workflow-comparison.md +410 -0
  587. package/engineering/skills/release-manager/release_planner.py +1003 -0
  588. package/engineering/skills/release-manager/version_bumper.py +645 -0
  589. package/engineering/skills/runbook-generator/SKILL.md +76 -0
  590. package/engineering/skills/runbook-generator/references/runbook-templates.md +40 -0
  591. package/engineering/skills/runbook-generator/scripts/runbook_generator.py +128 -0
  592. package/engineering/skills/secrets-vault-manager/SKILL.md +403 -0
  593. package/engineering/skills/secrets-vault-manager/references/cloud_secret_stores.md +354 -0
  594. package/engineering/skills/secrets-vault-manager/references/emergency_procedures.md +280 -0
  595. package/engineering/skills/secrets-vault-manager/references/vault_patterns.md +342 -0
  596. package/engineering/skills/secrets-vault-manager/scripts/audit_log_analyzer.py +330 -0
  597. package/engineering/skills/secrets-vault-manager/scripts/rotation_planner.py +280 -0
  598. package/engineering/skills/secrets-vault-manager/scripts/vault_config_generator.py +302 -0
  599. package/engineering/skills/self-eval/SKILL.md +181 -0
  600. package/engineering/skills/ship-gate/SKILL.md +190 -0
  601. package/engineering/skills/ship-gate/references/checks.md +483 -0
  602. package/engineering/skills/ship-gate/references/patterns.md +687 -0
  603. package/engineering/skills/ship-gate/scripts/ship_gate_scanner.py +1231 -0
  604. package/engineering/skills/skill-security-auditor/SKILL.md +171 -0
  605. package/engineering/skills/skill-security-auditor/references/threat-model.md +271 -0
  606. package/engineering/skills/skill-security-auditor/scripts/skill_security_auditor.py +1066 -0
  607. package/engineering/skills/skill-tester/README.md +229 -0
  608. package/engineering/skills/skill-tester/SKILL.md +390 -0
  609. package/engineering/skills/skill-tester/assets/sample-skill/README.md +40 -0
  610. package/engineering/skills/skill-tester/assets/sample-skill/SKILL.md +163 -0
  611. package/engineering/skills/skill-tester/assets/sample-skill/assets/sample_text.txt +23 -0
  612. package/engineering/skills/skill-tester/assets/sample-skill/assets/test_data.csv +16 -0
  613. package/engineering/skills/skill-tester/assets/sample-skill/expected_outputs/sample_text_analysis.json +13 -0
  614. package/engineering/skills/skill-tester/assets/sample-skill/references/api-reference.md +115 -0
  615. package/engineering/skills/skill-tester/assets/sample-skill/scripts/text_processor.py +382 -0
  616. package/engineering/skills/skill-tester/expected_outputs/sample_validation_report.json +68 -0
  617. package/engineering/skills/skill-tester/references/quality-scoring-rubric.md +559 -0
  618. package/engineering/skills/skill-tester/references/skill-structure-specification.md +355 -0
  619. package/engineering/skills/skill-tester/references/tier-requirements-matrix.md +418 -0
  620. package/engineering/skills/skill-tester/scripts/quality_scorer.py +1182 -0
  621. package/engineering/skills/skill-tester/scripts/script_tester.py +731 -0
  622. package/engineering/skills/skill-tester/scripts/security_scorer.py +606 -0
  623. package/engineering/skills/skill-tester/scripts/skill_validator.py +667 -0
  624. package/engineering/skills/skill-tester/tests/test_security_scorer.py +851 -0
  625. package/engineering/skills/slo-architect/SKILL.md +234 -0
  626. package/engineering/skills/slo-architect/assets/error_budget_policy.md +79 -0
  627. package/engineering/skills/slo-architect/assets/slo_template.yaml +63 -0
  628. package/engineering/skills/slo-architect/references/composition.md +139 -0
  629. package/engineering/skills/slo-architect/references/error_budget.md +128 -0
  630. package/engineering/skills/slo-architect/references/sli_design.md +175 -0
  631. package/engineering/skills/slo-architect/references/slo_principles.md +138 -0
  632. package/engineering/skills/slo-architect/scripts/error_budget_calculator.py +147 -0
  633. package/engineering/skills/slo-architect/scripts/slo_designer.py +158 -0
  634. package/engineering/skills/slo-architect/scripts/slo_review.py +159 -0
  635. package/engineering/skills/spec-driven-workflow/SKILL.md +333 -0
  636. package/engineering/skills/spec-driven-workflow/references/acceptance_criteria_patterns.md +497 -0
  637. package/engineering/skills/spec-driven-workflow/references/bounded_autonomy_rules.md +273 -0
  638. package/engineering/skills/spec-driven-workflow/references/spec_format_guide.md +531 -0
  639. package/engineering/skills/spec-driven-workflow/scripts/spec_generator.py +338 -0
  640. package/engineering/skills/spec-driven-workflow/scripts/spec_validator.py +461 -0
  641. package/engineering/skills/spec-driven-workflow/scripts/test_extractor.py +431 -0
  642. package/engineering/skills/sql-database-assistant/SKILL.md +457 -0
  643. package/engineering/skills/sql-database-assistant/references/optimization_guide.md +330 -0
  644. package/engineering/skills/sql-database-assistant/references/orm_patterns.md +451 -0
  645. package/engineering/skills/sql-database-assistant/references/query_patterns.md +406 -0
  646. package/engineering/skills/sql-database-assistant/scripts/migration_generator.py +442 -0
  647. package/engineering/skills/sql-database-assistant/scripts/query_optimizer.py +348 -0
  648. package/engineering/skills/sql-database-assistant/scripts/schema_explorer.py +315 -0
  649. package/engineering/skills/tc-tracker/README.md +72 -0
  650. package/engineering/skills/tc-tracker/SKILL.md +207 -0
  651. package/engineering/skills/tc-tracker/references/handoff-format.md +139 -0
  652. package/engineering/skills/tc-tracker/references/lifecycle.md +98 -0
  653. package/engineering/skills/tc-tracker/references/tc-schema.md +204 -0
  654. package/engineering/skills/tc-tracker/scripts/tc_create.py +277 -0
  655. package/engineering/skills/tc-tracker/scripts/tc_init.py +196 -0
  656. package/engineering/skills/tc-tracker/scripts/tc_status.py +200 -0
  657. package/engineering/skills/tc-tracker/scripts/tc_update.py +361 -0
  658. package/engineering/skills/tc-tracker/scripts/tc_validator.py +347 -0
  659. package/engineering/skills/tech-debt-tracker/README.md +308 -0
  660. package/engineering/skills/tech-debt-tracker/SKILL.md +93 -0
  661. package/engineering/skills/tech-debt-tracker/assets/historical_debt_2024-01-15.json +268 -0
  662. package/engineering/skills/tech-debt-tracker/assets/historical_debt_2024-02-01.json +214 -0
  663. package/engineering/skills/tech-debt-tracker/assets/sample_codebase/src/frontend.js +395 -0
  664. package/engineering/skills/tech-debt-tracker/assets/sample_codebase/src/payment_processor.py +322 -0
  665. package/engineering/skills/tech-debt-tracker/assets/sample_codebase/src/user_service.py +276 -0
  666. package/engineering/skills/tech-debt-tracker/assets/sample_debt_inventory.json +285 -0
  667. package/engineering/skills/tech-debt-tracker/expected_outputs/sample_dashboard_output.json +221 -0
  668. package/engineering/skills/tech-debt-tracker/expected_outputs/sample_prioritization_output.json +1686 -0
  669. package/engineering/skills/tech-debt-tracker/expected_outputs/sample_scan_output.json +2034 -0
  670. package/engineering/skills/tech-debt-tracker/references/debt-classification-taxonomy.md +261 -0
  671. package/engineering/skills/tech-debt-tracker/references/debt-frameworks.md +486 -0
  672. package/engineering/skills/tech-debt-tracker/references/prioritization-framework.md +335 -0
  673. package/engineering/skills/tech-debt-tracker/references/stakeholder-communication-templates.md +418 -0
  674. package/engineering/skills/tech-debt-tracker/scripts/debt_dashboard.py +970 -0
  675. package/engineering/skills/tech-debt-tracker/scripts/debt_prioritizer.py +857 -0
  676. package/engineering/skills/tech-debt-tracker/scripts/debt_scanner.py +684 -0
  677. package/engineering/slo-architect/.claude-plugin/plugin.json +15 -0
  678. package/engineering/slo-architect/README.md +100 -0
  679. package/engineering/slo-architect/skills/slo-architect/SKILL.md +234 -0
  680. package/engineering/slo-architect/skills/slo-architect/assets/error_budget_policy.md +79 -0
  681. package/engineering/slo-architect/skills/slo-architect/assets/slo_template.yaml +63 -0
  682. package/engineering/slo-architect/skills/slo-architect/references/composition.md +139 -0
  683. package/engineering/slo-architect/skills/slo-architect/references/error_budget.md +128 -0
  684. package/engineering/slo-architect/skills/slo-architect/references/sli_design.md +175 -0
  685. package/engineering/slo-architect/skills/slo-architect/references/slo_principles.md +138 -0
  686. package/engineering/slo-architect/skills/slo-architect/scripts/error_budget_calculator.py +147 -0
  687. package/engineering/slo-architect/skills/slo-architect/scripts/slo_designer.py +158 -0
  688. package/engineering/slo-architect/skills/slo-architect/scripts/slo_review.py +159 -0
  689. package/engineering/statistical-analyst/.claude-plugin/plugin.json +15 -0
  690. package/engineering/statistical-analyst/skills/statistical-analyst/SKILL.md +246 -0
  691. package/engineering/statistical-analyst/skills/statistical-analyst/references/statistical-testing-concepts.md +189 -0
  692. package/engineering/statistical-analyst/skills/statistical-analyst/scripts/confidence_interval.py +198 -0
  693. package/engineering/statistical-analyst/skills/statistical-analyst/scripts/hypothesis_tester.py +471 -0
  694. package/engineering/statistical-analyst/skills/statistical-analyst/scripts/sample_size_calculator.py +262 -0
  695. package/engineering/terraform-patterns/.claude-plugin/plugin.json +15 -0
  696. package/engineering/terraform-patterns/skills/terraform-patterns/SKILL.md +740 -0
  697. package/engineering/terraform-patterns/skills/terraform-patterns/references/module-patterns.md +409 -0
  698. package/engineering/terraform-patterns/skills/terraform-patterns/references/state-management.md +472 -0
  699. package/engineering/terraform-patterns/skills/terraform-patterns/scripts/tf_module_analyzer.py +461 -0
  700. package/engineering/terraform-patterns/skills/terraform-patterns/scripts/tf_security_scanner.py +577 -0
  701. package/engineering/universal-scraping-architect/.claude-plugin/plugin.json +18 -0
  702. package/engineering/universal-scraping-architect/SKILL.md +58 -0
  703. package/engineering/universal-scraping-architect/agents/cs-scraping-architect.md +6 -0
  704. package/engineering/universal-scraping-architect/commands/cs-scrape.md +6 -0
  705. package/engineering/universal-scraping-architect/references/firecrawl-technical-guide.md +44 -0
  706. package/engineering/universal-scraping-architect/references/local-extraction-patterns.md +46 -0
  707. package/engineering/universal-scraping-architect/references/scraping-ethics-security.md +48 -0
  708. package/engineering/universal-scraping-architect/requirements.txt +7 -0
  709. package/engineering/universal-scraping-architect/scripts/firecrawl_example.py +217 -0
  710. package/engineering/universal-scraping-architect/scripts/local_bs4_example.py +293 -0
  711. package/engineering/universal-scraping-architect/scripts/validate_extraction.py +44 -0
  712. package/engineering/workflow-builder/.claude-plugin/plugin.json +18 -0
  713. package/engineering/workflow-builder/README.md +55 -0
  714. package/engineering/workflow-builder/agents/cs-workflow-architect.md +96 -0
  715. package/engineering/workflow-builder/commands/cs-workflow-build.md +95 -0
  716. package/engineering/workflow-builder/skills/workflow-builder/README.md +33 -0
  717. package/engineering/workflow-builder/skills/workflow-builder/SKILL.md +78 -0
  718. package/engineering/workflow-builder/skills/workflow-builder/assets/examples/pr-triage.js +98 -0
  719. package/engineering/workflow-builder/skills/workflow-builder/assets/templates/fan-out.js +48 -0
  720. package/engineering/workflow-builder/skills/workflow-builder/assets/templates/loop-until-budget.js +52 -0
  721. package/engineering/workflow-builder/skills/workflow-builder/assets/templates/pipeline.js +46 -0
  722. package/engineering/workflow-builder/skills/workflow-builder/expected_outputs/intake_pr_review.json +37 -0
  723. package/engineering/workflow-builder/skills/workflow-builder/expected_outputs/scaffold_pipeline.js +46 -0
  724. package/engineering/workflow-builder/skills/workflow-builder/expected_outputs/validate_sample.txt +6 -0
  725. package/engineering/workflow-builder/skills/workflow-builder/references/api_reference.md +115 -0
  726. package/engineering/workflow-builder/skills/workflow-builder/references/decision_and_intake_guide.md +83 -0
  727. package/engineering/workflow-builder/skills/workflow-builder/references/orchestration_patterns.md +160 -0
  728. package/engineering/workflow-builder/skills/workflow-builder/scripts/scaffold_workflow.py +211 -0
  729. package/engineering/workflow-builder/skills/workflow-builder/scripts/validate_workflow.py +274 -0
  730. package/engineering/workflow-builder/skills/workflow-builder/scripts/workflow_intake.py +233 -0
  731. package/engineering/write-a-skill/.claude-plugin/plugin.json +21 -0
  732. package/engineering/write-a-skill/README.md +44 -0
  733. package/engineering/write-a-skill/agents/cs-skill-author.md +149 -0
  734. package/engineering/write-a-skill/commands/cs-write-a-skill.md +140 -0
  735. package/engineering/write-a-skill/skills/write-a-skill/SKILL.md +141 -0
  736. package/engineering/write-a-skill/skills/write-a-skill/references/companion_tooling.md +67 -0
  737. package/engineering/write-a-skill/skills/write-a-skill/references/description_design_patterns.md +139 -0
  738. package/engineering/write-a-skill/skills/write-a-skill/references/progressive_disclosure_principles.md +89 -0
  739. package/engineering/write-a-skill/skills/write-a-skill/references/quality_gates_for_skills.md +158 -0
  740. package/engineering/write-a-skill/skills/write-a-skill/scripts/skill_description_validator.py +255 -0
  741. package/engineering/write-a-skill/skills/write-a-skill/scripts/skill_review_checklist_runner.py +268 -0
  742. package/engineering/write-a-skill/skills/write-a-skill/scripts/skill_structure_validator.py +277 -0
  743. package/engineering/write-docs/SKILL.md +167 -0
  744. package/engineering-team/.claude-plugin/plugin.json +13 -0
  745. package/engineering-team/.codex/instructions.md +40 -0
  746. package/engineering-team/CLAUDE.md +322 -0
  747. package/engineering-team/README.md +608 -0
  748. package/engineering-team/START_HERE.md +354 -0
  749. package/engineering-team/TEAM_STRUCTURE_GUIDE.md +630 -0
  750. package/engineering-team/a11y-audit/.claude-plugin/plugin.json +15 -0
  751. package/engineering-team/a11y-audit/README.md +46 -0
  752. package/engineering-team/a11y-audit/settings.json +15 -0
  753. package/engineering-team/a11y-audit/skills/a11y-audit/SKILL.md +211 -0
  754. package/engineering-team/a11y-audit/skills/a11y-audit/assets/sample-component.tsx +51 -0
  755. package/engineering-team/a11y-audit/skills/a11y-audit/expected_outputs/sample-contrast-output.txt +39 -0
  756. package/engineering-team/a11y-audit/skills/a11y-audit/expected_outputs/sample-scan-output.json +34 -0
  757. package/engineering-team/a11y-audit/skills/a11y-audit/expected_outputs/sample-scan-report.md +63 -0
  758. package/engineering-team/a11y-audit/skills/a11y-audit/references/aria-patterns.md +223 -0
  759. package/engineering-team/a11y-audit/skills/a11y-audit/references/audit-report-template.md +46 -0
  760. package/engineering-team/a11y-audit/skills/a11y-audit/references/ci-cd-integration.md +127 -0
  761. package/engineering-team/a11y-audit/skills/a11y-audit/references/color-contrast-guide.md +83 -0
  762. package/engineering-team/a11y-audit/skills/a11y-audit/references/examples-by-framework.md +312 -0
  763. package/engineering-team/a11y-audit/skills/a11y-audit/references/framework-a11y-patterns.md +661 -0
  764. package/engineering-team/a11y-audit/skills/a11y-audit/references/testing-checklist.md +41 -0
  765. package/engineering-team/a11y-audit/skills/a11y-audit/references/wcag-22-new-criteria.md +79 -0
  766. package/engineering-team/a11y-audit/skills/a11y-audit/references/wcag-quick-ref.md +113 -0
  767. package/engineering-team/a11y-audit/skills/a11y-audit/scripts/a11y_scanner.py +684 -0
  768. package/engineering-team/a11y-audit/skills/a11y-audit/scripts/contrast_checker.py +499 -0
  769. package/engineering-team/aws-solution-architect.zip +0 -0
  770. package/engineering-team/code-reviewer.zip +0 -0
  771. package/engineering-team/google-workspace-cli/.claude-plugin/plugin.json +15 -0
  772. package/engineering-team/google-workspace-cli/skills/google-workspace-cli/SKILL.md +373 -0
  773. package/engineering-team/google-workspace-cli/skills/google-workspace-cli/assets/persona-profiles.md +223 -0
  774. package/engineering-team/google-workspace-cli/skills/google-workspace-cli/assets/workspace-config.json +61 -0
  775. package/engineering-team/google-workspace-cli/skills/google-workspace-cli/references/gws-command-reference.md +313 -0
  776. package/engineering-team/google-workspace-cli/skills/google-workspace-cli/references/recipes-cookbook.md +344 -0
  777. package/engineering-team/google-workspace-cli/skills/google-workspace-cli/references/troubleshooting.md +323 -0
  778. package/engineering-team/google-workspace-cli/skills/google-workspace-cli/scripts/auth_setup_guide.py +390 -0
  779. package/engineering-team/google-workspace-cli/skills/google-workspace-cli/scripts/gws_doctor.py +245 -0
  780. package/engineering-team/google-workspace-cli/skills/google-workspace-cli/scripts/gws_recipe_runner.py +399 -0
  781. package/engineering-team/google-workspace-cli/skills/google-workspace-cli/scripts/output_analyzer.py +332 -0
  782. package/engineering-team/google-workspace-cli/skills/google-workspace-cli/scripts/workspace_audit.py +309 -0
  783. package/engineering-team/ms365-tenant-manager.zip +0 -0
  784. package/engineering-team/playwright-pro/.claude-plugin/plugin.json +15 -0
  785. package/engineering-team/playwright-pro/.mcp.json +27 -0
  786. package/engineering-team/playwright-pro/CLAUDE.md +84 -0
  787. package/engineering-team/playwright-pro/LICENSE +21 -0
  788. package/engineering-team/playwright-pro/README.md +133 -0
  789. package/engineering-team/playwright-pro/agents/migration-planner.md +122 -0
  790. package/engineering-team/playwright-pro/agents/test-architect.md +106 -0
  791. package/engineering-team/playwright-pro/agents/test-debugger.md +130 -0
  792. package/engineering-team/playwright-pro/hooks/detect-playwright.sh +23 -0
  793. package/engineering-team/playwright-pro/hooks/hooks.json +25 -0
  794. package/engineering-team/playwright-pro/hooks/validate-test.sh +58 -0
  795. package/engineering-team/playwright-pro/integrations/browserstack-mcp/package.json +18 -0
  796. package/engineering-team/playwright-pro/integrations/browserstack-mcp/src/client.ts +97 -0
  797. package/engineering-team/playwright-pro/integrations/browserstack-mcp/src/index.ts +183 -0
  798. package/engineering-team/playwright-pro/integrations/browserstack-mcp/src/types.ts +61 -0
  799. package/engineering-team/playwright-pro/integrations/browserstack-mcp/tsconfig.json +14 -0
  800. package/engineering-team/playwright-pro/integrations/testrail-mcp/package.json +18 -0
  801. package/engineering-team/playwright-pro/integrations/testrail-mcp/src/client.ts +147 -0
  802. package/engineering-team/playwright-pro/integrations/testrail-mcp/src/index.ts +270 -0
  803. package/engineering-team/playwright-pro/integrations/testrail-mcp/src/types.ts +105 -0
  804. package/engineering-team/playwright-pro/integrations/testrail-mcp/tsconfig.json +14 -0
  805. package/engineering-team/playwright-pro/settings.json +8 -0
  806. package/engineering-team/playwright-pro/skills/browserstack/SKILL.md +168 -0
  807. package/engineering-team/playwright-pro/skills/coverage/SKILL.md +98 -0
  808. package/engineering-team/playwright-pro/skills/fix/SKILL.md +113 -0
  809. package/engineering-team/playwright-pro/skills/fix/flaky-taxonomy.md +134 -0
  810. package/engineering-team/playwright-pro/skills/generate/SKILL.md +144 -0
  811. package/engineering-team/playwright-pro/skills/generate/patterns.md +163 -0
  812. package/engineering-team/playwright-pro/skills/init/SKILL.md +201 -0
  813. package/engineering-team/playwright-pro/skills/migrate/SKILL.md +135 -0
  814. package/engineering-team/playwright-pro/skills/migrate/cypress-mapping.md +79 -0
  815. package/engineering-team/playwright-pro/skills/migrate/selenium-mapping.md +94 -0
  816. package/engineering-team/playwright-pro/skills/pw/SKILL.md +124 -0
  817. package/engineering-team/playwright-pro/skills/pw/reference/assertions.md +89 -0
  818. package/engineering-team/playwright-pro/skills/pw/reference/common-pitfalls.md +137 -0
  819. package/engineering-team/playwright-pro/skills/pw/reference/fixtures.md +121 -0
  820. package/engineering-team/playwright-pro/skills/pw/reference/flaky-tests.md +56 -0
  821. package/engineering-team/playwright-pro/skills/pw/reference/golden-rules.md +12 -0
  822. package/engineering-team/playwright-pro/skills/pw/reference/locators.md +77 -0
  823. package/engineering-team/playwright-pro/skills/pw/templates/README.md +123 -0
  824. package/engineering-team/playwright-pro/skills/pw/templates/accessibility/color-contrast.md +162 -0
  825. package/engineering-team/playwright-pro/skills/pw/templates/accessibility/keyboard-navigation.md +149 -0
  826. package/engineering-team/playwright-pro/skills/pw/templates/accessibility/screen-reader.md +159 -0
  827. package/engineering-team/playwright-pro/skills/pw/templates/api/auth-headers.md +148 -0
  828. package/engineering-team/playwright-pro/skills/pw/templates/api/error-responses.md +157 -0
  829. package/engineering-team/playwright-pro/skills/pw/templates/api/graphql.md +174 -0
  830. package/engineering-team/playwright-pro/skills/pw/templates/api/rate-limiting.md +152 -0
  831. package/engineering-team/playwright-pro/skills/pw/templates/api/rest-crud.md +152 -0
  832. package/engineering-team/playwright-pro/skills/pw/templates/auth/login.md +119 -0
  833. package/engineering-team/playwright-pro/skills/pw/templates/auth/logout.md +112 -0
  834. package/engineering-team/playwright-pro/skills/pw/templates/auth/mfa.md +125 -0
  835. package/engineering-team/playwright-pro/skills/pw/templates/auth/password-reset.md +129 -0
  836. package/engineering-team/playwright-pro/skills/pw/templates/auth/rbac.md +132 -0
  837. package/engineering-team/playwright-pro/skills/pw/templates/auth/remember-me.md +127 -0
  838. package/engineering-team/playwright-pro/skills/pw/templates/auth/session-timeout.md +113 -0
  839. package/engineering-team/playwright-pro/skills/pw/templates/auth/sso.md +115 -0
  840. package/engineering-team/playwright-pro/skills/pw/templates/checkout/add-to-cart.md +112 -0
  841. package/engineering-team/playwright-pro/skills/pw/templates/checkout/apply-coupon.md +123 -0
  842. package/engineering-team/playwright-pro/skills/pw/templates/checkout/order-confirm.md +108 -0
  843. package/engineering-team/playwright-pro/skills/pw/templates/checkout/order-history.md +119 -0
  844. package/engineering-team/playwright-pro/skills/pw/templates/checkout/payment.md +148 -0
  845. package/engineering-team/playwright-pro/skills/pw/templates/checkout/update-quantity.md +125 -0
  846. package/engineering-team/playwright-pro/skills/pw/templates/crud/bulk-operations.md +129 -0
  847. package/engineering-team/playwright-pro/skills/pw/templates/crud/create.md +118 -0
  848. package/engineering-team/playwright-pro/skills/pw/templates/crud/delete.md +116 -0
  849. package/engineering-team/playwright-pro/skills/pw/templates/crud/read.md +117 -0
  850. package/engineering-team/playwright-pro/skills/pw/templates/crud/soft-delete.md +113 -0
  851. package/engineering-team/playwright-pro/skills/pw/templates/crud/update.md +129 -0
  852. package/engineering-team/playwright-pro/skills/pw/templates/dashboard/chart-rendering.md +131 -0
  853. package/engineering-team/playwright-pro/skills/pw/templates/dashboard/data-loading.md +128 -0
  854. package/engineering-team/playwright-pro/skills/pw/templates/dashboard/date-range-filter.md +136 -0
  855. package/engineering-team/playwright-pro/skills/pw/templates/dashboard/export.md +146 -0
  856. package/engineering-team/playwright-pro/skills/pw/templates/dashboard/realtime-updates.md +143 -0
  857. package/engineering-team/playwright-pro/skills/pw/templates/forms/autosave.md +135 -0
  858. package/engineering-team/playwright-pro/skills/pw/templates/forms/conditional-fields.md +120 -0
  859. package/engineering-team/playwright-pro/skills/pw/templates/forms/file-upload.md +136 -0
  860. package/engineering-team/playwright-pro/skills/pw/templates/forms/multi-step.md +137 -0
  861. package/engineering-team/playwright-pro/skills/pw/templates/forms/single-step.md +124 -0
  862. package/engineering-team/playwright-pro/skills/pw/templates/forms/validation.md +141 -0
  863. package/engineering-team/playwright-pro/skills/pw/templates/notifications/in-app.md +125 -0
  864. package/engineering-team/playwright-pro/skills/pw/templates/notifications/notification-center.md +128 -0
  865. package/engineering-team/playwright-pro/skills/pw/templates/notifications/toast-messages.md +139 -0
  866. package/engineering-team/playwright-pro/skills/pw/templates/onboarding/email-verification.md +118 -0
  867. package/engineering-team/playwright-pro/skills/pw/templates/onboarding/first-time-setup.md +130 -0
  868. package/engineering-team/playwright-pro/skills/pw/templates/onboarding/registration.md +131 -0
  869. package/engineering-team/playwright-pro/skills/pw/templates/onboarding/welcome-tour.md +128 -0
  870. package/engineering-team/playwright-pro/skills/pw/templates/search/basic-search.md +118 -0
  871. package/engineering-team/playwright-pro/skills/pw/templates/search/empty-state.md +109 -0
  872. package/engineering-team/playwright-pro/skills/pw/templates/search/filters.md +128 -0
  873. package/engineering-team/playwright-pro/skills/pw/templates/search/pagination.md +123 -0
  874. package/engineering-team/playwright-pro/skills/pw/templates/search/sorting.md +131 -0
  875. package/engineering-team/playwright-pro/skills/pw/templates/settings/account-delete.md +136 -0
  876. package/engineering-team/playwright-pro/skills/pw/templates/settings/notification-prefs.md +139 -0
  877. package/engineering-team/playwright-pro/skills/pw/templates/settings/password-change.md +143 -0
  878. package/engineering-team/playwright-pro/skills/pw/templates/settings/profile-update.md +130 -0
  879. package/engineering-team/playwright-pro/skills/report/SKILL.md +126 -0
  880. package/engineering-team/playwright-pro/skills/review/SKILL.md +102 -0
  881. package/engineering-team/playwright-pro/skills/review/anti-patterns.md +182 -0
  882. package/engineering-team/playwright-pro/skills/testrail/SKILL.md +129 -0
  883. package/engineering-team/self-improving-agent/.claude-plugin/plugin.json +15 -0
  884. package/engineering-team/self-improving-agent/CLAUDE.md +84 -0
  885. package/engineering-team/self-improving-agent/LICENSE +21 -0
  886. package/engineering-team/self-improving-agent/README.md +92 -0
  887. package/engineering-team/self-improving-agent/agents/memory-analyst.md +82 -0
  888. package/engineering-team/self-improving-agent/agents/skill-extractor.md +133 -0
  889. package/engineering-team/self-improving-agent/hooks/error-capture.sh +119 -0
  890. package/engineering-team/self-improving-agent/hooks/hooks.json +15 -0
  891. package/engineering-team/self-improving-agent/reference/memory-architecture.md +131 -0
  892. package/engineering-team/self-improving-agent/reference/promotion-rules.md +83 -0
  893. package/engineering-team/self-improving-agent/reference/rules-directory-patterns.md +137 -0
  894. package/engineering-team/self-improving-agent/settings.json +28 -0
  895. package/engineering-team/self-improving-agent/skills/extract/SKILL.md +193 -0
  896. package/engineering-team/self-improving-agent/skills/promote/SKILL.md +144 -0
  897. package/engineering-team/self-improving-agent/skills/remember/SKILL.md +98 -0
  898. package/engineering-team/self-improving-agent/skills/review/SKILL.md +126 -0
  899. package/engineering-team/self-improving-agent/skills/self-improving-agent/SKILL.md +162 -0
  900. package/engineering-team/self-improving-agent/skills/status/SKILL.md +103 -0
  901. package/engineering-team/self-improving-agent/templates/rule-template.md +17 -0
  902. package/engineering-team/self-improving-agent/templates/skill-template.md +53 -0
  903. package/engineering-team/senior-architect.zip +0 -0
  904. package/engineering-team/senior-backend.zip +0 -0
  905. package/engineering-team/senior-computer-vision.zip +0 -0
  906. package/engineering-team/senior-data-engineer.zip +0 -0
  907. package/engineering-team/senior-data-scientist.zip +0 -0
  908. package/engineering-team/senior-devops.zip +0 -0
  909. package/engineering-team/senior-frontend.zip +0 -0
  910. package/engineering-team/senior-fullstack.zip +0 -0
  911. package/engineering-team/senior-ml-engineer.zip +0 -0
  912. package/engineering-team/senior-prompt-engineer.zip +0 -0
  913. package/engineering-team/senior-qa.zip +0 -0
  914. package/engineering-team/senior-secops.zip +0 -0
  915. package/engineering-team/senior-security.zip +0 -0
  916. package/engineering-team/skills/adversarial-reviewer/SKILL.md +247 -0
  917. package/engineering-team/skills/ai-security/SKILL.md +364 -0
  918. package/engineering-team/skills/ai-security/references/atlas-coverage.md +150 -0
  919. package/engineering-team/skills/ai-security/scripts/ai_threat_scanner.py +564 -0
  920. package/engineering-team/skills/aws-solution-architect/SKILL.md +381 -0
  921. package/engineering-team/skills/aws-solution-architect/assets/expected_output.json +55 -0
  922. package/engineering-team/skills/aws-solution-architect/assets/sample_input.json +18 -0
  923. package/engineering-team/skills/aws-solution-architect/references/architecture_patterns.md +535 -0
  924. package/engineering-team/skills/aws-solution-architect/references/best_practices.md +631 -0
  925. package/engineering-team/skills/aws-solution-architect/references/service_selection.md +484 -0
  926. package/engineering-team/skills/aws-solution-architect/scripts/architecture_designer.py +808 -0
  927. package/engineering-team/skills/aws-solution-architect/scripts/cost_optimizer.py +346 -0
  928. package/engineering-team/skills/aws-solution-architect/scripts/serverless_stack.py +663 -0
  929. package/engineering-team/skills/azure-cloud-architect/SKILL.md +463 -0
  930. package/engineering-team/skills/azure-cloud-architect/references/architecture_patterns.md +413 -0
  931. package/engineering-team/skills/azure-cloud-architect/references/best_practices.md +337 -0
  932. package/engineering-team/skills/azure-cloud-architect/references/service_selection.md +250 -0
  933. package/engineering-team/skills/azure-cloud-architect/scripts/architecture_designer.py +592 -0
  934. package/engineering-team/skills/azure-cloud-architect/scripts/bicep_generator.py +775 -0
  935. package/engineering-team/skills/azure-cloud-architect/scripts/cost_optimizer.py +492 -0
  936. package/engineering-team/skills/cloud-security/SKILL.md +343 -0
  937. package/engineering-team/skills/cloud-security/references/cspm-checks.md +109 -0
  938. package/engineering-team/skills/cloud-security/scripts/cloud_posture_check.py +1180 -0
  939. package/engineering-team/skills/code-reviewer/README.md +92 -0
  940. package/engineering-team/skills/code-reviewer/SKILL.md +183 -0
  941. package/engineering-team/skills/code-reviewer/assets/sample_c_clean.c +71 -0
  942. package/engineering-team/skills/code-reviewer/assets/sample_c_smells.c +66 -0
  943. package/engineering-team/skills/code-reviewer/assets/sample_csharp_clean.cs +100 -0
  944. package/engineering-team/skills/code-reviewer/assets/sample_csharp_smells.cs +78 -0
  945. package/engineering-team/skills/code-reviewer/assets/sample_java_clean.java +55 -0
  946. package/engineering-team/skills/code-reviewer/assets/sample_java_smells.java +56 -0
  947. package/engineering-team/skills/code-reviewer/expected_outputs/sample_c_clean_quality.json +65 -0
  948. package/engineering-team/skills/code-reviewer/expected_outputs/sample_c_smells_quality.json +155 -0
  949. package/engineering-team/skills/code-reviewer/expected_outputs/sample_csharp_clean_quality.json +135 -0
  950. package/engineering-team/skills/code-reviewer/expected_outputs/sample_csharp_smells_quality.json +143 -0
  951. package/engineering-team/skills/code-reviewer/expected_outputs/sample_java_clean_quality.json +53 -0
  952. package/engineering-team/skills/code-reviewer/expected_outputs/sample_java_smells_quality.json +83 -0
  953. package/engineering-team/skills/code-reviewer/languages/c.md +103 -0
  954. package/engineering-team/skills/code-reviewer/languages/cpp.md +103 -0
  955. package/engineering-team/skills/code-reviewer/languages/csharp.md +97 -0
  956. package/engineering-team/skills/code-reviewer/languages/dart.md +108 -0
  957. package/engineering-team/skills/code-reviewer/languages/go.md +92 -0
  958. package/engineering-team/skills/code-reviewer/languages/java.md +103 -0
  959. package/engineering-team/skills/code-reviewer/languages/kotlin.md +88 -0
  960. package/engineering-team/skills/code-reviewer/languages/php.md +109 -0
  961. package/engineering-team/skills/code-reviewer/languages/python.md +94 -0
  962. package/engineering-team/skills/code-reviewer/languages/ruby.md +105 -0
  963. package/engineering-team/skills/code-reviewer/languages/rust.md +99 -0
  964. package/engineering-team/skills/code-reviewer/languages/swift.md +88 -0
  965. package/engineering-team/skills/code-reviewer/languages/typescript.md +97 -0
  966. package/engineering-team/skills/code-reviewer/rules/universal.md +49 -0
  967. package/engineering-team/skills/code-reviewer/scripts/code_quality_checker.py +1020 -0
  968. package/engineering-team/skills/code-reviewer/scripts/pr_analyzer.py +535 -0
  969. package/engineering-team/skills/code-reviewer/scripts/review_report_generator.py +505 -0
  970. package/engineering-team/skills/email-template-builder/SKILL.md +439 -0
  971. package/engineering-team/skills/engineering-skills/SKILL.md +91 -0
  972. package/engineering-team/skills/epic-design/SKILL.md +353 -0
  973. package/engineering-team/skills/epic-design/references/accessibility.md +378 -0
  974. package/engineering-team/skills/epic-design/references/asset-pipeline.md +135 -0
  975. package/engineering-team/skills/epic-design/references/depth-system.md +361 -0
  976. package/engineering-team/skills/epic-design/references/directional-reveals.md +455 -0
  977. package/engineering-team/skills/epic-design/references/examples.md +344 -0
  978. package/engineering-team/skills/epic-design/references/inter-section-effects.md +493 -0
  979. package/engineering-team/skills/epic-design/references/motion-system.md +531 -0
  980. package/engineering-team/skills/epic-design/references/performance.md +261 -0
  981. package/engineering-team/skills/epic-design/references/text-animations.md +709 -0
  982. package/engineering-team/skills/epic-design/scripts/inspect-assets.py +269 -0
  983. package/engineering-team/skills/epic-design/scripts/validate-layers.js +165 -0
  984. package/engineering-team/skills/gcp-cloud-architect/SKILL.md +444 -0
  985. package/engineering-team/skills/gcp-cloud-architect/references/architecture_patterns.md +512 -0
  986. package/engineering-team/skills/gcp-cloud-architect/references/best_practices.md +467 -0
  987. package/engineering-team/skills/gcp-cloud-architect/references/service_selection.md +547 -0
  988. package/engineering-team/skills/gcp-cloud-architect/scripts/architecture_designer.py +805 -0
  989. package/engineering-team/skills/gcp-cloud-architect/scripts/cost_optimizer.py +465 -0
  990. package/engineering-team/skills/gcp-cloud-architect/scripts/deployment_manager.py +835 -0
  991. package/engineering-team/skills/incident-commander/README.md +252 -0
  992. package/engineering-team/skills/incident-commander/SKILL.md +476 -0
  993. package/engineering-team/skills/incident-commander/assets/incident_report_template.md +171 -0
  994. package/engineering-team/skills/incident-commander/assets/runbook_template.md +289 -0
  995. package/engineering-team/skills/incident-commander/assets/sample_incident_classification.json +14 -0
  996. package/engineering-team/skills/incident-commander/assets/sample_incident_data.json +276 -0
  997. package/engineering-team/skills/incident-commander/assets/sample_incident_pir_data.json +74 -0
  998. package/engineering-team/skills/incident-commander/assets/sample_timeline_events.json +263 -0
  999. package/engineering-team/skills/incident-commander/assets/simple_incident.json +6 -0
  1000. package/engineering-team/skills/incident-commander/assets/simple_timeline_events.json +30 -0
  1001. package/engineering-team/skills/incident-commander/expected_outputs/incident_classification_text_output.txt +44 -0
  1002. package/engineering-team/skills/incident-commander/expected_outputs/pir_markdown_output.md +88 -0
  1003. package/engineering-team/skills/incident-commander/expected_outputs/simple_incident_classification.txt +44 -0
  1004. package/engineering-team/skills/incident-commander/expected_outputs/timeline_reconstruction_text_output.txt +110 -0
  1005. package/engineering-team/skills/incident-commander/references/communication_templates.md +591 -0
  1006. package/engineering-team/skills/incident-commander/references/incident-response-framework.md +372 -0
  1007. package/engineering-team/skills/incident-commander/references/incident_severity_matrix.md +292 -0
  1008. package/engineering-team/skills/incident-commander/references/rca_frameworks_guide.md +562 -0
  1009. package/engineering-team/skills/incident-commander/references/reference-information.md +201 -0
  1010. package/engineering-team/skills/incident-commander/references/sla-management-guide.md +566 -0
  1011. package/engineering-team/skills/incident-commander/scripts/incident_classifier.py +914 -0
  1012. package/engineering-team/skills/incident-commander/scripts/incident_timeline_builder.py +742 -0
  1013. package/engineering-team/skills/incident-commander/scripts/pir_generator.py +1638 -0
  1014. package/engineering-team/skills/incident-commander/scripts/postmortem_generator.py +804 -0
  1015. package/engineering-team/skills/incident-commander/scripts/severity_classifier.py +1228 -0
  1016. package/engineering-team/skills/incident-commander/scripts/timeline_reconstructor.py +1007 -0
  1017. package/engineering-team/skills/incident-response/SKILL.md +322 -0
  1018. package/engineering-team/skills/incident-response/references/regulatory-deadlines.md +125 -0
  1019. package/engineering-team/skills/incident-response/scripts/incident_triage.py +768 -0
  1020. package/engineering-team/skills/ms365-tenant-manager/SKILL.md +273 -0
  1021. package/engineering-team/skills/ms365-tenant-manager/expected_output.json +86 -0
  1022. package/engineering-team/skills/ms365-tenant-manager/references/powershell-templates.md +704 -0
  1023. package/engineering-team/skills/ms365-tenant-manager/references/security-policies.md +357 -0
  1024. package/engineering-team/skills/ms365-tenant-manager/references/troubleshooting.md +411 -0
  1025. package/engineering-team/skills/ms365-tenant-manager/sample_input.json +21 -0
  1026. package/engineering-team/skills/ms365-tenant-manager/scripts/powershell_generator.py +430 -0
  1027. package/engineering-team/skills/ms365-tenant-manager/scripts/tenant_setup.py +447 -0
  1028. package/engineering-team/skills/ms365-tenant-manager/scripts/user_management.py +447 -0
  1029. package/engineering-team/skills/red-team/SKILL.md +335 -0
  1030. package/engineering-team/skills/red-team/references/attack-path-methodology.md +135 -0
  1031. package/engineering-team/skills/red-team/scripts/engagement_planner.py +420 -0
  1032. package/engineering-team/skills/security-pen-testing/SKILL.md +306 -0
  1033. package/engineering-team/skills/security-pen-testing/references/attack_patterns.md +629 -0
  1034. package/engineering-team/skills/security-pen-testing/references/owasp_top_10_checklist.md +440 -0
  1035. package/engineering-team/skills/security-pen-testing/references/responsible_disclosure.md +317 -0
  1036. package/engineering-team/skills/security-pen-testing/scripts/dependency_auditor.py +455 -0
  1037. package/engineering-team/skills/security-pen-testing/scripts/pentest_report_generator.py +462 -0
  1038. package/engineering-team/skills/security-pen-testing/scripts/vulnerability_scanner.py +545 -0
  1039. package/engineering-team/skills/senior-architect/SKILL.md +343 -0
  1040. package/engineering-team/skills/senior-architect/references/architecture_patterns.md +470 -0
  1041. package/engineering-team/skills/senior-architect/references/system_design_workflows.md +536 -0
  1042. package/engineering-team/skills/senior-architect/references/tech_decision_guide.md +412 -0
  1043. package/engineering-team/skills/senior-architect/scripts/architecture_diagram_generator.py +660 -0
  1044. package/engineering-team/skills/senior-architect/scripts/dependency_analyzer.py +615 -0
  1045. package/engineering-team/skills/senior-architect/scripts/project_architect.py +749 -0
  1046. package/engineering-team/skills/senior-backend/SKILL.md +467 -0
  1047. package/engineering-team/skills/senior-backend/profiles/django-monolith.json +57 -0
  1048. package/engineering-team/skills/senior-backend/profiles/fastapi-python.json +58 -0
  1049. package/engineering-team/skills/senior-backend/profiles/go-or-rust-microservice.json +62 -0
  1050. package/engineering-team/skills/senior-backend/profiles/node-express.json +57 -0
  1051. package/engineering-team/skills/senior-backend/references/api_design_patterns.md +530 -0
  1052. package/engineering-team/skills/senior-backend/references/backend_security_practices.md +1075 -0
  1053. package/engineering-team/skills/senior-backend/references/composition_map.md +58 -0
  1054. package/engineering-team/skills/senior-backend/references/database_optimization_guide.md +593 -0
  1055. package/engineering-team/skills/senior-backend/references/forcing_questions.md +100 -0
  1056. package/engineering-team/skills/senior-backend/scripts/api_load_tester.py +607 -0
  1057. package/engineering-team/skills/senior-backend/scripts/api_scaffolder.py +645 -0
  1058. package/engineering-team/skills/senior-backend/scripts/backend_decision_engine.py +397 -0
  1059. package/engineering-team/skills/senior-backend/scripts/database_migration_tool.py +858 -0
  1060. package/engineering-team/skills/senior-computer-vision/SKILL.md +438 -0
  1061. package/engineering-team/skills/senior-computer-vision/references/computer_vision_architectures.md +683 -0
  1062. package/engineering-team/skills/senior-computer-vision/references/object_detection_optimization.md +885 -0
  1063. package/engineering-team/skills/senior-computer-vision/references/production_vision_systems.md +1226 -0
  1064. package/engineering-team/skills/senior-computer-vision/references/reference-docs-and-commands.md +96 -0
  1065. package/engineering-team/skills/senior-computer-vision/scripts/dataset_pipeline_builder.py +1699 -0
  1066. package/engineering-team/skills/senior-computer-vision/scripts/inference_optimizer.py +557 -0
  1067. package/engineering-team/skills/senior-computer-vision/scripts/vision_model_trainer.py +576 -0
  1068. package/engineering-team/skills/senior-data-engineer/SKILL.md +191 -0
  1069. package/engineering-team/skills/senior-data-engineer/references/data_modeling_patterns.md +1058 -0
  1070. package/engineering-team/skills/senior-data-engineer/references/data_pipeline_architecture.md +1100 -0
  1071. package/engineering-team/skills/senior-data-engineer/references/dataops_best_practices.md +1502 -0
  1072. package/engineering-team/skills/senior-data-engineer/references/troubleshooting.md +183 -0
  1073. package/engineering-team/skills/senior-data-engineer/references/workflows.md +624 -0
  1074. package/engineering-team/skills/senior-data-engineer/scripts/data_quality_validator.py +1636 -0
  1075. package/engineering-team/skills/senior-data-engineer/scripts/etl_performance_optimizer.py +1685 -0
  1076. package/engineering-team/skills/senior-data-engineer/scripts/pipeline_orchestrator.py +883 -0
  1077. package/engineering-team/skills/senior-data-scientist/SKILL.md +223 -0
  1078. package/engineering-team/skills/senior-data-scientist/references/experiment_design_frameworks.md +80 -0
  1079. package/engineering-team/skills/senior-data-scientist/references/feature_engineering_patterns.md +80 -0
  1080. package/engineering-team/skills/senior-data-scientist/references/statistical_methods_advanced.md +80 -0
  1081. package/engineering-team/skills/senior-data-scientist/scripts/experiment_designer.py +100 -0
  1082. package/engineering-team/skills/senior-data-scientist/scripts/feature_engineering_pipeline.py +100 -0
  1083. package/engineering-team/skills/senior-data-scientist/scripts/model_evaluation_suite.py +100 -0
  1084. package/engineering-team/skills/senior-devops/SKILL.md +323 -0
  1085. package/engineering-team/skills/senior-devops/references/cicd_pipeline_guide.md +103 -0
  1086. package/engineering-team/skills/senior-devops/references/deployment_strategies.md +103 -0
  1087. package/engineering-team/skills/senior-devops/references/infrastructure_as_code.md +103 -0
  1088. package/engineering-team/skills/senior-devops/scripts/deployment_manager.py +114 -0
  1089. package/engineering-team/skills/senior-devops/scripts/pipeline_generator.py +114 -0
  1090. package/engineering-team/skills/senior-devops/scripts/terraform_scaffolder.py +114 -0
  1091. package/engineering-team/skills/senior-frontend/SKILL.md +572 -0
  1092. package/engineering-team/skills/senior-frontend/profiles/astro-or-static.json +59 -0
  1093. package/engineering-team/skills/senior-frontend/profiles/next-app-router.json +60 -0
  1094. package/engineering-team/skills/senior-frontend/profiles/remix-or-sveltekit.json +56 -0
  1095. package/engineering-team/skills/senior-frontend/profiles/vite-spa.json +56 -0
  1096. package/engineering-team/skills/senior-frontend/references/composition_map.md +50 -0
  1097. package/engineering-team/skills/senior-frontend/references/forcing_questions.md +102 -0
  1098. package/engineering-team/skills/senior-frontend/references/frontend_best_practices.md +806 -0
  1099. package/engineering-team/skills/senior-frontend/references/nextjs_optimization_guide.md +724 -0
  1100. package/engineering-team/skills/senior-frontend/references/react_patterns.md +746 -0
  1101. package/engineering-team/skills/senior-frontend/scripts/bundle_analyzer.py +407 -0
  1102. package/engineering-team/skills/senior-frontend/scripts/component_generator.py +329 -0
  1103. package/engineering-team/skills/senior-frontend/scripts/frontend_decision_engine.py +327 -0
  1104. package/engineering-team/skills/senior-frontend/scripts/frontend_scaffolder.py +1005 -0
  1105. package/engineering-team/skills/senior-fullstack/SKILL.md +412 -0
  1106. package/engineering-team/skills/senior-fullstack/profiles/enterprise-scale.json +75 -0
  1107. package/engineering-team/skills/senior-fullstack/profiles/internal-tool.json +60 -0
  1108. package/engineering-team/skills/senior-fullstack/profiles/marketing-site.json +65 -0
  1109. package/engineering-team/skills/senior-fullstack/profiles/saas-startup.json +71 -0
  1110. package/engineering-team/skills/senior-fullstack/references/architecture_patterns.md +547 -0
  1111. package/engineering-team/skills/senior-fullstack/references/composition_map.md +52 -0
  1112. package/engineering-team/skills/senior-fullstack/references/development_workflows.md +784 -0
  1113. package/engineering-team/skills/senior-fullstack/references/forcing_questions.md +100 -0
  1114. package/engineering-team/skills/senior-fullstack/references/tech_stack_guide.md +590 -0
  1115. package/engineering-team/skills/senior-fullstack/scripts/code_quality_analyzer.py +691 -0
  1116. package/engineering-team/skills/senior-fullstack/scripts/fullstack_decision_engine.py +403 -0
  1117. package/engineering-team/skills/senior-fullstack/scripts/project_scaffolder.py +867 -0
  1118. package/engineering-team/skills/senior-ml-engineer/SKILL.md +304 -0
  1119. package/engineering-team/skills/senior-ml-engineer/references/llm_integration_guide.md +317 -0
  1120. package/engineering-team/skills/senior-ml-engineer/references/mlops_production_patterns.md +265 -0
  1121. package/engineering-team/skills/senior-ml-engineer/references/rag_system_architecture.md +371 -0
  1122. package/engineering-team/skills/senior-ml-engineer/scripts/ml_monitoring_suite.py +100 -0
  1123. package/engineering-team/skills/senior-ml-engineer/scripts/model_deployment_pipeline.py +100 -0
  1124. package/engineering-team/skills/senior-ml-engineer/scripts/rag_system_builder.py +100 -0
  1125. package/engineering-team/skills/senior-prompt-engineer/SKILL.md +355 -0
  1126. package/engineering-team/skills/senior-prompt-engineer/references/agentic_system_design.md +646 -0
  1127. package/engineering-team/skills/senior-prompt-engineer/references/llm_evaluation_frameworks.md +524 -0
  1128. package/engineering-team/skills/senior-prompt-engineer/references/prompt_engineering_patterns.md +572 -0
  1129. package/engineering-team/skills/senior-prompt-engineer/scripts/agent_orchestrator.py +560 -0
  1130. package/engineering-team/skills/senior-prompt-engineer/scripts/prompt_optimizer.py +519 -0
  1131. package/engineering-team/skills/senior-prompt-engineer/scripts/rag_evaluator.py +574 -0
  1132. package/engineering-team/skills/senior-qa/README.md +196 -0
  1133. package/engineering-team/skills/senior-qa/SKILL.md +331 -0
  1134. package/engineering-team/skills/senior-qa/references/qa_best_practices.md +964 -0
  1135. package/engineering-team/skills/senior-qa/references/test_automation_patterns.md +1009 -0
  1136. package/engineering-team/skills/senior-qa/references/testing_strategies.md +649 -0
  1137. package/engineering-team/skills/senior-qa/scripts/coverage_analyzer.py +836 -0
  1138. package/engineering-team/skills/senior-qa/scripts/e2e_test_scaffolder.py +820 -0
  1139. package/engineering-team/skills/senior-qa/scripts/test_suite_generator.py +605 -0
  1140. package/engineering-team/skills/senior-secops/SKILL.md +505 -0
  1141. package/engineering-team/skills/senior-secops/references/compliance_requirements.md +792 -0
  1142. package/engineering-team/skills/senior-secops/references/security_standards.md +718 -0
  1143. package/engineering-team/skills/senior-secops/references/vulnerability_management_guide.md +487 -0
  1144. package/engineering-team/skills/senior-secops/scripts/compliance_checker.py +1107 -0
  1145. package/engineering-team/skills/senior-secops/scripts/security_scanner.py +471 -0
  1146. package/engineering-team/skills/senior-secops/scripts/vulnerability_assessor.py +563 -0
  1147. package/engineering-team/skills/senior-security/SKILL.md +444 -0
  1148. package/engineering-team/skills/senior-security/references/cryptography-implementation.md +775 -0
  1149. package/engineering-team/skills/senior-security/references/security-architecture-patterns.md +615 -0
  1150. package/engineering-team/skills/senior-security/references/threat-modeling-guide.md +518 -0
  1151. package/engineering-team/skills/senior-security/scripts/secret_scanner.py +516 -0
  1152. package/engineering-team/skills/senior-security/scripts/threat_modeler.py +609 -0
  1153. package/engineering-team/skills/skill-authoring/SKILL.md +125 -0
  1154. package/engineering-team/skills/stripe-integration-expert/SKILL.md +476 -0
  1155. package/engineering-team/skills/tdd-guide/HOW_TO_USE.md +313 -0
  1156. package/engineering-team/skills/tdd-guide/README.md +680 -0
  1157. package/engineering-team/skills/tdd-guide/SKILL.md +403 -0
  1158. package/engineering-team/skills/tdd-guide/assets/expected_output.json +77 -0
  1159. package/engineering-team/skills/tdd-guide/assets/sample_coverage_report.lcov +56 -0
  1160. package/engineering-team/skills/tdd-guide/assets/sample_input_python.json +39 -0
  1161. package/engineering-team/skills/tdd-guide/assets/sample_input_typescript.json +36 -0
  1162. package/engineering-team/skills/tdd-guide/references/ci-integration.md +195 -0
  1163. package/engineering-team/skills/tdd-guide/references/framework-guide.md +206 -0
  1164. package/engineering-team/skills/tdd-guide/references/tdd-best-practices.md +128 -0
  1165. package/engineering-team/skills/tdd-guide/scripts/coverage_analyzer.py +434 -0
  1166. package/engineering-team/skills/tdd-guide/scripts/fixture_generator.py +440 -0
  1167. package/engineering-team/skills/tdd-guide/scripts/format_detector.py +384 -0
  1168. package/engineering-team/skills/tdd-guide/scripts/framework_adapter.py +428 -0
  1169. package/engineering-team/skills/tdd-guide/scripts/metrics_calculator.py +456 -0
  1170. package/engineering-team/skills/tdd-guide/scripts/output_formatter.py +354 -0
  1171. package/engineering-team/skills/tdd-guide/scripts/tdd_workflow.py +474 -0
  1172. package/engineering-team/skills/tdd-guide/scripts/test_generator.py +438 -0
  1173. package/engineering-team/skills/tech-stack-evaluator/SKILL.md +184 -0
  1174. package/engineering-team/skills/tech-stack-evaluator/assets/expected_output_comparison.json +82 -0
  1175. package/engineering-team/skills/tech-stack-evaluator/assets/sample_input_structured.json +39 -0
  1176. package/engineering-team/skills/tech-stack-evaluator/assets/sample_input_tco.json +42 -0
  1177. package/engineering-team/skills/tech-stack-evaluator/assets/sample_input_text.json +4 -0
  1178. package/engineering-team/skills/tech-stack-evaluator/references/examples.md +383 -0
  1179. package/engineering-team/skills/tech-stack-evaluator/references/metrics.md +242 -0
  1180. package/engineering-team/skills/tech-stack-evaluator/references/workflows.md +362 -0
  1181. package/engineering-team/skills/tech-stack-evaluator/scripts/ecosystem_analyzer.py +501 -0
  1182. package/engineering-team/skills/tech-stack-evaluator/scripts/format_detector.py +430 -0
  1183. package/engineering-team/skills/tech-stack-evaluator/scripts/migration_analyzer.py +587 -0
  1184. package/engineering-team/skills/tech-stack-evaluator/scripts/report_generator.py +460 -0
  1185. package/engineering-team/skills/tech-stack-evaluator/scripts/security_assessor.py +518 -0
  1186. package/engineering-team/skills/tech-stack-evaluator/scripts/stack_comparator.py +389 -0
  1187. package/engineering-team/skills/tech-stack-evaluator/scripts/tco_calculator.py +458 -0
  1188. package/engineering-team/skills/threat-detection/SKILL.md +299 -0
  1189. package/engineering-team/skills/threat-detection/references/hunt-playbooks.md +145 -0
  1190. package/engineering-team/skills/threat-detection/scripts/threat_signal_analyzer.py +571 -0
  1191. package/engineering-team/snowflake-development/.claude-plugin/plugin.json +15 -0
  1192. package/engineering-team/snowflake-development/skills/snowflake-development/SKILL.md +294 -0
  1193. package/engineering-team/snowflake-development/skills/snowflake-development/references/cortex_ai_and_agents.md +280 -0
  1194. package/engineering-team/snowflake-development/skills/snowflake-development/references/snowflake_sql_and_pipelines.md +281 -0
  1195. package/engineering-team/snowflake-development/skills/snowflake-development/references/troubleshooting.md +155 -0
  1196. package/engineering-team/snowflake-development/skills/snowflake-development/scripts/snowflake_query_helper.py +233 -0
  1197. package/engineering-team/tdd-guide.zip +0 -0
  1198. package/engineering-team/tech-stack-evaluator.zip +0 -0
  1199. package/finance/business-investment-advisor/SKILL.md +220 -0
  1200. package/finance/finance-skills/SKILL.md +55 -0
  1201. package/finance/financial-analyst/SKILL.md +148 -0
  1202. package/finance/saas-metrics-coach/SKILL.md +158 -0
  1203. package/marketing/ab-test-setup/SKILL.md +302 -0
  1204. package/marketing/ad-creative/SKILL.md +267 -0
  1205. package/marketing/aeo/SKILL.md +214 -0
  1206. package/marketing/ai-seo/SKILL.md +331 -0
  1207. package/marketing/analytics-tracking/SKILL.md +371 -0
  1208. package/marketing/app-store-optimization/SKILL.md +486 -0
  1209. package/marketing/brand-guidelines/SKILL.md +93 -0
  1210. package/marketing/campaign-analytics/SKILL.md +228 -0
  1211. package/marketing/churn-prevention/SKILL.md +240 -0
  1212. package/marketing/cold-email/SKILL.md +272 -0
  1213. package/marketing/competitor-alternatives/SKILL.md +290 -0
  1214. package/marketing/content-creator/SKILL.md +55 -0
  1215. package/marketing/content-humanizer/SKILL.md +261 -0
  1216. package/marketing/content-production/SKILL.md +245 -0
  1217. package/marketing/content-strategy/SKILL.md +127 -0
  1218. package/marketing/copy-editing/SKILL.md +491 -0
  1219. package/marketing/copywriting/SKILL.md +296 -0
  1220. package/marketing/email-sequence/SKILL.md +135 -0
  1221. package/marketing/form-cro/SKILL.md +204 -0
  1222. package/marketing/free-tool-strategy/SKILL.md +272 -0
  1223. package/marketing/landing/SKILL.md +346 -0
  1224. package/marketing/launch-strategy/SKILL.md +74 -0
  1225. package/marketing/marketing-context/SKILL.md +169 -0
  1226. package/marketing/marketing-demand-acquisition/SKILL.md +312 -0
  1227. package/marketing/marketing-ideas/SKILL.md +211 -0
  1228. package/marketing/marketing-ops/SKILL.md +190 -0
  1229. package/marketing/marketing-psychology/SKILL.md +123 -0
  1230. package/marketing/marketing-skills/SKILL.md +105 -0
  1231. package/marketing/marketing-strategy-pmm/SKILL.md +398 -0
  1232. package/marketing/onboarding-cro/SKILL.md +251 -0
  1233. package/marketing/page-cro/SKILL.md +222 -0
  1234. package/marketing/paid-ads/SKILL.md +347 -0
  1235. package/marketing/paywall-upgrade-cro/SKILL.md +258 -0
  1236. package/marketing/popup-cro/SKILL.md +229 -0
  1237. package/marketing/pricing-strategy/SKILL.md +323 -0
  1238. package/marketing/programmatic-seo/SKILL.md +278 -0
  1239. package/marketing/prompt-engineer-toolkit/SKILL.md +138 -0
  1240. package/marketing/referral-program/SKILL.md +286 -0
  1241. package/marketing/schema-markup/SKILL.md +233 -0
  1242. package/marketing/seo-audit/SKILL.md +154 -0
  1243. package/marketing/signup-flow-cro/SKILL.md +225 -0
  1244. package/marketing/site-architecture/SKILL.md +289 -0
  1245. package/marketing/social-content/SKILL.md +323 -0
  1246. package/marketing/social-media-analyzer/SKILL.md +309 -0
  1247. package/marketing/social-media-manager/SKILL.md +197 -0
  1248. package/marketing/webinar-marketing/SKILL.md +202 -0
  1249. package/marketing/x-twitter-growth/SKILL.md +226 -0
  1250. package/marketing/youtube-full/SKILL.md +171 -0
  1251. package/package.json +94 -73
  1252. package/product/agile-product-owner/SKILL.md +409 -0
  1253. package/product/apple-hig-expert/SKILL.md +90 -0
  1254. package/product/code-to-prd/SKILL.md +507 -0
  1255. package/product/competitive-teardown/SKILL.md +171 -0
  1256. package/product/experiment-designer/SKILL.md +104 -0
  1257. package/product/landing-page-generator/SKILL.md +198 -0
  1258. package/product/product-analytics/SKILL.md +147 -0
  1259. package/product/product-discovery/SKILL.md +114 -0
  1260. package/product/product-manager-toolkit/SKILL.md +352 -0
  1261. package/product/product-skills/SKILL.md +61 -0
  1262. package/product/product-strategist/SKILL.md +227 -0
  1263. package/product/research-summarizer/SKILL.md +274 -0
  1264. package/product/roadmap-communicator/SKILL.md +92 -0
  1265. package/product/saas-scaffolder/SKILL.md +293 -0
  1266. package/product/spec-to-repo/SKILL.md +274 -0
  1267. package/product/ui-design-system/SKILL.md +379 -0
  1268. package/product/ux-researcher-designer/SKILL.md +419 -0
  1269. package/productivity/andreessen/SKILL.md +178 -0
  1270. package/productivity/capture/SKILL.md +212 -0
  1271. package/productivity/handoff/SKILL.md +197 -0
  1272. package/productivity/inbox-setup/SKILL.md +229 -0
  1273. package/productivity/inbox-triage/SKILL.md +312 -0
  1274. package/productivity/reflect/SKILL.md +182 -0
  1275. package/project-management/atlassian-admin/SKILL.md +234 -0
  1276. package/project-management/atlassian-templates/SKILL.md +252 -0
  1277. package/project-management/confluence-expert/SKILL.md +375 -0
  1278. package/project-management/jira-expert/SKILL.md +305 -0
  1279. package/project-management/meeting-analyzer/SKILL.md +255 -0
  1280. package/project-management/pm-skills/SKILL.md +59 -0
  1281. package/project-management/scrum-master/SKILL.md +222 -0
  1282. package/project-management/senior-pm/SKILL.md +408 -0
  1283. package/project-management/team-communications/SKILL.md +67 -0
  1284. package/research/dossier/.claude-plugin/plugin.json +20 -0
  1285. package/research/dossier/README.md +59 -0
  1286. package/research/dossier/agents/cs-dossier.md +81 -0
  1287. package/research/dossier/commands/cs-dossier.md +141 -0
  1288. package/research/dossier/skills/dossier/SKILL.md +318 -0
  1289. package/research/dossier/skills/dossier/references/conversation_hook_quality.md +135 -0
  1290. package/research/dossier/skills/dossier/references/hypothesis_testing_discipline.md +158 -0
  1291. package/research/dossier/skills/dossier/references/subject_type_source_matrix.md +203 -0
  1292. package/research/dossier/skills/dossier/scripts/citation_tracker.py +286 -0
  1293. package/research/dossier/skills/dossier/scripts/disconfirming_evidence_balance.py +205 -0
  1294. package/research/dossier/skills/dossier/scripts/source_tier_classifier.py +238 -0
  1295. package/research/grants/.claude-plugin/plugin.json +20 -0
  1296. package/research/grants/README.md +54 -0
  1297. package/research/grants/agents/cs-grants.md +75 -0
  1298. package/research/grants/commands/cs-grants.md +128 -0
  1299. package/research/grants/skills/grants/SKILL.md +286 -0
  1300. package/research/grants/skills/grants/references/docx_9_sections.md +289 -0
  1301. package/research/grants/skills/grants/references/nih_mechanism_matching.md +163 -0
  1302. package/research/grants/skills/grants/references/reporter_post_patterns.md +194 -0
  1303. package/research/grants/skills/grants/scripts/citation_tracker.py +303 -0
  1304. package/research/grants/skills/grants/scripts/fiscal_year_calculator.py +95 -0
  1305. package/research/grants/skills/grants/scripts/mechanism_matcher.py +216 -0
  1306. package/research/litreview/.claude-plugin/plugin.json +20 -0
  1307. package/research/litreview/README.md +75 -0
  1308. package/research/litreview/agents/cs-litreview.md +171 -0
  1309. package/research/litreview/commands/cs-litreview.md +143 -0
  1310. package/research/litreview/skills/litreview/SKILL.md +251 -0
  1311. package/research/litreview/skills/litreview/references/docx_8_sections.md +287 -0
  1312. package/research/litreview/skills/litreview/references/framework_selection.md +174 -0
  1313. package/research/litreview/skills/litreview/references/search_budget_allocation.md +200 -0
  1314. package/research/litreview/skills/litreview/scripts/citation_tracker.py +258 -0
  1315. package/research/litreview/skills/litreview/scripts/cross_search_aggregator.py +239 -0
  1316. package/research/litreview/skills/litreview/scripts/framework_recommender.py +204 -0
  1317. package/research/notebooklm/.claude-plugin/plugin.json +20 -0
  1318. package/research/notebooklm/README.md +69 -0
  1319. package/research/notebooklm/agents/cs-notebooklm.md +83 -0
  1320. package/research/notebooklm/commands/cs-notebooklm.md +152 -0
  1321. package/research/notebooklm/skills/notebooklm/SKILL.md +290 -0
  1322. package/research/notebooklm/skills/notebooklm/references/async_action_discipline.md +206 -0
  1323. package/research/notebooklm/skills/notebooklm/references/browser_automation_canon.md +192 -0
  1324. package/research/notebooklm/skills/notebooklm/references/studio_output_custom_prompts.md +217 -0
  1325. package/research/notebooklm/skills/notebooklm/scripts/action_router.py +272 -0
  1326. package/research/notebooklm/skills/notebooklm/scripts/async_action_classifier.py +237 -0
  1327. package/research/notebooklm/skills/notebooklm/scripts/custom_prompt_template_generator.py +270 -0
  1328. package/research/patent/.claude-plugin/plugin.json +20 -0
  1329. package/research/patent/README.md +61 -0
  1330. package/research/patent/agents/cs-patent.md +76 -0
  1331. package/research/patent/commands/cs-patent.md +101 -0
  1332. package/research/patent/skills/patent/SKILL.md +287 -0
  1333. package/research/patent/skills/patent/references/cpc_classification_canon.md +154 -0
  1334. package/research/patent/skills/patent/references/legal_disclaimer_discipline.md +137 -0
  1335. package/research/patent/skills/patent/references/sub_use_case_routing.md +252 -0
  1336. package/research/patent/skills/patent/scripts/citation_tracker.py +241 -0
  1337. package/research/patent/skills/patent/scripts/family_resolver.py +260 -0
  1338. package/research/patent/skills/patent/scripts/sub_use_case_router.py +255 -0
  1339. package/research/pulse/.claude-plugin/plugin.json +19 -0
  1340. package/research/pulse/README.md +57 -0
  1341. package/research/pulse/agents/cs-pulse.md +201 -0
  1342. package/research/pulse/commands/cs-pulse.md +129 -0
  1343. package/research/pulse/skills/pulse/SKILL.md +258 -0
  1344. package/research/pulse/skills/pulse/references/cross_platform_synthesis.md +181 -0
  1345. package/research/pulse/skills/pulse/references/parallel_execution_discipline.md +156 -0
  1346. package/research/pulse/skills/pulse/references/research_pack_conventions.md +108 -0
  1347. package/research/pulse/skills/pulse/scripts/citation_tracker.py +251 -0
  1348. package/research/pulse/skills/pulse/scripts/time_window_calculator.py +140 -0
  1349. package/research/pulse/skills/pulse/scripts/topic_slug_generator.py +145 -0
  1350. package/research/research/.claude-plugin/plugin.json +28 -0
  1351. package/research/research/README.md +72 -0
  1352. package/research/research/agents/cs-research.md +90 -0
  1353. package/research/research/commands/cs-research.md +169 -0
  1354. package/research/research/skills/research/SKILL.md +319 -0
  1355. package/research/research/skills/research/references/deterministic_classification_canon.md +162 -0
  1356. package/research/research/skills/research/references/fallback_workflow_canon.md +214 -0
  1357. package/research/research/skills/research/references/hybrid_router_architecture.md +154 -0
  1358. package/research/research/skills/research/scripts/classifier.py +156 -0
  1359. package/research/research/skills/research/scripts/fallback_decomposer.py +107 -0
  1360. package/research/research/skills/research/scripts/routing_transparency_logger.py +200 -0
  1361. package/research/syllabus/.claude-plugin/plugin.json +20 -0
  1362. package/research/syllabus/README.md +68 -0
  1363. package/research/syllabus/agents/cs-syllabus.md +84 -0
  1364. package/research/syllabus/commands/cs-syllabus.md +143 -0
  1365. package/research/syllabus/skills/syllabus/SKILL.md +293 -0
  1366. package/research/syllabus/skills/syllabus/references/applied_domain_weaving.md +148 -0
  1367. package/research/syllabus/skills/syllabus/references/audience_calibration.md +167 -0
  1368. package/research/syllabus/skills/syllabus/references/bundled_script_pattern.md +150 -0
  1369. package/research/syllabus/skills/syllabus/scripts/citation_tracker.py +217 -0
  1370. package/research/syllabus/skills/syllabus/scripts/discussion_question_validator.py +196 -0
  1371. package/research/syllabus/skills/syllabus/scripts/generate_reading_list.js +395 -0
  1372. package/research/syllabus/skills/syllabus/scripts/topic_grouper.py +198 -0
  1373. package/research-ops/.claude-plugin/plugin.json +24 -0
  1374. package/research-ops/CLAUDE.md +62 -0
  1375. package/research-ops/agents/cs-research-ops-orchestrator.md +94 -0
  1376. package/research-ops/commands/cs-clinical-research.md +40 -0
  1377. package/research-ops/commands/cs-grill-research-ops.md +77 -0
  1378. package/research-ops/commands/cs-market-research.md +40 -0
  1379. package/research-ops/commands/cs-product-research.md +41 -0
  1380. package/research-ops/commands/cs-research-finance.md +39 -0
  1381. package/research-ops/commands/cs-research-ops.md +43 -0
  1382. package/research-ops/skills/clinical-research/SKILL.md +146 -0
  1383. package/research-ops/skills/clinical-research/assets/protocol_synopsis_template.md +57 -0
  1384. package/research-ops/skills/clinical-research/references/endpoint_and_power.md +37 -0
  1385. package/research-ops/skills/clinical-research/references/study_design_canon.md +36 -0
  1386. package/research-ops/skills/clinical-research/references/trial_operations.md +33 -0
  1387. package/research-ops/skills/clinical-research/scripts/ar_evaluator.py +74 -0
  1388. package/research-ops/skills/clinical-research/scripts/config_loader.py +123 -0
  1389. package/research-ops/skills/clinical-research/scripts/endpoint_selector.py +183 -0
  1390. package/research-ops/skills/clinical-research/scripts/onboard.py +144 -0
  1391. package/research-ops/skills/clinical-research/scripts/phase_gate_scorer.py +234 -0
  1392. package/research-ops/skills/clinical-research/scripts/sample_size_estimator.py +205 -0
  1393. package/research-ops/skills/market-research/SKILL.md +146 -0
  1394. package/research-ops/skills/market-research/assets/market_research_brief_template.md +36 -0
  1395. package/research-ops/skills/market-research/references/market_sizing_canon.md +36 -0
  1396. package/research-ops/skills/market-research/references/segmentation_and_ci.md +43 -0
  1397. package/research-ops/skills/market-research/references/survey_methodology.md +39 -0
  1398. package/research-ops/skills/market-research/scripts/ar_evaluator.py +77 -0
  1399. package/research-ops/skills/market-research/scripts/config_loader.py +114 -0
  1400. package/research-ops/skills/market-research/scripts/market_sizer.py +162 -0
  1401. package/research-ops/skills/market-research/scripts/onboard.py +117 -0
  1402. package/research-ops/skills/market-research/scripts/sample_size_planner.py +183 -0
  1403. package/research-ops/skills/market-research/scripts/segmentation_scorer.py +139 -0
  1404. package/research-ops/skills/product-research/SKILL.md +145 -0
  1405. package/research-ops/skills/product-research/assets/research_plan_template.md +50 -0
  1406. package/research-ops/skills/product-research/references/repository_and_synthesis.md +28 -0
  1407. package/research-ops/skills/product-research/references/research_methods_canon.md +34 -0
  1408. package/research-ops/skills/product-research/references/sampling_and_saturation.md +29 -0
  1409. package/research-ops/skills/product-research/scripts/ar_evaluator.py +68 -0
  1410. package/research-ops/skills/product-research/scripts/config_loader.py +114 -0
  1411. package/research-ops/skills/product-research/scripts/insight_synthesizer.py +113 -0
  1412. package/research-ops/skills/product-research/scripts/onboard.py +124 -0
  1413. package/research-ops/skills/product-research/scripts/saturation_planner.py +144 -0
  1414. package/research-ops/skills/product-research/scripts/study_designer.py +139 -0
  1415. package/research-ops/skills/research-finance/SKILL.md +146 -0
  1416. package/research-ops/skills/research-finance/assets/rd_program_budget_template.md +48 -0
  1417. package/research-ops/skills/research-finance/references/burn_and_portfolio.md +28 -0
  1418. package/research-ops/skills/research-finance/references/indirect_rate_modeling.md +42 -0
  1419. package/research-ops/skills/research-finance/references/rd_program_finance_canon.md +29 -0
  1420. package/research-ops/skills/research-finance/scripts/ar_evaluator.py +74 -0
  1421. package/research-ops/skills/research-finance/scripts/burn_runway_tracker.py +153 -0
  1422. package/research-ops/skills/research-finance/scripts/capex_vs_opex_router.py +189 -0
  1423. package/research-ops/skills/research-finance/scripts/config_loader.py +115 -0
  1424. package/research-ops/skills/research-finance/scripts/onboard.py +120 -0
  1425. package/research-ops/skills/research-finance/scripts/program_budget_planner.py +165 -0
  1426. package/research-ops/skills/research-ops-skills/SKILL.md +156 -0
  1427. package/superpowers/brainstorming/SKILL.md +146 -0
  1428. package/superpowers/dispatching-parallel-agents/SKILL.md +146 -0
  1429. package/superpowers/executing-plans/SKILL.md +140 -0
  1430. package/superpowers/finding-duplicate-functions/SKILL.md +161 -0
  1431. package/superpowers/finishing-a-development-branch/SKILL.md +225 -0
  1432. package/superpowers/mcp-cli/SKILL.md +135 -0
  1433. package/superpowers/receiving-code-review/SKILL.md +158 -0
  1434. package/superpowers/requesting-code-review/SKILL.md +181 -0
  1435. package/superpowers/subagent-driven-development/SKILL.md +144 -0
  1436. package/superpowers/systematic-debugging/SKILL.md +165 -0
  1437. package/superpowers/test-driven-development/SKILL.md +165 -0
  1438. package/superpowers/using-git-worktrees/SKILL.md +169 -0
  1439. package/superpowers/using-superpowers/SKILL.md +117 -0
  1440. package/superpowers/using-tmux-for-interactive-commands/SKILL.md +187 -0
  1441. package/superpowers/verification-before-completion/SKILL.md +168 -0
  1442. package/superpowers/windows-vm/SKILL.md +205 -0
  1443. package/superpowers/writing-plans/SKILL.md +155 -0
  1444. package/superpowers/writing-skills/SKILL.md +195 -0
@@ -0,0 +1,1685 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ ETL Performance Optimizer
4
+ Comprehensive ETL/ELT performance analysis and optimization tool.
5
+
6
+ Features:
7
+ - SQL query analysis and optimization recommendations
8
+ - Spark job configuration analysis
9
+ - Data skew detection and mitigation
10
+ - Partition strategy recommendations
11
+ - Join optimization suggestions
12
+ - Memory and shuffle analysis
13
+ - Cost estimation for cloud warehouses
14
+
15
+ Usage:
16
+ python etl_performance_optimizer.py analyze-sql query.sql
17
+ python etl_performance_optimizer.py analyze-spark spark-history.json
18
+ python etl_performance_optimizer.py optimize-partition data_stats.json
19
+ python etl_performance_optimizer.py estimate-cost query.sql --warehouse snowflake
20
+ """
21
+
22
+ import os
23
+ import sys
24
+ import json
25
+ import re
26
+ import argparse
27
+ import logging
28
+ import math
29
+ from pathlib import Path
30
+ from typing import Dict, List, Optional, Any, Tuple, Set
31
+ from dataclasses import dataclass, field, asdict
32
+ from datetime import datetime
33
+ from collections import defaultdict
34
+ from abc import ABC, abstractmethod
35
+
36
+ logging.basicConfig(
37
+ level=logging.INFO,
38
+ format='%(asctime)s - %(levelname)s - %(message)s'
39
+ )
40
+ logger = logging.getLogger(__name__)
41
+
42
+
43
+ # =============================================================================
44
+ # Data Classes
45
+ # =============================================================================
46
+
47
+ @dataclass
48
+ class SQLQueryInfo:
49
+ """Parsed information about a SQL query"""
50
+ query_type: str # SELECT, INSERT, UPDATE, DELETE, MERGE, CREATE
51
+ tables: List[str]
52
+ columns: List[str]
53
+ joins: List[Dict[str, str]]
54
+ where_conditions: List[str]
55
+ group_by: List[str]
56
+ order_by: List[str]
57
+ aggregations: List[str]
58
+ subqueries: int
59
+ distinct: bool
60
+ limit: Optional[int]
61
+ ctes: List[str]
62
+ window_functions: List[str]
63
+ estimated_complexity: str # low, medium, high, very_high
64
+
65
+
66
+ @dataclass
67
+ class OptimizationRecommendation:
68
+ """A single optimization recommendation"""
69
+ category: str # index, partition, join, filter, aggregation, memory, shuffle
70
+ severity: str # critical, high, medium, low
71
+ title: str
72
+ description: str
73
+ current_issue: str
74
+ recommendation: str
75
+ expected_improvement: str
76
+ implementation: str
77
+ priority: int = 1
78
+
79
+
80
+ @dataclass
81
+ class SparkJobMetrics:
82
+ """Metrics from a Spark job"""
83
+ job_id: str
84
+ duration_ms: int
85
+ stages: int
86
+ tasks: int
87
+ shuffle_read_bytes: int
88
+ shuffle_write_bytes: int
89
+ input_bytes: int
90
+ output_bytes: int
91
+ peak_memory_bytes: int
92
+ gc_time_ms: int
93
+ failed_tasks: int
94
+ speculative_tasks: int
95
+ skew_ratio: float # max_task_time / median_task_time
96
+
97
+
98
+ @dataclass
99
+ class PartitionStrategy:
100
+ """Recommended partition strategy"""
101
+ column: str
102
+ partition_type: str # range, hash, list
103
+ num_partitions: Optional[int]
104
+ partition_size_mb: float
105
+ reasoning: str
106
+ implementation: str
107
+
108
+
109
+ @dataclass
110
+ class CostEstimate:
111
+ """Cost estimate for a query"""
112
+ warehouse: str
113
+ compute_cost: float
114
+ storage_cost: float
115
+ data_transfer_cost: float
116
+ total_cost: float
117
+ currency: str = "USD"
118
+ assumptions: List[str] = field(default_factory=list)
119
+
120
+
121
+ # =============================================================================
122
+ # SQL Parser
123
+ # =============================================================================
124
+
125
+ class SQLParser:
126
+ """Parse and analyze SQL queries"""
127
+
128
+ # Common SQL patterns
129
+ PATTERNS = {
130
+ 'select': re.compile(r'\bSELECT\b', re.IGNORECASE),
131
+ 'from': re.compile(r'\bFROM\b', re.IGNORECASE),
132
+ 'join': re.compile(r'\b(INNER|LEFT|RIGHT|FULL|CROSS)?\s*JOIN\b', re.IGNORECASE),
133
+ 'where': re.compile(r'\bWHERE\b', re.IGNORECASE),
134
+ 'group_by': re.compile(r'\bGROUP\s+BY\b', re.IGNORECASE),
135
+ 'order_by': re.compile(r'\bORDER\s+BY\b', re.IGNORECASE),
136
+ 'having': re.compile(r'\bHAVING\b', re.IGNORECASE),
137
+ 'distinct': re.compile(r'\bDISTINCT\b', re.IGNORECASE),
138
+ 'limit': re.compile(r'\bLIMIT\s+(\d+)', re.IGNORECASE),
139
+ 'cte': re.compile(r'\bWITH\b', re.IGNORECASE),
140
+ 'subquery': re.compile(r'\(\s*SELECT\b', re.IGNORECASE),
141
+ 'window': re.compile(r'\bOVER\s*\(', re.IGNORECASE),
142
+ 'aggregation': re.compile(r'\b(COUNT|SUM|AVG|MIN|MAX|STDDEV|VARIANCE)\s*\(', re.IGNORECASE),
143
+ 'insert': re.compile(r'\bINSERT\s+INTO\b', re.IGNORECASE),
144
+ 'update': re.compile(r'\bUPDATE\b', re.IGNORECASE),
145
+ 'delete': re.compile(r'\bDELETE\s+FROM\b', re.IGNORECASE),
146
+ 'merge': re.compile(r'\bMERGE\s+INTO\b', re.IGNORECASE),
147
+ 'create': re.compile(r'\bCREATE\s+(TABLE|VIEW|INDEX)\b', re.IGNORECASE),
148
+ }
149
+
150
+ def parse(self, sql: str) -> SQLQueryInfo:
151
+ """Parse a SQL query and extract information"""
152
+ # Clean up the query
153
+ sql = self._clean_sql(sql)
154
+
155
+ # Determine query type
156
+ query_type = self._detect_query_type(sql)
157
+
158
+ # Extract tables
159
+ tables = self._extract_tables(sql)
160
+
161
+ # Extract columns (for SELECT queries)
162
+ columns = self._extract_columns(sql) if query_type == 'SELECT' else []
163
+
164
+ # Extract joins
165
+ joins = self._extract_joins(sql)
166
+
167
+ # Extract WHERE conditions
168
+ where_conditions = self._extract_where_conditions(sql)
169
+
170
+ # Extract GROUP BY
171
+ group_by = self._extract_group_by(sql)
172
+
173
+ # Extract ORDER BY
174
+ order_by = self._extract_order_by(sql)
175
+
176
+ # Extract aggregations
177
+ aggregations = self._extract_aggregations(sql)
178
+
179
+ # Count subqueries
180
+ subqueries = len(self.PATTERNS['subquery'].findall(sql))
181
+
182
+ # Check for DISTINCT
183
+ distinct = bool(self.PATTERNS['distinct'].search(sql))
184
+
185
+ # Extract LIMIT
186
+ limit_match = self.PATTERNS['limit'].search(sql)
187
+ limit = int(limit_match.group(1)) if limit_match else None
188
+
189
+ # Extract CTEs
190
+ ctes = self._extract_ctes(sql)
191
+
192
+ # Extract window functions
193
+ window_functions = self._extract_window_functions(sql)
194
+
195
+ # Estimate complexity
196
+ complexity = self._estimate_complexity(
197
+ tables, joins, subqueries, aggregations, window_functions
198
+ )
199
+
200
+ return SQLQueryInfo(
201
+ query_type=query_type,
202
+ tables=tables,
203
+ columns=columns,
204
+ joins=joins,
205
+ where_conditions=where_conditions,
206
+ group_by=group_by,
207
+ order_by=order_by,
208
+ aggregations=aggregations,
209
+ subqueries=subqueries,
210
+ distinct=distinct,
211
+ limit=limit,
212
+ ctes=ctes,
213
+ window_functions=window_functions,
214
+ estimated_complexity=complexity
215
+ )
216
+
217
+ def _clean_sql(self, sql: str) -> str:
218
+ """Clean and normalize SQL"""
219
+ # Remove comments
220
+ sql = re.sub(r'--.*$', '', sql, flags=re.MULTILINE)
221
+ sql = re.sub(r'/\*.*?\*/', '', sql, flags=re.DOTALL)
222
+ # Normalize whitespace
223
+ sql = ' '.join(sql.split())
224
+ return sql
225
+
226
+ def _detect_query_type(self, sql: str) -> str:
227
+ """Detect the type of SQL query"""
228
+ sql_upper = sql.upper().strip()
229
+
230
+ if sql_upper.startswith('WITH') or sql_upper.startswith('SELECT'):
231
+ return 'SELECT'
232
+ elif self.PATTERNS['insert'].search(sql):
233
+ return 'INSERT'
234
+ elif self.PATTERNS['update'].search(sql):
235
+ return 'UPDATE'
236
+ elif self.PATTERNS['delete'].search(sql):
237
+ return 'DELETE'
238
+ elif self.PATTERNS['merge'].search(sql):
239
+ return 'MERGE'
240
+ elif self.PATTERNS['create'].search(sql):
241
+ return 'CREATE'
242
+ else:
243
+ return 'UNKNOWN'
244
+
245
+ def _extract_tables(self, sql: str) -> List[str]:
246
+ """Extract table names from SQL"""
247
+ tables = []
248
+
249
+ # FROM clause tables
250
+ from_pattern = re.compile(
251
+ r'\bFROM\s+([a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)?)',
252
+ re.IGNORECASE
253
+ )
254
+ tables.extend(from_pattern.findall(sql))
255
+
256
+ # JOIN clause tables
257
+ join_pattern = re.compile(
258
+ r'\bJOIN\s+([a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)?)',
259
+ re.IGNORECASE
260
+ )
261
+ tables.extend(join_pattern.findall(sql))
262
+
263
+ # INSERT INTO table
264
+ insert_pattern = re.compile(
265
+ r'\bINSERT\s+INTO\s+([a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)?)',
266
+ re.IGNORECASE
267
+ )
268
+ tables.extend(insert_pattern.findall(sql))
269
+
270
+ # UPDATE table
271
+ update_pattern = re.compile(
272
+ r'\bUPDATE\s+([a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)?)',
273
+ re.IGNORECASE
274
+ )
275
+ tables.extend(update_pattern.findall(sql))
276
+
277
+ return list(set(tables))
278
+
279
+ def _extract_columns(self, sql: str) -> List[str]:
280
+ """Extract column references from SELECT clause"""
281
+ # Find SELECT ... FROM
282
+ match = re.search(r'\bSELECT\s+(.*?)\s+FROM\b', sql, re.IGNORECASE | re.DOTALL)
283
+ if not match:
284
+ return []
285
+
286
+ select_clause = match.group(1)
287
+
288
+ # Handle SELECT *
289
+ if '*' in select_clause and 'COUNT(*)' not in select_clause.upper():
290
+ return ['*']
291
+
292
+ # Extract column names (simplified)
293
+ columns = []
294
+ for part in select_clause.split(','):
295
+ part = part.strip()
296
+ # Handle aliases
297
+ alias_match = re.search(r'\bAS\s+(\w+)\s*$', part, re.IGNORECASE)
298
+ if alias_match:
299
+ columns.append(alias_match.group(1))
300
+ else:
301
+ # Get the last identifier
302
+ col_match = re.search(r'([a-zA-Z_][a-zA-Z0-9_]*)(?:\s*$|\s+AS\b)', part, re.IGNORECASE)
303
+ if col_match:
304
+ columns.append(col_match.group(1))
305
+
306
+ return columns
307
+
308
+ def _extract_joins(self, sql: str) -> List[Dict[str, str]]:
309
+ """Extract join information"""
310
+ joins = []
311
+
312
+ join_pattern = re.compile(
313
+ r'\b(INNER|LEFT\s+OUTER?|RIGHT\s+OUTER?|FULL\s+OUTER?|CROSS)?\s*JOIN\s+'
314
+ r'([a-zA-Z_][a-zA-Z0-9_.]*)\s*(?:AS\s+)?(\w+)?\s*'
315
+ r'(?:ON\s+(.+?))?(?=\s+(?:INNER|LEFT|RIGHT|FULL|CROSS|WHERE|GROUP|ORDER|HAVING|LIMIT|$))',
316
+ re.IGNORECASE | re.DOTALL
317
+ )
318
+
319
+ for match in join_pattern.finditer(sql):
320
+ join_type = match.group(1) or 'INNER'
321
+ table = match.group(2)
322
+ alias = match.group(3)
323
+ condition = match.group(4)
324
+
325
+ joins.append({
326
+ 'type': join_type.strip().upper(),
327
+ 'table': table,
328
+ 'alias': alias,
329
+ 'condition': condition.strip() if condition else None
330
+ })
331
+
332
+ return joins
333
+
334
+ def _extract_where_conditions(self, sql: str) -> List[str]:
335
+ """Extract WHERE clause conditions"""
336
+ # Find WHERE ... (GROUP BY | ORDER BY | HAVING | LIMIT | end)
337
+ match = re.search(
338
+ r'\bWHERE\s+(.*?)(?=\s+(?:GROUP\s+BY|ORDER\s+BY|HAVING|LIMIT)|$)',
339
+ sql, re.IGNORECASE | re.DOTALL
340
+ )
341
+ if not match:
342
+ return []
343
+
344
+ where_clause = match.group(1).strip()
345
+
346
+ # Split by AND/OR (simplified)
347
+ conditions = re.split(r'\s+AND\s+|\s+OR\s+', where_clause, flags=re.IGNORECASE)
348
+ return [c.strip() for c in conditions if c.strip()]
349
+
350
+ def _extract_group_by(self, sql: str) -> List[str]:
351
+ """Extract GROUP BY columns"""
352
+ match = re.search(
353
+ r'\bGROUP\s+BY\s+(.*?)(?=\s+(?:HAVING|ORDER\s+BY|LIMIT)|$)',
354
+ sql, re.IGNORECASE | re.DOTALL
355
+ )
356
+ if not match:
357
+ return []
358
+
359
+ group_clause = match.group(1).strip()
360
+ columns = [c.strip() for c in group_clause.split(',')]
361
+ return columns
362
+
363
+ def _extract_order_by(self, sql: str) -> List[str]:
364
+ """Extract ORDER BY columns"""
365
+ match = re.search(
366
+ r'\bORDER\s+BY\s+(.*?)(?=\s+LIMIT|$)',
367
+ sql, re.IGNORECASE | re.DOTALL
368
+ )
369
+ if not match:
370
+ return []
371
+
372
+ order_clause = match.group(1).strip()
373
+ columns = [c.strip() for c in order_clause.split(',')]
374
+ return columns
375
+
376
+ def _extract_aggregations(self, sql: str) -> List[str]:
377
+ """Extract aggregation functions used"""
378
+ agg_pattern = re.compile(
379
+ r'\b(COUNT|SUM|AVG|MIN|MAX|STDDEV|VARIANCE|MEDIAN|PERCENTILE_CONT|PERCENTILE_DISC)\s*\(',
380
+ re.IGNORECASE
381
+ )
382
+ return list(set(m.upper() for m in agg_pattern.findall(sql)))
383
+
384
+ def _extract_ctes(self, sql: str) -> List[str]:
385
+ """Extract CTE names"""
386
+ cte_pattern = re.compile(
387
+ r'\bWITH\s+(\w+)\s+AS\s*\(|,\s*(\w+)\s+AS\s*\(',
388
+ re.IGNORECASE
389
+ )
390
+ ctes = []
391
+ for match in cte_pattern.finditer(sql):
392
+ cte_name = match.group(1) or match.group(2)
393
+ if cte_name:
394
+ ctes.append(cte_name)
395
+ return ctes
396
+
397
+ def _extract_window_functions(self, sql: str) -> List[str]:
398
+ """Extract window function patterns"""
399
+ window_pattern = re.compile(
400
+ r'\b(\w+)\s*\([^)]*\)\s+OVER\s*\(',
401
+ re.IGNORECASE
402
+ )
403
+ return list(set(m.upper() for m in window_pattern.findall(sql)))
404
+
405
+ def _estimate_complexity(self, tables: List[str], joins: List[Dict],
406
+ subqueries: int, aggregations: List[str],
407
+ window_functions: List[str]) -> str:
408
+ """Estimate query complexity"""
409
+ score = 0
410
+
411
+ # Table count
412
+ score += len(tables) * 10
413
+
414
+ # Join count and types
415
+ for join in joins:
416
+ if join['type'] in ('CROSS', 'FULL OUTER'):
417
+ score += 30
418
+ elif join['type'] in ('LEFT OUTER', 'RIGHT OUTER'):
419
+ score += 20
420
+ else:
421
+ score += 15
422
+
423
+ # Subqueries
424
+ score += subqueries * 25
425
+
426
+ # Aggregations
427
+ score += len(aggregations) * 5
428
+
429
+ # Window functions
430
+ score += len(window_functions) * 15
431
+
432
+ if score < 30:
433
+ return 'low'
434
+ elif score < 60:
435
+ return 'medium'
436
+ elif score < 100:
437
+ return 'high'
438
+ else:
439
+ return 'very_high'
440
+
441
+
442
+ # =============================================================================
443
+ # SQL Optimizer
444
+ # =============================================================================
445
+
446
+ class SQLOptimizer:
447
+ """Analyze SQL queries and provide optimization recommendations"""
448
+
449
+ def analyze(self, query_info: SQLQueryInfo, sql: str) -> List[OptimizationRecommendation]:
450
+ """Analyze a SQL query and generate optimization recommendations"""
451
+ recommendations = []
452
+
453
+ # Check for SELECT *
454
+ if '*' in query_info.columns:
455
+ recommendations.append(self._recommend_explicit_columns())
456
+
457
+ # Check for missing WHERE clause on large tables
458
+ if not query_info.where_conditions and query_info.tables:
459
+ recommendations.append(self._recommend_add_filters())
460
+
461
+ # Check for inefficient joins
462
+ join_recs = self._analyze_joins(query_info)
463
+ recommendations.extend(join_recs)
464
+
465
+ # Check for DISTINCT usage
466
+ if query_info.distinct:
467
+ recommendations.append(self._recommend_distinct_alternative())
468
+
469
+ # Check for ORDER BY without LIMIT
470
+ if query_info.order_by and not query_info.limit:
471
+ recommendations.append(self._recommend_add_limit())
472
+
473
+ # Check for subquery optimization
474
+ if query_info.subqueries > 0:
475
+ recommendations.append(self._recommend_cte_conversion())
476
+
477
+ # Check for index opportunities
478
+ index_recs = self._analyze_index_opportunities(query_info)
479
+ recommendations.extend(index_recs)
480
+
481
+ # Check for partition pruning
482
+ partition_recs = self._analyze_partition_pruning(query_info, sql)
483
+ recommendations.extend(partition_recs)
484
+
485
+ # Check for aggregation optimization
486
+ if query_info.aggregations and query_info.group_by:
487
+ agg_recs = self._analyze_aggregation(query_info)
488
+ recommendations.extend(agg_recs)
489
+
490
+ # Sort by priority
491
+ recommendations.sort(key=lambda r: r.priority)
492
+
493
+ return recommendations
494
+
495
+ def _recommend_explicit_columns(self) -> OptimizationRecommendation:
496
+ return OptimizationRecommendation(
497
+ category="query_structure",
498
+ severity="medium",
499
+ title="Avoid SELECT *",
500
+ description="Using SELECT * retrieves all columns, increasing I/O and memory usage.",
501
+ current_issue="Query uses SELECT * which fetches unnecessary columns",
502
+ recommendation="Specify only the columns you need",
503
+ expected_improvement="10-50% reduction in data scanned depending on table width",
504
+ implementation="Replace SELECT * with SELECT col1, col2, col3 ...",
505
+ priority=2
506
+ )
507
+
508
+ def _recommend_add_filters(self) -> OptimizationRecommendation:
509
+ return OptimizationRecommendation(
510
+ category="filter",
511
+ severity="high",
512
+ title="Add WHERE Clause Filters",
513
+ description="Query scans entire tables without filtering, causing full table scans.",
514
+ current_issue="No WHERE clause filters found - full table scan required",
515
+ recommendation="Add appropriate WHERE conditions to filter data early",
516
+ expected_improvement="Up to 90%+ reduction in data processed if highly selective",
517
+ implementation="Add WHERE column = value or WHERE date_column >= '2024-01-01'",
518
+ priority=1
519
+ )
520
+
521
+ def _analyze_joins(self, query_info: SQLQueryInfo) -> List[OptimizationRecommendation]:
522
+ """Analyze joins for optimization opportunities"""
523
+ recommendations = []
524
+
525
+ for join in query_info.joins:
526
+ # Check for CROSS JOIN
527
+ if join['type'] == 'CROSS':
528
+ recommendations.append(OptimizationRecommendation(
529
+ category="join",
530
+ severity="critical",
531
+ title="Avoid CROSS JOIN",
532
+ description="CROSS JOIN creates a Cartesian product, which can explode data volume.",
533
+ current_issue=f"CROSS JOIN with table {join['table']} detected",
534
+ recommendation="Replace with appropriate INNER/LEFT JOIN with ON condition",
535
+ expected_improvement="Exponential reduction in intermediate data",
536
+ implementation=f"Convert CROSS JOIN {join['table']} to INNER JOIN {join['table']} ON ...",
537
+ priority=1
538
+ ))
539
+
540
+ # Check for missing join condition
541
+ if not join.get('condition'):
542
+ recommendations.append(OptimizationRecommendation(
543
+ category="join",
544
+ severity="high",
545
+ title="Missing Join Condition",
546
+ description="Join without explicit ON condition may cause Cartesian product.",
547
+ current_issue=f"JOIN with {join['table']} has no explicit ON condition",
548
+ recommendation="Add explicit ON condition to the join",
549
+ expected_improvement="Prevents accidental Cartesian products",
550
+ implementation=f"Add ON {join['table']}.id = other_table.foreign_key",
551
+ priority=1
552
+ ))
553
+
554
+ # Check for many joins
555
+ if len(query_info.joins) > 5:
556
+ recommendations.append(OptimizationRecommendation(
557
+ category="join",
558
+ severity="medium",
559
+ title="High Number of Joins",
560
+ description="Many joins can lead to complex execution plans and performance issues.",
561
+ current_issue=f"{len(query_info.joins)} joins detected in single query",
562
+ recommendation="Consider breaking into smaller queries or pre-aggregating",
563
+ expected_improvement="Better plan optimization and memory usage",
564
+ implementation="Use CTEs to materialize intermediate results, or denormalize frequently joined data",
565
+ priority=3
566
+ ))
567
+
568
+ return recommendations
569
+
570
+ def _recommend_distinct_alternative(self) -> OptimizationRecommendation:
571
+ return OptimizationRecommendation(
572
+ category="query_structure",
573
+ severity="medium",
574
+ title="Consider Alternatives to DISTINCT",
575
+ description="DISTINCT requires sorting/hashing all rows which can be expensive.",
576
+ current_issue="DISTINCT used - may indicate data quality or join issues",
577
+ recommendation="Review if DISTINCT is necessary or if joins produce duplicates",
578
+ expected_improvement="Eliminates expensive deduplication step if not needed",
579
+ implementation="Review join conditions, or use GROUP BY if aggregating anyway",
580
+ priority=3
581
+ )
582
+
583
+ def _recommend_add_limit(self) -> OptimizationRecommendation:
584
+ return OptimizationRecommendation(
585
+ category="query_structure",
586
+ severity="low",
587
+ title="Add LIMIT to ORDER BY",
588
+ description="ORDER BY without LIMIT sorts entire result set unnecessarily.",
589
+ current_issue="ORDER BY present without LIMIT clause",
590
+ recommendation="Add LIMIT if only top N rows are needed",
591
+ expected_improvement="Significant reduction in sorting overhead for large results",
592
+ implementation="Add LIMIT 100 (or appropriate number) after ORDER BY",
593
+ priority=4
594
+ )
595
+
596
+ def _recommend_cte_conversion(self) -> OptimizationRecommendation:
597
+ return OptimizationRecommendation(
598
+ category="query_structure",
599
+ severity="medium",
600
+ title="Convert Subqueries to CTEs",
601
+ description="Subqueries can be harder to optimize and maintain than CTEs.",
602
+ current_issue="Subqueries detected in the query",
603
+ recommendation="Convert correlated subqueries to CTEs or JOINs",
604
+ expected_improvement="Better query plan optimization and readability",
605
+ implementation="WITH subquery_name AS (SELECT ...) SELECT ... FROM main_table JOIN subquery_name",
606
+ priority=3
607
+ )
608
+
609
+ def _analyze_index_opportunities(self, query_info: SQLQueryInfo) -> List[OptimizationRecommendation]:
610
+ """Identify potential index opportunities"""
611
+ recommendations = []
612
+
613
+ # Columns in WHERE clause are index candidates
614
+ where_columns = set()
615
+ for condition in query_info.where_conditions:
616
+ # Extract column names from conditions
617
+ col_pattern = re.compile(r'\b([a-zA-Z_][a-zA-Z0-9_]*)\s*(?:=|>|<|>=|<=|<>|!=|LIKE|IN|BETWEEN)', re.IGNORECASE)
618
+ where_columns.update(col_pattern.findall(condition))
619
+
620
+ if where_columns:
621
+ recommendations.append(OptimizationRecommendation(
622
+ category="index",
623
+ severity="medium",
624
+ title="Consider Indexes on Filter Columns",
625
+ description="Columns used in WHERE clauses benefit from indexes.",
626
+ current_issue=f"Filter columns detected: {', '.join(where_columns)}",
627
+ recommendation="Create indexes on frequently filtered columns",
628
+ expected_improvement="Orders of magnitude faster for selective queries",
629
+ implementation=f"CREATE INDEX idx_name ON table ({', '.join(list(where_columns)[:3])})",
630
+ priority=2
631
+ ))
632
+
633
+ # JOIN columns are index candidates
634
+ join_columns = set()
635
+ for join in query_info.joins:
636
+ if join.get('condition'):
637
+ col_pattern = re.compile(r'\.([a-zA-Z_][a-zA-Z0-9_]*)\s*=', re.IGNORECASE)
638
+ join_columns.update(col_pattern.findall(join['condition']))
639
+
640
+ if join_columns:
641
+ recommendations.append(OptimizationRecommendation(
642
+ category="index",
643
+ severity="high",
644
+ title="Index Join Columns",
645
+ description="Join columns without indexes cause expensive full table scans.",
646
+ current_issue=f"Join columns detected: {', '.join(join_columns)}",
647
+ recommendation="Ensure indexes exist on join key columns",
648
+ expected_improvement="Dramatic improvement in join performance",
649
+ implementation=f"CREATE INDEX idx_join ON table ({list(join_columns)[0]})",
650
+ priority=1
651
+ ))
652
+
653
+ return recommendations
654
+
655
+ def _analyze_partition_pruning(self, query_info: SQLQueryInfo, sql: str) -> List[OptimizationRecommendation]:
656
+ """Check for partition pruning opportunities"""
657
+ recommendations = []
658
+
659
+ # Look for date/time columns in WHERE clause
660
+ date_pattern = re.compile(
661
+ r'\b(date|time|timestamp|created|updated|modified)_?\w*\s*(?:=|>|<|>=|<=|BETWEEN)',
662
+ re.IGNORECASE
663
+ )
664
+
665
+ if date_pattern.search(sql):
666
+ recommendations.append(OptimizationRecommendation(
667
+ category="partition",
668
+ severity="medium",
669
+ title="Leverage Partition Pruning",
670
+ description="Date-based filters can leverage partitioned tables for massive speedups.",
671
+ current_issue="Date/time filter detected - ensure table is partitioned",
672
+ recommendation="Partition table by date column and ensure filter format matches",
673
+ expected_improvement="90%+ reduction in data scanned for time-bounded queries",
674
+ implementation="CREATE TABLE ... PARTITION BY RANGE (date_column) or use dynamic partitioning",
675
+ priority=2
676
+ ))
677
+
678
+ return recommendations
679
+
680
+ def _analyze_aggregation(self, query_info: SQLQueryInfo) -> List[OptimizationRecommendation]:
681
+ """Analyze aggregation patterns"""
682
+ recommendations = []
683
+
684
+ # High cardinality GROUP BY warning
685
+ if len(query_info.group_by) > 3:
686
+ recommendations.append(OptimizationRecommendation(
687
+ category="aggregation",
688
+ severity="medium",
689
+ title="High Cardinality GROUP BY",
690
+ description="Grouping by many columns increases memory usage and reduces aggregation benefit.",
691
+ current_issue=f"GROUP BY with {len(query_info.group_by)} columns detected",
692
+ recommendation="Review if all group by columns are necessary",
693
+ expected_improvement="Reduced memory and faster aggregation",
694
+ implementation="Remove non-essential GROUP BY columns or pre-aggregate",
695
+ priority=3
696
+ ))
697
+
698
+ # COUNT DISTINCT optimization
699
+ if 'COUNT' in query_info.aggregations and query_info.distinct:
700
+ recommendations.append(OptimizationRecommendation(
701
+ category="aggregation",
702
+ severity="medium",
703
+ title="Optimize COUNT DISTINCT",
704
+ description="COUNT DISTINCT can be expensive for high cardinality columns.",
705
+ current_issue="COUNT DISTINCT pattern detected",
706
+ recommendation="Consider HyperLogLog approximation for very large datasets",
707
+ expected_improvement="Massive speedup with ~2% error tolerance",
708
+ implementation="Use APPROX_COUNT_DISTINCT() if available in your warehouse",
709
+ priority=3
710
+ ))
711
+
712
+ return recommendations
713
+
714
+
715
+ # =============================================================================
716
+ # Spark Job Analyzer
717
+ # =============================================================================
718
+
719
+ class SparkJobAnalyzer:
720
+ """Analyze Spark job metrics and provide optimization recommendations"""
721
+
722
+ def analyze(self, metrics: SparkJobMetrics) -> List[OptimizationRecommendation]:
723
+ """Analyze Spark job metrics"""
724
+ recommendations = []
725
+
726
+ # Check for data skew
727
+ if metrics.skew_ratio > 5:
728
+ recommendations.append(self._recommend_skew_mitigation(metrics))
729
+
730
+ # Check for excessive shuffle
731
+ shuffle_ratio = metrics.shuffle_write_bytes / max(metrics.input_bytes, 1)
732
+ if shuffle_ratio > 1.5:
733
+ recommendations.append(self._recommend_reduce_shuffle(metrics, shuffle_ratio))
734
+
735
+ # Check for GC overhead
736
+ gc_ratio = metrics.gc_time_ms / max(metrics.duration_ms, 1)
737
+ if gc_ratio > 0.1:
738
+ recommendations.append(self._recommend_memory_tuning(metrics, gc_ratio))
739
+
740
+ # Check for failed tasks
741
+ if metrics.failed_tasks > 0:
742
+ fail_ratio = metrics.failed_tasks / max(metrics.tasks, 1)
743
+ recommendations.append(self._recommend_failure_handling(metrics, fail_ratio))
744
+
745
+ # Check for speculative execution overhead
746
+ if metrics.speculative_tasks > metrics.tasks * 0.1:
747
+ recommendations.append(self._recommend_reduce_speculation(metrics))
748
+
749
+ # Check task count
750
+ if metrics.tasks > 10000:
751
+ recommendations.append(self._recommend_reduce_tasks(metrics))
752
+ elif metrics.tasks < 10 and metrics.input_bytes > 1e9:
753
+ recommendations.append(self._recommend_increase_parallelism(metrics))
754
+
755
+ return recommendations
756
+
757
+ def _recommend_skew_mitigation(self, metrics: SparkJobMetrics) -> OptimizationRecommendation:
758
+ return OptimizationRecommendation(
759
+ category="skew",
760
+ severity="critical",
761
+ title="Severe Data Skew Detected",
762
+ description=f"Skew ratio of {metrics.skew_ratio:.1f}x indicates uneven data distribution.",
763
+ current_issue=f"Task execution time varies by {metrics.skew_ratio:.1f}x, causing stragglers",
764
+ recommendation="Apply skew handling techniques to rebalance data",
765
+ expected_improvement="Up to 80% reduction in job time by eliminating stragglers",
766
+ implementation="""Options:
767
+ 1. Salting: Add random prefix to skewed keys
768
+ df.withColumn("salted_key", concat(col("key"), lit("_"), (rand() * 10).cast("int")))
769
+ 2. Broadcast join for small tables:
770
+ df1.join(broadcast(df2), "key")
771
+ 3. Adaptive Query Execution (Spark 3.0+):
772
+ spark.conf.set("spark.sql.adaptive.enabled", "true")
773
+ spark.conf.set("spark.sql.adaptive.skewJoin.enabled", "true")""",
774
+ priority=1
775
+ )
776
+
777
+ def _recommend_reduce_shuffle(self, metrics: SparkJobMetrics, ratio: float) -> OptimizationRecommendation:
778
+ return OptimizationRecommendation(
779
+ category="shuffle",
780
+ severity="high",
781
+ title="Excessive Shuffle Data",
782
+ description=f"Shuffle writes {ratio:.1f}x the input data size.",
783
+ current_issue=f"Shuffle write: {metrics.shuffle_write_bytes / 1e9:.2f} GB vs input: {metrics.input_bytes / 1e9:.2f} GB",
784
+ recommendation="Reduce shuffle through partitioning and early aggregation",
785
+ expected_improvement="Significant network I/O and storage reduction",
786
+ implementation="""Options:
787
+ 1. Pre-aggregate before shuffle:
788
+ df.groupBy("key").agg(sum("value")).repartition("key")
789
+ 2. Use map-side combining:
790
+ df.reduceByKey((a, b) => a + b)
791
+ 3. Optimize partition count:
792
+ spark.conf.set("spark.sql.shuffle.partitions", optimal_count)
793
+ 4. Use bucketing for repeated joins:
794
+ df.write.bucketBy(200, "key").saveAsTable("bucketed_table")""",
795
+ priority=1
796
+ )
797
+
798
+ def _recommend_memory_tuning(self, metrics: SparkJobMetrics, gc_ratio: float) -> OptimizationRecommendation:
799
+ return OptimizationRecommendation(
800
+ category="memory",
801
+ severity="high",
802
+ title="High GC Overhead",
803
+ description=f"GC time is {gc_ratio * 100:.1f}% of total execution time.",
804
+ current_issue=f"GC time: {metrics.gc_time_ms / 1000:.1f}s out of {metrics.duration_ms / 1000:.1f}s total",
805
+ recommendation="Tune memory settings to reduce garbage collection",
806
+ expected_improvement="20-50% faster execution with proper memory config",
807
+ implementation="""Memory tuning options:
808
+ 1. Increase executor memory:
809
+ --executor-memory 8g
810
+ 2. Adjust memory fractions:
811
+ spark.memory.fraction=0.6
812
+ spark.memory.storageFraction=0.5
813
+ 3. Use off-heap memory:
814
+ spark.memory.offHeap.enabled=true
815
+ spark.memory.offHeap.size=4g
816
+ 4. Reduce cached data:
817
+ df.unpersist() when no longer needed
818
+ 5. Use Kryo serialization:
819
+ spark.serializer=org.apache.spark.serializer.KryoSerializer""",
820
+ priority=2
821
+ )
822
+
823
+ def _recommend_failure_handling(self, metrics: SparkJobMetrics, fail_ratio: float) -> OptimizationRecommendation:
824
+ return OptimizationRecommendation(
825
+ category="reliability",
826
+ severity="high" if fail_ratio > 0.1 else "medium",
827
+ title="Task Failures Detected",
828
+ description=f"{metrics.failed_tasks} tasks failed ({fail_ratio * 100:.1f}% failure rate).",
829
+ current_issue="Task failures increase job time and resource usage due to retries",
830
+ recommendation="Investigate failure causes and add resilience",
831
+ expected_improvement="Reduced retries and more predictable job times",
832
+ implementation="""Failure handling options:
833
+ 1. Check executor logs for OOM:
834
+ spark.executor.memoryOverhead=2g
835
+ 2. Handle data issues:
836
+ df.filter(col("value").isNotNull())
837
+ 3. Increase task retries:
838
+ spark.task.maxFailures=4
839
+ 4. Add checkpointing for long jobs:
840
+ df.checkpoint()
841
+ 5. Check for network timeouts:
842
+ spark.network.timeout=300s""",
843
+ priority=1
844
+ )
845
+
846
+ def _recommend_reduce_speculation(self, metrics: SparkJobMetrics) -> OptimizationRecommendation:
847
+ return OptimizationRecommendation(
848
+ category="execution",
849
+ severity="medium",
850
+ title="High Speculative Execution",
851
+ description=f"{metrics.speculative_tasks} speculative tasks launched.",
852
+ current_issue="Excessive speculation wastes resources and indicates underlying issues",
853
+ recommendation="Address root cause of slow tasks instead of speculation",
854
+ expected_improvement="Better resource utilization",
855
+ implementation="""Options:
856
+ 1. Disable speculation if not needed:
857
+ spark.speculation=false
858
+ 2. Or tune speculation settings:
859
+ spark.speculation.multiplier=1.5
860
+ spark.speculation.quantile=0.9
861
+ 3. Fix underlying skew/memory issues first""",
862
+ priority=3
863
+ )
864
+
865
+ def _recommend_reduce_tasks(self, metrics: SparkJobMetrics) -> OptimizationRecommendation:
866
+ return OptimizationRecommendation(
867
+ category="parallelism",
868
+ severity="medium",
869
+ title="Too Many Tasks",
870
+ description=f"{metrics.tasks} tasks may cause excessive scheduling overhead.",
871
+ current_issue="Very high task count increases driver overhead",
872
+ recommendation="Reduce partition count for better efficiency",
873
+ expected_improvement="Reduced scheduling overhead and driver memory usage",
874
+ implementation=f"""
875
+ 1. Reduce shuffle partitions:
876
+ spark.sql.shuffle.partitions={max(200, metrics.tasks // 10)}
877
+ 2. Coalesce partitions:
878
+ df.coalesce({max(200, metrics.tasks // 10)})
879
+ 3. Use adaptive partitioning (Spark 3.0+):
880
+ spark.sql.adaptive.enabled=true""",
881
+ priority=3
882
+ )
883
+
884
+ def _recommend_increase_parallelism(self, metrics: SparkJobMetrics) -> OptimizationRecommendation:
885
+ recommended_partitions = max(200, int(metrics.input_bytes / (128 * 1e6))) # 128MB per partition
886
+ return OptimizationRecommendation(
887
+ category="parallelism",
888
+ severity="high",
889
+ title="Low Parallelism",
890
+ description=f"Only {metrics.tasks} tasks for {metrics.input_bytes / 1e9:.2f} GB of data.",
891
+ current_issue="Under-utilization of cluster resources",
892
+ recommendation="Increase parallelism to better utilize cluster",
893
+ expected_improvement="Linear speedup with added parallelism",
894
+ implementation=f"""
895
+ 1. Increase shuffle partitions:
896
+ spark.sql.shuffle.partitions={recommended_partitions}
897
+ 2. Repartition input:
898
+ df.repartition({recommended_partitions})
899
+ 3. Adjust default parallelism:
900
+ spark.default.parallelism={recommended_partitions}""",
901
+ priority=2
902
+ )
903
+
904
+
905
+ # =============================================================================
906
+ # Partition Strategy Advisor
907
+ # =============================================================================
908
+
909
+ class PartitionAdvisor:
910
+ """Recommend partitioning strategies based on data characteristics"""
911
+
912
+ def recommend(self, data_stats: Dict) -> List[PartitionStrategy]:
913
+ """Generate partition recommendations from data statistics"""
914
+ recommendations = []
915
+
916
+ columns = data_stats.get('columns', {})
917
+ total_size_bytes = data_stats.get('total_size_bytes', 0)
918
+ row_count = data_stats.get('row_count', 0)
919
+
920
+ for col_name, col_stats in columns.items():
921
+ strategy = self._evaluate_column(col_name, col_stats, total_size_bytes, row_count)
922
+ if strategy:
923
+ recommendations.append(strategy)
924
+
925
+ # Sort by partition effectiveness
926
+ recommendations.sort(key=lambda s: s.partition_size_mb)
927
+
928
+ return recommendations[:3] # Top 3 recommendations
929
+
930
+ def _evaluate_column(self, col_name: str, col_stats: Dict,
931
+ total_size_bytes: int, row_count: int) -> Optional[PartitionStrategy]:
932
+ """Evaluate a column for partitioning potential"""
933
+ cardinality = col_stats.get('cardinality', 0)
934
+ data_type = col_stats.get('data_type', 'string')
935
+ null_percentage = col_stats.get('null_percentage', 0)
936
+
937
+ # Skip high-null columns
938
+ if null_percentage > 20:
939
+ return None
940
+
941
+ # Date/timestamp columns are ideal for range partitioning
942
+ if data_type in ('date', 'timestamp', 'datetime'):
943
+ return self._recommend_date_partition(col_name, col_stats, total_size_bytes, row_count)
944
+
945
+ # Low cardinality columns are good for list partitioning
946
+ if cardinality and cardinality <= 100:
947
+ return self._recommend_list_partition(col_name, col_stats, total_size_bytes, cardinality)
948
+
949
+ # Medium cardinality columns can use hash partitioning
950
+ if cardinality and 100 < cardinality <= 10000:
951
+ return self._recommend_hash_partition(col_name, col_stats, total_size_bytes)
952
+
953
+ return None
954
+
955
+ def _recommend_date_partition(self, col_name: str, col_stats: Dict,
956
+ total_size_bytes: int, row_count: int) -> PartitionStrategy:
957
+ # Estimate daily partition size (assume 365 days of data)
958
+ estimated_days = 365
959
+ partition_size_mb = (total_size_bytes / estimated_days) / (1024 * 1024)
960
+
961
+ return PartitionStrategy(
962
+ column=col_name,
963
+ partition_type="range",
964
+ num_partitions=None, # Dynamic based on date range
965
+ partition_size_mb=partition_size_mb,
966
+ reasoning=f"Date column '{col_name}' is ideal for range partitioning. "
967
+ f"Estimated daily partition size: {partition_size_mb:.1f} MB",
968
+ implementation=f"""
969
+ -- BigQuery
970
+ CREATE TABLE table_name
971
+ PARTITION BY DATE({col_name})
972
+ AS SELECT * FROM source_table;
973
+
974
+ -- Snowflake
975
+ CREATE TABLE table_name
976
+ CLUSTER BY (DATE_TRUNC('DAY', {col_name}));
977
+
978
+ -- Spark/Hive
979
+ df.write.partitionBy("{col_name}").parquet("path")
980
+
981
+ -- PostgreSQL
982
+ CREATE TABLE table_name (...)
983
+ PARTITION BY RANGE ({col_name});"""
984
+ )
985
+
986
+ def _recommend_list_partition(self, col_name: str, col_stats: Dict,
987
+ total_size_bytes: int, cardinality: int) -> PartitionStrategy:
988
+ partition_size_mb = (total_size_bytes / cardinality) / (1024 * 1024)
989
+
990
+ return PartitionStrategy(
991
+ column=col_name,
992
+ partition_type="list",
993
+ num_partitions=cardinality,
994
+ partition_size_mb=partition_size_mb,
995
+ reasoning=f"Column '{col_name}' has {cardinality} distinct values - ideal for list partitioning. "
996
+ f"Estimated partition size: {partition_size_mb:.1f} MB",
997
+ implementation=f"""
998
+ -- Spark/Hive
999
+ df.write.partitionBy("{col_name}").parquet("path")
1000
+
1001
+ -- PostgreSQL
1002
+ CREATE TABLE table_name (...)
1003
+ PARTITION BY LIST ({col_name});
1004
+
1005
+ -- Note: List partitioning works best with stable, low-cardinality values"""
1006
+ )
1007
+
1008
+ def _recommend_hash_partition(self, col_name: str, col_stats: Dict,
1009
+ total_size_bytes: int) -> PartitionStrategy:
1010
+ # Target ~128MB partitions
1011
+ target_partition_size = 128 * 1024 * 1024
1012
+ num_partitions = max(1, int(total_size_bytes / target_partition_size))
1013
+
1014
+ # Round to power of 2 for better distribution
1015
+ num_partitions = 2 ** int(math.log2(num_partitions) + 0.5)
1016
+ partition_size_mb = (total_size_bytes / num_partitions) / (1024 * 1024)
1017
+
1018
+ return PartitionStrategy(
1019
+ column=col_name,
1020
+ partition_type="hash",
1021
+ num_partitions=num_partitions,
1022
+ partition_size_mb=partition_size_mb,
1023
+ reasoning=f"Column '{col_name}' has medium cardinality - hash partitioning provides even distribution. "
1024
+ f"Recommended {num_partitions} partitions (~{partition_size_mb:.1f} MB each)",
1025
+ implementation=f"""
1026
+ -- Spark
1027
+ df.repartition({num_partitions}, col("{col_name}"))
1028
+
1029
+ -- PostgreSQL
1030
+ CREATE TABLE table_name (...)
1031
+ PARTITION BY HASH ({col_name});
1032
+
1033
+ -- Snowflake (clustering)
1034
+ ALTER TABLE table_name CLUSTER BY ({col_name});"""
1035
+ )
1036
+
1037
+
1038
+ # =============================================================================
1039
+ # Cost Estimator
1040
+ # =============================================================================
1041
+
1042
+ class CostEstimator:
1043
+ """Estimate query costs for cloud data warehouses"""
1044
+
1045
+ # Pricing (approximate, varies by region and contract)
1046
+ PRICING = {
1047
+ 'snowflake': {
1048
+ 'compute_per_credit': 2.00, # USD per credit
1049
+ 'credits_per_hour': {
1050
+ 'x-small': 1,
1051
+ 'small': 2,
1052
+ 'medium': 4,
1053
+ 'large': 8,
1054
+ 'x-large': 16,
1055
+ },
1056
+ 'storage_per_tb_month': 23.00,
1057
+ },
1058
+ 'bigquery': {
1059
+ 'on_demand_per_tb': 5.00, # USD per TB scanned
1060
+ 'storage_per_tb_month': 20.00,
1061
+ 'streaming_insert_per_gb': 0.01,
1062
+ },
1063
+ 'redshift': {
1064
+ 'dc2_large_per_hour': 0.25,
1065
+ 'ra3_xlarge_per_hour': 1.086,
1066
+ 'storage_per_gb_month': 0.024,
1067
+ },
1068
+ 'databricks': {
1069
+ 'dbu_per_hour_sql': 0.22,
1070
+ 'dbu_per_hour_jobs': 0.15,
1071
+ }
1072
+ }
1073
+
1074
+ def estimate(self, query_info: SQLQueryInfo, warehouse: str,
1075
+ data_stats: Optional[Dict] = None) -> CostEstimate:
1076
+ """Estimate query cost"""
1077
+ warehouse = warehouse.lower()
1078
+
1079
+ if warehouse not in self.PRICING:
1080
+ raise ValueError(f"Unknown warehouse: {warehouse}. Supported: {list(self.PRICING.keys())}")
1081
+
1082
+ # Estimate data scanned
1083
+ data_scanned_bytes = self._estimate_data_scanned(query_info, data_stats)
1084
+ data_scanned_tb = data_scanned_bytes / (1024 ** 4)
1085
+
1086
+ if warehouse == 'bigquery':
1087
+ return self._estimate_bigquery(query_info, data_scanned_tb, data_stats)
1088
+ elif warehouse == 'snowflake':
1089
+ return self._estimate_snowflake(query_info, data_scanned_tb, data_stats)
1090
+ elif warehouse == 'redshift':
1091
+ return self._estimate_redshift(query_info, data_scanned_tb, data_stats)
1092
+ elif warehouse == 'databricks':
1093
+ return self._estimate_databricks(query_info, data_scanned_tb, data_stats)
1094
+
1095
+ def _estimate_data_scanned(self, query_info: SQLQueryInfo,
1096
+ data_stats: Optional[Dict]) -> int:
1097
+ """Estimate bytes of data that will be scanned"""
1098
+ if data_stats and 'total_size_bytes' in data_stats:
1099
+ base_size = data_stats['total_size_bytes']
1100
+ else:
1101
+ # Default assumption: 1GB per table
1102
+ base_size = len(query_info.tables) * 1e9
1103
+
1104
+ # Adjust for filters
1105
+ filter_factor = 1.0
1106
+ if query_info.where_conditions:
1107
+ # Assume each filter reduces data by 50% (very rough)
1108
+ filter_factor = 0.5 ** min(len(query_info.where_conditions), 3)
1109
+
1110
+ # Adjust for column projection
1111
+ if '*' not in query_info.columns and query_info.columns:
1112
+ # Assume selecting specific columns reduces scan by 50%
1113
+ filter_factor *= 0.5
1114
+
1115
+ return int(base_size * filter_factor)
1116
+
1117
+ def _estimate_bigquery(self, query_info: SQLQueryInfo,
1118
+ data_scanned_tb: float, data_stats: Optional[Dict]) -> CostEstimate:
1119
+ pricing = self.PRICING['bigquery']
1120
+
1121
+ compute_cost = data_scanned_tb * pricing['on_demand_per_tb']
1122
+
1123
+ # Minimum billing of 10MB
1124
+ if data_scanned_tb < 10 / (1024 ** 2):
1125
+ compute_cost = 10 / (1024 ** 2) * pricing['on_demand_per_tb']
1126
+
1127
+ return CostEstimate(
1128
+ warehouse='BigQuery',
1129
+ compute_cost=compute_cost,
1130
+ storage_cost=0, # Storage cost separate
1131
+ data_transfer_cost=0,
1132
+ total_cost=compute_cost,
1133
+ assumptions=[
1134
+ f"Estimated {data_scanned_tb * 1024:.2f} GB data scanned",
1135
+ "Using on-demand pricing ($5/TB)",
1136
+ "Assumes no slot reservations",
1137
+ "Actual cost depends on partitioning and clustering"
1138
+ ]
1139
+ )
1140
+
1141
+ def _estimate_snowflake(self, query_info: SQLQueryInfo,
1142
+ data_scanned_tb: float, data_stats: Optional[Dict]) -> CostEstimate:
1143
+ pricing = self.PRICING['snowflake']
1144
+
1145
+ # Estimate warehouse size and time
1146
+ complexity_to_size = {
1147
+ 'low': 'x-small',
1148
+ 'medium': 'small',
1149
+ 'high': 'medium',
1150
+ 'very_high': 'large'
1151
+ }
1152
+ warehouse_size = complexity_to_size.get(query_info.estimated_complexity, 'small')
1153
+ credits_per_hour = pricing['credits_per_hour'][warehouse_size]
1154
+
1155
+ # Estimate runtime (very rough)
1156
+ estimated_seconds = max(1, data_scanned_tb * 1024 * 10) # 10 seconds per GB
1157
+ estimated_hours = estimated_seconds / 3600
1158
+
1159
+ credits_used = credits_per_hour * estimated_hours
1160
+ compute_cost = credits_used * pricing['compute_per_credit']
1161
+
1162
+ # Minimum 1 minute billing
1163
+ min_cost = (credits_per_hour / 60) * pricing['compute_per_credit']
1164
+ compute_cost = max(compute_cost, min_cost)
1165
+
1166
+ return CostEstimate(
1167
+ warehouse='Snowflake',
1168
+ compute_cost=compute_cost,
1169
+ storage_cost=0,
1170
+ data_transfer_cost=0,
1171
+ total_cost=compute_cost,
1172
+ assumptions=[
1173
+ f"Warehouse size: {warehouse_size}",
1174
+ f"Estimated runtime: {estimated_seconds:.1f} seconds",
1175
+ f"Credits used: {credits_used:.4f}",
1176
+ "Minimum 1-minute billing applies",
1177
+ "Actual cost depends on warehouse auto-suspend settings"
1178
+ ]
1179
+ )
1180
+
1181
+ def _estimate_redshift(self, query_info: SQLQueryInfo,
1182
+ data_scanned_tb: float, data_stats: Optional[Dict]) -> CostEstimate:
1183
+ pricing = self.PRICING['redshift']
1184
+
1185
+ # Assume RA3 xl node type
1186
+ hourly_rate = pricing['ra3_xlarge_per_hour']
1187
+
1188
+ # Estimate runtime
1189
+ estimated_seconds = max(1, data_scanned_tb * 1024 * 15) # 15 seconds per GB
1190
+ estimated_hours = estimated_seconds / 3600
1191
+
1192
+ compute_cost = hourly_rate * estimated_hours
1193
+
1194
+ return CostEstimate(
1195
+ warehouse='Redshift',
1196
+ compute_cost=compute_cost,
1197
+ storage_cost=0,
1198
+ data_transfer_cost=0,
1199
+ total_cost=compute_cost,
1200
+ assumptions=[
1201
+ f"Using RA3.xlplus node type",
1202
+ f"Estimated runtime: {estimated_seconds:.1f} seconds",
1203
+ "Assumes dedicated cluster (not serverless)",
1204
+ "Actual cost depends on cluster configuration"
1205
+ ]
1206
+ )
1207
+
1208
+ def _estimate_databricks(self, query_info: SQLQueryInfo,
1209
+ data_scanned_tb: float, data_stats: Optional[Dict]) -> CostEstimate:
1210
+ pricing = self.PRICING['databricks']
1211
+
1212
+ # Estimate DBUs
1213
+ estimated_seconds = max(1, data_scanned_tb * 1024 * 12)
1214
+ estimated_hours = estimated_seconds / 3600
1215
+
1216
+ dbu_cost = pricing['dbu_per_hour_sql'] * estimated_hours
1217
+
1218
+ return CostEstimate(
1219
+ warehouse='Databricks',
1220
+ compute_cost=dbu_cost,
1221
+ storage_cost=0,
1222
+ data_transfer_cost=0,
1223
+ total_cost=dbu_cost,
1224
+ assumptions=[
1225
+ f"Using SQL warehouse",
1226
+ f"Estimated runtime: {estimated_seconds:.1f} seconds",
1227
+ "DBU rate may vary by workspace tier",
1228
+ "Does not include underlying cloud costs"
1229
+ ]
1230
+ )
1231
+
1232
+
1233
+ # =============================================================================
1234
+ # Report Generator
1235
+ # =============================================================================
1236
+
1237
+ class ReportGenerator:
1238
+ """Generate optimization reports"""
1239
+
1240
+ def generate_text_report(self, query_info: SQLQueryInfo,
1241
+ recommendations: List[OptimizationRecommendation],
1242
+ cost_estimate: Optional[CostEstimate] = None) -> str:
1243
+ """Generate a text report"""
1244
+ lines = []
1245
+ lines.append("=" * 80)
1246
+ lines.append("ETL PERFORMANCE OPTIMIZATION REPORT")
1247
+ lines.append("=" * 80)
1248
+ lines.append(f"\nGenerated: {datetime.now().isoformat()}")
1249
+
1250
+ # Query summary
1251
+ lines.append("\n" + "-" * 40)
1252
+ lines.append("QUERY ANALYSIS")
1253
+ lines.append("-" * 40)
1254
+ lines.append(f"Query Type: {query_info.query_type}")
1255
+ lines.append(f"Tables: {', '.join(query_info.tables) or 'None'}")
1256
+ lines.append(f"Joins: {len(query_info.joins)}")
1257
+ lines.append(f"Subqueries: {query_info.subqueries}")
1258
+ lines.append(f"Aggregations: {', '.join(query_info.aggregations) or 'None'}")
1259
+ lines.append(f"Window Functions: {', '.join(query_info.window_functions) or 'None'}")
1260
+ lines.append(f"Complexity: {query_info.estimated_complexity.upper()}")
1261
+
1262
+ # Cost estimate
1263
+ if cost_estimate:
1264
+ lines.append("\n" + "-" * 40)
1265
+ lines.append("COST ESTIMATE")
1266
+ lines.append("-" * 40)
1267
+ lines.append(f"Warehouse: {cost_estimate.warehouse}")
1268
+ lines.append(f"Estimated Cost: ${cost_estimate.total_cost:.4f} {cost_estimate.currency}")
1269
+ lines.append("Assumptions:")
1270
+ for assumption in cost_estimate.assumptions:
1271
+ lines.append(f" - {assumption}")
1272
+
1273
+ # Recommendations
1274
+ if recommendations:
1275
+ lines.append("\n" + "-" * 40)
1276
+ lines.append(f"OPTIMIZATION RECOMMENDATIONS ({len(recommendations)} found)")
1277
+ lines.append("-" * 40)
1278
+
1279
+ for i, rec in enumerate(recommendations, 1):
1280
+ severity_icon = {
1281
+ 'critical': '🔴',
1282
+ 'high': '🟠',
1283
+ 'medium': '🟡',
1284
+ 'low': '🟢'
1285
+ }.get(rec.severity, '⚪')
1286
+
1287
+ lines.append(f"\n{i}. {severity_icon} [{rec.severity.upper()}] {rec.title}")
1288
+ lines.append(f" Category: {rec.category}")
1289
+ lines.append(f" Issue: {rec.current_issue}")
1290
+ lines.append(f" Recommendation: {rec.recommendation}")
1291
+ lines.append(f" Expected Improvement: {rec.expected_improvement}")
1292
+ lines.append(f"\n Implementation:")
1293
+ for impl_line in rec.implementation.strip().split('\n'):
1294
+ lines.append(f" {impl_line}")
1295
+ else:
1296
+ lines.append("\n✅ No optimization issues detected")
1297
+
1298
+ lines.append("\n" + "=" * 80)
1299
+
1300
+ return "\n".join(lines)
1301
+
1302
+ def generate_json_report(self, query_info: SQLQueryInfo,
1303
+ recommendations: List[OptimizationRecommendation],
1304
+ cost_estimate: Optional[CostEstimate] = None) -> Dict:
1305
+ """Generate a JSON report"""
1306
+ return {
1307
+ "report_type": "etl_performance_optimization",
1308
+ "generated_at": datetime.now().isoformat(),
1309
+ "query_analysis": {
1310
+ "query_type": query_info.query_type,
1311
+ "tables": query_info.tables,
1312
+ "joins": query_info.joins,
1313
+ "subqueries": query_info.subqueries,
1314
+ "aggregations": query_info.aggregations,
1315
+ "window_functions": query_info.window_functions,
1316
+ "complexity": query_info.estimated_complexity
1317
+ },
1318
+ "cost_estimate": asdict(cost_estimate) if cost_estimate else None,
1319
+ "recommendations": [asdict(r) for r in recommendations],
1320
+ "summary": {
1321
+ "total_recommendations": len(recommendations),
1322
+ "critical": sum(1 for r in recommendations if r.severity == "critical"),
1323
+ "high": sum(1 for r in recommendations if r.severity == "high"),
1324
+ "medium": sum(1 for r in recommendations if r.severity == "medium"),
1325
+ "low": sum(1 for r in recommendations if r.severity == "low")
1326
+ }
1327
+ }
1328
+
1329
+
1330
+ # =============================================================================
1331
+ # CLI Commands
1332
+ # =============================================================================
1333
+
1334
+ def cmd_analyze_sql(args):
1335
+ """Analyze SQL query for optimization opportunities"""
1336
+ # Load SQL
1337
+ sql_path = Path(args.input)
1338
+ if sql_path.exists():
1339
+ with open(sql_path, 'r') as f:
1340
+ sql = f.read()
1341
+ else:
1342
+ sql = args.input # Treat as inline SQL
1343
+
1344
+ # Parse and analyze
1345
+ parser = SQLParser()
1346
+ query_info = parser.parse(sql)
1347
+
1348
+ optimizer = SQLOptimizer()
1349
+ recommendations = optimizer.analyze(query_info, sql)
1350
+
1351
+ # Cost estimate if warehouse specified
1352
+ cost_estimate = None
1353
+ if args.warehouse:
1354
+ estimator = CostEstimator()
1355
+ data_stats = None
1356
+ if args.stats:
1357
+ with open(args.stats, 'r') as f:
1358
+ data_stats = json.load(f)
1359
+ cost_estimate = estimator.estimate(query_info, args.warehouse, data_stats)
1360
+
1361
+ # Generate report
1362
+ reporter = ReportGenerator()
1363
+
1364
+ if args.json:
1365
+ report = reporter.generate_json_report(query_info, recommendations, cost_estimate)
1366
+ output = json.dumps(report, indent=2)
1367
+ else:
1368
+ output = reporter.generate_text_report(query_info, recommendations, cost_estimate)
1369
+
1370
+ if args.output:
1371
+ with open(args.output, 'w') as f:
1372
+ f.write(output)
1373
+ logger.info(f"Report saved to {args.output}")
1374
+ else:
1375
+ print(output)
1376
+
1377
+
1378
+ def cmd_analyze_spark(args):
1379
+ """Analyze Spark job metrics"""
1380
+ with open(args.input, 'r') as f:
1381
+ metrics_data = json.load(f)
1382
+
1383
+ # Handle both single job and array of jobs
1384
+ if isinstance(metrics_data, list):
1385
+ jobs = metrics_data
1386
+ else:
1387
+ jobs = [metrics_data]
1388
+
1389
+ all_recommendations = []
1390
+ analyzer = SparkJobAnalyzer()
1391
+
1392
+ for job_data in jobs:
1393
+ metrics = SparkJobMetrics(
1394
+ job_id=job_data.get('jobId', 'unknown'),
1395
+ duration_ms=job_data.get('duration', 0),
1396
+ stages=job_data.get('numStages', 0),
1397
+ tasks=job_data.get('numTasks', 0),
1398
+ shuffle_read_bytes=job_data.get('shuffleReadBytes', 0),
1399
+ shuffle_write_bytes=job_data.get('shuffleWriteBytes', 0),
1400
+ input_bytes=job_data.get('inputBytes', 0),
1401
+ output_bytes=job_data.get('outputBytes', 0),
1402
+ peak_memory_bytes=job_data.get('peakMemoryBytes', 0),
1403
+ gc_time_ms=job_data.get('gcTime', 0),
1404
+ failed_tasks=job_data.get('failedTasks', 0),
1405
+ speculative_tasks=job_data.get('speculativeTasks', 0),
1406
+ skew_ratio=job_data.get('skewRatio', 1.0)
1407
+ )
1408
+
1409
+ recommendations = analyzer.analyze(metrics)
1410
+ all_recommendations.extend(recommendations)
1411
+
1412
+ # Deduplicate similar recommendations
1413
+ unique_recs = []
1414
+ seen_titles = set()
1415
+ for rec in all_recommendations:
1416
+ if rec.title not in seen_titles:
1417
+ unique_recs.append(rec)
1418
+ seen_titles.add(rec.title)
1419
+
1420
+ # Output
1421
+ if args.json:
1422
+ output = json.dumps([asdict(r) for r in unique_recs], indent=2)
1423
+ else:
1424
+ lines = []
1425
+ lines.append("=" * 60)
1426
+ lines.append("SPARK JOB OPTIMIZATION REPORT")
1427
+ lines.append("=" * 60)
1428
+ lines.append(f"\nJobs Analyzed: {len(jobs)}")
1429
+ lines.append(f"Recommendations: {len(unique_recs)}")
1430
+
1431
+ for i, rec in enumerate(unique_recs, 1):
1432
+ lines.append(f"\n{i}. [{rec.severity.upper()}] {rec.title}")
1433
+ lines.append(f" {rec.description}")
1434
+ lines.append(f" Implementation: {rec.implementation[:200]}...")
1435
+
1436
+ output = "\n".join(lines)
1437
+
1438
+ if args.output:
1439
+ with open(args.output, 'w') as f:
1440
+ f.write(output)
1441
+ else:
1442
+ print(output)
1443
+
1444
+
1445
+ def cmd_optimize_partition(args):
1446
+ """Recommend partition strategies"""
1447
+ with open(args.input, 'r') as f:
1448
+ data_stats = json.load(f)
1449
+
1450
+ advisor = PartitionAdvisor()
1451
+ strategies = advisor.recommend(data_stats)
1452
+
1453
+ if args.json:
1454
+ output = json.dumps([asdict(s) for s in strategies], indent=2)
1455
+ else:
1456
+ lines = []
1457
+ lines.append("=" * 60)
1458
+ lines.append("PARTITION STRATEGY RECOMMENDATIONS")
1459
+ lines.append("=" * 60)
1460
+
1461
+ if not strategies:
1462
+ lines.append("\nNo partition recommendations based on provided data statistics.")
1463
+ else:
1464
+ for i, strategy in enumerate(strategies, 1):
1465
+ lines.append(f"\n{i}. Partition by: {strategy.column}")
1466
+ lines.append(f" Type: {strategy.partition_type}")
1467
+ if strategy.num_partitions:
1468
+ lines.append(f" Partitions: {strategy.num_partitions}")
1469
+ lines.append(f" Estimated size: {strategy.partition_size_mb:.1f} MB per partition")
1470
+ lines.append(f" Reasoning: {strategy.reasoning}")
1471
+ lines.append(f"\n Implementation:")
1472
+ for impl_line in strategy.implementation.strip().split('\n'):
1473
+ lines.append(f" {impl_line}")
1474
+
1475
+ output = "\n".join(lines)
1476
+
1477
+ if args.output:
1478
+ with open(args.output, 'w') as f:
1479
+ f.write(output)
1480
+ else:
1481
+ print(output)
1482
+
1483
+
1484
+ def cmd_estimate_cost(args):
1485
+ """Estimate query cost"""
1486
+ # Load SQL
1487
+ sql_path = Path(args.input)
1488
+ if sql_path.exists():
1489
+ with open(sql_path, 'r') as f:
1490
+ sql = f.read()
1491
+ else:
1492
+ sql = args.input
1493
+
1494
+ # Parse
1495
+ parser = SQLParser()
1496
+ query_info = parser.parse(sql)
1497
+
1498
+ # Load data stats if provided
1499
+ data_stats = None
1500
+ if args.stats:
1501
+ with open(args.stats, 'r') as f:
1502
+ data_stats = json.load(f)
1503
+
1504
+ # Estimate cost
1505
+ estimator = CostEstimator()
1506
+ cost = estimator.estimate(query_info, args.warehouse, data_stats)
1507
+
1508
+ if args.json:
1509
+ output = json.dumps(asdict(cost), indent=2)
1510
+ else:
1511
+ lines = []
1512
+ lines.append(f"Cost Estimate for {cost.warehouse}")
1513
+ lines.append("=" * 40)
1514
+ lines.append(f"Compute Cost: ${cost.compute_cost:.4f}")
1515
+ lines.append(f"Storage Cost: ${cost.storage_cost:.4f}")
1516
+ lines.append(f"Data Transfer: ${cost.data_transfer_cost:.4f}")
1517
+ lines.append("-" * 40)
1518
+ lines.append(f"Total: ${cost.total_cost:.4f} {cost.currency}")
1519
+ lines.append("\nAssumptions:")
1520
+ for assumption in cost.assumptions:
1521
+ lines.append(f" - {assumption}")
1522
+
1523
+ output = "\n".join(lines)
1524
+
1525
+ if args.output:
1526
+ with open(args.output, 'w') as f:
1527
+ f.write(output)
1528
+ else:
1529
+ print(output)
1530
+
1531
+
1532
+ def cmd_generate_template(args):
1533
+ """Generate template files"""
1534
+ templates = {
1535
+ 'data_stats': {
1536
+ "total_size_bytes": 10737418240,
1537
+ "row_count": 10000000,
1538
+ "columns": {
1539
+ "id": {
1540
+ "data_type": "integer",
1541
+ "cardinality": 10000000,
1542
+ "null_percentage": 0
1543
+ },
1544
+ "created_at": {
1545
+ "data_type": "timestamp",
1546
+ "cardinality": 1000000,
1547
+ "null_percentage": 0
1548
+ },
1549
+ "category": {
1550
+ "data_type": "string",
1551
+ "cardinality": 50,
1552
+ "null_percentage": 2
1553
+ },
1554
+ "amount": {
1555
+ "data_type": "float",
1556
+ "cardinality": 100000,
1557
+ "null_percentage": 5
1558
+ }
1559
+ }
1560
+ },
1561
+ 'spark_metrics': {
1562
+ "jobId": "job_12345",
1563
+ "duration": 300000,
1564
+ "numStages": 5,
1565
+ "numTasks": 200,
1566
+ "shuffleReadBytes": 5368709120,
1567
+ "shuffleWriteBytes": 2147483648,
1568
+ "inputBytes": 10737418240,
1569
+ "outputBytes": 1073741824,
1570
+ "peakMemoryBytes": 4294967296,
1571
+ "gcTime": 15000,
1572
+ "failedTasks": 2,
1573
+ "speculativeTasks": 5,
1574
+ "skewRatio": 3.5
1575
+ }
1576
+ }
1577
+
1578
+ if args.template not in templates:
1579
+ logger.error(f"Unknown template: {args.template}. Available: {list(templates.keys())}")
1580
+ sys.exit(1)
1581
+
1582
+ output = json.dumps(templates[args.template], indent=2)
1583
+
1584
+ if args.output:
1585
+ with open(args.output, 'w') as f:
1586
+ f.write(output)
1587
+ logger.info(f"Template saved to {args.output}")
1588
+ else:
1589
+ print(output)
1590
+
1591
+
1592
+ def main():
1593
+ """Main entry point"""
1594
+ parser = argparse.ArgumentParser(
1595
+ description="ETL Performance Optimizer - Analyze and optimize data pipelines",
1596
+ formatter_class=argparse.RawDescriptionHelpFormatter,
1597
+ epilog="""
1598
+ Examples:
1599
+ # Analyze SQL query
1600
+ python etl_performance_optimizer.py analyze-sql query.sql
1601
+
1602
+ # Analyze with cost estimate
1603
+ python etl_performance_optimizer.py analyze-sql query.sql --warehouse bigquery
1604
+
1605
+ # Analyze Spark job metrics
1606
+ python etl_performance_optimizer.py analyze-spark spark-history.json
1607
+
1608
+ # Get partition recommendations
1609
+ python etl_performance_optimizer.py optimize-partition data_stats.json
1610
+
1611
+ # Estimate query cost
1612
+ python etl_performance_optimizer.py estimate-cost query.sql --warehouse snowflake
1613
+
1614
+ # Generate template files
1615
+ python etl_performance_optimizer.py template data_stats --output stats.json
1616
+ """
1617
+ )
1618
+
1619
+ parser.add_argument('--verbose', '-v', action='store_true', help='Verbose output')
1620
+
1621
+ subparsers = parser.add_subparsers(dest='command', help='Command to run')
1622
+
1623
+ # Analyze SQL command
1624
+ sql_parser = subparsers.add_parser('analyze-sql', help='Analyze SQL query')
1625
+ sql_parser.add_argument('input', help='SQL file or inline query')
1626
+ sql_parser.add_argument('--warehouse', '-w', choices=['bigquery', 'snowflake', 'redshift', 'databricks'],
1627
+ help='Warehouse for cost estimation')
1628
+ sql_parser.add_argument('--stats', '-s', help='Data statistics JSON file')
1629
+ sql_parser.add_argument('--output', '-o', help='Output file')
1630
+ sql_parser.add_argument('--json', action='store_true', help='Output as JSON')
1631
+ sql_parser.set_defaults(func=cmd_analyze_sql)
1632
+
1633
+ # Analyze Spark command
1634
+ spark_parser = subparsers.add_parser('analyze-spark', help='Analyze Spark job metrics')
1635
+ spark_parser.add_argument('input', help='Spark metrics JSON file')
1636
+ spark_parser.add_argument('--output', '-o', help='Output file')
1637
+ spark_parser.add_argument('--json', action='store_true', help='Output as JSON')
1638
+ spark_parser.set_defaults(func=cmd_analyze_spark)
1639
+
1640
+ # Optimize partition command
1641
+ partition_parser = subparsers.add_parser('optimize-partition', help='Recommend partition strategies')
1642
+ partition_parser.add_argument('input', help='Data statistics JSON file')
1643
+ partition_parser.add_argument('--output', '-o', help='Output file')
1644
+ partition_parser.add_argument('--json', action='store_true', help='Output as JSON')
1645
+ partition_parser.set_defaults(func=cmd_optimize_partition)
1646
+
1647
+ # Estimate cost command
1648
+ cost_parser = subparsers.add_parser('estimate-cost', help='Estimate query cost')
1649
+ cost_parser.add_argument('input', help='SQL file or inline query')
1650
+ cost_parser.add_argument('--warehouse', '-w', required=True,
1651
+ choices=['bigquery', 'snowflake', 'redshift', 'databricks'],
1652
+ help='Target warehouse')
1653
+ cost_parser.add_argument('--stats', '-s', help='Data statistics JSON file')
1654
+ cost_parser.add_argument('--output', '-o', help='Output file')
1655
+ cost_parser.add_argument('--json', action='store_true', help='Output as JSON')
1656
+ cost_parser.set_defaults(func=cmd_estimate_cost)
1657
+
1658
+ # Template command
1659
+ template_parser = subparsers.add_parser('template', help='Generate template files')
1660
+ template_parser.add_argument('template', choices=['data_stats', 'spark_metrics'],
1661
+ help='Template type')
1662
+ template_parser.add_argument('--output', '-o', help='Output file')
1663
+ template_parser.set_defaults(func=cmd_generate_template)
1664
+
1665
+ args = parser.parse_args()
1666
+
1667
+ if args.verbose:
1668
+ logging.getLogger().setLevel(logging.DEBUG)
1669
+
1670
+ if not args.command:
1671
+ parser.print_help()
1672
+ sys.exit(1)
1673
+
1674
+ try:
1675
+ args.func(args)
1676
+ except Exception as e:
1677
+ logger.error(f"Error: {e}")
1678
+ if args.verbose:
1679
+ import traceback
1680
+ traceback.print_exc()
1681
+ sys.exit(1)
1682
+
1683
+
1684
+ if __name__ == '__main__':
1685
+ main()