@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,1661 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ API Scorecard - Comprehensive API design quality assessment tool.
4
+
5
+ This script evaluates API designs across multiple dimensions and generates
6
+ a detailed scorecard with letter grades and improvement recommendations.
7
+
8
+ Scoring Dimensions:
9
+ - Consistency (30%): Naming conventions, response patterns, structural consistency
10
+ - Documentation (20%): Completeness and clarity of API documentation
11
+ - Security (20%): Authentication, authorization, and security best practices
12
+ - Usability (15%): Ease of use, discoverability, and developer experience
13
+ - Performance (15%): Caching, pagination, and efficiency patterns
14
+
15
+ Generates letter grades (A-F) with detailed breakdowns and actionable recommendations.
16
+ """
17
+
18
+ import argparse
19
+ import json
20
+ import re
21
+ import sys
22
+ from typing import Any, Dict, List, Optional, Set, Tuple
23
+ from dataclasses import dataclass, field
24
+ from enum import Enum
25
+ import math
26
+
27
+
28
+ class ScoreCategory(Enum):
29
+ """Scoring categories."""
30
+ CONSISTENCY = "consistency"
31
+ DOCUMENTATION = "documentation"
32
+ SECURITY = "security"
33
+ USABILITY = "usability"
34
+ PERFORMANCE = "performance"
35
+
36
+
37
+ @dataclass
38
+ class CategoryScore:
39
+ """Score for a specific category."""
40
+ category: ScoreCategory
41
+ score: float # 0-100
42
+ max_score: float # Usually 100
43
+ weight: float # Percentage weight in overall score
44
+ issues: List[str] = field(default_factory=list)
45
+ recommendations: List[str] = field(default_factory=list)
46
+
47
+ @property
48
+ def letter_grade(self) -> str:
49
+ """Convert score to letter grade."""
50
+ if self.score >= 90:
51
+ return "A"
52
+ elif self.score >= 80:
53
+ return "B"
54
+ elif self.score >= 70:
55
+ return "C"
56
+ elif self.score >= 60:
57
+ return "D"
58
+ else:
59
+ return "F"
60
+
61
+ @property
62
+ def weighted_score(self) -> float:
63
+ """Calculate weighted contribution to overall score."""
64
+ return (self.score / 100.0) * self.weight
65
+
66
+
67
+ @dataclass
68
+ class APIScorecard:
69
+ """Complete API scorecard with all category scores."""
70
+ category_scores: Dict[ScoreCategory, CategoryScore] = field(default_factory=dict)
71
+ overall_score: float = 0.0
72
+ overall_grade: str = "F"
73
+ total_endpoints: int = 0
74
+ api_info: Dict[str, Any] = field(default_factory=dict)
75
+
76
+ def calculate_overall_score(self) -> None:
77
+ """Calculate overall weighted score and grade."""
78
+ self.overall_score = sum(score.weighted_score for score in self.category_scores.values())
79
+
80
+ if self.overall_score >= 90:
81
+ self.overall_grade = "A"
82
+ elif self.overall_score >= 80:
83
+ self.overall_grade = "B"
84
+ elif self.overall_score >= 70:
85
+ self.overall_grade = "C"
86
+ elif self.overall_score >= 60:
87
+ self.overall_grade = "D"
88
+ else:
89
+ self.overall_grade = "F"
90
+
91
+ def get_top_recommendations(self, limit: int = 5) -> List[str]:
92
+ """Get top recommendations across all categories."""
93
+ all_recommendations = []
94
+ for category_score in self.category_scores.values():
95
+ for rec in category_score.recommendations:
96
+ all_recommendations.append(f"{category_score.category.value.title()}: {rec}")
97
+
98
+ # Sort by category weight (highest impact first)
99
+ weighted_recs = []
100
+ for category_score in sorted(self.category_scores.values(),
101
+ key=lambda x: x.weight, reverse=True):
102
+ for rec in category_score.recommendations[:2]: # Top 2 per category
103
+ weighted_recs.append(f"{category_score.category.value.title()}: {rec}")
104
+
105
+ return weighted_recs[:limit]
106
+
107
+
108
+ class APIScoringEngine:
109
+ """Main API scoring engine."""
110
+
111
+ def __init__(self):
112
+ self.scorecard = APIScorecard()
113
+ self.spec: Optional[Dict] = None
114
+
115
+ # Regex patterns for validation
116
+ self.kebab_case_pattern = re.compile(r'^[a-z]+(?:-[a-z0-9]+)*$')
117
+ self.camel_case_pattern = re.compile(r'^[a-z][a-zA-Z0-9]*$')
118
+ self.pascal_case_pattern = re.compile(r'^[A-Z][a-zA-Z0-9]*$')
119
+
120
+ # HTTP methods
121
+ self.http_methods = {'GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'}
122
+
123
+ # Category weights (must sum to 100)
124
+ self.category_weights = {
125
+ ScoreCategory.CONSISTENCY: 30.0,
126
+ ScoreCategory.DOCUMENTATION: 20.0,
127
+ ScoreCategory.SECURITY: 20.0,
128
+ ScoreCategory.USABILITY: 15.0,
129
+ ScoreCategory.PERFORMANCE: 15.0
130
+ }
131
+
132
+ def score_api(self, spec: Dict[str, Any]) -> APIScorecard:
133
+ """Generate comprehensive API scorecard."""
134
+ self.spec = spec
135
+ self.scorecard = APIScorecard()
136
+
137
+ # Extract basic API info
138
+ self._extract_api_info()
139
+
140
+ # Score each category
141
+ self._score_consistency()
142
+ self._score_documentation()
143
+ self._score_security()
144
+ self._score_usability()
145
+ self._score_performance()
146
+
147
+ # Calculate overall score
148
+ self.scorecard.calculate_overall_score()
149
+
150
+ return self.scorecard
151
+
152
+ def _extract_api_info(self) -> None:
153
+ """Extract basic API information."""
154
+ info = self.spec.get('info', {})
155
+ paths = self.spec.get('paths', {})
156
+
157
+ self.scorecard.api_info = {
158
+ 'title': info.get('title', 'Unknown API'),
159
+ 'version': info.get('version', ''),
160
+ 'description': info.get('description', ''),
161
+ 'total_paths': len(paths),
162
+ 'openapi_version': self.spec.get('openapi', self.spec.get('swagger', ''))
163
+ }
164
+
165
+ # Count total endpoints
166
+ endpoint_count = 0
167
+ for path_obj in paths.values():
168
+ if isinstance(path_obj, dict):
169
+ endpoint_count += len([m for m in path_obj.keys()
170
+ if m.upper() in self.http_methods])
171
+
172
+ self.scorecard.total_endpoints = endpoint_count
173
+
174
+ def _score_consistency(self) -> None:
175
+ """Score API consistency (30% weight)."""
176
+ category = ScoreCategory.CONSISTENCY
177
+ score = CategoryScore(
178
+ category=category,
179
+ score=0.0,
180
+ max_score=100.0,
181
+ weight=self.category_weights[category]
182
+ )
183
+
184
+ consistency_checks = [
185
+ self._check_naming_consistency(),
186
+ self._check_response_consistency(),
187
+ self._check_error_format_consistency(),
188
+ self._check_parameter_consistency(),
189
+ self._check_url_structure_consistency(),
190
+ self._check_http_method_consistency(),
191
+ self._check_status_code_consistency()
192
+ ]
193
+
194
+ # Average the consistency scores
195
+ valid_scores = [s for s in consistency_checks if s is not None]
196
+ if valid_scores:
197
+ score.score = sum(valid_scores) / len(valid_scores)
198
+
199
+ # Add specific recommendations based on low scores
200
+ if score.score < 70:
201
+ score.recommendations.extend([
202
+ "Review naming conventions across all endpoints and schemas",
203
+ "Standardize response formats and error structures",
204
+ "Ensure consistent HTTP method usage patterns"
205
+ ])
206
+ elif score.score < 85:
207
+ score.recommendations.extend([
208
+ "Minor consistency improvements needed in naming or response formats",
209
+ "Consider creating API design guidelines document"
210
+ ])
211
+
212
+ self.scorecard.category_scores[category] = score
213
+
214
+ def _check_naming_consistency(self) -> float:
215
+ """Check naming convention consistency."""
216
+ paths = self.spec.get('paths', {})
217
+ schemas = self.spec.get('components', {}).get('schemas', {})
218
+
219
+ total_checks = 0
220
+ passed_checks = 0
221
+
222
+ # Check path naming (should be kebab-case)
223
+ for path in paths.keys():
224
+ segments = [seg for seg in path.split('/') if seg and not seg.startswith('{')]
225
+ for segment in segments:
226
+ total_checks += 1
227
+ if self.kebab_case_pattern.match(segment) or re.match(r'^v\d+$', segment):
228
+ passed_checks += 1
229
+
230
+ # Check schema naming (should be PascalCase)
231
+ for schema_name in schemas.keys():
232
+ total_checks += 1
233
+ if self.pascal_case_pattern.match(schema_name):
234
+ passed_checks += 1
235
+
236
+ # Check property naming within schemas
237
+ for schema in schemas.values():
238
+ if isinstance(schema, dict) and 'properties' in schema:
239
+ for prop_name in schema['properties'].keys():
240
+ total_checks += 1
241
+ if self.camel_case_pattern.match(prop_name):
242
+ passed_checks += 1
243
+
244
+ return (passed_checks / total_checks * 100) if total_checks > 0 else 100
245
+
246
+ def _check_response_consistency(self) -> float:
247
+ """Check response format consistency."""
248
+ paths = self.spec.get('paths', {})
249
+
250
+ response_patterns = []
251
+ total_responses = 0
252
+
253
+ for path_obj in paths.values():
254
+ if not isinstance(path_obj, dict):
255
+ continue
256
+
257
+ for method, operation in path_obj.items():
258
+ if method.upper() not in self.http_methods or not isinstance(operation, dict):
259
+ continue
260
+
261
+ responses = operation.get('responses', {})
262
+ for status_code, response in responses.items():
263
+ if not isinstance(response, dict):
264
+ continue
265
+
266
+ total_responses += 1
267
+ content = response.get('content', {})
268
+
269
+ # Analyze response structure
270
+ for media_type, media_obj in content.items():
271
+ schema = media_obj.get('schema', {})
272
+ pattern = self._extract_schema_pattern(schema)
273
+ response_patterns.append(pattern)
274
+
275
+ # Calculate consistency by comparing patterns
276
+ if not response_patterns:
277
+ return 100
278
+
279
+ pattern_counts = {}
280
+ for pattern in response_patterns:
281
+ pattern_key = json.dumps(pattern, sort_keys=True)
282
+ pattern_counts[pattern_key] = pattern_counts.get(pattern_key, 0) + 1
283
+
284
+ # Most common pattern should dominate for good consistency
285
+ max_count = max(pattern_counts.values()) if pattern_counts else 0
286
+ consistency_ratio = max_count / len(response_patterns) if response_patterns else 1
287
+
288
+ return consistency_ratio * 100
289
+
290
+ def _extract_schema_pattern(self, schema: Dict[str, Any]) -> Dict[str, Any]:
291
+ """Extract a pattern from a schema for consistency checking."""
292
+ if not isinstance(schema, dict):
293
+ return {}
294
+
295
+ pattern = {
296
+ 'type': schema.get('type'),
297
+ 'has_properties': 'properties' in schema,
298
+ 'has_items': 'items' in schema,
299
+ 'required_count': len(schema.get('required', [])),
300
+ 'property_count': len(schema.get('properties', {}))
301
+ }
302
+
303
+ return pattern
304
+
305
+ def _check_error_format_consistency(self) -> float:
306
+ """Check error response format consistency."""
307
+ paths = self.spec.get('paths', {})
308
+ error_responses = []
309
+
310
+ for path_obj in paths.values():
311
+ if not isinstance(path_obj, dict):
312
+ continue
313
+
314
+ for method, operation in path_obj.items():
315
+ if method.upper() not in self.http_methods:
316
+ continue
317
+
318
+ responses = operation.get('responses', {})
319
+ for status_code, response in responses.items():
320
+ try:
321
+ code_int = int(status_code)
322
+ if code_int >= 400: # Error responses
323
+ content = response.get('content', {})
324
+ for media_type, media_obj in content.items():
325
+ schema = media_obj.get('schema', {})
326
+ error_responses.append(self._extract_schema_pattern(schema))
327
+ except ValueError:
328
+ continue
329
+
330
+ if not error_responses:
331
+ return 80 # No error responses defined - somewhat concerning
332
+
333
+ # Check consistency of error response formats
334
+ pattern_counts = {}
335
+ for pattern in error_responses:
336
+ pattern_key = json.dumps(pattern, sort_keys=True)
337
+ pattern_counts[pattern_key] = pattern_counts.get(pattern_key, 0) + 1
338
+
339
+ max_count = max(pattern_counts.values()) if pattern_counts else 0
340
+ consistency_ratio = max_count / len(error_responses) if error_responses else 1
341
+
342
+ return consistency_ratio * 100
343
+
344
+ def _check_parameter_consistency(self) -> float:
345
+ """Check parameter naming and usage consistency."""
346
+ paths = self.spec.get('paths', {})
347
+
348
+ query_params = []
349
+ path_params = []
350
+ header_params = []
351
+
352
+ for path_obj in paths.values():
353
+ if not isinstance(path_obj, dict):
354
+ continue
355
+
356
+ for method, operation in path_obj.items():
357
+ if method.upper() not in self.http_methods:
358
+ continue
359
+
360
+ parameters = operation.get('parameters', [])
361
+ for param in parameters:
362
+ if not isinstance(param, dict):
363
+ continue
364
+
365
+ param_name = param.get('name', '')
366
+ param_in = param.get('in', '')
367
+
368
+ if param_in == 'query':
369
+ query_params.append(param_name)
370
+ elif param_in == 'path':
371
+ path_params.append(param_name)
372
+ elif param_in == 'header':
373
+ header_params.append(param_name)
374
+
375
+ # Check naming consistency for each parameter type
376
+ scores = []
377
+
378
+ # Query parameters should be camelCase or kebab-case
379
+ if query_params:
380
+ valid_query = sum(1 for p in query_params
381
+ if self.camel_case_pattern.match(p) or self.kebab_case_pattern.match(p))
382
+ scores.append((valid_query / len(query_params)) * 100)
383
+
384
+ # Path parameters should be camelCase or kebab-case
385
+ if path_params:
386
+ valid_path = sum(1 for p in path_params
387
+ if self.camel_case_pattern.match(p) or self.kebab_case_pattern.match(p))
388
+ scores.append((valid_path / len(path_params)) * 100)
389
+
390
+ return sum(scores) / len(scores) if scores else 100
391
+
392
+ def _check_url_structure_consistency(self) -> float:
393
+ """Check URL structure and pattern consistency."""
394
+ paths = self.spec.get('paths', {})
395
+
396
+ total_paths = len(paths)
397
+ if total_paths == 0:
398
+ return 0
399
+
400
+ structure_score = 0
401
+
402
+ # Check for consistent versioning
403
+ versioned_paths = 0
404
+ for path in paths.keys():
405
+ if re.search(r'/v\d+/', path):
406
+ versioned_paths += 1
407
+
408
+ # Either all or none should be versioned for consistency
409
+ if versioned_paths == 0 or versioned_paths == total_paths:
410
+ structure_score += 25
411
+ elif versioned_paths > total_paths * 0.8:
412
+ structure_score += 20
413
+
414
+ # Check for reasonable path depth
415
+ reasonable_depth = 0
416
+ for path in paths.keys():
417
+ segments = [seg for seg in path.split('/') if seg]
418
+ if 2 <= len(segments) <= 5: # Reasonable depth
419
+ reasonable_depth += 1
420
+
421
+ structure_score += (reasonable_depth / total_paths) * 25
422
+
423
+ # Check for RESTful resource patterns
424
+ restful_patterns = 0
425
+ for path in paths.keys():
426
+ # Look for patterns like /resources/{id} or /resources
427
+ if re.match(r'^/[a-z-]+(/\{[^}]+\})?(/[a-z-]+)*$', path):
428
+ restful_patterns += 1
429
+
430
+ structure_score += (restful_patterns / total_paths) * 30
431
+
432
+ # Check for consistent trailing slash usage
433
+ with_slash = sum(1 for path in paths.keys() if path.endswith('/'))
434
+ without_slash = total_paths - with_slash
435
+
436
+ # Either all or none should have trailing slashes
437
+ if with_slash == 0 or without_slash == 0:
438
+ structure_score += 20
439
+ elif min(with_slash, without_slash) < total_paths * 0.1:
440
+ structure_score += 15
441
+
442
+ return min(structure_score, 100)
443
+
444
+ def _check_http_method_consistency(self) -> float:
445
+ """Check HTTP method usage consistency."""
446
+ paths = self.spec.get('paths', {})
447
+
448
+ method_usage = {}
449
+ total_operations = 0
450
+
451
+ for path, path_obj in paths.items():
452
+ if not isinstance(path_obj, dict):
453
+ continue
454
+
455
+ for method in path_obj.keys():
456
+ if method.upper() in self.http_methods:
457
+ method_upper = method.upper()
458
+ total_operations += 1
459
+
460
+ # Analyze method usage patterns
461
+ if method_upper not in method_usage:
462
+ method_usage[method_upper] = {'count': 0, 'appropriate': 0}
463
+
464
+ method_usage[method_upper]['count'] += 1
465
+
466
+ # Check if method usage seems appropriate
467
+ if self._is_method_usage_appropriate(path, method_upper, path_obj[method]):
468
+ method_usage[method_upper]['appropriate'] += 1
469
+
470
+ if total_operations == 0:
471
+ return 0
472
+
473
+ # Calculate appropriateness score
474
+ total_appropriate = sum(data['appropriate'] for data in method_usage.values())
475
+ return (total_appropriate / total_operations) * 100
476
+
477
+ def _is_method_usage_appropriate(self, path: str, method: str, operation: Dict) -> bool:
478
+ """Check if HTTP method usage is appropriate for the endpoint."""
479
+ # Simple heuristics for method appropriateness
480
+ has_request_body = 'requestBody' in operation
481
+ path_has_id = '{' in path and '}' in path
482
+
483
+ if method == 'GET':
484
+ return not has_request_body # GET should not have body
485
+ elif method == 'POST':
486
+ return not path_has_id # POST typically for collections
487
+ elif method == 'PUT':
488
+ return path_has_id and has_request_body # PUT for specific resources
489
+ elif method == 'PATCH':
490
+ return path_has_id # PATCH for specific resources
491
+ elif method == 'DELETE':
492
+ return path_has_id # DELETE for specific resources
493
+
494
+ return True # Default to appropriate for other methods
495
+
496
+ def _check_status_code_consistency(self) -> float:
497
+ """Check HTTP status code usage consistency."""
498
+ paths = self.spec.get('paths', {})
499
+
500
+ method_status_patterns = {}
501
+ total_operations = 0
502
+
503
+ for path_obj in paths.values():
504
+ if not isinstance(path_obj, dict):
505
+ continue
506
+
507
+ for method, operation in path_obj.items():
508
+ if method.upper() not in self.http_methods:
509
+ continue
510
+
511
+ total_operations += 1
512
+ responses = operation.get('responses', {})
513
+ status_codes = set(responses.keys())
514
+
515
+ if method.upper() not in method_status_patterns:
516
+ method_status_patterns[method.upper()] = []
517
+
518
+ method_status_patterns[method.upper()].append(status_codes)
519
+
520
+ if total_operations == 0:
521
+ return 0
522
+
523
+ # Check consistency within each method type
524
+ consistency_scores = []
525
+
526
+ for method, status_patterns in method_status_patterns.items():
527
+ if not status_patterns:
528
+ continue
529
+
530
+ # Find common status codes for this method
531
+ all_codes = set()
532
+ for pattern in status_patterns:
533
+ all_codes.update(pattern)
534
+
535
+ # Calculate how many operations use the most common codes
536
+ code_usage = {}
537
+ for code in all_codes:
538
+ code_usage[code] = sum(1 for pattern in status_patterns if code in pattern)
539
+
540
+ # Score based on consistency of common status codes
541
+ if status_patterns:
542
+ avg_consistency = sum(
543
+ len([code for code in pattern if code_usage.get(code, 0) > len(status_patterns) * 0.5])
544
+ for pattern in status_patterns
545
+ ) / len(status_patterns)
546
+
547
+ method_consistency = min(avg_consistency / 3.0 * 100, 100) # Expect ~3 common codes
548
+ consistency_scores.append(method_consistency)
549
+
550
+ return sum(consistency_scores) / len(consistency_scores) if consistency_scores else 100
551
+
552
+ def _score_documentation(self) -> None:
553
+ """Score API documentation quality (20% weight)."""
554
+ category = ScoreCategory.DOCUMENTATION
555
+ score = CategoryScore(
556
+ category=category,
557
+ score=0.0,
558
+ max_score=100.0,
559
+ weight=self.category_weights[category]
560
+ )
561
+
562
+ documentation_checks = [
563
+ self._check_api_level_documentation(),
564
+ self._check_endpoint_documentation(),
565
+ self._check_schema_documentation(),
566
+ self._check_parameter_documentation(),
567
+ self._check_response_documentation(),
568
+ self._check_example_coverage()
569
+ ]
570
+
571
+ valid_scores = [s for s in documentation_checks if s is not None]
572
+ if valid_scores:
573
+ score.score = sum(valid_scores) / len(valid_scores)
574
+
575
+ # Add recommendations based on score
576
+ if score.score < 60:
577
+ score.recommendations.extend([
578
+ "Add comprehensive descriptions to all API components",
579
+ "Include examples for complex operations and schemas",
580
+ "Document all parameters and response fields"
581
+ ])
582
+ elif score.score < 80:
583
+ score.recommendations.extend([
584
+ "Improve documentation completeness for some endpoints",
585
+ "Add more examples to enhance developer experience"
586
+ ])
587
+
588
+ self.scorecard.category_scores[category] = score
589
+
590
+ def _check_api_level_documentation(self) -> float:
591
+ """Check API-level documentation completeness."""
592
+ info = self.spec.get('info', {})
593
+ score = 0
594
+
595
+ # Required fields
596
+ if info.get('title'):
597
+ score += 20
598
+ if info.get('version'):
599
+ score += 20
600
+ if info.get('description') and len(info['description']) > 20:
601
+ score += 30
602
+
603
+ # Optional but recommended fields
604
+ if info.get('contact'):
605
+ score += 15
606
+ if info.get('license'):
607
+ score += 15
608
+
609
+ return score
610
+
611
+ def _check_endpoint_documentation(self) -> float:
612
+ """Check endpoint-level documentation completeness."""
613
+ paths = self.spec.get('paths', {})
614
+
615
+ total_operations = 0
616
+ documented_operations = 0
617
+
618
+ for path_obj in paths.values():
619
+ if not isinstance(path_obj, dict):
620
+ continue
621
+
622
+ for method, operation in path_obj.items():
623
+ if method.upper() not in self.http_methods:
624
+ continue
625
+
626
+ total_operations += 1
627
+ doc_score = 0
628
+
629
+ if operation.get('summary'):
630
+ doc_score += 1
631
+ if operation.get('description') and len(operation['description']) > 20:
632
+ doc_score += 1
633
+ if operation.get('operationId'):
634
+ doc_score += 1
635
+
636
+ # Consider it documented if it has at least 2/3 elements
637
+ if doc_score >= 2:
638
+ documented_operations += 1
639
+
640
+ return (documented_operations / total_operations * 100) if total_operations > 0 else 100
641
+
642
+ def _check_schema_documentation(self) -> float:
643
+ """Check schema documentation completeness."""
644
+ schemas = self.spec.get('components', {}).get('schemas', {})
645
+
646
+ if not schemas:
647
+ return 80 # No schemas to document
648
+
649
+ total_schemas = len(schemas)
650
+ documented_schemas = 0
651
+
652
+ for schema_name, schema in schemas.items():
653
+ if not isinstance(schema, dict):
654
+ continue
655
+
656
+ doc_elements = 0
657
+
658
+ # Schema-level description
659
+ if schema.get('description'):
660
+ doc_elements += 1
661
+
662
+ # Property descriptions
663
+ properties = schema.get('properties', {})
664
+ if properties:
665
+ described_props = sum(1 for prop in properties.values()
666
+ if isinstance(prop, dict) and prop.get('description'))
667
+ if described_props > len(properties) * 0.5: # At least 50% documented
668
+ doc_elements += 1
669
+
670
+ # Examples
671
+ if schema.get('example') or any(
672
+ isinstance(prop, dict) and prop.get('example')
673
+ for prop in properties.values()
674
+ ):
675
+ doc_elements += 1
676
+
677
+ if doc_elements >= 2:
678
+ documented_schemas += 1
679
+
680
+ return (documented_schemas / total_schemas * 100) if total_schemas > 0 else 100
681
+
682
+ def _check_parameter_documentation(self) -> float:
683
+ """Check parameter documentation completeness."""
684
+ paths = self.spec.get('paths', {})
685
+
686
+ total_params = 0
687
+ documented_params = 0
688
+
689
+ for path_obj in paths.values():
690
+ if not isinstance(path_obj, dict):
691
+ continue
692
+
693
+ for method, operation in path_obj.items():
694
+ if method.upper() not in self.http_methods:
695
+ continue
696
+
697
+ parameters = operation.get('parameters', [])
698
+ for param in parameters:
699
+ if not isinstance(param, dict):
700
+ continue
701
+
702
+ total_params += 1
703
+
704
+ doc_score = 0
705
+ if param.get('description'):
706
+ doc_score += 1
707
+ if param.get('example') or (param.get('schema', {}).get('example')):
708
+ doc_score += 1
709
+
710
+ if doc_score >= 1: # At least description
711
+ documented_params += 1
712
+
713
+ return (documented_params / total_params * 100) if total_params > 0 else 100
714
+
715
+ def _check_response_documentation(self) -> float:
716
+ """Check response documentation completeness."""
717
+ paths = self.spec.get('paths', {})
718
+
719
+ total_responses = 0
720
+ documented_responses = 0
721
+
722
+ for path_obj in paths.values():
723
+ if not isinstance(path_obj, dict):
724
+ continue
725
+
726
+ for method, operation in path_obj.items():
727
+ if method.upper() not in self.http_methods:
728
+ continue
729
+
730
+ responses = operation.get('responses', {})
731
+ for status_code, response in responses.items():
732
+ if not isinstance(response, dict):
733
+ continue
734
+
735
+ total_responses += 1
736
+
737
+ if response.get('description'):
738
+ documented_responses += 1
739
+
740
+ return (documented_responses / total_responses * 100) if total_responses > 0 else 100
741
+
742
+ def _check_example_coverage(self) -> float:
743
+ """Check example coverage across the API."""
744
+ paths = self.spec.get('paths', {})
745
+ schemas = self.spec.get('components', {}).get('schemas', {})
746
+
747
+ # Check examples in operations
748
+ total_operations = 0
749
+ operations_with_examples = 0
750
+
751
+ for path_obj in paths.values():
752
+ if not isinstance(path_obj, dict):
753
+ continue
754
+
755
+ for method, operation in path_obj.items():
756
+ if method.upper() not in self.http_methods:
757
+ continue
758
+
759
+ total_operations += 1
760
+
761
+ has_example = False
762
+
763
+ # Check request body examples
764
+ request_body = operation.get('requestBody', {})
765
+ if self._has_examples(request_body.get('content', {})):
766
+ has_example = True
767
+
768
+ # Check response examples
769
+ responses = operation.get('responses', {})
770
+ for response in responses.values():
771
+ if isinstance(response, dict) and self._has_examples(response.get('content', {})):
772
+ has_example = True
773
+ break
774
+
775
+ if has_example:
776
+ operations_with_examples += 1
777
+
778
+ # Check examples in schemas
779
+ total_schemas = len(schemas)
780
+ schemas_with_examples = 0
781
+
782
+ for schema in schemas.values():
783
+ if isinstance(schema, dict) and self._schema_has_examples(schema):
784
+ schemas_with_examples += 1
785
+
786
+ # Combine scores
787
+ operation_score = (operations_with_examples / total_operations * 100) if total_operations > 0 else 100
788
+ schema_score = (schemas_with_examples / total_schemas * 100) if total_schemas > 0 else 100
789
+
790
+ return (operation_score + schema_score) / 2
791
+
792
+ def _has_examples(self, content: Dict[str, Any]) -> bool:
793
+ """Check if content has examples."""
794
+ for media_type, media_obj in content.items():
795
+ if isinstance(media_obj, dict):
796
+ if media_obj.get('example') or media_obj.get('examples'):
797
+ return True
798
+ return False
799
+
800
+ def _schema_has_examples(self, schema: Dict[str, Any]) -> bool:
801
+ """Check if schema has examples."""
802
+ if schema.get('example'):
803
+ return True
804
+
805
+ properties = schema.get('properties', {})
806
+ for prop in properties.values():
807
+ if isinstance(prop, dict) and prop.get('example'):
808
+ return True
809
+
810
+ return False
811
+
812
+ def _score_security(self) -> None:
813
+ """Score API security implementation (20% weight)."""
814
+ category = ScoreCategory.SECURITY
815
+ score = CategoryScore(
816
+ category=category,
817
+ score=0.0,
818
+ max_score=100.0,
819
+ weight=self.category_weights[category]
820
+ )
821
+
822
+ security_checks = [
823
+ self._check_security_schemes(),
824
+ self._check_security_requirements(),
825
+ self._check_https_usage(),
826
+ self._check_authentication_patterns(),
827
+ self._check_sensitive_data_handling()
828
+ ]
829
+
830
+ valid_scores = [s for s in security_checks if s is not None]
831
+ if valid_scores:
832
+ score.score = sum(valid_scores) / len(valid_scores)
833
+
834
+ # Add recommendations
835
+ if score.score < 50:
836
+ score.recommendations.extend([
837
+ "Implement comprehensive security schemes (OAuth2, API keys, etc.)",
838
+ "Ensure all endpoints have appropriate security requirements",
839
+ "Add input validation and rate limiting patterns"
840
+ ])
841
+ elif score.score < 80:
842
+ score.recommendations.extend([
843
+ "Review security coverage for all endpoints",
844
+ "Consider additional security measures for sensitive operations"
845
+ ])
846
+
847
+ self.scorecard.category_scores[category] = score
848
+
849
+ def _check_security_schemes(self) -> float:
850
+ """Check security scheme definitions."""
851
+ security_schemes = self.spec.get('components', {}).get('securitySchemes', {})
852
+
853
+ if not security_schemes:
854
+ return 20 # Very low score for no security
855
+
856
+ score = 40 # Base score for having security schemes
857
+
858
+ scheme_types = set()
859
+ for scheme in security_schemes.values():
860
+ if isinstance(scheme, dict):
861
+ scheme_type = scheme.get('type')
862
+ scheme_types.add(scheme_type)
863
+
864
+ # Bonus for modern security schemes
865
+ if 'oauth2' in scheme_types:
866
+ score += 30
867
+ if 'apiKey' in scheme_types:
868
+ score += 15
869
+ if 'http' in scheme_types:
870
+ score += 15
871
+
872
+ return min(score, 100)
873
+
874
+ def _check_security_requirements(self) -> float:
875
+ """Check security requirement coverage."""
876
+ paths = self.spec.get('paths', {})
877
+ global_security = self.spec.get('security', [])
878
+
879
+ total_operations = 0
880
+ secured_operations = 0
881
+
882
+ for path_obj in paths.values():
883
+ if not isinstance(path_obj, dict):
884
+ continue
885
+
886
+ for method, operation in path_obj.items():
887
+ if method.upper() not in self.http_methods:
888
+ continue
889
+
890
+ total_operations += 1
891
+
892
+ # Check if operation has security requirements
893
+ operation_security = operation.get('security')
894
+
895
+ if operation_security is not None:
896
+ secured_operations += 1
897
+ elif global_security:
898
+ secured_operations += 1
899
+
900
+ return (secured_operations / total_operations * 100) if total_operations > 0 else 0
901
+
902
+ def _check_https_usage(self) -> float:
903
+ """Check HTTPS enforcement."""
904
+ servers = self.spec.get('servers', [])
905
+
906
+ if not servers:
907
+ return 60 # No servers defined - assume HTTPS
908
+
909
+ https_servers = 0
910
+ for server in servers:
911
+ if isinstance(server, dict):
912
+ url = server.get('url', '')
913
+ if url.startswith('https://') or not url.startswith('http://'):
914
+ https_servers += 1
915
+
916
+ return (https_servers / len(servers) * 100) if servers else 100
917
+
918
+ def _check_authentication_patterns(self) -> float:
919
+ """Check authentication pattern quality."""
920
+ security_schemes = self.spec.get('components', {}).get('securitySchemes', {})
921
+
922
+ if not security_schemes:
923
+ return 0
924
+
925
+ pattern_scores = []
926
+
927
+ for scheme in security_schemes.values():
928
+ if not isinstance(scheme, dict):
929
+ continue
930
+
931
+ scheme_type = scheme.get('type', '').lower()
932
+
933
+ if scheme_type == 'oauth2':
934
+ # OAuth2 is highly recommended
935
+ flows = scheme.get('flows', {})
936
+ if flows:
937
+ pattern_scores.append(95)
938
+ else:
939
+ pattern_scores.append(80)
940
+ elif scheme_type == 'http':
941
+ scheme_scheme = scheme.get('scheme', '').lower()
942
+ if scheme_scheme == 'bearer':
943
+ pattern_scores.append(85)
944
+ elif scheme_scheme == 'basic':
945
+ pattern_scores.append(60) # Less secure
946
+ else:
947
+ pattern_scores.append(70)
948
+ elif scheme_type == 'apikey':
949
+ location = scheme.get('in', '').lower()
950
+ if location == 'header':
951
+ pattern_scores.append(75)
952
+ else:
953
+ pattern_scores.append(60) # Query/cookie less secure
954
+ else:
955
+ pattern_scores.append(50) # Unknown scheme
956
+
957
+ return sum(pattern_scores) / len(pattern_scores) if pattern_scores else 0
958
+
959
+ def _check_sensitive_data_handling(self) -> float:
960
+ """Check sensitive data handling patterns."""
961
+ # This is a simplified check - in reality would need more sophisticated analysis
962
+ schemas = self.spec.get('components', {}).get('schemas', {})
963
+
964
+ score = 80 # Default good score
965
+
966
+ # Look for potential sensitive fields without proper handling
967
+ sensitive_field_names = {'password', 'secret', 'token', 'key', 'ssn', 'credit_card'}
968
+
969
+ for schema in schemas.values():
970
+ if not isinstance(schema, dict):
971
+ continue
972
+
973
+ properties = schema.get('properties', {})
974
+ for prop_name, prop_def in properties.items():
975
+ if not isinstance(prop_def, dict):
976
+ continue
977
+
978
+ # Check for sensitive field names
979
+ if any(sensitive in prop_name.lower() for sensitive in sensitive_field_names):
980
+ # Check if it's marked as sensitive (writeOnly, format: password, etc.)
981
+ if not (prop_def.get('writeOnly') or
982
+ prop_def.get('format') == 'password' or
983
+ 'password' in prop_def.get('description', '').lower()):
984
+ score -= 10 # Penalty for exposed sensitive field
985
+
986
+ return max(score, 0)
987
+
988
+ def _score_usability(self) -> None:
989
+ """Score API usability and developer experience (15% weight)."""
990
+ category = ScoreCategory.USABILITY
991
+ score = CategoryScore(
992
+ category=category,
993
+ score=0.0,
994
+ max_score=100.0,
995
+ weight=self.category_weights[category]
996
+ )
997
+
998
+ usability_checks = [
999
+ self._check_discoverability(),
1000
+ self._check_error_handling(),
1001
+ self._check_filtering_and_searching(),
1002
+ self._check_resource_relationships(),
1003
+ self._check_developer_experience()
1004
+ ]
1005
+
1006
+ valid_scores = [s for s in usability_checks if s is not None]
1007
+ if valid_scores:
1008
+ score.score = sum(valid_scores) / len(valid_scores)
1009
+
1010
+ # Add recommendations
1011
+ if score.score < 60:
1012
+ score.recommendations.extend([
1013
+ "Improve error messages with actionable guidance",
1014
+ "Add filtering and search capabilities to list endpoints",
1015
+ "Enhance resource discoverability with better linking"
1016
+ ])
1017
+ elif score.score < 80:
1018
+ score.recommendations.extend([
1019
+ "Consider adding HATEOAS links for better discoverability",
1020
+ "Enhance developer experience with better examples"
1021
+ ])
1022
+
1023
+ self.scorecard.category_scores[category] = score
1024
+
1025
+ def _check_discoverability(self) -> float:
1026
+ """Check API discoverability features."""
1027
+ paths = self.spec.get('paths', {})
1028
+
1029
+ # Look for root/discovery endpoints
1030
+ has_root = '/' in paths or any(path == '/api' or path.startswith('/api/') for path in paths)
1031
+
1032
+ # Look for HATEOAS patterns in responses
1033
+ hateoas_score = 0
1034
+ total_responses = 0
1035
+
1036
+ for path_obj in paths.values():
1037
+ if not isinstance(path_obj, dict):
1038
+ continue
1039
+
1040
+ for method, operation in path_obj.items():
1041
+ if method.upper() not in self.http_methods:
1042
+ continue
1043
+
1044
+ responses = operation.get('responses', {})
1045
+ for response in responses.values():
1046
+ if not isinstance(response, dict):
1047
+ continue
1048
+
1049
+ total_responses += 1
1050
+
1051
+ # Look for link-like properties in response schemas
1052
+ content = response.get('content', {})
1053
+ for media_obj in content.values():
1054
+ schema = media_obj.get('schema', {})
1055
+ if self._has_link_properties(schema):
1056
+ hateoas_score += 1
1057
+ break
1058
+
1059
+ discovery_score = 50 if has_root else 30
1060
+ if total_responses > 0:
1061
+ hateoas_ratio = hateoas_score / total_responses
1062
+ discovery_score += hateoas_ratio * 50
1063
+
1064
+ return min(discovery_score, 100)
1065
+
1066
+ def _has_link_properties(self, schema: Dict[str, Any]) -> bool:
1067
+ """Check if schema has link-like properties."""
1068
+ if not isinstance(schema, dict):
1069
+ return False
1070
+
1071
+ properties = schema.get('properties', {})
1072
+ link_indicators = {'links', '_links', 'href', 'url', 'self', 'next', 'prev'}
1073
+
1074
+ return any(prop_name.lower() in link_indicators for prop_name in properties.keys())
1075
+
1076
+ def _check_error_handling(self) -> float:
1077
+ """Check error handling quality."""
1078
+ paths = self.spec.get('paths', {})
1079
+
1080
+ total_operations = 0
1081
+ operations_with_errors = 0
1082
+ detailed_error_responses = 0
1083
+
1084
+ for path_obj in paths.values():
1085
+ if not isinstance(path_obj, dict):
1086
+ continue
1087
+
1088
+ for method, operation in path_obj.items():
1089
+ if method.upper() not in self.http_methods:
1090
+ continue
1091
+
1092
+ total_operations += 1
1093
+ responses = operation.get('responses', {})
1094
+
1095
+ # Check for error responses
1096
+ has_error_responses = any(
1097
+ status_code.startswith('4') or status_code.startswith('5')
1098
+ for status_code in responses.keys()
1099
+ )
1100
+
1101
+ if has_error_responses:
1102
+ operations_with_errors += 1
1103
+
1104
+ # Check for detailed error schemas
1105
+ for status_code, response in responses.items():
1106
+ if (status_code.startswith('4') or status_code.startswith('5')) and isinstance(response, dict):
1107
+ content = response.get('content', {})
1108
+ for media_obj in content.values():
1109
+ schema = media_obj.get('schema', {})
1110
+ if self._has_detailed_error_schema(schema):
1111
+ detailed_error_responses += 1
1112
+ break
1113
+ break
1114
+
1115
+ if total_operations == 0:
1116
+ return 0
1117
+
1118
+ error_coverage = (operations_with_errors / total_operations) * 60
1119
+ error_detail = (detailed_error_responses / operations_with_errors * 40) if operations_with_errors > 0 else 0
1120
+
1121
+ return error_coverage + error_detail
1122
+
1123
+ def _has_detailed_error_schema(self, schema: Dict[str, Any]) -> bool:
1124
+ """Check if error schema has detailed information."""
1125
+ if not isinstance(schema, dict):
1126
+ return False
1127
+
1128
+ properties = schema.get('properties', {})
1129
+ error_fields = {'error', 'message', 'details', 'code', 'timestamp'}
1130
+
1131
+ matching_fields = sum(1 for field in error_fields if field in properties)
1132
+ return matching_fields >= 2 # At least 2 standard error fields
1133
+
1134
+ def _check_filtering_and_searching(self) -> float:
1135
+ """Check filtering and search capabilities."""
1136
+ paths = self.spec.get('paths', {})
1137
+
1138
+ collection_endpoints = 0
1139
+ endpoints_with_filtering = 0
1140
+
1141
+ for path, path_obj in paths.items():
1142
+ if not isinstance(path_obj, dict):
1143
+ continue
1144
+
1145
+ # Identify collection endpoints (no path parameters)
1146
+ if '{' not in path:
1147
+ get_operation = path_obj.get('get')
1148
+ if get_operation:
1149
+ collection_endpoints += 1
1150
+
1151
+ # Check for filtering/search parameters
1152
+ parameters = get_operation.get('parameters', [])
1153
+ filter_params = {'filter', 'search', 'q', 'query', 'limit', 'page', 'offset'}
1154
+
1155
+ has_filtering = any(
1156
+ isinstance(param, dict) and param.get('name', '').lower() in filter_params
1157
+ for param in parameters
1158
+ )
1159
+
1160
+ if has_filtering:
1161
+ endpoints_with_filtering += 1
1162
+
1163
+ return (endpoints_with_filtering / collection_endpoints * 100) if collection_endpoints > 0 else 100
1164
+
1165
+ def _check_resource_relationships(self) -> float:
1166
+ """Check resource relationship handling."""
1167
+ paths = self.spec.get('paths', {})
1168
+ schemas = self.spec.get('components', {}).get('schemas', {})
1169
+
1170
+ # Look for nested resource patterns
1171
+ nested_resources = 0
1172
+ total_resource_paths = 0
1173
+
1174
+ for path in paths.keys():
1175
+ # Skip root paths
1176
+ if path.count('/') >= 3: # e.g., /api/users/123/orders
1177
+ total_resource_paths += 1
1178
+ if '{' in path:
1179
+ nested_resources += 1
1180
+
1181
+ # Look for relationship fields in schemas
1182
+ schemas_with_relations = 0
1183
+ for schema in schemas.values():
1184
+ if not isinstance(schema, dict):
1185
+ continue
1186
+
1187
+ properties = schema.get('properties', {})
1188
+ relation_indicators = {'id', '_id', 'ref', 'link', 'relationship'}
1189
+
1190
+ has_relations = any(
1191
+ any(indicator in prop_name.lower() for indicator in relation_indicators)
1192
+ for prop_name in properties.keys()
1193
+ )
1194
+
1195
+ if has_relations:
1196
+ schemas_with_relations += 1
1197
+
1198
+ nested_score = (nested_resources / total_resource_paths * 50) if total_resource_paths > 0 else 25
1199
+ schema_score = (schemas_with_relations / len(schemas) * 50) if schemas else 25
1200
+
1201
+ return nested_score + schema_score
1202
+
1203
+ def _check_developer_experience(self) -> float:
1204
+ """Check overall developer experience factors."""
1205
+ # This is a composite score based on various DX factors
1206
+ factors = []
1207
+
1208
+ # Factor 1: Consistent response structure
1209
+ factors.append(self._check_response_consistency())
1210
+
1211
+ # Factor 2: Clear operation IDs
1212
+ paths = self.spec.get('paths', {})
1213
+ total_operations = 0
1214
+ operations_with_ids = 0
1215
+
1216
+ for path_obj in paths.values():
1217
+ if not isinstance(path_obj, dict):
1218
+ continue
1219
+
1220
+ for method, operation in path_obj.items():
1221
+ if method.upper() not in self.http_methods:
1222
+ continue
1223
+
1224
+ total_operations += 1
1225
+ if isinstance(operation, dict) and operation.get('operationId'):
1226
+ operations_with_ids += 1
1227
+
1228
+ operation_id_score = (operations_with_ids / total_operations * 100) if total_operations > 0 else 100
1229
+ factors.append(operation_id_score)
1230
+
1231
+ # Factor 3: Reasonable path complexity
1232
+ avg_path_complexity = 0
1233
+ if paths:
1234
+ complexities = []
1235
+ for path in paths.keys():
1236
+ segments = [seg for seg in path.split('/') if seg]
1237
+ complexities.append(len(segments))
1238
+
1239
+ avg_complexity = sum(complexities) / len(complexities)
1240
+ # Optimal complexity is 3-4 segments
1241
+ if 3 <= avg_complexity <= 4:
1242
+ avg_path_complexity = 100
1243
+ elif 2 <= avg_complexity <= 5:
1244
+ avg_path_complexity = 80
1245
+ else:
1246
+ avg_path_complexity = 60
1247
+
1248
+ factors.append(avg_path_complexity)
1249
+
1250
+ return sum(factors) / len(factors) if factors else 0
1251
+
1252
+ def _score_performance(self) -> None:
1253
+ """Score API performance patterns (15% weight)."""
1254
+ category = ScoreCategory.PERFORMANCE
1255
+ score = CategoryScore(
1256
+ category=category,
1257
+ score=0.0,
1258
+ max_score=100.0,
1259
+ weight=self.category_weights[category]
1260
+ )
1261
+
1262
+ performance_checks = [
1263
+ self._check_caching_headers(),
1264
+ self._check_pagination_patterns(),
1265
+ self._check_compression_support(),
1266
+ self._check_efficiency_patterns(),
1267
+ self._check_batch_operations()
1268
+ ]
1269
+
1270
+ valid_scores = [s for s in performance_checks if s is not None]
1271
+ if valid_scores:
1272
+ score.score = sum(valid_scores) / len(valid_scores)
1273
+
1274
+ # Add recommendations
1275
+ if score.score < 60:
1276
+ score.recommendations.extend([
1277
+ "Implement pagination for list endpoints",
1278
+ "Add caching headers for cacheable responses",
1279
+ "Consider batch operations for bulk updates"
1280
+ ])
1281
+ elif score.score < 80:
1282
+ score.recommendations.extend([
1283
+ "Review caching strategies for better performance",
1284
+ "Consider field selection parameters for large responses"
1285
+ ])
1286
+
1287
+ self.scorecard.category_scores[category] = score
1288
+
1289
+ def _check_caching_headers(self) -> float:
1290
+ """Check caching header implementation."""
1291
+ paths = self.spec.get('paths', {})
1292
+
1293
+ get_operations = 0
1294
+ cacheable_operations = 0
1295
+
1296
+ for path_obj in paths.values():
1297
+ if not isinstance(path_obj, dict):
1298
+ continue
1299
+
1300
+ get_operation = path_obj.get('get')
1301
+ if get_operation and isinstance(get_operation, dict):
1302
+ get_operations += 1
1303
+
1304
+ # Check for caching-related headers in responses
1305
+ responses = get_operation.get('responses', {})
1306
+ for response in responses.values():
1307
+ if not isinstance(response, dict):
1308
+ continue
1309
+
1310
+ headers = response.get('headers', {})
1311
+ cache_headers = {'cache-control', 'etag', 'last-modified', 'expires'}
1312
+
1313
+ if any(header.lower() in cache_headers for header in headers.keys()):
1314
+ cacheable_operations += 1
1315
+ break
1316
+
1317
+ return (cacheable_operations / get_operations * 100) if get_operations > 0 else 50
1318
+
1319
+ def _check_pagination_patterns(self) -> float:
1320
+ """Check pagination implementation."""
1321
+ paths = self.spec.get('paths', {})
1322
+
1323
+ collection_endpoints = 0
1324
+ paginated_endpoints = 0
1325
+
1326
+ for path, path_obj in paths.items():
1327
+ if not isinstance(path_obj, dict):
1328
+ continue
1329
+
1330
+ # Identify collection endpoints
1331
+ if '{' not in path: # No path parameters = collection
1332
+ get_operation = path_obj.get('get')
1333
+ if get_operation and isinstance(get_operation, dict):
1334
+ collection_endpoints += 1
1335
+
1336
+ # Check for pagination parameters
1337
+ parameters = get_operation.get('parameters', [])
1338
+ pagination_params = {'limit', 'offset', 'page', 'pagesize', 'per_page', 'cursor'}
1339
+
1340
+ has_pagination = any(
1341
+ isinstance(param, dict) and param.get('name', '').lower() in pagination_params
1342
+ for param in parameters
1343
+ )
1344
+
1345
+ if has_pagination:
1346
+ paginated_endpoints += 1
1347
+
1348
+ return (paginated_endpoints / collection_endpoints * 100) if collection_endpoints > 0 else 100
1349
+
1350
+ def _check_compression_support(self) -> float:
1351
+ """Check compression support indicators."""
1352
+ # This is speculative - OpenAPI doesn't directly specify compression
1353
+ # Look for indicators that compression is considered
1354
+
1355
+ servers = self.spec.get('servers', [])
1356
+
1357
+ # Check if any server descriptions mention compression
1358
+ compression_mentions = 0
1359
+ for server in servers:
1360
+ if isinstance(server, dict):
1361
+ description = server.get('description', '').lower()
1362
+ if any(term in description for term in ['gzip', 'compress', 'deflate']):
1363
+ compression_mentions += 1
1364
+
1365
+ # Base score - assume compression is handled at server level
1366
+ base_score = 70
1367
+
1368
+ if compression_mentions > 0:
1369
+ return min(base_score + (compression_mentions * 10), 100)
1370
+
1371
+ return base_score
1372
+
1373
+ def _check_efficiency_patterns(self) -> float:
1374
+ """Check efficiency patterns like field selection."""
1375
+ paths = self.spec.get('paths', {})
1376
+
1377
+ total_get_operations = 0
1378
+ operations_with_selection = 0
1379
+
1380
+ for path_obj in paths.values():
1381
+ if not isinstance(path_obj, dict):
1382
+ continue
1383
+
1384
+ get_operation = path_obj.get('get')
1385
+ if get_operation and isinstance(get_operation, dict):
1386
+ total_get_operations += 1
1387
+
1388
+ # Check for field selection parameters
1389
+ parameters = get_operation.get('parameters', [])
1390
+ selection_params = {'fields', 'select', 'include', 'exclude'}
1391
+
1392
+ has_selection = any(
1393
+ isinstance(param, dict) and param.get('name', '').lower() in selection_params
1394
+ for param in parameters
1395
+ )
1396
+
1397
+ if has_selection:
1398
+ operations_with_selection += 1
1399
+
1400
+ return (operations_with_selection / total_get_operations * 100) if total_get_operations > 0 else 60
1401
+
1402
+ def _check_batch_operations(self) -> float:
1403
+ """Check for batch operation support."""
1404
+ paths = self.spec.get('paths', {})
1405
+
1406
+ # Look for batch endpoints
1407
+ batch_indicators = ['batch', 'bulk', 'multi']
1408
+ batch_endpoints = 0
1409
+
1410
+ for path in paths.keys():
1411
+ if any(indicator in path.lower() for indicator in batch_indicators):
1412
+ batch_endpoints += 1
1413
+
1414
+ # Look for array-based request bodies (indicating batch operations)
1415
+ array_operations = 0
1416
+ total_post_put_operations = 0
1417
+
1418
+ for path_obj in paths.values():
1419
+ if not isinstance(path_obj, dict):
1420
+ continue
1421
+
1422
+ for method in ['post', 'put', 'patch']:
1423
+ operation = path_obj.get(method)
1424
+ if operation and isinstance(operation, dict):
1425
+ total_post_put_operations += 1
1426
+
1427
+ request_body = operation.get('requestBody', {})
1428
+ content = request_body.get('content', {})
1429
+
1430
+ for media_obj in content.values():
1431
+ schema = media_obj.get('schema', {})
1432
+ if schema.get('type') == 'array':
1433
+ array_operations += 1
1434
+ break
1435
+
1436
+ # Score based on presence of batch patterns
1437
+ batch_score = min(batch_endpoints * 20, 60) # Up to 60 points for explicit batch endpoints
1438
+
1439
+ if total_post_put_operations > 0:
1440
+ array_score = (array_operations / total_post_put_operations) * 40
1441
+ batch_score += array_score
1442
+
1443
+ return min(batch_score, 100)
1444
+
1445
+ def generate_json_report(self) -> str:
1446
+ """Generate JSON format scorecard."""
1447
+ report_data = {
1448
+ "overall": {
1449
+ "score": round(self.scorecard.overall_score, 2),
1450
+ "grade": self.scorecard.overall_grade,
1451
+ "totalEndpoints": self.scorecard.total_endpoints
1452
+ },
1453
+ "api_info": self.scorecard.api_info,
1454
+ "categories": {},
1455
+ "topRecommendations": self.scorecard.get_top_recommendations()
1456
+ }
1457
+
1458
+ for category, score in self.scorecard.category_scores.items():
1459
+ report_data["categories"][category.value] = {
1460
+ "score": round(score.score, 2),
1461
+ "grade": score.letter_grade,
1462
+ "weight": score.weight,
1463
+ "weightedScore": round(score.weighted_score, 2),
1464
+ "issues": score.issues,
1465
+ "recommendations": score.recommendations
1466
+ }
1467
+
1468
+ return json.dumps(report_data, indent=2)
1469
+
1470
+ def generate_text_report(self) -> str:
1471
+ """Generate human-readable scorecard report."""
1472
+ lines = [
1473
+ "═══════════════════════════════════════════════════════════════",
1474
+ " API DESIGN SCORECARD",
1475
+ "═══════════════════════════════════════════════════════════════",
1476
+ f"API: {self.scorecard.api_info.get('title', 'Unknown')}",
1477
+ f"Version: {self.scorecard.api_info.get('version', 'Unknown')}",
1478
+ f"Total Endpoints: {self.scorecard.total_endpoints}",
1479
+ "",
1480
+ f"🏆 OVERALL GRADE: {self.scorecard.overall_grade} ({self.scorecard.overall_score:.1f}/100.0)",
1481
+ "",
1482
+ "═══════════════════════════════════════════════════════════════",
1483
+ "DETAILED BREAKDOWN:",
1484
+ "═══════════════════════════════════════════════════════════════"
1485
+ ]
1486
+
1487
+ # Sort categories by weight (most important first)
1488
+ sorted_categories = sorted(
1489
+ self.scorecard.category_scores.items(),
1490
+ key=lambda x: x[1].weight,
1491
+ reverse=True
1492
+ )
1493
+
1494
+ for category, score in sorted_categories:
1495
+ category_name = category.value.title().replace('_', ' ')
1496
+
1497
+ lines.extend([
1498
+ "",
1499
+ f"📊 {category_name.upper()} - Grade: {score.letter_grade} ({score.score:.1f}/100)",
1500
+ f" Weight: {score.weight}% | Contribution: {score.weighted_score:.1f} points",
1501
+ " " + "─" * 50
1502
+ ])
1503
+
1504
+ if score.recommendations:
1505
+ lines.append(" 💡 Recommendations:")
1506
+ for rec in score.recommendations[:3]: # Top 3 recommendations
1507
+ lines.append(f" • {rec}")
1508
+ else:
1509
+ lines.append(" ✅ No specific recommendations - performing well!")
1510
+
1511
+ # Overall assessment
1512
+ lines.extend([
1513
+ "",
1514
+ "═══════════════════════════════════════════════════════════════",
1515
+ "OVERALL ASSESSMENT:",
1516
+ "═══════════════════════════════════════════════════════════════"
1517
+ ])
1518
+
1519
+ if self.scorecard.overall_grade == "A":
1520
+ lines.extend([
1521
+ "🏆 EXCELLENT! Your API demonstrates outstanding design quality.",
1522
+ " Continue following these best practices and consider sharing",
1523
+ " your approach as a reference for other teams."
1524
+ ])
1525
+ elif self.scorecard.overall_grade == "B":
1526
+ lines.extend([
1527
+ "✅ GOOD! Your API follows most best practices with room for",
1528
+ " minor improvements. Focus on the recommendations above",
1529
+ " to achieve excellence."
1530
+ ])
1531
+ elif self.scorecard.overall_grade == "C":
1532
+ lines.extend([
1533
+ "⚠️ FAIR! Your API has a solid foundation but several areas",
1534
+ " need improvement. Prioritize the high-weight categories",
1535
+ " for maximum impact."
1536
+ ])
1537
+ elif self.scorecard.overall_grade == "D":
1538
+ lines.extend([
1539
+ "❌ NEEDS IMPROVEMENT! Your API has significant issues that",
1540
+ " may impact developer experience and maintainability.",
1541
+ " Focus on consistency and documentation first."
1542
+ ])
1543
+ else: # Grade F
1544
+ lines.extend([
1545
+ "🚨 CRITICAL ISSUES! Your API requires major redesign to meet",
1546
+ " basic quality standards. Consider comprehensive review",
1547
+ " of design principles and best practices."
1548
+ ])
1549
+
1550
+ # Top recommendations
1551
+ top_recs = self.scorecard.get_top_recommendations(3)
1552
+ if top_recs:
1553
+ lines.extend([
1554
+ "",
1555
+ "🎯 TOP PRIORITY RECOMMENDATIONS:",
1556
+ ""
1557
+ ])
1558
+ for i, rec in enumerate(top_recs, 1):
1559
+ lines.append(f" {i}. {rec}")
1560
+
1561
+ lines.extend([
1562
+ "",
1563
+ "═══════════════════════════════════════════════════════════════",
1564
+ f"Generated by API Scorecard Tool | Score: {self.scorecard.overall_grade} ({self.scorecard.overall_score:.1f}%)",
1565
+ "═══════════════════════════════════════════════════════════════"
1566
+ ])
1567
+
1568
+ return "\n".join(lines)
1569
+
1570
+
1571
+ def main():
1572
+ """Main CLI entry point."""
1573
+ parser = argparse.ArgumentParser(
1574
+ description="Generate comprehensive API design quality scorecard",
1575
+ formatter_class=argparse.RawDescriptionHelpFormatter,
1576
+ epilog="""
1577
+ Examples:
1578
+ python api_scorecard.py openapi.json
1579
+ python api_scorecard.py --format json openapi.json > scorecard.json
1580
+ python api_scorecard.py --output scorecard.txt openapi.json
1581
+ """
1582
+ )
1583
+
1584
+ parser.add_argument(
1585
+ 'spec_file',
1586
+ help='OpenAPI/Swagger specification file (JSON format)'
1587
+ )
1588
+
1589
+ parser.add_argument(
1590
+ '--format',
1591
+ choices=['text', 'json'],
1592
+ default='text',
1593
+ help='Output format (default: text)'
1594
+ )
1595
+
1596
+ parser.add_argument(
1597
+ '--output',
1598
+ help='Output file (default: stdout)'
1599
+ )
1600
+
1601
+ parser.add_argument(
1602
+ '--min-grade',
1603
+ choices=['A', 'B', 'C', 'D', 'F'],
1604
+ help='Exit with code 1 if grade is below minimum'
1605
+ )
1606
+
1607
+ args = parser.parse_args()
1608
+
1609
+ # Load specification file
1610
+ try:
1611
+ with open(args.spec_file, 'r') as f:
1612
+ spec = json.load(f)
1613
+ except FileNotFoundError:
1614
+ print(f"Error: Specification file '{args.spec_file}' not found.", file=sys.stderr)
1615
+ return 1
1616
+ except json.JSONDecodeError as e:
1617
+ print(f"Error: Invalid JSON in '{args.spec_file}': {e}", file=sys.stderr)
1618
+ return 1
1619
+
1620
+ # Initialize scoring engine and generate scorecard
1621
+ engine = APIScoringEngine()
1622
+
1623
+ try:
1624
+ scorecard = engine.score_api(spec)
1625
+ except Exception as e:
1626
+ print(f"Error during scoring: {e}", file=sys.stderr)
1627
+ return 1
1628
+
1629
+ # Generate report
1630
+ if args.format == 'json':
1631
+ output = engine.generate_json_report()
1632
+ else:
1633
+ output = engine.generate_text_report()
1634
+
1635
+ # Write output
1636
+ if args.output:
1637
+ try:
1638
+ with open(args.output, 'w') as f:
1639
+ f.write(output)
1640
+ print(f"Scorecard written to {args.output}")
1641
+ except IOError as e:
1642
+ print(f"Error writing to '{args.output}': {e}", file=sys.stderr)
1643
+ return 1
1644
+ else:
1645
+ print(output)
1646
+
1647
+ # Check minimum grade requirement
1648
+ if args.min_grade:
1649
+ grade_order = ['F', 'D', 'C', 'B', 'A']
1650
+ current_grade_index = grade_order.index(scorecard.overall_grade)
1651
+ min_grade_index = grade_order.index(args.min_grade)
1652
+
1653
+ if current_grade_index < min_grade_index:
1654
+ print(f"Grade {scorecard.overall_grade} is below minimum required grade {args.min_grade}", file=sys.stderr)
1655
+ return 1
1656
+
1657
+ return 0
1658
+
1659
+
1660
+ if __name__ == '__main__':
1661
+ sys.exit(main())