novahiz 0.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 (1013) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE.md +46 -0
  3. package/README.md +123 -0
  4. package/adapters/README.md +13 -0
  5. package/adapters/opencode/agent/novahiz-agent.md +31 -0
  6. package/adapters/opencode/commands/novahiz-clean.md +15 -0
  7. package/adapters/opencode/commands/novahiz-doctor.md +9 -0
  8. package/adapters/opencode/commands/novahiz-plan.md +24 -0
  9. package/adapters/opencode/commands/novahiz-status.md +11 -0
  10. package/adapters/opencode/instructions.md +69 -0
  11. package/adapters/opencode/novahiz.ts +266 -0
  12. package/bin/novahiz.cmd +2 -0
  13. package/bin/novahiz.mjs +7 -0
  14. package/bundled-skills/AGENTS.md +50 -0
  15. package/bundled-skills/LICENSE +21 -0
  16. package/bundled-skills/README.md +202 -0
  17. package/bundled-skills/SKILL.md +313 -0
  18. package/bundled-skills/a11y-audit/SKILL.md +211 -0
  19. package/bundled-skills/a11y-audit/assets/sample-component.tsx +51 -0
  20. package/bundled-skills/a11y-audit/expected_outputs/sample-contrast-output.txt +39 -0
  21. package/bundled-skills/a11y-audit/expected_outputs/sample-scan-output.json +34 -0
  22. package/bundled-skills/a11y-audit/expected_outputs/sample-scan-report.md +63 -0
  23. package/bundled-skills/a11y-audit/references/aria-patterns.md +223 -0
  24. package/bundled-skills/a11y-audit/references/audit-report-template.md +46 -0
  25. package/bundled-skills/a11y-audit/references/ci-cd-integration.md +127 -0
  26. package/bundled-skills/a11y-audit/references/color-contrast-guide.md +83 -0
  27. package/bundled-skills/a11y-audit/references/examples-by-framework.md +312 -0
  28. package/bundled-skills/a11y-audit/references/framework-a11y-patterns.md +661 -0
  29. package/bundled-skills/a11y-audit/references/testing-checklist.md +41 -0
  30. package/bundled-skills/a11y-audit/references/wcag-22-new-criteria.md +79 -0
  31. package/bundled-skills/a11y-audit/references/wcag-quick-ref.md +113 -0
  32. package/bundled-skills/a11y-audit/scripts/a11y_scanner.py +684 -0
  33. package/bundled-skills/a11y-audit/scripts/contrast_checker.py +504 -0
  34. package/bundled-skills/ab-testing/SKILL.md +353 -0
  35. package/bundled-skills/ab-testing/evals/evals.json +105 -0
  36. package/bundled-skills/ab-testing/references/sample-size-guide.md +263 -0
  37. package/bundled-skills/ab-testing/references/test-templates.md +277 -0
  38. package/bundled-skills/ad-creative/SKILL.md +425 -0
  39. package/bundled-skills/ad-creative/assets/creative-review-template.html +400 -0
  40. package/bundled-skills/ad-creative/evals/evals.json +217 -0
  41. package/bundled-skills/ad-creative/references/creative-review-page.md +106 -0
  42. package/bundled-skills/ad-creative/references/creative-roadmap.md +118 -0
  43. package/bundled-skills/ad-creative/references/generative-tools.md +637 -0
  44. package/bundled-skills/ad-creative/references/hook-system.md +115 -0
  45. package/bundled-skills/ad-creative/references/imessage-video-ads.md +201 -0
  46. package/bundled-skills/ad-creative/references/meta-creative-formats.md +114 -0
  47. package/bundled-skills/ad-creative/references/motion-video-ads.md +126 -0
  48. package/bundled-skills/ad-creative/references/platform-specs.md +213 -0
  49. package/bundled-skills/ad-creative/references/short-form-video-specs.md +213 -0
  50. package/bundled-skills/ad-creative/references/static-ad-templates.md +308 -0
  51. package/bundled-skills/ads/SKILL.md +499 -0
  52. package/bundled-skills/ads/evals/evals.json +157 -0
  53. package/bundled-skills/ads/references/abm-playbook.md +93 -0
  54. package/bundled-skills/ads/references/ad-copy-templates.md +207 -0
  55. package/bundled-skills/ads/references/audience-targeting.md +243 -0
  56. package/bundled-skills/ads/references/audit-guardrails.md +83 -0
  57. package/bundled-skills/ads/references/b2b-paid-playbook.md +115 -0
  58. package/bundled-skills/ads/references/conversion-tracking.md +361 -0
  59. package/bundled-skills/ads/references/creative-research-automation.md +103 -0
  60. package/bundled-skills/ads/references/google-ads-audit-checklist.md +84 -0
  61. package/bundled-skills/ads/references/google-search-playbook.md +120 -0
  62. package/bundled-skills/ads/references/linkedin-b2b-playbook.md +107 -0
  63. package/bundled-skills/ads/references/meta-decision-system.md +176 -0
  64. package/bundled-skills/ads/references/payback-period.md +69 -0
  65. package/bundled-skills/ads/references/platform-setup-checklists.md +277 -0
  66. package/bundled-skills/ads/references/rsa-output-spec.md +88 -0
  67. package/bundled-skills/adversarial-reviewer/SKILL.md +247 -0
  68. package/bundled-skills/agent-device/SKILL.md +20 -0
  69. package/bundled-skills/ai-seo/SKILL.md +488 -0
  70. package/bundled-skills/ai-seo/evals/evals.json +135 -0
  71. package/bundled-skills/ai-seo/references/agent-readiness.md +57 -0
  72. package/bundled-skills/ai-seo/references/citations-vs-recommendations.md +85 -0
  73. package/bundled-skills/ai-seo/references/content-patterns.md +287 -0
  74. package/bundled-skills/ai-seo/references/content-types.md +71 -0
  75. package/bundled-skills/ai-seo/references/format-volatility.md +98 -0
  76. package/bundled-skills/ai-seo/references/okf.md +104 -0
  77. package/bundled-skills/ai-seo/references/platform-ranking-factors.md +154 -0
  78. package/bundled-skills/ai-seo/references/youtube-ai-citations.md +60 -0
  79. package/bundled-skills/analytics/SKILL.md +310 -0
  80. package/bundled-skills/analytics/evals/evals.json +90 -0
  81. package/bundled-skills/analytics/references/event-library.md +260 -0
  82. package/bundled-skills/analytics/references/ga4-implementation.md +300 -0
  83. package/bundled-skills/analytics/references/gtm-implementation.md +390 -0
  84. package/bundled-skills/android-emulator/SKILL.md +32 -0
  85. package/bundled-skills/anti-AI-design/SKILL.md +189 -0
  86. package/bundled-skills/anti-pattern-detector/SKILL.md +185 -0
  87. package/bundled-skills/anti-pattern-detector/references/async-network-patterns.md +581 -0
  88. package/bundled-skills/anti-pattern-detector/references/build-deploy-patterns.md +554 -0
  89. package/bundled-skills/anti-pattern-detector/references/cache-patterns.md +446 -0
  90. package/bundled-skills/anti-pattern-detector/references/cloud-infra-patterns.md +538 -0
  91. package/bundled-skills/anti-pattern-detector/references/concurrency-patterns.md +558 -0
  92. package/bundled-skills/anti-pattern-detector/references/language-specific-patterns.md +740 -0
  93. package/bundled-skills/anti-pattern-detector/references/monitoring-patterns.md +456 -0
  94. package/bundled-skills/api-design-reviewer/SKILL.md +433 -0
  95. package/bundled-skills/api-design-reviewer/references/api_antipatterns.md +680 -0
  96. package/bundled-skills/api-design-reviewer/references/rest_design_rules.md +487 -0
  97. package/bundled-skills/api-design-reviewer/scripts/api_linter.py +956 -0
  98. package/bundled-skills/api-design-reviewer/scripts/api_scorecard.py +1661 -0
  99. package/bundled-skills/api-design-reviewer/scripts/breaking_change_detector.py +1102 -0
  100. package/bundled-skills/apple-hig-expert/SKILL.md +108 -0
  101. package/bundled-skills/apple-hig-expert/references/accessibility.md +55 -0
  102. package/bundled-skills/apple-hig-expert/references/platform-specifics.md +48 -0
  103. package/bundled-skills/apple-hig-expert/references/visual-design.md +69 -0
  104. package/bundled-skills/apple-hig-expert/scripts/hig_checker.py +97 -0
  105. package/bundled-skills/apple-hig-expert/templates/hig-audit-template.md +83 -0
  106. package/bundled-skills/build-graph/SKILL.md +38 -0
  107. package/bundled-skills/claude-history-ingest/SKILL.md +463 -0
  108. package/bundled-skills/claude-history-ingest/references/claude-data-format.md +118 -0
  109. package/bundled-skills/clean-code/SKILL.md +99 -0
  110. package/bundled-skills/code-reviewer/README.md +92 -0
  111. package/bundled-skills/code-reviewer/SKILL.md +183 -0
  112. package/bundled-skills/code-reviewer/assets/sample_c_clean.c +71 -0
  113. package/bundled-skills/code-reviewer/assets/sample_c_smells.c +66 -0
  114. package/bundled-skills/code-reviewer/assets/sample_csharp_clean.cs +100 -0
  115. package/bundled-skills/code-reviewer/assets/sample_csharp_smells.cs +78 -0
  116. package/bundled-skills/code-reviewer/assets/sample_java_clean.java +55 -0
  117. package/bundled-skills/code-reviewer/assets/sample_java_smells.java +56 -0
  118. package/bundled-skills/code-reviewer/expected_outputs/sample_c_clean_quality.json +65 -0
  119. package/bundled-skills/code-reviewer/expected_outputs/sample_c_smells_quality.json +155 -0
  120. package/bundled-skills/code-reviewer/expected_outputs/sample_csharp_clean_quality.json +135 -0
  121. package/bundled-skills/code-reviewer/expected_outputs/sample_csharp_smells_quality.json +143 -0
  122. package/bundled-skills/code-reviewer/expected_outputs/sample_java_clean_quality.json +53 -0
  123. package/bundled-skills/code-reviewer/expected_outputs/sample_java_smells_quality.json +83 -0
  124. package/bundled-skills/code-reviewer/languages/c.md +103 -0
  125. package/bundled-skills/code-reviewer/languages/cpp.md +103 -0
  126. package/bundled-skills/code-reviewer/languages/csharp.md +97 -0
  127. package/bundled-skills/code-reviewer/languages/dart.md +108 -0
  128. package/bundled-skills/code-reviewer/languages/go.md +92 -0
  129. package/bundled-skills/code-reviewer/languages/java.md +103 -0
  130. package/bundled-skills/code-reviewer/languages/kotlin.md +88 -0
  131. package/bundled-skills/code-reviewer/languages/php.md +109 -0
  132. package/bundled-skills/code-reviewer/languages/python.md +94 -0
  133. package/bundled-skills/code-reviewer/languages/ruby.md +105 -0
  134. package/bundled-skills/code-reviewer/languages/rust.md +99 -0
  135. package/bundled-skills/code-reviewer/languages/swift.md +88 -0
  136. package/bundled-skills/code-reviewer/languages/typescript.md +97 -0
  137. package/bundled-skills/code-reviewer/rules/universal.md +49 -0
  138. package/bundled-skills/code-reviewer/scripts/code_quality_checker.py +1020 -0
  139. package/bundled-skills/code-reviewer/scripts/pr_analyzer.py +535 -0
  140. package/bundled-skills/code-reviewer/scripts/review_report_generator.py +505 -0
  141. package/bundled-skills/code-understand/SKILL.md +90 -0
  142. package/bundled-skills/codex-history-ingest/SKILL.md +248 -0
  143. package/bundled-skills/codex-history-ingest/references/codex-data-format.md +82 -0
  144. package/bundled-skills/cold-email/SKILL.md +159 -0
  145. package/bundled-skills/cold-email/evals/evals.json +94 -0
  146. package/bundled-skills/cold-email/references/benchmarks.md +83 -0
  147. package/bundled-skills/cold-email/references/follow-up-sequences.md +81 -0
  148. package/bundled-skills/cold-email/references/frameworks.md +90 -0
  149. package/bundled-skills/cold-email/references/personalization.md +79 -0
  150. package/bundled-skills/cold-email/references/subject-lines.md +53 -0
  151. package/bundled-skills/competitor-profiling/SKILL.md +415 -0
  152. package/bundled-skills/competitor-profiling/evals/evals.json +85 -0
  153. package/bundled-skills/competitor-profiling/references/templates.md +167 -0
  154. package/bundled-skills/competitor-profiling/references/tool-reference.md +179 -0
  155. package/bundled-skills/computer-use/SKILL.md +41 -0
  156. package/bundled-skills/content-strategy/SKILL.md +439 -0
  157. package/bundled-skills/content-strategy/evals/evals.json +116 -0
  158. package/bundled-skills/content-strategy/references/content-distribution.md +83 -0
  159. package/bundled-skills/content-strategy/references/headless-cms.md +194 -0
  160. package/bundled-skills/copilot-history-ingest/SKILL.md +376 -0
  161. package/bundled-skills/copilot-history-ingest/references/copilot-data-format.md +321 -0
  162. package/bundled-skills/copy-editing/SKILL.md +457 -0
  163. package/bundled-skills/copy-editing/evals/evals.json +89 -0
  164. package/bundled-skills/copy-editing/references/checklist.md +66 -0
  165. package/bundled-skills/copy-editing/references/content-refresh.md +38 -0
  166. package/bundled-skills/copy-editing/references/plain-english-alternatives.md +394 -0
  167. package/bundled-skills/copywriting/SKILL.md +256 -0
  168. package/bundled-skills/copywriting/evals/evals.json +126 -0
  169. package/bundled-skills/copywriting/references/copy-frameworks.md +433 -0
  170. package/bundled-skills/copywriting/references/natural-transitions.md +272 -0
  171. package/bundled-skills/cro/SKILL.md +187 -0
  172. package/bundled-skills/cro/evals/evals.json +111 -0
  173. package/bundled-skills/cro/references/experiments.md +248 -0
  174. package/bundled-skills/cro/references/form.md +422 -0
  175. package/bundled-skills/cross-linker/SKILL.md +309 -0
  176. package/bundled-skills/customer-research/SKILL.md +305 -0
  177. package/bundled-skills/customer-research/evals/evals.json +176 -0
  178. package/bundled-skills/customer-research/references/interviews-and-surveys.md +155 -0
  179. package/bundled-skills/customer-research/references/source-guides.md +401 -0
  180. package/bundled-skills/daily-update/SKILL.md +223 -0
  181. package/bundled-skills/dart-add-unit-test/SKILL.md +122 -0
  182. package/bundled-skills/dart-build-cli-app/SKILL.md +185 -0
  183. package/bundled-skills/dart-collect-coverage/SKILL.md +141 -0
  184. package/bundled-skills/dart-fix-runtime-errors/SKILL.md +166 -0
  185. package/bundled-skills/dart-generate-test-mocks/SKILL.md +155 -0
  186. package/bundled-skills/dart-migrate-to-checks-package/SKILL.md +528 -0
  187. package/bundled-skills/dart-resolve-package-conflicts/SKILL.md +116 -0
  188. package/bundled-skills/dart-run-static-analysis/SKILL.md +104 -0
  189. package/bundled-skills/dart-setup-ffi-assets/SKILL.md +419 -0
  190. package/bundled-skills/dart-use-doc-examples/SKILL.md +96 -0
  191. package/bundled-skills/dart-use-ffigen/SKILL.md +218 -0
  192. package/bundled-skills/dart-use-pattern-matching/SKILL.md +146 -0
  193. package/bundled-skills/dart-use-primary-constructors/SKILL.md +262 -0
  194. package/bundled-skills/dart-write-documentation/SKILL.md +136 -0
  195. package/bundled-skills/database-designer/README.md +388 -0
  196. package/bundled-skills/database-designer/SKILL.md +314 -0
  197. package/bundled-skills/database-designer/assets/sample_query_patterns.json +375 -0
  198. package/bundled-skills/database-designer/assets/sample_schema.json +372 -0
  199. package/bundled-skills/database-designer/assets/sample_schema.sql +207 -0
  200. package/bundled-skills/database-designer/expected_outputs/index_optimization_sample.txt +60 -0
  201. package/bundled-skills/database-designer/expected_outputs/migration_sample.txt +124 -0
  202. package/bundled-skills/database-designer/expected_outputs/schema_analysis_sample.txt +222 -0
  203. package/bundled-skills/database-designer/index_optimizer.py +926 -0
  204. package/bundled-skills/database-designer/migration_generator.py +1199 -0
  205. package/bundled-skills/database-designer/references/database-design-reference.md +476 -0
  206. package/bundled-skills/database-designer/references/database_selection_decision_tree.md +373 -0
  207. package/bundled-skills/database-designer/references/index_strategy_patterns.md +424 -0
  208. package/bundled-skills/database-designer/references/normalization_guide.md +354 -0
  209. package/bundled-skills/database-designer/schema_analyzer.py +982 -0
  210. package/bundled-skills/debug-issue/SKILL.md +28 -0
  211. package/bundled-skills/defuddle/SKILL.md +41 -0
  212. package/bundled-skills/dependency-auditor/README.md +524 -0
  213. package/bundled-skills/dependency-auditor/SKILL.md +85 -0
  214. package/bundled-skills/dependency-auditor/assets/sample_go.mod +53 -0
  215. package/bundled-skills/dependency-auditor/assets/sample_package.json +72 -0
  216. package/bundled-skills/dependency-auditor/assets/sample_requirements.txt +71 -0
  217. package/bundled-skills/dependency-auditor/expected_outputs/sample_license_report.txt +37 -0
  218. package/bundled-skills/dependency-auditor/expected_outputs/sample_upgrade_plan.txt +59 -0
  219. package/bundled-skills/dependency-auditor/expected_outputs/sample_vulnerability_report.json +71 -0
  220. package/bundled-skills/dependency-auditor/references/dependency_management_best_practices.md +643 -0
  221. package/bundled-skills/dependency-auditor/references/license_compatibility_matrix.md +238 -0
  222. package/bundled-skills/dependency-auditor/references/vulnerability_assessment_guide.md +461 -0
  223. package/bundled-skills/dependency-auditor/scripts/dep_scanner.py +794 -0
  224. package/bundled-skills/dependency-auditor/scripts/license_checker.py +996 -0
  225. package/bundled-skills/dependency-auditor/scripts/upgrade_planner.py +1029 -0
  226. package/bundled-skills/dependency-auditor/test-inventory.json +421 -0
  227. package/bundled-skills/dependency-auditor/test-project/package.json +72 -0
  228. package/bundled-skills/design-taste-frontend/SKILL.md +247 -0
  229. package/bundled-skills/dogfood/SKILL.md +27 -0
  230. package/bundled-skills/eas-app-stores/SKILL.md +176 -0
  231. package/bundled-skills/eas-app-stores/agents/openai.yaml +4 -0
  232. package/bundled-skills/eas-app-stores/references/app-store-metadata.md +497 -0
  233. package/bundled-skills/eas-app-stores/references/ios-app-store.md +376 -0
  234. package/bundled-skills/eas-app-stores/references/native-ios.md +167 -0
  235. package/bundled-skills/eas-app-stores/references/play-store.md +244 -0
  236. package/bundled-skills/eas-app-stores/references/testflight.md +62 -0
  237. package/bundled-skills/eas-app-stores/references/workflows.md +120 -0
  238. package/bundled-skills/eas-hosting/SKILL.md +431 -0
  239. package/bundled-skills/eas-hosting/agents/openai.yaml +4 -0
  240. package/bundled-skills/eas-observe/SKILL.md +54 -0
  241. package/bundled-skills/eas-observe/agents/openai.yaml +4 -0
  242. package/bundled-skills/eas-observe/references/metrics.md +98 -0
  243. package/bundled-skills/eas-observe/references/queries.md +403 -0
  244. package/bundled-skills/eas-observe/references/setup.md +476 -0
  245. package/bundled-skills/eas-observe/references/third-party.md +136 -0
  246. package/bundled-skills/eas-simulator/SKILL.md +208 -0
  247. package/bundled-skills/eas-simulator/agents/openai.yaml +4 -0
  248. package/bundled-skills/eas-simulator/references/controllers.md +106 -0
  249. package/bundled-skills/eas-simulator/references/run-your-app.md +224 -0
  250. package/bundled-skills/eas-simulator/references/troubleshooting.md +44 -0
  251. package/bundled-skills/eas-update/SKILL.md +146 -0
  252. package/bundled-skills/eas-update/agents/openai.yaml +4 -0
  253. package/bundled-skills/eas-update-insights/SKILL.md +238 -0
  254. package/bundled-skills/eas-update-insights/agents/openai.yaml +4 -0
  255. package/bundled-skills/eas-update-insights/references/channel-insights-schema.md +47 -0
  256. package/bundled-skills/eas-update-insights/references/update-insights-schema.md +69 -0
  257. package/bundled-skills/eas-workflows/SKILL.md +99 -0
  258. package/bundled-skills/eas-workflows/agents/openai.yaml +4 -0
  259. package/bundled-skills/eas-workflows/scripts/fetch.js +109 -0
  260. package/bundled-skills/eas-workflows/scripts/package.json +6 -0
  261. package/bundled-skills/emails/SKILL.md +311 -0
  262. package/bundled-skills/emails/evals/evals.json +93 -0
  263. package/bundled-skills/emails/references/copy-guidelines.md +113 -0
  264. package/bundled-skills/emails/references/email-types.md +515 -0
  265. package/bundled-skills/emails/references/sequence-templates.md +168 -0
  266. package/bundled-skills/engineering-standards/SKILL.md +736 -0
  267. package/bundled-skills/env-secrets-manager/SKILL.md +260 -0
  268. package/bundled-skills/env-secrets-manager/references/secret-patterns.md +41 -0
  269. package/bundled-skills/env-secrets-manager/references/validation-detection-rotation.md +358 -0
  270. package/bundled-skills/env-secrets-manager/scripts/env_auditor.py +145 -0
  271. package/bundled-skills/explore-codebase/SKILL.md +29 -0
  272. package/bundled-skills/expo-animation/LICENSE +21 -0
  273. package/bundled-skills/expo-animation/RECIPES.md +385 -0
  274. package/bundled-skills/expo-animation/SKILL.md +267 -0
  275. package/bundled-skills/expo-animation/agents/openai.yaml +4 -0
  276. package/bundled-skills/expo-app-clip/SKILL.md +290 -0
  277. package/bundled-skills/expo-app-clip/agents/openai.yaml +4 -0
  278. package/bundled-skills/expo-app-clip/references/native-module.md +96 -0
  279. package/bundled-skills/expo-brownfield/SKILL.md +62 -0
  280. package/bundled-skills/expo-brownfield/agents/openai.yaml +4 -0
  281. package/bundled-skills/expo-brownfield/references/brownfield-integrated.md +526 -0
  282. package/bundled-skills/expo-brownfield/references/brownfield-isolated.md +451 -0
  283. package/bundled-skills/expo-brownfield/references/comparison.md +63 -0
  284. package/bundled-skills/expo-brownfield/references/troubleshooting.md +88 -0
  285. package/bundled-skills/expo-data-fetching/SKILL.md +478 -0
  286. package/bundled-skills/expo-data-fetching/agents/openai.yaml +4 -0
  287. package/bundled-skills/expo-data-fetching/references/expo-router-loaders.md +341 -0
  288. package/bundled-skills/expo-data-fetching/references/offline-and-cancellation.md +68 -0
  289. package/bundled-skills/expo-design-system/SKILL.md +376 -0
  290. package/bundled-skills/expo-design-system/agents/openai.yaml +4 -0
  291. package/bundled-skills/expo-design-system/references/audit.md +190 -0
  292. package/bundled-skills/expo-design-system/references/native-slop.md +74 -0
  293. package/bundled-skills/expo-dev-client/SKILL.md +182 -0
  294. package/bundled-skills/expo-dev-client/agents/openai.yaml +4 -0
  295. package/bundled-skills/expo-dom/SKILL.md +425 -0
  296. package/bundled-skills/expo-dom/agents/openai.yaml +4 -0
  297. package/bundled-skills/expo-examples/SKILL.md +106 -0
  298. package/bundled-skills/expo-examples/agents/openai.yaml +4 -0
  299. package/bundled-skills/expo-examples/references/catalog.md +105 -0
  300. package/bundled-skills/expo-migrate-module/SKILL.md +113 -0
  301. package/bundled-skills/expo-migrate-module/agents/openai.yaml +4 -0
  302. package/bundled-skills/expo-migrate-module/references/compatibility.md +73 -0
  303. package/bundled-skills/expo-migrate-module/references/example.md +212 -0
  304. package/bundled-skills/expo-migrate-module/references/migration-map.md +306 -0
  305. package/bundled-skills/expo-module/SKILL.md +151 -0
  306. package/bundled-skills/expo-module/agents/openai.yaml +4 -0
  307. package/bundled-skills/expo-module/references/config-plugin.md +90 -0
  308. package/bundled-skills/expo-module/references/create-expo-module.md +206 -0
  309. package/bundled-skills/expo-module/references/lifecycle.md +127 -0
  310. package/bundled-skills/expo-module/references/module-config.md +48 -0
  311. package/bundled-skills/expo-module/references/native-module.md +286 -0
  312. package/bundled-skills/expo-module/references/native-view.md +171 -0
  313. package/bundled-skills/expo-native-ui/SKILL.md +201 -0
  314. package/bundled-skills/expo-native-ui/agents/openai.yaml +4 -0
  315. package/bundled-skills/expo-native-ui/references/controls.md +231 -0
  316. package/bundled-skills/expo-native-ui/references/gradients.md +106 -0
  317. package/bundled-skills/expo-native-ui/references/icons.md +232 -0
  318. package/bundled-skills/expo-native-ui/references/media.md +193 -0
  319. package/bundled-skills/expo-native-ui/references/storage.md +121 -0
  320. package/bundled-skills/expo-native-ui/references/visual-effects.md +198 -0
  321. package/bundled-skills/expo-native-ui/references/webgpu-three.md +605 -0
  322. package/bundled-skills/expo-overview/SKILL.md +115 -0
  323. package/bundled-skills/expo-overview/agents/openai.yaml +4 -0
  324. package/bundled-skills/expo-project-structure/SKILL.md +114 -0
  325. package/bundled-skills/expo-project-structure/agents/openai.yaml +4 -0
  326. package/bundled-skills/expo-router/SKILL.md +240 -0
  327. package/bundled-skills/expo-router/agents/openai.yaml +4 -0
  328. package/bundled-skills/expo-router/references/form-sheet.md +253 -0
  329. package/bundled-skills/expo-router/references/route-structure.md +229 -0
  330. package/bundled-skills/expo-router/references/search.md +248 -0
  331. package/bundled-skills/expo-router/references/tabs.md +433 -0
  332. package/bundled-skills/expo-router/references/toolbar-and-headers.md +284 -0
  333. package/bundled-skills/expo-router/references/zoom-transitions.md +158 -0
  334. package/bundled-skills/expo-skill-eval/SKILL.md +314 -0
  335. package/bundled-skills/expo-skill-eval/agents/visual-grader.md +52 -0
  336. package/bundled-skills/expo-skill-eval/references/design-rubric.md +45 -0
  337. package/bundled-skills/expo-skill-eval/references/runtime-matrix.md +34 -0
  338. package/bundled-skills/expo-skill-eval/scripts/check-static.sh +64 -0
  339. package/bundled-skills/expo-skill-eval/scripts/clean-fixture.sh +56 -0
  340. package/bundled-skills/expo-skill-eval/scripts/generate_viewer.py +450 -0
  341. package/bundled-skills/expo-skill-eval/scripts/latest-sdk.sh +46 -0
  342. package/bundled-skills/expo-skill-eval/scripts/make-fixture.sh +95 -0
  343. package/bundled-skills/expo-skill-eval/scripts/make-workspace.sh +31 -0
  344. package/bundled-skills/expo-skill-eval/scripts/snapshot-android.sh +284 -0
  345. package/bundled-skills/expo-skill-eval/scripts/snapshot-ios.sh +132 -0
  346. package/bundled-skills/expo-skill-eval/scripts/snapshot-web.sh +61 -0
  347. package/bundled-skills/expo-skill-feedback/SKILL.md +87 -0
  348. package/bundled-skills/expo-skill-feedback/agents/openai.yaml +4 -0
  349. package/bundled-skills/expo-skill-feedback/scripts/skill-event.cjs +180 -0
  350. package/bundled-skills/expo-skill-feedback/scripts/telemetry.cjs +65 -0
  351. package/bundled-skills/expo-skill-feedback/scripts/telemetry_common.cjs +171 -0
  352. package/bundled-skills/expo-ui/SKILL.md +101 -0
  353. package/bundled-skills/expo-ui/agents/openai.yaml +4 -0
  354. package/bundled-skills/expo-ui/references/drop-in-replacements.md +27 -0
  355. package/bundled-skills/expo-ui/references/jetpack-compose.md +73 -0
  356. package/bundled-skills/expo-ui/references/swift-ui.md +73 -0
  357. package/bundled-skills/expo-ui/references/universal.md +104 -0
  358. package/bundled-skills/expo-ui/scripts/list-components.js +193 -0
  359. package/bundled-skills/expo-upgrade/SKILL.md +150 -0
  360. package/bundled-skills/expo-upgrade/agents/openai.yaml +4 -0
  361. package/bundled-skills/expo-upgrade/references/expo-av-to-audio.md +132 -0
  362. package/bundled-skills/expo-upgrade/references/expo-av-to-video.md +160 -0
  363. package/bundled-skills/expo-upgrade/references/native-tabs.md +124 -0
  364. package/bundled-skills/expo-upgrade/references/new-architecture.md +79 -0
  365. package/bundled-skills/expo-upgrade/references/react-19.md +79 -0
  366. package/bundled-skills/expo-upgrade/references/react-compiler.md +59 -0
  367. package/bundled-skills/expo-upgrade/references/react-navigation-to-expo-router.md +61 -0
  368. package/bundled-skills/expo-web-to-native/SKILL.md +91 -0
  369. package/bundled-skills/expo-web-to-native/agents/openai.yaml +4 -0
  370. package/bundled-skills/expo-web-to-native/references/false-friends.md +119 -0
  371. package/bundled-skills/expo-web-to-native/references/native-patterns.md +39 -0
  372. package/bundled-skills/expo-web-to-native/references/run-as-goal.md +48 -0
  373. package/bundled-skills/expo-web-to-native/references/verify-on-device.md +45 -0
  374. package/bundled-skills/find-skills/SKILL.md +141 -0
  375. package/bundled-skills/fix/SKILL.md +113 -0
  376. package/bundled-skills/fix/flaky-taxonomy.md +134 -0
  377. package/bundled-skills/flutter-add-integration-test/SKILL.md +163 -0
  378. package/bundled-skills/flutter-add-widget-preview/SKILL.md +145 -0
  379. package/bundled-skills/flutter-add-widget-test/SKILL.md +154 -0
  380. package/bundled-skills/flutter-apply-architecture-best-practices/SKILL.md +162 -0
  381. package/bundled-skills/flutter-build-responsive-layout/SKILL.md +139 -0
  382. package/bundled-skills/flutter-fix-layout-issues/SKILL.md +130 -0
  383. package/bundled-skills/flutter-implement-json-serialization/SKILL.md +153 -0
  384. package/bundled-skills/flutter-setup-declarative-routing/SKILL.md +255 -0
  385. package/bundled-skills/flutter-setup-localization/SKILL.md +210 -0
  386. package/bundled-skills/flutter-use-http-package/SKILL.md +174 -0
  387. package/bundled-skills/gate/SKILL.md +13 -0
  388. package/bundled-skills/graph-colorize/SKILL.md +180 -0
  389. package/bundled-skills/hermes-history-ingest/SKILL.md +239 -0
  390. package/bundled-skills/hermes-history-ingest/references/hermes-data-format.md +131 -0
  391. package/bundled-skills/humanizer/SKILL.md +374 -0
  392. package/bundled-skills/impeccable/SKILL.md +89 -0
  393. package/bundled-skills/impeccable/reference/adapt.md +312 -0
  394. package/bundled-skills/impeccable/reference/adapt.native.md +58 -0
  395. package/bundled-skills/impeccable/reference/android.md +46 -0
  396. package/bundled-skills/impeccable/reference/animate.md +89 -0
  397. package/bundled-skills/impeccable/reference/audit.md +136 -0
  398. package/bundled-skills/impeccable/reference/audit.native.md +139 -0
  399. package/bundled-skills/impeccable/reference/bolder.md +33 -0
  400. package/bundled-skills/impeccable/reference/clarify.md +94 -0
  401. package/bundled-skills/impeccable/reference/colorize.md +86 -0
  402. package/bundled-skills/impeccable/reference/craft-floor.md +44 -0
  403. package/bundled-skills/impeccable/reference/craft.md +5 -0
  404. package/bundled-skills/impeccable/reference/critique.md +806 -0
  405. package/bundled-skills/impeccable/reference/degraded/asset-producer.md +37 -0
  406. package/bundled-skills/impeccable/reference/degraded/documenter.md +24 -0
  407. package/bundled-skills/impeccable/reference/degraded/finish-reviewer.md +38 -0
  408. package/bundled-skills/impeccable/reference/degraded/manual-edit-applier.md +92 -0
  409. package/bundled-skills/impeccable/reference/delight.md +70 -0
  410. package/bundled-skills/impeccable/reference/distill.md +111 -0
  411. package/bundled-skills/impeccable/reference/doctor.md +54 -0
  412. package/bundled-skills/impeccable/reference/document.md +416 -0
  413. package/bundled-skills/impeccable/reference/extract.md +69 -0
  414. package/bundled-skills/impeccable/reference/harden.md +336 -0
  415. package/bundled-skills/impeccable/reference/hooks.md +111 -0
  416. package/bundled-skills/impeccable/reference/init.md +131 -0
  417. package/bundled-skills/impeccable/reference/ios.md +51 -0
  418. package/bundled-skills/impeccable/reference/layout.md +84 -0
  419. package/bundled-skills/impeccable/reference/live-setup.md +104 -0
  420. package/bundled-skills/impeccable/reference/live.md +325 -0
  421. package/bundled-skills/impeccable/reference/new-work.md +145 -0
  422. package/bundled-skills/impeccable/reference/onboard.md +234 -0
  423. package/bundled-skills/impeccable/reference/operate.md +61 -0
  424. package/bundled-skills/impeccable/reference/optimize.md +258 -0
  425. package/bundled-skills/impeccable/reference/overdrive.md +127 -0
  426. package/bundled-skills/impeccable/reference/polish.md +105 -0
  427. package/bundled-skills/impeccable/reference/quieter.md +99 -0
  428. package/bundled-skills/impeccable/reference/routing.md +24 -0
  429. package/bundled-skills/impeccable/reference/shape.md +59 -0
  430. package/bundled-skills/impeccable/reference/typeset.md +80 -0
  431. package/bundled-skills/impeccable/reference/visualize.md +46 -0
  432. package/bundled-skills/impeccable/scripts/VERSION +1 -0
  433. package/bundled-skills/impeccable/scripts/bin/windows-x64/impeccable.exe +0 -0
  434. package/bundled-skills/impeccable/scripts/command-metadata.json +94 -0
  435. package/bundled-skills/impeccable/scripts/data/font-index-failures.json +121 -0
  436. package/bundled-skills/impeccable/scripts/data/font-index.json +1 -0
  437. package/bundled-skills/impeccable/scripts/impeccable +206 -0
  438. package/bundled-skills/impeccable/scripts/impeccable.cmd +214 -0
  439. package/bundled-skills/impeccable/scripts/live-browser-dom.js +167 -0
  440. package/bundled-skills/impeccable/scripts/live-browser-ignores.js +242 -0
  441. package/bundled-skills/impeccable/scripts/live-browser-session.js +144 -0
  442. package/bundled-skills/impeccable/scripts/live-browser.js +12990 -0
  443. package/bundled-skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  444. package/bundled-skills/impl-validator/SKILL.md +118 -0
  445. package/bundled-skills/ios-simulator/SKILL.md +32 -0
  446. package/bundled-skills/json-canvas/SKILL.md +244 -0
  447. package/bundled-skills/json-canvas/references/EXAMPLES.md +329 -0
  448. package/bundled-skills/launch/SKILL.md +381 -0
  449. package/bundled-skills/launch/evals/evals.json +106 -0
  450. package/bundled-skills/llm-wiki/SKILL.md +661 -0
  451. package/bundled-skills/llm-wiki/references/WRITING.md +28 -0
  452. package/bundled-skills/llm-wiki/references/karpathy-pattern.md +45 -0
  453. package/bundled-skills/marketing-plan/SKILL.md +300 -0
  454. package/bundled-skills/marketing-plan/evals/evals.json +112 -0
  455. package/bundled-skills/marketing-plan/references/aarrr-framework.md +180 -0
  456. package/bundled-skills/marketing-plan/references/budget-planning.md +168 -0
  457. package/bundled-skills/marketing-plan/references/client-types.md +373 -0
  458. package/bundled-skills/marketing-plan/references/current-state-rubric.md +255 -0
  459. package/bundled-skills/marketing-plan/references/example-quietude.md +972 -0
  460. package/bundled-skills/marketing-plan/references/funding-stage-unlocks.md +230 -0
  461. package/bundled-skills/marketing-plan/references/growth-patterns.md +190 -0
  462. package/bundled-skills/marketing-plan/references/idea-cross-reference.md +265 -0
  463. package/bundled-skills/marketing-plan/references/measurement-framework.md +213 -0
  464. package/bundled-skills/marketing-plan/references/methodology.md +363 -0
  465. package/bundled-skills/marketing-plan/references/ops-stack-mapping.md +197 -0
  466. package/bundled-skills/marketing-plan/references/plan-template.md +494 -0
  467. package/bundled-skills/marketing-plan/references/team-and-agency-model.md +278 -0
  468. package/bundled-skills/marketing-psychology/SKILL.md +455 -0
  469. package/bundled-skills/marketing-psychology/evals/evals.json +88 -0
  470. package/bundled-skills/mcp-server-builder/README.md +50 -0
  471. package/bundled-skills/mcp-server-builder/SKILL.md +100 -0
  472. package/bundled-skills/mcp-server-builder/references/openapi-extraction-guide.md +34 -0
  473. package/bundled-skills/mcp-server-builder/references/production-hardening-guide.md +78 -0
  474. package/bundled-skills/mcp-server-builder/references/python-server-template.md +22 -0
  475. package/bundled-skills/mcp-server-builder/references/typescript-server-template.md +19 -0
  476. package/bundled-skills/mcp-server-builder/references/validation-checklist.md +30 -0
  477. package/bundled-skills/mcp-server-builder/scripts/mcp_validator.py +186 -0
  478. package/bundled-skills/mcp-server-builder/scripts/openapi_to_mcp.py +284 -0
  479. package/bundled-skills/memory/SKILL.md +10 -0
  480. package/bundled-skills/memory-bridge/SKILL.md +163 -0
  481. package/bundled-skills/memory-save/SKILL.md +88 -0
  482. package/bundled-skills/migrate/SKILL.md +135 -0
  483. package/bundled-skills/migrate/cypress-mapping.md +79 -0
  484. package/bundled-skills/migrate/selenium-mapping.md +94 -0
  485. package/bundled-skills/novahiz-analyse/SKILL.md +74 -0
  486. package/bundled-skills/novahiz-audit/SKILL.md +75 -0
  487. package/bundled-skills/novahiz-clarify/SKILL.md +94 -0
  488. package/bundled-skills/novahiz-converge/SKILL.md +76 -0
  489. package/bundled-skills/novahiz-gate/SKILL.md +82 -0
  490. package/bundled-skills/novahiz-implement/SKILL.md +80 -0
  491. package/bundled-skills/novahiz-memory/SKILL.md +58 -0
  492. package/bundled-skills/novahiz-plan/SKILL.md +100 -0
  493. package/bundled-skills/novahiz-planner/SKILL.md +104 -0
  494. package/bundled-skills/novahiz-task/SKILL.md +105 -0
  495. package/bundled-skills/obsidian-bases/SKILL.md +499 -0
  496. package/bundled-skills/obsidian-bases/references/FUNCTIONS_REFERENCE.md +173 -0
  497. package/bundled-skills/obsidian-cli/SKILL.md +106 -0
  498. package/bundled-skills/obsidian-layout-adjustment/SKILL.md +226 -0
  499. package/bundled-skills/obsidian-layout-adjustment/evals/evals.json +53 -0
  500. package/bundled-skills/obsidian-layout-adjustment/references/workflow-reference.md +212 -0
  501. package/bundled-skills/obsidian-markdown/SKILL.md +196 -0
  502. package/bundled-skills/obsidian-markdown/references/CALLOUTS.md +58 -0
  503. package/bundled-skills/obsidian-markdown/references/EMBEDS.md +70 -0
  504. package/bundled-skills/obsidian-markdown/references/PROPERTIES.md +61 -0
  505. package/bundled-skills/offers/SKILL.md +155 -0
  506. package/bundled-skills/offers/evals/evals.json +21 -0
  507. package/bundled-skills/offers/references/bonus-stacking.md +150 -0
  508. package/bundled-skills/offers/references/examples.md +215 -0
  509. package/bundled-skills/offers/references/guarantee-design.md +172 -0
  510. package/bundled-skills/offers/references/offer-anatomy.md +203 -0
  511. package/bundled-skills/offers/references/offer-formats.md +240 -0
  512. package/bundled-skills/offers/references/saas-offers.md +116 -0
  513. package/bundled-skills/offers/references/scarcity-urgency.md +175 -0
  514. package/bundled-skills/offers/references/value-equation.md +134 -0
  515. package/bundled-skills/onboarding/SKILL.md +261 -0
  516. package/bundled-skills/onboarding/evals/evals.json +108 -0
  517. package/bundled-skills/onboarding/references/activation-models.md +57 -0
  518. package/bundled-skills/onboarding/references/experiments.md +258 -0
  519. package/bundled-skills/onboarding/references/minimum-path-to-value.md +49 -0
  520. package/bundled-skills/openclaw-history-ingest/SKILL.md +257 -0
  521. package/bundled-skills/openclaw-history-ingest/references/openclaw-data-format.md +154 -0
  522. package/bundled-skills/orchestration/SKILL.md +69 -0
  523. package/bundled-skills/pi-history-ingest/SKILL.md +312 -0
  524. package/bundled-skills/playwright-agent/SKILL.md +142 -0
  525. package/bundled-skills/postgresql-optimization/SKILL.md +179 -0
  526. package/bundled-skills/pricing/SKILL.md +295 -0
  527. package/bundled-skills/pricing/evals/evals.json +119 -0
  528. package/bundled-skills/pricing/references/pricing-models.md +66 -0
  529. package/bundled-skills/pricing/references/pricing-page-teardown.md +85 -0
  530. package/bundled-skills/pricing/references/research-methods.md +152 -0
  531. package/bundled-skills/pricing/references/tier-structure.md +232 -0
  532. package/bundled-skills/product-marketing/SKILL.md +255 -0
  533. package/bundled-skills/product-marketing/evals/evals.json +98 -0
  534. package/bundled-skills/prospecting/SKILL.md +262 -0
  535. package/bundled-skills/prospecting/evals/evals.json +122 -0
  536. package/bundled-skills/prospecting/references/b2b-prospecting.md +106 -0
  537. package/bundled-skills/prospecting/references/compliance.md +123 -0
  538. package/bundled-skills/prospecting/references/data-sources.md +287 -0
  539. package/bundled-skills/prospecting/references/demand-signals.md +129 -0
  540. package/bundled-skills/prospecting/references/local-prospecting.md +165 -0
  541. package/bundled-skills/prospecting/references/saas-prospecting.md +123 -0
  542. package/bundled-skills/refactor-safely/SKILL.md +29 -0
  543. package/bundled-skills/review-changes/SKILL.md +30 -0
  544. package/bundled-skills/review-delta/SKILL.md +46 -0
  545. package/bundled-skills/review-pr/SKILL.md +66 -0
  546. package/bundled-skills/sales-enablement/SKILL.md +359 -0
  547. package/bundled-skills/sales-enablement/evals/evals.json +91 -0
  548. package/bundled-skills/sales-enablement/references/deck-frameworks.md +263 -0
  549. package/bundled-skills/sales-enablement/references/demo-scripts.md +355 -0
  550. package/bundled-skills/sales-enablement/references/objection-library.md +270 -0
  551. package/bundled-skills/sales-enablement/references/one-pager-templates.md +208 -0
  552. package/bundled-skills/security-guidance/SKILL.md +161 -0
  553. package/bundled-skills/security-guidance/references/pretooluse_hook_canon.md +141 -0
  554. package/bundled-skills/senior-architect/SKILL.md +343 -0
  555. package/bundled-skills/senior-architect/references/architecture_patterns.md +470 -0
  556. package/bundled-skills/senior-architect/references/system_design_workflows.md +536 -0
  557. package/bundled-skills/senior-architect/references/tech_decision_guide.md +412 -0
  558. package/bundled-skills/senior-architect/scripts/architecture_diagram_generator.py +660 -0
  559. package/bundled-skills/senior-architect/scripts/dependency_analyzer.py +615 -0
  560. package/bundled-skills/senior-architect/scripts/project_architect.py +749 -0
  561. package/bundled-skills/senior-backend/SKILL.md +467 -0
  562. package/bundled-skills/senior-backend/profiles/django-monolith.json +57 -0
  563. package/bundled-skills/senior-backend/profiles/fastapi-python.json +58 -0
  564. package/bundled-skills/senior-backend/profiles/go-or-rust-microservice.json +62 -0
  565. package/bundled-skills/senior-backend/profiles/node-express.json +57 -0
  566. package/bundled-skills/senior-backend/references/api_design_patterns.md +530 -0
  567. package/bundled-skills/senior-backend/references/backend_security_practices.md +1075 -0
  568. package/bundled-skills/senior-backend/references/composition_map.md +58 -0
  569. package/bundled-skills/senior-backend/references/database_optimization_guide.md +593 -0
  570. package/bundled-skills/senior-backend/references/forcing_questions.md +100 -0
  571. package/bundled-skills/senior-backend/scripts/api_load_tester.py +607 -0
  572. package/bundled-skills/senior-backend/scripts/api_scaffolder.py +645 -0
  573. package/bundled-skills/senior-backend/scripts/backend_decision_engine.py +397 -0
  574. package/bundled-skills/senior-backend/scripts/database_migration_tool.py +858 -0
  575. package/bundled-skills/seo-audit/SKILL.md +499 -0
  576. package/bundled-skills/seo-audit/evals/evals.json +136 -0
  577. package/bundled-skills/seo-audit/references/ai-writing-detection.md +200 -0
  578. package/bundled-skills/seo-audit/references/international-seo.md +230 -0
  579. package/bundled-skills/session-brain/SKILL.md +101 -0
  580. package/bundled-skills/session-search/SKILL.md +97 -0
  581. package/bundled-skills/skill-creator/LICENSE.txt +202 -0
  582. package/bundled-skills/skill-creator/SKILL.md +485 -0
  583. package/bundled-skills/skill-creator/agents/analyzer.md +274 -0
  584. package/bundled-skills/skill-creator/agents/comparator.md +202 -0
  585. package/bundled-skills/skill-creator/agents/grader.md +223 -0
  586. package/bundled-skills/skill-creator/assets/eval_review.html +146 -0
  587. package/bundled-skills/skill-creator/eval-viewer/generate_review.py +471 -0
  588. package/bundled-skills/skill-creator/eval-viewer/viewer.html +1325 -0
  589. package/bundled-skills/skill-creator/references/schemas.md +430 -0
  590. package/bundled-skills/skill-creator/scripts/__init__.py +0 -0
  591. package/bundled-skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  592. package/bundled-skills/skill-creator/scripts/generate_report.py +326 -0
  593. package/bundled-skills/skill-creator/scripts/improve_description.py +247 -0
  594. package/bundled-skills/skill-creator/scripts/package_skill.py +136 -0
  595. package/bundled-skills/skill-creator/scripts/quick_validate.py +103 -0
  596. package/bundled-skills/skill-creator/scripts/run_eval.py +310 -0
  597. package/bundled-skills/skill-creator/scripts/run_loop.py +328 -0
  598. package/bundled-skills/skill-creator/scripts/utils.py +47 -0
  599. package/bundled-skills/social/SKILL.md +413 -0
  600. package/bundled-skills/social/evals/evals.json +107 -0
  601. package/bundled-skills/social/references/carousel-frameworks.md +141 -0
  602. package/bundled-skills/social/references/listening-sources-template.md +123 -0
  603. package/bundled-skills/social/references/listening.md +283 -0
  604. package/bundled-skills/social/references/platform-limits.md +110 -0
  605. package/bundled-skills/social/references/platforms.md +170 -0
  606. package/bundled-skills/social/references/post-templates.md +179 -0
  607. package/bundled-skills/social/references/reverse-engineering.md +195 -0
  608. package/bundled-skills/social/references/short-form-video.md +237 -0
  609. package/bundled-skills/spec-driven-workflow/SKILL.md +333 -0
  610. package/bundled-skills/spec-driven-workflow/references/acceptance_criteria_patterns.md +497 -0
  611. package/bundled-skills/spec-driven-workflow/references/bounded_autonomy_rules.md +273 -0
  612. package/bundled-skills/spec-driven-workflow/references/spec_format_guide.md +531 -0
  613. package/bundled-skills/spec-driven-workflow/scripts/spec_generator.py +338 -0
  614. package/bundled-skills/spec-driven-workflow/scripts/spec_validator.py +461 -0
  615. package/bundled-skills/spec-driven-workflow/scripts/test_extractor.py +431 -0
  616. package/bundled-skills/supabase/CHANGELOG.md +78 -0
  617. package/bundled-skills/supabase/SKILL.md +149 -0
  618. package/bundled-skills/supabase/assets/feedback-issue-template.md +17 -0
  619. package/bundled-skills/supabase/references/skill-feedback.md +17 -0
  620. package/bundled-skills/supabase-postgres-best-practices/CHANGELOG.md +73 -0
  621. package/bundled-skills/supabase-postgres-best-practices/SKILL.md +64 -0
  622. package/bundled-skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
  623. package/bundled-skills/supabase-postgres-best-practices/references/_sections.md +39 -0
  624. package/bundled-skills/supabase-postgres-best-practices/references/_template.md +34 -0
  625. package/bundled-skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  626. package/bundled-skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  627. package/bundled-skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  628. package/bundled-skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  629. package/bundled-skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  630. package/bundled-skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  631. package/bundled-skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  632. package/bundled-skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  633. package/bundled-skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  634. package/bundled-skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  635. package/bundled-skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  636. package/bundled-skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  637. package/bundled-skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  638. package/bundled-skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  639. package/bundled-skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  640. package/bundled-skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  641. package/bundled-skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  642. package/bundled-skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  643. package/bundled-skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  644. package/bundled-skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  645. package/bundled-skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  646. package/bundled-skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  647. package/bundled-skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  648. package/bundled-skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  649. package/bundled-skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  650. package/bundled-skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  651. package/bundled-skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  652. package/bundled-skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  653. package/bundled-skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  654. package/bundled-skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  655. package/bundled-skills/supabase-postgres-best-practices/references/security-rls-performance.md +63 -0
  656. package/bundled-skills/tag-taxonomy/SKILL.md +218 -0
  657. package/bundled-skills/typescript-expert/SKILL.md +431 -0
  658. package/bundled-skills/typescript-expert/references/tsconfig-strict.json +45 -0
  659. package/bundled-skills/typescript-expert/references/typescript-cheatsheet.md +383 -0
  660. package/bundled-skills/typescript-expert/references/utility-types.ts +335 -0
  661. package/bundled-skills/typescript-expert/scripts/ts_diagnostic.py +203 -0
  662. package/bundled-skills/ui-design-system/SKILL.md +379 -0
  663. package/bundled-skills/ui-design-system/assets/design_system_doc_template.md +180 -0
  664. package/bundled-skills/ui-design-system/references/component-architecture.md +396 -0
  665. package/bundled-skills/ui-design-system/references/developer-handoff.md +509 -0
  666. package/bundled-skills/ui-design-system/references/responsive-calculations.md +390 -0
  667. package/bundled-skills/ui-design-system/references/token-generation.md +324 -0
  668. package/bundled-skills/ui-design-system/scripts/design_token_generator.py +590 -0
  669. package/bundled-skills/vault-skill-factory/SKILL.md +143 -0
  670. package/bundled-skills/video/SKILL.md +346 -0
  671. package/bundled-skills/video/evals/evals.json +103 -0
  672. package/bundled-skills/video/references/ai-video-prompting.md +175 -0
  673. package/bundled-skills/video/references/edit-anatomy.md +84 -0
  674. package/bundled-skills/wiki-agent/SKILL.md +322 -0
  675. package/bundled-skills/wiki-capture/SKILL.md +337 -0
  676. package/bundled-skills/wiki-capture/references/RAW-FORMAT.md +115 -0
  677. package/bundled-skills/wiki-context-pack/SKILL.md +89 -0
  678. package/bundled-skills/wiki-dashboard/SKILL.md +472 -0
  679. package/bundled-skills/wiki-dedup/SKILL.md +320 -0
  680. package/bundled-skills/wiki-digest/SKILL.md +243 -0
  681. package/bundled-skills/wiki-export/SKILL.md +445 -0
  682. package/bundled-skills/wiki-history-ingest/SKILL.md +61 -0
  683. package/bundled-skills/wiki-import/SKILL.md +276 -0
  684. package/bundled-skills/wiki-ingest/SKILL.md +563 -0
  685. package/bundled-skills/wiki-ingest/references/ingest-prompts.md +54 -0
  686. package/bundled-skills/wiki-ingest/references/pageindex.md +72 -0
  687. package/bundled-skills/wiki-ingest/references/url-sources.md +295 -0
  688. package/bundled-skills/wiki-lint/SKILL.md +643 -0
  689. package/bundled-skills/wiki-narrate/SKILL.md +120 -0
  690. package/bundled-skills/wiki-narrate/references/voices.md +29 -0
  691. package/bundled-skills/wiki-query/SKILL.md +307 -0
  692. package/bundled-skills/wiki-rebuild/SKILL.md +212 -0
  693. package/bundled-skills/wiki-research/SKILL.md +319 -0
  694. package/bundled-skills/wiki-setup/SKILL.md +359 -0
  695. package/bundled-skills/wiki-stage-commit/SKILL.md +164 -0
  696. package/bundled-skills/wiki-status/SKILL.md +556 -0
  697. package/bundled-skills/wiki-switch/SKILL.md +115 -0
  698. package/bundled-skills/wiki-synthesize/SKILL.md +212 -0
  699. package/bundled-skills/wiki-update/SKILL.md +271 -0
  700. package/bundled-skills/write-a-skill/SKILL.md +141 -0
  701. package/bundled-skills/write-a-skill/references/companion_tooling.md +67 -0
  702. package/bundled-skills/write-a-skill/references/description_design_patterns.md +139 -0
  703. package/bundled-skills/write-a-skill/references/progressive_disclosure_principles.md +89 -0
  704. package/bundled-skills/write-a-skill/references/quality_gates_for_skills.md +158 -0
  705. package/bundled-skills/write-a-skill/scripts/skill_description_validator.py +255 -0
  706. package/bundled-skills/write-a-skill/scripts/skill_review_checklist_runner.py +268 -0
  707. package/bundled-skills/write-a-skill/scripts/skill_structure_validator.py +277 -0
  708. package/bundled-skills/zero-hallucination-coder/SKILL.md +271 -0
  709. package/catalog/categories.json +1030 -0
  710. package/catalog/overrides.json +525 -0
  711. package/catalog/providers.json +145 -0
  712. package/catalog/rules.json +112 -0
  713. package/docs/ARCHITECTURE.md +82 -0
  714. package/docs/CONSTITUTION.md +60 -0
  715. package/docs/EXECUTION.md +79 -0
  716. package/docs/HARNESSES.md +38 -0
  717. package/docs/INSTALL.md +123 -0
  718. package/docs/PROVIDERS.md +128 -0
  719. package/docs/ROADMAPS.md +74 -0
  720. package/docs/RULES.md +85 -0
  721. package/docs/TOKENS.md +48 -0
  722. package/install/bootstrap.mjs +273 -0
  723. package/install/install.mjs +466 -0
  724. package/install/install.ps1 +3 -0
  725. package/install/install.sh +4 -0
  726. package/install/lib.mjs +198 -0
  727. package/install/prompt.mjs +16 -0
  728. package/install/uninstall.mjs +109 -0
  729. package/mcp/novahiz-tools/README.md +26 -0
  730. package/mcp/novahiz-tools/index.mjs +452 -0
  731. package/novahiz.config.example.json +39 -0
  732. package/package.json +76 -0
  733. package/skills/a11y-audit/SKILL.md +211 -0
  734. package/skills/a11y-audit/assets/sample-component.tsx +51 -0
  735. package/skills/a11y-audit/expected_outputs/sample-contrast-output.txt +39 -0
  736. package/skills/a11y-audit/expected_outputs/sample-scan-output.json +34 -0
  737. package/skills/a11y-audit/expected_outputs/sample-scan-report.md +63 -0
  738. package/skills/a11y-audit/references/aria-patterns.md +223 -0
  739. package/skills/a11y-audit/references/audit-report-template.md +46 -0
  740. package/skills/a11y-audit/references/ci-cd-integration.md +127 -0
  741. package/skills/a11y-audit/references/color-contrast-guide.md +83 -0
  742. package/skills/a11y-audit/references/examples-by-framework.md +312 -0
  743. package/skills/a11y-audit/references/framework-a11y-patterns.md +661 -0
  744. package/skills/a11y-audit/references/testing-checklist.md +41 -0
  745. package/skills/a11y-audit/references/wcag-22-new-criteria.md +79 -0
  746. package/skills/a11y-audit/references/wcag-quick-ref.md +113 -0
  747. package/skills/a11y-audit/scripts/a11y_scanner.py +684 -0
  748. package/skills/a11y-audit/scripts/contrast_checker.py +504 -0
  749. package/skills/adversarial-reviewer/SKILL.md +247 -0
  750. package/skills/ai-security/SKILL.md +364 -0
  751. package/skills/ai-security/references/atlas-coverage.md +150 -0
  752. package/skills/ai-security/scripts/ai_threat_scanner.py +564 -0
  753. package/skills/anti-AI-design/SKILL.md +189 -0
  754. package/skills/anti-pattern-detector/SKILL.md +185 -0
  755. package/skills/anti-pattern-detector/references/async-network-patterns.md +581 -0
  756. package/skills/anti-pattern-detector/references/build-deploy-patterns.md +554 -0
  757. package/skills/anti-pattern-detector/references/cache-patterns.md +446 -0
  758. package/skills/anti-pattern-detector/references/cloud-infra-patterns.md +538 -0
  759. package/skills/anti-pattern-detector/references/concurrency-patterns.md +558 -0
  760. package/skills/anti-pattern-detector/references/language-specific-patterns.md +740 -0
  761. package/skills/anti-pattern-detector/references/monitoring-patterns.md +456 -0
  762. package/skills/api-design-reviewer/SKILL.md +433 -0
  763. package/skills/api-design-reviewer/references/api_antipatterns.md +680 -0
  764. package/skills/api-design-reviewer/references/rest_design_rules.md +487 -0
  765. package/skills/api-design-reviewer/scripts/api_linter.py +956 -0
  766. package/skills/api-design-reviewer/scripts/api_scorecard.py +1661 -0
  767. package/skills/api-design-reviewer/scripts/breaking_change_detector.py +1102 -0
  768. package/skills/apple-hig-expert/SKILL.md +108 -0
  769. package/skills/apple-hig-expert/references/accessibility.md +55 -0
  770. package/skills/apple-hig-expert/references/platform-specifics.md +48 -0
  771. package/skills/apple-hig-expert/references/visual-design.md +69 -0
  772. package/skills/apple-hig-expert/scripts/hig_checker.py +97 -0
  773. package/skills/apple-hig-expert/templates/hig-audit-template.md +83 -0
  774. package/skills/clean-code/SKILL.md +99 -0
  775. package/skills/code-reviewer/README.md +92 -0
  776. package/skills/code-reviewer/SKILL.md +183 -0
  777. package/skills/code-reviewer/assets/sample_c_clean.c +71 -0
  778. package/skills/code-reviewer/assets/sample_c_smells.c +66 -0
  779. package/skills/code-reviewer/assets/sample_csharp_clean.cs +100 -0
  780. package/skills/code-reviewer/assets/sample_csharp_smells.cs +78 -0
  781. package/skills/code-reviewer/assets/sample_java_clean.java +55 -0
  782. package/skills/code-reviewer/assets/sample_java_smells.java +56 -0
  783. package/skills/code-reviewer/expected_outputs/sample_c_clean_quality.json +65 -0
  784. package/skills/code-reviewer/expected_outputs/sample_c_smells_quality.json +155 -0
  785. package/skills/code-reviewer/expected_outputs/sample_csharp_clean_quality.json +135 -0
  786. package/skills/code-reviewer/expected_outputs/sample_csharp_smells_quality.json +143 -0
  787. package/skills/code-reviewer/expected_outputs/sample_java_clean_quality.json +53 -0
  788. package/skills/code-reviewer/expected_outputs/sample_java_smells_quality.json +83 -0
  789. package/skills/code-reviewer/languages/c.md +103 -0
  790. package/skills/code-reviewer/languages/cpp.md +103 -0
  791. package/skills/code-reviewer/languages/csharp.md +97 -0
  792. package/skills/code-reviewer/languages/dart.md +108 -0
  793. package/skills/code-reviewer/languages/go.md +92 -0
  794. package/skills/code-reviewer/languages/java.md +103 -0
  795. package/skills/code-reviewer/languages/kotlin.md +88 -0
  796. package/skills/code-reviewer/languages/php.md +109 -0
  797. package/skills/code-reviewer/languages/python.md +94 -0
  798. package/skills/code-reviewer/languages/ruby.md +105 -0
  799. package/skills/code-reviewer/languages/rust.md +99 -0
  800. package/skills/code-reviewer/languages/swift.md +88 -0
  801. package/skills/code-reviewer/languages/typescript.md +97 -0
  802. package/skills/code-reviewer/rules/universal.md +49 -0
  803. package/skills/code-reviewer/scripts/code_quality_checker.py +1020 -0
  804. package/skills/code-reviewer/scripts/pr_analyzer.py +535 -0
  805. package/skills/code-reviewer/scripts/review_report_generator.py +505 -0
  806. package/skills/code-understand/SKILL.md +90 -0
  807. package/skills/database-designer/README.md +388 -0
  808. package/skills/database-designer/SKILL.md +314 -0
  809. package/skills/database-designer/assets/sample_query_patterns.json +375 -0
  810. package/skills/database-designer/assets/sample_schema.json +372 -0
  811. package/skills/database-designer/assets/sample_schema.sql +207 -0
  812. package/skills/database-designer/expected_outputs/index_optimization_sample.txt +60 -0
  813. package/skills/database-designer/expected_outputs/migration_sample.txt +124 -0
  814. package/skills/database-designer/expected_outputs/schema_analysis_sample.txt +222 -0
  815. package/skills/database-designer/index_optimizer.py +926 -0
  816. package/skills/database-designer/migration_generator.py +1199 -0
  817. package/skills/database-designer/references/database-design-reference.md +476 -0
  818. package/skills/database-designer/references/database_selection_decision_tree.md +373 -0
  819. package/skills/database-designer/references/index_strategy_patterns.md +424 -0
  820. package/skills/database-designer/references/normalization_guide.md +354 -0
  821. package/skills/database-designer/schema_analyzer.py +982 -0
  822. package/skills/defuddle/SKILL.md +41 -0
  823. package/skills/dependency-auditor/README.md +524 -0
  824. package/skills/dependency-auditor/SKILL.md +85 -0
  825. package/skills/dependency-auditor/assets/sample_go.mod +53 -0
  826. package/skills/dependency-auditor/assets/sample_package.json +72 -0
  827. package/skills/dependency-auditor/assets/sample_requirements.txt +71 -0
  828. package/skills/dependency-auditor/expected_outputs/sample_license_report.txt +37 -0
  829. package/skills/dependency-auditor/expected_outputs/sample_upgrade_plan.txt +59 -0
  830. package/skills/dependency-auditor/expected_outputs/sample_vulnerability_report.json +71 -0
  831. package/skills/dependency-auditor/references/dependency_management_best_practices.md +643 -0
  832. package/skills/dependency-auditor/references/license_compatibility_matrix.md +238 -0
  833. package/skills/dependency-auditor/references/vulnerability_assessment_guide.md +461 -0
  834. package/skills/dependency-auditor/scripts/dep_scanner.py +794 -0
  835. package/skills/dependency-auditor/scripts/license_checker.py +996 -0
  836. package/skills/dependency-auditor/scripts/upgrade_planner.py +1029 -0
  837. package/skills/dependency-auditor/test-inventory.json +421 -0
  838. package/skills/dependency-auditor/test-project/package.json +72 -0
  839. package/skills/design-taste-frontend/SKILL.md +247 -0
  840. package/skills/engineering-standards/SKILL.md +736 -0
  841. package/skills/env-secrets-manager/SKILL.md +260 -0
  842. package/skills/env-secrets-manager/references/secret-patterns.md +41 -0
  843. package/skills/env-secrets-manager/references/validation-detection-rotation.md +358 -0
  844. package/skills/env-secrets-manager/scripts/env_auditor.py +145 -0
  845. package/skills/fix/SKILL.md +113 -0
  846. package/skills/fix/flaky-taxonomy.md +134 -0
  847. package/skills/gate/SKILL.md +13 -0
  848. package/skills/humanizer/SKILL.md +374 -0
  849. package/skills/mcp-server-builder/README.md +50 -0
  850. package/skills/mcp-server-builder/SKILL.md +100 -0
  851. package/skills/mcp-server-builder/references/openapi-extraction-guide.md +34 -0
  852. package/skills/mcp-server-builder/references/production-hardening-guide.md +78 -0
  853. package/skills/mcp-server-builder/references/python-server-template.md +22 -0
  854. package/skills/mcp-server-builder/references/typescript-server-template.md +19 -0
  855. package/skills/mcp-server-builder/references/validation-checklist.md +30 -0
  856. package/skills/mcp-server-builder/scripts/mcp_validator.py +186 -0
  857. package/skills/mcp-server-builder/scripts/openapi_to_mcp.py +284 -0
  858. package/skills/memory/SKILL.md +10 -0
  859. package/skills/migrate/SKILL.md +135 -0
  860. package/skills/migrate/cypress-mapping.md +79 -0
  861. package/skills/migrate/selenium-mapping.md +94 -0
  862. package/skills/novahiz-analyse/SKILL.md +74 -0
  863. package/skills/novahiz-audit/SKILL.md +75 -0
  864. package/skills/novahiz-clarify/SKILL.md +94 -0
  865. package/skills/novahiz-converge/SKILL.md +76 -0
  866. package/skills/novahiz-gate/SKILL.md +82 -0
  867. package/skills/novahiz-implement/SKILL.md +80 -0
  868. package/skills/novahiz-memory/SKILL.md +58 -0
  869. package/skills/novahiz-plan/SKILL.md +99 -0
  870. package/skills/novahiz-planner/SKILL.md +104 -0
  871. package/skills/novahiz-task/SKILL.md +105 -0
  872. package/skills/playwright-agent/SKILL.md +142 -0
  873. package/skills/postgresql-optimization/SKILL.md +179 -0
  874. package/skills/review-changes/SKILL.md +30 -0
  875. package/skills/security-guidance/SKILL.md +160 -0
  876. package/skills/security-guidance/references/pretooluse_hook_canon.md +141 -0
  877. package/skills/senior-architect/SKILL.md +343 -0
  878. package/skills/senior-architect/references/architecture_patterns.md +470 -0
  879. package/skills/senior-architect/references/system_design_workflows.md +536 -0
  880. package/skills/senior-architect/references/tech_decision_guide.md +412 -0
  881. package/skills/senior-architect/scripts/architecture_diagram_generator.py +660 -0
  882. package/skills/senior-architect/scripts/dependency_analyzer.py +615 -0
  883. package/skills/senior-architect/scripts/project_architect.py +749 -0
  884. package/skills/senior-backend/SKILL.md +467 -0
  885. package/skills/senior-backend/profiles/django-monolith.json +57 -0
  886. package/skills/senior-backend/profiles/fastapi-python.json +58 -0
  887. package/skills/senior-backend/profiles/go-or-rust-microservice.json +62 -0
  888. package/skills/senior-backend/profiles/node-express.json +57 -0
  889. package/skills/senior-backend/references/api_design_patterns.md +530 -0
  890. package/skills/senior-backend/references/backend_security_practices.md +1075 -0
  891. package/skills/senior-backend/references/composition_map.md +58 -0
  892. package/skills/senior-backend/references/database_optimization_guide.md +593 -0
  893. package/skills/senior-backend/references/forcing_questions.md +100 -0
  894. package/skills/senior-backend/scripts/api_load_tester.py +607 -0
  895. package/skills/senior-backend/scripts/api_scaffolder.py +645 -0
  896. package/skills/senior-backend/scripts/backend_decision_engine.py +397 -0
  897. package/skills/senior-backend/scripts/database_migration_tool.py +858 -0
  898. package/skills/senior-secops/SKILL.md +505 -0
  899. package/skills/senior-secops/references/compliance_requirements.md +792 -0
  900. package/skills/senior-secops/references/security_standards.md +718 -0
  901. package/skills/senior-secops/references/vulnerability_management_guide.md +487 -0
  902. package/skills/senior-secops/scripts/compliance_checker.py +1107 -0
  903. package/skills/senior-secops/scripts/security_scanner.py +471 -0
  904. package/skills/senior-secops/scripts/vulnerability_assessor.py +563 -0
  905. package/skills/skill-creator/LICENSE.txt +202 -0
  906. package/skills/skill-creator/SKILL.md +485 -0
  907. package/skills/skill-creator/agents/analyzer.md +274 -0
  908. package/skills/skill-creator/agents/comparator.md +202 -0
  909. package/skills/skill-creator/agents/grader.md +223 -0
  910. package/skills/skill-creator/assets/eval_review.html +146 -0
  911. package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  912. package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  913. package/skills/skill-creator/references/schemas.md +430 -0
  914. package/skills/skill-creator/scripts/__init__.py +0 -0
  915. package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  916. package/skills/skill-creator/scripts/generate_report.py +326 -0
  917. package/skills/skill-creator/scripts/improve_description.py +247 -0
  918. package/skills/skill-creator/scripts/package_skill.py +136 -0
  919. package/skills/skill-creator/scripts/quick_validate.py +103 -0
  920. package/skills/skill-creator/scripts/run_eval.py +310 -0
  921. package/skills/skill-creator/scripts/run_loop.py +328 -0
  922. package/skills/skill-creator/scripts/utils.py +47 -0
  923. package/skills/spec-driven-workflow/SKILL.md +333 -0
  924. package/skills/spec-driven-workflow/references/acceptance_criteria_patterns.md +497 -0
  925. package/skills/spec-driven-workflow/references/bounded_autonomy_rules.md +273 -0
  926. package/skills/spec-driven-workflow/references/spec_format_guide.md +531 -0
  927. package/skills/spec-driven-workflow/scripts/spec_generator.py +338 -0
  928. package/skills/spec-driven-workflow/scripts/spec_validator.py +461 -0
  929. package/skills/spec-driven-workflow/scripts/test_extractor.py +431 -0
  930. package/skills/supabase/CHANGELOG.md +78 -0
  931. package/skills/supabase/SKILL.md +149 -0
  932. package/skills/supabase/assets/feedback-issue-template.md +17 -0
  933. package/skills/supabase/references/skill-feedback.md +17 -0
  934. package/skills/supabase-postgres-best-practices/CHANGELOG.md +73 -0
  935. package/skills/supabase-postgres-best-practices/SKILL.md +64 -0
  936. package/skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
  937. package/skills/supabase-postgres-best-practices/references/_sections.md +39 -0
  938. package/skills/supabase-postgres-best-practices/references/_template.md +34 -0
  939. package/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  940. package/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  941. package/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  942. package/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  943. package/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  944. package/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  945. package/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  946. package/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  947. package/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  948. package/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  949. package/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  950. package/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  951. package/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  952. package/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  953. package/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  954. package/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  955. package/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  956. package/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  957. package/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  958. package/skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  959. package/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  960. package/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  961. package/skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  962. package/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  963. package/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  964. package/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  965. package/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  966. package/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  967. package/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  968. package/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  969. package/skills/supabase-postgres-best-practices/references/security-rls-performance.md +63 -0
  970. package/skills/typescript-expert/SKILL.md +431 -0
  971. package/skills/typescript-expert/references/tsconfig-strict.json +45 -0
  972. package/skills/typescript-expert/references/typescript-cheatsheet.md +383 -0
  973. package/skills/typescript-expert/references/utility-types.ts +335 -0
  974. package/skills/typescript-expert/scripts/ts_diagnostic.py +203 -0
  975. package/skills/ui-design-system/SKILL.md +379 -0
  976. package/skills/ui-design-system/assets/design_system_doc_template.md +180 -0
  977. package/skills/ui-design-system/references/component-architecture.md +396 -0
  978. package/skills/ui-design-system/references/developer-handoff.md +509 -0
  979. package/skills/ui-design-system/references/responsive-calculations.md +390 -0
  980. package/skills/ui-design-system/references/token-generation.md +324 -0
  981. package/skills/ui-design-system/scripts/design_token_generator.py +590 -0
  982. package/skills/write-a-skill/SKILL.md +141 -0
  983. package/skills/write-a-skill/references/companion_tooling.md +67 -0
  984. package/skills/write-a-skill/references/description_design_patterns.md +139 -0
  985. package/skills/write-a-skill/references/progressive_disclosure_principles.md +89 -0
  986. package/skills/write-a-skill/references/quality_gates_for_skills.md +158 -0
  987. package/skills/write-a-skill/scripts/skill_description_validator.py +255 -0
  988. package/skills/write-a-skill/scripts/skill_review_checklist_runner.py +268 -0
  989. package/skills/write-a-skill/scripts/skill_structure_validator.py +277 -0
  990. package/skills/zero-hallucination-coder/SKILL.md +271 -0
  991. package/src/catalog.ts +266 -0
  992. package/src/classify.ts +201 -0
  993. package/src/cli.ts +115 -0
  994. package/src/commands/clean.ts +114 -0
  995. package/src/commands/context.ts +130 -0
  996. package/src/commands/doctor.ts +191 -0
  997. package/src/commands/gate.ts +192 -0
  998. package/src/commands/inspect.ts +296 -0
  999. package/src/commands/report.ts +85 -0
  1000. package/src/commands/task.ts +310 -0
  1001. package/src/commands/tokens.ts +85 -0
  1002. package/src/content.ts +70 -0
  1003. package/src/db.ts +143 -0
  1004. package/src/deps.ts +36 -0
  1005. package/src/exec.ts +85 -0
  1006. package/src/gate.ts +261 -0
  1007. package/src/ledger.ts +468 -0
  1008. package/src/providers.ts +52 -0
  1009. package/src/relevance.ts +73 -0
  1010. package/src/render.ts +107 -0
  1011. package/src/spec.ts +306 -0
  1012. package/src/targets.ts +296 -0
  1013. package/tsconfig.json +15 -0
@@ -0,0 +1,956 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ API Linter - Analyzes OpenAPI/Swagger specifications for REST conventions and best practices.
4
+
5
+ This script validates API designs against established conventions including:
6
+ - Resource naming conventions (kebab-case resources, camelCase fields)
7
+ - HTTP method usage patterns
8
+ - URL structure consistency
9
+ - Error response format standards
10
+ - Documentation completeness
11
+ - Pagination patterns
12
+ - Versioning compliance
13
+
14
+ Supports both OpenAPI JSON specifications and raw endpoint definition JSON.
15
+ """
16
+
17
+ import argparse
18
+ import json
19
+ import re
20
+ import sys
21
+ from typing import Any, Dict, List, Tuple, Optional, Set
22
+ from urllib.parse import urlparse
23
+ from dataclasses import dataclass, field
24
+
25
+
26
+ @dataclass
27
+ class LintIssue:
28
+ """Represents a linting issue found in the API specification."""
29
+ severity: str # 'error', 'warning', 'info'
30
+ category: str
31
+ message: str
32
+ path: str
33
+ suggestion: str = ""
34
+ line_number: Optional[int] = None
35
+
36
+
37
+ @dataclass
38
+ class LintReport:
39
+ """Complete linting report with issues and statistics."""
40
+ issues: List[LintIssue] = field(default_factory=list)
41
+ total_endpoints: int = 0
42
+ endpoints_with_issues: int = 0
43
+ score: float = 0.0
44
+
45
+ def add_issue(self, issue: LintIssue) -> None:
46
+ """Add an issue to the report."""
47
+ self.issues.append(issue)
48
+
49
+ def get_issues_by_severity(self) -> Dict[str, List[LintIssue]]:
50
+ """Group issues by severity level."""
51
+ grouped = {'error': [], 'warning': [], 'info': []}
52
+ for issue in self.issues:
53
+ if issue.severity in grouped:
54
+ grouped[issue.severity].append(issue)
55
+ return grouped
56
+
57
+ def calculate_score(self) -> float:
58
+ """Calculate overall API quality score (0-100)."""
59
+ if self.total_endpoints == 0:
60
+ return 100.0
61
+
62
+ error_penalty = len([i for i in self.issues if i.severity == 'error']) * 10
63
+ warning_penalty = len([i for i in self.issues if i.severity == 'warning']) * 3
64
+ info_penalty = len([i for i in self.issues if i.severity == 'info']) * 1
65
+
66
+ total_penalty = error_penalty + warning_penalty + info_penalty
67
+ base_score = 100.0
68
+
69
+ # Penalty per endpoint to normalize across API sizes
70
+ penalty_per_endpoint = total_penalty / self.total_endpoints if self.total_endpoints > 0 else total_penalty
71
+
72
+ self.score = max(0.0, base_score - penalty_per_endpoint)
73
+ return self.score
74
+
75
+
76
+ class APILinter:
77
+ """Main API linting engine."""
78
+
79
+ def __init__(self):
80
+ self.report = LintReport()
81
+ self.openapi_spec: Optional[Dict] = None
82
+ self.raw_endpoints: Optional[Dict] = None
83
+
84
+ # Regex patterns for naming conventions
85
+ self.kebab_case_pattern = re.compile(r'^[a-z]+(?:-[a-z0-9]+)*$')
86
+ self.camel_case_pattern = re.compile(r'^[a-z][a-zA-Z0-9]*$')
87
+ self.snake_case_pattern = re.compile(r'^[a-z]+(?:_[a-z0-9]+)*$')
88
+ self.pascal_case_pattern = re.compile(r'^[A-Z][a-zA-Z0-9]*$')
89
+
90
+ # Standard HTTP methods
91
+ self.http_methods = {'GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'}
92
+
93
+ # Standard HTTP status codes by method
94
+ self.standard_status_codes = {
95
+ 'GET': {200, 304, 404},
96
+ 'POST': {200, 201, 400, 409, 422},
97
+ 'PUT': {200, 204, 400, 404, 409},
98
+ 'PATCH': {200, 204, 400, 404, 409},
99
+ 'DELETE': {200, 204, 404},
100
+ 'HEAD': {200, 404},
101
+ 'OPTIONS': {200}
102
+ }
103
+
104
+ # Common error status codes
105
+ self.common_error_codes = {400, 401, 403, 404, 405, 409, 422, 429, 500, 502, 503}
106
+
107
+ def lint_openapi_spec(self, spec: Dict[str, Any]) -> LintReport:
108
+ """Lint an OpenAPI/Swagger specification."""
109
+ self.openapi_spec = spec
110
+ self.report = LintReport()
111
+
112
+ # Basic structure validation
113
+ self._validate_openapi_structure()
114
+
115
+ # Info section validation
116
+ self._validate_info_section()
117
+
118
+ # Server section validation
119
+ self._validate_servers_section()
120
+
121
+ # Paths validation (main linting logic)
122
+ self._validate_paths_section()
123
+
124
+ # Components validation
125
+ self._validate_components_section()
126
+
127
+ # Security validation
128
+ self._validate_security_section()
129
+
130
+ # Calculate final score
131
+ self.report.calculate_score()
132
+
133
+ return self.report
134
+
135
+ def lint_raw_endpoints(self, endpoints: Dict[str, Any]) -> LintReport:
136
+ """Lint raw endpoint definitions."""
137
+ self.raw_endpoints = endpoints
138
+ self.report = LintReport()
139
+
140
+ # Validate raw endpoint structure
141
+ self._validate_raw_endpoint_structure()
142
+
143
+ # Lint each endpoint
144
+ for endpoint_path, endpoint_data in endpoints.get('endpoints', {}).items():
145
+ self._lint_raw_endpoint(endpoint_path, endpoint_data)
146
+
147
+ self.report.calculate_score()
148
+ return self.report
149
+
150
+ def _validate_openapi_structure(self) -> None:
151
+ """Validate basic OpenAPI document structure."""
152
+ required_fields = ['openapi', 'info', 'paths']
153
+
154
+ for field in required_fields:
155
+ if field not in self.openapi_spec:
156
+ self.report.add_issue(LintIssue(
157
+ severity='error',
158
+ category='structure',
159
+ message=f"Missing required field: {field}",
160
+ path=f"/{field}",
161
+ suggestion=f"Add the '{field}' field to the root of your OpenAPI specification"
162
+ ))
163
+
164
+ def _validate_info_section(self) -> None:
165
+ """Validate the info section of OpenAPI spec."""
166
+ if 'info' not in self.openapi_spec:
167
+ return
168
+
169
+ info = self.openapi_spec['info']
170
+ required_info_fields = ['title', 'version']
171
+ recommended_info_fields = ['description', 'contact']
172
+
173
+ for field in required_info_fields:
174
+ if field not in info:
175
+ self.report.add_issue(LintIssue(
176
+ severity='error',
177
+ category='documentation',
178
+ message=f"Missing required info field: {field}",
179
+ path=f"/info/{field}",
180
+ suggestion=f"Add a '{field}' field to the info section"
181
+ ))
182
+
183
+ for field in recommended_info_fields:
184
+ if field not in info:
185
+ self.report.add_issue(LintIssue(
186
+ severity='warning',
187
+ category='documentation',
188
+ message=f"Missing recommended info field: {field}",
189
+ path=f"/info/{field}",
190
+ suggestion=f"Consider adding a '{field}' field to improve API documentation"
191
+ ))
192
+
193
+ # Validate version format
194
+ if 'version' in info:
195
+ version = info['version']
196
+ if not re.match(r'^\d+\.\d+(\.\d+)?(-\w+)?$', version):
197
+ self.report.add_issue(LintIssue(
198
+ severity='warning',
199
+ category='versioning',
200
+ message=f"Version format '{version}' doesn't follow semantic versioning",
201
+ path="/info/version",
202
+ suggestion="Use semantic versioning format (e.g., '1.0.0', '2.1.3-beta')"
203
+ ))
204
+
205
+ def _validate_servers_section(self) -> None:
206
+ """Validate the servers section."""
207
+ if 'servers' not in self.openapi_spec:
208
+ self.report.add_issue(LintIssue(
209
+ severity='warning',
210
+ category='configuration',
211
+ message="Missing servers section",
212
+ path="/servers",
213
+ suggestion="Add a servers section to specify API base URLs"
214
+ ))
215
+ return
216
+
217
+ servers = self.openapi_spec['servers']
218
+ if not isinstance(servers, list) or len(servers) == 0:
219
+ self.report.add_issue(LintIssue(
220
+ severity='warning',
221
+ category='configuration',
222
+ message="Empty servers section",
223
+ path="/servers",
224
+ suggestion="Add at least one server URL"
225
+ ))
226
+
227
+ def _validate_paths_section(self) -> None:
228
+ """Validate all API paths and operations."""
229
+ if 'paths' not in self.openapi_spec:
230
+ return
231
+
232
+ paths = self.openapi_spec['paths']
233
+ if not paths:
234
+ self.report.add_issue(LintIssue(
235
+ severity='error',
236
+ category='structure',
237
+ message="No paths defined in API specification",
238
+ path="/paths",
239
+ suggestion="Define at least one API endpoint"
240
+ ))
241
+ return
242
+
243
+ self.report.total_endpoints = sum(
244
+ len([method for method in path_obj.keys() if method.upper() in self.http_methods])
245
+ for path_obj in paths.values() if isinstance(path_obj, dict)
246
+ )
247
+
248
+ endpoints_with_issues = set()
249
+
250
+ for path, path_obj in paths.items():
251
+ if not isinstance(path_obj, dict):
252
+ continue
253
+
254
+ # Validate path structure
255
+ path_issues = self._validate_path_structure(path)
256
+ if path_issues:
257
+ endpoints_with_issues.add(path)
258
+
259
+ # Validate each operation in the path
260
+ for method, operation in path_obj.items():
261
+ if method.upper() not in self.http_methods:
262
+ continue
263
+
264
+ operation_issues = self._validate_operation(path, method.upper(), operation)
265
+ if operation_issues:
266
+ endpoints_with_issues.add(path)
267
+
268
+ self.report.endpoints_with_issues = len(endpoints_with_issues)
269
+
270
+ def _validate_path_structure(self, path: str) -> bool:
271
+ """Validate REST path structure and naming conventions."""
272
+ has_issues = False
273
+
274
+ # Check if path starts with slash
275
+ if not path.startswith('/'):
276
+ self.report.add_issue(LintIssue(
277
+ severity='error',
278
+ category='url_structure',
279
+ message=f"Path must start with '/' character: {path}",
280
+ path=f"/paths/{path}",
281
+ suggestion=f"Change '{path}' to '/{path.lstrip('/')}'"
282
+ ))
283
+ has_issues = True
284
+
285
+ # Split path into segments
286
+ segments = [seg for seg in path.split('/') if seg]
287
+
288
+ # Check for empty segments (double slashes)
289
+ if '//' in path:
290
+ self.report.add_issue(LintIssue(
291
+ severity='error',
292
+ category='url_structure',
293
+ message=f"Path contains empty segments: {path}",
294
+ path=f"/paths/{path}",
295
+ suggestion="Remove double slashes from the path"
296
+ ))
297
+ has_issues = True
298
+
299
+ # Validate each segment
300
+ for i, segment in enumerate(segments):
301
+ # Skip parameter segments
302
+ if segment.startswith('{') and segment.endswith('}'):
303
+ # Validate parameter naming
304
+ param_name = segment[1:-1]
305
+ if not self.camel_case_pattern.match(param_name) and not self.kebab_case_pattern.match(param_name):
306
+ self.report.add_issue(LintIssue(
307
+ severity='warning',
308
+ category='naming',
309
+ message=f"Path parameter '{param_name}' should use camelCase or kebab-case",
310
+ path=f"/paths/{path}",
311
+ suggestion=f"Use camelCase (e.g., 'userId') or kebab-case (e.g., 'user-id')"
312
+ ))
313
+ has_issues = True
314
+ continue
315
+
316
+ # Check for resource naming conventions
317
+ if not self.kebab_case_pattern.match(segment):
318
+ # Allow version segments like 'v1', 'v2'
319
+ if not re.match(r'^v\d+$', segment):
320
+ self.report.add_issue(LintIssue(
321
+ severity='warning',
322
+ category='naming',
323
+ message=f"Resource segment '{segment}' should use kebab-case",
324
+ path=f"/paths/{path}",
325
+ suggestion=f"Use kebab-case for '{segment}' (e.g., 'user-profiles', 'order-items')"
326
+ ))
327
+ has_issues = True
328
+
329
+ # Check for verb usage in URLs (anti-pattern)
330
+ common_verbs = {'get', 'post', 'put', 'delete', 'create', 'update', 'remove', 'add'}
331
+ if segment.lower() in common_verbs:
332
+ self.report.add_issue(LintIssue(
333
+ severity='warning',
334
+ category='rest_conventions',
335
+ message=f"Avoid verbs in URLs: '{segment}' in {path}",
336
+ path=f"/paths/{path}",
337
+ suggestion="Use HTTP methods instead of verbs in URLs. Use nouns for resources."
338
+ ))
339
+ has_issues = True
340
+
341
+ # Check path depth (avoid over-nesting)
342
+ if len(segments) > 6:
343
+ self.report.add_issue(LintIssue(
344
+ severity='warning',
345
+ category='url_structure',
346
+ message=f"Path has excessive nesting ({len(segments)} levels): {path}",
347
+ path=f"/paths/{path}",
348
+ suggestion="Consider flattening the resource hierarchy or using query parameters"
349
+ ))
350
+ has_issues = True
351
+
352
+ # Check for consistent versioning
353
+ if any('v' + str(i) in segments for i in range(1, 10)):
354
+ version_segments = [seg for seg in segments if re.match(r'^v\d+$', seg)]
355
+ if len(version_segments) > 1:
356
+ self.report.add_issue(LintIssue(
357
+ severity='error',
358
+ category='versioning',
359
+ message=f"Multiple version segments in path: {path}",
360
+ path=f"/paths/{path}",
361
+ suggestion="Use only one version segment per path"
362
+ ))
363
+ has_issues = True
364
+
365
+ return has_issues
366
+
367
+ def _validate_operation(self, path: str, method: str, operation: Dict[str, Any]) -> bool:
368
+ """Validate individual operation (HTTP method + path combination)."""
369
+ has_issues = False
370
+ operation_path = f"/paths/{path}/{method.lower()}"
371
+
372
+ # Check for required operation fields
373
+ if 'responses' not in operation:
374
+ self.report.add_issue(LintIssue(
375
+ severity='error',
376
+ category='structure',
377
+ message=f"Missing responses section for {method} {path}",
378
+ path=f"{operation_path}/responses",
379
+ suggestion="Define expected responses for this operation"
380
+ ))
381
+ has_issues = True
382
+
383
+ # Check for operation documentation
384
+ if 'summary' not in operation:
385
+ self.report.add_issue(LintIssue(
386
+ severity='warning',
387
+ category='documentation',
388
+ message=f"Missing summary for {method} {path}",
389
+ path=f"{operation_path}/summary",
390
+ suggestion="Add a brief summary describing what this operation does"
391
+ ))
392
+ has_issues = True
393
+
394
+ if 'description' not in operation:
395
+ self.report.add_issue(LintIssue(
396
+ severity='info',
397
+ category='documentation',
398
+ message=f"Missing description for {method} {path}",
399
+ path=f"{operation_path}/description",
400
+ suggestion="Add a detailed description for better API documentation"
401
+ ))
402
+ has_issues = True
403
+
404
+ # Validate HTTP method usage patterns
405
+ method_issues = self._validate_http_method_usage(path, method, operation)
406
+ if method_issues:
407
+ has_issues = True
408
+
409
+ # Validate responses
410
+ if 'responses' in operation:
411
+ response_issues = self._validate_responses(path, method, operation['responses'])
412
+ if response_issues:
413
+ has_issues = True
414
+
415
+ # Validate parameters
416
+ if 'parameters' in operation:
417
+ param_issues = self._validate_parameters(path, method, operation['parameters'])
418
+ if param_issues:
419
+ has_issues = True
420
+
421
+ # Validate request body
422
+ if 'requestBody' in operation:
423
+ body_issues = self._validate_request_body(path, method, operation['requestBody'])
424
+ if body_issues:
425
+ has_issues = True
426
+
427
+ return has_issues
428
+
429
+ def _validate_http_method_usage(self, path: str, method: str, operation: Dict[str, Any]) -> bool:
430
+ """Validate proper HTTP method usage patterns."""
431
+ has_issues = False
432
+
433
+ # GET requests should not have request body
434
+ if method == 'GET' and 'requestBody' in operation:
435
+ self.report.add_issue(LintIssue(
436
+ severity='error',
437
+ category='rest_conventions',
438
+ message=f"GET request should not have request body: {method} {path}",
439
+ path=f"/paths/{path}/{method.lower()}/requestBody",
440
+ suggestion="Remove requestBody from GET request or use POST if body is needed"
441
+ ))
442
+ has_issues = True
443
+
444
+ # DELETE requests typically should not have request body
445
+ if method == 'DELETE' and 'requestBody' in operation:
446
+ self.report.add_issue(LintIssue(
447
+ severity='warning',
448
+ category='rest_conventions',
449
+ message=f"DELETE request typically should not have request body: {method} {path}",
450
+ path=f"/paths/{path}/{method.lower()}/requestBody",
451
+ suggestion="Consider using query parameters or path parameters instead"
452
+ ))
453
+ has_issues = True
454
+
455
+ # POST/PUT/PATCH should typically have request body (except for actions)
456
+ if method in ['POST', 'PUT', 'PATCH'] and 'requestBody' not in operation:
457
+ # Check if this is an action endpoint
458
+ if not any(action in path.lower() for action in ['activate', 'deactivate', 'reset', 'confirm']):
459
+ self.report.add_issue(LintIssue(
460
+ severity='info',
461
+ category='rest_conventions',
462
+ message=f"{method} request typically should have request body: {method} {path}",
463
+ path=f"/paths/{path}/{method.lower()}",
464
+ suggestion=f"Consider adding requestBody for {method} operation or use GET if no data is being sent"
465
+ ))
466
+ has_issues = True
467
+
468
+ return has_issues
469
+
470
+ def _validate_responses(self, path: str, method: str, responses: Dict[str, Any]) -> bool:
471
+ """Validate response definitions."""
472
+ has_issues = False
473
+
474
+ # Check for success response
475
+ success_codes = {'200', '201', '202', '204'}
476
+ has_success = any(code in responses for code in success_codes)
477
+
478
+ if not has_success:
479
+ self.report.add_issue(LintIssue(
480
+ severity='error',
481
+ category='responses',
482
+ message=f"Missing success response for {method} {path}",
483
+ path=f"/paths/{path}/{method.lower()}/responses",
484
+ suggestion="Define at least one success response (200, 201, 202, or 204)"
485
+ ))
486
+ has_issues = True
487
+
488
+ # Check for error responses
489
+ has_error_responses = any(code.startswith('4') or code.startswith('5') for code in responses.keys())
490
+
491
+ if not has_error_responses:
492
+ self.report.add_issue(LintIssue(
493
+ severity='warning',
494
+ category='responses',
495
+ message=f"Missing error responses for {method} {path}",
496
+ path=f"/paths/{path}/{method.lower()}/responses",
497
+ suggestion="Define common error responses (400, 404, 500, etc.)"
498
+ ))
499
+ has_issues = True
500
+
501
+ # Validate individual response codes
502
+ for status_code, response in responses.items():
503
+ if status_code == 'default':
504
+ continue
505
+
506
+ try:
507
+ code_int = int(status_code)
508
+ except ValueError:
509
+ self.report.add_issue(LintIssue(
510
+ severity='error',
511
+ category='responses',
512
+ message=f"Invalid status code '{status_code}' for {method} {path}",
513
+ path=f"/paths/{path}/{method.lower()}/responses/{status_code}",
514
+ suggestion="Use valid HTTP status codes (e.g., 200, 404, 500)"
515
+ ))
516
+ has_issues = True
517
+ continue
518
+
519
+ # Check if status code is appropriate for the method
520
+ expected_codes = self.standard_status_codes.get(method, set())
521
+ common_codes = {400, 401, 403, 404, 429, 500} # Always acceptable
522
+
523
+ if expected_codes and code_int not in expected_codes and code_int not in common_codes:
524
+ self.report.add_issue(LintIssue(
525
+ severity='info',
526
+ category='responses',
527
+ message=f"Uncommon status code {status_code} for {method} {path}",
528
+ path=f"/paths/{path}/{method.lower()}/responses/{status_code}",
529
+ suggestion=f"Consider using standard codes for {method}: {sorted(expected_codes)}"
530
+ ))
531
+ has_issues = True
532
+
533
+ return has_issues
534
+
535
+ def _validate_parameters(self, path: str, method: str, parameters: List[Dict[str, Any]]) -> bool:
536
+ """Validate parameter definitions."""
537
+ has_issues = False
538
+
539
+ for i, param in enumerate(parameters):
540
+ param_path = f"/paths/{path}/{method.lower()}/parameters[{i}]"
541
+
542
+ # Check required fields
543
+ if 'name' not in param:
544
+ self.report.add_issue(LintIssue(
545
+ severity='error',
546
+ category='parameters',
547
+ message=f"Parameter missing name field in {method} {path}",
548
+ path=f"{param_path}/name",
549
+ suggestion="Add a name field to the parameter"
550
+ ))
551
+ has_issues = True
552
+ continue
553
+
554
+ if 'in' not in param:
555
+ self.report.add_issue(LintIssue(
556
+ severity='error',
557
+ category='parameters',
558
+ message=f"Parameter '{param['name']}' missing 'in' field in {method} {path}",
559
+ path=f"{param_path}/in",
560
+ suggestion="Specify parameter location (query, path, header, cookie)"
561
+ ))
562
+ has_issues = True
563
+
564
+ # Validate parameter naming
565
+ param_name = param['name']
566
+ param_location = param.get('in', '')
567
+
568
+ if param_location == 'query':
569
+ # Query parameters should use camelCase or kebab-case
570
+ if not self.camel_case_pattern.match(param_name) and not self.kebab_case_pattern.match(param_name):
571
+ self.report.add_issue(LintIssue(
572
+ severity='warning',
573
+ category='naming',
574
+ message=f"Query parameter '{param_name}' should use camelCase or kebab-case in {method} {path}",
575
+ path=f"{param_path}/name",
576
+ suggestion="Use camelCase (e.g., 'pageSize') or kebab-case (e.g., 'page-size')"
577
+ ))
578
+ has_issues = True
579
+
580
+ elif param_location == 'path':
581
+ # Path parameters should use camelCase or kebab-case
582
+ if not self.camel_case_pattern.match(param_name) and not self.kebab_case_pattern.match(param_name):
583
+ self.report.add_issue(LintIssue(
584
+ severity='warning',
585
+ category='naming',
586
+ message=f"Path parameter '{param_name}' should use camelCase or kebab-case in {method} {path}",
587
+ path=f"{param_path}/name",
588
+ suggestion="Use camelCase (e.g., 'userId') or kebab-case (e.g., 'user-id')"
589
+ ))
590
+ has_issues = True
591
+
592
+ # Path parameters must be required
593
+ if not param.get('required', False):
594
+ self.report.add_issue(LintIssue(
595
+ severity='error',
596
+ category='parameters',
597
+ message=f"Path parameter '{param_name}' must be required in {method} {path}",
598
+ path=f"{param_path}/required",
599
+ suggestion="Set required: true for path parameters"
600
+ ))
601
+ has_issues = True
602
+
603
+ return has_issues
604
+
605
+ def _validate_request_body(self, path: str, method: str, request_body: Dict[str, Any]) -> bool:
606
+ """Validate request body definition."""
607
+ has_issues = False
608
+
609
+ if 'content' not in request_body:
610
+ self.report.add_issue(LintIssue(
611
+ severity='error',
612
+ category='request_body',
613
+ message=f"Request body missing content for {method} {path}",
614
+ path=f"/paths/{path}/{method.lower()}/requestBody/content",
615
+ suggestion="Define content types for the request body"
616
+ ))
617
+ has_issues = True
618
+
619
+ return has_issues
620
+
621
+ def _validate_components_section(self) -> None:
622
+ """Validate the components section."""
623
+ if 'components' not in self.openapi_spec:
624
+ self.report.add_issue(LintIssue(
625
+ severity='info',
626
+ category='structure',
627
+ message="Missing components section",
628
+ path="/components",
629
+ suggestion="Consider defining reusable components (schemas, responses, parameters)"
630
+ ))
631
+ return
632
+
633
+ components = self.openapi_spec['components']
634
+
635
+ # Validate schemas
636
+ if 'schemas' in components:
637
+ self._validate_schemas(components['schemas'])
638
+
639
+ def _validate_schemas(self, schemas: Dict[str, Any]) -> None:
640
+ """Validate schema definitions."""
641
+ for schema_name, schema in schemas.items():
642
+ # Check schema naming (should be PascalCase)
643
+ if not self.pascal_case_pattern.match(schema_name):
644
+ self.report.add_issue(LintIssue(
645
+ severity='warning',
646
+ category='naming',
647
+ message=f"Schema name '{schema_name}' should use PascalCase",
648
+ path=f"/components/schemas/{schema_name}",
649
+ suggestion=f"Use PascalCase for schema names (e.g., 'UserProfile', 'OrderItem')"
650
+ ))
651
+
652
+ # Validate schema properties
653
+ if isinstance(schema, dict) and 'properties' in schema:
654
+ self._validate_schema_properties(schema_name, schema['properties'])
655
+
656
+ def _validate_schema_properties(self, schema_name: str, properties: Dict[str, Any]) -> None:
657
+ """Validate schema property naming."""
658
+ for prop_name, prop_def in properties.items():
659
+ # Properties should use camelCase
660
+ if not self.camel_case_pattern.match(prop_name):
661
+ self.report.add_issue(LintIssue(
662
+ severity='warning',
663
+ category='naming',
664
+ message=f"Property '{prop_name}' in schema '{schema_name}' should use camelCase",
665
+ path=f"/components/schemas/{schema_name}/properties/{prop_name}",
666
+ suggestion="Use camelCase for property names (e.g., 'firstName', 'createdAt')"
667
+ ))
668
+
669
+ def _validate_security_section(self) -> None:
670
+ """Validate security definitions."""
671
+ if 'security' not in self.openapi_spec and 'components' not in self.openapi_spec:
672
+ self.report.add_issue(LintIssue(
673
+ severity='warning',
674
+ category='security',
675
+ message="No security configuration found",
676
+ path="/security",
677
+ suggestion="Define security schemes and apply them to operations"
678
+ ))
679
+
680
+ def _validate_raw_endpoint_structure(self) -> None:
681
+ """Validate structure of raw endpoint definitions."""
682
+ if 'endpoints' not in self.raw_endpoints:
683
+ self.report.add_issue(LintIssue(
684
+ severity='error',
685
+ category='structure',
686
+ message="Missing 'endpoints' field in raw endpoint definition",
687
+ path="/endpoints",
688
+ suggestion="Provide an 'endpoints' object containing endpoint definitions"
689
+ ))
690
+ return
691
+
692
+ endpoints = self.raw_endpoints['endpoints']
693
+ self.report.total_endpoints = len(endpoints)
694
+
695
+ def _lint_raw_endpoint(self, path: str, endpoint_data: Dict[str, Any]) -> None:
696
+ """Lint individual raw endpoint definition."""
697
+ # Validate path structure
698
+ self._validate_path_structure(path)
699
+
700
+ # Check for required fields
701
+ if 'method' not in endpoint_data:
702
+ self.report.add_issue(LintIssue(
703
+ severity='error',
704
+ category='structure',
705
+ message=f"Missing method field for endpoint {path}",
706
+ path=f"/endpoints/{path}/method",
707
+ suggestion="Specify HTTP method (GET, POST, PUT, PATCH, DELETE)"
708
+ ))
709
+ return
710
+
711
+ method = endpoint_data['method'].upper()
712
+ if method not in self.http_methods:
713
+ self.report.add_issue(LintIssue(
714
+ severity='error',
715
+ category='structure',
716
+ message=f"Invalid HTTP method '{method}' for endpoint {path}",
717
+ path=f"/endpoints/{path}/method",
718
+ suggestion=f"Use valid HTTP methods: {', '.join(sorted(self.http_methods))}"
719
+ ))
720
+
721
+ def generate_json_report(self) -> str:
722
+ """Generate JSON format report."""
723
+ issues_by_severity = self.report.get_issues_by_severity()
724
+
725
+ report_data = {
726
+ "summary": {
727
+ "total_endpoints": self.report.total_endpoints,
728
+ "endpoints_with_issues": self.report.endpoints_with_issues,
729
+ "total_issues": len(self.report.issues),
730
+ "errors": len(issues_by_severity['error']),
731
+ "warnings": len(issues_by_severity['warning']),
732
+ "info": len(issues_by_severity['info']),
733
+ "score": round(self.report.score, 2)
734
+ },
735
+ "issues": []
736
+ }
737
+
738
+ for issue in self.report.issues:
739
+ report_data["issues"].append({
740
+ "severity": issue.severity,
741
+ "category": issue.category,
742
+ "message": issue.message,
743
+ "path": issue.path,
744
+ "suggestion": issue.suggestion
745
+ })
746
+
747
+ return json.dumps(report_data, indent=2)
748
+
749
+ def generate_text_report(self) -> str:
750
+ """Generate human-readable text report."""
751
+ issues_by_severity = self.report.get_issues_by_severity()
752
+
753
+ report_lines = [
754
+ "═══════════════════════════════════════════════════════════════",
755
+ " API LINTING REPORT",
756
+ "═══════════════════════════════════════════════════════════════",
757
+ "",
758
+ "SUMMARY:",
759
+ f" Total Endpoints: {self.report.total_endpoints}",
760
+ f" Endpoints with Issues: {self.report.endpoints_with_issues}",
761
+ f" Overall Score: {self.report.score:.1f}/100.0",
762
+ "",
763
+ "ISSUE BREAKDOWN:",
764
+ f" 🔴 Errors: {len(issues_by_severity['error'])}",
765
+ f" 🟡 Warnings: {len(issues_by_severity['warning'])}",
766
+ f" ℹ️ Info: {len(issues_by_severity['info'])}",
767
+ "",
768
+ ]
769
+
770
+ if not self.report.issues:
771
+ report_lines.extend([
772
+ "🎉 Congratulations! No issues found in your API specification.",
773
+ ""
774
+ ])
775
+ else:
776
+ # Group issues by category
777
+ issues_by_category = {}
778
+ for issue in self.report.issues:
779
+ if issue.category not in issues_by_category:
780
+ issues_by_category[issue.category] = []
781
+ issues_by_category[issue.category].append(issue)
782
+
783
+ for category, issues in issues_by_category.items():
784
+ report_lines.append(f"{'═' * 60}")
785
+ report_lines.append(f"CATEGORY: {category.upper().replace('_', ' ')}")
786
+ report_lines.append(f"{'═' * 60}")
787
+
788
+ for issue in issues:
789
+ severity_icon = {"error": "🔴", "warning": "🟡", "info": "ℹ️"}[issue.severity]
790
+
791
+ report_lines.extend([
792
+ f"{severity_icon} {issue.severity.upper()}: {issue.message}",
793
+ f" Path: {issue.path}",
794
+ ])
795
+
796
+ if issue.suggestion:
797
+ report_lines.append(f" 💡 Suggestion: {issue.suggestion}")
798
+
799
+ report_lines.append("")
800
+
801
+ # Add scoring breakdown
802
+ report_lines.extend([
803
+ "═══════════════════════════════════════════════════════════════",
804
+ "SCORING DETAILS:",
805
+ "═══════════════════════════════════════════════════════════════",
806
+ f"Base Score: 100.0",
807
+ f"Errors Penalty: -{len(issues_by_severity['error']) * 10} (10 points per error)",
808
+ f"Warnings Penalty: -{len(issues_by_severity['warning']) * 3} (3 points per warning)",
809
+ f"Info Penalty: -{len(issues_by_severity['info']) * 1} (1 point per info)",
810
+ f"Final Score: {self.report.score:.1f}/100.0",
811
+ ""
812
+ ])
813
+
814
+ # Add recommendations based on score
815
+ if self.report.score >= 90:
816
+ report_lines.append("🏆 Excellent! Your API design follows best practices.")
817
+ elif self.report.score >= 80:
818
+ report_lines.append("✅ Good API design with minor areas for improvement.")
819
+ elif self.report.score >= 70:
820
+ report_lines.append("⚠️ Fair API design. Consider addressing warnings and errors.")
821
+ elif self.report.score >= 50:
822
+ report_lines.append("❌ Poor API design. Multiple issues need attention.")
823
+ else:
824
+ report_lines.append("🚨 Critical API design issues. Immediate attention required.")
825
+
826
+ return "\n".join(report_lines)
827
+
828
+
829
+ # Embedded sample OpenAPI spec — intentionally imperfect (a verb in a URL, a
830
+ # snake_case property) so --sample produces a representative report.
831
+ SAMPLE_OPENAPI_SPEC = {
832
+ "openapi": "3.0.0",
833
+ "info": {"title": "Sample API", "version": "1.0.0"},
834
+ "servers": [{"url": "https://api.example.com"}],
835
+ "paths": {
836
+ "/user-profiles/{userId}": {
837
+ "get": {
838
+ "summary": "Get a user profile",
839
+ "responses": {"200": {"description": "OK"}, "404": {"description": "Not found"}},
840
+ "parameters": [{"name": "userId", "in": "path", "required": True}],
841
+ }
842
+ },
843
+ "/user-profiles/create": {
844
+ "post": {
845
+ "summary": "Create a user profile (verb-in-URL anti-pattern)",
846
+ "responses": {"201": {"description": "Created"}},
847
+ }
848
+ },
849
+ },
850
+ "components": {
851
+ "schemas": {
852
+ "UserProfile": {"properties": {"first_name": {"type": "string"}}}
853
+ }
854
+ },
855
+ }
856
+
857
+
858
+ def main():
859
+ """Main CLI entry point."""
860
+ parser = argparse.ArgumentParser(
861
+ description="Analyze OpenAPI/Swagger specifications for REST conventions and best practices",
862
+ formatter_class=argparse.RawDescriptionHelpFormatter,
863
+ epilog="""
864
+ Examples:
865
+ python api_linter.py openapi.json
866
+ python api_linter.py --format json openapi.json > report.json
867
+ python api_linter.py --raw-endpoints endpoints.json
868
+ python api_linter.py --sample --format json
869
+ """
870
+ )
871
+
872
+ parser.add_argument(
873
+ 'input_file',
874
+ nargs='?',
875
+ help='Input file: OpenAPI/Swagger JSON file or raw endpoints JSON'
876
+ )
877
+
878
+ parser.add_argument(
879
+ '--sample',
880
+ action='store_true',
881
+ help='Lint an embedded sample OpenAPI spec (no input file needed)'
882
+ )
883
+
884
+ parser.add_argument(
885
+ '--format',
886
+ choices=['text', 'json'],
887
+ default='text',
888
+ help='Output format (default: text)'
889
+ )
890
+
891
+ parser.add_argument(
892
+ '--raw-endpoints',
893
+ action='store_true',
894
+ help='Treat input as raw endpoint definitions instead of OpenAPI spec'
895
+ )
896
+
897
+ parser.add_argument(
898
+ '--output',
899
+ help='Output file (default: stdout)'
900
+ )
901
+
902
+ args = parser.parse_args()
903
+
904
+ # Load input data — from the embedded sample or the input file
905
+ if args.sample:
906
+ input_data = SAMPLE_OPENAPI_SPEC
907
+ else:
908
+ if not args.input_file:
909
+ parser.error("input_file is required (or use --sample)")
910
+ try:
911
+ with open(args.input_file, 'r') as f:
912
+ input_data = json.load(f)
913
+ except FileNotFoundError:
914
+ print(f"Error: Input file '{args.input_file}' not found.", file=sys.stderr)
915
+ return 1
916
+ except json.JSONDecodeError as e:
917
+ print(f"Error: Invalid JSON in '{args.input_file}': {e}", file=sys.stderr)
918
+ return 1
919
+
920
+ # Initialize linter and run analysis
921
+ linter = APILinter()
922
+
923
+ try:
924
+ if args.raw_endpoints:
925
+ report = linter.lint_raw_endpoints(input_data)
926
+ else:
927
+ report = linter.lint_openapi_spec(input_data)
928
+ except Exception as e:
929
+ print(f"Error during linting: {e}", file=sys.stderr)
930
+ return 1
931
+
932
+ # Generate report
933
+ if args.format == 'json':
934
+ output = linter.generate_json_report()
935
+ else:
936
+ output = linter.generate_text_report()
937
+
938
+ # Write output
939
+ if args.output:
940
+ try:
941
+ with open(args.output, 'w') as f:
942
+ f.write(output)
943
+ print(f"Report written to {args.output}")
944
+ except IOError as e:
945
+ print(f"Error writing to '{args.output}': {e}", file=sys.stderr)
946
+ return 1
947
+ else:
948
+ print(output)
949
+
950
+ # Return appropriate exit code
951
+ error_count = len([i for i in report.issues if i.severity == 'error'])
952
+ return 1 if error_count > 0 else 0
953
+
954
+
955
+ if __name__ == '__main__':
956
+ sys.exit(main())